@saasicat/ui-vue 1.0.0-rc.21 → 1.0.0-rc.23

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.
Files changed (59) hide show
  1. package/dist/.build-stamp +1 -1
  2. package/dist/assets/ui-vue.css +90 -60
  3. package/dist/{batch-column-fetcher-DQ89o95K.d.cts → batch-column-fetcher-D6gEXpSs.d.cts} +1 -1
  4. package/dist/{batch-column-fetcher-Sr48UWEX.d.ts → batch-column-fetcher-D7E69Iai.d.ts} +1 -1
  5. package/dist/{catalog-0eZwciPW.d.cts → catalog-Bcl-6zMY.d.cts} +162 -2
  6. package/dist/{catalog-0eZwciPW.d.ts → catalog-Bcl-6zMY.d.ts} +162 -2
  7. package/dist/{chunk-CZIVA536.js → chunk-4CJ3LXQX.js} +292 -4
  8. package/dist/{chunk-7CHT2ATN.js → chunk-7EZUINOM.js} +1 -1
  9. package/dist/{chunk-RFJ4UGOE.js → chunk-LOMCQINC.js} +40 -4
  10. package/dist/{chunk-VLGEOPZH.js → chunk-YE54YIYZ.js} +375 -168
  11. package/dist/{chunk-47HDYN35.js → chunk-YROWQWX4.js} +26 -1
  12. package/dist/client/index.cjs +365 -7
  13. package/dist/client/index.d.cts +45 -6
  14. package/dist/client/index.d.ts +45 -6
  15. package/dist/client/index.js +21 -3
  16. package/dist/index.cjs +750 -181
  17. package/dist/index.d.cts +5 -5
  18. package/dist/index.d.ts +5 -5
  19. package/dist/index.js +37 -5
  20. package/dist/layouts/AdminLayout.js +74 -4
  21. package/dist/pages/MaintenancePage.js +415 -0
  22. package/dist/pages/TenantDetailPage.js +98 -15
  23. package/dist/pages/index.js +3 -1
  24. package/dist/quasar/index.cjs +290 -4
  25. package/dist/quasar/index.d.cts +2 -2
  26. package/dist/quasar/index.d.ts +2 -2
  27. package/dist/quasar/index.js +2 -2
  28. package/dist/{resource-registry-GAxu2kn6.d.ts → resource-registry--50bk_vo.d.ts} +1 -1
  29. package/dist/{resource-registry-zfCLvEgx.d.cts → resource-registry-GSRUS6Qa.d.cts} +1 -1
  30. package/dist/vue/index.cjs +691 -181
  31. package/dist/vue/index.d.cts +122 -54
  32. package/dist/vue/index.d.ts +122 -54
  33. package/dist/vue/index.js +18 -4
  34. package/package.json +3 -3
  35. package/src/client/i18n/messages/maintenance.ts +181 -0
  36. package/src/client/i18n/messages/nav.ts +2 -0
  37. package/src/client/i18n/messages/tenants.ts +52 -0
  38. package/src/client/i18n/messages.ts +3 -0
  39. package/src/client/index.ts +2 -0
  40. package/src/client/maintenance-refusal.ts +64 -0
  41. package/src/client/maintenance-times.ts +52 -0
  42. package/src/client/nav-builder.ts +3 -0
  43. package/src/client/resources/index.ts +3 -0
  44. package/src/client/resources/maintenance.resource.ts +138 -0
  45. package/src/client/resources/tenants.resource.ts +20 -3
  46. package/src/index.ts +4 -0
  47. package/src/internal/maintenance/MaintenanceLockBanner.vue +71 -0
  48. package/src/internal/maintenance/MaintenanceWindowDialog.vue +112 -0
  49. package/src/internal/tenant-detail/TenantCharges.vue +73 -0
  50. package/src/layouts/AdminLayout.vue +17 -2
  51. package/src/pages/MaintenancePage.vue +289 -0
  52. package/src/pages/TenantDetailPage.vue +22 -0
  53. package/src/pages/index.ts +2 -0
  54. package/src/vue/index.ts +4 -0
  55. package/src/vue/use-maintenance-lock-watch.ts +66 -0
  56. package/src/vue/use-maintenance-status.ts +105 -0
  57. package/src/vue/use-maintenance.ts +164 -0
  58. package/src/vue/use-tenant-account.ts +37 -0
  59. package/src/vue/use-tenant-billing.ts +8 -0
package/dist/.build-stamp CHANGED
@@ -1 +1 @@
1
- d1c64f8b1df6cdcad17723740e0b7de2d74301bb556752665e07a93bf6f24156
1
+ 41b3b5f88a4092f224945275383bb128b4c272fe2c7757eef112b64d89849c4b
@@ -316,7 +316,13 @@
316
316
  letter-spacing: var(--sa-tracking-wider);
317
317
  }
318
318
 
319
- .sa-admin-banner[data-v-a4f41524] {
319
+ .sa-maintenance-lock__link[data-v-2a83407e] {
320
+ margin-left: var(--sa-space-2);
321
+ color: inherit;
322
+ font-weight: 600;
323
+ }
324
+
325
+ .sa-admin-banner[data-v-06c8fec8] {
320
326
  display: flex;
321
327
  align-items: center;
322
328
  justify-content: center;
@@ -326,7 +332,7 @@
326
332
  letter-spacing: var(--sa-tracking-wider);
327
333
  text-transform: uppercase;
328
334
  }
329
- .sa-admin-banner--prod[data-v-a4f41524] {
335
+ .sa-admin-banner--prod[data-v-06c8fec8] {
330
336
  /* Invariant on purpose: this strip says "you are on production", and its
331
337
  * white text has to stay readable in both themes. The `negative` roles
332
338
  * lighten in dark — for text ON dark surfaces — and would take this one to
@@ -338,7 +344,7 @@
338
344
  );
339
345
  color: var(--sa-color-inverse-fg);
340
346
  }
341
- .sa-admin-header[data-v-a4f41524] {
347
+ .sa-admin-header[data-v-06c8fec8] {
342
348
  background: var(
343
349
  --sa-admin-header-bg,
344
350
  linear-gradient(90deg, var(--sa-color-inverse-bg), var(--sa-color-inverse-surface))
@@ -350,7 +356,7 @@
350
356
  * box. Measured at 390px with the platform's own strings: 11px over, which is
351
357
  * a fixed header, so nothing scrolls it back into view. Both lines shrink now,
352
358
  * which is what a title is for and a control is not. */
353
- .sa-admin-header[data-v-a4f41524] .q-toolbar__title {
359
+ .sa-admin-header[data-v-06c8fec8] .q-toolbar__title {
354
360
  min-width: 0;
355
361
  /* Quasar pads the title 12px on each side, and padding does not shrink: at
356
362
  * the narrow end the title itself was already down to nothing while those
@@ -360,7 +366,7 @@
360
366
  padding-left: 0;
361
367
  padding-right: var(--sa-space-3);
362
368
  }
363
- .sa-admin-header__sub[data-v-a4f41524] {
369
+ .sa-admin-header__sub[data-v-06c8fec8] {
364
370
  font-size: var(--sa-text-xs);
365
371
  color: var(--sa-admin-header-sub, var(--sa-color-inverse-accent));
366
372
  font-weight: 400;
@@ -368,7 +374,7 @@
368
374
  text-overflow: ellipsis;
369
375
  white-space: nowrap;
370
376
  }
371
- .sa-admin-badge[data-v-a4f41524] {
377
+ .sa-admin-badge[data-v-06c8fec8] {
372
378
  background: var(--sa-admin-badge-bg, var(--sa-color-inverse-accent));
373
379
  color: var(--sa-admin-badge-fg, var(--sa-color-inverse-accent-fg));
374
380
  font-weight: 800;
@@ -376,7 +382,7 @@
376
382
  font-size: var(--sa-text-2xs);
377
383
  padding: var(--sa-space-2) var(--sa-space-3);
378
384
  }
379
- .sa-admin-user[data-v-a4f41524] {
385
+ .sa-admin-user[data-v-06c8fec8] {
380
386
  display: flex;
381
387
  align-items: center;
382
388
  gap: var(--sa-space-3);
@@ -385,31 +391,31 @@
385
391
  * end of a `nowrap` toolbar instead of being shortened. */
386
392
  min-width: 0;
387
393
  }
388
- .sa-admin-user__avatar[data-v-a4f41524] {
394
+ .sa-admin-user__avatar[data-v-06c8fec8] {
389
395
  background: var(--sa-admin-user-avatar-bg, var(--sa-color-inverse-accent));
390
396
  color: var(--sa-admin-user-avatar-fg, var(--sa-color-inverse-accent-fg));
391
397
  }
392
- .sa-admin-user__avatar[data-v-a4f41524],
393
- .sa-admin-user .q-btn[data-v-a4f41524] {
398
+ .sa-admin-user__avatar[data-v-06c8fec8],
399
+ .sa-admin-user .q-btn[data-v-06c8fec8] {
394
400
  /* The two things in this group that are controls or fixed squares. A flex
395
401
  * item shrinks from its own basis, so without this the avatar and the
396
402
  * sign-out button donate width to a name they should be donating none to —
397
403
  * the same shrink that squeezed the login mark to 0px at 320. */
398
404
  flex: none;
399
405
  }
400
- .sa-admin-user__name[data-v-a4f41524] {
406
+ .sa-admin-user__name[data-v-06c8fec8] {
401
407
  line-height: 1.05;
402
408
  min-width: 0;
403
409
  }
404
410
  /* Text is what shrinking is for; a control is not. Both lines therefore
405
411
  * shorten rather than widen the group. */
406
- .sa-admin-user__name > div[data-v-a4f41524] {
412
+ .sa-admin-user__name > div[data-v-06c8fec8] {
407
413
  max-width: 100%;
408
414
  overflow: hidden;
409
415
  text-overflow: ellipsis;
410
416
  white-space: nowrap;
411
417
  }
412
- .sa-admin-user__email[data-v-a4f41524] {
418
+ .sa-admin-user__email[data-v-06c8fec8] {
413
419
  color: var(--sa-admin-user-email, var(--sa-color-inverse-accent));
414
420
  }
415
421
 
@@ -445,13 +451,13 @@
445
451
  * to it however long the selector gets. Same reason the active drawer item
446
452
  * above carries one. */
447
453
  @media (max-width: 1439.98px) {
448
- .sa-admin-header[data-v-a4f41524] .sa-locale-switcher .q-btn__content > .block,
449
- .sa-admin-header[data-v-a4f41524] .sa-theme-switcher .q-btn__content > .block {
454
+ .sa-admin-header[data-v-06c8fec8] .sa-locale-switcher .q-btn__content > .block,
455
+ .sa-admin-header[data-v-06c8fec8] .sa-theme-switcher .q-btn__content > .block {
450
456
  display: none !important;
451
457
  }
452
458
  }
453
459
  @media (max-width: 599.98px) {
454
- .sa-admin-badge[data-v-a4f41524] {
460
+ .sa-admin-badge[data-v-06c8fec8] {
455
461
  display: none;
456
462
  }
457
463
  /* And the operator's own name and address, which at this width would be
@@ -460,29 +466,29 @@
460
466
  * came to the page to read. The avatar keeps the identity present and the
461
467
  * full text is one breakpoint away. The truncation above is what covers
462
468
  * the band where the block is shown and space is still tight. */
463
- .sa-admin-user__name[data-v-a4f41524] {
469
+ .sa-admin-user__name[data-v-06c8fec8] {
464
470
  display: none;
465
471
  }
466
472
  }
467
- .sa-admin-drawer[data-v-a4f41524] .q-drawer,
468
- .sa-admin-drawer[data-v-a4f41524] .q-drawer__content,
469
- .sa-admin-drawer__stack[data-v-a4f41524] {
473
+ .sa-admin-drawer[data-v-06c8fec8] .q-drawer,
474
+ .sa-admin-drawer[data-v-06c8fec8] .q-drawer__content,
475
+ .sa-admin-drawer__stack[data-v-06c8fec8] {
470
476
  background: var(--sa-admin-drawer-bg, var(--sa-color-inverse-bg));
471
477
  color: var(--sa-admin-drawer-fg, var(--sa-color-inverse-fg-muted));
472
478
  }
473
- .sa-admin-drawer__stack[data-v-a4f41524] {
479
+ .sa-admin-drawer__stack[data-v-06c8fec8] {
474
480
  display: flex;
475
481
  flex-direction: column;
476
482
  height: 100%;
477
483
  }
478
- .sa-admin-drawer__brand[data-v-a4f41524] {
484
+ .sa-admin-drawer__brand[data-v-06c8fec8] {
479
485
  display: flex;
480
486
  align-items: center;
481
487
  gap: var(--sa-space-4);
482
488
  padding: var(--sa-space-5) var(--sa-space-5);
483
489
  border-bottom: 1px solid var(--sa-color-inverse-border);
484
490
  }
485
- .sa-admin-drawer__logo[data-v-a4f41524] {
491
+ .sa-admin-drawer__logo[data-v-06c8fec8] {
486
492
  width: 36px;
487
493
  height: 36px;
488
494
  border-radius: var(--sa-radius-tile);
@@ -500,21 +506,21 @@
500
506
  align-items: center;
501
507
  justify-content: center;
502
508
  }
503
- .sa-admin-drawer__brand-name[data-v-a4f41524] {
509
+ .sa-admin-drawer__brand-name[data-v-06c8fec8] {
504
510
  font-weight: 800;
505
511
  color: var(--sa-color-inverse-fg);
506
512
  }
507
- .sa-admin-drawer__brand-tag[data-v-a4f41524] {
513
+ .sa-admin-drawer__brand-tag[data-v-06c8fec8] {
508
514
  font-size: var(--sa-text-xs);
509
515
  color: var(--sa-admin-drawer-brand-tag, var(--sa-color-inverse-accent));
510
516
  text-transform: uppercase;
511
517
  letter-spacing: var(--sa-tracking-wider);
512
518
  }
513
- .sa-admin-drawer__list[data-v-a4f41524] {
519
+ .sa-admin-drawer__list[data-v-06c8fec8] {
514
520
  flex: 1;
515
521
  padding: var(--sa-space-2) var(--sa-space-2);
516
522
  }
517
- .sa-admin-drawer__section[data-v-a4f41524] {
523
+ .sa-admin-drawer__section[data-v-06c8fec8] {
518
524
  font-size: var(--sa-text-2xs);
519
525
  text-transform: uppercase;
520
526
  letter-spacing: var(--sa-tracking-wider);
@@ -522,7 +528,7 @@
522
528
  padding: var(--sa-space-4) var(--sa-space-5) var(--sa-space-2);
523
529
  font-weight: 600;
524
530
  }
525
- .sa-admin-drawer__list[data-v-a4f41524] .q-item {
531
+ .sa-admin-drawer__list[data-v-06c8fec8] .q-item {
526
532
  color: var(--sa-admin-drawer-item-fg, var(--sa-color-inverse-fg-muted));
527
533
  border-radius: var(--sa-radius-control);
528
534
  margin: var(--sa-space-0) var(--sa-space-2);
@@ -531,21 +537,21 @@
531
537
  font-size: var(--sa-text-md);
532
538
  font-weight: 500;
533
539
  }
534
- .sa-admin-drawer__list[data-v-a4f41524] .q-item__section--avatar {
540
+ .sa-admin-drawer__list[data-v-06c8fec8] .q-item__section--avatar {
535
541
  min-width: 28px;
536
542
  padding-right: var(--sa-space-3);
537
543
  }
538
- .sa-admin-drawer__list[data-v-a4f41524] .q-item .q-icon {
544
+ .sa-admin-drawer__list[data-v-06c8fec8] .q-item .q-icon {
539
545
  color: var(--sa-color-inverse-fg-subtle);
540
546
  }
541
- .sa-admin-drawer__list[data-v-a4f41524] .q-item:hover {
547
+ .sa-admin-drawer__list[data-v-06c8fec8] .q-item:hover {
542
548
  background: var(--sa-admin-drawer-hover-bg, var(--sa-color-inverse-accent-surface));
543
549
  color: var(--sa-admin-drawer-hover-fg, var(--sa-color-inverse-accent));
544
550
  }
545
- .sa-admin-drawer__list[data-v-a4f41524] .q-item:hover .q-icon {
551
+ .sa-admin-drawer__list[data-v-06c8fec8] .q-item:hover .q-icon {
546
552
  color: var(--sa-admin-drawer-hover-fg, var(--sa-color-inverse-accent));
547
553
  }
548
- .sa-admin-drawer__list[data-v-a4f41524] .sa-admin-drawer__item--active {
554
+ .sa-admin-drawer__list[data-v-06c8fec8] .sa-admin-drawer__item--active {
549
555
  background: var(
550
556
  --sa-admin-drawer-active-bg,
551
557
  var(--sa-color-inverse-accent-surface-strong)
@@ -553,16 +559,16 @@
553
559
  color: var(--sa-admin-drawer-active-fg, var(--sa-color-inverse-accent)) !important;
554
560
  font-weight: 600;
555
561
  }
556
- .sa-admin-drawer__list[data-v-a4f41524] .sa-admin-drawer__item--active .q-icon {
562
+ .sa-admin-drawer__list[data-v-06c8fec8] .sa-admin-drawer__item--active .q-icon {
557
563
  color: var(--sa-admin-drawer-active-fg, var(--sa-color-inverse-accent));
558
564
  }
559
- .sa-admin-drawer__footer[data-v-a4f41524] {
565
+ .sa-admin-drawer__footer[data-v-06c8fec8] {
560
566
  padding: var(--sa-space-4) var(--sa-space-5);
561
567
  border-top: 1px solid var(--sa-color-inverse-border);
562
568
  font-size: var(--sa-text-xs);
563
569
  color: var(--sa-color-inverse-fg-muted);
564
570
  }
565
- .sa-admin-drawer__doc[data-v-a4f41524] {
571
+ .sa-admin-drawer__doc[data-v-06c8fec8] {
566
572
  display: inline-flex;
567
573
  align-items: center;
568
574
  gap: var(--sa-space-2);
@@ -570,15 +576,15 @@
570
576
  color: var(--sa-color-inverse-fg-muted);
571
577
  text-decoration: none;
572
578
  }
573
- .sa-admin-drawer__doc[data-v-a4f41524]:hover {
579
+ .sa-admin-drawer__doc[data-v-06c8fec8]:hover {
574
580
  color: var(--sa-admin-drawer-hover-fg, var(--sa-color-inverse-accent));
575
581
  }
576
- .sa-admin-content[data-v-a4f41524] {
582
+ .sa-admin-content[data-v-06c8fec8] {
577
583
  max-width: 1600px;
578
584
  margin: 0 auto;
579
585
  padding: var(--sa-space-5) var(--sa-space-7) var(--sa-space-8);
580
586
  }
581
- .sa-admin-content--fullbleed[data-v-a4f41524] {
587
+ .sa-admin-content--fullbleed[data-v-06c8fec8] {
582
588
  max-width: none;
583
589
  padding: 0;
584
590
  }
@@ -2405,6 +2411,50 @@ code[data-v-aab75c67] {
2405
2411
  word-break: break-word;
2406
2412
  }
2407
2413
 
2414
+ .kv[data-v-a465048d] {
2415
+ background: var(--sa-color-bg-sunken);
2416
+ border: 1px solid var(--sa-color-border);
2417
+ border-radius: var(--sa-radius-tile);
2418
+ padding: var(--sa-space-3) var(--sa-space-4);
2419
+ }
2420
+ .kv__label[data-v-a465048d] {
2421
+ color: var(--sa-color-fg-muted);
2422
+ font-size: var(--sa-text-xs);
2423
+ text-transform: uppercase;
2424
+ letter-spacing: var(--sa-tracking-wider);
2425
+ font-weight: 700;
2426
+ }
2427
+ .kv__value[data-v-a465048d] {
2428
+ font-size: var(--sa-text-lg);
2429
+ font-weight: 600;
2430
+ color: var(--sa-color-fg-heading);
2431
+ margin-top: var(--sa-space-2);
2432
+ }
2433
+
2434
+ .sa-maintenance__facts[data-v-87d6bb16] {
2435
+ display: grid;
2436
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
2437
+ gap: var(--sa-space-3);
2438
+ margin-top: var(--sa-space-3);
2439
+ }
2440
+ /* A message is one long word as often as not; the tile must not push the
2441
+ grid wider than the page. */
2442
+ .sa-maintenance__facts[data-v-87d6bb16] > * {
2443
+ min-width: 0;
2444
+ overflow-wrap: anywhere;
2445
+ }
2446
+ .sa-maintenance__actions[data-v-87d6bb16] {
2447
+ display: flex;
2448
+ flex-wrap: wrap;
2449
+ gap: var(--sa-space-2);
2450
+ margin-top: var(--sa-space-4);
2451
+ }
2452
+ .sa-maintenance__hint[data-v-87d6bb16] {
2453
+ margin: var(--sa-space-3) 0 0;
2454
+ color: var(--sa-color-fg-muted);
2455
+ font-size: var(--sa-text-sm);
2456
+ }
2457
+
2408
2458
  .mc-promo[data-v-4df738db] {
2409
2459
  display: flex;
2410
2460
  flex-direction: column;
@@ -6713,26 +6763,6 @@ code[data-v-aab75c67] {
6713
6763
  font-family: var(--sa-font-mono);
6714
6764
  }
6715
6765
 
6716
- .kv[data-v-a465048d] {
6717
- background: var(--sa-color-bg-sunken);
6718
- border: 1px solid var(--sa-color-border);
6719
- border-radius: var(--sa-radius-tile);
6720
- padding: var(--sa-space-3) var(--sa-space-4);
6721
- }
6722
- .kv__label[data-v-a465048d] {
6723
- color: var(--sa-color-fg-muted);
6724
- font-size: var(--sa-text-xs);
6725
- text-transform: uppercase;
6726
- letter-spacing: var(--sa-tracking-wider);
6727
- font-weight: 700;
6728
- }
6729
- .kv__value[data-v-a465048d] {
6730
- font-size: var(--sa-text-lg);
6731
- font-weight: 600;
6732
- color: var(--sa-color-fg-heading);
6733
- margin-top: var(--sa-space-2);
6734
- }
6735
-
6736
6766
  .sa-settings__facts[data-v-e41dc72f] {
6737
6767
  display: grid;
6738
6768
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
@@ -6791,7 +6821,7 @@ code[data-v-aab75c67] {
6791
6821
  font-size: var(--sa-text-md);
6792
6822
  }
6793
6823
 
6794
- code[data-v-81871de6] {
6824
+ code[data-v-481c2843] {
6795
6825
  background: var(--sa-color-bg-sunken);
6796
6826
  padding: var(--sa-space-0) var(--sa-space-2);
6797
6827
  border-radius: var(--sa-radius-badge);
@@ -1,4 +1,4 @@
1
- import { a5 as SaMessages, H as HttpClient, l as KvStore, a2 as SaLocale, aD as SaNavMessages } from './catalog-0eZwciPW.cjs';
1
+ import { a8 as SaMessages, H as HttpClient, l as KvStore, a5 as SaLocale, aI as SaNavMessages } from './catalog-Bcl-6zMY.cjs';
2
2
  import { PublicBootResponse, AdminManifest, StandardPageKey, TenantColumnDef } from '@saasicat/core';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { a5 as SaMessages, H as HttpClient, l as KvStore, a2 as SaLocale, aD as SaNavMessages } from './catalog-0eZwciPW.js';
1
+ import { a8 as SaMessages, H as HttpClient, l as KvStore, a5 as SaLocale, aI as SaNavMessages } from './catalog-Bcl-6zMY.js';
2
2
  import { PublicBootResponse, AdminManifest, StandardPageKey, TenantColumnDef } from '@saasicat/core';
3
3
 
4
4
  /**
@@ -1,5 +1,5 @@
1
1
  import * as _saasicat_core from '@saasicat/core';
2
- import { AdminAuditListFilter, AuditEntry, TenantListFilter, TenantDto, AdminTenantDetail, PromoCodeRecord, MarketingProjectionRow, CreateMarketingProjectionData, UpdateMarketingProjectionData, MarketingSettingsRow, DiscoverySnapshot, KpiCardDef, BundleVersionRow, CreateBundleVersionDraftData, BundleVersionMutationResult, UpdateBundleVersionDraftData, BundleRow, CreateBundleData, UpdateBundleData, PlanVersionRow, CreatePlanVersionDraftData, PlanVersionMutationResult, UpdatePlanVersionDraftData, PlanRow, CreatePlanData, UpdatePlanData, StandardPageKey, AdminManifest, TenantActionDef } from '@saasicat/core';
2
+ import { MaintenanceOverview, MaintenanceWindowView, MaintenanceLockView, MaintenanceUnlockView, AdminAuditListFilter, AuditEntry, TenantListFilter, TenantDto, AdminTenantDetail, AdminSubscriberAccount, PromoCodeRecord, MarketingProjectionRow, CreateMarketingProjectionData, UpdateMarketingProjectionData, MarketingSettingsRow, DiscoverySnapshot, KpiCardDef, BundleVersionRow, CreateBundleVersionDraftData, BundleVersionMutationResult, UpdateBundleVersionDraftData, BundleRow, CreateBundleData, UpdateBundleData, PlanVersionRow, CreatePlanVersionDraftData, PlanVersionMutationResult, UpdatePlanVersionDraftData, PlanRow, CreatePlanData, UpdatePlanData, StandardPageKey, AdminManifest, TenantActionDef } from '@saasicat/core';
3
3
 
4
4
  /**
5
5
  * Minimal abstraction over `fetch`. Consumers may pass their own
@@ -222,6 +222,42 @@ declare function defineResource<const TOps extends ResourceOps>(key: string, ops
222
222
  */
223
223
  declare function bindResource<TOps extends ResourceOps>(def: ResourceDef<TOps>, http: HttpClient, ctx: ResourceContext | (() => ResourceContext)): Bound<TOps>;
224
224
 
225
+ /** What an operator announces: both times as ISO strings with their zone. */
226
+ interface MaintenanceAnnouncementInput {
227
+ startsAt: string;
228
+ endsAt: string;
229
+ message?: string | null;
230
+ }
231
+ /** What an operator moves; what is left out stays, `message: null` takes it away. */
232
+ interface MaintenanceRevisionInput {
233
+ startsAt?: string;
234
+ endsAt?: string;
235
+ message?: string | null;
236
+ }
237
+ /** What an operator locks with; `windowId` is the window they are looking at. */
238
+ interface MaintenanceLockInput {
239
+ windowId?: string;
240
+ endsAt?: string;
241
+ message?: string | null;
242
+ }
243
+ /**
244
+ * Whether a body is the overview it claims to be. Read at the boundary rather
245
+ * than trusted: an older backend, a proxy's JSON error page or a stub answers
246
+ * 200 with something else, and a page that read `recent.length` off it took its
247
+ * route down instead of showing its error (`SC-UI-020`).
248
+ */
249
+ declare function isMaintenanceOverview(value: unknown): value is MaintenanceOverview;
250
+ declare const maintenanceResource: ResourceDef<{
251
+ readonly overview: (http: HttpClient, ctx: ResourceContext) => Promise<MaintenanceOverview>;
252
+ readonly announce: (http: HttpClient, ctx: ResourceContext, input: MaintenanceAnnouncementInput) => Promise<MaintenanceWindowView>;
253
+ readonly reschedule: (http: HttpClient, ctx: ResourceContext, id: string, input: MaintenanceRevisionInput) => Promise<MaintenanceWindowView>;
254
+ readonly cancel: (http: HttpClient, ctx: ResourceContext, id: string) => Promise<MaintenanceWindowView>;
255
+ readonly lock: (http: HttpClient, ctx: ResourceContext, input: MaintenanceLockInput, mfaCode?: string) => Promise<MaintenanceLockView>;
256
+ readonly unlock: (http: HttpClient, ctx: ResourceContext, input: {
257
+ windowId?: string;
258
+ }, mfaCode?: string) => Promise<MaintenanceUnlockView>;
259
+ }>;
260
+
225
261
  /**
226
262
  * One leaf that differs between two starts, as the server names it.
227
263
  *
@@ -387,6 +423,11 @@ declare const tenantsResource: ResourceDef<{
387
423
  */
388
424
  readonly suspend: (http: HttpClient, ctx: ResourceContext, slug: string, reason: string, mfaCode?: string) => Promise<void>;
389
425
  readonly reactivate: (http: HttpClient, ctx: ResourceContext, slug: string, mfaCode?: string) => Promise<void>;
426
+ /**
427
+ * The charges of the tenant's subscriber, newest first. Served only where
428
+ * the manifest announces `charges.read`.
429
+ */
430
+ readonly charges: (http: HttpClient, ctx: ResourceContext, slug: string) => Promise<AdminSubscriberAccount>;
390
431
  }>;
391
432
 
392
433
  /** What the promo list can be narrowed by, including its "all" state. */
@@ -684,6 +725,7 @@ declare const platformResources: {
684
725
  readonly detail: (http: HttpClient, ctx: ResourceContext, slug: string) => Promise<_saasicat_core.AdminTenantDetail | null>;
685
726
  readonly suspend: (http: HttpClient, ctx: ResourceContext, slug: string, reason: string, mfaCode?: string) => Promise<void>;
686
727
  readonly reactivate: (http: HttpClient, ctx: ResourceContext, slug: string, mfaCode?: string) => Promise<void>;
728
+ readonly charges: (http: HttpClient, ctx: ResourceContext, slug: string) => Promise<_saasicat_core.AdminSubscriberAccount>;
687
729
  }>;
688
730
  users: ResourceDef<{
689
731
  readonly list: (http: HttpClient, ctx: ResourceContext, filter?: _saasicat_core.AdminUserListFilter) => Promise<_saasicat_core.AdminUserListRow[]>;
@@ -702,6 +744,16 @@ declare const platformResources: {
702
744
  readonly read: (http: HttpClient, ctx: ResourceContext) => Promise<AppliedSettingsView>;
703
745
  readonly acknowledgeChange: (http: HttpClient, ctx: ResourceContext, id: string) => Promise<SettingsChangeView>;
704
746
  }>;
747
+ maintenance: ResourceDef<{
748
+ readonly overview: (http: HttpClient, ctx: ResourceContext) => Promise<_saasicat_core.MaintenanceOverview>;
749
+ readonly announce: (http: HttpClient, ctx: ResourceContext, input: MaintenanceAnnouncementInput) => Promise<_saasicat_core.MaintenanceWindowView>;
750
+ readonly reschedule: (http: HttpClient, ctx: ResourceContext, id: string, input: MaintenanceRevisionInput) => Promise<_saasicat_core.MaintenanceWindowView>;
751
+ readonly cancel: (http: HttpClient, ctx: ResourceContext, id: string) => Promise<_saasicat_core.MaintenanceWindowView>;
752
+ readonly lock: (http: HttpClient, ctx: ResourceContext, input: MaintenanceLockInput, mfaCode?: string) => Promise<_saasicat_core.MaintenanceLockView>;
753
+ readonly unlock: (http: HttpClient, ctx: ResourceContext, input: {
754
+ windowId?: string;
755
+ }, mfaCode?: string) => Promise<_saasicat_core.MaintenanceUnlockView>;
756
+ }>;
705
757
  pilots: ResourceDef<{
706
758
  readonly list: (http: HttpClient, ctx: ResourceContext) => Promise<PilotRow[]>;
707
759
  readonly reviewSoon: (http: HttpClient, ctx: ResourceContext) => Promise<PilotRow[]>;
@@ -1276,6 +1328,87 @@ declare const errorsMessages: Record<SaBuiltinLocale, {
1276
1328
  unexpected: string;
1277
1329
  }>;
1278
1330
 
1331
+ declare const maintenanceMessages: Record<SaBuiltinLocale, {
1332
+ title: string;
1333
+ subtitle: string;
1334
+ announce: string;
1335
+ lockNow: string;
1336
+ loadFailed: string;
1337
+ open: {
1338
+ title: string;
1339
+ none: string;
1340
+ noneHint: string;
1341
+ startsAt: string;
1342
+ endsAt: string;
1343
+ message: string;
1344
+ announcedBy: string;
1345
+ lockedAt: string;
1346
+ lockedBy: string;
1347
+ notAnnounced: string;
1348
+ lapsed: string;
1349
+ locked: string;
1350
+ overrun: string;
1351
+ takesEffect: string;
1352
+ lock: string;
1353
+ unlock: string;
1354
+ reschedule: string;
1355
+ cancel: string;
1356
+ };
1357
+ status: {
1358
+ announced: string;
1359
+ locked: string;
1360
+ ended: string;
1361
+ cancelled: string;
1362
+ };
1363
+ recent: {
1364
+ title: string;
1365
+ empty: string;
1366
+ status: string;
1367
+ startsAt: string;
1368
+ lockedAt: string;
1369
+ endedAt: string;
1370
+ by: string;
1371
+ };
1372
+ form: {
1373
+ announceTitle: string;
1374
+ rescheduleTitle: string;
1375
+ lockTitle: string;
1376
+ lockSubtitle: string;
1377
+ startsAt: string;
1378
+ endsAt: string;
1379
+ message: string;
1380
+ zone: string;
1381
+ submitAnnounce: string;
1382
+ submitSave: string;
1383
+ announced: string;
1384
+ rescheduled: string;
1385
+ };
1386
+ confirm: {
1387
+ lockTitle: string;
1388
+ lockMessage: string;
1389
+ lockConfirm: string;
1390
+ unlockTitle: string;
1391
+ unlockMessage: string;
1392
+ unlockConfirm: string;
1393
+ cancelTitle: string;
1394
+ cancelMessage: string;
1395
+ cancelConfirm: string;
1396
+ locked: string;
1397
+ alreadyLocked: string;
1398
+ unlocked: string;
1399
+ nothingLocked: string;
1400
+ cancelled: string;
1401
+ mfaLock: string;
1402
+ mfaUnlock: string;
1403
+ };
1404
+ banner: {
1405
+ locked: string;
1406
+ lockedUntil: string;
1407
+ overrun: string;
1408
+ open: string;
1409
+ };
1410
+ }>;
1411
+
1279
1412
  declare const marketingMessages: Record<SaBuiltinLocale, {
1280
1413
  topFeatures: string;
1281
1414
  tabs: {
@@ -2247,6 +2380,32 @@ declare const tenantsMessages: Record<SaBuiltinLocale, {
2247
2380
  title: string;
2248
2381
  columnEndsAt: string;
2249
2382
  };
2383
+ charges: {
2384
+ title: string;
2385
+ holder: string;
2386
+ noHolder: string;
2387
+ empty: string;
2388
+ loadFailed: string;
2389
+ columnDue: string;
2390
+ columnPeriod: string;
2391
+ columnItem: string;
2392
+ columnKind: string;
2393
+ columnOrigin: string;
2394
+ columnAmount: string;
2395
+ source: {
2396
+ plan: string;
2397
+ bundle: string;
2398
+ discount: string;
2399
+ };
2400
+ origin: {
2401
+ activation: string;
2402
+ renewal: string;
2403
+ planChange: string;
2404
+ bundleBooking: string;
2405
+ credit: string;
2406
+ correction: string;
2407
+ };
2408
+ };
2250
2409
  draft: {
2251
2410
  planModules: string;
2252
2411
  };
@@ -2311,6 +2470,7 @@ type SaMessages = {
2311
2470
  readonly pilots: (typeof pilotsMessages)['de'];
2312
2471
  readonly email: (typeof emailMessages)['de'];
2313
2472
  readonly settings: (typeof settingsMessages)['de'];
2473
+ readonly maintenance: (typeof maintenanceMessages)['de'];
2314
2474
  };
2315
2475
  /** Shape of app-side string overrides (deep partial of the catalog). */
2316
2476
  type SaMessagesOverrides = PartialMessages<SaMessages>;
@@ -2425,4 +2585,4 @@ interface SaCatalog {
2425
2585
  */
2426
2586
  declare function createSaCatalog(options?: SaCatalogOptions): SaCatalog;
2427
2587
 
2428
- export { type SaBuiltinLocale as $, ActionDefNotInManifestError as A, type Bound as B, type PlatformEmailTestInput as C, DEFAULT_SA_LOCALE as D, type EmailHistoryDetail as E, type PlatformEmailTestResult as F, type PlatformEmailWriteInput as G, type HttpClient as H, type PlatformResources as I, type PromoCodesFilter as J, type KpiReading as K, LIST_FIRST_PAGE as L, type MarketingProjectionsFilter as M, type PromoDetail as N, type PublishBundleVersionOptions as O, type PartialMessages as P, type PublishPlanVersionOptions as Q, type ResolvedAction as R, type ResourceContext as S, type ResourceDef as T, type ResourceListPage as U, type ResourceOp as V, type ResourceOps as W, SA_INTL_LOCALES as X, SA_LOCALES as Y, SA_LOCALE_LABELS as Z, SA_MESSAGES as _, type ActionHandler as a, type SaCatalog as a0, type SaCatalogOptions as a1, type SaLocale as a2, type SaLocaleDefinition as a3, type SaLocaleOption as a4, type SaMessages as a5, type SaMessagesOverrides as a6, type SettingsChangeView as a7, type SettingsDifferenceView as a8, type TenantsListFilter as a9, resolveMessages as aA, settingsResource as aB, tenantsResource as aC, type SaNavMessages as aD, type TranslationOf as aa, auditResource as ab, bindResource as ac, bundleVersionsResource as ad, bundlesResource as ae, clampListPage as af, clampListPageSize as ag, createSaCatalog as ah, dashboardResource as ai, defaultHttpClient as aj, defaultKvStore as ak, defineListOp as al, defineMessages as am, defineResource as an, discoveryResource as ao, filterQueryString as ap, isSaBuiltinLocale as aq, isSentInQuery as ar, listUrl as as, marketingResource as at, mergeMessages as au, planVersionsResource as av, plansResource as aw, platformResources as ax, promoCodesResource as ay, readListPage as az, ActionRegistry as b, type AppliedSettingsView as c, type AuditListFilter as d, type DiscoveryRead as e, type EmailHistoryFilter as f, type EmailHistoryListResult as g, type EmailHistoryResendResult as h, type EmailHistoryRow as i, type EmailHistoryStatus as j, type HttpResponse as k, type KvStore as l, LIST_PAGE_SIZE_DEFAULT as m, LIST_PAGE_SIZE_MAX as n, LIST_PAGINATION_PARAMS as o, type ListFilterOf as p, type ListOp as q, type ListQuery as r, type MessageTree as s, MissingHandlerError as t, type PilotCreatePayload as u, type PilotCreateResult as v, type PilotEditPayload as w, type PilotEditResult as x, type PilotRow as y, type PlatformEmailProvider as z };
2588
+ export { SA_LOCALES as $, ActionDefNotInManifestError as A, type Bound as B, type PilotEditResult as C, DEFAULT_SA_LOCALE as D, type EmailHistoryDetail as E, type PilotRow as F, type PlatformEmailProvider as G, type HttpClient as H, type PlatformEmailTestInput as I, type PlatformEmailTestResult as J, type KpiReading as K, LIST_FIRST_PAGE as L, type MaintenanceAnnouncementInput as M, type PlatformEmailWriteInput as N, type PlatformResources as O, type PartialMessages as P, type PromoCodesFilter as Q, type PromoDetail as R, type PublishBundleVersionOptions as S, type PublishPlanVersionOptions as T, type ResolvedAction as U, type ResourceContext as V, type ResourceDef as W, type ResourceListPage as X, type ResourceOp as Y, type ResourceOps as Z, SA_INTL_LOCALES as _, type ActionHandler as a, SA_LOCALE_LABELS as a0, SA_MESSAGES as a1, type SaBuiltinLocale as a2, type SaCatalog as a3, type SaCatalogOptions as a4, type SaLocale as a5, type SaLocaleDefinition as a6, type SaLocaleOption as a7, type SaMessages as a8, type SaMessagesOverrides as a9, planVersionsResource as aA, plansResource as aB, platformResources as aC, promoCodesResource as aD, readListPage as aE, resolveMessages as aF, settingsResource as aG, tenantsResource as aH, type SaNavMessages as aI, type SettingsChangeView as aa, type SettingsDifferenceView as ab, type TenantsListFilter as ac, type TranslationOf as ad, auditResource as ae, bindResource as af, bundleVersionsResource as ag, bundlesResource as ah, clampListPage as ai, clampListPageSize as aj, createSaCatalog as ak, dashboardResource as al, defaultHttpClient as am, defaultKvStore as an, defineListOp as ao, defineMessages as ap, defineResource as aq, discoveryResource as ar, filterQueryString as as, isMaintenanceOverview as at, isSaBuiltinLocale as au, isSentInQuery as av, listUrl as aw, maintenanceResource as ax, marketingResource as ay, mergeMessages as az, ActionRegistry as b, type AppliedSettingsView as c, type AuditListFilter as d, type DiscoveryRead as e, type EmailHistoryFilter as f, type EmailHistoryListResult as g, type EmailHistoryResendResult as h, type EmailHistoryRow as i, type EmailHistoryStatus as j, type HttpResponse as k, type KvStore as l, LIST_PAGE_SIZE_DEFAULT as m, LIST_PAGE_SIZE_MAX as n, LIST_PAGINATION_PARAMS as o, type ListFilterOf as p, type ListOp as q, type ListQuery as r, type MaintenanceLockInput as s, type MaintenanceRevisionInput as t, type MarketingProjectionsFilter as u, type MessageTree as v, MissingHandlerError as w, type PilotCreatePayload as x, type PilotCreateResult as y, type PilotEditPayload as z };