@objectstack/platform-objects 5.1.0 → 6.0.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.
@@ -383,12 +383,12 @@ var SysActivity = data.ObjectSchema.create({
383
383
  group: "Target"
384
384
  }),
385
385
  // ── Context ──────────────────────────────────────────────────
386
- project_id: data.Field.lookup("sys_project", {
387
- label: "Project",
386
+ environment_id: data.Field.lookup("sys_environment", {
387
+ label: "Environment",
388
388
  required: false,
389
389
  readonly: true,
390
390
  searchable: true,
391
- description: "Project context (multi-project deployments)",
391
+ description: "Environment context (multi-environment deployments)",
392
392
  group: "Context"
393
393
  }),
394
394
  metadata: data.Field.textarea({
@@ -404,7 +404,7 @@ var SysActivity = data.ObjectSchema.create({
404
404
  { fields: ["actor_id"] },
405
405
  { fields: ["object_name", "record_id"] },
406
406
  { fields: ["type"] },
407
- { fields: ["project_id"] }
407
+ { fields: ["environment_id"] }
408
408
  ],
409
409
  enable: {
410
410
  trackHistory: false,
@@ -666,13 +666,56 @@ var SysNotification = data.ObjectSchema.create({
666
666
  displayNameField: "title",
667
667
  titleFormat: "{title}",
668
668
  compactLayout: ["title", "type", "is_read", "created_at"],
669
+ /**
670
+ * Row-level inbox actions. Use `visible` CEL expressions to ensure
671
+ * `mark_read` only shows on unread rows and vice-versa, mirroring the
672
+ * mark-as-read affordances in GitHub / Linear inboxes. The toolbar-level
673
+ * `mark_all_read` is intentionally omitted server-side: it requires a
674
+ * bulk update primitive that doesn't yet exist on the REST surface, and
675
+ * the popover already handles the multi-row case client-side via N
676
+ * single-row PATCHes (see `InboxPopover.tsx` -> AppHeader `markAllRead`).
677
+ */
678
+ actions: [
679
+ {
680
+ name: "mark_read",
681
+ label: "Mark as Read",
682
+ icon: "check",
683
+ variant: "secondary",
684
+ mode: "custom",
685
+ locations: ["list_item"],
686
+ type: "api",
687
+ method: "PATCH",
688
+ target: "/api/v1/data/sys_notification/{id}",
689
+ bodyExtra: { is_read: true },
690
+ visible: "!record.is_read",
691
+ successMessage: "Notification marked as read",
692
+ refreshAfter: true
693
+ },
694
+ {
695
+ name: "mark_unread",
696
+ label: "Mark as Unread",
697
+ icon: "bell-dot",
698
+ variant: "secondary",
699
+ mode: "custom",
700
+ locations: ["list_item"],
701
+ type: "api",
702
+ method: "PATCH",
703
+ target: "/api/v1/data/sys_notification/{id}",
704
+ bodyExtra: { is_read: false, read_at: null },
705
+ visible: "record.is_read",
706
+ successMessage: "Notification marked as unread",
707
+ refreshAfter: true
708
+ }
709
+ ],
669
710
  listViews: {
670
711
  unread: {
671
712
  type: "grid",
672
713
  name: "unread",
673
714
  label: "Unread",
674
715
  data: { provider: "object", object: "sys_notification" },
675
- columns: ["type", "title", "recipient_id", "created_at"],
716
+ // Title + actor first (the "who/what" the user actually scans);
717
+ // type stays as a categorising chip; created_at right-aligned.
718
+ columns: ["title", "actor_name", "type", "created_at"],
676
719
  filter: [
677
720
  { field: "recipient_id", operator: "equals", value: "{current_user_id}" },
678
721
  { field: "is_read", operator: "equals", value: false }
@@ -686,17 +729,21 @@ var SysNotification = data.ObjectSchema.create({
686
729
  name: "mine",
687
730
  label: "Mine",
688
731
  data: { provider: "object", object: "sys_notification" },
689
- columns: ["type", "title", "is_read", "created_at"],
732
+ columns: ["title", "actor_name", "type", "is_read", "created_at"],
690
733
  filter: [{ field: "recipient_id", operator: "equals", value: "{current_user_id}" }],
691
734
  sort: [{ field: "created_at", order: "desc" }],
692
- pagination: { pageSize: 50 }
735
+ pagination: { pageSize: 50 },
736
+ // Group by notification category so mention/assignment storms don't
737
+ // hide system or task_due rows. Users still toggle to flat via the
738
+ // toolbar Group control if they prefer chronology only.
739
+ grouping: { fields: [{ field: "type", order: "asc", collapsed: false }] }
693
740
  },
694
741
  all_notifications: {
695
742
  type: "grid",
696
743
  name: "all_notifications",
697
744
  label: "All",
698
745
  data: { provider: "object", object: "sys_notification" },
699
- columns: ["type", "title", "recipient_id", "is_read", "created_at"],
746
+ columns: ["title", "recipient_id", "actor_name", "type", "is_read", "created_at"],
700
747
  sort: [{ field: "created_at", order: "desc" }],
701
748
  pagination: { pageSize: 100 }
702
749
  }
@@ -1549,6 +1596,14 @@ var SysApprovalRequest = data.ObjectSchema.create({
1549
1596
  description: "Record snapshot at submission time",
1550
1597
  group: "State"
1551
1598
  }),
1599
+ process_hash: data.Field.text({
1600
+ label: "Process Hash",
1601
+ required: false,
1602
+ maxLength: 80,
1603
+ readonly: true,
1604
+ description: "sha256 of the approval process body at submit time (ADR-0009 execution pinning). Resolved through sys_metadata_history so process upgrades do not affect in-flight requests.",
1605
+ group: "State"
1606
+ }),
1552
1607
  completed_at: data.Field.datetime({
1553
1608
  label: "Completed At",
1554
1609
  required: false,