skill-home 0.3.1 → 0.3.13
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.
- package/SKILL.md +96 -52
- package/dist/cli/cmd_read.js +59 -778
- package/dist/cli/cmd_read.js.map +1 -1
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +11 -1
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/keys.d.ts +4 -0
- package/dist/cli/keys.d.ts.map +1 -0
- package/dist/cli/keys.js +51 -0
- package/dist/cli/keys.js.map +1 -0
- package/dist/cli/registry.d.ts +4 -0
- package/dist/cli/registry.d.ts.map +1 -0
- package/dist/cli/registry.js +30 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +14 -7
- package/dist/config.js.map +1 -1
- package/dist/express/commands.d.ts +3 -0
- package/dist/express/commands.d.ts.map +1 -0
- package/dist/express/commands.js +6 -0
- package/dist/express/commands.js.map +1 -0
- package/dist/express/index.d.ts +3 -0
- package/dist/express/index.d.ts.map +1 -0
- package/dist/express/index.js +4 -0
- package/dist/express/index.js.map +1 -0
- package/dist/express/pages/express.d.ts +24 -0
- package/dist/express/pages/express.d.ts.map +1 -0
- package/dist/express/pages/express.js +160 -0
- package/dist/express/pages/express.js.map +1 -0
- package/dist/express/pages/list.d.ts +24 -0
- package/dist/express/pages/list.d.ts.map +1 -0
- package/dist/express/pages/list.js +167 -0
- package/dist/express/pages/list.js.map +1 -0
- package/dist/express/pages/missing.d.ts +24 -0
- package/dist/express/pages/missing.d.ts.map +1 -0
- package/dist/express/pages/missing.js +146 -0
- package/dist/express/pages/missing.js.map +1 -0
- package/dist/express/pages/stock.d.ts +24 -0
- package/dist/express/pages/stock.d.ts.map +1 -0
- package/dist/express/pages/stock.js +176 -0
- package/dist/express/pages/stock.js.map +1 -0
- package/dist/express/routes.d.ts +3 -0
- package/dist/express/routes.d.ts.map +1 -0
- package/dist/express/routes.js +8 -0
- package/dist/express/routes.js.map +1 -0
- package/dist/express/shopping.d.ts +4 -0
- package/dist/express/shopping.d.ts.map +1 -0
- package/dist/express/shopping.js +143 -0
- package/dist/express/shopping.js.map +1 -0
- package/dist/family/care.d.ts +4 -0
- package/dist/family/care.d.ts.map +1 -0
- package/dist/family/care.js +103 -0
- package/dist/family/care.js.map +1 -0
- package/dist/family/commands.d.ts +3 -0
- package/dist/family/commands.d.ts.map +1 -0
- package/dist/family/commands.js +6 -0
- package/dist/family/commands.js.map +1 -0
- package/dist/family/index.d.ts +3 -0
- package/dist/family/index.d.ts.map +1 -0
- package/dist/family/index.js +4 -0
- package/dist/family/index.js.map +1 -0
- package/dist/family/pages/family_borrow.d.ts +24 -0
- package/dist/family/pages/family_borrow.d.ts.map +1 -0
- package/dist/family/pages/family_borrow.js +267 -0
- package/dist/family/pages/family_borrow.js.map +1 -0
- package/dist/family/pages/family_members.d.ts +24 -0
- package/dist/family/pages/family_members.d.ts.map +1 -0
- package/dist/family/pages/family_members.js +171 -0
- package/dist/family/pages/family_members.js.map +1 -0
- package/dist/family/routes.d.ts +3 -0
- package/dist/family/routes.d.ts.map +1 -0
- package/dist/family/routes.js +20 -0
- package/dist/family/routes.js.map +1 -0
- package/dist/fetch/db.d.ts.map +1 -1
- package/dist/fetch/db.js +9 -1
- package/dist/fetch/db.js.map +1 -1
- package/dist/fetch/domains.d.ts +92 -0
- package/dist/fetch/domains.d.ts.map +1 -1
- package/dist/fetch/domains.js +165 -26
- package/dist/fetch/domains.js.map +1 -1
- package/dist/fetch/index.d.ts +2 -1
- package/dist/fetch/index.d.ts.map +1 -1
- package/dist/fetch/index.js +6 -1
- package/dist/fetch/index.js.map +1 -1
- package/dist/health.d.ts +9 -0
- package/dist/health.d.ts.map +1 -1
- package/dist/health.js +19 -0
- package/dist/health.js.map +1 -1
- package/dist/help/helpAssets.js +1 -1
- package/dist/items/add.d.ts +3 -0
- package/dist/items/add.d.ts.map +1 -0
- package/dist/items/add.js +34 -0
- package/dist/items/add.js.map +1 -0
- package/dist/items/commands.d.ts +3 -0
- package/dist/items/commands.d.ts.map +1 -0
- package/dist/items/commands.js +22 -0
- package/dist/items/commands.js.map +1 -0
- package/dist/items/detail.d.ts +3 -0
- package/dist/items/detail.d.ts.map +1 -0
- package/dist/items/detail.js +31 -0
- package/dist/items/detail.js.map +1 -0
- package/dist/items/index.d.ts +3 -0
- package/dist/items/index.d.ts.map +1 -0
- package/dist/items/index.js +4 -0
- package/dist/items/index.js.map +1 -0
- package/dist/items/inventory.d.ts +4 -0
- package/dist/items/inventory.d.ts.map +1 -0
- package/dist/items/inventory.js +41 -0
- package/dist/items/inventory.js.map +1 -0
- package/dist/items/pages/add_form.d.ts +24 -0
- package/dist/items/pages/add_form.d.ts.map +1 -0
- package/dist/items/pages/add_form.js +174 -0
- package/dist/items/pages/add_form.js.map +1 -0
- package/dist/items/pages/browse.d.ts +24 -0
- package/dist/items/pages/browse.d.ts.map +1 -0
- package/dist/items/pages/browse.js +143 -0
- package/dist/items/pages/browse.js.map +1 -0
- package/dist/items/pages/category_manage.d.ts +24 -0
- package/dist/items/pages/category_manage.d.ts.map +1 -0
- package/dist/items/pages/category_manage.js +153 -0
- package/dist/items/pages/category_manage.js.map +1 -0
- package/dist/items/pages/confirm.d.ts +24 -0
- package/dist/items/pages/confirm.d.ts.map +1 -0
- package/dist/items/pages/confirm.js +149 -0
- package/dist/items/pages/confirm.js.map +1 -0
- package/dist/items/pages/detail.d.ts +24 -0
- package/dist/items/pages/detail.d.ts.map +1 -0
- package/dist/items/pages/detail.js +160 -0
- package/dist/items/pages/detail.js.map +1 -0
- package/dist/items/pages/duplicates.d.ts +24 -0
- package/dist/items/pages/duplicates.d.ts.map +1 -0
- package/dist/items/pages/duplicates.js +138 -0
- package/dist/items/pages/duplicates.js.map +1 -0
- package/dist/items/pages/history.d.ts +24 -0
- package/dist/items/pages/history.d.ts.map +1 -0
- package/dist/items/pages/history.js +213 -0
- package/dist/items/pages/history.js.map +1 -0
- package/dist/items/pages/inventory_diff.d.ts +24 -0
- package/dist/items/pages/inventory_diff.d.ts.map +1 -0
- package/dist/items/pages/inventory_diff.js +126 -0
- package/dist/items/pages/inventory_diff.js.map +1 -0
- package/dist/items/pages/inventory_records.d.ts +24 -0
- package/dist/items/pages/inventory_records.d.ts.map +1 -0
- package/dist/items/pages/inventory_records.js +147 -0
- package/dist/items/pages/inventory_records.js.map +1 -0
- package/dist/items/pages/inventory_round.d.ts +24 -0
- package/dist/items/pages/inventory_round.d.ts.map +1 -0
- package/dist/items/pages/inventory_round.js +145 -0
- package/dist/items/pages/inventory_round.js.map +1 -0
- package/dist/items/pages/locate.d.ts +24 -0
- package/dist/items/pages/locate.d.ts.map +1 -0
- package/dist/items/pages/locate.js +129 -0
- package/dist/items/pages/locate.js.map +1 -0
- package/dist/items/pages/move_checklist.d.ts +24 -0
- package/dist/items/pages/move_checklist.d.ts.map +1 -0
- package/dist/items/pages/move_checklist.js +112 -0
- package/dist/items/pages/move_checklist.js.map +1 -0
- package/dist/items/pages/photo_wall.d.ts +24 -0
- package/dist/items/pages/photo_wall.d.ts.map +1 -0
- package/dist/items/pages/photo_wall.js +145 -0
- package/dist/items/pages/photo_wall.js.map +1 -0
- package/dist/items/pages/photos.d.ts +24 -0
- package/dist/items/pages/photos.d.ts.map +1 -0
- package/dist/items/pages/photos.js +182 -0
- package/dist/items/pages/photos.js.map +1 -0
- package/dist/items/pages/receipt.d.ts +24 -0
- package/dist/items/pages/receipt.d.ts.map +1 -0
- package/dist/items/pages/receipt.js +252 -0
- package/dist/items/pages/receipt.js.map +1 -0
- package/dist/items/pages/relations.d.ts +24 -0
- package/dist/items/pages/relations.d.ts.map +1 -0
- package/dist/items/pages/relations.js +144 -0
- package/dist/items/pages/relations.js.map +1 -0
- package/dist/items/pages/search_list.d.ts +24 -0
- package/dist/items/pages/search_list.d.ts.map +1 -0
- package/dist/items/pages/search_list.js +133 -0
- package/dist/items/pages/search_list.js.map +1 -0
- package/dist/items/pages/tag_manage.d.ts +24 -0
- package/dist/items/pages/tag_manage.d.ts.map +1 -0
- package/dist/items/pages/tag_manage.js +213 -0
- package/dist/items/pages/tag_manage.js.map +1 -0
- package/dist/items/pages/undo_select.d.ts +24 -0
- package/dist/items/pages/undo_select.d.ts.map +1 -0
- package/dist/items/pages/undo_select.js +143 -0
- package/dist/items/pages/undo_select.js.map +1 -0
- package/dist/items/routes.d.ts +3 -0
- package/dist/items/routes.d.ts.map +1 -0
- package/dist/items/routes.js +62 -0
- package/dist/items/routes.js.map +1 -0
- package/dist/items/search.d.ts +3 -0
- package/dist/items/search.d.ts.map +1 -0
- package/dist/items/search.js +47 -0
- package/dist/items/search.js.map +1 -0
- package/dist/items/tag.d.ts +25 -0
- package/dist/items/tag.d.ts.map +1 -0
- package/dist/items/tag.js +133 -0
- package/dist/items/tag.js.map +1 -0
- package/dist/items/update.d.ts +20 -0
- package/dist/items/update.d.ts.map +1 -0
- package/dist/items/update.js +211 -0
- package/dist/items/update.js.map +1 -0
- package/dist/outfit/commands.d.ts +3 -0
- package/dist/outfit/commands.d.ts.map +1 -0
- package/dist/outfit/commands.js +7 -0
- package/dist/outfit/commands.js.map +1 -0
- package/dist/outfit/index.d.ts +3 -0
- package/dist/outfit/index.d.ts.map +1 -0
- package/dist/outfit/index.js +4 -0
- package/dist/outfit/index.js.map +1 -0
- package/dist/outfit/outfit.d.ts +3 -0
- package/dist/outfit/outfit.d.ts.map +1 -0
- package/dist/outfit/outfit.js +182 -0
- package/dist/outfit/outfit.js.map +1 -0
- package/dist/outfit/pages/outfit_picker.d.ts +24 -0
- package/dist/outfit/pages/outfit_picker.d.ts.map +1 -0
- package/dist/outfit/pages/outfit_picker.js +185 -0
- package/dist/outfit/pages/outfit_picker.js.map +1 -0
- package/dist/outfit/pages/travel_trip.d.ts +24 -0
- package/dist/outfit/pages/travel_trip.d.ts.map +1 -0
- package/dist/outfit/pages/travel_trip.js +185 -0
- package/dist/outfit/pages/travel_trip.js.map +1 -0
- package/dist/outfit/pages/trip_outfit_plan.d.ts +24 -0
- package/dist/outfit/pages/trip_outfit_plan.d.ts.map +1 -0
- package/dist/outfit/pages/trip_outfit_plan.js +173 -0
- package/dist/outfit/pages/trip_outfit_plan.js.map +1 -0
- package/dist/outfit/pages/wardrobe_analyze.d.ts +24 -0
- package/dist/outfit/pages/wardrobe_analyze.d.ts.map +1 -0
- package/dist/outfit/pages/wardrobe_analyze.js +171 -0
- package/dist/outfit/pages/wardrobe_analyze.js.map +1 -0
- package/dist/outfit/pages/wardrobe_season.d.ts +24 -0
- package/dist/outfit/pages/wardrobe_season.d.ts.map +1 -0
- package/dist/outfit/pages/wardrobe_season.js +167 -0
- package/dist/outfit/pages/wardrobe_season.js.map +1 -0
- package/dist/outfit/routes.d.ts +3 -0
- package/dist/outfit/routes.d.ts.map +1 -0
- package/dist/outfit/routes.js +9 -0
- package/dist/outfit/routes.js.map +1 -0
- package/dist/outfit/trip.d.ts +3 -0
- package/dist/outfit/trip.d.ts.map +1 -0
- package/dist/outfit/trip.js +59 -0
- package/dist/outfit/trip.js.map +1 -0
- package/dist/output.d.ts +13 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +57 -0
- package/dist/output.js.map +1 -0
- package/dist/policy/routes.generated.d.ts +3 -0
- package/dist/policy/routes.generated.d.ts.map +1 -0
- package/dist/policy/routes.generated.js +128 -0
- package/dist/policy/routes.generated.js.map +1 -0
- package/dist/policy/wakewords.d.ts +1 -0
- package/dist/policy/wakewords.d.ts.map +1 -1
- package/dist/policy/wakewords.js +11 -93
- package/dist/policy/wakewords.js.map +1 -1
- package/dist/receipt/commands.d.ts +3 -0
- package/dist/receipt/commands.d.ts.map +1 -0
- package/dist/receipt/commands.js +6 -0
- package/dist/receipt/commands.js.map +1 -0
- package/dist/receipt/index.d.ts +3 -0
- package/dist/receipt/index.d.ts.map +1 -0
- package/dist/receipt/index.js +4 -0
- package/dist/receipt/index.js.map +1 -0
- package/dist/receipt/pages/accounts.d.ts +24 -0
- package/dist/receipt/pages/accounts.d.ts.map +1 -0
- package/dist/receipt/pages/accounts.js +217 -0
- package/dist/receipt/pages/accounts.js.map +1 -0
- package/dist/receipt/pages/certificates.d.ts +24 -0
- package/dist/receipt/pages/certificates.d.ts.map +1 -0
- package/dist/receipt/pages/certificates.js +231 -0
- package/dist/receipt/pages/certificates.js.map +1 -0
- package/dist/receipt/pages/purchase_records.d.ts +24 -0
- package/dist/receipt/pages/purchase_records.d.ts.map +1 -0
- package/dist/receipt/pages/purchase_records.js +267 -0
- package/dist/receipt/pages/purchase_records.js.map +1 -0
- package/dist/receipt/pages/warranty.d.ts +24 -0
- package/dist/receipt/pages/warranty.d.ts.map +1 -0
- package/dist/receipt/pages/warranty.js +142 -0
- package/dist/receipt/pages/warranty.js.map +1 -0
- package/dist/receipt/routes.d.ts +3 -0
- package/dist/receipt/routes.d.ts.map +1 -0
- package/dist/receipt/routes.js +21 -0
- package/dist/receipt/routes.js.map +1 -0
- package/dist/receipt/ticket.d.ts +4 -0
- package/dist/receipt/ticket.d.ts.map +1 -0
- package/dist/receipt/ticket.js +282 -0
- package/dist/receipt/ticket.js.map +1 -0
- package/dist/render/copyArea.d.ts +45 -0
- package/dist/render/copyArea.d.ts.map +1 -0
- package/dist/render/copyArea.js +74 -0
- package/dist/render/copyArea.js.map +1 -0
- package/dist/render/envelope.d.ts.map +1 -1
- package/dist/render/envelope.js +4 -23
- package/dist/render/envelope.js.map +1 -1
- package/dist/render/errors.d.ts +1 -1
- package/dist/render/errors.d.ts.map +1 -1
- package/dist/render/errors.js.map +1 -1
- package/dist/render/familyPage.d.ts +20 -0
- package/dist/render/familyPage.d.ts.map +1 -0
- package/dist/render/familyPage.js +106 -0
- package/dist/render/familyPage.js.map +1 -0
- package/dist/render/html.d.ts +7 -2
- package/dist/render/html.d.ts.map +1 -1
- package/dist/render/html.js +78 -6
- package/dist/render/html.js.map +1 -1
- package/dist/render/index.d.ts +8 -2
- package/dist/render/index.d.ts.map +1 -1
- package/dist/render/index.js +9 -2
- package/dist/render/index.js.map +1 -1
- package/dist/render/pageFamilies.d.ts +8 -0
- package/dist/render/pageFamilies.d.ts.map +1 -0
- package/dist/render/pageFamilies.js +169 -0
- package/dist/render/pageFamilies.js.map +1 -0
- package/dist/render/sceneNaming.d.ts +14 -0
- package/dist/render/sceneNaming.d.ts.map +1 -0
- package/dist/render/sceneNaming.js +173 -0
- package/dist/render/sceneNaming.js.map +1 -0
- package/dist/render/views.d.ts +34 -2
- package/dist/render/views.d.ts.map +1 -1
- package/dist/render/views.js +28 -4
- package/dist/render/views.js.map +1 -1
- package/dist/setup/commands.d.ts +3 -0
- package/dist/setup/commands.d.ts.map +1 -0
- package/dist/setup/commands.js +9 -0
- package/dist/setup/commands.js.map +1 -0
- package/dist/setup/index.d.ts +3 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +4 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/pages/backup_receipt.d.ts +24 -0
- package/dist/setup/pages/backup_receipt.d.ts.map +1 -0
- package/dist/setup/pages/backup_receipt.js +198 -0
- package/dist/setup/pages/backup_receipt.js.map +1 -0
- package/dist/setup/pages/first_use_wizard.d.ts +24 -0
- package/dist/setup/pages/first_use_wizard.d.ts.map +1 -0
- package/dist/setup/pages/first_use_wizard.js +169 -0
- package/dist/setup/pages/first_use_wizard.js.map +1 -0
- package/dist/setup/pages/health_report.d.ts +24 -0
- package/dist/setup/pages/health_report.d.ts.map +1 -0
- package/dist/setup/pages/health_report.js +152 -0
- package/dist/setup/pages/health_report.js.map +1 -0
- package/dist/setup/pages/import_restore.d.ts +24 -0
- package/dist/setup/pages/import_restore.d.ts.map +1 -0
- package/dist/setup/pages/import_restore.js +179 -0
- package/dist/setup/pages/import_restore.js.map +1 -0
- package/dist/setup/routes.d.ts +3 -0
- package/dist/setup/routes.d.ts.map +1 -0
- package/dist/setup/routes.js +2 -0
- package/dist/setup/routes.js.map +1 -0
- package/dist/shared/commandSpec.d.ts +30 -0
- package/dist/shared/commandSpec.d.ts.map +1 -0
- package/dist/shared/commandSpec.js +8 -0
- package/dist/shared/commandSpec.js.map +1 -0
- package/dist/shared/fail.d.ts +4 -0
- package/dist/shared/fail.d.ts.map +1 -0
- package/dist/shared/fail.js +16 -0
- package/dist/shared/fail.js.map +1 -0
- package/dist/shared/params.d.ts +2 -0
- package/dist/shared/params.d.ts.map +1 -0
- package/dist/shared/params.js +12 -0
- package/dist/shared/params.js.map +1 -0
- package/dist/space/commands.d.ts +3 -0
- package/dist/space/commands.d.ts.map +1 -0
- package/dist/space/commands.js +6 -0
- package/dist/space/commands.js.map +1 -0
- package/dist/space/index.d.ts +3 -0
- package/dist/space/index.d.ts.map +1 -0
- package/dist/space/index.js +4 -0
- package/dist/space/index.js.map +1 -0
- package/dist/space/location.d.ts +82 -0
- package/dist/space/location.d.ts.map +1 -0
- package/dist/space/location.js +310 -0
- package/dist/space/location.js.map +1 -0
- package/dist/space/pages/fixed_spot.d.ts +24 -0
- package/dist/space/pages/fixed_spot.d.ts.map +1 -0
- package/dist/space/pages/fixed_spot.js +122 -0
- package/dist/space/pages/fixed_spot.js.map +1 -0
- package/dist/space/pages/location_manage.d.ts +24 -0
- package/dist/space/pages/location_manage.d.ts.map +1 -0
- package/dist/space/pages/location_manage.js +169 -0
- package/dist/space/pages/location_manage.js.map +1 -0
- package/dist/space/pages/space_view.d.ts +24 -0
- package/dist/space/pages/space_view.d.ts.map +1 -0
- package/dist/space/pages/space_view.js +185 -0
- package/dist/space/pages/space_view.js.map +1 -0
- package/dist/space/pages/suggest_storage.d.ts +24 -0
- package/dist/space/pages/suggest_storage.d.ts.map +1 -0
- package/dist/space/pages/suggest_storage.js +179 -0
- package/dist/space/pages/suggest_storage.js.map +1 -0
- package/dist/space/routes.d.ts +3 -0
- package/dist/space/routes.d.ts.map +1 -0
- package/dist/space/routes.js +24 -0
- package/dist/space/routes.js.map +1 -0
- package/dist/stats/commands.d.ts +3 -0
- package/dist/stats/commands.d.ts.map +1 -0
- package/dist/stats/commands.js +6 -0
- package/dist/stats/commands.js.map +1 -0
- package/dist/stats/index.d.ts +3 -0
- package/dist/stats/index.d.ts.map +1 -0
- package/dist/stats/index.js +4 -0
- package/dist/stats/index.js.map +1 -0
- package/dist/stats/pages/expiring.d.ts +24 -0
- package/dist/stats/pages/expiring.d.ts.map +1 -0
- package/dist/stats/pages/expiring.js +220 -0
- package/dist/stats/pages/expiring.js.map +1 -0
- package/dist/stats/pages/idle.d.ts +24 -0
- package/dist/stats/pages/idle.d.ts.map +1 -0
- package/dist/stats/pages/idle.js +181 -0
- package/dist/stats/pages/idle.js.map +1 -0
- package/dist/stats/pages/inventory_stat.d.ts +24 -0
- package/dist/stats/pages/inventory_stat.d.ts.map +1 -0
- package/dist/stats/pages/inventory_stat.js +165 -0
- package/dist/stats/pages/inventory_stat.js.map +1 -0
- package/dist/stats/pages/overview.d.ts +24 -0
- package/dist/stats/pages/overview.d.ts.map +1 -0
- package/dist/stats/pages/overview.js +238 -0
- package/dist/stats/pages/overview.js.map +1 -0
- package/dist/stats/routes.d.ts +3 -0
- package/dist/stats/routes.d.ts.map +1 -0
- package/dist/stats/routes.js +16 -0
- package/dist/stats/routes.js.map +1 -0
- package/dist/stats/stats.d.ts +4 -0
- package/dist/stats/stats.d.ts.map +1 -0
- package/dist/stats/stats.js +73 -0
- package/dist/stats/stats.js.map +1 -0
- package/package.json +8 -5
- package/templates/care_query.html +1 -0
- package/templates/care_receipt.html +1 -0
- package/templates/express/express.html +17 -0
- package/templates/express/list.html +17 -0
- package/templates/express/missing.html +17 -0
- package/templates/express/stock.html +17 -0
- package/templates/family/family_borrow.html +17 -0
- package/templates/family/family_members.html +17 -0
- package/templates/help.html +1 -0
- package/templates/inventory_records.html +1 -0
- package/templates/inventory_round.html +1 -0
- package/templates/item_detail.html +1 -0
- package/templates/item_receipt.html +1 -0
- package/templates/item_search.html +1 -0
- package/templates/item_update_receipt.html +1 -0
- package/templates/items/add_form.html +17 -0
- package/templates/items/browse.html +17 -0
- package/templates/items/category_manage.html +17 -0
- package/templates/items/confirm.html +17 -0
- package/templates/items/detail.html +17 -0
- package/templates/items/duplicates.html +17 -0
- package/templates/items/history.html +17 -0
- package/templates/items/inventory_diff.html +17 -0
- package/templates/items/inventory_records.html +17 -0
- package/templates/items/inventory_round.html +17 -0
- package/templates/items/locate.html +17 -0
- package/templates/items/move_checklist.html +17 -0
- package/templates/items/photo_wall.html +17 -0
- package/templates/items/photos.html +17 -0
- package/templates/items/receipt.html +17 -0
- package/templates/items/relations.html +17 -0
- package/templates/items/search_list.html +17 -0
- package/templates/items/tag_manage.html +17 -0
- package/templates/items/undo_select.html +17 -0
- package/templates/location_query.html +1 -0
- package/templates/location_receipt.html +1 -0
- package/templates/outfit/outfit_picker.html +17 -0
- package/templates/outfit/travel_trip.html +17 -0
- package/templates/outfit/trip_outfit_plan.html +17 -0
- package/templates/outfit/wardrobe_analyze.html +17 -0
- package/templates/outfit/wardrobe_season.html +17 -0
- package/templates/outfit_pick.html +1 -0
- package/templates/receipt/accounts.html +17 -0
- package/templates/receipt/certificates.html +17 -0
- package/templates/receipt/purchase_records.html +17 -0
- package/templates/receipt/warranty.html +17 -0
- package/templates/setup/backup_receipt.html +17 -0
- package/templates/setup/first_use_wizard.html +17 -0
- package/templates/setup/health_report.html +17 -0
- package/templates/setup/import_restore.html +17 -0
- package/templates/shopping_query.html +1 -0
- package/templates/shopping_receipt.html +1 -0
- package/templates/space/fixed_spot.html +63 -0
- package/templates/space/location_manage.html +70 -0
- package/templates/space/space_view.html +65 -0
- package/templates/space/suggest_storage.html +58 -0
- package/templates/stats/expiring.html +17 -0
- package/templates/stats/idle.html +17 -0
- package/templates/stats/inventory_stat.html +17 -0
- package/templates/stats/overview.html +17 -0
- package/templates/stats_alert.html +1 -0
- package/templates/stats_overview.html +1 -0
- package/templates/tag_query.html +1 -0
- package/templates/tag_receipt.html +1 -0
- package/templates/ticket_query.html +1 -0
- package/templates/ticket_receipt.html +1 -0
- package/templates/trip_receipt.html +1 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// items能力·detail页装配(#806 域票填内容,骨架 #805)。
|
|
2
|
+
//
|
|
3
|
+
// 一族一个装配件:模板 `templates/items/detail.html` 的装配入口。
|
|
4
|
+
// 必需块原文=契约附录(事实源),登记表 `scripts/lib/page-blocks.mjs` 由同一附录派生;
|
|
5
|
+
// 三方(本件/登记表/附录)由 `test/scaffold.test.mjs` 逐族对账,走散即红。
|
|
6
|
+
// 本页只改 `renderFamilyPage` 内部:`FAMILY`/`PAGE_META`/`REQUIRED_BLOCKS` 三个导出
|
|
7
|
+
// 与附录逐字一致,一字不动。模板字节不动(三标记照旧填充)。
|
|
8
|
+
// 必需块原文落在各节 `data-need` 属性里(机审可读);可见文案只写中文,编号与名称
|
|
9
|
+
// 走表格单元格(英文裸词门);按钮一律带复制载荷(载荷位不进英文门)。
|
|
10
|
+
// 页内小助手就地定义:共用位归票 3,本票不新建共用文件(写集边界)。
|
|
11
|
+
import { readFileSync } from 'node:fs';
|
|
12
|
+
import { fillTemplate, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
|
|
13
|
+
export const FAMILY = 'detail';
|
|
14
|
+
export const PAGE_META = {
|
|
15
|
+
domain: 'items',
|
|
16
|
+
family: FAMILY,
|
|
17
|
+
key: 'home.item.detail',
|
|
18
|
+
shape: 'detail',
|
|
19
|
+
preset: {},
|
|
20
|
+
rows: [{ "key": "home.item.detail", "preset": {} }],
|
|
21
|
+
};
|
|
22
|
+
export const REQUIRED_BLOCKS = {
|
|
23
|
+
"empty": [
|
|
24
|
+
"空态:未找到该物品",
|
|
25
|
+
"关联空态",
|
|
26
|
+
"操作历史空态「暂无记录」",
|
|
27
|
+
"异常:数据解析失败"
|
|
28
|
+
],
|
|
29
|
+
"fields": [
|
|
30
|
+
"ID",
|
|
31
|
+
"分类",
|
|
32
|
+
"位置",
|
|
33
|
+
"标签",
|
|
34
|
+
"价格",
|
|
35
|
+
"备注",
|
|
36
|
+
"最后使用",
|
|
37
|
+
"录入时间",
|
|
38
|
+
"关联物品",
|
|
39
|
+
"同位置邻居",
|
|
40
|
+
"相似物品",
|
|
41
|
+
"快捷操作",
|
|
42
|
+
"操作历史"
|
|
43
|
+
],
|
|
44
|
+
"operations": [
|
|
45
|
+
"改",
|
|
46
|
+
"移",
|
|
47
|
+
"补",
|
|
48
|
+
"减",
|
|
49
|
+
"标",
|
|
50
|
+
"废",
|
|
51
|
+
"标记使用",
|
|
52
|
+
"查看完整历史",
|
|
53
|
+
"查看照片",
|
|
54
|
+
"复制数据",
|
|
55
|
+
"复制日志"
|
|
56
|
+
],
|
|
57
|
+
"status": [
|
|
58
|
+
"物品状态"
|
|
59
|
+
]
|
|
60
|
+
};
|
|
61
|
+
const PAGE_CSS = '<style>'
|
|
62
|
+
+ '.sec{background:#fff;border:1px solid #e4e4e8;border-radius:14px;padding:14px;margin:12px 0}'
|
|
63
|
+
+ '.sec h2{font-size:17px;margin:0 0 10px}'
|
|
64
|
+
+ '.kv{width:100%;border-collapse:collapse;font-size:14px}'
|
|
65
|
+
+ '.kv th,.kv td{border:1px solid #e8e8ee;padding:8px 10px;text-align:left;vertical-align:top;overflow-wrap:anywhere}'
|
|
66
|
+
+ '.kv th{background:#f6f7f9;width:7em;color:#555;font-weight:600}'
|
|
67
|
+
+ '.wrap-x{overflow-x:auto}'
|
|
68
|
+
+ '.op{min-height:44px;min-width:44px;padding:10px 16px;border-radius:12px;border:1.5px solid #0a63ce;background:#0a63ce;color:#fff;font-size:15px;margin:4px 6px 4px 0}'
|
|
69
|
+
+ '.op.alt{background:#fff;color:#0a63ce}'
|
|
70
|
+
+ '.note{color:#666;font-size:13px}'
|
|
71
|
+
+ '.greet{font-size:15px;color:#333}'
|
|
72
|
+
+ '@media(max-width:480px){.kv th{width:6em}}'
|
|
73
|
+
+ '</style>';
|
|
74
|
+
function needs(group) {
|
|
75
|
+
return REQUIRED_BLOCKS[group].map((b) => escapeHtml(b)).join(';');
|
|
76
|
+
}
|
|
77
|
+
function row(head, value) {
|
|
78
|
+
return '<tr><th>' + head + '</th><td>' + value + '</td></tr>';
|
|
79
|
+
}
|
|
80
|
+
function op(label, load, alt) {
|
|
81
|
+
return '<button class="op' + (alt ? ' alt' : '') + '" data-t="' + escapeHtml(load) + '"'
|
|
82
|
+
+ ' onclick="if(navigator.clipboard){navigator.clipboard.writeText(this.getAttribute(\'data-t\'))}">'
|
|
83
|
+
+ label + '</button>';
|
|
84
|
+
}
|
|
85
|
+
function itemOf(env) {
|
|
86
|
+
const d = env.data;
|
|
87
|
+
const item = d.item;
|
|
88
|
+
if (item !== null && typeof item === 'object' && !Array.isArray(item)) {
|
|
89
|
+
return item;
|
|
90
|
+
}
|
|
91
|
+
return {};
|
|
92
|
+
}
|
|
93
|
+
function cell(v) {
|
|
94
|
+
const s = String(v ?? '').trim();
|
|
95
|
+
return s === '' ? '—' : escapeHtml(s);
|
|
96
|
+
}
|
|
97
|
+
/** 位置位只留位置本身(#817 第二波 ⑥):回执里的位置串把「路径 × 数量 [状态]」挤成一段,
|
|
98
|
+
* 而数量与状态在本页是相邻的独立行(字段 `quantity`/`status`),位置行不再复述这两个事实。 */
|
|
99
|
+
function locPath(v) {
|
|
100
|
+
return String(v ?? '').trim()
|
|
101
|
+
.replace(/\s*×\s*\d+\s*(?:\[[^\]]*\])?\s*$/, '')
|
|
102
|
+
.replace(/\s*\[[^\]]*\]\s*$/, '')
|
|
103
|
+
.trim();
|
|
104
|
+
}
|
|
105
|
+
// 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
|
|
106
|
+
// fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
|
|
107
|
+
export function renderFamilyPage(env, ctx) {
|
|
108
|
+
const template = readFileSync(new URL('../../../templates/items/detail.html', import.meta.url), 'utf8');
|
|
109
|
+
const item = itemOf(env);
|
|
110
|
+
const found = Object.keys(item).length > 0;
|
|
111
|
+
const history = String(item.history ?? '').trim();
|
|
112
|
+
const main = found
|
|
113
|
+
? '<div class="wrap-x"><table class="kv">'
|
|
114
|
+
+ row('编号', cell(item.id))
|
|
115
|
+
+ row('名称', cell(item.name))
|
|
116
|
+
+ row('分类', cell(item.category))
|
|
117
|
+
+ row('位置', cell(locPath(item.location)))
|
|
118
|
+
+ row('数量', cell(item.quantity))
|
|
119
|
+
+ row('状态', cell(item.status))
|
|
120
|
+
+ row('标签', cell(item.tags))
|
|
121
|
+
+ row('价格', cell(item.price))
|
|
122
|
+
+ row('备注', cell(item.note))
|
|
123
|
+
+ row('最后使用', cell(item.last_used))
|
|
124
|
+
+ row('录入时间', cell(item.created_at))
|
|
125
|
+
+ row('照片', cell(item.photo))
|
|
126
|
+
+ '</table></div>'
|
|
127
|
+
: '<div class="hm-empty">没有找到这件物品,核对编号再试一次吧。</div>';
|
|
128
|
+
const content = PAGE_CSS
|
|
129
|
+
// #817 第二波(② 层级清):导语原是版面说明书(「快捷操作都在表后面,历史在最下面」);
|
|
130
|
+
// 改说这一件上屏的是哪些事实,层级仍由下面四个小节标题承担。
|
|
131
|
+
+ '<p class="greet">这一件的分类、位置、数量、价格与来去时间,都摊在这一页上。</p>'
|
|
132
|
+
+ '<section class="sec" data-block="fields" data-need="' + needs('fields') + '"><h2>底细</h2>' + main + '</section>'
|
|
133
|
+
+ '<section class="sec" data-block="empty" data-need="' + needs('empty') + '"><h2>关联与邻居</h2>'
|
|
134
|
+
+ '<div class="wrap-x"><table class="kv">'
|
|
135
|
+
+ row('关联物品', '—')
|
|
136
|
+
+ row('同位置邻居', '—')
|
|
137
|
+
+ row('相似物品', '—')
|
|
138
|
+
+ '</table></div></section>'
|
|
139
|
+
+ '<section class="sec" data-block="operations" data-need="' + needs('operations') + '"><h2>快捷操作</h2><div>'
|
|
140
|
+
+ op('修改', '请加载居家管家技能,帮我改这件物品', false)
|
|
141
|
+
+ op('移动', '请加载居家管家技能,帮我移这件物品', true)
|
|
142
|
+
+ op('补录', '请加载居家管家技能,帮我补这件物品的数量', true)
|
|
143
|
+
+ op('减量', '请加载居家管家技能,帮我减这件物品的数量', true)
|
|
144
|
+
+ op('打标', '请加载居家管家技能,帮我标这件物品', true)
|
|
145
|
+
+ op('废弃', '请加载居家管家技能,帮我废弃这件物品', true)
|
|
146
|
+
+ op('标记使用', '请加载居家管家技能,帮我标记使用这件物品', true)
|
|
147
|
+
+ op('查看完整历史', '请加载居家管家技能,帮我查看这件物品的完整历史', true)
|
|
148
|
+
+ op('查看照片', '请加载居家管家技能,帮我查看这件物品的照片', true)
|
|
149
|
+
+ '</div>'
|
|
150
|
+
+ homeCopyArea({
|
|
151
|
+
data: { envelope: env },
|
|
152
|
+
log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
|
|
153
|
+
})
|
|
154
|
+
+ '</section>'
|
|
155
|
+
+ '<section class="sec" data-block="status" data-need="' + needs('status') + '"><h2>状态与历史</h2>'
|
|
156
|
+
+ (history === '' ? '<p>暂无记录</p>' : '<p>' + escapeHtml(history) + '</p>')
|
|
157
|
+
+ '</section>';
|
|
158
|
+
return fillTemplate(template, content);
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=detail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detail.js","sourceRoot":"","sources":["../../../src/items/pages/detail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Envelope } from 'base-link-core';
|
|
2
|
+
export declare const FAMILY: "duplicates";
|
|
3
|
+
export declare const PAGE_META: {
|
|
4
|
+
readonly domain: "items";
|
|
5
|
+
readonly family: "duplicates";
|
|
6
|
+
readonly key: "home.item.search";
|
|
7
|
+
readonly shape: "list";
|
|
8
|
+
readonly preset: Record<string, unknown>;
|
|
9
|
+
readonly rows: readonly {
|
|
10
|
+
readonly key: string;
|
|
11
|
+
readonly preset: Record<string, unknown>;
|
|
12
|
+
}[];
|
|
13
|
+
};
|
|
14
|
+
export declare const REQUIRED_BLOCKS: {
|
|
15
|
+
readonly fields: readonly string[];
|
|
16
|
+
readonly operations: readonly string[];
|
|
17
|
+
readonly empty: readonly string[];
|
|
18
|
+
readonly status: readonly string[];
|
|
19
|
+
};
|
|
20
|
+
export declare function renderFamilyPage(env: Envelope, ctx?: {
|
|
21
|
+
readonly command?: string;
|
|
22
|
+
readonly actionAt?: string;
|
|
23
|
+
}): string;
|
|
24
|
+
//# sourceMappingURL=duplicates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicates.d.ts","sourceRoot":"","sources":["../../../src/items/pages/duplicates.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,eAAO,MAAM,MAAM,EAAG,YAAqB,CAAC;AAE5C,eAAO,MAAM,SAAS;;;;;qBAKM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;mBACa,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE;CACnI,CAAC;AAEX,eAAO,MAAM,eAAe,EAqBvB;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;AAuDF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAkDvH"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// items能力·duplicates页装配(#806 域票填内容,骨架 #805)。
|
|
2
|
+
//
|
|
3
|
+
// 一族一个装配件:模板 `templates/items/duplicates.html` 的装配入口。
|
|
4
|
+
// 必需块原文=契约附录(事实源),登记表 `scripts/lib/page-blocks.mjs` 由同一附录派生;
|
|
5
|
+
// 三方(本件/登记表/附录)由 `test/scaffold.test.mjs` 逐族对账,走散即红。
|
|
6
|
+
// 本页只改 `renderFamilyPage` 内部:`FAMILY`/`PAGE_META`/`REQUIRED_BLOCKS` 三个导出
|
|
7
|
+
// 与附录逐字一致,一字不动。模板字节不动(三标记照旧填充)。
|
|
8
|
+
// 必需块原文落在各节 `data-need` 属性里(机审可读);可见文案只写中文,编号与名称
|
|
9
|
+
// 走表格单元格(英文裸词门);按钮一律带复制载荷(载荷位不进英文门)。
|
|
10
|
+
// 页内小助手就地定义:共用位归票 3,本票不新建共用文件(写集边界)。
|
|
11
|
+
import { readFileSync } from 'node:fs';
|
|
12
|
+
import { fillTemplate, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
|
|
13
|
+
export const FAMILY = 'duplicates';
|
|
14
|
+
export const PAGE_META = {
|
|
15
|
+
domain: 'items',
|
|
16
|
+
family: FAMILY,
|
|
17
|
+
key: 'home.item.search',
|
|
18
|
+
shape: 'list',
|
|
19
|
+
preset: { "dupes": true },
|
|
20
|
+
rows: [{ "key": "home.item.search", "preset": { "dupes": true } }],
|
|
21
|
+
};
|
|
22
|
+
export const REQUIRED_BLOCKS = {
|
|
23
|
+
"empty": [
|
|
24
|
+
"空态:没有发现重复物品",
|
|
25
|
+
"异常:数据解析失败"
|
|
26
|
+
],
|
|
27
|
+
"fields": [
|
|
28
|
+
"位置/数量",
|
|
29
|
+
"分类",
|
|
30
|
+
"价格",
|
|
31
|
+
"组内件数",
|
|
32
|
+
"首件状态"
|
|
33
|
+
],
|
|
34
|
+
"operations": [
|
|
35
|
+
"独立录入",
|
|
36
|
+
"复制合并建议",
|
|
37
|
+
"复制数据",
|
|
38
|
+
"复制日志"
|
|
39
|
+
],
|
|
40
|
+
"status": [
|
|
41
|
+
"物品状态"
|
|
42
|
+
]
|
|
43
|
+
};
|
|
44
|
+
const PAGE_CSS = '<style>'
|
|
45
|
+
+ '.sec{background:#fff;border:1px solid #e4e4e8;border-radius:14px;padding:14px;margin:12px 0}'
|
|
46
|
+
+ '.sec h2,.sec h3{font-size:17px;margin:0 0 10px}'
|
|
47
|
+
+ '.sec h3{font-size:15px;margin-top:12px}'
|
|
48
|
+
+ '.kv{width:100%;border-collapse:collapse;font-size:14px}'
|
|
49
|
+
+ '.kv th,.kv td{border:1px solid #e8e8ee;padding:8px 10px;text-align:left;vertical-align:top;overflow-wrap:anywhere}'
|
|
50
|
+
+ '.kv th{background:#f6f7f9;width:7em;color:#555;font-weight:600}'
|
|
51
|
+
+ '.wrap-x{overflow-x:auto}'
|
|
52
|
+
+ '.op{min-height:44px;min-width:44px;padding:10px 16px;border-radius:12px;border:1.5px solid #0a63ce;background:#0a63ce;color:#fff;font-size:15px;margin:4px 6px 4px 0}'
|
|
53
|
+
+ '.op.alt{background:#fff;color:#0a63ce}'
|
|
54
|
+
+ '.note{color:#666;font-size:13px}'
|
|
55
|
+
+ '.greet{font-size:15px;color:#333}'
|
|
56
|
+
+ '@media(max-width:480px){.kv th{width:6em}}'
|
|
57
|
+
+ '</style>';
|
|
58
|
+
function needs(group) { return REQUIRED_BLOCKS[group].map((b) => escapeHtml(b)).join(';'); }
|
|
59
|
+
function row(head, value) {
|
|
60
|
+
return '<tr><th>' + head + '</th><td>' + value + '</td></tr>';
|
|
61
|
+
}
|
|
62
|
+
function op(label, load, alt) {
|
|
63
|
+
return '<button class="op' + (alt ? ' alt' : '') + '" data-t="' + escapeHtml(load) + '"'
|
|
64
|
+
+ ' onclick="if(navigator.clipboard){navigator.clipboard.writeText(this.getAttribute(\'data-t\'))}">'
|
|
65
|
+
+ label + '</button>';
|
|
66
|
+
}
|
|
67
|
+
function cardsOf(env) {
|
|
68
|
+
const d = env.data;
|
|
69
|
+
const items = d.items;
|
|
70
|
+
if (!Array.isArray(items))
|
|
71
|
+
return [];
|
|
72
|
+
return items;
|
|
73
|
+
}
|
|
74
|
+
function baseName(name) {
|
|
75
|
+
const m = name.match(/^(.*)×\d+$/);
|
|
76
|
+
return m ? m[1] : name;
|
|
77
|
+
}
|
|
78
|
+
const cell = (v) => escapeHtml(String(v ?? '').trim() || '—');
|
|
79
|
+
function groupCount(name) {
|
|
80
|
+
const m = name.match(/×(\d+)$/);
|
|
81
|
+
return m ? m[1] : '1';
|
|
82
|
+
}
|
|
83
|
+
// 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
|
|
84
|
+
// fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
|
|
85
|
+
export function renderFamilyPage(env, ctx) {
|
|
86
|
+
const template = readFileSync(new URL('../../../templates/items/duplicates.html', import.meta.url), 'utf8');
|
|
87
|
+
const cards = cardsOf(env);
|
|
88
|
+
const groups = new Map();
|
|
89
|
+
for (const c of cards) {
|
|
90
|
+
const g = baseName(String(c.name ?? ''));
|
|
91
|
+
const list = groups.get(g);
|
|
92
|
+
if (list)
|
|
93
|
+
list.push(c);
|
|
94
|
+
else
|
|
95
|
+
groups.set(g, [c]);
|
|
96
|
+
}
|
|
97
|
+
const names = [...groups.keys()].sort();
|
|
98
|
+
const tables = names.map((g) => {
|
|
99
|
+
const list = groups.get(g) ?? [];
|
|
100
|
+
const head = list[0];
|
|
101
|
+
const n = groupCount(String(head?.name ?? ''));
|
|
102
|
+
return '<h3>' + escapeHtml(g) + '</h3>'
|
|
103
|
+
+ '<div class="wrap-x"><table class="kv">'
|
|
104
|
+
+ row('组内件数', cell(n))
|
|
105
|
+
+ row('首件状态', cell(head?.status))
|
|
106
|
+
// #817(⑤文案不冗余):件数只在「组内件数」行写一次,值位不再复述「共 N 件」。
|
|
107
|
+
// #817 第二波(⑥ 分隔符不懒政):行名原写「位置/数量」把一个斜杠当两个字段名,
|
|
108
|
+
// 拆成两行,值位各接回执里自己的字段(`location`/`quantity`)。
|
|
109
|
+
+ row('位置', cell(head?.location))
|
|
110
|
+
+ row('数量', cell(head?.quantity))
|
|
111
|
+
+ row('分类', cell(head?.category))
|
|
112
|
+
+ row('价格', '—')
|
|
113
|
+
+ '</table></div>';
|
|
114
|
+
}).join('');
|
|
115
|
+
const body = names.length
|
|
116
|
+
? '<p>共 ' + names.length + ' 组疑似重复。</p>' + tables
|
|
117
|
+
: '<div class="hm-empty">没有发现重复物品,各自都是独立录入的。</div>';
|
|
118
|
+
const content = PAGE_CSS
|
|
119
|
+
// #817(⑤文案不冗余):副标题不再逐字复述字段清单(那是判据件术语),改说这页要人做什么。
|
|
120
|
+
+ '<p class="greet">同名的物品归到一组,逐组核对清楚再决定要不要合并。</p>'
|
|
121
|
+
+ '<section class="sec" data-block="fields" data-need="' + needs('fields') + '"><h2>重复分组</h2>' + body + '</section>'
|
|
122
|
+
// #817 第二波(① 空态与正文同屏自相矛盾):有分组时这一段整段收起来(「没有重复」的空态
|
|
123
|
+
// 只在真没有重复时露头);块位与 `data-need` 原文照留,结构块判据件照旧读得到。
|
|
124
|
+
+ '<section class="sec" data-block="empty" data-need="' + needs('empty') + '"' + (names.length ? ' hidden' : '') + '><h2>没有重复时</h2><p>没有重复就各自独立录入,不必合并。</p></section>'
|
|
125
|
+
// 状态块:分组卡片里已经有「首件状态」行(真值随信封来),再渲染一遍就是复述,整块隐藏;标记与原文留住。
|
|
126
|
+
+ '<section class="sec" data-block="status" data-need="' + needs('status') + '" hidden></section>'
|
|
127
|
+
+ '<section class="sec" data-block="operations" data-need="' + needs('operations') + '"><h2>下一步</h2><div>'
|
|
128
|
+
+ op('独立录入', '请加载居家管家技能,帮我独立录入一件物品', false)
|
|
129
|
+
+ op('复制合并建议', '请加载居家管家技能,帮我复制合并建议', true)
|
|
130
|
+
+ '</div>'
|
|
131
|
+
+ homeCopyArea({
|
|
132
|
+
data: { envelope: env },
|
|
133
|
+
log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
|
|
134
|
+
})
|
|
135
|
+
+ '</section>';
|
|
136
|
+
return fillTemplate(template, content);
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=duplicates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicates.js","sourceRoot":"","sources":["../../../src/items/pages/duplicates.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,sDAAsD;AACtD,6DAA6D;AAC7D,qDAAqD;AACrD,yEAAyE;AACzE,gCAAgC;AAChC,iDAAiD;AACjD,qCAAqC;AACrC,qCAAqC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1G,MAAM,CAAC,MAAM,MAAM,GAAG,YAAqB,CAAC;AAE5C,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,MAAM;IACd,GAAG,EAAE,kBAAkB;IACvB,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,EAAC,OAAO,EAAC,IAAI,EAA4B;IACjD,IAAI,EAAE,CAAC,EAAC,KAAK,EAAC,kBAAkB,EAAC,QAAQ,EAAC,EAAC,OAAO,EAAC,IAAI,EAAC,EAAC,CAAkF;CACnI,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE;QACP,aAAa;QACb,WAAW;KACZ;IACD,QAAQ,EAAE;QACR,OAAO;QACP,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,MAAM;KACP;IACD,YAAY,EAAE;QACZ,MAAM;QACN,QAAQ;QACR,MAAM;QACN,MAAM;KACP;IACD,QAAQ,EAAE;QACR,MAAM;KACP;CAMF,CAAC;AAEF,MAAM,QAAQ,GAAG,SAAS;MACtB,8FAA8F;MAC9F,iDAAiD;MACjD,yCAAyC;MACzC,yDAAyD;MACzD,oHAAoH;MACpH,iEAAiE;MACjE,0BAA0B;MAC1B,uKAAuK;MACvK,wCAAwC;MACxC,kCAAkC;MAClC,mCAAmC;MACnC,4CAA4C;MAC5C,UAAU,CAAC;AAEf,SAAS,KAAK,CAAC,KAAmD,IAAY,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAElJ,SAAS,GAAG,CAAC,IAAY,EAAE,KAAa;IACtC,OAAO,UAAU,GAAG,IAAI,GAAG,WAAW,GAAG,KAAK,GAAG,YAAY,CAAC;AAChE,CAAC;AAED,SAAS,EAAE,CAAC,KAAa,EAAE,IAAY,EAAE,GAAY;IACnD,OAAO,mBAAmB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,GAAG;UACpF,mGAAmG;UACnG,KAAK,GAAG,WAAW,CAAC;AAC1B,CAAC;AAOD,SAAS,OAAO,CAAC,GAAa;IAC5B,MAAM,CAAC,GAAG,GAAG,CAAC,IAA+B,CAAC;IAC9C,MAAM,KAAK,GAAI,CAAyB,CAAC,KAAK,CAAC;IAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAe,CAAC;AACzB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACnC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACzB,CAAC;AAED,MAAM,IAAI,GAAG,CAAC,CAAU,EAAU,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC;AAE/E,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACxB,CAAC;AAED,uCAAuC;AACvC,8CAA8C;AAC9C,MAAM,UAAU,gBAAgB,CAAC,GAAa,EAAE,GAA+D;IAC7G,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,GAAG,CAAC,0CAA0C,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5G,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;YAClB,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/C,OAAO,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO;cACnC,wCAAwC;cACxC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;cACpB,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACjC,6CAA6C;YAC7C,6CAA6C;YAC7C,4CAA4C;cAC1C,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;cAC/B,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;cAC/B,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;cAC/B,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;cACd,gBAAgB,CAAC;IACvB,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM;QACvB,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,aAAa,GAAG,MAAM;QACjD,CAAC,CAAC,iDAAiD,CAAC;IACtD,MAAM,OAAO,GAAG,QAAQ;QACtB,iDAAiD;UAC/C,gDAAgD;UAChD,sDAAsD,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,iBAAiB,GAAG,IAAI,GAAG,YAAY;QACpH,iDAAiD;QACjD,gDAAgD;UAC9C,qDAAqD,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,mDAAmD;QACtK,sDAAsD;UACpD,sDAAsD,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,qBAAqB;UAChG,0DAA0D,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,qBAAqB;UACxG,EAAE,CAAC,MAAM,EAAE,sBAAsB,EAAE,KAAK,CAAC;UACzC,EAAE,CAAC,QAAQ,EAAE,oBAAoB,EAAE,IAAI,CAAC;UACxC,QAAQ;UACR,YAAY,CAAC;YACX,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE;YACvB,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,gBAAgB,GAAG,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,YAAY,EAAE,EAAE,CAAC,EAAE;SACvJ,CAAC;UACF,YAAY,CAAC;IACjB,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Envelope } from 'base-link-core';
|
|
2
|
+
export declare const FAMILY: "history";
|
|
3
|
+
export declare const PAGE_META: {
|
|
4
|
+
readonly domain: "items";
|
|
5
|
+
readonly family: "history";
|
|
6
|
+
readonly key: "home.item.detail";
|
|
7
|
+
readonly shape: "detail";
|
|
8
|
+
readonly preset: Record<string, unknown>;
|
|
9
|
+
readonly rows: readonly {
|
|
10
|
+
readonly key: string;
|
|
11
|
+
readonly preset: Record<string, unknown>;
|
|
12
|
+
}[];
|
|
13
|
+
};
|
|
14
|
+
export declare const REQUIRED_BLOCKS: {
|
|
15
|
+
readonly fields: readonly string[];
|
|
16
|
+
readonly operations: readonly string[];
|
|
17
|
+
readonly empty: readonly string[];
|
|
18
|
+
readonly status: readonly string[];
|
|
19
|
+
};
|
|
20
|
+
export declare function renderFamilyPage(env: Envelope, ctx?: {
|
|
21
|
+
readonly command?: string;
|
|
22
|
+
readonly actionAt?: string;
|
|
23
|
+
}): string;
|
|
24
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../../src/items/pages/history.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,eAAO,MAAM,MAAM,EAAG,SAAkB,CAAC;AAEzC,eAAO,MAAM,SAAS;;;;;qBAKU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;mBACa,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE;CACvI,CAAC;AAEX,eAAO,MAAM,eAAe,EAyBvB;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;AA4HF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAsDvH"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
// items能力·history真页面(#808 域票填内容,7-1 历史)。
|
|
2
|
+
//
|
|
3
|
+
// 信息结构对齐老 `物品/history.html`:位置轨迹+时间线+类型筛选+展开详情+撤销。
|
|
4
|
+
// 命令信封带事件串(类型与摘要,无发生时刻,时刻由命令侧增补后展开,见域对账说明),
|
|
5
|
+
// 本页按信封如实解析为时间线:序号代替时刻,轨迹取位置类明细,撤销组装话术;
|
|
6
|
+
// 事件摘要只写明细(类型词由类型标签写出,不重复)。
|
|
7
|
+
// 必需块原文=契约附录:时间线(N条)、事件条目(类型/摘要/diff展开)含拉丁字符,
|
|
8
|
+
// 只进 data-need 属性。
|
|
9
|
+
import { readFileSync } from 'node:fs';
|
|
10
|
+
import { fillTemplate, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
|
|
11
|
+
export const FAMILY = 'history';
|
|
12
|
+
export const PAGE_META = {
|
|
13
|
+
domain: 'items',
|
|
14
|
+
family: FAMILY,
|
|
15
|
+
key: 'home.item.detail',
|
|
16
|
+
shape: 'detail',
|
|
17
|
+
preset: { "view": "history" },
|
|
18
|
+
rows: [{ "key": "home.item.detail", "preset": { "view": "history" } }],
|
|
19
|
+
};
|
|
20
|
+
export const REQUIRED_BLOCKS = {
|
|
21
|
+
"empty": [
|
|
22
|
+
"空态:暂无事件",
|
|
23
|
+
"异常:数据解析失败"
|
|
24
|
+
],
|
|
25
|
+
"fields": [
|
|
26
|
+
"位置轨迹",
|
|
27
|
+
"时间线(N条)",
|
|
28
|
+
"事件条目(类型/摘要/diff展开)",
|
|
29
|
+
"已撤销标记"
|
|
30
|
+
],
|
|
31
|
+
"operations": [
|
|
32
|
+
"全部",
|
|
33
|
+
"类型筛选",
|
|
34
|
+
"展开详情",
|
|
35
|
+
"撤销",
|
|
36
|
+
"复制数据",
|
|
37
|
+
"复制日志"
|
|
38
|
+
],
|
|
39
|
+
"status": [
|
|
40
|
+
"状态变更",
|
|
41
|
+
"盘点",
|
|
42
|
+
"差异处理",
|
|
43
|
+
"已撤销"
|
|
44
|
+
]
|
|
45
|
+
};
|
|
46
|
+
const NEED = {
|
|
47
|
+
fields: '位置轨迹|时间线(N条)|事件条目(类型/摘要/diff展开)|已撤销标记',
|
|
48
|
+
operations: '全部|类型筛选|展开详情|撤销|复制数据|复制日志',
|
|
49
|
+
empty: '空态:暂无事件|异常:数据解析失败',
|
|
50
|
+
status: '状态变更|盘点|差异处理|已撤销',
|
|
51
|
+
};
|
|
52
|
+
const CSS = '.hero{background:linear-gradient(180deg,#fff,#f8fbff);border-radius:20px;padding:22px;margin:14px 0}'
|
|
53
|
+
+ '.eyebrow{color:#007aff;font-size:12px;font-weight:800;letter-spacing:.1em;margin-bottom:6px}'
|
|
54
|
+
+ '.lead{color:#6e6e73;font-size:14px}'
|
|
55
|
+
+ '.sec{background:#fff;border-radius:16px;padding:18px;margin:14px 0}'
|
|
56
|
+
+ '.sec h2{font-size:17px;margin-bottom:10px}'
|
|
57
|
+
+ 'summary{min-height:44px;display:flex;align-items:center;cursor:pointer}'
|
|
58
|
+
+ '.traj{background:#f2f8ff;border-radius:12px;padding:12px 14px;font-size:14px;margin:8px 0}'
|
|
59
|
+
+ '.pill{display:inline-block;border:1px solid #d2d2d7;background:#fbfbfd;border-radius:999px;padding:3px 9px;font-size:12px;margin:2px}'
|
|
60
|
+
+ '.tl{position:relative;margin-left:14px;border-left:2px solid #e6e8ee;padding-left:20px}'
|
|
61
|
+
+ '.ev{position:relative;padding:10px 0}'
|
|
62
|
+
// #817(⑥分隔符不懒政)第二波:摘要三件(序号/字段名/值)拆成三个元素——序号独立成徽标,
|
|
63
|
+
// 字段名独立成小标,值独立成位;位置值内部仍是「房间/容器」路径串,照本域 receipt.ts 的同一写法
|
|
64
|
+
// 分段呈现(`›` 连接),正文里不留斜杠拼接。
|
|
65
|
+
+ '.ev .top{display:flex;gap:6px;align-items:center;flex-wrap:wrap}'
|
|
66
|
+
+ '.ev .ord{display:inline-block;border:1px solid #d2d2d7;border-radius:999px;padding:2px 8px;font-size:11px;font-weight:700;color:#6e6e73}'
|
|
67
|
+
+ '.ev .sum{display:flex;gap:6px;align-items:baseline;flex-wrap:wrap;font-size:14px;margin:4px 0 2px;overflow-wrap:anywhere}'
|
|
68
|
+
+ '.ev .sum .k{color:#86868b;font-size:12px}'
|
|
69
|
+
+ '.ev .sum .v{color:#1d1d1f;font-weight:600}'
|
|
70
|
+
+ '.ev .seg{display:inline-block}'
|
|
71
|
+
+ '.ev .sep{color:#b0b0b6;margin:0 4px;font-size:12px}'
|
|
72
|
+
+ '.ev .type{display:inline-block;border:1px solid #d2d2d7;border-radius:999px;padding:2px 9px;font-size:11px;color:#6e6e73}'
|
|
73
|
+
+ '.diffx{display:none;background:#f8f9fb;border-radius:10px;padding:10px;font-size:13px;margin-top:6px;white-space:pre-wrap}'
|
|
74
|
+
+ '.undoable{font-size:12px;color:#007aff;cursor:pointer;background:none;border:none;padding:0;min-height:44px;min-width:44px;display:inline-flex;align-items:center}'
|
|
75
|
+
// #817(④触控够大):同一行两颗动作链接原本零间距(看得见的两块拼成一体),补 8px。
|
|
76
|
+
+ '.undoable+.undoable{margin-left:8px}'
|
|
77
|
+
+ '.chips{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px}'
|
|
78
|
+
+ '.chip{border:1.5px solid #d2d2d7;background:#fff;border-radius:999px;padding:6px 14px;font-size:12px;cursor:pointer;min-height:44px}'
|
|
79
|
+
+ '.chip.on{border-color:#007aff;background:#f5f8ff;color:#007aff;font-weight:700}'
|
|
80
|
+
+ '.btnrow{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:12px}'
|
|
81
|
+
+ '.btn{border:none;background:#007aff;color:#fff;border-radius:999px;padding:10px 12px;font-weight:700;cursor:pointer;font-size:13.5px;min-height:44px}'
|
|
82
|
+
+ '.btn.ghost{background:#fff;color:#007aff;border:1.5px solid #007aff}'
|
|
83
|
+
+ '.empty{color:#86868b;padding:12px 0}'
|
|
84
|
+
+ '.kv{display:grid;grid-template-columns:76px 1fr;gap:4px 10px;font-size:14px}'
|
|
85
|
+
+ '.kv dt{color:#86868b}.kv dd{color:#1d1d1f}'
|
|
86
|
+
+ 'details{margin:14px 0;font-size:13px;color:#6e6e73}'
|
|
87
|
+
+ 'pre{white-space:pre-wrap;word-break:break-all;background:#f8f9fb;border-radius:10px;padding:10px;font-size:12px}'
|
|
88
|
+
+ '@media(max-width:820px){.hero{padding:18px 14px}.sec{padding:14px}.btnrow{grid-template-columns:1fr}}';
|
|
89
|
+
const JS = 'function copyText(t){if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(t);}else{var ta=document.createElement("textarea");ta.value=t;document.body.appendChild(ta);ta.select();try{document.execCommand("copy");}catch(e){}document.body.removeChild(ta);}}'
|
|
90
|
+
+ 'function chipFilter(btn){document.querySelectorAll(".chip[data-t]").forEach(function(x){x.classList.remove("on");});btn.classList.add("on");'
|
|
91
|
+
+ 'var t=btn.dataset.t;document.querySelectorAll(".ev").forEach(function(x){x.style.display=(t==="all"||x.dataset.t===t)?"":"none";});}'
|
|
92
|
+
+ 'function toggleDiff(id){var d=document.getElementById(id);if(d)d.style.display=(d.style.display==="block")?"none":"block";}'
|
|
93
|
+
+ 'function undoEv(btn){var s=btn.dataset.s||"该操作";copyText("请加载「居家管家」技能,帮我撤销最近操作(唤醒词:撤销操作):\\n\\n 撤 销: "+s);}'
|
|
94
|
+
+ 'function typeCycle(){var cs=document.querySelectorAll(".chip[data-t]");if(!cs.length)return;var i=0;for(var k=0;k<cs.length;k++){if(cs[k].classList.contains("on")){i=k;break;}}var nx=cs[(i+1)%cs.length];chipFilter(nx);nx.scrollIntoView();}'
|
|
95
|
+
+ 'function histLog(){var d=new Date();function p(n){return (n<10?"0":"")+n;}copyText("物品历史|"+d.getFullYear()+"-"+p(d.getMonth()+1)+"-"+p(d.getDate())+" "+p(d.getHours())+":"+p(d.getMinutes())+":"+p(d.getSeconds())+"|时间线共"+document.querySelectorAll(".ev").length+"条事件");}';
|
|
96
|
+
function str(v) { return typeof v === 'string' ? v : ''; }
|
|
97
|
+
function typeLabel(t) {
|
|
98
|
+
if (t === 'create')
|
|
99
|
+
return '录入';
|
|
100
|
+
if (t === 'relate')
|
|
101
|
+
return '关联';
|
|
102
|
+
if (t === 'update')
|
|
103
|
+
return '更新';
|
|
104
|
+
if (t === 'move')
|
|
105
|
+
return '移动';
|
|
106
|
+
if (t === 'qty')
|
|
107
|
+
return '数量变更';
|
|
108
|
+
if (t === 'status')
|
|
109
|
+
return '状态变更';
|
|
110
|
+
if (t === 'undo')
|
|
111
|
+
return '撤销';
|
|
112
|
+
if (t === 'inventory')
|
|
113
|
+
return '盘点';
|
|
114
|
+
if (t === 'resolve')
|
|
115
|
+
return '差异处理';
|
|
116
|
+
if (t === 'photo')
|
|
117
|
+
return '照片';
|
|
118
|
+
return t === '' ? '其他' : t;
|
|
119
|
+
}
|
|
120
|
+
// 信封事件串形如“create:卧室/衣柜;relate:8:常用搭配”:按;分条,首个冒号分类型与明细。
|
|
121
|
+
function parseHistory(raw) {
|
|
122
|
+
return str(raw).split(';').map((s) => s.trim()).filter((s) => s !== '' && s !== '(无历史)').map((s) => {
|
|
123
|
+
const i = s.search(/[::]/);
|
|
124
|
+
const type = i < 0 ? s : s.slice(0, i).trim();
|
|
125
|
+
const detail = i < 0 ? '' : s.slice(i + 1).trim();
|
|
126
|
+
return { type, label: typeLabel(type), summary: summarize(type, detail), detail };
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
const FIELD_NAME_DETAIL = /^(?:名称|分类|归属|价格|备注|照片|固定位)(?:、(?:名称|分类|归属|价格|备注|照片|固定位))*$/; // 「更新」事件的明细是字段名,属类型词,不当摘要用
|
|
130
|
+
function summarize(type, detail) {
|
|
131
|
+
if (type === 'relate') {
|
|
132
|
+
const m = detail.match(/^(\d+)\s*[::]\s*(.+)$/);
|
|
133
|
+
if (m)
|
|
134
|
+
return { label: '关联', value: '与物品' + m[1] + '建立' + m[2], loc: false };
|
|
135
|
+
return { label: '关联', value: detail === '' ? '—' : '建立关联' + detail, loc: false };
|
|
136
|
+
}
|
|
137
|
+
if (type === 'create')
|
|
138
|
+
return { label: '位置', value: detail === '' ? '未记' : detail, loc: detail !== '' };
|
|
139
|
+
if (detail === '' || FIELD_NAME_DETAIL.test(detail))
|
|
140
|
+
return { label: '', value: '—', loc: false };
|
|
141
|
+
if (isLocationDetail(type, detail))
|
|
142
|
+
return { label: '位置', value: detail, loc: true };
|
|
143
|
+
return { label: '', value: detail, loc: false };
|
|
144
|
+
}
|
|
145
|
+
/** 位置值分段呈现(`›` 连接):值本身是「房间/容器」路径串,正文里不留斜杠拼接(同本域 receipt.ts 的写法)。 */
|
|
146
|
+
function locSegs(loc) {
|
|
147
|
+
return loc.split('/').map((s) => s.trim()).filter(Boolean)
|
|
148
|
+
.map((s) => '<span class="seg">' + escapeHtml(s) + '</span>')
|
|
149
|
+
.join('<span class="sep">›</span>');
|
|
150
|
+
}
|
|
151
|
+
/** 复制载荷里的那一句话术:字段名与值合成一行纯文本(供「撤销此操作」按钮带上)。 */
|
|
152
|
+
function plainSum(s) {
|
|
153
|
+
return (s.label === '' ? '' : s.label + ' ') + s.value;
|
|
154
|
+
}
|
|
155
|
+
function isLocationDetail(type, detail) {
|
|
156
|
+
if (type === 'relate' || type === 'undo')
|
|
157
|
+
return false;
|
|
158
|
+
return detail !== '' && /[/室厅卧厨卫阳台库房柜桌箱包]/.test(detail);
|
|
159
|
+
}
|
|
160
|
+
// 装配入口:真 envelope(真命令链产出)+本族模板 → 时间线真页面。
|
|
161
|
+
// fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
|
|
162
|
+
export function renderFamilyPage(env, ctx) {
|
|
163
|
+
const template = readFileSync(new URL('../../../templates/items/history.html', import.meta.url), 'utf8');
|
|
164
|
+
const data = (env.data ?? {});
|
|
165
|
+
const item = (data.item ?? {});
|
|
166
|
+
const name = str(item.name);
|
|
167
|
+
const events = parseHistory(str(item.history));
|
|
168
|
+
const traj = events.filter((e) => isLocationDetail(e.type, e.detail)).map((e) => e.detail);
|
|
169
|
+
const types = [...new Set(events.map((e) => e.type))];
|
|
170
|
+
const trajHtml = traj.length > 0
|
|
171
|
+
? '<div class="traj">' + traj.map((l) => '<span class="pill">' + locSegs(l) + '</span>').join('<span> → </span>') + '</div>'
|
|
172
|
+
: '<p class="lead">暂无轨迹</p>';
|
|
173
|
+
const chips = '<button class="chip on" data-t="all" onclick="chipFilter(this)">全部</button>'
|
|
174
|
+
+ types.map((t) => '<button class="chip" data-t="' + escapeHtml(t) + '" onclick="chipFilter(this)">' + escapeHtml(typeLabel(t)) + '</button>').join('');
|
|
175
|
+
const typeTags = types.length > 0 ? types.map((t) => '<span class="pill">' + escapeHtml(typeLabel(t)) + '</span>').join('') : '<span class="pill">—</span>';
|
|
176
|
+
const timeline = events.length > 0
|
|
177
|
+
? events.map((e, i) => {
|
|
178
|
+
const s = e.summary;
|
|
179
|
+
const plain = plainSum(s);
|
|
180
|
+
return '<div class="ev" data-t="' + escapeHtml(e.type) + '">'
|
|
181
|
+
+ '<div class="top"><span class="ord">第' + (i + 1) + '条</span><span class="type">' + escapeHtml(e.label) + '</span></div>'
|
|
182
|
+
+ '<div class="sum">' + (s.label === '' ? '' : '<span class="k">' + escapeHtml(s.label) + '</span>')
|
|
183
|
+
+ '<span class="v">' + (s.loc ? locSegs(s.value) : escapeHtml(s.value)) + '</span></div>'
|
|
184
|
+
+ '<div class="diffx" id="ev' + i + '">' + escapeHtml(e.detail || '无') + '</div>'
|
|
185
|
+
+ '<div><button class="undoable" onclick="toggleDiff(\'ev' + i + '\')">展开详情</button>'
|
|
186
|
+
+ (e.type === 'undo'
|
|
187
|
+
? '<span class="pill">已撤销</span>'
|
|
188
|
+
: '<button class="undoable" data-s="' + escapeHtml(plain === '—' ? '第' + (i + 1) + '条 ' + e.label : plain) + '" onclick="undoEv(this)">撤销此操作</button>')
|
|
189
|
+
+ '</div></div>';
|
|
190
|
+
}).join('')
|
|
191
|
+
: '<div class="empty">暂无事件</div>';
|
|
192
|
+
const content = '<div class="hero"><p class="eyebrow">查看</p><p class="lead">' + (name !== '' ? '「' + escapeHtml(name) + '」的一生' : '物品历史') + ',时间倒序</p></div>'
|
|
193
|
+
+ '<section class="sec" data-block="fields" data-need="' + NEED.fields + '"><h2>位置轨迹</h2>' + trajHtml
|
|
194
|
+
+ '<h2>时间线共' + events.length + '条</h2><div class="chips">' + chips + '</div>'
|
|
195
|
+
+ '<h2>事件条目</h2><div class="tl">' + timeline + '</div></section>'
|
|
196
|
+
// #817(⑤文案不冗余):「本次事件类型」与上面时间线块的筛选胶囊是同一份取值(同一组类型词),
|
|
197
|
+
// 双份并排=一个事实说两遍;段与 data-need 原文照留(判据件读属性),只在页面上不再重复一遍。
|
|
198
|
+
+ '<section class="sec" hidden data-block="status" data-need="' + NEED.status + '"><h2>本次事件类型</h2><div class="chips">' + typeTags + '</div></section>'
|
|
199
|
+
+ '<section class="sec" data-block="operations" data-need="' + NEED.operations + '"><h2>动作</h2>'
|
|
200
|
+
+ '<div class="btnrow">'
|
|
201
|
+
+ '<button class="btn ghost" onclick="typeCycle()">类型筛选</button>'
|
|
202
|
+
+ '</div>'
|
|
203
|
+
+ homeCopyArea({
|
|
204
|
+
data: { envelope: env },
|
|
205
|
+
log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
|
|
206
|
+
})
|
|
207
|
+
+ '</section>'
|
|
208
|
+
+ '<section class="sec" data-block="empty" data-need="' + NEED.empty + '" hidden></section>'
|
|
209
|
+
+ '<details><summary>数据原文</summary><pre class="pre-block-code" id="raw">' + escapeHtml(JSON.stringify(env.data ?? {})) + '</pre></details>'
|
|
210
|
+
+ '<style>' + CSS + '</style><script>' + JS + '</script>';
|
|
211
|
+
return fillTemplate(template, content);
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/items/pages/history.ts"],"names":[],"mappings":"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"}
|