@cobaltcore-dev/aurora 0.5.0 → 0.7.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/README.md +59 -13
- package/dist/client/{ContentHeader-xQVhO2yT.mjs → ContentHeader-kx1Th5Sq.mjs} +18 -18
- package/dist/client/{ContentHeader-xQVhO2yT.mjs.map → ContentHeader-kx1Th5Sq.mjs.map} +1 -1
- package/dist/client/{DeleteFlavorModal-CHTUZ3YV.mjs → DeleteFlavorModal-C3cb7YiJ.mjs} +155 -155
- package/dist/client/{DeleteFlavorModal-CHTUZ3YV.mjs.map → DeleteFlavorModal-C3cb7YiJ.mjs.map} +1 -1
- package/dist/client/{EditSecurityGroupModal-CWHHx2Xk.mjs → EditSecurityGroupModal-CpP54WIK.mjs} +18 -18
- package/dist/client/{EditSecurityGroupModal-CWHHx2Xk.mjs.map → EditSecurityGroupModal-CpP54WIK.mjs.map} +1 -1
- package/dist/client/{FiltersInput-UKJpNFdr.mjs → FiltersInput-DxcyR6Bp.mjs} +18 -18
- package/dist/client/{FiltersInput-UKJpNFdr.mjs.map → FiltersInput-DxcyR6Bp.mjs.map} +1 -1
- package/dist/client/{FloatingIpActionModals-caXn6bYo.mjs → FloatingIpActionModals-BP8RWHbu.mjs} +55 -55
- package/dist/client/{FloatingIpActionModals-caXn6bYo.mjs.map → FloatingIpActionModals-BP8RWHbu.mjs.map} +1 -1
- package/dist/client/{ImageToastNotifications-BWimIzu_.mjs → ImageToastNotifications-TZ3EfQg-.mjs} +323 -371
- package/dist/client/ImageToastNotifications-TZ3EfQg-.mjs.map +1 -0
- package/dist/client/{RouteError-CUj_m3gu.mjs → RouteError-QSV7qOoJ.mjs} +2 -2
- package/dist/client/{RouteError-CUj_m3gu.mjs.map → RouteError-QSV7qOoJ.mjs.map} +1 -1
- package/dist/client/{SortInput-GQlQBlAj.mjs → SortInput-CYv2_Pur.mjs} +5 -5
- package/dist/client/{SortInput-GQlQBlAj.mjs.map → SortInput-CYv2_Pur.mjs.map} +1 -1
- package/dist/client/_auth-DXJkv9QO.mjs.map +1 -1
- package/dist/client/{_flavorId-sUWG0xuy.mjs → _flavorId-C2x43-6S.mjs} +9 -9
- package/dist/client/{_flavorId-sUWG0xuy.mjs.map → _flavorId-C2x43-6S.mjs.map} +1 -1
- package/dist/client/{_flavorId-C5dc1N_j.mjs → _flavorId-CR8ZUI-P.mjs} +46 -46
- package/dist/client/{_flavorId-C5dc1N_j.mjs.map → _flavorId-CR8ZUI-P.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-CT4y-60o.mjs → _floatingIpId-BCk41_Lb.mjs} +2 -2
- package/dist/client/{_floatingIpId-CT4y-60o.mjs.map → _floatingIpId-BCk41_Lb.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-COK_TBrz2.mjs → _floatingIpId-BGrOAmPT.mjs} +33 -33
- package/dist/client/_floatingIpId-BGrOAmPT.mjs.map +1 -0
- package/dist/client/_imageId-CvfD832b.mjs +534 -0
- package/dist/client/{_imageId-n3RcnhAR.mjs.map → _imageId-CvfD832b.mjs.map} +1 -1
- package/dist/client/_pcaId-BxBt5DXi.mjs +459 -0
- package/dist/client/_pcaId-BxBt5DXi.mjs.map +1 -0
- package/dist/client/{_pcaId-ChnM_t-9.mjs → _pcaId-DOHycvCf.mjs} +2 -2
- package/dist/client/{_pcaId-ChnM_t-9.mjs.map → _pcaId-DOHycvCf.mjs.map} +1 -1
- package/dist/client/{_projectId-26bw-_rm.mjs → _projectId-BDSWnMGj.mjs} +3 -3
- package/dist/client/{_projectId-26bw-_rm.mjs.map → _projectId-BDSWnMGj.mjs.map} +1 -1
- package/dist/client/{_projectId-Dhb4AyBD.mjs → _projectId-DOgwFiqD.mjs} +2 -2
- package/dist/client/{_projectId-Dhb4AyBD.mjs.map → _projectId-DOgwFiqD.mjs.map} +1 -1
- package/dist/client/_projectId-DS4nR59B.mjs +299 -0
- package/dist/client/_projectId-DS4nR59B.mjs.map +1 -0
- package/dist/client/{_projectId-BK9UqeYw.mjs → _projectId-MxcHrXW4.mjs} +12 -12
- package/dist/client/_projectId-MxcHrXW4.mjs.map +1 -0
- package/dist/client/{_securityGroupId-CR1mKICQ.mjs → _securityGroupId-CJJanWiY.mjs} +2 -2
- package/dist/client/{_securityGroupId-CR1mKICQ.mjs.map → _securityGroupId-CJJanWiY.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-DroYG6cA.mjs → _securityGroupId-KKw4RPdH.mjs} +328 -328
- package/dist/client/{_securityGroupId-DroYG6cA.mjs.map → _securityGroupId-KKw4RPdH.mjs.map} +1 -1
- package/dist/client/{containers-DGY2hoWw.mjs → _storageType-4wSxI__0.mjs} +18 -15
- package/dist/client/_storageType-4wSxI__0.mjs.map +1 -0
- package/dist/client/{containers-ZMFTRaQL.mjs → _storageType-DYjo-6ej.mjs} +1054 -1088
- package/dist/client/_storageType-DYjo-6ej.mjs.map +1 -0
- package/dist/client/{containers-xfsYgRyf.mjs → _storageType-zeSZe--V.mjs} +2 -2
- package/dist/client/_storageType-zeSZe--V.mjs.map +1 -0
- package/dist/client/{about-969pIiZ9.mjs → about-Bo9vxGHy.mjs} +8 -8
- package/dist/client/{about-969pIiZ9.mjs.map → about-Bo9vxGHy.mjs.map} +1 -1
- package/dist/client/{build-DracvfrJ.mjs → build-DeJcDjPi.mjs} +3798 -3372
- package/dist/client/build-DeJcDjPi.mjs.map +1 -0
- package/dist/client/constants-BmcGYeR-.mjs +153 -0
- package/dist/client/constants-BmcGYeR-.mjs.map +1 -0
- package/dist/client/{flavors-C4GtoybP.mjs → flavors-BxFVqgnb.mjs} +2 -2
- package/dist/client/{flavors-C4GtoybP.mjs.map → flavors-BxFVqgnb.mjs.map} +1 -1
- package/dist/client/{flavors-CpirO_nr.mjs → flavors-CfdgjsZY.mjs} +192 -192
- package/dist/client/{flavors-CpirO_nr.mjs.map → flavors-CfdgjsZY.mjs.map} +1 -1
- package/dist/client/{floatingips-BUf_oLRl.mjs → floatingips-ByRb82wS.mjs} +123 -123
- package/dist/client/{floatingips-BUf_oLRl.mjs.map → floatingips-ByRb82wS.mjs.map} +1 -1
- package/dist/client/{images-Da1t5KPh.mjs → images-CKqIXUq52.mjs} +613 -613
- package/dist/client/images-CKqIXUq52.mjs.map +1 -0
- package/dist/client/{images-CsonlmFx.mjs → images-C_dX7nY6.mjs} +2 -2
- package/dist/client/{images-CsonlmFx.mjs.map → images-C_dX7nY6.mjs.map} +1 -1
- package/dist/client/{images-QnWf63uj.mjs → images-CenluYV8.mjs} +2 -2
- package/dist/client/{images-QnWf63uj.mjs.map → images-CenluYV8.mjs.map} +1 -1
- package/dist/client/index.js +391 -431
- package/dist/client/index.js.map +1 -1
- package/dist/client/{md-sBiSNVSQ.mjs → md-CYTrL5dq.mjs} +52 -16
- package/dist/client/{md-sBiSNVSQ.mjs.map → md-CYTrL5dq.mjs.map} +1 -1
- package/dist/client/{objects-H0NN_Sja.mjs → objects-BJM6YeuF.mjs} +2131 -1883
- package/dist/client/objects-BJM6YeuF.mjs.map +1 -0
- package/dist/client/{objects-B89dYCBq.mjs → objects-gxSjvbvF.mjs} +36 -21
- package/dist/client/objects-gxSjvbvF.mjs.map +1 -0
- package/dist/client/{objects-CuFLUOe1.mjs → objects-o2Cj_ndZ.mjs} +2 -2
- package/dist/client/objects-o2Cj_ndZ.mjs.map +1 -0
- package/dist/client/{pca-CtU6REww.mjs → pca-Bl8NmoVZ.mjs} +2 -2
- package/dist/client/{pca-CtU6REww.mjs.map → pca-Bl8NmoVZ.mjs.map} +1 -1
- package/dist/client/pca-RSiWpJs9.mjs +182 -0
- package/dist/client/pca-RSiWpJs9.mjs.map +1 -0
- package/dist/client/{projects-DNXsDnJM.mjs → projects-CgclWI16.mjs} +33 -27
- package/dist/client/{projects-DNXsDnJM.mjs.map → projects-CgclWI16.mjs.map} +1 -1
- package/dist/client/{projects-dhnQkuvV.mjs → projects-D2iewAzu.mjs} +2 -2
- package/dist/client/{projects-dhnQkuvV.mjs.map → projects-D2iewAzu.mjs.map} +1 -1
- package/dist/client/{projects-C-sjd9T5.mjs → projects-pe2_dCnV.mjs} +2 -2
- package/dist/client/{projects-C-sjd9T5.mjs.map → projects-pe2_dCnV.mjs.map} +1 -1
- package/dist/client/projects-yiK0HGSA.mjs.map +1 -1
- package/dist/client/{securitygroups-wHdrxZXd.mjs → securitygroups-DahZkVYQ.mjs} +111 -111
- package/dist/client/{securitygroups-wHdrxZXd.mjs.map → securitygroups-DahZkVYQ.mjs.map} +1 -1
- package/dist/client/{useListWithFiltering-DrgUwXef.mjs → useListWithFiltering-DaYcu5AB.mjs} +12 -12
- package/dist/client/{useListWithFiltering-DrgUwXef.mjs.map → useListWithFiltering-DaYcu5AB.mjs.map} +1 -1
- package/dist/server/index.d.ts +571 -2
- package/dist/server/index.js +29 -211
- package/package.json +4 -5
- package/dist/client/ImageToastNotifications-BWimIzu_.mjs.map +0 -1
- package/dist/client/_floatingIpId-COK_TBrz2.mjs.map +0 -1
- package/dist/client/_imageId-n3RcnhAR.mjs +0 -534
- package/dist/client/_pcaId-B-f_6kqs.mjs +0 -466
- package/dist/client/_pcaId-B-f_6kqs.mjs.map +0 -1
- package/dist/client/_projectId-BK9UqeYw.mjs.map +0 -1
- package/dist/client/_projectId-CCtpAQ8m.mjs +0 -299
- package/dist/client/_projectId-CCtpAQ8m.mjs.map +0 -1
- package/dist/client/build-DracvfrJ.mjs.map +0 -1
- package/dist/client/constants-4lVQXort.mjs +0 -128
- package/dist/client/constants-4lVQXort.mjs.map +0 -1
- package/dist/client/containers-DGY2hoWw.mjs.map +0 -1
- package/dist/client/containers-ZMFTRaQL.mjs.map +0 -1
- package/dist/client/containers-xfsYgRyf.mjs.map +0 -1
- package/dist/client/images-Da1t5KPh.mjs.map +0 -1
- package/dist/client/objects-B89dYCBq.mjs.map +0 -1
- package/dist/client/objects-CuFLUOe1.mjs.map +0 -1
- package/dist/client/objects-H0NN_Sja.mjs.map +0 -1
- package/dist/client/pca-C-UFjicP.mjs +0 -167
- package/dist/client/pca-C-UFjicP.mjs.map +0 -1
package/dist/server/index.js
CHANGED
|
@@ -27669,7 +27669,14 @@ var require_esm2 = __commonJS({
|
|
|
27669
27669
|
// src/server/index.ts
|
|
27670
27670
|
var server_exports = {};
|
|
27671
27671
|
__export(server_exports, {
|
|
27672
|
-
|
|
27672
|
+
auroraRouter: () => auroraRouter,
|
|
27673
|
+
createServer: () => createServer,
|
|
27674
|
+
domainScopedInputSchema: () => domainScopedInputSchema,
|
|
27675
|
+
domainScopedProcedure: () => domainScopedProcedure,
|
|
27676
|
+
projectScopedInputSchema: () => projectScopedInputSchema,
|
|
27677
|
+
projectScopedProcedure: () => projectScopedProcedure,
|
|
27678
|
+
protectedProcedure: () => protectedProcedure,
|
|
27679
|
+
publicProcedure: () => publicProcedure
|
|
27673
27680
|
});
|
|
27674
27681
|
module.exports = __toCommonJS(server_exports);
|
|
27675
27682
|
|
|
@@ -33385,6 +33392,7 @@ var listContainersInputSchema2 = projectScopedInputSchema.extend({
|
|
|
33385
33392
|
includeMetadata: import_zod13.z.boolean().optional().default(false)
|
|
33386
33393
|
});
|
|
33387
33394
|
var bucketNameSchema = import_zod13.z.string().min(3, "Bucket name must be at least 3 characters").max(63, "Bucket name must be at most 63 characters").regex(/^[a-z0-9][a-z0-9.-]*[a-z0-9]$/, "Bucket name must contain only lowercase letters, numbers, hyphens, and periods").refine((name) => !name.includes(".."), "Bucket name cannot contain consecutive periods").refine((name) => !/^\d+\.\d+\.\d+\.\d+$/.test(name), "Bucket name cannot be formatted as an IP address");
|
|
33395
|
+
var existingBucketNameSchema = import_zod13.z.string().min(1, "Bucket name is required").max(255, "Bucket name exceeds maximum length");
|
|
33388
33396
|
var createBucketInputSchema = projectScopedInputSchema.extend({
|
|
33389
33397
|
bucketName: bucketNameSchema,
|
|
33390
33398
|
enableVersioning: import_zod13.z.boolean().optional().default(false)
|
|
@@ -33572,18 +33580,18 @@ var bucketPolicyDocumentSchema = import_zod13.z.object({
|
|
|
33572
33580
|
Statement: import_zod13.z.array(bucketPolicyStatementSchema).min(1, "Policy must contain at least one statement")
|
|
33573
33581
|
});
|
|
33574
33582
|
var getBucketPolicyInputSchema = projectScopedInputSchema.extend({
|
|
33575
|
-
bucketName:
|
|
33583
|
+
bucketName: existingBucketNameSchema
|
|
33576
33584
|
});
|
|
33577
33585
|
var getBucketPolicyOutputSchema = import_zod13.z.object({
|
|
33578
33586
|
policy: bucketPolicyDocumentSchema.nullable(),
|
|
33579
33587
|
policyText: import_zod13.z.string().nullable()
|
|
33580
33588
|
});
|
|
33581
33589
|
var setBucketPolicyInputSchema = projectScopedInputSchema.extend({
|
|
33582
|
-
bucketName:
|
|
33590
|
+
bucketName: existingBucketNameSchema,
|
|
33583
33591
|
policy: import_zod13.z.string().min(1).max(20480, "Policy document exceeds maximum size of 20KB")
|
|
33584
33592
|
});
|
|
33585
33593
|
var deleteBucketPolicyInputSchema = projectScopedInputSchema.extend({
|
|
33586
|
-
bucketName:
|
|
33594
|
+
bucketName: existingBucketNameSchema
|
|
33587
33595
|
});
|
|
33588
33596
|
|
|
33589
33597
|
// src/server/Storage/constants.ts
|
|
@@ -33621,7 +33629,7 @@ var containerRouter = {
|
|
|
33621
33629
|
}));
|
|
33622
33630
|
}
|
|
33623
33631
|
const CONCURRENCY_LIMIT = 5;
|
|
33624
|
-
const
|
|
33632
|
+
const bucketsWithMetadata = [];
|
|
33625
33633
|
for (let i = 0; i < buckets.length; i += CONCURRENCY_LIMIT) {
|
|
33626
33634
|
const batch = buckets.slice(i, i + CONCURRENCY_LIMIT);
|
|
33627
33635
|
const batchResults = await Promise.all(batch.map(async (bucket) => {
|
|
@@ -33657,9 +33665,9 @@ var containerRouter = {
|
|
|
33657
33665
|
});
|
|
33658
33666
|
}
|
|
33659
33667
|
}));
|
|
33660
|
-
|
|
33668
|
+
bucketsWithMetadata.push(...batchResults);
|
|
33661
33669
|
}
|
|
33662
|
-
return
|
|
33670
|
+
return bucketsWithMetadata;
|
|
33663
33671
|
} catch (error) {
|
|
33664
33672
|
throw mapS3ErrorToTRPCError(error, {
|
|
33665
33673
|
operation: "list containers"
|
|
@@ -36960,7 +36968,11 @@ var serviceRouters = {
|
|
|
36960
36968
|
};
|
|
36961
36969
|
|
|
36962
36970
|
// src/server/routers.ts
|
|
36963
|
-
var
|
|
36971
|
+
var buildBaseRouter = /* @__PURE__ */ __name((policyDir) => mergeRouters(auroraRouter(authRouters), auroraRouter(buildComputeRouters(policyDir)), auroraRouter(buildObjectStorageRouters(policyDir)), auroraRouter(projectRouters), auroraRouter(buildNetworkRouters(policyDir)), auroraRouter(serviceRouters)), "buildBaseRouter");
|
|
36972
|
+
var buildAppRouter = /* @__PURE__ */ __name((policyDir, extraRouters = []) => {
|
|
36973
|
+
if (extraRouters.length === 0) return buildBaseRouter(policyDir);
|
|
36974
|
+
return mergeRouters(buildBaseRouter(policyDir), ...extraRouters);
|
|
36975
|
+
}, "buildAppRouter");
|
|
36964
36976
|
|
|
36965
36977
|
// src/server/context.ts
|
|
36966
36978
|
var import_signal_openstack2 = __toESM(require_esm2());
|
|
@@ -37341,195 +37353,7 @@ var csrfProtection_default = (0, import_fastify_plugin.default)(csrfPlugin, {
|
|
|
37341
37353
|
fastify: "5.x"
|
|
37342
37354
|
});
|
|
37343
37355
|
|
|
37344
|
-
// src/server/aurora-fastify-plugins/httpMetricsCollector.ts
|
|
37345
|
-
var import_fastify_plugin2 = __toESM(require("fastify-plugin"));
|
|
37346
|
-
var import_prom_client = require("prom-client");
|
|
37347
|
-
var LABEL_NAMES = [
|
|
37348
|
-
"status_code",
|
|
37349
|
-
"method",
|
|
37350
|
-
"route",
|
|
37351
|
-
"endpoint_type",
|
|
37352
|
-
"project_id"
|
|
37353
|
-
];
|
|
37354
|
-
var EXCLUDE_PATHS = [
|
|
37355
|
-
"/metrics"
|
|
37356
|
-
];
|
|
37357
|
-
async function httpMetricsCollectorPlugin(fastify, options) {
|
|
37358
|
-
const prefix = options.prefix || "aurora";
|
|
37359
|
-
const excludePaths = options.excludePaths || EXCLUDE_PATHS;
|
|
37360
|
-
const registry = options.registry || new import_prom_client.Registry();
|
|
37361
|
-
const bffEndpoint = options.bffEndpoint || "/polaris-bff";
|
|
37362
|
-
const requestsTotal = new import_prom_client.Counter({
|
|
37363
|
-
name: `${prefix}_requests_total`,
|
|
37364
|
-
help: "The total number of HTTP requests handled by the application",
|
|
37365
|
-
labelNames: LABEL_NAMES,
|
|
37366
|
-
registers: [
|
|
37367
|
-
registry
|
|
37368
|
-
]
|
|
37369
|
-
});
|
|
37370
|
-
const requestDurationSeconds = new import_prom_client.Histogram({
|
|
37371
|
-
name: `${prefix}_request_duration_seconds`,
|
|
37372
|
-
help: "The HTTP response duration of the application",
|
|
37373
|
-
labelNames: LABEL_NAMES,
|
|
37374
|
-
registers: [
|
|
37375
|
-
registry
|
|
37376
|
-
]
|
|
37377
|
-
});
|
|
37378
|
-
const exceptionsTotal = new import_prom_client.Counter({
|
|
37379
|
-
name: `${prefix}_exceptions_total`,
|
|
37380
|
-
help: "The total number of exceptions raised by the application",
|
|
37381
|
-
labelNames: [
|
|
37382
|
-
"exception"
|
|
37383
|
-
],
|
|
37384
|
-
registers: [
|
|
37385
|
-
registry
|
|
37386
|
-
]
|
|
37387
|
-
});
|
|
37388
|
-
fastify.addHook("onRequest", async (request) => {
|
|
37389
|
-
request.metricsStartTime = process.hrtime.bigint();
|
|
37390
|
-
});
|
|
37391
|
-
fastify.addHook("onResponse", async (request, reply) => {
|
|
37392
|
-
const path3 = request.url.split("?")[0];
|
|
37393
|
-
if (excludePaths.some((excludePath) => path3.startsWith(excludePath))) {
|
|
37394
|
-
return;
|
|
37395
|
-
}
|
|
37396
|
-
if (!request.metricsStartTime) {
|
|
37397
|
-
fastify.log.debug({
|
|
37398
|
-
url: request.url
|
|
37399
|
-
}, "Metrics start time missing, skipping metric collection");
|
|
37400
|
-
return;
|
|
37401
|
-
}
|
|
37402
|
-
const endTime = process.hrtime.bigint();
|
|
37403
|
-
const duration = Number(endTime - request.metricsStartTime) / 1e9;
|
|
37404
|
-
const labels = extractLabels(request, reply, bffEndpoint);
|
|
37405
|
-
try {
|
|
37406
|
-
requestsTotal.inc(labels);
|
|
37407
|
-
requestDurationSeconds.observe(labels, duration);
|
|
37408
|
-
} catch (error) {
|
|
37409
|
-
fastify.log.error({
|
|
37410
|
-
err: error
|
|
37411
|
-
}, "Failed to record HTTP metrics");
|
|
37412
|
-
}
|
|
37413
|
-
});
|
|
37414
|
-
fastify.addHook("onError", async (_request, _reply, error) => {
|
|
37415
|
-
try {
|
|
37416
|
-
exceptionsTotal.inc({
|
|
37417
|
-
exception: error.constructor.name
|
|
37418
|
-
});
|
|
37419
|
-
} catch (err) {
|
|
37420
|
-
fastify.log.error({
|
|
37421
|
-
err
|
|
37422
|
-
}, "Failed to record exception metric");
|
|
37423
|
-
}
|
|
37424
|
-
});
|
|
37425
|
-
fastify.decorate("metricsRegistry", registry);
|
|
37426
|
-
}
|
|
37427
|
-
__name(httpMetricsCollectorPlugin, "httpMetricsCollectorPlugin");
|
|
37428
|
-
function extractLabels(request, reply, bffEndpoint) {
|
|
37429
|
-
const urlPath = request.url.split("?")[0];
|
|
37430
|
-
let endpointType;
|
|
37431
|
-
let route = urlPath;
|
|
37432
|
-
let projectId = "";
|
|
37433
|
-
if (urlPath.includes(bffEndpoint)) {
|
|
37434
|
-
endpointType = "trpc";
|
|
37435
|
-
const procedurePath = urlPath.split(bffEndpoint + "/")[1];
|
|
37436
|
-
if (procedurePath) {
|
|
37437
|
-
const cleanPath = procedurePath.split("?")[0];
|
|
37438
|
-
const parts = cleanPath.split(".");
|
|
37439
|
-
if (parts.length >= 2) {
|
|
37440
|
-
const service = parts[0];
|
|
37441
|
-
const action = parts.slice(1).join(".");
|
|
37442
|
-
route = `${service}/${action}`;
|
|
37443
|
-
} else {
|
|
37444
|
-
route = cleanPath;
|
|
37445
|
-
}
|
|
37446
|
-
}
|
|
37447
|
-
const url = new URL(request.url, "http://localhost");
|
|
37448
|
-
const inputParam = url.searchParams.get("input");
|
|
37449
|
-
if (inputParam) {
|
|
37450
|
-
try {
|
|
37451
|
-
const input = JSON.parse(inputParam);
|
|
37452
|
-
if (input.project_id) {
|
|
37453
|
-
projectId = input.project_id;
|
|
37454
|
-
} else if (typeof input === "object") {
|
|
37455
|
-
const firstKey = Object.keys(input)[0];
|
|
37456
|
-
if (firstKey && input[firstKey]?.project_id) {
|
|
37457
|
-
projectId = input[firstKey].project_id;
|
|
37458
|
-
}
|
|
37459
|
-
}
|
|
37460
|
-
} catch {
|
|
37461
|
-
}
|
|
37462
|
-
}
|
|
37463
|
-
} else if (urlPath.startsWith("/api/")) {
|
|
37464
|
-
endpointType = "api";
|
|
37465
|
-
route = normalizeApiPath(urlPath);
|
|
37466
|
-
} else if (urlPath.startsWith("/@")) {
|
|
37467
|
-
endpointType = "vite-dev";
|
|
37468
|
-
route = "vite-dev";
|
|
37469
|
-
} else if (urlPath.match(/\.(js|jsx|ts|tsx|mjs|css|json|map)$/)) {
|
|
37470
|
-
endpointType = "module";
|
|
37471
|
-
const ext = urlPath.split(".").pop() || "unknown";
|
|
37472
|
-
route = `*.${ext}`;
|
|
37473
|
-
} else if (urlPath.match(/\.(png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot|ico|webp)$/)) {
|
|
37474
|
-
endpointType = "asset";
|
|
37475
|
-
const ext = urlPath.split(".").pop() || "unknown";
|
|
37476
|
-
route = `*.${ext}`;
|
|
37477
|
-
} else if (urlPath === "/" || urlPath === "/index.html") {
|
|
37478
|
-
endpointType = "spa";
|
|
37479
|
-
route = "/";
|
|
37480
|
-
} else {
|
|
37481
|
-
endpointType = "spa";
|
|
37482
|
-
route = normalizeSpaRoute(urlPath);
|
|
37483
|
-
const projectMatch = urlPath.match(/^\/projects\/([^/?]+)/);
|
|
37484
|
-
if (projectMatch) {
|
|
37485
|
-
projectId = projectMatch[1];
|
|
37486
|
-
}
|
|
37487
|
-
}
|
|
37488
|
-
return {
|
|
37489
|
-
status_code: reply.statusCode.toString(),
|
|
37490
|
-
method: request.method.toLowerCase(),
|
|
37491
|
-
route,
|
|
37492
|
-
endpoint_type: endpointType,
|
|
37493
|
-
project_id: projectId
|
|
37494
|
-
};
|
|
37495
|
-
}
|
|
37496
|
-
__name(extractLabels, "extractLabels");
|
|
37497
|
-
function normalizeSpaRoute(path3) {
|
|
37498
|
-
const segments = path3.split("/").filter(Boolean);
|
|
37499
|
-
if (segments[0] === "projects" && segments.length >= 3) {
|
|
37500
|
-
const service = segments[2];
|
|
37501
|
-
return `/projects/:id/${service}`;
|
|
37502
|
-
}
|
|
37503
|
-
if (segments[0] === "accounts" && segments.length >= 2) {
|
|
37504
|
-
return "/accounts/:id";
|
|
37505
|
-
}
|
|
37506
|
-
return "/" + segments.map((segment) => {
|
|
37507
|
-
if (segment.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i)) {
|
|
37508
|
-
return ":id";
|
|
37509
|
-
}
|
|
37510
|
-
if (segment.match(/^[a-zA-Z0-9_-]{20,}$/)) {
|
|
37511
|
-
return ":id";
|
|
37512
|
-
}
|
|
37513
|
-
return segment;
|
|
37514
|
-
}).join("/");
|
|
37515
|
-
}
|
|
37516
|
-
__name(normalizeSpaRoute, "normalizeSpaRoute");
|
|
37517
|
-
function normalizeApiPath(path3) {
|
|
37518
|
-
return path3.split("/").map((segment) => {
|
|
37519
|
-
if (segment.match(/^\d+$/) || segment.match(/^[0-9a-f-]{36}$/i)) {
|
|
37520
|
-
return ":id";
|
|
37521
|
-
}
|
|
37522
|
-
return segment;
|
|
37523
|
-
}).join("/");
|
|
37524
|
-
}
|
|
37525
|
-
__name(normalizeApiPath, "normalizeApiPath");
|
|
37526
|
-
var AuroraHttpMetricsCollector = (0, import_fastify_plugin2.default)(httpMetricsCollectorPlugin, {
|
|
37527
|
-
name: "aurora-http-metrics-collector",
|
|
37528
|
-
fastify: "5.x"
|
|
37529
|
-
});
|
|
37530
|
-
|
|
37531
37356
|
// src/server/server.ts
|
|
37532
|
-
var import_prom_client2 = require("prom-client");
|
|
37533
37357
|
async function createServer(config) {
|
|
37534
37358
|
const isProduction = process.env.NODE_ENV === "production";
|
|
37535
37359
|
const rawBffEndpoint = config.bffEndpoint ?? "/polaris-bff";
|
|
@@ -37545,7 +37369,7 @@ async function createServer(config) {
|
|
|
37545
37369
|
crossDomainCookie: config.crossDomainCookie,
|
|
37546
37370
|
insecureCookies: config.insecureCookies
|
|
37547
37371
|
};
|
|
37548
|
-
const appRouter = buildAppRouter(config.policyDir);
|
|
37372
|
+
const appRouter = buildAppRouter(config.policyDir, config.routers ?? []);
|
|
37549
37373
|
const server = (0, import_fastify.default)({
|
|
37550
37374
|
logger: true,
|
|
37551
37375
|
bodyLimit: 1 * 1024 * 1024,
|
|
@@ -37558,19 +37382,6 @@ async function createServer(config) {
|
|
|
37558
37382
|
server.register(import_cookie2.default, {
|
|
37559
37383
|
secret: void 0
|
|
37560
37384
|
});
|
|
37561
|
-
const metricsRegistry = new import_prom_client2.Registry();
|
|
37562
|
-
await server.register(AuroraHttpMetricsCollector, {
|
|
37563
|
-
prefix: "aurora",
|
|
37564
|
-
excludePaths: [
|
|
37565
|
-
"/metrics"
|
|
37566
|
-
],
|
|
37567
|
-
registry: metricsRegistry,
|
|
37568
|
-
bffEndpoint
|
|
37569
|
-
});
|
|
37570
|
-
server.get("/metrics", async (_request, reply) => {
|
|
37571
|
-
reply.header("Content-Type", metricsRegistry.contentType);
|
|
37572
|
-
return reply.send(await metricsRegistry.metrics());
|
|
37573
|
-
});
|
|
37574
37385
|
await server.register(import_rate_limit.default, {
|
|
37575
37386
|
max: 200,
|
|
37576
37387
|
timeWindow: "1 minute"
|
|
@@ -37730,7 +37541,14 @@ async function createServer(config) {
|
|
|
37730
37541
|
__name(createServer, "createServer");
|
|
37731
37542
|
// Annotate the CommonJS export names for ESM import in node:
|
|
37732
37543
|
0 && (module.exports = {
|
|
37733
|
-
|
|
37544
|
+
auroraRouter,
|
|
37545
|
+
createServer,
|
|
37546
|
+
domainScopedInputSchema,
|
|
37547
|
+
domainScopedProcedure,
|
|
37548
|
+
projectScopedInputSchema,
|
|
37549
|
+
projectScopedProcedure,
|
|
37550
|
+
protectedProcedure,
|
|
37551
|
+
publicProcedure
|
|
37734
37552
|
});
|
|
37735
37553
|
/*! Bundled license information:
|
|
37736
37554
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cobaltcore-dev/aurora",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Aurora OpenStack dashboard — server and client library",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -64,14 +64,13 @@
|
|
|
64
64
|
"fastify-plugin": "^5.1.0",
|
|
65
65
|
"focus-trap-react": "^12.0.0",
|
|
66
66
|
"node-fetch": "^3.3.2",
|
|
67
|
-
"prom-client": "^15.1.3",
|
|
68
67
|
"react-error-boundary": "^6.1.0",
|
|
69
68
|
"react-icons": "^5.6.0",
|
|
70
69
|
"tailwind-merge": "^3.2.0",
|
|
71
70
|
"zod": "^4.0.0"
|
|
72
71
|
},
|
|
73
72
|
"devDependencies": {
|
|
74
|
-
"@cloudoperators/juno-ui-components": "
|
|
73
|
+
"@cloudoperators/juno-ui-components": "8.1.0",
|
|
75
74
|
"@fastify/vite": "^8.4.1",
|
|
76
75
|
"@lingui/cli": "^5.9.5",
|
|
77
76
|
"@lingui/format-po": "^5.9.5",
|
|
@@ -110,8 +109,8 @@
|
|
|
110
109
|
"vite-tsconfig-paths": "^6.1.1",
|
|
111
110
|
"vitest": "^4.1.2",
|
|
112
111
|
"@cobaltcore-dev/aurora-config": "0.0.1",
|
|
113
|
-
"@cobaltcore-dev/
|
|
114
|
-
"@cobaltcore-dev/
|
|
112
|
+
"@cobaltcore-dev/policy-engine": "2.0.0",
|
|
113
|
+
"@cobaltcore-dev/signal-openstack": "1.0.0"
|
|
115
114
|
},
|
|
116
115
|
"scripts": {
|
|
117
116
|
"build": "pnpm build:server && pnpm build:client",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ImageToastNotifications-BWimIzu_.mjs","names":["formatBytesDecimal","SizeDisplay","size","undefined","span","MEMBER_STATUSES","PENDING","ACCEPTED","REJECTED","ALL","IMAGE_STATUSES","QUEUED","SAVING","ACTIVE","DEACTIVATED","KILLED","DELETED","PENDING_DELETE","IMAGE_VISIBILITY","PUBLIC","PRIVATE","SHARED","COMMUNITY","DISK_FORMATS","AMI","ARI","AKI","VHD","VHDX","VMDK","RAW","QCOW2","VDI","ISO","PLOOP","CONTAINER_FORMATS","BARE","OVF","OVA","DOCKER","React","DataGridRow","DataGridCell","TextInput","ButtonRow","Button","ImageMemberFormRow","memberId","imageId","errors","isLoading","onMemberIdChange","onSave","onCancel","useLingui","className","value","onChange","e","target","placeholder","t","errortext","required","icon","onClick","variant","title","disabled","React","useState","useEffect","DataGridRow","DataGridCell","Button","Stack","Spinner","MEMBER_STATUSES","ImageMemberRow","member","isDeleting","onDelete","canDelete","useLingui","confirm","setConfirm","timer","setTimeout","clearTimeout","handleConfirmDelete","getStatusLabel","status","PENDING","t","ACCEPTED","REJECTED","getStatusVariant","deleteButton","variant","onClick","title","aria-label","data-testid","disabled","memberIdDisplay","member_id","icon","className","image_id","distribution","alignment","React","useState","DataGrid","DataGridRow","DataGridHeadCell","DataGridCell","Stack","Spinner","Button","Message","trpcReact","ImageMemberFormRow","ImageMemberRow","MembersLoadingState","colSpan","distribution","alignment","variant","ImageMembersTable","image","imageMembers","isMembersLoading","canAdd","canRemove","isAddingMember","setIsAddingMember","setMessage","projectId","useLingui","utils","useUtils","memberId","setMemberId","errors","setErrors","deletingMembers","setDeletingMembers","Set","createMemberMutation","compute","createImageMember","useMutation","onSuccess","listImageMembers","invalidate","project_id","imageId","id","deleteMemberMutation","deleteImageMember","isPublicImage","visibility","shouldShowEmptyState","length","isLoading","isPending","validateForm","trimmedMemberId","trim","newErrors","t","some","member","member_id","Object","keys","resetForm","handleAddMember","text","type","mutateAsync","error","errorMessage","message","handleRemoveMember","memberIdToRemove","prev","add","newSet","delete","handleMemberIdChange","newMemberId","undefined","columns","direction","className","label","data-testid","onClick","disabled","onMemberIdChange","onSave","onCancel","map","index","isDeleting","has","onDelete","canDelete","React","useState","Modal","Form","FormRow","FormSection","TextInput","Select","SelectOption","Checkbox","Button","Spinner","Stack","Pill","IMAGE_VISIBILITY","EditImageDetailsModal","image","isOpen","isLoading","onClose","onSave","useLingui","properties","setProperties","name","tags","visibility","PRIVATE","protected","min_disk","min_ram","tagsInput","setTagsInput","errors","setErrors","arraysEqual","a","b","length","sortedA","sort","sortedB","every","val","index","isSubmitDisabled","handleInputChange","e","value","type","checked","target","prev","newErrors","handleSelectChange","handleNumericChange","numValue","parseInt","isNaN","handleTagsInputChange","handleAddTag","trimmedTag","trim","includes","handleTagKeyPress","key","preventDefault","handleRemoveTag","tagToRemove","filter","tag","validateForm","t","Object","keys","handleSubmit","updatedProperties","handleClose","open","onCancel","size","title","onConfirm","confirmButtonLabel","cancelButtonLabel","disableConfirmButton","distribution","alignment","variant","className","id","label","onChange","required","errortext","div","gap","direction","onKeyDown","helptext","placeholder","onClick","disabled","wrap","map","closeable","pillKey","pillValue","PUBLIC","SHARED","COMMUNITY","String","React","useState","useEffect","useMemo","useProjectId","Modal","Button","Spinner","Stack","DataGrid","DataGridRow","DataGridHeadCell","DataGridCell","TextInput","trpcReact","toStrValue","value","undefined","JSON","stringify","String","buildInitialMetadata","image","excludedProperties","Object","entries","filter","key","has","toLowerCase","map","strValue","isNew","isEditing","originalKey","originalValue","EditImageMetadataModalInner","isLoading","onClose","onSave","initialMetadata","useLingui","metadata","setMetadata","errors","setErrors","isAddingNew","setIsAddingNew","newKey","setNewKey","newValue","setNewValue","confirmDeleteIndex","setConfirmDeleteIndex","timer","setTimeout","clearTimeout","isSubmitDisabled","every","entry","length","validateKey","rowIndex","normalized","trim","t","isDuplicate","some","idx","handleAddNew","keyError","handleCancelAdd","handleEdit","index","i","handleSaveEdit","e","handleCancelEdit","handleDelete","_","handleKeyChange","prev","next","handleValueChange","handleSubmit","metadataObject","removedEntries","fromEntries","item","includes","forEach","success","handleClose","open","onCancel","size","title","onConfirm","confirmButtonLabel","cancelButtonLabel","disableConfirmButton","distribution","alignment","variant","div","direction","className","label","onClick","disabled","icon","columns","minContentColumns","onChange","target","placeholder","errortext","autoFocus","gap","span","data-testid","colSpan","EditImageMetadataModal","isOpen","projectId","data","excludedPropertiesData","isLoadingExcluded","isError","isErrorExcluded","compute","getImageMetadataExcludedProperties","useQuery","project_id","enabled","Set","s","id","updated_at","React","Button","ButtonRow","DataGrid","DataGridCell","DataGridHeadCell","DataGridRow","Message","Modal","ModalFooter","Spinner","Stack","SizeDisplay","DeleteImageModal","image","isOpen","isLoading","isDisabled","onClose","onDelete","useLingui","handleDelete","e","preventDefault","onCancel","size","title","open","modalFooter","className","variant","onClick","disabled","data-testid","distribution","alignment","div","text","t","columns","name","id","status","visibility","disk_format","created_at","Date","toLocaleDateString","React","DataGrid","DataGridCell","DataGridHeadCell","DataGridRow","Modal","Spinner","Stack","SizeDisplay","ActivateImageModal","image","isOpen","isLoading","onClose","onActivate","useLingui","handleActivate","e","preventDefault","onCancel","size","title","t","open","onConfirm","confirmButtonLabel","cancelButtonLabel","disableConfirmButton","distribution","alignment","variant","div","p","className","columns","name","id","status","visibility","disk_format","dt","Date","created_at","isNaN","getTime","toLocaleDateString","React","DataGrid","DataGridCell","DataGridHeadCell","DataGridRow","Modal","Spinner","Stack","SizeDisplay","DeactivateImageModal","image","isOpen","isLoading","onClose","onDeactivate","useLingui","handleDeactivate","e","preventDefault","onCancel","size","title","t","open","onConfirm","confirmButtonLabel","cancelButtonLabel","disableConfirmButton","distribution","alignment","variant","div","p","className","columns","name","id","status","visibility","disk_format","dt","Date","created_at","isNaN","getTime","toLocaleDateString","Stack","NotificationText","title","description","direction","gap","span","className","NotificationText","getImageUpdatedToast","imageName","config","variant","children","title","description","autoDismiss","autoDismissTimeout","onDismiss","getImageUpdateErrorToast","message","getImageCreatedToast","getImageCreateErrorToast","getImageFileUploadErrorToast","fileName","getImageDeletedToast","getImageDeleteErrorToast","imageId","getImageActivatedToast","getImageDeactivatedToast","getImageActivationErrorToast","getImageDeactivationErrorToast","getBulkDeleteSuccessToast","successCount","totalCount","getBulkDeleteErrorToast","failedCount","getBulkDeletePartialToast","getBulkActivateSuccessToast","getBulkActivateErrorToast","getBulkActivatePartialToast","getBulkDeactivateSuccessToast","getBulkDeactivateErrorToast","getBulkDeactivatePartialToast","getImageAccessStatusUpdatedToast","newStatus","getImageAccessStatusErrorToast","errorMessage","getImageVisibilityUpdatedToast","visibility","getImageVisibilityUpdateErrorToast"],"sources":["../../src/client/routes/_auth/projects/$projectId/compute/-components/Images/-components/SizeDisplay.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-constants/filters.ts","../../src/client/routes/_auth/projects/$projectId/compute/-components/Images/-components/ImageMemberFormRow.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Images/-components/ImageMemberRow.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Images/-components/ImageMembersTable.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Images/-components/EditImageDetailsModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Images/-components/EditImageMetadataModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Images/-components/DeleteImageModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Images/-components/ActivateImageModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Images/-components/DeactivateImageModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Images/-components/NotificationText.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Images/-components/ImageToastNotifications.tsx"],"sourcesContent":["import { formatBytesDecimal } from \"@/client/utils/formatBytes\"\n\ninterface SizeDisplayProps {\n size: number | null | undefined\n}\n\nexport function SizeDisplay({ size }: SizeDisplayProps) {\n if (size === undefined) return <span>N/A</span>\n\n return <span>{formatBytesDecimal(size)}</span>\n}\n","/**\n * OpenStack Glance image member status values\n * Reference: https://docs.openstack.org/glance/latest/user/glanceapi.html#image-sharing\n */\nexport const MEMBER_STATUSES = {\n /** Initial status when image is shared; member hasn't responded */\n PENDING: \"pending\",\n /** Member has accepted the shared image; appears in their image list */\n ACCEPTED: \"accepted\",\n /** Member has explicitly rejected the shared image; won't appear in their list */\n REJECTED: \"rejected\",\n /** Special filter value: returns members in all states (pending, accepted, rejected) */\n ALL: \"all\",\n} as const\n\n/**\n * OpenStack Glance image lifecycle states\n */\nexport const IMAGE_STATUSES = {\n /** Image metadata created, awaiting upload */\n QUEUED: \"queued\",\n /** Image data is being uploaded */\n SAVING: \"saving\",\n /** Image is ready to use */\n ACTIVE: \"active\",\n /** Image exists but is disabled for use */\n DEACTIVATED: \"deactivated\",\n /** Image upload failed or was interrupted */\n KILLED: \"killed\",\n /** Image is marked for deletion */\n DELETED: \"deleted\",\n /** Image deletion is in progress */\n PENDING_DELETE: \"pending_delete\",\n} as const\n\n/**\n * Image visibility/sharing levels\n */\nexport const IMAGE_VISIBILITY = {\n /** Visible to all users in the cloud */\n PUBLIC: \"public\",\n /** Visible only to the owner */\n PRIVATE: \"private\",\n /** Explicitly shared with specific projects */\n SHARED: \"shared\",\n /** Shared with all users, no explicit members */\n COMMUNITY: \"community\",\n /** Special filter value: returns all images accessible to the user (public, private, shared, community) */\n ALL: \"all\",\n} as const\n\n/**\n * Supported virtual disk formats\n */\nexport const DISK_FORMATS = {\n /** Amazon Machine Image */\n AMI: \"ami\",\n /** Amazon Ramdisk Image */\n ARI: \"ari\",\n /** Amazon Kernel Image */\n AKI: \"aki\",\n /** Virtual Hard Disk (Hyper-V) */\n VHD: \"vhd\",\n /** Virtual Hard Disk v2 (Hyper-V) */\n VHDX: \"vhdx\",\n /** Virtual Machine Disk (VMware) */\n VMDK: \"vmdk\",\n /** Raw unformatted disk image */\n RAW: \"raw\",\n /** QEMU Copy-On-Write v2 */\n QCOW2: \"qcow2\",\n /** Virtual Disk Image (VirtualBox) */\n VDI: \"vdi\",\n /** ISO 9660 optical disc image */\n ISO: \"iso\",\n /** Parallels Loopback Disk */\n PLOOP: \"ploop\",\n} as const\n\n/**\n * Supported container/packaging formats\n */\nexport const CONTAINER_FORMATS = {\n /** Amazon Machine Image */\n AMI: \"ami\",\n /** Amazon Ramdisk Image */\n ARI: \"ari\",\n /** Amazon Kernel Image */\n AKI: \"aki\",\n /** No container, just disk image */\n BARE: \"bare\",\n /** Open Virtualization Format */\n OVF: \"ovf\",\n /** Open Virtualization Archive (tar of OVF) */\n OVA: \"ova\",\n /** Docker container image */\n DOCKER: \"docker\",\n} as const\n\n/** Valid image member status values */\nexport type MemberStatus = (typeof MEMBER_STATUSES)[keyof typeof MEMBER_STATUSES]\n\n/** Valid image lifecycle status values */\nexport type ImageStatus = (typeof IMAGE_STATUSES)[keyof typeof IMAGE_STATUSES]\n\n/** Valid image visibility/sharing levels */\nexport type ImageVisibility = (typeof IMAGE_VISIBILITY)[keyof typeof IMAGE_VISIBILITY]\n\n/** Valid virtual disk format types */\nexport type DiskFormat = (typeof DISK_FORMATS)[keyof typeof DISK_FORMATS]\n\n/** Valid container/packaging format types */\nexport type ContainerFormat = (typeof CONTAINER_FORMATS)[keyof typeof CONTAINER_FORMATS]\n","import React from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { DataGridRow, DataGridCell, TextInput, ButtonRow, Button } from \"@cloudoperators/juno-ui-components\"\n\ninterface ImageMemberFormRowProps {\n memberId: string\n imageId: string\n errors: { memberId?: string }\n isLoading: boolean\n onMemberIdChange: (memberId: string) => void\n onSave: () => void\n onCancel: () => void\n}\n\nexport const ImageMemberFormRow: React.FC<ImageMemberFormRowProps> = ({\n memberId,\n imageId,\n errors,\n isLoading,\n onMemberIdChange,\n onSave,\n onCancel,\n}) => {\n const { t } = useLingui()\n\n return (\n <DataGridRow>\n <DataGridCell className=\"break-all\">{imageId}</DataGridCell>\n <DataGridCell className=\"pl-0\">\n <TextInput\n value={memberId}\n onChange={(e) => onMemberIdChange(e.target.value)}\n placeholder={t`Enter member ID`}\n errortext={errors.memberId}\n required\n />\n </DataGridCell>\n <DataGridCell></DataGridCell>\n <DataGridCell>\n <ButtonRow>\n <Button icon=\"check\" onClick={onSave} variant=\"primary\" title={t`Add Member`} disabled={isLoading} />\n <Button icon=\"cancel\" onClick={onCancel} title={t`Cancel`} disabled={isLoading} />\n </ButtonRow>\n </DataGridCell>\n </DataGridRow>\n )\n}\n","import React, { useState, useEffect } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { DataGridRow, DataGridCell, Button, Stack, Spinner } from \"@cloudoperators/juno-ui-components\"\nimport { MEMBER_STATUSES } from \"../../../-constants/filters\"\n\ninterface ImageMember {\n image_id: string\n member_id: string\n status: string\n created_at: string\n updated_at: string\n}\n\ninterface ImageMemberRowProps {\n member: ImageMember\n isDeleting: boolean\n onDelete: () => void\n canDelete: boolean\n}\n\nexport const ImageMemberRow: React.FC<ImageMemberRowProps> = ({ member, isDeleting, onDelete, canDelete }) => {\n const { t } = useLingui()\n const [confirm, setConfirm] = useState(false)\n\n useEffect(() => {\n if (confirm) {\n const timer = setTimeout(() => {\n setConfirm(false)\n }, 3000)\n\n return () => clearTimeout(timer)\n }\n }, [confirm])\n\n const handleConfirmDelete = () => {\n setConfirm(false)\n onDelete()\n }\n\n const getStatusLabel = (status: string): string => {\n switch (status) {\n case MEMBER_STATUSES.PENDING:\n return t`Pending`\n case MEMBER_STATUSES.ACCEPTED:\n return t`Accepted`\n case MEMBER_STATUSES.REJECTED:\n return t`Rejected`\n default:\n return status\n }\n }\n\n const getStatusVariant = (status: string): string => {\n switch (status) {\n case MEMBER_STATUSES.PENDING:\n return \"warning\"\n case MEMBER_STATUSES.ACCEPTED:\n return \"success\"\n case MEMBER_STATUSES.REJECTED:\n return \"danger\"\n default:\n return \"default\"\n }\n }\n\n const deleteButton = () => {\n if (!canDelete) {\n return <></>\n }\n\n if (confirm) {\n return (\n <Button\n variant=\"primary-danger\"\n onClick={handleConfirmDelete}\n title={t`Remove member access`}\n aria-label={t`Remove member access`}\n data-testid=\"confirm-removal\"\n disabled={isDeleting}\n >\n {t`Remove`}\n </Button>\n )\n } else {\n const memberIdDisplay = member.member_id\n\n return (\n <Button\n icon=\"deleteForever\"\n onClick={() => setConfirm(true)}\n title={t`Remove access for ${memberIdDisplay}`}\n aria-label={t`Remove access for ${memberIdDisplay}`}\n data-testid={`remove-${memberIdDisplay}`}\n disabled={isDeleting}\n />\n )\n }\n }\n\n return (\n <DataGridRow>\n <DataGridCell className=\"break-all\">{member.image_id}</DataGridCell>\n <DataGridCell className=\"break-all\">{member.member_id}</DataGridCell>\n <DataGridCell className={`break-all text-theme-${getStatusVariant(member.status)}`}>\n {getStatusLabel(member.status)}\n </DataGridCell>\n <DataGridCell>\n {isDeleting ? (\n <Stack distribution=\"center\" alignment=\"center\">\n <Spinner variant=\"primary\" />\n </Stack>\n ) : (\n <Stack distribution=\"end\" alignment=\"end\">\n {deleteButton()}\n </Stack>\n )}\n </DataGridCell>\n </DataGridRow>\n )\n}\n","import React, { useState } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n DataGrid,\n DataGridRow,\n DataGridHeadCell,\n DataGridCell,\n Stack,\n Spinner,\n Button,\n Message,\n} from \"@cloudoperators/juno-ui-components\"\nimport { GlanceImage, ImageMember } from \"@/server/Compute/types/image\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { TRPCClientError } from \"@trpc/client\"\nimport { InferrableClientTypes } from \"@trpc/server/unstable-core-do-not-import\"\nimport { ImageMemberFormRow } from \"./ImageMemberFormRow\"\nimport { ImageMemberRow } from \"./ImageMemberRow\"\n\ninterface ImageMembersTableProps {\n image: GlanceImage\n imageMembers: ImageMember[] | undefined\n isMembersLoading: boolean\n canAdd: boolean\n canRemove: boolean\n isAddingMember: boolean\n setIsAddingMember: (adding: boolean) => void\n setMessage: (msg: { text: string; type: \"error\" | \"info\" } | null) => void\n projectId: string\n}\n\nfunction MembersLoadingState() {\n return (\n <DataGridRow>\n <DataGridCell colSpan={4}>\n <Stack distribution=\"center\" alignment=\"center\">\n <Spinner variant=\"primary\" />\n </Stack>\n </DataGridCell>\n </DataGridRow>\n )\n}\n\nexport const ImageMembersTable: React.FC<ImageMembersTableProps> = ({\n image,\n imageMembers,\n isMembersLoading,\n canAdd,\n canRemove,\n isAddingMember,\n setIsAddingMember,\n setMessage,\n projectId,\n}) => {\n const { t } = useLingui()\n const utils = trpcReact.useUtils()\n\n const [memberId, setMemberId] = useState(\"\")\n const [errors, setErrors] = useState<{ memberId?: string }>({})\n const [deletingMembers, setDeletingMembers] = useState<Set<string>>(new Set())\n\n const createMemberMutation = trpcReact.compute.createImageMember.useMutation({\n onSuccess: () => {\n utils.compute.listImageMembers.invalidate({ project_id: projectId, imageId: image.id })\n },\n })\n\n const deleteMemberMutation = trpcReact.compute.deleteImageMember.useMutation({\n onSuccess: () => {\n utils.compute.listImageMembers.invalidate({ project_id: projectId, imageId: image.id })\n },\n })\n\n const isPublicImage = image.visibility === \"public\"\n const shouldShowEmptyState = !imageMembers || imageMembers.length === 0\n const isLoading = createMemberMutation.isPending || deleteMemberMutation.isPending\n\n const validateForm = (): boolean => {\n const trimmedMemberId = memberId.trim()\n const newErrors: { memberId?: string } = {}\n\n if (!trimmedMemberId) {\n newErrors.memberId = t`Member ID (project UUID) is required.`\n } else if (imageMembers?.some((member) => member.member_id === trimmedMemberId)) {\n newErrors.memberId = t`This member already has access to this image.`\n }\n\n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }\n\n const resetForm = () => {\n setMemberId(\"\")\n setErrors({})\n }\n\n const handleAddMember = async () => {\n if (!validateForm()) {\n setMessage({ text: t`Please fix the validation errors below.`, type: \"error\" })\n return\n }\n\n const trimmedMemberId = memberId.trim()\n\n try {\n await createMemberMutation.mutateAsync({\n project_id: projectId,\n imageId: image.id,\n member: trimmedMemberId,\n })\n\n setMessage({\n text: t`Member \"${trimmedMemberId}\" has been added successfully.`,\n type: \"info\",\n })\n resetForm()\n setIsAddingMember(false)\n } catch (error) {\n const errorMessage = (error as TRPCClientError<InferrableClientTypes>)?.message || t`Failed to add member`\n setMessage({\n text: errorMessage,\n type: \"error\",\n })\n }\n }\n\n const handleRemoveMember = async (memberIdToRemove: string) => {\n setDeletingMembers((prev) => new Set(prev).add(memberIdToRemove))\n\n try {\n await deleteMemberMutation.mutateAsync({\n project_id: projectId,\n imageId: image.id,\n memberId: memberIdToRemove,\n })\n\n setMessage({\n text: t`Member \"${memberIdToRemove}\" has been removed successfully.`,\n type: \"info\",\n })\n } catch (error) {\n const errorMessage = (error as TRPCClientError<InferrableClientTypes>)?.message || t`Failed to remove member`\n setMessage({\n text: errorMessage || t`Failed to remove member \"${memberIdToRemove}\"`,\n type: \"error\",\n })\n } finally {\n setDeletingMembers((prev) => {\n const newSet = new Set(prev)\n newSet.delete(memberIdToRemove)\n return newSet\n })\n }\n }\n\n const handleMemberIdChange = (newMemberId: string) => {\n setMemberId(newMemberId)\n if (errors.memberId) setErrors((prev) => ({ ...prev, memberId: undefined }))\n }\n\n if (isMembersLoading) {\n return (\n <DataGrid columns={4}>\n <DataGridRow>\n <DataGridHeadCell>{t`Image ID`}</DataGridHeadCell>\n <DataGridHeadCell>{t`Project ID`}</DataGridHeadCell>\n <DataGridHeadCell>{t`Status`}</DataGridHeadCell>\n <DataGridHeadCell></DataGridHeadCell>\n </DataGridRow>\n <MembersLoadingState />\n </DataGrid>\n )\n }\n\n if (isPublicImage) {\n return (\n <Message\n text={t`This is a public image. All users have access to it. Explicit sharing is not needed.`}\n variant=\"info\"\n />\n )\n }\n\n return (\n <>\n {canAdd && (\n <Stack direction=\"horizontal\" className=\"bg-theme-background-lvl-1 justify-end p-2\">\n <Button\n label={t`Add Project Access`}\n data-testid=\"addMemberButton\"\n onClick={() => setIsAddingMember(true)}\n variant=\"primary\"\n disabled={isAddingMember}\n />\n </Stack>\n )}\n\n <DataGrid columns={4}>\n <DataGridRow>\n <DataGridHeadCell>{t`Image ID`}</DataGridHeadCell>\n <DataGridHeadCell>{t`Member ID`}</DataGridHeadCell>\n <DataGridHeadCell>{t`Status`}</DataGridHeadCell>\n <DataGridHeadCell></DataGridHeadCell>\n </DataGridRow>\n\n {isAddingMember && (\n <ImageMemberFormRow\n memberId={memberId}\n imageId={image.id}\n errors={errors}\n isLoading={isLoading}\n onMemberIdChange={handleMemberIdChange}\n onSave={handleAddMember}\n onCancel={() => {\n resetForm()\n setIsAddingMember(false)\n setMessage(null)\n }}\n />\n )}\n\n {imageMembers?.map((member, index) => (\n <ImageMemberRow\n key={`${member.member_id}-${index}`}\n member={member}\n isDeleting={deletingMembers.has(member.member_id)}\n onDelete={() => handleRemoveMember(member.member_id)}\n canDelete={canRemove}\n />\n ))}\n\n {shouldShowEmptyState && !isAddingMember && (\n <DataGridRow>\n <DataGridCell colSpan={4} className=\"text-theme-default py-4 text-center\">\n {t`No projects have access to this image yet. Click \"Add Project Access\" to grant access.`}\n </DataGridCell>\n </DataGridRow>\n )}\n </DataGrid>\n </>\n )\n}\n","import React, { useState } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Modal,\n Form,\n FormRow,\n FormSection,\n TextInput,\n Select,\n SelectOption,\n Checkbox,\n Button,\n Spinner,\n Stack,\n Pill,\n} from \"@cloudoperators/juno-ui-components\"\nimport { GlanceImage } from \"@/server/Compute/types/image\"\nimport { IMAGE_VISIBILITY } from \"../../../-constants/filters\"\n\ninterface EditImageDetailsModalProps {\n image: GlanceImage\n isOpen: boolean\n isLoading?: boolean\n onClose: () => void\n onSave: (updatedProperties: Partial<GlanceImage>) => void\n}\n\ninterface ImageProperties {\n name: string\n tags: string[]\n visibility: string\n protected: boolean\n min_disk: number\n min_ram: number\n}\n\nexport const EditImageDetailsModal: React.FC<EditImageDetailsModalProps> = ({\n image,\n isOpen,\n isLoading = false,\n onClose,\n onSave,\n}) => {\n const { t } = useLingui()\n\n // Initialize local state from image prop\n const [properties, setProperties] = useState<ImageProperties>({\n name: image.name || \"\",\n tags: image.tags || [],\n visibility: image.visibility || IMAGE_VISIBILITY.PRIVATE,\n protected: image.protected || false,\n min_disk: image.min_disk || 0,\n min_ram: image.min_ram || 0,\n })\n\n const [tagsInput, setTagsInput] = useState<string>(\"\")\n const [errors, setErrors] = useState<{ [key: string]: string }>({})\n\n // Helper function to compare arrays\n const arraysEqual = (a: string[], b: string[]) => {\n if (a.length !== b.length) return false\n const sortedA = [...a].sort()\n const sortedB = [...b].sort()\n return sortedA.every((val, index) => val === sortedB[index])\n }\n\n const isSubmitDisabled =\n image.name === properties.name &&\n arraysEqual(image.tags || [], properties.tags) &&\n image.visibility === properties.visibility &&\n image.protected === properties.protected &&\n image.min_disk === properties.min_disk &&\n image.min_ram === properties.min_ram\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { name, value, type, checked } = e.target\n\n setProperties((prev) => ({\n ...prev,\n [name]: type === \"checkbox\" ? checked : value,\n }))\n\n // Clear error for this field\n if (errors[name]) {\n setErrors((prev) => {\n const newErrors = { ...prev }\n delete newErrors[name]\n return newErrors\n })\n }\n }\n\n const handleSelectChange = (name: string, value: string | number | string[] | undefined) => {\n setProperties((prev) => ({\n ...prev,\n [name]: value,\n }))\n\n // Clear error for this field\n if (errors[name]) {\n setErrors((prev) => {\n const newErrors = { ...prev }\n delete newErrors[name]\n return newErrors\n })\n }\n }\n\n const handleNumericChange = (name: string, value: string) => {\n const numValue = value === \"\" ? 0 : parseInt(value, 10)\n\n if (!isNaN(numValue)) {\n setProperties((prev) => ({\n ...prev,\n [name]: numValue,\n }))\n\n // Clear error for this field\n if (errors[name]) {\n setErrors((prev) => {\n const newErrors = { ...prev }\n delete newErrors[name]\n return newErrors\n })\n }\n }\n }\n\n const handleTagsInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setTagsInput(e.target.value)\n }\n\n const handleAddTag = () => {\n const trimmedTag = tagsInput.trim()\n\n if (trimmedTag === \"\") return\n\n // Check if tag already exists\n if (properties.tags.includes(trimmedTag)) {\n setTagsInput(\"\")\n return\n }\n\n // Add tag to properties\n setProperties((prev) => ({\n ...prev,\n tags: [...prev.tags, trimmedTag],\n }))\n\n // Clear input\n setTagsInput(\"\")\n }\n\n const handleTagKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n handleAddTag()\n }\n }\n\n const handleRemoveTag = (tagToRemove: string) => {\n setProperties((prev) => ({\n ...prev,\n tags: prev.tags.filter((tag) => tag !== tagToRemove),\n }))\n }\n\n const validateForm = (): boolean => {\n const newErrors: { [key: string]: string } = {}\n\n if (!properties.name || properties.name.trim() === \"\") {\n newErrors.name = t`Image name is required`\n }\n\n if (properties.min_disk < 0) {\n newErrors.min_disk = t`Minimum disk must be 0 or greater`\n }\n\n if (properties.min_ram < 0) {\n newErrors.min_ram = t`Minimum RAM must be 0 or greater`\n }\n\n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n\n if (!validateForm()) {\n return\n }\n\n // Prepare updated properties\n const updatedProperties: Partial<GlanceImage> = {\n // Exclude entries without updates\n ...(image.name !== properties.name.trim() ? { name: properties.name.trim() } : {}),\n ...(!arraysEqual(image.tags || [], properties.tags) ? { tags: properties.tags } : {}),\n ...(image.visibility !== properties.visibility ? { visibility: properties.visibility } : {}),\n ...(image.protected !== properties.protected ? { protected: properties.protected } : {}),\n ...(image.min_disk !== properties.min_disk ? { min_disk: properties.min_disk } : {}),\n ...(image.min_ram !== properties.min_ram ? { min_ram: properties.min_ram } : {}),\n }\n\n onSave(updatedProperties)\n }\n\n const handleClose = () => {\n setErrors({})\n onClose()\n }\n\n return (\n <Modal\n open={isOpen}\n onCancel={handleClose}\n size=\"large\"\n title={t`Edit Image Details`}\n onConfirm={handleSubmit}\n confirmButtonLabel={t`Save Changes`}\n cancelButtonLabel={t`Cancel`}\n disableConfirmButton={isLoading || isSubmitDisabled}\n >\n {isLoading && (\n <Stack distribution=\"center\" alignment=\"center\">\n <Spinner variant=\"primary\" />\n </Stack>\n )}\n\n {!isLoading && (\n <Form>\n {/* Basic Metadata Section */}\n <FormSection className=\"mb-6\">\n <FormRow className=\"mb-4\">\n <TextInput\n id=\"name\"\n name=\"name\"\n label={t`Image Name`}\n value={properties.name}\n onChange={handleInputChange}\n required\n errortext={errors.name}\n />\n </FormRow>\n\n <FormRow className=\"my-6\">\n <div className=\"w-full\">\n <Stack gap=\"2\" direction=\"horizontal\" alignment=\"start\">\n <div className=\"flex-1\">\n <TextInput\n id=\"tags\"\n name=\"tags\"\n label={t`Tags`}\n value={tagsInput}\n onChange={handleTagsInputChange}\n onKeyDown={handleTagKeyPress}\n helptext={t`Enter a tag and press Enter or click Add`}\n placeholder={t`e.g., production, linux, ubuntu`}\n />\n </div>\n <Button variant=\"primary\" onClick={handleAddTag} disabled={isLoading || tagsInput.trim() === \"\"}>\n <Trans>Add</Trans>\n </Button>\n </Stack>\n\n {/* Display added tags as pills */}\n {properties.tags.length > 0 && (\n <Stack gap=\"2\" wrap={true} alignment=\"center\" className=\"mt-3\">\n {properties.tags.map((tag) => (\n <Pill key={tag} closeable pillKey=\"\" pillValue={tag} onClose={() => handleRemoveTag(tag)} />\n ))}\n </Stack>\n )}\n </div>\n </FormRow>\n\n <FormRow className=\"mb-4\">\n <Select\n id=\"visibility\"\n name=\"visibility\"\n label={t`Visibility`}\n value={properties.visibility}\n onChange={(value) => handleSelectChange(\"visibility\", value)}\n >\n <SelectOption value={IMAGE_VISIBILITY.PUBLIC} label={t`Public`} />\n <SelectOption value={IMAGE_VISIBILITY.PRIVATE} label={t`Private`} />\n <SelectOption value={IMAGE_VISIBILITY.SHARED} label={t`Shared`} />\n <SelectOption value={IMAGE_VISIBILITY.COMMUNITY} label={t`Community`} />\n </Select>\n </FormRow>\n\n <FormRow>\n <Checkbox\n id=\"protected\"\n name=\"protected\"\n label={t`Protected`}\n checked={properties.protected}\n onChange={handleInputChange}\n helptext={t`Protect this image from being deleted`}\n />\n </FormRow>\n </FormSection>\n\n {/* Resource Requirements Section */}\n <FormSection className=\"mb-6\">\n <FormRow className=\"mb-4\">\n <TextInput\n id=\"min_disk\"\n name=\"min_disk\"\n label={t`Minimum Disk (GB)`}\n type=\"number\"\n value={String(properties.min_disk)}\n onChange={(e) => handleNumericChange(\"min_disk\", e.target.value)}\n helptext={t`Minimum disk size required to boot this image`}\n errortext={errors.min_disk}\n // min={0}\n />\n </FormRow>\n\n <FormRow>\n <TextInput\n id=\"min_ram\"\n name=\"min_ram\"\n label={t`Minimum RAM (MB)`}\n type=\"number\"\n value={String(properties.min_ram)}\n onChange={(e) => handleNumericChange(\"min_ram\", e.target.value)}\n helptext={t`Minimum RAM required to boot this image`}\n errortext={errors.min_ram}\n // min={0}\n />\n </FormRow>\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import React, { useState, useEffect, useMemo } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { useProjectId } from \"@/client/hooks\"\nimport {\n Modal,\n Button,\n Spinner,\n Stack,\n DataGrid,\n DataGridRow,\n DataGridHeadCell,\n DataGridCell,\n TextInput,\n} from \"@cloudoperators/juno-ui-components\"\nimport { GlanceImage } from \"@/server/Compute/types/image\"\nimport { trpcReact } from \"@/client/trpcClient\"\n\ninterface EditImageMetadataModalProps {\n image: GlanceImage\n isOpen: boolean\n isLoading?: boolean\n onClose: () => void\n onSave: (metadata: Record<string, string | null>) => Promise<boolean> | boolean\n}\n\ninterface MetadataEntry {\n key: string\n value: string\n isNew?: boolean\n isEditing?: boolean\n originalKey?: string\n originalValue?: string\n}\n\nfunction toStrValue(value: unknown): string {\n if (value === null || value === undefined) return \"\"\n if (typeof value === \"object\") return JSON.stringify(value)\n return String(value)\n}\n\nfunction buildInitialMetadata(image: GlanceImage, excludedProperties: Set<string>): MetadataEntry[] {\n return Object.entries(image)\n .filter(([key]) => !excludedProperties.has(key.toLowerCase()))\n .map(([key, value]) => {\n const strValue = toStrValue(value)\n return { key, value: strValue, isNew: false, isEditing: false, originalKey: key, originalValue: strValue }\n })\n}\n\n// Inner component receives already-computed initialMetadata so useState is seeded correctly\nfunction EditImageMetadataModalInner({\n isLoading,\n onClose,\n onSave,\n initialMetadata,\n excludedProperties,\n}: {\n isLoading: boolean\n onClose: () => void\n onSave: (metadata: Record<string, string | null>) => Promise<boolean> | boolean\n initialMetadata: MetadataEntry[]\n excludedProperties: Set<string>\n}) {\n const { t } = useLingui()\n\n const [metadata, setMetadata] = useState<MetadataEntry[]>(initialMetadata)\n const [errors, setErrors] = useState<{ [key: string]: string }>({})\n const [isAddingNew, setIsAddingNew] = useState(false)\n const [newKey, setNewKey] = useState(\"\")\n const [newValue, setNewValue] = useState(\"\")\n const [confirmDeleteIndex, setConfirmDeleteIndex] = useState<number | null>(null)\n\n useEffect(() => {\n if (confirmDeleteIndex !== null) {\n const timer = setTimeout(() => setConfirmDeleteIndex(null), 3000)\n return () => clearTimeout(timer)\n }\n }, [confirmDeleteIndex])\n\n const isSubmitDisabled =\n metadata.every((entry) => !entry.isNew && entry.key === entry.originalKey && entry.value === entry.originalValue) &&\n initialMetadata.length === metadata.length\n\n const validateKey = (key: string, originalKey?: string, rowIndex?: number): string | null => {\n const normalized = key?.trim().toLowerCase()\n if (!normalized) {\n return t`Key is required`\n }\n if (excludedProperties.has(normalized)) {\n return t`This property is reserved and cannot be modified`\n }\n const isDuplicate = metadata.some(\n (entry, idx) =>\n entry.key.trim().toLowerCase() === normalized && idx !== rowIndex && entry.originalKey !== originalKey\n )\n if (isDuplicate) {\n return t`A property with this key already exists`\n }\n return null\n }\n\n const handleAddNew = () => {\n const keyError = validateKey(newKey, undefined, metadata.length)\n if (keyError) {\n setErrors({ newKey: keyError })\n return\n }\n if (!newValue.trim()) {\n setErrors({ newValue: t`Value is required` })\n return\n }\n setMetadata([...metadata, { key: newKey.trim(), value: newValue.trim(), isNew: true, isEditing: false }])\n setNewKey(\"\")\n setNewValue(\"\")\n setIsAddingNew(false)\n setErrors({})\n }\n\n const handleCancelAdd = () => {\n setNewKey(\"\")\n setNewValue(\"\")\n setIsAddingNew(false)\n setErrors({})\n }\n\n const handleEdit = (index: number) => {\n setConfirmDeleteIndex(null)\n setMetadata(\n metadata.map((entry, i) => (i === index ? { ...entry, isEditing: true } : { ...entry, isEditing: false }))\n )\n setIsAddingNew(false)\n }\n\n const handleSaveEdit = (index: number) => {\n const entry = metadata[index]\n const keyError = validateKey(entry.key, entry.originalKey, index)\n if (keyError) {\n setErrors({ [`edit-${index}`]: keyError })\n return\n }\n if (!entry.value.trim()) {\n setErrors({ [`edit-${index}`]: t`Value is required` })\n return\n }\n setMetadata(\n metadata.map((e, i) => (i === index ? { ...e, isEditing: false, key: e.key.trim(), value: e.value.trim() } : e))\n )\n setErrors({})\n }\n\n const handleCancelEdit = (index: number) => {\n setMetadata(\n metadata.map((e, i) =>\n i === index ? { ...e, isEditing: false, key: e.originalKey ?? e.key, value: e.originalValue ?? e.value } : e\n )\n )\n setErrors({})\n }\n\n const handleDelete = (index: number) => {\n setMetadata(metadata.filter((_, i) => i !== index))\n setConfirmDeleteIndex(null)\n setErrors({})\n }\n\n const handleKeyChange = (index: number, value: string) => {\n setMetadata(metadata.map((entry, i) => (i === index ? { ...entry, key: value } : entry)))\n if (errors[`edit-${index}`]) {\n setErrors((prev) => {\n const next = { ...prev }\n delete next[`edit-${index}`]\n return next\n })\n }\n }\n\n const handleValueChange = (index: number, value: string) => {\n setMetadata(metadata.map((entry, i) => (i === index ? { ...entry, value } : entry)))\n if (errors[`edit-${index}`]) {\n setErrors((prev) => {\n const next = { ...prev }\n delete next[`edit-${index}`]\n return next\n })\n }\n }\n\n const handleSubmit = async () => {\n const metadataObject: Record<string, string> = {}\n const removedEntries = Object.fromEntries(\n initialMetadata\n .filter(\n (entry) =>\n !metadata.map((item) => item.originalKey).includes(entry.originalKey) ||\n !metadata.map((item) => item.key).includes(entry.key)\n )\n .map((entry) => [entry.key, null])\n )\n metadata\n .filter((entry) => entry.isNew || entry.value !== entry.originalValue || entry.key !== entry.originalKey)\n .forEach((entry) => {\n metadataObject[entry.key] = entry.value\n })\n const success = await onSave({ ...metadataObject, ...removedEntries })\n if (success) onClose()\n }\n\n const handleClose = () => {\n setMetadata(initialMetadata)\n setIsAddingNew(false)\n setNewKey(\"\")\n setNewValue(\"\")\n setErrors({})\n onClose()\n }\n\n return (\n <Modal\n open\n onCancel={handleClose}\n size=\"large\"\n title={t`Edit Image Metadata`}\n onConfirm={handleSubmit}\n confirmButtonLabel={t`Save Changes`}\n cancelButtonLabel={t`Cancel`}\n disableConfirmButton={isLoading || isAddingNew || metadata.some((e) => e.isEditing) || isSubmitDisabled}\n >\n {isLoading && (\n <Stack distribution=\"center\" alignment=\"center\">\n <Spinner variant=\"primary\" />\n </Stack>\n )}\n\n {!isLoading && (\n <div>\n <Stack direction=\"horizontal\" className=\"jn:bg-theme-background-lvl-1 mb-4 justify-end p-2\">\n <Button\n label={t`Add Property`}\n onClick={() => setIsAddingNew(true)}\n variant=\"primary\"\n disabled={isAddingNew || metadata.some((e) => e.isEditing)}\n icon=\"addCircle\"\n />\n </Stack>\n\n <DataGrid columns={3} minContentColumns={[2]} className=\"mb-6\">\n <DataGridRow>\n <DataGridHeadCell>{t`Property Key`}</DataGridHeadCell>\n <DataGridHeadCell>{t`Value`}</DataGridHeadCell>\n <DataGridHeadCell></DataGridHeadCell>\n </DataGridRow>\n\n {isAddingNew && (\n <DataGridRow>\n <DataGridCell>\n <TextInput\n value={newKey}\n onChange={(e) => {\n setNewKey(e.target.value)\n if (errors.newKey) {\n setErrors((prev) => {\n const next = { ...prev }\n delete next.newKey\n return next\n })\n }\n }}\n placeholder={t`property_key`}\n errortext={errors.newKey}\n autoFocus\n />\n </DataGridCell>\n <DataGridCell>\n <TextInput\n value={newValue}\n onChange={(e) => {\n setNewValue(e.target.value)\n if (errors.newValue) {\n setErrors((prev) => {\n const next = { ...prev }\n delete next.newValue\n return next\n })\n }\n }}\n placeholder={t`Value`}\n errortext={errors.newValue}\n />\n </DataGridCell>\n <DataGridCell>\n <Stack direction=\"horizontal\" gap=\"2\">\n <Button size=\"small\" variant=\"primary\" onClick={handleAddNew} icon=\"check\" title={t`Save`} />\n <Button size=\"small\" variant=\"subdued\" onClick={handleCancelAdd} icon=\"close\" title={t`Discard`} />\n </Stack>\n </DataGridCell>\n </DataGridRow>\n )}\n\n {metadata.map((entry, index) => (\n <DataGridRow key={`${entry.originalKey}-${index}`}>\n <DataGridCell>\n {entry.isEditing ? (\n <TextInput\n value={entry.key}\n onChange={(e) => handleKeyChange(index, e.target.value)}\n errortext={errors[`edit-${index}`]}\n />\n ) : (\n <span className=\"jn:text-theme-high block max-w-xs truncate font-mono\" title={entry.key}>\n {entry.key}\n </span>\n )}\n </DataGridCell>\n <DataGridCell>\n {entry.isEditing ? (\n <TextInput value={entry.value} onChange={(e) => handleValueChange(index, e.target.value)} />\n ) : (\n <span className=\"jn:text-theme-default block max-w-md truncate\" title={entry.value}>\n {entry.value}\n </span>\n )}\n </DataGridCell>\n <DataGridCell>\n {entry.isEditing ? (\n <Stack direction=\"horizontal\" gap=\"2\">\n <Button\n size=\"small\"\n variant=\"primary\"\n onClick={() => handleSaveEdit(index)}\n icon=\"check\"\n title={t`Save`}\n />\n <Button\n size=\"small\"\n variant=\"subdued\"\n onClick={() => handleCancelEdit(index)}\n icon=\"close\"\n title={t`Discard`}\n />\n </Stack>\n ) : (\n <Stack direction=\"horizontal\" gap=\"2\">\n {confirmDeleteIndex !== index && (\n <Button\n size=\"small\"\n variant=\"subdued\"\n onClick={() => handleEdit(index)}\n icon=\"edit\"\n data-testid={`edit-${entry.key}`}\n title={t`Edit`}\n disabled={isAddingNew || metadata.some((e) => e.isEditing)}\n />\n )}\n {confirmDeleteIndex === index ? (\n <Button\n size=\"small\"\n variant=\"primary-danger\"\n onClick={() => handleDelete(index)}\n data-testid={`confirm-delete-${entry.key}`}\n title={t`Delete`}\n disabled={isAddingNew || metadata.some((e) => e.isEditing)}\n >\n {t`Delete`}\n </Button>\n ) : (\n <Button\n size=\"small\"\n onClick={() => setConfirmDeleteIndex(index)}\n icon=\"deleteForever\"\n data-testid={`delete-${entry.key}`}\n title={t`Delete`}\n disabled={isAddingNew || metadata.some((e) => e.isEditing)}\n />\n )}\n </Stack>\n )}\n </DataGridCell>\n </DataGridRow>\n ))}\n\n {metadata.length === 0 && !isAddingNew && (\n <DataGridRow>\n <DataGridCell colSpan={3} className=\"jn:text-theme-light py-8 text-center\">\n <Stack alignment=\"center\">\n <span>{t`No custom metadata properties found. Click \"Add Property\" to create one.`}</span>\n </Stack>\n </DataGridCell>\n </DataGridRow>\n )}\n </DataGrid>\n </div>\n )}\n </Modal>\n )\n}\n\nexport const EditImageMetadataModal: React.FC<EditImageMetadataModalProps> = ({\n image,\n isOpen,\n isLoading = false,\n onClose,\n onSave,\n}) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const {\n data: excludedPropertiesData,\n isLoading: isLoadingExcluded,\n isError: isErrorExcluded,\n } = trpcReact.compute.getImageMetadataExcludedProperties.useQuery(\n { project_id: projectId },\n {\n enabled: isOpen,\n }\n )\n const excludedProperties = useMemo(\n () => new Set((excludedPropertiesData ?? []).map((s) => s.toLowerCase())),\n [excludedPropertiesData]\n )\n const initialMetadata = useMemo(\n () => buildInitialMetadata(image, excludedProperties),\n [image.id, image.updated_at, excludedProperties]\n )\n\n if (!isOpen) return null\n\n if (isLoadingExcluded) {\n return (\n <Modal open onCancel={onClose} size=\"large\" title={t`Edit Image Metadata`}>\n <Stack distribution=\"center\" alignment=\"center\">\n <Spinner variant=\"primary\" />\n </Stack>\n </Modal>\n )\n }\n\n if (isErrorExcluded) {\n return (\n <Modal open onCancel={onClose} size=\"large\" title={t`Edit Image Metadata`}>\n <Stack distribution=\"center\" alignment=\"center\">\n <span>{t`Failed to load metadata configuration.`}</span>\n </Stack>\n </Modal>\n )\n }\n\n return (\n <EditImageMetadataModalInner\n key={`${image.id}-${image.updated_at}-${excludedProperties.size}`}\n isLoading={isLoading}\n onClose={onClose}\n onSave={onSave}\n initialMetadata={initialMetadata}\n excludedProperties={excludedProperties}\n />\n )\n}\n","import React from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { GlanceImage } from \"@/server/Compute/types/image\"\nimport {\n Button,\n ButtonRow,\n DataGrid,\n DataGridCell,\n DataGridHeadCell,\n DataGridRow,\n Message,\n Modal,\n ModalFooter,\n Spinner,\n Stack,\n} from \"@cloudoperators/juno-ui-components\"\nimport { SizeDisplay } from \"./SizeDisplay\"\ninterface DeleteImageModalProps {\n image: GlanceImage\n isOpen: boolean\n isLoading: boolean\n isDisabled: boolean\n onClose: () => void\n onDelete: (updatedImage: GlanceImage) => void\n}\n\nexport const DeleteImageModal: React.FC<DeleteImageModalProps> = ({\n image,\n isOpen,\n isLoading,\n isDisabled,\n onClose,\n onDelete,\n}) => {\n if (!image) return null\n\n const { t } = useLingui()\n\n const handleDelete = (e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault()\n onDelete(image)\n }\n\n return (\n <Modal\n onCancel={onClose}\n size=\"small\"\n title=\"Delete Image\"\n open={isOpen}\n modalFooter={\n <ModalFooter className=\"flex justify-end\">\n <ButtonRow>\n <Button variant=\"default\" onClick={onClose}>\n <Trans>Cancel</Trans>\n </Button>\n <Button\n variant=\"primary-danger\"\n onClick={(e) => {\n handleDelete(e)\n onClose()\n }}\n disabled={isLoading || isDisabled}\n data-testid={`delete-image-button`}\n >\n {isLoading ? <Spinner size=\"small\" /> : <Trans>Delete</Trans>}\n </Button>\n </ButtonRow>\n </ModalFooter>\n }\n >\n {isLoading && (\n <Stack distribution=\"center\" alignment=\"center\">\n <Spinner variant=\"primary\" />\n </Stack>\n )}\n {!isLoading && (\n <div>\n <Message\n text={t`This action cannot be undone. The image will be permanently deleted.`}\n variant=\"danger\"\n className=\"mb-4\"\n />\n\n {image && (\n <DataGrid columns={2}>\n <DataGridRow>\n <DataGridHeadCell>{t`Name`}</DataGridHeadCell>\n <DataGridCell>{image.name || t`Unnamed`}</DataGridCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridHeadCell>{t`Id`}</DataGridHeadCell>\n <DataGridCell>{image.id}</DataGridCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridHeadCell>{t`Status`}</DataGridHeadCell>\n <DataGridCell>{image.status}</DataGridCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridHeadCell>{t`Visibility`}</DataGridHeadCell>\n <DataGridCell>{image.visibility}</DataGridCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridHeadCell>{t`Size`}</DataGridHeadCell>\n <DataGridCell>\n <SizeDisplay size={image.size} />\n </DataGridCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridHeadCell>{t`Disk Format`}</DataGridHeadCell>\n <DataGridCell>{image.disk_format || t`N/A`}</DataGridCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridHeadCell>{t`Created`}</DataGridHeadCell>\n <DataGridCell>\n {image.created_at ? new Date(image.created_at).toLocaleDateString() : t`N/A`}\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n )}\n </div>\n )}\n </Modal>\n )\n}\n","import React from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { GlanceImage } from \"@/server/Compute/types/image\"\nimport {\n DataGrid,\n DataGridCell,\n DataGridHeadCell,\n DataGridRow,\n Modal,\n Spinner,\n Stack,\n} from \"@cloudoperators/juno-ui-components\"\nimport { SizeDisplay } from \"./SizeDisplay\"\n\ninterface ActivateImageModalProps {\n image: GlanceImage\n isOpen: boolean\n isLoading: boolean\n onClose: () => void\n onActivate: (image: GlanceImage) => void\n}\n\nexport const ActivateImageModal: React.FC<ActivateImageModalProps> = ({\n image,\n isOpen,\n isLoading,\n onClose,\n onActivate,\n}) => {\n if (!image) return null\n\n const { t } = useLingui()\n\n const handleActivate = (e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault()\n onActivate(image)\n }\n\n return (\n <Modal\n onCancel={onClose}\n size=\"small\"\n title={t`Activate Image`}\n open={isOpen}\n onConfirm={handleActivate}\n confirmButtonLabel={t`Activate`}\n cancelButtonLabel={t`Cancel`}\n disableConfirmButton={isLoading}\n >\n {isLoading && (\n <Stack distribution=\"center\" alignment=\"center\">\n <Spinner variant=\"primary\" />\n </Stack>\n )}\n {!isLoading && (\n <div>\n <p className=\"mb-6\">\n <Trans>Activating this image will allow it to be used to launch new instances again.</Trans>\n </p>\n\n <DataGrid columns={2}>\n <DataGridRow>\n <DataGridHeadCell>{t`Name`}</DataGridHeadCell>\n <DataGridCell>{image.name || t`Unnamed`}</DataGridCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridHeadCell>{t`Id`}</DataGridHeadCell>\n <DataGridCell>{image.id}</DataGridCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridHeadCell>{t`Status`}</DataGridHeadCell>\n <DataGridCell>{image.status}</DataGridCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridHeadCell>{t`Visibility`}</DataGridHeadCell>\n <DataGridCell>{image.visibility}</DataGridCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridHeadCell>{t`Size`}</DataGridHeadCell>\n <DataGridCell>\n <SizeDisplay size={image.size} />\n </DataGridCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridHeadCell>{t`Disk Format`}</DataGridHeadCell>\n <DataGridCell>{image.disk_format || t`N/A`}</DataGridCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridHeadCell>{t`Created`}</DataGridHeadCell>\n <DataGridCell>\n {(() => {\n const dt = new Date(image.created_at ?? \"\")\n return !isNaN(dt.getTime()) ? dt.toLocaleDateString() : t`N/A`\n })()}\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n </div>\n )}\n </Modal>\n )\n}\n","import React from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { GlanceImage } from \"@/server/Compute/types/image\"\nimport {\n DataGrid,\n DataGridCell,\n DataGridHeadCell,\n DataGridRow,\n Modal,\n Spinner,\n Stack,\n} from \"@cloudoperators/juno-ui-components\"\nimport { SizeDisplay } from \"./SizeDisplay\"\n\ninterface DeactivateImageModalProps {\n image: GlanceImage\n isOpen: boolean\n isLoading: boolean\n onClose: () => void\n onDeactivate: (image: GlanceImage) => void\n}\n\nexport const DeactivateImageModal: React.FC<DeactivateImageModalProps> = ({\n image,\n isOpen,\n isLoading,\n onClose,\n onDeactivate,\n}) => {\n if (!image) return null\n\n const { t } = useLingui()\n\n const handleDeactivate = (e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault()\n onDeactivate(image)\n }\n\n return (\n <Modal\n onCancel={onClose}\n size=\"small\"\n title={t`Deactivate Image`}\n open={isOpen}\n onConfirm={handleDeactivate}\n confirmButtonLabel={t`Deactivate`}\n cancelButtonLabel={t`Cancel`}\n disableConfirmButton={isLoading}\n >\n {isLoading && (\n <Stack distribution=\"center\" alignment=\"center\">\n <Spinner variant=\"primary\" />\n </Stack>\n )}\n {!isLoading && (\n <div>\n <p className=\"mb-6\">\n <Trans>\n Deactivating this image will prevent it from being used to launch new instances. Existing instances will\n not be affected.\n </Trans>\n </p>\n\n <DataGrid columns={2}>\n <DataGridRow>\n <DataGridHeadCell>{t`Name`}</DataGridHeadCell>\n <DataGridCell>{image.name || t`Unnamed`}</DataGridCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridHeadCell>{t`Id`}</DataGridHeadCell>\n <DataGridCell>{image.id}</DataGridCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridHeadCell>{t`Status`}</DataGridHeadCell>\n <DataGridCell>{image.status}</DataGridCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridHeadCell>{t`Visibility`}</DataGridHeadCell>\n <DataGridCell>{image.visibility}</DataGridCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridHeadCell>{t`Size`}</DataGridHeadCell>\n <DataGridCell>\n <SizeDisplay size={image.size} />\n </DataGridCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridHeadCell>{t`Disk Format`}</DataGridHeadCell>\n <DataGridCell>{image.disk_format || t`N/A`}</DataGridCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridHeadCell>{t`Created`}</DataGridHeadCell>\n <DataGridCell>\n {(() => {\n const dt = new Date(image.created_at ?? \"\")\n return !isNaN(dt.getTime()) ? dt.toLocaleDateString() : t`N/A`\n })()}\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n </div>\n )}\n </Modal>\n )\n}\n","import { ReactNode } from \"react\"\nimport { Stack } from \"@cloudoperators/juno-ui-components/index\"\n\ninterface NotificationTextProps {\n title: ReactNode\n description: ReactNode\n}\n\nexport function NotificationText({ title, description }: NotificationTextProps) {\n return (\n <Stack direction=\"vertical\" gap=\"1.5\">\n <span>{title}</span>\n <span className=\"text-theme-light\">{description}</span>\n </Stack>\n )\n}\n","import { ToastProps } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { NotificationText } from \"./NotificationText\"\n\ninterface ToastConfig {\n onDismiss: () => void\n autoDismissTimeout?: number\n}\n\nexport const getImageUpdatedToast = (imageName: string, config: ToastConfig): ToastProps => ({\n variant: \"success\",\n children: (\n <NotificationText\n title={<Trans>Image Instance</Trans>}\n description={<Trans>Image instance \"{imageName}\" has been updated</Trans>}\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 3000,\n onDismiss: config.onDismiss,\n})\n\nexport const getImageUpdateErrorToast = (imageName: string, message: string, config: ToastConfig): ToastProps => ({\n variant: \"error\",\n children: (\n <NotificationText\n title={<Trans>Unable to Update Image</Trans>}\n description={\n <>\n <Trans>The image \"{imageName}\" could not be updated: </Trans>\n {message}\n </>\n }\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 5000,\n onDismiss: config.onDismiss,\n})\n\nexport const getImageCreatedToast = (imageName: string, config: ToastConfig): ToastProps => ({\n variant: \"success\",\n children: (\n <NotificationText\n title={<Trans>Image Instance</Trans>}\n description={<Trans>Image instance \"{imageName}\" has been created</Trans>}\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 3000,\n onDismiss: config.onDismiss,\n})\n\nexport const getImageCreateErrorToast = (imageName: string, message: string, config: ToastConfig): ToastProps => ({\n variant: \"error\",\n children: (\n <NotificationText\n title={<Trans>Unable to Create Image</Trans>}\n description={\n <>\n <Trans>The image \"{imageName}\" could not be created: </Trans>\n {message}\n </>\n }\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 5000,\n onDismiss: config.onDismiss,\n})\n\nexport const getImageFileUploadErrorToast = (fileName: string, message: string, config: ToastConfig): ToastProps => ({\n variant: \"error\",\n children: (\n <NotificationText\n title={<Trans>Unable to Upload Image File</Trans>}\n description={\n <>\n <Trans>Failed to upload file \"{fileName}\": </Trans>\n {message}\n </>\n }\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 5000,\n onDismiss: config.onDismiss,\n})\n\nexport const getImageDeletedToast = (imageName: string, config: ToastConfig): ToastProps => ({\n variant: \"success\",\n children: (\n <NotificationText\n title={<Trans>Image Instance</Trans>}\n description={<Trans>Image instance \"{imageName}\" has been deleted</Trans>}\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 3000,\n onDismiss: config.onDismiss,\n})\n\nexport const getImageDeleteErrorToast = (imageId: string, message: string, config: ToastConfig): ToastProps => ({\n variant: \"error\",\n children: (\n <NotificationText\n title={<Trans>Unable to Delete Image</Trans>}\n description={\n <Trans>\n The image \"{imageId}\" could not be deleted: {message}\n </Trans>\n }\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 3000,\n onDismiss: config.onDismiss,\n})\n\nexport const getImageActivatedToast = (imageName: string, config: ToastConfig): ToastProps => ({\n variant: \"success\",\n children: (\n <NotificationText\n title={<Trans>Image Instance</Trans>}\n description={<Trans>Image instance \"{imageName}\" has been activated</Trans>}\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 3000,\n onDismiss: config.onDismiss,\n})\n\nexport const getImageDeactivatedToast = (imageName: string, config: ToastConfig): ToastProps => ({\n variant: \"success\",\n children: (\n <NotificationText\n title={<Trans>Image Instance</Trans>}\n description={<Trans>Image instance \"{imageName}\" has been deactivated</Trans>}\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 3000,\n onDismiss: config.onDismiss,\n})\n\nexport const getImageActivationErrorToast = (imageId: string, message: string, config: ToastConfig): ToastProps => ({\n variant: \"error\",\n children: (\n <NotificationText\n title={<Trans>Unable to Re-activate Image</Trans>}\n description={\n <Trans>\n The image \"{imageId}\" could not be re-activated: {message}\n </Trans>\n }\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 3000,\n onDismiss: config.onDismiss,\n})\n\nexport const getImageDeactivationErrorToast = (imageId: string, message: string, config: ToastConfig): ToastProps => ({\n variant: \"error\",\n children: (\n <NotificationText\n title={<Trans>Unable to Deactivate Image</Trans>}\n description={\n <Trans>\n The image \"{imageId}\" could not be deactivated: {message}\n </Trans>\n }\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 3000,\n onDismiss: config.onDismiss,\n})\n\n// Bulk operation toasts\nexport const getBulkDeleteSuccessToast = (\n successCount: number,\n totalCount: number,\n config: ToastConfig\n): ToastProps => ({\n variant: \"success\",\n children: (\n <NotificationText\n title={<Trans>Images Deleted</Trans>}\n description={\n <Trans>\n Successfully deleted {successCount} of {totalCount} image(s)\n </Trans>\n }\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 3000,\n onDismiss: config.onDismiss,\n})\n\nexport const getBulkDeleteErrorToast = (failedCount: number, totalCount: number, config: ToastConfig): ToastProps => ({\n variant: \"error\",\n children: (\n <NotificationText\n title={<Trans>Failed to Delete Images</Trans>}\n description={\n <Trans>\n Failed to delete {failedCount} of {totalCount} image(s). Some images may be protected or in use.\n </Trans>\n }\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 5000,\n onDismiss: config.onDismiss,\n})\n\nexport const getBulkDeletePartialToast = (\n successCount: number,\n failedCount: number,\n config: ToastConfig\n): ToastProps => ({\n variant: \"warning\",\n children: (\n <NotificationText\n title={<Trans>Partial Delete Success</Trans>}\n description={\n <Trans>\n Deleted {successCount} image(s), but {failedCount} image(s) could not be deleted.\n </Trans>\n }\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 5000,\n onDismiss: config.onDismiss,\n})\n\nexport const getBulkActivateSuccessToast = (\n successCount: number,\n totalCount: number,\n config: ToastConfig\n): ToastProps => ({\n variant: \"success\",\n children: (\n <NotificationText\n title={<Trans>Images Activated</Trans>}\n description={\n <Trans>\n Successfully activated {successCount} of {totalCount} image(s)\n </Trans>\n }\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 3000,\n onDismiss: config.onDismiss,\n})\n\nexport const getBulkActivateErrorToast = (\n failedCount: number,\n totalCount: number,\n config: ToastConfig\n): ToastProps => ({\n variant: \"error\",\n children: (\n <NotificationText\n title={<Trans>Failed to Activate Images</Trans>}\n description={\n <Trans>\n Failed to activate {failedCount} of {totalCount} image(s). Some images may already be active or in an invalid\n state.\n </Trans>\n }\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 5000,\n onDismiss: config.onDismiss,\n})\n\nexport const getBulkActivatePartialToast = (\n successCount: number,\n failedCount: number,\n config: ToastConfig\n): ToastProps => ({\n variant: \"warning\",\n children: (\n <NotificationText\n title={<Trans>Partial Activation Success</Trans>}\n description={\n <Trans>\n Activated {successCount} image(s), but {failedCount} image(s) could not be activated.\n </Trans>\n }\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 5000,\n onDismiss: config.onDismiss,\n})\n\nexport const getBulkDeactivateSuccessToast = (\n successCount: number,\n totalCount: number,\n config: ToastConfig\n): ToastProps => ({\n variant: \"success\",\n children: (\n <NotificationText\n title={<Trans>Images Deactivated</Trans>}\n description={\n <Trans>\n Successfully deactivated {successCount} of {totalCount} image(s)\n </Trans>\n }\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 3000,\n onDismiss: config.onDismiss,\n})\n\nexport const getBulkDeactivateErrorToast = (\n failedCount: number,\n totalCount: number,\n config: ToastConfig\n): ToastProps => ({\n variant: \"error\",\n children: (\n <NotificationText\n title={<Trans>Failed to Deactivate Images</Trans>}\n description={\n <Trans>\n Failed to deactivate {failedCount} of {totalCount} image(s). Some images may already be deactivated or in an\n invalid state.\n </Trans>\n }\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 5000,\n onDismiss: config.onDismiss,\n})\n\nexport const getBulkDeactivatePartialToast = (\n successCount: number,\n failedCount: number,\n config: ToastConfig\n): ToastProps => ({\n variant: \"warning\",\n children: (\n <NotificationText\n title={<Trans>Partial Deactivation Success</Trans>}\n description={\n <Trans>\n Deactivated {successCount} image(s), but {failedCount} image(s) could not be deactivated.\n </Trans>\n }\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 5000,\n onDismiss: config.onDismiss,\n})\n\n// Image access toasts\nexport const getImageAccessStatusUpdatedToast = (newStatus: string, config: ToastConfig): ToastProps => ({\n variant: \"info\",\n children: (\n <NotificationText\n title={<Trans>Access Status</Trans>}\n description={<Trans>Access status updated to \"{newStatus}\".</Trans>}\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 5000,\n onDismiss: config.onDismiss,\n})\n\nexport const getImageAccessStatusErrorToast = (errorMessage: string, config: ToastConfig): ToastProps => ({\n variant: \"error\",\n children: (\n <NotificationText\n title={<Trans>Access Status</Trans>}\n description={errorMessage || <Trans>Failed to update access status</Trans>}\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 5000,\n onDismiss: config.onDismiss,\n})\n\n// Image visibility toasts\nexport const getImageVisibilityUpdatedToast = (\n imageName: string,\n visibility: string,\n config: ToastConfig\n): ToastProps => ({\n variant: \"success\",\n children: (\n <NotificationText\n title={<Trans>Image Visibility</Trans>}\n description={\n <Trans>\n Image \"{imageName}\" visibility updated to {visibility}\n </Trans>\n }\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 3000,\n onDismiss: config.onDismiss,\n})\n\nexport const getImageVisibilityUpdateErrorToast = (\n imageName: string,\n message: string,\n config: ToastConfig\n): ToastProps => ({\n variant: \"error\",\n children: (\n <NotificationText\n title={<Trans>Unable to Update Image Visibility</Trans>}\n description={\n <>\n <Trans>Failed to update visibility for \"{imageName}\": </Trans>\n {message}\n </>\n }\n />\n ),\n autoDismiss: true,\n autoDismissTimeout: config.autoDismissTimeout ?? 5000,\n onDismiss: config.onDismiss,\n})\n"],"mappings":"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"}
|