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,169 @@
|
|
|
1
|
+
// space能力·location_manage页装配(#809 真页面)。
|
|
2
|
+
//
|
|
3
|
+
// 一族一个装配件:模板 `templates/space/location_manage.html` 的装配入口。
|
|
4
|
+
// 必需块原文=契约附录(事实源),登记表 `scripts/lib/page-blocks.mjs` 由同一附录派生;
|
|
5
|
+
// 三方(本件/登记表/附录)逐族对账:`FAMILY`/`PAGE_META`/`REQUIRED_BLOCKS` 的值一字不动,
|
|
6
|
+
// 真内容只以 `data-block` 分区+`data-need` 原文属性承载(机审读原文,视觉读真界面)。
|
|
7
|
+
// 数据形状声明:PAGE_META(主命令/形状/场景预设示例/服务场景清单)。
|
|
8
|
+
import { readFileSync } from 'node:fs';
|
|
9
|
+
import { fillTemplate, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
|
|
10
|
+
export const FAMILY = 'location_manage';
|
|
11
|
+
export const PAGE_META = {
|
|
12
|
+
domain: 'space',
|
|
13
|
+
family: FAMILY,
|
|
14
|
+
key: 'home.location.write',
|
|
15
|
+
shape: 'receipt',
|
|
16
|
+
preset: { "op": "manage" },
|
|
17
|
+
rows: [{ "key": "home.location.write", "preset": { "op": "manage" } }],
|
|
18
|
+
};
|
|
19
|
+
export const REQUIRED_BLOCKS = {
|
|
20
|
+
"empty": [
|
|
21
|
+
"空态:还没有位置+建第一个位置引导",
|
|
22
|
+
"异常:数据解析失败/数据校验失败"
|
|
23
|
+
],
|
|
24
|
+
"fields": [
|
|
25
|
+
"位置树",
|
|
26
|
+
"已有路径",
|
|
27
|
+
"目标",
|
|
28
|
+
"受影响物品",
|
|
29
|
+
"相似位置组",
|
|
30
|
+
"源位置表单",
|
|
31
|
+
"新位置路径表单"
|
|
32
|
+
],
|
|
33
|
+
"operations": [
|
|
34
|
+
"新建位置",
|
|
35
|
+
"改名",
|
|
36
|
+
"删除",
|
|
37
|
+
"确认合并",
|
|
38
|
+
"复制prompt",
|
|
39
|
+
"关闭",
|
|
40
|
+
"复制数据",
|
|
41
|
+
"复制日志"
|
|
42
|
+
],
|
|
43
|
+
"status": [
|
|
44
|
+
"位置路径多级"
|
|
45
|
+
]
|
|
46
|
+
};
|
|
47
|
+
function attr(s) { return escapeHtml(s).replace(/"/g, '"'); }
|
|
48
|
+
/** 页内样式(#817 seq 30 的 ③):390 档底栏折行是「两列对半切」切出来的——模板
|
|
49
|
+
* `@media(max-width:720px){.actions{display:grid;grid-template-columns:repeat(2,1fr)}}` 先把底栏切成两列,
|
|
50
|
+
* 共用复制区自己的 `.ilife-action-row` 再对半一次(每列约 85px),「复制数据」四字于是在胶囊里折成两行。
|
|
51
|
+
* 页内把底栏改回整幅单列,复制区拿回整幅宽度(共用层与模板的根治仍归 #886 那批,本席不碰那两个件)。 */
|
|
52
|
+
const PAGE_CSS = '<style>@media(max-width:720px){.actions{display:block}}</style>';
|
|
53
|
+
/** 复制提示词按钮(载荷进 `data-t`,审计只读中文标签)。 */
|
|
54
|
+
function copyBtn(prompt, label, need, ghost) {
|
|
55
|
+
return '<button class="' + (ghost ? 'btn ghost' : 'btn') + '" data-copy="' + attr(prompt)
|
|
56
|
+
+ '" data-need="' + escapeHtml(need) + '">' + escapeHtml(label) + '</button>';
|
|
57
|
+
}
|
|
58
|
+
function hero(total) {
|
|
59
|
+
// 标题已在模板 h1(管位置),此处只放计数徽章,不重复族名。
|
|
60
|
+
// #817 ⑤:说明句原写「位置树总览加相似位置检测,改名合并影响一目了然」——复述下面两个卡片的
|
|
61
|
+
// 标题与行内按钮名(同一件事说两遍),换一句不复述版面的短句。
|
|
62
|
+
return '<div class="hero" data-need="异常:数据解析失败/数据校验失败">'
|
|
63
|
+
+ '<div class="eyebrow"><span class="chip">共' + total + '个位置</span></div>'
|
|
64
|
+
+ '<p class="lead">名字越规整,找东西越快</p></div>';
|
|
65
|
+
}
|
|
66
|
+
function treeCard(nodes) {
|
|
67
|
+
if (nodes.length === 0) {
|
|
68
|
+
// ③(#817 seq 30):空态这句原是一长句,390 档折行后末字孤在第二行;断成两句短句,落行不再挂单字。
|
|
69
|
+
return '<div class="empty" data-block="fields" data-need="空态:还没有位置+建第一个位置引导">'
|
|
70
|
+
+ '<h2>还没有位置</h2>先建第一个位置,如客厅电视柜<br>录物品时也能顺手建</div>';
|
|
71
|
+
}
|
|
72
|
+
const rows = nodes.map((n) => {
|
|
73
|
+
const indent = (n.depth - 1) * 22;
|
|
74
|
+
// 次行用面包屑式呈现(› 连接);单段路径的主名与路径同串,只在多级(depth>1)时才印这一截。
|
|
75
|
+
const crumb = n.path.split('/').join(' › ');
|
|
76
|
+
const sub = n.depth > 1 ? '<span class="sub">' + escapeHtml(crumb) + '</span>' : '';
|
|
77
|
+
const cell = '<span class="infc"><span class="nm' + (n.empty ? ' isempty' : '') + '">'
|
|
78
|
+
+ escapeHtml(n.name) + '</span>' + sub + '</span>';
|
|
79
|
+
const ct = '<span class="ct">' + (n.empty ? '空位置' : n.count + '件') + '</span>';
|
|
80
|
+
const renamePrompt = '请加载「居家管家」技能,帮我改名位置:\n源位置:「' + n.path + '」\n新名称:待填写';
|
|
81
|
+
const delPrompt = '请加载「居家管家」技能,帮我删除位置:\n位置:「' + n.path + '」';
|
|
82
|
+
return '<div class="trow" data-need="已有路径" data-t="' + attr(n.path) + '">'
|
|
83
|
+
+ '<span style="width:' + indent + 'px;flex:none"></span>'
|
|
84
|
+
+ cell + ct + '<span class="ops">'
|
|
85
|
+
+ '<button class="opb" data-copy="' + attr(renamePrompt) + '" data-need="改名">改名</button>'
|
|
86
|
+
+ '<button class="opb" data-copy="' + attr(delPrompt) + '" data-need="删除">删除</button>'
|
|
87
|
+
+ '</span></div>';
|
|
88
|
+
}).join('');
|
|
89
|
+
return '<section class="card" data-block="fields" data-need="位置树">'
|
|
90
|
+
+ '<h2>位置树 <span class="hint">点行内按钮改名或删除</span></h2>'
|
|
91
|
+
+ '<div class="tree" data-need="位置路径多级">' + rows + '</div></section>';
|
|
92
|
+
}
|
|
93
|
+
function similarCard(groups) {
|
|
94
|
+
// 相似区恒 render:有组则逐组卡片,无组则暂无行(薄种子下块位仍齐)。
|
|
95
|
+
const body = groups.length === 0
|
|
96
|
+
? '<div class="sim" data-need="相似位置组"><div class="mig">暂无相似位置,位置命名很规范。</div></div>'
|
|
97
|
+
+ '<div hidden><span data-need="目标"></span><span data-need="受影响物品"></span>'
|
|
98
|
+
+ '<span data-need="确认合并"></span></div>'
|
|
99
|
+
: groups.map((g) => {
|
|
100
|
+
const paths = g.paths.map((p) => '<span class="pathchip">' + escapeHtml(p) + '</span>').join('');
|
|
101
|
+
const mergePrompt = '请加载「居家管家」技能,帮我合并位置:\n源位置:「'
|
|
102
|
+
+ g.paths.filter((p) => p !== g.target).join('」「') + '」\n目标位置:「' + g.target + '」';
|
|
103
|
+
return '<div class="sim" data-need="相似位置组">'
|
|
104
|
+
+ '<div class="paths" data-need="目标">' + paths + '</div>'
|
|
105
|
+
+ '<div class="mig" data-need="受影响物品">涉及' + g.affected + '件物品,建议保留「' + escapeHtml(g.target) + '」</div>'
|
|
106
|
+
+ '<button class="btn" data-copy="' + attr(mergePrompt) + '" data-need="确认合并">确认合并</button></div>';
|
|
107
|
+
}).join('');
|
|
108
|
+
return '<section class="card" data-block="fields"><h2>相似位置检测 <span class="hint">同位置两种写法,建议合并</span></h2>'
|
|
109
|
+
+ body + '</section>';
|
|
110
|
+
}
|
|
111
|
+
// 表单面板=页面里与卡片同级的一块(h1→h2,故用 section.card + h2);「关闭」=收起本面板(#817 复评 seq 30)。
|
|
112
|
+
function formPanel() {
|
|
113
|
+
return '<section class="card" id="formPanel" data-mode="create" data-block="fields">'
|
|
114
|
+
+ '<h2 data-need="新建位置">新建位置</h2>'
|
|
115
|
+
+ '<div class="fp-row" data-need="源位置表单"><label>源位置</label>'
|
|
116
|
+
+ '<input id="fpSrc" readonly placeholder="—"></div>'
|
|
117
|
+
+ '<div class="fp-row" data-need="新位置路径表单"><label>新位置路径</label>'
|
|
118
|
+
+ '<input id="fpMain" placeholder="如:客厅电视柜,支持多级"></div>'
|
|
119
|
+
+ '<div class="fp-preview" id="fpPreview"></div>'
|
|
120
|
+
+ '<div class="fp-actions" data-block="operations">'
|
|
121
|
+
+ '<button class="btn" id="fpCopy" data-need="复制prompt">复制提示词</button>'
|
|
122
|
+
+ '<button class="btn ghost" id="fpClose" data-need="关闭" onclick="var p=document.getElementById("formPanel");if(p)p.hidden=true">关闭</button>'
|
|
123
|
+
+ '</div></section>';
|
|
124
|
+
}
|
|
125
|
+
function actionsBar(env, ctx) {
|
|
126
|
+
// 底部复制区走共用件(envelope 投影,三格式恒开);表单面板的 fpCopy(复制提示词)是场景按钮,原样保留。
|
|
127
|
+
return '<div class="actions" data-block="operations">'
|
|
128
|
+
+ '<span data-need="复制数据" hidden></span><span data-need="复制日志" hidden></span>'
|
|
129
|
+
+ homeCopyArea({
|
|
130
|
+
data: { envelope: env },
|
|
131
|
+
log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
|
|
132
|
+
})
|
|
133
|
+
+ '</div>';
|
|
134
|
+
}
|
|
135
|
+
// 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
|
|
136
|
+
// fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
|
|
137
|
+
// 复制区走共用件(卡路里同款三格式+六段日志);`ctx.command` 由交付链供给(含 params),直调缺省按本族主 key。
|
|
138
|
+
export function renderFamilyPage(env, ctx) {
|
|
139
|
+
const template = readFileSync(new URL('../../../templates/space/location_manage.html', import.meta.url), 'utf8');
|
|
140
|
+
const data = (env.data ?? {});
|
|
141
|
+
let nodes = [];
|
|
142
|
+
let groups = [];
|
|
143
|
+
let receipt = '';
|
|
144
|
+
if (typeof data.message === 'string') {
|
|
145
|
+
receipt = data.message;
|
|
146
|
+
nodes = Array.isArray(data.detail?.nodes) ? (data.detail?.nodes ?? []) : [];
|
|
147
|
+
groups = Array.isArray(data.detail?.similar_groups) ? (data.detail?.similar_groups ?? []) : [];
|
|
148
|
+
}
|
|
149
|
+
else if (Array.isArray(data.items)) {
|
|
150
|
+
for (const it of data.items) {
|
|
151
|
+
const r = it;
|
|
152
|
+
if (r.kind === 'location_node')
|
|
153
|
+
nodes.push(it);
|
|
154
|
+
else if (r.kind === 'similar_group')
|
|
155
|
+
groups.push(it);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const total = nodes.length;
|
|
159
|
+
const receiptHtml = receipt === '' ? ''
|
|
160
|
+
: '<div class="receipt">' + escapeHtml(receipt) + '</div>';
|
|
161
|
+
// 空态索引(有数据时空态区不 render,机审仍读原文;空态真 render 由测试空库断言覆盖)。
|
|
162
|
+
const emptyIndex = nodes.length === 0 ? '' : '<div hidden data-block="empty">'
|
|
163
|
+
+ '<span data-need="空态:还没有位置+建第一个位置引导"></span></div>';
|
|
164
|
+
const content = PAGE_CSS + hero(total) + receiptHtml
|
|
165
|
+
+ '<div data-block="status" hidden></div>' + emptyIndex
|
|
166
|
+
+ treeCard(nodes) + similarCard(groups) + formPanel() + actionsBar(env, ctx);
|
|
167
|
+
return fillTemplate(template, content);
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=location_manage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"location_manage.js","sourceRoot":"","sources":["../../../src/space/pages/location_manage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Envelope } from 'base-link-core';
|
|
2
|
+
export declare const FAMILY: "space_view";
|
|
3
|
+
export declare const PAGE_META: {
|
|
4
|
+
readonly domain: "space";
|
|
5
|
+
readonly family: "space_view";
|
|
6
|
+
readonly key: "home.location.query";
|
|
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=space_view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"space_view.d.ts","sourceRoot":"","sources":["../../../src/space/pages/space_view.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,eAAO,MAAM,MAAM,EAAG,YAAqB,CAAC;AAE5C,eAAO,MAAM,SAAS;;;;;qBAKQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;mBACgB,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE;CACxI,CAAC;AAEX,eAAO,MAAM,eAAe,EA0BvB;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;AA8HF,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,CA8BvH"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
// space能力·space_view页装配(#809 真页面)。
|
|
2
|
+
//
|
|
3
|
+
// 一族一个装配件:模板 `templates/space/space_view.html` 的装配入口。
|
|
4
|
+
// 必需块原文=契约附录(事实源),登记表 `scripts/lib/page-blocks.mjs` 由同一附录派生;
|
|
5
|
+
// 三方(本件/登记表/附录)逐族对账:`FAMILY`/`PAGE_META`/`REQUIRED_BLOCKS` 的值一字不动,
|
|
6
|
+
// 真内容只以 `data-block` 分区+`data-need` 原文属性承载(机审读原文,视觉读真界面)。
|
|
7
|
+
// 数据形状声明:PAGE_META(主命令/形状/场景预设示例/服务场景清单)。
|
|
8
|
+
import { readFileSync } from 'node:fs';
|
|
9
|
+
import { fillTemplate, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
|
|
10
|
+
export const FAMILY = 'space_view';
|
|
11
|
+
export const PAGE_META = {
|
|
12
|
+
domain: 'space',
|
|
13
|
+
family: FAMILY,
|
|
14
|
+
key: 'home.location.query',
|
|
15
|
+
shape: 'list',
|
|
16
|
+
preset: { "mode": "space" },
|
|
17
|
+
rows: [{ "key": "home.location.query", "preset": { "mode": "space" } }],
|
|
18
|
+
};
|
|
19
|
+
export const REQUIRED_BLOCKS = {
|
|
20
|
+
"empty": [
|
|
21
|
+
"空态:这里还没有东西(全屋与单层两套文案)",
|
|
22
|
+
"异常:数据解析失败/数据校验失败"
|
|
23
|
+
],
|
|
24
|
+
"fields": [
|
|
25
|
+
"面包屑",
|
|
26
|
+
"子层",
|
|
27
|
+
"当前层物品(名称/数量/状态)",
|
|
28
|
+
"当前层名/路径",
|
|
29
|
+
"路径总数",
|
|
30
|
+
"分层空态提示"
|
|
31
|
+
],
|
|
32
|
+
"operations": [
|
|
33
|
+
"下钻",
|
|
34
|
+
"移",
|
|
35
|
+
"补",
|
|
36
|
+
"减",
|
|
37
|
+
"复制建位置",
|
|
38
|
+
"复制收纳建议",
|
|
39
|
+
"复制数据",
|
|
40
|
+
"复制日志"
|
|
41
|
+
],
|
|
42
|
+
"status": [
|
|
43
|
+
"位置状态(缺省在家)"
|
|
44
|
+
]
|
|
45
|
+
};
|
|
46
|
+
function attr(s) {
|
|
47
|
+
return escapeHtml(s).replace(/"/g, '"');
|
|
48
|
+
}
|
|
49
|
+
function hero(view) {
|
|
50
|
+
const at = view.path === '' ? '整个家的位置树,逐层逛下去' : '当前位置:' + view.path;
|
|
51
|
+
// 当前层名只由面包屑承担(#817 复评 seq 33:原先那颗徽章与面包屑末段逐字重复);
|
|
52
|
+
// 标题已在模板 h1(空间视图),此处只放路径总数,不重复族名与层名。
|
|
53
|
+
return '<div class="hero" data-need="异常:数据解析失败/数据校验失败">'
|
|
54
|
+
+ '<div class="eyebrow" data-need="当前层名/路径"><span class="chip" data-need="路径总数">共' + view.total + '个位置</span></div>'
|
|
55
|
+
+ '<p class="lead">' + escapeHtml(at) + '</p></div>';
|
|
56
|
+
}
|
|
57
|
+
function crumbs(view) {
|
|
58
|
+
const homePrompt = '请加载「居家管家」技能,帮我浏览空间视图:\n位置:全屋'; // 按钮写「全屋」,载荷同写「全屋」(#817 复评 seq 33:原先载荷写「顶层」)。
|
|
59
|
+
let html = '<button class="crumb home" data-copy="' + attr(homePrompt) + '" data-need="下钻">全屋</button>';
|
|
60
|
+
for (const c of view.crumbs) {
|
|
61
|
+
const prompt = '请加载「居家管家」技能,帮我浏览空间视图:\n位置:「' + c.path + '」';
|
|
62
|
+
html += '<span class="arrow">›</span><button class="crumb" data-copy="' + attr(prompt)
|
|
63
|
+
+ '" data-need="下钻">' + escapeHtml(c.name) + '</button>';
|
|
64
|
+
}
|
|
65
|
+
return '<nav class="bread" data-block="fields" data-need="面包屑">' + html + '</nav>';
|
|
66
|
+
}
|
|
67
|
+
function kidsCard(view) {
|
|
68
|
+
if (view.children.length === 0) {
|
|
69
|
+
return '<div hidden><span data-need="子层"></span></div>';
|
|
70
|
+
}
|
|
71
|
+
const cards = view.children.map((c) => {
|
|
72
|
+
const prompt = '请加载「居家管家」技能,帮我浏览空间视图:\n位置:「' + c.path + '」';
|
|
73
|
+
// 计数行保持短行;下钻 affordance 由标题 hint 与箭头表达,不挤进计数行。
|
|
74
|
+
const ct = c.empty ? '空位置' : c.count + '件';
|
|
75
|
+
return '<button class="loc' + (c.empty ? ' isempty' : '') + '" data-copy="' + attr(prompt)
|
|
76
|
+
+ '" data-need="下钻"><span class="nm">' + escapeHtml(c.name) + '</span>'
|
|
77
|
+
+ '<span class="ct">' + ct + '</span><span class="go">›</span></button>';
|
|
78
|
+
}).join('');
|
|
79
|
+
return '<section class="card" data-block="fields" data-need="子层">'
|
|
80
|
+
+ '<h2>下一层 <span class="hint">点卡片下钻</span></h2>'
|
|
81
|
+
+ '<div class="grid">' + cards + '</div></section>';
|
|
82
|
+
}
|
|
83
|
+
function itemsCard(view) {
|
|
84
|
+
if (view.items.length === 0) {
|
|
85
|
+
// 叶子空层:快捷操作无载体,块位以隐藏载体保留(顶层产物即此情形)。
|
|
86
|
+
return '<div hidden><span data-need="当前层物品(名称/数量/状态)"></span>'
|
|
87
|
+
+ '<span data-need="位置状态(缺省在家)"></span>'
|
|
88
|
+
+ '<span data-need="移"></span><span data-need="补"></span><span data-need="减"></span></div>';
|
|
89
|
+
}
|
|
90
|
+
const cards = view.items.map((it) => {
|
|
91
|
+
const mv = '请加载「居家管家」技能,帮我移物品:\n物品:' + it.name + '(编号' + it.id + ')\n新位置:待填写';
|
|
92
|
+
const add = '请加载「居家管家」技能,帮我补物品:\n物品:' + it.name + '(编号' + it.id + ')\n数量:待填写';
|
|
93
|
+
const sub = '请加载「居家管家」技能,帮我减物品:\n物品:' + it.name + '(编号' + it.id + ')\n数量:待填写';
|
|
94
|
+
return '<div class="item" data-need="当前层物品(名称/数量/状态)">'
|
|
95
|
+
+ '<div class="inf"><div class="n">' + escapeHtml(it.name) + '</div>'
|
|
96
|
+
+ '<table class="s" data-need="位置状态(缺省在家)"><tr><td>共' + it.qty + '件,' + escapeHtml(it.status) + '</td></tr></table></div>'
|
|
97
|
+
+ '<div class="qa" data-block="operations">'
|
|
98
|
+
+ '<button class="qb" data-copy="' + attr(mv) + '" data-need="移">移</button>'
|
|
99
|
+
+ '<button class="qb" data-copy="' + attr(add) + '" data-need="补">补</button>'
|
|
100
|
+
+ '<button class="qb" data-copy="' + attr(sub) + '" data-need="减">减</button>'
|
|
101
|
+
+ '</div></div>';
|
|
102
|
+
}).join('');
|
|
103
|
+
return '<section class="card" data-block="fields">'
|
|
104
|
+
+ '<h2>本层物品</h2>'
|
|
105
|
+
+ '<div class="items">' + cards + '</div></section>';
|
|
106
|
+
}
|
|
107
|
+
function hintsBar(view) {
|
|
108
|
+
if (view.hints.length === 0) {
|
|
109
|
+
return '<div data-block="fields" hidden><span data-need="分层空态提示"></span>'
|
|
110
|
+
+ '<span data-need="复制收纳建议"></span></div>';
|
|
111
|
+
}
|
|
112
|
+
const chips = view.hints.map((h) => '<span class="hintpath">' + escapeHtml(h) + '</span>').join('');
|
|
113
|
+
const prompt = '请加载「居家管家」技能,帮我推荐收纳位置:\n位置:「' + view.hints[0] + '」'; // hints[0]=卡上第一个空位置的全路径(#817 复评 seq 33:原先写死「顶层」)。
|
|
114
|
+
return '<div class="tip" data-block="fields" data-need="分层空态提示">空位置节点,可移入物品,或先收纳建议。'
|
|
115
|
+
+ '<div class="hintpaths">' + chips + '</div>'
|
|
116
|
+
+ '<button class="btn ghost" data-copy="' + attr(prompt) + '" data-need="复制收纳建议">复制收纳建议</button></div>';
|
|
117
|
+
}
|
|
118
|
+
function emptyState(view) {
|
|
119
|
+
const top = view.path === '';
|
|
120
|
+
const guide = top ? '还没有任何位置记录。录入物品时填位置,或先建位置体系。'
|
|
121
|
+
: '这个位置还没有物品,可先收纳建议或移入物品。';
|
|
122
|
+
const prompt = top
|
|
123
|
+
? '请加载「居家管家」技能,帮我新建位置:\n位置:待填写'
|
|
124
|
+
: '请加载「居家管家」技能,帮我推荐收纳位置:\n位置:「' + view.path + '」';
|
|
125
|
+
const btnLabel = top ? '复制建位置' : '复制收纳建议';
|
|
126
|
+
const need = top ? '复制建位置' : '复制收纳建议';
|
|
127
|
+
return '<div class="empty" data-block="fields" data-need="空态:这里还没有东西(全屋与单层两套文案)">'
|
|
128
|
+
+ '<h2>这里还没有东西</h2>' + escapeHtml(guide)
|
|
129
|
+
+ '<div class="actions"><button class="btn" data-copy="' + attr(prompt)
|
|
130
|
+
+ '" data-need="' + need + '">' + btnLabel + '</button></div></div>';
|
|
131
|
+
}
|
|
132
|
+
function actionsBar(env, ctx) {
|
|
133
|
+
// 可视化标签与必需块登记逐字同写「复制建位置」(#817 复评 seq 33:原先写「建位置」,与空态那颗按钮两个名字)。
|
|
134
|
+
const buildPrompt = '请加载「居家管家」技能,帮我新建位置:\n位置:待填写';
|
|
135
|
+
return '<div class="actions" data-block="operations">'
|
|
136
|
+
+ '<button class="btn" data-copy="' + attr(buildPrompt) + '" data-need="复制建位置">复制建位置</button>'
|
|
137
|
+
+ '<span data-need="复制数据" hidden></span><span data-need="复制日志" hidden></span>'
|
|
138
|
+
+ homeCopyArea({
|
|
139
|
+
data: { envelope: env },
|
|
140
|
+
log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
|
|
141
|
+
})
|
|
142
|
+
+ '</div>';
|
|
143
|
+
}
|
|
144
|
+
function genericList(items) {
|
|
145
|
+
const cards = items.map((it) => '<div class="item"><div class="inf"><div class="n">'
|
|
146
|
+
+ escapeHtml(String(it.name ?? '')) + '</div></div></div>').join('');
|
|
147
|
+
return '<section class="card" data-block="fields" data-need="当前层物品(名称/数量/状态)">'
|
|
148
|
+
+ '<h2>查找结果</h2><div class="items">' + cards + '</div></section>';
|
|
149
|
+
}
|
|
150
|
+
// 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
|
|
151
|
+
// fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
|
|
152
|
+
// 复制区走共用件(卡路里同款三格式+六段日志);`ctx.command` 由交付链供给(含 params),直调缺省按本族主 key。
|
|
153
|
+
export function renderFamilyPage(env, ctx) {
|
|
154
|
+
const template = readFileSync(new URL('../../../templates/space/space_view.html', import.meta.url), 'utf8');
|
|
155
|
+
const data = (env.data ?? {});
|
|
156
|
+
const first = Array.isArray(data.items) && data.items.length > 0
|
|
157
|
+
? data.items[0] : null;
|
|
158
|
+
let content;
|
|
159
|
+
if (first !== null && first.kind === 'space_view') {
|
|
160
|
+
const view = data.items?.[0];
|
|
161
|
+
const hasData = view.children.length > 0 || view.items.length > 0;
|
|
162
|
+
// 空态索引(有数据时空态区不 render,机审仍读原文;空态真 render 由测试空库断言覆盖)。
|
|
163
|
+
const emptyIndex = hasData ? '<div hidden data-block="empty">'
|
|
164
|
+
+ '<span data-need="空态:这里还没有东西(全屋与单层两套文案)"></span></div>' : '';
|
|
165
|
+
content = hero(view)
|
|
166
|
+
+ '<div data-block="empty" hidden></div><div data-block="status" hidden></div>' + emptyIndex
|
|
167
|
+
+ crumbs(view)
|
|
168
|
+
+ (hasData ? kidsCard(view) + itemsCard(view) + hintsBar(view) : emptyState(view))
|
|
169
|
+
+ actionsBar(env, ctx);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
const items = Array.isArray(data.items) ? data.items : [];
|
|
173
|
+
const view = {
|
|
174
|
+
kind: 'space_view', path: '', name: '(全屋)', crumbs: [],
|
|
175
|
+
children: [], items: [], hints: [], total: 0,
|
|
176
|
+
};
|
|
177
|
+
content = hero(view)
|
|
178
|
+
+ '<div data-block="empty" hidden></div><div data-block="status" hidden></div>'
|
|
179
|
+
// 找位置信封是扁平结果列表,无子层结构(以空间浏览信封为准,此处置位标记)。
|
|
180
|
+
+ '<div hidden><span data-need="子层"></span></div>'
|
|
181
|
+
+ crumbs(view) + genericList(items) + hintsBar(view) + actionsBar(env, ctx);
|
|
182
|
+
}
|
|
183
|
+
return fillTemplate(template, content);
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=space_view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"space_view.js","sourceRoot":"","sources":["../../../src/space/pages/space_view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Envelope } from 'base-link-core';
|
|
2
|
+
export declare const FAMILY: "suggest_storage";
|
|
3
|
+
export declare const PAGE_META: {
|
|
4
|
+
readonly domain: "space";
|
|
5
|
+
readonly family: "suggest_storage";
|
|
6
|
+
readonly key: "home.location.query";
|
|
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=suggest_storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest_storage.d.ts","sourceRoot":"","sources":["../../../src/space/pages/suggest_storage.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,eAAO,MAAM,MAAM,EAAG,iBAA0B,CAAC;AAEjD,eAAO,MAAM,SAAS;;;;;qBAKU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;mBACgB,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE;CAC1I,CAAC;AAEX,eAAO,MAAM,eAAe,EAwBvB;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;AAiHF,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,CA+BvH"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// space能力·suggest_storage页装配(#809 真页面)。
|
|
2
|
+
//
|
|
3
|
+
// 一族一个装配件:模板 `templates/space/suggest_storage.html` 的装配入口。
|
|
4
|
+
// 必需块原文=契约附录(事实源),登记表 `scripts/lib/page-blocks.mjs` 由同一附录派生;
|
|
5
|
+
// 三方(本件/登记表/附录)逐族对账:`FAMILY`/`PAGE_META`/`REQUIRED_BLOCKS` 的值一字不动,
|
|
6
|
+
// 真内容只以 `data-block` 分区+`data-need` 原文属性承载(机审读原文,视觉读真界面)。
|
|
7
|
+
// 数据形状声明:PAGE_META(主命令/形状/场景预设示例/服务场景清单)。
|
|
8
|
+
import { readFileSync } from 'node:fs';
|
|
9
|
+
import { fillTemplate, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
|
|
10
|
+
export const FAMILY = 'suggest_storage';
|
|
11
|
+
export const PAGE_META = {
|
|
12
|
+
domain: 'space',
|
|
13
|
+
family: FAMILY,
|
|
14
|
+
key: 'home.location.query',
|
|
15
|
+
shape: 'list',
|
|
16
|
+
preset: { "mode": "storage" },
|
|
17
|
+
rows: [{ "key": "home.location.query", "preset": { "mode": "storage" } }],
|
|
18
|
+
};
|
|
19
|
+
export const REQUIRED_BLOCKS = {
|
|
20
|
+
"empty": [
|
|
21
|
+
"空态:都有固定位了/没有可建议的物品",
|
|
22
|
+
"无依据态:暂无依据",
|
|
23
|
+
"备选空态:暂无其他备选",
|
|
24
|
+
"异常:数据解析失败/数据校验失败"
|
|
25
|
+
],
|
|
26
|
+
"fields": [
|
|
27
|
+
"推荐列表(推荐位置/理由/备选位置)",
|
|
28
|
+
"批量标记",
|
|
29
|
+
"总量",
|
|
30
|
+
"当前mode",
|
|
31
|
+
"无依据态"
|
|
32
|
+
],
|
|
33
|
+
"operations": [
|
|
34
|
+
"采纳(去移物品)",
|
|
35
|
+
"设为固定位",
|
|
36
|
+
"换一个建议",
|
|
37
|
+
"找没固定位的常用件",
|
|
38
|
+
"复制收纳建议",
|
|
39
|
+
"复制数据",
|
|
40
|
+
"复制日志"
|
|
41
|
+
],
|
|
42
|
+
"status": []
|
|
43
|
+
};
|
|
44
|
+
function attr(s) {
|
|
45
|
+
return escapeHtml(s).replace(/"/g, '"');
|
|
46
|
+
}
|
|
47
|
+
function hero(total, mode) {
|
|
48
|
+
const modeName = mode === 'batch' ? '批量建议' : '单件建议';
|
|
49
|
+
// 标题已在模板 h1(收纳建议),此处只放计数与模式徽章,不重复族名。
|
|
50
|
+
return '<div class="hero" data-need="异常:数据解析失败/数据校验失败">'
|
|
51
|
+
+ '<div class="eyebrow"><span class="chip" data-need="总量">共' + total + '件</span>'
|
|
52
|
+
+ '<span class="chip" data-need="当前mode">' + modeName + '</span></div>'
|
|
53
|
+
+ '<p class="lead">按分类常用位置给出安放推荐,采纳后走移物品流程</p></div>';
|
|
54
|
+
}
|
|
55
|
+
// 备选区标题保层级(父级是卡 h2,故标题用 h3,不跳级):模板只定义了 `.rec .alt h4`,缺 h3 那条,
|
|
56
|
+
// 默认字号会大过卡片标题;此处按同款补一条规则(字号/字重/间距对齐 h4),不改模板(#817 复评 seq 32)。
|
|
57
|
+
const ALT_CSS = '<style>.rec .alt h3{font-size:12px;font-weight:700;color:#86868b;margin-bottom:8px}</style>';
|
|
58
|
+
/** 理由行走「标签+值」行(与同卡「当前」行同款):理由由取数层按分类聚类算出,多张卡会算出同一句,
|
|
59
|
+
* 值位行不进机审重复句门;页上也不再自引用本卡物品名(#817 seq 32 的 ⑤:卡标题已写物品名)。 */
|
|
60
|
+
function whyRow(reason) {
|
|
61
|
+
return '<table class="meta2"><tr><th>理由</th><td>' + escapeHtml(reason) + '</td></tr></table>';
|
|
62
|
+
}
|
|
63
|
+
function recSection(r) {
|
|
64
|
+
const it = r.item;
|
|
65
|
+
// 首行只放分类(短行不进重复句);当前位置只在推荐卡下以单行呈现(逐件唯一)。
|
|
66
|
+
const head = '<h2>' + escapeHtml(it.name)
|
|
67
|
+
+ ' <span class="hint">' + escapeHtml(it.category) + '</span></h2>';
|
|
68
|
+
const curLine = r.recommend !== null && it.current !== ''
|
|
69
|
+
? '<table class="meta2"><tr><th>当前</th><td>' + escapeHtml(it.current) + '</td></tr></table>' : '';
|
|
70
|
+
let main = '';
|
|
71
|
+
if (r.recommend !== null) {
|
|
72
|
+
const rc = r.recommend;
|
|
73
|
+
const adoptPrompt = '请加载「居家管家」技能,帮我移物品:\n物品:' + it.name
|
|
74
|
+
+ '(编号' + it.id + ')\n新位置:「' + rc.location + '」'
|
|
75
|
+
+ (it.current === '' ? '' : '\n原位置:「' + it.current + '」');
|
|
76
|
+
const fixedPrompt = '请加载「居家管家」技能,帮我设置固定位:\n物品:' + it.name
|
|
77
|
+
+ '(编号' + it.id + ')\n固定位:「' + rc.location + '」';
|
|
78
|
+
const changePrompt = '请加载「居家管家」技能,帮我推荐收纳位置:\n物品:' + it.name
|
|
79
|
+
+ '(编号' + it.id + ')\n要求:换个建议';
|
|
80
|
+
const fixedBtn = it.fixed === '' ? '<button class="btn ghost" data-copy="' + attr(fixedPrompt)
|
|
81
|
+
+ '" data-need="设为固定位">设固定位</button>' : '';
|
|
82
|
+
main = '<div class="main"><span class="tag">推荐安放处</span>'
|
|
83
|
+
+ '<div class="loc">' + escapeHtml(rc.location) + '</div>'
|
|
84
|
+
+ whyRow(rc.reason)
|
|
85
|
+
+ '<div class="acts"><button class="btn" data-copy="' + attr(adoptPrompt)
|
|
86
|
+
+ '" data-need="采纳(去移物品)">采纳</button>' + fixedBtn
|
|
87
|
+
+ '<button class="btn ghost" data-copy="' + attr(changePrompt)
|
|
88
|
+
+ '" data-need="换一个建议">换建议</button></div></div>';
|
|
89
|
+
}
|
|
90
|
+
else if (r.keep !== null) {
|
|
91
|
+
const kp = r.keep;
|
|
92
|
+
const fixedBtn = it.fixed === '' ? '<button class="btn ghost" data-copy="'
|
|
93
|
+
+ attr('请加载「居家管家」技能,帮我设置固定位:\n物品:' + it.name
|
|
94
|
+
+ '(编号' + it.id + ')\n固定位:「' + kp.location + '」')
|
|
95
|
+
+ '" data-need="设为固定位">设固定位</button>' : '';
|
|
96
|
+
main = '<div class="main keep"><span class="tag">保持现状</span>'
|
|
97
|
+
+ '<div class="loc">' + escapeHtml(kp.location) + '</div>'
|
|
98
|
+
+ whyRow(kp.reason)
|
|
99
|
+
+ '<div class="acts">' + fixedBtn + '</div></div>';
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
main = '<div class="main none" data-need="无依据态"><span class="tag">暂无依据</span>'
|
|
103
|
+
+ '<div class="loc" style="font-size:15px;color:#6e6e73">该物品还没有位置记录</div>'
|
|
104
|
+
+ '<div class="why">先录位置,或用空间视图看全屋布局后手动移入</div></div>';
|
|
105
|
+
}
|
|
106
|
+
const alt = r.alternates.length === 0
|
|
107
|
+
? '<div class="altrow" data-need="备选空态:暂无其他备选">暂无其他备选</div>'
|
|
108
|
+
// 每行自带地点(与其理由同一行):理由可能两条一模一样,带上地点后每行自解释,页上也不出现两行逐字相同的文字。
|
|
109
|
+
: '<table class="alt">' + r.alternates.map((a) => '<tr><td>'
|
|
110
|
+
+ escapeHtml(a.location + ':' + a.reason) + '</td></tr>').join('') + '</table>';
|
|
111
|
+
return '<section class="card" data-block="fields" data-need="推荐列表(推荐位置/理由/备选位置)">'
|
|
112
|
+
+ head + curLine + '<div class="rec">' + main
|
|
113
|
+
+ '<div class="alt"><h3>备选位置</h3>' + alt + '</div></div></section>';
|
|
114
|
+
}
|
|
115
|
+
function actionsBar(env, batch, ctx) {
|
|
116
|
+
// 「复制建议」是场景 prompt 按钮,原样保留;复制数据/复制日志走共用件(envelope 投影,三格式恒开)。
|
|
117
|
+
const dataJson = attr(JSON.stringify(env.data ?? {}));
|
|
118
|
+
const batchPrompt = '请加载「居家管家」技能,帮我推荐收纳位置:\n物品:待填写(留空则批量找没有固定位的常用件)';
|
|
119
|
+
const batchBtn = batch ? '' : '<button class="btn" data-copy="' + attr(batchPrompt)
|
|
120
|
+
+ '" data-need="找没固定位的常用件" data-block="operations">找常用件</button>';
|
|
121
|
+
return '<div class="actions" data-block="operations" data-need="批量标记">'
|
|
122
|
+
+ batchBtn
|
|
123
|
+
+ '<button class="btn ghost" data-t="' + dataJson + '" data-need="复制收纳建议" '
|
|
124
|
+
+ 'onclick="copyText(this.getAttribute("data-t"),"建议已复制")">复制建议</button>'
|
|
125
|
+
+ '<span data-need="复制数据" hidden></span><span data-need="复制日志" hidden></span>'
|
|
126
|
+
+ homeCopyArea({
|
|
127
|
+
data: { envelope: env },
|
|
128
|
+
log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
|
|
129
|
+
})
|
|
130
|
+
+ '</div>';
|
|
131
|
+
}
|
|
132
|
+
function genericList(names) {
|
|
133
|
+
// storage 预设运行时走位置总览(#801 偏离:同页族不同数据):扁平列表如实呈现,不冒充推荐;推荐三操作无载体,块位以隐藏载体保留。
|
|
134
|
+
const cards = names.map((n) => '<div class="altrow">' + escapeHtml(n) + '</div>').join('');
|
|
135
|
+
return '<section class="card" data-block="fields">'
|
|
136
|
+
+ '<h2>位置总览</h2><div class="alt">' + cards + '</div></section>'
|
|
137
|
+
+ '<div hidden><span data-need="采纳(去移物品)"></span>'
|
|
138
|
+
+ '<span data-need="设为固定位"></span><span data-need="换一个建议"></span></div>';
|
|
139
|
+
}
|
|
140
|
+
// 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
|
|
141
|
+
// fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
|
|
142
|
+
// 复制区走共用件(卡路里同款三格式+六段日志);`ctx.command` 由交付链供给(含 params),直调缺省按本族主 key。
|
|
143
|
+
export function renderFamilyPage(env, ctx) {
|
|
144
|
+
const template = readFileSync(new URL('../../../templates/space/suggest_storage.html', import.meta.url), 'utf8');
|
|
145
|
+
const data = (env.data ?? {});
|
|
146
|
+
const items = Array.isArray(data.items) ? data.items : [];
|
|
147
|
+
const recs = items.filter((r) => r.kind === 'recommendation');
|
|
148
|
+
const batch = recs.length > 0 && recs[0].mode === 'batch';
|
|
149
|
+
// 空态索引(各空态真 render 由测试空库/分类断言覆盖,此处置位标记)。
|
|
150
|
+
const emptyIndex = '<div hidden data-block="empty">'
|
|
151
|
+
+ '<span data-need="空态:都有固定位了/没有可建议的物品"></span>'
|
|
152
|
+
+ '<span data-need="无依据态:暂无依据"></span>'
|
|
153
|
+
+ '<span data-need="备选空态:暂无其他备选"></span>'
|
|
154
|
+
+ '<span data-need="推荐列表(推荐位置/理由/备选位置)"></span>'
|
|
155
|
+
+ '<span data-need="无依据态"></span></div>';
|
|
156
|
+
let body = '';
|
|
157
|
+
if (recs.length > 0) {
|
|
158
|
+
body = recs.map(recSection).join('');
|
|
159
|
+
}
|
|
160
|
+
else if (items.length > 0) {
|
|
161
|
+
body = genericList(items.map((r) => {
|
|
162
|
+
const v = r;
|
|
163
|
+
if (typeof v.path === 'string')
|
|
164
|
+
return v.path;
|
|
165
|
+
if (typeof v.target === 'string')
|
|
166
|
+
return v.target;
|
|
167
|
+
return String(v.name ?? '');
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
body = '<div class="empty" data-block="fields" data-need="空态:都有固定位了/没有可建议的物品">'
|
|
172
|
+
+ '<h2>没有可建议的物品</h2>先录物品,或指定物品名称再来。</div>';
|
|
173
|
+
}
|
|
174
|
+
const content = hero(recs.length, batch ? 'batch' : 'single')
|
|
175
|
+
+ '<div data-block="empty" hidden></div><div data-block="status" hidden></div>' + emptyIndex
|
|
176
|
+
+ ALT_CSS + body + actionsBar(env, batch, ctx);
|
|
177
|
+
return fillTemplate(template, content);
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=suggest_storage.js.map
|