@crowdin/app-project-module 3.2.2 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/modules/about.js +2 -10
- package/out/modules/api/api.js +7 -0
- package/out/modules/api/components.d.ts +6 -1
- package/out/modules/api/components.js +6 -1
- package/out/modules/integration/handlers/crowdin-update.js +33 -6
- package/out/modules/integration/handlers/integration-update.js +1 -1
- package/out/modules/integration/handlers/job-list.d.ts +8 -2
- package/out/modules/integration/handlers/job-list.js +30 -11
- package/out/modules/integration/types.d.ts +8 -0
- package/out/modules/integration/util/types.d.ts +2 -0
- package/out/static/css/styles.css +1 -1
- package/out/static/img/crowdin_small.svg +8 -7
- package/out/static/ui/about.bundle.js +11 -1
- package/out/static/ui/about.bundle.js.map +1 -1
- package/out/static/ui/error.bundle.js +3 -3
- package/out/static/ui/error.bundle.js.map +1 -1
- package/out/static/ui/login.bundle.js +4 -4
- package/out/static/ui/login.bundle.js.map +1 -1
- package/out/static/ui/main.bundle.js +656 -590
- package/out/static/ui/main.bundle.js.map +1 -1
- package/out/static/ui/subscription.bundle.js +1 -1
- package/out/static/ui/subscription.bundle.js.map +1 -1
- package/out/storage/drizzle/index.js +6 -1
- package/out/util/index.d.ts +1 -0
- package/out/util/index.js +16 -1
- package/out/util/logo.d.ts +4 -0
- package/out/util/logo.js +47 -0
- package/out/util/static-files.d.ts +4 -1
- package/out/util/static-files.js +26 -4
- package/package.json +1 -1
|
@@ -19057,7 +19057,7 @@
|
|
|
19057
19057
|
*/
|
|
19058
19058
|
|
|
19059
19059
|
|
|
19060
|
-
const __iconData$
|
|
19060
|
+
const __iconData$D = {
|
|
19061
19061
|
name: "arrow-down",
|
|
19062
19062
|
size: 24,
|
|
19063
19063
|
node: [
|
|
@@ -19065,8 +19065,8 @@
|
|
|
19065
19065
|
["path", { d: "m19 12-7 7-7-7", key: "1idqje" }]
|
|
19066
19066
|
]
|
|
19067
19067
|
};
|
|
19068
|
-
__iconData$
|
|
19069
|
-
const ArrowDown = createLucideIcon(__iconData$
|
|
19068
|
+
__iconData$D.node;
|
|
19069
|
+
const ArrowDown = createLucideIcon(__iconData$D);
|
|
19070
19070
|
|
|
19071
19071
|
/**
|
|
19072
19072
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19076,7 +19076,7 @@
|
|
|
19076
19076
|
*/
|
|
19077
19077
|
|
|
19078
19078
|
|
|
19079
|
-
const __iconData$
|
|
19079
|
+
const __iconData$C = {
|
|
19080
19080
|
name: "arrow-left",
|
|
19081
19081
|
size: 24,
|
|
19082
19082
|
node: [
|
|
@@ -19084,8 +19084,8 @@
|
|
|
19084
19084
|
["path", { d: "M19 12H5", key: "x3x0zl" }]
|
|
19085
19085
|
]
|
|
19086
19086
|
};
|
|
19087
|
-
__iconData$
|
|
19088
|
-
const ArrowLeft = createLucideIcon(__iconData$
|
|
19087
|
+
__iconData$C.node;
|
|
19088
|
+
const ArrowLeft = createLucideIcon(__iconData$C);
|
|
19089
19089
|
|
|
19090
19090
|
/**
|
|
19091
19091
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19095,7 +19095,7 @@
|
|
|
19095
19095
|
*/
|
|
19096
19096
|
|
|
19097
19097
|
|
|
19098
|
-
const __iconData$
|
|
19098
|
+
const __iconData$B = {
|
|
19099
19099
|
name: "arrow-up",
|
|
19100
19100
|
size: 24,
|
|
19101
19101
|
node: [
|
|
@@ -19103,8 +19103,8 @@
|
|
|
19103
19103
|
["path", { d: "M12 19V5", key: "x0mq9r" }]
|
|
19104
19104
|
]
|
|
19105
19105
|
};
|
|
19106
|
-
__iconData$
|
|
19107
|
-
const ArrowUp = createLucideIcon(__iconData$
|
|
19106
|
+
__iconData$B.node;
|
|
19107
|
+
const ArrowUp = createLucideIcon(__iconData$B);
|
|
19108
19108
|
|
|
19109
19109
|
/**
|
|
19110
19110
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19114,7 +19114,7 @@
|
|
|
19114
19114
|
*/
|
|
19115
19115
|
|
|
19116
19116
|
|
|
19117
|
-
const __iconData$
|
|
19117
|
+
const __iconData$A = {
|
|
19118
19118
|
name: "ban",
|
|
19119
19119
|
size: 24,
|
|
19120
19120
|
node: [
|
|
@@ -19122,8 +19122,8 @@
|
|
|
19122
19122
|
["path", { d: "M4.929 4.929 19.07 19.071", key: "196cmz" }]
|
|
19123
19123
|
]
|
|
19124
19124
|
};
|
|
19125
|
-
__iconData$
|
|
19126
|
-
const Ban = createLucideIcon(__iconData$
|
|
19125
|
+
__iconData$A.node;
|
|
19126
|
+
const Ban = createLucideIcon(__iconData$A);
|
|
19127
19127
|
|
|
19128
19128
|
/**
|
|
19129
19129
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19133,13 +19133,13 @@
|
|
|
19133
19133
|
*/
|
|
19134
19134
|
|
|
19135
19135
|
|
|
19136
|
-
const __iconData$
|
|
19136
|
+
const __iconData$z = {
|
|
19137
19137
|
name: "check",
|
|
19138
19138
|
size: 24,
|
|
19139
19139
|
node: [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]]
|
|
19140
19140
|
};
|
|
19141
|
-
__iconData$
|
|
19142
|
-
const Check = createLucideIcon(__iconData$
|
|
19141
|
+
__iconData$z.node;
|
|
19142
|
+
const Check = createLucideIcon(__iconData$z);
|
|
19143
19143
|
|
|
19144
19144
|
/**
|
|
19145
19145
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19149,13 +19149,13 @@
|
|
|
19149
19149
|
*/
|
|
19150
19150
|
|
|
19151
19151
|
|
|
19152
|
-
const __iconData$
|
|
19152
|
+
const __iconData$y = {
|
|
19153
19153
|
name: "chevron-down",
|
|
19154
19154
|
size: 24,
|
|
19155
19155
|
node: [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]]
|
|
19156
19156
|
};
|
|
19157
|
-
__iconData$
|
|
19158
|
-
const ChevronDown = createLucideIcon(__iconData$
|
|
19157
|
+
__iconData$y.node;
|
|
19158
|
+
const ChevronDown = createLucideIcon(__iconData$y);
|
|
19159
19159
|
|
|
19160
19160
|
/**
|
|
19161
19161
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19165,13 +19165,13 @@
|
|
|
19165
19165
|
*/
|
|
19166
19166
|
|
|
19167
19167
|
|
|
19168
|
-
const __iconData$
|
|
19168
|
+
const __iconData$x = {
|
|
19169
19169
|
name: "chevron-left",
|
|
19170
19170
|
size: 24,
|
|
19171
19171
|
node: [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]]
|
|
19172
19172
|
};
|
|
19173
|
-
__iconData$
|
|
19174
|
-
const ChevronLeft = createLucideIcon(__iconData$
|
|
19173
|
+
__iconData$x.node;
|
|
19174
|
+
const ChevronLeft = createLucideIcon(__iconData$x);
|
|
19175
19175
|
|
|
19176
19176
|
/**
|
|
19177
19177
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19181,13 +19181,13 @@
|
|
|
19181
19181
|
*/
|
|
19182
19182
|
|
|
19183
19183
|
|
|
19184
|
-
const __iconData$
|
|
19184
|
+
const __iconData$w = {
|
|
19185
19185
|
name: "chevron-right",
|
|
19186
19186
|
size: 24,
|
|
19187
19187
|
node: [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]]
|
|
19188
19188
|
};
|
|
19189
|
-
__iconData$
|
|
19190
|
-
const ChevronRight = createLucideIcon(__iconData$
|
|
19189
|
+
__iconData$w.node;
|
|
19190
|
+
const ChevronRight = createLucideIcon(__iconData$w);
|
|
19191
19191
|
|
|
19192
19192
|
/**
|
|
19193
19193
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19197,13 +19197,13 @@
|
|
|
19197
19197
|
*/
|
|
19198
19198
|
|
|
19199
19199
|
|
|
19200
|
-
const __iconData$
|
|
19200
|
+
const __iconData$v = {
|
|
19201
19201
|
name: "chevron-up",
|
|
19202
19202
|
size: 24,
|
|
19203
19203
|
node: [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]]
|
|
19204
19204
|
};
|
|
19205
|
-
__iconData$
|
|
19206
|
-
const ChevronUp = createLucideIcon(__iconData$
|
|
19205
|
+
__iconData$v.node;
|
|
19206
|
+
const ChevronUp = createLucideIcon(__iconData$v);
|
|
19207
19207
|
|
|
19208
19208
|
/**
|
|
19209
19209
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19213,7 +19213,7 @@
|
|
|
19213
19213
|
*/
|
|
19214
19214
|
|
|
19215
19215
|
|
|
19216
|
-
const __iconData$
|
|
19216
|
+
const __iconData$u = {
|
|
19217
19217
|
name: "chevrons-down",
|
|
19218
19218
|
size: 24,
|
|
19219
19219
|
node: [
|
|
@@ -19221,8 +19221,8 @@
|
|
|
19221
19221
|
["path", { d: "m7 13 5 5 5-5", key: "1d48rs" }]
|
|
19222
19222
|
]
|
|
19223
19223
|
};
|
|
19224
|
-
__iconData$
|
|
19225
|
-
const ChevronsDown = createLucideIcon(__iconData$
|
|
19224
|
+
__iconData$u.node;
|
|
19225
|
+
const ChevronsDown = createLucideIcon(__iconData$u);
|
|
19226
19226
|
|
|
19227
19227
|
/**
|
|
19228
19228
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19232,7 +19232,7 @@
|
|
|
19232
19232
|
*/
|
|
19233
19233
|
|
|
19234
19234
|
|
|
19235
|
-
const __iconData$
|
|
19235
|
+
const __iconData$t = {
|
|
19236
19236
|
name: "chevrons-left",
|
|
19237
19237
|
size: 24,
|
|
19238
19238
|
node: [
|
|
@@ -19240,8 +19240,8 @@
|
|
|
19240
19240
|
["path", { d: "m18 17-5-5 5-5", key: "h8a8et" }]
|
|
19241
19241
|
]
|
|
19242
19242
|
};
|
|
19243
|
-
__iconData$
|
|
19244
|
-
const ChevronsLeft = createLucideIcon(__iconData$
|
|
19243
|
+
__iconData$t.node;
|
|
19244
|
+
const ChevronsLeft = createLucideIcon(__iconData$t);
|
|
19245
19245
|
|
|
19246
19246
|
/**
|
|
19247
19247
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19251,7 +19251,7 @@
|
|
|
19251
19251
|
*/
|
|
19252
19252
|
|
|
19253
19253
|
|
|
19254
|
-
const __iconData$
|
|
19254
|
+
const __iconData$s = {
|
|
19255
19255
|
name: "chevrons-right",
|
|
19256
19256
|
size: 24,
|
|
19257
19257
|
node: [
|
|
@@ -19259,8 +19259,8 @@
|
|
|
19259
19259
|
["path", { d: "m13 17 5-5-5-5", key: "17xmmf" }]
|
|
19260
19260
|
]
|
|
19261
19261
|
};
|
|
19262
|
-
__iconData$
|
|
19263
|
-
const ChevronsRight = createLucideIcon(__iconData$
|
|
19262
|
+
__iconData$s.node;
|
|
19263
|
+
const ChevronsRight = createLucideIcon(__iconData$s);
|
|
19264
19264
|
|
|
19265
19265
|
/**
|
|
19266
19266
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19270,7 +19270,7 @@
|
|
|
19270
19270
|
*/
|
|
19271
19271
|
|
|
19272
19272
|
|
|
19273
|
-
const __iconData$
|
|
19273
|
+
const __iconData$r = {
|
|
19274
19274
|
name: "circle-check",
|
|
19275
19275
|
size: 24,
|
|
19276
19276
|
node: [
|
|
@@ -19279,29 +19279,8 @@
|
|
|
19279
19279
|
],
|
|
19280
19280
|
aliases: ["check-circle-2"]
|
|
19281
19281
|
};
|
|
19282
|
-
__iconData$s.node;
|
|
19283
|
-
const CircleCheck = createLucideIcon(__iconData$s);
|
|
19284
|
-
|
|
19285
|
-
/**
|
|
19286
|
-
* @license lucide-react v1.44.0 - ISC
|
|
19287
|
-
*
|
|
19288
|
-
* This source code is licensed under the ISC license.
|
|
19289
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
19290
|
-
*/
|
|
19291
|
-
|
|
19292
|
-
|
|
19293
|
-
const __iconData$r = {
|
|
19294
|
-
name: "circle-user-round",
|
|
19295
|
-
size: 24,
|
|
19296
|
-
node: [
|
|
19297
|
-
["path", { d: "M17.925 20.056a6 6 0 0 0-11.851.001", key: "z69sun" }],
|
|
19298
|
-
["circle", { cx: "12", cy: "11", r: "4", key: "1gt34v" }],
|
|
19299
|
-
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]
|
|
19300
|
-
],
|
|
19301
|
-
aliases: ["user-circle-2"]
|
|
19302
|
-
};
|
|
19303
19282
|
__iconData$r.node;
|
|
19304
|
-
const
|
|
19283
|
+
const CircleCheck = createLucideIcon(__iconData$r);
|
|
19305
19284
|
|
|
19306
19285
|
/**
|
|
19307
19286
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19566,29 +19545,6 @@
|
|
|
19566
19545
|
|
|
19567
19546
|
|
|
19568
19547
|
const __iconData$e = {
|
|
19569
|
-
name: "languages",
|
|
19570
|
-
size: 24,
|
|
19571
|
-
node: [
|
|
19572
|
-
["path", { d: "m5 8 6 6", key: "1wu5hv" }],
|
|
19573
|
-
["path", { d: "m4 14 6-6 2-3", key: "1k1g8d" }],
|
|
19574
|
-
["path", { d: "M2 5h12", key: "or177f" }],
|
|
19575
|
-
["path", { d: "M7 2h1", key: "1t2jsx" }],
|
|
19576
|
-
["path", { d: "m22 22-5-10-5 10", key: "don7ne" }],
|
|
19577
|
-
["path", { d: "M14 18h6", key: "1m8k6r" }]
|
|
19578
|
-
]
|
|
19579
|
-
};
|
|
19580
|
-
__iconData$e.node;
|
|
19581
|
-
const Languages = createLucideIcon(__iconData$e);
|
|
19582
|
-
|
|
19583
|
-
/**
|
|
19584
|
-
* @license lucide-react v1.44.0 - ISC
|
|
19585
|
-
*
|
|
19586
|
-
* This source code is licensed under the ISC license.
|
|
19587
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
19588
|
-
*/
|
|
19589
|
-
|
|
19590
|
-
|
|
19591
|
-
const __iconData$d = {
|
|
19592
19548
|
name: "link",
|
|
19593
19549
|
size: 24,
|
|
19594
19550
|
node: [
|
|
@@ -19596,8 +19552,8 @@
|
|
|
19596
19552
|
["path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71", key: "19qd67" }]
|
|
19597
19553
|
]
|
|
19598
19554
|
};
|
|
19599
|
-
__iconData$
|
|
19600
|
-
const Link = createLucideIcon(__iconData$
|
|
19555
|
+
__iconData$e.node;
|
|
19556
|
+
const Link = createLucideIcon(__iconData$e);
|
|
19601
19557
|
|
|
19602
19558
|
/**
|
|
19603
19559
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19607,7 +19563,7 @@
|
|
|
19607
19563
|
*/
|
|
19608
19564
|
|
|
19609
19565
|
|
|
19610
|
-
const __iconData$
|
|
19566
|
+
const __iconData$d = {
|
|
19611
19567
|
name: "list",
|
|
19612
19568
|
size: 24,
|
|
19613
19569
|
node: [
|
|
@@ -19619,8 +19575,8 @@
|
|
|
19619
19575
|
["path", { d: "M8 19h13", key: "m83p4d" }]
|
|
19620
19576
|
]
|
|
19621
19577
|
};
|
|
19622
|
-
__iconData$
|
|
19623
|
-
const List$1 = createLucideIcon(__iconData$
|
|
19578
|
+
__iconData$d.node;
|
|
19579
|
+
const List$1 = createLucideIcon(__iconData$d);
|
|
19624
19580
|
|
|
19625
19581
|
/**
|
|
19626
19582
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19630,14 +19586,14 @@
|
|
|
19630
19586
|
*/
|
|
19631
19587
|
|
|
19632
19588
|
|
|
19633
|
-
const __iconData$
|
|
19589
|
+
const __iconData$c = {
|
|
19634
19590
|
name: "loader-circle",
|
|
19635
19591
|
size: 24,
|
|
19636
19592
|
node: [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]],
|
|
19637
19593
|
aliases: ["loader-2"]
|
|
19638
19594
|
};
|
|
19639
|
-
__iconData$
|
|
19640
|
-
const LoaderCircle = createLucideIcon(__iconData$
|
|
19595
|
+
__iconData$c.node;
|
|
19596
|
+
const LoaderCircle = createLucideIcon(__iconData$c);
|
|
19641
19597
|
|
|
19642
19598
|
/**
|
|
19643
19599
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19647,7 +19603,7 @@
|
|
|
19647
19603
|
*/
|
|
19648
19604
|
|
|
19649
19605
|
|
|
19650
|
-
const __iconData$
|
|
19606
|
+
const __iconData$b = {
|
|
19651
19607
|
name: "mail-plus",
|
|
19652
19608
|
size: 24,
|
|
19653
19609
|
node: [
|
|
@@ -19657,8 +19613,8 @@
|
|
|
19657
19613
|
["path", { d: "M16 19h6", key: "xwg31i" }]
|
|
19658
19614
|
]
|
|
19659
19615
|
};
|
|
19660
|
-
__iconData$
|
|
19661
|
-
const MailPlus = createLucideIcon(__iconData$
|
|
19616
|
+
__iconData$b.node;
|
|
19617
|
+
const MailPlus = createLucideIcon(__iconData$b);
|
|
19662
19618
|
|
|
19663
19619
|
/**
|
|
19664
19620
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19668,13 +19624,13 @@
|
|
|
19668
19624
|
*/
|
|
19669
19625
|
|
|
19670
19626
|
|
|
19671
|
-
const __iconData$
|
|
19627
|
+
const __iconData$a = {
|
|
19672
19628
|
name: "minus",
|
|
19673
19629
|
size: 24,
|
|
19674
19630
|
node: [["path", { d: "M5 12h14", key: "1ays0h" }]]
|
|
19675
19631
|
};
|
|
19676
|
-
__iconData$
|
|
19677
|
-
const Minus = createLucideIcon(__iconData$
|
|
19632
|
+
__iconData$a.node;
|
|
19633
|
+
const Minus = createLucideIcon(__iconData$a);
|
|
19678
19634
|
|
|
19679
19635
|
/**
|
|
19680
19636
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19684,7 +19640,7 @@
|
|
|
19684
19640
|
*/
|
|
19685
19641
|
|
|
19686
19642
|
|
|
19687
|
-
const __iconData$
|
|
19643
|
+
const __iconData$9 = {
|
|
19688
19644
|
name: "octagon-x",
|
|
19689
19645
|
size: 24,
|
|
19690
19646
|
node: [
|
|
@@ -19700,8 +19656,35 @@
|
|
|
19700
19656
|
],
|
|
19701
19657
|
aliases: ["x-octagon"]
|
|
19702
19658
|
};
|
|
19659
|
+
__iconData$9.node;
|
|
19660
|
+
const OctagonX = createLucideIcon(__iconData$9);
|
|
19661
|
+
|
|
19662
|
+
/**
|
|
19663
|
+
* @license lucide-react v1.44.0 - ISC
|
|
19664
|
+
*
|
|
19665
|
+
* This source code is licensed under the ISC license.
|
|
19666
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
19667
|
+
*/
|
|
19668
|
+
|
|
19669
|
+
|
|
19670
|
+
const __iconData$8 = {
|
|
19671
|
+
name: "refresh-cw-off",
|
|
19672
|
+
size: 24,
|
|
19673
|
+
node: [
|
|
19674
|
+
[
|
|
19675
|
+
"path",
|
|
19676
|
+
{ d: "M21 8L18.74 5.74A9.75 9.75 0 0 0 12 3C11 3 10.03 3.16 9.13 3.47", key: "1krf6h" }
|
|
19677
|
+
],
|
|
19678
|
+
["path", { d: "M8 16H3v5", key: "1cv678" }],
|
|
19679
|
+
["path", { d: "M3 12C3 9.51 4 7.26 5.64 5.64", key: "ruvoct" }],
|
|
19680
|
+
["path", { d: "m3 16 2.26 2.26A9.75 9.75 0 0 0 12 21c2.49 0 4.74-1 6.36-2.64", key: "19q130" }],
|
|
19681
|
+
["path", { d: "M21 12c0 1-.16 1.97-.47 2.87", key: "4w8emr" }],
|
|
19682
|
+
["path", { d: "M21 3v5h-5", key: "1q7to0" }],
|
|
19683
|
+
["path", { d: "M22 22 2 2", key: "1r8tn9" }]
|
|
19684
|
+
]
|
|
19685
|
+
};
|
|
19703
19686
|
__iconData$8.node;
|
|
19704
|
-
const
|
|
19687
|
+
const RefreshCwOff = createLucideIcon(__iconData$8);
|
|
19705
19688
|
|
|
19706
19689
|
/**
|
|
19707
19690
|
* @license lucide-react v1.44.0 - ISC
|
|
@@ -19773,443 +19756,127 @@
|
|
|
19773
19756
|
|
|
19774
19757
|
|
|
19775
19758
|
const __iconData$4 = {
|
|
19776
|
-
name: "settings",
|
|
19777
|
-
size: 24,
|
|
19778
|
-
node: [
|
|
19779
|
-
[
|
|
19780
|
-
"path",
|
|
19781
|
-
{
|
|
19782
|
-
d: "M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",
|
|
19783
|
-
key: "1i5ecw"
|
|
19784
|
-
}
|
|
19785
|
-
],
|
|
19786
|
-
["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
|
|
19787
|
-
]
|
|
19788
|
-
};
|
|
19789
|
-
__iconData$4.node;
|
|
19790
|
-
const Settings = createLucideIcon(__iconData$4);
|
|
19791
|
-
|
|
19792
|
-
/**
|
|
19793
|
-
* @license lucide-react v1.44.0 - ISC
|
|
19794
|
-
*
|
|
19795
|
-
* This source code is licensed under the ISC license.
|
|
19796
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
19797
|
-
*/
|
|
19798
|
-
|
|
19799
|
-
|
|
19800
|
-
const __iconData$3 = {
|
|
19801
|
-
name: "search",
|
|
19802
|
-
size: 24,
|
|
19803
|
-
node: [
|
|
19804
|
-
["path", { d: "m21 21-4.34-4.34", key: "14j7rj" }],
|
|
19805
|
-
["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }]
|
|
19806
|
-
]
|
|
19807
|
-
};
|
|
19808
|
-
__iconData$3.node;
|
|
19809
|
-
const Search = createLucideIcon(__iconData$3);
|
|
19810
|
-
|
|
19811
|
-
/**
|
|
19812
|
-
* @license lucide-react v1.44.0 - ISC
|
|
19813
|
-
*
|
|
19814
|
-
* This source code is licensed under the ISC license.
|
|
19815
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
19816
|
-
*/
|
|
19817
|
-
|
|
19818
|
-
|
|
19819
|
-
const __iconData$2 = {
|
|
19820
|
-
name: "trash",
|
|
19821
|
-
size: 24,
|
|
19822
|
-
node: [
|
|
19823
|
-
["path", { d: "M10 11v6", key: "nco0om" }],
|
|
19824
|
-
["path", { d: "M14 11v6", key: "outv1u" }],
|
|
19825
|
-
["path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6", key: "miytrc" }],
|
|
19826
|
-
["path", { d: "M3 6h18", key: "d0wm0j" }],
|
|
19827
|
-
["path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2", key: "e791ji" }]
|
|
19828
|
-
],
|
|
19829
|
-
aliases: ["trash-2"]
|
|
19830
|
-
};
|
|
19831
|
-
__iconData$2.node;
|
|
19832
|
-
const Trash = createLucideIcon(__iconData$2);
|
|
19833
|
-
|
|
19834
|
-
/**
|
|
19835
|
-
* @license lucide-react v1.44.0 - ISC
|
|
19836
|
-
*
|
|
19837
|
-
* This source code is licensed under the ISC license.
|
|
19838
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
19839
|
-
*/
|
|
19840
|
-
|
|
19841
|
-
|
|
19842
|
-
const __iconData$1 = {
|
|
19843
|
-
name: "triangle-alert",
|
|
19844
|
-
size: 24,
|
|
19845
|
-
node: [
|
|
19846
|
-
[
|
|
19847
|
-
"path",
|
|
19848
|
-
{
|
|
19849
|
-
d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",
|
|
19850
|
-
key: "wmoenq"
|
|
19851
|
-
}
|
|
19852
|
-
],
|
|
19853
|
-
["path", { d: "M12 9v4", key: "juzpu7" }],
|
|
19854
|
-
["path", { d: "M12 17h.01", key: "p32p05" }]
|
|
19855
|
-
],
|
|
19856
|
-
aliases: ["alert-triangle"]
|
|
19857
|
-
};
|
|
19858
|
-
__iconData$1.node;
|
|
19859
|
-
const TriangleAlert = createLucideIcon(__iconData$1);
|
|
19860
|
-
|
|
19861
|
-
/**
|
|
19862
|
-
* @license lucide-react v1.44.0 - ISC
|
|
19863
|
-
*
|
|
19864
|
-
* This source code is licensed under the ISC license.
|
|
19865
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
19866
|
-
*/
|
|
19867
|
-
|
|
19868
|
-
|
|
19869
|
-
const __iconData = {
|
|
19870
|
-
name: "x",
|
|
19871
|
-
size: 24,
|
|
19872
|
-
node: [
|
|
19873
|
-
["path", { d: "M18 6 6 18", key: "1bl5f8" }],
|
|
19874
|
-
["path", { d: "m6 6 12 12", key: "d8bk6v" }]
|
|
19875
|
-
]
|
|
19876
|
-
};
|
|
19877
|
-
__iconData.node;
|
|
19878
|
-
const X = createLucideIcon(__iconData);
|
|
19879
|
-
|
|
19880
|
-
const Toaster = ({ ...props }) => {
|
|
19881
|
-
const { theme = 'system' } = z();
|
|
19882
|
-
return (jsxRuntimeExports.jsx(Toaster$1, { theme: theme, position: "bottom-center", className: "toaster group", icons: {
|
|
19883
|
-
success: jsxRuntimeExports.jsx(CircleCheck, { className: "size-4" }),
|
|
19884
|
-
info: jsxRuntimeExports.jsx(Info, { className: "size-4" }),
|
|
19885
|
-
warning: jsxRuntimeExports.jsx(TriangleAlert, { className: "size-4" }),
|
|
19886
|
-
error: jsxRuntimeExports.jsx(OctagonX, { className: "size-4" }),
|
|
19887
|
-
loading: jsxRuntimeExports.jsx(LoaderCircle, { className: "size-4 animate-spin" }),
|
|
19888
|
-
}, style: {
|
|
19889
|
-
'--normal-bg': 'var(--popover)',
|
|
19890
|
-
'--normal-text': 'var(--popover-foreground)',
|
|
19891
|
-
'--normal-border': 'var(--border)',
|
|
19892
|
-
'--border-radius': 'var(--radius)',
|
|
19893
|
-
}, ...props }));
|
|
19894
|
-
};
|
|
19895
|
-
|
|
19896
|
-
const dependencyShowClassName = 'dependency-show';
|
|
19897
|
-
const dependencySelector = '[data-dependency]';
|
|
19898
|
-
const events = ['input', 'change'];
|
|
19899
|
-
function containsDependencyField(nodes) {
|
|
19900
|
-
return Array.from(nodes).some((node) => node instanceof Element &&
|
|
19901
|
-
(node.matches(dependencySelector) || Boolean(node.querySelector(dependencySelector))));
|
|
19902
|
-
}
|
|
19903
|
-
function useFieldDependencies(refreshKey) {
|
|
19904
|
-
const cleanupRef = reactExports.useRef(() => undefined);
|
|
19905
|
-
const refreshDependencies = reactExports.useCallback(() => {
|
|
19906
|
-
cleanupRef.current();
|
|
19907
|
-
cleanupRef.current = initializeFieldDependencies();
|
|
19908
|
-
}, []);
|
|
19909
|
-
reactExports.useEffect(() => {
|
|
19910
|
-
refreshDependencies();
|
|
19911
|
-
// Radix unmounts closed dialogs and inactive tab panels, so dependent fields
|
|
19912
|
-
// often mount long after this hook runs. Without rebinding they would keep
|
|
19913
|
-
// their initial hidden state forever, with no listeners on their sources.
|
|
19914
|
-
const observer = new MutationObserver((records) => {
|
|
19915
|
-
const touchesDependencies = records.some((record) => containsDependencyField(record.addedNodes) || containsDependencyField(record.removedNodes));
|
|
19916
|
-
if (touchesDependencies) {
|
|
19917
|
-
refreshDependencies();
|
|
19918
|
-
}
|
|
19919
|
-
});
|
|
19920
|
-
observer.observe(document.body, { childList: true, subtree: true });
|
|
19921
|
-
return () => {
|
|
19922
|
-
observer.disconnect();
|
|
19923
|
-
cleanupRef.current();
|
|
19924
|
-
cleanupRef.current = () => undefined;
|
|
19925
|
-
};
|
|
19926
|
-
}, [refreshDependencies, refreshKey]);
|
|
19927
|
-
return refreshDependencies;
|
|
19928
|
-
}
|
|
19929
|
-
function initializeFieldDependencies(root = document) {
|
|
19930
|
-
const cleanupCallbacks = [];
|
|
19931
|
-
const fields = Array.from(root.querySelectorAll(dependencySelector));
|
|
19932
|
-
fields.forEach((field) => {
|
|
19933
|
-
const dependency = field.dataset.dependency;
|
|
19934
|
-
if (!dependency) {
|
|
19935
|
-
return;
|
|
19936
|
-
}
|
|
19937
|
-
try {
|
|
19938
|
-
const conditions = JSON.parse(dependency);
|
|
19939
|
-
applyDependencyState(field, conditions);
|
|
19940
|
-
cleanupCallbacks.push(...bindDependencyListeners(field, conditions));
|
|
19941
|
-
}
|
|
19942
|
-
catch (e) {
|
|
19943
|
-
console.error('[Dependencies] Error parsing conditions for field:', field, e);
|
|
19944
|
-
}
|
|
19945
|
-
});
|
|
19946
|
-
return () => {
|
|
19947
|
-
cleanupCallbacks.forEach((cleanup) => cleanup());
|
|
19948
|
-
};
|
|
19949
|
-
}
|
|
19950
|
-
function bindDependencyListeners(field, conditions) {
|
|
19951
|
-
const cleanupCallbacks = [];
|
|
19952
|
-
conditions.forEach((rules) => {
|
|
19953
|
-
Object.keys(rules).forEach((selector) => {
|
|
19954
|
-
const element = document.querySelector(selector);
|
|
19955
|
-
if (!element) {
|
|
19956
|
-
return;
|
|
19957
|
-
}
|
|
19958
|
-
// Toggle controls never emit input/change; aria-checked is the only
|
|
19959
|
-
// signal, and watching it also catches programmatic updates.
|
|
19960
|
-
if (isToggleControl(element)) {
|
|
19961
|
-
const observer = new MutationObserver(() => applyDependencyState(field, conditions));
|
|
19962
|
-
observer.observe(element, { attributes: true, attributeFilter: ['aria-checked'] });
|
|
19963
|
-
cleanupCallbacks.push(() => observer.disconnect());
|
|
19964
|
-
return;
|
|
19965
|
-
}
|
|
19966
|
-
events.forEach((event) => {
|
|
19967
|
-
const listener = () => applyDependencyState(field, conditions);
|
|
19968
|
-
element.addEventListener(event, listener);
|
|
19969
|
-
cleanupCallbacks.push(() => element.removeEventListener(event, listener));
|
|
19970
|
-
});
|
|
19971
|
-
});
|
|
19972
|
-
});
|
|
19973
|
-
return cleanupCallbacks;
|
|
19974
|
-
}
|
|
19975
|
-
function applyDependencyState(field, conditions) {
|
|
19976
|
-
if (checkConditions(conditions)) {
|
|
19977
|
-
field.classList.add(dependencyShowClassName);
|
|
19978
|
-
}
|
|
19979
|
-
else {
|
|
19980
|
-
field.classList.remove(dependencyShowClassName);
|
|
19981
|
-
}
|
|
19982
|
-
}
|
|
19983
|
-
function checkConditions(conditions) {
|
|
19984
|
-
return conditions.every((conditionObj) => {
|
|
19985
|
-
const selectors = Object.keys(conditionObj);
|
|
19986
|
-
return selectors.every((selector) => evaluateDependencyRule(selector, conditionObj[selector]));
|
|
19987
|
-
});
|
|
19988
|
-
}
|
|
19989
|
-
function evaluateDependencyRule(selector, condition) {
|
|
19990
|
-
const type = condition.type;
|
|
19991
|
-
const currentValue = getValue(selector);
|
|
19992
|
-
const checkValue = typeof condition.value === 'undefined' ? false : condition.value;
|
|
19993
|
-
let minValue = typeof condition.min === 'undefined' ? false : Number.parseInt(String(condition.min), 10);
|
|
19994
|
-
let maxValue = typeof condition.max === 'undefined' ? false : Number.parseInt(String(condition.max), 10);
|
|
19995
|
-
const allowEmpty = typeof condition.empty === 'undefined' ? false : condition.empty;
|
|
19996
|
-
const isEmpty = !allowEmpty && currentValue.length < 1;
|
|
19997
|
-
const likeSelector = typeof condition.like === 'undefined' ? false : condition.like;
|
|
19998
|
-
const likeSelectorValue = getValue(likeSelector);
|
|
19999
|
-
const regExpPattern = typeof condition.pattern === 'undefined' ? false : condition.pattern;
|
|
20000
|
-
const regExpModifier = typeof condition.modifier === 'undefined' ? 'gi' : condition.modifier;
|
|
20001
|
-
const sign = typeof condition.sign === 'undefined' ? false : condition.sign;
|
|
20002
|
-
const strict = typeof condition.strict === 'undefined' ? false : condition.strict;
|
|
20003
|
-
const emptyTypes = ['empty', 'blank'];
|
|
20004
|
-
const notEmptyTypes = ['!empty', 'notEmpty', 'not-empty', 'notempty'];
|
|
20005
|
-
const equalTypes = ['equal', '=', '==', '==='];
|
|
20006
|
-
const notEqualTypes = ['!equal', '!=', '!==', '!===', 'notEqual', 'not-equal', 'notequal'];
|
|
20007
|
-
const regularExpressionTypes = ['regexp', 'exp', 'expression', 'match'];
|
|
20008
|
-
if (type && emptyTypes.includes(type)) {
|
|
20009
|
-
return currentValue.length < 1;
|
|
20010
|
-
}
|
|
20011
|
-
if (type && notEmptyTypes.includes(type)) {
|
|
20012
|
-
return currentValue.length > 0;
|
|
20013
|
-
}
|
|
20014
|
-
if (type && equalTypes.includes(type)) {
|
|
20015
|
-
if (isEmpty) {
|
|
20016
|
-
return false;
|
|
20017
|
-
}
|
|
20018
|
-
if (likeSelector) {
|
|
20019
|
-
return strict
|
|
20020
|
-
? likeSelectorValue.every((value) => currentValue.includes(value))
|
|
20021
|
-
: likeSelectorValue.some((value) => currentValue.includes(value));
|
|
20022
|
-
}
|
|
20023
|
-
if (strict) {
|
|
20024
|
-
if (checkValue && Array.isArray(checkValue)) {
|
|
20025
|
-
return checkValue.every((value) => currentValue.includes(value));
|
|
20026
|
-
}
|
|
20027
|
-
if (checkValue && !Array.isArray(checkValue)) {
|
|
20028
|
-
return currentValue.includes(checkValue);
|
|
20029
|
-
}
|
|
20030
|
-
}
|
|
20031
|
-
else {
|
|
20032
|
-
if (checkValue && Array.isArray(checkValue)) {
|
|
20033
|
-
return checkValue.some((value) => currentValue.includes(value));
|
|
20034
|
-
}
|
|
20035
|
-
if (checkValue && !Array.isArray(checkValue)) {
|
|
20036
|
-
return currentValue.includes(checkValue);
|
|
20037
|
-
}
|
|
20038
|
-
}
|
|
20039
|
-
}
|
|
20040
|
-
if (type && notEqualTypes.includes(type)) {
|
|
20041
|
-
if (isEmpty) {
|
|
20042
|
-
return false;
|
|
20043
|
-
}
|
|
20044
|
-
if (likeSelector) {
|
|
20045
|
-
return strict
|
|
20046
|
-
? likeSelectorValue.every((value) => !currentValue.includes(value))
|
|
20047
|
-
: likeSelectorValue.some((value) => !currentValue.includes(value));
|
|
20048
|
-
}
|
|
20049
|
-
if (strict) {
|
|
20050
|
-
if (checkValue && Array.isArray(checkValue)) {
|
|
20051
|
-
return checkValue.every((value) => !currentValue.includes(value));
|
|
20052
|
-
}
|
|
20053
|
-
if (checkValue && !Array.isArray(checkValue)) {
|
|
20054
|
-
return !currentValue.includes(checkValue);
|
|
20055
|
-
}
|
|
20056
|
-
}
|
|
20057
|
-
else {
|
|
20058
|
-
if (checkValue && Array.isArray(checkValue)) {
|
|
20059
|
-
return checkValue.some((value) => !currentValue.includes(value));
|
|
20060
|
-
}
|
|
20061
|
-
if (checkValue && !Array.isArray(checkValue)) {
|
|
20062
|
-
return !currentValue.includes(checkValue);
|
|
20063
|
-
}
|
|
20064
|
-
}
|
|
20065
|
-
}
|
|
20066
|
-
if (type && regularExpressionTypes.includes(type) && regExpPattern) {
|
|
20067
|
-
if (isEmpty) {
|
|
20068
|
-
return false;
|
|
20069
|
-
}
|
|
20070
|
-
const exp = new RegExp(regExpPattern, regExpModifier);
|
|
20071
|
-
return currentValue.every((value) => exp.test(String(value)));
|
|
20072
|
-
}
|
|
20073
|
-
if (type === 'length') {
|
|
20074
|
-
if (isEmpty) {
|
|
20075
|
-
return false;
|
|
20076
|
-
}
|
|
20077
|
-
if (checkValue && Array.isArray(checkValue)) {
|
|
20078
|
-
minValue = Number.parseInt(String(checkValue[0]), 10);
|
|
20079
|
-
maxValue = typeof checkValue[1] === 'undefined' ? false : Number.parseInt(String(checkValue[1]), 10);
|
|
20080
|
-
}
|
|
20081
|
-
if (checkValue && !Array.isArray(checkValue)) {
|
|
20082
|
-
minValue = Number.parseInt(String(checkValue), 10);
|
|
20083
|
-
maxValue = false;
|
|
20084
|
-
}
|
|
20085
|
-
const minBoundary = minValue === false ? 0 : minValue;
|
|
20086
|
-
const maxBoundary = maxValue === false ? 0 : maxValue;
|
|
20087
|
-
return currentValue.every((value) => {
|
|
20088
|
-
const valueLength = String(value).length;
|
|
20089
|
-
if (!maxValue) {
|
|
20090
|
-
return valueLength >= minBoundary;
|
|
20091
|
-
}
|
|
20092
|
-
if (!minValue) {
|
|
20093
|
-
return valueLength <= maxBoundary;
|
|
20094
|
-
}
|
|
20095
|
-
return valueLength >= minBoundary && valueLength <= maxBoundary;
|
|
20096
|
-
});
|
|
20097
|
-
}
|
|
20098
|
-
if (type === 'range') {
|
|
20099
|
-
if (isEmpty) {
|
|
20100
|
-
return false;
|
|
20101
|
-
}
|
|
20102
|
-
if (checkValue && Array.isArray(checkValue)) {
|
|
20103
|
-
minValue = Number.parseInt(String(checkValue[0]), 10);
|
|
20104
|
-
maxValue = typeof checkValue[1] === 'undefined' ? false : Number.parseInt(String(checkValue[1]), 10);
|
|
20105
|
-
}
|
|
20106
|
-
const minBoundary = minValue === false ? 0 : minValue;
|
|
20107
|
-
const maxBoundary = maxValue === false ? 0 : maxValue;
|
|
20108
|
-
return currentValue.every((value) => {
|
|
20109
|
-
const numericValue = Number.parseInt(String(value), 10);
|
|
20110
|
-
if (!maxValue) {
|
|
20111
|
-
return numericValue > minBoundary;
|
|
20112
|
-
}
|
|
20113
|
-
if (!minValue) {
|
|
20114
|
-
return numericValue < maxBoundary;
|
|
20115
|
-
}
|
|
20116
|
-
return numericValue > minBoundary && numericValue < maxBoundary;
|
|
20117
|
-
});
|
|
20118
|
-
}
|
|
20119
|
-
if (type === 'compare' && sign && checkValue) {
|
|
20120
|
-
if (isEmpty) {
|
|
20121
|
-
return false;
|
|
20122
|
-
}
|
|
20123
|
-
const numericCheckValue = Number.parseInt(String(checkValue), 10);
|
|
20124
|
-
switch (sign) {
|
|
20125
|
-
case '<':
|
|
20126
|
-
return currentValue.every((value) => Number.parseInt(String(value), 10) < numericCheckValue);
|
|
20127
|
-
case '<=':
|
|
20128
|
-
return currentValue.every((value) => Number.parseInt(String(value), 10) <= numericCheckValue);
|
|
20129
|
-
case '>':
|
|
20130
|
-
return currentValue.every((value) => Number.parseInt(String(value), 10) > numericCheckValue);
|
|
20131
|
-
case '>=':
|
|
20132
|
-
return currentValue.every((value) => Number.parseInt(String(value), 10) >= numericCheckValue);
|
|
20133
|
-
case '=':
|
|
20134
|
-
case '==':
|
|
20135
|
-
return currentValue.every((value) => Number.parseInt(String(value), 10) === numericCheckValue);
|
|
20136
|
-
}
|
|
20137
|
-
}
|
|
20138
|
-
return false;
|
|
20139
|
-
}
|
|
20140
|
-
// shadcn checkboxes and switches render as <button role="checkbox|switch">, which
|
|
20141
|
-
// carries a static value="on" - the checked state only lives in aria-checked.
|
|
20142
|
-
function isToggleControl(element) {
|
|
20143
|
-
const role = element.getAttribute('role');
|
|
20144
|
-
return role === 'checkbox' || role === 'switch';
|
|
20145
|
-
}
|
|
20146
|
-
function readElementValue(element) {
|
|
20147
|
-
if (isToggleControl(element)) {
|
|
20148
|
-
return element.getAttribute('aria-checked') === 'true';
|
|
20149
|
-
}
|
|
20150
|
-
if (element instanceof HTMLInputElement && element.type === 'checkbox') {
|
|
20151
|
-
return element.checked;
|
|
20152
|
-
}
|
|
20153
|
-
return element.value;
|
|
20154
|
-
}
|
|
20155
|
-
function getValue(selector) {
|
|
20156
|
-
const values = [];
|
|
20157
|
-
const element = selector ? document.querySelector(selector) : null;
|
|
20158
|
-
if (selector && element) {
|
|
20159
|
-
const inputType = element.tagName.toLowerCase();
|
|
20160
|
-
let currentSelector = selector;
|
|
20161
|
-
if (inputType === 'select') {
|
|
20162
|
-
currentSelector = `${selector} option:checked`;
|
|
20163
|
-
}
|
|
20164
|
-
document.querySelectorAll(currentSelector).forEach((match) => {
|
|
20165
|
-
values.push(readElementValue(match));
|
|
20166
|
-
});
|
|
20167
|
-
}
|
|
20168
|
-
return values.filter((value) => value !== '');
|
|
20169
|
-
}
|
|
19759
|
+
name: "settings",
|
|
19760
|
+
size: 24,
|
|
19761
|
+
node: [
|
|
19762
|
+
[
|
|
19763
|
+
"path",
|
|
19764
|
+
{
|
|
19765
|
+
d: "M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",
|
|
19766
|
+
key: "1i5ecw"
|
|
19767
|
+
}
|
|
19768
|
+
],
|
|
19769
|
+
["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
|
|
19770
|
+
]
|
|
19771
|
+
};
|
|
19772
|
+
__iconData$4.node;
|
|
19773
|
+
const Settings = createLucideIcon(__iconData$4);
|
|
20170
19774
|
|
|
20171
|
-
|
|
19775
|
+
/**
|
|
19776
|
+
* @license lucide-react v1.44.0 - ISC
|
|
19777
|
+
*
|
|
19778
|
+
* This source code is licensed under the ISC license.
|
|
19779
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
19780
|
+
*/
|
|
20172
19781
|
|
|
20173
|
-
|
|
20174
|
-
const
|
|
20175
|
-
|
|
20176
|
-
|
|
20177
|
-
|
|
20178
|
-
|
|
20179
|
-
|
|
20180
|
-
|
|
20181
|
-
|
|
20182
|
-
|
|
20183
|
-
|
|
20184
|
-
|
|
20185
|
-
|
|
20186
|
-
|
|
20187
|
-
|
|
20188
|
-
|
|
20189
|
-
|
|
20190
|
-
|
|
20191
|
-
|
|
20192
|
-
|
|
20193
|
-
|
|
20194
|
-
|
|
20195
|
-
|
|
20196
|
-
|
|
20197
|
-
|
|
20198
|
-
|
|
20199
|
-
|
|
20200
|
-
|
|
20201
|
-
|
|
20202
|
-
|
|
20203
|
-
|
|
20204
|
-
|
|
20205
|
-
|
|
20206
|
-
|
|
20207
|
-
|
|
20208
|
-
|
|
20209
|
-
|
|
20210
|
-
|
|
20211
|
-
|
|
20212
|
-
|
|
19782
|
+
|
|
19783
|
+
const __iconData$3 = {
|
|
19784
|
+
name: "search",
|
|
19785
|
+
size: 24,
|
|
19786
|
+
node: [
|
|
19787
|
+
["path", { d: "m21 21-4.34-4.34", key: "14j7rj" }],
|
|
19788
|
+
["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }]
|
|
19789
|
+
]
|
|
19790
|
+
};
|
|
19791
|
+
__iconData$3.node;
|
|
19792
|
+
const Search = createLucideIcon(__iconData$3);
|
|
19793
|
+
|
|
19794
|
+
/**
|
|
19795
|
+
* @license lucide-react v1.44.0 - ISC
|
|
19796
|
+
*
|
|
19797
|
+
* This source code is licensed under the ISC license.
|
|
19798
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
19799
|
+
*/
|
|
19800
|
+
|
|
19801
|
+
|
|
19802
|
+
const __iconData$2 = {
|
|
19803
|
+
name: "trash",
|
|
19804
|
+
size: 24,
|
|
19805
|
+
node: [
|
|
19806
|
+
["path", { d: "M10 11v6", key: "nco0om" }],
|
|
19807
|
+
["path", { d: "M14 11v6", key: "outv1u" }],
|
|
19808
|
+
["path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6", key: "miytrc" }],
|
|
19809
|
+
["path", { d: "M3 6h18", key: "d0wm0j" }],
|
|
19810
|
+
["path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2", key: "e791ji" }]
|
|
19811
|
+
],
|
|
19812
|
+
aliases: ["trash-2"]
|
|
19813
|
+
};
|
|
19814
|
+
__iconData$2.node;
|
|
19815
|
+
const Trash = createLucideIcon(__iconData$2);
|
|
19816
|
+
|
|
19817
|
+
/**
|
|
19818
|
+
* @license lucide-react v1.44.0 - ISC
|
|
19819
|
+
*
|
|
19820
|
+
* This source code is licensed under the ISC license.
|
|
19821
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
19822
|
+
*/
|
|
19823
|
+
|
|
19824
|
+
|
|
19825
|
+
const __iconData$1 = {
|
|
19826
|
+
name: "triangle-alert",
|
|
19827
|
+
size: 24,
|
|
19828
|
+
node: [
|
|
19829
|
+
[
|
|
19830
|
+
"path",
|
|
19831
|
+
{
|
|
19832
|
+
d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",
|
|
19833
|
+
key: "wmoenq"
|
|
19834
|
+
}
|
|
19835
|
+
],
|
|
19836
|
+
["path", { d: "M12 9v4", key: "juzpu7" }],
|
|
19837
|
+
["path", { d: "M12 17h.01", key: "p32p05" }]
|
|
19838
|
+
],
|
|
19839
|
+
aliases: ["alert-triangle"]
|
|
19840
|
+
};
|
|
19841
|
+
__iconData$1.node;
|
|
19842
|
+
const TriangleAlert = createLucideIcon(__iconData$1);
|
|
19843
|
+
|
|
19844
|
+
/**
|
|
19845
|
+
* @license lucide-react v1.44.0 - ISC
|
|
19846
|
+
*
|
|
19847
|
+
* This source code is licensed under the ISC license.
|
|
19848
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
19849
|
+
*/
|
|
19850
|
+
|
|
19851
|
+
|
|
19852
|
+
const __iconData = {
|
|
19853
|
+
name: "x",
|
|
19854
|
+
size: 24,
|
|
19855
|
+
node: [
|
|
19856
|
+
["path", { d: "M18 6 6 18", key: "1bl5f8" }],
|
|
19857
|
+
["path", { d: "m6 6 12 12", key: "d8bk6v" }]
|
|
19858
|
+
]
|
|
19859
|
+
};
|
|
19860
|
+
__iconData.node;
|
|
19861
|
+
const X = createLucideIcon(__iconData);
|
|
19862
|
+
|
|
19863
|
+
const Toaster = ({ ...props }) => {
|
|
19864
|
+
const { theme = 'system' } = z();
|
|
19865
|
+
return (jsxRuntimeExports.jsx(Toaster$1, { theme: theme, position: "bottom-center", className: "toaster group", icons: {
|
|
19866
|
+
success: jsxRuntimeExports.jsx(CircleCheck, { className: "size-4" }),
|
|
19867
|
+
info: jsxRuntimeExports.jsx(Info, { className: "size-4" }),
|
|
19868
|
+
warning: jsxRuntimeExports.jsx(TriangleAlert, { className: "size-4" }),
|
|
19869
|
+
error: jsxRuntimeExports.jsx(OctagonX, { className: "size-4" }),
|
|
19870
|
+
loading: jsxRuntimeExports.jsx(LoaderCircle, { className: "size-4 animate-spin" }),
|
|
19871
|
+
}, style: {
|
|
19872
|
+
'--normal-bg': 'var(--popover)',
|
|
19873
|
+
'--normal-text': 'var(--popover-foreground)',
|
|
19874
|
+
'--normal-border': 'var(--border)',
|
|
19875
|
+
'--border-radius': 'var(--radius)',
|
|
19876
|
+
}, ...props }));
|
|
19877
|
+
};
|
|
19878
|
+
|
|
19879
|
+
function r(e){var t,f,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f);}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}
|
|
20213
19880
|
|
|
20214
19881
|
/**
|
|
20215
19882
|
* Concatenates two arrays faster than the array spread operator.
|
|
@@ -23494,6 +23161,322 @@
|
|
|
23494
23161
|
return twMerge(clsx(inputs));
|
|
23495
23162
|
}
|
|
23496
23163
|
|
|
23164
|
+
const dependencyShowClassName = 'dependency-show';
|
|
23165
|
+
const dependencySelector = '[data-dependency]';
|
|
23166
|
+
const events = ['input', 'change'];
|
|
23167
|
+
function containsDependencyField(nodes) {
|
|
23168
|
+
return Array.from(nodes).some((node) => node instanceof Element &&
|
|
23169
|
+
(node.matches(dependencySelector) || Boolean(node.querySelector(dependencySelector))));
|
|
23170
|
+
}
|
|
23171
|
+
function useFieldDependencies(refreshKey) {
|
|
23172
|
+
const cleanupRef = reactExports.useRef(() => undefined);
|
|
23173
|
+
const refreshDependencies = reactExports.useCallback(() => {
|
|
23174
|
+
cleanupRef.current();
|
|
23175
|
+
cleanupRef.current = initializeFieldDependencies();
|
|
23176
|
+
}, []);
|
|
23177
|
+
reactExports.useEffect(() => {
|
|
23178
|
+
refreshDependencies();
|
|
23179
|
+
// Radix unmounts closed dialogs and inactive tab panels, so dependent fields
|
|
23180
|
+
// often mount long after this hook runs. Without rebinding they would keep
|
|
23181
|
+
// their initial hidden state forever, with no listeners on their sources.
|
|
23182
|
+
const observer = new MutationObserver((records) => {
|
|
23183
|
+
const touchesDependencies = records.some((record) => containsDependencyField(record.addedNodes) || containsDependencyField(record.removedNodes));
|
|
23184
|
+
if (touchesDependencies) {
|
|
23185
|
+
refreshDependencies();
|
|
23186
|
+
}
|
|
23187
|
+
});
|
|
23188
|
+
observer.observe(document.body, { childList: true, subtree: true });
|
|
23189
|
+
return () => {
|
|
23190
|
+
observer.disconnect();
|
|
23191
|
+
cleanupRef.current();
|
|
23192
|
+
cleanupRef.current = () => undefined;
|
|
23193
|
+
};
|
|
23194
|
+
}, [refreshDependencies, refreshKey]);
|
|
23195
|
+
return refreshDependencies;
|
|
23196
|
+
}
|
|
23197
|
+
function initializeFieldDependencies(root = document) {
|
|
23198
|
+
const cleanupCallbacks = [];
|
|
23199
|
+
const fields = Array.from(root.querySelectorAll(dependencySelector));
|
|
23200
|
+
fields.forEach((field) => {
|
|
23201
|
+
const dependency = field.dataset.dependency;
|
|
23202
|
+
if (!dependency) {
|
|
23203
|
+
return;
|
|
23204
|
+
}
|
|
23205
|
+
try {
|
|
23206
|
+
const conditions = JSON.parse(dependency);
|
|
23207
|
+
applyDependencyState(field, conditions);
|
|
23208
|
+
cleanupCallbacks.push(...bindDependencyListeners(field, conditions));
|
|
23209
|
+
}
|
|
23210
|
+
catch (e) {
|
|
23211
|
+
console.error('[Dependencies] Error parsing conditions for field:', field, e);
|
|
23212
|
+
}
|
|
23213
|
+
});
|
|
23214
|
+
return () => {
|
|
23215
|
+
cleanupCallbacks.forEach((cleanup) => cleanup());
|
|
23216
|
+
};
|
|
23217
|
+
}
|
|
23218
|
+
function bindDependencyListeners(field, conditions) {
|
|
23219
|
+
const cleanupCallbacks = [];
|
|
23220
|
+
conditions.forEach((rules) => {
|
|
23221
|
+
Object.keys(rules).forEach((selector) => {
|
|
23222
|
+
const element = document.querySelector(selector);
|
|
23223
|
+
if (!element) {
|
|
23224
|
+
return;
|
|
23225
|
+
}
|
|
23226
|
+
// Toggle controls never emit input/change; aria-checked is the only
|
|
23227
|
+
// signal, and watching it also catches programmatic updates.
|
|
23228
|
+
if (isToggleControl(element)) {
|
|
23229
|
+
const observer = new MutationObserver(() => applyDependencyState(field, conditions));
|
|
23230
|
+
observer.observe(element, { attributes: true, attributeFilter: ['aria-checked'] });
|
|
23231
|
+
cleanupCallbacks.push(() => observer.disconnect());
|
|
23232
|
+
return;
|
|
23233
|
+
}
|
|
23234
|
+
events.forEach((event) => {
|
|
23235
|
+
const listener = () => applyDependencyState(field, conditions);
|
|
23236
|
+
element.addEventListener(event, listener);
|
|
23237
|
+
cleanupCallbacks.push(() => element.removeEventListener(event, listener));
|
|
23238
|
+
});
|
|
23239
|
+
});
|
|
23240
|
+
});
|
|
23241
|
+
return cleanupCallbacks;
|
|
23242
|
+
}
|
|
23243
|
+
function applyDependencyState(field, conditions) {
|
|
23244
|
+
if (checkConditions(conditions)) {
|
|
23245
|
+
field.classList.add(dependencyShowClassName);
|
|
23246
|
+
}
|
|
23247
|
+
else {
|
|
23248
|
+
field.classList.remove(dependencyShowClassName);
|
|
23249
|
+
}
|
|
23250
|
+
}
|
|
23251
|
+
function checkConditions(conditions) {
|
|
23252
|
+
return conditions.every((conditionObj) => {
|
|
23253
|
+
const selectors = Object.keys(conditionObj);
|
|
23254
|
+
return selectors.every((selector) => evaluateDependencyRule(selector, conditionObj[selector]));
|
|
23255
|
+
});
|
|
23256
|
+
}
|
|
23257
|
+
function evaluateDependencyRule(selector, condition) {
|
|
23258
|
+
const type = condition.type;
|
|
23259
|
+
const currentValue = getValue(selector);
|
|
23260
|
+
const checkValue = typeof condition.value === 'undefined' ? false : condition.value;
|
|
23261
|
+
let minValue = typeof condition.min === 'undefined' ? false : Number.parseInt(String(condition.min), 10);
|
|
23262
|
+
let maxValue = typeof condition.max === 'undefined' ? false : Number.parseInt(String(condition.max), 10);
|
|
23263
|
+
const allowEmpty = typeof condition.empty === 'undefined' ? false : condition.empty;
|
|
23264
|
+
const isEmpty = !allowEmpty && currentValue.length < 1;
|
|
23265
|
+
const likeSelector = typeof condition.like === 'undefined' ? false : condition.like;
|
|
23266
|
+
const likeSelectorValue = getValue(likeSelector);
|
|
23267
|
+
const regExpPattern = typeof condition.pattern === 'undefined' ? false : condition.pattern;
|
|
23268
|
+
const regExpModifier = typeof condition.modifier === 'undefined' ? 'gi' : condition.modifier;
|
|
23269
|
+
const sign = typeof condition.sign === 'undefined' ? false : condition.sign;
|
|
23270
|
+
const strict = typeof condition.strict === 'undefined' ? false : condition.strict;
|
|
23271
|
+
const emptyTypes = ['empty', 'blank'];
|
|
23272
|
+
const notEmptyTypes = ['!empty', 'notEmpty', 'not-empty', 'notempty'];
|
|
23273
|
+
const equalTypes = ['equal', '=', '==', '==='];
|
|
23274
|
+
const notEqualTypes = ['!equal', '!=', '!==', '!===', 'notEqual', 'not-equal', 'notequal'];
|
|
23275
|
+
const regularExpressionTypes = ['regexp', 'exp', 'expression', 'match'];
|
|
23276
|
+
if (type && emptyTypes.includes(type)) {
|
|
23277
|
+
return currentValue.length < 1;
|
|
23278
|
+
}
|
|
23279
|
+
if (type && notEmptyTypes.includes(type)) {
|
|
23280
|
+
return currentValue.length > 0;
|
|
23281
|
+
}
|
|
23282
|
+
if (type && equalTypes.includes(type)) {
|
|
23283
|
+
if (isEmpty) {
|
|
23284
|
+
return false;
|
|
23285
|
+
}
|
|
23286
|
+
if (likeSelector) {
|
|
23287
|
+
return strict
|
|
23288
|
+
? likeSelectorValue.every((value) => currentValue.includes(value))
|
|
23289
|
+
: likeSelectorValue.some((value) => currentValue.includes(value));
|
|
23290
|
+
}
|
|
23291
|
+
if (strict) {
|
|
23292
|
+
if (checkValue && Array.isArray(checkValue)) {
|
|
23293
|
+
return checkValue.every((value) => currentValue.includes(value));
|
|
23294
|
+
}
|
|
23295
|
+
if (checkValue && !Array.isArray(checkValue)) {
|
|
23296
|
+
return currentValue.includes(checkValue);
|
|
23297
|
+
}
|
|
23298
|
+
}
|
|
23299
|
+
else {
|
|
23300
|
+
if (checkValue && Array.isArray(checkValue)) {
|
|
23301
|
+
return checkValue.some((value) => currentValue.includes(value));
|
|
23302
|
+
}
|
|
23303
|
+
if (checkValue && !Array.isArray(checkValue)) {
|
|
23304
|
+
return currentValue.includes(checkValue);
|
|
23305
|
+
}
|
|
23306
|
+
}
|
|
23307
|
+
}
|
|
23308
|
+
if (type && notEqualTypes.includes(type)) {
|
|
23309
|
+
if (isEmpty) {
|
|
23310
|
+
return false;
|
|
23311
|
+
}
|
|
23312
|
+
if (likeSelector) {
|
|
23313
|
+
return strict
|
|
23314
|
+
? likeSelectorValue.every((value) => !currentValue.includes(value))
|
|
23315
|
+
: likeSelectorValue.some((value) => !currentValue.includes(value));
|
|
23316
|
+
}
|
|
23317
|
+
if (strict) {
|
|
23318
|
+
if (checkValue && Array.isArray(checkValue)) {
|
|
23319
|
+
return checkValue.every((value) => !currentValue.includes(value));
|
|
23320
|
+
}
|
|
23321
|
+
if (checkValue && !Array.isArray(checkValue)) {
|
|
23322
|
+
return !currentValue.includes(checkValue);
|
|
23323
|
+
}
|
|
23324
|
+
}
|
|
23325
|
+
else {
|
|
23326
|
+
if (checkValue && Array.isArray(checkValue)) {
|
|
23327
|
+
return checkValue.some((value) => !currentValue.includes(value));
|
|
23328
|
+
}
|
|
23329
|
+
if (checkValue && !Array.isArray(checkValue)) {
|
|
23330
|
+
return !currentValue.includes(checkValue);
|
|
23331
|
+
}
|
|
23332
|
+
}
|
|
23333
|
+
}
|
|
23334
|
+
if (type && regularExpressionTypes.includes(type) && regExpPattern) {
|
|
23335
|
+
if (isEmpty) {
|
|
23336
|
+
return false;
|
|
23337
|
+
}
|
|
23338
|
+
const exp = new RegExp(regExpPattern, regExpModifier);
|
|
23339
|
+
return currentValue.every((value) => exp.test(String(value)));
|
|
23340
|
+
}
|
|
23341
|
+
if (type === 'length') {
|
|
23342
|
+
if (isEmpty) {
|
|
23343
|
+
return false;
|
|
23344
|
+
}
|
|
23345
|
+
if (checkValue && Array.isArray(checkValue)) {
|
|
23346
|
+
minValue = Number.parseInt(String(checkValue[0]), 10);
|
|
23347
|
+
maxValue = typeof checkValue[1] === 'undefined' ? false : Number.parseInt(String(checkValue[1]), 10);
|
|
23348
|
+
}
|
|
23349
|
+
if (checkValue && !Array.isArray(checkValue)) {
|
|
23350
|
+
minValue = Number.parseInt(String(checkValue), 10);
|
|
23351
|
+
maxValue = false;
|
|
23352
|
+
}
|
|
23353
|
+
const minBoundary = minValue === false ? 0 : minValue;
|
|
23354
|
+
const maxBoundary = maxValue === false ? 0 : maxValue;
|
|
23355
|
+
return currentValue.every((value) => {
|
|
23356
|
+
const valueLength = String(value).length;
|
|
23357
|
+
if (!maxValue) {
|
|
23358
|
+
return valueLength >= minBoundary;
|
|
23359
|
+
}
|
|
23360
|
+
if (!minValue) {
|
|
23361
|
+
return valueLength <= maxBoundary;
|
|
23362
|
+
}
|
|
23363
|
+
return valueLength >= minBoundary && valueLength <= maxBoundary;
|
|
23364
|
+
});
|
|
23365
|
+
}
|
|
23366
|
+
if (type === 'range') {
|
|
23367
|
+
if (isEmpty) {
|
|
23368
|
+
return false;
|
|
23369
|
+
}
|
|
23370
|
+
if (checkValue && Array.isArray(checkValue)) {
|
|
23371
|
+
minValue = Number.parseInt(String(checkValue[0]), 10);
|
|
23372
|
+
maxValue = typeof checkValue[1] === 'undefined' ? false : Number.parseInt(String(checkValue[1]), 10);
|
|
23373
|
+
}
|
|
23374
|
+
const minBoundary = minValue === false ? 0 : minValue;
|
|
23375
|
+
const maxBoundary = maxValue === false ? 0 : maxValue;
|
|
23376
|
+
return currentValue.every((value) => {
|
|
23377
|
+
const numericValue = Number.parseInt(String(value), 10);
|
|
23378
|
+
if (!maxValue) {
|
|
23379
|
+
return numericValue > minBoundary;
|
|
23380
|
+
}
|
|
23381
|
+
if (!minValue) {
|
|
23382
|
+
return numericValue < maxBoundary;
|
|
23383
|
+
}
|
|
23384
|
+
return numericValue > minBoundary && numericValue < maxBoundary;
|
|
23385
|
+
});
|
|
23386
|
+
}
|
|
23387
|
+
if (type === 'compare' && sign && checkValue) {
|
|
23388
|
+
if (isEmpty) {
|
|
23389
|
+
return false;
|
|
23390
|
+
}
|
|
23391
|
+
const numericCheckValue = Number.parseInt(String(checkValue), 10);
|
|
23392
|
+
switch (sign) {
|
|
23393
|
+
case '<':
|
|
23394
|
+
return currentValue.every((value) => Number.parseInt(String(value), 10) < numericCheckValue);
|
|
23395
|
+
case '<=':
|
|
23396
|
+
return currentValue.every((value) => Number.parseInt(String(value), 10) <= numericCheckValue);
|
|
23397
|
+
case '>':
|
|
23398
|
+
return currentValue.every((value) => Number.parseInt(String(value), 10) > numericCheckValue);
|
|
23399
|
+
case '>=':
|
|
23400
|
+
return currentValue.every((value) => Number.parseInt(String(value), 10) >= numericCheckValue);
|
|
23401
|
+
case '=':
|
|
23402
|
+
case '==':
|
|
23403
|
+
return currentValue.every((value) => Number.parseInt(String(value), 10) === numericCheckValue);
|
|
23404
|
+
}
|
|
23405
|
+
}
|
|
23406
|
+
return false;
|
|
23407
|
+
}
|
|
23408
|
+
// shadcn checkboxes and switches render as <button role="checkbox|switch">, which
|
|
23409
|
+
// carries a static value="on" - the checked state only lives in aria-checked.
|
|
23410
|
+
function isToggleControl(element) {
|
|
23411
|
+
const role = element.getAttribute('role');
|
|
23412
|
+
return role === 'checkbox' || role === 'switch';
|
|
23413
|
+
}
|
|
23414
|
+
function readElementValue(element) {
|
|
23415
|
+
if (isToggleControl(element)) {
|
|
23416
|
+
return element.getAttribute('aria-checked') === 'true';
|
|
23417
|
+
}
|
|
23418
|
+
if (element instanceof HTMLInputElement && element.type === 'checkbox') {
|
|
23419
|
+
return element.checked;
|
|
23420
|
+
}
|
|
23421
|
+
return element.value;
|
|
23422
|
+
}
|
|
23423
|
+
function getValue(selector) {
|
|
23424
|
+
const values = [];
|
|
23425
|
+
const element = selector ? document.querySelector(selector) : null;
|
|
23426
|
+
if (selector && element) {
|
|
23427
|
+
const inputType = element.tagName.toLowerCase();
|
|
23428
|
+
let currentSelector = selector;
|
|
23429
|
+
if (inputType === 'select') {
|
|
23430
|
+
currentSelector = `${selector} option:checked`;
|
|
23431
|
+
}
|
|
23432
|
+
document.querySelectorAll(currentSelector).forEach((match) => {
|
|
23433
|
+
values.push(readElementValue(match));
|
|
23434
|
+
});
|
|
23435
|
+
}
|
|
23436
|
+
return values.filter((value) => value !== '');
|
|
23437
|
+
}
|
|
23438
|
+
|
|
23439
|
+
const falsyToString = (value)=>typeof value === "boolean" ? `${value}` : value === 0 ? "0" : value;
|
|
23440
|
+
const cx = clsx;
|
|
23441
|
+
const cva = (base, config)=>(props)=>{
|
|
23442
|
+
var _config_compoundVariants;
|
|
23443
|
+
if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
|
|
23444
|
+
const { variants, defaultVariants } = config;
|
|
23445
|
+
const getVariantClassNames = Object.keys(variants).map((variant)=>{
|
|
23446
|
+
const variantProp = props === null || props === void 0 ? void 0 : props[variant];
|
|
23447
|
+
const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];
|
|
23448
|
+
if (variantProp === null) return null;
|
|
23449
|
+
const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);
|
|
23450
|
+
return variants[variant][variantKey];
|
|
23451
|
+
});
|
|
23452
|
+
const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param)=>{
|
|
23453
|
+
let [key, value] = param;
|
|
23454
|
+
if (value === undefined) {
|
|
23455
|
+
return acc;
|
|
23456
|
+
}
|
|
23457
|
+
acc[key] = value;
|
|
23458
|
+
return acc;
|
|
23459
|
+
}, {});
|
|
23460
|
+
const getCompoundVariantClassNames = config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param)=>{
|
|
23461
|
+
let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;
|
|
23462
|
+
return Object.entries(compoundVariantOptions).every((param)=>{
|
|
23463
|
+
let [key, value] = param;
|
|
23464
|
+
return Array.isArray(value) ? value.includes({
|
|
23465
|
+
...defaultVariants,
|
|
23466
|
+
...propsWithoutUndefined
|
|
23467
|
+
}[key]) : ({
|
|
23468
|
+
...defaultVariants,
|
|
23469
|
+
...propsWithoutUndefined
|
|
23470
|
+
})[key] === value;
|
|
23471
|
+
}) ? [
|
|
23472
|
+
...acc,
|
|
23473
|
+
cvClass,
|
|
23474
|
+
cvClassName
|
|
23475
|
+
] : acc;
|
|
23476
|
+
}, []);
|
|
23477
|
+
return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
|
|
23478
|
+
};
|
|
23479
|
+
|
|
23497
23480
|
const alertVariants = cva('relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current', {
|
|
23498
23481
|
variants: {
|
|
23499
23482
|
variant: {
|
|
@@ -23545,11 +23528,12 @@
|
|
|
23545
23528
|
};
|
|
23546
23529
|
function AppAlert({ title, variant = 'info', hideIcon = false, className, children, dangerouslySetInnerHTML, ...props }) {
|
|
23547
23530
|
const Icon = variantIcons[variant];
|
|
23548
|
-
return (jsxRuntimeExports.jsxs(Alert, { variant: variant === 'destructive' ? 'destructive' : 'default', className: cn(variantStyles[variant], className), ...props, children: [!hideIcon && jsxRuntimeExports.jsx(Icon, {}), title && jsxRuntimeExports.jsx(AlertTitle, { children: title }), dangerouslySetInnerHTML ? (jsxRuntimeExports.jsx(AlertDescription, { dangerouslySetInnerHTML: dangerouslySetInnerHTML })) : (jsxRuntimeExports.jsx(AlertDescription, { children: children }))] }));
|
|
23531
|
+
return (jsxRuntimeExports.jsxs(Alert, { variant: variant === 'destructive' ? 'destructive' : 'default', className: cn(variantStyles[variant], className), ...props, children: [!hideIcon && jsxRuntimeExports.jsx(Icon, {}), title && jsxRuntimeExports.jsx(AlertTitle, { children: title }), dangerouslySetInnerHTML ? (jsxRuntimeExports.jsx(AlertDescription, { className: "html-content block", dangerouslySetInnerHTML: dangerouslySetInnerHTML })) : (jsxRuntimeExports.jsx(AlertDescription, { children: children }))] }));
|
|
23549
23532
|
}
|
|
23550
23533
|
|
|
23534
|
+
// Two brand files, each tuned for its own background, swapped by theme.
|
|
23551
23535
|
function CrowdinMark({ className }) {
|
|
23552
|
-
return (jsxRuntimeExports.jsxs("svg", { viewBox: "0 0
|
|
23536
|
+
return (jsxRuntimeExports.jsxs("svg", { viewBox: "0 0 80 80", className: className, fill: "none", "aria-hidden": "true", children: [jsxRuntimeExports.jsxs("g", { className: "dark:hidden", children: [jsxRuntimeExports.jsx("path", { d: "M56.6667 80H23.3333C9.16667 80 0 70.8333 0 56.6667V23.0781C0 9.16667 9.16667 0 23.0781 0H56.6667C70.8333 0 80 9.16667 80 23.3333V56.6667C80 70.8333 70.8333 80 56.6667 80Z", fill: "#263238" }), jsxRuntimeExports.jsx("path", { d: "M51.3968 54.5041C49.9 54.5041 48.5662 54.0395 47.4621 53.1296C46.1432 52.0583 45.0947 50.4611 45.0576 48.5835C45.0391 47.6352 46.0357 47.6352 46.0357 47.6352C46.0357 47.6352 47.6548 47.616 48.4402 47.616C49.2257 47.6352 49.4554 48.7678 49.4924 49.052C49.7962 51.5976 51.1856 52.7072 52.2526 53.214C52.8936 53.5174 52.7342 54.4657 51.3968 54.508V54.5041Z", fill: "white" }), jsxRuntimeExports.jsx("path", { d: "M37.9552 41.5689C36.6363 41.4076 34.6801 41.2694 33.4167 40.9469C31.3679 40.4247 31.4234 38.5164 31.5124 37.8944C31.7606 36.0284 32.4201 34.3006 33.4352 32.6957C34.6986 30.7298 36.514 29.002 38.8481 27.5967C43.2274 24.9666 49.9385 23.3335 56.6667 23.3335C57.9136 23.3335 66.9908 23.3335 66.9908 25.2085C66.9908 26.2502 64.8949 26.1531 63.9824 26.1531C57.1283 26.1531 52.2489 27.1168 48.618 29.2055C45.0391 31.252 42.5456 34.3851 40.8562 39.0232C40.6784 39.4264 40.0893 41.8146 37.9552 41.5727V41.5689Z", fill: "white" }), jsxRuntimeExports.jsx("path", { d: "M43.9348 60.7086C40.5337 60.7815 37.3289 59.1881 34.9022 56.4083C32.846 54.0546 31.6085 51.6818 31.3788 48.637C31.238 46.6481 32.0865 45.9609 33.2387 46.0799C34.0352 46.1605 36.5138 46.2834 37.9328 46.5867C38.9962 46.8094 39.7038 47.4199 39.8816 48.6754C40.819 55.3716 44.8944 58.0055 47.3211 58.5738C47.7472 58.6736 48.0102 58.9578 47.9954 59.4684C47.9769 59.956 47.7064 60.6241 43.9385 60.7048L43.9348 60.7086Z", fill: "white" }), jsxRuntimeExports.jsx("path", { d: "M34.2464 66.6527C31.8345 66.7564 29.4744 66.2534 28.8001 66.1305C25.9622 65.6084 23.5836 64.7061 21.5459 63.3661C16.6665 60.1639 13.7211 54.5082 13.3691 47.812C13.2802 46.2224 13.0838 43.1853 16.7406 43.4157C18.2485 43.5002 20.6419 44.2527 22.3276 44.7557C24.4209 45.3624 25.4324 47.0364 25.4324 48.6913C25.4324 58.1327 33.3333 64.1667 37.0833 64.1667C37.9429 64.1667 38.3333 64.4452 38.3333 65C38.3333 65.4167 37.9439 66.4953 34.2501 66.6566L34.2464 66.6527Z", fill: "white" }), jsxRuntimeExports.jsx("path", { d: "M21.6602 38.9073C20.2338 38.6424 18.8408 38.0319 17.4848 37.6825C13.2908 36.6036 14.0058 32.2188 14.3986 31.017C18.2146 19.3755 30.3298 15.4822 40.1071 14.4417C49.3138 13.4626 58.9467 14.219 67.92 16.8068C68.561 16.9835 70.3282 17.425 69.9466 18.5001C69.565 19.5752 68.5017 18.8265 58.7133 18.6038C55.4863 18.5308 52.263 18.742 49.0286 19.2565C43.4786 20.1319 37.773 21.948 33.1863 25.7799C30.9744 27.6344 29.0293 29.9996 27.7289 32.7948C27.3881 33.5281 27.1213 34.2615 26.8916 34.9948C26.6582 35.7704 25.7838 39.6637 21.6639 38.9112L21.6602 38.9073Z", fill: "white" }), jsxRuntimeExports.jsx("path", { d: "M45.1315 41.1541C45.9169 37.5104 48.75 32.0831 59.5833 32.0831C60.8333 32.0831 61.25 32.4998 61.25 32.9165C61.25 33.3331 60.6669 33.7498 60 33.7498C53.4172 33.7498 51.3261 37.7906 49.8071 41.9297C49.3181 43.262 48.2029 43.4617 46.8061 43.2236C45.828 43.0432 44.7647 42.9241 45.1315 41.1541Z", fill: "white" })] }), jsxRuntimeExports.jsxs("g", { className: "hidden dark:block", children: [jsxRuntimeExports.jsx("path", { d: "M55.2553 80H24.7447C8.91588 80 0 70.916 0 55.2553V24.7447C0 9.08403 8.91588 0 24.7447 0H55.2553C71.4167 0 80 8.75146 80 24.7447V55.2553C80 71.2485 71.4167 80 55.2553 80Z", fill: "white" }), jsxRuntimeExports.jsx("path", { d: "M51.3959 54.5041C49.8991 54.5041 48.5653 54.0395 47.4613 53.1296C46.1423 52.0583 45.0938 50.4611 45.0568 48.5835C45.0382 47.6352 46.0349 47.6352 46.0349 47.6352C46.0349 47.6352 47.6539 47.616 48.4394 47.616C49.2248 47.6352 49.4545 48.7678 49.4916 49.052C49.7954 51.5976 51.1847 52.7072 52.2518 53.214C52.8927 53.5174 52.7334 54.4657 51.3959 54.508V54.5041Z", fill: "#263238" }), jsxRuntimeExports.jsx("path", { d: "M37.9549 41.5687C36.6359 41.4074 34.6797 41.2692 33.4163 40.9467C31.3675 40.4245 31.4231 38.5163 31.512 37.8943C31.7602 36.0282 32.4197 34.3004 33.4349 32.6955C34.6982 30.7296 36.5137 29.0018 38.8478 27.5966C43.227 24.9665 49.3512 23.4998 56.0794 23.4998C61.0107 23.4998 66.1568 24.164 66.2087 24.164C66.6718 24.2254 67.009 24.6862 66.9904 25.2084C66.9719 25.7305 66.6162 26.1299 66.1531 26.1721C65.4047 26.1529 64.6748 26.1529 63.982 26.1529C57.1279 26.1529 52.2485 27.1166 48.6177 29.2053C45.0387 31.2518 42.5453 34.3849 40.8558 39.0231C40.678 39.4262 40.0889 41.8144 37.9549 41.5725V41.5687Z", fill: "#263238" }), jsxRuntimeExports.jsx("path", { d: "M43.9348 60.709C40.5337 60.7819 37.3289 59.1885 34.9022 56.4087C32.846 54.055 31.6085 51.6822 31.3788 48.6374C31.238 46.6485 32.0865 45.9612 33.2387 46.0802C34.0352 46.1609 36.5138 46.2837 37.9328 46.5871C38.9962 46.8098 39.7038 47.4203 39.8816 48.6758C40.819 55.372 44.8944 58.0059 47.3211 58.5742C47.7472 58.674 48.0102 58.9581 47.9954 59.4688C47.9769 59.9564 47.7064 60.6245 43.9385 60.7051L43.9348 60.709Z", fill: "#263238" }), jsxRuntimeExports.jsx("path", { d: "M34.246 66.6527C31.8341 66.7564 29.4741 66.2534 28.7998 66.1305C25.9618 65.6084 23.5832 64.7061 21.5455 63.3661C16.6661 60.1639 13.7207 54.5082 13.3687 47.812C13.2798 46.2224 13.0835 43.1853 16.7402 43.4157C18.2481 43.5002 20.6415 44.2527 22.3273 44.7557C24.4205 45.3624 25.432 47.0364 25.432 48.6913C25.432 58.1327 33.6829 64.372 37.2841 64.372C38.1436 64.372 38.3474 64.9019 38.2436 65.4087C38.1621 65.8119 37.9435 66.4953 34.2497 66.6566L34.246 66.6527Z", fill: "#263238" }), jsxRuntimeExports.jsx("path", { d: "M21.6602 38.9077C20.2338 38.6428 18.8408 38.0323 17.4848 37.6829C13.2908 36.604 14.0058 32.2192 14.3986 31.0174C18.2147 19.3759 30.3298 15.4826 40.1071 14.442C49.3138 13.463 58.9467 14.2194 67.92 16.8072C68.561 16.9838 70.3282 17.4254 69.9466 18.5005C69.565 19.5755 68.5017 18.8268 58.7133 18.6041C55.4863 18.5312 52.263 18.7424 49.0286 19.2569C43.4786 20.1323 37.773 21.9484 33.1863 25.7803C30.9744 27.6348 29.0293 29.9999 27.7289 32.7951C27.3881 33.5285 27.1213 34.2618 26.8916 34.9952C26.6582 35.7708 25.7838 39.6641 21.6639 38.9115L21.6602 38.9077Z", fill: "#263238" }), jsxRuntimeExports.jsx("path", { d: "M45.1311 41.1543C45.9166 37.5105 49.4066 31.7358 60.2102 32.1351C62.6888 32.2158 61.5551 33.9666 60.3325 33.9282C54.223 33.7094 51.3258 37.7908 49.8068 41.9298C49.3177 43.2622 48.2025 43.4618 46.8058 43.2238C45.8277 43.0433 44.7643 42.9243 45.1311 41.1543Z", fill: "#263238" })] })] }));
|
|
23553
23537
|
}
|
|
23554
23538
|
|
|
23555
23539
|
var __defProp$D = Object.defineProperty;
|
|
@@ -26368,6 +26352,27 @@
|
|
|
26368
26352
|
}
|
|
26369
26353
|
);
|
|
26370
26354
|
}, "Dialog");
|
|
26355
|
+
var TRIGGER_NAME$9 = "DialogTrigger";
|
|
26356
|
+
var DialogTrigger$1 = /* @__PURE__ */ reactExports.forwardRef(
|
|
26357
|
+
/* @__PURE__ */ __name$k(function DialogTrigger2(props, forwardedRef) {
|
|
26358
|
+
const { __scopeDialog, ...triggerProps } = props;
|
|
26359
|
+
const context = useDialogContext(TRIGGER_NAME$9, __scopeDialog);
|
|
26360
|
+
const composedTriggerRef = useComposedRefs(forwardedRef, context.triggerRef);
|
|
26361
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
26362
|
+
Primitive.button,
|
|
26363
|
+
{
|
|
26364
|
+
type: "button",
|
|
26365
|
+
"aria-haspopup": "dialog",
|
|
26366
|
+
"aria-expanded": context.open,
|
|
26367
|
+
"aria-controls": context.open ? context.contentId : void 0,
|
|
26368
|
+
"data-state": getState$4(context.open),
|
|
26369
|
+
...triggerProps,
|
|
26370
|
+
ref: composedTriggerRef,
|
|
26371
|
+
onClick: composeEventHandlers(props.onClick, context.onOpenToggle)
|
|
26372
|
+
}
|
|
26373
|
+
);
|
|
26374
|
+
}, "DialogTrigger")
|
|
26375
|
+
);
|
|
26371
26376
|
var PORTAL_NAME$4 = "DialogPortal";
|
|
26372
26377
|
var [PortalProvider$4, usePortalContext$5] = createDialogContext(PORTAL_NAME$4, {
|
|
26373
26378
|
forceMount: void 0
|
|
@@ -34232,7 +34237,7 @@ Defaulting to \`null\`.`;
|
|
|
34232
34237
|
// Shared by both filter modes: RadioGroup's root defaults to `grid gap-3`, so
|
|
34233
34238
|
// styling either list separately makes them drift apart.
|
|
34234
34239
|
const FILTER_OPTION_LIST_CLASS = 'grid gap-1 p-3';
|
|
34235
|
-
const FILTER_OPTION_CLASS = 'flex min-h-9 cursor-pointer items-center gap-3 rounded-md px-2 py-1.5 hover:bg-accent';
|
|
34240
|
+
const FILTER_OPTION_CLASS = 'flex min-h-9 cursor-pointer items-center gap-3 rounded-md px-2 py-1.5 text-sm hover:bg-accent';
|
|
34236
34241
|
function FilterOptionRow({ children }) {
|
|
34237
34242
|
return jsxRuntimeExports.jsx("label", { className: FILTER_OPTION_CLASS, children: children });
|
|
34238
34243
|
}
|
|
@@ -35890,7 +35895,7 @@ Defaulting to \`null\`.`;
|
|
|
35890
35895
|
function FilesTreeSkeleton() {
|
|
35891
35896
|
return (jsxRuntimeExports.jsx("div", { className: "space-y-1 p-2", "aria-hidden": "true", children: [72, 56, 64, 48, 60].map((width, index) => (jsxRuntimeExports.jsxs("div", { className: "flex h-10 items-center gap-3 px-2", style: { paddingLeft: 8 + index * 8 }, children: [jsxRuntimeExports.jsx(Skeleton, { className: "size-4" }), jsxRuntimeExports.jsx(Skeleton, { className: "size-4" }), jsxRuntimeExports.jsx(Skeleton, { className: "h-4", style: { width: `${width}%` } })] }, width))) }));
|
|
35892
35897
|
}
|
|
35893
|
-
function FilesTree({ id = 'files-tree', items, selectedIds, onSelectedIdsChange, openedFolderIds, onOpenedFolderIdsChange, disabled = false, loading = false, searchQuery = '', onItemOpenChange, assumeFoldersHaveChildren = false, isItemSelectable = selectAnyItem, onLoadMore, loadingItemIds = [], emptyTitle = 'No files found', emptyDescription = 'Try a different search or check the available files.', maxHeight = DEFAULT_MAX_HEIGHT, renderItemName, renderItemMeta, itemActions, }) {
|
|
35898
|
+
function FilesTree({ id = 'files-tree', items, selectedIds, onSelectedIdsChange, openedFolderIds, onOpenedFolderIdsChange, disabled = false, loading = false, searchQuery = '', onItemOpenChange, assumeFoldersHaveChildren = false, isItemSelectable = selectAnyItem, onLoadMore, loadingItemIds = [], emptyTitle = 'No files found', emptyDescription = 'Try a different search or check the available files.', maxHeight = DEFAULT_MAX_HEIGHT, fill = false, renderItemName, renderItemMeta, itemActions, }) {
|
|
35894
35899
|
const model = reactExports.useMemo(() => buildFilesTreeModel(items), [items]);
|
|
35895
35900
|
const isInteractionDisabled = disabled || loading;
|
|
35896
35901
|
const { tree, items: headlessItems, getSelectionState, } = useFilesTree({
|
|
@@ -35916,7 +35921,9 @@ Defaulting to \`null\`.`;
|
|
|
35916
35921
|
const allVisibleSelected = selectableVisibleIds.length > 0 && selectableVisibleIds.every((itemId) => getSelectionState(itemId) === true);
|
|
35917
35922
|
const someVisibleSelected = selectableVisibleIds.some((itemId) => getSelectionState(itemId) !== false);
|
|
35918
35923
|
const selectAllState = allVisibleSelected ? true : someVisibleSelected ? 'indeterminate' : false;
|
|
35919
|
-
return (jsxRuntimeExports.jsxs("div", { id: id, className: cn('
|
|
35924
|
+
return (jsxRuntimeExports.jsxs("div", { id: id, className: cn('text-card-foreground', fill && 'flex min-h-0 flex-1 flex-col', disabled && 'opacity-50'), "aria-busy": loading || undefined, "data-disabled": isInteractionDisabled || undefined, children: [jsxRuntimeExports.jsxs("div", { className: "flex min-h-10 shrink-0 items-center gap-2 border-y px-4 text-xs font-medium text-muted-foreground", children: [jsxRuntimeExports.jsx("span", { className: "size-8 shrink-0", "aria-hidden": "true" }), jsxRuntimeExports.jsx(Checkbox, { checked: selectAllState, onCheckedChange: () => onSelectedIdsChange(toggleAllFilesTreeSelection(model, selectedIds, selectableVisibleIds, isItemSelectable)), disabled: isInteractionDisabled || selectableVisibleIds.length === 0, "aria-label": "Select all visible files" }), jsxRuntimeExports.jsx("span", { children: "Name" })] }), jsxRuntimeExports.jsx(ScrollArea, { style: fill ? undefined : { maxHeight }, className: cn(fill
|
|
35925
|
+
? 'min-h-0 flex-1 [&>[data-radix-scroll-area-viewport]]:h-full [&>[data-radix-scroll-area-viewport]>div]:h-full'
|
|
35926
|
+
: '[&>[data-radix-scroll-area-viewport]]:max-h-[inherit]'), children: loading ? (jsxRuntimeExports.jsx(FilesTreeSkeleton, {})) : headlessItems.length === 0 ? (jsxRuntimeExports.jsx(Empty, { className: cn('min-h-48 border-0', fill && 'h-full'), children: jsxRuntimeExports.jsxs(EmptyHeader, { children: [jsxRuntimeExports.jsx(EmptyMedia, { variant: "icon", children: jsxRuntimeExports.jsx(Folder, { "aria-hidden": "true" }) }), jsxRuntimeExports.jsx(EmptyTitle, { children: emptyTitle }), jsxRuntimeExports.jsx(EmptyDescription, { children: emptyDescription })] }) })) : (jsxRuntimeExports.jsx("div", { ...tree.getContainerProps('Files'), id: `${id}-tree`, "aria-multiselectable": "true", className: "px-2 py-1", children: headlessItems.map((headlessItem) => {
|
|
35920
35927
|
var _a, _b, _c, _d, _e;
|
|
35921
35928
|
const item = headlessItem.getItemData();
|
|
35922
35929
|
const level = headlessItem.getItemMeta().level;
|
|
@@ -36030,6 +36037,30 @@ Defaulting to \`null\`.`;
|
|
|
36030
36037
|
return (jsxRuntimeExports.jsx(Portal, { children: jsxRuntimeExports.jsxs(Content2, { "data-slot": "tooltip-content", sideOffset: sideOffset, className: cn('z-50 w-fit origin-(--radix-tooltip-content-transform-origin) animate-in rounded-md bg-foreground px-3 py-1.5 text-xs text-balance text-background fade-in-0 zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95', className), ...props, children: [children, jsxRuntimeExports.jsx(Arrow2, { className: "z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground" })] }) }));
|
|
36031
36038
|
}
|
|
36032
36039
|
|
|
36040
|
+
// Independent debounce timer per key; always fires the latest `fn`.
|
|
36041
|
+
function useKeyedDebounce(fn, delay) {
|
|
36042
|
+
const fnRef = reactExports.useRef(fn);
|
|
36043
|
+
reactExports.useLayoutEffect(() => {
|
|
36044
|
+
fnRef.current = fn;
|
|
36045
|
+
});
|
|
36046
|
+
const timers = reactExports.useRef(new Map());
|
|
36047
|
+
reactExports.useEffect(() => () => timers.current.forEach((timer) => clearTimeout(timer)), []);
|
|
36048
|
+
return reactExports.useMemo(() => {
|
|
36049
|
+
const cancel = (key) => {
|
|
36050
|
+
clearTimeout(timers.current.get(key));
|
|
36051
|
+
timers.current.delete(key);
|
|
36052
|
+
};
|
|
36053
|
+
const schedule = (key, ...args) => {
|
|
36054
|
+
cancel(key);
|
|
36055
|
+
timers.current.set(key, setTimeout(() => {
|
|
36056
|
+
timers.current.delete(key);
|
|
36057
|
+
fnRef.current(key, ...args);
|
|
36058
|
+
}, delay));
|
|
36059
|
+
};
|
|
36060
|
+
return { schedule, cancel };
|
|
36061
|
+
}, [delay]);
|
|
36062
|
+
}
|
|
36063
|
+
|
|
36033
36064
|
const MOBILE_BREAKPOINT = 768;
|
|
36034
36065
|
function useIsMobile() {
|
|
36035
36066
|
const [isMobile, setIsMobile] = reactExports.useState(undefined);
|
|
@@ -36162,6 +36193,7 @@ Defaulting to \`null\`.`;
|
|
|
36162
36193
|
return parsed.filter((item) => Boolean(item) && typeof item.label === 'string' && typeof item.action === 'string');
|
|
36163
36194
|
}
|
|
36164
36195
|
|
|
36196
|
+
const SEARCH_DEBOUNCE = 300;
|
|
36165
36197
|
// Stable identity: an inline arrow would invalidate useFilesTree's memoised map.
|
|
36166
36198
|
function isSelectableTreeItem(item) {
|
|
36167
36199
|
return item.nodeType !== 'load-more';
|
|
@@ -36171,6 +36203,7 @@ Defaulting to \`null\`.`;
|
|
|
36171
36203
|
selectedIds: [],
|
|
36172
36204
|
openedIds: [],
|
|
36173
36205
|
search: '',
|
|
36206
|
+
appliedSearch: '',
|
|
36174
36207
|
loading: true,
|
|
36175
36208
|
syncSettingsLoading: false,
|
|
36176
36209
|
};
|
|
@@ -36411,7 +36444,6 @@ Defaulting to \`null\`.`;
|
|
|
36411
36444
|
getOpenedFolders: async () => providersRef.current[provider].openedIds,
|
|
36412
36445
|
setOpenedFolders: async (ids) => setProvider(provider, { openedIds: ids.map(String) }),
|
|
36413
36446
|
getFilesToDisplay: async () => providersRef.current[provider].items,
|
|
36414
|
-
hasSearchText: async () => Boolean(providersRef.current[provider].search.trim()),
|
|
36415
36447
|
setLoadMoreLoading: async (id, loading) => {
|
|
36416
36448
|
const stringId = String(id);
|
|
36417
36449
|
setLoadMoreLoadingIds((current) => loading
|
|
@@ -36725,6 +36757,22 @@ Defaulting to \`null\`.`;
|
|
|
36725
36757
|
}
|
|
36726
36758
|
return actions;
|
|
36727
36759
|
};
|
|
36760
|
+
const applySearch = (provider, search) => {
|
|
36761
|
+
const isUnchanged = search.trim() === providersRef.current[provider].appliedSearch.trim();
|
|
36762
|
+
setProvider(provider, { search, appliedSearch: search });
|
|
36763
|
+
if (!isUnchanged && provider === 'integration' && integrationSearchListener) {
|
|
36764
|
+
onIntegrationFilterChange(search);
|
|
36765
|
+
}
|
|
36766
|
+
};
|
|
36767
|
+
const debouncedSearch = useKeyedDebounce(applySearch, SEARCH_DEBOUNCE);
|
|
36768
|
+
const changeSearch = (provider, search) => {
|
|
36769
|
+
setProvider(provider, { search });
|
|
36770
|
+
debouncedSearch.schedule(provider, search);
|
|
36771
|
+
};
|
|
36772
|
+
const clearSearch = (provider) => {
|
|
36773
|
+
debouncedSearch.cancel(provider);
|
|
36774
|
+
applySearch(provider, '');
|
|
36775
|
+
};
|
|
36728
36776
|
const renderItemName = (provider) => (item) => {
|
|
36729
36777
|
const source = item.original;
|
|
36730
36778
|
if (provider !== 'crowdin' || !source.isLanguage) {
|
|
@@ -36746,20 +36794,9 @@ Defaulting to \`null\`.`;
|
|
|
36746
36794
|
// Derived, never stored: as state it went stale whenever items changed without a
|
|
36747
36795
|
// selection change - disableSync cleared the markers but left the button live.
|
|
36748
36796
|
const hasSyncOption = hasSyncMetadata(displayItems, state.selectedIds);
|
|
36749
|
-
return (jsxRuntimeExports.jsxs("section", { className: "flex min-w-0 flex-col", "aria-label": `${providerName} files`, children: [jsxRuntimeExports.jsxs("header", { className: "
|
|
36750
|
-
|
|
36751
|
-
|
|
36752
|
-
const search = event.target.value;
|
|
36753
|
-
setProvider(provider, { search });
|
|
36754
|
-
if (!isCrowdin && integrationSearchListener) {
|
|
36755
|
-
onIntegrationFilterChange(search);
|
|
36756
|
-
}
|
|
36757
|
-
}, placeholder: isCrowdin ? 'Search Crowdin files' : `Search ${name} files`, "aria-label": isCrowdin ? 'Search Crowdin files' : `Search ${name} files` }), state.search && (jsxRuntimeExports.jsx(InputGroupAddon, { align: "inline-end", children: jsxRuntimeExports.jsx(InputGroupButton, { size: "icon-xs", "aria-label": "Clear search", onClick: () => {
|
|
36758
|
-
setProvider(provider, { search: '' });
|
|
36759
|
-
if (!isCrowdin && integrationSearchListener) {
|
|
36760
|
-
onIntegrationFilterChange('');
|
|
36761
|
-
}
|
|
36762
|
-
}, children: jsxRuntimeExports.jsx(X, {}) }) }))] }), isCrowdin && (filtering === null || filtering === void 0 ? void 0 : filtering.crowdinLanguages) && languages.length > 0 && (jsxRuntimeExports.jsx(FilesFilter, { sections: languageFilterSections, values: { languages: filteredLanguageIds }, onValuesChange: (values) => { var _a; return setFilteredLanguageIds((_a = values.languages) !== null && _a !== void 0 ? _a : []); } })), !isCrowdin && integrationFilterSections.length > 0 && (jsxRuntimeExports.jsx(FilesFilter, { sections: integrationFilterSections, values: integrationFilterValues, onValuesChange: setIntegrationFilterValues })), jsxRuntimeExports.jsxs("div", { className: "ml-auto flex items-center gap-1", children: [scheduleEnabled(provider) && (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [state.syncSettingsLoading && jsxRuntimeExports.jsx(Spinner, { className: "mx-1" }), hasSyncOption && (jsxRuntimeExports.jsxs(Button, { type: "button", variant: "ghost", size: "icon-sm", title: "Disable sync", disabled: state.syncSettingsLoading, onClick: () => disableSync(provider), children: [jsxRuntimeExports.jsx(Ban, {}), jsxRuntimeExports.jsx("span", { className: "sr-only", children: "Disable sync" })] })), jsxRuntimeExports.jsxs(Button, { type: "button", variant: "ghost", size: "icon-sm", title: "Enable auto sync", disabled: syncDisabled(provider) || state.syncSettingsLoading, onClick: () => schedule(provider), children: [jsxRuntimeExports.jsx(RotateCw, {}), jsxRuntimeExports.jsx("span", { className: "sr-only", children: "Enable auto sync" })] })] })), jsxRuntimeExports.jsxs(ButtonGroup, { children: [jsxRuntimeExports.jsxs(Button, { type: "button", variant: "outline", size: "sm", disabled: syncDisabled(provider) || anyProcess, onClick: () => upload(provider), children: [syncing && jsxRuntimeExports.jsx(Spinner, {}), "Sync to", isCrowdin ? (jsxRuntimeExports.jsx("img", { src: logo, alt: name, className: "size-4 object-contain" })) : (jsxRuntimeExports.jsx(CrowdinMark, { className: "size-4" }))] }), menuItems.length > 0 && (jsxRuntimeExports.jsxs(DropdownMenu, { children: [jsxRuntimeExports.jsx(DropdownMenuTrigger, { asChild: true, children: jsxRuntimeExports.jsxs(Button, { variant: "outline", size: "icon-sm", disabled: syncDisabled(provider) || anyProcess, children: [jsxRuntimeExports.jsx(ChevronDown, {}), jsxRuntimeExports.jsx("span", { className: "sr-only", children: "More synchronization actions" })] }) }), jsxRuntimeExports.jsx(DropdownMenuContent, { align: "end", className: "max-w-80 min-w-60", children: menuItems.map((item) => (jsxRuntimeExports.jsx(DropdownMenuItem, { onClick: () => upload(provider, item.action), children: item.label }, item.action))) })] }))] })] })] }), jsxRuntimeExports.jsx("div", { className: "px-3 pb-3", children: jsxRuntimeExports.jsx(FilesTree, { id: `${provider}-files`, items: displayItems, selectedIds: state.selectedIds, onSelectedIdsChange: (selectedIds) => setProvider(provider, { selectedIds }), openedFolderIds: state.openedIds, onOpenedFolderIdsChange: (openedIds) => setProvider(provider, { openedIds }), onItemOpenChange: (item, isOpen) => {
|
|
36797
|
+
return (jsxRuntimeExports.jsxs("section", { className: "flex min-h-0 min-w-0 flex-1 flex-col", "aria-label": `${providerName} files`, children: [jsxRuntimeExports.jsxs("header", { className: "shrink-0 px-4 pt-4", children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [isCrowdin ? (jsxRuntimeExports.jsx(CrowdinMark, { className: "size-8 shrink-0" })) : (jsxRuntimeExports.jsx("img", { src: logo, alt: "", className: "size-8 shrink-0 object-contain" })), jsxRuntimeExports.jsx("h2", { className: "min-w-0 flex-1 truncate text-base font-semibold", children: providerName }), jsxRuntimeExports.jsx(Button, { type: "button", variant: "ghost", size: "icon-sm", "aria-label": `Reload ${providerName} files`, title: `Reload ${providerName} files`, disabled: state.loading, onClick: () => onRefreshFilesList(isCrowdin ? { refreshCrowdin: true } : { refreshIntegration: true }), children: state.loading ? jsxRuntimeExports.jsx(Spinner, {}) : jsxRuntimeExports.jsx(RefreshCw, {}) })] }), jsxRuntimeExports.jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: isCrowdin
|
|
36798
|
+
? `Select content for synchronization to ${name}`
|
|
36799
|
+
: 'Select content for synchronization to Crowdin' })] }), jsxRuntimeExports.jsxs("div", { className: "flex shrink-0 flex-wrap items-center gap-2 px-4 py-3", children: [jsxRuntimeExports.jsxs(InputGroup, { className: "min-w-52 flex-1 sm:max-w-80", children: [jsxRuntimeExports.jsx(InputGroupAddon, { children: jsxRuntimeExports.jsx(Search, {}) }), jsxRuntimeExports.jsx(InputGroupInput, { value: state.search, onChange: (event) => changeSearch(provider, event.target.value), placeholder: isCrowdin ? 'Search Crowdin files' : `Search ${name} files`, "aria-label": isCrowdin ? 'Search Crowdin files' : `Search ${name} files` }), state.search && (jsxRuntimeExports.jsx(InputGroupAddon, { align: "inline-end", children: jsxRuntimeExports.jsx(InputGroupButton, { size: "icon-xs", "aria-label": "Clear search", onClick: () => clearSearch(provider), children: jsxRuntimeExports.jsx(X, {}) }) }))] }), isCrowdin && (filtering === null || filtering === void 0 ? void 0 : filtering.crowdinLanguages) && languages.length > 0 && (jsxRuntimeExports.jsx(FilesFilter, { sections: languageFilterSections, values: { languages: filteredLanguageIds }, onValuesChange: (values) => { var _a; return setFilteredLanguageIds((_a = values.languages) !== null && _a !== void 0 ? _a : []); } })), !isCrowdin && integrationFilterSections.length > 0 && (jsxRuntimeExports.jsx(FilesFilter, { sections: integrationFilterSections, values: integrationFilterValues, onValuesChange: setIntegrationFilterValues })), jsxRuntimeExports.jsxs("div", { className: "ml-auto flex items-center gap-1", children: [scheduleEnabled(provider) && (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [state.syncSettingsLoading && jsxRuntimeExports.jsx(Spinner, { className: "mx-1" }), hasSyncOption && (jsxRuntimeExports.jsxs(Button, { type: "button", variant: "ghost", size: "icon-sm", title: "Disable Auto Sync", disabled: state.syncSettingsLoading, onClick: () => disableSync(provider), children: [jsxRuntimeExports.jsx(RefreshCwOff, {}), jsxRuntimeExports.jsx("span", { className: "sr-only", children: "Disable Auto Sync" })] })), jsxRuntimeExports.jsxs(Button, { type: "button", variant: "ghost", size: "icon-sm", title: "Enable Auto Sync", disabled: syncDisabled(provider) || state.syncSettingsLoading, onClick: () => schedule(provider), children: [jsxRuntimeExports.jsx(RotateCw, {}), jsxRuntimeExports.jsx("span", { className: "sr-only", children: "Enable Auto Sync" })] })] })), jsxRuntimeExports.jsxs(ButtonGroup, { children: [jsxRuntimeExports.jsxs(Button, { type: "button", variant: "outline", size: "sm", disabled: syncDisabled(provider) || anyProcess, onClick: () => upload(provider), children: [syncing && jsxRuntimeExports.jsx(Spinner, {}), "Sync to", isCrowdin ? (jsxRuntimeExports.jsx("img", { src: logo, alt: name, className: "size-4 object-contain" })) : (jsxRuntimeExports.jsx(CrowdinMark, { className: "size-4" }))] }), menuItems.length > 0 && (jsxRuntimeExports.jsxs(DropdownMenu, { children: [jsxRuntimeExports.jsx(DropdownMenuTrigger, { asChild: true, children: jsxRuntimeExports.jsxs(Button, { variant: "outline", size: "icon-sm", disabled: syncDisabled(provider) || anyProcess, children: [jsxRuntimeExports.jsx(ChevronDown, {}), jsxRuntimeExports.jsx("span", { className: "sr-only", children: "More synchronization actions" })] }) }), jsxRuntimeExports.jsx(DropdownMenuContent, { align: "end", className: "max-w-80 min-w-60", children: menuItems.map((item) => (jsxRuntimeExports.jsx(DropdownMenuItem, { onClick: () => upload(provider, item.action), children: item.label }, item.action))) })] }))] })] })] }), jsxRuntimeExports.jsx("div", { className: "flex min-h-0 flex-1 flex-col", children: jsxRuntimeExports.jsx(FilesTree, { id: `${provider}-files`, items: displayItems, selectedIds: state.selectedIds, onSelectedIdsChange: (selectedIds) => setProvider(provider, { selectedIds }), openedFolderIds: state.openedIds, onOpenedFolderIdsChange: (openedIds) => setProvider(provider, { openedIds }), onItemOpenChange: (item, isOpen) => {
|
|
36763
36800
|
var _a;
|
|
36764
36801
|
if (isOpen && (integrationOneLevelFetching || isCrowdin)) {
|
|
36765
36802
|
onFolderToggle({
|
|
@@ -36770,13 +36807,13 @@ Defaulting to \`null\`.`;
|
|
|
36770
36807
|
recursion: false,
|
|
36771
36808
|
});
|
|
36772
36809
|
}
|
|
36773
|
-
}, assumeFoldersHaveChildren: !isCrowdin && Boolean(integrationOneLevelFetching), isItemSelectable: isSelectableTreeItem, onLoadMore: (item) => onLoadMore(item.original), loadingItemIds: loadMoreLoadingIds, searchQuery: state.
|
|
36810
|
+
}, assumeFoldersHaveChildren: !isCrowdin && Boolean(integrationOneLevelFetching), isItemSelectable: isSelectableTreeItem, onLoadMore: (item) => onLoadMore(item.original), loadingItemIds: loadMoreLoadingIds, searchQuery: state.appliedSearch, loading: state.loading, fill: true, emptyTitle: state.appliedSearch ? 'No matching files' : `No ${providerName} files`, emptyDescription: isCrowdin
|
|
36774
36811
|
? 'Select content on the right and sync it to Crowdin.'
|
|
36775
36812
|
: 'Reload the file list or adjust your search.', renderItemName: renderItemName(provider), renderItemMeta: renderMeta(provider), itemActions: (item) => actionItems(provider, item.original) }) })] }));
|
|
36776
36813
|
};
|
|
36777
36814
|
// Exclusive, not CSS-toggled: each panel owns a tree keyed `${provider}-files`,
|
|
36778
36815
|
// so mounting both layouts would duplicate those DOM ids.
|
|
36779
|
-
return (jsxRuntimeExports.jsx(TooltipProvider, { delayDuration: 150, children: jsxRuntimeExports.jsx(Card, { className: "relative mt-3 gap-0 overflow-hidden py-0", children: isMobile ? (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("div", { className: "border-b p-3", children: jsxRuntimeExports.jsx(Tabs, { value: activeProvider, onValueChange: (value) => setActiveProvider(value), children: jsxRuntimeExports.jsxs(TabsList, { className: "w-full", children: [jsxRuntimeExports.jsxs(TabsTrigger, { value: "crowdin", className: "flex-1", children: [jsxRuntimeExports.jsx(
|
|
36816
|
+
return (jsxRuntimeExports.jsx(TooltipProvider, { delayDuration: 150, children: jsxRuntimeExports.jsx(Card, { className: "relative mt-3 flex min-h-[480px] flex-1 flex-col gap-0 overflow-hidden py-0", children: isMobile ? (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("div", { className: "shrink-0 border-b p-3", children: jsxRuntimeExports.jsx(Tabs, { value: activeProvider, onValueChange: (value) => setActiveProvider(value), children: jsxRuntimeExports.jsxs(TabsList, { className: "w-full", children: [jsxRuntimeExports.jsxs(TabsTrigger, { value: "crowdin", className: "flex-1", children: [jsxRuntimeExports.jsx(CrowdinMark, { className: "size-4" }), " Crowdin"] }), jsxRuntimeExports.jsxs(TabsTrigger, { value: "integration", className: "flex-1", children: [jsxRuntimeExports.jsx("img", { src: logo, alt: "", className: "size-4 object-contain" }), " ", name] })] }) }) }), panel(activeProvider)] })) : (jsxRuntimeExports.jsxs("div", { className: "grid min-h-0 flex-1 grid-cols-2 divide-x", children: [panel('crowdin'), panel('integration')] })) }) }));
|
|
36780
36817
|
});
|
|
36781
36818
|
|
|
36782
36819
|
function Select({ ...props }) {
|
|
@@ -36833,11 +36870,11 @@ Defaulting to \`null\`.`;
|
|
|
36833
36870
|
onSelect(error);
|
|
36834
36871
|
}
|
|
36835
36872
|
};
|
|
36836
|
-
return (jsxRuntimeExports.jsxs("div", { "data-slot": "user-errors-table", className: "overflow-hidden rounded-lg border bg-card text-card-foreground", children: [jsxRuntimeExports.jsx("div", { "data-slot": "table-toolbar", className: "border-b p-4", children: jsxRuntimeExports.jsxs("div", { className: "relative max-w-md", children: [jsxRuntimeExports.jsx(Search, { className: "pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2 text-muted-foreground" }), jsxRuntimeExports.jsx(Input, { value: searchText, onChange: (event) => onOptionsChange({ searchText: event.target.value, currentPage: 1 }), className: "h-9 pl-9", placeholder: "Search by action or message", "aria-label": "Search
|
|
36873
|
+
return (jsxRuntimeExports.jsxs("div", { "data-slot": "user-errors-table", className: "overflow-hidden rounded-lg border bg-card text-card-foreground", children: [jsxRuntimeExports.jsx("div", { "data-slot": "table-toolbar", className: "border-b p-4", children: jsxRuntimeExports.jsxs("div", { className: "relative max-w-md", children: [jsxRuntimeExports.jsx(Search, { className: "pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2 text-muted-foreground" }), jsxRuntimeExports.jsx(Input, { value: searchText, onChange: (event) => onOptionsChange({ searchText: event.target.value, currentPage: 1 }), className: "h-9 pl-9", placeholder: "Search by action or message", "aria-label": "Search logs by action or message" })] }) }), jsxRuntimeExports.jsxs(Table, { children: [jsxRuntimeExports.jsx(TableHeader, { children: jsxRuntimeExports.jsxs(TableRow, { className: "hover:bg-transparent", children: [jsxRuntimeExports.jsx(TableHead, { className: "w-1/3 px-4", "aria-sort": isSortedAsc ? 'ascending' : 'descending', children: jsxRuntimeExports.jsxs(Button, { type: "button", variant: "ghost", className: "-ml-2", onClick: () => onOptionsChange({ isSortedAsc: !isSortedAsc, currentPage: 1 }), "aria-label": `Sort by date ${isSortedAsc ? 'descending' : 'ascending'}`, children: ["Date", isSortedAsc ? (jsxRuntimeExports.jsx(ArrowUp, { "aria-hidden": "true" })) : (jsxRuntimeExports.jsx(ArrowDown, { "aria-hidden": "true" }))] }) }), jsxRuntimeExports.jsx(TableHead, { className: "w-1/3 px-4", children: "Action" }), jsxRuntimeExports.jsx(TableHead, { className: "w-1/3 px-4", children: "Message" })] }) }), jsxRuntimeExports.jsx(TableBody, { "aria-busy": isLoading, children: isLoading ? (Array.from({ length: 3 }).map((_, index) => (jsxRuntimeExports.jsx(TableRow, { children: [0, 1, 2].map((cell) => (jsxRuntimeExports.jsxs(TableCell, { className: "h-12 px-4", children: [index === 0 && cell === 0 && (jsxRuntimeExports.jsx("span", { className: "sr-only", role: "status", children: "Loading logs" })), jsxRuntimeExports.jsx("div", { className: "h-4 max-w-48 animate-pulse rounded bg-muted" })] }, cell))) }, index)))) : errors.length > 0 ? (errors.map((error) => (jsxRuntimeExports.jsxs(TableRow, { tabIndex: 0, className: "cursor-pointer focus-visible:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset", onClick: () => onSelect(error), onKeyDown: (event) => handleRowKeyDown(event, error), "aria-label": `Open log details for ${error.action} on ${error.formattedDate}`, children: [jsxRuntimeExports.jsx(TableCell, { className: "h-12 px-4 font-medium whitespace-normal", children: error.formattedDate }), jsxRuntimeExports.jsx(TableCell, { className: "h-12 px-4 whitespace-normal", children: error.action }), jsxRuntimeExports.jsx(TableCell, { className: "h-12 max-w-0 px-4 whitespace-normal", children: jsxRuntimeExports.jsx("span", { className: "line-clamp-2 break-words", children: error.message }) })] }, error.id)))) : (jsxRuntimeExports.jsx(TableRow, { className: "hover:bg-transparent", children: jsxRuntimeExports.jsx(TableCell, { colSpan: 3, className: "h-32 text-center text-muted-foreground", children: searchText ? 'No logs match your search.' : 'No logs found.' }) })) })] }), jsxRuntimeExports.jsxs("div", { "data-slot": "table-pagination", className: "flex flex-col gap-3 border-t px-4 py-2 sm:flex-row sm:items-center sm:justify-end", children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-sm", children: [jsxRuntimeExports.jsx("span", { className: "whitespace-nowrap text-muted-foreground", children: "Rows per page" }), jsxRuntimeExports.jsxs(Select, { value: String(rowsPerPage), onValueChange: (value) => onOptionsChange({ rowsPerPage: Number(value), currentPage: 1 }), children: [jsxRuntimeExports.jsx(SelectTrigger, { className: "w-18", "aria-label": "Rows per page", children: jsxRuntimeExports.jsx(SelectValue, {}) }), jsxRuntimeExports.jsx(SelectContent, { align: "end", children: rowsPerPageOptions.map((option) => (jsxRuntimeExports.jsx(SelectItem, { value: String(option), children: option }, option))) })] })] }), jsxRuntimeExports.jsxs("p", { className: "m-0 min-w-24 text-sm text-muted-foreground", "aria-live": "polite", children: [firstVisibleRow, "-", lastVisibleRow, " of ", total] }), jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1", children: [jsxRuntimeExports.jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => onOptionsChange({ currentPage: 1 }), disabled: currentPage === 1, "aria-label": "Go to first page", children: jsxRuntimeExports.jsx(ChevronsLeft, {}) }), jsxRuntimeExports.jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => onOptionsChange({ currentPage: Math.max(1, currentPage - 1) }), disabled: currentPage === 1, "aria-label": "Go to previous page", children: jsxRuntimeExports.jsx(ChevronLeft, {}) }), jsxRuntimeExports.jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => onOptionsChange({ currentPage: Math.min(pageCount, currentPage + 1) }), disabled: currentPage === pageCount, "aria-label": "Go to next page", children: jsxRuntimeExports.jsx(ChevronRight, {}) }), jsxRuntimeExports.jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => onOptionsChange({ currentPage: pageCount }), disabled: currentPage === pageCount, "aria-label": "Go to last page", children: jsxRuntimeExports.jsx(ChevronsRight, {}) })] })] })] }));
|
|
36837
36874
|
};
|
|
36838
36875
|
|
|
36839
36876
|
const IntegrationView = ({ appComponentRef, userErrors, isUserErrorsLoading, userErrorsTotal, userErrorsCurrentPage, userErrorsRowsPerPage, userErrorsSearchText, userErrorsIsSortedAsc, onSelectUserError, onUserErrorsOptionsChange, isErrorLogsVisible, ...integrationProps }) => {
|
|
36840
|
-
return (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("div", { style: { display: isErrorLogsVisible ? 'none' : undefined }, children: jsxRuntimeExports.jsx(SimpleIntegration, { ref: appComponentRef, ...integrationProps }) }), jsxRuntimeExports.jsxs("div", { id: "user-errors", style: { display: isErrorLogsVisible ? undefined : 'none' }, children: [jsxRuntimeExports.jsx(UserErrorsTable, { errors: userErrors, isLoading: isUserErrorsLoading, total: userErrorsTotal, currentPage: userErrorsCurrentPage, rowsPerPage: userErrorsRowsPerPage, searchText: userErrorsSearchText, isSortedAsc: userErrorsIsSortedAsc, onSelect: onSelectUserError, onOptionsChange: onUserErrorsOptionsChange }), jsxRuntimeExports.jsx(AppAlert, { className: "mt-4", children: "This table displays the most recent
|
|
36877
|
+
return (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("div", { className: "flex min-h-0 flex-1 flex-col", style: { display: isErrorLogsVisible ? 'none' : undefined }, children: jsxRuntimeExports.jsx(SimpleIntegration, { ref: appComponentRef, ...integrationProps }) }), jsxRuntimeExports.jsxs("div", { id: "user-errors", style: { display: isErrorLogsVisible ? undefined : 'none' }, children: [jsxRuntimeExports.jsx(UserErrorsTable, { errors: userErrors, isLoading: isUserErrorsLoading, total: userErrorsTotal, currentPage: userErrorsCurrentPage, rowsPerPage: userErrorsRowsPerPage, searchText: userErrorsSearchText, isSortedAsc: userErrorsIsSortedAsc, onSelect: onSelectUserError, onOptionsChange: onUserErrorsOptionsChange }), jsxRuntimeExports.jsx(AppAlert, { className: "mt-4", children: "This table displays the most recent logs from the past month. Logs older than one month will be automatically deleted." })] })] }));
|
|
36841
36878
|
};
|
|
36842
36879
|
|
|
36843
36880
|
function Progress({ className, value, ...props }) {
|
|
@@ -36931,26 +36968,18 @@ Defaulting to \`null\`.`;
|
|
|
36931
36968
|
}) }))] }));
|
|
36932
36969
|
});
|
|
36933
36970
|
|
|
36934
|
-
const TopBar = ({ notice, isNoticeVisible, checkSubscription, subscriptionInfo, isErrorLogsVisible, isManager, infoModal,
|
|
36971
|
+
const TopBar = ({ notice, isNoticeVisible, checkSubscription, subscriptionInfo, isErrorLogsVisible, isManager, infoModal, onCloseNotice, onShowIntegration, onShowErrorLogs, onShowPermissions, onOpenInfoModal, onOpenSettings, }) => {
|
|
36935
36972
|
const isMobile = useIsMobile();
|
|
36936
36973
|
const actions = [
|
|
36937
36974
|
...(isManager ? [{ key: 'share', label: 'Share', icon: Link, onClick: onShowPermissions }] : []),
|
|
36938
36975
|
...(infoModal ? [{ key: 'info', label: infoModal.title, icon: Info, onClick: onOpenInfoModal }] : []),
|
|
36939
|
-
|
|
36940
|
-
{
|
|
36941
|
-
key: 'logout',
|
|
36942
|
-
label: 'Log out',
|
|
36943
|
-
icon: CircleUserRound,
|
|
36944
|
-
onClick: onLogout,
|
|
36945
|
-
disabled: !isOwner,
|
|
36946
|
-
title: !isOwner ? 'Only the owner can log out' : undefined,
|
|
36947
|
-
},
|
|
36976
|
+
{ key: 'settings', label: 'Settings', icon: Settings, onClick: onOpenSettings },
|
|
36948
36977
|
];
|
|
36949
|
-
return (jsxRuntimeExports.jsxs("div", { className: "mb-2.5 text-right", children: [notice && isNoticeVisible && (jsxRuntimeExports.jsxs(AppAlert, { id: "notice", title: notice.title, hideIcon: !notice.icon, variant: getAlertVariant(notice.type), className: "mb-3 pr-12 text-left", children: [jsxRuntimeExports.jsx("
|
|
36978
|
+
return (jsxRuntimeExports.jsxs("div", { className: "mb-2.5 text-right", children: [notice && isNoticeVisible && (jsxRuntimeExports.jsxs(AppAlert, { id: "notice", title: notice.title, hideIcon: !notice.icon, variant: getAlertVariant(notice.type), className: "mb-3 pr-12 text-left", children: [jsxRuntimeExports.jsx("div", { className: "html-content", dangerouslySetInnerHTML: { __html: notice.content } }), notice.close && (jsxRuntimeExports.jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Close notice", onClick: () => onCloseNotice('notice'), className: "absolute right-1 top-1", children: jsxRuntimeExports.jsx(X, {}) }))] })), checkSubscription && subscriptionInfo && (jsxRuntimeExports.jsx(AppAlert, { id: "subscription-info", hideIcon: true, variant: "warning", className: "mb-3", children: jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-center", children: [jsxRuntimeExports.jsxs("p", { className: "m-0", children: ["Your trial expires in ", subscriptionInfo.daysLeft, " days."] }), jsxRuntimeExports.jsx(Button, { className: "ml-2", variant: "default", onClick: () => {
|
|
36950
36979
|
if (subscriptionInfo === null || subscriptionInfo === void 0 ? void 0 : subscriptionInfo.subscribeLink) {
|
|
36951
36980
|
window.open(subscriptionInfo.subscribeLink, '_blank', 'noopener,noreferrer');
|
|
36952
36981
|
}
|
|
36953
|
-
}, children: "Subscribe" })] }) })), jsxRuntimeExports.jsxs("div", { id: "buttons", className: "flex w-full items-center gap-2", children: [jsxRuntimeExports.jsxs("div", { className: "mr-auto shrink-0", children: [jsxRuntimeExports.jsx("span", { style: { display: isErrorLogsVisible ? undefined : 'none' }, children: jsxRuntimeExports.jsxs(Button, { id: "show-integration-btn", variant: "outline", onClick: onShowIntegration, children: [jsxRuntimeExports.jsx(ArrowLeft, {}), "Integration"] }) }), jsxRuntimeExports.jsx("span", { style: { display: isErrorLogsVisible ? 'none' : undefined }, children: jsxRuntimeExports.jsxs(Button, { id: "show-error-logs-btn", variant: "outline", onClick: onShowErrorLogs, children: [jsxRuntimeExports.jsx(List$1, {}), "
|
|
36982
|
+
}, children: "Subscribe" })] }) })), jsxRuntimeExports.jsxs("div", { id: "buttons", className: "flex w-full items-center gap-2", children: [jsxRuntimeExports.jsxs("div", { className: "mr-auto shrink-0", children: [jsxRuntimeExports.jsx("span", { style: { display: isErrorLogsVisible ? undefined : 'none' }, children: jsxRuntimeExports.jsxs(Button, { id: "show-integration-btn", variant: "outline", onClick: onShowIntegration, children: [jsxRuntimeExports.jsx(ArrowLeft, {}), "Integration"] }) }), jsxRuntimeExports.jsx("span", { style: { display: isErrorLogsVisible ? 'none' : undefined }, children: jsxRuntimeExports.jsxs(Button, { id: "show-error-logs-btn", variant: "outline", onClick: onShowErrorLogs, children: [jsxRuntimeExports.jsx(List$1, {}), "Logs"] }) })] }), isMobile ? (
|
|
36954
36983
|
// Labelled buttons cannot fit a phone width, and the row does not
|
|
36955
36984
|
// wrap - left as-is they widen the whole page into a sideways scroll.
|
|
36956
36985
|
jsxRuntimeExports.jsxs(DropdownMenu, { children: [jsxRuntimeExports.jsx(DropdownMenuTrigger, { asChild: true, children: jsxRuntimeExports.jsx(Button, { variant: "outline", size: "icon", "aria-label": "More actions", children: jsxRuntimeExports.jsx(Ellipsis, {}) }) }), jsxRuntimeExports.jsx(DropdownMenuContent, { align: "end", className: "max-w-[calc(100vw-2rem)] min-w-48", children: actions.map((action) => (jsxRuntimeExports.jsxs(DropdownMenuItem, { disabled: action.disabled, onClick: action.onClick, children: [jsxRuntimeExports.jsx(action.icon, {}), jsxRuntimeExports.jsx("span", { className: "truncate", children: action.label })] }, action.key))) })] })) : (actions.map((action) => (jsxRuntimeExports.jsxs(Button, { variant: "outline", className: "min-w-0", disabled: action.disabled, title: action.title, onClick: action.onClick, children: [jsxRuntimeExports.jsx(action.icon, {}), jsxRuntimeExports.jsx("span", { className: "truncate", children: action.label })] }, action.key))))] })] }));
|
|
@@ -37724,6 +37753,8 @@ Defaulting to \`null\`.`;
|
|
|
37724
37753
|
}, []);
|
|
37725
37754
|
function handleRefreshFilesList(detail) {
|
|
37726
37755
|
if (detail.refreshIntegration) {
|
|
37756
|
+
savedIntegrationData.current = null;
|
|
37757
|
+
currentOpenedFolders.current = null;
|
|
37727
37758
|
getIntegrationData({ hardReload: true });
|
|
37728
37759
|
}
|
|
37729
37760
|
else if (detail.refreshCrowdin) {
|
|
@@ -37760,9 +37791,11 @@ Defaulting to \`null\`.`;
|
|
|
37760
37791
|
if (isEmptySearch && savedIntegrationData.current && hasLoadMoreElements.current) {
|
|
37761
37792
|
appComponent.current.setIntegrationFilesData(savedIntegrationData.current);
|
|
37762
37793
|
appComponent.current.setIntegrationOpenedFolders(currentOpenedFolders.current);
|
|
37794
|
+
savedIntegrationData.current = null;
|
|
37795
|
+
currentOpenedFolders.current = null;
|
|
37763
37796
|
return;
|
|
37764
37797
|
}
|
|
37765
|
-
if (!isEmptySearch && hasLoadMoreElements.current) {
|
|
37798
|
+
if (!isEmptySearch && hasLoadMoreElements.current && !savedIntegrationData.current) {
|
|
37766
37799
|
savedIntegrationData.current = await appComponent.current.getIntegrationFilesData();
|
|
37767
37800
|
currentOpenedFolders.current = await appComponent.current.getIntegrationOpenedFolders();
|
|
37768
37801
|
}
|
|
@@ -38108,7 +38141,7 @@ Defaulting to \`null\`.`;
|
|
|
38108
38141
|
async function getActiveJobs() {
|
|
38109
38142
|
try {
|
|
38110
38143
|
const restParams = await checkOrigin();
|
|
38111
|
-
const jobs = await checkResponse(await fetch(`api/all-jobs${restParams}`));
|
|
38144
|
+
const jobs = await checkResponse(await fetch(`api/all-jobs${restParams}&finished=false&limit=100`));
|
|
38112
38145
|
if (!Array.isArray(jobs)) {
|
|
38113
38146
|
return;
|
|
38114
38147
|
}
|
|
@@ -38419,6 +38452,9 @@ Defaulting to \`null\`.`;
|
|
|
38419
38452
|
function Dialog({ ...props }) {
|
|
38420
38453
|
return jsxRuntimeExports.jsx(Dialog$1, { "data-slot": "dialog", ...props });
|
|
38421
38454
|
}
|
|
38455
|
+
function DialogTrigger({ ...props }) {
|
|
38456
|
+
return jsxRuntimeExports.jsx(DialogTrigger$1, { "data-slot": "dialog-trigger", ...props });
|
|
38457
|
+
}
|
|
38422
38458
|
function DialogPortal({ ...props }) {
|
|
38423
38459
|
return jsxRuntimeExports.jsx(DialogPortal$1, { "data-slot": "dialog-portal", ...props });
|
|
38424
38460
|
}
|
|
@@ -49134,7 +49170,7 @@ Defaulting to \`null\`.`;
|
|
|
49134
49170
|
return reactExports.useRef(null);
|
|
49135
49171
|
}
|
|
49136
49172
|
|
|
49137
|
-
const AppDialog = reactExports.forwardRef(({ id, title, width = '70', showCloseButton = true, children, footer, className, onClose }, ref) => {
|
|
49173
|
+
const AppDialog = reactExports.forwardRef(({ id, title, description, width = '70', showCloseButton = true, children, footer, className, onClose }, ref) => {
|
|
49138
49174
|
const [isOpen, setIsOpen] = reactExports.useState(false);
|
|
49139
49175
|
const [portalContainer, setPortalContainer] = reactExports.useState(null);
|
|
49140
49176
|
const contentRef = reactExports.useRef(null);
|
|
@@ -49158,7 +49194,7 @@ Defaulting to \`null\`.`;
|
|
|
49158
49194
|
var _a;
|
|
49159
49195
|
event.preventDefault();
|
|
49160
49196
|
(_a = contentRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
49161
|
-
}, className: cn('max-h-[calc(100dvh-2rem)] grid-rows-[auto_minmax(0,1fr)_auto] overflow-visible', widthClassName, className), children: jsxRuntimeExports.jsxs(ComboboxPortalContainerProvider, { container: portalContainer, children: [jsxRuntimeExports.jsxs(DialogHeader, { className: "shrink-0", children: [jsxRuntimeExports.jsx(DialogTitle, { children: title || 'Details' }), jsxRuntimeExports.jsx(DialogDescription, { className:
|
|
49197
|
+
}, className: cn('max-h-[calc(100dvh-2rem)] grid-rows-[auto_minmax(0,1fr)_auto] overflow-visible', widthClassName, className), children: jsxRuntimeExports.jsxs(ComboboxPortalContainerProvider, { container: portalContainer, children: [jsxRuntimeExports.jsxs(DialogHeader, { className: "shrink-0", children: [jsxRuntimeExports.jsx(DialogTitle, { children: title || 'Details' }), jsxRuntimeExports.jsx(DialogDescription, { className: cn(!description && 'sr-only'), children: description !== null && description !== void 0 ? description : (typeof title === 'string' ? `${title} dialog` : 'Dialog details') })] }), jsxRuntimeExports.jsx(ScrollArea, { type: "auto", className: "-mr-6 -ml-1 h-full min-h-0 min-w-0", children: jsxRuntimeExports.jsx("div", { className: "min-w-0 overflow-x-hidden py-1 pr-6 pl-1", children: children }) }), footer && (jsxRuntimeExports.jsx(DialogFooter, { className: "mx-0 mb-0 shrink-0 rounded-none border-t-0 bg-transparent p-0", children: footer })), jsxRuntimeExports.jsx("div", { ref: setPortalContainer, className: "contents" })] }) }) }));
|
|
49162
49198
|
});
|
|
49163
49199
|
AppDialog.displayName = 'AppDialog';
|
|
49164
49200
|
|
|
@@ -49265,14 +49301,14 @@ Defaulting to \`null\`.`;
|
|
|
49265
49301
|
};
|
|
49266
49302
|
|
|
49267
49303
|
const InfoModal = ({ modalRef, infoModal }) => {
|
|
49268
|
-
return (jsxRuntimeExports.jsx(AppDialog, { ref: modalRef, id: "info-modal", width: "50", title: infoModal.title, children: jsxRuntimeExports.jsx("div", { dangerouslySetInnerHTML: { __html: infoModal.content } }) }));
|
|
49304
|
+
return (jsxRuntimeExports.jsx(AppDialog, { ref: modalRef, id: "info-modal", width: "50", title: infoModal.title, children: jsxRuntimeExports.jsx("div", { className: "html-content text-sm leading-relaxed", dangerouslySetInnerHTML: { __html: infoModal.content } }) }));
|
|
49269
49305
|
};
|
|
49270
49306
|
|
|
49271
49307
|
function Switch({ className, size = 'default', ...props }) {
|
|
49272
49308
|
return (jsxRuntimeExports.jsx(Switch$1, { "data-slot": "switch", "data-size": size, className: cn('peer group/switch inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-[1.15rem] data-[size=default]:w-8 data-[size=sm]:h-3.5 data-[size=sm]:w-6 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input dark:data-[state=unchecked]:bg-input/80', className), ...props, children: jsxRuntimeExports.jsx(SwitchThumb, { "data-slot": "switch-thumb", className: cn('pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0 dark:data-[state=checked]:bg-primary-foreground dark:data-[state=unchecked]:bg-foreground') }) }));
|
|
49273
49309
|
}
|
|
49274
49310
|
|
|
49275
|
-
const FieldShell = reactExports.forwardRef(({ label, helpText, helpTextHtml, htmlFor, errorText, className, children, ...props }, ref) => (jsxRuntimeExports.jsxs(Field, { ref: ref, "data-invalid": Boolean(errorText) || undefined, className: className, ...props, children: [label && jsxRuntimeExports.jsx(FieldLabel, { htmlFor: htmlFor, children: label }), children, helpText && jsxRuntimeExports.jsx(FieldDescription, { children: helpText }), helpTextHtml && jsxRuntimeExports.jsx(FieldDescription, { dangerouslySetInnerHTML: { __html: helpTextHtml } }), jsxRuntimeExports.jsx(FieldError, { errors: errorText ? [{ message: errorText }] : undefined })] })));
|
|
49311
|
+
const FieldShell = reactExports.forwardRef(({ label, helpText, helpTextHtml, htmlFor, errorText, className, children, ...props }, ref) => (jsxRuntimeExports.jsxs(Field, { ref: ref, "data-invalid": Boolean(errorText) || undefined, className: className, ...props, children: [label && jsxRuntimeExports.jsx(FieldLabel, { htmlFor: htmlFor, children: label }), children, helpText && jsxRuntimeExports.jsx(FieldDescription, { children: helpText }), helpTextHtml && (jsxRuntimeExports.jsx(FieldDescription, { className: "html-content [&>a]:no-underline [&>a:hover]:underline", dangerouslySetInnerHTML: { __html: helpTextHtml } })), jsxRuntimeExports.jsx(FieldError, { errors: errorText ? [{ message: errorText }] : undefined })] })));
|
|
49276
49312
|
FieldShell.displayName = 'FieldShell';
|
|
49277
49313
|
const FormInput = reactExports.forwardRef(({ id, label, helpText, helpTextHtml, containerClassName, errorText, withCopyButton, value, 'data-dependency': dataDependency, ...props }, ref) => (jsxRuntimeExports.jsx(FieldShell, { label: label, helpText: helpText, helpTextHtml: helpTextHtml, htmlFor: id, errorText: errorText, className: containerClassName, "data-dependency": dataDependency, children: jsxRuntimeExports.jsxs("div", { className: "flex gap-2", children: [jsxRuntimeExports.jsx(Input, { ref: ref, id: id, value: value, "aria-invalid": Boolean(errorText) || undefined, ...props }), withCopyButton && (jsxRuntimeExports.jsx(Button, { type: "button", size: "icon", variant: "outline", "aria-label": `Copy ${label || 'value'}`, onClick: () => {
|
|
49278
49314
|
var _a;
|
|
@@ -49415,7 +49451,7 @@ Defaulting to \`null\`.`;
|
|
|
49415
49451
|
return (jsxRuntimeExports.jsx("div", { className: row.isWarning ? 'mt-1 text-xs text-destructive' : 'mt-1 text-xs text-muted-foreground', children: row.description }));
|
|
49416
49452
|
}
|
|
49417
49453
|
const PermissionsModal = ({ modalRef, isLoading, permissionUserOptions, selectedUsers, isConfirmVisible, permissionsSummary, hasOrganization, zenModeUrl, saveDisabled, onUsersChange, onSave, }) => {
|
|
49418
|
-
return (jsxRuntimeExports.jsxs(AppDialog, { ref: modalRef, id: "permissions-modal", title: "Share", footer: jsxRuntimeExports.jsx(Button, { id: "confirm-users-btn", disabled: saveDisabled, onClick: onSave, children: "Save" }), children: [jsxRuntimeExports.jsx("div", { className: isLoading ? 'absolute inset-0 z-[4] flex items-center justify-center bg-background/30' : 'hidden', children: jsxRuntimeExports.jsx(Spinner, {}) }), jsxRuntimeExports.jsxs("div", { children: [jsxRuntimeExports.jsx(UsersMultiSelect, { options: permissionUserOptions, value: selectedUsers, disabled: isLoading, onValueChange: onUsersChange }), jsxRuntimeExports.jsxs("div", { children: [jsxRuntimeExports.jsx("div", { className: isConfirmVisible ? 'mt-4' : 'hidden', children: jsxRuntimeExports.jsxs(Table, { className: "min-w-[640px] table-fixed", children: [jsxRuntimeExports.jsx(TableHeader, { children: jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsx(TableHead, { className: "w-[40%] px-4", children: "Access" }), jsxRuntimeExports.jsx(TableHead, { className: "w-[35%] px-4", children: "Users" }), jsxRuntimeExports.jsx(TableHead, { className: "w-[25%] px-4 text-right", children: "Upcoming changes" })] }) }), jsxRuntimeExports.jsxs(TableBody, { children: [hasOrganization && (jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsxs(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: [jsxRuntimeExports.jsx("p", { className: "m-0 text-sm", children: "Registration in Organization" }), renderPermissionRowDescription(permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.organization)] }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: renderPermissionUsers(permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.organization) }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 text-right align-top", children: (permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.organization) &&
|
|
49454
|
+
return (jsxRuntimeExports.jsxs(AppDialog, { ref: modalRef, id: "permissions-modal", title: "Share", description: "Invite people who manage content and give them access to this integration, so they can send new content for translation as soon as it's added.", footer: jsxRuntimeExports.jsx(Button, { id: "confirm-users-btn", disabled: saveDisabled, onClick: onSave, children: "Save" }), children: [jsxRuntimeExports.jsx("div", { className: isLoading ? 'absolute inset-0 z-[4] flex items-center justify-center bg-background/30' : 'hidden', children: jsxRuntimeExports.jsx(Spinner, {}) }), jsxRuntimeExports.jsxs("div", { children: [jsxRuntimeExports.jsx(UsersMultiSelect, { options: permissionUserOptions, value: selectedUsers, disabled: isLoading, onValueChange: onUsersChange }), jsxRuntimeExports.jsxs("div", { children: [jsxRuntimeExports.jsx("div", { className: isConfirmVisible ? 'mt-4' : 'hidden', children: jsxRuntimeExports.jsxs(Table, { className: "min-w-[640px] table-fixed", children: [jsxRuntimeExports.jsx(TableHeader, { children: jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsx(TableHead, { className: "w-[40%] px-4", children: "Access" }), jsxRuntimeExports.jsx(TableHead, { className: "w-[35%] px-4", children: "Users" }), jsxRuntimeExports.jsx(TableHead, { className: "w-[25%] px-4 text-right", children: "Upcoming changes" })] }) }), jsxRuntimeExports.jsxs(TableBody, { children: [hasOrganization && (jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsxs(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: [jsxRuntimeExports.jsx("p", { className: "m-0 text-sm", children: "Registration in Organization" }), renderPermissionRowDescription(permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.organization)] }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: renderPermissionUsers(permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.organization) }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 text-right align-top", children: (permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.organization) &&
|
|
49419
49455
|
renderPermissionStatus(permissionsSummary.organization.status) })] })), jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: jsxRuntimeExports.jsx("p", { className: "m-0 text-sm", children: "Project Manager Access" }) }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: renderPermissionUsers(permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.project) }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 text-right align-top", children: (permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.project) &&
|
|
49420
49456
|
renderPermissionStatus(permissionsSummary.project.status) })] }), jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsxs(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: [jsxRuntimeExports.jsx("p", { className: "m-0 text-sm", children: "Application Visibility Access" }), renderPermissionRowDescription(permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.applicationSettings)] }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: renderPermissionUsers(permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.applicationSettings) }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 text-right align-top", children: (permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.applicationSettings) &&
|
|
49421
49457
|
renderPermissionStatus(permissionsSummary.applicationSettings.status) })] }), jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsxs(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: [jsxRuntimeExports.jsx("p", { className: "m-0 text-sm", children: "Access to the Integration" }), jsxRuntimeExports.jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: "This provides access to sync files and modify the current integration settings." })] }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 align-top", children: renderPermissionUsers(permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.applicationCredentials) }), jsxRuntimeExports.jsx(TableCell, { className: "whitespace-normal px-4 py-3 text-right align-top", children: (permissionsSummary === null || permissionsSummary === void 0 ? void 0 : permissionsSummary.applicationCredentials) &&
|
|
@@ -49429,7 +49465,7 @@ Defaulting to \`null\`.`;
|
|
|
49429
49465
|
function renderConfigField(field, settingsFieldChange, registerSettingsField, fieldErrors, suffix = 'settings') {
|
|
49430
49466
|
var _a;
|
|
49431
49467
|
if (!field.key) {
|
|
49432
|
-
return field.labelHtml ? (jsxRuntimeExports.jsx("
|
|
49468
|
+
return field.labelHtml ? (jsxRuntimeExports.jsx("div", { className: "html-content text-sm leading-relaxed", ...(field.dependencySettings ? { 'data-dependency': field.dependencySettings } : {}), dangerouslySetInnerHTML: { __html: field.labelHtml } })) : (jsxRuntimeExports.jsx("p", { className: "m-0 text-sm leading-relaxed", ...(field.dependencySettings ? { 'data-dependency': field.dependencySettings } : {}), children: field.label }));
|
|
49433
49469
|
}
|
|
49434
49470
|
const commonProps = {
|
|
49435
49471
|
id: `${field.key}-${suffix}`,
|
|
@@ -49456,16 +49492,43 @@ Defaulting to \`null\`.`;
|
|
|
49456
49492
|
return null;
|
|
49457
49493
|
}
|
|
49458
49494
|
}
|
|
49459
|
-
const
|
|
49460
|
-
|
|
49461
|
-
|
|
49462
|
-
|
|
49463
|
-
|
|
49464
|
-
|
|
49495
|
+
const DisconnectSection = ({ name, isOwner, hasAutoSync, isDisconnecting, onDisconnect, }) => {
|
|
49496
|
+
const [isOpen, setIsOpen] = reactExports.useState(false);
|
|
49497
|
+
return (jsxRuntimeExports.jsxs("div", { id: "disconnect-section", className: "flex flex-col gap-4 rounded-lg border border-destructive/20 bg-destructive/5 p-4 sm:flex-row sm:items-center", children: [jsxRuntimeExports.jsx(TriangleAlert, { className: "hidden size-5 shrink-0 self-start text-destructive sm:block" }), jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [jsxRuntimeExports.jsx("p", { className: "m-0 text-sm font-medium text-destructive", children: "Disconnect integration" }), jsxRuntimeExports.jsx("p", { className: "m-0 text-sm text-muted-foreground", children: isOwner
|
|
49498
|
+
? `Disconnects ${name} and removes its saved settings for this project.${hasAutoSync ? ' Auto Sync will stop.' : ''}`
|
|
49499
|
+
: 'Only the integration owner can disconnect it.' })] }), jsxRuntimeExports.jsxs(Dialog, { open: isOpen, onOpenChange: (open) => !isDisconnecting && setIsOpen(open), children: [jsxRuntimeExports.jsx(DialogTrigger, { asChild: true, children: jsxRuntimeExports.jsx(Button, { id: "disconnect-btn", variant: "destructive", disabled: !isOwner, className: "shrink-0 self-start sm:self-auto", children: "Disconnect" }) }), jsxRuntimeExports.jsxs(DialogContent, { role: "alertdialog", showCloseButton: false, className: "sm:max-w-md", children: [jsxRuntimeExports.jsxs(DialogHeader, { className: "items-center text-center sm:items-start sm:text-left", children: [jsxRuntimeExports.jsx("div", { className: "mb-2 flex size-10 items-center justify-center rounded-full bg-destructive/10", children: jsxRuntimeExports.jsx(TriangleAlert, { className: "size-5 text-destructive" }) }), jsxRuntimeExports.jsxs(DialogTitle, { children: ["Disconnect ", name, "?"] }), jsxRuntimeExports.jsxs(DialogDescription, { children: [name, " settings", hasAutoSync ? ', Auto Sync selections,' : '', " and logs for this project will be deleted. To use ", name, " again, you'll need to reconnect and set it up again."] })] }), jsxRuntimeExports.jsxs(DialogFooter, { children: [jsxRuntimeExports.jsx(Button, { variant: "outline", disabled: isDisconnecting, onClick: () => setIsOpen(false), children: "Cancel" }), jsxRuntimeExports.jsxs(Button, { id: "disconnect-confirm-btn", variant: "destructive", disabled: isDisconnecting, onClick: onDisconnect, children: [isDisconnecting && jsxRuntimeExports.jsx(Spinner, {}), "Disconnect"] })] })] })] })] }));
|
|
49500
|
+
};
|
|
49501
|
+
const SettingsModal = ({ modalRef, isLoading, configurationFields, isSaveDisabled, settingsFieldChange, registerSettingsField, fieldErrors, onSave, name, isOwner, hasAutoSync, isDisconnecting, onDisconnect, }) => {
|
|
49502
|
+
const hasFields = configurationFields.length > 0;
|
|
49503
|
+
const disconnectSection = (jsxRuntimeExports.jsx(DisconnectSection, { name: name, isOwner: isOwner, hasAutoSync: hasAutoSync, isDisconnecting: isDisconnecting, onDisconnect: onDisconnect }));
|
|
49504
|
+
const contentRef = reactExports.useRef(null);
|
|
49505
|
+
const observerRef = reactExports.useRef(null);
|
|
49506
|
+
const [contentHeight, setContentHeight] = reactExports.useState();
|
|
49507
|
+
// Animate height on tab switch
|
|
49508
|
+
const measureRef = reactExports.useCallback((node) => {
|
|
49509
|
+
var _a;
|
|
49510
|
+
contentRef.current = node;
|
|
49511
|
+
(_a = observerRef.current) === null || _a === void 0 ? void 0 : _a.disconnect();
|
|
49512
|
+
setContentHeight(undefined);
|
|
49513
|
+
if (!node || typeof ResizeObserver === 'undefined') {
|
|
49514
|
+
return;
|
|
49515
|
+
}
|
|
49516
|
+
observerRef.current = new ResizeObserver(() => setContentHeight(node.offsetHeight));
|
|
49517
|
+
observerRef.current.observe(node);
|
|
49518
|
+
}, []);
|
|
49519
|
+
return (jsxRuntimeExports.jsxs(AppDialog, { ref: modalRef, id: "settings-modal", width: "65", title: "Settings", className: "top-[5dvh] max-h-[90dvh] translate-y-0", footer: hasFields && (jsxRuntimeExports.jsx(Button, { id: "settings-save-btn", disabled: isSaveDisabled, onClick: onSave, children: "Save" })), children: [jsxRuntimeExports.jsx("div", { className: isLoading ? 'absolute inset-0 z-[4] flex items-center justify-center bg-white/30' : 'hidden', children: jsxRuntimeExports.jsx(Spinner, {}) }), jsxRuntimeExports.jsx("div", { className: "-m-1 overflow-hidden transition-[height] duration-200 ease-out motion-reduce:transition-none", style: contentHeight === undefined ? undefined : { height: contentHeight }, children: jsxRuntimeExports.jsxs("div", { id: "modal-content", ref: measureRef, className: "p-1", children: [!hasFields && disconnectSection, jsxRuntimeExports.jsxs(Tabs, { className: hasFields ? undefined : 'hidden', defaultValue: "tab-0", onValueChange: () => {
|
|
49520
|
+
var _a;
|
|
49521
|
+
const viewport = (_a = contentRef.current) === null || _a === void 0 ? void 0 : _a.closest('[data-radix-scroll-area-viewport]');
|
|
49522
|
+
if (viewport) {
|
|
49523
|
+
viewport.scrollTop = 0;
|
|
49524
|
+
}
|
|
49525
|
+
}, children: [jsxRuntimeExports.jsx(TabsList, { children: configurationFields.map((tab, tabIndex) => (jsxRuntimeExports.jsx(TabsTrigger, { value: `tab-${tabIndex}`, children: tab.name }, tab.name))) }), configurationFields.map((tab, tabIndex) => (
|
|
49526
|
+
// forceMount: fields are ref-driven
|
|
49527
|
+
jsxRuntimeExports.jsxs(TabsContent, { value: `tab-${tabIndex}`, forceMount: true, className: "data-[state=inactive]:hidden", children: [jsxRuntimeExports.jsx(FieldGroup, { children: tab.fields.map((field, fieldIndex) => (jsxRuntimeExports.jsx(reactExports.Fragment, { children: renderConfigField(field, settingsFieldChange, registerSettingsField, fieldErrors) }, field.key || `${tabIndex}-${fieldIndex}`))) }), tabIndex === 0 && jsxRuntimeExports.jsx("div", { className: "mt-8", children: disconnectSection })] }, tab.name)))] })] }) })] }));
|
|
49465
49528
|
};
|
|
49466
49529
|
|
|
49467
|
-
const SubscriptionModal = ({ modalRef, subscriptionLink, name, onLogout }) => {
|
|
49468
|
-
return (jsxRuntimeExports.jsx(AppDialog, { ref: modalRef, id: "subscription-modal", width: "50", showCloseButton: false, footer: jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx(Button, { variant: "default", onClick: () => { var _a; return window.open((_a = subscriptionLink.current) !== null && _a !== void 0 ? _a : '', '_blank', 'noopener,noreferrer'); }, children: "Subscribe" }), jsxRuntimeExports.jsx(Button, { variant: "outline", onClick: () => window.open('https://crowdin.com/contacts', '_blank', 'noopener,noreferrer'), children: "Contact us" }), jsxRuntimeExports.
|
|
49530
|
+
const SubscriptionModal = ({ modalRef, subscriptionLink, name, isDisconnecting, onLogout, }) => {
|
|
49531
|
+
return (jsxRuntimeExports.jsx(AppDialog, { ref: modalRef, id: "subscription-modal", width: "50", showCloseButton: false, footer: jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx(Button, { variant: "default", onClick: () => { var _a; return window.open((_a = subscriptionLink.current) !== null && _a !== void 0 ? _a : '', '_blank', 'noopener,noreferrer'); }, children: "Subscribe" }), jsxRuntimeExports.jsx(Button, { variant: "outline", onClick: () => window.open('https://crowdin.com/contacts', '_blank', 'noopener,noreferrer'), children: "Contact us" }), jsxRuntimeExports.jsxs(Button, { variant: "secondary", disabled: isDisconnecting, onClick: onLogout, children: [isDisconnecting && jsxRuntimeExports.jsx(Spinner, {}), "Disconnect"] })] }), children: jsxRuntimeExports.jsxs(AppAlert, { variant: "warning", children: ["Subscribe to continue using the ", name, " app."] }) }));
|
|
49469
49532
|
};
|
|
49470
49533
|
|
|
49471
49534
|
function isJSON(string) {
|
|
@@ -49549,6 +49612,7 @@ Defaulting to \`null\`.`;
|
|
|
49549
49612
|
const subscriptionLink = reactExports.useRef('');
|
|
49550
49613
|
const refreshDependencies = useFieldDependencies(configurationFields);
|
|
49551
49614
|
const [isNoticeVisible, setIsNoticeVisible] = reactExports.useState(false);
|
|
49615
|
+
const [isDisconnecting, setIsDisconnecting] = reactExports.useState(false);
|
|
49552
49616
|
const [subscriptionInfo, setSubscriptionInfo] = reactExports.useState(null);
|
|
49553
49617
|
const [isErrorLogsVisible, setIsErrorLogsVisible] = reactExports.useState(false);
|
|
49554
49618
|
const [userErrors, setUserErrors] = reactExports.useState([]);
|
|
@@ -49602,7 +49666,6 @@ Defaulting to \`null\`.`;
|
|
|
49602
49666
|
if (event.keyCode === 27) {
|
|
49603
49667
|
closeModal(permissionsModalRef.current);
|
|
49604
49668
|
closeModal(infoModalRef.current);
|
|
49605
|
-
closeModal(settingsModalRef.current);
|
|
49606
49669
|
closeModal(scheduleModalRef.current);
|
|
49607
49670
|
if (syncOps.languageModalRef.current) {
|
|
49608
49671
|
closeModal(syncOps.languageModalRef.current);
|
|
@@ -49642,6 +49705,8 @@ Defaulting to \`null\`.`;
|
|
|
49642
49705
|
}
|
|
49643
49706
|
}
|
|
49644
49707
|
async function integrationLogout() {
|
|
49708
|
+
// not reset on success: the page reloads
|
|
49709
|
+
setIsDisconnecting(true);
|
|
49645
49710
|
try {
|
|
49646
49711
|
const queryParams = await checkOrigin();
|
|
49647
49712
|
await checkResponse(await fetch(`api/logout${queryParams}`, { method: 'POST' }));
|
|
@@ -49649,7 +49714,8 @@ Defaulting to \`null\`.`;
|
|
|
49649
49714
|
localStorage.removeItem(`revised_${name}`);
|
|
49650
49715
|
}
|
|
49651
49716
|
catch (e) {
|
|
49652
|
-
|
|
49717
|
+
setIsDisconnecting(false);
|
|
49718
|
+
catchRejection(e, e.error || "Can't disconnect the integration");
|
|
49653
49719
|
}
|
|
49654
49720
|
}
|
|
49655
49721
|
function closeAlert(suffix) {
|
|
@@ -49678,7 +49744,7 @@ Defaulting to \`null\`.`;
|
|
|
49678
49744
|
}
|
|
49679
49745
|
catch (e) {
|
|
49680
49746
|
if (requestId === userErrorsRequestId.current) {
|
|
49681
|
-
catchRejection(e, "Can't fetch
|
|
49747
|
+
catchRejection(e, "Can't fetch logs");
|
|
49682
49748
|
}
|
|
49683
49749
|
}
|
|
49684
49750
|
finally {
|
|
@@ -49744,10 +49810,10 @@ Defaulting to \`null\`.`;
|
|
|
49744
49810
|
function showIntegration() {
|
|
49745
49811
|
setIsErrorLogsVisible(false);
|
|
49746
49812
|
}
|
|
49747
|
-
return (jsxRuntimeExports.jsxs("div", { children: [jsxRuntimeExports.jsxs("div", { className: "mx-auto max-w-[1420px] px-6 py-4", children: [jsxRuntimeExports.jsx(TopBar, { notice: notice, isNoticeVisible: isNoticeVisible, checkSubscription: checkSubscription, subscriptionInfo: subscriptionInfo, isErrorLogsVisible: isErrorLogsVisible, isManager: isManager, infoModal: infoModal,
|
|
49813
|
+
return (jsxRuntimeExports.jsxs("div", { className: cn('flex flex-col', isErrorLogsVisible ? 'min-h-full' : 'h-full'), children: [jsxRuntimeExports.jsxs("div", { className: "mx-auto flex min-h-0 w-full max-w-[1420px] flex-1 flex-col px-6 py-4", children: [jsxRuntimeExports.jsx(TopBar, { notice: notice, isNoticeVisible: isNoticeVisible, checkSubscription: checkSubscription, subscriptionInfo: subscriptionInfo, isErrorLogsVisible: isErrorLogsVisible, isManager: isManager, infoModal: infoModal, onCloseNotice: closeAlert, onShowIntegration: showIntegration, onShowErrorLogs: showErrorLogs, onShowPermissions: permissions.showPermissionsDialog, onOpenInfoModal: () => openModal(infoModalRef.current), onOpenSettings: () => {
|
|
49748
49814
|
openModal(settingsModalRef.current);
|
|
49749
49815
|
setTimeout(settings.fillSettingsForm, 0);
|
|
49750
|
-
}
|
|
49816
|
+
} }), jsxRuntimeExports.jsx(IntegrationView, { appComponentRef: appComponent, userErrors: userErrors, isUserErrorsLoading: isUserErrorsLoading, userErrorsTotal: userErrorsTotal, userErrorsCurrentPage: userErrorsCurrentPage, userErrorsRowsPerPage: userErrorsRowsPerPage, userErrorsSearchText: userErrorsSearchText, userErrorsIsSortedAsc: userErrorsIsSortedAsc, onSelectUserError: openUserErrorDetail, onUserErrorsOptionsChange: onUserErrorsOptionsChange, name: name, isErrorLogsVisible: isErrorLogsVisible, syncNewElements: syncNewElements, withCronSync: withCronSync, webhooks: webhooks, integrationOneLevelFetching: integrationOneLevelFetching, integrationSearchListener: integrationSearchListener, filtering: filtering, integrationButtonMenuItems: integrationButtonMenuItems, crowdinButtonMenuItems: crowdinButtonMenuItems, onRefreshFilesList: syncOps.handleRefreshFilesList, onFolderToggle: syncOps.handleFolderToggle, onUploadFilesToCrowdin: (detail) => syncOps.uploadFilesToCrowdin({ detail }), onUploadFilesToIntegration: (detail) => syncOps.uploadFilesToIntegration({ detail }), onLoadMore: syncOps.handleLoadMore, onIntegrationFilterChange: syncOps.handleIntegrationFilterChange, onIntegrationScheduleSync: (detail) => schedule.setIntegrationScheduleSync({ detail }), onCrowdinScheduleSync: (detail) => schedule.setCrowdinScheduleSync({ detail }), onIntegrationDisableSync: (detail) => schedule.disableIntegrationSync({ detail }), onCrowdinDisableSync: (detail) => schedule.disableCrowdinSync({ detail }) })] }), jsxRuntimeExports.jsx(Toaster, {}), jsxRuntimeExports.jsx(AsyncProgress, { ref: asyncProgressRef, onCancelJob: syncOps.cancelJob }), jsxRuntimeExports.jsx(SubscriptionModal, { modalRef: subscriptionModal, subscriptionLink: subscriptionLink, name: name, isDisconnecting: isDisconnecting, onLogout: integrationLogout }), jsxRuntimeExports.jsx(PermissionsModal, { modalRef: permissionsModalRef, isLoading: permissions.isLoading, permissionUserOptions: permissions.permissionUserOptions, selectedUsers: permissions.permissionsSelectedUsers, isConfirmVisible: permissions.isPermissionsConfirmVisible, permissionsSummary: permissions.permissionsSummary, hasOrganization: hasOrganization, zenModeUrl: zenModeUrl, saveDisabled: !permissions.isPermissionsLoaded, onUsersChange: permissions.checkUsers, onSave: permissions.inviteUsers }), excludedTargetLanguages && (jsxRuntimeExports.jsx(ExcludedLanguagesModal, { modalRef: syncOps.languageModalRef, languageSelectRef: syncOps.languageSelectRef, languageModalState: syncOps.languageModalState, onUpdateTargetLanguages: syncOps.updateCrowdinFilesTargetLanguages, onSyncToCrowdin: syncOps.uploadFilesToCrowdinWithExcludedLanguages })), infoModal && jsxRuntimeExports.jsx(InfoModal, { modalRef: infoModalRef, infoModal: infoModal }), jsxRuntimeExports.jsx(SettingsModal, { modalRef: settingsModalRef, isLoading: settings.isLoading, configurationFields: configurationFields !== null && configurationFields !== void 0 ? configurationFields : [], isSaveDisabled: settings.isSettingsSaveDisabled, settingsFieldChange: settings.settingsFieldChange, registerSettingsField: settings.registerSettingsField, fieldErrors: settings.fieldErrors, onSave: settings.saveSettings, name: name, isOwner: isOwner, hasAutoSync: !!(withCronSync || webhooks), isDisconnecting: isDisconnecting, onDisconnect: integrationLogout }), ((syncNewElements === null || syncNewElements === void 0 ? void 0 : syncNewElements.crowdin) || (syncNewElements === null || syncNewElements === void 0 ? void 0 : syncNewElements.integration)) && (jsxRuntimeExports.jsx(ScheduleModal, { modalRef: scheduleModalRef, selectedFilesCheckboxRef: schedule.selectedFilesCheckboxRef, allFolderFilesCheckboxRef: schedule.allFolderFilesCheckboxRef, newFilesCheckboxRef: schedule.newFilesCheckboxRef, scheduleModalState: schedule.scheduleModalState, isSaveDisabled: schedule.isScheduleSaveDisabled, onChangeOptions: schedule.onChangeAutoSynchronizationOptions, onSave: schedule.saveScheduleSync })), jsxRuntimeExports.jsx(UserErrorDetailModal, { modalRef: userErrorDetailModalRef, selectedUserError: selectedUserError, onClose: onUserErrorDetailClose })] }));
|
|
49751
49817
|
};
|
|
49752
49818
|
|
|
49753
49819
|
initializeCrowdinIframeContext();
|