Actual 23.8.0 版本解析隐私模式、NOT 过滤、TSV 导入与交易排序【免费下载链接】actualA local-first personal finance app项目地址: https://gitcode.com/GitHub_Trending/ac/actualActual 是一个 local-first本地优先的个人财务管理应用其 23.8.0 版本围绕数据隐私、查询能力与导入体验三个方向集中升级新增可遮蔽敏感信息的隐私模式、为暗色与自定义主题搭建了基础设施、为账户页交易列表加入列排序、为过滤与规则条件引入 NOT否定语义并借助既有 CSV 解析器原生支持 TSV 文件导入。读完本文你将掌握这些功能的实际用法、它们在前端与loot-core后端中的实现路径以及如何通过 Docker 标签23.8.0部署体验。版本总览与部署方式23.8.0 是 Actual 于 2023-08-02 发布的一个功能密集版本官方发布说明将其核心改进概括为五点交易表格列排序、按否定条件NOT过滤、TSV 文件导入支持、改进的搜索栏设计以及一系列稳定性增强。仓库中的发布说明原文见 packages/docs/blog/2023-08-02-release-23.8.0.md。该版本同时发布了 ActualWeb/桌面客户端 核心引擎与 Actual Server自托管服务端版本号均为 23.8.0Docker 镜像标签为23.8.0。自托管用户可直接拉取该标签升级例如docker pull actualbudget/actual-server:23.8.0 docker run --volume /path/to/actual-data:/data --publish 5006:5006 actualbudget/actual-server:23.8.0发布说明同时强调Actual Server 侧在 23.8.0 完成了对银行同步提供方命名从 Nordigen 到 GoCardless 的全面重命名包括升级nordigen-node至 v1.2.6、移除旧的环境变量与配置文件用法这一调整与客户端内部对 GoCardless 的引用保持一致仓库中 packages/desktop-client/src/gocardless.ts 等文件即为该同步能力的客户端实现。隐私模式一键遮蔽敏感财务信息23.8.0 新增的Privacy mode隐私模式是本版本最受关注的功能之一PR #1272它允许用户在公共场合打开 Actual 时快速隐藏账户余额、交易金额等敏感数据。实现原理隐私模式的前端核心实现在 packages/desktop-client/src/components/PrivacyFilter.tsx其工作机制值得拆解开关状态通过usePrivacyMode()读取同步偏好isPrivacyEnabled实现见 packages/desktop-client/src/hooks/usePrivacyMode.tsuseSyncedPref(isPrivacyEnabled)因此该设置会随用户数据同步、跨设备保持一致启用后PrivacyFilter组件将子内容渲染成双层结构第一层为真实内容但opacity: 0完全透明第二层为覆盖其上的RedactedContent——它通过document.createTreeWalker遍历所有文本节点把非字母数字字符替换为*从而将金额、日期等数字信息打码鼠标悬停:hover时两层互换真实内容恢复显示、遮罩层隐藏方便用户临时查看代码中通过isNarrowWidthuseResponsive对移动端做了限制即窄屏下不激活遮罩这是Limit mobile support for now策略的体现。由于遮罩层覆盖了全部子内容而不仅是数字启用后界面上的交易金额、账户余额等敏感字段都会被统一遮蔽这比单纯隐藏某一列更彻底。使用方式在桌面客户端中该功能与设置页面packages/desktop-client/src/components/settings/index.tsx联动用户可在设置中启用隐私模式此后主要数据页面交易表、报表图表、转账输入框等都会套上遮罩。从源码结构看隐私过滤组件在账户行、银行同步列表、各类报表图表如 CashFlowGraph.tsx、转账金额输入框 FinancialInput.tsx 等大量位置被复用说明它是一个全局性的敏感信息防护机制而不只是某个页面的点缀。交易列表列排序账户页的排序交互重构PR #1232 为账户Account页面引入了交易列排序这是 23.8.0 在交易体验上的核心变化。其特点在于排序同时基于当前操作与上一次操作uses current action as well as previous action to sort即点击某列进入排序后再点击可切换升序/降序第三次操作可取消排序回到默认顺序排序与过滤、搜索的交互被统一调整三者共享同一套状态避免排序结果被过滤条件打断同版本后续 PR #1406 修复了此前一次合并遗漏的行保证排序功能在 23.8.0 正式版中完整可用。排序状态的底层承载在loot-core的 Redux 状态切片中涉及 packages/loot-core/src/server/transactions/app.ts 中的查询组织逻辑桌面端通过排序后的查询结果渲染交易表格。用户可在账户页点击日期金额收款人等列标题触发排序实际排序行为与sort相关的查询参数在 packages/desktop-client/src/components/transactions/TransactionsTable.tsx 中驱动。否定条件过滤isNot、doesNotContain 与 notOneOfPR #1287 为字符串类字段的过滤条件新增了否定negate选项并在账户页过滤器和规则弹窗中同时启用。结合loot-core中 packages/loot-core/src/server/transactions/transaction-rules.ts 的规则引擎源码可以看到 23.8.0 后实际生效的完整操作符体系操作符语义示例is等于对 transfer/parent 等字段有特殊处理payee is WalmartisNot不等于否定语义含 category 为空等场景payee isNot Walmartisbetween/ 已移除的is between区间判断金额在两个值之间contains/doesNotContain包含 / 不包含子串notes doesNotContain refundoneOf/notOneOf属于集合 / 不属于集合category notOneOf [餐饮, 娱乐]gt/gte/lt/lte数值或日期比较amount gte 1000true/false布尔字段cleared truematches正则匹配payee matches ^AhasTags/hasAnyTag标签相关hasTags vacationonBudget/offBudget预算内外账户onBudget true从 transaction-rules.ts 的分支结构看否定操作符isNot、doesNotContain、notOneOf与肯定操作符在规则匹配时走不同的求值路径但共享同一套cond.field字段取值体系。值得注意的是本版本同时移除了功能异常的 is between 过滤操作符PR #1389因此上方表格中不再包含该操作符——这是发布说明明确记录的清理动作。否定过滤的实战价值在于账户页可以快速排除某类交易如不看转账记录不看某家店的开销规则Rules中则可以写出除 X 之外的所有交易都归类到 Y这类更贴近真实生活的自动化规则。TSV 导入与无表头 CSV导入体验补强PR #1372 让 Actual 支持TSVTab 分隔值文件导入实现上并非新增一套解析器而是让既有 CSV 解析器复用同一管线PR #1373 则允许导入首行不是表头的 CSV 文件。解析器实现导入入口在 packages/loot-core/src/server/transactions/import/parse-file.ts关键路径如下parseFile按扩展名分发.qif、.csv/.tsv、.ofx/.qfx、.xmlCAMT其中.csv与.tsv走同一个parseCSV函数——这正是使用现有 CSV 解析器解析 TSV的实现事实parseCSV基于csv-parse/sync库通过options.delimiter控制分隔符默认,并对 TSV 传入\toptions.hasHeaderRow对应首行是否为表头为false时columns: false数据以行数组形式返回从而支持无表头文件的导入PR #1373解析器还支持skipStartLines/skipEndLines跳过首尾噪音行、BOM 剥离bom: true、relax_column_count: true容忍列数不一致、trim与skip_empty_lines同一文件中还有parseQIF、parseOFX含括号负数、多小数点金额清洗、parseCAMT的实现其中 OFX 金额解析通过parseOfxAmount处理(30.00)→-30.00等银行常见格式。使用方式在账户页的导入Import transactions流程中选择.tsv文件即可若文件无表头行导入向导中取消首行是表头选项。配套的单元测试见 packages/loot-core/src/server/transactions/import/parse-file.test.ts其中包含各种格式的解析快照断言。同版本还修复了Safari 中交易导入不可靠的问题PR #1349并改善了 API 包下载文件失败时的错误提示PR #1396整体提升了导入链路的健壮性。目标模板Goals扩展Report Budget 与单类别预填23.8.0 在预算目标模板上有多项功能与修复集中在loot-core的预算引擎中Report Budget 支持目标模板PR #1329此前仅 Envelope 预算可用目标模板本次扩展到报告预算模式单类别预填PR #1350可将预算预填计算应用到单个分类含目标模板支持方便只对个别分类执行自动填充而非整月重算prev标志PR #1403百分比目标支持引用上月收入即percent(prev)语义性能与精度修复在目标模板中使用setZero加速PR #1344修复remainder关键字与其他关键字同用时计算错误PR #1288、多个不同优先级up to语句的填充计算PR #1312、remainder 目标残留 $0.01PR #1400、优先级模式下剩余资金追踪PR #1410。这些改动说明 23.8.0 对目标模板投入了大量精力使其在两种预算模式下都能稳定工作。搜索栏与月份选择器交互细节打磨搜索栏重构PR #1408统一所有页面的搜索栏设计覆盖账户、交易、规则等页面预算月份选择器重做PR #1235并记住当前选中月份PR #1237写入用户偏好刷新后保持计划交易进入运行余额PR #1354账户运行余额running balance开始包含当月计划交易让未来余额更可预期计划Schedules过滤支持名称匹配PR #1429可按计划名称过滤计划列表。印度数字格式lakh 与 crorePR #1412 为金额显示新增印度数字分组格式。仓库中 packages/loot-core/src/shared/currencies.ts 的货币表为印度卢比INR指定了numberFormat: comma-dot-in与其他货币使用的comma-dot、dot-comma、space-comma、apostrophe-dot等格式并列该格式对应的分组规则将数字按印度习惯分组如1,00,000即 1 lakh1,00,00,000即 1 crore相关格式化逻辑可在 packages/loot-core/src/shared/util.ts 中确认。选择印度卢比作为记账货币后即可看到该分组效果。报表与账户页稳定性修复现金流动报表纳入转账PR #1311此前转账被过滤导致期末余额不准确且受转账入账时间影响现改为纳入报表但单独拆分显示不并入收支合计修复自定义下拉组件导致的 CashFlow 报表崩溃PR #1325交易列表列宽修正PR #1380、去除视口足够大时的双重滚动条与表格下方横向滚动条PR #1385、修复回车键误建空交易PR #1316收款人页打磨PR #1334/#1335/#1371底部圆角、仅在有关联时显示显示未使用收款人按钮、优化合并提示文案。主题化基础设施与工程维护PR #1367 引入初始功能标志与主题基础设施为后续暗色与自定义主题铺路是 23.8.0 中面向未来的重要一步PR #1391 开始将部分 UI 按浅色模式单独呈现。仓库中 packages/desktop-client/src/style/customThemes.ts 与组件库 packages/component-library/src/themesdark.css、light.css、midnight.css、palette.css即该基础设施的后续产物。工程层面23.8.0 大量推进了 TypeScript 化与组件清理为loot-core改进类型、为 Redux 相关功能补充类型、将设置与弹窗基础设施移植到 TypeScript、把CustomSelect统一改名为Select并移除遗留的Select/NativeCategorySelect、用具体组件导入替代commonbarrel 导入连续 4 个 PR、更新 SVGR 并重新生成全部图标、为按钮组件启用暗色模式支持等。这些维护性工作与功能开发同步进行保障了后续版本含 24.x 的主题全面落地的质量基线。小结23.8.0 是 Actual 在隐私、查询、导入三条主线上的集大成版本隐私模式提供了悬停即可透视的全局金额打码能力NOT 过滤补全了账户页与规则的表达力TSV/无表头 CSV 导入扩展了数据进入应用的通道账户列排序、计划交易进余额、印度数字格式等则进一步打磨了日常使用细节。若你正在自托管 Actual可直接使用 Docker 标签23.8.0升级体验若你关注实现细节上述源码路径PrivacyFilter.tsx、parse-file.ts、transaction-rules.ts、currencies.ts均为继续深挖的入口。【免费下载链接】actualA local-first personal finance app项目地址: https://gitcode.com/GitHub_Trending/ac/actual创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考