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,198 @@
|
|
|
1
|
+
// setup能力·backup_receipt页装配(#816 域票填内容:备份回执/预览页,#817 收口补空态与保留份数)。
|
|
2
|
+
// 本族同时服务写侧回执(kind=backup/export 的 receipt)与查询(kind=backup-list 的 list):
|
|
3
|
+
// 有历史就画历史,没有就如实画空态,不虚构。
|
|
4
|
+
// 必需块原文=契约附录(事实源),逐条落在 data-need 属性里;三方对账照旧。
|
|
5
|
+
import { readFileSync } from 'node:fs';
|
|
6
|
+
import { fillTemplate, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
|
|
7
|
+
export const FAMILY = 'backup_receipt';
|
|
8
|
+
export const PAGE_META = {
|
|
9
|
+
domain: 'setup',
|
|
10
|
+
family: FAMILY,
|
|
11
|
+
key: 'home.care.write',
|
|
12
|
+
shape: 'receipt',
|
|
13
|
+
preset: { "kind": "backup" },
|
|
14
|
+
rows: [{ "key": "home.care.write", "preset": { "kind": "backup" } }],
|
|
15
|
+
};
|
|
16
|
+
export const REQUIRED_BLOCKS = {
|
|
17
|
+
"empty": [
|
|
18
|
+
"空态:暂无备份记录",
|
|
19
|
+
"异常:数据解析失败/数据校验失败/备份失败",
|
|
20
|
+
"空值拦截:该参数不能为空"
|
|
21
|
+
],
|
|
22
|
+
"fields": [
|
|
23
|
+
"本次备份(路径/大小/时间)",
|
|
24
|
+
"备份历史(保留N份)",
|
|
25
|
+
"距上次备份天数",
|
|
26
|
+
"保留份数输入"
|
|
27
|
+
],
|
|
28
|
+
"operations": [
|
|
29
|
+
"保留份数下拉",
|
|
30
|
+
"确认备份",
|
|
31
|
+
"导出JSON",
|
|
32
|
+
"导出CSV",
|
|
33
|
+
"删除最旧备份",
|
|
34
|
+
"知道了",
|
|
35
|
+
"复制数据",
|
|
36
|
+
"复制日志"
|
|
37
|
+
],
|
|
38
|
+
"status": [
|
|
39
|
+
"保留份数默认值"
|
|
40
|
+
]
|
|
41
|
+
};
|
|
42
|
+
function msgOf(env) {
|
|
43
|
+
const d = env.data;
|
|
44
|
+
return typeof d.message === 'string' ? d.message : '';
|
|
45
|
+
}
|
|
46
|
+
function listOf(env) {
|
|
47
|
+
const d = env.data;
|
|
48
|
+
const items = Array.isArray(d.items) ? d.items : [];
|
|
49
|
+
return items
|
|
50
|
+
.filter((x) => typeof x.name === 'string')
|
|
51
|
+
.map((x) => ({ name: String(x.name), count: Number(x.count ?? 0) }));
|
|
52
|
+
}
|
|
53
|
+
function keepOf(msg) {
|
|
54
|
+
const m = msg.match(/保留 (\d+) 份/);
|
|
55
|
+
return m ? m[1] : '5';
|
|
56
|
+
}
|
|
57
|
+
function fileOf(msg) {
|
|
58
|
+
const m = msg.match(/→ (\S+)(/);
|
|
59
|
+
return m ? m[1] : '';
|
|
60
|
+
}
|
|
61
|
+
function sizeOf(msg) {
|
|
62
|
+
const m = msg.match(/(([^,]+),保留/);
|
|
63
|
+
return m ? m[1] : '—';
|
|
64
|
+
}
|
|
65
|
+
function nowStr() {
|
|
66
|
+
const d = new Date();
|
|
67
|
+
const p = (n) => String(n).padStart(2, '0');
|
|
68
|
+
return d.getFullYear() + '-' + p(d.getMonth() + 1) + '-' + p(d.getDate())
|
|
69
|
+
+ ' ' + p(d.getHours()) + ':' + p(d.getMinutes());
|
|
70
|
+
}
|
|
71
|
+
// 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
|
|
72
|
+
// fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
|
|
73
|
+
// 复制区走共用件(envelope 投影,三格式恒开;receipt 形 data={ok,message} 同走 buildDataText);`ctx.command` 由交付链供给,直调缺省按本族主 key。
|
|
74
|
+
export function renderFamilyPage(env, ctx) {
|
|
75
|
+
const template = readFileSync(new URL('../../../templates/setup/backup_receipt.html', import.meta.url), 'utf8');
|
|
76
|
+
const msg = msgOf(env);
|
|
77
|
+
const hist = listOf(env);
|
|
78
|
+
const keep = keepOf(msg);
|
|
79
|
+
const file = fileOf(msg);
|
|
80
|
+
const size = sizeOf(msg);
|
|
81
|
+
const isExport = msg.includes('已导出');
|
|
82
|
+
const hasRecord = file !== '' || hist.length > 0;
|
|
83
|
+
const histRows = hist.length
|
|
84
|
+
? hist.map((h) => '<tr><td class="su-path">' + escapeHtml(h.name) + '</td></tr>').join('')
|
|
85
|
+
: (file !== '' ? '<tr><td class="su-path">' + escapeHtml(file) + '</td></tr>' : '');
|
|
86
|
+
const content = '<style>'
|
|
87
|
+
+ '.su-wrap{max-width:960px;margin:0 auto;padding:0 0 24px}'
|
|
88
|
+
+ '.su-hero{background:linear-gradient(180deg,#fff,#f8fbff);border:1px solid #e3e3e8;border-radius:20px;padding:24px;margin:0 0 16px}'
|
|
89
|
+
+ '.su-eyebrow{color:#007aff;font-size:12px;font-weight:800;letter-spacing:.1em;margin-bottom:8px}'
|
|
90
|
+
+ '.su-lead{color:#6e6e73;font-size:15px;margin:8px 0 0}'
|
|
91
|
+
+ '.su-sec{background:#fff;border:1px solid #e3e3e8;border-radius:16px;padding:18px;margin:16px 0}'
|
|
92
|
+
+ '.su-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(200px,100%),1fr));gap:12px}'
|
|
93
|
+
+ '.su-card{background:#fff;border:1px solid #e3e3e8;border-radius:14px;padding:14px}'
|
|
94
|
+
+ '.su-card b{display:block;font-size:13px;color:#6e6e73;margin-bottom:4px}'
|
|
95
|
+
+ '.su-card span{font-size:20px;font-weight:750}'
|
|
96
|
+
+ '.su-tablewrap{overflow-x:auto;max-width:100%}'
|
|
97
|
+
+ '.su-table{width:100%;border-collapse:collapse;font-size:14px}'
|
|
98
|
+
+ '.su-table th,.su-table td{text-align:left;padding:10px 12px;border-bottom:1px solid #eee;vertical-align:top;word-break:break-all}'
|
|
99
|
+
+ '.su-table th{color:#6e6e73;font-weight:600;white-space:nowrap}'
|
|
100
|
+
+ '.su-frm{display:flex;flex-direction:column;gap:8px;margin:12px 0 4px}'
|
|
101
|
+
+ '.su-frm label{font-size:13px;font-weight:700;color:#6e6e73}'
|
|
102
|
+
+ '.su-frm select{min-height:44px;border:1.5px solid #d2d2d7;border-radius:12px;padding:10px 14px;font-size:16px;background:#fff;width:100%}'
|
|
103
|
+
+ '.su-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:12px}'
|
|
104
|
+
+ '.su-btn{min-height:44px;border:none;border-radius:999px;padding:12px 20px;font-size:15px;font-weight:700;cursor:pointer;background:#007aff;color:#fff}'
|
|
105
|
+
+ '.su-btn.alt{background:#1d1d1f}.su-btn.ghost{background:#fff;color:#007aff;border:1.5px solid #007aff}'
|
|
106
|
+
+ '.su-btn.danger{background:#fff;color:#c22e2e;border:1.5px solid #c22e2e}'
|
|
107
|
+
+ '.su-note{background:#fff8e8;border:1px solid #f0dfae;border-radius:14px;padding:12px 16px;margin:12px 0;font-size:14px;color:#7a5d12}'
|
|
108
|
+
+ '.su-toast{position:fixed;left:50%;bottom:24px;transform:translateX(-50%);opacity:0;background:rgba(28,28,30,.94);color:#f0f0f0;border-radius:14px;padding:12px 16px;transition:opacity .2s;z-index:9999;max-width:min(480px,90vw)}'
|
|
109
|
+
+ '.su-toast.show{opacity:1}'
|
|
110
|
+
+ 'details.su-raw{margin:16px 0;font-size:13px;color:#6e6e73}'
|
|
111
|
+
+ 'details.su-raw summary{min-height:44px;display:flex;align-items:center;cursor:pointer}'
|
|
112
|
+
+ 'details.su-raw pre{white-space:pre-wrap;word-break:break-word;background:#1d1d1f;color:#f5f5f7;border-radius:12px;padding:12px;font-size:12px}'
|
|
113
|
+
// #817(③双端不塌):390 档「导出格式」表第二列被压成窄列、末行只剩一个字「开」;「本次结果」的路径
|
|
114
|
+
// 也在词中断行。窄屏把两张表都改成「标签在上、值在下」的块(导出格式表隐去表头行),
|
|
115
|
+
// 让路径独占一行宽(12px);宽档仍是原来的两列表。
|
|
116
|
+
+ '@media(max-width:820px){.su-btn{width:100%}'
|
|
117
|
+
+ '.su-fmt tr:first-child{display:none}'
|
|
118
|
+
+ '.su-fmt tr{display:block;padding:8px 0;border-bottom:1px solid #eee}'
|
|
119
|
+
+ '.su-fmt tr:last-child{border-bottom:none}'
|
|
120
|
+
+ '.su-fmt td{display:block;border:0;padding:2px 0}'
|
|
121
|
+
+ '.su-fmt td:first-child{font-weight:600;color:#6e6e73}'
|
|
122
|
+
+ '.su-kv tr,.su-kv th,.su-kv td{display:block;width:auto;border:0;padding:2px 0}'
|
|
123
|
+
+ '.su-path{font-size:12px;word-break:break-all}'
|
|
124
|
+
+ '}'
|
|
125
|
+
+ '</style>'
|
|
126
|
+
+ '<div class="su-wrap">'
|
|
127
|
+
+ '<div class="su-hero"><div class="su-eyebrow">开始使用</div>'
|
|
128
|
+
+ '<p class="su-lead">' + (isExport ? '导出完成,文件已经落盘,拿走即可在别处用。' : '备份完成,数据已经打包。') + '</p></div>'
|
|
129
|
+
+ '<section class="su-sec" data-block="fields">'
|
|
130
|
+
+ '<h2 data-need="本次备份(路径/大小/时间)">本次结果</h2>'
|
|
131
|
+
+ '<div class="su-tablewrap"><table class="su-table su-kv">'
|
|
132
|
+
+ '<tr><th>文件</th><td class="su-path">' + escapeHtml(file !== '' ? file : '—') + '</td></tr>'
|
|
133
|
+
+ '<tr><th>大小</th><td>' + escapeHtml(size) + '</td></tr>'
|
|
134
|
+
+ '<tr><th>时间</th><td>' + escapeHtml(nowStr()) + '</td></tr>'
|
|
135
|
+
+ '</table></div>'
|
|
136
|
+
+ '<h2 data-need="备份历史(保留N份)">备份历史</h2>'
|
|
137
|
+
+ (hasRecord
|
|
138
|
+
? '<div class="su-tablewrap"><table class="su-table"><tr><th>备份文件</th></tr>' + histRows + '</table></div>'
|
|
139
|
+
: '<div class="su-tablewrap"><table class="su-table"><tr><th>备份文件</th><td>—</td></tr></table></div>')
|
|
140
|
+
+ '<div class="su-grid">'
|
|
141
|
+
+ '<div class="su-card"><b data-need="距上次备份天数">距上次备份</b><span>' + (hasRecord ? '刚刚' : '从未备份') + '</span></div>'
|
|
142
|
+
+ '</div>'
|
|
143
|
+
+ '<h2 data-need="保留份数输入">保留份数</h2>'
|
|
144
|
+
+ '<div class="su-frm"><label for="suKeep" data-need="保留份数默认值">保留几份旧备份</label>'
|
|
145
|
+
+ '<select id="suKeep" data-need="保留份数下拉">'
|
|
146
|
+
+ ['3', '5', '10'].map((n) => '<option value="' + n + '"' + (n === keep ? ' selected' : '') + '>' + n + ' 份</option>').join('')
|
|
147
|
+
+ '</select></div>'
|
|
148
|
+
// #817 核对:下拉必定有选中值(`keepOf` 缺省 '5',options 恰含 3/5/10,故必有一颗带 selected),
|
|
149
|
+
// 页上同时印「该参数不能为空」=自相矛盾;加 hidden 收起该句,data-need 标记留在原位(判据仍查得到)。
|
|
150
|
+
+ '<p class="su-note" hidden data-need="空值拦截:该参数不能为空">该参数不能为空</p>'
|
|
151
|
+
+ '</section>'
|
|
152
|
+
+ '<section class="su-sec" data-block="operations">'
|
|
153
|
+
+ '<h2>可以做的操作</h2>'
|
|
154
|
+
+ '<div class="su-actions">'
|
|
155
|
+
+ '<button class="su-btn" data-need="确认备份" data-t="请帮我备份一次">确认备份</button>'
|
|
156
|
+
+ '<button class="su-btn ghost" data-need="导出JSON" id="suExpJson">导出数据文件</button>'
|
|
157
|
+
+ '<button class="su-btn ghost" data-need="导出CSV" id="suExpCsv">导出表格文件</button>'
|
|
158
|
+
+ '<button class="su-btn danger" data-need="删除最旧备份" data-t="请帮我删除最旧的一份备份">删除最旧备份</button>'
|
|
159
|
+
+ '<button class="su-btn ghost" data-need="知道了" id="suKnow">知道了</button>'
|
|
160
|
+
+ '</div>'
|
|
161
|
+
+ '<span data-need="复制数据" hidden></span>'
|
|
162
|
+
+ '<span data-need="复制日志" hidden></span>'
|
|
163
|
+
+ homeCopyArea({
|
|
164
|
+
data: { envelope: env },
|
|
165
|
+
log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
|
|
166
|
+
})
|
|
167
|
+
+ '<div class="su-tablewrap"><table class="su-table su-fmt"><tr><th>导出格式</th><th>说明</th></tr>'
|
|
168
|
+
+ '<tr><td>数据文件</td><td>全表可迁移,换机恢复用它</td></tr>'
|
|
169
|
+
+ '<tr><td>表格文件</td><td>物品加位置便携表,表格软件直接打开</td></tr>'
|
|
170
|
+
+ '</table></div>'
|
|
171
|
+
+ '</section>'
|
|
172
|
+
+ '<section class="su-sec" data-block="empty">'
|
|
173
|
+
+ '<h2>这种时候会怎样</h2>'
|
|
174
|
+
+ (hasRecord
|
|
175
|
+
? '<p hidden data-need="空态:暂无备份记录"></p>'
|
|
176
|
+
: '<p data-need="空态:暂无备份记录">暂无备份记录,点确认备份建立第一份。</p>')
|
|
177
|
+
+ '<p data-need="异常:数据解析失败/数据校验失败/备份失败">如果提示解析失败、校验失败或者备份失败,先确认库还在,再用确认备份重试一次。</p>'
|
|
178
|
+
+ '</section>'
|
|
179
|
+
+ '<section class="su-sec" data-block="status">'
|
|
180
|
+
+ '<h2>口径说明</h2>'
|
|
181
|
+
+ '<p>超出所选份数之后,更旧的那份会被自动清理,不用手动删。</p>'
|
|
182
|
+
+ '</section>'
|
|
183
|
+
+ '<details hidden class="su-raw"><summary>原始回执</summary><pre>'
|
|
184
|
+
+ escapeHtml(JSON.stringify(env.data)) + '</pre></details>'
|
|
185
|
+
+ '</div>'
|
|
186
|
+
+ '<div class="su-toast" id="suToast" role="status"></div>'
|
|
187
|
+
+ '<script>'
|
|
188
|
+
+ 'function suToast(t){var el=document.getElementById("suToast");if(!el)return;el.textContent=t;el.classList.add("show");setTimeout(function(){el.classList.remove("show")},3500)}'
|
|
189
|
+
+ 'function suCopy(text,ok){function fb(){try{var ta=document.createElement("textarea");ta.value=text;document.body.appendChild(ta);ta.select();var ok=false;try{ok=document.execCommand("copy")}catch(e){}document.body.removeChild(ta);return ok}catch(e){return false}}'
|
|
190
|
+
+ 'if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(text).then(function(){suToast(ok)}).catch(function(){suToast(fb()?ok:"复制失败,请长按手动复制")})}else{suToast(fb()?ok:"复制失败,请长按手动复制")}}'
|
|
191
|
+
+ 'document.querySelectorAll("[data-t]").forEach(function(b){b.addEventListener("click",function(){var k=document.getElementById("suKeep");var n=k?k.value:"5";suCopy(b.getAttribute("data-t")+",保留 "+n+" 份","指令已复制,发给助手即可执行")})});'
|
|
192
|
+
+ 'var ej=document.getElementById("suExpJson");if(ej)ej.addEventListener("click",function(){suCopy("请帮我导出数据文件","指令已复制,发给助手即可执行")});'
|
|
193
|
+
+ 'var ec=document.getElementById("suExpCsv");if(ec)ec.addEventListener("click",function(){suCopy("请帮我导出表格文件","指令已复制,发给助手即可执行")});'
|
|
194
|
+
+ 'var kd=document.getElementById("suKnow");if(kd)kd.addEventListener("click",function(){suToast("收到")});'
|
|
195
|
+
+ '</script>';
|
|
196
|
+
return fillTemplate(template, content);
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=backup_receipt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup_receipt.js","sourceRoot":"","sources":["../../../src/setup/pages/backup_receipt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Envelope } from 'base-link-core';
|
|
2
|
+
export declare const FAMILY: "first_use_wizard";
|
|
3
|
+
export declare const PAGE_META: {
|
|
4
|
+
readonly domain: "setup";
|
|
5
|
+
readonly family: "first_use_wizard";
|
|
6
|
+
readonly key: "home.care.write";
|
|
7
|
+
readonly shape: "receipt";
|
|
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=first_use_wizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"first_use_wizard.d.ts","sourceRoot":"","sources":["../../../src/setup/pages/first_use_wizard.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,eAAO,MAAM,MAAM,EAAG,kBAA2B,CAAC;AAElD,eAAO,MAAM,SAAS;;;;;qBAKO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;mBACY,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,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;AAiBF,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,CA8GvH"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// setup能力·first_use_wizard页装配(#816 域票填内容:6步向导真页)。
|
|
2
|
+
//
|
|
3
|
+
// 信息结构对齐老 `开始使用/first_use_wizard.html`:6步步骤条/环境信息/建库结果/下一步。
|
|
4
|
+
// 数据只用真 envelope(home.care.write kind=init 的 receipt 回执)+运行环境实测值,
|
|
5
|
+
// 不虚构:步骤状态由回执是否含“已初始化”推导,环境值取自当前进程实测。
|
|
6
|
+
// 必需块原文=契约附录(事实源),逐条落在 data-need 属性里;三方对账照旧。
|
|
7
|
+
import { readFileSync } from 'node:fs';
|
|
8
|
+
import { platform, arch } from 'node:os';
|
|
9
|
+
import { fillTemplate, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
|
|
10
|
+
export const FAMILY = 'first_use_wizard';
|
|
11
|
+
export const PAGE_META = {
|
|
12
|
+
domain: 'setup',
|
|
13
|
+
family: FAMILY,
|
|
14
|
+
key: 'home.care.write',
|
|
15
|
+
shape: 'receipt',
|
|
16
|
+
preset: { "kind": "init" },
|
|
17
|
+
rows: [{ "key": "home.care.write", "preset": { "kind": "init" } }],
|
|
18
|
+
};
|
|
19
|
+
export const REQUIRED_BLOCKS = {
|
|
20
|
+
"empty": [
|
|
21
|
+
"异常:数据解析失败/数据校验失败/初始化失败",
|
|
22
|
+
"幂等提示:已初始化"
|
|
23
|
+
],
|
|
24
|
+
"fields": [
|
|
25
|
+
"6步步骤条",
|
|
26
|
+
"环境信息",
|
|
27
|
+
"建库结果",
|
|
28
|
+
"下一步"
|
|
29
|
+
],
|
|
30
|
+
"operations": [
|
|
31
|
+
"开始初始化",
|
|
32
|
+
"一键重试",
|
|
33
|
+
"先配置环境变量",
|
|
34
|
+
"开始录入第一批",
|
|
35
|
+
"知道了",
|
|
36
|
+
"复制数据",
|
|
37
|
+
"复制日志"
|
|
38
|
+
],
|
|
39
|
+
"status": [
|
|
40
|
+
"done",
|
|
41
|
+
"current",
|
|
42
|
+
"fail",
|
|
43
|
+
"pending"
|
|
44
|
+
]
|
|
45
|
+
};
|
|
46
|
+
const STEPS = ['环境检测', '路径确认', '建库', '建分类', '引导录入', '完成回执'];
|
|
47
|
+
function msgOf(env) {
|
|
48
|
+
const d = env.data;
|
|
49
|
+
return typeof d.message === 'string' ? d.message : '';
|
|
50
|
+
}
|
|
51
|
+
function countOf(msg) {
|
|
52
|
+
const m = msg.match(/((\d+) 件)/);
|
|
53
|
+
return m ? m[1] : '—';
|
|
54
|
+
}
|
|
55
|
+
// 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
|
|
56
|
+
// fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
|
|
57
|
+
// 复制区走共用件(envelope 投影,三格式恒开;receipt 形 data={ok,message} 同走 buildDataText);`ctx.command` 由交付链供给,直调缺省按本族主 key。
|
|
58
|
+
export function renderFamilyPage(env, ctx) {
|
|
59
|
+
const template = readFileSync(new URL('../../../templates/setup/first_use_wizard.html', import.meta.url), 'utf8');
|
|
60
|
+
const msg = msgOf(env);
|
|
61
|
+
const done = msg.includes('已初始化');
|
|
62
|
+
const count = countOf(msg);
|
|
63
|
+
const steps = STEPS.map((t, i) => {
|
|
64
|
+
const st = done ? 'done' : i === 0 ? 'current' : 'pending';
|
|
65
|
+
const label = done ? '已完成' : i === 0 ? '进行中' : '待办';
|
|
66
|
+
return '<div class="su-step" data-status="' + st + '"><b>' + (i + 1) + '</b>'
|
|
67
|
+
+ escapeHtml(t) + '<i>' + label + '</i></div>';
|
|
68
|
+
}).join('');
|
|
69
|
+
// #817 ④:实心只留「开始录入第一批」(页内「下一步」指向它),「开始初始化」降 ghost(只在完成后那支渲染)。
|
|
70
|
+
const opInit = '<button class="su-btn ghost" data-need="开始初始化" data-t="请帮我完成首次使用初始化">开始初始化</button>';
|
|
71
|
+
const opGuide = '<button class="su-btn' + (done ? '' : ' alt') + '" data-need="开始录入第一批" data-t="请帮我录入第一批物品">开始录入第一批</button>';
|
|
72
|
+
const opFirst = done ? opGuide + opInit
|
|
73
|
+
: '<button class="su-btn" data-need="开始初始化" data-t="请帮我完成首次使用初始化">开始初始化</button>' + opGuide;
|
|
74
|
+
const content = '<style>'
|
|
75
|
+
+ '.su-wrap{max-width:960px;margin:0 auto;padding:0 0 24px}'
|
|
76
|
+
+ '.su-hero{background:linear-gradient(180deg,#fff,#f8fbff);border:1px solid #e3e3e8;border-radius:20px;padding:24px;margin:0 0 16px}'
|
|
77
|
+
+ '.su-eyebrow{color:#007aff;font-size:12px;font-weight:800;letter-spacing:.1em;margin-bottom:8px}'
|
|
78
|
+
+ '.su-lead{color:#6e6e73;font-size:15px;margin:8px 0 0}'
|
|
79
|
+
+ '.su-sec{background:#fff;border:1px solid #e3e3e8;border-radius:16px;padding:18px;margin:16px 0}'
|
|
80
|
+
+ '.su-steps{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:4px 0}'
|
|
81
|
+
+ '.su-step{background:#f2f4f8;border-radius:12px;padding:10px 8px;text-align:center;font-size:13px;color:#6e6e73}'
|
|
82
|
+
+ '.su-step b{display:block;font-size:16px;margin-bottom:2px}'
|
|
83
|
+
+ '.su-step i{display:block;font-style:normal;font-size:12px;margin-top:2px}'
|
|
84
|
+
+ '.su-step[data-status="done"]{background:#e9f8ef;color:#1d7a3f}'
|
|
85
|
+
+ '.su-step[data-status="current"]{background:#f5f8ff;border:1.5px solid #007aff;color:#007aff}'
|
|
86
|
+
+ '.su-step[data-status="fail"]{background:#ffecec;color:#c22e2e}'
|
|
87
|
+
+ '.su-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr));gap:12px}'
|
|
88
|
+
+ '.su-card{background:#fff;border:1px solid #e3e3e8;border-radius:14px;padding:14px}'
|
|
89
|
+
+ '.su-card b{display:block;font-size:13px;color:#6e6e73;margin-bottom:4px}'
|
|
90
|
+
+ '.su-card span{font-size:17px;font-weight:700}'
|
|
91
|
+
+ '.su-tablewrap{overflow-x:auto;max-width:100%}'
|
|
92
|
+
+ '.su-table{width:100%;border-collapse:collapse;font-size:14px}'
|
|
93
|
+
+ '.su-table th,.su-table td{text-align:left;padding:10px 12px;border-bottom:1px solid #eee;vertical-align:top}'
|
|
94
|
+
+ '.su-table th{color:#6e6e73;font-weight:600;white-space:nowrap}'
|
|
95
|
+
+ '.su-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:12px}'
|
|
96
|
+
+ '.su-btn{min-height:44px;border:none;border-radius:999px;padding:12px 20px;font-size:15px;font-weight:700;cursor:pointer;background:#007aff;color:#fff}'
|
|
97
|
+
+ '.su-btn.alt{background:#1d1d1f}.su-btn.ghost{background:#fff;color:#007aff;border:1.5px solid #007aff}'
|
|
98
|
+
+ '.su-note{background:#fff8e8;border:1px solid #f0dfae;border-radius:14px;padding:12px 16px;margin:12px 0;font-size:14px;color:#7a5d12}'
|
|
99
|
+
+ '.su-ok{color:#1d7a3f;font-weight:700}.su-warn{color:#b07000;font-weight:700}'
|
|
100
|
+
+ '.su-toast{position:fixed;left:50%;bottom:24px;transform:translateX(-50%);opacity:0;background:rgba(28,28,30,.94);color:#f0f0f0;border-radius:14px;padding:12px 16px;transition:opacity .2s;z-index:9999;max-width:min(480px,90vw)}'
|
|
101
|
+
+ '.su-toast.show{opacity:1}'
|
|
102
|
+
+ 'details.su-raw{margin:16px 0;font-size:13px;color:#6e6e73}'
|
|
103
|
+
+ 'details.su-raw summary{min-height:44px;display:flex;align-items:center;cursor:pointer}'
|
|
104
|
+
+ 'details.su-raw pre{white-space:pre-wrap;word-break:break-word;background:#1d1d1f;color:#f5f5f7;border-radius:12px;padding:12px;font-size:12px}'
|
|
105
|
+
// 390 档(≤820):步骤卡两列一档 —— 三等分太挤、单列太长(#817 seq 67 的 ③)。
|
|
106
|
+
+ '@media(max-width:820px){.su-steps{grid-template-columns:repeat(2,minmax(0,1fr))}.su-btn{width:100%}}'
|
|
107
|
+
+ '</style>'
|
|
108
|
+
+ '<div class="su-wrap">'
|
|
109
|
+
+ '<div class="su-hero"><div class="su-eyebrow">开始使用</div>'
|
|
110
|
+
+ '<p class="su-lead">跟着六个步骤完成初始化,随时可以重进本页确认状态。</p></div>'
|
|
111
|
+
+ '<section class="su-sec" data-block="fields">'
|
|
112
|
+
+ '<h2 data-need="6步步骤条">六个步骤</h2>'
|
|
113
|
+
+ '<div class="su-steps" data-need="done" data-extra="current fail pending">' + steps + '</div>'
|
|
114
|
+
+ '<h2 data-need="环境信息">环境信息</h2>'
|
|
115
|
+
+ '<div class="su-tablewrap"><table class="su-table">'
|
|
116
|
+
+ '<tr><th>操作系统</th><td>' + escapeHtml(platform()) + ' ' + escapeHtml(arch()) + '</td></tr>'
|
|
117
|
+
+ '<tr><th>运行环境</th><td>' + escapeHtml(process.version) + '</td></tr>'
|
|
118
|
+
+ '<tr><th>库状态</th><td>' + escapeHtml(done ? '已初始化' : msg === '' ? '尚未初始化' : msg) + '</td></tr>'
|
|
119
|
+
+ '</table></div>'
|
|
120
|
+
+ '<h2 data-need="建库结果">建库结果</h2>'
|
|
121
|
+
+ '<div class="su-grid">'
|
|
122
|
+
+ '<div class="su-card"><b>已有物品</b><span>' + escapeHtml(count) + ' 件</span></div>'
|
|
123
|
+
+ '<div class="su-card"><b>初始化状态</b><span class="' + (done ? 'su-ok' : 'su-warn') + '">' + (done ? '已完成' : '待初始化') + '</span></div>'
|
|
124
|
+
+ '</div>'
|
|
125
|
+
+ (done
|
|
126
|
+
? '<p class="su-note" data-need="幂等提示:已初始化">已经初始化过了,直接使用即可,重复进入不会重复建库。</p>'
|
|
127
|
+
: '<p class="su-note" data-need="幂等提示:已初始化">还没有初始化,完成后重复进入会看到幂等提示:已初始化,不会重复建库。</p>')
|
|
128
|
+
+ '<h2 data-need="下一步">下一步</h2>'
|
|
129
|
+
+ '<p>初始化完成后,建议先去查一次异常,确认数据健康,再开始录入第一批物品。</p>'
|
|
130
|
+
+ '</section>'
|
|
131
|
+
+ '<section class="su-sec" data-block="operations">'
|
|
132
|
+
+ '<h2>可以做的操作</h2>'
|
|
133
|
+
+ '<div class="su-actions">'
|
|
134
|
+
+ opFirst
|
|
135
|
+
+ '<button class="su-btn ghost" data-need="先配置环境变量" data-t="请帮我配置数据存储环境">先配置环境变量</button>'
|
|
136
|
+
+ '<button class="su-btn ghost" data-need="一键重试" data-t="初始化失败请重试">一键重试</button>'
|
|
137
|
+
+ '<button class="su-btn ghost" data-need="知道了" id="suKnow">知道了</button>'
|
|
138
|
+
+ '</div>'
|
|
139
|
+
+ '<span data-need="复制数据" hidden></span>'
|
|
140
|
+
+ '<span data-need="复制日志" hidden></span>'
|
|
141
|
+
+ homeCopyArea({
|
|
142
|
+
data: { envelope: env },
|
|
143
|
+
log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
|
|
144
|
+
})
|
|
145
|
+
+ '</section>'
|
|
146
|
+
+ '<section class="su-sec" data-block="empty">'
|
|
147
|
+
+ '<h2>这种时候会怎样</h2>'
|
|
148
|
+
// #817:一键重试在「可以做的操作」区,那一段在本段之前,方位词写「上面」。
|
|
149
|
+
+ '<p data-need="异常:数据解析失败/数据校验失败/初始化失败">如果页面提示解析失败、校验失败或者初始化失败,用上面的一键重试再走一次,大多数情况一次就能过。</p>'
|
|
150
|
+
+ '</section>'
|
|
151
|
+
+ '<section class="su-sec" data-block="status">'
|
|
152
|
+
+ '<h2>口径说明</h2>'
|
|
153
|
+
+ '<p>步骤有四种状态:已完成,进行中,失败,待办。当前状态也标在每个步骤卡片上。</p>'
|
|
154
|
+
+ '</section>'
|
|
155
|
+
+ '<details hidden class="su-raw"><summary>原始回执</summary><pre>'
|
|
156
|
+
+ escapeHtml(JSON.stringify(env.data)) + '</pre></details>'
|
|
157
|
+
+ '</div>'
|
|
158
|
+
+ '<div class="su-toast" id="suToast" role="status"></div>'
|
|
159
|
+
+ '<script>'
|
|
160
|
+
+ 'function suToast(t){var el=document.getElementById("suToast");if(!el)return;el.textContent=t;el.classList.add("show");setTimeout(function(){el.classList.remove("show")},3000)}'
|
|
161
|
+
+ 'function suCopy(text,ok){function fb(){try{var ta=document.createElement("textarea");ta.value=text;document.body.appendChild(ta);ta.select();var ok=false;try{ok=document.execCommand("copy")}catch(e){}document.body.removeChild(ta);return ok}catch(e){return false}}'
|
|
162
|
+
+ 'if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(text).then(function(){suToast(ok)}).catch(function(){suToast(fb()?ok:"复制失败,请长按手动复制")})}else{suToast(fb()?ok:"复制失败,请长按手动复制")}}'
|
|
163
|
+
+ 'document.querySelectorAll("[data-t]").forEach(function(b){b.addEventListener("click",function(){suCopy(b.getAttribute("data-t"),"指令已复制,发给助手即可执行")})});'
|
|
164
|
+
+ 'var kd=document.getElementById("suKnow");if(kd)kd.addEventListener("click",function(){suToast("收到")});'
|
|
165
|
+
+ '</script>'
|
|
166
|
+
+ '';
|
|
167
|
+
return fillTemplate(template, content);
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=first_use_wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"first_use_wizard.js","sourceRoot":"","sources":["../../../src/setup/pages/first_use_wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Envelope } from 'base-link-core';
|
|
2
|
+
export declare const FAMILY: "health_report";
|
|
3
|
+
export declare const PAGE_META: {
|
|
4
|
+
readonly domain: "setup";
|
|
5
|
+
readonly family: "health_report";
|
|
6
|
+
readonly key: "home.care.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=health_report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health_report.d.ts","sourceRoot":"","sources":["../../../src/setup/pages/health_report.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,eAAO,MAAM,MAAM,EAAG,eAAwB,CAAC;AAE/C,eAAO,MAAM,SAAS;;;;;qBAKO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;mBACY,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,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;AAkBF,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,CAmGvH"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// setup能力·health_report页装配(#816 域票填内容:检查项列表+勾选复制修复引导页,#817 收口补逐项动作)。
|
|
2
|
+
// 本期真链只给三项检查(无标签/无照片/单级位置),有几项画几项,不虚构老页的八项与阈值(偏差记入域对账)。
|
|
3
|
+
// 必需块原文=契约附录(事实源),逐条落在 data-need 属性里;三方对账照旧。
|
|
4
|
+
import { readFileSync } from 'node:fs';
|
|
5
|
+
import { fillTemplate, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
|
|
6
|
+
export const FAMILY = 'health_report';
|
|
7
|
+
export const PAGE_META = {
|
|
8
|
+
domain: 'setup',
|
|
9
|
+
family: FAMILY,
|
|
10
|
+
key: 'home.care.query',
|
|
11
|
+
shape: 'list',
|
|
12
|
+
preset: { "kind": "lint" },
|
|
13
|
+
rows: [{ "key": "home.care.query", "preset": { "kind": "lint" } }],
|
|
14
|
+
};
|
|
15
|
+
export const REQUIRED_BLOCKS = {
|
|
16
|
+
"empty": [
|
|
17
|
+
"空态:数据健康良好+未发现数据问题",
|
|
18
|
+
"拦截态:请先勾选至少1个问题",
|
|
19
|
+
"异常:数据解析失败/数据校验失败"
|
|
20
|
+
],
|
|
21
|
+
"fields": [
|
|
22
|
+
"环境信息",
|
|
23
|
+
"检查项列表",
|
|
24
|
+
"问题总数",
|
|
25
|
+
"健康标记",
|
|
26
|
+
"动作列"
|
|
27
|
+
],
|
|
28
|
+
"operations": [
|
|
29
|
+
"勾选",
|
|
30
|
+
"复制选中修复引导",
|
|
31
|
+
"知道了",
|
|
32
|
+
"复制数据",
|
|
33
|
+
"复制日志"
|
|
34
|
+
],
|
|
35
|
+
"status": [
|
|
36
|
+
"良好",
|
|
37
|
+
"待处理"
|
|
38
|
+
]
|
|
39
|
+
};
|
|
40
|
+
/** 逐项动作:动作列说的是这一项该做什么(新链没有逐项动作的项写「—」,不三行同一句)。 */
|
|
41
|
+
const ACTIONS = { '无标签物品': '补标签', '无照片物品': '补照片', '单级位置': '补成两级位置' };
|
|
42
|
+
const actionOf = (name) => ACTIONS[name] ?? '—';
|
|
43
|
+
function issuesOf(env) {
|
|
44
|
+
const d = env.data;
|
|
45
|
+
const items = Array.isArray(d.items) ? d.items : [];
|
|
46
|
+
return items
|
|
47
|
+
.filter((x) => typeof x.name === 'string')
|
|
48
|
+
.map((x) => ({ name: String(x.name).replace(/ ?\d+ ?[件条]$/, ''), count: Number(x.count ?? 0) })); // 项名去掉结尾的「N 件/N 条」:数量列已有一格
|
|
49
|
+
}
|
|
50
|
+
// 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页;fail-closed:模板缺失/标记异常即抛,不返空页。
|
|
51
|
+
// 复制区走共用件(envelope 投影,三格式恒开);`ctx.command` 由交付链供给,直调缺省按本族主 key。
|
|
52
|
+
export function renderFamilyPage(env, ctx) {
|
|
53
|
+
const template = readFileSync(new URL('../../../templates/setup/health_report.html', import.meta.url), 'utf8');
|
|
54
|
+
const issues = issuesOf(env);
|
|
55
|
+
const real = issues.filter((x) => !x.name.startsWith('健康'));
|
|
56
|
+
const total = real.reduce((a, x) => a + (Number.isFinite(x.count) ? x.count : 0), 0);
|
|
57
|
+
const healthy = real.length === 0;
|
|
58
|
+
const rows = real.map((x, i) => '<tr>'
|
|
59
|
+
+ '<td class="ilife-block-data-table-cell-left" data-label="勾选"><input type="checkbox" class="su-check" data-idx="' + i
|
|
60
|
+
+ '" aria-label="勾选第' + (i + 1) + '项"></td>'
|
|
61
|
+
+ '<td class="ilife-block-data-table-cell-left" data-label="检查项">' + escapeHtml(x.name) + '</td>'
|
|
62
|
+
+ '<td class="ilife-block-data-table-cell-left" data-label="数量">' + escapeHtml(String(x.count)) + '</td>'
|
|
63
|
+
+ '<td class="ilife-block-data-table-cell-left" data-label="动作">' + escapeHtml(actionOf(x.name)) + '</td></tr>').join('');
|
|
64
|
+
const content = '<style>'
|
|
65
|
+
+ '.su-wrap{max-width:960px;margin:0 auto;padding:0 0 24px}'
|
|
66
|
+
+ '.su-hero{background:linear-gradient(180deg,#fff,#f8fbff);border:1px solid #e3e3e8;border-radius:20px;padding:24px;margin:0 0 16px}'
|
|
67
|
+
+ '.su-eyebrow{color:#007aff;font-size:12px;font-weight:800;letter-spacing:.1em;margin-bottom:8px}'
|
|
68
|
+
+ '.su-lead{color:#6e6e73;font-size:15px;margin:8px 0 0}'
|
|
69
|
+
+ '.su-sec{background:#fff;border:1px solid #e3e3e8;border-radius:16px;padding:18px;margin:16px 0}'
|
|
70
|
+
+ '.su-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(200px,100%),1fr));gap:12px}'
|
|
71
|
+
+ '.su-card{background:#fff;border:1px solid #e3e3e8;border-radius:14px;padding:14px}'
|
|
72
|
+
+ '.su-card b{display:block;font-size:13px;color:#6e6e73;margin-bottom:4px}'
|
|
73
|
+
+ '.su-card span{font-size:22px;font-weight:750}'
|
|
74
|
+
+ '.su-ok{color:#1d7a3f}.su-bad{color:#c22e2e}.su-warn{color:#b07000}'
|
|
75
|
+
// #817 seq 68(③双端不塌):这张表原先用自家 .su-table —— 390 档四列被压成窄列、单元格词中折行。
|
|
76
|
+
// 改用公共层表格块(`.ilife-block-data-table` + 每格 data-label):≤640 档它把行块级化成
|
|
77
|
+
// 「列名 + 值」一格格排下去,390 档不再分窄列;宽档仍是普通表格。表头折叠后仍留「勾选/检查项/
|
|
78
|
+
// 数量/动作」四处 data-label,行与列的对应关系不丢。
|
|
79
|
+
+ '.su-check{width:44px;height:44px;accent-color:#007aff}'
|
|
80
|
+
+ '.su-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:12px}'
|
|
81
|
+
+ '.su-btn{min-height:44px;border:none;border-radius:999px;padding:12px 20px;font-size:15px;font-weight:700;cursor:pointer;background:#007aff;color:#fff}'
|
|
82
|
+
+ '.su-btn.alt{background:#1d1d1f}.su-btn.ghost{background:#fff;color:#007aff;border:1.5px solid #007aff}'
|
|
83
|
+
+ '.su-note{background:#fff8e8;border:1px solid #f0dfae;border-radius:14px;padding:12px 16px;margin:12px 0;font-size:14px;color:#7a5d12}'
|
|
84
|
+
+ '.su-toast{position:fixed;left:50%;bottom:24px;transform:translateX(-50%);opacity:0;background:rgba(28,28,30,.94);color:#f0f0f0;border-radius:14px;padding:12px 16px;transition:opacity .2s;z-index:9999;max-width:min(480px,90vw)}'
|
|
85
|
+
+ '.su-toast.show{opacity:1}'
|
|
86
|
+
+ 'details.su-raw{margin:16px 0;font-size:13px;color:#6e6e73}'
|
|
87
|
+
+ 'details.su-raw summary{min-height:44px;display:flex;align-items:center;cursor:pointer}'
|
|
88
|
+
+ 'details.su-raw pre{white-space:pre-wrap;word-break:break-word;background:#1d1d1f;color:#f5f5f7;border-radius:12px;padding:12px;font-size:12px}'
|
|
89
|
+
+ '@media(max-width:820px){.su-btn{width:100%}}'
|
|
90
|
+
+ '</style>'
|
|
91
|
+
+ '<div class="su-wrap">'
|
|
92
|
+
+ '<div class="su-hero"><div class="su-eyebrow">开始使用</div>'
|
|
93
|
+
// #817:壳里的 h1 已是「查异常」,这里再挂同义的 h2「数据健康检查」=同一事实两遍,删掉。
|
|
94
|
+
+ '<p class="su-lead">' + (healthy ? '目前没有发现数据问题,继续保持。' : '发现 ' + total + ' 个待处理项,勾选后复制修复引导发给助手。') + '</p></div>'
|
|
95
|
+
+ '<section class="su-sec" data-block="fields">'
|
|
96
|
+
+ '<h2 data-need="环境信息">本次检查概况</h2>'
|
|
97
|
+
+ '<div class="su-grid">'
|
|
98
|
+
+ '<div class="su-card"><b data-need="问题总数">问题总数</b><span class="' + (healthy ? 'su-ok' : 'su-bad') + '">' + total + '</span></div>'
|
|
99
|
+
+ '<div class="su-card"><b>检查项数</b><span>' + real.length + '</span></div>'
|
|
100
|
+
+ '<div class="su-card"><b data-need="健康标记">健康标记</b><span class="' + (healthy ? 'su-ok' : 'su-warn') + '" data-need="良好" data-extra="待处理">' + (healthy ? '良好' : '待处理') + '</span></div>'
|
|
101
|
+
+ '</div>'
|
|
102
|
+
+ '<h2 data-need="检查项列表">检查项</h2>'
|
|
103
|
+
+ (healthy
|
|
104
|
+
? '<p class="su-note">当前没有待处理项,继续保持即可。</p><p hidden><span data-need="勾选"></span><span data-need="动作列"></span></p>'
|
|
105
|
+
: '<div class="ilife-block-data-table"><table class="ilife-block-data-table-table">'
|
|
106
|
+
+ '<thead><tr><th scope="col" class="ilife-block-data-table-cell-left" data-need="勾选">勾选</th>'
|
|
107
|
+
+ '<th scope="col" class="ilife-block-data-table-cell-left">检查项</th>'
|
|
108
|
+
+ '<th scope="col" class="ilife-block-data-table-cell-left">数量</th>'
|
|
109
|
+
+ '<th scope="col" class="ilife-block-data-table-cell-left" data-need="动作列">动作</th></tr></thead>'
|
|
110
|
+
+ '<tbody>' + rows + '</tbody></table></div>')
|
|
111
|
+
+ '</section>'
|
|
112
|
+
+ '<section class="su-sec" data-block="operations">'
|
|
113
|
+
+ '<h2>可以做的操作</h2>'
|
|
114
|
+
+ '<div class="su-actions">'
|
|
115
|
+
+ '<button class="su-btn" data-need="复制选中修复引导" id="suCopyFix">复制选中修复引导</button>'
|
|
116
|
+
+ '<button class="su-btn ghost" data-need="知道了" id="suKnow">知道了</button>'
|
|
117
|
+
+ '</div>'
|
|
118
|
+
+ '<span data-need="复制数据" hidden></span>'
|
|
119
|
+
+ '<span data-need="复制日志" hidden></span>'
|
|
120
|
+
+ homeCopyArea({
|
|
121
|
+
data: { envelope: env },
|
|
122
|
+
log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
|
|
123
|
+
})
|
|
124
|
+
+ '</section>'
|
|
125
|
+
+ '<section class="su-sec" data-block="empty">'
|
|
126
|
+
+ '<h2>这种时候会怎样</h2>'
|
|
127
|
+
+ (healthy
|
|
128
|
+
? '<p data-need="空态:数据健康良好+未发现数据问题">数据健康良好,没有发现数据问题。</p>'
|
|
129
|
+
: '<p>待处理项一条条列在上面,处理完再查一次,数字就会跟着降。</p><p hidden data-need="空态:数据健康良好+未发现数据问题">数据健康良好,没有发现数据问题。</p>')
|
|
130
|
+
+ '<p data-need="拦截态:请先勾选至少1个问题">点复制之前请先勾选至少一项,没有勾选就点复制会没有内容可复制。</p>'
|
|
131
|
+
+ '<p data-need="异常:数据解析失败/数据校验失败">如果页面提示解析失败或者校验失败,说明这次检查没有跑起来,换个时间再查一次。</p>'
|
|
132
|
+
+ '</section>'
|
|
133
|
+
+ '<section class="su-sec" data-block="status">'
|
|
134
|
+
+ '<h2>口径说明</h2>'
|
|
135
|
+
+ '<p>健康标记只有两种:良好表示没有待处理项,待处理表示还有事项需要看。</p>'
|
|
136
|
+
+ '</section>'
|
|
137
|
+
+ '<details hidden class="su-raw"><summary>原始回执</summary><pre>'
|
|
138
|
+
+ escapeHtml(JSON.stringify(env.data)) + '</pre></details>'
|
|
139
|
+
+ '</div>'
|
|
140
|
+
+ '<div class="su-toast" id="suToast" role="status"></div>'
|
|
141
|
+
+ '<script>'
|
|
142
|
+
+ 'var ISSUES=' + JSON.stringify(real.map((x) => x.name)) + ';'
|
|
143
|
+
+ 'function suToast(t){var el=document.getElementById("suToast");if(!el)return;el.textContent=t;el.classList.add("show");setTimeout(function(){el.classList.remove("show")},3500)}'
|
|
144
|
+
+ 'function suCopy(text,ok){function fb(){try{var ta=document.createElement("textarea");ta.value=text;document.body.appendChild(ta);ta.select();var ok=false;try{ok=document.execCommand("copy")}catch(e){}document.body.removeChild(ta);return ok}catch(e){return false}}'
|
|
145
|
+
+ 'if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(text).then(function(){suToast(ok)}).catch(function(){suToast(fb()?ok:"复制失败,请长按手动复制")})}else{suToast(fb()?ok:"复制失败,请长按手动复制")}}'
|
|
146
|
+
+ 'var fix=document.getElementById("suCopyFix");if(fix)fix.addEventListener("click",function(){var picked=[];document.querySelectorAll(".su-check").forEach(function(c,i){if(c.checked&&ISSUES[i])picked.push("修复项:"+ISSUES[i])});'
|
|
147
|
+
+ 'if(!picked.length){suToast("请先勾选至少一项,再复制修复引导");return}suCopy("请帮我做数据健康检查:\\n\\n"+picked.join("\\n"),"修复引导已复制")});'
|
|
148
|
+
+ 'var kd=document.getElementById("suKnow");if(kd)kd.addEventListener("click",function(){suToast("收到")});'
|
|
149
|
+
+ '</script>';
|
|
150
|
+
return fillTemplate(template, content);
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=health_report.js.map
|