@dashadmin/dash-admin 1.3.74-srcfree.4 → 1.3.74

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.
@@ -52,10 +52,10 @@ import CloseIcon from "@mui/icons-material/Close";
52
52
  import useAxios from "../../hooks/axios";
53
53
  const prettyKey = (key) => key.replace(/^max_/, "Max ").replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
54
54
  const formatDate = (iso) => iso ? new Date(iso).toLocaleDateString() : "\u2014";
55
- const formatPrice = (prices, fallback) => {
55
+ const formatPrice = (prices, fallback, freeLabel = "Free") => {
56
56
  const entries = Object.entries(prices != null ? prices : {});
57
57
  if (!entries.length) {
58
- return fallback ? String(fallback) : "Free";
58
+ return fallback ? String(fallback) : freeLabel;
59
59
  }
60
60
  return entries.map(([code, value]) => {
61
61
  const amount = code === "CLP" ? value : value / 100;
@@ -80,13 +80,16 @@ const statusColor = (status) => {
80
80
  return (_a = { active: "success", trial: "info", trialing: "info", past_due: "warning", canceled: "error", cancelled: "error" }[(status != null ? status : "").toLowerCase()]) != null ? _a : "default";
81
81
  };
82
82
  const TenancyPlanPanel = ({ tenancyId }) => {
83
- var _a, _b, _c, _d, _e, _f;
83
+ var _a, _b, _c, _d, _e;
84
84
  const { axios: freshAxios } = useAxios();
85
85
  const axiosRef = useRef(freshAxios);
86
86
  const axios = axiosRef.current;
87
87
  const notify = useNotify();
88
88
  const refresh = useRefresh();
89
89
  const translate = useTranslate();
90
+ const tv = (group, value) => value ? translate(`tenancy.plan.${group}.${String(value).toLowerCase()}`, { _: String(value) }) : "";
91
+ const price = (prices, fallback) => formatPrice(prices, fallback, translate("tenancy.plan.free", { _: "Free" }));
92
+ const cycle = (c) => tv("cycle", c != null ? c : "monthly");
90
93
  const [data, setData] = useState(null);
91
94
  const [error, setError] = useState(null);
92
95
  const [drawerOpen, setDrawerOpen] = useState(false);
@@ -101,7 +104,7 @@ const TenancyPlanPanel = ({ tenancyId }) => {
101
104
  setData((_b2 = (_a2 = res.data) == null ? void 0 : _a2.data) != null ? _b2 : null);
102
105
  setError(null);
103
106
  } catch (e) {
104
- setError(((_d2 = (_c2 = e == null ? void 0 : e.response) == null ? void 0 : _c2.data) == null ? void 0 : _d2.message) || "Could not load the plan");
107
+ setError(((_d2 = (_c2 = e == null ? void 0 : e.response) == null ? void 0 : _c2.data) == null ? void 0 : _d2.message) || translate("tenancy.plan.load_failed", { _: "Could not load the plan" }));
105
108
  }
106
109
  }), [tenancyId]);
107
110
  useEffect(() => {
@@ -139,8 +142,17 @@ const TenancyPlanPanel = ({ tenancyId }) => {
139
142
  /* @__PURE__ */ jsx(Card, { variant: "outlined", sx: { maxWidth: 720 }, children: /* @__PURE__ */ jsx(CardActionArea, { onClick: () => setDrawerOpen(true), children: /* @__PURE__ */ jsxs(CardContent, { children: [
140
143
  /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, useFlexGap: true, sx: { mb: 1, alignItems: "center", flexWrap: "wrap" }, children: [
141
144
  /* @__PURE__ */ jsx(Typography, { variant: "overline", color: "text.secondary", children: translate("tenancy.plan.current", { _: "Current plan" }) }),
142
- subscription && /* @__PURE__ */ jsx(Chip, { size: "small", color: statusColor(subscription.status), label: subscription.status }),
143
- (subscription == null ? void 0 : subscription.subscription_state) && /* @__PURE__ */ jsx(Chip, { size: "small", variant: "outlined", label: subscription.subscription_state }),
145
+ subscription && /* @__PURE__ */ jsx(Chip, { size: "small", color: statusColor(subscription.status), label: tv("status", subscription.status) }),
146
+ (subscription == null ? void 0 : subscription.subscription_state) && /* @__PURE__ */ jsx(Chip, { size: "small", variant: "outlined", label: tv("status", subscription.subscription_state) }),
147
+ (plan == null ? void 0 : plan.subscription_plan_type) && /* @__PURE__ */ jsx(
148
+ Chip,
149
+ {
150
+ size: "small",
151
+ variant: "outlined",
152
+ color: plan.subscription_plan_type === "internal" ? "secondary" : "default",
153
+ label: tv("type", plan.subscription_plan_type)
154
+ }
155
+ ),
144
156
  (subscription == null ? void 0 : subscription.pending_plan) && /* @__PURE__ */ jsx(
145
157
  Chip,
146
158
  {
@@ -151,7 +163,7 @@ const TenancyPlanPanel = ({ tenancyId }) => {
151
163
  )
152
164
  ] }),
153
165
  /* @__PURE__ */ jsx(Typography, { variant: "h5", children: (_a = plan == null ? void 0 : plan.name) != null ? _a : translate("tenancy.plan.none", { _: "No plan" }) }),
154
- /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", sx: { mt: 0.5 }, children: plan ? `${formatPrice(plan.prices, plan.price)} / ${(_b = plan.billing_cycle) != null ? _b : "monthly"}` : "" }),
166
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", sx: { mt: 0.5 }, children: plan ? `${price(plan.prices, plan.price)} / ${cycle(plan.billing_cycle)}` : "" }),
155
167
  /* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "text.secondary", sx: { mt: 1.5 }, children: [
156
168
  translate("tenancy.plan.renews", { _: "Current period ends" }),
157
169
  ": ",
@@ -170,26 +182,31 @@ const TenancyPlanPanel = ({ tenancyId }) => {
170
182
  sx: { zIndex: (theme) => theme.zIndex.modal + 2 },
171
183
  children: /* @__PURE__ */ jsxs(Box, { sx: { width: { xs: "100vw", sm: 560 }, p: 2 }, children: [
172
184
  /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", justifyContent: "space-between", mb: 1 }, children: [
173
- /* @__PURE__ */ jsx(Typography, { variant: "h6", children: (_c = plan == null ? void 0 : plan.name) != null ? _c : "\u2014" }),
174
- /* @__PURE__ */ jsx(IconButton, { onClick: () => setDrawerOpen(false), size: "small", "aria-label": "Close", children: /* @__PURE__ */ jsx(CloseIcon, {}) })
185
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", children: (_b = plan == null ? void 0 : plan.name) != null ? _b : "\u2014" }),
186
+ /* @__PURE__ */ jsx(IconButton, { onClick: () => setDrawerOpen(false), size: "small", "aria-label": translate("ra.action.close", { _: "Close" }), children: /* @__PURE__ */ jsx(CloseIcon, {}) })
175
187
  ] }),
176
188
  /* @__PURE__ */ jsx(Divider, { sx: { mb: 2 } }),
177
189
  /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", gutterBottom: true, children: translate("tenancy.plan.subscription", { _: "Subscription" }) }),
178
190
  /* @__PURE__ */ jsx(Table, { size: "small", sx: { mb: 3 }, children: /* @__PURE__ */ jsx(TableBody, { children: [
179
- ["Status", subscription == null ? void 0 : subscription.status],
180
- ["State", subscription == null ? void 0 : subscription.subscription_state],
181
- ["Account", data.tenancy.account_status],
182
- ["Payment gateway", (_e = (_d = subscription == null ? void 0 : subscription.payment_gateway) != null ? _d : data.tenancy.gateway_type) != null ? _e : "internal"],
183
- ["Period start", formatDate(subscription == null ? void 0 : subscription.current_period_start)],
184
- ["Period end", formatDate(subscription == null ? void 0 : subscription.current_period_end)],
185
- ["Trial ends", formatDate(subscription == null ? void 0 : subscription.trial_ends_at)],
186
- ["Cancels at", formatDate(subscription == null ? void 0 : subscription.cancels_at)],
187
- ["Plan tier", plan == null ? void 0 : plan.tier],
188
- ["Trial days (plan)", plan == null ? void 0 : plan.trial_days]
189
- ].map(([k, v]) => /* @__PURE__ */ jsxs(TableRow, { children: [
190
- /* @__PURE__ */ jsx(TableCell, { sx: { color: "text.secondary", width: "45%" }, children: k }),
191
- /* @__PURE__ */ jsx(TableCell, { children: v != null ? v : "\u2014" })
192
- ] }, String(k))) }) }),
191
+ ["status", "Status", tv("status", subscription == null ? void 0 : subscription.status)],
192
+ ["state", "State", tv("status", subscription == null ? void 0 : subscription.subscription_state)],
193
+ ["account", "Account", tv("status", data.tenancy.account_status)],
194
+ ["plan_type", "Plan type", tv("type", plan == null ? void 0 : plan.subscription_plan_type)],
195
+ [
196
+ "gateway",
197
+ "Payment gateway",
198
+ tv("gateway", (_d = (_c = subscription == null ? void 0 : subscription.payment_gateway) != null ? _c : data.tenancy.gateway_type) != null ? _d : "internal")
199
+ ],
200
+ ["period_start", "Period start", formatDate(subscription == null ? void 0 : subscription.current_period_start)],
201
+ ["period_end", "Period end", formatDate(subscription == null ? void 0 : subscription.current_period_end)],
202
+ ["trial_ends", "Trial ends", formatDate(subscription == null ? void 0 : subscription.trial_ends_at)],
203
+ ["cancels_at", "Cancels at", formatDate(subscription == null ? void 0 : subscription.cancels_at)],
204
+ ["tier", "Plan tier", plan == null ? void 0 : plan.tier],
205
+ ["trial_days", "Trial days (plan)", plan == null ? void 0 : plan.trial_days]
206
+ ].map(([key, label, v]) => /* @__PURE__ */ jsxs(TableRow, { children: [
207
+ /* @__PURE__ */ jsx(TableCell, { sx: { color: "text.secondary", width: "45%" }, children: translate(`tenancy.plan.field.${key}`, { _: String(label) }) }),
208
+ /* @__PURE__ */ jsx(TableCell, { children: v === "" || v == null ? "\u2014" : v })
209
+ ] }, String(key))) }) }),
193
210
  /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", gutterBottom: true, children: translate("tenancy.plan.limits", { _: "Limits" }) }),
194
211
  /* @__PURE__ */ jsxs(Table, { size: "small", sx: { mb: 3 }, children: [
195
212
  /* @__PURE__ */ jsx(TableHead, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
@@ -202,8 +219,8 @@ const TenancyPlanPanel = ({ tenancyId }) => {
202
219
  data.usage.map((u) => {
203
220
  var _a2;
204
221
  return /* @__PURE__ */ jsxs(TableRow, { children: [
205
- /* @__PURE__ */ jsx(TableCell, { children: prettyKey(u.key) }),
206
- /* @__PURE__ */ jsx(TableCell, { align: "right", children: u.unlimited ? "Unlimited" : u.limit }),
222
+ /* @__PURE__ */ jsx(TableCell, { children: translate(`tenancy.plan.limit_name.${u.key}`, { _: prettyKey(u.key) }) }),
223
+ /* @__PURE__ */ jsx(TableCell, { align: "right", children: u.unlimited ? translate("tenancy.plan.unlimited", { _: "Unlimited" }) : u.limit }),
207
224
  /* @__PURE__ */ jsx(TableCell, { align: "right", children: (_a2 = u.current) != null ? _a2 : "\u2014" })
208
225
  ] }, u.key);
209
226
  })
@@ -213,7 +230,14 @@ const TenancyPlanPanel = ({ tenancyId }) => {
213
230
  /* @__PURE__ */ jsx(Box, { sx: { mb: 3, display: "flex", gap: 0.5, flexWrap: "wrap" }, children: (() => {
214
231
  const addons = plan == null ? void 0 : plan.addons;
215
232
  const enabled = Array.isArray(addons) ? addons : Object.entries(addons != null ? addons : {}).filter(([, on]) => !!on).map(([k]) => k);
216
- return enabled.length ? enabled.map((a) => /* @__PURE__ */ jsx(Chip, { size: "small", label: String(a) }, String(a))) : /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: "\u2014" });
233
+ return enabled.length ? enabled.map((a) => /* @__PURE__ */ jsx(
234
+ Chip,
235
+ {
236
+ size: "small",
237
+ label: translate(`tenancy.plan.addon.${String(a)}`, { _: prettyKey(String(a)) })
238
+ },
239
+ String(a)
240
+ )) : /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: "\u2014" });
217
241
  })() }),
218
242
  /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", gutterBottom: true, children: translate("tenancy.plan.payments", { _: "Recent payments" }) }),
219
243
  /* @__PURE__ */ jsx(Table, { size: "small", children: /* @__PURE__ */ jsxs(TableBody, { children: [
@@ -222,7 +246,7 @@ const TenancyPlanPanel = ({ tenancyId }) => {
222
246
  var _a2;
223
247
  return /* @__PURE__ */ jsxs(TableRow, { children: [
224
248
  /* @__PURE__ */ jsx(TableCell, { children: formatDate(p.created_at) }),
225
- /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx(Chip, { size: "small", label: p.status }) }),
249
+ /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx(Chip, { size: "small", label: tv("status", p.status) }) }),
226
250
  /* @__PURE__ */ jsx(TableCell, { align: "right", children: p.amount != null ? `${(_a2 = p.currency) != null ? _a2 : ""} ${p.amount}` : "\u2014" })
227
251
  ] }, p.id);
228
252
  })
@@ -246,7 +270,7 @@ const TenancyPlanPanel = ({ tenancyId }) => {
246
270
  " \xB7 ",
247
271
  translate("tenancy.plan.current", { _: "Current plan" }),
248
272
  ": ",
249
- /* @__PURE__ */ jsx("b", { children: (_f = plan == null ? void 0 : plan.name) != null ? _f : "\u2014" })
273
+ /* @__PURE__ */ jsx("b", { children: (_e = plan == null ? void 0 : plan.name) != null ? _e : "\u2014" })
250
274
  ] }),
251
275
  /* @__PURE__ */ jsx(
252
276
  TextField,
@@ -257,16 +281,29 @@ const TenancyPlanPanel = ({ tenancyId }) => {
257
281
  value: targetPlan,
258
282
  onChange: (e) => setTargetPlan(e.target.value),
259
283
  sx: { mb: 2 },
284
+ slotProps: { select: { MenuProps: { sx: { zIndex: (theme) => theme.zIndex.modal + 5 } } } },
260
285
  children: data.available_plans.map((p) => {
261
286
  var _a2;
262
- return /* @__PURE__ */ jsxs(MenuItem, { value: String(p.id), disabled: String(p.id) === String(plan == null ? void 0 : plan.id), children: [
263
- p.name,
264
- " \u2014 ",
265
- formatPrice(p.prices, p.price),
266
- " / ",
267
- (_a2 = p.billing_cycle) != null ? _a2 : "monthly",
268
- String(p.id) === String(plan == null ? void 0 : plan.id) ? " (current)" : ""
269
- ] }, String(p.id));
287
+ return /* @__PURE__ */ jsx(MenuItem, { value: String(p.id), disabled: String(p.id) === String(plan == null ? void 0 : plan.id), children: /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 1, width: "100%" }, children: [
288
+ /* @__PURE__ */ jsxs("span", { children: [
289
+ p.name,
290
+ " \u2014 ",
291
+ price(p.prices, p.price),
292
+ " / ",
293
+ cycle(p.billing_cycle),
294
+ String(p.id) === String(plan == null ? void 0 : plan.id) ? ` (${translate("tenancy.plan.current_short", { _: "current" })})` : ""
295
+ ] }),
296
+ /* @__PURE__ */ jsx(
297
+ Chip,
298
+ {
299
+ size: "small",
300
+ variant: "outlined",
301
+ color: p.subscription_plan_type === "internal" ? "secondary" : "default",
302
+ label: tv("type", (_a2 = p.subscription_plan_type) != null ? _a2 : "public"),
303
+ sx: { ml: "auto" }
304
+ }
305
+ )
306
+ ] }) }, String(p.id));
270
307
  })
271
308
  }
272
309
  ),
@@ -306,6 +306,98 @@ declare const _default: {
306
306
  };
307
307
  tenancy_role_warning: string;
308
308
  };
309
+ tenancy: {
310
+ plan: {
311
+ current: string;
312
+ current_short: string;
313
+ details: string;
314
+ change: string;
315
+ new_plan: string;
316
+ apply: string;
317
+ none: string;
318
+ free: string;
319
+ unlimited: string;
320
+ pending: string;
321
+ changed: string;
322
+ failed: string;
323
+ load_failed: string;
324
+ subscription: string;
325
+ limits: string;
326
+ limit: string;
327
+ allowed: string;
328
+ used: string;
329
+ addons: string;
330
+ payments: string;
331
+ renews: string;
332
+ trial_ends: string;
333
+ no_charge: string;
334
+ charge_help: string;
335
+ assign_help: string;
336
+ gateway_warning: string;
337
+ downgrade_note: string;
338
+ type: {
339
+ public: string;
340
+ internal: string;
341
+ };
342
+ cycle: {
343
+ monthly: string;
344
+ yearly: string;
345
+ annual: string;
346
+ weekly: string;
347
+ daily: string;
348
+ };
349
+ status: {
350
+ active: string;
351
+ trial: string;
352
+ trialing: string;
353
+ past_due: string;
354
+ canceled: string;
355
+ cancelled: string;
356
+ expired: string;
357
+ inactive: string;
358
+ suspended: string;
359
+ pending: string;
360
+ paid: string;
361
+ failed: string;
362
+ refunded: string;
363
+ };
364
+ gateway: {
365
+ internal: string;
366
+ flow: string;
367
+ rebill: string;
368
+ none: string;
369
+ };
370
+ field: {
371
+ status: string;
372
+ state: string;
373
+ account: string;
374
+ plan_type: string;
375
+ gateway: string;
376
+ period_start: string;
377
+ period_end: string;
378
+ trial_ends: string;
379
+ cancels_at: string;
380
+ tier: string;
381
+ trial_days: string;
382
+ };
383
+ limit_name: {
384
+ max_tenants: string;
385
+ max_users_per_tenant: string;
386
+ max_products_per_tenant: string;
387
+ max_product_categories: string;
388
+ max_monthly_orders: string;
389
+ max_tabs_per_day: string;
390
+ max_storage_mb: string;
391
+ max_media_files: string;
392
+ max_monthly_emails: string;
393
+ max_monthly_sms: string;
394
+ max_inamaps: string;
395
+ max_layouts_per_inamap: string;
396
+ max_locations: string;
397
+ max_active_route_sessions: string;
398
+ };
399
+ };
400
+ };
309
401
  resource: {
310
402
  tenancy: {
311
403
  serviceAccounts: {
@@ -335,6 +335,85 @@ const dashEnglish = {
335
335
  // tenant in the account, so the tenant field stops being a boundary.
336
336
  tenancy_role_warning: "This role grants access to every tenant in the account. The selected tenant is informational, not a security boundary."
337
337
  },
338
+ // Tenancy plan tab (System): current plan card, details drawer and change-plan dialog
339
+ tenancy: {
340
+ plan: {
341
+ current: "Current plan",
342
+ current_short: "current",
343
+ details: "View details",
344
+ change: "Change plan",
345
+ new_plan: "New plan",
346
+ apply: "Apply",
347
+ none: "No plan",
348
+ free: "Free",
349
+ unlimited: "Unlimited",
350
+ pending: "Pending",
351
+ changed: "Plan updated",
352
+ failed: "Could not change the plan",
353
+ load_failed: "Could not load the plan",
354
+ subscription: "Subscription",
355
+ limits: "Limits",
356
+ limit: "Limit",
357
+ allowed: "Allowed",
358
+ used: "Used",
359
+ addons: "Add-ons",
360
+ payments: "Recent payments",
361
+ renews: "Current period ends",
362
+ trial_ends: "Trial ends",
363
+ no_charge: "Assign now, without charging",
364
+ charge_help: "Normal flow: a paid plan stays pending until the payment gateway confirms it.",
365
+ assign_help: "Applied immediately, whatever the plan's price. No payment is requested.",
366
+ gateway_warning: "This account has a subscription at an external payment gateway. Assigning here does not change it: it keeps billing the plan it has there.",
367
+ downgrade_note: "Moving to a free plan.",
368
+ type: { public: "Public", internal: "Internal" },
369
+ cycle: { monthly: "monthly", yearly: "yearly", annual: "yearly", weekly: "weekly", daily: "daily" },
370
+ status: {
371
+ active: "Active",
372
+ trial: "Trial",
373
+ trialing: "In trial",
374
+ past_due: "Past due",
375
+ canceled: "Canceled",
376
+ cancelled: "Canceled",
377
+ expired: "Expired",
378
+ inactive: "Inactive",
379
+ suspended: "Suspended",
380
+ pending: "Pending",
381
+ paid: "Paid",
382
+ failed: "Failed",
383
+ refunded: "Refunded"
384
+ },
385
+ gateway: { internal: "Internal", flow: "Flow", rebill: "Rebill", none: "None" },
386
+ field: {
387
+ status: "Status",
388
+ state: "State",
389
+ account: "Account",
390
+ plan_type: "Plan type",
391
+ gateway: "Payment gateway",
392
+ period_start: "Period start",
393
+ period_end: "Period end",
394
+ trial_ends: "Trial ends",
395
+ cancels_at: "Cancels at",
396
+ tier: "Plan tier",
397
+ trial_days: "Trial days (plan)"
398
+ },
399
+ limit_name: {
400
+ max_tenants: "Max accounts",
401
+ max_users_per_tenant: "Max users per account",
402
+ max_products_per_tenant: "Max products per account",
403
+ max_product_categories: "Max product categories",
404
+ max_monthly_orders: "Max monthly orders",
405
+ max_tabs_per_day: "Max tabs per day",
406
+ max_storage_mb: "Max storage (MB)",
407
+ max_media_files: "Max media files",
408
+ max_monthly_emails: "Max monthly emails",
409
+ max_monthly_sms: "Max monthly SMS",
410
+ max_inamaps: "Max INAMAPs",
411
+ max_layouts_per_inamap: "Max layouts per INAMAP",
412
+ max_locations: "Max locations",
413
+ max_active_route_sessions: "Max active route sessions"
414
+ }
415
+ }
416
+ },
338
417
  // Resource labels for admin panel
339
418
  resource: {
340
419
  tenancy: {
@@ -342,6 +342,85 @@ const dashSpanish = {
342
342
  // tenant in the account, so the tenant field stops being a boundary.
343
343
  tenancy_role_warning: "Este rol otorga acceso a todos los locales de la cuenta. El local seleccionado es informativo, no un l\xEDmite de seguridad."
344
344
  },
345
+ // Pestaña de plan de la cuenta (System): plan actual, detalle en panel lateral y cambio de plan
346
+ tenancy: {
347
+ plan: {
348
+ current: "Plan actual",
349
+ current_short: "actual",
350
+ details: "Ver detalle",
351
+ change: "Cambiar plan",
352
+ new_plan: "Nuevo plan",
353
+ apply: "Aplicar",
354
+ none: "Sin plan",
355
+ free: "Gratis",
356
+ unlimited: "Ilimitado",
357
+ pending: "Pendiente",
358
+ changed: "Plan actualizado",
359
+ failed: "No se pudo cambiar el plan",
360
+ load_failed: "No se pudo cargar el plan",
361
+ subscription: "Suscripci\xF3n",
362
+ limits: "L\xEDmites",
363
+ limit: "L\xEDmite",
364
+ allowed: "Permitido",
365
+ used: "Usado",
366
+ addons: "Complementos",
367
+ payments: "Pagos recientes",
368
+ renews: "El per\xEDodo actual termina",
369
+ trial_ends: "La prueba termina",
370
+ no_charge: "Asignar ahora, sin cobrar",
371
+ charge_help: "Flujo normal: un plan de pago queda pendiente hasta que la pasarela de pago lo confirme.",
372
+ assign_help: "Se aplica de inmediato, sin importar el precio del plan. No se solicita ning\xFAn pago.",
373
+ gateway_warning: "Esta cuenta tiene una suscripci\xF3n en una pasarela de pago externa. Asignar aqu\xED no la cambia: seguir\xE1 cobrando el plan que tiene all\xE1.",
374
+ downgrade_note: "Pasa a un plan gratuito.",
375
+ type: { public: "P\xFAblico", internal: "Interno" },
376
+ cycle: { monthly: "mensual", yearly: "anual", annual: "anual", weekly: "semanal", daily: "diario" },
377
+ status: {
378
+ active: "Activo",
379
+ trial: "Prueba",
380
+ trialing: "En prueba",
381
+ past_due: "Vencido",
382
+ canceled: "Cancelado",
383
+ cancelled: "Cancelado",
384
+ expired: "Expirado",
385
+ inactive: "Inactivo",
386
+ suspended: "Suspendido",
387
+ pending: "Pendiente",
388
+ paid: "Pagado",
389
+ failed: "Fallido",
390
+ refunded: "Reembolsado"
391
+ },
392
+ gateway: { internal: "Interna", flow: "Flow", rebill: "Rebill", none: "Ninguna" },
393
+ field: {
394
+ status: "Estado",
395
+ state: "Situaci\xF3n",
396
+ account: "Cuenta",
397
+ plan_type: "Tipo de plan",
398
+ gateway: "Pasarela de pago",
399
+ period_start: "Inicio del per\xEDodo",
400
+ period_end: "Fin del per\xEDodo",
401
+ trial_ends: "Fin de la prueba",
402
+ cancels_at: "Se cancela el",
403
+ tier: "Nivel del plan",
404
+ trial_days: "D\xEDas de prueba (plan)"
405
+ },
406
+ limit_name: {
407
+ max_tenants: "M\xE1x. cuentas",
408
+ max_users_per_tenant: "M\xE1x. usuarios por cuenta",
409
+ max_products_per_tenant: "M\xE1x. productos por cuenta",
410
+ max_product_categories: "M\xE1x. categor\xEDas de productos",
411
+ max_monthly_orders: "M\xE1x. pedidos al mes",
412
+ max_tabs_per_day: "M\xE1x. cuentas abiertas por d\xEDa",
413
+ max_storage_mb: "M\xE1x. almacenamiento (MB)",
414
+ max_media_files: "M\xE1x. archivos multimedia",
415
+ max_monthly_emails: "M\xE1x. correos al mes",
416
+ max_monthly_sms: "M\xE1x. SMS al mes",
417
+ max_inamaps: "M\xE1x. INAMAPs",
418
+ max_layouts_per_inamap: "M\xE1x. planos por INAMAP",
419
+ max_locations: "M\xE1x. ubicaciones",
420
+ max_active_route_sessions: "M\xE1x. sesiones de ruta activas"
421
+ }
422
+ }
423
+ },
345
424
  // Resource labels for admin panel
346
425
  resource: {
347
426
  tenancy: {
@@ -306,6 +306,98 @@ export declare const en: {
306
306
  };
307
307
  tenancy_role_warning: string;
308
308
  };
309
+ tenancy: {
310
+ plan: {
311
+ current: string;
312
+ current_short: string;
313
+ details: string;
314
+ change: string;
315
+ new_plan: string;
316
+ apply: string;
317
+ none: string;
318
+ free: string;
319
+ unlimited: string;
320
+ pending: string;
321
+ changed: string;
322
+ failed: string;
323
+ load_failed: string;
324
+ subscription: string;
325
+ limits: string;
326
+ limit: string;
327
+ allowed: string;
328
+ used: string;
329
+ addons: string;
330
+ payments: string;
331
+ renews: string;
332
+ trial_ends: string;
333
+ no_charge: string;
334
+ charge_help: string;
335
+ assign_help: string;
336
+ gateway_warning: string;
337
+ downgrade_note: string;
338
+ type: {
339
+ public: string;
340
+ internal: string;
341
+ };
342
+ cycle: {
343
+ monthly: string;
344
+ yearly: string;
345
+ annual: string;
346
+ weekly: string;
347
+ daily: string;
348
+ };
349
+ status: {
350
+ active: string;
351
+ trial: string;
352
+ trialing: string;
353
+ past_due: string;
354
+ canceled: string;
355
+ cancelled: string;
356
+ expired: string;
357
+ inactive: string;
358
+ suspended: string;
359
+ pending: string;
360
+ paid: string;
361
+ failed: string;
362
+ refunded: string;
363
+ };
364
+ gateway: {
365
+ internal: string;
366
+ flow: string;
367
+ rebill: string;
368
+ none: string;
369
+ };
370
+ field: {
371
+ status: string;
372
+ state: string;
373
+ account: string;
374
+ plan_type: string;
375
+ gateway: string;
376
+ period_start: string;
377
+ period_end: string;
378
+ trial_ends: string;
379
+ cancels_at: string;
380
+ tier: string;
381
+ trial_days: string;
382
+ };
383
+ limit_name: {
384
+ max_tenants: string;
385
+ max_users_per_tenant: string;
386
+ max_products_per_tenant: string;
387
+ max_product_categories: string;
388
+ max_monthly_orders: string;
389
+ max_tabs_per_day: string;
390
+ max_storage_mb: string;
391
+ max_media_files: string;
392
+ max_monthly_emails: string;
393
+ max_monthly_sms: string;
394
+ max_inamaps: string;
395
+ max_layouts_per_inamap: string;
396
+ max_locations: string;
397
+ max_active_route_sessions: string;
398
+ };
399
+ };
400
+ };
309
401
  resource: {
310
402
  tenancy: {
311
403
  serviceAccounts: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dashadmin/dash-admin",
3
- "version": "1.3.74-srcfree.4",
3
+ "version": "1.3.74",
4
4
  "main": "dist/index.js",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -39,11 +39,11 @@
39
39
  "@rollup/plugin-node-resolve": "latest",
40
40
  "@rollup/plugin-replace": "latest",
41
41
  "@rollup/plugin-typescript": "latest",
42
- "@dashadmin/dash-admin-state": "1.3.74-srcfree.4",
43
- "@dashadmin/dash-auto-admin": "1.3.74-srcfree.4",
44
- "@dashadmin/dash-constants": "1.3.74-srcfree.4",
45
- "@dashadmin/dash-dialog": "1.3.74-srcfree.4",
46
- "@dashadmin/dash-styles": "1.3.74-srcfree.4",
42
+ "@dashadmin/dash-admin-state": "1.3.74",
43
+ "@dashadmin/dash-auto-admin": "1.3.74",
44
+ "@dashadmin/dash-constants": "1.3.74",
45
+ "@dashadmin/dash-dialog": "1.3.74",
46
+ "@dashadmin/dash-styles": "1.3.74",
47
47
  "framer-motion": "latest",
48
48
  "prop-types": "latest",
49
49
  "query-string": "latest",
@@ -62,11 +62,11 @@
62
62
  "rollup-plugin-dts": "latest",
63
63
  "rollup-plugin-peer-deps-external": "latest",
64
64
  "rollup-plugin-svg": "latest",
65
- "@dashadmin/dash-modal": "1.3.74-srcfree.4",
66
- "@dashadmin/dash-components": "1.3.74-srcfree.4",
67
- "@dashadmin/dash-axios-hook": "1.3.74-srcfree.4",
68
- "@dashadmin/dash-utils": "1.3.74-srcfree.4",
69
- "@dashadmin/dash-auth": "1.3.74-srcfree.4"
65
+ "@dashadmin/dash-modal": "1.3.74",
66
+ "@dashadmin/dash-components": "1.3.74",
67
+ "@dashadmin/dash-axios-hook": "1.3.74",
68
+ "@dashadmin/dash-utils": "1.3.74",
69
+ "@dashadmin/dash-auth": "1.3.74"
70
70
  },
71
71
  "devDependencies": {
72
72
  "@babel/core": "latest",
@@ -79,8 +79,8 @@
79
79
  "@types/react-dom": "latest",
80
80
  "@zerollup/ts-transform-paths": "latest",
81
81
  "babel-loader": "latest",
82
- "@dashadmin/dash-eslint": "1.3.74-srcfree.4",
83
- "@dashadmin/dash-tsconfig": "1.3.74-srcfree.4",
82
+ "@dashadmin/dash-eslint": "1.3.74",
83
+ "@dashadmin/dash-tsconfig": "1.3.74",
84
84
  "eslint": "latest",
85
85
  "eslint-config-airbnb": "latest",
86
86
  "eslint-config-airbnb-typescript": "latest",
@@ -94,7 +94,7 @@
94
94
  "eslint-plugin-prettier": "latest",
95
95
  "eslint-plugin-react": "latest",
96
96
  "eslint-plugin-react-hooks": "latest",
97
- "@dashadmin/dash-prettier": "1.3.74-srcfree.4",
97
+ "@dashadmin/dash-prettier": "1.3.74",
98
98
  "query-string": "latest",
99
99
  "react-dom": "19.2.8",
100
100
  "rollup": "latest",