@arbidocs/blocks 0.4.157 → 0.4.159
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/{ConnectedNativeDocxComparison-S25BPUH5.cjs → ConnectedNativeDocxComparison-R6RU5TZE.cjs} +8 -7
- package/dist/{ConnectedNativeDocxComparison-S25BPUH5.cjs.map → ConnectedNativeDocxComparison-R6RU5TZE.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-2PLOOXSH.js → ConnectedNativeDocxComparison-XMZ5KLD4.js} +7 -6
- package/dist/{ConnectedNativeDocxComparison-2PLOOXSH.js.map → ConnectedNativeDocxComparison-XMZ5KLD4.js.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-YA4HWLY4.cjs → ConnectedNativeDocxEditor-LBATSM3M.cjs} +7 -6
- package/dist/{ConnectedNativeDocxEditor-YA4HWLY4.cjs.map → ConnectedNativeDocxEditor-LBATSM3M.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-JJAGMHZC.js → ConnectedNativeDocxEditor-NGUK2AX6.js} +5 -4
- package/dist/{ConnectedNativeDocxEditor-JJAGMHZC.js.map → ConnectedNativeDocxEditor-NGUK2AX6.js.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-EXYZAU4Y.cjs → ConnectedStreamedWordArtifact-CWFR6A37.cjs} +8 -7
- package/dist/ConnectedStreamedWordArtifact-CWFR6A37.cjs.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-YAAXY5KY.js → ConnectedStreamedWordArtifact-IXRJ7MUE.js} +7 -6
- package/dist/{ConnectedStreamedWordArtifact-YAAXY5KY.js.map → ConnectedStreamedWordArtifact-IXRJ7MUE.js.map} +1 -1
- package/dist/{NativeDocxEditor-M3I776GD.cjs → NativeDocxEditor-T2PJIZMU.cjs} +9 -7
- package/dist/{NativeDocxEditor-M3I776GD.cjs.map → NativeDocxEditor-T2PJIZMU.cjs.map} +1 -1
- package/dist/{NativeDocxEditor-JBQMH3MP.js → NativeDocxEditor-TBTBD6TC.js} +5 -3
- package/dist/{NativeDocxEditor-JBQMH3MP.js.map → NativeDocxEditor-TBTBD6TC.js.map} +1 -1
- package/dist/{WorkspaceTableView-5OWX53R5.js → WorkspaceTableView-DWUE4VQF.js} +19 -9
- package/dist/WorkspaceTableView-DWUE4VQF.js.map +1 -0
- package/dist/{WorkspaceTableView-ZFMAYHUD.cjs → WorkspaceTableView-EYLEUZZT.cjs} +21 -11
- package/dist/WorkspaceTableView-EYLEUZZT.cjs.map +1 -0
- package/dist/{chunk-IJEISII2.cjs → chunk-2BHDRVVL.cjs} +17 -7
- package/dist/chunk-2BHDRVVL.cjs.map +1 -0
- package/dist/chunk-2R3GGNPA.js +151 -0
- package/dist/chunk-2R3GGNPA.js.map +1 -0
- package/dist/{chunk-F3EZDBDJ.js → chunk-3OCNUKGX.js} +4 -4
- package/dist/{chunk-F3EZDBDJ.js.map → chunk-3OCNUKGX.js.map} +1 -1
- package/dist/{chunk-D3WFIFRY.cjs → chunk-3VW7ZXQ6.cjs} +211 -5
- package/dist/chunk-3VW7ZXQ6.cjs.map +1 -0
- package/dist/{chunk-JSQEAPTC.cjs → chunk-4GITK3Q5.cjs} +398 -75
- package/dist/chunk-4GITK3Q5.cjs.map +1 -0
- package/dist/{chunk-2CWM2CFZ.js → chunk-7UENVUA6.js} +4 -4
- package/dist/{chunk-2CWM2CFZ.js.map → chunk-7UENVUA6.js.map} +1 -1
- package/dist/{chunk-EWCJXUBP.js → chunk-AVXRXPII.js} +3 -3
- package/dist/{chunk-EWCJXUBP.js.map → chunk-AVXRXPII.js.map} +1 -1
- package/dist/{chunk-7IRSCMNK.js → chunk-BGXWPVHR.js} +3 -3
- package/dist/{chunk-7IRSCMNK.js.map → chunk-BGXWPVHR.js.map} +1 -1
- package/dist/chunk-DAN7EJ4O.js +482 -0
- package/dist/chunk-DAN7EJ4O.js.map +1 -0
- package/dist/chunk-E4H5H2C3.cjs +18 -0
- package/dist/{chunk-OTU5KGQ6.cjs.map → chunk-E4H5H2C3.cjs.map} +1 -1
- package/dist/{chunk-VY4UFXTM.cjs → chunk-ETJFC6MO.cjs} +4 -4
- package/dist/{chunk-VY4UFXTM.cjs.map → chunk-ETJFC6MO.cjs.map} +1 -1
- package/dist/{chunk-TQIY2SVY.cjs → chunk-GFVIFXWT.cjs} +5 -5
- package/dist/{chunk-TQIY2SVY.cjs.map → chunk-GFVIFXWT.cjs.map} +1 -1
- package/dist/chunk-JPWPR6QU.cjs +485 -0
- package/dist/chunk-JPWPR6QU.cjs.map +1 -0
- package/dist/{chunk-KQYPP72K.js → chunk-JTJCCL2E.js} +212 -9
- package/dist/chunk-JTJCCL2E.js.map +1 -0
- package/dist/{chunk-PGOSIJ2I.js → chunk-KFMRBZQK.js} +15 -5
- package/dist/chunk-KFMRBZQK.js.map +1 -0
- package/dist/chunk-NMZI3K6R.cjs +159 -0
- package/dist/chunk-NMZI3K6R.cjs.map +1 -0
- package/dist/{chunk-53RCZPMR.cjs → chunk-P2YM67Y5.cjs} +5 -5
- package/dist/{chunk-53RCZPMR.cjs.map → chunk-P2YM67Y5.cjs.map} +1 -1
- package/dist/chunk-Q2XGM372.cjs +18 -0
- package/dist/{chunk-S74QMZVZ.cjs.map → chunk-Q2XGM372.cjs.map} +1 -1
- package/dist/{chunk-7HHYMDPE.js → chunk-RATEAOKT.js} +3 -3
- package/dist/{chunk-7HHYMDPE.js.map → chunk-RATEAOKT.js.map} +1 -1
- package/dist/{chunk-SN2GZ4ZM.cjs → chunk-TQUYWUEE.cjs} +10 -156
- package/dist/chunk-TQUYWUEE.cjs.map +1 -0
- package/dist/{chunk-ONTUMV74.js → chunk-XER3JLC7.js} +398 -78
- package/dist/chunk-XER3JLC7.js.map +1 -0
- package/dist/{chunk-HP2C4MD3.js → chunk-ZDOKJD44.js} +4 -143
- package/dist/chunk-ZDOKJD44.js.map +1 -0
- package/dist/connect/docx.cjs +11 -10
- package/dist/connect/docx.js +7 -6
- package/dist/connect/index.cjs +406 -384
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.js +69 -47
- package/dist/connect/index.js.map +1 -1
- package/dist/connect/viewer.cjs +41 -20
- package/dist/connect/viewer.cjs.map +1 -1
- package/dist/connect/viewer.js +29 -8
- package/dist/connect/viewer.js.map +1 -1
- package/dist/connection/viewer/ViewerPdfPane.d.ts +7 -1
- package/dist/connection/workspace-list/ConnectedWorkspaceList.d.ts +4 -2
- package/dist/connection/workspace-list/WorkspaceCardsView.d.ts +3 -2
- package/dist/connection/workspace-list/WorkspaceTableView.d.ts +3 -2
- package/dist/connection/workspace-list/index.d.ts +1 -1
- package/dist/connection/workspace-list/useConnectedWorkspaceList.d.ts +19 -0
- package/dist/connection/workspace-list/workspaceTable.d.ts +3 -1
- package/dist/connection/workspace-settings/ConnectedWorkspaceSettings.d.ts +3 -1
- package/dist/document-tools/AdoptSignatureDialog.d.ts +39 -4
- package/dist/document-tools/PlaceMySignatureButton.d.ts +16 -0
- package/dist/document-tools/SavedSignatureSettings.d.ts +10 -0
- package/dist/document-tools/index.cjs +37 -22
- package/dist/document-tools/index.d.ts +2 -0
- package/dist/document-tools/index.js +5 -2
- package/dist/document-tools/viewer/AnnotatedPdfViewer.d.ts +10 -1
- package/dist/document-tools/viewer/SignatureRequestEditor.d.ts +7 -4
- package/dist/document-tools/viewer/index.cjs +184 -18
- package/dist/document-tools/viewer/index.cjs.map +1 -1
- package/dist/document-tools/viewer/index.js +184 -18
- package/dist/document-tools/viewer/index.js.map +1 -1
- package/dist/docx/NativeDocxEditor.d.ts +5 -0
- package/dist/docx/index.cjs +61 -47
- package/dist/docx/index.d.ts +1 -0
- package/dist/docx/index.js +5 -3
- package/dist/docx/signatures/SignatureFields.d.ts +50 -0
- package/dist/settings/index.cjs +183 -182
- package/dist/settings/index.js +2 -1
- package/node_modules/@arbidocs/coedit/dist/commands.cjs +109 -16
- package/node_modules/@arbidocs/coedit/dist/commands.cjs.map +1 -1
- package/node_modules/@arbidocs/coedit/dist/commands.d.cts +84 -1
- package/node_modules/@arbidocs/coedit/dist/commands.d.ts +84 -1
- package/node_modules/@arbidocs/coedit/dist/commands.js +99 -17
- package/node_modules/@arbidocs/coedit/dist/commands.js.map +1 -1
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/src/docx/styles.css +50 -0
- package/dist/ConnectedStreamedWordArtifact-EXYZAU4Y.cjs.map +0 -1
- package/dist/WorkspaceTableView-5OWX53R5.js.map +0 -1
- package/dist/WorkspaceTableView-ZFMAYHUD.cjs.map +0 -1
- package/dist/chunk-6MG62I5B.cjs +0 -272
- package/dist/chunk-6MG62I5B.cjs.map +0 -1
- package/dist/chunk-D3WFIFRY.cjs.map +0 -1
- package/dist/chunk-EQB3WELX.js +0 -269
- package/dist/chunk-EQB3WELX.js.map +0 -1
- package/dist/chunk-HP2C4MD3.js.map +0 -1
- package/dist/chunk-IJEISII2.cjs.map +0 -1
- package/dist/chunk-JSQEAPTC.cjs.map +0 -1
- package/dist/chunk-KQYPP72K.js.map +0 -1
- package/dist/chunk-ONTUMV74.js.map +0 -1
- package/dist/chunk-OTU5KGQ6.cjs +0 -18
- package/dist/chunk-PGOSIJ2I.js.map +0 -1
- package/dist/chunk-S74QMZVZ.cjs +0 -18
- package/dist/chunk-SN2GZ4ZM.cjs.map +0 -1
package/dist/connect/index.cjs
CHANGED
|
@@ -1,23 +1,25 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkP2YM67Y5_cjs = require('../chunk-P2YM67Y5.cjs');
|
|
5
5
|
var chunkMSFQDELO_cjs = require('../chunk-MSFQDELO.cjs');
|
|
6
6
|
var chunkJUUOJP7I_cjs = require('../chunk-JUUOJP7I.cjs');
|
|
7
7
|
var chunkOOU4QLRK_cjs = require('../chunk-OOU4QLRK.cjs');
|
|
8
8
|
var chunkOU3RGQFX_cjs = require('../chunk-OU3RGQFX.cjs');
|
|
9
9
|
require('../chunk-REH7PX3N.cjs');
|
|
10
|
-
var
|
|
10
|
+
var chunkTQUYWUEE_cjs = require('../chunk-TQUYWUEE.cjs');
|
|
11
11
|
var chunkKBO75NLM_cjs = require('../chunk-KBO75NLM.cjs');
|
|
12
|
-
var
|
|
12
|
+
var chunk2BHDRVVL_cjs = require('../chunk-2BHDRVVL.cjs');
|
|
13
13
|
var chunk6I6CVX5G_cjs = require('../chunk-6I6CVX5G.cjs');
|
|
14
14
|
var chunkQJFJ5JBF_cjs = require('../chunk-QJFJ5JBF.cjs');
|
|
15
15
|
require('../chunk-223D4727.cjs');
|
|
16
16
|
var chunkCB4TIDEX_cjs = require('../chunk-CB4TIDEX.cjs');
|
|
17
17
|
var chunkFM3IRQJW_cjs = require('../chunk-FM3IRQJW.cjs');
|
|
18
18
|
var chunkJH6JTI76_cjs = require('../chunk-JH6JTI76.cjs');
|
|
19
|
+
var chunkNMZI3K6R_cjs = require('../chunk-NMZI3K6R.cjs');
|
|
19
20
|
require('../chunk-464YPRAE.cjs');
|
|
20
|
-
require('../chunk-
|
|
21
|
+
require('../chunk-4GITK3Q5.cjs');
|
|
22
|
+
require('../chunk-JPWPR6QU.cjs');
|
|
21
23
|
var chunkB3FMUFAW_cjs = require('../chunk-B3FMUFAW.cjs');
|
|
22
24
|
var chunk2WLXQGWC_cjs = require('../chunk-2WLXQGWC.cjs');
|
|
23
25
|
var chunk5FYU7ZIU_cjs = require('../chunk-5FYU7ZIU.cjs');
|
|
@@ -592,7 +594,7 @@ function NotificationCenter({
|
|
|
592
594
|
}
|
|
593
595
|
];
|
|
594
596
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col h-full bg-background", "data-testid": "notifications-page", children: [
|
|
595
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
597
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.DraggableHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
596
598
|
chunk7RGLTF76_cjs.TabHeader,
|
|
597
599
|
{
|
|
598
600
|
tabs,
|
|
@@ -1652,7 +1654,7 @@ function ConnectedTaskActivityDialog({
|
|
|
1652
1654
|
const activity = react$1.useConversationActivity(conversationId, { live });
|
|
1653
1655
|
const { data: agents = [] } = react$1.useAgents();
|
|
1654
1656
|
const { userId } = chunkFM3IRQJW_cjs.useConnectedWorkspace();
|
|
1655
|
-
const { members } =
|
|
1657
|
+
const { members } = chunk2BHDRVVL_cjs.useConnectedWorkspaceRole();
|
|
1656
1658
|
const renderPerson = react.useCallback(
|
|
1657
1659
|
(id) => {
|
|
1658
1660
|
const isMe = !!id && id === userId;
|
|
@@ -2129,7 +2131,7 @@ function WorkflowWordDialog({
|
|
|
2129
2131
|
title: title ?? labels.wordTitle,
|
|
2130
2132
|
size: "xl",
|
|
2131
2133
|
testId: "workflow-word-dialog",
|
|
2132
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(chunkULWRNGGE_cjs.ModalScaffold.Body, { className: "h-[70dvh] p-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2134
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(chunkULWRNGGE_cjs.ModalScaffold.Body, { className: "h-[70dvh] p-0", children: /* @__PURE__ */ jsxRuntime.jsx(chunk2BHDRVVL_cjs.ConnectedNativeDocxEditor, { documentId: id, title: title ?? labels.wordTitle }) })
|
|
2133
2135
|
}
|
|
2134
2136
|
);
|
|
2135
2137
|
}
|
|
@@ -2655,10 +2657,10 @@ function cascadeTagCombination(tags, previous, next) {
|
|
|
2655
2657
|
function tagCombinationMatches(combination, items) {
|
|
2656
2658
|
if (!isCombining(combination)) return void 0;
|
|
2657
2659
|
const pass = (list) => new Set(
|
|
2658
|
-
|
|
2660
|
+
chunkTQUYWUEE_cjs.applyInvertedIndexFilter(
|
|
2659
2661
|
[...list],
|
|
2660
2662
|
combination,
|
|
2661
|
-
|
|
2663
|
+
chunkTQUYWUEE_cjs.buildInvertedIndex(
|
|
2662
2664
|
[...list],
|
|
2663
2665
|
(item) => item.id,
|
|
2664
2666
|
(item) => item.tagIds
|
|
@@ -3015,7 +3017,7 @@ function TagFilterChips({
|
|
|
3015
3017
|
const name = (id) => tags.find((t) => t.external_id === id)?.name ?? id;
|
|
3016
3018
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1.5", "data-testid": "tags-filter-chips", children: [
|
|
3017
3019
|
set.map(([id, state]) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
3018
|
-
|
|
3020
|
+
chunkTQUYWUEE_cjs.FilterChip,
|
|
3019
3021
|
{
|
|
3020
3022
|
label: name(id),
|
|
3021
3023
|
state,
|
|
@@ -4276,10 +4278,10 @@ function useFactFilters(notes, view, chat) {
|
|
|
4276
4278
|
const factFilters = view.filters;
|
|
4277
4279
|
const setFactFilters = view.setFilters;
|
|
4278
4280
|
const quickFilteredNotes = react.useMemo(
|
|
4279
|
-
() =>
|
|
4281
|
+
() => chunkTQUYWUEE_cjs.applyInvertedIndexFilter(
|
|
4280
4282
|
notes,
|
|
4281
4283
|
factFilters,
|
|
4282
|
-
|
|
4284
|
+
chunkTQUYWUEE_cjs.buildInvertedIndex(
|
|
4283
4285
|
notes,
|
|
4284
4286
|
(f) => f.external_id,
|
|
4285
4287
|
(f) => Object.entries(getFactFilterAttributes(f)).filter(([id, on]) => on && factFilterIds.includes(id)).map(([id]) => id)
|
|
@@ -5373,13 +5375,13 @@ function ConnectedProfileCard({
|
|
|
5373
5375
|
}
|
|
5374
5376
|
});
|
|
5375
5377
|
const display = profile?.fullName || "Unnamed";
|
|
5376
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5378
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkNMZI3K6R_cjs.SettingsSection, { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UserCircle, {}), title, children: [
|
|
5377
5379
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5378
|
-
|
|
5380
|
+
chunkTQUYWUEE_cjs.ProfileCard,
|
|
5379
5381
|
{
|
|
5380
5382
|
avatar: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
5381
5383
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5382
|
-
|
|
5384
|
+
chunkTQUYWUEE_cjs.AvatarPicker,
|
|
5383
5385
|
{
|
|
5384
5386
|
pictureUrl: profile?.picture,
|
|
5385
5387
|
initials: chunkKDG6FER6_cjs.initials(display),
|
|
@@ -5426,9 +5428,9 @@ function ConnectedIdentityVerification({
|
|
|
5426
5428
|
onNameAccepted: () => notify14("Name updated to match your ID", "success")
|
|
5427
5429
|
});
|
|
5428
5430
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
5429
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5431
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.IdentityVerificationCard, { flow, labels, onManageBilling }),
|
|
5430
5432
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5431
|
-
|
|
5433
|
+
chunkTQUYWUEE_cjs.IdentityVerificationDialog,
|
|
5432
5434
|
{
|
|
5433
5435
|
flow,
|
|
5434
5436
|
accountName: profile?.fullName ?? "",
|
|
@@ -5441,7 +5443,7 @@ function ConnectedIdentityVerification({
|
|
|
5441
5443
|
function ConnectedRequireVerified({ children, labels }) {
|
|
5442
5444
|
const { data: profile } = react$1.useProfile();
|
|
5443
5445
|
const flow = react$1.useIdentityVerification();
|
|
5444
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
5446
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.RequireVerified, { flow, accountName: profile?.fullName ?? "", labels, children });
|
|
5445
5447
|
}
|
|
5446
5448
|
function defaultUnmetPasswordRequirement(password) {
|
|
5447
5449
|
if (password.length < 8) return "Minimum 8 characters";
|
|
@@ -5474,7 +5476,7 @@ function ConnectedPasswordChangeDialog({
|
|
|
5474
5476
|
onRecoveryComplete
|
|
5475
5477
|
});
|
|
5476
5478
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
5477
|
-
|
|
5479
|
+
chunkTQUYWUEE_cjs.PasswordChangeDialog,
|
|
5478
5480
|
{
|
|
5479
5481
|
open,
|
|
5480
5482
|
onClose: form.onCancel,
|
|
@@ -5500,10 +5502,10 @@ function ConnectedSecuritySection({
|
|
|
5500
5502
|
children
|
|
5501
5503
|
}) {
|
|
5502
5504
|
const [open, setOpen] = react.useState(false);
|
|
5503
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5504
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
5505
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkNMZI3K6R_cjs.SettingsSection, { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.KeyRound, {}), title: "Security", children: [
|
|
5506
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkNMZI3K6R_cjs.SettingsCard, { padding: "sm", children: [
|
|
5505
5507
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5506
|
-
|
|
5508
|
+
chunkNMZI3K6R_cjs.SettingsActionRow,
|
|
5507
5509
|
{
|
|
5508
5510
|
title: "Change password",
|
|
5509
5511
|
description: "Used to sign in and to unlock your account key. Changing it keeps everything readable and re-encrypts nothing.",
|
|
@@ -5524,23 +5526,23 @@ function ConnectedSecuritySection({
|
|
|
5524
5526
|
] });
|
|
5525
5527
|
}
|
|
5526
5528
|
function ConnectedNotificationPreferences({
|
|
5527
|
-
categories =
|
|
5529
|
+
categories = chunkTQUYWUEE_cjs.EMAIL_NOTIFICATION_CATEGORIES,
|
|
5528
5530
|
title = "Notifications"
|
|
5529
5531
|
}) {
|
|
5530
5532
|
const keys = react.useMemo(
|
|
5531
|
-
() => categories ===
|
|
5533
|
+
() => categories === chunkTQUYWUEE_cjs.EMAIL_NOTIFICATION_CATEGORIES ? chunkTQUYWUEE_cjs.EMAIL_NOTIFICATION_KEYS : categories.map((c) => c.key),
|
|
5532
5534
|
[categories]
|
|
5533
5535
|
);
|
|
5534
5536
|
const prefs = react$1.useNotificationPreferences(keys);
|
|
5535
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
5536
|
-
|
|
5537
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkNMZI3K6R_cjs.SettingsSection, { title, children: /* @__PURE__ */ jsxRuntime.jsx(chunkNMZI3K6R_cjs.SettingsCard, { className: "space-y-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
5538
|
+
chunkTQUYWUEE_cjs.NotificationCategoryList,
|
|
5537
5539
|
{
|
|
5538
5540
|
masterId: "emailNotifications",
|
|
5539
5541
|
masterTitle: "Email Notifications",
|
|
5540
5542
|
masterDescription: "Email me about activity when I\u2019m away",
|
|
5541
5543
|
masterChecked: prefs.masterChecked,
|
|
5542
5544
|
onMasterChange: prefs.setAll,
|
|
5543
|
-
categories:
|
|
5545
|
+
categories: chunkTQUYWUEE_cjs.toNotificationCategories(prefs.checked, categories),
|
|
5544
5546
|
onCategoryChange: prefs.setCategory
|
|
5545
5547
|
}
|
|
5546
5548
|
) }) });
|
|
@@ -5553,14 +5555,14 @@ function ConnectedSessionsRow({
|
|
|
5553
5555
|
const sessions = react$1.useSessions({ enabled: open });
|
|
5554
5556
|
const currentSessionId = react$1.useCurrentSessionId();
|
|
5555
5557
|
const terminate = react$1.useTerminateSession();
|
|
5556
|
-
const views =
|
|
5558
|
+
const views = chunkTQUYWUEE_cjs.toActiveSessionViews(sessions.data ?? [], {
|
|
5557
5559
|
currentSessionId,
|
|
5558
5560
|
terminatingId: terminate.isPending ? terminate.variables : null,
|
|
5559
5561
|
renderIcon: renderSessionIcon
|
|
5560
5562
|
});
|
|
5561
5563
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
5562
5564
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5563
|
-
|
|
5565
|
+
chunkNMZI3K6R_cjs.SettingsRow,
|
|
5564
5566
|
{
|
|
5565
5567
|
label: "Active sessions",
|
|
5566
5568
|
description: "Devices and agents currently signed in to your account.",
|
|
@@ -5582,7 +5584,7 @@ function ConnectedSessionsRow({
|
|
|
5582
5584
|
}
|
|
5583
5585
|
),
|
|
5584
5586
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5585
|
-
|
|
5587
|
+
chunkTQUYWUEE_cjs.ActiveSessionsDialog,
|
|
5586
5588
|
{
|
|
5587
5589
|
open,
|
|
5588
5590
|
onOpenChange: setOpen,
|
|
@@ -5624,7 +5626,7 @@ function ConnectedLogoutDialog({
|
|
|
5624
5626
|
signOut.mutate({ everywhere, reason: "manual" });
|
|
5625
5627
|
};
|
|
5626
5628
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
5627
|
-
|
|
5629
|
+
chunkTQUYWUEE_cjs.LogoutDialog,
|
|
5628
5630
|
{
|
|
5629
5631
|
open,
|
|
5630
5632
|
onClose,
|
|
@@ -5632,7 +5634,7 @@ function ConnectedLogoutDialog({
|
|
|
5632
5634
|
onLogoutAll: () => void run(true),
|
|
5633
5635
|
canLogoutAll,
|
|
5634
5636
|
isOnline,
|
|
5635
|
-
sessions:
|
|
5637
|
+
sessions: chunkTQUYWUEE_cjs.toLogoutSessionViews(sessions.data ?? []),
|
|
5636
5638
|
renderSessionIcon
|
|
5637
5639
|
}
|
|
5638
5640
|
);
|
|
@@ -5654,7 +5656,7 @@ function ConnectedDangerZone({ renderSubscriptionLink }) {
|
|
|
5654
5656
|
});
|
|
5655
5657
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
5656
5658
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5657
|
-
|
|
5659
|
+
chunkNMZI3K6R_cjs.SettingsDangerZone,
|
|
5658
5660
|
{
|
|
5659
5661
|
isOpen: zoneOpen,
|
|
5660
5662
|
onToggle: () => setZoneOpen((o) => !o),
|
|
@@ -5674,12 +5676,12 @@ function ConnectedDangerZone({ renderSubscriptionLink }) {
|
|
|
5674
5676
|
}
|
|
5675
5677
|
),
|
|
5676
5678
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5677
|
-
|
|
5679
|
+
chunkTQUYWUEE_cjs.DeleteAccountDialog,
|
|
5678
5680
|
{
|
|
5679
5681
|
open: dialogOpen,
|
|
5680
5682
|
onClose: flow.onClose,
|
|
5681
5683
|
step: flow.step,
|
|
5682
|
-
blockers:
|
|
5684
|
+
blockers: chunkTQUYWUEE_cjs.toDeleteBlockerViews(flow.blockers, renderSubscriptionLink),
|
|
5683
5685
|
onContinue: flow.onContinue,
|
|
5684
5686
|
onBack: flow.onBack,
|
|
5685
5687
|
userEmail,
|
|
@@ -5694,7 +5696,7 @@ function ConnectedDangerZone({ renderSubscriptionLink }) {
|
|
|
5694
5696
|
function ServerConnectionRow({ onRefresh, ...status }) {
|
|
5695
5697
|
const { runtimeConfig } = chunkCNHUJRQ4_cjs.useBlocksEnvironment();
|
|
5696
5698
|
const [isRefreshing, setIsRefreshing] = react.useState(false);
|
|
5697
|
-
const view =
|
|
5699
|
+
const view = chunkTQUYWUEE_cjs.serverConnectionView(status, runtimeConfig.deploymentDomain || "server");
|
|
5698
5700
|
const refresh = async () => {
|
|
5699
5701
|
setIsRefreshing(true);
|
|
5700
5702
|
try {
|
|
@@ -5703,8 +5705,8 @@ function ServerConnectionRow({ onRefresh, ...status }) {
|
|
|
5703
5705
|
setIsRefreshing(false);
|
|
5704
5706
|
}
|
|
5705
5707
|
};
|
|
5706
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
5707
|
-
|
|
5708
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkNMZI3K6R_cjs.SettingsRow, { label: "Server connection", description: view.description, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
5709
|
+
chunkTQUYWUEE_cjs.ServerConnectionButton,
|
|
5708
5710
|
{
|
|
5709
5711
|
state: view.state,
|
|
5710
5712
|
label: view.label,
|
|
@@ -5726,7 +5728,7 @@ function ConnectedAccountSettings({
|
|
|
5726
5728
|
renderSubscriptionLink
|
|
5727
5729
|
}) {
|
|
5728
5730
|
const [logoutOpen, setLogoutOpen] = react.useState(false);
|
|
5729
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5731
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkNMZI3K6R_cjs.SettingsPanel, { className: "max-w-2xl", children: [
|
|
5730
5732
|
/* @__PURE__ */ jsxRuntime.jsx(ConnectedProfileCard, { avatarClassName, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
5731
5733
|
ConnectedIdentityVerification,
|
|
5732
5734
|
{
|
|
@@ -5736,10 +5738,10 @@ function ConnectedAccountSettings({
|
|
|
5736
5738
|
) }),
|
|
5737
5739
|
afterProfile,
|
|
5738
5740
|
/* @__PURE__ */ jsxRuntime.jsx(ConnectedSecuritySection, { getUnmetRequirement: getUnmetPasswordRequirement, children: securityRows }),
|
|
5739
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5741
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNMZI3K6R_cjs.SettingsSection, { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Wifi, {}), title: "Session", children: /* @__PURE__ */ jsxRuntime.jsxs(chunkNMZI3K6R_cjs.SettingsCard, { children: [
|
|
5740
5742
|
connection && /* @__PURE__ */ jsxRuntime.jsx(ServerConnectionRow, { ...connection }),
|
|
5741
5743
|
/* @__PURE__ */ jsxRuntime.jsx(ConnectedSessionsRow, { renderSessionIcon }),
|
|
5742
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5744
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNMZI3K6R_cjs.SettingsRow, { label: "Logout", description: "Sign out of your account on this device.", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5743
5745
|
ui.Button,
|
|
5744
5746
|
{
|
|
5745
5747
|
type: "button",
|
|
@@ -6021,10 +6023,10 @@ function ConnectedPrivacySettings({
|
|
|
6021
6023
|
const update = react$1.useUpdateUserSettings();
|
|
6022
6024
|
const hideOnlineStatus = settings?.hide_online_status ?? false;
|
|
6023
6025
|
const dismissedTips = settings?.dismissed_tips ?? [];
|
|
6024
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6025
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6026
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkNMZI3K6R_cjs.SettingsPanel, { className: "max-w-2xl", children: [
|
|
6027
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNMZI3K6R_cjs.SettingsSection, { title: "Privacy and tips", children: /* @__PURE__ */ jsxRuntime.jsxs(chunkNMZI3K6R_cjs.SettingsCard, { children: [
|
|
6026
6028
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6027
|
-
|
|
6029
|
+
chunkNMZI3K6R_cjs.SettingsRow,
|
|
6028
6030
|
{
|
|
6029
6031
|
label: "Show Online Status",
|
|
6030
6032
|
labelFor: "showOnlineStatus",
|
|
@@ -6042,7 +6044,7 @@ function ConnectedPrivacySettings({
|
|
|
6042
6044
|
),
|
|
6043
6045
|
rows,
|
|
6044
6046
|
showTipsReset && /* @__PURE__ */ jsxRuntime.jsx(
|
|
6045
|
-
|
|
6047
|
+
chunkNMZI3K6R_cjs.SettingsRow,
|
|
6046
6048
|
{
|
|
6047
6049
|
label: "Hidden tips",
|
|
6048
6050
|
description: "Restore any Smart Tips you\u2019ve hidden with \u201Cdon\u2019t show again\u201D.",
|
|
@@ -6106,13 +6108,13 @@ var COLUMNS = [
|
|
|
6106
6108
|
flex: 1,
|
|
6107
6109
|
minWidth: 120,
|
|
6108
6110
|
cellRenderer: (params) => isStandard(params.data) ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
6109
|
-
|
|
6111
|
+
chunkTQUYWUEE_cjs.ModelProviderLabel,
|
|
6110
6112
|
{
|
|
6111
6113
|
logo: /* @__PURE__ */ jsxRuntime.jsx("img", { src: "/favicon.svg", alt: "ARBI", className: "size-3.5 flex-shrink-0 rounded-sm" }),
|
|
6112
6114
|
children: "ARBI CITY"
|
|
6113
6115
|
}
|
|
6114
6116
|
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
6115
|
-
|
|
6117
|
+
chunkTQUYWUEE_cjs.ModelProviderLabel,
|
|
6116
6118
|
{
|
|
6117
6119
|
logo: /* @__PURE__ */ jsxRuntime.jsx(react$1.ProviderIcon, { modelName: params.data?.model_name, provider: params.value, size: 14 }),
|
|
6118
6120
|
children: PROVIDER_NAMES[params.value ?? ""] || params.value || "\u2014"
|
|
@@ -6188,8 +6190,8 @@ function ConnectedPremiumModels() {
|
|
|
6188
6190
|
[save]
|
|
6189
6191
|
);
|
|
6190
6192
|
if (premiumModels.length === 0) return null;
|
|
6191
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6192
|
-
|
|
6193
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkNMZI3K6R_cjs.SettingsPanel, { className: "max-w-2xl space-y-4", children: /* @__PURE__ */ jsxRuntime.jsx(chunkNMZI3K6R_cjs.SettingsSection, { title: "Premium models", children: /* @__PURE__ */ jsxRuntime.jsx(chunkNMZI3K6R_cjs.SettingsCard, { className: "space-y-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
6194
|
+
chunkTQUYWUEE_cjs.PremiumModelsFrame,
|
|
6193
6195
|
{
|
|
6194
6196
|
enabled: premiumModel !== "",
|
|
6195
6197
|
onEnabledChange: (enabled) => {
|
|
@@ -6318,10 +6320,10 @@ function ConnectedAppsSettings({
|
|
|
6318
6320
|
}
|
|
6319
6321
|
};
|
|
6320
6322
|
if (isLoading) {
|
|
6321
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6323
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.ConnectionsLoading, { message: "Loading connected apps\u2026" });
|
|
6322
6324
|
}
|
|
6323
6325
|
if (catalogError) {
|
|
6324
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6326
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.ConnectionsError, { message: "Failed to load connector catalog. Please refresh and try again." });
|
|
6325
6327
|
}
|
|
6326
6328
|
const visibleCatalog = catalog.filter((c) => isVendorVisible(c.vendor_key));
|
|
6327
6329
|
const sharePointVisible = isVendorVisible("microsoft_sharepoint");
|
|
@@ -6330,7 +6332,7 @@ function ConnectedAppsSettings({
|
|
|
6330
6332
|
(c) => !react$1.isMailboxSyncVendor(c.vendor_key) && !react$1.isSharePointVendor(c.vendor_key)
|
|
6331
6333
|
);
|
|
6332
6334
|
const renderCard = (entry) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
6333
|
-
|
|
6335
|
+
chunkTQUYWUEE_cjs.ConnectionCard,
|
|
6334
6336
|
{
|
|
6335
6337
|
connection: toConnectionCardView(entry, connectedByVendor[entry.vendor_key], {
|
|
6336
6338
|
isDisconnecting: disconnect.isPending && disconnect.variables?.vendorKey === entry.vendor_key,
|
|
@@ -6347,12 +6349,12 @@ function ConnectedAppsSettings({
|
|
|
6347
6349
|
);
|
|
6348
6350
|
const renderGroup = (title, subtitle, icon2, entries) => {
|
|
6349
6351
|
if (entries.length === 0) return null;
|
|
6350
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6352
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkNMZI3K6R_cjs.SettingsSection, { icon: icon2, title, children: /* @__PURE__ */ jsxRuntime.jsxs(chunkNMZI3K6R_cjs.SettingsCard, { className: "space-y-3", children: [
|
|
6351
6353
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: subtitle }),
|
|
6352
6354
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: entries.map(renderCard) })
|
|
6353
6355
|
] }) });
|
|
6354
6356
|
};
|
|
6355
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6357
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkNMZI3K6R_cjs.SettingsPanel, { className: "max-w-2xl", children: [
|
|
6356
6358
|
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "rounded-xl border border-border bg-card px-5 py-4", children: [
|
|
6357
6359
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-4", children: [
|
|
6358
6360
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 flex h-10 w-10 shrink-0 items-center justify-center rounded-lg border border-border bg-background text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Mail, { className: "h-5 w-5" }) }),
|
|
@@ -6458,7 +6460,7 @@ function ConnectedAppsSettings({
|
|
|
6458
6460
|
}
|
|
6459
6461
|
)
|
|
6460
6462
|
] }),
|
|
6461
|
-
catalog.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
6463
|
+
catalog.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(chunkNMZI3K6R_cjs.SettingsCard, { children: /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.ConnectionsEmpty, { message: "No connectors available yet." }) }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
6462
6464
|
renderGroup("Email & Drive", EMAIL_AND_DRIVE_SUBTITLE, /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Mail, {}), emailCatalog),
|
|
6463
6465
|
renderGroup(
|
|
6464
6466
|
"Apps & Integrations (MCP)",
|
|
@@ -6535,7 +6537,7 @@ function ConnectedSettingsPage({
|
|
|
6535
6537
|
}, [requested]);
|
|
6536
6538
|
const controlled = section !== void 0;
|
|
6537
6539
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6538
|
-
|
|
6540
|
+
chunkTQUYWUEE_cjs.SettingsPage,
|
|
6539
6541
|
{
|
|
6540
6542
|
...page,
|
|
6541
6543
|
sections,
|
|
@@ -6943,6 +6945,7 @@ function ConnectedWorkspaceSettings({
|
|
|
6943
6945
|
shareDialog,
|
|
6944
6946
|
children,
|
|
6945
6947
|
onExport,
|
|
6948
|
+
footerActions,
|
|
6946
6949
|
onOpenActivity,
|
|
6947
6950
|
onLeft,
|
|
6948
6951
|
testId = "workspace-settings-page"
|
|
@@ -7079,19 +7082,22 @@ function ConnectedWorkspaceSettings({
|
|
|
7079
7082
|
)
|
|
7080
7083
|
] }),
|
|
7081
7084
|
children,
|
|
7082
|
-
isMember && onExport && /* @__PURE__ */ jsxRuntime.
|
|
7083
|
-
|
|
7084
|
-
|
|
7085
|
-
|
|
7086
|
-
|
|
7087
|
-
|
|
7088
|
-
|
|
7089
|
-
|
|
7090
|
-
|
|
7091
|
-
|
|
7092
|
-
|
|
7093
|
-
|
|
7094
|
-
|
|
7085
|
+
isMember && (onExport || footerActions) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2 px-4 pb-4", children: [
|
|
7086
|
+
footerActions,
|
|
7087
|
+
onExport && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7088
|
+
ui.Button,
|
|
7089
|
+
{
|
|
7090
|
+
variant: "outline",
|
|
7091
|
+
size: "sm",
|
|
7092
|
+
onClick: onExport,
|
|
7093
|
+
"data-testid": "workspace-transfer-button",
|
|
7094
|
+
children: [
|
|
7095
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.FolderInput, { className: "size-4" }),
|
|
7096
|
+
"Export, copy or move\u2026"
|
|
7097
|
+
]
|
|
7098
|
+
}
|
|
7099
|
+
)
|
|
7100
|
+
] }),
|
|
7095
7101
|
!isOwner && /* @__PURE__ */ jsxRuntime.jsx(
|
|
7096
7102
|
chunkMSFQDELO_cjs.LeaveFooter,
|
|
7097
7103
|
{
|
|
@@ -7274,9 +7280,9 @@ function ConnectedMailboxSyncDialog({
|
|
|
7274
7280
|
showDescription: true,
|
|
7275
7281
|
className: "w-[92vw] sm:max-w-lg",
|
|
7276
7282
|
children: [
|
|
7277
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
7278
|
-
!lockedWorkspaceExtId && /* @__PURE__ */ jsxRuntime.jsx(
|
|
7279
|
-
|
|
7283
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.SyncDialogBody, { children: [
|
|
7284
|
+
!lockedWorkspaceExtId && /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.SyncField, { label: "Target workspace", htmlFor: "sync-workspace", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
7285
|
+
chunkTQUYWUEE_cjs.SyncSelect,
|
|
7280
7286
|
{
|
|
7281
7287
|
id: "sync-workspace",
|
|
7282
7288
|
value: workspaceExtId,
|
|
@@ -7285,9 +7291,9 @@ function ConnectedMailboxSyncDialog({
|
|
|
7285
7291
|
options: memberWorkspaces.map((w) => ({ value: w.external_id, label: w.name }))
|
|
7286
7292
|
}
|
|
7287
7293
|
) }),
|
|
7288
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
7294
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.SyncField, { label: "Backfill window", htmlFor: "sync-backfill", children: [
|
|
7289
7295
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7290
|
-
|
|
7296
|
+
chunkTQUYWUEE_cjs.SyncSelect,
|
|
7291
7297
|
{
|
|
7292
7298
|
id: "sync-backfill",
|
|
7293
7299
|
value: backfill,
|
|
@@ -7307,17 +7313,17 @@ function ConnectedMailboxSyncDialog({
|
|
|
7307
7313
|
"aria-label": "Import emails since date"
|
|
7308
7314
|
}
|
|
7309
7315
|
),
|
|
7310
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7316
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.SyncSmallNote, { children: "Emails are always imported from this date onward \u2014 the start point never moves." })
|
|
7311
7317
|
] })
|
|
7312
7318
|
] }),
|
|
7313
7319
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7314
|
-
|
|
7320
|
+
chunkTQUYWUEE_cjs.SyncField,
|
|
7315
7321
|
{
|
|
7316
7322
|
label: `Folders to import${selectedFolders.length > 0 ? ` (${selectedFolders.length})` : ""}`,
|
|
7317
7323
|
hint: "Select at least one folder to import.",
|
|
7318
|
-
actions: folders.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7324
|
+
actions: folders.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.SyncLinkRow, { children: [
|
|
7319
7325
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7320
|
-
|
|
7326
|
+
chunkTQUYWUEE_cjs.SyncLinkButton,
|
|
7321
7327
|
{
|
|
7322
7328
|
onClick: () => setExpandAllNonce((n) => n + 1),
|
|
7323
7329
|
testId: "mail-folders-expand-all",
|
|
@@ -7325,20 +7331,20 @@ function ConnectedMailboxSyncDialog({
|
|
|
7325
7331
|
}
|
|
7326
7332
|
),
|
|
7327
7333
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7328
|
-
|
|
7334
|
+
chunkTQUYWUEE_cjs.SyncLinkButton,
|
|
7329
7335
|
{
|
|
7330
7336
|
onClick: () => setCollapseAllNonce((n) => n + 1),
|
|
7331
7337
|
testId: "mail-folders-collapse-all",
|
|
7332
7338
|
children: "Collapse all"
|
|
7333
7339
|
}
|
|
7334
7340
|
),
|
|
7335
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7341
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.SyncLinkButton, { onClick: toggleAllFolders, children: allSelected ? "Clear all" : "Select all" })
|
|
7336
7342
|
] }),
|
|
7337
|
-
children: foldersLoading ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
7343
|
+
children: foldersLoading ? /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.SyncLoading, { children: "Loading folders\u2026" }) : foldersError ? (
|
|
7338
7344
|
// A failed fetch is not an empty mailbox: it hides auth/scope errors (e.g. a Gmail
|
|
7339
7345
|
// account needing reconnect).
|
|
7340
7346
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7341
|
-
|
|
7347
|
+
chunkTQUYWUEE_cjs.SyncReconnectNotice,
|
|
7342
7348
|
{
|
|
7343
7349
|
message: `Couldn\u2019t load folders from ${catalog.display_name}. Reconnect the account and try again.`,
|
|
7344
7350
|
onReconnect: () => void reconnect(),
|
|
@@ -7346,7 +7352,7 @@ function ConnectedMailboxSyncDialog({
|
|
|
7346
7352
|
testId: "folders-reconnect"
|
|
7347
7353
|
}
|
|
7348
7354
|
)
|
|
7349
|
-
) : folders.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
7355
|
+
) : folders.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.SyncNote, { children: "No folders found." }) : /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.SyncTreeFrame, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
7350
7356
|
chunkCROGFB46_cjs.MailFolderTree,
|
|
7351
7357
|
{
|
|
7352
7358
|
nodes: folderTree,
|
|
@@ -7358,9 +7364,9 @@ function ConnectedMailboxSyncDialog({
|
|
|
7358
7364
|
) })
|
|
7359
7365
|
}
|
|
7360
7366
|
),
|
|
7361
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
7367
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.SyncOptions, { children: [
|
|
7362
7368
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7363
|
-
|
|
7369
|
+
chunkTQUYWUEE_cjs.SyncOptionToggle,
|
|
7364
7370
|
{
|
|
7365
7371
|
checked: skipDuplicates,
|
|
7366
7372
|
onCheckedChange: setSkipDuplicates,
|
|
@@ -7370,7 +7376,7 @@ function ConnectedMailboxSyncDialog({
|
|
|
7370
7376
|
}
|
|
7371
7377
|
),
|
|
7372
7378
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7373
|
-
|
|
7379
|
+
chunkTQUYWUEE_cjs.SyncOptionToggle,
|
|
7374
7380
|
{
|
|
7375
7381
|
checked: autoRename,
|
|
7376
7382
|
onCheckedChange: setAutoRename,
|
|
@@ -7380,7 +7386,7 @@ function ConnectedMailboxSyncDialog({
|
|
|
7380
7386
|
}
|
|
7381
7387
|
),
|
|
7382
7388
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7383
|
-
|
|
7389
|
+
chunkTQUYWUEE_cjs.SyncOptionToggle,
|
|
7384
7390
|
{
|
|
7385
7391
|
checked: shared,
|
|
7386
7392
|
onCheckedChange: setShared,
|
|
@@ -7390,7 +7396,7 @@ function ConnectedMailboxSyncDialog({
|
|
|
7390
7396
|
}
|
|
7391
7397
|
),
|
|
7392
7398
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7393
|
-
|
|
7399
|
+
chunkTQUYWUEE_cjs.SyncOptionToggle,
|
|
7394
7400
|
{
|
|
7395
7401
|
checked: autoSync,
|
|
7396
7402
|
onCheckedChange: setAutoSync,
|
|
@@ -7402,7 +7408,7 @@ function ConnectedMailboxSyncDialog({
|
|
|
7402
7408
|
] })
|
|
7403
7409
|
] }),
|
|
7404
7410
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7405
|
-
|
|
7411
|
+
chunkTQUYWUEE_cjs.SyncDialogFooter,
|
|
7406
7412
|
{
|
|
7407
7413
|
onCancel: () => onOpenChange(false),
|
|
7408
7414
|
onSave: handleEnableSubmit,
|
|
@@ -7464,7 +7470,7 @@ function DriveFolderNode({
|
|
|
7464
7470
|
const mightHaveChildren = docCount == null || docCount > 0;
|
|
7465
7471
|
const orderedChildren = [...children].sort((a, b) => a.name.localeCompare(b.name));
|
|
7466
7472
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7467
|
-
|
|
7473
|
+
chunkTQUYWUEE_cjs.SyncFolderRow,
|
|
7468
7474
|
{
|
|
7469
7475
|
id: folder.id,
|
|
7470
7476
|
name: folder.name,
|
|
@@ -7478,7 +7484,7 @@ function DriveFolderNode({
|
|
|
7478
7484
|
onCheckedChange: () => onToggle(folder.id),
|
|
7479
7485
|
count: typeof docCount === "number" ? docCount : void 0,
|
|
7480
7486
|
isCountLoading: isSelectable && countLoading,
|
|
7481
|
-
children: isLoading ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
7487
|
+
children: isLoading ? /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.SyncFolderStatus, { depth, kind: "loading" }) : orderedChildren.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.SyncFolderStatus, { depth, kind: "empty" }) : orderedChildren.map((child) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
7482
7488
|
DriveFolderNode,
|
|
7483
7489
|
{
|
|
7484
7490
|
vendorKey,
|
|
@@ -7624,9 +7630,9 @@ function ConnectedDriveSyncDialog({
|
|
|
7624
7630
|
showDescription: true,
|
|
7625
7631
|
className: "w-[92vw] sm:max-w-lg",
|
|
7626
7632
|
children: [
|
|
7627
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
7628
|
-
!lockedWorkspaceExtId && /* @__PURE__ */ jsxRuntime.jsx(
|
|
7629
|
-
|
|
7633
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.SyncDialogBody, { children: [
|
|
7634
|
+
!lockedWorkspaceExtId && /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.SyncField, { label: "Target workspace", htmlFor: "drive-sync-workspace", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
7635
|
+
chunkTQUYWUEE_cjs.SyncSelect,
|
|
7630
7636
|
{
|
|
7631
7637
|
id: "drive-sync-workspace",
|
|
7632
7638
|
value: workspaceExtId,
|
|
@@ -7636,13 +7642,13 @@ function ConnectedDriveSyncDialog({
|
|
|
7636
7642
|
}
|
|
7637
7643
|
) }),
|
|
7638
7644
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7639
|
-
|
|
7645
|
+
chunkTQUYWUEE_cjs.SyncField,
|
|
7640
7646
|
{
|
|
7641
7647
|
label: `Folders to import${selectedFolders.length > 0 ? ` (${selectedFolders.length})` : ""}`,
|
|
7642
7648
|
hint: "Select at least one folder. Importing a folder includes everything inside it.",
|
|
7643
|
-
actions: orderedFolders.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7649
|
+
actions: orderedFolders.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.SyncLinkRow, { children: [
|
|
7644
7650
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7645
|
-
|
|
7651
|
+
chunkTQUYWUEE_cjs.SyncLinkButton,
|
|
7646
7652
|
{
|
|
7647
7653
|
onClick: () => setExpandAllNonce((n) => n + 1),
|
|
7648
7654
|
testId: "drive-folders-expand-all",
|
|
@@ -7650,7 +7656,7 @@ function ConnectedDriveSyncDialog({
|
|
|
7650
7656
|
}
|
|
7651
7657
|
),
|
|
7652
7658
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7653
|
-
|
|
7659
|
+
chunkTQUYWUEE_cjs.SyncLinkButton,
|
|
7654
7660
|
{
|
|
7655
7661
|
onClick: () => setCollapseAllNonce((n) => n + 1),
|
|
7656
7662
|
testId: "drive-folders-collapse-all",
|
|
@@ -7658,19 +7664,19 @@ function ConnectedDriveSyncDialog({
|
|
|
7658
7664
|
}
|
|
7659
7665
|
)
|
|
7660
7666
|
] }),
|
|
7661
|
-
children: foldersLoading ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
7662
|
-
|
|
7667
|
+
children: foldersLoading ? /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.SyncLoading, { children: "Loading folders\u2026" }) : needsReconnect ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
7668
|
+
chunkTQUYWUEE_cjs.SyncReconnectNotice,
|
|
7663
7669
|
{
|
|
7664
7670
|
...reconnectButtonProps,
|
|
7665
7671
|
message: `Reconnect ${catalog.display_name} to enable ${productName} \u2014 your account needs to grant file access.`
|
|
7666
7672
|
}
|
|
7667
7673
|
) : foldersError ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
7668
|
-
|
|
7674
|
+
chunkTQUYWUEE_cjs.SyncReconnectNotice,
|
|
7669
7675
|
{
|
|
7670
7676
|
...reconnectButtonProps,
|
|
7671
7677
|
message: `Couldn\u2019t load folders from ${productName}. Reconnect the account and try again.`
|
|
7672
7678
|
}
|
|
7673
|
-
) : orderedFolders.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
7679
|
+
) : orderedFolders.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.SyncNote, { children: "No folders found." }) : /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.SyncTreeFrame, { children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0.5", "data-testid": "drive-folder-tree", children: orderedFolders.map((f) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
7674
7680
|
DriveFolderNode,
|
|
7675
7681
|
{
|
|
7676
7682
|
vendorKey: catalog.vendor_key,
|
|
@@ -7687,9 +7693,9 @@ function ConnectedDriveSyncDialog({
|
|
|
7687
7693
|
)) }) })
|
|
7688
7694
|
}
|
|
7689
7695
|
),
|
|
7690
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
7696
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.SyncOptions, { children: [
|
|
7691
7697
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7692
|
-
|
|
7698
|
+
chunkTQUYWUEE_cjs.SyncOptionToggle,
|
|
7693
7699
|
{
|
|
7694
7700
|
checked: skipDuplicates,
|
|
7695
7701
|
onCheckedChange: setSkipDuplicates,
|
|
@@ -7698,7 +7704,7 @@ function ConnectedDriveSyncDialog({
|
|
|
7698
7704
|
}
|
|
7699
7705
|
),
|
|
7700
7706
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7701
|
-
|
|
7707
|
+
chunkTQUYWUEE_cjs.SyncOptionToggle,
|
|
7702
7708
|
{
|
|
7703
7709
|
checked: autoRename,
|
|
7704
7710
|
onCheckedChange: setAutoRename,
|
|
@@ -7707,7 +7713,7 @@ function ConnectedDriveSyncDialog({
|
|
|
7707
7713
|
}
|
|
7708
7714
|
),
|
|
7709
7715
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7710
|
-
|
|
7716
|
+
chunkTQUYWUEE_cjs.SyncOptionToggle,
|
|
7711
7717
|
{
|
|
7712
7718
|
checked: shared,
|
|
7713
7719
|
onCheckedChange: setShared,
|
|
@@ -7716,7 +7722,7 @@ function ConnectedDriveSyncDialog({
|
|
|
7716
7722
|
}
|
|
7717
7723
|
),
|
|
7718
7724
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7719
|
-
|
|
7725
|
+
chunkTQUYWUEE_cjs.SyncOptionToggle,
|
|
7720
7726
|
{
|
|
7721
7727
|
checked: autoSync,
|
|
7722
7728
|
onCheckedChange: setAutoSync,
|
|
@@ -7728,7 +7734,7 @@ function ConnectedDriveSyncDialog({
|
|
|
7728
7734
|
] })
|
|
7729
7735
|
] }),
|
|
7730
7736
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7731
|
-
|
|
7737
|
+
chunkTQUYWUEE_cjs.SyncDialogFooter,
|
|
7732
7738
|
{
|
|
7733
7739
|
onCancel: () => onOpenChange(false),
|
|
7734
7740
|
onSave: handleEnableSubmit,
|
|
@@ -7760,7 +7766,7 @@ function BillingProjectEntity({
|
|
|
7760
7766
|
subscription = "none",
|
|
7761
7767
|
...props
|
|
7762
7768
|
}) {
|
|
7763
|
-
const { stripeEnabled } =
|
|
7769
|
+
const { stripeEnabled } = chunkP2YM67Y5_cjs.useBillingSupport();
|
|
7764
7770
|
const isPaid2 = stripeEnabled && (subscription === "active" || subscription === "past_due" || subscription === "dev");
|
|
7765
7771
|
return /* @__PURE__ */ jsxRuntime.jsx(ui.ProjectEntity, { ...props, subscription, isPaid: isPaid2 });
|
|
7766
7772
|
}
|
|
@@ -7787,8 +7793,8 @@ function InvoicesModal({
|
|
|
7787
7793
|
key: inv.number ?? String(i),
|
|
7788
7794
|
date: formatInvoiceDate(inv.date),
|
|
7789
7795
|
kind: KIND_LABELS[inv.kind],
|
|
7790
|
-
amount:
|
|
7791
|
-
amountNote: inv.amount_ex_vat != null && inv.amount_ex_vat !== inv.amount ? `${
|
|
7796
|
+
amount: chunkP2YM67Y5_cjs.formatMoney(inv.amount, inv.currency),
|
|
7797
|
+
amountNote: inv.amount_ex_vat != null && inv.amount_ex_vat !== inv.amount ? `${chunkP2YM67Y5_cjs.formatMoney(inv.amount_ex_vat, inv.currency)} ex VAT` : void 0,
|
|
7792
7798
|
status: inv.status,
|
|
7793
7799
|
isPaid: isPaid2,
|
|
7794
7800
|
href: inv.hosted_invoice_url ?? inv.url ?? inv.pdf_url ?? void 0,
|
|
@@ -7796,7 +7802,7 @@ function InvoicesModal({
|
|
|
7796
7802
|
};
|
|
7797
7803
|
});
|
|
7798
7804
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7799
|
-
|
|
7805
|
+
chunkTQUYWUEE_cjs.InvoicesDialog,
|
|
7800
7806
|
{
|
|
7801
7807
|
open,
|
|
7802
7808
|
onOpenChange,
|
|
@@ -7823,7 +7829,7 @@ function StripeCheckoutModal({
|
|
|
7823
7829
|
const [clientSecret, setClientSecret] = react.useState(null);
|
|
7824
7830
|
const [isCreating, setIsCreating] = react.useState(false);
|
|
7825
7831
|
const [stripe, setStripe] = react.useState(null);
|
|
7826
|
-
const { stripeEnabled, checkout } =
|
|
7832
|
+
const { stripeEnabled, checkout } = chunkP2YM67Y5_cjs.useBillingSupport();
|
|
7827
7833
|
const createCheckout = react$1.useCreateProjectCheckout();
|
|
7828
7834
|
const refreshProject = react$1.useRefreshProject();
|
|
7829
7835
|
const invalidateProjects = react$1.useInvalidateProjects();
|
|
@@ -7850,7 +7856,7 @@ function StripeCheckoutModal({
|
|
|
7850
7856
|
projectExtId,
|
|
7851
7857
|
body: {
|
|
7852
7858
|
interval,
|
|
7853
|
-
packs:
|
|
7859
|
+
packs: chunkP2YM67Y5_cjs.PRO_PACKS,
|
|
7854
7860
|
ai_blocks: aiBlocks,
|
|
7855
7861
|
storage_blocks: storageBlocks,
|
|
7856
7862
|
addon_budget_pence: addonBudgetPence,
|
|
@@ -7866,7 +7872,7 @@ function StripeCheckoutModal({
|
|
|
7866
7872
|
},
|
|
7867
7873
|
onError: (error) => {
|
|
7868
7874
|
console.error("Failed to create checkout session:", error);
|
|
7869
|
-
const reason =
|
|
7875
|
+
const reason = chunkP2YM67Y5_cjs.apiErrorDetail(error)?.message;
|
|
7870
7876
|
shell.notify.error(
|
|
7871
7877
|
reason ? `Checkout didn't start: ${reason}` : "Checkout didn't start. Try again."
|
|
7872
7878
|
);
|
|
@@ -7899,9 +7905,9 @@ function StripeCheckoutModal({
|
|
|
7899
7905
|
}
|
|
7900
7906
|
}, [open]);
|
|
7901
7907
|
const isStripeConfigured = stripeEnabled;
|
|
7902
|
-
const vatNote = quote ? `${
|
|
7908
|
+
const vatNote = quote ? `${chunkP2YM67Y5_cjs.checkoutItemsLabel(aiBlocks, storageBlocks)} \xB7 ${chunkP2YM67Y5_cjs.quoteTotalLine(quote)}` : null;
|
|
7903
7909
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7904
|
-
|
|
7910
|
+
chunkTQUYWUEE_cjs.CheckoutDialogFrame,
|
|
7905
7911
|
{
|
|
7906
7912
|
open,
|
|
7907
7913
|
onOpenChange,
|
|
@@ -7911,7 +7917,7 @@ function StripeCheckoutModal({
|
|
|
7911
7917
|
children: clientSecret && !!stripe && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
7912
7918
|
vatNote && /* @__PURE__ */ jsxRuntime.jsx("p", { "data-testid": "checkout-vat-note", className: "mb-4 text-sm text-muted-foreground", children: vatNote }),
|
|
7913
7919
|
checkout?.render(stripe, { clientSecret, onComplete: handleComplete }),
|
|
7914
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7920
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3", children: /* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.MoreInfo, { title: "Paying", label: "Payment help", testId: "checkout-payment-help", children: [
|
|
7915
7921
|
/* @__PURE__ */ jsxRuntime.jsx("p", { "data-testid": "checkout-decline-note", children: "Card declined? Nothing was charged. Try again or use another card." }),
|
|
7916
7922
|
/* @__PURE__ */ jsxRuntime.jsx("p", { "data-testid": "checkout-vat-id-note", children: "No VAT number? Leave \u2018purchasing as a business\u2019 unticked." }),
|
|
7917
7923
|
/* @__PURE__ */ jsxRuntime.jsx("p", { children: "Add-ons chosen here are on the first invoice with the plan and renew with it until you reduce them." })
|
|
@@ -7953,31 +7959,31 @@ function defaultBillingCountry(languages = typeof navigator === "undefined" ? []
|
|
|
7953
7959
|
}
|
|
7954
7960
|
var choiceForPacks = (packs) => packs > 0 ? "pro" : "free";
|
|
7955
7961
|
function proCard(selected, isAnnual, prices) {
|
|
7956
|
-
const packs =
|
|
7962
|
+
const packs = chunkP2YM67Y5_cjs.PLAN_CHOICE_PACKS.pro;
|
|
7957
7963
|
const currency = prices.monthly?.currency ?? prices.annual?.currency ?? "gbp";
|
|
7958
|
-
const monthly =
|
|
7959
|
-
const annual =
|
|
7964
|
+
const monthly = chunkP2YM67Y5_cjs.packPrice(prices.monthly, packs);
|
|
7965
|
+
const annual = chunkP2YM67Y5_cjs.packPrice(prices.annual, packs);
|
|
7960
7966
|
const current = isAnnual ? annual : monthly;
|
|
7961
7967
|
const effectiveMonthly = current ? isAnnual ? current.amount_ex_vat / 12 : current.amount_ex_vat : null;
|
|
7962
7968
|
return {
|
|
7963
7969
|
id: packs,
|
|
7964
|
-
name:
|
|
7970
|
+
name: chunkP2YM67Y5_cjs.planNameForPacks(packs),
|
|
7965
7971
|
isSelected: selected === "pro",
|
|
7966
7972
|
price: current && effectiveMonthly != null ? {
|
|
7967
7973
|
annual: isAnnual,
|
|
7968
|
-
yearlyStrike: isAnnual && monthly && monthly.amount_ex_vat * 12 > current.amount_ex_vat ?
|
|
7969
|
-
yearlyTotal: isAnnual ?
|
|
7974
|
+
yearlyStrike: isAnnual && monthly && monthly.amount_ex_vat * 12 > current.amount_ex_vat ? chunkP2YM67Y5_cjs.formatMoney(monthly.amount_ex_vat * 12, currency) : void 0,
|
|
7975
|
+
yearlyTotal: isAnnual ? chunkP2YM67Y5_cjs.formatMoney(current.amount_ex_vat, currency) : void 0,
|
|
7970
7976
|
intervalLabel: isAnnual ? "/yr + VAT" : "/mo",
|
|
7971
|
-
monthly:
|
|
7977
|
+
monthly: chunkP2YM67Y5_cjs.formatMoney(Math.round(effectiveMonthly), currency),
|
|
7972
7978
|
taxLabel: "+ VAT",
|
|
7973
7979
|
// The inclusive figure for a UK customer, right under the headline.
|
|
7974
|
-
note: `${
|
|
7980
|
+
note: `${chunkP2YM67Y5_cjs.formatMoney(current.amount, currency)}${isAnnual ? "/yr" : "/mo"} incl. UK VAT`
|
|
7975
7981
|
} : void 0,
|
|
7976
7982
|
features: [
|
|
7977
|
-
`${react$1.formatGbp(
|
|
7978
|
-
`${
|
|
7983
|
+
`${react$1.formatGbp(chunkP2YM67Y5_cjs.PRO_AI_GBP)} of AI usage / month`,
|
|
7984
|
+
`${chunkP2YM67Y5_cjs.PRO_STORAGE_GB} GB storage`,
|
|
7979
7985
|
"Unlimited collaborators",
|
|
7980
|
-
...isAnnual ? [
|
|
7986
|
+
...isAnnual ? [chunkP2YM67Y5_cjs.ANNUAL_PREMIUM_AI_NOTE] : []
|
|
7981
7987
|
]
|
|
7982
7988
|
};
|
|
7983
7989
|
}
|
|
@@ -7989,9 +7995,9 @@ function buildPlanCards(selected, isAnnual, prices, isOnFree) {
|
|
|
7989
7995
|
isCurrent: isOnFree,
|
|
7990
7996
|
isSelected: selected === "free" && !isOnFree,
|
|
7991
7997
|
features: [
|
|
7992
|
-
`${react$1.formatGbp(
|
|
7993
|
-
`${
|
|
7994
|
-
|
|
7998
|
+
`${react$1.formatGbp(chunkP2YM67Y5_cjs.FREE_AI_GBP)} of AI usage / month`,
|
|
7999
|
+
`${chunkP2YM67Y5_cjs.FREE_STORAGE_MB.toLocaleString("en-US")} MB storage`,
|
|
8000
|
+
chunkP2YM67Y5_cjs.FREE_COLLABORATORS === 0 ? "Just you" : `${chunkP2YM67Y5_cjs.FREE_COLLABORATORS} collaborators`
|
|
7995
8001
|
]
|
|
7996
8002
|
};
|
|
7997
8003
|
return [free, proCard(selected, isAnnual, prices)];
|
|
@@ -8004,7 +8010,7 @@ function PlanChoiceCards({
|
|
|
8004
8010
|
isOnFree = false
|
|
8005
8011
|
}) {
|
|
8006
8012
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8007
|
-
|
|
8013
|
+
chunkTQUYWUEE_cjs.PlanCardGrid,
|
|
8008
8014
|
{
|
|
8009
8015
|
plans: buildPlanCards(selected, isAnnual, prices, isOnFree),
|
|
8010
8016
|
onSelect: (id) => onSelect(choiceForPacks(id))
|
|
@@ -8013,13 +8019,13 @@ function PlanChoiceCards({
|
|
|
8013
8019
|
}
|
|
8014
8020
|
function PlanInfoPopover2() {
|
|
8015
8021
|
const { openSettings } = chunkCNHUJRQ4_cjs.useBlocksEnvironment();
|
|
8016
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8022
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.PlanInfoPopover, { onOpenModelList: () => openSettings("chat") });
|
|
8017
8023
|
}
|
|
8018
8024
|
function CheckoutAddonBudget({
|
|
8019
8025
|
value,
|
|
8020
8026
|
onChange
|
|
8021
8027
|
}) {
|
|
8022
|
-
const budget =
|
|
8028
|
+
const budget = chunkP2YM67Y5_cjs.parseBudgetPounds(value);
|
|
8023
8029
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8024
8030
|
"div",
|
|
8025
8031
|
{
|
|
@@ -8042,7 +8048,7 @@ function CheckoutAddonBudget({
|
|
|
8042
8048
|
step: 25,
|
|
8043
8049
|
className: "h-8 w-24",
|
|
8044
8050
|
value,
|
|
8045
|
-
placeholder: String(
|
|
8051
|
+
placeholder: String(chunkP2YM67Y5_cjs.DEFAULT_SPEND_CAP_PENCE / 100),
|
|
8046
8052
|
onChange: (e) => onChange(e.target.value),
|
|
8047
8053
|
"aria-invalid": budget === void 0,
|
|
8048
8054
|
"data-testid": "checkout-addon-budget-input"
|
|
@@ -8060,7 +8066,7 @@ function BlockStepper({
|
|
|
8060
8066
|
onChange,
|
|
8061
8067
|
testId
|
|
8062
8068
|
}) {
|
|
8063
|
-
const set = (n) => onChange(Math.max(0, Math.min(
|
|
8069
|
+
const set = (n) => onChange(Math.max(0, Math.min(chunkP2YM67Y5_cjs.MAX_CHECKOUT_BLOCKS, n)));
|
|
8064
8070
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8065
8071
|
"div",
|
|
8066
8072
|
{
|
|
@@ -8104,7 +8110,7 @@ function BlockStepper({
|
|
|
8104
8110
|
className: "size-8",
|
|
8105
8111
|
"aria-label": `More: ${label}`,
|
|
8106
8112
|
onClick: () => set(value + 1),
|
|
8107
|
-
disabled: value >=
|
|
8113
|
+
disabled: value >= chunkP2YM67Y5_cjs.MAX_CHECKOUT_BLOCKS,
|
|
8108
8114
|
"data-testid": `${testId}-increment`,
|
|
8109
8115
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "size-4" })
|
|
8110
8116
|
}
|
|
@@ -8121,8 +8127,8 @@ function CheckoutAddonBlocks({
|
|
|
8121
8127
|
onStorageBlocksChange,
|
|
8122
8128
|
price
|
|
8123
8129
|
}) {
|
|
8124
|
-
const ai =
|
|
8125
|
-
const storage =
|
|
8130
|
+
const ai = chunkP2YM67Y5_cjs.addonPrice(price, "ai_usage");
|
|
8131
|
+
const storage = chunkP2YM67Y5_cjs.addonPrice(price, "storage");
|
|
8126
8132
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8127
8133
|
"div",
|
|
8128
8134
|
{
|
|
@@ -8132,8 +8138,8 @@ function CheckoutAddonBlocks({
|
|
|
8132
8138
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8133
8139
|
BlockStepper,
|
|
8134
8140
|
{
|
|
8135
|
-
label: `+${react$1.formatGbp(ai?.ai_gbp ||
|
|
8136
|
-
priceText:
|
|
8141
|
+
label: `+${react$1.formatGbp(ai?.ai_gbp || chunkP2YM67Y5_cjs.ADDON_BLOCK_AI_GBP)} of AI usage`,
|
|
8142
|
+
priceText: chunkP2YM67Y5_cjs.checkoutBlockPriceText(price, "ai_usage"),
|
|
8137
8143
|
value: aiBlocks,
|
|
8138
8144
|
onChange: onAiBlocksChange,
|
|
8139
8145
|
testId: "checkout-ai-blocks"
|
|
@@ -8142,8 +8148,8 @@ function CheckoutAddonBlocks({
|
|
|
8142
8148
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8143
8149
|
BlockStepper,
|
|
8144
8150
|
{
|
|
8145
|
-
label: `+${storage?.storage_gb ||
|
|
8146
|
-
priceText:
|
|
8151
|
+
label: `+${storage?.storage_gb || chunkP2YM67Y5_cjs.STORAGE_BLOCK_GB} GB storage`,
|
|
8152
|
+
priceText: chunkP2YM67Y5_cjs.checkoutBlockPriceText(price, "storage"),
|
|
8147
8153
|
value: storageBlocks,
|
|
8148
8154
|
onChange: onStorageBlocksChange,
|
|
8149
8155
|
testId: "checkout-storage-blocks"
|
|
@@ -8198,14 +8204,14 @@ function ReferralRewardSummary2({
|
|
|
8198
8204
|
if (!reward) return null;
|
|
8199
8205
|
const applied = totalCents != null && currency ? applyReferralReward(totalCents, reward, currency) : null;
|
|
8200
8206
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8201
|
-
|
|
8207
|
+
chunkTQUYWUEE_cjs.ReferralRewardSummary,
|
|
8202
8208
|
{
|
|
8203
|
-
amountLabel:
|
|
8209
|
+
amountLabel: chunkP2YM67Y5_cjs.formatMoney(reward.amount, reward.currency),
|
|
8204
8210
|
breakdown: applied && totalCents != null && currency ? {
|
|
8205
|
-
subtotal:
|
|
8206
|
-
reward:
|
|
8207
|
-
youPay:
|
|
8208
|
-
rollover: applied.remaining > 0 ?
|
|
8211
|
+
subtotal: chunkP2YM67Y5_cjs.formatMoney(totalCents, currency),
|
|
8212
|
+
reward: chunkP2YM67Y5_cjs.formatMoney(applied.bonus, currency),
|
|
8213
|
+
youPay: chunkP2YM67Y5_cjs.formatMoney(applied.youPay, currency),
|
|
8214
|
+
rollover: applied.remaining > 0 ? chunkP2YM67Y5_cjs.formatMoney(applied.remaining, currency) : void 0
|
|
8209
8215
|
} : void 0
|
|
8210
8216
|
}
|
|
8211
8217
|
);
|
|
@@ -8213,7 +8219,7 @@ function ReferralRewardSummary2({
|
|
|
8213
8219
|
function ReferralRewardNote2() {
|
|
8214
8220
|
const reward = useReferralReward();
|
|
8215
8221
|
if (!reward) return null;
|
|
8216
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8222
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.ReferralRewardNote, { amountLabel: chunkP2YM67Y5_cjs.formatMoney(reward.amount, reward.currency) });
|
|
8217
8223
|
}
|
|
8218
8224
|
function CheckoutTotal({
|
|
8219
8225
|
state,
|
|
@@ -8242,7 +8248,7 @@ function CheckoutTotal({
|
|
|
8242
8248
|
className: "text-sm font-medium text-foreground",
|
|
8243
8249
|
"data-testid": "checkout-total",
|
|
8244
8250
|
"aria-live": "polite",
|
|
8245
|
-
children: state.quote && !state.isLoading ?
|
|
8251
|
+
children: state.quote && !state.isLoading ? chunkP2YM67Y5_cjs.quoteTotalLine(state.quote) : state.isLoading ? "Calculating total\u2026" : state.error
|
|
8246
8252
|
}
|
|
8247
8253
|
)
|
|
8248
8254
|
] });
|
|
@@ -8275,13 +8281,13 @@ function useCheckoutQuote({
|
|
|
8275
8281
|
...aiBlocks || storageBlocks ? { addons: { ai_usage: aiBlocks, storage: storageBlocks } } : {}
|
|
8276
8282
|
} : null
|
|
8277
8283
|
);
|
|
8278
|
-
const { code, message } = query.isError ?
|
|
8279
|
-
const locationInvalid = code ===
|
|
8284
|
+
const { code, message } = query.isError ? chunkP2YM67Y5_cjs.quoteError(query.error) : {};
|
|
8285
|
+
const locationInvalid = code === chunkP2YM67Y5_cjs.TAX_LOCATION_INVALID;
|
|
8280
8286
|
const isLoading = enabled && (query.isLoading || postal !== postalCode.trim());
|
|
8281
8287
|
return {
|
|
8282
8288
|
quote: query.data,
|
|
8283
8289
|
isLoading,
|
|
8284
|
-
showPostcode:
|
|
8290
|
+
showPostcode: chunkP2YM67Y5_cjs.POSTCODE_COUNTRIES.includes(country) || locationInvalid || postalCode !== "",
|
|
8285
8291
|
error: query.isError ? locationInvalid ? message ?? "Enter your ZIP / postal code to see the total." : message ?? "Couldn't calculate tax. Stripe shows the total next." : null,
|
|
8286
8292
|
canContinue: !isLoading && (!!query.data || query.isError && !locationInvalid)
|
|
8287
8293
|
};
|
|
@@ -8290,7 +8296,7 @@ function SubscriptionPlans({ projectExtId, onDismiss }) {
|
|
|
8290
8296
|
const { data: products, isLoading, error } = react$1.useProducts();
|
|
8291
8297
|
const [isAnnual, setIsAnnual] = react.useState(false);
|
|
8292
8298
|
const [promoCode, setPromoCode] = react.useState("");
|
|
8293
|
-
const [addonBudget, setAddonBudget] = react.useState(String(
|
|
8299
|
+
const [addonBudget, setAddonBudget] = react.useState(String(chunkP2YM67Y5_cjs.DEFAULT_SPEND_CAP_PENCE / 100));
|
|
8294
8300
|
const [checkoutBudget, setCheckoutBudget] = react.useState(null);
|
|
8295
8301
|
const [aiBlocks, setAiBlocks] = react.useState(0);
|
|
8296
8302
|
const [storageBlocks, setStorageBlocks] = react.useState(0);
|
|
@@ -8308,31 +8314,31 @@ function SubscriptionPlans({ projectExtId, onDismiss }) {
|
|
|
8308
8314
|
storageBlocks,
|
|
8309
8315
|
enabled: !!products?.length
|
|
8310
8316
|
});
|
|
8311
|
-
if (isLoading) return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8312
|
-
if (error) return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8313
|
-
if (!products || products.length === 0) return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8314
|
-
const prices =
|
|
8317
|
+
if (isLoading) return /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.PlanNotice, { children: "Loading plans\u2026" });
|
|
8318
|
+
if (error) return /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.PlanNotice, { tone: "error", children: "Plans didn't load. Try again." });
|
|
8319
|
+
if (!products || products.length === 0) return /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.PlanNotice, { children: "No plans available." });
|
|
8320
|
+
const prices = chunkP2YM67Y5_cjs.findProPrices(products);
|
|
8315
8321
|
const intervalPrice = isAnnual ? prices.annual : prices.monthly;
|
|
8316
|
-
const selectedPrice =
|
|
8322
|
+
const selectedPrice = chunkP2YM67Y5_cjs.packPrice(intervalPrice);
|
|
8317
8323
|
if (!intervalPrice) return null;
|
|
8318
8324
|
const interval = isAnnual ? "year" : "month";
|
|
8319
|
-
const savingsPercent =
|
|
8325
|
+
const savingsPercent = chunkP2YM67Y5_cjs.calcSavingsPercent(prices.monthly, prices.annual);
|
|
8320
8326
|
const handleSubscribe = () => {
|
|
8321
8327
|
setCheckoutInterval(interval);
|
|
8322
|
-
const parsed =
|
|
8323
|
-
setCheckoutBudget(parsed == null || parsed ===
|
|
8328
|
+
const parsed = chunkP2YM67Y5_cjs.parseBudgetPounds(addonBudget);
|
|
8329
|
+
setCheckoutBudget(parsed == null || parsed === chunkP2YM67Y5_cjs.DEFAULT_SPEND_CAP_PENCE ? null : parsed);
|
|
8324
8330
|
setCheckoutQuote(quote.quote);
|
|
8325
8331
|
setIsCheckoutModalOpen(true);
|
|
8326
8332
|
};
|
|
8327
8333
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
8328
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
8334
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.PlanStack, { children: [
|
|
8329
8335
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8330
|
-
|
|
8336
|
+
chunkTQUYWUEE_cjs.PlanPickerHeader,
|
|
8331
8337
|
{
|
|
8332
8338
|
title: "Plan",
|
|
8333
8339
|
info: /* @__PURE__ */ jsxRuntime.jsx(PlanInfoPopover2, {}),
|
|
8334
8340
|
toggle: /* @__PURE__ */ jsxRuntime.jsx(
|
|
8335
|
-
|
|
8341
|
+
chunkTQUYWUEE_cjs.PricingToggle,
|
|
8336
8342
|
{
|
|
8337
8343
|
isAnnual,
|
|
8338
8344
|
onToggle: () => setIsAnnual(!isAnnual),
|
|
@@ -8369,7 +8375,7 @@ function SubscriptionPlans({ projectExtId, onDismiss }) {
|
|
|
8369
8375
|
currency: intervalPrice.currency
|
|
8370
8376
|
}
|
|
8371
8377
|
),
|
|
8372
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8378
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.PromoCodeInput, { value: promoCode, onChange: setPromoCode }),
|
|
8373
8379
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8374
8380
|
CheckoutCountrySelect,
|
|
8375
8381
|
{
|
|
@@ -8381,9 +8387,9 @@ function SubscriptionPlans({ projectExtId, onDismiss }) {
|
|
|
8381
8387
|
}
|
|
8382
8388
|
),
|
|
8383
8389
|
/* @__PURE__ */ jsxRuntime.jsx(CheckoutTotal, { state: quote, postalCode, onPostalCodeChange: setPostalCode }),
|
|
8384
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
8390
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.PlanActionRow, { children: [
|
|
8385
8391
|
onDismiss && /* @__PURE__ */ jsxRuntime.jsx(
|
|
8386
|
-
|
|
8392
|
+
chunkTQUYWUEE_cjs.PlanActionButton,
|
|
8387
8393
|
{
|
|
8388
8394
|
tone: "muted",
|
|
8389
8395
|
fill: true,
|
|
@@ -8394,11 +8400,11 @@ function SubscriptionPlans({ projectExtId, onDismiss }) {
|
|
|
8394
8400
|
}
|
|
8395
8401
|
),
|
|
8396
8402
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8397
|
-
|
|
8403
|
+
chunkTQUYWUEE_cjs.PlanActionButton,
|
|
8398
8404
|
{
|
|
8399
8405
|
fill: true,
|
|
8400
8406
|
onClick: handleSubscribe,
|
|
8401
|
-
disabled: !selectedPrice ||
|
|
8407
|
+
disabled: !selectedPrice || chunkP2YM67Y5_cjs.parseBudgetPounds(addonBudget) === void 0 || !quote.canContinue,
|
|
8402
8408
|
size: "sm",
|
|
8403
8409
|
"data-testid": "subscribe-button",
|
|
8404
8410
|
children: "Continue to payment"
|
|
@@ -8438,7 +8444,7 @@ var FALLBACK_MESSAGES = {
|
|
|
8438
8444
|
BILLING_ADDRESS_REQUIRED: "Add a billing address first."
|
|
8439
8445
|
};
|
|
8440
8446
|
function addonErrorMessage(error) {
|
|
8441
|
-
const detail =
|
|
8447
|
+
const detail = chunkP2YM67Y5_cjs.apiErrorDetail(error);
|
|
8442
8448
|
if (detail && typeof detail === "object") {
|
|
8443
8449
|
const { code, message } = detail;
|
|
8444
8450
|
if (message) return message;
|
|
@@ -8460,18 +8466,18 @@ function chargeRefusalMessage(error) {
|
|
|
8460
8466
|
return code ? REFUSALS[code] : null;
|
|
8461
8467
|
}
|
|
8462
8468
|
function addonErrorCode(error) {
|
|
8463
|
-
const detail =
|
|
8469
|
+
const detail = chunkP2YM67Y5_cjs.apiErrorDetail(error);
|
|
8464
8470
|
if (detail && typeof detail === "object") {
|
|
8465
8471
|
const code = detail.code;
|
|
8466
8472
|
if (code && code in FALLBACK_MESSAGES) return code;
|
|
8467
8473
|
}
|
|
8468
8474
|
return null;
|
|
8469
8475
|
}
|
|
8470
|
-
var addedMessage = (kind, blockAiGbp, blockStorageGb) => kind === "ai_usage" ? `${react$1.formatGbp(blockAiGbp ??
|
|
8476
|
+
var addedMessage = (kind, blockAiGbp, blockStorageGb) => kind === "ai_usage" ? `${react$1.formatGbp(blockAiGbp ?? chunkP2YM67Y5_cjs.ADDON_BLOCK_AI_GBP)} of AI usage added` : `${blockStorageGb ?? chunkP2YM67Y5_cjs.STORAGE_BLOCK_GB} GB added`;
|
|
8471
8477
|
function useAddonPurchase() {
|
|
8472
8478
|
const addBlock = react$1.useAddProjectAddonBlock();
|
|
8473
8479
|
const { mutate } = addBlock;
|
|
8474
|
-
const { onAddonBlocksBought } =
|
|
8480
|
+
const { onAddonBlocksBought } = chunkP2YM67Y5_cjs.useBillingSupport();
|
|
8475
8481
|
const buy = react.useCallback(
|
|
8476
8482
|
(kind, projectExtId, options2) => {
|
|
8477
8483
|
mutate(
|
|
@@ -8515,7 +8521,7 @@ function PlanChangeLines({
|
|
|
8515
8521
|
isError,
|
|
8516
8522
|
className
|
|
8517
8523
|
}) {
|
|
8518
|
-
const lines = preview ?
|
|
8524
|
+
const lines = preview ? chunkP2YM67Y5_cjs.planPreviewLines(preview) : [{ id: "pay-today", text: isError ? chunkP2YM67Y5_cjs.PAY_TODAY_UNPRICED : "Checking price\u2026" }];
|
|
8519
8525
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className, "data-testid": "plan-change-lines", children: lines.map((line) => /* @__PURE__ */ jsxRuntime.jsx("p", { "data-testid": `plan-change-${line.id}`, children: line.text }, line.id)) });
|
|
8520
8526
|
}
|
|
8521
8527
|
var BANK_CONFIRM_PLAN_CHANGE = "Confirm with your bank. Nothing is charged until you do.";
|
|
@@ -8523,13 +8529,13 @@ function notifyPlanChange(data, fallback, planName2) {
|
|
|
8523
8529
|
const outcome = data?.plan_change;
|
|
8524
8530
|
switch (outcome?.result) {
|
|
8525
8531
|
case "upgraded": {
|
|
8526
|
-
const plan =
|
|
8527
|
-
const charged = outcome.charged_pence > 0 ? ` \xB7 ${
|
|
8532
|
+
const plan = chunkP2YM67Y5_cjs.planNameForPacks(data?.addons?.packs ?? data?.packs);
|
|
8533
|
+
const charged = outcome.charged_pence > 0 ? ` \xB7 ${chunkP2YM67Y5_cjs.formatMoney(outcome.charged_pence, "gbp")} charged` : "";
|
|
8528
8534
|
shell.notify.success(`Upgraded to ${plan}${charged}`);
|
|
8529
8535
|
break;
|
|
8530
8536
|
}
|
|
8531
8537
|
case "scheduled": {
|
|
8532
|
-
const when2 =
|
|
8538
|
+
const when2 = chunkP2YM67Y5_cjs.formatPeriodEnd(data?.addons?.period_end ?? data?.current_period_end);
|
|
8533
8539
|
shell.notify.success(when2 ? `Scheduled for ${when2}` : fallback);
|
|
8534
8540
|
break;
|
|
8535
8541
|
}
|
|
@@ -8562,23 +8568,23 @@ function ChangeProPlan({
|
|
|
8562
8568
|
const { data: products } = react$1.useProducts();
|
|
8563
8569
|
const changePlan = react$1.useChangeProjectPlan();
|
|
8564
8570
|
const cancel = react$1.useCancelProjectSubscription();
|
|
8565
|
-
const prices =
|
|
8571
|
+
const prices = chunkP2YM67Y5_cjs.findProPrices(products);
|
|
8566
8572
|
const addons = project.addons;
|
|
8567
8573
|
const isCanceling = project.cancel_at_period_end === true || project.subscription === "canceled";
|
|
8568
|
-
const currentPacks = Math.max(addons?.packs ?? project.packs ??
|
|
8569
|
-
const isLegacyMultiPack = currentPacks >
|
|
8574
|
+
const currentPacks = Math.max(addons?.packs ?? project.packs ?? chunkP2YM67Y5_cjs.PRO_PACKS, chunkP2YM67Y5_cjs.PRO_PACKS);
|
|
8575
|
+
const isLegacyMultiPack = currentPacks > chunkP2YM67Y5_cjs.PRO_PACKS;
|
|
8570
8576
|
const currentInterval = project.plan_interval === "year" ? "year" : "month";
|
|
8571
8577
|
const scheduledPacks = isCanceling ? 0 : addons?.packs_next ?? currentPacks;
|
|
8572
8578
|
const scheduledInterval = addons?.pending_interval ?? currentInterval;
|
|
8573
8579
|
const [targetPacks, setTargetPacks] = react.useState(scheduledPacks);
|
|
8574
8580
|
const [chosenInterval, setChosenInterval] = react.useState(scheduledInterval);
|
|
8575
|
-
const targetInterval = targetPacks >
|
|
8581
|
+
const targetInterval = targetPacks > chunkP2YM67Y5_cjs.PRO_PACKS ? currentInterval : chosenInterval;
|
|
8576
8582
|
const periodEnd = formatDate(addons?.period_end ?? project.current_period_end);
|
|
8577
8583
|
const when2 = periodEnd ?? "the end of the period";
|
|
8578
8584
|
const shortWhen = periodEnd ? periodEnd.replace(/ \d{4}$/, "") : "period end";
|
|
8579
8585
|
const isPending = changePlan.isPending || cancel.isPending;
|
|
8580
8586
|
const sameAsScheduled = targetPacks === scheduledPacks && (targetPacks === 0 || targetInterval === scheduledInterval);
|
|
8581
|
-
const packOptions = isLegacyMultiPack ? [currentPacks,
|
|
8587
|
+
const packOptions = isLegacyMultiPack ? [currentPacks, chunkP2YM67Y5_cjs.PRO_PACKS, 0] : [chunkP2YM67Y5_cjs.PRO_PACKS, 0];
|
|
8582
8588
|
const intervalPrice = targetInterval === "year" ? prices.annual : prices.monthly;
|
|
8583
8589
|
const currency = intervalPrice?.currency ?? project.currency ?? "gbp";
|
|
8584
8590
|
const preview = react$1.usePreviewProjectPlanChange(
|
|
@@ -8586,7 +8592,7 @@ function ChangeProPlan({
|
|
|
8586
8592
|
sameAsScheduled || targetPacks === 0 ? null : { packs: targetPacks, interval: targetInterval }
|
|
8587
8593
|
);
|
|
8588
8594
|
const noChange = sameAsScheduled || preview.data?.unchanged === true;
|
|
8589
|
-
const nameFor = (packs) => packs === currentPacks && packs > 0 ?
|
|
8595
|
+
const nameFor = (packs) => packs === currentPacks && packs > 0 ? chunkP2YM67Y5_cjs.proTierName(project) : chunkP2YM67Y5_cjs.planNameForPacks(packs);
|
|
8590
8596
|
const effects = [];
|
|
8591
8597
|
const target = nameFor(targetPacks);
|
|
8592
8598
|
if (targetPacks === 0) {
|
|
@@ -8596,7 +8602,7 @@ function ChangeProPlan({
|
|
|
8596
8602
|
if (targetPacks < currentPacks) {
|
|
8597
8603
|
effects.push(`Changes to one Pro licence on ${when2}. No refund.`);
|
|
8598
8604
|
} else if (!isCanceling && addons?.packs_next != null) {
|
|
8599
|
-
effects.push(`Cancels the change to ${
|
|
8605
|
+
effects.push(`Cancels the change to ${chunkP2YM67Y5_cjs.planNameForPacks(addons.packs_next)}.`);
|
|
8600
8606
|
}
|
|
8601
8607
|
if (targetInterval !== currentInterval) {
|
|
8602
8608
|
effects.push(`${targetInterval === "year" ? "Annual" : "Monthly"} billing from ${when2}.`);
|
|
@@ -8635,33 +8641,33 @@ function ChangeProPlan({
|
|
|
8635
8641
|
if (packs === 0) {
|
|
8636
8642
|
return {
|
|
8637
8643
|
total: "\xA30",
|
|
8638
|
-
summary: `${react$1.formatGbp(
|
|
8644
|
+
summary: `${react$1.formatGbp(chunkP2YM67Y5_cjs.FREE_AI_GBP)} of AI usage \xB7 ${chunkP2YM67Y5_cjs.FREE_STORAGE_MB} MB \xB7 just you`
|
|
8639
8645
|
};
|
|
8640
8646
|
}
|
|
8641
|
-
const allowance = `${react$1.formatGbp(
|
|
8642
|
-
const legacy = packs >
|
|
8643
|
-
const exVat = legacy ? project.amount_ex_vat :
|
|
8647
|
+
const allowance = `${react$1.formatGbp(chunkP2YM67Y5_cjs.PRO_AI_GBP * packs)} of AI usage \xB7 ${chunkP2YM67Y5_cjs.PRO_STORAGE_GB * packs} GB`;
|
|
8648
|
+
const legacy = packs > chunkP2YM67Y5_cjs.PRO_PACKS;
|
|
8649
|
+
const exVat = legacy ? project.amount_ex_vat : chunkP2YM67Y5_cjs.packPrice(intervalPrice)?.amount_ex_vat;
|
|
8644
8650
|
return {
|
|
8645
|
-
total: exVat != null ?
|
|
8651
|
+
total: exVat != null ? chunkP2YM67Y5_cjs.plusVat(exVat, currency) : void 0,
|
|
8646
8652
|
summary: allowance
|
|
8647
8653
|
};
|
|
8648
8654
|
};
|
|
8649
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8655
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.PlanStack, { gap: 4, testId: "change-pro-plan", children: [
|
|
8650
8656
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [
|
|
8651
8657
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium text-foreground", children: "Billing" }),
|
|
8652
|
-
targetPacks >
|
|
8653
|
-
|
|
8658
|
+
targetPacks > chunkP2YM67Y5_cjs.PRO_PACKS ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", "data-testid": "change-plan-interval-fixed", children: currentInterval === "year" ? "Annual" : "Monthly" }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
8659
|
+
chunkTQUYWUEE_cjs.PricingToggle,
|
|
8654
8660
|
{
|
|
8655
8661
|
isAnnual: targetInterval === "year",
|
|
8656
8662
|
onToggle: () => setChosenInterval(targetInterval === "year" ? "month" : "year"),
|
|
8657
|
-
savingsPercent:
|
|
8663
|
+
savingsPercent: chunkP2YM67Y5_cjs.calcSavingsPercent(prices.monthly, prices.annual)
|
|
8658
8664
|
}
|
|
8659
8665
|
)
|
|
8660
8666
|
] }),
|
|
8661
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8667
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.PlanStack, { gap: 2, children: packOptions.map((packs) => {
|
|
8662
8668
|
const { total, summary } = optionFor(packs);
|
|
8663
8669
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8664
|
-
|
|
8670
|
+
chunkTQUYWUEE_cjs.PlanTierOption,
|
|
8665
8671
|
{
|
|
8666
8672
|
onSelect: setTargetPacks,
|
|
8667
8673
|
option: {
|
|
@@ -8678,13 +8684,13 @@ function ChangeProPlan({
|
|
|
8678
8684
|
);
|
|
8679
8685
|
}) }),
|
|
8680
8686
|
isLegacyMultiPack && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-1", children: [
|
|
8681
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
8682
|
-
|
|
8687
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.PlanNotice, { className: "text-xs", testId: "change-plan-legacy-note", children: [
|
|
8688
|
+
chunkP2YM67Y5_cjs.proTierName(project),
|
|
8683
8689
|
" is no longer sold"
|
|
8684
8690
|
] }),
|
|
8685
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
8691
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.MoreInfo, { title: "Legacy plan", testId: "change-plan-legacy-more-info", children: [
|
|
8686
8692
|
/* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
|
|
8687
|
-
|
|
8693
|
+
chunkP2YM67Y5_cjs.proTierName(project),
|
|
8688
8694
|
" keeps renewing at its own price, with its allowance and add-ons, until you change it."
|
|
8689
8695
|
] }),
|
|
8690
8696
|
/* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
|
|
@@ -8705,7 +8711,7 @@ function ChangeProPlan({
|
|
|
8705
8711
|
),
|
|
8706
8712
|
targetPacks > 0 && /* @__PURE__ */ jsxRuntime.jsx(ReferralRewardNote2, {}),
|
|
8707
8713
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8708
|
-
|
|
8714
|
+
chunkTQUYWUEE_cjs.PlanActionButton,
|
|
8709
8715
|
{
|
|
8710
8716
|
onClick: apply,
|
|
8711
8717
|
disabled: noChange || isPending,
|
|
@@ -8716,9 +8722,9 @@ function ChangeProPlan({
|
|
|
8716
8722
|
] });
|
|
8717
8723
|
}
|
|
8718
8724
|
function ChangePlanDialog({ project, open, onOpenChange }) {
|
|
8719
|
-
const isPro = !!project &&
|
|
8725
|
+
const isPro = !!project && chunkP2YM67Y5_cjs.isProProject(project);
|
|
8720
8726
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8721
|
-
|
|
8727
|
+
chunkTQUYWUEE_cjs.PlanDialogFrame,
|
|
8722
8728
|
{
|
|
8723
8729
|
open,
|
|
8724
8730
|
onOpenChange,
|
|
@@ -8738,14 +8744,14 @@ function ChangePlanDialog({ project, open, onOpenChange }) {
|
|
|
8738
8744
|
}
|
|
8739
8745
|
function ProjectsTable() {
|
|
8740
8746
|
const { data: projects, isLoading } = react$1.useProjects();
|
|
8741
|
-
const currentUserExtId =
|
|
8747
|
+
const currentUserExtId = chunkP2YM67Y5_cjs.useSelfExtId();
|
|
8742
8748
|
const { openProject } = chunkCNHUJRQ4_cjs.useBlocksEnvironment();
|
|
8743
8749
|
const updateProject = react$1.useUpdateProjectFields();
|
|
8744
8750
|
const [renameTarget, setRenameTarget] = react.useState(null);
|
|
8745
8751
|
const [renameValue, setRenameValue] = react.useState("");
|
|
8746
8752
|
const [invoicesTarget, setInvoicesTarget] = react.useState(null);
|
|
8747
8753
|
const [upgradeTarget, setUpgradeTarget] = react.useState(null);
|
|
8748
|
-
const { stripeEnabled } =
|
|
8754
|
+
const { stripeEnabled } = chunkP2YM67Y5_cjs.useBillingSupport();
|
|
8749
8755
|
const ownedProjects = react.useMemo(
|
|
8750
8756
|
() => (projects ?? []).filter((p) => p.created_by === currentUserExtId),
|
|
8751
8757
|
[projects, currentUserExtId]
|
|
@@ -8784,13 +8790,13 @@ function ProjectsTable() {
|
|
|
8784
8790
|
const hasPaid = p.subscription === "active" || p.subscription === "past_due";
|
|
8785
8791
|
const canUpgrade = stripeEnabled && !hasPaid && p.subscription !== "canceled" && p.subscription !== "dev";
|
|
8786
8792
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8787
|
-
|
|
8793
|
+
chunkTQUYWUEE_cjs.ProjectRow,
|
|
8788
8794
|
{
|
|
8789
8795
|
testId: `project-row-${p.external_id}`,
|
|
8790
8796
|
onOpen: () => openProject(p.external_id),
|
|
8791
8797
|
identity: /* @__PURE__ */ jsxRuntime.jsx(BillingProjectEntity, { name: p.name, relation: "mine", subscription: p.subscription, size: "sm" }),
|
|
8792
|
-
summary: stripeEnabled ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex items-center whitespace-nowrap", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
8793
|
-
usage: p.quotas ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
8798
|
+
summary: stripeEnabled ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex items-center whitespace-nowrap", children: /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.PlanBadge, { ...chunkP2YM67Y5_cjs.planBadgeView(p) }) }) : void 0,
|
|
8799
|
+
usage: p.quotas ? /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.QuotaMeter, { items: chunkP2YM67Y5_cjs.getQuotaItems(p.quotas), size: "lg" }) : void 0,
|
|
8794
8800
|
actions: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
8795
8801
|
canUpgrade && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8796
8802
|
ui.Button,
|
|
@@ -8824,9 +8830,9 @@ function ProjectsTable() {
|
|
|
8824
8830
|
);
|
|
8825
8831
|
};
|
|
8826
8832
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
8827
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8833
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.ProjectList, { isLoading, isEmpty: ownedProjects.length === 0, isFilteredOut: false, children: ownedProjects.map(renderRow) }),
|
|
8828
8834
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8829
|
-
|
|
8835
|
+
chunkTQUYWUEE_cjs.RenameDialog,
|
|
8830
8836
|
{
|
|
8831
8837
|
open: !!renameTarget,
|
|
8832
8838
|
onClose: () => setRenameTarget(null),
|
|
@@ -8857,7 +8863,7 @@ function ProjectsTable() {
|
|
|
8857
8863
|
}
|
|
8858
8864
|
function SharedProjects() {
|
|
8859
8865
|
const { data: projects } = react$1.useProjects();
|
|
8860
|
-
const currentUserExtId =
|
|
8866
|
+
const currentUserExtId = chunkP2YM67Y5_cjs.useSelfExtId();
|
|
8861
8867
|
const { data: usageToday } = react$1.useUserUsageToday();
|
|
8862
8868
|
const shared = react.useMemo(
|
|
8863
8869
|
() => (projects ?? []).filter((p) => p.created_by !== currentUserExtId),
|
|
@@ -8865,10 +8871,10 @@ function SharedProjects() {
|
|
|
8865
8871
|
);
|
|
8866
8872
|
if (shared.length === 0) return null;
|
|
8867
8873
|
const usedToday = usageToday?.used_gbp ?? 0;
|
|
8868
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8874
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.SharedProjectsSection, { footnote: "Your daily AI usage allowance in projects other people run \u2014 their plan and billing are theirs.", children: shared.map((p) => {
|
|
8869
8875
|
const cap = p.daily_cap_per_user;
|
|
8870
8876
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8871
|
-
|
|
8877
|
+
chunkTQUYWUEE_cjs.SharedProjectRow,
|
|
8872
8878
|
{
|
|
8873
8879
|
testId: `shared-project-${p.external_id}`,
|
|
8874
8880
|
identity: /* @__PURE__ */ jsxRuntime.jsx(BillingProjectEntity, { name: p.name, relation: "other", size: "sm" }),
|
|
@@ -8912,7 +8918,7 @@ function DailyCapEditor({ project }) {
|
|
|
8912
8918
|
);
|
|
8913
8919
|
};
|
|
8914
8920
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8915
|
-
|
|
8921
|
+
chunkTQUYWUEE_cjs.DailyCapField,
|
|
8916
8922
|
{
|
|
8917
8923
|
value,
|
|
8918
8924
|
onChange: setValue,
|
|
@@ -8925,11 +8931,11 @@ function DailyCapEditor({ project }) {
|
|
|
8925
8931
|
function SubscriptionStatus({ project }) {
|
|
8926
8932
|
const { quotas, cancel_at_period_end, subscription, current_period_end, addons } = project;
|
|
8927
8933
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8928
|
-
|
|
8934
|
+
chunkTQUYWUEE_cjs.SubscriptionStatusView,
|
|
8929
8935
|
{
|
|
8930
|
-
resetDate:
|
|
8936
|
+
resetDate: chunkP2YM67Y5_cjs.formatResetDate(addons?.ai_usage_reset_at ?? current_period_end),
|
|
8931
8937
|
isCanceling: subscription === "canceled" || cancel_at_period_end === true,
|
|
8932
|
-
meters:
|
|
8938
|
+
meters: chunkP2YM67Y5_cjs.getQuotaItems(quotas).map((q) => ({
|
|
8933
8939
|
key: q.key,
|
|
8934
8940
|
icon: q.icon,
|
|
8935
8941
|
label: q.label,
|
|
@@ -8993,7 +8999,7 @@ function PendingChange({
|
|
|
8993
8999
|
}
|
|
8994
9000
|
);
|
|
8995
9001
|
}
|
|
8996
|
-
var titleFor = (kind, blockAiGbp, blockStorageGb) => kind === "ai_usage" ? `Add ${react$1.formatGbp(blockAiGbp ??
|
|
9002
|
+
var titleFor = (kind, blockAiGbp, blockStorageGb) => kind === "ai_usage" ? `Add ${react$1.formatGbp(blockAiGbp ?? chunkP2YM67Y5_cjs.ADDON_BLOCK_AI_GBP)} of AI usage` : `Add ${blockStorageGb ?? chunkP2YM67Y5_cjs.STORAGE_BLOCK_GB} GB storage`;
|
|
8997
9003
|
var blocksOf = (kind, project) => (kind === "ai_usage" ? project.addons?.ai_blocks : project.addons?.storage_blocks) ?? 0;
|
|
8998
9004
|
function Row({ label, children }) {
|
|
8999
9005
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-baseline justify-between gap-4", children: [
|
|
@@ -9014,11 +9020,11 @@ function AddAddonDialog({
|
|
|
9014
9020
|
const addons = project.addons;
|
|
9015
9021
|
if (!addons) return null;
|
|
9016
9022
|
const isAnnual = project.plan_interval === "year";
|
|
9017
|
-
const price =
|
|
9018
|
-
const nextCharge =
|
|
9019
|
-
const now = quote.data ?
|
|
9020
|
-
const renewal = quote.data ?
|
|
9021
|
-
const today = now ? { total:
|
|
9023
|
+
const price = chunkP2YM67Y5_cjs.addonCharge(kind, addons, isAnnual, addons.period_end ?? project.current_period_end);
|
|
9024
|
+
const nextCharge = chunkP2YM67Y5_cjs.formatPeriodEnd(addons.period_end ?? project.current_period_end);
|
|
9025
|
+
const now = quote.data ? chunkP2YM67Y5_cjs.quoteParts(quote.data.now) : null;
|
|
9026
|
+
const renewal = quote.data ? chunkP2YM67Y5_cjs.quoteParts(quote.data.renewal) : null;
|
|
9027
|
+
const today = now ? { total: chunkP2YM67Y5_cjs.money2(now.total), detail: chunkP2YM67Y5_cjs.taxDetail(now) } : { total: price.now, detail: `incl. VAT (${price.nowExVat} + ${price.nowVat} VAT)` };
|
|
9022
9028
|
const pricing = quote.isLoading;
|
|
9023
9029
|
const confirm = () => {
|
|
9024
9030
|
const before = blocksOf(kind, project);
|
|
@@ -9057,8 +9063,8 @@ function AddAddonDialog({
|
|
|
9057
9063
|
isAnnual ? "yearly" : "monthly",
|
|
9058
9064
|
" \xB7 no refund"
|
|
9059
9065
|
] }),
|
|
9060
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9061
|
-
|
|
9066
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.MoreInfo, { title: "Adding a top-up", testId: "add-addon-more-info", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
9067
|
+
chunkTQUYWUEE_cjs.MoreInfoList,
|
|
9062
9068
|
{
|
|
9063
9069
|
items: [
|
|
9064
9070
|
{
|
|
@@ -9073,7 +9079,7 @@ function AddAddonDialog({
|
|
|
9073
9079
|
term: "Usage cap",
|
|
9074
9080
|
text: "Adding by hand is never blocked by the usage cap; the cap limits automatic top-ups only."
|
|
9075
9081
|
},
|
|
9076
|
-
...isAnnual && kind === "ai_usage" ? [{ term: "Annual", text: `${
|
|
9082
|
+
...isAnnual && kind === "ai_usage" ? [{ term: "Annual", text: `${chunkP2YM67Y5_cjs.ANNUAL_PREMIUM_AI_NOTE}.` }] : []
|
|
9077
9083
|
]
|
|
9078
9084
|
}
|
|
9079
9085
|
) })
|
|
@@ -9096,7 +9102,7 @@ function AddAddonDialog({
|
|
|
9096
9102
|
)
|
|
9097
9103
|
] }) }),
|
|
9098
9104
|
!pricing && /* @__PURE__ */ jsxRuntime.jsxs(Row, { label: "Next charge", children: [
|
|
9099
|
-
renewal ?
|
|
9105
|
+
renewal ? chunkP2YM67Y5_cjs.totalWithTaxWord(renewal) : price.then.replace(/\/(month|year)/, ""),
|
|
9100
9106
|
nextCharge ? ` on ${nextCharge}` : " at renewal"
|
|
9101
9107
|
] })
|
|
9102
9108
|
] }) }),
|
|
@@ -9127,11 +9133,11 @@ function ReduceAddonDialog({
|
|
|
9127
9133
|
const update = react$1.useUpdateProjectNextPeriodAddons();
|
|
9128
9134
|
const addons = project.addons;
|
|
9129
9135
|
if (!addons) return null;
|
|
9130
|
-
const { min, next } =
|
|
9136
|
+
const { min, next } = chunkP2YM67Y5_cjs.reduceBounds(kind, addons);
|
|
9131
9137
|
const keep = Math.max(min, next - 1);
|
|
9132
|
-
const size =
|
|
9133
|
-
const what =
|
|
9134
|
-
const from =
|
|
9138
|
+
const size = chunkP2YM67Y5_cjs.nextRemovedBlockSize(kind, addons);
|
|
9139
|
+
const what = chunkP2YM67Y5_cjs.stepLabel(kind, size);
|
|
9140
|
+
const from = chunkP2YM67Y5_cjs.formatPeriodEnd(addons.period_end ?? project.current_period_end) ?? "your next renewal";
|
|
9135
9141
|
const fromShort = from.replace(/ \d{4}$/, "");
|
|
9136
9142
|
const allowanceNext = kind === "ai_usage" ? addons.ai_allowance_next_gbp - size : addons.storage_allowance_next_gb - size;
|
|
9137
9143
|
const allowanceNow = kind === "ai_usage" ? addons.ai_allowance_gbp : addons.storage_allowance_gb;
|
|
@@ -9139,7 +9145,7 @@ function ReduceAddonDialog({
|
|
|
9139
9145
|
const save = () => update.mutate(
|
|
9140
9146
|
{
|
|
9141
9147
|
projectExtId: project.external_id,
|
|
9142
|
-
body:
|
|
9148
|
+
body: chunkP2YM67Y5_cjs.nextPeriodBody(kind, keep)
|
|
9143
9149
|
},
|
|
9144
9150
|
{
|
|
9145
9151
|
onSuccess: () => {
|
|
@@ -9167,7 +9173,7 @@ function ReduceAddonDialog({
|
|
|
9167
9173
|
fromShort,
|
|
9168
9174
|
" \xB7 no refund"
|
|
9169
9175
|
] }),
|
|
9170
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
9176
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.MoreInfo, { title: "Reducing a top-up", testId: "reduce-addon-more-info", children: [
|
|
9171
9177
|
/* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
|
|
9172
9178
|
"The reduction applies from your next renewal (",
|
|
9173
9179
|
from,
|
|
@@ -9206,7 +9212,7 @@ function ReduceAddonDialog({
|
|
|
9206
9212
|
}
|
|
9207
9213
|
) });
|
|
9208
9214
|
}
|
|
9209
|
-
var gbp = (pence) =>
|
|
9215
|
+
var gbp = (pence) => chunkP2YM67Y5_cjs.formatMoney(pence, "gbp");
|
|
9210
9216
|
var gb2 = (n) => `${Math.round(n * 10) / 10} GB`;
|
|
9211
9217
|
var pct = (used, limit) => limit > 0 ? Math.min(100, used / limit * 100) : 0;
|
|
9212
9218
|
function formatShortDate(unix) {
|
|
@@ -9218,20 +9224,20 @@ function AutoTopupThreshold({
|
|
|
9218
9224
|
addons
|
|
9219
9225
|
}) {
|
|
9220
9226
|
const updateSettings = react$1.useUpdateProjectAddonSettings();
|
|
9221
|
-
const min = addons.min_auto_topup_threshold_gbp ||
|
|
9227
|
+
const min = addons.min_auto_topup_threshold_gbp || chunkP2YM67Y5_cjs.MIN_AUTO_TOPUP_THRESHOLD_GBP;
|
|
9222
9228
|
const saved = addons.auto_topup_threshold_gbp;
|
|
9223
9229
|
const [value, setValue] = react.useState(String(saved));
|
|
9224
9230
|
react.useEffect(() => setValue(String(saved)), [saved]);
|
|
9225
9231
|
const parsed = Number(value);
|
|
9226
9232
|
const valid = Number.isFinite(parsed) && parsed >= min;
|
|
9227
9233
|
const dirty = valid && parsed !== saved;
|
|
9228
|
-
const off =
|
|
9234
|
+
const off = chunkP2YM67Y5_cjs.isAddonBudgetZero(addons);
|
|
9229
9235
|
const save = () => {
|
|
9230
9236
|
if (!dirty) return;
|
|
9231
9237
|
updateSettings.mutate(
|
|
9232
9238
|
{
|
|
9233
9239
|
projectExtId: project.external_id,
|
|
9234
|
-
body:
|
|
9240
|
+
body: chunkP2YM67Y5_cjs.addonSettingsBody(addons, { auto_topup_threshold_gbp: parsed })
|
|
9235
9241
|
},
|
|
9236
9242
|
{
|
|
9237
9243
|
onSuccess: () => shell.notify.success(`Auto-add below ${react$1.formatGbp(parsed)} of AI usage left`),
|
|
@@ -9328,10 +9334,10 @@ function ResourceMeter({
|
|
|
9328
9334
|
const update = react$1.useUpdateProjectNextPeriodAddons();
|
|
9329
9335
|
const isAi = kind === "ai_usage";
|
|
9330
9336
|
const slug = isAi ? "ai-usage" : "storage";
|
|
9331
|
-
const periodEnd =
|
|
9337
|
+
const periodEnd = chunkP2YM67Y5_cjs.formatPeriodEnd(addons.period_end ?? project.current_period_end);
|
|
9332
9338
|
const from = periodEnd ?? "your next renewal";
|
|
9333
9339
|
const fromShort = formatShortDate(addons.period_end ?? project.current_period_end) ?? "renewal";
|
|
9334
|
-
const { min, current, next } =
|
|
9340
|
+
const { min, current, next } = chunkP2YM67Y5_cjs.reduceBounds(kind, addons);
|
|
9335
9341
|
const fmt = (n) => isAi ? react$1.formatGbp(n) : gb2(n);
|
|
9336
9342
|
const used = isAi ? addons.ai_used_gbp : addons.storage_used_gb;
|
|
9337
9343
|
const allowance = isAi ? addons.ai_allowance_gbp : addons.storage_allowance_gb;
|
|
@@ -9339,15 +9345,15 @@ function ResourceMeter({
|
|
|
9339
9345
|
const plan = isAi ? addons.plan_ai_gbp : addons.plan_storage_gb;
|
|
9340
9346
|
const topUps = Math.max(0, allowance - plan);
|
|
9341
9347
|
const blocks = isAi ? addons.ai_blocks : addons.storage_blocks;
|
|
9342
|
-
const hasLegacy =
|
|
9343
|
-
const room =
|
|
9344
|
-
const capZero =
|
|
9345
|
-
const resets = isAi ? formatShortDate(
|
|
9346
|
-
const removeSize =
|
|
9348
|
+
const hasLegacy = chunkP2YM67Y5_cjs.splitBlocks(kind, blocks, addons).legacy > 0;
|
|
9349
|
+
const room = chunkP2YM67Y5_cjs.autoRoom(kind, addons);
|
|
9350
|
+
const capZero = chunkP2YM67Y5_cjs.isAddonBudgetZero(addons);
|
|
9351
|
+
const resets = isAi ? formatShortDate(chunkP2YM67Y5_cjs.aiUsageResetTimestamp(project)) : null;
|
|
9352
|
+
const removeSize = chunkP2YM67Y5_cjs.nextRemovedBlockSize(kind, addons);
|
|
9347
9353
|
const undo = () => update.mutate(
|
|
9348
9354
|
{
|
|
9349
9355
|
projectExtId: project.external_id,
|
|
9350
|
-
body:
|
|
9356
|
+
body: chunkP2YM67Y5_cjs.nextPeriodBody(kind, current)
|
|
9351
9357
|
},
|
|
9352
9358
|
{
|
|
9353
9359
|
onSuccess: () => shell.notify.success("Kept"),
|
|
@@ -9364,7 +9370,7 @@ function ResourceMeter({
|
|
|
9364
9370
|
allowance: { used, plan, topUps, autoRoom: capZero ? 0 : room },
|
|
9365
9371
|
legend: {
|
|
9366
9372
|
plan: `Plan ${fmt(plan)}`,
|
|
9367
|
-
topUps: topUps > 0 ? `Top-ups ${fmt(topUps)}${hasLegacy ? ` (${
|
|
9373
|
+
topUps: topUps > 0 ? `Top-ups ${fmt(topUps)}${hasLegacy ? ` (${chunkP2YM67Y5_cjs.blocksLabel(kind, blocks, addons)})` : ""}` : void 0,
|
|
9368
9374
|
autoRoom: room != null && room > 0 && !capZero ? `Automatic up to ${fmt(room)}` : void 0
|
|
9369
9375
|
},
|
|
9370
9376
|
testId: `usage-meter-${slug}`,
|
|
@@ -9393,9 +9399,9 @@ function ResourceMeter({
|
|
|
9393
9399
|
{
|
|
9394
9400
|
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "size-3.5" }),
|
|
9395
9401
|
label: isAi ? react$1.formatGbp(addons.block_ai_gbp) : `${addons.block_storage_gb} GB`,
|
|
9396
|
-
caption:
|
|
9402
|
+
caption: chunkP2YM67Y5_cjs.addStepCaption(kind, addons),
|
|
9397
9403
|
onClick: onAdd,
|
|
9398
|
-
ariaLabel: `Add ${
|
|
9404
|
+
ariaLabel: `Add ${chunkP2YM67Y5_cjs.stepLabel(kind, isAi ? addons.block_ai_gbp : addons.block_storage_gb)}`,
|
|
9399
9405
|
testId: isAi ? "add-ai-block-button" : "add-storage-block-button"
|
|
9400
9406
|
}
|
|
9401
9407
|
),
|
|
@@ -9406,7 +9412,7 @@ function ResourceMeter({
|
|
|
9406
9412
|
label: isAi ? react$1.formatGbp(removeSize) : `${removeSize} GB`,
|
|
9407
9413
|
caption: `from ${fromShort}`,
|
|
9408
9414
|
onClick: onReduce,
|
|
9409
|
-
ariaLabel: `Remove ${
|
|
9415
|
+
ariaLabel: `Remove ${chunkP2YM67Y5_cjs.stepLabel(kind, removeSize)} from ${from}`,
|
|
9410
9416
|
testId: `reduce-${slug}-button`
|
|
9411
9417
|
}
|
|
9412
9418
|
)
|
|
@@ -9445,10 +9451,10 @@ function UsageCapEditor({ project, addons }) {
|
|
|
9445
9451
|
updateSettings.mutate(
|
|
9446
9452
|
{
|
|
9447
9453
|
projectExtId: project.external_id,
|
|
9448
|
-
body:
|
|
9454
|
+
body: chunkP2YM67Y5_cjs.addonSettingsBody(addons, { spend_cap_pence: nextCap })
|
|
9449
9455
|
},
|
|
9450
9456
|
{
|
|
9451
|
-
onSuccess: () => shell.notify.success(
|
|
9457
|
+
onSuccess: () => shell.notify.success(chunkP2YM67Y5_cjs.budgetSavedMessage(nextCap)),
|
|
9452
9458
|
onError: (error) => shell.notify.error(addonErrorMessage(error))
|
|
9453
9459
|
}
|
|
9454
9460
|
);
|
|
@@ -9459,14 +9465,14 @@ function UsageCapEditor({ project, addons }) {
|
|
|
9459
9465
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9460
9466
|
chunkQZTNTP75_cjs.UsageMeter,
|
|
9461
9467
|
{
|
|
9462
|
-
label:
|
|
9468
|
+
label: chunkP2YM67Y5_cjs.USAGE_CAP_LABEL,
|
|
9463
9469
|
hint: spendResets && savedCap !== 0 ? `resets ${spendResets}` : void 0,
|
|
9464
9470
|
value: readout,
|
|
9465
9471
|
pct: savedCap != null && savedCap > 0 ? pct(spent, savedCap) : 0,
|
|
9466
9472
|
testId: "addon-spend"
|
|
9467
9473
|
}
|
|
9468
9474
|
),
|
|
9469
|
-
addons.cap_reached && savedCap != null && savedCap > 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", "data-testid": "addon-cap-reached", children:
|
|
9475
|
+
addons.cap_reached && savedCap != null && savedCap > 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", "data-testid": "addon-cap-reached", children: chunkP2YM67Y5_cjs.CAP_REACHED_MESSAGE }),
|
|
9470
9476
|
addons.manual_spent_pence > 0 && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-muted-foreground", "data-testid": "addon-manual-spend", children: [
|
|
9471
9477
|
"Added by hand this month: ",
|
|
9472
9478
|
gbp(addons.manual_spent_pence),
|
|
@@ -9487,7 +9493,7 @@ function UsageCapEditor({ project, addons }) {
|
|
|
9487
9493
|
step: 25,
|
|
9488
9494
|
className: "h-9 w-28",
|
|
9489
9495
|
value: noCap ? "" : value,
|
|
9490
|
-
placeholder: noCap ? "No limit" : String(
|
|
9496
|
+
placeholder: noCap ? "No limit" : String(chunkP2YM67Y5_cjs.DEFAULT_SPEND_CAP_PENCE / 100),
|
|
9491
9497
|
disabled: noCap,
|
|
9492
9498
|
onChange: (e) => setValue(e.target.value),
|
|
9493
9499
|
onKeyDown: (e) => e.key === "Enter" && save(),
|
|
@@ -9513,7 +9519,7 @@ function UsageCapEditor({ project, addons }) {
|
|
|
9513
9519
|
checked: noCap,
|
|
9514
9520
|
onCheckedChange: (checked) => {
|
|
9515
9521
|
setNoCap(checked);
|
|
9516
|
-
if (!checked && value === "") setValue(String(
|
|
9522
|
+
if (!checked && value === "") setValue(String(chunkP2YM67Y5_cjs.DEFAULT_SPEND_CAP_PENCE / 100));
|
|
9517
9523
|
},
|
|
9518
9524
|
"data-testid": "no-cap-switch"
|
|
9519
9525
|
}
|
|
@@ -9526,8 +9532,8 @@ function UsageCapEditor({ project, addons }) {
|
|
|
9526
9532
|
function UsageInfo({ addons, isAnnual }) {
|
|
9527
9533
|
const period = isAnnual ? "year" : "month";
|
|
9528
9534
|
const legacy = (addons.legacy_ai_blocks ?? 0) > 0 || (addons.legacy_storage_blocks ?? 0) > 0;
|
|
9529
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
9530
|
-
|
|
9535
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.MoreInfo, { title: "Usage and top-ups", testId: "usage-more-info", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
9536
|
+
chunkTQUYWUEE_cjs.MoreInfoList,
|
|
9531
9537
|
{
|
|
9532
9538
|
items: [
|
|
9533
9539
|
{
|
|
@@ -9542,7 +9548,7 @@ function UsageInfo({ addons, isAnnual }) {
|
|
|
9542
9548
|
term: "Automatic top-ups",
|
|
9543
9549
|
text: "One step is added when AI usage drops below your auto top-up level, or when an upload needs more storage."
|
|
9544
9550
|
},
|
|
9545
|
-
{ term: "Usage cap", text:
|
|
9551
|
+
{ term: "Usage cap", text: chunkP2YM67Y5_cjs.USAGE_CAP_HELP },
|
|
9546
9552
|
{
|
|
9547
9553
|
term: "Reducing",
|
|
9548
9554
|
text: "\u2212 removes one step from your next renewal. You keep this period's allowance. No refunds."
|
|
@@ -9553,7 +9559,7 @@ function UsageInfo({ addons, isAnnual }) {
|
|
|
9553
9559
|
text: "Top-ups bought on an earlier price keep their size and price until removed; they are removed last."
|
|
9554
9560
|
}
|
|
9555
9561
|
] : [],
|
|
9556
|
-
...isAnnual ? [{ term: "Annual", text: `${
|
|
9562
|
+
...isAnnual ? [{ term: "Annual", text: `${chunkP2YM67Y5_cjs.ANNUAL_PREMIUM_AI_NOTE}.` }] : [],
|
|
9557
9563
|
{
|
|
9558
9564
|
term: "Prices",
|
|
9559
9565
|
text: "Shown ex VAT. The confirm step shows the total with VAT before you pay."
|
|
@@ -9645,7 +9651,7 @@ function formatShortDate2(unix) {
|
|
|
9645
9651
|
if (!unix) return null;
|
|
9646
9652
|
return new Date(unix * 1e3).toLocaleDateString("en-GB", { day: "numeric", month: "short" });
|
|
9647
9653
|
}
|
|
9648
|
-
var gbp2 = (pence) =>
|
|
9654
|
+
var gbp2 = (pence) => chunkP2YM67Y5_cjs.formatMoney(pence, "gbp");
|
|
9649
9655
|
var gbNum = (n) => `${Math.round(n * 10) / 10}`;
|
|
9650
9656
|
var pct2 = (used, limit) => limit > 0 ? Math.min(100, used / limit * 100) : 0;
|
|
9651
9657
|
function Meter({
|
|
@@ -9663,15 +9669,15 @@ function Meter({
|
|
|
9663
9669
|
] });
|
|
9664
9670
|
}
|
|
9665
9671
|
function usePlanPrice(project) {
|
|
9666
|
-
const { data: products } = react$1.useProducts({ enabled:
|
|
9667
|
-
if (!
|
|
9672
|
+
const { data: products } = react$1.useProducts({ enabled: chunkP2YM67Y5_cjs.isProProject(project) });
|
|
9673
|
+
if (!chunkP2YM67Y5_cjs.isProProject(project)) return null;
|
|
9668
9674
|
const isAnnual = project.plan_interval === "year";
|
|
9669
9675
|
if (project.amount != null) {
|
|
9670
9676
|
return { incl: project.amount, ex: project.amount_ex_vat ?? null, isAnnual };
|
|
9671
9677
|
}
|
|
9672
|
-
if ((project.packs ??
|
|
9673
|
-
const prices =
|
|
9674
|
-
const pp =
|
|
9678
|
+
if ((project.packs ?? chunkP2YM67Y5_cjs.PRO_PACKS) > chunkP2YM67Y5_cjs.PRO_PACKS) return null;
|
|
9679
|
+
const prices = chunkP2YM67Y5_cjs.findProPrices(products);
|
|
9680
|
+
const pp = chunkP2YM67Y5_cjs.packPrice(isAnnual ? prices.annual : prices.monthly);
|
|
9675
9681
|
return pp ? { incl: pp.amount, ex: pp.amount_ex_vat, isAnnual } : null;
|
|
9676
9682
|
}
|
|
9677
9683
|
function paidLine(payment, addons) {
|
|
@@ -9684,11 +9690,11 @@ function ProjectPlanCard({
|
|
|
9684
9690
|
onChangePlan
|
|
9685
9691
|
}) {
|
|
9686
9692
|
const { quotas, addons } = project;
|
|
9687
|
-
const isPro =
|
|
9693
|
+
const isPro = chunkP2YM67Y5_cjs.isProProject(project);
|
|
9688
9694
|
const used = quotas?.ai_usage?.used ?? 0;
|
|
9689
9695
|
const limit = quotas?.ai_usage?.limit ?? 0;
|
|
9690
|
-
const resetDate = formatShortDate2(
|
|
9691
|
-
const periodEnd =
|
|
9696
|
+
const resetDate = formatShortDate2(chunkP2YM67Y5_cjs.aiUsageResetTimestamp(project));
|
|
9697
|
+
const periodEnd = chunkP2YM67Y5_cjs.formatPeriodEnd(addons?.period_end ?? project.current_period_end);
|
|
9692
9698
|
const when2 = periodEnd ?? "the end of the period";
|
|
9693
9699
|
const storageUsed = quotas?.storage_gb?.used ?? 0;
|
|
9694
9700
|
const storageLimit = quotas?.storage_gb?.limit ?? 0;
|
|
@@ -9704,7 +9710,7 @@ function ProjectPlanCard({
|
|
|
9704
9710
|
project.external_id,
|
|
9705
9711
|
hasScheduledChange && addons ? { packs: packsNext ?? addons.packs, interval: pending ?? currentInterval } : null
|
|
9706
9712
|
).data;
|
|
9707
|
-
const tier = isPro ?
|
|
9713
|
+
const tier = isPro ? chunkP2YM67Y5_cjs.proTierName(project) : project.subscription === "dev" ? "Dev" : "Free";
|
|
9708
9714
|
const pendingPayment = addons?.payment?.status === "pending" ? addons.payment : null;
|
|
9709
9715
|
const confirmUrl = pendingPayment?.confirm_url ?? addons?.confirm_url;
|
|
9710
9716
|
const paidPayment = addons?.payment?.status === "paid" ? addons.payment : null;
|
|
@@ -9738,7 +9744,7 @@ function ProjectPlanCard({
|
|
|
9738
9744
|
isPro && " ",
|
|
9739
9745
|
isPro && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 text-sm font-normal text-muted-foreground", children: currentInterval === "year" ? "Annual" : "Monthly" })
|
|
9740
9746
|
] }),
|
|
9741
|
-
isPro && periodEnd && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-muted-foreground", "data-testid": "project-plan-renews", children: isCanceling ? `Ends ${periodEnd}` : hasScheduledChange && nextBill ? `Next bill ${
|
|
9747
|
+
isPro && periodEnd && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-muted-foreground", "data-testid": "project-plan-renews", children: isCanceling ? `Ends ${periodEnd}` : hasScheduledChange && nextBill ? `Next bill ${chunkP2YM67Y5_cjs.totalWithTaxWord({
|
|
9742
9748
|
subtotal: nextBill.next_renewal_ex_vat_pence,
|
|
9743
9749
|
tax: nextBill.next_renewal_tax_pence,
|
|
9744
9750
|
total: nextBill.next_renewal_pence,
|
|
@@ -9747,7 +9753,7 @@ function ProjectPlanCard({
|
|
|
9747
9753
|
] }),
|
|
9748
9754
|
price && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-auto text-right", "data-testid": "project-plan-price", children: [
|
|
9749
9755
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-lg font-semibold tabular-nums text-foreground", children: [
|
|
9750
|
-
price.ex != null ?
|
|
9756
|
+
price.ex != null ? chunkP2YM67Y5_cjs.plusVat(price.ex) : gbp2(price.incl),
|
|
9751
9757
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-normal text-muted-foreground", children: price.isAnnual ? "/year" : "/month" })
|
|
9752
9758
|
] }),
|
|
9753
9759
|
price.ex != null && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-xs text-muted-foreground", children: [
|
|
@@ -9785,7 +9791,7 @@ function ProjectPlanCard({
|
|
|
9785
9791
|
undoTestId: "undo-plan-change-button",
|
|
9786
9792
|
children: [
|
|
9787
9793
|
"Changes to ",
|
|
9788
|
-
|
|
9794
|
+
chunkP2YM67Y5_cjs.planNameForPacks(packsNext),
|
|
9789
9795
|
" on ",
|
|
9790
9796
|
when2,
|
|
9791
9797
|
"."
|
|
@@ -9830,8 +9836,8 @@ function ProjectPlanCard({
|
|
|
9830
9836
|
}
|
|
9831
9837
|
)
|
|
9832
9838
|
] }),
|
|
9833
|
-
addons?.billing_error && /* @__PURE__ */ jsxRuntime.jsx(
|
|
9834
|
-
confirmUrl ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9839
|
+
addons?.billing_error && /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.PlanNotice, { tone: "error", testId: "plan-billing-error", children: addons.billing_error }),
|
|
9840
|
+
confirmUrl ? /* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.PlanNotice, { testId: "plan-payment-state", children: [
|
|
9835
9841
|
"Waiting for your bank",
|
|
9836
9842
|
pendingPayment?.amount_pence ? ` \xB7 ${gbp2(pendingPayment.amount_pence)}` : "",
|
|
9837
9843
|
" \xB7",
|
|
@@ -9849,7 +9855,7 @@ function ProjectPlanCard({
|
|
|
9849
9855
|
]
|
|
9850
9856
|
}
|
|
9851
9857
|
)
|
|
9852
|
-
] }) : paidPayment && addons && /* @__PURE__ */ jsxRuntime.jsx(
|
|
9858
|
+
] }) : paidPayment && addons && /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.PlanNotice, { testId: "plan-payment-state", children: paidLine(paidPayment, addons) }),
|
|
9853
9859
|
isPro && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9854
9860
|
"button",
|
|
9855
9861
|
{
|
|
@@ -9876,7 +9882,7 @@ function ProjectBilling({
|
|
|
9876
9882
|
const { addons } = project;
|
|
9877
9883
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", "data-testid": "project-billing", children: [
|
|
9878
9884
|
/* @__PURE__ */ jsxRuntime.jsx(ProjectPlanCard, { project, onChangePlan }),
|
|
9879
|
-
addons &&
|
|
9885
|
+
addons && chunkP2YM67Y5_cjs.isProProject(project) && /* @__PURE__ */ jsxRuntime.jsx(ProjectUsageCard, { project, addons })
|
|
9880
9886
|
] });
|
|
9881
9887
|
}
|
|
9882
9888
|
var BREAKDOWN_LABELS = {
|
|
@@ -10007,13 +10013,13 @@ function ProjectUsageContent({
|
|
|
10007
10013
|
};
|
|
10008
10014
|
const quotaPct = effectiveUsage && aiUsageLimit ? Math.round(effectiveUsage.total_spend / aiUsageLimit * 100) : 0;
|
|
10009
10015
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10010
|
-
|
|
10016
|
+
chunkTQUYWUEE_cjs.UsagePanel,
|
|
10011
10017
|
{
|
|
10012
10018
|
state,
|
|
10013
10019
|
dateRange,
|
|
10014
10020
|
emptyMessage: `No usage ${period === "current" ? "yet this month" : "last month"}.`,
|
|
10015
10021
|
period: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10016
|
-
|
|
10022
|
+
chunkTQUYWUEE_cjs.UsageToggle,
|
|
10017
10023
|
{
|
|
10018
10024
|
ariaLabel: "Period",
|
|
10019
10025
|
value: period,
|
|
@@ -10026,7 +10032,7 @@ function ProjectUsageContent({
|
|
|
10026
10032
|
),
|
|
10027
10033
|
actions: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
10028
10034
|
effectiveUsage?.invoice_pdf && /* @__PURE__ */ jsxRuntime.jsx(
|
|
10029
|
-
|
|
10035
|
+
chunkTQUYWUEE_cjs.UsageActionButton,
|
|
10030
10036
|
{
|
|
10031
10037
|
label: "Download Stripe invoice PDF",
|
|
10032
10038
|
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Download, { className: "size-3.5" }),
|
|
@@ -10034,7 +10040,7 @@ function ProjectUsageContent({
|
|
|
10034
10040
|
}
|
|
10035
10041
|
),
|
|
10036
10042
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10037
|
-
|
|
10043
|
+
chunkTQUYWUEE_cjs.UsageActionButton,
|
|
10038
10044
|
{
|
|
10039
10045
|
label: "Print usage summary",
|
|
10040
10046
|
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Printer, { className: "size-3.5" }),
|
|
@@ -10044,7 +10050,7 @@ function ProjectUsageContent({
|
|
|
10044
10050
|
] }),
|
|
10045
10051
|
children: effectiveUsage && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
10046
10052
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10047
|
-
|
|
10053
|
+
chunkTQUYWUEE_cjs.UsageSummary,
|
|
10048
10054
|
{
|
|
10049
10055
|
stats: [
|
|
10050
10056
|
{
|
|
@@ -10052,7 +10058,7 @@ function ProjectUsageContent({
|
|
|
10052
10058
|
value: /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: react$1.formatGbp(effectiveUsage.total_spend) }),
|
|
10053
10059
|
label: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
10054
10060
|
"AI usage",
|
|
10055
|
-
quotaPct > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10061
|
+
quotaPct > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.UsageQuotaHint, { children: [
|
|
10056
10062
|
"(",
|
|
10057
10063
|
quotaPct,
|
|
10058
10064
|
"% of quota)"
|
|
@@ -10073,7 +10079,7 @@ function ProjectUsageContent({
|
|
|
10073
10079
|
}
|
|
10074
10080
|
),
|
|
10075
10081
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10076
|
-
|
|
10082
|
+
chunkTQUYWUEE_cjs.UsageToggle,
|
|
10077
10083
|
{
|
|
10078
10084
|
ariaLabel: "Breakdown by",
|
|
10079
10085
|
size: "fill",
|
|
@@ -10086,12 +10092,12 @@ function ProjectUsageContent({
|
|
|
10086
10092
|
}
|
|
10087
10093
|
),
|
|
10088
10094
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10089
|
-
|
|
10095
|
+
chunkTQUYWUEE_cjs.UsageSection,
|
|
10090
10096
|
{
|
|
10091
|
-
footer: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10097
|
+
footer: /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.UsageLegend, { series }),
|
|
10092
10098
|
title: `Daily AI usage${breakdown === "model" ? ` by ${BREAKDOWN_LABELS[breakdown]}` : ""}`,
|
|
10093
10099
|
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10094
|
-
|
|
10100
|
+
chunkTQUYWUEE_cjs.UsageLineChart,
|
|
10095
10101
|
{
|
|
10096
10102
|
dates,
|
|
10097
10103
|
series,
|
|
@@ -10102,12 +10108,12 @@ function ProjectUsageContent({
|
|
|
10102
10108
|
}
|
|
10103
10109
|
),
|
|
10104
10110
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10105
|
-
|
|
10111
|
+
chunkTQUYWUEE_cjs.UsageSection,
|
|
10106
10112
|
{
|
|
10107
10113
|
title: "Breakdown",
|
|
10108
10114
|
gap: "md",
|
|
10109
10115
|
action: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10110
|
-
|
|
10116
|
+
chunkTQUYWUEE_cjs.UsageToggle,
|
|
10111
10117
|
{
|
|
10112
10118
|
ariaLabel: "Breakdown metric",
|
|
10113
10119
|
value: metric,
|
|
@@ -10119,7 +10125,7 @@ function ProjectUsageContent({
|
|
|
10119
10125
|
}
|
|
10120
10126
|
),
|
|
10121
10127
|
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10122
|
-
|
|
10128
|
+
chunkTQUYWUEE_cjs.UsageProportionBar,
|
|
10123
10129
|
{
|
|
10124
10130
|
metric,
|
|
10125
10131
|
items: breakdownItems.map((item) => ({
|
|
@@ -10137,13 +10143,13 @@ function ProjectUsageContent({
|
|
|
10137
10143
|
);
|
|
10138
10144
|
}
|
|
10139
10145
|
function ProjectDetail({ projectExtId, storage }) {
|
|
10140
|
-
const { stripeEnabled } =
|
|
10146
|
+
const { stripeEnabled } = chunkP2YM67Y5_cjs.useBillingSupport();
|
|
10141
10147
|
const [planOpen, setPlanOpen] = react.useState(false);
|
|
10142
10148
|
const [renameOpen, setRenameOpen] = react.useState(false);
|
|
10143
10149
|
const [renameValue, setRenameValue] = react.useState("");
|
|
10144
10150
|
const updateProject = react$1.useUpdateProjectFields();
|
|
10145
10151
|
const { data: projects, isLoading } = react$1.useProjects();
|
|
10146
|
-
const currentUserExtId =
|
|
10152
|
+
const currentUserExtId = chunkP2YM67Y5_cjs.useSelfExtId();
|
|
10147
10153
|
const project = projects?.find((p) => p.external_id === projectExtId);
|
|
10148
10154
|
const handleSaveRename = react.useCallback(() => {
|
|
10149
10155
|
const trimmed = renameValue.trim();
|
|
@@ -10177,7 +10183,7 @@ function ProjectDetail({ projectExtId, storage }) {
|
|
|
10177
10183
|
}
|
|
10178
10184
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-6 space-y-6 max-w-4xl", "data-testid": `project-detail-${project.external_id}`, children: [
|
|
10179
10185
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10180
|
-
|
|
10186
|
+
chunkTQUYWUEE_cjs.ProjectDetailHeader,
|
|
10181
10187
|
{
|
|
10182
10188
|
icon: /* @__PURE__ */ jsxRuntime.jsx(ui.EntityIcon, { entityType: "PROJECT" }),
|
|
10183
10189
|
name: project.name,
|
|
@@ -10185,11 +10191,11 @@ function ProjectDetail({ projectExtId, storage }) {
|
|
|
10185
10191
|
setRenameValue(project.name);
|
|
10186
10192
|
setRenameOpen(true);
|
|
10187
10193
|
},
|
|
10188
|
-
badge: stripeEnabled ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
10194
|
+
badge: stripeEnabled ? /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.PlanBadge, { ...chunkP2YM67Y5_cjs.planBadgeView(project), size: "md" }) : void 0
|
|
10189
10195
|
}
|
|
10190
10196
|
),
|
|
10191
10197
|
hasBilling && /* @__PURE__ */ jsxRuntime.jsx(ProjectBilling, { project, onChangePlan: () => setPlanOpen(true) }),
|
|
10192
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10198
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.ProjectDetailSection, { title: hasBilling ? "Collaborator limits" : "Plan limits", children: [
|
|
10193
10199
|
!hasBilling && /* @__PURE__ */ jsxRuntime.jsx(SubscriptionStatus, { project }),
|
|
10194
10200
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10195
10201
|
"div",
|
|
@@ -10205,7 +10211,7 @@ function ProjectDetail({ projectExtId, storage }) {
|
|
|
10205
10211
|
}
|
|
10206
10212
|
)
|
|
10207
10213
|
] }),
|
|
10208
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10214
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.ProjectDetailSection, { title: "Usage", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10209
10215
|
ProjectUsageContent,
|
|
10210
10216
|
{
|
|
10211
10217
|
projectExtId: project.external_id,
|
|
@@ -10215,7 +10221,7 @@ function ProjectDetail({ projectExtId, storage }) {
|
|
|
10215
10221
|
) }),
|
|
10216
10222
|
storage,
|
|
10217
10223
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10218
|
-
|
|
10224
|
+
chunkTQUYWUEE_cjs.RenameDialog,
|
|
10219
10225
|
{
|
|
10220
10226
|
open: renameOpen,
|
|
10221
10227
|
onClose: () => setRenameOpen(false),
|
|
@@ -10230,7 +10236,7 @@ function ProjectDetail({ projectExtId, storage }) {
|
|
|
10230
10236
|
] });
|
|
10231
10237
|
}
|
|
10232
10238
|
function createProjectErrorMessage(error, fallback = "Failed to create project") {
|
|
10233
|
-
const detail =
|
|
10239
|
+
const detail = chunkP2YM67Y5_cjs.apiErrorDetail(error);
|
|
10234
10240
|
if (typeof detail === "string" && detail) return detail;
|
|
10235
10241
|
const message = detail?.message;
|
|
10236
10242
|
return typeof message === "string" && message ? message : fallback;
|
|
@@ -10240,7 +10246,7 @@ function NewProjectFlow({ open, onOpenChange, defaultName }) {
|
|
|
10240
10246
|
const [plan, setPlan] = react.useState("pro");
|
|
10241
10247
|
const [isAnnual, setIsAnnual] = react.useState(false);
|
|
10242
10248
|
const [promoCode, setPromoCode] = react.useState("");
|
|
10243
|
-
const [addonBudget, setAddonBudget] = react.useState(String(
|
|
10249
|
+
const [addonBudget, setAddonBudget] = react.useState(String(chunkP2YM67Y5_cjs.DEFAULT_SPEND_CAP_PENCE / 100));
|
|
10244
10250
|
const [checkoutBudget, setCheckoutBudget] = react.useState(null);
|
|
10245
10251
|
const [aiBlocks, setAiBlocks] = react.useState(0);
|
|
10246
10252
|
const [storageBlocks, setStorageBlocks] = react.useState(0);
|
|
@@ -10254,7 +10260,7 @@ function NewProjectFlow({ open, onOpenChange, defaultName }) {
|
|
|
10254
10260
|
const [checkoutProjectName, setCheckoutProjectName] = react.useState("");
|
|
10255
10261
|
const [checkoutInterval, setCheckoutInterval] = react.useState("month");
|
|
10256
10262
|
const paymentCompletedRef = react.useRef(false);
|
|
10257
|
-
const { stripeEnabled } =
|
|
10263
|
+
const { stripeEnabled } = chunkP2YM67Y5_cjs.useBillingSupport();
|
|
10258
10264
|
const { data: products, isLoading: productsLoading } = react$1.useProducts({
|
|
10259
10265
|
enabled: stripeEnabled
|
|
10260
10266
|
});
|
|
@@ -10283,18 +10289,18 @@ function NewProjectFlow({ open, onOpenChange, defaultName }) {
|
|
|
10283
10289
|
setPlan("pro");
|
|
10284
10290
|
setPromoCode("");
|
|
10285
10291
|
setPostalCode("");
|
|
10286
|
-
setAddonBudget(String(
|
|
10292
|
+
setAddonBudget(String(chunkP2YM67Y5_cjs.DEFAULT_SPEND_CAP_PENCE / 100));
|
|
10287
10293
|
setAiBlocks(0);
|
|
10288
10294
|
setStorageBlocks(0);
|
|
10289
10295
|
setIsCreating(false);
|
|
10290
10296
|
}
|
|
10291
10297
|
onOpenChange(newOpen);
|
|
10292
10298
|
};
|
|
10293
|
-
const prices =
|
|
10299
|
+
const prices = chunkP2YM67Y5_cjs.findProPrices(products);
|
|
10294
10300
|
const intervalPrice = isAnnual ? prices.annual : prices.monthly;
|
|
10295
|
-
const selectedPrice =
|
|
10301
|
+
const selectedPrice = chunkP2YM67Y5_cjs.packPrice(intervalPrice);
|
|
10296
10302
|
const currency = intervalPrice?.currency ?? "gbp";
|
|
10297
|
-
const savingsPercent =
|
|
10303
|
+
const savingsPercent = chunkP2YM67Y5_cjs.calcSavingsPercent(prices.monthly, prices.annual);
|
|
10298
10304
|
const isPro = stripeEnabled && plan !== "free";
|
|
10299
10305
|
const quote = useCheckoutQuote({
|
|
10300
10306
|
interval: isAnnual ? "year" : "month",
|
|
@@ -10304,14 +10310,14 @@ function NewProjectFlow({ open, onOpenChange, defaultName }) {
|
|
|
10304
10310
|
storageBlocks,
|
|
10305
10311
|
enabled: open && isPro && !!selectedPrice
|
|
10306
10312
|
});
|
|
10307
|
-
const canSubmit = !!projectName.trim() && !isCreating && !createProject.isPending && (!isPro || !!selectedPrice &&
|
|
10313
|
+
const canSubmit = !!projectName.trim() && !isCreating && !createProject.isPending && (!isPro || !!selectedPrice && chunkP2YM67Y5_cjs.parseBudgetPounds(addonBudget) !== void 0 && quote.canContinue);
|
|
10308
10314
|
const handleCreateFree = () => {
|
|
10309
10315
|
setIsCreating(true);
|
|
10310
10316
|
createProject.mutate(
|
|
10311
10317
|
{
|
|
10312
10318
|
name: projectName.trim(),
|
|
10313
10319
|
plan: "free",
|
|
10314
|
-
daily_cap_per_user:
|
|
10320
|
+
daily_cap_per_user: chunkP2YM67Y5_cjs.SUGGESTED_DAILY_CAP_PER_USER
|
|
10315
10321
|
},
|
|
10316
10322
|
{
|
|
10317
10323
|
onSuccess: () => {
|
|
@@ -10328,14 +10334,14 @@ function NewProjectFlow({ open, onOpenChange, defaultName }) {
|
|
|
10328
10334
|
};
|
|
10329
10335
|
const handleSubscribe = () => {
|
|
10330
10336
|
const interval = isAnnual ? "year" : "month";
|
|
10331
|
-
const parsed =
|
|
10332
|
-
const budgetToSend = parsed == null || parsed ===
|
|
10337
|
+
const parsed = chunkP2YM67Y5_cjs.parseBudgetPounds(addonBudget);
|
|
10338
|
+
const budgetToSend = parsed == null || parsed === chunkP2YM67Y5_cjs.DEFAULT_SPEND_CAP_PENCE ? null : parsed;
|
|
10333
10339
|
setIsCreating(true);
|
|
10334
10340
|
createProject.mutate(
|
|
10335
10341
|
{
|
|
10336
10342
|
name: projectName.trim(),
|
|
10337
10343
|
plan: "pro",
|
|
10338
|
-
daily_cap_per_user:
|
|
10344
|
+
daily_cap_per_user: chunkP2YM67Y5_cjs.SUGGESTED_DAILY_CAP_PER_USER
|
|
10339
10345
|
},
|
|
10340
10346
|
{
|
|
10341
10347
|
onSuccess: (newProject) => {
|
|
@@ -10376,8 +10382,8 @@ function NewProjectFlow({ open, onOpenChange, defaultName }) {
|
|
|
10376
10382
|
description: stripeEnabled ? "Name it and pick a plan." : "Projects group your workspaces.",
|
|
10377
10383
|
showDescription: true,
|
|
10378
10384
|
size: "xl",
|
|
10379
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10380
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10385
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.PlanStack, { gap: 5, children: [
|
|
10386
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.PlanStack, { gap: 2, children: [
|
|
10381
10387
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Label, { htmlFor: "new-project-name", children: "Name" }),
|
|
10382
10388
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10383
10389
|
ui.Input,
|
|
@@ -10393,16 +10399,16 @@ function NewProjectFlow({ open, onOpenChange, defaultName }) {
|
|
|
10393
10399
|
}
|
|
10394
10400
|
)
|
|
10395
10401
|
] }),
|
|
10396
|
-
stripeEnabled && (productsLoading ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
10397
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10402
|
+
stripeEnabled && (productsLoading ? /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.PlanNotice, { children: "Loading plans\u2026" }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
10403
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.PlanPickerCard, { children: [
|
|
10398
10404
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10399
|
-
|
|
10405
|
+
chunkTQUYWUEE_cjs.PlanPickerHeader,
|
|
10400
10406
|
{
|
|
10401
10407
|
title: "Plan",
|
|
10402
10408
|
info: /* @__PURE__ */ jsxRuntime.jsx(PlanInfoPopover2, {}),
|
|
10403
10409
|
infoPlacement: "toggle",
|
|
10404
10410
|
toggle: plan !== "free" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
10405
|
-
|
|
10411
|
+
chunkTQUYWUEE_cjs.PricingToggle,
|
|
10406
10412
|
{
|
|
10407
10413
|
isAnnual,
|
|
10408
10414
|
onToggle: () => setIsAnnual(!isAnnual),
|
|
@@ -10440,7 +10446,7 @@ function NewProjectFlow({ open, onOpenChange, defaultName }) {
|
|
|
10440
10446
|
currency
|
|
10441
10447
|
}
|
|
10442
10448
|
),
|
|
10443
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10449
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.PromoCodeInput, { value: promoCode, onChange: setPromoCode }),
|
|
10444
10450
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10445
10451
|
CheckoutCountrySelect,
|
|
10446
10452
|
{
|
|
@@ -10459,10 +10465,10 @@ function NewProjectFlow({ open, onOpenChange, defaultName }) {
|
|
|
10459
10465
|
onPostalCodeChange: setPostalCode
|
|
10460
10466
|
}
|
|
10461
10467
|
)
|
|
10462
|
-
] }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
10468
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.PlanNotice, { children: "Pro isn't available right now." }))
|
|
10463
10469
|
] })),
|
|
10464
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10465
|
-
isSlow && /* @__PURE__ */ jsxRuntime.jsx(
|
|
10470
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.PlanActionButton, { onClick: submit, disabled: !canSubmit, children: isCreating ? "Creating\u2026" : isPro ? "Continue to payment" : "Create project" }),
|
|
10471
|
+
isSlow && /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.PlanNotice, { className: "text-xs", testId: "new-project-still-working", children: "Still working. We'll update here." })
|
|
10466
10472
|
] })
|
|
10467
10473
|
}
|
|
10468
10474
|
),
|
|
@@ -10490,7 +10496,7 @@ function NewProjectFlow({ open, onOpenChange, defaultName }) {
|
|
|
10490
10496
|
function useAutoRefreshPendingProjects() {
|
|
10491
10497
|
const { data: projects } = react$1.useProjects();
|
|
10492
10498
|
const refreshProject = react$1.useRefreshProject();
|
|
10493
|
-
const currentUserExtId =
|
|
10499
|
+
const currentUserExtId = chunkP2YM67Y5_cjs.useSelfExtId();
|
|
10494
10500
|
const refreshedRef = react.useRef(/* @__PURE__ */ new Set());
|
|
10495
10501
|
react.useEffect(() => {
|
|
10496
10502
|
if (!projects || !currentUserExtId) return;
|
|
@@ -10533,9 +10539,10 @@ function WorkspaceCardsView({
|
|
|
10533
10539
|
onOpenWorkspace,
|
|
10534
10540
|
onOpenProject,
|
|
10535
10541
|
onCreateWorkspace,
|
|
10536
|
-
createDisabledReason
|
|
10542
|
+
createDisabledReason,
|
|
10543
|
+
workspaceState
|
|
10537
10544
|
}) {
|
|
10538
|
-
const { stripeEnabled } =
|
|
10545
|
+
const { stripeEnabled } = chunkP2YM67Y5_cjs.useBillingSupport();
|
|
10539
10546
|
const workspaceLabel = ui.getEntityLabel("WORKSPACE");
|
|
10540
10547
|
const projectLabel = ui.getEntityLabel("PROJECT").toLowerCase();
|
|
10541
10548
|
const { groups, projects, selfId } = list;
|
|
@@ -10554,7 +10561,7 @@ function WorkspaceCardsView({
|
|
|
10554
10561
|
}
|
|
10555
10562
|
return /* @__PURE__ */ jsxRuntime.jsx(chunkMSFQDELO_cjs.WorkspaceList, { testId: "workspace-cards-list", children: groups.map((group) => {
|
|
10556
10563
|
const project = projects.find((p) => p.external_id === group.projectExtId);
|
|
10557
|
-
const { breakdown, readout } =
|
|
10564
|
+
const { breakdown, readout } = chunkP2YM67Y5_cjs.projectGroupBilling(project, {
|
|
10558
10565
|
isOwned: group.isOwned,
|
|
10559
10566
|
stripeEnabled
|
|
10560
10567
|
});
|
|
@@ -10596,27 +10603,35 @@ function WorkspaceCardsView({
|
|
|
10596
10603
|
testId: "add-workspace-button"
|
|
10597
10604
|
}
|
|
10598
10605
|
),
|
|
10599
|
-
[...group.workspaces].sort(chunkJUUOJP7I_cjs.byRecentUpdate).map((workspace) =>
|
|
10600
|
-
|
|
10601
|
-
|
|
10602
|
-
|
|
10603
|
-
|
|
10604
|
-
|
|
10605
|
-
|
|
10606
|
-
|
|
10607
|
-
|
|
10608
|
-
|
|
10609
|
-
|
|
10610
|
-
|
|
10611
|
-
|
|
10612
|
-
|
|
10613
|
-
|
|
10614
|
-
|
|
10615
|
-
|
|
10616
|
-
|
|
10617
|
-
|
|
10618
|
-
|
|
10619
|
-
|
|
10606
|
+
[...group.workspaces].sort(chunkJUUOJP7I_cjs.byRecentUpdate).map((workspace) => {
|
|
10607
|
+
const state = workspaceState?.(workspace);
|
|
10608
|
+
const selectLabel = state?.selectLabel;
|
|
10609
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10610
|
+
chunkMSFQDELO_cjs.WorkspaceCard,
|
|
10611
|
+
{
|
|
10612
|
+
workspace: {
|
|
10613
|
+
...toWorkspaceSummary(workspace, selfId),
|
|
10614
|
+
...state?.status != null && { subtitle: state.status }
|
|
10615
|
+
},
|
|
10616
|
+
current: currentWorkspaceId === workspace.external_id,
|
|
10617
|
+
onSelect: () => onOpenWorkspace(workspace),
|
|
10618
|
+
href: state?.onSelect ? void 0 : chunkLJJJ6CYH_cjs.buildDeepLinkPath({ workspaceId: workspace.external_id }),
|
|
10619
|
+
labels: selectLabel ? { openWorkspace: () => selectLabel } : void 0,
|
|
10620
|
+
mark: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10621
|
+
ui.ShieldIcon,
|
|
10622
|
+
{
|
|
10623
|
+
char: workspace.name.charAt(0),
|
|
10624
|
+
workspaceColor: chunkV46W7YLI_cjs.workspaceKindColor(react$1.getWorkspaceKind(workspace)),
|
|
10625
|
+
size: 28,
|
|
10626
|
+
isSelected: true
|
|
10627
|
+
}
|
|
10628
|
+
),
|
|
10629
|
+
testId: `workspace-card-${workspace.external_id}`,
|
|
10630
|
+
openCueTestId: `workspace-open-${workspace.external_id}`
|
|
10631
|
+
},
|
|
10632
|
+
workspace.external_id
|
|
10633
|
+
);
|
|
10634
|
+
})
|
|
10620
10635
|
]
|
|
10621
10636
|
},
|
|
10622
10637
|
group.key
|
|
@@ -10705,7 +10720,7 @@ function useConnectedWorkspaceList({
|
|
|
10705
10720
|
[selfId, pinned]
|
|
10706
10721
|
);
|
|
10707
10722
|
const filtered = react.useMemo(
|
|
10708
|
-
() =>
|
|
10723
|
+
() => chunkTQUYWUEE_cjs.applyTriStateFilters(workspaces, filterMap, attributesOf),
|
|
10709
10724
|
[workspaces, filterMap, attributesOf]
|
|
10710
10725
|
);
|
|
10711
10726
|
const groups = react.useMemo(
|
|
@@ -10770,7 +10785,7 @@ function useConnectedWorkspaceList({
|
|
|
10770
10785
|
};
|
|
10771
10786
|
}
|
|
10772
10787
|
var WorkspaceTableView = react.lazy(
|
|
10773
|
-
() => import('../WorkspaceTableView-
|
|
10788
|
+
() => import('../WorkspaceTableView-EYLEUZZT.cjs').then((m) => ({ default: m.WorkspaceTableView }))
|
|
10774
10789
|
);
|
|
10775
10790
|
var WORKSPACES_TAB_ID = "workspaces";
|
|
10776
10791
|
var defaultRenderMember2 = (user, size) => {
|
|
@@ -10801,7 +10816,8 @@ function ConnectedWorkspaceList({
|
|
|
10801
10816
|
activeTab = WORKSPACES_TAB_ID,
|
|
10802
10817
|
onTabChange,
|
|
10803
10818
|
children,
|
|
10804
|
-
labels
|
|
10819
|
+
labels,
|
|
10820
|
+
workspaceState
|
|
10805
10821
|
}) {
|
|
10806
10822
|
const list = useConnectedWorkspaceList({ filters, onFiltersChange, labels });
|
|
10807
10823
|
const { openProject } = chunkCNHUJRQ4_cjs.useBlocksEnvironment();
|
|
@@ -10815,7 +10831,11 @@ function ConnectedWorkspaceList({
|
|
|
10815
10831
|
onViewChange?.(next);
|
|
10816
10832
|
if (controlledView === void 0) setLocalView(next);
|
|
10817
10833
|
};
|
|
10818
|
-
const open = (workspace) =>
|
|
10834
|
+
const open = (workspace) => {
|
|
10835
|
+
const select = workspaceState?.(workspace)?.onSelect;
|
|
10836
|
+
if (select) select();
|
|
10837
|
+
else void openWorkspace(workspace.external_id, { name: workspace.name });
|
|
10838
|
+
};
|
|
10819
10839
|
const createDisabledReason = list.canCreateProjects === false ? react$1.PROJECT_CREATION_DENIED_REASON : void 0;
|
|
10820
10840
|
if (list.isLoading) return /* @__PURE__ */ jsxRuntime.jsx(chunkGC2FSPSQ_cjs.LoadingIndicator, { message: "Loading workspaces..." });
|
|
10821
10841
|
if (list.error) {
|
|
@@ -10886,7 +10906,8 @@ function ConnectedWorkspaceList({
|
|
|
10886
10906
|
onOpenWorkspace: open,
|
|
10887
10907
|
onOpenProject: openProject,
|
|
10888
10908
|
onCreateWorkspace,
|
|
10889
|
-
createDisabledReason
|
|
10909
|
+
createDisabledReason,
|
|
10910
|
+
workspaceState
|
|
10890
10911
|
}
|
|
10891
10912
|
) })
|
|
10892
10913
|
) : /* @__PURE__ */ jsxRuntime.jsx(react.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(chunkGC2FSPSQ_cjs.LoadingIndicator, { message: "Loading grid..." }), children: /* @__PURE__ */ jsxRuntime.jsx(chunkOOU4QLRK_cjs.HomeCenteredColumn, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -10897,7 +10918,8 @@ function ConnectedWorkspaceList({
|
|
|
10897
10918
|
onOpenProject: openProject,
|
|
10898
10919
|
renderMember,
|
|
10899
10920
|
gridState,
|
|
10900
|
-
onGridStateChange
|
|
10921
|
+
onGridStateChange,
|
|
10922
|
+
workspaceState
|
|
10901
10923
|
}
|
|
10902
10924
|
) }) }) })
|
|
10903
10925
|
] });
|
|
@@ -10932,7 +10954,7 @@ function ConnectedProjectsPanel({
|
|
|
10932
10954
|
const { data: projects } = react$1.useProjects();
|
|
10933
10955
|
const canCreateProjects = react$1.useCanCreateProjects();
|
|
10934
10956
|
const { userId } = chunkFM3IRQJW_cjs.useConnectedWorkspace();
|
|
10935
|
-
const { stripeEnabled } =
|
|
10957
|
+
const { stripeEnabled } = chunkP2YM67Y5_cjs.useBillingSupport();
|
|
10936
10958
|
const billingPortal = useOpenBillingPortal();
|
|
10937
10959
|
const [newProjectOpen, setNewProjectOpen] = react.useState(false);
|
|
10938
10960
|
useAutoRefreshPendingProjects();
|
|
@@ -10959,15 +10981,15 @@ function ConnectedProjectsPanel({
|
|
|
10959
10981
|
[ownedCount, tabs, projects]
|
|
10960
10982
|
);
|
|
10961
10983
|
const paidProject = projects?.find(isPaid);
|
|
10962
|
-
const panel = /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10963
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10984
|
+
const panel = /* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.PanelFrame, { className, testId: "projects-panel", children: [
|
|
10985
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.DraggableHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10964
10986
|
chunk7RGLTF76_cjs.TabHeader,
|
|
10965
10987
|
{
|
|
10966
10988
|
tabs: headerTabs,
|
|
10967
10989
|
activeTabId: activeProjectId ?? PROJECTS_BASE_TAB_ID,
|
|
10968
10990
|
onTabChange: (id) => tabs.onSelect(id === PROJECTS_BASE_TAB_ID ? null : id),
|
|
10969
10991
|
afterTabs: (isCompact) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
10970
|
-
|
|
10992
|
+
chunkTQUYWUEE_cjs.PanelAddButton,
|
|
10971
10993
|
{
|
|
10972
10994
|
label: "New project",
|
|
10973
10995
|
onClick: () => setNewProjectOpen(true),
|
|
@@ -10982,15 +11004,15 @@ function ConnectedProjectsPanel({
|
|
|
10982
11004
|
compactBreakpoint: 360
|
|
10983
11005
|
}
|
|
10984
11006
|
) }),
|
|
10985
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11007
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.PanelFrameBody, { children: activeProjectId ? /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.PanelScroll, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10986
11008
|
ProjectDetail,
|
|
10987
11009
|
{
|
|
10988
11010
|
projectExtId: activeProjectId,
|
|
10989
11011
|
storage: projectStorage?.(activeProjectId)
|
|
10990
11012
|
}
|
|
10991
|
-
) }) : /* @__PURE__ */ jsxRuntime.jsxs(
|
|
11013
|
+
) }) : /* @__PURE__ */ jsxRuntime.jsxs(chunkTQUYWUEE_cjs.PanelScroll, { variant: "padded", children: [
|
|
10992
11014
|
/* @__PURE__ */ jsxRuntime.jsx(ProjectsTable, {}),
|
|
10993
|
-
stripeEnabled && paidProject && /* @__PURE__ */ jsxRuntime.jsx(
|
|
11015
|
+
stripeEnabled && paidProject && /* @__PURE__ */ jsxRuntime.jsx(chunkTQUYWUEE_cjs.PanelActionsRow, { children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10994
11016
|
ui.Button,
|
|
10995
11017
|
{
|
|
10996
11018
|
onClick: () => billingPortal.open(paidProject.external_id),
|
|
@@ -11962,7 +11984,7 @@ var MailBodyEditor = react.lazy(
|
|
|
11962
11984
|
}))
|
|
11963
11985
|
);
|
|
11964
11986
|
var NativeDocxEditor = react.lazy(
|
|
11965
|
-
() => import('../NativeDocxEditor-
|
|
11987
|
+
() => import('../NativeDocxEditor-T2PJIZMU.cjs').then((m) => ({ default: m.NativeDocxEditor }))
|
|
11966
11988
|
);
|
|
11967
11989
|
var NO_WORD = {
|
|
11968
11990
|
adapter: {
|
|
@@ -17256,7 +17278,7 @@ var COMPACT_BELOW = 132;
|
|
|
17256
17278
|
var NO_DOCUMENTS = [];
|
|
17257
17279
|
function useFilesWorkspace() {
|
|
17258
17280
|
const { workspaceId, userId, live } = chunkFM3IRQJW_cjs.useConnectedWorkspace();
|
|
17259
|
-
const { members, role } =
|
|
17281
|
+
const { members, role } = chunk2BHDRVVL_cjs.useConnectedWorkspaceRole();
|
|
17260
17282
|
const { data: workspaces } = react$1.useWorkspaces({ enabled: live });
|
|
17261
17283
|
const workspaceName = workspaces?.find((w) => w.external_id === workspaceId)?.name;
|
|
17262
17284
|
return {
|
|
@@ -18585,59 +18607,59 @@ function ConnectedAgentChatPanel({
|
|
|
18585
18607
|
|
|
18586
18608
|
Object.defineProperty(exports, "BillingSupportProvider", {
|
|
18587
18609
|
enumerable: true,
|
|
18588
|
-
get: function () { return
|
|
18610
|
+
get: function () { return chunkP2YM67Y5_cjs.BillingSupportProvider; }
|
|
18589
18611
|
});
|
|
18590
18612
|
Object.defineProperty(exports, "CAP_REACHED_MESSAGE", {
|
|
18591
18613
|
enumerable: true,
|
|
18592
|
-
get: function () { return
|
|
18614
|
+
get: function () { return chunkP2YM67Y5_cjs.CAP_REACHED_MESSAGE; }
|
|
18593
18615
|
});
|
|
18594
18616
|
Object.defineProperty(exports, "ZERO_BUDGET_MESSAGE", {
|
|
18595
18617
|
enumerable: true,
|
|
18596
|
-
get: function () { return
|
|
18618
|
+
get: function () { return chunkP2YM67Y5_cjs.ZERO_BUDGET_MESSAGE; }
|
|
18597
18619
|
});
|
|
18598
18620
|
Object.defineProperty(exports, "aiUsageResetTimestamp", {
|
|
18599
18621
|
enumerable: true,
|
|
18600
|
-
get: function () { return
|
|
18622
|
+
get: function () { return chunkP2YM67Y5_cjs.aiUsageResetTimestamp; }
|
|
18601
18623
|
});
|
|
18602
18624
|
Object.defineProperty(exports, "formatMoney", {
|
|
18603
18625
|
enumerable: true,
|
|
18604
|
-
get: function () { return
|
|
18626
|
+
get: function () { return chunkP2YM67Y5_cjs.formatMoney; }
|
|
18605
18627
|
});
|
|
18606
18628
|
Object.defineProperty(exports, "formatResetDate", {
|
|
18607
18629
|
enumerable: true,
|
|
18608
|
-
get: function () { return
|
|
18630
|
+
get: function () { return chunkP2YM67Y5_cjs.formatResetDate; }
|
|
18609
18631
|
});
|
|
18610
18632
|
Object.defineProperty(exports, "getQuotaItems", {
|
|
18611
18633
|
enumerable: true,
|
|
18612
|
-
get: function () { return
|
|
18634
|
+
get: function () { return chunkP2YM67Y5_cjs.getQuotaItems; }
|
|
18613
18635
|
});
|
|
18614
18636
|
Object.defineProperty(exports, "isAddonBudgetZero", {
|
|
18615
18637
|
enumerable: true,
|
|
18616
|
-
get: function () { return
|
|
18638
|
+
get: function () { return chunkP2YM67Y5_cjs.isAddonBudgetZero; }
|
|
18617
18639
|
});
|
|
18618
18640
|
Object.defineProperty(exports, "isProProject", {
|
|
18619
18641
|
enumerable: true,
|
|
18620
|
-
get: function () { return
|
|
18642
|
+
get: function () { return chunkP2YM67Y5_cjs.isProProject; }
|
|
18621
18643
|
});
|
|
18622
18644
|
Object.defineProperty(exports, "planBadgeView", {
|
|
18623
18645
|
enumerable: true,
|
|
18624
|
-
get: function () { return
|
|
18646
|
+
get: function () { return chunkP2YM67Y5_cjs.planBadgeView; }
|
|
18625
18647
|
});
|
|
18626
18648
|
Object.defineProperty(exports, "planName", {
|
|
18627
18649
|
enumerable: true,
|
|
18628
|
-
get: function () { return
|
|
18650
|
+
get: function () { return chunkP2YM67Y5_cjs.planName; }
|
|
18629
18651
|
});
|
|
18630
18652
|
Object.defineProperty(exports, "projectGroupBilling", {
|
|
18631
18653
|
enumerable: true,
|
|
18632
|
-
get: function () { return
|
|
18654
|
+
get: function () { return chunkP2YM67Y5_cjs.projectGroupBilling; }
|
|
18633
18655
|
});
|
|
18634
18656
|
Object.defineProperty(exports, "useBillingSupport", {
|
|
18635
18657
|
enumerable: true,
|
|
18636
|
-
get: function () { return
|
|
18658
|
+
get: function () { return chunkP2YM67Y5_cjs.useBillingSupport; }
|
|
18637
18659
|
});
|
|
18638
18660
|
Object.defineProperty(exports, "useRewardBalance", {
|
|
18639
18661
|
enumerable: true,
|
|
18640
|
-
get: function () { return
|
|
18662
|
+
get: function () { return chunkP2YM67Y5_cjs.useRewardBalance; }
|
|
18641
18663
|
});
|
|
18642
18664
|
Object.defineProperty(exports, "ConnectedAssistantDock", {
|
|
18643
18665
|
enumerable: true,
|
|
@@ -18673,43 +18695,43 @@ Object.defineProperty(exports, "useWorkspaceDocs", {
|
|
|
18673
18695
|
});
|
|
18674
18696
|
Object.defineProperty(exports, "ConnectedWorkflowDocumentsField", {
|
|
18675
18697
|
enumerable: true,
|
|
18676
|
-
get: function () { return
|
|
18698
|
+
get: function () { return chunk2BHDRVVL_cjs.ConnectedWorkflowDocumentsField; }
|
|
18677
18699
|
});
|
|
18678
18700
|
Object.defineProperty(exports, "ConnectedWorkflowLauncher", {
|
|
18679
18701
|
enumerable: true,
|
|
18680
|
-
get: function () { return
|
|
18702
|
+
get: function () { return chunk2BHDRVVL_cjs.ConnectedWorkflowLauncher; }
|
|
18681
18703
|
});
|
|
18682
18704
|
Object.defineProperty(exports, "ConnectedWorkflowsTable", {
|
|
18683
18705
|
enumerable: true,
|
|
18684
|
-
get: function () { return
|
|
18706
|
+
get: function () { return chunk2BHDRVVL_cjs.ConnectedWorkflowsTable; }
|
|
18685
18707
|
});
|
|
18686
18708
|
Object.defineProperty(exports, "DEFAULT_CONNECTED_WORKFLOWS_TABLE_LABELS", {
|
|
18687
18709
|
enumerable: true,
|
|
18688
|
-
get: function () { return
|
|
18710
|
+
get: function () { return chunk2BHDRVVL_cjs.DEFAULT_CONNECTED_WORKFLOWS_TABLE_LABELS; }
|
|
18689
18711
|
});
|
|
18690
18712
|
Object.defineProperty(exports, "NativeDocxSupportProvider", {
|
|
18691
18713
|
enumerable: true,
|
|
18692
|
-
get: function () { return
|
|
18714
|
+
get: function () { return chunk2BHDRVVL_cjs.NativeDocxSupportProvider; }
|
|
18693
18715
|
});
|
|
18694
18716
|
Object.defineProperty(exports, "toWorkflowFieldDocument", {
|
|
18695
18717
|
enumerable: true,
|
|
18696
|
-
get: function () { return
|
|
18718
|
+
get: function () { return chunk2BHDRVVL_cjs.toWorkflowFieldDocument; }
|
|
18697
18719
|
});
|
|
18698
18720
|
Object.defineProperty(exports, "useConnectedAgentOptions", {
|
|
18699
18721
|
enumerable: true,
|
|
18700
|
-
get: function () { return
|
|
18722
|
+
get: function () { return chunk2BHDRVVL_cjs.useConnectedAgentOptions; }
|
|
18701
18723
|
});
|
|
18702
18724
|
Object.defineProperty(exports, "useConnectedWorkflowScopeSource", {
|
|
18703
18725
|
enumerable: true,
|
|
18704
|
-
get: function () { return
|
|
18726
|
+
get: function () { return chunk2BHDRVVL_cjs.useConnectedWorkflowScopeSource; }
|
|
18705
18727
|
});
|
|
18706
18728
|
Object.defineProperty(exports, "useConnectedWorkspaceRole", {
|
|
18707
18729
|
enumerable: true,
|
|
18708
|
-
get: function () { return
|
|
18730
|
+
get: function () { return chunk2BHDRVVL_cjs.useConnectedWorkspaceRole; }
|
|
18709
18731
|
});
|
|
18710
18732
|
Object.defineProperty(exports, "useNativeDocxSupport", {
|
|
18711
18733
|
enumerable: true,
|
|
18712
|
-
get: function () { return
|
|
18734
|
+
get: function () { return chunk2BHDRVVL_cjs.useNativeDocxSupport; }
|
|
18713
18735
|
});
|
|
18714
18736
|
Object.defineProperty(exports, "DocumentViewerSupportProvider", {
|
|
18715
18737
|
enumerable: true,
|