@happyvertical/smrt-planner 0.0.0-stage → 0.0.2
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/LICENSE +21 -0
- package/README.md +170 -2
- package/app/404.html +80 -0
- package/app/_app/immutable/assets/0.B5zXkXe_.css +1 -0
- package/app/_app/immutable/assets/10.hpcnxvK1.css +1 -0
- package/app/_app/immutable/assets/11.D7zoXfVV.css +1 -0
- package/app/_app/immutable/assets/12.CPobm1ED.css +1 -0
- package/app/_app/immutable/assets/2.CyaWdRdI.css +1 -0
- package/app/_app/immutable/assets/3.BlPQOes8.css +1 -0
- package/app/_app/immutable/assets/8.2gQeKBp_.css +1 -0
- package/app/_app/immutable/assets/9.HOPT4xtg.css +1 -0
- package/app/_app/immutable/assets/AiSetup.Cb22AigN.css +1 -0
- package/app/_app/immutable/assets/Button.DkP0qkG9.css +1 -0
- package/app/_app/immutable/assets/ConnectTools.BgIJOOGW.css +1 -0
- package/app/_app/immutable/assets/FieldMapForm.BCU-4pO4.css +1 -0
- package/app/_app/immutable/assets/ModelPage.Dd3LcMta.css +1 -0
- package/app/_app/immutable/assets/SectionActions.CTkVuNMF.css +1 -0
- package/app/_app/immutable/assets/SectionIcons.5Udq9vN-.css +1 -0
- package/app/_app/immutable/assets/SegmentedControl.B8SrQacd.css +1 -0
- package/app/_app/immutable/assets/dist.C5nHBk_O.css +1 -0
- package/app/_app/immutable/assets/feedback.BVKAwFck.css +1 -0
- package/app/_app/immutable/assets/forms.BChZ2RWM.css +1 -0
- package/app/_app/immutable/assets/inter-latin-ext.B_-bZUTo.woff2 +0 -0
- package/app/_app/immutable/assets/inter-latin.8kRkwJBP.woff2 +0 -0
- package/app/_app/immutable/assets/jetbrains-mono-latin-ext.Bnd2h4Br.woff2 +0 -0
- package/app/_app/immutable/assets/jetbrains-mono-latin.Db4Uuiha.woff2 +0 -0
- package/app/_app/immutable/assets/ort-wasm-simd-threaded.asyncify.CxOG5pUO.wasm +0 -0
- package/app/_app/immutable/assets/percent.LH0z-ozZ.css +1 -0
- package/app/_app/immutable/assets/space-grotesk-latin-ext.wJGaI8U0.woff2 +0 -0
- package/app/_app/immutable/assets/space-grotesk-latin.DPT1xrvW.woff2 +0 -0
- package/app/_app/immutable/assets/store.CGDwHkkF.css +1 -0
- package/app/_app/immutable/assets/ui.B1A1Zl2p.css +1 -0
- package/app/_app/immutable/assets/workspace.BIMkuZDb.css +1 -0
- package/app/_app/immutable/chunks/1okeBSoq.js +1 -0
- package/app/_app/immutable/chunks/2jFBkS1C.js +1 -0
- package/app/_app/immutable/chunks/6P9zxrzU.js +1 -0
- package/app/_app/immutable/chunks/B32EWqI8.js +9 -0
- package/app/_app/immutable/chunks/B4Kevpe0.js +1 -0
- package/app/_app/immutable/chunks/BJfAXhak.js +3 -0
- package/app/_app/immutable/chunks/BKwRT_1p.js +1 -0
- package/app/_app/immutable/chunks/BQxY8kkL.js +1 -0
- package/app/_app/immutable/chunks/BS4h9ES-.js +1 -0
- package/app/_app/immutable/chunks/BWPhGFHl.js +1 -0
- package/app/_app/immutable/chunks/BYcBM-fh.js +1 -0
- package/app/_app/immutable/chunks/BegKiy2G.js +1 -0
- package/app/_app/immutable/chunks/Bjy-W4x2.js +81 -0
- package/app/_app/immutable/chunks/BnRri03M.js +1 -0
- package/app/_app/immutable/chunks/C7zBd-pD.js +1 -0
- package/app/_app/immutable/chunks/CA-A9Ngs.js +1 -0
- package/app/_app/immutable/chunks/CMhpRMKg.js +1 -0
- package/app/_app/immutable/chunks/CPRHZZeW.js +1 -0
- package/app/_app/immutable/chunks/CRQ1Pmzr.js +1 -0
- package/app/_app/immutable/chunks/CWtfVMDz.js +1 -0
- package/app/_app/immutable/chunks/CgAkqYsL.js +1 -0
- package/app/_app/immutable/chunks/Chyo8rdT.js +3 -0
- package/app/_app/immutable/chunks/Ci0DUht6.js +34 -0
- package/app/_app/immutable/chunks/CmmuWmp6.js +2 -0
- package/app/_app/immutable/chunks/CrFNLK0f.js +1 -0
- package/app/_app/immutable/chunks/CrO3W89x.js +1 -0
- package/app/_app/immutable/chunks/CsprTb3f.js +2 -0
- package/app/_app/immutable/chunks/CyUMm_Wp.js +1 -0
- package/app/_app/immutable/chunks/CygC84VT.js +2 -0
- package/app/_app/immutable/chunks/D0VgZnk1.js +1 -0
- package/app/_app/immutable/chunks/D71UrO5c.js +1 -0
- package/app/_app/immutable/chunks/D7hhQvDO.js +1 -0
- package/app/_app/immutable/chunks/DD7gpKb2.js +1 -0
- package/app/_app/immutable/chunks/DNRgqfTx.js +1 -0
- package/app/_app/immutable/chunks/DRByVC-c.js +1 -0
- package/app/_app/immutable/chunks/DVRKjN-E.js +1 -0
- package/app/_app/immutable/chunks/D_J_XtJy.js +846 -0
- package/app/_app/immutable/chunks/Dbjm4OuC.js +1 -0
- package/app/_app/immutable/chunks/Dc4q22LH.js +42 -0
- package/app/_app/immutable/chunks/Dd_uD5pT.js +1 -0
- package/app/_app/immutable/chunks/DkR8_Ws6.js +2 -0
- package/app/_app/immutable/chunks/Dp9GVO-9.js +1 -0
- package/app/_app/immutable/chunks/DqcD-WtP.js +1 -0
- package/app/_app/immutable/chunks/Dt-HX3Vu.js +1 -0
- package/app/_app/immutable/chunks/FbOxj-PF.js +69 -0
- package/app/_app/immutable/chunks/QukgIHDX.js +1 -0
- package/app/_app/immutable/chunks/WxSPP8QW.js +4 -0
- package/app/_app/immutable/chunks/Xp1g1t4n.js +3 -0
- package/app/_app/immutable/chunks/iET62IRm.js +2 -0
- package/app/_app/immutable/chunks/leQCwW2d.js +1 -0
- package/app/_app/immutable/chunks/p6bgzXiY.js +1 -0
- package/app/_app/immutable/chunks/uBIymjUX.js +1 -0
- package/app/_app/immutable/chunks/xihTtKlq.js +1 -0
- package/app/_app/immutable/entry/app.IZIJXhgq.js +2 -0
- package/app/_app/immutable/entry/start.BuaYHD1N.js +1 -0
- package/app/_app/immutable/nodes/0.m_U8WC7E.js +10 -0
- package/app/_app/immutable/nodes/1.Crw8ULhB.js +1 -0
- package/app/_app/immutable/nodes/10.1nQxyH9H.js +4 -0
- package/app/_app/immutable/nodes/11.Cw0JnQF3.js +1 -0
- package/app/_app/immutable/nodes/12.BIocA1aI.js +1 -0
- package/app/_app/immutable/nodes/2.CR5BwGnt.js +17 -0
- package/app/_app/immutable/nodes/3.1B56hgAG.js +1 -0
- package/app/_app/immutable/nodes/4.SSIC7sUh.js +1 -0
- package/app/_app/immutable/nodes/5.DgdwleDQ.js +1 -0
- package/app/_app/immutable/nodes/6.DmD9rqLU.js +1 -0
- package/app/_app/immutable/nodes/7.DdngsBmo.js +1 -0
- package/app/_app/immutable/nodes/8.D2Mszsua.js +3 -0
- package/app/_app/immutable/nodes/9.CLYsywul.js +1 -0
- package/app/_app/immutable/workers/assets/ort-wasm-simd-threaded.asyncify-CxOG5pUO.wasm +0 -0
- package/app/_app/immutable/workers/llm.worker-wfCOG_uk.js +69 -0
- package/app/_app/immutable/workers/local-speech.worker-DWbfmFUk.js +51 -0
- package/app/_app/version.json +1 -0
- package/app/ai/index.html +89 -0
- package/app/blueprint/index.html +87 -0
- package/app/cookbook/index.html +87 -0
- package/app/index.html +103 -0
- package/app/m/ads/AdDeliveryTier/index.html +96 -0
- package/app/m/ads/AdEvent/index.html +96 -0
- package/app/m/ads/AdFormat/index.html +96 -0
- package/app/m/ads/AdGroup/index.html +96 -0
- package/app/m/ads/AdVariation/index.html +96 -0
- package/app/m/analytics/AnalyticsDataStream/index.html +96 -0
- package/app/m/analytics/AnalyticsEvent/index.html +96 -0
- package/app/m/analytics/AnalyticsProperty/index.html +96 -0
- package/app/m/analytics/AnalyticsReport/index.html +96 -0
- package/app/m/approvals/ApprovalEvent/index.html +96 -0
- package/app/m/approvals/ApprovalPolicy/index.html +96 -0
- package/app/m/approvals/ApprovalRequest/index.html +96 -0
- package/app/m/assets/Asset/index.html +96 -0
- package/app/m/assets/AssetAssociation/index.html +97 -0
- package/app/m/assets/AssetMetafield/index.html +96 -0
- package/app/m/assets/AssetStatus/index.html +96 -0
- package/app/m/assets/AssetType/index.html +96 -0
- package/app/m/assets/Folder/index.html +96 -0
- package/app/m/chat/AgentSession/index.html +96 -0
- package/app/m/chat/ChatMessage/index.html +97 -0
- package/app/m/chat/ChatParticipant/index.html +97 -0
- package/app/m/chat/ChatReaction/index.html +96 -0
- package/app/m/chat/ChatRoom/index.html +96 -0
- package/app/m/chat/ChatThread/index.html +97 -0
- package/app/m/chat/VoiceGatewayTurn/index.html +96 -0
- package/app/m/chat/VoiceSession/index.html +96 -0
- package/app/m/commerce/Agreement/index.html +96 -0
- package/app/m/commerce/Cart/index.html +96 -0
- package/app/m/commerce/Contract/index.html +96 -0
- package/app/m/commerce/ContractLineItem/index.html +97 -0
- package/app/m/commerce/Customer/index.html +96 -0
- package/app/m/commerce/Estimate/index.html +96 -0
- package/app/m/commerce/Fulfillment/index.html +96 -0
- package/app/m/commerce/FulfillmentLineItem/index.html +97 -0
- package/app/m/commerce/Invoice/index.html +96 -0
- package/app/m/commerce/InvoiceLineItem/index.html +97 -0
- package/app/m/commerce/Lease/index.html +96 -0
- package/app/m/commerce/LicenseSale/index.html +96 -0
- package/app/m/commerce/Order/index.html +96 -0
- package/app/m/commerce/Payment/index.html +96 -0
- package/app/m/commerce/PaymentAllocation/index.html +97 -0
- package/app/m/commerce/PaymentInstrument/index.html +96 -0
- package/app/m/commerce/PaymentIntent/index.html +96 -0
- package/app/m/commerce/Payout/index.html +96 -0
- package/app/m/commerce/ProductionOrder/index.html +96 -0
- package/app/m/commerce/PurchaseOrder/index.html +96 -0
- package/app/m/commerce/Vendor/index.html +96 -0
- package/app/m/commerce/WholesaleOrder/index.html +96 -0
- package/app/m/content/Content/index.html +96 -0
- package/app/m/content/ContentContribution/index.html +96 -0
- package/app/m/content/ContentContributionAttachment/index.html +96 -0
- package/app/m/content/ContentContributionRevision/index.html +96 -0
- package/app/m/content/ContentContributionType/index.html +96 -0
- package/app/m/content/ContentContributor/index.html +96 -0
- package/app/m/content/ContentCorrection/index.html +96 -0
- package/app/m/content/ContentFeedSource/index.html +96 -0
- package/app/m/content/ContentGovernanceAssignment/index.html +96 -0
- package/app/m/content/ContentGovernancePolicy/index.html +96 -0
- package/app/m/content/ContentGovernanceProfile/index.html +96 -0
- package/app/m/content/ContentReference/index.html +96 -0
- package/app/m/content/ContentReview/index.html +96 -0
- package/app/m/content/ContentVersion/index.html +96 -0
- package/app/m/content/Contents/index.html +96 -0
- package/app/m/events/Event/index.html +96 -0
- package/app/m/events/EventParticipant/index.html +97 -0
- package/app/m/events/EventSeries/index.html +96 -0
- package/app/m/events/EventType/index.html +96 -0
- package/app/m/facts/Fact/index.html +96 -0
- package/app/m/facts/FactContent/index.html +96 -0
- package/app/m/facts/FactEvidence/index.html +96 -0
- package/app/m/facts/FactSource/index.html +96 -0
- package/app/m/facts/FactSubject/index.html +96 -0
- package/app/m/facts/FactTag/index.html +96 -0
- package/app/m/fields/FieldPolicy/index.html +96 -0
- package/app/m/fields/FieldPolicySuggestion/index.html +96 -0
- package/app/m/fields/FieldUsageCounter/index.html +96 -0
- package/app/m/images/Image/index.html +96 -0
- package/app/m/inventory/InventoryLocation/index.html +96 -0
- package/app/m/inventory/StockLevel/index.html +96 -0
- package/app/m/inventory/StockMovement/index.html +96 -0
- package/app/m/ledgers/Account/index.html +96 -0
- package/app/m/ledgers/Journal/index.html +96 -0
- package/app/m/ledgers/JournalEntry/index.html +97 -0
- package/app/m/manufacturing/Assembly/index.html +96 -0
- package/app/m/manufacturing/BillOfMaterials/index.html +96 -0
- package/app/m/manufacturing/BomLine/index.html +96 -0
- package/app/m/manufacturing/Operation/index.html +96 -0
- package/app/m/manufacturing/ProductionRun/index.html +96 -0
- package/app/m/manufacturing/ProductionRunCompletion/index.html +96 -0
- package/app/m/manufacturing/RoutingStep/index.html +96 -0
- package/app/m/marketing/Campaign/index.html +96 -0
- package/app/m/marketing/CampaignChannel/index.html +96 -0
- package/app/m/marketing/CampaignMetricSnapshot/index.html +96 -0
- package/app/m/messages/Account/index.html +96 -0
- package/app/m/messages/Attachment/index.html +96 -0
- package/app/m/messages/Blacklist/index.html +96 -0
- package/app/m/messages/Email/failed-sends/index.html +96 -0
- package/app/m/messages/Email/index.html +96 -0
- package/app/m/messages/Email/mailbox/index.html +96 -0
- package/app/m/messages/EmailAccount/index.html +96 -0
- package/app/m/messages/EmailFolder/index.html +96 -0
- package/app/m/messages/Message/index.html +96 -0
- package/app/m/messages/MessagingEndpoint/index.html +96 -0
- package/app/m/messages/PersonaMessageRoute/index.html +96 -0
- package/app/m/messages/SlackAccount/index.html +96 -0
- package/app/m/messages/SlackMessage/index.html +96 -0
- package/app/m/messages/TelegramAccount/index.html +96 -0
- package/app/m/messages/Tweet/index.html +96 -0
- package/app/m/messages/TwitterAccount/index.html +96 -0
- package/app/m/messages/Whitelist/index.html +96 -0
- package/app/m/messages/ZulipAccount/index.html +96 -0
- package/app/m/places/Place/index.html +96 -0
- package/app/m/places/PlaceType/index.html +96 -0
- package/app/m/preferences/UiPreferenceRecord/index.html +96 -0
- package/app/m/products/Category/index.html +96 -0
- package/app/m/products/Material/index.html +96 -0
- package/app/m/products/Product/index.html +96 -0
- package/app/m/products/Product/ingredients/index.html +96 -0
- package/app/m/products/ProductVariant/index.html +97 -0
- package/app/m/products/Sku/index.html +97 -0
- package/app/m/profiles/ApiKey/index.html +96 -0
- package/app/m/profiles/Bot/index.html +96 -0
- package/app/m/profiles/MagicLinkToken/index.html +96 -0
- package/app/m/profiles/NostrIdentity/index.html +96 -0
- package/app/m/profiles/OidcIdentity/index.html +96 -0
- package/app/m/profiles/Organization/index.html +96 -0
- package/app/m/profiles/Person/index.html +96 -0
- package/app/m/profiles/Profile/index.html +96 -0
- package/app/m/profiles/ProfileMetadata/index.html +96 -0
- package/app/m/profiles/ProfileMetafield/index.html +96 -0
- package/app/m/profiles/ProfileRelationship/index.html +96 -0
- package/app/m/profiles/ProfileRelationshipTerm/index.html +96 -0
- package/app/m/profiles/ProfileRelationshipType/index.html +96 -0
- package/app/m/profiles/ProfileType/index.html +96 -0
- package/app/m/projects/Comment/index.html +97 -0
- package/app/m/projects/Issue/index.html +96 -0
- package/app/m/projects/Label/index.html +96 -0
- package/app/m/projects/Project/index.html +96 -0
- package/app/m/projects/ProjectIntegration/index.html +96 -0
- package/app/m/projects/PullRequest/index.html +96 -0
- package/app/m/projects/Repository/index.html +96 -0
- package/app/m/properties/Property/index.html +96 -0
- package/app/m/properties/Zone/index.html +96 -0
- package/app/m/reports/RuntimeReport/index.html +96 -0
- package/app/m/reports/SmrtPrincipalReportRefreshTask/index.html +96 -0
- package/app/m/reports/SmrtReportLock/index.html +96 -0
- package/app/m/reports/SmrtReportRefreshTask/index.html +96 -0
- package/app/m/reports/SmrtReportRun/index.html +96 -0
- package/app/m/reports/SmrtReportSchedule/index.html +96 -0
- package/app/m/reports/SmrtReportWatermark/index.html +96 -0
- package/app/m/sales/AttributionException/index.html +96 -0
- package/app/m/sales/AttributionPolicy/index.html +96 -0
- package/app/m/sales/Commission/index.html +96 -0
- package/app/m/sales/CommissionAdjustment/index.html +96 -0
- package/app/m/sales/CommissionPayout/index.html +96 -0
- package/app/m/sales/CommissionPlan/index.html +96 -0
- package/app/m/sales/Earner/index.html +96 -0
- package/app/m/sales/EarnerSourceAttribution/index.html +96 -0
- package/app/m/sales/EarningEvent/index.html +96 -0
- package/app/m/sales/ExecutedAgreement/index.html +96 -0
- package/app/m/sales/Lead/index.html +96 -0
- package/app/m/sales/Opportunity/index.html +96 -0
- package/app/m/sales/OpportunityConversion/index.html +96 -0
- package/app/m/sales/PipelineDefinition/index.html +96 -0
- package/app/m/sales/PipelineStage/index.html +97 -0
- package/app/m/sales/Referral/index.html +96 -0
- package/app/m/sales/ReferralAgreement/index.html +96 -0
- package/app/m/sales/ReferralLink/index.html +96 -0
- package/app/m/sales/ReferralProgram/index.html +96 -0
- package/app/m/sales/ReferralTermSnapshot/index.html +96 -0
- package/app/m/sales/ReferralTouch/index.html +96 -0
- package/app/m/sales/Referrer/index.html +96 -0
- package/app/m/sales/SalesActivity/index.html +96 -0
- package/app/m/sales/SalesRepresentative/index.html +96 -0
- package/app/m/sites/Site/index.html +96 -0
- package/app/m/sites/SiteAgentBinding/index.html +96 -0
- package/app/m/social/OAuthState/index.html +96 -0
- package/app/m/social/SocialAccount/index.html +96 -0
- package/app/m/social/SocialPost/index.html +96 -0
- package/app/m/social/SocialPostAnalyticsSnapshot/index.html +96 -0
- package/app/m/subscriptions/BillingAdjustment/index.html +96 -0
- package/app/m/subscriptions/ClientCharge/index.html +96 -0
- package/app/m/subscriptions/CreditGrant/index.html +96 -0
- package/app/m/subscriptions/PricingRule/index.html +96 -0
- package/app/m/subscriptions/RetailCharge/index.html +96 -0
- package/app/m/subscriptions/SpendingPolicy/index.html +96 -0
- package/app/m/subscriptions/SubscriptionPlan/index.html +96 -0
- package/app/m/subscriptions/TenantSubscription/index.html +96 -0
- package/app/m/subscriptions/TenantUsageMetric/index.html +96 -0
- package/app/m/support/ServiceTimeEntry/index.html +96 -0
- package/app/m/support/SupportAiRun/index.html +96 -0
- package/app/m/support/SupportAvailability/index.html +96 -0
- package/app/m/support/SupportCase/index.html +96 -0
- package/app/m/support/SupportCaseEvent/index.html +96 -0
- package/app/m/support/SupportChannelBinding/index.html +96 -0
- package/app/m/support/SupportCharge/index.html +96 -0
- package/app/m/support/SupportCompensation/index.html +96 -0
- package/app/m/support/SupportCompensationPlan/index.html +96 -0
- package/app/m/support/SupportEscalation/index.html +96 -0
- package/app/m/support/SupportInteraction/index.html +96 -0
- package/app/m/support/SupportPlan/index.html +96 -0
- package/app/m/support/SupportPolicy/index.html +96 -0
- package/app/m/support/SupportQualification/index.html +96 -0
- package/app/m/support/SupportServiceTarget/index.html +96 -0
- package/app/m/support/SupportSpecialist/index.html +96 -0
- package/app/m/support/SupportWorkLink/index.html +96 -0
- package/app/m/tags/Tag/index.html +96 -0
- package/app/m/tags/TagAlias/index.html +96 -0
- package/app/m/timesheets/AttendanceBreak/index.html +96 -0
- package/app/m/timesheets/AttendancePunch/index.html +96 -0
- package/app/m/timesheets/ServiceChargeSnapshot/index.html +96 -0
- package/app/m/timesheets/ServiceCompensationSnapshot/index.html +96 -0
- package/app/m/timesheets/ServiceTimeEntry/index.html +96 -0
- package/app/m/users/AccessRequest/index.html +96 -0
- package/app/m/users/Group/index.html +96 -0
- package/app/m/users/GroupMember/index.html +96 -0
- package/app/m/users/GroupRole/index.html +96 -0
- package/app/m/users/Membership/index.html +97 -0
- package/app/m/users/MembershipOverride/index.html +96 -0
- package/app/m/users/Permission/index.html +96 -0
- package/app/m/users/ResourceGrant/index.html +96 -0
- package/app/m/users/Role/index.html +96 -0
- package/app/m/users/RolePermission/index.html +96 -0
- package/app/m/users/Session/index.html +96 -0
- package/app/m/users/Tenant/index.html +96 -0
- package/app/m/users/TenantIntegration/index.html +96 -0
- package/app/m/users/TenantPermissionOverride/index.html +96 -0
- package/app/m/users/User/index.html +96 -0
- package/app/m/users/UsersCliAuthRequest/index.html +96 -0
- package/app/m/users/UsersMagicLinkToken/index.html +96 -0
- package/app/m/video/Character/index.html +96 -0
- package/app/m/video/CharacterAsset/index.html +96 -0
- package/app/m/video/CompositeJob/index.html +96 -0
- package/app/m/video/Performer/index.html +96 -0
- package/app/m/video/PerformerAsset/index.html +96 -0
- package/app/m/video/Scene/index.html +96 -0
- package/app/m/video/SceneAsset/index.html +96 -0
- package/app/m/video/VideoComposition/index.html +96 -0
- package/app/m/video/VideoCompositionAsset/index.html +96 -0
- package/app/m/video/VideoSequence/index.html +96 -0
- package/app/m/video/VideoSequenceAsset/index.html +96 -0
- package/app/m/video/VideoShot/index.html +96 -0
- package/app/m/video/VideoShotAsset/index.html +96 -0
- package/app/m/video/VideoShotCharacter/index.html +96 -0
- package/app/m/video/VideoWorkflow/index.html +96 -0
- package/app/m/voice/VoiceOutput/index.html +96 -0
- package/app/m/voice/VoiceProfile/index.html +96 -0
- package/app/m/voice/VoiceSample/index.html +96 -0
- package/app/packages/ads/index.html +92 -0
- package/app/packages/analytics/index.html +92 -0
- package/app/packages/approvals/index.html +92 -0
- package/app/packages/assets/index.html +92 -0
- package/app/packages/chat/index.html +92 -0
- package/app/packages/comments/index.html +92 -0
- package/app/packages/commerce/index.html +92 -0
- package/app/packages/content/index.html +92 -0
- package/app/packages/events/index.html +92 -0
- package/app/packages/expenses/index.html +92 -0
- package/app/packages/facts/index.html +92 -0
- package/app/packages/fields/index.html +92 -0
- package/app/packages/human-resources/index.html +92 -0
- package/app/packages/images/index.html +92 -0
- package/app/packages/index.html +90 -0
- package/app/packages/inventory/index.html +92 -0
- package/app/packages/ledgers/index.html +92 -0
- package/app/packages/manufacturing/index.html +92 -0
- package/app/packages/marketing/index.html +92 -0
- package/app/packages/messages/index.html +92 -0
- package/app/packages/places/index.html +92 -0
- package/app/packages/preferences/index.html +92 -0
- package/app/packages/products/index.html +92 -0
- package/app/packages/profiles/index.html +92 -0
- package/app/packages/projects/index.html +92 -0
- package/app/packages/properties/index.html +92 -0
- package/app/packages/reports/index.html +92 -0
- package/app/packages/sales/index.html +92 -0
- package/app/packages/sites/index.html +92 -0
- package/app/packages/social/index.html +92 -0
- package/app/packages/subscriptions/index.html +92 -0
- package/app/packages/support/index.html +92 -0
- package/app/packages/tags/index.html +92 -0
- package/app/packages/timesheets/index.html +92 -0
- package/app/packages/users/index.html +92 -0
- package/app/packages/video/index.html +92 -0
- package/app/packages/voice/index.html +92 -0
- package/app/recipes/account-access/help/index.html +93 -0
- package/app/recipes/account-access/index.html +95 -0
- package/app/recipes/activity/help/index.html +93 -0
- package/app/recipes/activity/index.html +94 -0
- package/app/recipes/agreements/help/index.html +93 -0
- package/app/recipes/agreements/index.html +96 -0
- package/app/recipes/analytics.reports/help/index.html +93 -0
- package/app/recipes/analytics.reports/index.html +94 -0
- package/app/recipes/assets/help/index.html +93 -0
- package/app/recipes/assets/index.html +95 -0
- package/app/recipes/billing/help/index.html +93 -0
- package/app/recipes/billing/index.html +95 -0
- package/app/recipes/chat.assistant/help/index.html +93 -0
- package/app/recipes/chat.assistant/index.html +94 -0
- package/app/recipes/comments/help/index.html +93 -0
- package/app/recipes/comments/index.html +94 -0
- package/app/recipes/commerce.customers/help/index.html +93 -0
- package/app/recipes/commerce.customers/index.html +94 -0
- package/app/recipes/commerce.estimates/help/index.html +93 -0
- package/app/recipes/commerce.estimates/index.html +94 -0
- package/app/recipes/commerce.purchases/help/index.html +93 -0
- package/app/recipes/commerce.purchases/index.html +94 -0
- package/app/recipes/commerce.sales/help/index.html +93 -0
- package/app/recipes/commerce.sales/index.html +94 -0
- package/app/recipes/commerce.vendors/help/index.html +93 -0
- package/app/recipes/commerce.vendors/index.html +94 -0
- package/app/recipes/commerce.wholesale/help/index.html +93 -0
- package/app/recipes/commerce.wholesale/index.html +94 -0
- package/app/recipes/events.calendar/help/index.html +93 -0
- package/app/recipes/events.calendar/index.html +94 -0
- package/app/recipes/fields.form-customization/help/index.html +93 -0
- package/app/recipes/fields.form-customization/index.html +94 -0
- package/app/recipes/inventory.stock/help/index.html +93 -0
- package/app/recipes/inventory.stock/index.html +94 -0
- package/app/recipes/ledgers.bookkeeping/help/index.html +93 -0
- package/app/recipes/ledgers.bookkeeping/index.html +94 -0
- package/app/recipes/messages/help/index.html +93 -0
- package/app/recipes/messages/index.html +95 -0
- package/app/recipes/products/help/index.html +93 -0
- package/app/recipes/products/index.html +96 -0
- package/app/recipes/projects.tracker/help/index.html +93 -0
- package/app/recipes/projects.tracker/index.html +94 -0
- package/app/recipes/reports.materialized/help/index.html +93 -0
- package/app/recipes/reports.materialized/index.html +94 -0
- package/app/recipes/sales.pipeline/help/index.html +93 -0
- package/app/recipes/sales.pipeline/index.html +94 -0
- package/app/recipes/tags.taxonomy/help/index.html +93 -0
- package/app/recipes/tags.taxonomy/index.html +94 -0
- package/app/recipes/team-collaboration/help/index.html +93 -0
- package/app/recipes/team-collaboration/index.html +94 -0
- package/app/s/custom-billing/index.html +89 -0
- package/app/s/custom-buying/index.html +89 -0
- package/app/s/custom-classes/index.html +89 -0
- package/app/s/custom-jobs/index.html +89 -0
- package/app/s/custom-kitchen/index.html +89 -0
- package/app/s/custom-material/index.html +89 -0
- package/app/s/custom-members/index.html +89 -0
- package/app/s/custom-parts/index.html +89 -0
- package/app/s/custom-schedule/index.html +89 -0
- package/app/s/custom-shop/index.html +89 -0
- package/app/s/custom-wholesale/index.html +89 -0
- package/app/s/section-access-control/index.html +89 -0
- package/app/s/section-account-security/index.html +89 -0
- package/app/s/section-accounting/index.html +89 -0
- package/app/s/section-activity/index.html +89 -0
- package/app/s/section-agreements/index.html +89 -0
- package/app/s/section-analytics/index.html +89 -0
- package/app/s/section-assets/index.html +89 -0
- package/app/s/section-billing/index.html +89 -0
- package/app/s/section-calendar/index.html +89 -0
- package/app/s/section-catalog/index.html +89 -0
- package/app/s/section-chat.assistant/index.html +89 -0
- package/app/s/section-comments/index.html +89 -0
- package/app/s/section-fields.form-customization/index.html +89 -0
- package/app/s/section-messages/index.html +89 -0
- package/app/s/section-more/index.html +89 -0
- package/app/s/section-operations/index.html +89 -0
- package/app/s/section-projects/index.html +89 -0
- package/app/s/section-purchasing/index.html +89 -0
- package/app/s/section-reports.materialized/index.html +89 -0
- package/app/s/section-sales/index.html +89 -0
- package/app/s/section-taxonomy/index.html +89 -0
- package/app/s/section-team/index.html +89 -0
- package/dist/ai/echo-gate.d.ts +13 -0
- package/dist/ai/echo-gate.js +21 -0
- package/dist/ai/icons.d.ts +9 -0
- package/dist/ai/icons.js +9 -0
- package/dist/ai/instance.d.ts +3 -0
- package/dist/ai/instance.js +25 -0
- package/dist/ai/state.svelte.d.ts +130 -0
- package/dist/ai/state.svelte.js +316 -0
- package/dist/ai/status.d.ts +67 -0
- package/dist/ai/status.js +125 -0
- package/dist/assets/smrt-mark.svg +38 -0
- package/dist/assistant/change.d.ts +101 -0
- package/dist/assistant/change.js +209 -0
- package/dist/assistant/engine.d.ts +20 -0
- package/dist/assistant/engine.js +43 -0
- package/dist/assistant/llm.worker.d.ts +1 -0
- package/dist/assistant/llm.worker.js +7 -0
- package/dist/assistant/match.d.ts +59 -0
- package/dist/assistant/match.js +271 -0
- package/dist/assistant/models.d.ts +38 -0
- package/dist/assistant/models.js +57 -0
- package/dist/assistant/offers.svelte.d.ts +36 -0
- package/dist/assistant/offers.svelte.js +59 -0
- package/dist/assistant/prefs.d.ts +14 -0
- package/dist/assistant/prefs.js +32 -0
- package/dist/assistant/prompt.d.ts +23 -0
- package/dist/assistant/prompt.js +163 -0
- package/dist/assistant/session.svelte.d.ts +74 -0
- package/dist/assistant/session.svelte.js +181 -0
- package/dist/assistant/theme-undo.svelte.d.ts +38 -0
- package/dist/assistant/theme-undo.svelte.js +50 -0
- package/dist/assistant/transport.d.ts +73 -0
- package/dist/assistant/transport.js +231 -0
- package/dist/assistant/voice-host.d.ts +10 -0
- package/dist/assistant/voice-host.js +17 -0
- package/dist/assistant/voice.svelte.d.ts +107 -0
- package/dist/assistant/voice.svelte.js +261 -0
- package/dist/catalog/catalog.json +89663 -0
- package/dist/catalog/generate/build.d.ts +33 -0
- package/dist/catalog/generate/build.js +131 -0
- package/dist/catalog/generate/exclusions.d.ts +18 -0
- package/dist/catalog/generate/exclusions.js +33 -0
- package/dist/catalog/generate/extract.d.ts +90 -0
- package/dist/catalog/generate/extract.js +326 -0
- package/dist/catalog/generate/local.d.ts +8 -0
- package/dist/catalog/generate/local.js +45 -0
- package/dist/catalog/generate/recipe-demo.d.ts +11 -0
- package/dist/catalog/generate/recipe-demo.js +29 -0
- package/dist/catalog/generate/recipe-metadata.d.ts +12 -0
- package/dist/catalog/generate/recipe-metadata.js +138 -0
- package/dist/catalog/generate/registry.d.ts +14 -0
- package/dist/catalog/generate/registry.js +83 -0
- package/dist/catalog/index.d.ts +21 -0
- package/dist/catalog/index.js +53 -0
- package/dist/catalog/types.d.ts +141 -0
- package/dist/catalog/types.js +8 -0
- package/dist/components/AiSetup.svelte +528 -0
- package/dist/components/AiSetup.svelte.d.ts +8 -0
- package/dist/components/AiStatusIcons.svelte +86 -0
- package/dist/components/AiStatusIcons.svelte.d.ts +18 -0
- package/dist/components/AppSettings.svelte +100 -0
- package/dist/components/AppSettings.svelte.d.ts +10 -0
- package/dist/components/BrowserAssistant.svelte +318 -0
- package/dist/components/BrowserAssistant.svelte.d.ts +8 -0
- package/dist/components/ChildRecords.svelte +331 -0
- package/dist/components/ChildRecords.svelte.d.ts +15 -0
- package/dist/components/ConnectTools.svelte +145 -0
- package/dist/components/ConnectTools.svelte.d.ts +8 -0
- package/dist/components/CookbooksPanel.svelte +308 -0
- package/dist/components/CookbooksPanel.svelte.d.ts +3 -0
- package/dist/components/ExportPanel.svelte +217 -0
- package/dist/components/ExportPanel.svelte.d.ts +3 -0
- package/dist/components/FeatureCard.svelte +197 -0
- package/dist/components/FeatureCard.svelte.d.ts +13 -0
- package/dist/components/FeaturesPanel.svelte +155 -0
- package/dist/components/FeaturesPanel.svelte.d.ts +3 -0
- package/dist/components/FieldInput.svelte +307 -0
- package/dist/components/FieldInput.svelte.d.ts +24 -0
- package/dist/components/FieldMapForm.svelte +173 -0
- package/dist/components/FieldMapForm.svelte.d.ts +18 -0
- package/dist/components/FormWorkspace.svelte +274 -0
- package/dist/components/FormWorkspace.svelte.d.ts +19 -0
- package/dist/components/HelpView.svelte +129 -0
- package/dist/components/HelpView.svelte.d.ts +12 -0
- package/dist/components/ModelOptions.svelte +239 -0
- package/dist/components/ModelOptions.svelte.d.ts +12 -0
- package/dist/components/ModelPage.svelte +295 -0
- package/dist/components/ModelPage.svelte.d.ts +9 -0
- package/dist/components/ModelWorkspace.svelte +488 -0
- package/dist/components/ModelWorkspace.svelte.d.ts +32 -0
- package/dist/components/PlannerEditBridge.svelte +36 -0
- package/dist/components/PlannerEditBridge.svelte.d.ts +3 -0
- package/dist/components/PlannerPalette.svelte +38 -0
- package/dist/components/PlannerPalette.svelte.d.ts +18 -0
- package/dist/components/RecipeCards.svelte +145 -0
- package/dist/components/RecipeCards.svelte.d.ts +3 -0
- package/dist/components/RecipeHelp.svelte +54 -0
- package/dist/components/RecipeHelp.svelte.d.ts +9 -0
- package/dist/components/RecipeOptions.svelte +160 -0
- package/dist/components/RecipeOptions.svelte.d.ts +9 -0
- package/dist/components/RecordFeatures.svelte +240 -0
- package/dist/components/RecordFeatures.svelte.d.ts +3 -0
- package/dist/components/RelationField.svelte +175 -0
- package/dist/components/RelationField.svelte.d.ts +16 -0
- package/dist/components/SectionActions.svelte +91 -0
- package/dist/components/SectionActions.svelte.d.ts +12 -0
- package/dist/components/SectionIcons.svelte +98 -0
- package/dist/components/SectionIcons.svelte.d.ts +15 -0
- package/dist/components/SectionOverview.svelte +65 -0
- package/dist/components/SectionOverview.svelte.d.ts +14 -0
- package/dist/components/SectionPage.svelte +230 -0
- package/dist/components/SectionPage.svelte.d.ts +7 -0
- package/dist/components/SettingsPanel.svelte +60 -0
- package/dist/components/SettingsPanel.svelte.d.ts +7 -0
- package/dist/components/ThemeBridge.svelte +56 -0
- package/dist/components/ThemeBridge.svelte.d.ts +3 -0
- package/dist/components/ThemeSection.svelte +167 -0
- package/dist/components/ThemeSection.svelte.d.ts +11 -0
- package/dist/components/VariantGridForm.svelte +309 -0
- package/dist/components/VariantGridForm.svelte.d.ts +12 -0
- package/dist/components/VoiceTyping.svelte +108 -0
- package/dist/components/VoiceTyping.svelte.d.ts +7 -0
- package/dist/cookbook/assemble.d.ts +16 -0
- package/dist/cookbook/assemble.js +29 -0
- package/dist/cookbook/file.d.ts +7 -0
- package/dist/cookbook/file.js +25 -0
- package/dist/cookbook/legacy.d.ts +9 -0
- package/dist/cookbook/legacy.js +87 -0
- package/dist/cookbook/migrate.d.ts +22 -0
- package/dist/cookbook/migrate.js +106 -0
- package/dist/cookbook/parse.d.ts +16 -0
- package/dist/cookbook/parse.js +246 -0
- package/dist/cookbook/storage.d.ts +45 -0
- package/dist/cookbook/storage.js +98 -0
- package/dist/cookbook/store.svelte.d.ts +94 -0
- package/dist/cookbook/store.svelte.js +231 -0
- package/dist/cookbook/types.d.ts +76 -0
- package/dist/cookbook/types.js +11 -0
- package/dist/cookbook/validate.d.ts +14 -0
- package/dist/cookbook/validate.js +29 -0
- package/dist/core/app.d.ts +37 -0
- package/dist/core/app.js +119 -0
- package/dist/core/catalog.d.ts +19 -0
- package/dist/core/catalog.js +9 -0
- package/dist/core/headless.d.ts +52 -0
- package/dist/core/headless.js +39 -0
- package/dist/core/index.d.ts +28 -0
- package/dist/core/index.js +28 -0
- package/dist/core/prompt.d.ts +38 -0
- package/dist/core/prompt.js +95 -0
- package/dist/core/reply.d.ts +60 -0
- package/dist/core/reply.js +89 -0
- package/dist/core/request.d.ts +15 -0
- package/dist/core/request.js +55 -0
- package/dist/data/children.d.ts +20 -0
- package/dist/data/children.js +80 -0
- package/dist/data/columns.d.ts +56 -0
- package/dist/data/columns.js +150 -0
- package/dist/data/context.d.ts +8 -0
- package/dist/data/context.js +19 -0
- package/dist/data/derived.d.ts +79 -0
- package/dist/data/derived.js +139 -0
- package/dist/data/display.d.ts +23 -0
- package/dist/data/display.js +84 -0
- package/dist/data/fakes.d.ts +52 -0
- package/dist/data/fakes.js +443 -0
- package/dist/data/format.d.ts +48 -0
- package/dist/data/format.js +121 -0
- package/dist/data/labels.d.ts +45 -0
- package/dist/data/labels.js +179 -0
- package/dist/data/packs.d.ts +95 -0
- package/dist/data/packs.js +830 -0
- package/dist/data/payments.d.ts +17 -0
- package/dist/data/payments.js +60 -0
- package/dist/data/planner-source.d.ts +7 -0
- package/dist/data/planner-source.js +32 -0
- package/dist/data/source.d.ts +119 -0
- package/dist/data/source.js +432 -0
- package/dist/features/catalogue.d.ts +96 -0
- package/dist/features/catalogue.js +225 -0
- package/dist/features/demo.d.ts +36 -0
- package/dist/features/demo.js +66 -0
- package/dist/features/palette.d.ts +39 -0
- package/dist/features/palette.js +53 -0
- package/dist/fields/address.d.ts +23 -0
- package/dist/fields/address.js +39 -0
- package/dist/fields/invalid.d.ts +2 -0
- package/dist/fields/invalid.js +8 -0
- package/dist/fields/modal.d.ts +7 -0
- package/dist/fields/modal.js +14 -0
- package/dist/fields/percent.d.ts +8 -0
- package/dist/fields/percent.js +16 -0
- package/dist/fields/renderer.d.ts +17 -0
- package/dist/fields/renderer.js +43 -0
- package/dist/forms/active.d.ts +16 -0
- package/dist/forms/active.js +24 -0
- package/dist/forms/fieldMap.d.ts +44 -0
- package/dist/forms/fieldMap.js +134 -0
- package/dist/forms/shared.d.ts +41 -0
- package/dist/forms/shared.js +138 -0
- package/dist/forms/stock.d.ts +28 -0
- package/dist/forms/stock.js +104 -0
- package/dist/forms/variantGrid.d.ts +83 -0
- package/dist/forms/variantGrid.js +283 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +16 -0
- package/dist/inference/byo.svelte.d.ts +90 -0
- package/dist/inference/byo.svelte.js +295 -0
- package/dist/inference/config.d.ts +77 -0
- package/dist/inference/config.js +205 -0
- package/dist/inference/host.d.ts +40 -0
- package/dist/inference/host.js +57 -0
- package/dist/inference/openai.d.ts +59 -0
- package/dist/inference/openai.js +207 -0
- package/dist/inference/presets.d.ts +5 -0
- package/dist/inference/presets.js +46 -0
- package/dist/kitchen/client.d.ts +39 -0
- package/dist/kitchen/client.js +115 -0
- package/dist/kitchen/fragment.d.ts +30 -0
- package/dist/kitchen/fragment.js +49 -0
- package/dist/kitchen/state.svelte.d.ts +26 -0
- package/dist/kitchen/state.svelte.js +45 -0
- package/dist/library/apply.d.ts +17 -0
- package/dist/library/apply.js +32 -0
- package/dist/library/document.d.ts +12 -0
- package/dist/library/document.js +27 -0
- package/dist/library/icons.d.ts +6 -0
- package/dist/library/icons.js +26 -0
- package/dist/library/index.d.ts +8 -0
- package/dist/library/index.js +12 -0
- package/dist/library/library.json +788 -0
- package/dist/library/menu.d.ts +18 -0
- package/dist/library/menu.js +72 -0
- package/dist/library/state.svelte.d.ts +10 -0
- package/dist/library/state.svelte.js +28 -0
- package/dist/library/types.d.ts +57 -0
- package/dist/library/types.js +1 -0
- package/dist/overviews/definitions.d.ts +24 -0
- package/dist/overviews/definitions.js +97 -0
- package/dist/overviews/page.d.ts +21 -0
- package/dist/overviews/page.js +36 -0
- package/dist/overviews/registry.d.ts +44 -0
- package/dist/overviews/registry.js +191 -0
- package/dist/overviews/validate.d.ts +32 -0
- package/dist/overviews/validate.js +91 -0
- package/dist/planner/Planner.svelte +204 -0
- package/dist/planner/Planner.svelte.d.ts +4 -0
- package/dist/planner/app.svelte.d.ts +6 -0
- package/dist/planner/app.svelte.js +23 -0
- package/dist/planner/assistant.d.ts +46 -0
- package/dist/planner/assistant.js +122 -0
- package/dist/planner/commands/adapter.d.ts +121 -0
- package/dist/planner/commands/adapter.js +597 -0
- package/dist/planner/commands/catalog.d.ts +19 -0
- package/dist/planner/commands/catalog.js +54 -0
- package/dist/planner/commands/controller.svelte.d.ts +13 -0
- package/dist/planner/commands/controller.svelte.js +77 -0
- package/dist/planner/commands/index.d.ts +15 -0
- package/dist/planner/commands/index.js +15 -0
- package/dist/planner/commands/schemas.d.ts +25 -0
- package/dist/planner/commands/schemas.js +67 -0
- package/dist/planner/commands/slices.d.ts +18 -0
- package/dist/planner/commands/slices.js +49 -0
- package/dist/planner/commands/types.d.ts +80 -0
- package/dist/planner/commands/types.js +18 -0
- package/dist/planner/create.d.ts +4 -0
- package/dist/planner/create.js +22 -0
- package/dist/planner/instance.d.ts +15 -0
- package/dist/planner/instance.js +22 -0
- package/dist/planner/query.d.ts +16 -0
- package/dist/planner/query.js +28 -0
- package/dist/planner/selection.d.ts +15 -0
- package/dist/planner/selection.js +38 -0
- package/dist/planner/selection.svelte.d.ts +29 -0
- package/dist/planner/selection.svelte.js +54 -0
- package/dist/planner/tab.svelte.d.ts +11 -0
- package/dist/planner/tab.svelte.js +22 -0
- package/dist/planner/types.d.ts +41 -0
- package/dist/planner/types.js +1 -0
- package/dist/recipes/cards.d.ts +55 -0
- package/dist/recipes/cards.js +80 -0
- package/dist/recipes/features.d.ts +53 -0
- package/dist/recipes/features.js +97 -0
- package/dist/recipes/help/descriptions.json +373 -0
- package/dist/recipes/help.d.ts +121 -0
- package/dist/recipes/help.js +262 -0
- package/dist/recipes/index.d.ts +65 -0
- package/dist/recipes/index.js +95 -0
- package/dist/recipes/merge.d.ts +26 -0
- package/dist/recipes/merge.js +21 -0
- package/dist/recipes/overlay.json +409 -0
- package/dist/recipes/plan-data.d.ts +41 -0
- package/dist/recipes/plan-data.js +97 -0
- package/dist/recipes/plumbing.d.ts +70 -0
- package/dist/recipes/plumbing.js +185 -0
- package/dist/recipes/policy.d.ts +118 -0
- package/dist/recipes/policy.js +268 -0
- package/dist/recipes/resolve.d.ts +19 -0
- package/dist/recipes/resolve.js +65 -0
- package/dist/recipes/scope.d.ts +25 -0
- package/dist/recipes/scope.js +31 -0
- package/dist/recipes/sections.d.ts +49 -0
- package/dist/recipes/sections.js +84 -0
- package/dist/recipes/state.svelte.d.ts +67 -0
- package/dist/recipes/state.svelte.js +112 -0
- package/dist/recipes/types.d.ts +322 -0
- package/dist/recipes/types.js +8 -0
- package/dist/sections/entries.d.ts +30 -0
- package/dist/sections/entries.js +57 -0
- package/dist/sections/info.d.ts +16 -0
- package/dist/sections/info.js +39 -0
- package/dist/sections/path.d.ts +12 -0
- package/dist/sections/path.js +18 -0
- package/dist/settings/app-settings.d.ts +44 -0
- package/dist/settings/app-settings.js +138 -0
- package/dist/settings/currencies.d.ts +2 -0
- package/dist/settings/currencies.js +8 -0
- package/dist/theme/runtime.d.ts +14 -0
- package/dist/theme/runtime.js +27 -0
- package/dist/theme/theme.d.ts +47 -0
- package/dist/theme/theme.js +122 -0
- package/dist/upstream/CustomerSelect.svelte +60 -0
- package/dist/upstream/CustomerSelect.svelte.d.ts +17 -0
- package/dist/upstream/VendorSelect.svelte +60 -0
- package/dist/upstream/VendorSelect.svelte.d.ts +17 -0
- package/dist/upstream/overlay.d.ts +10 -0
- package/dist/upstream/overlay.js +49 -0
- package/dist/upstream/partySelect.d.ts +8 -0
- package/dist/upstream/partySelect.js +21 -0
- package/dist/upstream/partyTypes.d.ts +64 -0
- package/dist/upstream/partyTypes.js +8 -0
- package/dist/upstream/relations.d.ts +2 -0
- package/dist/upstream/relations.js +24 -0
- package/dist/upstream/selects.d.ts +26 -0
- package/dist/upstream/selects.js +20 -0
- package/dist/upstream/widgets.d.ts +20 -0
- package/dist/upstream/widgets.js +30 -0
- package/package.json +81 -3
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { isRelation } from "../fields/renderer.js";
|
|
2
|
+
import { recordName } from "./display.js";
|
|
3
|
+
import { labelKey } from "./format.js";
|
|
4
|
+
const num = (v) => typeof v === 'number' && Number.isFinite(v) ? v : 0;
|
|
5
|
+
/** Lower is shown first: what names a row, who it is for, its state, its money, its dates. */
|
|
6
|
+
function columnRank(f) {
|
|
7
|
+
const name = f.name;
|
|
8
|
+
if (f.type === 'json')
|
|
9
|
+
return 99;
|
|
10
|
+
if (/^(name|title|label|code)$|Number$|^number$/.test(name))
|
|
11
|
+
return 0;
|
|
12
|
+
if (name === 'reference' && f.type === 'text')
|
|
13
|
+
return 0.5;
|
|
14
|
+
// Long free text is the first thing a list can do without.
|
|
15
|
+
if (name === 'description' && f.type === 'text')
|
|
16
|
+
return 5.9;
|
|
17
|
+
if (isRelation(f)) {
|
|
18
|
+
if (/^(customer|vendor|profile)/i.test(name))
|
|
19
|
+
return 1;
|
|
20
|
+
// The contract and ledger links are bookkeeping, not what a row is about.
|
|
21
|
+
return /^(contract|.*(journal|account))/i.test(name) ? 7 : 2;
|
|
22
|
+
}
|
|
23
|
+
if ((f.enum?.length ?? 0) > 0 && /(status|state|stage)$/i.test(name))
|
|
24
|
+
return 3;
|
|
25
|
+
if (/^(totalAmount|amount|total)$/.test(name))
|
|
26
|
+
return 4;
|
|
27
|
+
if (f.type === 'datetime') {
|
|
28
|
+
// When a scheduled thing starts is what its row is about.
|
|
29
|
+
if (/^start(date|at)?$/i.test(name))
|
|
30
|
+
return 1.2;
|
|
31
|
+
if (/^due/i.test(name))
|
|
32
|
+
return 5;
|
|
33
|
+
if (/(issue|paid|allocated|^date$)/i.test(name))
|
|
34
|
+
return 5.2;
|
|
35
|
+
}
|
|
36
|
+
return 6;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The columns of a list: what names the row, who it is for, its status, its
|
|
40
|
+
* money and its dates first; then the other numeric/boolean/date fields and
|
|
41
|
+
* choices so a row reads like a record, not a wall of text. A record that
|
|
42
|
+
* tracks payments (`totalAmount` and `amountPaid`) also gets "Amount due".
|
|
43
|
+
*/
|
|
44
|
+
export function listColumns(fields, max = 6) {
|
|
45
|
+
const shown = fields.filter((f) => f.type !== 'json');
|
|
46
|
+
const lead = new Set(shown.slice(0, 3));
|
|
47
|
+
const candidates = shown.filter((f) => lead.has(f) ||
|
|
48
|
+
columnRank(f) < 6 ||
|
|
49
|
+
['integer', 'decimal', 'boolean', 'datetime'].includes(f.type) ||
|
|
50
|
+
(f.enum?.length ?? 0) > 0 ||
|
|
51
|
+
isRelation(f));
|
|
52
|
+
const ranked = candidates
|
|
53
|
+
.map((f, i) => ({ f, i, rank: columnRank(f) }))
|
|
54
|
+
.sort((x, y) => x.rank - y.rank || x.i - y.i)
|
|
55
|
+
.map((x) => x.f);
|
|
56
|
+
const total = shown.find((f) => f.name === 'totalAmount');
|
|
57
|
+
if (total && shown.some((f) => f.name === 'amountPaid')) {
|
|
58
|
+
const due = {
|
|
59
|
+
...total,
|
|
60
|
+
name: 'amountDue',
|
|
61
|
+
label: 'Amount due',
|
|
62
|
+
required: false,
|
|
63
|
+
derive: (row) => num(row.totalAmount) - num(row.amountPaid),
|
|
64
|
+
};
|
|
65
|
+
const at = ranked.findIndex((f) => f.name === 'totalAmount');
|
|
66
|
+
ranked.splice(at < 0 ? ranked.length : at + 1, 0, due);
|
|
67
|
+
}
|
|
68
|
+
// Records that are scheduled (an `allDay` flag) show when they start to the minute.
|
|
69
|
+
const scheduled = shown.some((f) => f.name === 'allDay');
|
|
70
|
+
return ranked
|
|
71
|
+
.slice(0, max)
|
|
72
|
+
.map((f) => scheduled &&
|
|
73
|
+
f.type === 'datetime' &&
|
|
74
|
+
/^(start|end)(date|at)$/i.test(f.name)
|
|
75
|
+
? { ...f, showTime: true }
|
|
76
|
+
: f);
|
|
77
|
+
}
|
|
78
|
+
/** The value a list cell shows for a row. */
|
|
79
|
+
export function cellValue(column, row) {
|
|
80
|
+
return column.derive ? column.derive(row) : row[column.name];
|
|
81
|
+
}
|
|
82
|
+
/** The rows whose foreign key points at the parent record. */
|
|
83
|
+
export function rowsOf(rows, fk, parentId) {
|
|
84
|
+
return rows.filter((r) => r[fk] === parentId);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The value a new record starts with: the field's default; an enumeration with
|
|
88
|
+
* none (a `status`, or a required choice) starts at "draft" or its first value
|
|
89
|
+
* rather than empty.
|
|
90
|
+
*/
|
|
91
|
+
export function blankValue(field) {
|
|
92
|
+
if (field.default !== undefined && field.default !== null) {
|
|
93
|
+
return field.default;
|
|
94
|
+
}
|
|
95
|
+
const choices = field.enum ?? [];
|
|
96
|
+
if (choices.length > 0 &&
|
|
97
|
+
(field.required || /(status|state|stage)$/i.test(field.name))) {
|
|
98
|
+
return choices.includes('draft') ? 'draft' : choices[0];
|
|
99
|
+
}
|
|
100
|
+
if (field.type === 'boolean')
|
|
101
|
+
return false;
|
|
102
|
+
return field.type === 'text' ? '' : null;
|
|
103
|
+
}
|
|
104
|
+
/** Starting values for a new record of the fields shown. */
|
|
105
|
+
export function blankRecord(fields) {
|
|
106
|
+
const blank = {};
|
|
107
|
+
for (const field of fields)
|
|
108
|
+
blank[field.name] = blankValue(field);
|
|
109
|
+
return blank;
|
|
110
|
+
}
|
|
111
|
+
/** Starting values for a new child row: field defaults, the foreign key preset. */
|
|
112
|
+
export function blankChild(fields, fk, parentId) {
|
|
113
|
+
return { ...blankRecord(fields), [fk]: parentId };
|
|
114
|
+
}
|
|
115
|
+
const isEmpty = (value) => value === null ||
|
|
116
|
+
value === undefined ||
|
|
117
|
+
(typeof value === 'string' && value.trim() === '');
|
|
118
|
+
/**
|
|
119
|
+
* Required fields without a value, as `{ name: message }`. A switch always has
|
|
120
|
+
* a value; fields in `skip` (derived or preset ones) are not asked for.
|
|
121
|
+
*/
|
|
122
|
+
export function missingRequired(fields, values, skip = new Set()) {
|
|
123
|
+
const errors = {};
|
|
124
|
+
for (const field of fields) {
|
|
125
|
+
if (!field.required || field.type === 'boolean' || skip.has(field.name)) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (isEmpty(values[field.name]))
|
|
129
|
+
errors[field.name] = `${field.label} is required.`;
|
|
130
|
+
}
|
|
131
|
+
return errors;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* One line for near the Save button: which fields still need a value.
|
|
135
|
+
* Empty when nothing is missing, so it clears itself as the errors do.
|
|
136
|
+
*/
|
|
137
|
+
export function errorSummary(fields, errors) {
|
|
138
|
+
const labels = fields.filter((f) => errors[f.name]).map((f) => f.label);
|
|
139
|
+
if (labels.length === 0)
|
|
140
|
+
return '';
|
|
141
|
+
return `Cannot save yet: ${labels.join(', ')} ${labels.length === 1 ? 'is' : 'are'} required.`;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* What names a record to a person (see `recordName`): its label, else its
|
|
145
|
+
* number and who it is for ("WIL-1133 · Lantern Collective"), else the record
|
|
146
|
+
* it points at plus its reference.
|
|
147
|
+
*/
|
|
148
|
+
export function recordTitle(model, fields, row, labels) {
|
|
149
|
+
return (recordName(model, row, (field, id) => field.related ? labels.get(labelKey(field.related, id)) : undefined, fields) ?? '');
|
|
150
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DataSource } from './source.ts';
|
|
2
|
+
/** The context key, for tests that render a component without the layout. */
|
|
3
|
+
export declare const DATA_SOURCE_KEY: symbol;
|
|
4
|
+
/** Provide the data source for every generated view below the caller. */
|
|
5
|
+
export declare function provideDataSource(source: DataSource): DataSource;
|
|
6
|
+
export declare function useDataSource(): DataSource;
|
|
7
|
+
/** The data source below the caller, or null when none was provided. */
|
|
8
|
+
export declare function tryUseDataSource(): DataSource | null;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { getContext, setContext } from 'svelte';
|
|
2
|
+
const KEY = Symbol('smrt-planner:data-source');
|
|
3
|
+
/** The context key, for tests that render a component without the layout. */
|
|
4
|
+
export const DATA_SOURCE_KEY = KEY;
|
|
5
|
+
/** Provide the data source for every generated view below the caller. */
|
|
6
|
+
export function provideDataSource(source) {
|
|
7
|
+
setContext(KEY, source);
|
|
8
|
+
return source;
|
|
9
|
+
}
|
|
10
|
+
export function useDataSource() {
|
|
11
|
+
const source = getContext(KEY);
|
|
12
|
+
if (!source)
|
|
13
|
+
throw new Error('No DataSource provided; see +layout.svelte');
|
|
14
|
+
return source;
|
|
15
|
+
}
|
|
16
|
+
/** The data source below the caller, or null when none was provided. */
|
|
17
|
+
export function tryUseDataSource() {
|
|
18
|
+
return getContext(KEY) ?? null;
|
|
19
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Amounts the commerce models derive rather than take as input, mirrored from
|
|
3
|
+
* `ContractLineItem` / `InvoiceLineItem` / `Invoice` in smrt-commerce:
|
|
4
|
+
*
|
|
5
|
+
* line subtotal = round(quantity * unitPrice) - discount (minor units)
|
|
6
|
+
* line tax = round(line subtotal * taxRate) (taxRate is a fraction)
|
|
7
|
+
* line amount = line subtotal + line tax
|
|
8
|
+
*
|
|
9
|
+
* and a parent with line items takes `subtotal`, `taxAmount` and `totalAmount`
|
|
10
|
+
* from the sum of its lines, ignoring what a form sent.
|
|
11
|
+
*/
|
|
12
|
+
import type { CatalogModel } from '../catalog/types.ts';
|
|
13
|
+
type Row = Readonly<Record<string, unknown>>;
|
|
14
|
+
/** A line item: it prices a quantity of something. */
|
|
15
|
+
export declare function isLineModel(model: CatalogModel): boolean;
|
|
16
|
+
export interface LineAmounts {
|
|
17
|
+
subtotal: number;
|
|
18
|
+
tax: number;
|
|
19
|
+
amount: number;
|
|
20
|
+
}
|
|
21
|
+
export declare function lineAmounts(line: Row): LineAmounts;
|
|
22
|
+
/** The line with its `amount` brought in line with its other fields. */
|
|
23
|
+
export declare function settleLine<T extends Row>(line: T): T & {
|
|
24
|
+
amount: number;
|
|
25
|
+
};
|
|
26
|
+
export interface ParentTotals {
|
|
27
|
+
subtotal: number;
|
|
28
|
+
taxAmount: number;
|
|
29
|
+
totalAmount: number;
|
|
30
|
+
}
|
|
31
|
+
export declare function totalsOf(lines: readonly Row[]): ParentTotals;
|
|
32
|
+
export declare const TOTAL_FIELDS: readonly ["subtotal", "taxAmount", "totalAmount"];
|
|
33
|
+
/** `row` with the model's total fields set from `lines`. */
|
|
34
|
+
export declare function withTotals<T extends Record<string, unknown>>(model: CatalogModel, row: T, lines: readonly Row[]): T;
|
|
35
|
+
/** A record that tracks what has been paid against it (an Invoice). */
|
|
36
|
+
export declare function tracksPayments(model: CatalogModel): boolean;
|
|
37
|
+
/** The field of a payment allocation that points at its payment. */
|
|
38
|
+
export declare function allocationPaymentField(model: CatalogModel): import("../catalog/types.ts").CatalogField | undefined;
|
|
39
|
+
/** The field of a payment allocation that points at the invoice it pays. */
|
|
40
|
+
export declare function allocationInvoiceField(model: CatalogModel): import("../catalog/types.ts").CatalogField | undefined;
|
|
41
|
+
/** A payment applied to an invoice: one payment, one invoice, an amount. */
|
|
42
|
+
export declare function isAllocationModel(model: CatalogModel): boolean;
|
|
43
|
+
/** What counts as money in: only a completed payment pays an invoice. */
|
|
44
|
+
export declare const PAID_PAYMENT_STATUS = "completed";
|
|
45
|
+
export interface Settlement {
|
|
46
|
+
amountPaid: number;
|
|
47
|
+
status: string;
|
|
48
|
+
paidDate: string | null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* An invoice's payment state from the allocations of completed payments
|
|
52
|
+
* (`counted`): `amountPaid` is their sum, the status is paid once the total is
|
|
53
|
+
* covered, otherwise overdue after the due date and sent before it. A draft or
|
|
54
|
+
* cancelled invoice keeps its status; `paidDate` is set only when fully paid,
|
|
55
|
+
* to the last allocation.
|
|
56
|
+
*/
|
|
57
|
+
export declare function settleInvoice(invoice: Row, counted: readonly {
|
|
58
|
+
amount: number;
|
|
59
|
+
at: string;
|
|
60
|
+
}[], now: number): Settlement;
|
|
61
|
+
/**
|
|
62
|
+
* The fields a form shows but does not let anyone type: a line's `amount`, a
|
|
63
|
+
* parent's totals when it has line items, and what an invoice has paid (and
|
|
64
|
+
* when) when it has payment allocations.
|
|
65
|
+
*/
|
|
66
|
+
export declare function derivedFieldNames(model: CatalogModel, hasLineChildren: boolean, hasPaymentChildren?: boolean): ReadonlySet<string>;
|
|
67
|
+
/** Does the field of a line item point at a product? */
|
|
68
|
+
export declare function isProductField(field: {
|
|
69
|
+
name: string;
|
|
70
|
+
type: string;
|
|
71
|
+
related?: string;
|
|
72
|
+
}): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* What picking a product fills in on a line item: its name as the description
|
|
75
|
+
* and its price as the unit price, for the fields the line has. Both stay
|
|
76
|
+
* editable. A product with no name or price fills nothing.
|
|
77
|
+
*/
|
|
78
|
+
export declare function productPrefill(line: CatalogModel, product: Row | undefined): Record<string, unknown>;
|
|
79
|
+
export {};
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
const num = (value) => {
|
|
2
|
+
const n = Number(value ?? 0);
|
|
3
|
+
return Number.isFinite(n) ? n : 0;
|
|
4
|
+
};
|
|
5
|
+
const has = (model, name) => model.fields.some((f) => f.name === name);
|
|
6
|
+
/** A line item: it prices a quantity of something. */
|
|
7
|
+
export function isLineModel(model) {
|
|
8
|
+
return ['quantity', 'unitPrice', 'amount'].every((n) => has(model, n));
|
|
9
|
+
}
|
|
10
|
+
export function lineAmounts(line) {
|
|
11
|
+
const subtotal = Math.round(num(line.quantity) * num(line.unitPrice)) - num(line.discount);
|
|
12
|
+
const tax = Math.round(subtotal * num(line.taxRate));
|
|
13
|
+
return { subtotal, tax, amount: subtotal + tax };
|
|
14
|
+
}
|
|
15
|
+
/** The line with its `amount` brought in line with its other fields. */
|
|
16
|
+
export function settleLine(line) {
|
|
17
|
+
return { ...line, amount: lineAmounts(line).amount };
|
|
18
|
+
}
|
|
19
|
+
export function totalsOf(lines) {
|
|
20
|
+
let subtotal = 0;
|
|
21
|
+
let taxAmount = 0;
|
|
22
|
+
for (const line of lines) {
|
|
23
|
+
const parts = lineAmounts(line);
|
|
24
|
+
subtotal += parts.subtotal;
|
|
25
|
+
taxAmount += parts.tax;
|
|
26
|
+
}
|
|
27
|
+
return { subtotal, taxAmount, totalAmount: subtotal + taxAmount };
|
|
28
|
+
}
|
|
29
|
+
export const TOTAL_FIELDS = ['subtotal', 'taxAmount', 'totalAmount'];
|
|
30
|
+
/** `row` with the model's total fields set from `lines`. */
|
|
31
|
+
export function withTotals(model, row, lines) {
|
|
32
|
+
const totals = totalsOf(lines);
|
|
33
|
+
const next = { ...row };
|
|
34
|
+
for (const name of TOTAL_FIELDS) {
|
|
35
|
+
if (has(model, name))
|
|
36
|
+
next[name] = totals[name];
|
|
37
|
+
}
|
|
38
|
+
return next;
|
|
39
|
+
}
|
|
40
|
+
/** A record that tracks what has been paid against it (an Invoice). */
|
|
41
|
+
export function tracksPayments(model) {
|
|
42
|
+
return ['totalAmount', 'amountPaid', 'status'].every((n) => has(model, n));
|
|
43
|
+
}
|
|
44
|
+
const isRef = (f) => f.type === 'foreignKey' || f.type === 'crossPackageRef';
|
|
45
|
+
/** The field of a payment allocation that points at its payment. */
|
|
46
|
+
export function allocationPaymentField(model) {
|
|
47
|
+
return model.fields.find((f) => isRef(f) && /^payment/i.test(f.name));
|
|
48
|
+
}
|
|
49
|
+
/** The field of a payment allocation that points at the invoice it pays. */
|
|
50
|
+
export function allocationInvoiceField(model) {
|
|
51
|
+
return model.fields.find((f) => isRef(f) && /^invoice/i.test(f.name));
|
|
52
|
+
}
|
|
53
|
+
/** A payment applied to an invoice: one payment, one invoice, an amount. */
|
|
54
|
+
export function isAllocationModel(model) {
|
|
55
|
+
return (has(model, 'amount') &&
|
|
56
|
+
Boolean(allocationPaymentField(model)) &&
|
|
57
|
+
Boolean(allocationInvoiceField(model)));
|
|
58
|
+
}
|
|
59
|
+
/** What counts as money in: only a completed payment pays an invoice. */
|
|
60
|
+
export const PAID_PAYMENT_STATUS = 'completed';
|
|
61
|
+
/**
|
|
62
|
+
* An invoice's payment state from the allocations of completed payments
|
|
63
|
+
* (`counted`): `amountPaid` is their sum, the status is paid once the total is
|
|
64
|
+
* covered, otherwise overdue after the due date and sent before it. A draft or
|
|
65
|
+
* cancelled invoice keeps its status; `paidDate` is set only when fully paid,
|
|
66
|
+
* to the last allocation.
|
|
67
|
+
*/
|
|
68
|
+
export function settleInvoice(invoice, counted, now) {
|
|
69
|
+
const amountPaid = counted.reduce((sum, a) => sum + num(a.amount), 0);
|
|
70
|
+
const total = num(invoice.totalAmount);
|
|
71
|
+
const current = String(invoice.status ?? 'draft');
|
|
72
|
+
const fullyPaid = total > 0 && amountPaid >= total;
|
|
73
|
+
let status = current;
|
|
74
|
+
if (fullyPaid)
|
|
75
|
+
status = 'paid';
|
|
76
|
+
else if (current !== 'draft' && current !== 'cancelled') {
|
|
77
|
+
const due = Date.parse(String(invoice.dueDate ?? ''));
|
|
78
|
+
if (Number.isFinite(due) && due < now)
|
|
79
|
+
status = 'overdue';
|
|
80
|
+
else
|
|
81
|
+
status = current === 'viewed' ? 'viewed' : 'sent';
|
|
82
|
+
}
|
|
83
|
+
const last = counted
|
|
84
|
+
.map((a) => a.at)
|
|
85
|
+
.sort()
|
|
86
|
+
.at(-1);
|
|
87
|
+
return {
|
|
88
|
+
amountPaid,
|
|
89
|
+
status,
|
|
90
|
+
paidDate: fullyPaid ? (last ?? String(invoice.issueDate ?? '')) : null,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* The fields a form shows but does not let anyone type: a line's `amount`, a
|
|
95
|
+
* parent's totals when it has line items, and what an invoice has paid (and
|
|
96
|
+
* when) when it has payment allocations.
|
|
97
|
+
*/
|
|
98
|
+
export function derivedFieldNames(model, hasLineChildren, hasPaymentChildren = false) {
|
|
99
|
+
const names = new Set();
|
|
100
|
+
if (isLineModel(model))
|
|
101
|
+
names.add('amount');
|
|
102
|
+
if (hasLineChildren) {
|
|
103
|
+
for (const name of TOTAL_FIELDS)
|
|
104
|
+
if (has(model, name))
|
|
105
|
+
names.add(name);
|
|
106
|
+
}
|
|
107
|
+
if (hasPaymentChildren && tracksPayments(model)) {
|
|
108
|
+
for (const name of ['amountPaid', 'paidDate']) {
|
|
109
|
+
if (has(model, name))
|
|
110
|
+
names.add(name);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return names;
|
|
114
|
+
}
|
|
115
|
+
/** Does the field of a line item point at a product? */
|
|
116
|
+
export function isProductField(field) {
|
|
117
|
+
return (isRef(field) &&
|
|
118
|
+
(field.related?.endsWith(':Product') === true ||
|
|
119
|
+
/^product(Id)?$/i.test(field.name)));
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* What picking a product fills in on a line item: its name as the description
|
|
123
|
+
* and its price as the unit price, for the fields the line has. Both stay
|
|
124
|
+
* editable. A product with no name or price fills nothing.
|
|
125
|
+
*/
|
|
126
|
+
export function productPrefill(line, product) {
|
|
127
|
+
const fill = {};
|
|
128
|
+
if (!product)
|
|
129
|
+
return fill;
|
|
130
|
+
if (has(line, 'description') &&
|
|
131
|
+
typeof product.name === 'string' &&
|
|
132
|
+
product.name) {
|
|
133
|
+
fill.description = product.name;
|
|
134
|
+
}
|
|
135
|
+
if (has(line, 'unitPrice') && typeof product.price === 'number') {
|
|
136
|
+
fill.unitPrice = product.price;
|
|
137
|
+
}
|
|
138
|
+
return fill;
|
|
139
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which field labels a record in pickers. `model.display` comes from the
|
|
3
|
+
* manifest's `displayLabelField` (happyvertical/smrt#3611); a model that
|
|
4
|
+
* declares none falls back to the first of `name`, `title`, `label`, `code`.
|
|
5
|
+
*/
|
|
6
|
+
import type { CatalogField, CatalogModel } from '../catalog/types.ts';
|
|
7
|
+
export declare const DEFAULT_LABEL_FIELDS: readonly ["name", "title", "label", "code"];
|
|
8
|
+
/** The fields that may label a record of the model, best first. */
|
|
9
|
+
export declare function labelFields(model: CatalogModel): string[];
|
|
10
|
+
/** The first non-empty label field of a record, or undefined. */
|
|
11
|
+
export declare function displayLabel(model: CatalogModel, record: Readonly<Record<string, unknown>>): string | undefined;
|
|
12
|
+
/** Finds the label of the record a relation field points at. */
|
|
13
|
+
export type RelatedLabel = (field: CatalogField, id: string) => string | undefined;
|
|
14
|
+
/** A record's own number, e.g. `invoiceNumber` or `number`. */
|
|
15
|
+
export declare function numberOf(model: CatalogModel, record: Readonly<Record<string, unknown>>): string | undefined;
|
|
16
|
+
/** The relation field that best says what a record is about, if it has one. */
|
|
17
|
+
export declare function partyField(fields: readonly CatalogField[], record: Readonly<Record<string, unknown>>): CatalogField | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* The text that names a record: its label field, else its number (plus the
|
|
20
|
+
* party it is for), else the party, with the amount and date for a money record
|
|
21
|
+
* such as a payment. `undefined` when nothing names it.
|
|
22
|
+
*/
|
|
23
|
+
export declare function recordName(model: CatalogModel, record: Readonly<Record<string, unknown>>, related: RelatedLabel, fields?: readonly CatalogField[]): string | undefined;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { formatMoney } from "./format.js";
|
|
2
|
+
export const DEFAULT_LABEL_FIELDS = ['name', 'title', 'label', 'code'];
|
|
3
|
+
/** The fields that may label a record of the model, best first. */
|
|
4
|
+
export function labelFields(model) {
|
|
5
|
+
const declared = model.display?.label;
|
|
6
|
+
const names = new Set(model.fields.map((f) => f.name));
|
|
7
|
+
return [...(declared ? [declared] : []), ...DEFAULT_LABEL_FIELDS].filter((name, index, all) => names.has(name) && all.indexOf(name) === index);
|
|
8
|
+
}
|
|
9
|
+
/** The first non-empty label field of a record, or undefined. */
|
|
10
|
+
export function displayLabel(model, record) {
|
|
11
|
+
for (const name of labelFields(model)) {
|
|
12
|
+
const value = record[name];
|
|
13
|
+
if (typeof value === 'string' && value.trim() !== '')
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
const isRef = (f) => f.type === 'foreignKey' || f.type === 'crossPackageRef';
|
|
19
|
+
/** Relations that say what a record is about, best first. */
|
|
20
|
+
const PARTY_ORDER = [
|
|
21
|
+
/^customer/i,
|
|
22
|
+
/^vendor/i,
|
|
23
|
+
/^profile/i,
|
|
24
|
+
/^product/i,
|
|
25
|
+
/^invoice/i,
|
|
26
|
+
/^order/i,
|
|
27
|
+
/^payment/i,
|
|
28
|
+
/^contract/i,
|
|
29
|
+
];
|
|
30
|
+
/** A record's own number, e.g. `invoiceNumber` or `number`. */
|
|
31
|
+
export function numberOf(model, record) {
|
|
32
|
+
const field = model.fields.find((f) => !f.system &&
|
|
33
|
+
f.type === 'text' &&
|
|
34
|
+
/(^|[a-z])Number$|^number$/.test(f.name) &&
|
|
35
|
+
typeof record[f.name] === 'string' &&
|
|
36
|
+
String(record[f.name]).trim() !== '');
|
|
37
|
+
return field ? String(record[field.name]) : undefined;
|
|
38
|
+
}
|
|
39
|
+
/** The relation field that best says what a record is about, if it has one. */
|
|
40
|
+
export function partyField(fields, record) {
|
|
41
|
+
const set = fields.filter((f) => isRef(f) && typeof record[f.name] === 'string' && record[f.name] !== '');
|
|
42
|
+
for (const pattern of PARTY_ORDER) {
|
|
43
|
+
const found = set.find((f) => pattern.test(f.name));
|
|
44
|
+
if (found)
|
|
45
|
+
return found;
|
|
46
|
+
}
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
const DATE_NAME = /(paid|allocated|issue|^date$|createdat)/i;
|
|
50
|
+
/**
|
|
51
|
+
* The text that names a record: its label field, else its number (plus the
|
|
52
|
+
* party it is for), else the party, with the amount and date for a money record
|
|
53
|
+
* such as a payment. `undefined` when nothing names it.
|
|
54
|
+
*/
|
|
55
|
+
export function recordName(model, record, related, fields = model.fields) {
|
|
56
|
+
const own = displayLabel(model, record);
|
|
57
|
+
if (own)
|
|
58
|
+
return own;
|
|
59
|
+
const partyOf = partyField(fields, record);
|
|
60
|
+
const party = partyOf?.related
|
|
61
|
+
? related(partyOf, String(record[partyOf.name]))
|
|
62
|
+
: undefined;
|
|
63
|
+
const number = numberOf(model, record);
|
|
64
|
+
if (number)
|
|
65
|
+
return unique([number, party]);
|
|
66
|
+
const moneyField = model.fields.find((f) => f.name === 'amount' && f.type === 'integer');
|
|
67
|
+
if (moneyField && typeof record.amount === 'number') {
|
|
68
|
+
const dateField = model.fields.find((f) => f.type === 'datetime' && DATE_NAME.test(f.name) && record[f.name]);
|
|
69
|
+
return unique([
|
|
70
|
+
party,
|
|
71
|
+
formatMoney(record.amount),
|
|
72
|
+
dateField ? String(record[dateField.name]).slice(0, 10) : undefined,
|
|
73
|
+
]);
|
|
74
|
+
}
|
|
75
|
+
const reference = ['reference', 'description']
|
|
76
|
+
.map((name) => record[name])
|
|
77
|
+
.find((v) => typeof v === 'string' && v.trim() !== '');
|
|
78
|
+
return unique([party, reference]);
|
|
79
|
+
}
|
|
80
|
+
function unique(parts) {
|
|
81
|
+
const kept = parts.filter((p) => Boolean(p));
|
|
82
|
+
const text = kept.filter((p, i) => kept.indexOf(p) === i).join(' · ');
|
|
83
|
+
return text || undefined;
|
|
84
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { CatalogField, CatalogModel } from '../catalog/types.ts';
|
|
2
|
+
import { type PackLine } from './packs.ts';
|
|
3
|
+
/** A row of sample data. `id` is always present. */
|
|
4
|
+
export interface ModelRecord {
|
|
5
|
+
id: string;
|
|
6
|
+
[field: string]: unknown;
|
|
7
|
+
}
|
|
8
|
+
/** Deterministic PRNG (mulberry32): the same seed always yields the same run. */
|
|
9
|
+
export declare function createRandom(seed: number): () => number;
|
|
10
|
+
/** FNV-1a hash of a string, for seeding. */
|
|
11
|
+
export declare function hashString(value: string): number;
|
|
12
|
+
/**
|
|
13
|
+
* Money is stored as integer minor units (cents). A field is money when it is
|
|
14
|
+
* an integer whose name says so; everything else numeric is a plain number.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isMoneyField(field: CatalogField): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Things a shop sells, with a price in cents. Sample products and SKUs take
|
|
19
|
+
* their names from here by row index, and a line item pointing at product `n`
|
|
20
|
+
* reads as that product, so a picked product and a sample line agree.
|
|
21
|
+
*/
|
|
22
|
+
export declare const PRODUCT_CATALOG: readonly {
|
|
23
|
+
name: string;
|
|
24
|
+
price: number;
|
|
25
|
+
}[];
|
|
26
|
+
/** Fixed clock so seeded timestamps never change between runs. */
|
|
27
|
+
export declare const EPOCH: number;
|
|
28
|
+
/** A UUID-shaped id derived from a seed string. */
|
|
29
|
+
export declare function fakeId(seed: string): string;
|
|
30
|
+
/** Fractions a tax rate takes: 0%, 5%, 8.25%, 13% and 20%. */
|
|
31
|
+
export declare const TAX_RATES: readonly [0, 0.05, 0.0825, 0.13, 0.2];
|
|
32
|
+
export declare const SAMPLE_ROW_COUNTS: Readonly<Record<string, number>>;
|
|
33
|
+
/** Sample rows for a model: the pack's count, else the shared one, else `fallback`. */
|
|
34
|
+
export declare function sampleRowCount(modelId: string, fallback: number): number;
|
|
35
|
+
/** One fake value for a field. Money is an integer number of minor units. */
|
|
36
|
+
export declare function fakeValue(field: CatalogField, random: () => number, context: {
|
|
37
|
+
modelId: string;
|
|
38
|
+
index: number;
|
|
39
|
+
}): unknown;
|
|
40
|
+
/** Fields a person edits: everything the framework does not manage. */
|
|
41
|
+
export declare function editableFields(model: CatalogModel): CatalogField[];
|
|
42
|
+
export declare const DAY: number;
|
|
43
|
+
/**
|
|
44
|
+
* The line a sample line item reads as when the pack describes lines apart
|
|
45
|
+
* from products (labour, fabrication, passes); `undefined` for packs whose
|
|
46
|
+
* lines are their products.
|
|
47
|
+
*/
|
|
48
|
+
export declare function packLine(index: number): PackLine | undefined;
|
|
49
|
+
/** A single seeded record for a model. */
|
|
50
|
+
export declare function fakeRecord(model: CatalogModel, index: number, seed: number): ModelRecord;
|
|
51
|
+
/** `count` seeded records for a model. */
|
|
52
|
+
export declare function fakeRecords(model: CatalogModel, count: number, seed?: number): ModelRecord[];
|