@actual-app/web 26.9.0 → 26.10.0-nightly.20260902

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/build/.vite/manifest.json +71 -71
  2. package/build/index.html +8 -8
  3. package/build/static/js/{ManageRules.CzaFnFD6.chunk.js → ManageRules.BU-s9eGL.chunk.js} +2 -2
  4. package/build/static/js/{ManageRules.CzaFnFD6.chunk.js.map → ManageRules.BU-s9eGL.chunk.js.map} +1 -1
  5. package/build/static/js/{NotesTagFormatter.tHcxzGB_.chunk.js → NotesTagFormatter.mWj1X9sH.chunk.js} +2 -2
  6. package/build/static/js/{NotesTagFormatter.tHcxzGB_.chunk.js.map → NotesTagFormatter.mWj1X9sH.chunk.js.map} +1 -1
  7. package/build/static/js/{PayeeRuleCountLabel.Da8Z_D8r.chunk.js → PayeeRuleCountLabel.CVTtdkff.chunk.js} +2 -2
  8. package/build/static/js/{PayeeRuleCountLabel.Da8Z_D8r.chunk.js.map → PayeeRuleCountLabel.CVTtdkff.chunk.js.map} +1 -1
  9. package/build/static/js/ReportRouter.C1y6Y7CX.chunk.js +15 -0
  10. package/build/static/js/ReportRouter.C1y6Y7CX.chunk.js.map +1 -0
  11. package/build/static/js/{ScheduleEditForm.B0gu2LA3.chunk.js → ScheduleEditForm.evSfaxQI.chunk.js} +2 -2
  12. package/build/static/js/{ScheduleEditForm.B0gu2LA3.chunk.js.map → ScheduleEditForm.evSfaxQI.chunk.js.map} +1 -1
  13. package/build/static/js/{SchedulesTable.Dyh9bPLs.chunk.js → SchedulesTable.eXAhrUQp.chunk.js} +2 -2
  14. package/build/static/js/{SchedulesTable.Dyh9bPLs.chunk.js.map → SchedulesTable.eXAhrUQp.chunk.js.map} +1 -1
  15. package/build/static/js/{TransactionEdit.B1PQcUs5.chunk.js → TransactionEdit.B8zxhADY.chunk.js} +2 -2
  16. package/build/static/js/{TransactionEdit.B1PQcUs5.chunk.js.map → TransactionEdit.B8zxhADY.chunk.js.map} +1 -1
  17. package/build/static/js/{TransactionList.jF2UzWDj.chunk.js → TransactionList.CDuRXR3q.chunk.js} +2 -2
  18. package/build/static/js/{TransactionList.jF2UzWDj.chunk.js.map → TransactionList.CDuRXR3q.chunk.js.map} +1 -1
  19. package/build/static/js/{TransactionList.D2_XkqbJ.chunk.js → TransactionList.GFXgY-MF.chunk.js} +2 -2
  20. package/build/static/js/{TransactionList.D2_XkqbJ.chunk.js.map → TransactionList.GFXgY-MF.chunk.js.map} +1 -1
  21. package/build/static/js/{Value.Dj0m1XtB.chunk.js → Value.BgvcRWEc.chunk.js} +2 -2
  22. package/build/static/js/Value.BgvcRWEc.chunk.js.map +1 -0
  23. package/build/static/js/{columns.CQnMFLik.chunk.js → columns.ChRZFQtz.chunk.js} +2 -2
  24. package/build/static/js/{columns.CQnMFLik.chunk.js.map → columns.ChRZFQtz.chunk.js.map} +1 -1
  25. package/build/static/js/{index.Biq-Yl60.js → index.DsBVFDvr.js} +4 -4
  26. package/build/static/js/{index.Biq-Yl60.js.map → index.DsBVFDvr.js.map} +1 -1
  27. package/build/static/js/{narrow.C9RhhcTw.chunk.js → narrow.BqbLYJdm.chunk.js} +2 -2
  28. package/build/static/js/{narrow.C9RhhcTw.chunk.js.map → narrow.BqbLYJdm.chunk.js.map} +1 -1
  29. package/build/static/js/{useFormatList.B3xplYoK.chunk.js → useFormatList.BZPSuDdE.chunk.js} +2 -2
  30. package/build/static/js/{useFormatList.B3xplYoK.chunk.js.map → useFormatList.BZPSuDdE.chunk.js.map} +1 -1
  31. package/build/static/js/{wide.BkOYakX3.chunk.js → wide.Bd6K5Iii.chunk.js} +2 -2
  32. package/build/static/js/{wide.BkOYakX3.chunk.js.map → wide.Bd6K5Iii.chunk.js.map} +1 -1
  33. package/build/sw.js +1 -1
  34. package/build/sw.js.map +1 -1
  35. package/package.json +2 -2
  36. package/build/static/js/ReportRouter.CXuDFUq1.chunk.js +0 -15
  37. package/build/static/js/ReportRouter.CXuDFUq1.chunk.js.map +0 -1
  38. package/build/static/js/Value.Dj0m1XtB.chunk.js.map +0 -1
@@ -91,58 +91,58 @@
91
91
  "_months.BlbIqvQw.chunk.js"
92
92
  ]
93
93
  },
94
- "_ManageRules.CzaFnFD6.chunk.js": {
95
- "file": "static/js/ManageRules.CzaFnFD6.chunk.js",
94
+ "_ManageRules.BU-s9eGL.chunk.js": {
95
+ "file": "static/js/ManageRules.BU-s9eGL.chunk.js",
96
96
  "name": "ManageRules",
97
97
  "imports": [
98
98
  "_theme.BTyknj3e.chunk.js",
99
99
  "_months.BlbIqvQw.chunk.js",
100
- "_Value.Dj0m1XtB.chunk.js",
100
+ "_Value.BgvcRWEc.chunk.js",
101
101
  "_DateSelect.CU00ZjsZ.chunk.js",
102
102
  "_useLocalPref._HwumoTj.chunk.js"
103
103
  ]
104
104
  },
105
- "_NotesTagFormatter.tHcxzGB_.chunk.js": {
106
- "file": "static/js/NotesTagFormatter.tHcxzGB_.chunk.js",
105
+ "_NotesTagFormatter.mWj1X9sH.chunk.js": {
106
+ "file": "static/js/NotesTagFormatter.mWj1X9sH.chunk.js",
107
107
  "name": "NotesTagFormatter",
108
108
  "imports": [
109
109
  "_theme.BTyknj3e.chunk.js",
110
110
  "_months.BlbIqvQw.chunk.js",
111
- "_Value.Dj0m1XtB.chunk.js",
111
+ "_Value.BgvcRWEc.chunk.js",
112
112
  "_useLocalPref._HwumoTj.chunk.js"
113
113
  ]
114
114
  },
115
- "_PayeeRuleCountLabel.Da8Z_D8r.chunk.js": {
116
- "file": "static/js/PayeeRuleCountLabel.Da8Z_D8r.chunk.js",
115
+ "_PayeeRuleCountLabel.CVTtdkff.chunk.js": {
116
+ "file": "static/js/PayeeRuleCountLabel.CVTtdkff.chunk.js",
117
117
  "name": "PayeeRuleCountLabel",
118
118
  "imports": [
119
119
  "_theme.BTyknj3e.chunk.js",
120
120
  "_months.BlbIqvQw.chunk.js",
121
- "_Value.Dj0m1XtB.chunk.js"
121
+ "_Value.BgvcRWEc.chunk.js"
122
122
  ]
123
123
  },
124
- "_ScheduleEditForm.B0gu2LA3.chunk.js": {
125
- "file": "static/js/ScheduleEditForm.B0gu2LA3.chunk.js",
124
+ "_ScheduleEditForm.evSfaxQI.chunk.js": {
125
+ "file": "static/js/ScheduleEditForm.evSfaxQI.chunk.js",
126
126
  "name": "ScheduleEditForm",
127
127
  "imports": [
128
128
  "_theme.BTyknj3e.chunk.js",
129
129
  "_months.BlbIqvQw.chunk.js",
130
- "_Value.Dj0m1XtB.chunk.js",
130
+ "_Value.BgvcRWEc.chunk.js",
131
131
  "_DateSelect.CU00ZjsZ.chunk.js",
132
132
  "_useLocalPref._HwumoTj.chunk.js",
133
- "_TransactionEdit.B1PQcUs5.chunk.js"
133
+ "_TransactionEdit.B8zxhADY.chunk.js"
134
134
  ]
135
135
  },
136
- "_SchedulesTable.Dyh9bPLs.chunk.js": {
137
- "file": "static/js/SchedulesTable.Dyh9bPLs.chunk.js",
136
+ "_SchedulesTable.eXAhrUQp.chunk.js": {
137
+ "file": "static/js/SchedulesTable.eXAhrUQp.chunk.js",
138
138
  "name": "SchedulesTable",
139
139
  "imports": [
140
140
  "_theme.BTyknj3e.chunk.js",
141
141
  "_months.BlbIqvQw.chunk.js",
142
- "_Value.Dj0m1XtB.chunk.js",
143
- "_columns.CQnMFLik.chunk.js",
142
+ "_Value.BgvcRWEc.chunk.js",
143
+ "_columns.ChRZFQtz.chunk.js",
144
144
  "_DateSelect.CU00ZjsZ.chunk.js",
145
- "_ManageRules.CzaFnFD6.chunk.js",
145
+ "_ManageRules.BU-s9eGL.chunk.js",
146
146
  "_useLocalPref._HwumoTj.chunk.js"
147
147
  ]
148
148
  },
@@ -154,45 +154,45 @@
154
154
  "_months.BlbIqvQw.chunk.js"
155
155
  ]
156
156
  },
157
- "_TransactionEdit.B1PQcUs5.chunk.js": {
158
- "file": "static/js/TransactionEdit.B1PQcUs5.chunk.js",
157
+ "_TransactionEdit.B8zxhADY.chunk.js": {
158
+ "file": "static/js/TransactionEdit.B8zxhADY.chunk.js",
159
159
  "name": "TransactionEdit",
160
160
  "imports": [
161
161
  "_theme.BTyknj3e.chunk.js",
162
162
  "_months.BlbIqvQw.chunk.js",
163
- "_Value.Dj0m1XtB.chunk.js",
163
+ "_Value.BgvcRWEc.chunk.js",
164
164
  "_DateSelect.CU00ZjsZ.chunk.js",
165
165
  "_useLocalPref._HwumoTj.chunk.js"
166
166
  ]
167
167
  },
168
- "_TransactionList.D2_XkqbJ.chunk.js": {
169
- "file": "static/js/TransactionList.D2_XkqbJ.chunk.js",
168
+ "_TransactionList.CDuRXR3q.chunk.js": {
169
+ "file": "static/js/TransactionList.CDuRXR3q.chunk.js",
170
170
  "name": "TransactionList",
171
171
  "imports": [
172
172
  "_theme.BTyknj3e.chunk.js",
173
173
  "_months.BlbIqvQw.chunk.js",
174
- "_Value.Dj0m1XtB.chunk.js",
174
+ "_Value.BgvcRWEc.chunk.js",
175
+ "_columns.ChRZFQtz.chunk.js",
175
176
  "_DateSelect.CU00ZjsZ.chunk.js",
176
177
  "_useLocalPref._HwumoTj.chunk.js",
177
- "_TransactionEdit.B1PQcUs5.chunk.js",
178
- "_NotesTagFormatter.tHcxzGB_.chunk.js"
178
+ "_NotesTagFormatter.mWj1X9sH.chunk.js"
179
179
  ]
180
180
  },
181
- "_TransactionList.jF2UzWDj.chunk.js": {
182
- "file": "static/js/TransactionList.jF2UzWDj.chunk.js",
181
+ "_TransactionList.GFXgY-MF.chunk.js": {
182
+ "file": "static/js/TransactionList.GFXgY-MF.chunk.js",
183
183
  "name": "TransactionList",
184
184
  "imports": [
185
185
  "_theme.BTyknj3e.chunk.js",
186
186
  "_months.BlbIqvQw.chunk.js",
187
- "_Value.Dj0m1XtB.chunk.js",
188
- "_columns.CQnMFLik.chunk.js",
187
+ "_Value.BgvcRWEc.chunk.js",
189
188
  "_DateSelect.CU00ZjsZ.chunk.js",
190
189
  "_useLocalPref._HwumoTj.chunk.js",
191
- "_NotesTagFormatter.tHcxzGB_.chunk.js"
190
+ "_TransactionEdit.B8zxhADY.chunk.js",
191
+ "_NotesTagFormatter.mWj1X9sH.chunk.js"
192
192
  ]
193
193
  },
194
- "_Value.Dj0m1XtB.chunk.js": {
195
- "file": "static/js/Value.Dj0m1XtB.chunk.js",
194
+ "_Value.BgvcRWEc.chunk.js": {
195
+ "file": "static/js/Value.BgvcRWEc.chunk.js",
196
196
  "name": "Value",
197
197
  "imports": [
198
198
  "_theme.BTyknj3e.chunk.js",
@@ -219,13 +219,13 @@
219
219
  "_months.BlbIqvQw.chunk.js"
220
220
  ]
221
221
  },
222
- "_columns.CQnMFLik.chunk.js": {
223
- "file": "static/js/columns.CQnMFLik.chunk.js",
222
+ "_columns.ChRZFQtz.chunk.js": {
223
+ "file": "static/js/columns.ChRZFQtz.chunk.js",
224
224
  "name": "columns",
225
225
  "imports": [
226
226
  "_theme.BTyknj3e.chunk.js",
227
227
  "_months.BlbIqvQw.chunk.js",
228
- "_Value.Dj0m1XtB.chunk.js",
228
+ "_Value.BgvcRWEc.chunk.js",
229
229
  "_useReducedMotion.Do7liDFh.chunk.js"
230
230
  ]
231
231
  },
@@ -257,13 +257,13 @@
257
257
  "file": "static/js/theme.BTyknj3e.chunk.js",
258
258
  "name": "theme"
259
259
  },
260
- "_useFormatList.B3xplYoK.chunk.js": {
261
- "file": "static/js/useFormatList.B3xplYoK.chunk.js",
260
+ "_useFormatList.BZPSuDdE.chunk.js": {
261
+ "file": "static/js/useFormatList.BZPSuDdE.chunk.js",
262
262
  "name": "useFormatList",
263
263
  "imports": [
264
264
  "_theme.BTyknj3e.chunk.js",
265
265
  "_months.BlbIqvQw.chunk.js",
266
- "_Value.Dj0m1XtB.chunk.js",
266
+ "_Value.BgvcRWEc.chunk.js",
267
267
  "_DateSelect.CU00ZjsZ.chunk.js"
268
268
  ]
269
269
  },
@@ -284,7 +284,7 @@
284
284
  ]
285
285
  },
286
286
  "index.html": {
287
- "file": "static/js/index.Biq-Yl60.js",
287
+ "file": "static/js/index.DsBVFDvr.js",
288
288
  "name": "index",
289
289
  "src": "index.html",
290
290
  "isEntry": true,
@@ -292,16 +292,16 @@
292
292
  "_theme.BTyknj3e.chunk.js",
293
293
  "_months.BlbIqvQw.chunk.js",
294
294
  "_client.DD6K4z_-.chunk.js",
295
- "_Value.Dj0m1XtB.chunk.js",
296
- "_columns.CQnMFLik.chunk.js",
297
- "_SchedulesTable.Dyh9bPLs.chunk.js",
295
+ "_Value.BgvcRWEc.chunk.js",
296
+ "_columns.ChRZFQtz.chunk.js",
297
+ "_SchedulesTable.eXAhrUQp.chunk.js",
298
298
  "_DateSelect.CU00ZjsZ.chunk.js",
299
- "_ManageRules.CzaFnFD6.chunk.js",
299
+ "_ManageRules.BU-s9eGL.chunk.js",
300
300
  "_useLocalPref._HwumoTj.chunk.js",
301
- "_TransactionEdit.B1PQcUs5.chunk.js",
302
- "_useFormatList.B3xplYoK.chunk.js",
301
+ "_TransactionEdit.B8zxhADY.chunk.js",
302
+ "_useFormatList.BZPSuDdE.chunk.js",
303
303
  "_TourProvider.jl-mg-lZ.chunk.js",
304
- "_ScheduleEditForm.B0gu2LA3.chunk.js",
304
+ "_ScheduleEditForm.evSfaxQI.chunk.js",
305
305
  "_useReducedMotion.Do7liDFh.chunk.js"
306
306
  ],
307
307
  "dynamicImports": [
@@ -455,24 +455,24 @@
455
455
  ]
456
456
  },
457
457
  "src/components/reports/ReportRouter.tsx": {
458
- "file": "static/js/ReportRouter.CXuDFUq1.chunk.js",
458
+ "file": "static/js/ReportRouter.C1y6Y7CX.chunk.js",
459
459
  "name": "ReportRouter",
460
460
  "src": "src/components/reports/ReportRouter.tsx",
461
461
  "isDynamicEntry": true,
462
462
  "imports": [
463
463
  "_theme.BTyknj3e.chunk.js",
464
464
  "_months.BlbIqvQw.chunk.js",
465
- "_Value.Dj0m1XtB.chunk.js",
466
- "_columns.CQnMFLik.chunk.js",
465
+ "_Value.BgvcRWEc.chunk.js",
466
+ "_columns.ChRZFQtz.chunk.js",
467
467
  "_DateSelect.CU00ZjsZ.chunk.js",
468
468
  "_useLocalPref._HwumoTj.chunk.js",
469
- "_TransactionEdit.B1PQcUs5.chunk.js",
470
- "_TransactionList.D2_XkqbJ.chunk.js",
471
- "_useFormatList.B3xplYoK.chunk.js",
469
+ "_TransactionEdit.B8zxhADY.chunk.js",
470
+ "_TransactionList.GFXgY-MF.chunk.js",
471
+ "_useFormatList.BZPSuDdE.chunk.js",
472
472
  "_useReducedMotion.Do7liDFh.chunk.js",
473
473
  "_bootstrapHyperFormula.Dh4rhgPK.chunk.js",
474
- "_TransactionList.jF2UzWDj.chunk.js",
475
- "_NotesTagFormatter.tHcxzGB_.chunk.js"
474
+ "_TransactionList.CDuRXR3q.chunk.js",
475
+ "_NotesTagFormatter.mWj1X9sH.chunk.js"
476
476
  ],
477
477
  "dynamicImports": [
478
478
  "src/components/formula/FormulaEditor.tsx"
@@ -482,41 +482,41 @@
482
482
  ]
483
483
  },
484
484
  "src/components/responsive/narrow.ts": {
485
- "file": "static/js/narrow.C9RhhcTw.chunk.js",
485
+ "file": "static/js/narrow.BqbLYJdm.chunk.js",
486
486
  "name": "narrow",
487
487
  "src": "src/components/responsive/narrow.ts",
488
488
  "isDynamicEntry": true,
489
489
  "imports": [
490
490
  "_theme.BTyknj3e.chunk.js",
491
491
  "_months.BlbIqvQw.chunk.js",
492
- "_Value.Dj0m1XtB.chunk.js",
492
+ "_Value.BgvcRWEc.chunk.js",
493
493
  "_DateSelect.CU00ZjsZ.chunk.js",
494
- "_ManageRules.CzaFnFD6.chunk.js",
494
+ "_ManageRules.BU-s9eGL.chunk.js",
495
495
  "_useLocalPref._HwumoTj.chunk.js",
496
- "_TransactionEdit.B1PQcUs5.chunk.js",
497
- "_TransactionList.D2_XkqbJ.chunk.js",
498
- "_ScheduleEditForm.B0gu2LA3.chunk.js",
499
- "_NotesTagFormatter.tHcxzGB_.chunk.js",
500
- "_PayeeRuleCountLabel.Da8Z_D8r.chunk.js"
496
+ "_TransactionEdit.B8zxhADY.chunk.js",
497
+ "_TransactionList.GFXgY-MF.chunk.js",
498
+ "_ScheduleEditForm.evSfaxQI.chunk.js",
499
+ "_NotesTagFormatter.mWj1X9sH.chunk.js",
500
+ "_PayeeRuleCountLabel.CVTtdkff.chunk.js"
501
501
  ]
502
502
  },
503
503
  "src/components/responsive/wide.ts": {
504
- "file": "static/js/wide.BkOYakX3.chunk.js",
504
+ "file": "static/js/wide.Bd6K5Iii.chunk.js",
505
505
  "name": "wide",
506
506
  "src": "src/components/responsive/wide.ts",
507
507
  "isDynamicEntry": true,
508
508
  "imports": [
509
509
  "_theme.BTyknj3e.chunk.js",
510
510
  "_months.BlbIqvQw.chunk.js",
511
- "_Value.Dj0m1XtB.chunk.js",
512
- "_columns.CQnMFLik.chunk.js",
513
- "_SchedulesTable.Dyh9bPLs.chunk.js",
511
+ "_Value.BgvcRWEc.chunk.js",
512
+ "_columns.ChRZFQtz.chunk.js",
513
+ "_SchedulesTable.eXAhrUQp.chunk.js",
514
514
  "_DateSelect.CU00ZjsZ.chunk.js",
515
- "_ManageRules.CzaFnFD6.chunk.js",
515
+ "_ManageRules.BU-s9eGL.chunk.js",
516
516
  "_useLocalPref._HwumoTj.chunk.js",
517
- "_TransactionList.jF2UzWDj.chunk.js",
518
- "_NotesTagFormatter.tHcxzGB_.chunk.js",
519
- "_PayeeRuleCountLabel.Da8Z_D8r.chunk.js"
517
+ "_TransactionList.CDuRXR3q.chunk.js",
518
+ "_NotesTagFormatter.mWj1X9sH.chunk.js",
519
+ "_PayeeRuleCountLabel.CVTtdkff.chunk.js"
520
520
  ]
521
521
  },
522
522
  "src/components/tour/TourHost.ts": {
package/build/index.html CHANGED
@@ -118,21 +118,21 @@
118
118
  height: 100%;
119
119
  }
120
120
  </style>
121
- <script type="module" crossorigin src="/static/js/index.Biq-Yl60.js"></script>
121
+ <script type="module" crossorigin src="/static/js/index.DsBVFDvr.js"></script>
122
122
  <link rel="modulepreload" crossorigin href="/static/js/theme.BTyknj3e.chunk.js">
123
123
  <link rel="modulepreload" crossorigin href="/static/js/months.BlbIqvQw.chunk.js">
124
124
  <link rel="modulepreload" crossorigin href="/static/js/client.DD6K4z_-.chunk.js">
125
125
  <link rel="modulepreload" crossorigin href="/static/js/DateSelect.CU00ZjsZ.chunk.js">
126
126
  <link rel="modulepreload" crossorigin href="/static/js/useLocalPref._HwumoTj.chunk.js">
127
- <link rel="modulepreload" crossorigin href="/static/js/Value.Dj0m1XtB.chunk.js">
127
+ <link rel="modulepreload" crossorigin href="/static/js/Value.BgvcRWEc.chunk.js">
128
128
  <link rel="modulepreload" crossorigin href="/static/js/useReducedMotion.Do7liDFh.chunk.js">
129
- <link rel="modulepreload" crossorigin href="/static/js/columns.CQnMFLik.chunk.js">
130
- <link rel="modulepreload" crossorigin href="/static/js/ManageRules.CzaFnFD6.chunk.js">
131
- <link rel="modulepreload" crossorigin href="/static/js/SchedulesTable.Dyh9bPLs.chunk.js">
132
- <link rel="modulepreload" crossorigin href="/static/js/TransactionEdit.B1PQcUs5.chunk.js">
133
- <link rel="modulepreload" crossorigin href="/static/js/useFormatList.B3xplYoK.chunk.js">
129
+ <link rel="modulepreload" crossorigin href="/static/js/columns.ChRZFQtz.chunk.js">
130
+ <link rel="modulepreload" crossorigin href="/static/js/ManageRules.BU-s9eGL.chunk.js">
131
+ <link rel="modulepreload" crossorigin href="/static/js/SchedulesTable.eXAhrUQp.chunk.js">
132
+ <link rel="modulepreload" crossorigin href="/static/js/TransactionEdit.B8zxhADY.chunk.js">
133
+ <link rel="modulepreload" crossorigin href="/static/js/useFormatList.BZPSuDdE.chunk.js">
134
134
  <link rel="modulepreload" crossorigin href="/static/js/TourProvider.jl-mg-lZ.chunk.js">
135
- <link rel="modulepreload" crossorigin href="/static/js/ScheduleEditForm.B0gu2LA3.chunk.js">
135
+ <link rel="modulepreload" crossorigin href="/static/js/ScheduleEditForm.evSfaxQI.chunk.js">
136
136
  <link rel="stylesheet" crossorigin href="/static/css/index.DaMJyE_v.css">
137
137
  <link rel="manifest" href="/manifest.webmanifest"></head>
138
138
  <body>
@@ -1,2 +1,2 @@
1
- import{i as require_react,l as __toESM,n as require_compiler_runtime,r as require_jsx_runtime,t as theme}from"./theme.BTyknj3e.chunk.js";import{Cn as AnimatedLoading,Co as useTranslation,Do as t,En as styles,On as css,To as Trans,Xn as pushModal,ai as useDispatch,at as Text,fo as send,go as setUndoState,mi as addNotification,oi as useSelector,ot as Button,po as sendCatch,st as ButtonWithLoading,wn as View,yi as useAccounts}from"./months.BlbIqvQw.chunk.js";import{Br as useSelectedItems,Cr as SelectCell,Dr as TableHeader,Ir as SelectedProvider,It as describeSchedule,Mt as useFeatureFlag,Qi as Paragraph,Qr as SvgRemove,Rr as useSelected,Sr as Row,Ut as usePayees,Vn as Warning,Wr as Menu,Wt as usePayeesById,X as useSchedules,Yt as useCategories,Zr as SvgSearchAlternate,a as friendlyOp,br as Field,c as mapField,gr as Cell,jn as useSyncServerStatus,jo as useServerURL,ko as useMultiuserEnabled,l as translateRuleStage,o as getAllocationMethods,rt as useContextMenu,s as groupActionsBySplitIndex,t as Value,tt as getNormalisedString,zo as q,zr as useSelectedDispatch}from"./Value.Dj0m1XtB.chunk.js";import{Ht as $f2ff30fde7b014be$export$2e1e1122cf0cba88,Lt as Input,Ut as $f2ff30fde7b014be$export$3ddf2d174ce01153,Vt as SpaceBetween,dt as SvgCheveronRight,nt as SvgDotsHorizontalTriple,pt as SvgCheveronDown,x as Popover,zt as baseInputStyle}from"./DateSelect.CU00ZjsZ.chunk.js";import{f as Link,m as useMetadataPref,o as SvgRightArrow2}from"./useLocalPref._HwumoTj.chunk.js";var import_compiler_runtime=require_compiler_runtime(),import_react=__toESM(require_react()),import_jsx_runtime=require_jsx_runtime(),AuthContext=(0,import_react.createContext)(void 0),AuthProvider=t0=>{let $=(0,import_compiler_runtime.c)(8),{children}=t0,userData=useSelector(_temp$2),serverUrl=useServerURL(),t1;$[0]!==serverUrl||$[1]!==userData?.permission?(t1=permission=>!permission||!serverUrl||userData?.permission?.toUpperCase()===permission?.toUpperCase(),$[0]=serverUrl,$[1]=userData?.permission,$[2]=t1):t1=$[2];let hasPermission=t1,t2;$[3]===hasPermission?t2=$[4]:(t2={hasPermission},$[3]=hasPermission,$[4]=t2);let t3;return $[5]!==children||$[6]!==t2?(t3=(0,import_jsx_runtime.jsx)(AuthContext.Provider,{value:t2,children}),$[5]=children,$[6]=t2,$[7]=t3):t3=$[7],t3},useAuth=()=>{let context=(0,import_react.useContext)(AuthContext);if(context===void 0)throw Error(`useAuth must be used within an AuthProvider`);return context};function _temp$2(state){return state.user.data}var Permissions=function(Permissions){return Permissions.ADMINISTRATOR=`ADMIN`,Permissions}({});function InfiniteScrollWrapper(t0){let $=(0,import_compiler_runtime.c)(9),{loadMore,children}=t0,scrollRef=(0,import_react.useRef)(null),t1;$[0]===loadMore?t1=$[1]:(t1=function(e){loadMore&&Math.abs(e.currentTarget.scrollHeight-e.currentTarget.clientHeight-e.currentTarget.scrollTop)<1&&loadMore()},$[0]=loadMore,$[1]=t1);let onScroll=t1,t2;$[2]===Symbol.for(`react.memo_cache_sentinel`)?(t2={flex:1,outline:`none`,"& .animated .animated-row":{transition:`.25s transform`},marginBottom:-1},$[2]=t2):t2=$[2];let t3;$[3]===Symbol.for(`react.memo_cache_sentinel`)?(t3={maxWidth:`100%`,overflow:`auto`},$[3]=t3):t3=$[3];let t4;$[4]===children?t4=$[5]:(t4=(0,import_jsx_runtime.jsx)(`div`,{children}),$[4]=children,$[5]=t4);let t5;return $[6]!==onScroll||$[7]!==t4?(t5=(0,import_jsx_runtime.jsx)(View,{style:t2,tabIndex:0,"data-testid":`table`,children:(0,import_jsx_runtime.jsx)(View,{innerRef:scrollRef,style:t3,onScroll,children:t4})}),$[6]=onScroll,$[7]=t4,$[8]=t5):t5=$[8],t5}function Search({ref,value,onChange,placeholder,isInModal=!1,width=250,height,style}){let{t}=useTranslation(),[focused,setFocused]=(0,import_react.useState)(!1),clearButtonPadding=((height??24)-8)/2;return(0,import_jsx_runtime.jsxs)(View,{style:{...baseInputStyle,padding:0,flexDirection:`row`,alignItems:`center`,width,height,flex:``,borderColor:isInModal?void 0:`transparent`,backgroundColor:isInModal?void 0:theme.formInputBackground,...style,...focused&&{boxShadow:`0 0 0 1px `+theme.formInputShadowSelected,...isInModal?{}:{backgroundColor:theme.formInputBackgroundSelected}}},children:[(0,import_jsx_runtime.jsx)(SvgSearchAlternate,{style:{width:13,height:13,flexShrink:0,color:value?theme.menuItemTextSelected:`inherit`,margin:5,marginRight:0}}),(0,import_jsx_runtime.jsx)(Input,{ref,value,placeholder,onEscape:()=>onChange(``),onChangeValue:onChange,className:css({width:`100%`,"::placeholder":{color:theme.formInputTextPlaceholder,transition:`color .25s`},"&[data-focused]":isInModal?{}:{"::placeholder":{color:theme.formInputTextPlaceholderSelected}},flex:1,"&, &[data-focused], &[data-hovered]":{border:0,backgroundColor:`transparent`,boxShadow:`none`,color:`inherit`}}),onFocus:()=>{setFocused(!0)},onBlur:()=>{setFocused(!1)}}),value&&(0,import_jsx_runtime.jsx)(View,{title:t(`Clear search term`),children:(0,import_jsx_runtime.jsx)(Button,{variant:`bare`,style:{padding:`${clearButtonPadding}px 8px ${clearButtonPadding}px ${clearButtonPadding}px`},onPress:()=>onChange(``),children:(0,import_jsx_runtime.jsx)(SvgRemove,{style:{width:8,height:8}})})})]})}function isAccountFailedSync(account){let status=account.bank_sync_status;return status!=null&&status!==`ok`&&status!==`pending`&&status!==`sync-requested`}function getFailedSyncError(account){switch(account.bank_sync_status){case`reauth-required`:return account.account_sync_source===`simpleFin`?{type:`INVALID_ACCESS_TOKEN`,code:`INVALID_ACCESS_TOKEN`}:{type:`ITEM_ERROR`,code:`ITEM_LOGIN_REQUIRED`};case`attention-required`:return{type:`ACCOUNT_NEEDS_ATTENTION`,code:`ACCOUNT_NEEDS_ATTENTION`};case`rate-limit-exceeded`:return{type:`RATE_LIMIT_EXCEEDED`,code:`RATE_LIMIT_EXCEEDED`};case`timed-out`:return{type:`TIMED_OUT`,code:`TIMED_OUT`};case`account-missing`:return{type:`ACCOUNT_MISSING`,code:`ACCOUNT_MISSING`};default:return{type:`SYNC_ERROR`,code:`SYNC_ERROR`}}}function _authorize$1(dispatch,{onSuccess,onClose}){dispatch(pushModal({modal:{name:`enablebanking-external-msg`,options:{onMoveExternal:async({aspspId,country,maxConsentValidity,psuType=`personal`,onStateReady})=>{let resp=await sendCatch(`enablebanking-start-auth`,{aspspId,country,redirectUrl:`${window.location.origin}/enablebanking/auth_callback`,maxConsentValidity,psuType});if(resp.error)return{error:`unknown`,message:resp.error.message};let authData=resp.data;if(authData?.error)return{error:`unknown`,message:authData.error};let authUrl=authData?.data?.url??authData?.url,state=authData?.data?.state??authData?.state;if(!authUrl||!state)return{error:`unknown`,message:t(`Missing auth URL or state`)};localStorage.setItem(`enablebanking_auth_state`,state),onStateReady?.(state),window.open(authUrl,`enablebanking-auth`,`width=600,height=700,popup=yes`);try{let pollResp=await sendCatch(`enablebanking-poll-auth`,{state});if(pollResp.error)return pollResp.error.message===`timeout`?{error:`timeout`}:{error:`unknown`,message:pollResp.error.message};let pollData=pollResp.data,pollError=pollData?.data?.error??pollData?.error;return pollError?{error:`unknown`,message:typeof pollError==`string`?pollError:String(pollError)}:{data:{accounts:pollData?.data?.accounts??pollData?.accounts??[]}}}finally{localStorage.getItem(`enablebanking_auth_state`)===state&&localStorage.removeItem(`enablebanking_auth_state`)}},onClose,onSuccess}}}))}async function authorizeBank$1(dispatch,upgradingAccountId){_authorize$1(dispatch,{onSuccess:async data=>{dispatch(pushModal({modal:{name:`select-linked-accounts`,options:{externalAccounts:data.accounts,syncSource:`enableBanking`,upgradingAccountId}}}))}})}function _authorize(dispatch,{onSuccess,onClose}){dispatch(pushModal({modal:{name:`gocardless-external-msg`,options:{onMoveExternal:async({institutionId})=>{let resp=await send(`gocardless-create-web-token`,{institutionId,accessValidForDays:90});if(`error`in resp)return resp;if(`error_code`in resp)return{error:`unknown`,message:resp.error_type};let{link,requisitionId}=resp;return window.Actual.openURLInBrowser(link),send(`gocardless-poll-web-token`,{requisitionId})},onClose,onSuccess}}}))}async function authorizeBank(dispatch,upgradingAccountId){_authorize(dispatch,{onSuccess:async data=>{dispatch(pushModal({modal:{name:`select-linked-accounts`,options:{externalAccounts:data.accounts,requisitionId:data.id,syncSource:`goCardless`,upgradingAccountId}}}))}})}function BuiltInProviders({providers,syncServerStatus,permissionWarning,isCollapsed=!1,onToggleCollapse}){let{t}=useTranslation(),Cheveron=isCollapsed?SvgCheveronRight:SvgCheveronDown,title=(0,import_jsx_runtime.jsx)(Text,{style:{fontSize:20,fontWeight:600},children:(0,import_jsx_runtime.jsx)(Trans,{children:`Providers`})});return onToggleCollapse&&isCollapsed?(0,import_jsx_runtime.jsxs)(Button,{variant:`bare`,"aria-expanded":!1,onPress:onToggleCollapse,style:{alignSelf:`flex-start`},children:[title,(0,import_jsx_runtime.jsx)(Cheveron,{width:20,height:20,style:{marginLeft:5}})]}):(0,import_jsx_runtime.jsxs)(View,{style:{gap:12},children:[(0,import_jsx_runtime.jsxs)(View,{style:{gap:4},children:[onToggleCollapse?(0,import_jsx_runtime.jsxs)(Button,{variant:`bare`,"aria-expanded":!0,onPress:onToggleCollapse,style:{alignSelf:`flex-start`},children:[title,(0,import_jsx_runtime.jsx)(Cheveron,{width:20,height:20,style:{marginLeft:5}})]}):title,(0,import_jsx_runtime.jsx)(Paragraph,{style:{fontSize:15,color:theme.pageTextSubdued},children:(0,import_jsx_runtime.jsx)(Trans,{children:`Set up a bank sync provider, then link new accounts or connect an existing Actual account.`})})]}),syncServerStatus===`online`?(0,import_jsx_runtime.jsx)(View,{style:{display:`grid`,gridTemplateColumns:`repeat(auto-fit, minmax(260px, 1fr))`,gap:12},children:providers.map(provider=>(0,import_jsx_runtime.jsxs)(View,{"data-testid":`bank-sync-provider-${provider.id}`,style:{border:`1px solid ${theme.tableBorder}`,borderRadius:8,padding:16,backgroundColor:theme.tableBackground,gap:16},children:[(0,import_jsx_runtime.jsxs)(View,{style:{flexDirection:`row`,justifyContent:`space-between`,alignItems:`flex-start`,gap:12},children:[(0,import_jsx_runtime.jsxs)(View,{style:{gap:6,flex:1},children:[(0,import_jsx_runtime.jsxs)(View,{style:{flexDirection:`row`,alignItems:`center`,gap:8,flexWrap:`wrap`},children:[(0,import_jsx_runtime.jsx)(Text,{style:{fontSize:17,fontWeight:600},children:provider.displayName}),provider.isConfigured&&provider.credentialSource&&(0,import_jsx_runtime.jsx)(Text,{style:{alignSelf:`flex-start`,borderRadius:999,backgroundColor:theme.buttonPrimaryBackground,color:theme.buttonPrimaryText,fontSize:12,fontWeight:500,padding:`2px 8px`},children:provider.credentialSource===`global`?(0,import_jsx_runtime.jsx)(Trans,{children:`global`}):(0,import_jsx_runtime.jsx)(Trans,{children:`this budget only`})})]}),(0,import_jsx_runtime.jsx)(Text,{style:{color:provider.isConfigured?theme.noticeTextDark:theme.pageTextSubdued,fontSize:13,fontWeight:500},children:provider.isConfigured?(0,import_jsx_runtime.jsx)(Trans,{children:`Configured`}):(0,import_jsx_runtime.jsx)(Trans,{children:`Not configured`})})]}),provider.isConfigured&&(0,import_jsx_runtime.jsxs)($f2ff30fde7b014be$export$2e1e1122cf0cba88,{children:[(0,import_jsx_runtime.jsx)(Button,{variant:`bare`,"aria-label":t(`{{provider}} menu`,{provider:provider.displayName}),children:(0,import_jsx_runtime.jsx)(SvgDotsHorizontalTriple,{width:15,height:15,style:{transform:`rotateZ(90deg)`}})}),(0,import_jsx_runtime.jsx)(Popover,{children:(0,import_jsx_runtime.jsx)($f2ff30fde7b014be$export$3ddf2d174ce01153,{children:(0,import_jsx_runtime.jsx)(Menu,{onMenuSelect:item=>{item===`reconfigure`&&provider.onReset()},items:[{name:`reconfigure`,text:t(`Reset {{provider}} credentials`,{provider:provider.displayName})}]})})})]})]}),(0,import_jsx_runtime.jsxs)(View,{style:{flexDirection:`row`,justifyContent:`flex-end`,alignItems:`center`,gap:8,flexWrap:`wrap`},children:[(0,import_jsx_runtime.jsx)(Button,{variant:`bare`,isDisabled:!provider.canConfigure,onPress:()=>provider.onConfigure(),children:provider.isConfigured?(0,import_jsx_runtime.jsx)(Trans,{children:`Edit setup`}):(0,import_jsx_runtime.jsx)(Trans,{children:`Set up`})}),(0,import_jsx_runtime.jsx)(ButtonWithLoading,{variant:`primary`,isDisabled:!provider.isConfigured,isLoading:provider.isLoading,onPress:()=>provider.onLink(),children:(0,import_jsx_runtime.jsx)(Trans,{children:`Link bank account`})})]}),provider.supportsPerBudgetFile&&provider.credentialSource===`global`&&!provider.canConfigure&&(0,import_jsx_runtime.jsx)(Text,{style:{color:theme.pageTextSubdued,fontSize:13},children:(0,import_jsx_runtime.jsx)(Trans,{children:`Reset credentials before setting credentials for this budget file.`})})]},provider.id))}):(0,import_jsx_runtime.jsxs)(View,{style:{border:`1px solid ${theme.tableBorder}`,borderRadius:8,padding:16,backgroundColor:theme.tableBackground},children:[(0,import_jsx_runtime.jsx)(Button,{isDisabled:!0,style:{padding:`10px 0`,fontSize:15},children:(0,import_jsx_runtime.jsx)(Trans,{children:`Set up bank sync`})}),(0,import_jsx_runtime.jsx)(Paragraph,{style:{fontSize:15,marginTop:10},children:(0,import_jsx_runtime.jsxs)(Trans,{children:[`Connect to an Actual server to set up`,` `,(0,import_jsx_runtime.jsx)(Link,{variant:`external`,to:`https://actualbudget.org/docs/advanced/bank-sync`,linkColor:`muted`,children:`automatic syncing`}),`.`]})})]}),permissionWarning&&(0,import_jsx_runtime.jsx)(Warning,{children:permissionWarning===`file-owner`?(0,import_jsx_runtime.jsx)(Trans,{children:`You don't have the required permissions to configure all bank sync providers. You can set up Pluggy.ai because you are the owner of this budget file.`}):(0,import_jsx_runtime.jsx)(Trans,{children:`You don't have the required permissions to configure bank sync providers. Please contact an Admin.`})})]})}function useAkahuStatus(t0){let $=(0,import_compiler_runtime.c)(7),enabled=t0===void 0||t0,[configuredAkahu,setConfiguredAkahu]=(0,import_react.useState)(null),[isLoading,setIsLoading]=(0,import_react.useState)(!1),status=useSyncServerStatus(),t1,t2;$[0]!==enabled||$[1]!==status?(t1=()=>{enabled&&status===`online`&&async function(){setIsLoading(!0);let results=await send(`akahu-status`);setConfiguredAkahu(results.configured||!1),setIsLoading(!1)}()},t2=[status,enabled],$[0]=enabled,$[1]=status,$[2]=t1,$[3]=t2):(t1=$[2],t2=$[3]),(0,import_react.useEffect)(t1,t2);let t3;return $[4]!==configuredAkahu||$[5]!==isLoading?(t3={configuredAkahu,isLoading},$[4]=configuredAkahu,$[5]=isLoading,$[6]=t3):t3=$[6],t3}function useCurrentAccess(){let $=(0,import_compiler_runtime.c)(12),[cloudFileId]=useMetadataPref(`cloudFileId`),allFiles=useSelector(_temp$1),userData=useSelector(_temp2$1),{hasPermission}=useAuth(),multiuserEnabled=useMultiuserEnabled(),t0;if($[0]!==allFiles||$[1]!==cloudFileId){let t1;$[3]===cloudFileId?t1=$[4]:(t1=file=>(file.state===`remote`||file.state===`synced`||file.state===`detached`)&&file.cloudFileId===cloudFileId,$[3]=cloudFileId,$[4]=t1),t0=allFiles.find(t1),$[0]=allFiles,$[1]=cloudFileId,$[2]=t0}else t0=$[2];let currentFile=t0,t1;$[5]!==hasPermission||$[6]!==multiuserEnabled?(t1=!multiuserEnabled||hasPermission(Permissions.ADMINISTRATOR),$[5]=hasPermission,$[6]=multiuserEnabled,$[7]=t1):t1=$[7];let t2=!!(userData?.userId&&currentFile?.owner===userData.userId),t3;return $[8]!==cloudFileId||$[9]!==t1||$[10]!==t2?(t3={cloudFileId,isAdmin:t1,isFileOwner:t2},$[8]=cloudFileId,$[9]=t1,$[10]=t2,$[11]=t3):t3=$[11],t3}function _temp2$1(state_0){return state_0.user.data}function _temp$1(state){return state.budgetfiles.allFiles||[]}function useEnableBankingStatus(enabled=!0){let[configuredEnableBanking,setConfiguredEnableBanking]=(0,import_react.useState)(null),[isLoading,setIsLoading]=(0,import_react.useState)(!0),status=useSyncServerStatus();return(0,import_react.useEffect)(()=>{if(!enabled)return;async function fetch(){setIsLoading(!0);try{let results=await send(`enablebanking-status`);setConfiguredEnableBanking(results.configured||!1)}catch{setConfiguredEnableBanking(!1)}finally{setIsLoading(!1)}}status===`online`&&fetch()},[status,enabled]),{configuredEnableBanking,isLoading}}function useGoCardlessStatus(){let $=(0,import_compiler_runtime.c)(6),[configuredGoCardless,setConfiguredGoCardless]=(0,import_react.useState)(null),[isLoading,setIsLoading]=(0,import_react.useState)(!1),status=useSyncServerStatus(),t0,t1;$[0]===status?(t0=$[1],t1=$[2]):(t0=()=>{status===`online`&&async function(){setIsLoading(!0);let results=await send(`gocardless-status`);setConfiguredGoCardless(results.configured||!1),setIsLoading(!1)}()},t1=[status],$[0]=status,$[1]=t0,$[2]=t1),(0,import_react.useEffect)(t0,t1);let t2;return $[3]!==configuredGoCardless||$[4]!==isLoading?(t2={configuredGoCardless,isLoading},$[3]=configuredGoCardless,$[4]=isLoading,$[5]=t2):t2=$[5],t2}function usePluggyAiStatus(){let $=(0,import_compiler_runtime.c)(7),t0;$[0]===Symbol.for(`react.memo_cache_sentinel`)?(t0={},$[0]=t0):t0=$[0];let[pluggyAiStatus,setPluggyAiStatus]=(0,import_react.useState)(t0),[isLoading,setIsLoading]=(0,import_react.useState)(!1),status=useSyncServerStatus(),t1,t2;$[1]===status?(t1=$[2],t2=$[3]):(t1=()=>{let fetch=async function(){setIsLoading(!0);let results=await send(`pluggyai-status`);setPluggyAiStatus(results),setIsLoading(!1)};if(status!==`online`){setPluggyAiStatus({});return}fetch()},t2=[status],$[1]=status,$[2]=t1,$[3]=t2),(0,import_react.useEffect)(t1,t2);let t3;return $[4]!==isLoading||$[5]!==pluggyAiStatus?(t3={pluggyAiStatus,setPluggyAiStatus,isLoading},$[4]=isLoading,$[5]=pluggyAiStatus,$[6]=t3):t3=$[6],t3}function useSimpleFinStatus(){let $=(0,import_compiler_runtime.c)(6),[configuredSimpleFin,setConfiguredSimpleFin]=(0,import_react.useState)(null),[isLoading,setIsLoading]=(0,import_react.useState)(!1),status=useSyncServerStatus(),t0,t1;$[0]===status?(t0=$[1],t1=$[2]):(t0=()=>{status===`online`&&async function(){setIsLoading(!0);let results=await send(`simplefin-status`);setConfiguredSimpleFin(results.configured||!1),setIsLoading(!1)}()},t1=[status],$[0]=status,$[1]=t0,$[2]=t1),(0,import_react.useEffect)(t0,t1);let t2;return $[3]!==configuredSimpleFin||$[4]!==isLoading?(t2={configuredSimpleFin,isLoading},$[3]=configuredSimpleFin,$[4]=isLoading,$[5]=t2):t2=$[5],t2}var BUILT_IN_BANK_SYNC_PROVIDERS=[`goCardless`,`simpleFin`,`pluggyai`],SYNC_PROVIDER_KEYS=[...BUILT_IN_BANK_SYNC_PROVIDERS,`enableBanking`,`akahu`,`unlinked`],syncProviderKeysSet=new Set(SYNC_PROVIDER_KEYS);function isSyncProvider(value){return syncProviderKeysSet.has(value)}function getSyncSourceReadable(translate){return{goCardless:`GoCardless`,simpleFin:`SimpleFIN`,pluggyai:`Pluggy.ai`,enableBanking:`Enable Banking`,akahu:`Akahu`,unlinked:translate(`Unlinked`)}}function groupBankSyncAccounts(accounts){let groupedAccounts={};for(let account of accounts){if(account.closed)continue;let syncSource=account.account_sync_source??`unlinked`,existingAccounts=groupedAccounts[syncSource];existingAccounts?existingAccounts.push(account):groupedAccounts[syncSource]=[account]}let sortedEntries=Object.entries(groupedAccounts).filter(entry=>isSyncProvider(entry[0])&&entry[1]!=null).sort(([keyA],[keyB])=>keyA===`unlinked`?1:keyB===`unlinked`?-1:keyA.localeCompare(keyB)),sortedAccounts={};for(let[syncSource,providerAccounts]of sortedEntries)sortedAccounts[syncSource]=providerAccounts;return sortedAccounts}function getGroupedBankSyncEntries(groupedAccounts){return Object.entries(groupedAccounts).filter(entry=>isSyncProvider(entry[0])&&entry[1]!=null)}function getPermissionWarning(syncServerStatus,isAdmin,isFileOwner){return syncServerStatus!==`online`||isAdmin?null:isFileOwner?`file-owner`:`general`}async function ensureSuccessResponse(response,fallbackMessage){if(response?.error_code)throw Error(response.reason||response.error_code);if(response?.error)throw Error(response.reason||response.error||fallbackMessage)}function useBuiltInBankSyncProviders({upgradingAccountId}={}){let{t}=useTranslation(),dispatch=useDispatch(),syncServerStatus=useSyncServerStatus(),{cloudFileId,isAdmin,isFileOwner}=useCurrentAccess(),canConfigureProviders=isAdmin,[isGoCardlessSetupComplete,setIsGoCardlessSetupComplete]=(0,import_react.useState)(null),[isSimpleFinSetupComplete,setIsSimpleFinSetupComplete]=(0,import_react.useState)(null),[isEnableBankingSetupComplete,setIsEnableBankingSetupComplete]=(0,import_react.useState)(null),[isAkahuSetupComplete,setIsAkahuSetupComplete]=(0,import_react.useState)(null),[loadingSimpleFinAccounts,setLoadingSimpleFinAccounts]=(0,import_react.useState)(!1),[loadingAkahuAccounts,setLoadingAkahuAccounts]=(0,import_react.useState)(!1),enableBankingEnabled=useFeatureFlag(`enableBanking`),akahuEnabled=useFeatureFlag(`akahuBankSync`),{configuredGoCardless}=useGoCardlessStatus(),{configuredSimpleFin}=useSimpleFinStatus(),{pluggyAiStatus,setPluggyAiStatus}=usePluggyAiStatus(),{configuredAkahu}=useAkahuStatus(akahuEnabled),{configuredEnableBanking,isLoading:isEnableBankingLoading}=useEnableBankingStatus(enableBankingEnabled);(0,import_react.useEffect)(()=>{setIsGoCardlessSetupComplete(configuredGoCardless)},[configuredGoCardless]),(0,import_react.useEffect)(()=>{setIsSimpleFinSetupComplete(configuredSimpleFin)},[configuredSimpleFin]),(0,import_react.useEffect)(()=>{setIsEnableBankingSetupComplete(configuredEnableBanking)},[configuredEnableBanking]),(0,import_react.useEffect)(()=>{setIsAkahuSetupComplete(configuredAkahu)},[configuredAkahu]);let onGoCardlessInit=(0,import_react.useCallback)(()=>{dispatch(pushModal({modal:{name:`gocardless-init`,options:{onSuccess:()=>setIsGoCardlessSetupComplete(!0)}}}))},[dispatch]),onSimpleFinInit=(0,import_react.useCallback)(()=>{dispatch(pushModal({modal:{name:`simplefin-init`,options:{onSuccess:()=>setIsSimpleFinSetupComplete(!0)}}}))},[dispatch]),onPluggyAiInit=(0,import_react.useCallback)(()=>{dispatch(pushModal({modal:{name:`pluggyai-init`,options:{onSuccess:perBudgetFile=>{setPluggyAiStatus({configured:!0,source:perBudgetFile?`per-budget-file`:`global`})},credentialSource:pluggyAiStatus.source??`global`}}}))},[dispatch,pluggyAiStatus.source,setPluggyAiStatus]),onEnableBankingInit=(0,import_react.useCallback)(()=>{dispatch(pushModal({modal:{name:`enablebanking-init`,options:{onSuccess:()=>setIsEnableBankingSetupComplete(!0)}}}))},[dispatch]),onAkahuInit=(0,import_react.useCallback)(()=>{dispatch(pushModal({modal:{name:`akahu-init`,options:{onSuccess:()=>setIsAkahuSetupComplete(!0)}}}))},[dispatch]),notifyResetFailure=(0,import_react.useCallback)((providerName,error)=>{dispatch(addNotification({notification:{type:`error`,title:t(`Failed to reset {{provider}}`,{provider:providerName}),message:error instanceof Error?error.message:String(error),timeout:5e3}}))},[dispatch,t]),onGoCardlessReset=(0,import_react.useCallback)(async()=>{try{await ensureSuccessResponse(await send(`secret-set`,{name:`gocardless_secretId`,value:null}),`Failed to clear GoCardless secret ID`),await ensureSuccessResponse(await send(`secret-set`,{name:`gocardless_secretKey`,value:null}),`Failed to clear GoCardless secret key`),setIsGoCardlessSetupComplete(!1)}catch(error_0){notifyResetFailure(`GoCardless`,error_0)}},[notifyResetFailure]),onSimpleFinReset=(0,import_react.useCallback)(async()=>{try{await ensureSuccessResponse(await send(`secret-set`,{name:`simplefin_token`,value:null}),`Failed to clear SimpleFIN token`),await ensureSuccessResponse(await send(`secret-set`,{name:`simplefin_accessKey`,value:null}),`Failed to clear SimpleFIN access key`),setIsSimpleFinSetupComplete(!1)}catch(error_1){notifyResetFailure(`SimpleFIN`,error_1)}},[notifyResetFailure]),onPluggyAiReset=(0,import_react.useCallback)(async()=>{try{let fileId=pluggyAiStatus.source===`per-budget-file`?cloudFileId:null;if(pluggyAiStatus.source===`per-budget-file`&&!fileId)throw Error(t(`Budget file ID is required.`));await ensureSuccessResponse(await send(`secret-set`,{name:`pluggyai_clientId`,value:null,fileId}),`Failed to clear Pluggy.ai client ID`),await ensureSuccessResponse(await send(`secret-set`,{name:`pluggyai_clientSecret`,value:null,fileId}),`Failed to clear Pluggy.ai client secret`),await ensureSuccessResponse(await send(`secret-set`,{name:`pluggyai_itemIds`,value:null,fileId}),`Failed to clear Pluggy.ai item IDs`),setPluggyAiStatus(await send(`pluggyai-status`))}catch(error_2){notifyResetFailure(`Pluggy.ai`,error_2)}},[cloudFileId,notifyResetFailure,pluggyAiStatus.source,setPluggyAiStatus,t]),onEnableBankingReset=(0,import_react.useCallback)(async()=>{try{await ensureSuccessResponse(await send(`secret-set`,{name:`enablebanking_applicationId`,value:null}),`Failed to clear Enable Banking application ID`),await ensureSuccessResponse(await send(`secret-set`,{name:`enablebanking_secretKey`,value:null}),`Failed to clear Enable Banking secret key`),setIsEnableBankingSetupComplete(!1)}catch(error_3){notifyResetFailure(`Enable Banking`,error_3)}},[notifyResetFailure]),onAkahuReset=(0,import_react.useCallback)(async()=>{try{await ensureSuccessResponse(await send(`secret-set`,{name:`akahu_userToken`,value:null}),`Failed to clear Akahu user token`),await ensureSuccessResponse(await send(`secret-set`,{name:`akahu_appToken`,value:null}),`Failed to clear Akahu app token`),setIsAkahuSetupComplete(!1)}catch(error_4){console.log(error_4),notifyResetFailure(`Akahu`,error_4)}},[notifyResetFailure]),onConnectGoCardless=(0,import_react.useCallback)(()=>{if(!isGoCardlessSetupComplete){onGoCardlessInit();return}authorizeBank(dispatch,upgradingAccountId)},[dispatch,isGoCardlessSetupComplete,onGoCardlessInit,upgradingAccountId]),onConnectSimpleFin=(0,import_react.useCallback)(async()=>{if(!isSimpleFinSetupComplete){onSimpleFinInit();return}if(!loadingSimpleFinAccounts){setLoadingSimpleFinAccounts(!0);try{let results=await send(`simplefin-accounts`);if(results.error_code===`INVALID_ACCESS_TOKEN`){onSimpleFinInit();return}if(results.error_code)throw Error(results.reason||results.error_code);if(`error`in results&&results.error)throw Error(results.reason||results.error);let externalAccounts=(results.accounts??[]).map(oldAccount=>({account_id:oldAccount.id,name:oldAccount.name,institution:oldAccount.org.name,orgDomain:oldAccount.org.domain,orgId:oldAccount.org.id,balance:oldAccount.balance}));dispatch(pushModal({modal:{name:`select-linked-accounts`,options:{externalAccounts,syncSource:`simpleFin`,upgradingAccountId}}}))}catch(error_5){dispatch(addNotification({notification:{type:`error`,title:t(`Error when trying to contact SimpleFIN`),message:error_5 instanceof Error?error_5.message:String(error_5),timeout:5e3}}))}finally{setLoadingSimpleFinAccounts(!1)}}},[dispatch,isSimpleFinSetupComplete,loadingSimpleFinAccounts,onSimpleFinInit,t,upgradingAccountId]),onConnectEnableBanking=(0,import_react.useCallback)(async()=>{if(!isEnableBankingSetupComplete){onEnableBankingInit();return}try{await authorizeBank$1(dispatch,upgradingAccountId)}catch(error_6){dispatch(addNotification({notification:{type:`error`,title:t(`Error when trying to contact Enable Banking`),message:error_6 instanceof Error?error_6.message:String(error_6),timeout:5e3}})),onEnableBankingInit()}},[dispatch,isEnableBankingSetupComplete,onEnableBankingInit,t,upgradingAccountId]),onConnectPluggyAi=(0,import_react.useCallback)(async()=>{if(!pluggyAiStatus.configured){onPluggyAiInit();return}try{let results_0=await send(`pluggyai-accounts`);if(results_0.error_code)throw Error(results_0.reason);if(`error`in results_0)throw Error(results_0.error);let externalAccounts_0=results_0.accounts.map(oldAccount_0=>({account_id:oldAccount_0.id,name:`${oldAccount_0.name.trim()} - ${oldAccount_0.type===`BANK`?oldAccount_0.taxNumber:oldAccount_0.owner}`,institution:oldAccount_0.name,orgDomain:null,orgId:oldAccount_0.id,balance:oldAccount_0.type===`BANK`?oldAccount_0.bankData.automaticallyInvestedBalance+oldAccount_0.bankData.closingBalance:oldAccount_0.balance}));dispatch(pushModal({modal:{name:`select-linked-accounts`,options:{externalAccounts:externalAccounts_0,syncSource:`pluggyai`,upgradingAccountId}}}))}catch(error_7){dispatch(addNotification({notification:{type:`error`,title:t(`Error when trying to contact Pluggy.ai`),message:error_7 instanceof Error?error_7.message:String(error_7),timeout:5e3}})),onPluggyAiInit()}},[dispatch,onPluggyAiInit,pluggyAiStatus.configured,t,upgradingAccountId]),onConnectAkahu=(0,import_react.useCallback)(async()=>{if(!isAkahuSetupComplete){onAkahuInit();return}if(!loadingAkahuAccounts){setLoadingAkahuAccounts(!0);try{let results_1=await send(`akahu-accounts`);if(results_1.error_code)throw Error(results_1.reason);if(`error`in results_1&&results_1.error)throw Error(results_1.reason||results_1.error);let newAccounts=[];for(let oldAccount_1 of results_1.accounts??[]){let newAccount={account_id:oldAccount_1._id,name:oldAccount_1.name,institution:oldAccount_1.connection.name,orgDomain:oldAccount_1.connection.name,orgId:oldAccount_1.connection._id,balance:oldAccount_1.balance.current};newAccounts.push(newAccount)}dispatch(pushModal({modal:{name:`select-linked-accounts`,options:{externalAccounts:newAccounts,syncSource:`akahu`,upgradingAccountId}}}))}catch(error_8){dispatch(addNotification({notification:{type:`error`,title:t(`Error when trying to contact Akahu`),message:error_8 instanceof Error?error_8.message:String(error_8),timeout:5e3}})),onAkahuInit()}setLoadingAkahuAccounts(!1)}},[dispatch,isAkahuSetupComplete,loadingAkahuAccounts,onAkahuInit,upgradingAccountId,t]),configuredProviders={goCardless:!!isGoCardlessSetupComplete,simpleFin:!!isSimpleFinSetupComplete,pluggyai:!!pluggyAiStatus.configured,enableBanking:!!isEnableBankingSetupComplete,akahu:!!isAkahuSetupComplete};return{providers:(0,import_react.useMemo)(()=>{let baseProviders=BUILT_IN_BANK_SYNC_PROVIDERS.map(providerId=>providerId===`goCardless`?{id:providerId,displayName:`GoCardless`,description:t(`Link a European bank account to automatically download transactions.`),isConfigured:configuredProviders.goCardless,credentialSource:`global`,supportsPerBudgetFile:!1,canConfigure:canConfigureProviders,onConfigure:onGoCardlessInit,onLink:onConnectGoCardless,onReset:onGoCardlessReset}:providerId===`simpleFin`?{id:providerId,displayName:`SimpleFIN`,description:t(`Link a North American bank account to automatically download transactions.`),isConfigured:configuredProviders.simpleFin,credentialSource:`global`,supportsPerBudgetFile:!1,canConfigure:canConfigureProviders,isLoading:loadingSimpleFinAccounts,onConfigure:onSimpleFinInit,onLink:onConnectSimpleFin,onReset:onSimpleFinReset}:{id:providerId,displayName:`Pluggy.ai`,description:t(`Link a Brazilian bank account to automatically download transactions.`),isConfigured:configuredProviders.pluggyai,credentialSource:pluggyAiStatus.source??`global`,supportsPerBudgetFile:!0,canConfigure:syncServerStatus===`online`&&(isAdmin||isFileOwner&&pluggyAiStatus.source!==`global`),onConfigure:onPluggyAiInit,onLink:onConnectPluggyAi,onReset:onPluggyAiReset});return akahuEnabled&&baseProviders.push({id:`akahu`,displayName:`Akahu`,description:t(`Link a New Zealand bank account to automatically download transactions.`),isConfigured:configuredProviders.akahu,credentialSource:`global`,supportsPerBudgetFile:!1,canConfigure:canConfigureProviders,isLoading:loadingAkahuAccounts,onConfigure:onAkahuInit,onLink:onConnectAkahu,onReset:onAkahuReset}),enableBankingEnabled&&baseProviders.push({id:`enableBanking`,displayName:`Enable Banking`,description:t(`Link a European bank account via Enable Banking, a free alternative to GoCardless for PSD2-supported banks.`),isConfigured:configuredProviders.enableBanking,credentialSource:`global`,supportsPerBudgetFile:!1,canConfigure:canConfigureProviders,isLoading:isEnableBankingLoading,onConfigure:onEnableBankingInit,onLink:onConnectEnableBanking,onReset:onEnableBankingReset}),baseProviders},[canConfigureProviders,isAdmin,isFileOwner,configuredProviders.enableBanking,configuredProviders.goCardless,configuredProviders.pluggyai,configuredProviders.simpleFin,configuredProviders.akahu,pluggyAiStatus,syncServerStatus,enableBankingEnabled,akahuEnabled,isEnableBankingLoading,loadingSimpleFinAccounts,loadingAkahuAccounts,onConnectAkahu,onConnectEnableBanking,onConnectGoCardless,onConnectPluggyAi,onConnectSimpleFin,onAkahuInit,onAkahuReset,onEnableBankingInit,onEnableBankingReset,onGoCardlessInit,onGoCardlessReset,onPluggyAiInit,onPluggyAiReset,onSimpleFinInit,onSimpleFinReset,t]),syncServerStatus,permissionWarning:getPermissionWarning(syncServerStatus,isAdmin,isFileOwner)}}function RulesHeader(){let $=(0,import_compiler_runtime.c)(18),{t}=useTranslation(),selectedItems=useSelectedItems(),dispatchSelected=useSelectedDispatch(),t0;$[0]===Symbol.for(`react.memo_cache_sentinel`)?(t0={},$[0]=t0):t0=$[0];let t1=selectedItems.size>0,t2;$[1]===dispatchSelected?t2=$[2]:(t2=e=>dispatchSelected({type:`select-all`,isRangeSelect:e.shiftKey}),$[1]=dispatchSelected,$[2]=t2);let t3;$[3]!==t1||$[4]!==t2?(t3=(0,import_jsx_runtime.jsx)(SelectCell,{exposed:!0,focused:!1,selected:t1,onSelect:t2}),$[3]=t1,$[4]=t2,$[5]=t3):t3=$[5];let t4;$[6]===t?t4=$[7]:(t4=t(`Stage`),$[6]=t,$[7]=t4);let t5;$[8]===t4?t5=$[9]:(t5=(0,import_jsx_runtime.jsx)(Cell,{value:t4,width:50}),$[8]=t4,$[9]=t5);let t6;$[10]===t?t6=$[11]:(t6=t(`Rule`),$[10]=t,$[11]=t6);let t7;$[12]===t6?t7=$[13]:(t7=(0,import_jsx_runtime.jsx)(Cell,{value:t6,width:`flex`}),$[12]=t6,$[13]=t7);let t8;return $[14]!==t3||$[15]!==t5||$[16]!==t7?(t8=(0,import_jsx_runtime.jsxs)(TableHeader,{style:t0,children:[t3,t5,t7]}),$[14]=t3,$[15]=t5,$[16]=t7,$[17]=t8):t8=$[17],t8}function ScheduleValue({value}){let{t}=useTranslation(),{data:byId={}}=usePayeesById(),{schedules=[],isLoading}=useSchedules({query:(0,import_react.useMemo)(()=>q(`schedules`).select(`*`),[])});if(isLoading)return(0,import_jsx_runtime.jsx)(View,{"aria-label":t(`Loading...`),style:{display:`inline-flex`},children:(0,import_jsx_runtime.jsx)(AnimatedLoading,{width:10,height:10})});let schedule=schedules.find(item=>item.id===value);return(0,import_jsx_runtime.jsx)(Value,{value:schedule?describeSchedule(schedule,byId[schedule._payee]):t(`(deleted)`),field:`notes`,valueIsRaw:!0})}var valueStyle$1={color:theme.pillTextHighlighted};function ActionExpression(t0){let $=(0,import_compiler_runtime.c)(10),props,style;$[0]===t0?(props=$[1],style=$[2]):({style,...props}=t0,$[0]=t0,$[1]=props,$[2]=style);let t1;$[3]===style?t1=$[4]:(t1={display:`block`,maxWidth:`100%`,color:theme.pillText,backgroundColor:theme.pillBackgroundLight,borderRadius:4,padding:`3px 5px`,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`,...style},$[3]=style,$[4]=t1);let t2;$[5]===props?t2=$[6]:(t2=props.op===`set`?(0,import_jsx_runtime.jsx)(SetActionExpression,{...props}):props.op===`set-split-amount`?(0,import_jsx_runtime.jsx)(SetSplitAmountActionExpression,{...props}):props.op===`link-schedule`?(0,import_jsx_runtime.jsx)(LinkScheduleActionExpression,{...props}):props.op===`prepend-notes`?(0,import_jsx_runtime.jsx)(PrependNoteActionExpression,{...props}):props.op===`append-notes`?(0,import_jsx_runtime.jsx)(AppendNoteActionExpression,{...props}):props.op===`delete-transaction`?(0,import_jsx_runtime.jsx)(DeleteTransactionActionExpression,{...props}):null,$[5]=props,$[6]=t2);let t3;return $[7]!==t1||$[8]!==t2?(t3=(0,import_jsx_runtime.jsx)(View,{style:t1,children:t2}),$[7]=t1,$[8]=t2,$[9]=t3):t3=$[9],t3}function SetActionExpression(t0){let $=(0,import_compiler_runtime.c)(23),{op,field,value,options}=t0,{t}=useTranslation(),t1;$[0]===op?t1=$[1]:(t1=friendlyOp(op),$[0]=op,$[1]=t1);let t2;$[2]===t1?t2=$[3]:(t2=(0,import_jsx_runtime.jsx)(Text,{children:t1}),$[2]=t1,$[3]=t2);let t3;$[4]!==field||$[5]!==options?(t3=mapField(field,options),$[4]=field,$[5]=options,$[6]=t3):t3=$[6];let t4;$[7]===t3?t4=$[8]:(t4=(0,import_jsx_runtime.jsx)(Text,{style:valueStyle$1,children:t3}),$[7]=t3,$[8]=t4);let t5;$[9]===t?t5=$[10]:(t5=t(`to `),$[9]=t,$[10]=t5);let t6;$[11]===t5?t6=$[12]:(t6=(0,import_jsx_runtime.jsx)(Text,{children:t5}),$[11]=t5,$[12]=t6);let t7;$[13]!==field||$[14]!==options||$[15]!==t||$[16]!==value?(t7=options?.formula?(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Text,{children:t(`formula `)}),(0,import_jsx_runtime.jsx)(Text,{style:valueStyle$1,children:options.formula})]}):options?.template?(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Text,{children:t(`template `)}),(0,import_jsx_runtime.jsx)(Text,{style:valueStyle$1,children:options.template})]}):(0,import_jsx_runtime.jsx)(Value,{style:valueStyle$1,value,field}),$[13]=field,$[14]=options,$[15]=t,$[16]=value,$[17]=t7):t7=$[17];let t8;return $[18]!==t2||$[19]!==t4||$[20]!==t6||$[21]!==t7?(t8=(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[t2,` `,t4,` `,t6,t7]}),$[18]=t2,$[19]=t4,$[20]=t6,$[21]=t7,$[22]=t8):t8=$[22],t8}function SetSplitAmountActionExpression(t0){let $=(0,import_compiler_runtime.c)(17),{op,value,options}=t0,{t}=useTranslation(),method=options?.method;if(!method)return null;let t1;$[0]===op?t1=$[1]:(t1=friendlyOp(op),$[0]=op,$[1]=t1);let t2;$[2]===t1?t2=$[3]:(t2=(0,import_jsx_runtime.jsx)(Text,{children:t1}),$[2]=t1,$[3]=t2);let t3;$[4]===Symbol.for(`react.memo_cache_sentinel`)?(t3=getAllocationMethods(),$[4]=t3):t3=$[4];let t4=t3[method],t5;$[5]===t4?t5=$[6]:(t5=(0,import_jsx_runtime.jsx)(Text,{style:valueStyle$1,children:t4}),$[5]=t4,$[6]=t5);let t6=method!==`remainder`&&`: `,t7;$[7]!==method||$[8]!==options||$[9]!==t||$[10]!==value?(t7=options?.method===`formula`?(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Text,{children:t(`formula `)}),(0,import_jsx_runtime.jsx)(Text,{style:valueStyle$1,children:options.formula})]}):method===`fixed-amount`?(0,import_jsx_runtime.jsx)(Value,{style:valueStyle$1,value,field:`amount`}):method===`fixed-percent`?(0,import_jsx_runtime.jsxs)(Text,{style:valueStyle$1,children:[value,`%`]}):null,$[7]=method,$[8]=options,$[9]=t,$[10]=value,$[11]=t7):t7=$[11];let t8;return $[12]!==t2||$[13]!==t5||$[14]!==t6||$[15]!==t7?(t8=(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[t2,` `,t5,t6,t7]}),$[12]=t2,$[13]=t5,$[14]=t6,$[15]=t7,$[16]=t8):t8=$[16],t8}function LinkScheduleActionExpression(t0){let $=(0,import_compiler_runtime.c)(9),{op,value}=t0,t1;$[0]===op?t1=$[1]:(t1=friendlyOp(op),$[0]=op,$[1]=t1);let t2;$[2]===t1?t2=$[3]:(t2=(0,import_jsx_runtime.jsx)(Text,{children:t1}),$[2]=t1,$[3]=t2);let t3;$[4]===value?t3=$[5]:(t3=(0,import_jsx_runtime.jsx)(ScheduleValue,{value}),$[4]=value,$[5]=t3);let t4;return $[6]!==t2||$[7]!==t3?(t4=(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[t2,` `,t3]}),$[6]=t2,$[7]=t3,$[8]=t4):t4=$[8],t4}function PrependNoteActionExpression(t0){let $=(0,import_compiler_runtime.c)(9),{op,value}=t0,t1;$[0]===op?t1=$[1]:(t1=friendlyOp(op),$[0]=op,$[1]=t1);let t2;$[2]===t1?t2=$[3]:(t2=(0,import_jsx_runtime.jsx)(Text,{children:t1}),$[2]=t1,$[3]=t2);let t3;$[4]===value?t3=$[5]:(t3=(0,import_jsx_runtime.jsx)(Value,{style:valueStyle$1,value,field:`notes`}),$[4]=value,$[5]=t3);let t4;return $[6]!==t2||$[7]!==t3?(t4=(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[t2,` `,t3]}),$[6]=t2,$[7]=t3,$[8]=t4):t4=$[8],t4}function AppendNoteActionExpression(t0){let $=(0,import_compiler_runtime.c)(9),{op,value}=t0,t1;$[0]===op?t1=$[1]:(t1=friendlyOp(op),$[0]=op,$[1]=t1);let t2;$[2]===t1?t2=$[3]:(t2=(0,import_jsx_runtime.jsx)(Text,{children:t1}),$[2]=t1,$[3]=t2);let t3;$[4]===value?t3=$[5]:(t3=(0,import_jsx_runtime.jsx)(Value,{style:valueStyle$1,value,field:`notes`}),$[4]=value,$[5]=t3);let t4;return $[6]!==t2||$[7]!==t3?(t4=(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[t2,` `,t3]}),$[6]=t2,$[7]=t3,$[8]=t4):t4=$[8],t4}function DeleteTransactionActionExpression(t0){let $=(0,import_compiler_runtime.c)(4),{op}=t0,t1;$[0]===op?t1=$[1]:(t1=friendlyOp(op),$[0]=op,$[1]=t1);let t2;return $[2]===t1?t2=$[3]:(t2=(0,import_jsx_runtime.jsx)(Text,{children:t1}),$[2]=t1,$[3]=t2),t2}var valueStyle={color:theme.pillTextHighlighted};function ConditionExpression(t0){let $=(0,import_compiler_runtime.c)(24),{field,op,value,options,prefix,style,inline}=t0,t1;$[0]===style?t1=$[1]:(t1={display:`block`,maxWidth:`100%`,color:theme.pillText,backgroundColor:theme.pillBackgroundLight,borderRadius:4,padding:`3px 5px`,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`,...style},$[0]=style,$[1]=t1);let t2;$[2]===prefix?t2=$[3]:(t2=prefix&&(0,import_jsx_runtime.jsxs)(Text,{children:[prefix,` `]}),$[2]=prefix,$[3]=t2);let t3;$[4]!==field||$[5]!==options?(t3=mapField(field,options),$[4]=field,$[5]=options,$[6]=t3):t3=$[6];let t4;$[7]===t3?t4=$[8]:(t4=(0,import_jsx_runtime.jsx)(Text,{style:valueStyle,children:t3}),$[7]=t3,$[8]=t4);let t5;$[9]===op?t5=$[10]:(t5=friendlyOp(op),$[9]=op,$[10]=t5);let t6;$[11]===t5?t6=$[12]:(t6=(0,import_jsx_runtime.jsx)(Text,{children:t5}),$[11]=t5,$[12]=t6);let t7;$[13]!==field||$[14]!==inline||$[15]!==op||$[16]!==value?(t7=![`onbudget`,`offbudget`].includes(op?.toLocaleLowerCase())&&(0,import_jsx_runtime.jsx)(Value,{style:valueStyle,value,field,inline}),$[13]=field,$[14]=inline,$[15]=op,$[16]=value,$[17]=t7):t7=$[17];let t8;return $[18]!==t1||$[19]!==t2||$[20]!==t4||$[21]!==t6||$[22]!==t7?(t8=(0,import_jsx_runtime.jsxs)(View,{style:t1,children:[t2,t4,` `,t6,` `,t7]}),$[18]=t1,$[19]=t2,$[20]=t4,$[21]=t6,$[22]=t7,$[23]=t8):t8=$[23],t8}var RuleRow=(0,import_react.memo)(t0=>{let $=(0,import_compiler_runtime.c)(77),{rule,hovered,selected,onHover,onEditRule,onDeleteRule}=t0,dispatchSelected=useSelectedDispatch(),borderColor=selected?theme.tableBorderSelected:`none`,backgroundFocus=hovered,actionSplits=groupActionsBySplitIndex(rule.actions),hasSplits=actionSplits.length>1,t1;$[0]===rule.actions?t1=$[1]:(t1=rule.actions.some(_temp),$[0]=rule.actions,$[1]=t1);let hasSchedule=t1,{t}=useTranslation(),triggerRef=(0,import_react.useRef)(null),t2;$[2]!==onEditRule||$[3]!==rule||$[4]!==t?(t2=onEditRule&&{name:`edit`,text:t(`Edit`),onClick:()=>onEditRule(rule)},$[2]=onEditRule,$[3]=rule,$[4]=t,$[5]=t2):t2=$[5];let t3;$[6]!==hasSchedule||$[7]!==onDeleteRule||$[8]!==rule||$[9]!==t?(t3=onDeleteRule&&!hasSchedule&&{name:`delete`,text:t(`Delete`),onClick:()=>onDeleteRule(rule)},$[6]=hasSchedule,$[7]=onDeleteRule,$[8]=rule,$[9]=t,$[10]=t3):t3=$[10];let t4;$[11]!==t2||$[12]!==t3?(t4={triggerRef,items:[t2,t3]},$[11]=t2,$[12]=t3,$[13]=t4):t4=$[13],useContextMenu(t4);let T0=Row,t6=selected?101:`auto`,t7=selected?theme.tableRowBackgroundHighlight:backgroundFocus?theme.tableRowBackgroundHover:theme.tableBackground,t8;$[14]!==borderColor||$[15]!==t6||$[16]!==t7?(t8={fontSize:13,zIndex:t6,borderColor,backgroundColor:t7},$[14]=borderColor,$[15]=t6,$[16]=t7,$[17]=t8):t8=$[17];let t10;$[18]!==onHover||$[19]!==rule.id?(t10=()=>onHover&&onHover(rule.id),$[18]=onHover,$[19]=rule.id,$[20]=t10):t10=$[20];let t11;$[21]===onHover?t11=$[22]:(t11=()=>onHover&&onHover(null),$[21]=onHover,$[22]=t11);let t12=hovered||selected,t13;$[23]!==dispatchSelected||$[24]!==rule.id?(t13=e=>{dispatchSelected({type:`select`,id:rule.id,isRangeSelect:e.shiftKey})},$[23]=dispatchSelected,$[24]=rule.id,$[25]=t13):t13=$[25];let t14;$[26]!==selected||$[27]!==t12||$[28]!==t13?(t14=(0,import_jsx_runtime.jsx)(SelectCell,{exposed:t12,focused:!0,onSelect:t13,selected}),$[26]=selected,$[27]=t12,$[28]=t13,$[29]=t14):t14=$[29];let t15;$[30]===Symbol.for(`react.memo_cache_sentinel`)?(t15={color:theme.tableText},$[30]=t15):t15=$[30];let t16;$[31]===rule.stage?t16=$[32]:(t16=rule.stage&&(0,import_jsx_runtime.jsx)(View,{style:{alignSelf:`flex-start`,margin:5,backgroundColor:theme.pillBackgroundSelected,color:theme.pillTextSelected,borderRadius:4,padding:`3px 5px`},children:translateRuleStage(rule.stage)}),$[31]=rule.stage,$[32]=t16);let t17;$[33]===t16?t17=$[34]:(t17=(0,import_jsx_runtime.jsx)(Cell,{name:`stage`,width:50,plain:!0,style:t15,children:t16}),$[33]=t16,$[34]=t17);let T1=Field,t19;$[35]===Symbol.for(`react.memo_cache_sentinel`)?(t19={padding:`15px 0`},$[35]=t19):t19=$[35];let T2=SpaceBetween,t21;$[36]===Symbol.for(`react.memo_cache_sentinel`)?(t21={alignItems:`center`},$[36]=t21):t21=$[36];let t22;$[37]===Symbol.for(`react.memo_cache_sentinel`)?(t22={flex:1,alignItems:`flex-start`},$[37]=t22):t22=$[37];let t23;if($[38]!==rule.conditions||$[39]!==rule.conditionsOp){let t24;$[41]===rule.conditionsOp?t24=$[42]:(t24=(cond,i)=>(0,import_jsx_runtime.jsx)(ConditionExpression,{field:cond.field,op:cond.op,inline:!0,value:cond.value,options:cond.options,prefix:i>0?friendlyOp(rule.conditionsOp):null,style:i!==0&&{marginTop:3}},i),$[41]=rule.conditionsOp,$[42]=t24),t23=rule.conditions.map(t24),$[38]=rule.conditions,$[39]=rule.conditionsOp,$[40]=t23}else t23=$[40];let t24;$[43]===t23?t24=$[44]:(t24=(0,import_jsx_runtime.jsx)(View,{style:t22,"data-testid":`conditions`,children:t23}),$[43]=t23,$[44]=t24);let t25;$[45]===Symbol.for(`react.memo_cache_sentinel`)?(t25=(0,import_jsx_runtime.jsx)(Text,{children:(0,import_jsx_runtime.jsx)(SvgRightArrow2,{style:{width:12,height:12,color:theme.tableText}})}),$[45]=t25):t25=$[45];let T3=View,t26;$[46]===Symbol.for(`react.memo_cache_sentinel`)?(t26={flex:1,alignItems:`flex-start`},$[46]=t26):t26=$[46];let t28=hasSplits?actionSplits.map((split,i_0)=>(0,import_jsx_runtime.jsxs)(View,{style:{width:`100%`,display:`flex`,flexDirection:`column`,alignItems:`flex-start`,marginTop:i_0>0?3:0,padding:`5px`,borderColor:theme.tableBorder,borderWidth:`1px`,borderRadius:`5px`},children:[(0,import_jsx_runtime.jsx)(Text,{style:{...styles.smallText,color:theme.pageTextLight,marginBottom:6},children:i_0?t(`Split {{num}}`,{num:i_0}):t(`Apply to all`)}),split.actions.map(_temp2)]},split.id)):rule.actions.map(_temp3),t29;$[47]!==T3||$[48]!==t26||$[49]!==t28?(t29=(0,import_jsx_runtime.jsx)(T3,{style:t26,"data-testid":`actions`,children:t28}),$[47]=T3,$[48]=t26,$[49]=t28,$[50]=t29):t29=$[50];let t30;$[51]!==T2||$[52]!==t21||$[53]!==t24||$[54]!==t25||$[55]!==t29?(t30=(0,import_jsx_runtime.jsxs)(T2,{style:t21,children:[t24,t25,t29]}),$[51]=T2,$[52]=t21,$[53]=t24,$[54]=t25,$[55]=t29,$[56]=t30):t30=$[56];let t31;$[57]!==T1||$[58]!==t19||$[59]!==t30?(t31=(0,import_jsx_runtime.jsx)(T1,{width:`flex`,style:t19,truncate:!1,children:t30}),$[57]=T1,$[58]=t19,$[59]=t30,$[60]=t31):t31=$[60];let t32;$[61]===Symbol.for(`react.memo_cache_sentinel`)?(t32={padding:`0 15px`,paddingLeft:5},$[61]=t32):t32=$[61];let t33;$[62]!==onEditRule||$[63]!==rule?(t33=()=>onEditRule(rule),$[62]=onEditRule,$[63]=rule,$[64]=t33):t33=$[64];let t34;$[65]===Symbol.for(`react.memo_cache_sentinel`)?(t34=(0,import_jsx_runtime.jsx)(Trans,{children:`Edit`}),$[65]=t34):t34=$[65];let t35;$[66]===t33?t35=$[67]:(t35=(0,import_jsx_runtime.jsx)(Cell,{name:`edit`,plain:!0,style:t32,children:(0,import_jsx_runtime.jsx)(Button,{onPress:t33,children:t34})}),$[66]=t33,$[67]=t35);let t36;return $[68]!==T0||$[69]!==t10||$[70]!==t11||$[71]!==t14||$[72]!==t17||$[73]!==t31||$[74]!==t35||$[75]!==t8?(t36=(0,import_jsx_runtime.jsxs)(T0,{ref:triggerRef,height:`auto`,style:t8,collapsed:!0,onMouseEnter:t10,onMouseLeave:t11,children:[t14,t17,t31,t35]}),$[68]=T0,$[69]=t10,$[70]=t11,$[71]=t14,$[72]=t17,$[73]=t31,$[74]=t35,$[75]=t8,$[76]=t36):t36=$[76],t36});RuleRow.displayName=`RuleRow`;function _temp(t0){let{op}=t0;return op===`link-schedule`}function _temp2(action,j){return(0,import_jsx_runtime.jsx)(ActionExpression,{...action,style:j!==0&&{marginTop:3}},j)}function _temp3(action_0,i_1){return(0,import_jsx_runtime.jsx)(ActionExpression,{...action_0,style:i_1!==0&&{marginTop:3}},i_1)}function RulesList(t0){let $=(0,import_compiler_runtime.c)(15),{rules,selectedItems,hoveredRule,onHover,onEditRule,onDeleteRule}=t0;if(rules.length===0)return null;let t1;if($[0]!==hoveredRule||$[1]!==onDeleteRule||$[2]!==onEditRule||$[3]!==onHover||$[4]!==rules||$[5]!==selectedItems){let t2;$[7]!==hoveredRule||$[8]!==onDeleteRule||$[9]!==onEditRule||$[10]!==onHover||$[11]!==selectedItems?(t2=rule=>(0,import_jsx_runtime.jsx)(RuleRow,{rule,hovered:hoveredRule===rule.id,selected:selectedItems.has(rule.id),onHover,onEditRule,onDeleteRule},rule.id),$[7]=hoveredRule,$[8]=onDeleteRule,$[9]=onEditRule,$[10]=onHover,$[11]=selectedItems,$[12]=t2):t2=$[12],t1=rules.map(t2),$[0]=hoveredRule,$[1]=onDeleteRule,$[2]=onEditRule,$[3]=onHover,$[4]=rules,$[5]=selectedItems,$[6]=t1}else t1=$[6];let t2;return $[13]===t1?t2=$[14]:(t2=(0,import_jsx_runtime.jsx)(View,{children:t1}),$[13]=t1,$[14]=t2),t2}function mapValue(field,value,{payees=[],categories=[],accounts=[]}){if(!value)return``;let object=null;if(field===`payee`)object=payees.find(p=>p.id===value);else if(field===`category`)object=categories.find(c=>c.id===value);else if(field===`account`)object=accounts.find(a=>a.id===value);else return value;return object?object.name:`(deleted)`}function ruleToString(rule,data){let conditions=rule.conditions.flatMap(cond=>[mapField(cond.field),friendlyOp(cond.op),(cond.op===`oneOf`||cond.op===`notOneOf`)&&Array.isArray(cond.value)?cond.value.map(v=>mapValue(cond.field,v,data)).join(`, `):mapValue(cond.field,cond.value,data)]),actions=rule.actions.flatMap(action=>{if(action.op===`set`)return[friendlyOp(action.op),mapField(action.field),`to`,mapValue(action.field,action.value,data)];if(action.op===`link-schedule`){let schedule=data.schedules?.find(s=>s.id===String(action.value));return[friendlyOp(action.op),schedule?describeSchedule(schedule,data.payees?.find(p=>p.id===schedule._payee)):`-`]}else if(action.op===`prepend-notes`||action.op===`append-notes`){let noteValue=String(action.value||``);return[friendlyOp(action.op),`“`+noteValue+`”`]}else if(action.op===`delete-transaction`)return[friendlyOp(action.op),`(delete)`];else return[]});return(rule.stage||``)+` `+conditions.join(` `)+` `+actions.join(` `)}function ManageRules({isModal,payeeId,setLoading=()=>{}}){let{t}=useTranslation(),[allRules,setAllRules]=(0,import_react.useState)([]),[page,setPage]=(0,import_react.useState)(0),[filter,setFilter]=(0,import_react.useState)(``),dispatch=useDispatch(),{schedules=[]}=useSchedules({query:(0,import_react.useMemo)(()=>q(`schedules`).select(`*`),[])}),{data:{list:categories}={list:[]}}=useCategories(),{data:payees}=usePayees(),{data:accounts=[]}=useAccounts(),filterData=(0,import_react.useMemo)(()=>({payees,accounts,schedules,categories}),[payees,accounts,schedules,categories]),filteredRules=(0,import_react.useMemo)(()=>{let rules=allRules.filter(rule=>{let schedule_0=schedules.find(schedule=>schedule.rule===rule.id);return!schedule_0||schedule_0.completed===!1});return(filter===``?rules:rules.filter(rule_0=>getNormalisedString(ruleToString(rule_0,filterData)).includes(getNormalisedString(filter)))).slice(0,100+page*50)},[allRules,filter,filterData,page,schedules]),selectedInst=useSelected(`manage-rules`,filteredRules,[]),[hoveredRule,setHoveredRule]=(0,import_react.useState)(null),onSearchChange=value=>{setFilter(value),setPage(0)};async function loadRules(){setLoading(!0);let loadedRules=null;return loadedRules=payeeId?await send(`payees-get-rules`,{id:payeeId}):await send(`rules-get`),setAllRules(loadedRules),loadedRules}let init=(0,import_react.useEffectEvent)(()=>{async function loadData(){await loadRules(),setLoading(!1)}return payeeId&&setUndoState(`openModal`,{name:`manage-rules`,options:{}}),loadData(),()=>{setUndoState(`openModal`,null)}});(0,import_react.useEffect)(()=>init(),[]);function loadMore(){setPage(page_0=>page_0+1)}let onDeleteSelected=async()=>{setLoading(!0);let{someDeletionsFailed}=await send(`rule-delete-all`,[...selectedInst.items]);someDeletionsFailed&&alert(t(`Some rules were not deleted because they are linked to schedules.`)),await loadRules(),selectedInst.dispatch({type:`select-none`}),setLoading(!1)};async function onDeleteRule(id){setLoading(!0),await send(`rule-delete`,id),await loadRules(),setLoading(!1)}let onEditRule=rule_1=>{dispatch(pushModal({modal:{name:`edit-rule`,options:{rule:rule_1,onSave:async()=>{await loadRules(),setLoading(!1)}}}}))};function onCreateRule(){dispatch(pushModal({modal:{name:`edit-rule`,options:{rule:{stage:null,conditionsOp:`and`,conditions:[{field:`payee`,op:`is`,value:payeeId||null,type:`id`}],actions:[{op:`set`,field:`category`,value:null,type:`id`}]},onSave:async()=>{await loadRules(),setLoading(!1)}}}}))}return(0,import_jsx_runtime.jsx)(SelectedProvider,{instance:selectedInst,children:(0,import_jsx_runtime.jsxs)(View,{children:[(0,import_jsx_runtime.jsxs)(View,{style:{flexDirection:`row`,alignItems:`center`,padding:isModal?`0 13px 15px`:`0 0 15px`,flexShrink:0},children:[(0,import_jsx_runtime.jsx)(View,{style:{color:theme.pageTextLight,flexDirection:`row`,alignItems:`center`,width:`50%`},children:(0,import_jsx_runtime.jsxs)(Text,{children:[(0,import_jsx_runtime.jsx)(Trans,{children:`Rules are always run in the order that you see them.`}),` `,(0,import_jsx_runtime.jsx)(Link,{variant:`external`,to:`https://actualbudget.org/docs/budgeting/rules/`,linkColor:`muted`,children:(0,import_jsx_runtime.jsx)(Trans,{children:`Learn more`})})]})}),(0,import_jsx_runtime.jsx)(View,{style:{flex:1}}),(0,import_jsx_runtime.jsx)(Search,{placeholder:t(`Filter rules...`),value:filter,onChange:onSearchChange})]}),(0,import_jsx_runtime.jsxs)(View,{style:styles.tableContainer,children:[(0,import_jsx_runtime.jsx)(RulesHeader,{}),(0,import_jsx_runtime.jsx)(InfiniteScrollWrapper,{loadMore,children:filteredRules.length===0?(0,import_jsx_runtime.jsx)(EmptyMessage,{text:t(`No rules`),style:{marginTop:15}}):(0,import_jsx_runtime.jsx)(RulesList,{rules:filteredRules,selectedItems:selectedInst.items,hoveredRule,onHover:id_0=>{setHoveredRule(id_0)},onEditRule,onDeleteRule:rule_3=>onDeleteRule(rule_3.id)})})]}),(0,import_jsx_runtime.jsx)(View,{style:{paddingBlock:15,paddingInline:isModal?13:0,borderTop:isModal&&`1px solid `+theme.pillBorder,flexShrink:0},children:(0,import_jsx_runtime.jsxs)(SpaceBetween,{gap:10,style:{justifyContent:`flex-end`},children:[selectedInst.items.size>0&&(0,import_jsx_runtime.jsx)(Button,{onPress:onDeleteSelected,children:(0,import_jsx_runtime.jsxs)(Trans,{count:selectedInst.items.size,children:[`Delete `,{count:selectedInst.items.size},` rules`]})}),(0,import_jsx_runtime.jsx)(Button,{variant:`primary`,onPress:onCreateRule,children:(0,import_jsx_runtime.jsx)(Trans,{children:`Create new rule`})})]})})]})})}function EmptyMessage(t0){let $=(0,import_compiler_runtime.c)(5),{text,style}=t0,t1;$[0]===style?t1=$[1]:(t1={textAlign:`center`,color:theme.pageTextSubdued,fontStyle:`italic`,fontSize:13,marginTop:5,style},$[0]=style,$[1]=t1);let t2;return $[2]!==t1||$[3]!==text?(t2=(0,import_jsx_runtime.jsx)(View,{style:t1,children:text}),$[2]=t1,$[3]=text,$[4]=t2):t2=$[4],t2}export{Search as _,useBuiltInBankSyncProviders as a,AuthProvider as b,groupBankSyncAccounts as c,useCurrentAccess as d,BuiltInProviders as f,isAccountFailedSync as g,getFailedSyncError as h,ActionExpression as i,useGoCardlessStatus as l,authorizeBank$1 as m,ruleToString as n,getGroupedBankSyncEntries as o,authorizeBank as p,ConditionExpression as r,getSyncSourceReadable as s,ManageRules as t,useEnableBankingStatus as u,InfiniteScrollWrapper as v,useAuth as x,Permissions as y};
2
- //# sourceMappingURL=ManageRules.CzaFnFD6.chunk.js.map
1
+ import{i as require_react,l as __toESM,n as require_compiler_runtime,r as require_jsx_runtime,t as theme}from"./theme.BTyknj3e.chunk.js";import{Cn as AnimatedLoading,Co as useTranslation,Do as t,En as styles,On as css,To as Trans,Xn as pushModal,ai as useDispatch,at as Text,fo as send,go as setUndoState,mi as addNotification,oi as useSelector,ot as Button,po as sendCatch,st as ButtonWithLoading,wn as View,yi as useAccounts}from"./months.BlbIqvQw.chunk.js";import{Br as useSelectedItems,Cr as SelectCell,Dr as TableHeader,Ir as SelectedProvider,It as describeSchedule,Mt as useFeatureFlag,Qi as Paragraph,Qr as SvgRemove,Rr as useSelected,Sr as Row,Ut as usePayees,Vn as Warning,Wr as Menu,Wt as usePayeesById,X as useSchedules,Yt as useCategories,Zr as SvgSearchAlternate,a as friendlyOp,br as Field,c as mapField,gr as Cell,jn as useSyncServerStatus,jo as useServerURL,ko as useMultiuserEnabled,l as translateRuleStage,o as getAllocationMethods,rt as useContextMenu,s as groupActionsBySplitIndex,t as Value,tt as getNormalisedString,zo as q,zr as useSelectedDispatch}from"./Value.BgvcRWEc.chunk.js";import{Ht as $f2ff30fde7b014be$export$2e1e1122cf0cba88,Lt as Input,Ut as $f2ff30fde7b014be$export$3ddf2d174ce01153,Vt as SpaceBetween,dt as SvgCheveronRight,nt as SvgDotsHorizontalTriple,pt as SvgCheveronDown,x as Popover,zt as baseInputStyle}from"./DateSelect.CU00ZjsZ.chunk.js";import{f as Link,m as useMetadataPref,o as SvgRightArrow2}from"./useLocalPref._HwumoTj.chunk.js";var import_compiler_runtime=require_compiler_runtime(),import_react=__toESM(require_react()),import_jsx_runtime=require_jsx_runtime(),AuthContext=(0,import_react.createContext)(void 0),AuthProvider=t0=>{let $=(0,import_compiler_runtime.c)(8),{children}=t0,userData=useSelector(_temp$2),serverUrl=useServerURL(),t1;$[0]!==serverUrl||$[1]!==userData?.permission?(t1=permission=>!permission||!serverUrl||userData?.permission?.toUpperCase()===permission?.toUpperCase(),$[0]=serverUrl,$[1]=userData?.permission,$[2]=t1):t1=$[2];let hasPermission=t1,t2;$[3]===hasPermission?t2=$[4]:(t2={hasPermission},$[3]=hasPermission,$[4]=t2);let t3;return $[5]!==children||$[6]!==t2?(t3=(0,import_jsx_runtime.jsx)(AuthContext.Provider,{value:t2,children}),$[5]=children,$[6]=t2,$[7]=t3):t3=$[7],t3},useAuth=()=>{let context=(0,import_react.useContext)(AuthContext);if(context===void 0)throw Error(`useAuth must be used within an AuthProvider`);return context};function _temp$2(state){return state.user.data}var Permissions=function(Permissions){return Permissions.ADMINISTRATOR=`ADMIN`,Permissions}({});function InfiniteScrollWrapper(t0){let $=(0,import_compiler_runtime.c)(9),{loadMore,children}=t0,scrollRef=(0,import_react.useRef)(null),t1;$[0]===loadMore?t1=$[1]:(t1=function(e){loadMore&&Math.abs(e.currentTarget.scrollHeight-e.currentTarget.clientHeight-e.currentTarget.scrollTop)<1&&loadMore()},$[0]=loadMore,$[1]=t1);let onScroll=t1,t2;$[2]===Symbol.for(`react.memo_cache_sentinel`)?(t2={flex:1,outline:`none`,"& .animated .animated-row":{transition:`.25s transform`},marginBottom:-1},$[2]=t2):t2=$[2];let t3;$[3]===Symbol.for(`react.memo_cache_sentinel`)?(t3={maxWidth:`100%`,overflow:`auto`},$[3]=t3):t3=$[3];let t4;$[4]===children?t4=$[5]:(t4=(0,import_jsx_runtime.jsx)(`div`,{children}),$[4]=children,$[5]=t4);let t5;return $[6]!==onScroll||$[7]!==t4?(t5=(0,import_jsx_runtime.jsx)(View,{style:t2,tabIndex:0,"data-testid":`table`,children:(0,import_jsx_runtime.jsx)(View,{innerRef:scrollRef,style:t3,onScroll,children:t4})}),$[6]=onScroll,$[7]=t4,$[8]=t5):t5=$[8],t5}function Search({ref,value,onChange,placeholder,isInModal=!1,width=250,height,style}){let{t}=useTranslation(),[focused,setFocused]=(0,import_react.useState)(!1),clearButtonPadding=((height??24)-8)/2;return(0,import_jsx_runtime.jsxs)(View,{style:{...baseInputStyle,padding:0,flexDirection:`row`,alignItems:`center`,width,height,flex:``,borderColor:isInModal?void 0:`transparent`,backgroundColor:isInModal?void 0:theme.formInputBackground,...style,...focused&&{boxShadow:`0 0 0 1px `+theme.formInputShadowSelected,...isInModal?{}:{backgroundColor:theme.formInputBackgroundSelected}}},children:[(0,import_jsx_runtime.jsx)(SvgSearchAlternate,{style:{width:13,height:13,flexShrink:0,color:value?theme.menuItemTextSelected:`inherit`,margin:5,marginRight:0}}),(0,import_jsx_runtime.jsx)(Input,{ref,value,placeholder,onEscape:()=>onChange(``),onChangeValue:onChange,className:css({width:`100%`,"::placeholder":{color:theme.formInputTextPlaceholder,transition:`color .25s`},"&[data-focused]":isInModal?{}:{"::placeholder":{color:theme.formInputTextPlaceholderSelected}},flex:1,"&, &[data-focused], &[data-hovered]":{border:0,backgroundColor:`transparent`,boxShadow:`none`,color:`inherit`}}),onFocus:()=>{setFocused(!0)},onBlur:()=>{setFocused(!1)}}),value&&(0,import_jsx_runtime.jsx)(View,{title:t(`Clear search term`),children:(0,import_jsx_runtime.jsx)(Button,{variant:`bare`,style:{padding:`${clearButtonPadding}px 8px ${clearButtonPadding}px ${clearButtonPadding}px`},onPress:()=>onChange(``),children:(0,import_jsx_runtime.jsx)(SvgRemove,{style:{width:8,height:8}})})})]})}function isAccountFailedSync(account){let status=account.bank_sync_status;return status!=null&&status!==`ok`&&status!==`pending`&&status!==`sync-requested`}function getFailedSyncError(account){switch(account.bank_sync_status){case`reauth-required`:return account.account_sync_source===`simpleFin`?{type:`INVALID_ACCESS_TOKEN`,code:`INVALID_ACCESS_TOKEN`}:{type:`ITEM_ERROR`,code:`ITEM_LOGIN_REQUIRED`};case`attention-required`:return{type:`ACCOUNT_NEEDS_ATTENTION`,code:`ACCOUNT_NEEDS_ATTENTION`};case`rate-limit-exceeded`:return{type:`RATE_LIMIT_EXCEEDED`,code:`RATE_LIMIT_EXCEEDED`};case`timed-out`:return{type:`TIMED_OUT`,code:`TIMED_OUT`};case`account-missing`:return{type:`ACCOUNT_MISSING`,code:`ACCOUNT_MISSING`};default:return{type:`SYNC_ERROR`,code:`SYNC_ERROR`}}}function _authorize$1(dispatch,{onSuccess,onClose}){dispatch(pushModal({modal:{name:`enablebanking-external-msg`,options:{onMoveExternal:async({aspspId,country,maxConsentValidity,psuType=`personal`,onStateReady})=>{let resp=await sendCatch(`enablebanking-start-auth`,{aspspId,country,redirectUrl:`${window.location.origin}/enablebanking/auth_callback`,maxConsentValidity,psuType});if(resp.error)return{error:`unknown`,message:resp.error.message};let authData=resp.data;if(authData?.error)return{error:`unknown`,message:authData.error};let authUrl=authData?.data?.url??authData?.url,state=authData?.data?.state??authData?.state;if(!authUrl||!state)return{error:`unknown`,message:t(`Missing auth URL or state`)};localStorage.setItem(`enablebanking_auth_state`,state),onStateReady?.(state),window.open(authUrl,`enablebanking-auth`,`width=600,height=700,popup=yes`);try{let pollResp=await sendCatch(`enablebanking-poll-auth`,{state});if(pollResp.error)return pollResp.error.message===`timeout`?{error:`timeout`}:{error:`unknown`,message:pollResp.error.message};let pollData=pollResp.data,pollError=pollData?.data?.error??pollData?.error;return pollError?{error:`unknown`,message:typeof pollError==`string`?pollError:String(pollError)}:{data:{accounts:pollData?.data?.accounts??pollData?.accounts??[]}}}finally{localStorage.getItem(`enablebanking_auth_state`)===state&&localStorage.removeItem(`enablebanking_auth_state`)}},onClose,onSuccess}}}))}async function authorizeBank$1(dispatch,upgradingAccountId){_authorize$1(dispatch,{onSuccess:async data=>{dispatch(pushModal({modal:{name:`select-linked-accounts`,options:{externalAccounts:data.accounts,syncSource:`enableBanking`,upgradingAccountId}}}))}})}function _authorize(dispatch,{onSuccess,onClose}){dispatch(pushModal({modal:{name:`gocardless-external-msg`,options:{onMoveExternal:async({institutionId})=>{let resp=await send(`gocardless-create-web-token`,{institutionId,accessValidForDays:90});if(`error`in resp)return resp;if(`error_code`in resp)return{error:`unknown`,message:resp.error_type};let{link,requisitionId}=resp;return window.Actual.openURLInBrowser(link),send(`gocardless-poll-web-token`,{requisitionId})},onClose,onSuccess}}}))}async function authorizeBank(dispatch,upgradingAccountId){_authorize(dispatch,{onSuccess:async data=>{dispatch(pushModal({modal:{name:`select-linked-accounts`,options:{externalAccounts:data.accounts,requisitionId:data.id,syncSource:`goCardless`,upgradingAccountId}}}))}})}function BuiltInProviders({providers,syncServerStatus,permissionWarning,isCollapsed=!1,onToggleCollapse}){let{t}=useTranslation(),Cheveron=isCollapsed?SvgCheveronRight:SvgCheveronDown,title=(0,import_jsx_runtime.jsx)(Text,{style:{fontSize:20,fontWeight:600},children:(0,import_jsx_runtime.jsx)(Trans,{children:`Providers`})});return onToggleCollapse&&isCollapsed?(0,import_jsx_runtime.jsxs)(Button,{variant:`bare`,"aria-expanded":!1,onPress:onToggleCollapse,style:{alignSelf:`flex-start`},children:[title,(0,import_jsx_runtime.jsx)(Cheveron,{width:20,height:20,style:{marginLeft:5}})]}):(0,import_jsx_runtime.jsxs)(View,{style:{gap:12},children:[(0,import_jsx_runtime.jsxs)(View,{style:{gap:4},children:[onToggleCollapse?(0,import_jsx_runtime.jsxs)(Button,{variant:`bare`,"aria-expanded":!0,onPress:onToggleCollapse,style:{alignSelf:`flex-start`},children:[title,(0,import_jsx_runtime.jsx)(Cheveron,{width:20,height:20,style:{marginLeft:5}})]}):title,(0,import_jsx_runtime.jsx)(Paragraph,{style:{fontSize:15,color:theme.pageTextSubdued},children:(0,import_jsx_runtime.jsx)(Trans,{children:`Set up a bank sync provider, then link new accounts or connect an existing Actual account.`})})]}),syncServerStatus===`online`?(0,import_jsx_runtime.jsx)(View,{style:{display:`grid`,gridTemplateColumns:`repeat(auto-fit, minmax(260px, 1fr))`,gap:12},children:providers.map(provider=>(0,import_jsx_runtime.jsxs)(View,{"data-testid":`bank-sync-provider-${provider.id}`,style:{border:`1px solid ${theme.tableBorder}`,borderRadius:8,padding:16,backgroundColor:theme.tableBackground,gap:16},children:[(0,import_jsx_runtime.jsxs)(View,{style:{flexDirection:`row`,justifyContent:`space-between`,alignItems:`flex-start`,gap:12},children:[(0,import_jsx_runtime.jsxs)(View,{style:{gap:6,flex:1},children:[(0,import_jsx_runtime.jsxs)(View,{style:{flexDirection:`row`,alignItems:`center`,gap:8,flexWrap:`wrap`},children:[(0,import_jsx_runtime.jsx)(Text,{style:{fontSize:17,fontWeight:600},children:provider.displayName}),provider.isConfigured&&provider.credentialSource&&(0,import_jsx_runtime.jsx)(Text,{style:{alignSelf:`flex-start`,borderRadius:999,backgroundColor:theme.buttonPrimaryBackground,color:theme.buttonPrimaryText,fontSize:12,fontWeight:500,padding:`2px 8px`},children:provider.credentialSource===`global`?(0,import_jsx_runtime.jsx)(Trans,{children:`global`}):(0,import_jsx_runtime.jsx)(Trans,{children:`this budget only`})})]}),(0,import_jsx_runtime.jsx)(Text,{style:{color:provider.isConfigured?theme.noticeTextDark:theme.pageTextSubdued,fontSize:13,fontWeight:500},children:provider.isConfigured?(0,import_jsx_runtime.jsx)(Trans,{children:`Configured`}):(0,import_jsx_runtime.jsx)(Trans,{children:`Not configured`})})]}),provider.isConfigured&&(0,import_jsx_runtime.jsxs)($f2ff30fde7b014be$export$2e1e1122cf0cba88,{children:[(0,import_jsx_runtime.jsx)(Button,{variant:`bare`,"aria-label":t(`{{provider}} menu`,{provider:provider.displayName}),children:(0,import_jsx_runtime.jsx)(SvgDotsHorizontalTriple,{width:15,height:15,style:{transform:`rotateZ(90deg)`}})}),(0,import_jsx_runtime.jsx)(Popover,{children:(0,import_jsx_runtime.jsx)($f2ff30fde7b014be$export$3ddf2d174ce01153,{children:(0,import_jsx_runtime.jsx)(Menu,{onMenuSelect:item=>{item===`reconfigure`&&provider.onReset()},items:[{name:`reconfigure`,text:t(`Reset {{provider}} credentials`,{provider:provider.displayName})}]})})})]})]}),(0,import_jsx_runtime.jsxs)(View,{style:{flexDirection:`row`,justifyContent:`flex-end`,alignItems:`center`,gap:8,flexWrap:`wrap`},children:[(0,import_jsx_runtime.jsx)(Button,{variant:`bare`,isDisabled:!provider.canConfigure,onPress:()=>provider.onConfigure(),children:provider.isConfigured?(0,import_jsx_runtime.jsx)(Trans,{children:`Edit setup`}):(0,import_jsx_runtime.jsx)(Trans,{children:`Set up`})}),(0,import_jsx_runtime.jsx)(ButtonWithLoading,{variant:`primary`,isDisabled:!provider.isConfigured,isLoading:provider.isLoading,onPress:()=>provider.onLink(),children:(0,import_jsx_runtime.jsx)(Trans,{children:`Link bank account`})})]}),provider.supportsPerBudgetFile&&provider.credentialSource===`global`&&!provider.canConfigure&&(0,import_jsx_runtime.jsx)(Text,{style:{color:theme.pageTextSubdued,fontSize:13},children:(0,import_jsx_runtime.jsx)(Trans,{children:`Reset credentials before setting credentials for this budget file.`})})]},provider.id))}):(0,import_jsx_runtime.jsxs)(View,{style:{border:`1px solid ${theme.tableBorder}`,borderRadius:8,padding:16,backgroundColor:theme.tableBackground},children:[(0,import_jsx_runtime.jsx)(Button,{isDisabled:!0,style:{padding:`10px 0`,fontSize:15},children:(0,import_jsx_runtime.jsx)(Trans,{children:`Set up bank sync`})}),(0,import_jsx_runtime.jsx)(Paragraph,{style:{fontSize:15,marginTop:10},children:(0,import_jsx_runtime.jsxs)(Trans,{children:[`Connect to an Actual server to set up`,` `,(0,import_jsx_runtime.jsx)(Link,{variant:`external`,to:`https://actualbudget.org/docs/advanced/bank-sync`,linkColor:`muted`,children:`automatic syncing`}),`.`]})})]}),permissionWarning&&(0,import_jsx_runtime.jsx)(Warning,{children:permissionWarning===`file-owner`?(0,import_jsx_runtime.jsx)(Trans,{children:`You don't have the required permissions to configure all bank sync providers. You can set up Pluggy.ai because you are the owner of this budget file.`}):(0,import_jsx_runtime.jsx)(Trans,{children:`You don't have the required permissions to configure bank sync providers. Please contact an Admin.`})})]})}function useAkahuStatus(t0){let $=(0,import_compiler_runtime.c)(7),enabled=t0===void 0||t0,[configuredAkahu,setConfiguredAkahu]=(0,import_react.useState)(null),[isLoading,setIsLoading]=(0,import_react.useState)(!1),status=useSyncServerStatus(),t1,t2;$[0]!==enabled||$[1]!==status?(t1=()=>{enabled&&status===`online`&&async function(){setIsLoading(!0);let results=await send(`akahu-status`);setConfiguredAkahu(results.configured||!1),setIsLoading(!1)}()},t2=[status,enabled],$[0]=enabled,$[1]=status,$[2]=t1,$[3]=t2):(t1=$[2],t2=$[3]),(0,import_react.useEffect)(t1,t2);let t3;return $[4]!==configuredAkahu||$[5]!==isLoading?(t3={configuredAkahu,isLoading},$[4]=configuredAkahu,$[5]=isLoading,$[6]=t3):t3=$[6],t3}function useCurrentAccess(){let $=(0,import_compiler_runtime.c)(12),[cloudFileId]=useMetadataPref(`cloudFileId`),allFiles=useSelector(_temp$1),userData=useSelector(_temp2$1),{hasPermission}=useAuth(),multiuserEnabled=useMultiuserEnabled(),t0;if($[0]!==allFiles||$[1]!==cloudFileId){let t1;$[3]===cloudFileId?t1=$[4]:(t1=file=>(file.state===`remote`||file.state===`synced`||file.state===`detached`)&&file.cloudFileId===cloudFileId,$[3]=cloudFileId,$[4]=t1),t0=allFiles.find(t1),$[0]=allFiles,$[1]=cloudFileId,$[2]=t0}else t0=$[2];let currentFile=t0,t1;$[5]!==hasPermission||$[6]!==multiuserEnabled?(t1=!multiuserEnabled||hasPermission(Permissions.ADMINISTRATOR),$[5]=hasPermission,$[6]=multiuserEnabled,$[7]=t1):t1=$[7];let t2=!!(userData?.userId&&currentFile?.owner===userData.userId),t3;return $[8]!==cloudFileId||$[9]!==t1||$[10]!==t2?(t3={cloudFileId,isAdmin:t1,isFileOwner:t2},$[8]=cloudFileId,$[9]=t1,$[10]=t2,$[11]=t3):t3=$[11],t3}function _temp2$1(state_0){return state_0.user.data}function _temp$1(state){return state.budgetfiles.allFiles||[]}function useEnableBankingStatus(enabled=!0){let[configuredEnableBanking,setConfiguredEnableBanking]=(0,import_react.useState)(null),[isLoading,setIsLoading]=(0,import_react.useState)(!0),status=useSyncServerStatus();return(0,import_react.useEffect)(()=>{if(!enabled)return;async function fetch(){setIsLoading(!0);try{let results=await send(`enablebanking-status`);setConfiguredEnableBanking(results.configured||!1)}catch{setConfiguredEnableBanking(!1)}finally{setIsLoading(!1)}}status===`online`&&fetch()},[status,enabled]),{configuredEnableBanking,isLoading}}function useGoCardlessStatus(){let $=(0,import_compiler_runtime.c)(6),[configuredGoCardless,setConfiguredGoCardless]=(0,import_react.useState)(null),[isLoading,setIsLoading]=(0,import_react.useState)(!1),status=useSyncServerStatus(),t0,t1;$[0]===status?(t0=$[1],t1=$[2]):(t0=()=>{status===`online`&&async function(){setIsLoading(!0);let results=await send(`gocardless-status`);setConfiguredGoCardless(results.configured||!1),setIsLoading(!1)}()},t1=[status],$[0]=status,$[1]=t0,$[2]=t1),(0,import_react.useEffect)(t0,t1);let t2;return $[3]!==configuredGoCardless||$[4]!==isLoading?(t2={configuredGoCardless,isLoading},$[3]=configuredGoCardless,$[4]=isLoading,$[5]=t2):t2=$[5],t2}function usePluggyAiStatus(){let $=(0,import_compiler_runtime.c)(7),t0;$[0]===Symbol.for(`react.memo_cache_sentinel`)?(t0={},$[0]=t0):t0=$[0];let[pluggyAiStatus,setPluggyAiStatus]=(0,import_react.useState)(t0),[isLoading,setIsLoading]=(0,import_react.useState)(!1),status=useSyncServerStatus(),t1,t2;$[1]===status?(t1=$[2],t2=$[3]):(t1=()=>{let fetch=async function(){setIsLoading(!0);let results=await send(`pluggyai-status`);setPluggyAiStatus(results),setIsLoading(!1)};if(status!==`online`){setPluggyAiStatus({});return}fetch()},t2=[status],$[1]=status,$[2]=t1,$[3]=t2),(0,import_react.useEffect)(t1,t2);let t3;return $[4]!==isLoading||$[5]!==pluggyAiStatus?(t3={pluggyAiStatus,setPluggyAiStatus,isLoading},$[4]=isLoading,$[5]=pluggyAiStatus,$[6]=t3):t3=$[6],t3}function useSimpleFinStatus(){let $=(0,import_compiler_runtime.c)(6),[configuredSimpleFin,setConfiguredSimpleFin]=(0,import_react.useState)(null),[isLoading,setIsLoading]=(0,import_react.useState)(!1),status=useSyncServerStatus(),t0,t1;$[0]===status?(t0=$[1],t1=$[2]):(t0=()=>{status===`online`&&async function(){setIsLoading(!0);let results=await send(`simplefin-status`);setConfiguredSimpleFin(results.configured||!1),setIsLoading(!1)}()},t1=[status],$[0]=status,$[1]=t0,$[2]=t1),(0,import_react.useEffect)(t0,t1);let t2;return $[3]!==configuredSimpleFin||$[4]!==isLoading?(t2={configuredSimpleFin,isLoading},$[3]=configuredSimpleFin,$[4]=isLoading,$[5]=t2):t2=$[5],t2}var BUILT_IN_BANK_SYNC_PROVIDERS=[`goCardless`,`simpleFin`,`pluggyai`],SYNC_PROVIDER_KEYS=[...BUILT_IN_BANK_SYNC_PROVIDERS,`enableBanking`,`akahu`,`unlinked`],syncProviderKeysSet=new Set(SYNC_PROVIDER_KEYS);function isSyncProvider(value){return syncProviderKeysSet.has(value)}function getSyncSourceReadable(translate){return{goCardless:`GoCardless`,simpleFin:`SimpleFIN`,pluggyai:`Pluggy.ai`,enableBanking:`Enable Banking`,akahu:`Akahu`,unlinked:translate(`Unlinked`)}}function groupBankSyncAccounts(accounts){let groupedAccounts={};for(let account of accounts){if(account.closed)continue;let syncSource=account.account_sync_source??`unlinked`,existingAccounts=groupedAccounts[syncSource];existingAccounts?existingAccounts.push(account):groupedAccounts[syncSource]=[account]}let sortedEntries=Object.entries(groupedAccounts).filter(entry=>isSyncProvider(entry[0])&&entry[1]!=null).sort(([keyA],[keyB])=>keyA===`unlinked`?1:keyB===`unlinked`?-1:keyA.localeCompare(keyB)),sortedAccounts={};for(let[syncSource,providerAccounts]of sortedEntries)sortedAccounts[syncSource]=providerAccounts;return sortedAccounts}function getGroupedBankSyncEntries(groupedAccounts){return Object.entries(groupedAccounts).filter(entry=>isSyncProvider(entry[0])&&entry[1]!=null)}function getPermissionWarning(syncServerStatus,isAdmin,isFileOwner){return syncServerStatus!==`online`||isAdmin?null:isFileOwner?`file-owner`:`general`}async function ensureSuccessResponse(response,fallbackMessage){if(response?.error_code)throw Error(response.reason||response.error_code);if(response?.error)throw Error(response.reason||response.error||fallbackMessage)}function useBuiltInBankSyncProviders({upgradingAccountId}={}){let{t}=useTranslation(),dispatch=useDispatch(),syncServerStatus=useSyncServerStatus(),{cloudFileId,isAdmin,isFileOwner}=useCurrentAccess(),canConfigureProviders=isAdmin,[isGoCardlessSetupComplete,setIsGoCardlessSetupComplete]=(0,import_react.useState)(null),[isSimpleFinSetupComplete,setIsSimpleFinSetupComplete]=(0,import_react.useState)(null),[isEnableBankingSetupComplete,setIsEnableBankingSetupComplete]=(0,import_react.useState)(null),[isAkahuSetupComplete,setIsAkahuSetupComplete]=(0,import_react.useState)(null),[loadingSimpleFinAccounts,setLoadingSimpleFinAccounts]=(0,import_react.useState)(!1),[loadingAkahuAccounts,setLoadingAkahuAccounts]=(0,import_react.useState)(!1),enableBankingEnabled=useFeatureFlag(`enableBanking`),akahuEnabled=useFeatureFlag(`akahuBankSync`),{configuredGoCardless}=useGoCardlessStatus(),{configuredSimpleFin}=useSimpleFinStatus(),{pluggyAiStatus,setPluggyAiStatus}=usePluggyAiStatus(),{configuredAkahu}=useAkahuStatus(akahuEnabled),{configuredEnableBanking,isLoading:isEnableBankingLoading}=useEnableBankingStatus(enableBankingEnabled);(0,import_react.useEffect)(()=>{setIsGoCardlessSetupComplete(configuredGoCardless)},[configuredGoCardless]),(0,import_react.useEffect)(()=>{setIsSimpleFinSetupComplete(configuredSimpleFin)},[configuredSimpleFin]),(0,import_react.useEffect)(()=>{setIsEnableBankingSetupComplete(configuredEnableBanking)},[configuredEnableBanking]),(0,import_react.useEffect)(()=>{setIsAkahuSetupComplete(configuredAkahu)},[configuredAkahu]);let onGoCardlessInit=(0,import_react.useCallback)(()=>{dispatch(pushModal({modal:{name:`gocardless-init`,options:{onSuccess:()=>setIsGoCardlessSetupComplete(!0)}}}))},[dispatch]),onSimpleFinInit=(0,import_react.useCallback)(()=>{dispatch(pushModal({modal:{name:`simplefin-init`,options:{onSuccess:()=>setIsSimpleFinSetupComplete(!0)}}}))},[dispatch]),onPluggyAiInit=(0,import_react.useCallback)(()=>{dispatch(pushModal({modal:{name:`pluggyai-init`,options:{onSuccess:perBudgetFile=>{setPluggyAiStatus({configured:!0,source:perBudgetFile?`per-budget-file`:`global`})},credentialSource:pluggyAiStatus.source??`global`}}}))},[dispatch,pluggyAiStatus.source,setPluggyAiStatus]),onEnableBankingInit=(0,import_react.useCallback)(()=>{dispatch(pushModal({modal:{name:`enablebanking-init`,options:{onSuccess:()=>setIsEnableBankingSetupComplete(!0)}}}))},[dispatch]),onAkahuInit=(0,import_react.useCallback)(()=>{dispatch(pushModal({modal:{name:`akahu-init`,options:{onSuccess:()=>setIsAkahuSetupComplete(!0)}}}))},[dispatch]),notifyResetFailure=(0,import_react.useCallback)((providerName,error)=>{dispatch(addNotification({notification:{type:`error`,title:t(`Failed to reset {{provider}}`,{provider:providerName}),message:error instanceof Error?error.message:String(error),timeout:5e3}}))},[dispatch,t]),onGoCardlessReset=(0,import_react.useCallback)(async()=>{try{await ensureSuccessResponse(await send(`secret-set`,{name:`gocardless_secretId`,value:null}),`Failed to clear GoCardless secret ID`),await ensureSuccessResponse(await send(`secret-set`,{name:`gocardless_secretKey`,value:null}),`Failed to clear GoCardless secret key`),setIsGoCardlessSetupComplete(!1)}catch(error_0){notifyResetFailure(`GoCardless`,error_0)}},[notifyResetFailure]),onSimpleFinReset=(0,import_react.useCallback)(async()=>{try{await ensureSuccessResponse(await send(`secret-set`,{name:`simplefin_token`,value:null}),`Failed to clear SimpleFIN token`),await ensureSuccessResponse(await send(`secret-set`,{name:`simplefin_accessKey`,value:null}),`Failed to clear SimpleFIN access key`),setIsSimpleFinSetupComplete(!1)}catch(error_1){notifyResetFailure(`SimpleFIN`,error_1)}},[notifyResetFailure]),onPluggyAiReset=(0,import_react.useCallback)(async()=>{try{let fileId=pluggyAiStatus.source===`per-budget-file`?cloudFileId:null;if(pluggyAiStatus.source===`per-budget-file`&&!fileId)throw Error(t(`Budget file ID is required.`));await ensureSuccessResponse(await send(`secret-set`,{name:`pluggyai_clientId`,value:null,fileId}),`Failed to clear Pluggy.ai client ID`),await ensureSuccessResponse(await send(`secret-set`,{name:`pluggyai_clientSecret`,value:null,fileId}),`Failed to clear Pluggy.ai client secret`),await ensureSuccessResponse(await send(`secret-set`,{name:`pluggyai_itemIds`,value:null,fileId}),`Failed to clear Pluggy.ai item IDs`),setPluggyAiStatus(await send(`pluggyai-status`))}catch(error_2){notifyResetFailure(`Pluggy.ai`,error_2)}},[cloudFileId,notifyResetFailure,pluggyAiStatus.source,setPluggyAiStatus,t]),onEnableBankingReset=(0,import_react.useCallback)(async()=>{try{await ensureSuccessResponse(await send(`secret-set`,{name:`enablebanking_applicationId`,value:null}),`Failed to clear Enable Banking application ID`),await ensureSuccessResponse(await send(`secret-set`,{name:`enablebanking_secretKey`,value:null}),`Failed to clear Enable Banking secret key`),setIsEnableBankingSetupComplete(!1)}catch(error_3){notifyResetFailure(`Enable Banking`,error_3)}},[notifyResetFailure]),onAkahuReset=(0,import_react.useCallback)(async()=>{try{await ensureSuccessResponse(await send(`secret-set`,{name:`akahu_userToken`,value:null}),`Failed to clear Akahu user token`),await ensureSuccessResponse(await send(`secret-set`,{name:`akahu_appToken`,value:null}),`Failed to clear Akahu app token`),setIsAkahuSetupComplete(!1)}catch(error_4){console.log(error_4),notifyResetFailure(`Akahu`,error_4)}},[notifyResetFailure]),onConnectGoCardless=(0,import_react.useCallback)(()=>{if(!isGoCardlessSetupComplete){onGoCardlessInit();return}authorizeBank(dispatch,upgradingAccountId)},[dispatch,isGoCardlessSetupComplete,onGoCardlessInit,upgradingAccountId]),onConnectSimpleFin=(0,import_react.useCallback)(async()=>{if(!isSimpleFinSetupComplete){onSimpleFinInit();return}if(!loadingSimpleFinAccounts){setLoadingSimpleFinAccounts(!0);try{let results=await send(`simplefin-accounts`);if(results.error_code===`INVALID_ACCESS_TOKEN`){onSimpleFinInit();return}if(results.error_code)throw Error(results.reason||results.error_code);if(`error`in results&&results.error)throw Error(results.reason||results.error);let externalAccounts=(results.accounts??[]).map(oldAccount=>({account_id:oldAccount.id,name:oldAccount.name,institution:oldAccount.org.name,orgDomain:oldAccount.org.domain,orgId:oldAccount.org.id,balance:oldAccount.balance}));dispatch(pushModal({modal:{name:`select-linked-accounts`,options:{externalAccounts,syncSource:`simpleFin`,upgradingAccountId}}}))}catch(error_5){dispatch(addNotification({notification:{type:`error`,title:t(`Error when trying to contact SimpleFIN`),message:error_5 instanceof Error?error_5.message:String(error_5),timeout:5e3}}))}finally{setLoadingSimpleFinAccounts(!1)}}},[dispatch,isSimpleFinSetupComplete,loadingSimpleFinAccounts,onSimpleFinInit,t,upgradingAccountId]),onConnectEnableBanking=(0,import_react.useCallback)(async()=>{if(!isEnableBankingSetupComplete){onEnableBankingInit();return}try{await authorizeBank$1(dispatch,upgradingAccountId)}catch(error_6){dispatch(addNotification({notification:{type:`error`,title:t(`Error when trying to contact Enable Banking`),message:error_6 instanceof Error?error_6.message:String(error_6),timeout:5e3}})),onEnableBankingInit()}},[dispatch,isEnableBankingSetupComplete,onEnableBankingInit,t,upgradingAccountId]),onConnectPluggyAi=(0,import_react.useCallback)(async()=>{if(!pluggyAiStatus.configured){onPluggyAiInit();return}try{let results_0=await send(`pluggyai-accounts`);if(results_0.error_code)throw Error(results_0.reason);if(`error`in results_0)throw Error(results_0.error);let externalAccounts_0=results_0.accounts.map(oldAccount_0=>({account_id:oldAccount_0.id,name:`${oldAccount_0.name.trim()} - ${oldAccount_0.type===`BANK`?oldAccount_0.taxNumber:oldAccount_0.owner}`,institution:oldAccount_0.name,orgDomain:null,orgId:oldAccount_0.id,balance:oldAccount_0.type===`BANK`?oldAccount_0.bankData.automaticallyInvestedBalance+oldAccount_0.bankData.closingBalance:oldAccount_0.balance}));dispatch(pushModal({modal:{name:`select-linked-accounts`,options:{externalAccounts:externalAccounts_0,syncSource:`pluggyai`,upgradingAccountId}}}))}catch(error_7){dispatch(addNotification({notification:{type:`error`,title:t(`Error when trying to contact Pluggy.ai`),message:error_7 instanceof Error?error_7.message:String(error_7),timeout:5e3}})),onPluggyAiInit()}},[dispatch,onPluggyAiInit,pluggyAiStatus.configured,t,upgradingAccountId]),onConnectAkahu=(0,import_react.useCallback)(async()=>{if(!isAkahuSetupComplete){onAkahuInit();return}if(!loadingAkahuAccounts){setLoadingAkahuAccounts(!0);try{let results_1=await send(`akahu-accounts`);if(results_1.error_code)throw Error(results_1.reason);if(`error`in results_1&&results_1.error)throw Error(results_1.reason||results_1.error);let newAccounts=[];for(let oldAccount_1 of results_1.accounts??[]){let newAccount={account_id:oldAccount_1._id,name:oldAccount_1.name,institution:oldAccount_1.connection.name,orgDomain:oldAccount_1.connection.name,orgId:oldAccount_1.connection._id,balance:oldAccount_1.balance.current};newAccounts.push(newAccount)}dispatch(pushModal({modal:{name:`select-linked-accounts`,options:{externalAccounts:newAccounts,syncSource:`akahu`,upgradingAccountId}}}))}catch(error_8){dispatch(addNotification({notification:{type:`error`,title:t(`Error when trying to contact Akahu`),message:error_8 instanceof Error?error_8.message:String(error_8),timeout:5e3}})),onAkahuInit()}setLoadingAkahuAccounts(!1)}},[dispatch,isAkahuSetupComplete,loadingAkahuAccounts,onAkahuInit,upgradingAccountId,t]),configuredProviders={goCardless:!!isGoCardlessSetupComplete,simpleFin:!!isSimpleFinSetupComplete,pluggyai:!!pluggyAiStatus.configured,enableBanking:!!isEnableBankingSetupComplete,akahu:!!isAkahuSetupComplete};return{providers:(0,import_react.useMemo)(()=>{let baseProviders=BUILT_IN_BANK_SYNC_PROVIDERS.map(providerId=>providerId===`goCardless`?{id:providerId,displayName:`GoCardless`,description:t(`Link a European bank account to automatically download transactions.`),isConfigured:configuredProviders.goCardless,credentialSource:`global`,supportsPerBudgetFile:!1,canConfigure:canConfigureProviders,onConfigure:onGoCardlessInit,onLink:onConnectGoCardless,onReset:onGoCardlessReset}:providerId===`simpleFin`?{id:providerId,displayName:`SimpleFIN`,description:t(`Link a North American bank account to automatically download transactions.`),isConfigured:configuredProviders.simpleFin,credentialSource:`global`,supportsPerBudgetFile:!1,canConfigure:canConfigureProviders,isLoading:loadingSimpleFinAccounts,onConfigure:onSimpleFinInit,onLink:onConnectSimpleFin,onReset:onSimpleFinReset}:{id:providerId,displayName:`Pluggy.ai`,description:t(`Link a Brazilian bank account to automatically download transactions.`),isConfigured:configuredProviders.pluggyai,credentialSource:pluggyAiStatus.source??`global`,supportsPerBudgetFile:!0,canConfigure:syncServerStatus===`online`&&(isAdmin||isFileOwner&&pluggyAiStatus.source!==`global`),onConfigure:onPluggyAiInit,onLink:onConnectPluggyAi,onReset:onPluggyAiReset});return akahuEnabled&&baseProviders.push({id:`akahu`,displayName:`Akahu`,description:t(`Link a New Zealand bank account to automatically download transactions.`),isConfigured:configuredProviders.akahu,credentialSource:`global`,supportsPerBudgetFile:!1,canConfigure:canConfigureProviders,isLoading:loadingAkahuAccounts,onConfigure:onAkahuInit,onLink:onConnectAkahu,onReset:onAkahuReset}),enableBankingEnabled&&baseProviders.push({id:`enableBanking`,displayName:`Enable Banking`,description:t(`Link a European bank account via Enable Banking, a free alternative to GoCardless for PSD2-supported banks.`),isConfigured:configuredProviders.enableBanking,credentialSource:`global`,supportsPerBudgetFile:!1,canConfigure:canConfigureProviders,isLoading:isEnableBankingLoading,onConfigure:onEnableBankingInit,onLink:onConnectEnableBanking,onReset:onEnableBankingReset}),baseProviders},[canConfigureProviders,isAdmin,isFileOwner,configuredProviders.enableBanking,configuredProviders.goCardless,configuredProviders.pluggyai,configuredProviders.simpleFin,configuredProviders.akahu,pluggyAiStatus,syncServerStatus,enableBankingEnabled,akahuEnabled,isEnableBankingLoading,loadingSimpleFinAccounts,loadingAkahuAccounts,onConnectAkahu,onConnectEnableBanking,onConnectGoCardless,onConnectPluggyAi,onConnectSimpleFin,onAkahuInit,onAkahuReset,onEnableBankingInit,onEnableBankingReset,onGoCardlessInit,onGoCardlessReset,onPluggyAiInit,onPluggyAiReset,onSimpleFinInit,onSimpleFinReset,t]),syncServerStatus,permissionWarning:getPermissionWarning(syncServerStatus,isAdmin,isFileOwner)}}function RulesHeader(){let $=(0,import_compiler_runtime.c)(18),{t}=useTranslation(),selectedItems=useSelectedItems(),dispatchSelected=useSelectedDispatch(),t0;$[0]===Symbol.for(`react.memo_cache_sentinel`)?(t0={},$[0]=t0):t0=$[0];let t1=selectedItems.size>0,t2;$[1]===dispatchSelected?t2=$[2]:(t2=e=>dispatchSelected({type:`select-all`,isRangeSelect:e.shiftKey}),$[1]=dispatchSelected,$[2]=t2);let t3;$[3]!==t1||$[4]!==t2?(t3=(0,import_jsx_runtime.jsx)(SelectCell,{exposed:!0,focused:!1,selected:t1,onSelect:t2}),$[3]=t1,$[4]=t2,$[5]=t3):t3=$[5];let t4;$[6]===t?t4=$[7]:(t4=t(`Stage`),$[6]=t,$[7]=t4);let t5;$[8]===t4?t5=$[9]:(t5=(0,import_jsx_runtime.jsx)(Cell,{value:t4,width:50}),$[8]=t4,$[9]=t5);let t6;$[10]===t?t6=$[11]:(t6=t(`Rule`),$[10]=t,$[11]=t6);let t7;$[12]===t6?t7=$[13]:(t7=(0,import_jsx_runtime.jsx)(Cell,{value:t6,width:`flex`}),$[12]=t6,$[13]=t7);let t8;return $[14]!==t3||$[15]!==t5||$[16]!==t7?(t8=(0,import_jsx_runtime.jsxs)(TableHeader,{style:t0,children:[t3,t5,t7]}),$[14]=t3,$[15]=t5,$[16]=t7,$[17]=t8):t8=$[17],t8}function ScheduleValue({value}){let{t}=useTranslation(),{data:byId={}}=usePayeesById(),{schedules=[],isLoading}=useSchedules({query:(0,import_react.useMemo)(()=>q(`schedules`).select(`*`),[])});if(isLoading)return(0,import_jsx_runtime.jsx)(View,{"aria-label":t(`Loading...`),style:{display:`inline-flex`},children:(0,import_jsx_runtime.jsx)(AnimatedLoading,{width:10,height:10})});let schedule=schedules.find(item=>item.id===value);return(0,import_jsx_runtime.jsx)(Value,{value:schedule?describeSchedule(schedule,byId[schedule._payee]):t(`(deleted)`),field:`notes`,valueIsRaw:!0})}var valueStyle$1={color:theme.pillTextHighlighted};function ActionExpression(t0){let $=(0,import_compiler_runtime.c)(10),props,style;$[0]===t0?(props=$[1],style=$[2]):({style,...props}=t0,$[0]=t0,$[1]=props,$[2]=style);let t1;$[3]===style?t1=$[4]:(t1={display:`block`,maxWidth:`100%`,color:theme.pillText,backgroundColor:theme.pillBackgroundLight,borderRadius:4,padding:`3px 5px`,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`,...style},$[3]=style,$[4]=t1);let t2;$[5]===props?t2=$[6]:(t2=props.op===`set`?(0,import_jsx_runtime.jsx)(SetActionExpression,{...props}):props.op===`set-split-amount`?(0,import_jsx_runtime.jsx)(SetSplitAmountActionExpression,{...props}):props.op===`link-schedule`?(0,import_jsx_runtime.jsx)(LinkScheduleActionExpression,{...props}):props.op===`prepend-notes`?(0,import_jsx_runtime.jsx)(PrependNoteActionExpression,{...props}):props.op===`append-notes`?(0,import_jsx_runtime.jsx)(AppendNoteActionExpression,{...props}):props.op===`delete-transaction`?(0,import_jsx_runtime.jsx)(DeleteTransactionActionExpression,{...props}):null,$[5]=props,$[6]=t2);let t3;return $[7]!==t1||$[8]!==t2?(t3=(0,import_jsx_runtime.jsx)(View,{style:t1,children:t2}),$[7]=t1,$[8]=t2,$[9]=t3):t3=$[9],t3}function SetActionExpression(t0){let $=(0,import_compiler_runtime.c)(23),{op,field,value,options}=t0,{t}=useTranslation(),t1;$[0]===op?t1=$[1]:(t1=friendlyOp(op),$[0]=op,$[1]=t1);let t2;$[2]===t1?t2=$[3]:(t2=(0,import_jsx_runtime.jsx)(Text,{children:t1}),$[2]=t1,$[3]=t2);let t3;$[4]!==field||$[5]!==options?(t3=mapField(field,options),$[4]=field,$[5]=options,$[6]=t3):t3=$[6];let t4;$[7]===t3?t4=$[8]:(t4=(0,import_jsx_runtime.jsx)(Text,{style:valueStyle$1,children:t3}),$[7]=t3,$[8]=t4);let t5;$[9]===t?t5=$[10]:(t5=t(`to `),$[9]=t,$[10]=t5);let t6;$[11]===t5?t6=$[12]:(t6=(0,import_jsx_runtime.jsx)(Text,{children:t5}),$[11]=t5,$[12]=t6);let t7;$[13]!==field||$[14]!==options||$[15]!==t||$[16]!==value?(t7=options?.formula?(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Text,{children:t(`formula `)}),(0,import_jsx_runtime.jsx)(Text,{style:valueStyle$1,children:options.formula})]}):options?.template?(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Text,{children:t(`template `)}),(0,import_jsx_runtime.jsx)(Text,{style:valueStyle$1,children:options.template})]}):(0,import_jsx_runtime.jsx)(Value,{style:valueStyle$1,value,field}),$[13]=field,$[14]=options,$[15]=t,$[16]=value,$[17]=t7):t7=$[17];let t8;return $[18]!==t2||$[19]!==t4||$[20]!==t6||$[21]!==t7?(t8=(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[t2,` `,t4,` `,t6,t7]}),$[18]=t2,$[19]=t4,$[20]=t6,$[21]=t7,$[22]=t8):t8=$[22],t8}function SetSplitAmountActionExpression(t0){let $=(0,import_compiler_runtime.c)(17),{op,value,options}=t0,{t}=useTranslation(),method=options?.method;if(!method)return null;let t1;$[0]===op?t1=$[1]:(t1=friendlyOp(op),$[0]=op,$[1]=t1);let t2;$[2]===t1?t2=$[3]:(t2=(0,import_jsx_runtime.jsx)(Text,{children:t1}),$[2]=t1,$[3]=t2);let t3;$[4]===Symbol.for(`react.memo_cache_sentinel`)?(t3=getAllocationMethods(),$[4]=t3):t3=$[4];let t4=t3[method],t5;$[5]===t4?t5=$[6]:(t5=(0,import_jsx_runtime.jsx)(Text,{style:valueStyle$1,children:t4}),$[5]=t4,$[6]=t5);let t6=method!==`remainder`&&`: `,t7;$[7]!==method||$[8]!==options||$[9]!==t||$[10]!==value?(t7=options?.method===`formula`?(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Text,{children:t(`formula `)}),(0,import_jsx_runtime.jsx)(Text,{style:valueStyle$1,children:options.formula})]}):method===`fixed-amount`?(0,import_jsx_runtime.jsx)(Value,{style:valueStyle$1,value,field:`amount`}):method===`fixed-percent`?(0,import_jsx_runtime.jsxs)(Text,{style:valueStyle$1,children:[value,`%`]}):null,$[7]=method,$[8]=options,$[9]=t,$[10]=value,$[11]=t7):t7=$[11];let t8;return $[12]!==t2||$[13]!==t5||$[14]!==t6||$[15]!==t7?(t8=(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[t2,` `,t5,t6,t7]}),$[12]=t2,$[13]=t5,$[14]=t6,$[15]=t7,$[16]=t8):t8=$[16],t8}function LinkScheduleActionExpression(t0){let $=(0,import_compiler_runtime.c)(9),{op,value}=t0,t1;$[0]===op?t1=$[1]:(t1=friendlyOp(op),$[0]=op,$[1]=t1);let t2;$[2]===t1?t2=$[3]:(t2=(0,import_jsx_runtime.jsx)(Text,{children:t1}),$[2]=t1,$[3]=t2);let t3;$[4]===value?t3=$[5]:(t3=(0,import_jsx_runtime.jsx)(ScheduleValue,{value}),$[4]=value,$[5]=t3);let t4;return $[6]!==t2||$[7]!==t3?(t4=(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[t2,` `,t3]}),$[6]=t2,$[7]=t3,$[8]=t4):t4=$[8],t4}function PrependNoteActionExpression(t0){let $=(0,import_compiler_runtime.c)(9),{op,value}=t0,t1;$[0]===op?t1=$[1]:(t1=friendlyOp(op),$[0]=op,$[1]=t1);let t2;$[2]===t1?t2=$[3]:(t2=(0,import_jsx_runtime.jsx)(Text,{children:t1}),$[2]=t1,$[3]=t2);let t3;$[4]===value?t3=$[5]:(t3=(0,import_jsx_runtime.jsx)(Value,{style:valueStyle$1,value,field:`notes`}),$[4]=value,$[5]=t3);let t4;return $[6]!==t2||$[7]!==t3?(t4=(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[t2,` `,t3]}),$[6]=t2,$[7]=t3,$[8]=t4):t4=$[8],t4}function AppendNoteActionExpression(t0){let $=(0,import_compiler_runtime.c)(9),{op,value}=t0,t1;$[0]===op?t1=$[1]:(t1=friendlyOp(op),$[0]=op,$[1]=t1);let t2;$[2]===t1?t2=$[3]:(t2=(0,import_jsx_runtime.jsx)(Text,{children:t1}),$[2]=t1,$[3]=t2);let t3;$[4]===value?t3=$[5]:(t3=(0,import_jsx_runtime.jsx)(Value,{style:valueStyle$1,value,field:`notes`}),$[4]=value,$[5]=t3);let t4;return $[6]!==t2||$[7]!==t3?(t4=(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[t2,` `,t3]}),$[6]=t2,$[7]=t3,$[8]=t4):t4=$[8],t4}function DeleteTransactionActionExpression(t0){let $=(0,import_compiler_runtime.c)(4),{op}=t0,t1;$[0]===op?t1=$[1]:(t1=friendlyOp(op),$[0]=op,$[1]=t1);let t2;return $[2]===t1?t2=$[3]:(t2=(0,import_jsx_runtime.jsx)(Text,{children:t1}),$[2]=t1,$[3]=t2),t2}var valueStyle={color:theme.pillTextHighlighted};function ConditionExpression(t0){let $=(0,import_compiler_runtime.c)(24),{field,op,value,options,prefix,style,inline}=t0,t1;$[0]===style?t1=$[1]:(t1={display:`block`,maxWidth:`100%`,color:theme.pillText,backgroundColor:theme.pillBackgroundLight,borderRadius:4,padding:`3px 5px`,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`,...style},$[0]=style,$[1]=t1);let t2;$[2]===prefix?t2=$[3]:(t2=prefix&&(0,import_jsx_runtime.jsxs)(Text,{children:[prefix,` `]}),$[2]=prefix,$[3]=t2);let t3;$[4]!==field||$[5]!==options?(t3=mapField(field,options),$[4]=field,$[5]=options,$[6]=t3):t3=$[6];let t4;$[7]===t3?t4=$[8]:(t4=(0,import_jsx_runtime.jsx)(Text,{style:valueStyle,children:t3}),$[7]=t3,$[8]=t4);let t5;$[9]===op?t5=$[10]:(t5=friendlyOp(op),$[9]=op,$[10]=t5);let t6;$[11]===t5?t6=$[12]:(t6=(0,import_jsx_runtime.jsx)(Text,{children:t5}),$[11]=t5,$[12]=t6);let t7;$[13]!==field||$[14]!==inline||$[15]!==op||$[16]!==value?(t7=![`onbudget`,`offbudget`].includes(op?.toLocaleLowerCase())&&(0,import_jsx_runtime.jsx)(Value,{style:valueStyle,value,field,inline}),$[13]=field,$[14]=inline,$[15]=op,$[16]=value,$[17]=t7):t7=$[17];let t8;return $[18]!==t1||$[19]!==t2||$[20]!==t4||$[21]!==t6||$[22]!==t7?(t8=(0,import_jsx_runtime.jsxs)(View,{style:t1,children:[t2,t4,` `,t6,` `,t7]}),$[18]=t1,$[19]=t2,$[20]=t4,$[21]=t6,$[22]=t7,$[23]=t8):t8=$[23],t8}var RuleRow=(0,import_react.memo)(t0=>{let $=(0,import_compiler_runtime.c)(77),{rule,hovered,selected,onHover,onEditRule,onDeleteRule}=t0,dispatchSelected=useSelectedDispatch(),borderColor=selected?theme.tableBorderSelected:`none`,backgroundFocus=hovered,actionSplits=groupActionsBySplitIndex(rule.actions),hasSplits=actionSplits.length>1,t1;$[0]===rule.actions?t1=$[1]:(t1=rule.actions.some(_temp),$[0]=rule.actions,$[1]=t1);let hasSchedule=t1,{t}=useTranslation(),triggerRef=(0,import_react.useRef)(null),t2;$[2]!==onEditRule||$[3]!==rule||$[4]!==t?(t2=onEditRule&&{name:`edit`,text:t(`Edit`),onClick:()=>onEditRule(rule)},$[2]=onEditRule,$[3]=rule,$[4]=t,$[5]=t2):t2=$[5];let t3;$[6]!==hasSchedule||$[7]!==onDeleteRule||$[8]!==rule||$[9]!==t?(t3=onDeleteRule&&!hasSchedule&&{name:`delete`,text:t(`Delete`),onClick:()=>onDeleteRule(rule)},$[6]=hasSchedule,$[7]=onDeleteRule,$[8]=rule,$[9]=t,$[10]=t3):t3=$[10];let t4;$[11]!==t2||$[12]!==t3?(t4={triggerRef,items:[t2,t3]},$[11]=t2,$[12]=t3,$[13]=t4):t4=$[13],useContextMenu(t4);let T0=Row,t6=selected?101:`auto`,t7=selected?theme.tableRowBackgroundHighlight:backgroundFocus?theme.tableRowBackgroundHover:theme.tableBackground,t8;$[14]!==borderColor||$[15]!==t6||$[16]!==t7?(t8={fontSize:13,zIndex:t6,borderColor,backgroundColor:t7},$[14]=borderColor,$[15]=t6,$[16]=t7,$[17]=t8):t8=$[17];let t10;$[18]!==onHover||$[19]!==rule.id?(t10=()=>onHover&&onHover(rule.id),$[18]=onHover,$[19]=rule.id,$[20]=t10):t10=$[20];let t11;$[21]===onHover?t11=$[22]:(t11=()=>onHover&&onHover(null),$[21]=onHover,$[22]=t11);let t12=hovered||selected,t13;$[23]!==dispatchSelected||$[24]!==rule.id?(t13=e=>{dispatchSelected({type:`select`,id:rule.id,isRangeSelect:e.shiftKey})},$[23]=dispatchSelected,$[24]=rule.id,$[25]=t13):t13=$[25];let t14;$[26]!==selected||$[27]!==t12||$[28]!==t13?(t14=(0,import_jsx_runtime.jsx)(SelectCell,{exposed:t12,focused:!0,onSelect:t13,selected}),$[26]=selected,$[27]=t12,$[28]=t13,$[29]=t14):t14=$[29];let t15;$[30]===Symbol.for(`react.memo_cache_sentinel`)?(t15={color:theme.tableText},$[30]=t15):t15=$[30];let t16;$[31]===rule.stage?t16=$[32]:(t16=rule.stage&&(0,import_jsx_runtime.jsx)(View,{style:{alignSelf:`flex-start`,margin:5,backgroundColor:theme.pillBackgroundSelected,color:theme.pillTextSelected,borderRadius:4,padding:`3px 5px`},children:translateRuleStage(rule.stage)}),$[31]=rule.stage,$[32]=t16);let t17;$[33]===t16?t17=$[34]:(t17=(0,import_jsx_runtime.jsx)(Cell,{name:`stage`,width:50,plain:!0,style:t15,children:t16}),$[33]=t16,$[34]=t17);let T1=Field,t19;$[35]===Symbol.for(`react.memo_cache_sentinel`)?(t19={padding:`15px 0`},$[35]=t19):t19=$[35];let T2=SpaceBetween,t21;$[36]===Symbol.for(`react.memo_cache_sentinel`)?(t21={alignItems:`center`},$[36]=t21):t21=$[36];let t22;$[37]===Symbol.for(`react.memo_cache_sentinel`)?(t22={flex:1,alignItems:`flex-start`},$[37]=t22):t22=$[37];let t23;if($[38]!==rule.conditions||$[39]!==rule.conditionsOp){let t24;$[41]===rule.conditionsOp?t24=$[42]:(t24=(cond,i)=>(0,import_jsx_runtime.jsx)(ConditionExpression,{field:cond.field,op:cond.op,inline:!0,value:cond.value,options:cond.options,prefix:i>0?friendlyOp(rule.conditionsOp):null,style:i!==0&&{marginTop:3}},i),$[41]=rule.conditionsOp,$[42]=t24),t23=rule.conditions.map(t24),$[38]=rule.conditions,$[39]=rule.conditionsOp,$[40]=t23}else t23=$[40];let t24;$[43]===t23?t24=$[44]:(t24=(0,import_jsx_runtime.jsx)(View,{style:t22,"data-testid":`conditions`,children:t23}),$[43]=t23,$[44]=t24);let t25;$[45]===Symbol.for(`react.memo_cache_sentinel`)?(t25=(0,import_jsx_runtime.jsx)(Text,{children:(0,import_jsx_runtime.jsx)(SvgRightArrow2,{style:{width:12,height:12,color:theme.tableText}})}),$[45]=t25):t25=$[45];let T3=View,t26;$[46]===Symbol.for(`react.memo_cache_sentinel`)?(t26={flex:1,alignItems:`flex-start`},$[46]=t26):t26=$[46];let t28=hasSplits?actionSplits.map((split,i_0)=>(0,import_jsx_runtime.jsxs)(View,{style:{width:`100%`,display:`flex`,flexDirection:`column`,alignItems:`flex-start`,marginTop:i_0>0?3:0,padding:`5px`,borderColor:theme.tableBorder,borderWidth:`1px`,borderRadius:`5px`},children:[(0,import_jsx_runtime.jsx)(Text,{style:{...styles.smallText,color:theme.pageTextLight,marginBottom:6},children:i_0?t(`Split {{num}}`,{num:i_0}):t(`Apply to all`)}),split.actions.map(_temp2)]},split.id)):rule.actions.map(_temp3),t29;$[47]!==T3||$[48]!==t26||$[49]!==t28?(t29=(0,import_jsx_runtime.jsx)(T3,{style:t26,"data-testid":`actions`,children:t28}),$[47]=T3,$[48]=t26,$[49]=t28,$[50]=t29):t29=$[50];let t30;$[51]!==T2||$[52]!==t21||$[53]!==t24||$[54]!==t25||$[55]!==t29?(t30=(0,import_jsx_runtime.jsxs)(T2,{style:t21,children:[t24,t25,t29]}),$[51]=T2,$[52]=t21,$[53]=t24,$[54]=t25,$[55]=t29,$[56]=t30):t30=$[56];let t31;$[57]!==T1||$[58]!==t19||$[59]!==t30?(t31=(0,import_jsx_runtime.jsx)(T1,{width:`flex`,style:t19,truncate:!1,children:t30}),$[57]=T1,$[58]=t19,$[59]=t30,$[60]=t31):t31=$[60];let t32;$[61]===Symbol.for(`react.memo_cache_sentinel`)?(t32={padding:`0 15px`,paddingLeft:5},$[61]=t32):t32=$[61];let t33;$[62]!==onEditRule||$[63]!==rule?(t33=()=>onEditRule(rule),$[62]=onEditRule,$[63]=rule,$[64]=t33):t33=$[64];let t34;$[65]===Symbol.for(`react.memo_cache_sentinel`)?(t34=(0,import_jsx_runtime.jsx)(Trans,{children:`Edit`}),$[65]=t34):t34=$[65];let t35;$[66]===t33?t35=$[67]:(t35=(0,import_jsx_runtime.jsx)(Cell,{name:`edit`,plain:!0,style:t32,children:(0,import_jsx_runtime.jsx)(Button,{onPress:t33,children:t34})}),$[66]=t33,$[67]=t35);let t36;return $[68]!==T0||$[69]!==t10||$[70]!==t11||$[71]!==t14||$[72]!==t17||$[73]!==t31||$[74]!==t35||$[75]!==t8?(t36=(0,import_jsx_runtime.jsxs)(T0,{ref:triggerRef,height:`auto`,style:t8,collapsed:!0,onMouseEnter:t10,onMouseLeave:t11,children:[t14,t17,t31,t35]}),$[68]=T0,$[69]=t10,$[70]=t11,$[71]=t14,$[72]=t17,$[73]=t31,$[74]=t35,$[75]=t8,$[76]=t36):t36=$[76],t36});RuleRow.displayName=`RuleRow`;function _temp(t0){let{op}=t0;return op===`link-schedule`}function _temp2(action,j){return(0,import_jsx_runtime.jsx)(ActionExpression,{...action,style:j!==0&&{marginTop:3}},j)}function _temp3(action_0,i_1){return(0,import_jsx_runtime.jsx)(ActionExpression,{...action_0,style:i_1!==0&&{marginTop:3}},i_1)}function RulesList(t0){let $=(0,import_compiler_runtime.c)(15),{rules,selectedItems,hoveredRule,onHover,onEditRule,onDeleteRule}=t0;if(rules.length===0)return null;let t1;if($[0]!==hoveredRule||$[1]!==onDeleteRule||$[2]!==onEditRule||$[3]!==onHover||$[4]!==rules||$[5]!==selectedItems){let t2;$[7]!==hoveredRule||$[8]!==onDeleteRule||$[9]!==onEditRule||$[10]!==onHover||$[11]!==selectedItems?(t2=rule=>(0,import_jsx_runtime.jsx)(RuleRow,{rule,hovered:hoveredRule===rule.id,selected:selectedItems.has(rule.id),onHover,onEditRule,onDeleteRule},rule.id),$[7]=hoveredRule,$[8]=onDeleteRule,$[9]=onEditRule,$[10]=onHover,$[11]=selectedItems,$[12]=t2):t2=$[12],t1=rules.map(t2),$[0]=hoveredRule,$[1]=onDeleteRule,$[2]=onEditRule,$[3]=onHover,$[4]=rules,$[5]=selectedItems,$[6]=t1}else t1=$[6];let t2;return $[13]===t1?t2=$[14]:(t2=(0,import_jsx_runtime.jsx)(View,{children:t1}),$[13]=t1,$[14]=t2),t2}function mapValue(field,value,{payees=[],categories=[],accounts=[]}){if(!value)return``;let object=null;if(field===`payee`)object=payees.find(p=>p.id===value);else if(field===`category`)object=categories.find(c=>c.id===value);else if(field===`account`)object=accounts.find(a=>a.id===value);else return value;return object?object.name:`(deleted)`}function ruleToString(rule,data){let conditions=rule.conditions.flatMap(cond=>[mapField(cond.field),friendlyOp(cond.op),(cond.op===`oneOf`||cond.op===`notOneOf`)&&Array.isArray(cond.value)?cond.value.map(v=>mapValue(cond.field,v,data)).join(`, `):mapValue(cond.field,cond.value,data)]),actions=rule.actions.flatMap(action=>{if(action.op===`set`)return[friendlyOp(action.op),mapField(action.field),`to`,mapValue(action.field,action.value,data)];if(action.op===`link-schedule`){let schedule=data.schedules?.find(s=>s.id===String(action.value));return[friendlyOp(action.op),schedule?describeSchedule(schedule,data.payees?.find(p=>p.id===schedule._payee)):`-`]}else if(action.op===`prepend-notes`||action.op===`append-notes`){let noteValue=String(action.value||``);return[friendlyOp(action.op),`“`+noteValue+`”`]}else if(action.op===`delete-transaction`)return[friendlyOp(action.op),`(delete)`];else return[]});return(rule.stage||``)+` `+conditions.join(` `)+` `+actions.join(` `)}function ManageRules({isModal,payeeId,setLoading=()=>{}}){let{t}=useTranslation(),[allRules,setAllRules]=(0,import_react.useState)([]),[page,setPage]=(0,import_react.useState)(0),[filter,setFilter]=(0,import_react.useState)(``),dispatch=useDispatch(),{schedules=[]}=useSchedules({query:(0,import_react.useMemo)(()=>q(`schedules`).select(`*`),[])}),{data:{list:categories}={list:[]}}=useCategories(),{data:payees}=usePayees(),{data:accounts=[]}=useAccounts(),filterData=(0,import_react.useMemo)(()=>({payees,accounts,schedules,categories}),[payees,accounts,schedules,categories]),filteredRules=(0,import_react.useMemo)(()=>{let rules=allRules.filter(rule=>{let schedule_0=schedules.find(schedule=>schedule.rule===rule.id);return!schedule_0||schedule_0.completed===!1});return(filter===``?rules:rules.filter(rule_0=>getNormalisedString(ruleToString(rule_0,filterData)).includes(getNormalisedString(filter)))).slice(0,100+page*50)},[allRules,filter,filterData,page,schedules]),selectedInst=useSelected(`manage-rules`,filteredRules,[]),[hoveredRule,setHoveredRule]=(0,import_react.useState)(null),onSearchChange=value=>{setFilter(value),setPage(0)};async function loadRules(){setLoading(!0);let loadedRules=null;return loadedRules=payeeId?await send(`payees-get-rules`,{id:payeeId}):await send(`rules-get`),setAllRules(loadedRules),loadedRules}let init=(0,import_react.useEffectEvent)(()=>{async function loadData(){await loadRules(),setLoading(!1)}return payeeId&&setUndoState(`openModal`,{name:`manage-rules`,options:{}}),loadData(),()=>{setUndoState(`openModal`,null)}});(0,import_react.useEffect)(()=>init(),[]);function loadMore(){setPage(page_0=>page_0+1)}let onDeleteSelected=async()=>{setLoading(!0);let{someDeletionsFailed}=await send(`rule-delete-all`,[...selectedInst.items]);someDeletionsFailed&&alert(t(`Some rules were not deleted because they are linked to schedules.`)),await loadRules(),selectedInst.dispatch({type:`select-none`}),setLoading(!1)};async function onDeleteRule(id){setLoading(!0),await send(`rule-delete`,id),await loadRules(),setLoading(!1)}let onEditRule=rule_1=>{dispatch(pushModal({modal:{name:`edit-rule`,options:{rule:rule_1,onSave:async()=>{await loadRules(),setLoading(!1)}}}}))};function onCreateRule(){dispatch(pushModal({modal:{name:`edit-rule`,options:{rule:{stage:null,conditionsOp:`and`,conditions:[{field:`payee`,op:`is`,value:payeeId||null,type:`id`}],actions:[{op:`set`,field:`category`,value:null,type:`id`}]},onSave:async()=>{await loadRules(),setLoading(!1)}}}}))}return(0,import_jsx_runtime.jsx)(SelectedProvider,{instance:selectedInst,children:(0,import_jsx_runtime.jsxs)(View,{children:[(0,import_jsx_runtime.jsxs)(View,{style:{flexDirection:`row`,alignItems:`center`,padding:isModal?`0 13px 15px`:`0 0 15px`,flexShrink:0},children:[(0,import_jsx_runtime.jsx)(View,{style:{color:theme.pageTextLight,flexDirection:`row`,alignItems:`center`,width:`50%`},children:(0,import_jsx_runtime.jsxs)(Text,{children:[(0,import_jsx_runtime.jsx)(Trans,{children:`Rules are always run in the order that you see them.`}),` `,(0,import_jsx_runtime.jsx)(Link,{variant:`external`,to:`https://actualbudget.org/docs/budgeting/rules/`,linkColor:`muted`,children:(0,import_jsx_runtime.jsx)(Trans,{children:`Learn more`})})]})}),(0,import_jsx_runtime.jsx)(View,{style:{flex:1}}),(0,import_jsx_runtime.jsx)(Search,{placeholder:t(`Filter rules...`),value:filter,onChange:onSearchChange})]}),(0,import_jsx_runtime.jsxs)(View,{style:styles.tableContainer,children:[(0,import_jsx_runtime.jsx)(RulesHeader,{}),(0,import_jsx_runtime.jsx)(InfiniteScrollWrapper,{loadMore,children:filteredRules.length===0?(0,import_jsx_runtime.jsx)(EmptyMessage,{text:t(`No rules`),style:{marginTop:15}}):(0,import_jsx_runtime.jsx)(RulesList,{rules:filteredRules,selectedItems:selectedInst.items,hoveredRule,onHover:id_0=>{setHoveredRule(id_0)},onEditRule,onDeleteRule:rule_3=>onDeleteRule(rule_3.id)})})]}),(0,import_jsx_runtime.jsx)(View,{style:{paddingBlock:15,paddingInline:isModal?13:0,borderTop:isModal&&`1px solid `+theme.pillBorder,flexShrink:0},children:(0,import_jsx_runtime.jsxs)(SpaceBetween,{gap:10,style:{justifyContent:`flex-end`},children:[selectedInst.items.size>0&&(0,import_jsx_runtime.jsx)(Button,{onPress:onDeleteSelected,children:(0,import_jsx_runtime.jsxs)(Trans,{count:selectedInst.items.size,children:[`Delete `,{count:selectedInst.items.size},` rules`]})}),(0,import_jsx_runtime.jsx)(Button,{variant:`primary`,onPress:onCreateRule,children:(0,import_jsx_runtime.jsx)(Trans,{children:`Create new rule`})})]})})]})})}function EmptyMessage(t0){let $=(0,import_compiler_runtime.c)(5),{text,style}=t0,t1;$[0]===style?t1=$[1]:(t1={textAlign:`center`,color:theme.pageTextSubdued,fontStyle:`italic`,fontSize:13,marginTop:5,style},$[0]=style,$[1]=t1);let t2;return $[2]!==t1||$[3]!==text?(t2=(0,import_jsx_runtime.jsx)(View,{style:t1,children:text}),$[2]=t1,$[3]=text,$[4]=t2):t2=$[4],t2}export{Search as _,useBuiltInBankSyncProviders as a,AuthProvider as b,groupBankSyncAccounts as c,useCurrentAccess as d,BuiltInProviders as f,isAccountFailedSync as g,getFailedSyncError as h,ActionExpression as i,useGoCardlessStatus as l,authorizeBank$1 as m,ruleToString as n,getGroupedBankSyncEntries as o,authorizeBank as p,ConditionExpression as r,getSyncSourceReadable as s,ManageRules as t,useEnableBankingStatus as u,InfiniteScrollWrapper as v,useAuth as x,Permissions as y};
2
+ //# sourceMappingURL=ManageRules.BU-s9eGL.chunk.js.map