@almadar/std 16.217.0 → 16.218.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.
@@ -886,6 +886,8 @@ __export(functions_exports, {
886
886
  stdNotificationPreferences: () => stdNotificationPreferences,
887
887
  stdNotificationPreferencesNotificationPreferencesOrbital: () => stdNotificationPreferencesNotificationPreferencesOrbital,
888
888
  stdNotificationPreferencesPage: () => stdNotificationPreferencesPage,
889
+ stdNotificationPreferencesPreferenceCreateTrait: () => stdNotificationPreferencesPreferenceCreateTrait,
890
+ stdNotificationPreferencesPreferenceEditTrait: () => stdNotificationPreferencesPreferenceEditTrait,
889
891
  stdNotificationPreferencesPreferenceGateTrait: () => stdNotificationPreferencesPreferenceGateTrait,
890
892
  stdNotificationPreferencesPreferencesManageTrait: () => stdNotificationPreferencesPreferencesManageTrait,
891
893
  stdNotifyOnEvent: () => stdNotifyOnEvent,
@@ -914,14 +916,15 @@ __export(functions_exports, {
914
916
  stdPatrolHazardPage: () => stdPatrolHazardPage,
915
917
  stdPatrolHazardTrait: () => stdPatrolHazardTrait,
916
918
  stdPermissionMatrix: () => stdPermissionMatrix,
917
- stdPermissionMatrixBackButtonTrait: () => stdPermissionMatrixBackButtonTrait,
918
919
  stdPermissionMatrixErrorAlertTrait: () => stdPermissionMatrixErrorAlertTrait,
919
920
  stdPermissionMatrixErrorSpinnerTrait: () => stdPermissionMatrixErrorSpinnerTrait,
920
921
  stdPermissionMatrixGrantDividerTrait: () => stdPermissionMatrixGrantDividerTrait,
921
922
  stdPermissionMatrixLoadingSpinnerTrait: () => stdPermissionMatrixLoadingSpinnerTrait,
922
923
  stdPermissionMatrixLoadingTextTrait: () => stdPermissionMatrixLoadingTextTrait,
923
- stdPermissionMatrixNewGrantButtonTrait: () => stdPermissionMatrixNewGrantButtonTrait,
924
924
  stdPermissionMatrixPage: () => stdPermissionMatrixPage,
925
+ stdPermissionMatrixPermissionGrantCreateTrait: () => stdPermissionMatrixPermissionGrantCreateTrait,
926
+ stdPermissionMatrixPermissionGrantEditTrait: () => stdPermissionMatrixPermissionGrantEditTrait,
927
+ stdPermissionMatrixPermissionGrantPersistorTrait: () => stdPermissionMatrixPermissionGrantPersistorTrait,
925
928
  stdPermissionMatrixPermissionGrantQueryTrait: () => stdPermissionMatrixPermissionGrantQueryTrait,
926
929
  stdPermissionMatrixPermissionMatrixAdminTrait: () => stdPermissionMatrixPermissionMatrixAdminTrait,
927
930
  stdPermissionMatrixPermissionMatrixOrbital: () => stdPermissionMatrixPermissionMatrixOrbital,
@@ -32143,7 +32146,7 @@ function stdDataImportDataImportOrbital(params = {}) {
32143
32146
  ],
32144
32147
  "emits": [
32145
32148
  {
32146
- "description": "import_batches persist-create success \u2014 the payload carries the created row's id, captured onto the trait entity so staged rows can reference batchId",
32149
+ "description": "import_batches persist-create success \u2014 rebinds @entity.id to the server-issued id, the fallback for when the host didn't mint a client-side batchId on UPLOAD_CSV",
32147
32150
  "event": "BATCH_CREATED",
32148
32151
  "payloadSchema": [
32149
32152
  {
@@ -32160,7 +32163,7 @@ function stdDataImportDataImportOrbital(params = {}) {
32160
32163
  "tier": "secondary"
32161
32164
  },
32162
32165
  {
32163
- "description": "Any import_batches / import_rows persist failure \u2014 lands the run in failed, never a silent swallow",
32166
+ "description": "Any import_batches / import_rows persist failure \u2014 the batch row is updated to failed and IMPORT_FAILED emitted, never a silent swallow; the trait stays put so the user can retry or discard",
32164
32167
  "event": "IMPORT_PERSIST_FAILED",
32165
32168
  "payloadSchema": [
32166
32169
  {
@@ -32233,10 +32236,14 @@ function stdDataImportDataImportOrbital(params = {}) {
32233
32236
  "name": "Initialize"
32234
32237
  },
32235
32238
  {
32236
- "description": "Starts an import run for a CSV file upload. The host's file UI (e.g. a sibling std-import menu) only announces the upload \u2014 parsing is host work and arrives as STAGE_ROWS.",
32239
+ "description": "Starts an import run for a CSV file upload. batchId is the client-minted batch id (idempotent upload \u2014 the host generates it so a retry never double-creates a batch); when omitted, the server-issued id is bound on BATCH_CREATED instead. The host's file UI (e.g. a sibling std-import menu) only announces the upload \u2014 parsing is host work and arrives as STAGE_ROWS.",
32237
32240
  "key": "UPLOAD_CSV",
32238
32241
  "name": "Upload Csv",
32239
32242
  "payloadSchema": [
32243
+ {
32244
+ "name": "batchId",
32245
+ "type": "string"
32246
+ },
32240
32247
  {
32241
32248
  "name": "sourceName",
32242
32249
  "type": "string"
@@ -32246,7 +32253,7 @@ function stdDataImportDataImportOrbital(params = {}) {
32246
32253
  "tier": "domain"
32247
32254
  },
32248
32255
  {
32249
- "description": "import_batches persist-create success \u2014 the payload carries the created row's id, captured onto the trait entity so staged rows can reference batchId",
32256
+ "description": "import_batches persist-create success \u2014 rebinds @entity.id to the server-issued id, the fallback for when the host didn't mint a client-side batchId on UPLOAD_CSV",
32250
32257
  "key": "BATCH_CREATED",
32251
32258
  "name": "Batch Created",
32252
32259
  "payloadSchema": [
@@ -32276,7 +32283,7 @@ function stdDataImportDataImportOrbital(params = {}) {
32276
32283
  "tier": "internal"
32277
32284
  },
32278
32285
  {
32279
- "description": "Any import_batches / import_rows persist failure \u2014 lands the run in failed, never a silent swallow",
32286
+ "description": "Any import_batches / import_rows persist failure \u2014 the batch row is updated to failed and IMPORT_FAILED emitted, never a silent swallow; the trait stays put so the user can retry or discard",
32280
32287
  "key": "IMPORT_PERSIST_FAILED",
32281
32288
  "name": "Import Persist Failed",
32282
32289
  "payloadSchema": [
@@ -32412,6 +32419,11 @@ function stdDataImportDataImportOrbital(params = {}) {
32412
32419
  },
32413
32420
  {
32414
32421
  "effects": [
32422
+ [
32423
+ "set",
32424
+ "@entity.id",
32425
+ "@payload.batchId"
32426
+ ],
32415
32427
  [
32416
32428
  "set",
32417
32429
  "@entity.sourceName",
@@ -32455,6 +32467,7 @@ function stdDataImportDataImportOrbital(params = {}) {
32455
32467
  {
32456
32468
  "createdAt": "@entity.createdAt",
32457
32469
  "errorCount": 0,
32470
+ "id": "@entity.id",
32458
32471
  "mappingJson": "@entity.mappingJson",
32459
32472
  "rowCount": 0,
32460
32473
  "sourceName": "@entity.sourceName",
@@ -32642,12 +32655,12 @@ function stdDataImportDataImportOrbital(params = {}) {
32642
32655
  "event": "STAGE_ROWS",
32643
32656
  "from": "uploaded",
32644
32657
  "guard": [
32645
- "=",
32658
+ "<",
32646
32659
  [
32647
32660
  "array/len",
32648
32661
  "@payload.rows"
32649
32662
  ],
32650
- 0
32663
+ 1
32651
32664
  ],
32652
32665
  "to": "failed"
32653
32666
  },
@@ -32693,7 +32706,7 @@ function stdDataImportDataImportOrbital(params = {}) {
32693
32706
  ],
32694
32707
  "event": "IMPORT_PERSIST_FAILED",
32695
32708
  "from": "uploaded",
32696
- "to": "failed"
32709
+ "to": "uploaded"
32697
32710
  },
32698
32711
  {
32699
32712
  "effects": [
@@ -32803,7 +32816,7 @@ function stdDataImportDataImportOrbital(params = {}) {
32803
32816
  ],
32804
32817
  "event": "IMPORT_PERSIST_FAILED",
32805
32818
  "from": "staged",
32806
- "to": "failed"
32819
+ "to": "staged"
32807
32820
  },
32808
32821
  {
32809
32822
  "effects": [
@@ -44961,10 +44974,14 @@ function stdGlobalSearchGlobalSearchOrbital(params = {}) {
44961
44974
  "tier": "secondary"
44962
44975
  },
44963
44976
  {
44964
- "description": "Internal sentinel draining the module queue, one MODULE_SEARCH_REQUESTED per pass",
44977
+ "description": "Internal sentinel draining the module queue, one MODULE_SEARCH_REQUESTED per pass; `remaining` is the queue length after the last seed/drop",
44965
44978
  "event": "FAN_OUT_STEP",
44966
- "payloadSchema": [],
44967
- "scope": "internal",
44979
+ "payloadSchema": [
44980
+ {
44981
+ "name": "remaining",
44982
+ "type": "number"
44983
+ }
44984
+ ],
44968
44985
  "tier": "internal"
44969
44986
  }
44970
44987
  ],
@@ -45025,10 +45042,15 @@ function stdGlobalSearchGlobalSearchOrbital(params = {}) {
45025
45042
  "tier": "essential"
45026
45043
  },
45027
45044
  {
45028
- "description": "Internal sentinel draining the module queue, one MODULE_SEARCH_REQUESTED per pass",
45045
+ "description": "Internal sentinel draining the module queue, one MODULE_SEARCH_REQUESTED per pass; `remaining` is the queue length after the last seed/drop",
45029
45046
  "key": "FAN_OUT_STEP",
45030
45047
  "name": "Fan Out Step",
45031
- "payloadSchema": [],
45048
+ "payloadSchema": [
45049
+ {
45050
+ "name": "remaining",
45051
+ "type": "number"
45052
+ }
45053
+ ],
45032
45054
  "tier": "internal"
45033
45055
  },
45034
45056
  {
@@ -45287,9 +45309,25 @@ function stdGlobalSearchGlobalSearchOrbital(params = {}) {
45287
45309
  ]
45288
45310
  ],
45289
45311
  [
45290
- "emit",
45291
- "FAN_OUT_STEP",
45292
- {}
45312
+ "when",
45313
+ [
45314
+ ">",
45315
+ [
45316
+ "array/len",
45317
+ "@entity.pendingModules"
45318
+ ],
45319
+ 0
45320
+ ],
45321
+ [
45322
+ "emit",
45323
+ "FAN_OUT_STEP",
45324
+ {
45325
+ "remaining": [
45326
+ "array/len",
45327
+ "@entity.pendingModules"
45328
+ ]
45329
+ }
45330
+ ]
45293
45331
  ],
45294
45332
  [
45295
45333
  "render-ui",
@@ -45455,9 +45493,25 @@ function stdGlobalSearchGlobalSearchOrbital(params = {}) {
45455
45493
  ]
45456
45494
  ],
45457
45495
  [
45458
- "emit",
45459
- "FAN_OUT_STEP",
45460
- {}
45496
+ "when",
45497
+ [
45498
+ ">",
45499
+ [
45500
+ "array/len",
45501
+ "@entity.pendingModules"
45502
+ ],
45503
+ 0
45504
+ ],
45505
+ [
45506
+ "emit",
45507
+ "FAN_OUT_STEP",
45508
+ {
45509
+ "remaining": [
45510
+ "array/len",
45511
+ "@entity.pendingModules"
45512
+ ]
45513
+ }
45514
+ ]
45461
45515
  ]
45462
45516
  ],
45463
45517
  "event": "SEARCH",
@@ -45498,35 +45552,52 @@ function stdGlobalSearchGlobalSearchOrbital(params = {}) {
45498
45552
  ]
45499
45553
  ],
45500
45554
  [
45501
- "emit",
45502
- "FAN_OUT_STEP",
45503
- {}
45555
+ "when",
45556
+ [
45557
+ "=",
45558
+ [
45559
+ "array/len",
45560
+ "@entity.pendingModules"
45561
+ ],
45562
+ 0
45563
+ ],
45564
+ [
45565
+ "set",
45566
+ "@entity.fanOutDone",
45567
+ true
45568
+ ]
45569
+ ],
45570
+ [
45571
+ "when",
45572
+ [
45573
+ ">",
45574
+ [
45575
+ "array/len",
45576
+ "@entity.pendingModules"
45577
+ ],
45578
+ 0
45579
+ ],
45580
+ [
45581
+ "emit",
45582
+ "FAN_OUT_STEP",
45583
+ {
45584
+ "remaining": [
45585
+ "array/len",
45586
+ "@entity.pendingModules"
45587
+ ]
45588
+ }
45589
+ ]
45504
45590
  ]
45505
45591
  ],
45506
45592
  "event": "FAN_OUT_STEP",
45507
45593
  "from": "searching",
45508
45594
  "guard": [
45509
45595
  ">",
45510
- [
45511
- "array/len",
45512
- "@entity.pendingModules"
45513
- ],
45596
+ "@payload.remaining",
45514
45597
  0
45515
45598
  ],
45516
45599
  "to": "searching"
45517
45600
  },
45518
- {
45519
- "effects": [
45520
- [
45521
- "set",
45522
- "@entity.fanOutDone",
45523
- true
45524
- ]
45525
- ],
45526
- "event": "FAN_OUT_STEP",
45527
- "from": "searching",
45528
- "to": "searching"
45529
- },
45530
45601
  {
45531
45602
  "effects": [
45532
45603
  [
@@ -67012,6 +67083,32 @@ function stdNotificationPreferencesPreferencesManageTrait(params) {
67012
67083
  ...params.config !== void 0 ? { config: params.config } : {}
67013
67084
  });
67014
67085
  }
67086
+ function stdNotificationPreferencesPreferenceCreateTrait(params) {
67087
+ return makeTraitRef({
67088
+ from: BEHAVIOR_PATH127,
67089
+ ref: `${ALIAS127}.traits.PreferenceCreate`,
67090
+ linkedEntity: params.entityName,
67091
+ ...params.traitName !== void 0 ? { name: params.traitName } : {},
67092
+ ...params.events !== void 0 ? { events: params.events } : {},
67093
+ ...params.effects !== void 0 ? { effects: params.effects } : {},
67094
+ ...params.listens !== void 0 ? { listens: params.listens } : {},
67095
+ ...params.emitsScope !== void 0 ? { emitsScope: params.emitsScope } : {},
67096
+ ...params.config !== void 0 ? { config: params.config } : {}
67097
+ });
67098
+ }
67099
+ function stdNotificationPreferencesPreferenceEditTrait(params) {
67100
+ return makeTraitRef({
67101
+ from: BEHAVIOR_PATH127,
67102
+ ref: `${ALIAS127}.traits.PreferenceEdit`,
67103
+ linkedEntity: params.entityName,
67104
+ ...params.traitName !== void 0 ? { name: params.traitName } : {},
67105
+ ...params.events !== void 0 ? { events: params.events } : {},
67106
+ ...params.effects !== void 0 ? { effects: params.effects } : {},
67107
+ ...params.listens !== void 0 ? { listens: params.listens } : {},
67108
+ ...params.emitsScope !== void 0 ? { emitsScope: params.emitsScope } : {},
67109
+ ...params.config !== void 0 ? { config: params.config } : {}
67110
+ });
67111
+ }
67015
67112
  function stdNotificationPreferencesPreferenceGateTrait(params) {
67016
67113
  return makeTraitRef({
67017
67114
  from: BEHAVIOR_PATH127,
@@ -67045,6 +67142,8 @@ function stdNotificationPreferences(params) {
67045
67142
  entity,
67046
67143
  traits: [
67047
67144
  stdNotificationPreferencesPreferencesManageTrait(params),
67145
+ stdNotificationPreferencesPreferenceCreateTrait(params),
67146
+ stdNotificationPreferencesPreferenceEditTrait(params),
67048
67147
  stdNotificationPreferencesPreferenceGateTrait(params)
67049
67148
  ],
67050
67149
  pages: [
@@ -67056,7 +67155,12 @@ function stdNotificationPreferencesNotificationPreferencesOrbital(params = {}) {
67056
67155
  const collectionName = params.collection ?? (params.entityName ? `${params.entityName.toLowerCase()}s` : "notification_preferences");
67057
67156
  const built = makeOrbitalWithUses({
67058
67157
  name: "NotificationPreferencesOrbital",
67059
- uses: [],
67158
+ uses: [
67159
+ {
67160
+ "as": "Modal",
67161
+ "from": "std/behaviors/std-modal"
67162
+ }
67163
+ ],
67060
67164
  entity: {
67061
67165
  name: "NotificationPreference",
67062
67166
  collection: collectionName,
@@ -67222,47 +67326,19 @@ function stdNotificationPreferencesNotificationPreferencesOrbital(params = {}) {
67222
67326
  "resource": "main"
67223
67327
  },
67224
67328
  {
67225
- "kind": "set",
67226
- "resource": "@entity.channel"
67227
- },
67228
- {
67229
- "kind": "set",
67230
- "resource": "@entity.createdAt"
67231
- },
67232
- {
67233
- "kind": "set",
67234
- "resource": "@entity.eventKey"
67235
- },
67236
- {
67237
- "kind": "set",
67238
- "resource": "@entity.id"
67239
- },
67240
- {
67241
- "kind": "set",
67242
- "resource": "@entity.mode"
67243
- },
67244
- {
67245
- "kind": "set",
67246
- "resource": "@entity.personId"
67247
- },
67248
- {
67249
- "kind": "set",
67250
- "resource": "@entity.quietHours"
67251
- },
67252
- {
67253
- "kind": "set",
67254
- "resource": "@entity.updatedAt"
67329
+ "kind": "render-ui",
67330
+ "resource": "toast"
67255
67331
  }
67256
67332
  ],
67257
67333
  "emits": [
67258
67334
  {
67259
- "description": "Opens the blank preference form.",
67260
- "event": "NEW",
67261
- "synonyms": "add, create, new preference",
67262
- "tier": "presentation"
67335
+ "description": "Opens the blank preference modal.",
67336
+ "event": "CREATE",
67337
+ "synonyms": "add, new, insert",
67338
+ "tier": "domain"
67263
67339
  },
67264
67340
  {
67265
- "description": "Opens a preference row in the edit form.",
67341
+ "description": "Opens a preference row in the edit modal.",
67266
67342
  "event": "EDIT",
67267
67343
  "payloadSchema": [
67268
67344
  {
@@ -67314,7 +67390,7 @@ function stdNotificationPreferencesNotificationPreferencesOrbital(params = {}) {
67314
67390
  }
67315
67391
  ],
67316
67392
  "synonyms": "modify, update, change",
67317
- "tier": "presentation"
67393
+ "tier": "domain"
67318
67394
  },
67319
67395
  {
67320
67396
  "description": "Removes a preference row.",
@@ -67324,83 +67400,53 @@ function stdNotificationPreferencesNotificationPreferencesOrbital(params = {}) {
67324
67400
  "name": "id",
67325
67401
  "required": true,
67326
67402
  "type": "string"
67403
+ },
67404
+ {
67405
+ "entity": "NotificationPreference",
67406
+ "name": "row",
67407
+ "properties": [
67408
+ {
67409
+ "name": "id",
67410
+ "required": true,
67411
+ "type": "string"
67412
+ },
67413
+ {
67414
+ "name": "personId",
67415
+ "required": true,
67416
+ "type": "string"
67417
+ },
67418
+ {
67419
+ "name": "eventKey",
67420
+ "required": true,
67421
+ "type": "string"
67422
+ },
67423
+ {
67424
+ "name": "channel",
67425
+ "type": "string"
67426
+ },
67427
+ {
67428
+ "name": "mode",
67429
+ "type": "string"
67430
+ },
67431
+ {
67432
+ "name": "quietHours",
67433
+ "type": "string"
67434
+ },
67435
+ {
67436
+ "name": "createdAt",
67437
+ "type": "number"
67438
+ },
67439
+ {
67440
+ "name": "updatedAt",
67441
+ "type": "number"
67442
+ }
67443
+ ],
67444
+ "type": "object"
67327
67445
  }
67328
67446
  ],
67329
67447
  "synonyms": "remove, discard, clear",
67330
- "tier": "presentation"
67331
- },
67332
- {
67333
- "description": "Persists the preference form.",
67334
- "event": "SAVE",
67335
- "synonyms": "persist, store, commit",
67336
67448
  "tier": "domain"
67337
67449
  },
67338
- {
67339
- "description": "Aborts the preference form.",
67340
- "event": "CANCEL",
67341
- "synonyms": "abort, dismiss, undo",
67342
- "tier": "domain"
67343
- },
67344
- {
67345
- "description": "Preference form: person id changed.",
67346
- "event": "SET_PERSON_ID",
67347
- "payloadSchema": [
67348
- {
67349
- "name": "value",
67350
- "required": true,
67351
- "type": "string"
67352
- }
67353
- ],
67354
- "tier": "internal"
67355
- },
67356
- {
67357
- "description": "Preference form: event key changed.",
67358
- "event": "SET_EVENT_KEY",
67359
- "payloadSchema": [
67360
- {
67361
- "name": "value",
67362
- "required": true,
67363
- "type": "string"
67364
- }
67365
- ],
67366
- "tier": "internal"
67367
- },
67368
- {
67369
- "description": "Preference form: channel changed.",
67370
- "event": "SET_CHANNEL",
67371
- "payloadSchema": [
67372
- {
67373
- "name": "value",
67374
- "required": true,
67375
- "type": "string"
67376
- }
67377
- ],
67378
- "tier": "internal"
67379
- },
67380
- {
67381
- "description": "Preference form: delivery mode changed.",
67382
- "event": "SET_MODE",
67383
- "payloadSchema": [
67384
- {
67385
- "name": "value",
67386
- "required": true,
67387
- "type": "string"
67388
- }
67389
- ],
67390
- "tier": "internal"
67391
- },
67392
- {
67393
- "description": "Preference form: quiet-hours window changed.",
67394
- "event": "SET_QUIET_HOURS",
67395
- "payloadSchema": [
67396
- {
67397
- "name": "value",
67398
- "required": true,
67399
- "type": "string"
67400
- }
67401
- ],
67402
- "tier": "internal"
67403
- },
67404
67450
  {
67405
67451
  "description": "The preference collection finished loading.",
67406
67452
  "event": "PreferencesLoaded",
@@ -67511,6 +67557,24 @@ function stdNotificationPreferencesNotificationPreferencesOrbital(params = {}) {
67511
67557
  }
67512
67558
  ],
67513
67559
  "linkedEntity": "NotificationPreference",
67560
+ "listens": [
67561
+ {
67562
+ "event": "PREFERENCE_CREATED",
67563
+ "source": {
67564
+ "kind": "trait",
67565
+ "trait": "PreferenceCreate"
67566
+ },
67567
+ "triggers": "DO_CREATE"
67568
+ },
67569
+ {
67570
+ "event": "PREFERENCE_UPDATED",
67571
+ "source": {
67572
+ "kind": "trait",
67573
+ "trait": "PreferenceEdit"
67574
+ },
67575
+ "triggers": "DO_UPDATE"
67576
+ }
67577
+ ],
67514
67578
  "name": "PreferencesManage",
67515
67579
  "scope": "collection",
67516
67580
  "stateMachine": {
@@ -67588,16 +67652,9 @@ function stdNotificationPreferencesNotificationPreferencesOrbital(params = {}) {
67588
67652
  "tier": "internal"
67589
67653
  },
67590
67654
  {
67591
- "description": "Opens the blank preference form.",
67592
- "key": "NEW",
67593
- "name": "New",
67594
- "synonyms": "add, create, new preference",
67595
- "tier": "presentation"
67596
- },
67597
- {
67598
- "description": "Opens a preference row in the edit form.",
67599
- "key": "EDIT",
67600
- "name": "Edit",
67655
+ "description": "Removes a preference row.",
67656
+ "key": "DELETE",
67657
+ "name": "Delete",
67601
67658
  "payloadSchema": [
67602
67659
  {
67603
67660
  "name": "id",
@@ -67647,22 +67704,112 @@ function stdNotificationPreferencesNotificationPreferencesOrbital(params = {}) {
67647
67704
  "type": "object"
67648
67705
  }
67649
67706
  ],
67650
- "synonyms": "modify, update, change",
67651
- "tier": "presentation"
67707
+ "synonyms": "remove, discard, clear",
67708
+ "tier": "domain"
67652
67709
  },
67653
67710
  {
67654
- "description": "Removes a preference row.",
67655
- "key": "DELETE",
67656
- "name": "Delete",
67711
+ "description": "Create persist requested; the modal's SAVE payload carries the full form row.",
67712
+ "key": "DO_CREATE",
67713
+ "name": "Do Create",
67657
67714
  "payloadSchema": [
67658
67715
  {
67659
- "name": "id",
67716
+ "entity": "NotificationPreference",
67717
+ "name": "data",
67718
+ "properties": [
67719
+ {
67720
+ "name": "id",
67721
+ "required": true,
67722
+ "type": "string"
67723
+ },
67724
+ {
67725
+ "name": "personId",
67726
+ "required": true,
67727
+ "type": "string"
67728
+ },
67729
+ {
67730
+ "name": "eventKey",
67731
+ "required": true,
67732
+ "type": "string"
67733
+ },
67734
+ {
67735
+ "name": "channel",
67736
+ "type": "string"
67737
+ },
67738
+ {
67739
+ "name": "mode",
67740
+ "type": "string"
67741
+ },
67742
+ {
67743
+ "name": "quietHours",
67744
+ "type": "string"
67745
+ },
67746
+ {
67747
+ "name": "createdAt",
67748
+ "type": "number"
67749
+ },
67750
+ {
67751
+ "name": "updatedAt",
67752
+ "type": "number"
67753
+ }
67754
+ ],
67660
67755
  "required": true,
67661
- "type": "string"
67756
+ "type": "object"
67662
67757
  }
67663
67758
  ],
67664
- "synonyms": "remove, discard, clear",
67665
- "tier": "presentation"
67759
+ "synonyms": "add, new, insert",
67760
+ "tier": "internal"
67761
+ },
67762
+ {
67763
+ "description": "Update persist requested; the modal's SAVE payload carries the full form row.",
67764
+ "key": "DO_UPDATE",
67765
+ "name": "Do Update",
67766
+ "payloadSchema": [
67767
+ {
67768
+ "entity": "NotificationPreference",
67769
+ "name": "data",
67770
+ "properties": [
67771
+ {
67772
+ "name": "id",
67773
+ "required": true,
67774
+ "type": "string"
67775
+ },
67776
+ {
67777
+ "name": "personId",
67778
+ "required": true,
67779
+ "type": "string"
67780
+ },
67781
+ {
67782
+ "name": "eventKey",
67783
+ "required": true,
67784
+ "type": "string"
67785
+ },
67786
+ {
67787
+ "name": "channel",
67788
+ "type": "string"
67789
+ },
67790
+ {
67791
+ "name": "mode",
67792
+ "type": "string"
67793
+ },
67794
+ {
67795
+ "name": "quietHours",
67796
+ "type": "string"
67797
+ },
67798
+ {
67799
+ "name": "createdAt",
67800
+ "type": "number"
67801
+ },
67802
+ {
67803
+ "name": "updatedAt",
67804
+ "type": "number"
67805
+ }
67806
+ ],
67807
+ "required": true,
67808
+ "type": "object"
67809
+ }
67810
+ ],
67811
+ "synonyms": "modified, changed, refreshed",
67812
+ "tier": "internal"
67666
67813
  },
67667
67814
  {
67668
67815
  "description": "A preference row persisted (create or update).",
@@ -67710,82 +67857,73 @@ function stdNotificationPreferencesNotificationPreferencesOrbital(params = {}) {
67710
67857
  "tier": "internal"
67711
67858
  },
67712
67859
  {
67713
- "description": "Preference form: person id changed.",
67714
- "key": "SET_PERSON_ID",
67715
- "name": "Set Person Id",
67716
- "payloadSchema": [
67717
- {
67718
- "name": "value",
67719
- "required": true,
67720
- "type": "string"
67721
- }
67722
- ],
67723
- "tier": "internal"
67724
- },
67725
- {
67726
- "description": "Preference form: event key changed.",
67727
- "key": "SET_EVENT_KEY",
67728
- "name": "Set Event Key",
67729
- "payloadSchema": [
67730
- {
67731
- "name": "value",
67732
- "required": true,
67733
- "type": "string"
67734
- }
67735
- ],
67736
- "tier": "internal"
67860
+ "description": "Retries loading the preference collection after a failure.",
67861
+ "key": "RETRY",
67862
+ "name": "Retry",
67863
+ "synonyms": "try again, reload",
67864
+ "tier": "presentation"
67737
67865
  },
67738
67866
  {
67739
- "description": "Preference form: channel changed.",
67740
- "key": "SET_CHANNEL",
67741
- "name": "Set Channel",
67742
- "payloadSchema": [
67743
- {
67744
- "name": "value",
67745
- "required": true,
67746
- "type": "string"
67747
- }
67748
- ],
67749
- "tier": "internal"
67867
+ "description": "Opens the blank preference modal.",
67868
+ "key": "CREATE",
67869
+ "name": "Create",
67870
+ "synonyms": "add, new, insert",
67871
+ "tier": "domain"
67750
67872
  },
67751
67873
  {
67752
- "description": "Preference form: delivery mode changed.",
67753
- "key": "SET_MODE",
67754
- "name": "Set Mode",
67874
+ "description": "Opens a preference row in the edit modal.",
67875
+ "key": "EDIT",
67876
+ "name": "Edit",
67755
67877
  "payloadSchema": [
67756
67878
  {
67757
- "name": "value",
67879
+ "name": "id",
67758
67880
  "required": true,
67759
67881
  "type": "string"
67760
- }
67761
- ],
67762
- "tier": "internal"
67763
- },
67764
- {
67765
- "description": "Preference form: quiet-hours window changed.",
67766
- "key": "SET_QUIET_HOURS",
67767
- "name": "Set Quiet Hours",
67768
- "payloadSchema": [
67882
+ },
67769
67883
  {
67770
- "name": "value",
67771
- "required": true,
67772
- "type": "string"
67884
+ "entity": "NotificationPreference",
67885
+ "name": "row",
67886
+ "properties": [
67887
+ {
67888
+ "name": "id",
67889
+ "required": true,
67890
+ "type": "string"
67891
+ },
67892
+ {
67893
+ "name": "personId",
67894
+ "required": true,
67895
+ "type": "string"
67896
+ },
67897
+ {
67898
+ "name": "eventKey",
67899
+ "required": true,
67900
+ "type": "string"
67901
+ },
67902
+ {
67903
+ "name": "channel",
67904
+ "type": "string"
67905
+ },
67906
+ {
67907
+ "name": "mode",
67908
+ "type": "string"
67909
+ },
67910
+ {
67911
+ "name": "quietHours",
67912
+ "type": "string"
67913
+ },
67914
+ {
67915
+ "name": "createdAt",
67916
+ "type": "number"
67917
+ },
67918
+ {
67919
+ "name": "updatedAt",
67920
+ "type": "number"
67921
+ }
67922
+ ],
67923
+ "type": "object"
67773
67924
  }
67774
67925
  ],
67775
- "tier": "internal"
67776
- },
67777
- {
67778
- "description": "Persists the preference form.",
67779
- "key": "SAVE",
67780
- "name": "Save",
67781
- "synonyms": "persist, store, commit",
67782
- "tier": "domain"
67783
- },
67784
- {
67785
- "description": "Aborts the preference form.",
67786
- "key": "CANCEL",
67787
- "name": "Cancel",
67788
- "synonyms": "abort, dismiss, undo",
67926
+ "synonyms": "modify, update, change",
67789
67927
  "tier": "domain"
67790
67928
  }
67791
67929
  ],
@@ -67797,12 +67935,6 @@ function stdNotificationPreferencesNotificationPreferencesOrbital(params = {}) {
67797
67935
  {
67798
67936
  "name": "browsing"
67799
67937
  },
67800
- {
67801
- "name": "creating"
67802
- },
67803
- {
67804
- "name": "editing"
67805
- },
67806
67938
  {
67807
67939
  "name": "error"
67808
67940
  }
@@ -67874,7 +68006,7 @@ function stdNotificationPreferencesNotificationPreferencesOrbital(params = {}) {
67874
68006
  "type": "stack"
67875
68007
  },
67876
68008
  {
67877
- "action": "NEW",
68009
+ "action": "CREATE",
67878
68010
  "icon": "plus",
67879
68011
  "label": "New preference",
67880
68012
  "type": "button",
@@ -67954,9 +68086,25 @@ function stdNotificationPreferencesNotificationPreferencesOrbital(params = {}) {
67954
68086
  "render-ui",
67955
68087
  "main",
67956
68088
  {
67957
- "message": "@payload.error",
67958
- "type": "alert",
67959
- "variant": "error"
68089
+ "align": "center",
68090
+ "children": [
68091
+ {
68092
+ "message": "@payload.error",
68093
+ "type": "alert",
68094
+ "variant": "error"
68095
+ },
68096
+ {
68097
+ "action": "RETRY",
68098
+ "icon": "rotate-ccw",
68099
+ "label": "Retry",
68100
+ "type": "button",
68101
+ "variant": "primary"
68102
+ }
68103
+ ],
68104
+ "className": "py-12",
68105
+ "direction": "vertical",
68106
+ "gap": "md",
68107
+ "type": "stack"
67960
68108
  }
67961
68109
  ]
67962
68110
  ],
@@ -67980,22 +68128,8 @@ function stdNotificationPreferencesNotificationPreferencesOrbital(params = {}) {
67980
68128
  "render-ui",
67981
68129
  "main",
67982
68130
  {
67983
- "align": "center",
67984
- "children": [
67985
- {
67986
- "type": "spinner"
67987
- },
67988
- {
67989
- "color": "muted",
67990
- "content": "Loading notification preferences\u2026",
67991
- "type": "typography",
67992
- "variant": "caption"
67993
- }
67994
- ],
67995
- "className": "py-12",
67996
- "direction": "vertical",
67997
- "gap": "md",
67998
- "type": "stack"
68131
+ "size": "sm",
68132
+ "type": "spinner"
67999
68133
  }
68000
68134
  ]
68001
68135
  ],
@@ -68006,380 +68140,162 @@ function stdNotificationPreferencesNotificationPreferencesOrbital(params = {}) {
68006
68140
  {
68007
68141
  "effects": [
68008
68142
  [
68009
- "set",
68010
- "@entity.id",
68011
- ""
68012
- ],
68143
+ "persist",
68144
+ "delete",
68145
+ "NotificationPreference",
68146
+ "@payload.id",
68147
+ {
68148
+ "emit": {
68149
+ "failure": "PreferenceSaveFailed",
68150
+ "success": "PreferenceDeleted"
68151
+ }
68152
+ }
68153
+ ]
68154
+ ],
68155
+ "event": "DELETE",
68156
+ "from": "browsing",
68157
+ "to": "browsing"
68158
+ },
68159
+ {
68160
+ "effects": [
68013
68161
  [
68014
- "set",
68015
- "@entity.personId",
68016
- ""
68017
- ],
68162
+ "persist",
68163
+ "create",
68164
+ "NotificationPreference",
68165
+ "@payload.data",
68166
+ {
68167
+ "emit": {
68168
+ "failure": "PreferenceSaveFailed",
68169
+ "success": "PreferenceSaved"
68170
+ }
68171
+ }
68172
+ ]
68173
+ ],
68174
+ "event": "DO_CREATE",
68175
+ "from": "browsing",
68176
+ "to": "browsing"
68177
+ },
68178
+ {
68179
+ "effects": [
68018
68180
  [
68019
- "set",
68020
- "@entity.eventKey",
68021
- ""
68022
- ],
68181
+ "persist",
68182
+ "update",
68183
+ "NotificationPreference",
68184
+ "@payload.data",
68185
+ {
68186
+ "emit": {
68187
+ "failure": "PreferenceSaveFailed",
68188
+ "success": "PreferenceSaved"
68189
+ }
68190
+ }
68191
+ ]
68192
+ ],
68193
+ "event": "DO_UPDATE",
68194
+ "from": "browsing",
68195
+ "to": "browsing"
68196
+ },
68197
+ {
68198
+ "effects": [
68023
68199
  [
68024
- "set",
68025
- "@entity.channel",
68026
- "in_app"
68200
+ "render-ui",
68201
+ "toast",
68202
+ {
68203
+ "dismissible": true,
68204
+ "message": "Notification preference saved",
68205
+ "type": "alert",
68206
+ "variant": "success"
68207
+ }
68027
68208
  ],
68028
68209
  [
68029
- "set",
68030
- "@entity.mode",
68031
- "instant"
68032
- ],
68210
+ "fetch",
68211
+ "NotificationPreference",
68212
+ {
68213
+ "emit": {
68214
+ "failure": "PreferencesLoadFailed",
68215
+ "success": "PreferencesLoaded"
68216
+ }
68217
+ }
68218
+ ]
68219
+ ],
68220
+ "event": "PreferenceSaved",
68221
+ "from": "browsing",
68222
+ "to": "loading"
68223
+ },
68224
+ {
68225
+ "effects": [
68033
68226
  [
68034
- "set",
68035
- "@entity.quietHours",
68036
- ""
68227
+ "render-ui",
68228
+ "toast",
68229
+ {
68230
+ "dismissible": true,
68231
+ "message": "Notification preference removed",
68232
+ "type": "alert",
68233
+ "variant": "info"
68234
+ }
68037
68235
  ],
68038
68236
  [
68039
- "set",
68040
- "@entity.createdAt",
68041
- 0
68042
- ],
68237
+ "fetch",
68238
+ "NotificationPreference",
68239
+ {
68240
+ "emit": {
68241
+ "failure": "PreferencesLoadFailed",
68242
+ "success": "PreferencesLoaded"
68243
+ }
68244
+ }
68245
+ ]
68246
+ ],
68247
+ "event": "PreferenceDeleted",
68248
+ "from": "browsing",
68249
+ "to": "loading"
68250
+ },
68251
+ {
68252
+ "effects": [
68043
68253
  [
68044
- "set",
68045
- "@entity.updatedAt",
68046
- 0
68047
- ],
68254
+ "render-ui",
68255
+ "toast",
68256
+ {
68257
+ "dismissible": true,
68258
+ "message": "Could not save the notification preference",
68259
+ "type": "alert",
68260
+ "variant": "warning"
68261
+ }
68262
+ ]
68263
+ ],
68264
+ "event": "PreferenceSaveFailed",
68265
+ "from": "browsing",
68266
+ "to": "browsing"
68267
+ },
68268
+ {
68269
+ "effects": [
68048
68270
  [
68049
68271
  "render-ui",
68050
68272
  "main",
68051
68273
  {
68274
+ "align": "center",
68052
68275
  "children": [
68053
68276
  {
68054
- "children": [
68055
- {
68056
- "name": "plus",
68057
- "size": "lg",
68058
- "type": "icon"
68059
- },
68060
- {
68061
- "content": "New notification preference",
68062
- "type": "typography",
68063
- "variant": "h3"
68064
- }
68065
- ],
68066
- "direction": "horizontal",
68067
- "gap": "sm",
68068
- "type": "stack"
68069
- },
68070
- {
68071
- "type": "divider"
68072
- },
68073
- {
68074
- "action": "SET_PERSON_ID",
68075
- "placeholder": "Person id",
68076
- "type": "input",
68077
- "value": "@entity.personId"
68078
- },
68079
- {
68080
- "action": "SET_EVENT_KEY",
68081
- "placeholder": "Event key (blank = all events)",
68082
- "type": "input",
68083
- "value": "@entity.eventKey"
68084
- },
68085
- {
68086
- "action": "SET_CHANNEL",
68087
- "options": [
68088
- {
68089
- "label": "In app",
68090
- "value": "in_app"
68091
- },
68092
- {
68093
- "label": "Email",
68094
- "value": "email"
68095
- },
68096
- {
68097
- "label": "Push",
68098
- "value": "push"
68099
- },
68100
- {
68101
- "label": "Slack",
68102
- "value": "slack"
68103
- }
68104
- ],
68105
- "placeholder": "Channel",
68106
- "type": "select",
68107
- "value": "@entity.channel"
68108
- },
68109
- {
68110
- "action": "SET_MODE",
68111
- "options": [
68112
- {
68113
- "label": "Instant",
68114
- "value": "instant"
68115
- },
68116
- {
68117
- "label": "Digest",
68118
- "value": "digest"
68119
- }
68120
- ],
68121
- "placeholder": "Mode",
68122
- "type": "select",
68123
- "value": "@entity.mode"
68124
- },
68125
- {
68126
- "action": "SET_QUIET_HOURS",
68127
- "placeholder": "Quiet hours (e.g. 22:00-07:00)",
68128
- "type": "input",
68129
- "value": "@entity.quietHours"
68277
+ "message": "@payload.error",
68278
+ "type": "alert",
68279
+ "variant": "error"
68130
68280
  },
68131
68281
  {
68132
- "children": [
68133
- {
68134
- "action": "SAVE",
68135
- "icon": "check",
68136
- "label": "Save",
68137
- "type": "button",
68138
- "variant": "primary"
68139
- },
68140
- {
68141
- "action": "CANCEL",
68142
- "icon": "x",
68143
- "label": "Cancel",
68144
- "type": "button",
68145
- "variant": "secondary"
68146
- }
68147
- ],
68148
- "direction": "horizontal",
68149
- "gap": "sm",
68150
- "type": "stack"
68282
+ "action": "RETRY",
68283
+ "icon": "rotate-ccw",
68284
+ "label": "Retry",
68285
+ "type": "button",
68286
+ "variant": "primary"
68151
68287
  }
68152
68288
  ],
68289
+ "className": "py-12",
68153
68290
  "direction": "vertical",
68154
68291
  "gap": "md",
68155
68292
  "type": "stack"
68156
68293
  }
68157
68294
  ]
68158
68295
  ],
68159
- "event": "NEW",
68296
+ "event": "PreferencesLoadFailed",
68160
68297
  "from": "browsing",
68161
- "to": "creating"
68162
- },
68163
- {
68164
- "effects": [
68165
- [
68166
- "set",
68167
- "@entity.id",
68168
- "@payload.id"
68169
- ],
68170
- [
68171
- "set",
68172
- "@entity.personId",
68173
- [
68174
- "object/get",
68175
- "@payload.row",
68176
- "personId"
68177
- ]
68178
- ],
68179
- [
68180
- "set",
68181
- "@entity.eventKey",
68182
- [
68183
- "object/get",
68184
- "@payload.row",
68185
- "eventKey"
68186
- ]
68187
- ],
68188
- [
68189
- "set",
68190
- "@entity.channel",
68191
- [
68192
- "object/get",
68193
- "@payload.row",
68194
- "channel"
68195
- ]
68196
- ],
68197
- [
68198
- "set",
68199
- "@entity.mode",
68200
- [
68201
- "object/get",
68202
- "@payload.row",
68203
- "mode"
68204
- ]
68205
- ],
68206
- [
68207
- "set",
68208
- "@entity.quietHours",
68209
- [
68210
- "object/get",
68211
- "@payload.row",
68212
- "quietHours"
68213
- ]
68214
- ],
68215
- [
68216
- "set",
68217
- "@entity.createdAt",
68218
- [
68219
- "object/get",
68220
- "@payload.row",
68221
- "createdAt"
68222
- ]
68223
- ],
68224
- [
68225
- "set",
68226
- "@entity.updatedAt",
68227
- [
68228
- "object/get",
68229
- "@payload.row",
68230
- "updatedAt"
68231
- ]
68232
- ],
68233
- [
68234
- "render-ui",
68235
- "main",
68236
- {
68237
- "children": [
68238
- {
68239
- "children": [
68240
- {
68241
- "name": "pencil",
68242
- "size": "lg",
68243
- "type": "icon"
68244
- },
68245
- {
68246
- "content": "Edit notification preference",
68247
- "type": "typography",
68248
- "variant": "h3"
68249
- }
68250
- ],
68251
- "direction": "horizontal",
68252
- "gap": "sm",
68253
- "type": "stack"
68254
- },
68255
- {
68256
- "type": "divider"
68257
- },
68258
- {
68259
- "action": "SET_PERSON_ID",
68260
- "placeholder": "Person id",
68261
- "type": "input",
68262
- "value": "@entity.personId"
68263
- },
68264
- {
68265
- "action": "SET_EVENT_KEY",
68266
- "placeholder": "Event key (blank = all events)",
68267
- "type": "input",
68268
- "value": "@entity.eventKey"
68269
- },
68270
- {
68271
- "action": "SET_CHANNEL",
68272
- "options": [
68273
- {
68274
- "label": "In app",
68275
- "value": "in_app"
68276
- },
68277
- {
68278
- "label": "Email",
68279
- "value": "email"
68280
- },
68281
- {
68282
- "label": "Push",
68283
- "value": "push"
68284
- },
68285
- {
68286
- "label": "Slack",
68287
- "value": "slack"
68288
- }
68289
- ],
68290
- "placeholder": "Channel",
68291
- "type": "select",
68292
- "value": "@entity.channel"
68293
- },
68294
- {
68295
- "action": "SET_MODE",
68296
- "options": [
68297
- {
68298
- "label": "Instant",
68299
- "value": "instant"
68300
- },
68301
- {
68302
- "label": "Digest",
68303
- "value": "digest"
68304
- }
68305
- ],
68306
- "placeholder": "Mode",
68307
- "type": "select",
68308
- "value": "@entity.mode"
68309
- },
68310
- {
68311
- "action": "SET_QUIET_HOURS",
68312
- "placeholder": "Quiet hours (e.g. 22:00-07:00)",
68313
- "type": "input",
68314
- "value": "@entity.quietHours"
68315
- },
68316
- {
68317
- "children": [
68318
- {
68319
- "action": "SAVE",
68320
- "icon": "check",
68321
- "label": "Save",
68322
- "type": "button",
68323
- "variant": "primary"
68324
- },
68325
- {
68326
- "action": "CANCEL",
68327
- "icon": "x",
68328
- "label": "Cancel",
68329
- "type": "button",
68330
- "variant": "secondary"
68331
- }
68332
- ],
68333
- "direction": "horizontal",
68334
- "gap": "sm",
68335
- "type": "stack"
68336
- }
68337
- ],
68338
- "direction": "vertical",
68339
- "gap": "md",
68340
- "type": "stack"
68341
- }
68342
- ]
68343
- ],
68344
- "event": "EDIT",
68345
- "from": "browsing",
68346
- "to": "editing"
68347
- },
68348
- {
68349
- "effects": [
68350
- [
68351
- "persist",
68352
- "delete",
68353
- "NotificationPreference",
68354
- "@payload.id",
68355
- {
68356
- "emit": {
68357
- "failure": "PreferenceSaveFailed",
68358
- "success": "PreferenceDeleted"
68359
- }
68360
- }
68361
- ]
68362
- ],
68363
- "event": "DELETE",
68364
- "from": "browsing",
68365
- "to": "browsing"
68366
- },
68367
- {
68368
- "effects": [
68369
- [
68370
- "fetch",
68371
- "NotificationPreference",
68372
- {
68373
- "emit": {
68374
- "failure": "PreferencesLoadFailed",
68375
- "success": "PreferencesLoaded"
68376
- }
68377
- }
68378
- ]
68379
- ],
68380
- "event": "PreferenceSaved",
68381
- "from": "browsing",
68382
- "to": "loading"
68298
+ "to": "error"
68383
68299
  },
68384
68300
  {
68385
68301
  "effects": [
@@ -68392,247 +68308,18 @@ function stdNotificationPreferencesNotificationPreferencesOrbital(params = {}) {
68392
68308
  "success": "PreferencesLoaded"
68393
68309
  }
68394
68310
  }
68395
- ]
68396
- ],
68397
- "event": "PreferenceDeleted",
68398
- "from": "browsing",
68399
- "to": "loading"
68400
- },
68401
- {
68402
- "effects": [
68403
- [
68404
- "render-ui",
68405
- "main",
68406
- {
68407
- "message": "@payload.error",
68408
- "type": "alert",
68409
- "variant": "error"
68410
- }
68411
- ]
68412
- ],
68413
- "event": "PreferenceSaveFailed",
68414
- "from": "browsing",
68415
- "to": "error"
68416
- },
68417
- {
68418
- "effects": [
68311
+ ],
68419
68312
  [
68420
68313
  "render-ui",
68421
68314
  "main",
68422
68315
  {
68423
- "message": "@payload.error",
68424
- "type": "alert",
68425
- "variant": "error"
68426
- }
68427
- ]
68428
- ],
68429
- "event": "PreferencesLoadFailed",
68430
- "from": "browsing",
68431
- "to": "error"
68432
- },
68433
- {
68434
- "effects": [
68435
- [
68436
- "set",
68437
- "@entity.personId",
68438
- "@payload.value"
68439
- ]
68440
- ],
68441
- "event": "SET_PERSON_ID",
68442
- "from": "creating",
68443
- "to": "creating"
68444
- },
68445
- {
68446
- "effects": [
68447
- [
68448
- "set",
68449
- "@entity.eventKey",
68450
- "@payload.value"
68451
- ]
68452
- ],
68453
- "event": "SET_EVENT_KEY",
68454
- "from": "creating",
68455
- "to": "creating"
68456
- },
68457
- {
68458
- "effects": [
68459
- [
68460
- "set",
68461
- "@entity.channel",
68462
- "@payload.value"
68463
- ]
68464
- ],
68465
- "event": "SET_CHANNEL",
68466
- "from": "creating",
68467
- "to": "creating"
68468
- },
68469
- {
68470
- "effects": [
68471
- [
68472
- "set",
68473
- "@entity.mode",
68474
- "@payload.value"
68475
- ]
68476
- ],
68477
- "event": "SET_MODE",
68478
- "from": "creating",
68479
- "to": "creating"
68480
- },
68481
- {
68482
- "effects": [
68483
- [
68484
- "set",
68485
- "@entity.quietHours",
68486
- "@payload.value"
68487
- ]
68488
- ],
68489
- "event": "SET_QUIET_HOURS",
68490
- "from": "creating",
68491
- "to": "creating"
68492
- },
68493
- {
68494
- "effects": [
68495
- [
68496
- "persist",
68497
- "create",
68498
- "NotificationPreference",
68499
- {
68500
- "channel": "@entity.channel",
68501
- "createdAt": "@now",
68502
- "eventKey": "@entity.eventKey",
68503
- "mode": "@entity.mode",
68504
- "personId": "@entity.personId",
68505
- "quietHours": "@entity.quietHours",
68506
- "updatedAt": "@now"
68507
- },
68508
- {
68509
- "emit": {
68510
- "failure": "PreferenceSaveFailed",
68511
- "success": "PreferenceSaved"
68512
- }
68513
- }
68514
- ]
68515
- ],
68516
- "event": "SAVE",
68517
- "from": "creating",
68518
- "to": "browsing"
68519
- },
68520
- {
68521
- "effects": [
68522
- [
68523
- "fetch",
68524
- "NotificationPreference",
68525
- {
68526
- "emit": {
68527
- "failure": "PreferencesLoadFailed",
68528
- "success": "PreferencesLoaded"
68529
- }
68530
- }
68531
- ]
68532
- ],
68533
- "event": "CANCEL",
68534
- "from": "creating",
68535
- "to": "loading"
68536
- },
68537
- {
68538
- "effects": [
68539
- [
68540
- "set",
68541
- "@entity.personId",
68542
- "@payload.value"
68543
- ]
68544
- ],
68545
- "event": "SET_PERSON_ID",
68546
- "from": "editing",
68547
- "to": "editing"
68548
- },
68549
- {
68550
- "effects": [
68551
- [
68552
- "set",
68553
- "@entity.eventKey",
68554
- "@payload.value"
68555
- ]
68556
- ],
68557
- "event": "SET_EVENT_KEY",
68558
- "from": "editing",
68559
- "to": "editing"
68560
- },
68561
- {
68562
- "effects": [
68563
- [
68564
- "set",
68565
- "@entity.channel",
68566
- "@payload.value"
68567
- ]
68568
- ],
68569
- "event": "SET_CHANNEL",
68570
- "from": "editing",
68571
- "to": "editing"
68572
- },
68573
- {
68574
- "effects": [
68575
- [
68576
- "set",
68577
- "@entity.mode",
68578
- "@payload.value"
68579
- ]
68580
- ],
68581
- "event": "SET_MODE",
68582
- "from": "editing",
68583
- "to": "editing"
68584
- },
68585
- {
68586
- "effects": [
68587
- [
68588
- "set",
68589
- "@entity.quietHours",
68590
- "@payload.value"
68591
- ]
68592
- ],
68593
- "event": "SET_QUIET_HOURS",
68594
- "from": "editing",
68595
- "to": "editing"
68596
- },
68597
- {
68598
- "effects": [
68599
- [
68600
- "set",
68601
- "@entity.updatedAt",
68602
- "@now"
68603
- ],
68604
- [
68605
- "persist",
68606
- "update",
68607
- "NotificationPreference",
68608
- "@entity",
68609
- {
68610
- "emit": {
68611
- "failure": "PreferenceSaveFailed",
68612
- "success": "PreferenceSaved"
68613
- }
68614
- }
68615
- ]
68616
- ],
68617
- "event": "SAVE",
68618
- "from": "editing",
68619
- "to": "browsing"
68620
- },
68621
- {
68622
- "effects": [
68623
- [
68624
- "fetch",
68625
- "NotificationPreference",
68626
- {
68627
- "emit": {
68628
- "failure": "PreferencesLoadFailed",
68629
- "success": "PreferencesLoaded"
68630
- }
68316
+ "size": "sm",
68317
+ "type": "spinner"
68631
68318
  }
68632
68319
  ]
68633
68320
  ],
68634
- "event": "CANCEL",
68635
- "from": "editing",
68321
+ "event": "INIT",
68322
+ "from": "error",
68636
68323
  "to": "loading"
68637
68324
  },
68638
68325
  {
@@ -68656,13 +68343,99 @@ function stdNotificationPreferencesNotificationPreferencesOrbital(params = {}) {
68656
68343
  }
68657
68344
  ]
68658
68345
  ],
68659
- "event": "INIT",
68346
+ "event": "RETRY",
68660
68347
  "from": "error",
68661
68348
  "to": "loading"
68662
68349
  }
68663
68350
  ]
68664
68351
  }
68665
68352
  },
68353
+ makeTraitRef({
68354
+ "config": {
68355
+ "fields": {
68356
+ "default": [
68357
+ "personId",
68358
+ "eventKey",
68359
+ "channel",
68360
+ "mode",
68361
+ "quietHours"
68362
+ ],
68363
+ "type": "unknown"
68364
+ },
68365
+ "icon": {
68366
+ "default": "plus-circle",
68367
+ "type": "unknown"
68368
+ },
68369
+ "mode": {
68370
+ "default": "create",
68371
+ "type": "unknown"
68372
+ },
68373
+ "title": {
68374
+ "default": "New notification preference",
68375
+ "type": "unknown"
68376
+ }
68377
+ },
68378
+ "events": {
68379
+ "OPEN": "CREATE",
68380
+ "SAVE": "PREFERENCE_CREATED"
68381
+ },
68382
+ "linkedEntity": "NotificationPreference",
68383
+ "listens": [
68384
+ {
68385
+ "event": "CREATE",
68386
+ "source": {
68387
+ "kind": "trait",
68388
+ "trait": "PreferencesManage"
68389
+ },
68390
+ "triggers": "CREATE"
68391
+ }
68392
+ ],
68393
+ "name": "PreferenceCreate",
68394
+ "ref": "Modal.traits.ModalRecordModal"
68395
+ }),
68396
+ makeTraitRef({
68397
+ "config": {
68398
+ "fields": {
68399
+ "default": [
68400
+ "personId",
68401
+ "eventKey",
68402
+ "channel",
68403
+ "mode",
68404
+ "quietHours"
68405
+ ],
68406
+ "type": "unknown"
68407
+ },
68408
+ "icon": {
68409
+ "default": "pencil",
68410
+ "type": "unknown"
68411
+ },
68412
+ "mode": {
68413
+ "default": "edit",
68414
+ "type": "unknown"
68415
+ },
68416
+ "title": {
68417
+ "default": "Edit notification preference",
68418
+ "type": "unknown"
68419
+ }
68420
+ },
68421
+ "events": {
68422
+ "OPEN": "EDIT",
68423
+ "SAVE": "PREFERENCE_UPDATED"
68424
+ },
68425
+ "linkedEntity": "NotificationPreference",
68426
+ "listens": [
68427
+ {
68428
+ "event": "EDIT",
68429
+ "source": {
68430
+ "kind": "trait",
68431
+ "trait": "PreferencesManage"
68432
+ },
68433
+ "triggers": "EDIT"
68434
+ }
68435
+ ],
68436
+ "name": "PreferenceEdit",
68437
+ "ref": "Modal.traits.ModalRecordModal"
68438
+ }),
68666
68439
  {
68667
68440
  "category": "lifecycle",
68668
68441
  "config": {
@@ -69486,6 +69259,12 @@ function stdNotificationPreferencesNotificationPreferencesOrbital(params = {}) {
69486
69259
  {
69487
69260
  "ref": "PreferencesManage"
69488
69261
  },
69262
+ {
69263
+ "ref": "PreferenceCreate"
69264
+ },
69265
+ {
69266
+ "ref": "PreferenceEdit"
69267
+ },
69489
69268
  {
69490
69269
  "ref": "PreferenceGate"
69491
69270
  }
@@ -69558,7 +69337,10 @@ var StdNotificationPreferencesNotificationPreferencesOrbitalManifest = {
69558
69337
  "description": ".lolo's native trait-composition surface 1:1: per-imported-trait config, linkedEntity, events, name, emitsScope, listens. effects is excluded (atom-owned; use listens via a sibling trait)."
69559
69338
  }
69560
69339
  ],
69561
- traitNames: [],
69340
+ traitNames: [
69341
+ "PreferenceCreate",
69342
+ "PreferenceEdit"
69343
+ ],
69562
69344
  inlineTraitNames: [
69563
69345
  "PreferencesManage",
69564
69346
  "PreferenceGate"
@@ -73119,10 +72901,10 @@ function stdPermissionMatrixPermissionMatrixTitleTrait(params) {
73119
72901
  ...params.config !== void 0 ? { config: params.config } : {}
73120
72902
  });
73121
72903
  }
73122
- function stdPermissionMatrixNewGrantButtonTrait(params) {
72904
+ function stdPermissionMatrixGrantDividerTrait(params) {
73123
72905
  return makeTraitRef({
73124
72906
  from: BEHAVIOR_PATH135,
73125
- ref: `${ALIAS135}.traits.NewGrantButton`,
72907
+ ref: `${ALIAS135}.traits.GrantDivider`,
73126
72908
  linkedEntity: params.entityName,
73127
72909
  ...params.traitName !== void 0 ? { name: params.traitName } : {},
73128
72910
  ...params.events !== void 0 ? { events: params.events } : {},
@@ -73132,10 +72914,10 @@ function stdPermissionMatrixNewGrantButtonTrait(params) {
73132
72914
  ...params.config !== void 0 ? { config: params.config } : {}
73133
72915
  });
73134
72916
  }
73135
- function stdPermissionMatrixBackButtonTrait(params) {
72917
+ function stdPermissionMatrixErrorAlertTrait(params) {
73136
72918
  return makeTraitRef({
73137
72919
  from: BEHAVIOR_PATH135,
73138
- ref: `${ALIAS135}.traits.BackButton`,
72920
+ ref: `${ALIAS135}.traits.ErrorAlert`,
73139
72921
  linkedEntity: params.entityName,
73140
72922
  ...params.traitName !== void 0 ? { name: params.traitName } : {},
73141
72923
  ...params.events !== void 0 ? { events: params.events } : {},
@@ -73145,10 +72927,10 @@ function stdPermissionMatrixBackButtonTrait(params) {
73145
72927
  ...params.config !== void 0 ? { config: params.config } : {}
73146
72928
  });
73147
72929
  }
73148
- function stdPermissionMatrixGrantDividerTrait(params) {
72930
+ function stdPermissionMatrixPermissionMatrixAdminTrait(params) {
73149
72931
  return makeTraitRef({
73150
72932
  from: BEHAVIOR_PATH135,
73151
- ref: `${ALIAS135}.traits.GrantDivider`,
72933
+ ref: `${ALIAS135}.traits.PermissionMatrixAdmin`,
73152
72934
  linkedEntity: params.entityName,
73153
72935
  ...params.traitName !== void 0 ? { name: params.traitName } : {},
73154
72936
  ...params.events !== void 0 ? { events: params.events } : {},
@@ -73158,10 +72940,10 @@ function stdPermissionMatrixGrantDividerTrait(params) {
73158
72940
  ...params.config !== void 0 ? { config: params.config } : {}
73159
72941
  });
73160
72942
  }
73161
- function stdPermissionMatrixErrorAlertTrait(params) {
72943
+ function stdPermissionMatrixPermissionGrantCreateTrait(params) {
73162
72944
  return makeTraitRef({
73163
72945
  from: BEHAVIOR_PATH135,
73164
- ref: `${ALIAS135}.traits.ErrorAlert`,
72946
+ ref: `${ALIAS135}.traits.PermissionGrantCreate`,
73165
72947
  linkedEntity: params.entityName,
73166
72948
  ...params.traitName !== void 0 ? { name: params.traitName } : {},
73167
72949
  ...params.events !== void 0 ? { events: params.events } : {},
@@ -73171,10 +72953,23 @@ function stdPermissionMatrixErrorAlertTrait(params) {
73171
72953
  ...params.config !== void 0 ? { config: params.config } : {}
73172
72954
  });
73173
72955
  }
73174
- function stdPermissionMatrixPermissionMatrixAdminTrait(params) {
72956
+ function stdPermissionMatrixPermissionGrantEditTrait(params) {
73175
72957
  return makeTraitRef({
73176
72958
  from: BEHAVIOR_PATH135,
73177
- ref: `${ALIAS135}.traits.PermissionMatrixAdmin`,
72959
+ ref: `${ALIAS135}.traits.PermissionGrantEdit`,
72960
+ linkedEntity: params.entityName,
72961
+ ...params.traitName !== void 0 ? { name: params.traitName } : {},
72962
+ ...params.events !== void 0 ? { events: params.events } : {},
72963
+ ...params.effects !== void 0 ? { effects: params.effects } : {},
72964
+ ...params.listens !== void 0 ? { listens: params.listens } : {},
72965
+ ...params.emitsScope !== void 0 ? { emitsScope: params.emitsScope } : {},
72966
+ ...params.config !== void 0 ? { config: params.config } : {}
72967
+ });
72968
+ }
72969
+ function stdPermissionMatrixPermissionGrantPersistorTrait(params) {
72970
+ return makeTraitRef({
72971
+ from: BEHAVIOR_PATH135,
72972
+ ref: `${ALIAS135}.traits.PermissionGrantPersistor`,
73178
72973
  linkedEntity: params.entityName,
73179
72974
  ...params.traitName !== void 0 ? { name: params.traitName } : {},
73180
72975
  ...params.events !== void 0 ? { events: params.events } : {},
@@ -73221,11 +73016,12 @@ function stdPermissionMatrix(params) {
73221
73016
  stdPermissionMatrixLoadingTextTrait(params),
73222
73017
  stdPermissionMatrixShieldCheckIconTrait(params),
73223
73018
  stdPermissionMatrixPermissionMatrixTitleTrait(params),
73224
- stdPermissionMatrixNewGrantButtonTrait(params),
73225
- stdPermissionMatrixBackButtonTrait(params),
73226
73019
  stdPermissionMatrixGrantDividerTrait(params),
73227
73020
  stdPermissionMatrixErrorAlertTrait(params),
73228
73021
  stdPermissionMatrixPermissionMatrixAdminTrait(params),
73022
+ stdPermissionMatrixPermissionGrantCreateTrait(params),
73023
+ stdPermissionMatrixPermissionGrantEditTrait(params),
73024
+ stdPermissionMatrixPermissionGrantPersistorTrait(params),
73229
73025
  stdPermissionMatrixPermissionGrantQueryTrait(params)
73230
73026
  ],
73231
73027
  pages: [
@@ -73238,6 +73034,10 @@ function stdPermissionMatrixPermissionMatrixOrbital(params = {}) {
73238
73034
  const built = makeOrbitalWithUses({
73239
73035
  name: "PermissionMatrixOrbital",
73240
73036
  uses: [
73037
+ {
73038
+ "as": "Modal",
73039
+ "from": "std/behaviors/std-modal"
73040
+ },
73241
73041
  {
73242
73042
  "as": "Spinner",
73243
73043
  "from": "std/behaviors/ui-spinner"
@@ -73250,10 +73050,6 @@ function stdPermissionMatrixPermissionMatrixOrbital(params = {}) {
73250
73050
  "as": "Icon",
73251
73051
  "from": "std/behaviors/ui-icon"
73252
73052
  },
73253
- {
73254
- "as": "Button",
73255
- "from": "std/behaviors/ui-button"
73256
- },
73257
73053
  {
73258
73054
  "as": "Divider",
73259
73055
  "from": "std/behaviors/ui-divider"
@@ -73397,52 +73193,6 @@ function stdPermissionMatrixPermissionMatrixOrbital(params = {}) {
73397
73193
  "name": "PermissionMatrixTitle",
73398
73194
  "ref": "Typography.traits.TypographyRender"
73399
73195
  }),
73400
- makeTraitRef({
73401
- "config": {
73402
- "action": {
73403
- "default": "NEW",
73404
- "type": "unknown"
73405
- },
73406
- "icon": {
73407
- "default": "plus",
73408
- "type": "unknown"
73409
- },
73410
- "label": {
73411
- "default": "New grant",
73412
- "type": "unknown"
73413
- },
73414
- "variant": {
73415
- "default": "primary",
73416
- "type": "unknown"
73417
- }
73418
- },
73419
- "linkedEntity": "PermissionGrant",
73420
- "name": "NewGrantButton",
73421
- "ref": "Button.traits.ButtonRender"
73422
- }),
73423
- makeTraitRef({
73424
- "config": {
73425
- "action": {
73426
- "default": "CANCEL_GRANT",
73427
- "type": "unknown"
73428
- },
73429
- "icon": {
73430
- "default": "x",
73431
- "type": "unknown"
73432
- },
73433
- "label": {
73434
- "default": "Cancel",
73435
- "type": "unknown"
73436
- },
73437
- "variant": {
73438
- "default": "ghost",
73439
- "type": "unknown"
73440
- }
73441
- },
73442
- "linkedEntity": "PermissionGrant",
73443
- "name": "BackButton",
73444
- "ref": "Button.traits.ButtonRender"
73445
- }),
73446
73196
  makeTraitRef({
73447
73197
  "linkedEntity": "PermissionGrant",
73448
73198
  "name": "GrantDivider",
@@ -73468,86 +73218,25 @@ function stdPermissionMatrixPermissionMatrixOrbital(params = {}) {
73468
73218
  "access"
73469
73219
  ],
73470
73220
  "category": "interaction",
73471
- "config": {
73472
- "adminRoles": {
73473
- "default": [],
73474
- "description": "Roles eligible to create, edit, or delete grants. ENFORCED by the NEW/EDIT/DELETE/CREATE_GRANT/SAVE_GRANT transition guards: a viewer whose @user.role is not listed cannot fire a mutation, from the button or from the bus. Empty = every signed-in viewer may manage grants (ungated).",
73475
- "items": {
73476
- "type": "string"
73477
- },
73478
- "label": "Who can manage grants?",
73479
- "synonyms": "admin roles, permission managers, who edits permissions, grant admins",
73480
- "tier": "policy",
73481
- "type": "[string]"
73482
- },
73483
- "enabled": {
73484
- "default": false,
73485
- "description": "Allow creating, editing, and deleting permission grants from this surface. Off by default.",
73486
- "label": "Manage role permissions",
73487
- "synonyms": "enable, turn on, enforce, require, activate, apply, switch on, permission matrix, role permissions, capability matrix, permission grants, access matrix, manage permissions, who can see finance, hide margins, module-level permissions",
73488
- "tier": "policy",
73489
- "type": "boolean"
73490
- }
73491
- },
73492
73221
  "effectRow": [
73493
73222
  {
73494
73223
  "kind": "fetch",
73495
73224
  "resource": "PermissionGrant"
73496
73225
  },
73497
- {
73498
- "kind": "persist",
73499
- "resource": "PermissionGrant"
73500
- },
73501
73226
  {
73502
73227
  "kind": "render-ui",
73503
73228
  "resource": "main"
73504
- },
73505
- {
73506
- "kind": "render-ui",
73507
- "resource": "modal"
73508
- },
73509
- {
73510
- "kind": "render-ui",
73511
- "resource": "toast"
73512
- },
73513
- {
73514
- "kind": "set",
73515
- "resource": "@entity.canReadFinance"
73516
- },
73517
- {
73518
- "kind": "set",
73519
- "resource": "@entity.canSeeMargins"
73520
- },
73521
- {
73522
- "kind": "set",
73523
- "resource": "@entity.canSeeOthersHours"
73524
- },
73525
- {
73526
- "kind": "set",
73527
- "resource": "@entity.id"
73528
- },
73529
- {
73530
- "kind": "set",
73531
- "resource": "@entity.module"
73532
- },
73533
- {
73534
- "kind": "set",
73535
- "resource": "@entity.role"
73536
- },
73537
- {
73538
- "kind": "set",
73539
- "resource": "@entity.workspaceId"
73540
73229
  }
73541
73230
  ],
73542
73231
  "emits": [
73543
73232
  {
73544
- "description": "Opens the create-grant form.",
73233
+ "description": "Requests the create-grant form (the create modal listens).",
73545
73234
  "event": "NEW",
73546
73235
  "synonyms": "add grant, new permission, create grant",
73547
73236
  "tier": "domain"
73548
73237
  },
73549
73238
  {
73550
- "description": "Opens the edit form for a grant row.",
73239
+ "description": "Requests the edit form for a grant row (the edit modal listens).",
73551
73240
  "event": "EDIT",
73552
73241
  "payloadSchema": [
73553
73242
  {
@@ -73602,7 +73291,7 @@ function stdPermissionMatrixPermissionMatrixOrbital(params = {}) {
73602
73291
  "tier": "domain"
73603
73292
  },
73604
73293
  {
73605
- "description": "Deletes a grant row (persisted; the grid refetches on success).",
73294
+ "description": "Requests deletion of a grant row (the persistor listens; adminRoles-guarded there).",
73606
73295
  "event": "DELETE",
73607
73296
  "payloadSchema": [
73608
73297
  {
@@ -73656,118 +73345,6 @@ function stdPermissionMatrixPermissionMatrixOrbital(params = {}) {
73656
73345
  "synonyms": "remove grant, revoke permission, delete grant",
73657
73346
  "tier": "domain"
73658
73347
  },
73659
- {
73660
- "description": "The create-grant form committed; data carries the new grant's fields.",
73661
- "event": "CREATE_GRANT",
73662
- "payloadSchema": [
73663
- {
73664
- "entity": "PermissionGrant",
73665
- "name": "data",
73666
- "properties": [
73667
- {
73668
- "name": "id",
73669
- "required": true,
73670
- "type": "string"
73671
- },
73672
- {
73673
- "name": "workspaceId",
73674
- "type": "string"
73675
- },
73676
- {
73677
- "name": "role",
73678
- "required": true,
73679
- "type": "string"
73680
- },
73681
- {
73682
- "name": "module",
73683
- "required": true,
73684
- "type": "string"
73685
- },
73686
- {
73687
- "name": "canReadFinance",
73688
- "type": "boolean"
73689
- },
73690
- {
73691
- "name": "canSeeOthersHours",
73692
- "type": "boolean"
73693
- },
73694
- {
73695
- "name": "canSeeMargins",
73696
- "type": "boolean"
73697
- },
73698
- {
73699
- "name": "createdAt",
73700
- "type": "number"
73701
- }
73702
- ],
73703
- "type": "object"
73704
- }
73705
- ],
73706
- "synonyms": "submit grant, confirm create",
73707
- "tier": "internal"
73708
- },
73709
- {
73710
- "description": "The edit-grant form committed; data carries the grant id + updated fields.",
73711
- "event": "SAVE_GRANT",
73712
- "payloadSchema": [
73713
- {
73714
- "entity": "PermissionGrant",
73715
- "name": "data",
73716
- "properties": [
73717
- {
73718
- "name": "id",
73719
- "required": true,
73720
- "type": "string"
73721
- },
73722
- {
73723
- "name": "workspaceId",
73724
- "type": "string"
73725
- },
73726
- {
73727
- "name": "role",
73728
- "required": true,
73729
- "type": "string"
73730
- },
73731
- {
73732
- "name": "module",
73733
- "required": true,
73734
- "type": "string"
73735
- },
73736
- {
73737
- "name": "canReadFinance",
73738
- "type": "boolean"
73739
- },
73740
- {
73741
- "name": "canSeeOthersHours",
73742
- "type": "boolean"
73743
- },
73744
- {
73745
- "name": "canSeeMargins",
73746
- "type": "boolean"
73747
- },
73748
- {
73749
- "name": "createdAt",
73750
- "type": "number"
73751
- }
73752
- ],
73753
- "type": "object"
73754
- }
73755
- ],
73756
- "synonyms": "submit edit, confirm update",
73757
- "tier": "internal"
73758
- },
73759
- {
73760
- "description": "The grant form was dismissed without committing; the grid repaints.",
73761
- "event": "CANCEL_GRANT",
73762
- "synonyms": "cancel, back to matrix, dismiss form",
73763
- "tier": "internal"
73764
- },
73765
- {
73766
- "description": "Dismisses the grant form overlay (the modal shell's own X / Escape / overlay-click).",
73767
- "event": "CLOSE",
73768
- "synonyms": "dismiss, hide, close form, done",
73769
- "tier": "domain"
73770
- },
73771
73348
  {
73772
73349
  "description": "Indicates the permission-grant collection has been successfully loaded.",
73773
73350
  "event": "PermissionGrantLoaded",
@@ -73833,98 +73410,30 @@ function stdPermissionMatrixPermissionMatrixOrbital(params = {}) {
73833
73410
  ],
73834
73411
  "synonyms": "load error, failed load, request failure",
73835
73412
  "tier": "internal"
73836
- },
73837
- {
73838
- "description": "Signals that a permission grant has been persisted (create / update).",
73839
- "event": "PermissionGrantSaved",
73840
- "payloadSchema": [
73841
- {
73842
- "name": "value",
73843
- "type": "@entity"
73844
- }
73845
- ],
73846
- "scope": "internal",
73847
- "synonyms": "saved, created, updated, persisted",
73848
- "tier": "internal"
73849
- },
73850
- {
73851
- "description": "Indicates a failure to persist a permission grant.",
73852
- "event": "PermissionGrantSaveFailed",
73853
- "payloadSchema": [
73854
- {
73855
- "name": "error",
73856
- "type": "string"
73857
- },
73858
- {
73859
- "name": "code",
73860
- "type": "string"
73861
- }
73862
- ],
73863
- "synonyms": "save error, failed save, persist failure",
73864
- "tier": "internal"
73865
- },
73866
- {
73867
- "description": "Signals that a permission grant has been deleted.",
73868
- "event": "PermissionGrantDeleted",
73869
- "payloadSchema": [
73870
- {
73871
- "name": "id",
73872
- "type": "string"
73873
- },
73874
- {
73875
- "name": "deleted",
73876
- "type": "boolean"
73877
- }
73878
- ],
73879
- "synonyms": "deleted, removed, revoked",
73880
- "tier": "internal"
73881
- },
73882
- {
73883
- "description": "Indicates a failure to delete a permission grant.",
73884
- "event": "PermissionGrantDeleteFailed",
73885
- "payloadSchema": [
73886
- {
73887
- "name": "error",
73888
- "type": "string"
73889
- },
73890
- {
73891
- "name": "code",
73892
- "type": "string"
73893
- }
73894
- ],
73895
- "synonyms": "delete error, failed delete",
73896
- "tier": "internal"
73897
73413
  }
73898
73414
  ],
73899
73415
  "entityContract": {
73900
- "provides": [
73901
- "canReadFinance",
73902
- "canSeeMargins",
73903
- "canSeeOthersHours",
73904
- "module",
73905
- "role",
73906
- "workspaceId"
73907
- ],
73416
+ "provides": [],
73908
73417
  "requires": []
73909
73418
  },
73910
73419
  "entityRebindable": true,
73911
73420
  "linkedEntity": "PermissionGrant",
73912
73421
  "listens": [
73913
73422
  {
73914
- "event": "NEW",
73423
+ "event": "PermissionGrantSaved",
73915
73424
  "source": {
73916
73425
  "kind": "trait",
73917
- "trait": "NewGrantButton"
73426
+ "trait": "PermissionGrantPersistor"
73918
73427
  },
73919
- "triggers": "NEW"
73428
+ "triggers": "INIT"
73920
73429
  },
73921
73430
  {
73922
- "event": "CANCEL_GRANT",
73431
+ "event": "PermissionGrantDeleted",
73923
73432
  "source": {
73924
73433
  "kind": "trait",
73925
- "trait": "BackButton"
73434
+ "trait": "PermissionGrantPersistor"
73926
73435
  },
73927
- "triggers": "CANCEL_GRANT"
73436
+ "triggers": "INIT"
73928
73437
  }
73929
73438
  ],
73930
73439
  "name": "PermissionMatrixAdmin",
@@ -74004,14 +73513,14 @@ function stdPermissionMatrixPermissionMatrixOrbital(params = {}) {
74004
73513
  "tier": "internal"
74005
73514
  },
74006
73515
  {
74007
- "description": "Opens the create-grant form.",
73516
+ "description": "Requests the create-grant form (the create modal listens).",
74008
73517
  "key": "NEW",
74009
73518
  "name": "New",
74010
73519
  "synonyms": "add grant, new permission, create grant",
74011
73520
  "tier": "domain"
74012
73521
  },
74013
73522
  {
74014
- "description": "Opens the edit form for a grant row.",
73523
+ "description": "Requests the edit form for a grant row (the edit modal listens).",
74015
73524
  "key": "EDIT",
74016
73525
  "name": "Edit",
74017
73526
  "payloadSchema": [
@@ -74067,7 +73576,7 @@ function stdPermissionMatrixPermissionMatrixOrbital(params = {}) {
74067
73576
  "tier": "domain"
74068
73577
  },
74069
73578
  {
74070
- "description": "Deletes a grant row (persisted; the grid refetches on success).",
73579
+ "description": "Requests deletion of a grant row (the persistor listens; adminRoles-guarded there).",
74071
73580
  "key": "DELETE",
74072
73581
  "name": "Delete",
74073
73582
  "payloadSchema": [
@@ -74121,186 +73630,6 @@ function stdPermissionMatrixPermissionMatrixOrbital(params = {}) {
74121
73630
  ],
74122
73631
  "synonyms": "remove grant, revoke permission, delete grant",
74123
73632
  "tier": "domain"
74124
- },
74125
- {
74126
- "description": "Signals that a permission grant has been deleted.",
74127
- "key": "PermissionGrantDeleted",
74128
- "name": "PermissionGrant deleted",
74129
- "payloadSchema": [
74130
- {
74131
- "name": "id",
74132
- "type": "string"
74133
- },
74134
- {
74135
- "name": "deleted",
74136
- "type": "boolean"
74137
- }
74138
- ],
74139
- "synonyms": "deleted, removed, revoked",
74140
- "tier": "internal"
74141
- },
74142
- {
74143
- "description": "Indicates a failure to delete a permission grant.",
74144
- "key": "PermissionGrantDeleteFailed",
74145
- "name": "PermissionGrant delete failed",
74146
- "payloadSchema": [
74147
- {
74148
- "name": "error",
74149
- "type": "string"
74150
- },
74151
- {
74152
- "name": "code",
74153
- "type": "string"
74154
- }
74155
- ],
74156
- "synonyms": "delete error, failed delete",
74157
- "tier": "internal"
74158
- },
74159
- {
74160
- "description": "The create-grant form committed; data carries the new grant's fields.",
74161
- "key": "CREATE_GRANT",
74162
- "name": "Create Grant",
74163
- "payloadSchema": [
74164
- {
74165
- "entity": "PermissionGrant",
74166
- "name": "data",
74167
- "properties": [
74168
- {
74169
- "name": "id",
74170
- "required": true,
74171
- "type": "string"
74172
- },
74173
- {
74174
- "name": "workspaceId",
74175
- "type": "string"
74176
- },
74177
- {
74178
- "name": "role",
74179
- "required": true,
74180
- "type": "string"
74181
- },
74182
- {
74183
- "name": "module",
74184
- "required": true,
74185
- "type": "string"
74186
- },
74187
- {
74188
- "name": "canReadFinance",
74189
- "type": "boolean"
74190
- },
74191
- {
74192
- "name": "canSeeOthersHours",
74193
- "type": "boolean"
74194
- },
74195
- {
74196
- "name": "canSeeMargins",
74197
- "type": "boolean"
74198
- },
74199
- {
74200
- "name": "createdAt",
74201
- "type": "number"
74202
- }
74203
- ],
74204
- "type": "object"
74205
- }
74206
- ],
74207
- "synonyms": "submit grant, confirm create",
74208
- "tier": "internal"
74209
- },
74210
- {
74211
- "description": "The edit-grant form committed; data carries the grant id + updated fields.",
74212
- "key": "SAVE_GRANT",
74213
- "name": "Save Grant",
74214
- "payloadSchema": [
74215
- {
74216
- "entity": "PermissionGrant",
74217
- "name": "data",
74218
- "properties": [
74219
- {
74220
- "name": "id",
74221
- "required": true,
74222
- "type": "string"
74223
- },
74224
- {
74225
- "name": "workspaceId",
74226
- "type": "string"
74227
- },
74228
- {
74229
- "name": "role",
74230
- "required": true,
74231
- "type": "string"
74232
- },
74233
- {
74234
- "name": "module",
74235
- "required": true,
74236
- "type": "string"
74237
- },
74238
- {
74239
- "name": "canReadFinance",
74240
- "type": "boolean"
74241
- },
74242
- {
74243
- "name": "canSeeOthersHours",
74244
- "type": "boolean"
74245
- },
74246
- {
74247
- "name": "canSeeMargins",
74248
- "type": "boolean"
74249
- },
74250
- {
74251
- "name": "createdAt",
74252
- "type": "number"
74253
- }
74254
- ],
74255
- "type": "object"
74256
- }
74257
- ],
74258
- "synonyms": "submit edit, confirm update",
74259
- "tier": "internal"
74260
- },
74261
- {
74262
- "description": "The grant form was dismissed without committing; the grid repaints.",
74263
- "key": "CANCEL_GRANT",
74264
- "name": "Cancel Grant",
74265
- "synonyms": "cancel, back to matrix, dismiss form",
74266
- "tier": "internal"
74267
- },
74268
- {
74269
- "description": "Signals that a permission grant has been persisted (create / update).",
74270
- "key": "PermissionGrantSaved",
74271
- "name": "PermissionGrant saved",
74272
- "payloadSchema": [
74273
- {
74274
- "name": "value",
74275
- "type": "@entity"
74276
- }
74277
- ],
74278
- "synonyms": "saved, created, updated, persisted",
74279
- "tier": "internal"
74280
- },
74281
- {
74282
- "description": "Indicates a failure to persist a permission grant.",
74283
- "key": "PermissionGrantSaveFailed",
74284
- "name": "PermissionGrant save failed",
74285
- "payloadSchema": [
74286
- {
74287
- "name": "error",
74288
- "type": "string"
74289
- },
74290
- {
74291
- "name": "code",
74292
- "type": "string"
74293
- }
74294
- ],
74295
- "synonyms": "save error, failed save, persist failure",
74296
- "tier": "internal"
74297
- },
74298
- {
74299
- "description": "Dismisses the grant form overlay (the modal shell's own X / Escape / overlay-click).",
74300
- "key": "CLOSE",
74301
- "name": "Close",
74302
- "synonyms": "dismiss, hide, close form, done",
74303
- "tier": "domain"
74304
73633
  }
74305
73634
  ],
74306
73635
  "states": [
@@ -74311,9 +73640,6 @@ function stdPermissionMatrixPermissionMatrixOrbital(params = {}) {
74311
73640
  {
74312
73641
  "name": "listing"
74313
73642
  },
74314
- {
74315
- "name": "editing"
74316
- },
74317
73643
  {
74318
73644
  "name": "error"
74319
73645
  }
@@ -74371,7 +73697,13 @@ function stdPermissionMatrixPermissionMatrixOrbital(params = {}) {
74371
73697
  "gap": "sm",
74372
73698
  "type": "stack"
74373
73699
  },
74374
- "@trait.NewGrantButton"
73700
+ {
73701
+ "action": "NEW",
73702
+ "icon": "plus",
73703
+ "label": "New grant",
73704
+ "type": "button",
73705
+ "variant": "primary"
73706
+ }
74375
73707
  ],
74376
73708
  "direction": "horizontal",
74377
73709
  "gap": "sm",
@@ -74482,218 +73814,447 @@ function stdPermissionMatrixPermissionMatrixOrbital(params = {}) {
74482
73814
  {
74483
73815
  "effects": [
74484
73816
  [
74485
- "render-ui",
74486
- "modal",
73817
+ "fetch",
73818
+ "PermissionGrant",
74487
73819
  {
74488
- "children": [
74489
- {
74490
- "align": "center",
74491
- "children": [
74492
- "@trait.PermissionMatrixTitle",
74493
- "@trait.BackButton"
74494
- ],
74495
- "direction": "horizontal",
74496
- "gap": "sm",
74497
- "justify": "between",
74498
- "type": "stack"
74499
- },
74500
- "@trait.GrantDivider",
74501
- {
74502
- "cancelEvent": "CANCEL_GRANT",
74503
- "entity": {
74504
- "workspaceId": ""
74505
- },
74506
- "fields": [
74507
- "workspaceId",
74508
- "role",
74509
- "module",
74510
- "canReadFinance",
74511
- "canSeeOthersHours",
74512
- "canSeeMargins"
74513
- ],
74514
- "mode": "create",
74515
- "submitEvent": "CREATE_GRANT",
74516
- "type": "form-section"
74517
- }
74518
- ],
74519
- "direction": "vertical",
74520
- "gap": "md",
74521
- "type": "stack"
73820
+ "emit": {
73821
+ "failure": "PermissionGrantLoadFailed",
73822
+ "success": "PermissionGrantLoaded"
73823
+ }
74522
73824
  }
74523
- ]
74524
- ],
74525
- "event": "NEW",
74526
- "from": "listing",
74527
- "guard": [
74528
- "and",
74529
- "@config.enabled",
74530
- [
74531
- "or",
74532
- [
74533
- "=",
74534
- [
74535
- "array/len",
74536
- "@config.adminRoles"
74537
- ],
74538
- 0
74539
- ],
74540
- [
74541
- "array/includes",
74542
- "@config.adminRoles",
74543
- "@user.role"
74544
- ]
74545
- ]
74546
- ],
74547
- "to": "editing"
74548
- },
74549
- {
74550
- "effects": [
74551
- [
74552
- "set",
74553
- "@entity.id",
74554
- "@payload.id"
74555
73825
  ],
74556
73826
  [
74557
73827
  "render-ui",
74558
- "modal",
73828
+ "main",
74559
73829
  {
73830
+ "align": "center",
74560
73831
  "children": [
74561
- {
74562
- "align": "center",
74563
- "children": [
74564
- "@trait.PermissionMatrixTitle",
74565
- "@trait.BackButton"
74566
- ],
74567
- "direction": "horizontal",
74568
- "gap": "sm",
74569
- "justify": "between",
74570
- "type": "stack"
74571
- },
74572
- "@trait.GrantDivider",
74573
- {
74574
- "cancelEvent": "CANCEL_GRANT",
74575
- "entity": {
74576
- "id": "@payload.id"
74577
- },
74578
- "fields": [
74579
- "workspaceId",
74580
- "role",
74581
- "module",
74582
- "canReadFinance",
74583
- "canSeeOthersHours",
74584
- "canSeeMargins"
74585
- ],
74586
- "mode": "edit",
74587
- "submitEvent": "SAVE_GRANT",
74588
- "type": "form-section"
74589
- }
73832
+ "@trait.ErrorSpinner"
74590
73833
  ],
74591
- "direction": "vertical",
74592
- "gap": "md",
74593
73834
  "type": "stack"
74594
73835
  }
74595
73836
  ]
74596
73837
  ],
74597
- "event": "EDIT",
74598
- "from": "listing",
74599
- "guard": [
74600
- "and",
74601
- "@config.enabled",
74602
- [
74603
- "or",
74604
- [
74605
- "=",
74606
- [
74607
- "array/len",
74608
- "@config.adminRoles"
74609
- ],
74610
- 0
73838
+ "event": "INIT",
73839
+ "from": "error",
73840
+ "to": "loading"
73841
+ }
73842
+ ]
73843
+ }
73844
+ },
73845
+ makeTraitRef({
73846
+ "config": {
73847
+ "fields": {
73848
+ "default": [
73849
+ "workspaceId",
73850
+ "role",
73851
+ "module",
73852
+ "canReadFinance",
73853
+ "canSeeOthersHours",
73854
+ "canSeeMargins"
73855
+ ],
73856
+ "type": "unknown"
73857
+ },
73858
+ "icon": {
73859
+ "default": "plus-circle",
73860
+ "type": "unknown"
73861
+ },
73862
+ "mode": {
73863
+ "default": "create",
73864
+ "type": "unknown"
73865
+ },
73866
+ "title": {
73867
+ "default": "Create grant",
73868
+ "type": "unknown"
73869
+ }
73870
+ },
73871
+ "events": {
73872
+ "OPEN": "NEW",
73873
+ "SAVE": "GRANT_CREATED"
73874
+ },
73875
+ "linkedEntity": "PermissionGrant",
73876
+ "listens": [
73877
+ {
73878
+ "event": "NEW",
73879
+ "source": {
73880
+ "kind": "trait",
73881
+ "trait": "PermissionMatrixAdmin"
73882
+ },
73883
+ "triggers": "NEW"
73884
+ }
73885
+ ],
73886
+ "name": "PermissionGrantCreate",
73887
+ "ref": "Modal.traits.ModalRecordModal"
73888
+ }),
73889
+ makeTraitRef({
73890
+ "config": {
73891
+ "fields": {
73892
+ "default": [
73893
+ "workspaceId",
73894
+ "role",
73895
+ "module",
73896
+ "canReadFinance",
73897
+ "canSeeOthersHours",
73898
+ "canSeeMargins"
73899
+ ],
73900
+ "type": "unknown"
73901
+ },
73902
+ "icon": {
73903
+ "default": "pencil",
73904
+ "type": "unknown"
73905
+ },
73906
+ "mode": {
73907
+ "default": "edit",
73908
+ "type": "unknown"
73909
+ },
73910
+ "title": {
73911
+ "default": "Edit grant",
73912
+ "type": "unknown"
73913
+ }
73914
+ },
73915
+ "events": {
73916
+ "OPEN": "EDIT",
73917
+ "SAVE": "GRANT_UPDATED"
73918
+ },
73919
+ "linkedEntity": "PermissionGrant",
73920
+ "listens": [
73921
+ {
73922
+ "event": "EDIT",
73923
+ "source": {
73924
+ "kind": "trait",
73925
+ "trait": "PermissionMatrixAdmin"
73926
+ },
73927
+ "triggers": "EDIT"
73928
+ }
73929
+ ],
73930
+ "name": "PermissionGrantEdit",
73931
+ "ref": "Modal.traits.ModalRecordModal"
73932
+ }),
73933
+ {
73934
+ "capabilities": [
73935
+ "access"
73936
+ ],
73937
+ "category": "lifecycle",
73938
+ "config": {
73939
+ "adminRoles": {
73940
+ "default": [],
73941
+ "description": "Roles eligible to create, edit, or delete grants. ENFORCED by the DO_CREATE/DO_UPDATE/DO_DELETE transition guards: a viewer whose @user.role is not listed cannot fire a write, from the form submit or from the bus. Empty = every signed-in viewer may manage grants (ungated). Mounting the page is the opt-in \u2014 there is deliberately no separate enable flag (a default-off flag made the whole page's affordances dead on a fresh mount).",
73942
+ "items": {
73943
+ "type": "string"
73944
+ },
73945
+ "label": "Who can manage grants?",
73946
+ "synonyms": "admin roles, permission managers, who edits permissions, grant admins, permission matrix, role permissions, capability matrix, permission grants, access matrix, manage permissions",
73947
+ "tier": "policy",
73948
+ "type": "[string]"
73949
+ }
73950
+ },
73951
+ "effectRow": [
73952
+ {
73953
+ "kind": "persist",
73954
+ "resource": "PermissionGrant"
73955
+ },
73956
+ {
73957
+ "kind": "render-ui",
73958
+ "resource": "toast"
73959
+ }
73960
+ ],
73961
+ "emits": [
73962
+ {
73963
+ "description": "Signals that a permission grant has been persisted (create / update); carries the persisted row's id.",
73964
+ "event": "PermissionGrantSaved",
73965
+ "payloadSchema": [
73966
+ {
73967
+ "name": "id",
73968
+ "required": true,
73969
+ "type": "string"
73970
+ }
73971
+ ],
73972
+ "scope": "external",
73973
+ "synonyms": "saved, created, updated, persisted",
73974
+ "tier": "domain"
73975
+ },
73976
+ {
73977
+ "description": "Indicates a failure to persist a permission grant.",
73978
+ "event": "PermissionGrantSaveFailed",
73979
+ "payloadSchema": [
73980
+ {
73981
+ "name": "error",
73982
+ "type": "string"
73983
+ },
73984
+ {
73985
+ "name": "code",
73986
+ "type": "string"
73987
+ }
73988
+ ],
73989
+ "scope": "external",
73990
+ "synonyms": "save error, failed save, persist failure",
73991
+ "tier": "internal"
73992
+ },
73993
+ {
73994
+ "description": "Signals that a permission grant has been deleted.",
73995
+ "event": "PermissionGrantDeleted",
73996
+ "payloadSchema": [
73997
+ {
73998
+ "name": "id",
73999
+ "type": "string"
74000
+ },
74001
+ {
74002
+ "name": "deleted",
74003
+ "type": "boolean"
74004
+ }
74005
+ ],
74006
+ "scope": "external",
74007
+ "synonyms": "deleted, removed, revoked",
74008
+ "tier": "domain"
74009
+ },
74010
+ {
74011
+ "description": "Indicates a failure to delete a permission grant.",
74012
+ "event": "PermissionGrantDeleteFailed",
74013
+ "payloadSchema": [
74014
+ {
74015
+ "name": "error",
74016
+ "type": "string"
74017
+ },
74018
+ {
74019
+ "name": "code",
74020
+ "type": "string"
74021
+ }
74022
+ ],
74023
+ "scope": "external",
74024
+ "synonyms": "delete error, failed delete",
74025
+ "tier": "internal"
74026
+ }
74027
+ ],
74028
+ "linkedEntity": "PermissionGrant",
74029
+ "listens": [
74030
+ {
74031
+ "event": "GRANT_CREATED",
74032
+ "source": {
74033
+ "kind": "trait",
74034
+ "trait": "PermissionGrantCreate"
74035
+ },
74036
+ "triggers": "DO_CREATE"
74037
+ },
74038
+ {
74039
+ "event": "GRANT_UPDATED",
74040
+ "source": {
74041
+ "kind": "trait",
74042
+ "trait": "PermissionGrantEdit"
74043
+ },
74044
+ "triggers": "DO_UPDATE"
74045
+ },
74046
+ {
74047
+ "event": "DELETE",
74048
+ "source": {
74049
+ "kind": "trait",
74050
+ "trait": "PermissionMatrixAdmin"
74051
+ },
74052
+ "triggers": "DO_DELETE"
74053
+ }
74054
+ ],
74055
+ "name": "PermissionGrantPersistor",
74056
+ "scope": "instance",
74057
+ "stateMachine": {
74058
+ "events": [
74059
+ {
74060
+ "key": "INIT",
74061
+ "name": "Initialize"
74062
+ },
74063
+ {
74064
+ "description": "Indicates a request to create a grant row.",
74065
+ "key": "DO_CREATE",
74066
+ "name": "Do Create",
74067
+ "payloadSchema": [
74068
+ {
74069
+ "entity": "PermissionGrant",
74070
+ "name": "data",
74071
+ "properties": [
74072
+ {
74073
+ "name": "id",
74074
+ "required": true,
74075
+ "type": "string"
74076
+ },
74077
+ {
74078
+ "name": "workspaceId",
74079
+ "type": "string"
74080
+ },
74081
+ {
74082
+ "name": "role",
74083
+ "required": true,
74084
+ "type": "string"
74085
+ },
74086
+ {
74087
+ "name": "module",
74088
+ "required": true,
74089
+ "type": "string"
74090
+ },
74091
+ {
74092
+ "name": "canReadFinance",
74093
+ "type": "boolean"
74094
+ },
74095
+ {
74096
+ "name": "canSeeOthersHours",
74097
+ "type": "boolean"
74098
+ },
74099
+ {
74100
+ "name": "canSeeMargins",
74101
+ "type": "boolean"
74102
+ },
74103
+ {
74104
+ "name": "createdAt",
74105
+ "type": "number"
74106
+ }
74611
74107
  ],
74612
- [
74613
- "array/includes",
74614
- "@config.adminRoles",
74615
- "@user.role"
74616
- ]
74617
- ]
74108
+ "required": true,
74109
+ "type": "object"
74110
+ }
74618
74111
  ],
74619
- "to": "editing"
74112
+ "synonyms": "add, new, insert",
74113
+ "tier": "domain"
74620
74114
  },
74621
74115
  {
74622
- "effects": [
74623
- [
74624
- "persist",
74625
- "delete",
74626
- "PermissionGrant",
74627
- "@payload.id",
74628
- {
74629
- "emit": {
74630
- "failure": "PermissionGrantDeleteFailed",
74631
- "success": "PermissionGrantDeleted"
74116
+ "description": "Indicates a grant row has been modified.",
74117
+ "key": "DO_UPDATE",
74118
+ "name": "Do Update",
74119
+ "payloadSchema": [
74120
+ {
74121
+ "entity": "PermissionGrant",
74122
+ "name": "data",
74123
+ "properties": [
74124
+ {
74125
+ "name": "id",
74126
+ "required": true,
74127
+ "type": "string"
74128
+ },
74129
+ {
74130
+ "name": "workspaceId",
74131
+ "type": "string"
74132
+ },
74133
+ {
74134
+ "name": "role",
74135
+ "required": true,
74136
+ "type": "string"
74137
+ },
74138
+ {
74139
+ "name": "module",
74140
+ "required": true,
74141
+ "type": "string"
74142
+ },
74143
+ {
74144
+ "name": "canReadFinance",
74145
+ "type": "boolean"
74146
+ },
74147
+ {
74148
+ "name": "canSeeOthersHours",
74149
+ "type": "boolean"
74150
+ },
74151
+ {
74152
+ "name": "canSeeMargins",
74153
+ "type": "boolean"
74154
+ },
74155
+ {
74156
+ "name": "createdAt",
74157
+ "type": "number"
74632
74158
  }
74633
- }
74634
- ]
74635
- ],
74636
- "event": "DELETE",
74637
- "from": "listing",
74638
- "guard": [
74639
- "and",
74640
- "@config.enabled",
74641
- [
74642
- "or",
74643
- [
74644
- "=",
74645
- [
74646
- "array/len",
74647
- "@config.adminRoles"
74648
- ],
74649
- 0
74650
74159
  ],
74651
- [
74652
- "array/includes",
74653
- "@config.adminRoles",
74654
- "@user.role"
74655
- ]
74656
- ]
74160
+ "required": true,
74161
+ "type": "object"
74162
+ }
74163
+ ],
74164
+ "synonyms": "modify, update, change",
74165
+ "tier": "domain"
74166
+ },
74167
+ {
74168
+ "description": "Indicates a request to delete a grant row.",
74169
+ "key": "DO_DELETE",
74170
+ "name": "Do Delete",
74171
+ "payloadSchema": [
74172
+ {
74173
+ "name": "id",
74174
+ "required": true,
74175
+ "type": "string"
74176
+ }
74177
+ ],
74178
+ "synonyms": "remove, discard, erase",
74179
+ "tier": "domain"
74180
+ },
74181
+ {
74182
+ "description": "Indicates a failure to persist a permission grant.",
74183
+ "key": "PermissionGrantSaveFailed",
74184
+ "name": "PermissionGrant save failed",
74185
+ "payloadSchema": [
74186
+ {
74187
+ "name": "error",
74188
+ "type": "string"
74189
+ },
74190
+ {
74191
+ "name": "code",
74192
+ "type": "string"
74193
+ }
74194
+ ],
74195
+ "synonyms": "save error, failed save, persist failure",
74196
+ "tier": "internal"
74197
+ },
74198
+ {
74199
+ "description": "Indicates a failure to delete a permission grant.",
74200
+ "key": "PermissionGrantDeleteFailed",
74201
+ "name": "PermissionGrant delete failed",
74202
+ "payloadSchema": [
74203
+ {
74204
+ "name": "error",
74205
+ "type": "string"
74206
+ },
74207
+ {
74208
+ "name": "code",
74209
+ "type": "string"
74210
+ }
74211
+ ],
74212
+ "synonyms": "delete error, failed delete",
74213
+ "tier": "internal"
74214
+ },
74215
+ {
74216
+ "description": "Signals that a permission grant has been persisted (create / update); carries the persisted row's id.",
74217
+ "key": "PermissionGrantSaved",
74218
+ "name": "PermissionGrant saved",
74219
+ "payloadSchema": [
74220
+ {
74221
+ "name": "id",
74222
+ "required": true,
74223
+ "type": "string"
74224
+ }
74657
74225
  ],
74658
- "to": "listing"
74226
+ "synonyms": "saved, created, updated, persisted",
74227
+ "tier": "domain"
74659
74228
  },
74660
74229
  {
74661
- "effects": [
74662
- [
74663
- "fetch",
74664
- "PermissionGrant",
74665
- {
74666
- "emit": {
74667
- "failure": "PermissionGrantLoadFailed",
74668
- "success": "PermissionGrantLoaded"
74669
- }
74670
- }
74671
- ]
74230
+ "description": "Signals that a permission grant has been deleted.",
74231
+ "key": "PermissionGrantDeleted",
74232
+ "name": "PermissionGrant deleted",
74233
+ "payloadSchema": [
74234
+ {
74235
+ "name": "id",
74236
+ "type": "string"
74237
+ },
74238
+ {
74239
+ "name": "deleted",
74240
+ "type": "boolean"
74241
+ }
74672
74242
  ],
74673
- "event": "PermissionGrantDeleted",
74674
- "from": "listing",
74675
- "to": "loading"
74676
- },
74243
+ "synonyms": "deleted, removed, revoked",
74244
+ "tier": "domain"
74245
+ }
74246
+ ],
74247
+ "states": [
74677
74248
  {
74678
- "effects": [
74679
- [
74680
- "render-ui",
74681
- "toast",
74682
- {
74683
- "dismissible": true,
74684
- "message": [
74685
- "str/concat",
74686
- "Couldn't delete the permission grant \u2014 ",
74687
- "@payload.error"
74688
- ],
74689
- "type": "alert",
74690
- "variant": "error"
74691
- }
74692
- ]
74693
- ],
74694
- "event": "PermissionGrantDeleteFailed",
74695
- "from": "listing",
74696
- "to": "listing"
74249
+ "isInitial": true,
74250
+ "name": "idle"
74251
+ }
74252
+ ],
74253
+ "transitions": [
74254
+ {
74255
+ "event": "INIT",
74256
+ "from": "idle",
74257
+ "to": "idle"
74697
74258
  },
74698
74259
  {
74699
74260
  "effects": [
@@ -74701,56 +74262,7 @@ function stdPermissionMatrixPermissionMatrixOrbital(params = {}) {
74701
74262
  "persist",
74702
74263
  "create",
74703
74264
  "PermissionGrant",
74704
- {
74705
- "canReadFinance": [
74706
- "object/get",
74707
- "@payload.data",
74708
- "canReadFinance",
74709
- false
74710
- ],
74711
- "canSeeMargins": [
74712
- "object/get",
74713
- "@payload.data",
74714
- "canSeeMargins",
74715
- false
74716
- ],
74717
- "canSeeOthersHours": [
74718
- "object/get",
74719
- "@payload.data",
74720
- "canSeeOthersHours",
74721
- false
74722
- ],
74723
- "createdAt": [
74724
- "time/now"
74725
- ],
74726
- "module": [
74727
- "str/default",
74728
- [
74729
- "object/get",
74730
- "@payload.data",
74731
- "module"
74732
- ],
74733
- ""
74734
- ],
74735
- "role": [
74736
- "str/default",
74737
- [
74738
- "object/get",
74739
- "@payload.data",
74740
- "role"
74741
- ],
74742
- ""
74743
- ],
74744
- "workspaceId": [
74745
- "str/default",
74746
- [
74747
- "object/get",
74748
- "@payload.data",
74749
- "workspaceId"
74750
- ],
74751
- ""
74752
- ]
74753
- },
74265
+ "@payload.data",
74754
74266
  {
74755
74267
  "emit": {
74756
74268
  "failure": "PermissionGrantSaveFailed",
@@ -74759,115 +74271,33 @@ function stdPermissionMatrixPermissionMatrixOrbital(params = {}) {
74759
74271
  }
74760
74272
  ]
74761
74273
  ],
74762
- "event": "CREATE_GRANT",
74763
- "from": "editing",
74274
+ "event": "DO_CREATE",
74275
+ "from": "idle",
74764
74276
  "guard": [
74765
- "and",
74766
- "@config.enabled",
74277
+ "or",
74767
74278
  [
74768
- "or",
74279
+ "=",
74769
74280
  [
74770
- "=",
74771
- [
74772
- "array/len",
74773
- "@config.adminRoles"
74774
- ],
74775
- 0
74281
+ "array/len",
74282
+ "@config.adminRoles"
74776
74283
  ],
74777
- [
74778
- "array/includes",
74779
- "@config.adminRoles",
74780
- "@user.role"
74781
- ]
74284
+ 0
74285
+ ],
74286
+ [
74287
+ "array/includes",
74288
+ "@config.adminRoles",
74289
+ "@user.role"
74782
74290
  ]
74783
74291
  ],
74784
- "to": "editing"
74292
+ "to": "idle"
74785
74293
  },
74786
74294
  {
74787
74295
  "effects": [
74788
- [
74789
- "set",
74790
- "@entity.id",
74791
- [
74792
- "object/get",
74793
- "@payload.data",
74794
- "id"
74795
- ]
74796
- ],
74797
- [
74798
- "set",
74799
- "@entity.workspaceId",
74800
- [
74801
- "str/default",
74802
- [
74803
- "object/get",
74804
- "@payload.data",
74805
- "workspaceId"
74806
- ],
74807
- ""
74808
- ]
74809
- ],
74810
- [
74811
- "set",
74812
- "@entity.role",
74813
- [
74814
- "str/default",
74815
- [
74816
- "object/get",
74817
- "@payload.data",
74818
- "role"
74819
- ],
74820
- ""
74821
- ]
74822
- ],
74823
- [
74824
- "set",
74825
- "@entity.module",
74826
- [
74827
- "str/default",
74828
- [
74829
- "object/get",
74830
- "@payload.data",
74831
- "module"
74832
- ],
74833
- ""
74834
- ]
74835
- ],
74836
- [
74837
- "set",
74838
- "@entity.canReadFinance",
74839
- [
74840
- "object/get",
74841
- "@payload.data",
74842
- "canReadFinance",
74843
- false
74844
- ]
74845
- ],
74846
- [
74847
- "set",
74848
- "@entity.canSeeOthersHours",
74849
- [
74850
- "object/get",
74851
- "@payload.data",
74852
- "canSeeOthersHours",
74853
- false
74854
- ]
74855
- ],
74856
- [
74857
- "set",
74858
- "@entity.canSeeMargins",
74859
- [
74860
- "object/get",
74861
- "@payload.data",
74862
- "canSeeMargins",
74863
- false
74864
- ]
74865
- ],
74866
74296
  [
74867
74297
  "persist",
74868
74298
  "update",
74869
74299
  "PermissionGrant",
74870
- "@entity",
74300
+ "@payload.data",
74871
74301
  {
74872
74302
  "emit": {
74873
74303
  "failure": "PermissionGrantSaveFailed",
@@ -74876,103 +74306,60 @@ function stdPermissionMatrixPermissionMatrixOrbital(params = {}) {
74876
74306
  }
74877
74307
  ]
74878
74308
  ],
74879
- "event": "SAVE_GRANT",
74880
- "from": "editing",
74309
+ "event": "DO_UPDATE",
74310
+ "from": "idle",
74881
74311
  "guard": [
74882
- "and",
74883
- "@config.enabled",
74312
+ "or",
74884
74313
  [
74885
- "or",
74314
+ "=",
74886
74315
  [
74887
- "=",
74888
- [
74889
- "array/len",
74890
- "@config.adminRoles"
74891
- ],
74892
- 0
74316
+ "array/len",
74317
+ "@config.adminRoles"
74893
74318
  ],
74894
- [
74895
- "array/includes",
74896
- "@config.adminRoles",
74897
- "@user.role"
74898
- ]
74319
+ 0
74320
+ ],
74321
+ [
74322
+ "array/includes",
74323
+ "@config.adminRoles",
74324
+ "@user.role"
74899
74325
  ]
74900
74326
  ],
74901
- "to": "editing"
74327
+ "to": "idle"
74902
74328
  },
74903
74329
  {
74904
74330
  "effects": [
74905
74331
  [
74906
- "render-ui",
74907
- "modal",
74908
- null
74909
- ],
74910
- [
74911
- "render-ui",
74912
- "main",
74913
- {
74914
- "align": "center",
74915
- "children": [
74916
- "@trait.LoadingSpinner",
74917
- "@trait.LoadingText"
74918
- ],
74919
- "className": "py-12",
74920
- "direction": "vertical",
74921
- "gap": "md",
74922
- "type": "stack"
74923
- }
74924
- ],
74925
- [
74926
- "fetch",
74332
+ "persist",
74333
+ "delete",
74927
74334
  "PermissionGrant",
74335
+ "@payload.id",
74928
74336
  {
74929
74337
  "emit": {
74930
- "failure": "PermissionGrantLoadFailed",
74931
- "success": "PermissionGrantLoaded"
74338
+ "failure": "PermissionGrantDeleteFailed",
74339
+ "success": "PermissionGrantDeleted"
74932
74340
  }
74933
74341
  }
74934
74342
  ]
74935
74343
  ],
74936
- "event": "CANCEL_GRANT",
74937
- "from": "editing",
74938
- "to": "loading"
74939
- },
74940
- {
74941
- "effects": [
74942
- [
74943
- "render-ui",
74944
- "modal",
74945
- null
74946
- ],
74344
+ "event": "DO_DELETE",
74345
+ "from": "idle",
74346
+ "guard": [
74347
+ "or",
74947
74348
  [
74948
- "render-ui",
74949
- "main",
74950
- {
74951
- "align": "center",
74952
- "children": [
74953
- "@trait.LoadingSpinner",
74954
- "@trait.LoadingText"
74955
- ],
74956
- "className": "py-12",
74957
- "direction": "vertical",
74958
- "gap": "md",
74959
- "type": "stack"
74960
- }
74349
+ "=",
74350
+ [
74351
+ "array/len",
74352
+ "@config.adminRoles"
74353
+ ],
74354
+ 0
74961
74355
  ],
74962
74356
  [
74963
- "fetch",
74964
- "PermissionGrant",
74965
- {
74966
- "emit": {
74967
- "failure": "PermissionGrantLoadFailed",
74968
- "success": "PermissionGrantLoaded"
74969
- }
74970
- }
74357
+ "array/includes",
74358
+ "@config.adminRoles",
74359
+ "@user.role"
74971
74360
  ]
74972
74361
  ],
74973
- "event": "PermissionGrantSaved",
74974
- "from": "editing",
74975
- "to": "loading"
74362
+ "to": "idle"
74976
74363
  },
74977
74364
  {
74978
74365
  "effects": [
@@ -74992,73 +74379,29 @@ function stdPermissionMatrixPermissionMatrixOrbital(params = {}) {
74992
74379
  ]
74993
74380
  ],
74994
74381
  "event": "PermissionGrantSaveFailed",
74995
- "from": "editing",
74996
- "to": "editing"
74997
- },
74998
- {
74999
- "effects": [
75000
- [
75001
- "render-ui",
75002
- "modal",
75003
- null
75004
- ],
75005
- [
75006
- "render-ui",
75007
- "main",
75008
- {
75009
- "align": "center",
75010
- "children": [
75011
- "@trait.LoadingSpinner",
75012
- "@trait.LoadingText"
75013
- ],
75014
- "className": "py-12",
75015
- "direction": "vertical",
75016
- "gap": "md",
75017
- "type": "stack"
75018
- }
75019
- ],
75020
- [
75021
- "fetch",
75022
- "PermissionGrant",
75023
- {
75024
- "emit": {
75025
- "failure": "PermissionGrantLoadFailed",
75026
- "success": "PermissionGrantLoaded"
75027
- }
75028
- }
75029
- ]
75030
- ],
75031
- "event": "CLOSE",
75032
- "from": "editing",
75033
- "to": "loading"
74382
+ "from": "idle",
74383
+ "to": "idle"
75034
74384
  },
75035
74385
  {
75036
74386
  "effects": [
75037
- [
75038
- "fetch",
75039
- "PermissionGrant",
75040
- {
75041
- "emit": {
75042
- "failure": "PermissionGrantLoadFailed",
75043
- "success": "PermissionGrantLoaded"
75044
- }
75045
- }
75046
- ],
75047
74387
  [
75048
74388
  "render-ui",
75049
- "main",
74389
+ "toast",
75050
74390
  {
75051
- "align": "center",
75052
- "children": [
75053
- "@trait.ErrorSpinner"
74391
+ "dismissible": true,
74392
+ "message": [
74393
+ "str/concat",
74394
+ "Couldn't delete the permission grant \u2014 ",
74395
+ "@payload.error"
75054
74396
  ],
75055
- "type": "stack"
74397
+ "type": "alert",
74398
+ "variant": "error"
75056
74399
  }
75057
74400
  ]
75058
74401
  ],
75059
- "event": "INIT",
75060
- "from": "error",
75061
- "to": "loading"
74402
+ "event": "PermissionGrantDeleteFailed",
74403
+ "from": "idle",
74404
+ "to": "idle"
75062
74405
  }
75063
74406
  ]
75064
74407
  }
@@ -75510,6 +74853,15 @@ function stdPermissionMatrixPermissionMatrixOrbital(params = {}) {
75510
74853
  {
75511
74854
  "ref": "PermissionMatrixAdmin"
75512
74855
  },
74856
+ {
74857
+ "ref": "PermissionGrantCreate"
74858
+ },
74859
+ {
74860
+ "ref": "PermissionGrantEdit"
74861
+ },
74862
+ {
74863
+ "ref": "PermissionGrantPersistor"
74864
+ },
75513
74865
  {
75514
74866
  "ref": "PermissionGrantQuery"
75515
74867
  }
@@ -75588,13 +74940,14 @@ var StdPermissionMatrixPermissionMatrixOrbitalManifest = {
75588
74940
  "LoadingText",
75589
74941
  "ShieldCheckIcon",
75590
74942
  "PermissionMatrixTitle",
75591
- "NewGrantButton",
75592
- "BackButton",
75593
74943
  "GrantDivider",
75594
- "ErrorAlert"
74944
+ "ErrorAlert",
74945
+ "PermissionGrantCreate",
74946
+ "PermissionGrantEdit"
75595
74947
  ],
75596
74948
  inlineTraitNames: [
75597
74949
  "PermissionMatrixAdmin",
74950
+ "PermissionGrantPersistor",
75598
74951
  "PermissionGrantQuery"
75599
74952
  ]
75600
74953
  };
@@ -87359,6 +86712,18 @@ function stdReminderSchedulerReminderSchedulerOrbital(params = {}) {
87359
86712
  "tier": "internal",
87360
86713
  "type": "string"
87361
86714
  },
86715
+ "direction": {
86716
+ "default": "future",
86717
+ "description": "'future' (default) matches records whose dateField is still ahead, up to offsetHours out \u2014 upcoming-deadline reminders. 'past' matches records whose dateField is at least offsetHours behind now \u2014 act-after-the-fact policies. The emitted event and the dedup marker are identical either way.",
86718
+ "label": "Scan which side of now?",
86719
+ "synonyms": "direction, past due, overdue, after the deadline, look back, backward scan, past-window",
86720
+ "tier": "infra",
86721
+ "type": "string",
86722
+ "values": [
86723
+ "future",
86724
+ "past"
86725
+ ]
86726
+ },
87362
86727
  "enabled": {
87363
86728
  "default": false,
87364
86729
  "description": "Automatically remind about upcoming deadlines. Off by default.",
@@ -87636,6 +87001,16 @@ function stdReminderSchedulerReminderSchedulerOrbital(params = {}) {
87636
87001
  ],
87637
87002
  "to": "idle"
87638
87003
  },
87004
+ {
87005
+ "event": "ScanRecordsLoaded",
87006
+ "from": "idle",
87007
+ "guard": [
87008
+ "=",
87009
+ "@config.enabled",
87010
+ false
87011
+ ],
87012
+ "to": "idle"
87013
+ },
87639
87014
  {
87640
87015
  "effects": [
87641
87016
  [
@@ -87679,35 +87054,74 @@ function stdReminderSchedulerReminderSchedulerOrbital(params = {}) {
87679
87054
  0
87680
87055
  ],
87681
87056
  [
87682
- ">",
87057
+ "or",
87683
87058
  [
87684
- "time/parse",
87059
+ "and",
87685
87060
  [
87686
- "object/get",
87687
- "@entity",
87688
- "@config.dateField"
87061
+ "=",
87062
+ "@config.direction",
87063
+ "future"
87064
+ ],
87065
+ [
87066
+ ">",
87067
+ [
87068
+ "time/parse",
87069
+ [
87070
+ "object/get",
87071
+ "@entity",
87072
+ "@config.dateField"
87073
+ ]
87074
+ ],
87075
+ "@now"
87076
+ ],
87077
+ [
87078
+ "<",
87079
+ [
87080
+ "-",
87081
+ [
87082
+ "time/parse",
87083
+ [
87084
+ "object/get",
87085
+ "@entity",
87086
+ "@config.dateField"
87087
+ ]
87088
+ ],
87089
+ "@now"
87090
+ ],
87091
+ [
87092
+ "*",
87093
+ "@config.offsetHours",
87094
+ 36e5
87095
+ ]
87689
87096
  ]
87690
87097
  ],
87691
- "@now"
87692
- ],
87693
- [
87694
- "<",
87695
87098
  [
87696
- "-",
87099
+ "and",
87697
87100
  [
87698
- "time/parse",
87101
+ "=",
87102
+ "@config.direction",
87103
+ "past"
87104
+ ],
87105
+ [
87106
+ ">",
87699
87107
  [
87700
- "object/get",
87701
- "@entity",
87702
- "@config.dateField"
87108
+ "-",
87109
+ "@now",
87110
+ [
87111
+ "time/parse",
87112
+ [
87113
+ "object/get",
87114
+ "@entity",
87115
+ "@config.dateField"
87116
+ ]
87117
+ ]
87118
+ ],
87119
+ [
87120
+ "*",
87121
+ "@config.offsetHours",
87122
+ 36e5
87703
87123
  ]
87704
- ],
87705
- "@now"
87706
- ],
87707
- [
87708
- "*",
87709
- "@config.offsetHours",
87710
- 36e5
87124
+ ]
87711
87125
  ]
87712
87126
  ]
87713
87127
  ]
@@ -87827,35 +87241,74 @@ function stdReminderSchedulerReminderSchedulerOrbital(params = {}) {
87827
87241
  0
87828
87242
  ],
87829
87243
  [
87830
- ">",
87244
+ "or",
87831
87245
  [
87832
- "time/parse",
87246
+ "and",
87833
87247
  [
87834
- "object/get",
87835
- "@entity",
87836
- "@config.dateField"
87248
+ "=",
87249
+ "@config.direction",
87250
+ "future"
87251
+ ],
87252
+ [
87253
+ ">",
87254
+ [
87255
+ "time/parse",
87256
+ [
87257
+ "object/get",
87258
+ "@entity",
87259
+ "@config.dateField"
87260
+ ]
87261
+ ],
87262
+ "@now"
87263
+ ],
87264
+ [
87265
+ "<",
87266
+ [
87267
+ "-",
87268
+ [
87269
+ "time/parse",
87270
+ [
87271
+ "object/get",
87272
+ "@entity",
87273
+ "@config.dateField"
87274
+ ]
87275
+ ],
87276
+ "@now"
87277
+ ],
87278
+ [
87279
+ "*",
87280
+ "@config.offsetHours",
87281
+ 36e5
87282
+ ]
87837
87283
  ]
87838
87284
  ],
87839
- "@now"
87840
- ],
87841
- [
87842
- "<",
87843
87285
  [
87844
- "-",
87286
+ "and",
87287
+ [
87288
+ "=",
87289
+ "@config.direction",
87290
+ "past"
87291
+ ],
87845
87292
  [
87846
- "time/parse",
87293
+ ">",
87847
87294
  [
87848
- "object/get",
87849
- "@entity",
87850
- "@config.dateField"
87295
+ "-",
87296
+ "@now",
87297
+ [
87298
+ "time/parse",
87299
+ [
87300
+ "object/get",
87301
+ "@entity",
87302
+ "@config.dateField"
87303
+ ]
87304
+ ]
87305
+ ],
87306
+ [
87307
+ "*",
87308
+ "@config.offsetHours",
87309
+ 36e5
87851
87310
  ]
87852
- ],
87853
- "@now"
87854
- ],
87855
- [
87856
- "*",
87857
- "@config.offsetHours",
87858
- 36e5
87311
+ ]
87859
87312
  ]
87860
87313
  ]
87861
87314
  ]