Conversation
Add a scan button to the home URL setting, confirm scanned text before applying it, and keep this scan entry silent without changing other scan flows.
Add a native offline form entry page and expose the menu text as the enterprise-facing offline form entry. Introduce the historical form list experience with search, management mode, deletion selection, drag-sort support, project/version metadata, themed card edges, and deterministic identicon rendering from the form key. Replace the old raw JSON list item/parser shape with explicit offline form definition models, including definition files, index items, computed display metadata, records, and a serializer boundary for reading/writing local JSON files. Update the offline form import path so PatternInput carries schemaVersion, imported definitions are written through the local file helper, repeated imports can reuse existing computed metadata, and the lightweight index stays separate from full form definition content. Update the custom form loading/saving path to read the new local definition file structure and preserve schema version information for future submitted record files. Move offline UI strings into resources and add Chinese comments around the new helper/model/adapter responsibilities for reviewability.
- 将离线填报菜单直接进入表单列表页,移除原来的 OfflineEntryActivity 双入口占位页
- 调整离线填报 UI 流程:表单列表页只保留搜索和拖拽排序;点击表单后进入填报记录页;填报记录页顶部提供填报新单入口;右上角配置管理直接进入表单配置详情页;表单配置详情页展示基础信息、原始配置,并在底部提供删除表单配置按钮
- 新增 OfflineProjectRecordActivity,用于展示指定表单下的历史填报记录
- 新增 OfflineFormConfigDetailActivity,用于查看表单配置详情并二次确认删除配置及历史数据
- 将表单列表数据源从 HAC_OfflinePlusList.json 调整为扫描各表单目录下的 definition.json
- 新增 offlinePlus/order.json 作为轻量排序文件,只保存 patternId 顺序
- 删除旧的 OfflineFormDefinitionIndex 模型和列表索引序列化逻辑
- 导入同一 patternId 的表单配置时保留原主题色和原排序位置,新表单追加到末尾
- 提交填报数据时写入本地 records/{recordId}.json,并在保存成功后返回记录页
- 增加本地填报记录 JSON 的序列化与反序列化逻辑
- 删除表单配置时同步删除项目目录、历史填报数据,并清理 order.json 中的残留顺序
- 移除列表页批量管理、checkbox 和列表页删除入口,避免高频页面误删配置
- 补充离线填报相关字符串资源,替换表单页硬编码提示文案
- 增强本地文件删除逻辑,递归删除子文件失败时返回失败
- 增加主题色解析兜底,避免非法颜色值导致列表渲染崩溃
- 将离线填报相关 Activity 移入 container.offlineform 包,减少 container 根包下的业务页面堆积 - 同步 AndroidManifest 中离线填报 Activity 的声明路径 - 更新 MainActivity 和 OfflinePlusCardAdapter 对离线填报 Activity 的 import - 统一离线填报 layout 资源命名,使用 offline_form_* 前缀聚合模块相关布局 - 更新 CustomFormActivity、OfflinePlusListActivity、OfflineProjectRecordActivity 和 OfflinePlusCardAdapter 的 R.layout 引用 - 新增 strings_offline_form.xml,集中存放 offline_* 文案 - 从主 strings.xml 移除 offline_* 文案,保留原资源名不变,避免影响调用方
Add Lombok annotation processing for the Android app and convert offline form DTO/model classes to Lombok-generated boilerplate instead of handwritten getters, setters, and constructors. Use fastjson object serialization for local offline form records and order metadata so record.json and order.json no longer need manual org.json field-by-field parsing. Keep an explicit serializer boundary for definition.json customForm because form items are polymorphic BaseFormItem instances, while simplifying the rest of the definition file conversion to fastjson JSONObject/JSONArray. Remove derived or null-fallback getters from offline form models where default field values already provide the intended empty state, and update theme access to use computed.theme directly. Note: this commit intentionally excludes the unstaged MainActivity offline menu visibility change and untracked local files.
Replace the historical offline record cards with a white card-hosted table that supports horizontally scrollable data columns and a fixed narrow action column. The action column now uses a compact overflow menu for edit and delete, while the data row itself can still be tapped to edit the record.
Add current-version record editing by passing recordId into CustomFormActivity, loading the existing record values into supported form items, and overwriting the same record file while preserving recordId, createdAt, and schemaVersion. Old-version records remain blocked from editing.
Add single-record read and delete helpers for records/{recordId}.json so the history table can edit and remove individual saved records without touching the form definition.
Introduce computed.displayColumns as a flat list of field ids. Pattern import can provide initial display columns, definition serialization persists them, and the config detail page exposes checkbox-based column visibility editing that writes back to definition.json.
Rework the config detail screen into separate white card sections for basic information, display columns, raw configuration, and delete actions. Add a custom vector icon for the new-record entry card and adjust related offline strings.
Verification: git diff --cached --check passed. Gradle build was not run.
Introduce a handler registry for offline form item behavior so parsing, serialization, editable rendering, and read-only rendering are owned by each form item type instead of scattered across adapters and serializers. Move text and select ViewHolder implementations into their type-specific folders, add dedicated text/password/select handlers, and centralize item type/view type constants and shared JSON field mapping. Render offline record table values through each form item handler so select values display labels and password values remain masked in read-only views.
本次提交将离线填报表单从平铺 formItems 扩展为 steps + group/text/field 的结构,并补齐 Android 侧导入、渲染、历史列表展示和默认显示列逻辑。 按文件说明: - app/src/main/java/com/huozige/lab/container/offlineform/CustomFormActivity.java:改为按 step 分页渲染表单,支持上一步/下一步/提交;切换步骤时校验当前 step,提交时从完整 definition 收集所有 field 值;编辑历史记录时回填所有 step 下的 field。 - app/src/main/java/com/huozige/lab/container/offlineform/OfflineFormConfigDetailActivity.java:配置详情页统计和显示列配置改为基于 flatten 后的所有 field,适配 steps/group 嵌套结构。 - app/src/main/java/com/huozige/lab/container/offlineform/OfflineProjectRecordActivity.java:历史记录表的列标题、列值和只读表单项展示改为基于 flatten 后的 field;复用统一 dp 工具,避免本地重复尺寸转换方法。 - app/src/main/java/com/huozige/lab/container/offlineform/formitem/ReadOnlyFormItemViews.java:只读表单项视图复用统一 dp 工具,保持历史列表展示尺寸一致。 - app/src/main/java/com/huozige/lab/container/offlineform/model/OfflineFormDefinition.java:表单定义模型从 formItems 调整为 steps,用于承载多步骤和嵌套节点。 - app/src/main/java/com/huozige/lab/container/offlineform/model/OfflineFormDefinitionFactory.java:插件传入 DTO 转内部 definition 时递归构建 step、group、text、field 节点,并继续委托表单项 handler 创建 field 模型。 - app/src/main/java/com/huozige/lab/container/offlineform/model/OfflineFormDefinitionFlattener.java:新增 definition/step 扁平化工具,用于从树形结构提取所有可填报 field,以及生成当前 step 的渲染列表。 - app/src/main/java/com/huozige/lab/container/offlineform/model/OfflineFormDisplayItem.java:新增表单渲染中间模型,保存扁平节点、层级深度和展示编号,供 FormAdapter 渲染 group/text/field。 - app/src/main/java/com/huozige/lab/container/offlineform/model/OfflineFormNode.java:新增离线表单节点模型,支持 group、text、field 三种节点类型。 - app/src/main/java/com/huozige/lab/container/offlineform/model/OfflineFormStep.java:新增离线表单步骤模型,保存 stepId、标题和当前步骤的节点树。 - app/src/main/java/com/huozige/lab/container/offlineform/model/PatternInput.java:插件输入模型从 formItems 调整为 steps,承接新的多步骤 schema。 - app/src/main/java/com/huozige/lab/container/offlineform/model/PatternNodeInput.java:新增插件输入节点 DTO,用于接收 group/text/field 节点及其 children/field 配置。 - app/src/main/java/com/huozige/lab/container/offlineform/model/PatternStepInput.java:新增插件输入步骤 DTO,用于接收 stepId、标题和 items。 - app/src/main/java/com/huozige/lab/container/offlineform/model/formitem/FormItemInput.java:为 select options 增加 fastjson 字段映射,确保插件传入 options 能落到 selectOptionsList。 - app/src/main/java/com/huozige/lab/container/offlineform/util/OfflineFormUiUnitHelper.java:新增离线填报动态 UI 的 dp 转 px 工具,收敛多个类里的重复 dp 方法。 - app/src/main/java/com/huozige/lab/container/proxy/OfflinePlusProxy.java:导入新 schema 后默认将所有 field 作为历史列表显示列;重复导入时保留已有 computed 配置。 - app/src/main/java/com/huozige/lab/container/proxy/support/offlinecustomform/FormAdapter.java:渲染数据源改为 OfflineFormDisplayItem;根 group 渲染为 card,子 group 在 card 内按缩进展示;支持 text 节点、field handler 渲染、展开收起三角图标和展开收起动画。 - app/src/main/java/com/huozige/lab/container/proxy/support/offlinecustomform/OfflinePlusCardAdapter.java:复用统一 dp 工具,删除本地重复尺寸转换方法。 - app/src/main/java/com/huozige/lab/container/proxy/support/offlinecustomform/helper/OfflineFormJsonSerializer.java:definition.json 序列化/反序列化支持 steps、items、children、field 和 text/group 节点,并保持 field 节点委托表单项 registry 处理。 - app/src/main/res/layout/offline_form_custom_form_activity.xml:表单页底部操作区调整为上一步和下一步/提交按钮,支持 step 导航。 - app/src/main/res/values/colors.xml:补充离线表单页面、文本说明和 group 渲染使用的颜色资源。 - app/src/main/res/values/strings_offline_form.xml:补充上一步、下一步等多步骤表单操作文案。 验证: - 已执行 git diff --cached --check,通过。 - 未执行 Gradle build,按当前要求不跑 build。
本次提交补齐离线填报恢复在线后的数据提取入口,并将填报记录状态收敛为枚举,便于区分草稿、已提交和已导出。 按文件说明: - app/src/main/java/com/huozige/lab/container/offlineform/model/OfflineFormRecord.java:将 status 字段从 String 改为 OfflineFormRecordStatus 枚举;默认状态为 DRAFT;提交保存创建的记录状态为 SUBMITTED,避免继续散落硬编码状态字符串。 - app/src/main/java/com/huozige/lab/container/offlineform/model/OfflineFormRecordStatus.java:新增离线填报记录状态枚举,包含 DRAFT、SUBMITTED、EXPORTED 三个状态,分别表示草稿、已提交和已导出。 - app/src/main/java/com/huozige/lab/container/proxy/OfflinePlusProxy.java:新增 WebView 同步接口 offlinePlusGetRecords(projectId),用于按项目编号返回本地所有填报记录 JSON;新增 offlinePlusMarkRecordExported(projectId, recordId),用于在活字格侧完成提取后把指定记录标记为 EXPORTED。 接口说明: - window.offlinePlus.offlinePlusGetRecords(projectId):返回 records JSON 字符串;projectId 当前对应本地 patternId。 - window.offlinePlus.offlinePlusMarkRecordExported(projectId, recordId):成功返回 success,参数为空或记录不存在时返回错误字符串。 验证: - 已执行 git diff --cached --check,通过。 - 未执行 Gradle build,按当前要求不跑 build。
本次提交在离线表单配置详情页增加记录清理能力,用于按当前表单清理低风险的草稿记录和已导出记录。两个操作均需要点击按钮后在确认弹框中确认,避免误触。 按文件说明: - app/src/main/java/com/huozige/lab/container/offlineform/OfflineFormConfigDetailActivity.java:在配置详情页注册清理草稿和清理已导出数据两个按钮事件;点击后弹出确认框,确认后按对应 OfflineFormRecordStatus 调用文件 helper 删除记录,并用 Toast 返回删除数量。 - app/src/main/java/com/huozige/lab/container/proxy/support/offlinecustomform/helper/OfflineFormFileHelper.java:新增 deleteRecordsByStatus(context, patternId, status),统一按记录状态遍历并删除当前表单目录下匹配的 record 文件,避免页面层直接处理文件细节。 - app/src/main/res/layout/offline_form_config_detail_activity.xml:在配置详情页新增记录清理卡片,包含清理所有草稿和清理所有已导出数据两个蓝色按钮;删除表单配置按钮仍保持红色,用于区分高风险删除配置操作。 - app/src/main/res/values/strings_offline_form.xml:新增记录清理标题、两个按钮文案、两个确认弹框文案和删除数量 Toast 文案。 验证: - 已执行 git diff --cached --check,通过。 - 未执行 Gradle build,按当前要求不跑 build。
本次提交在离线填报记录页展示草稿卡片,并在多步骤表单点击下一步时保存草稿,使用户可以从草稿继续填报。提交时草稿会转为已提交记录,历史记录表只展示非草稿记录。 按文件说明: - app/src/main/java/com/huozige/lab/container/offlineform/CustomFormActivity.java:在非最后一步点击下一步时保存草稿;如果当前 step 及之前 step 没有任何 field,则不创建新草稿;已有草稿继续填报时更新同一条记录;点击提交时将记录状态改为 SUBMITTED;编辑已提交记录时不会在下一步时降级成草稿。 - app/src/main/java/com/huozige/lab/container/offlineform/OfflineProjectRecordActivity.java:读取记录后拆分 DRAFT 和非草稿记录;在填报新单下方渲染草稿卡片;点击草稿卡片整体继续填报并从 step1 打开;草稿卡片右侧提供更多菜单,包含继续填报和删除;历史填报表只显示非草稿记录。 - app/src/main/java/com/huozige/lab/container/offlineform/model/OfflineFormRecord.java:新增 createDraft(patternId, schemaVersion, values),用于创建 DRAFT 状态的草稿记录。 - app/src/main/res/drawable/ic_offline_draft_record.xml:新增草稿卡片图标,用于和填报新单入口图标区分。 - app/src/main/res/layout/offline_form_project_record_activity.xml:在填报新单卡片下方新增 draftListLayout 容器,用于按数量展示多个草稿卡片。 - app/src/main/res/values/strings_offline_form.xml:新增草稿标题、草稿上次保存时间文案和继续填报菜单文案。 验证: - 已执行 git diff --cached --check,通过。 - 未执行 Gradle build,按当前要求不跑 build。
本次提交为离线填报历史记录表增加分页能力,并将每页条数作为 computed 配置保存到 definition.json 中,与 theme 和 displayColumns 保持同级。测试阶段分页选项包含 1、10、20、50、100。 按文件说明: - app/src/main/java/com/huozige/lab/container/offlineform/model/OfflineComputedInfo.java:新增 recordPageSize 字段和默认值 DEFAULT_RECORD_PAGE_SIZE=10,用于保存历史记录表每页显示数量。 - app/src/main/java/com/huozige/lab/container/proxy/support/offlinecustomform/helper/OfflineFormJsonSerializer.java:序列化 definition.json 时将 computed.recordPageSize 写入本地配置文件,保证分页设置可持久化。 - app/src/main/java/com/huozige/lab/container/proxy/OfflinePlusProxy.java:导入或重复导入表单配置时保留已有 recordPageSize;新配置默认使用 10,避免重新导入时丢失用户在配置管理页设置的分页条数。 - app/src/main/java/com/huozige/lab/container/offlineform/OfflineFormConfigDetailActivity.java:配置管理页新增分页大小下拉选择,选项为 1、10、20、50、100;选择后立即写回 definition.json,并刷新原始配置展示。 - app/src/main/res/layout/offline_form_config_detail_activity.xml:新增历史记录每页条数配置卡片,放在基础信息和显示列配置之间,使用 Spinner 展示可选分页大小。 - app/src/main/java/com/huozige/lab/container/offlineform/OfflineProjectRecordActivity.java:历史记录表按 computed.recordPageSize 分页渲染;记录数小于等于分页大小时不显示分页条;超过分页大小时显示上一页、页码信息和下一页;草稿卡片不参与历史记录分页。 - app/src/main/res/values/strings_offline_form.xml:新增分页按钮、页码信息和配置标题文案。 验证: - 已执行 git diff --cached --check,通过。 - 未执行 Gradle build,按当前要求不跑 build。
实现内容: - 将填报记录按状态拆分为历史填报记录和已导出记录两个同级区域。 - 抽取 OfflineRecordTableView 作为可复用记录表组件,分别实例化历史记录表和已导出记录表。 - 记录表组件内部维护分页状态,分页时只刷新表格行和分页按钮状态,不重建外层 Card、HorizontalScrollView 和分页栏,避免横向滚动条闪烁或回到起点。 - 已导出记录只支持查看和删除,点击记录行进入 JSON 详情页,操作菜单仅保留删除。 - 历史填报记录继续支持编辑和删除。 文件变更: - app/src/main/java/com/huozige/lab/container/offlineform/OfflineProjectRecordActivity.java:保留页面级数据加载、草稿渲染、记录状态分组和两个记录表实例挂载;移除原本散落在 Activity 内的表格、分页、行渲染逻辑。 - app/src/main/java/com/huozige/lab/container/offlineform/OfflineRecordTableView.java:新增可复用记录表组件,集中处理表头、字段展示、操作列、分页和只读/可编辑行为差异。 - app/src/main/java/com/huozige/lab/container/offlineform/OfflineExportedRecordDetailActivity.java:新增已导出记录详情页,按 patternId 和 recordId 读取本地记录并展示序列化 JSON。 - app/src/main/res/layout/offline_exported_record_detail_activity.xml:新增 JSON 详情页布局,使用可选择的等宽文本展示记录内容。 - app/src/main/res/layout/offline_form_project_record_activity.xml:新增已导出记录一级标题和独立表格容器,使其与历史填报记录同级展示。 - app/src/main/res/values/strings_offline_form.xml:新增已导出记录标题、详情页标题和记录缺失提示文案。 - app/src/main/AndroidManifest.xml:注册已导出记录详情页 Activity。 验证: - 已执行 git diff --check --cached,未发现空白或补丁格式问题。 - 已用 rg 检查分页按钮逻辑位于 OfflineRecordTableView 内部,未保留 scrollX/scrollTo/setOnScrollChangeListener 修补逻辑。 - 未执行 Gradle build。
实现内容: - WebView 获取离线记录时只返回已提交记录,避免草稿和已导出记录参与上传流程。 - 标记记录为已导出时增加状态校验,只允许 SUBMITTED 转为 EXPORTED。 - 对已导出记录重复标记时返回 record already exported.。 - 对草稿或其他非提交状态记录标记导出时返回 record is not submitted.。 文件变更: - app/src/main/java/com/huozige/lab/container/proxy/OfflinePlusProxy.java:新增已提交记录过滤逻辑,并在 offlinePlusMarkRecordExported 中增加导出状态流转校验,保证取数和标记导出的 API 只处理正确生命周期阶段的数据。 验证: - 已执行 git diff --check --cached,未发现空白或补丁格式问题。 - 已用 rg 确认 offlinePlusGetRecords、offlinePlusMarkRecordExported、filterSubmittedRecords 和新增返回信息均存在。 - 未执行 Gradle build。
本次提交完成离线填报表单项扩展和填报页交互调整:新增 datePicker、timePicker、imageItem 三类表单项;图片项支持拍照、压缩、元数据保存和只读数量展示;填报页去掉底部上一步/下一步,改用顶部 tabs 切换 step,并把最终保存提交入口放到右上角。 文件说明: app/src/main/java/com/huozige/lab/container/offlineform/CustomFormActivity.java:接入 TabLayout 步骤切换;切换 tab 时复用草稿保存逻辑;新增右上角带图标和文案的保存 action view;保存时校验所有 step 并提交为已提交记录;接入图片拍照回调和图片字段回填。 app/src/main/java/com/huozige/lab/container/offlineform/formitem/OfflineFormItemJsonKeys.java:补充 imageItem 的 maxCount、compression、maxLongEdge、jpegQuality、maxFileSizeKb、minQuality 等 JSON key。 app/src/main/java/com/huozige/lab/container/offlineform/formitem/OfflineFormItemRegistry.java:注册 datePicker、timePicker、imageItem 三类 handler,让配置解析、编辑态渲染、definition 写回和只读展示继续通过统一 registry 分发。 app/src/main/java/com/huozige/lab/container/offlineform/formitem/OfflineFormItemType.java:新增 datePicker、timePicker、imageItem 的 itemType 枚举值。 app/src/main/java/com/huozige/lab/container/offlineform/formitem/OfflineFormItemViewType.java:新增三个表单项对应的 RecyclerView viewType 固定值。 app/src/main/java/com/huozige/lab/container/offlineform/formitem/image/ImageCaptureCallback.java:定义图片拍照成功后的回调接口,供 Activity 把压缩后的图片元数据回传给 ViewHolder。 app/src/main/java/com/huozige/lab/container/offlineform/formitem/image/ImageCaptureHost.java:定义图片表单项请求拍照的宿主接口,避免 ViewHolder 直接管理 ActivityResultLauncher。 app/src/main/java/com/huozige/lab/container/offlineform/formitem/image/ImageFormItemHandler.java:实现 imageItem 的输入模型转换、definition JSON 输出、options 读取、编辑 ViewHolder 创建和历史表只读数量展示。 app/src/main/java/com/huozige/lab/container/offlineform/formitem/image/ImageViewHolder.java:实现图片列表编辑 UI,支持拍照入口、最大数量限制、图片缩略图展示、移除图片值和必填错误展示。 app/src/main/java/com/huozige/lab/container/offlineform/formitem/image/OfflineImageFileHelper.java:实现拍照 URI 解码、图片压缩、本地离线附件目录写入、图片元数据生成和本地图片文件解析。 app/src/main/java/com/huozige/lab/container/offlineform/formitem/picker/DatePickerFormItemHandler.java:实现 datePicker 类型 handler,指定日期选择模式和固定 viewType。 app/src/main/java/com/huozige/lab/container/offlineform/formitem/picker/PickerFormItemHandler.java:抽取 datePicker/timePicker 共用 handler 逻辑,负责基础模型转换、JSON 输出、只读展示和编辑 ViewHolder 创建。 app/src/main/java/com/huozige/lab/container/offlineform/formitem/picker/PickerMode.java:定义 picker ViewHolder 使用的日期/时间模式枚举。 app/src/main/java/com/huozige/lab/container/offlineform/formitem/picker/PickerViewHolder.java:实现日期/时间选择编辑 UI,分别弹出系统 DatePickerDialog 和 TimePickerDialog,并把结果保存为 yyyy-MM-dd 或 HH:mm。 app/src/main/java/com/huozige/lab/container/offlineform/formitem/picker/TimePickerFormItemHandler.java:实现 timePicker 类型 handler,指定时间选择模式和固定 viewType。 app/src/main/java/com/huozige/lab/container/offlineform/model/formitem/FormItemInput.java:扩展插件输入 DTO,接收 imageItem 的 maxCount 和 compression 配置。 app/src/main/java/com/huozige/lab/container/offlineform/model/formitem/ImageCompressionOptions.java:新增图片压缩配置模型,提供默认最长边、JPEG 质量、目标大小和最低质量。 app/src/main/java/com/huozige/lab/container/offlineform/model/formitem/ImageFormItem.java:新增图片列表表单项模型,负责图片元数据数组 JSON 序列化、反序列化、必填校验和最大数量校验。 app/src/main/java/com/huozige/lab/container/offlineform/model/formitem/ImageFormItemValue.java:新增单张图片元数据模型,保存 fileId、localPath、fileName、mimeType、size、width、height、createdAt。 app/src/main/java/com/huozige/lab/container/offlineform/model/formitem/PickerFormItem.java:新增日期/时间共用值模型,负责字符串值保存和必填校验。 app/src/main/res/drawable/ic_offline_save.xml:新增右上角保存 action 使用的白色保存图标。 app/src/main/res/layout/custom_form_item_form_image.xml:新增 imageItem 编辑态布局,包含标题、必填标记、图片列表、拍照按钮和错误提示。 app/src/main/res/layout/custom_form_item_form_picker.xml:新增 datePicker/timePicker 编辑态布局,包含标题、必填标记、可点击值区域和错误提示。 app/src/main/res/layout/offline_form_custom_form_activity.xml:去掉底部上一步/下一步区域,新增顶部 TabLayout 展示 step。 验证: 已执行 git diff --cached --check,无输出。未执行 Gradle build。
本次提交为离线填报页面恢复并调整上一项/下一项能力。导航只针对当前 step 的第一层 group、text、formItem,不处理嵌套 group 内部子项;按钮固定在屏幕底部,点击时按当前纵向滚动位置实时计算目标项并滚动到对应根节点。 app/src/main/java/com/huozige/lab/container/offlineform/CustomFormActivity.java:新增底部上一项/下一项点击逻辑;根据当前 NestedScrollView 的 scrollY 和 RecyclerView 根 item 的纵坐标动态计算上一项或下一项,不保存 current position 状态;切换目标后执行平滑滚动并对目标根节点播放短暂高亮动画;切换 step 时重置滚动位置;根据当前 step 第一层 item 数量大于 1 控制底部导航栏显示;为每个 step 底部提示区设置约 35% 屏幕高度,保证最后一项也能被滚动到可视区域。 app/src/main/res/layout/offline_form_custom_form_activity.xml:将表单内容包在 NestedScrollView 中,并在 RecyclerView 下方增加到底了提示区作为底部留白;新增固定在屏幕底部的上一项/下一项导航容器,按钮等宽显示,避免占用 tabs 下方空间,也避免按钮被 0dp 宽度压缩不可见。 app/src/main/res/values/strings_offline_form.xml:将旧的上一步/下一步文案替换为当前根节点导航使用的上一项/下一项;新增到底了提示文案;删除已无引用的提交按钮文案和历史记录摘要文案,减少离线表单资源里的废弃项。 验证:已执行 git diff --cached --check;已逐项扫描 strings_offline_form.xml,当前没有未引用的离线表单 string 资源;未执行 Gradle build。
本次提交在离线填报页增加当前 step 内的未填写项目过滤能力。过滤入口放在 step tabs 行右侧,切换 step 时默认恢复显示全部项目;过滤结果只影响当前 step 的展示列表,不修改 definition 原始数据,也不改变保存和提交数据结构。 app/src/main/java/com/huozige/lab/container/offlineform/CustomFormActivity.java:新增仅未填 Switch 的初始化、监听和 step 切换重置逻辑;切换 step 时临时移除监听并显式渲染一次,避免依赖 setChecked 的副作用;渲染当前 step 时根据开关状态过滤第一层 root item,root formItem 为空才显示,root group 递归检查内部 formItem 只要有未填写项就显示,root text 在仅未填模式下隐藏;底部上一项/下一项导航自然基于过滤后的第一层列表工作。 app/src/main/java/com/huozige/lab/container/offlineform/model/formitem/BaseFormItem.java:新增 isEmpty 抽象方法,把表单项是否为空定义为所有表单类型必须提供的模型能力,避免页面层根据 itemType 写分散判断。 app/src/main/java/com/huozige/lab/container/offlineform/model/formitem/TextFormItem.java:实现文本/密码表单项的 isEmpty,按 value 为空或 trim 后为空判断未填写,并让必填校验复用该判断。 app/src/main/java/com/huozige/lab/container/offlineform/model/formitem/SelectFormItem.java:实现选择框表单项的 isEmpty,按 selectedValue 为空判断未填写,并让必填校验复用该判断。 app/src/main/java/com/huozige/lab/container/offlineform/model/formitem/PickerFormItem.java:实现日期/时间选择类表单项的 isEmpty,按 value 为空或 trim 后为空判断未填写,并让必填校验复用该判断。 app/src/main/java/com/huozige/lab/container/offlineform/model/formitem/ImageFormItem.java:实现图片表单项的 isEmpty,按图片列表为空判断未填写,避免把空图片序列化结果 [] 误判为已填写,并让必填校验复用该判断。 app/src/main/res/layout/offline_form_custom_form_activity.xml:将原来的单独 TabLayout 包装成水平 step bar,在 tabs 右侧增加仅未填 Switch;tabs 继续占用剩余宽度,开关固定显示在右侧,保持筛选入口和 step 切换处于同一行。 app/src/main/res/values/strings_offline_form.xml:新增仅未填开关文案,供离线填报页顶部筛选入口使用。 验证:已执行 git diff --cached --check;已逐项扫描 strings_offline_form.xml,当前没有未引用的离线表单 string 资源;已扫描 BaseFormItem 子类,当前只有 TextFormItem、SelectFormItem、PickerFormItem、ImageFormItem 四个子类且均已实现 isEmpty;未执行 Gradle build。
OfflineFormJsonSerializer: preserves the field node title from imported raw config without copying it into field.title, keeping the saved field payload shape unchanged. OfflineFormDisplayItem and OfflineFormDefinitionFlattener: keep field display items tied to their source node so display title can prefer field.title and fall back to the node title. OfflineFormConfigDetailActivity, OfflineRecordTableView, and FormAdapter: use the display-title helper for config display columns, record table headers, and form rendering while leaving the underlying BaseFormItem title unchanged.
app/src/main/java/com/huozige/lab/container/offlineform/OfflineProjectRecordActivity.java:在项目填报记录页右上角菜单新增原始配置,让原始 JSON 入口和配置管理处于同一级菜单,符合这次要求的导航层级。 app/src/main/java/com/huozige/lab/container/offlineform/OfflineFormRawConfigActivity.java:新增只读的原始配置页面,专门读取并格式化 definition.json,避免把原始 JSON 展示继续混在配置管理页的编辑和清理操作里。 app/src/main/res/layout/offline_form_raw_config_activity.xml:新增最小化的可滚动、等宽字体、可选择文本布局,用于查看原始 JSON,不增加额外无关控件。 app/src/main/java/com/huozige/lab/container/offlineform/OfflineFormConfigDetailActivity.java:移除原始配置刷新和 JSON 格式化逻辑,因为配置详情页不再负责渲染原始配置内容。 app/src/main/res/layout/offline_form_config_detail_activity.xml:删除配置详情页中的原始配置卡片,让该页面只保留基础信息、显示列、分页条数和清理删除等配置管理能力。 app/src/main/AndroidManifest.xml:注册 OfflineFormRawConfigActivity,确保项目填报记录页新增的菜单项可以正常打开原始配置页面。
app/src/main/java/com/huozige/lab/container/offlineform/formitem/OfflineFormItemJsonKeys.java:新增 includeSeconds 常量,避免时间选择字段的秒数配置使用散落字符串。 app/src/main/java/com/huozige/lab/container/offlineform/formitem/picker/PickerFormItemHandler.java:读取并写回时间选择字段的 includeSeconds 配置,让本地 definition.json 能保留是否包含秒的设置。 app/src/main/java/com/huozige/lab/container/offlineform/formitem/picker/PickerViewHolder.java:日期选择默认使用打开选择器当下日期并保存为 yyyy/M/d;时间选择默认使用打开选择器当下时间,不包含秒时继续使用系统原生选择器,包含秒时保存为 HH:mm:ss。 app/src/main/java/com/huozige/lab/container/offlineform/model/formitem/FormItemInput.java:在导入表单定义时承接插件传入的 includeSeconds 字段。 app/src/main/java/com/huozige/lab/container/offlineform/model/formitem/PickerFormItem.java:在表单项模型上保存 includeSeconds,供渲染层决定使用原生时分选择器还是时分秒选择器。
added 30 commits
July 3, 2026 17:59
# Conflicts: # .idea/misc.xml # app/build.gradle # app/release/output-metadata.json # app/src/main/java/com/huozige/lab/container/webview/HACWebChromeClient.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.