@happyvertical/smrt-planner 0.0.1 → 0.1.0

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.
Files changed (763) hide show
  1. package/README.md +81 -8
  2. package/app/404.html +42 -49
  3. package/app/_app/immutable/assets/0.BvXq1Svw.css +1 -0
  4. package/app/_app/immutable/assets/10.CdYxvH4G.css +1 -0
  5. package/app/_app/immutable/assets/11.nOT5Z4Fv.css +1 -0
  6. package/app/_app/immutable/assets/12.F7A7zP4J.css +1 -0
  7. package/app/_app/immutable/assets/13.JoySu8W5.css +1 -0
  8. package/app/_app/immutable/assets/14.nsp62-4b.css +1 -0
  9. package/app/_app/immutable/assets/2.CbPiqdz5.css +1 -0
  10. package/app/_app/immutable/assets/3.D518dbB5.css +1 -0
  11. package/app/_app/immutable/assets/4.B3vt1gMJ.css +1 -0
  12. package/app/_app/immutable/assets/AiSetup.4fXjMpTZ.css +1 -0
  13. package/app/_app/immutable/assets/AppShell.DKPbJFmw.css +1 -0
  14. package/app/_app/immutable/assets/ConnectTools.DTleL8YA.css +1 -0
  15. package/app/_app/immutable/assets/FieldMapForm.C8SZ3t4N.css +1 -0
  16. package/app/_app/immutable/assets/ModelPage.DzDhJQz3.css +1 -0
  17. package/app/_app/immutable/assets/SectionActions.BE1CPmxk.css +1 -0
  18. package/app/_app/immutable/assets/SectionIcons.BGFcFuOf.css +1 -0
  19. package/app/_app/immutable/assets/SegmentedControl.T_hJQXHk.css +1 -0
  20. package/app/_app/immutable/assets/app.BS7nbUi0.css +1 -0
  21. package/app/_app/immutable/assets/currency-metadata.CJIy0Dzm.css +1 -0
  22. package/app/_app/immutable/assets/data.DQcbQG_b.css +1 -0
  23. package/app/_app/immutable/assets/feedback.FjY5wqsa.css +1 -0
  24. package/app/_app/immutable/assets/forms.DA06CFM9.css +1 -0
  25. package/app/_app/immutable/assets/labels.Dny6zd23.css +1 -0
  26. package/app/_app/immutable/assets/percent.CBivq97O.css +1 -0
  27. package/app/_app/immutable/assets/state.C9Put0ur.css +1 -0
  28. package/app/_app/immutable/assets/webmcp-ui-context.CC5pQLNE.css +1 -0
  29. package/app/_app/immutable/assets/workspace.Dtoe2fRU.css +1 -0
  30. package/app/_app/immutable/chunks/3ouNUakh.js +1 -0
  31. package/app/_app/immutable/chunks/B3FAegW4.js +4 -0
  32. package/app/_app/immutable/chunks/B8iReL-r.js +1 -0
  33. package/app/_app/immutable/chunks/BCmdRE3j.js +4 -0
  34. package/app/_app/immutable/chunks/BV3NwM01.js +1 -0
  35. package/app/_app/immutable/chunks/BVicq_6F.js +1 -0
  36. package/app/_app/immutable/chunks/Ba1g71Sq.js +1 -0
  37. package/app/_app/immutable/chunks/BdjvgMW6.js +1 -0
  38. package/app/_app/immutable/chunks/BiO_bqNH.js +2 -0
  39. package/app/_app/immutable/chunks/{DyGfbRG-.js → BrorvU4B.js} +1 -1
  40. package/app/_app/immutable/chunks/By-QJdbA.js +980 -0
  41. package/app/_app/immutable/chunks/{CyUMm_Wp.js → BzITuwgY.js} +1 -1
  42. package/app/_app/immutable/chunks/BzMfoxBk.js +1 -0
  43. package/app/_app/immutable/chunks/C-AoRalq.js +1 -0
  44. package/app/_app/immutable/chunks/CGKL_Nlh.js +1 -0
  45. package/app/_app/immutable/chunks/CNj-_B0j.js +1 -0
  46. package/app/_app/immutable/chunks/CU8cbxOZ.js +1 -0
  47. package/app/_app/immutable/chunks/CZGhPAoL.js +2 -0
  48. package/app/_app/immutable/chunks/CaEdOwVf.js +1 -0
  49. package/app/_app/immutable/chunks/Cas1hq-y.js +1 -0
  50. package/app/_app/immutable/chunks/CfOMUCNN.js +1 -0
  51. package/app/_app/immutable/chunks/Cm0VMWZu.js +1 -0
  52. package/app/_app/immutable/chunks/CsmXMAyE.js +1 -0
  53. package/app/_app/immutable/chunks/{BWPhGFHl.js → D0FW0z6R.js} +1 -1
  54. package/app/_app/immutable/chunks/D3nyL-ZK.js +1 -0
  55. package/app/_app/immutable/chunks/DEe2Vsu9.js +1 -0
  56. package/app/_app/immutable/chunks/DTs3DOB0.js +10 -0
  57. package/app/_app/immutable/chunks/Dm6R8q7G.js +1 -0
  58. package/app/_app/immutable/chunks/Dreozana.js +1 -0
  59. package/app/_app/immutable/chunks/Dx8H44Wq.js +2 -0
  60. package/app/_app/immutable/chunks/DxR35SQx.js +24 -0
  61. package/app/_app/immutable/chunks/EcFojPiU.js +11 -0
  62. package/app/_app/immutable/chunks/JBS2nHGN.js +1 -0
  63. package/app/_app/immutable/chunks/TjbilXEg.js +1 -0
  64. package/app/_app/immutable/chunks/ZLqixH7j.js +9 -0
  65. package/app/_app/immutable/chunks/auwiz8v4.js +1 -0
  66. package/app/_app/immutable/chunks/dbZ3U29n.js +1 -0
  67. package/app/_app/immutable/chunks/{D333l2GL.js → gHjidpzw.js} +2 -2
  68. package/app/_app/immutable/chunks/vNEnXNLV.js +3 -0
  69. package/app/_app/immutable/entry/app.vuScBcN4.js +2 -0
  70. package/app/_app/immutable/entry/start.C_vMied2.js +1 -0
  71. package/app/_app/immutable/nodes/0.BeNJfVow.js +9 -0
  72. package/app/_app/immutable/nodes/1.huiLmf4w.js +1 -0
  73. package/app/_app/immutable/nodes/10.B3buyRS-.js +3 -0
  74. package/app/_app/immutable/nodes/11.FNeDQehr.js +1 -0
  75. package/app/_app/immutable/nodes/12.umrKgKLQ.js +4 -0
  76. package/app/_app/immutable/nodes/13.DFr7i0IY.js +1 -0
  77. package/app/_app/immutable/nodes/14.BNgJ8cEq.js +1 -0
  78. package/app/_app/immutable/nodes/2.B3v0JtfB.js +24 -0
  79. package/app/_app/immutable/nodes/3.FLW3AkwU.js +1 -0
  80. package/app/_app/immutable/nodes/4.50B7EkB9.js +1 -0
  81. package/app/_app/immutable/nodes/5.Din7W_Et.js +1 -0
  82. package/app/_app/immutable/nodes/6.7dOUE7nr.js +1 -0
  83. package/app/_app/immutable/nodes/7.C4XsW0qI.js +1 -0
  84. package/app/_app/immutable/nodes/8.D_MREd8V.js +1 -0
  85. package/app/_app/immutable/nodes/9.cn87hhI-.js +1 -0
  86. package/app/_app/version.json +1 -1
  87. package/app/advanced-styles/index.html +84 -0
  88. package/app/ai/index.html +60 -52
  89. package/app/blueprint/index.html +46 -53
  90. package/app/cookbook/index.html +46 -53
  91. package/app/index.html +92 -64
  92. package/app/m/ads/AdDeliveryTier/index.html +52 -59
  93. package/app/m/ads/AdEvent/index.html +52 -59
  94. package/app/m/ads/AdFormat/index.html +52 -59
  95. package/app/m/ads/AdGroup/index.html +52 -59
  96. package/app/m/ads/AdVariation/index.html +52 -59
  97. package/app/m/analytics/AnalyticsDataStream/index.html +52 -59
  98. package/app/m/analytics/AnalyticsEvent/index.html +52 -59
  99. package/app/m/analytics/AnalyticsProperty/index.html +52 -59
  100. package/app/m/analytics/AnalyticsReport/index.html +52 -59
  101. package/app/m/approvals/ApprovalEvent/index.html +52 -59
  102. package/app/m/approvals/ApprovalPolicy/index.html +52 -59
  103. package/app/m/approvals/ApprovalRequest/index.html +52 -59
  104. package/app/m/assets/Asset/attachments/index.html +91 -0
  105. package/app/m/assets/Asset/index.html +52 -59
  106. package/app/m/assets/AssetAssociation/index.html +53 -60
  107. package/app/m/assets/AssetMetafield/index.html +52 -59
  108. package/app/m/assets/AssetStatus/index.html +52 -59
  109. package/app/m/assets/AssetType/index.html +52 -59
  110. package/app/m/assets/Folder/index.html +52 -59
  111. package/app/m/chat/AgentSession/index.html +52 -59
  112. package/app/m/chat/ChatMessage/index.html +53 -60
  113. package/app/m/chat/ChatParticipant/index.html +53 -60
  114. package/app/m/chat/ChatReaction/index.html +52 -59
  115. package/app/m/chat/ChatRoom/index.html +52 -59
  116. package/app/m/chat/ChatThread/index.html +53 -60
  117. package/app/m/chat/VoiceGatewayTurn/index.html +52 -59
  118. package/app/m/chat/VoiceSession/index.html +52 -59
  119. package/app/m/commerce/Agreement/index.html +52 -59
  120. package/app/m/commerce/Cart/index.html +52 -59
  121. package/app/m/commerce/Contract/index.html +52 -59
  122. package/app/m/commerce/ContractLineItem/index.html +53 -60
  123. package/app/m/commerce/Customer/index.html +52 -59
  124. package/app/m/commerce/DocumentTax/index.html +89 -0
  125. package/app/m/commerce/Estimate/index.html +52 -59
  126. package/app/m/commerce/Fulfillment/index.html +52 -59
  127. package/app/m/commerce/FulfillmentLineItem/index.html +53 -60
  128. package/app/m/commerce/Invoice/index.html +52 -59
  129. package/app/m/commerce/InvoiceLineItem/index.html +53 -60
  130. package/app/m/commerce/Lease/index.html +52 -59
  131. package/app/m/commerce/LicenseSale/index.html +52 -59
  132. package/app/m/commerce/Order/index.html +52 -59
  133. package/app/m/commerce/Payment/index.html +52 -59
  134. package/app/m/commerce/PaymentAllocation/index.html +53 -60
  135. package/app/m/commerce/PaymentInstrument/index.html +52 -59
  136. package/app/m/commerce/PaymentIntent/index.html +52 -59
  137. package/app/m/commerce/Payout/index.html +52 -59
  138. package/app/m/commerce/ProductionOrder/index.html +52 -59
  139. package/app/m/commerce/PurchaseContract/index.html +89 -0
  140. package/app/m/commerce/PurchaseOrder/index.html +52 -59
  141. package/app/m/commerce/SalesContract/index.html +89 -0
  142. package/app/m/commerce/SupplierQuote/index.html +89 -0
  143. package/app/m/commerce/TaxCode/index.html +89 -0
  144. package/app/m/commerce/TaxComponent/index.html +89 -0
  145. package/app/m/commerce/TaxSettings/index.html +89 -0
  146. package/app/m/commerce/TaxSummaryReport/index.html +89 -0
  147. package/app/m/commerce/Vendor/index.html +52 -59
  148. package/app/m/commerce/WholesaleOrder/index.html +52 -59
  149. package/app/m/content/Content/index.html +52 -59
  150. package/app/m/content/ContentContribution/index.html +52 -59
  151. package/app/m/content/ContentContributionAttachment/index.html +52 -59
  152. package/app/m/content/ContentContributionRevision/index.html +52 -59
  153. package/app/m/content/ContentContributionType/index.html +52 -59
  154. package/app/m/content/ContentContributor/index.html +52 -59
  155. package/app/m/content/ContentCorrection/index.html +52 -59
  156. package/app/m/content/ContentFeedSource/index.html +52 -59
  157. package/app/m/content/ContentGovernanceAssignment/index.html +52 -59
  158. package/app/m/content/ContentGovernancePolicy/index.html +52 -59
  159. package/app/m/content/ContentGovernanceProfile/index.html +52 -59
  160. package/app/m/content/ContentReference/index.html +52 -59
  161. package/app/m/content/ContentReview/index.html +52 -59
  162. package/app/m/content/ContentVersion/index.html +52 -59
  163. package/app/m/events/Event/index.html +52 -59
  164. package/app/m/events/EventParticipant/index.html +53 -60
  165. package/app/m/events/EventSeries/index.html +52 -59
  166. package/app/m/events/EventType/index.html +52 -59
  167. package/app/m/expenses/Expense/index.html +89 -0
  168. package/app/m/facts/Fact/index.html +52 -59
  169. package/app/m/facts/FactContent/index.html +52 -59
  170. package/app/m/facts/FactEvidence/index.html +52 -59
  171. package/app/m/facts/FactSource/index.html +52 -59
  172. package/app/m/facts/FactSubject/index.html +52 -59
  173. package/app/m/facts/FactTag/index.html +52 -59
  174. package/app/m/fields/FieldPolicy/index.html +52 -59
  175. package/app/m/fields/FieldPolicySuggestion/index.html +52 -59
  176. package/app/m/fields/FieldUsageCounter/index.html +52 -59
  177. package/app/m/images/Image/index.html +52 -59
  178. package/app/m/inventory/InventoryLocation/index.html +52 -59
  179. package/app/m/inventory/StockLevel/index.html +52 -59
  180. package/app/m/inventory/StockMovement/index.html +52 -59
  181. package/app/m/ledgers/Account/index.html +52 -59
  182. package/app/m/ledgers/Journal/index.html +52 -59
  183. package/app/m/ledgers/JournalEntry/index.html +53 -60
  184. package/app/m/manufacturing/Assembly/index.html +52 -59
  185. package/app/m/manufacturing/BillOfMaterials/index.html +52 -59
  186. package/app/m/manufacturing/BomLine/index.html +52 -59
  187. package/app/m/manufacturing/Operation/index.html +52 -59
  188. package/app/m/manufacturing/ProductionRun/index.html +52 -59
  189. package/app/m/manufacturing/ProductionRunCompletion/index.html +52 -59
  190. package/app/m/manufacturing/RoutingStep/index.html +52 -59
  191. package/app/m/marketing/Campaign/index.html +52 -59
  192. package/app/m/marketing/CampaignChannel/index.html +52 -59
  193. package/app/m/marketing/CampaignMetricSnapshot/index.html +52 -59
  194. package/app/m/messages/Account/index.html +52 -59
  195. package/app/m/messages/Attachment/index.html +52 -59
  196. package/app/m/messages/Blacklist/index.html +52 -59
  197. package/app/m/messages/Email/failed-sends/index.html +54 -59
  198. package/app/m/messages/Email/index.html +52 -59
  199. package/app/m/messages/Email/mailbox/index.html +54 -59
  200. package/app/m/messages/EmailAccount/index.html +52 -59
  201. package/app/m/messages/EmailAttachment/index.html +89 -0
  202. package/app/m/messages/EmailFolder/index.html +52 -59
  203. package/app/m/messages/Message/index.html +52 -59
  204. package/app/m/messages/MessagingEndpoint/index.html +52 -59
  205. package/app/m/messages/PersonaMessageRoute/index.html +52 -59
  206. package/app/m/messages/SlackAccount/index.html +52 -59
  207. package/app/m/messages/SlackMessage/index.html +52 -59
  208. package/app/m/messages/TelegramAccount/index.html +52 -59
  209. package/app/m/messages/Tweet/index.html +52 -59
  210. package/app/m/messages/TwitterAccount/index.html +52 -59
  211. package/app/m/messages/Whitelist/index.html +52 -59
  212. package/app/m/messages/ZulipAccount/index.html +52 -59
  213. package/app/m/places/Place/index.html +52 -59
  214. package/app/m/places/PlaceType/index.html +52 -59
  215. package/app/m/products/Category/index.html +52 -59
  216. package/app/m/products/Material/index.html +52 -59
  217. package/app/m/products/Product/index.html +52 -59
  218. package/app/m/products/Product/ingredients/index.html +54 -59
  219. package/app/m/products/ProductVariant/index.html +53 -60
  220. package/app/m/products/Sku/index.html +53 -60
  221. package/app/m/profiles/ApiKey/index.html +52 -59
  222. package/app/m/profiles/Bot/index.html +52 -59
  223. package/app/m/profiles/MagicLinkToken/index.html +52 -59
  224. package/app/m/profiles/NostrIdentity/index.html +52 -59
  225. package/app/m/profiles/OidcIdentity/index.html +52 -59
  226. package/app/m/profiles/Organization/index.html +52 -59
  227. package/app/m/profiles/Person/index.html +52 -59
  228. package/app/m/profiles/Profile/index.html +52 -59
  229. package/app/m/profiles/ProfileMetadata/index.html +52 -59
  230. package/app/m/profiles/ProfileMetafield/index.html +52 -59
  231. package/app/m/profiles/ProfileRelationship/index.html +52 -59
  232. package/app/m/profiles/ProfileRelationshipTerm/index.html +52 -59
  233. package/app/m/profiles/ProfileRelationshipType/index.html +52 -59
  234. package/app/m/profiles/ProfileType/index.html +52 -59
  235. package/app/m/projects/Comment/index.html +53 -60
  236. package/app/m/projects/Issue/index.html +52 -59
  237. package/app/m/projects/Label/index.html +52 -59
  238. package/app/m/projects/Project/index.html +52 -59
  239. package/app/m/projects/ProjectIntegration/index.html +52 -59
  240. package/app/m/projects/PullRequest/index.html +52 -59
  241. package/app/m/projects/Repository/index.html +52 -59
  242. package/app/m/properties/Property/index.html +52 -59
  243. package/app/m/properties/Zone/index.html +52 -59
  244. package/app/m/reports/RuntimeReport/index.html +52 -59
  245. package/app/m/reports/SmrtPrincipalReportRefreshTask/index.html +52 -59
  246. package/app/m/reports/SmrtReportLock/index.html +52 -59
  247. package/app/m/reports/SmrtReportRefreshTask/index.html +52 -59
  248. package/app/m/reports/SmrtReportRun/index.html +52 -59
  249. package/app/m/reports/SmrtReportSchedule/index.html +52 -59
  250. package/app/m/reports/SmrtReportWatermark/index.html +52 -59
  251. package/app/m/sales/AttributionException/index.html +52 -59
  252. package/app/m/sales/AttributionPolicy/index.html +52 -59
  253. package/app/m/sales/Commission/index.html +52 -59
  254. package/app/m/sales/CommissionAdjustment/index.html +52 -59
  255. package/app/m/sales/CommissionPayout/index.html +52 -59
  256. package/app/m/sales/CommissionPlan/index.html +52 -59
  257. package/app/m/sales/Earner/index.html +52 -59
  258. package/app/m/sales/EarnerSourceAttribution/index.html +52 -59
  259. package/app/m/sales/EarningEvent/index.html +52 -59
  260. package/app/m/sales/ExecutedAgreement/index.html +52 -59
  261. package/app/m/sales/Lead/index.html +52 -59
  262. package/app/m/sales/Opportunity/index.html +52 -59
  263. package/app/m/sales/OpportunityConversion/index.html +52 -59
  264. package/app/m/sales/PipelineDefinition/index.html +52 -59
  265. package/app/m/sales/PipelineStage/index.html +53 -60
  266. package/app/m/sales/Referral/index.html +52 -59
  267. package/app/m/sales/ReferralAgreement/index.html +52 -59
  268. package/app/m/sales/ReferralLink/index.html +52 -59
  269. package/app/m/sales/ReferralProgram/index.html +52 -59
  270. package/app/m/sales/ReferralTermSnapshot/index.html +52 -59
  271. package/app/m/sales/ReferralTouch/index.html +52 -59
  272. package/app/m/sales/Referrer/index.html +52 -59
  273. package/app/m/sales/SalesActivity/index.html +52 -59
  274. package/app/m/sales/SalesRepresentative/index.html +52 -59
  275. package/app/m/sites/Site/index.html +52 -59
  276. package/app/m/sites/SiteAgentBinding/index.html +52 -59
  277. package/app/m/social/OAuthState/index.html +52 -59
  278. package/app/m/social/SocialAccount/index.html +52 -59
  279. package/app/m/social/SocialPost/index.html +52 -59
  280. package/app/m/social/SocialPostAnalyticsSnapshot/index.html +52 -59
  281. package/app/m/subscriptions/BillingAdjustment/index.html +52 -59
  282. package/app/m/subscriptions/ClientCharge/index.html +52 -59
  283. package/app/m/subscriptions/CreditGrant/index.html +52 -59
  284. package/app/m/subscriptions/PricingRule/index.html +52 -59
  285. package/app/m/subscriptions/RetailCharge/index.html +52 -59
  286. package/app/m/subscriptions/SpendingPolicy/index.html +52 -59
  287. package/app/m/subscriptions/SubscriptionPlan/index.html +52 -59
  288. package/app/m/subscriptions/TenantSubscription/index.html +52 -59
  289. package/app/m/subscriptions/TenantUsageMetric/index.html +52 -59
  290. package/app/m/support/ServiceTimeEntry/index.html +52 -59
  291. package/app/m/support/SupportAiRun/index.html +52 -59
  292. package/app/m/support/SupportAvailability/index.html +52 -59
  293. package/app/m/support/SupportCase/index.html +52 -59
  294. package/app/m/support/SupportCaseEvent/index.html +52 -59
  295. package/app/m/support/SupportChannelBinding/index.html +52 -59
  296. package/app/m/support/SupportCharge/index.html +52 -59
  297. package/app/m/support/SupportCompensation/index.html +52 -59
  298. package/app/m/support/SupportCompensationPlan/index.html +52 -59
  299. package/app/m/support/SupportEscalation/index.html +52 -59
  300. package/app/m/support/SupportInteraction/index.html +52 -59
  301. package/app/m/support/SupportPlan/index.html +52 -59
  302. package/app/m/support/SupportPolicy/index.html +52 -59
  303. package/app/m/support/SupportQualification/index.html +52 -59
  304. package/app/m/support/SupportServiceTarget/index.html +52 -59
  305. package/app/m/support/SupportSpecialist/index.html +52 -59
  306. package/app/m/support/SupportWorkLink/index.html +52 -59
  307. package/app/m/tags/Tag/index.html +52 -59
  308. package/app/m/tags/TagAlias/index.html +52 -59
  309. package/app/m/timesheets/AttendanceBreak/index.html +52 -59
  310. package/app/m/timesheets/AttendancePunch/index.html +52 -59
  311. package/app/m/timesheets/AttendanceSegment/index.html +89 -0
  312. package/app/m/timesheets/ServiceChargeSnapshot/index.html +52 -59
  313. package/app/m/timesheets/ServiceCompensationSnapshot/index.html +52 -59
  314. package/app/m/timesheets/ServiceTimeEntry/index.html +52 -59
  315. package/app/m/users/Group/index.html +52 -59
  316. package/app/m/users/GroupMember/index.html +52 -59
  317. package/app/m/users/GroupRole/index.html +52 -59
  318. package/app/m/users/Membership/index.html +53 -60
  319. package/app/m/users/MembershipOverride/index.html +52 -59
  320. package/app/m/users/Permission/index.html +52 -59
  321. package/app/m/users/Role/index.html +52 -59
  322. package/app/m/users/RolePermission/index.html +52 -59
  323. package/app/m/users/Session/index.html +52 -59
  324. package/app/m/users/Tenant/index.html +52 -59
  325. package/app/m/users/TenantIntegration/index.html +52 -59
  326. package/app/m/users/TenantPermissionOverride/index.html +52 -59
  327. package/app/m/users/User/index.html +52 -59
  328. package/app/m/video/Character/index.html +52 -59
  329. package/app/m/video/CharacterAsset/index.html +52 -59
  330. package/app/m/video/CompositeJob/index.html +52 -59
  331. package/app/m/video/Performer/index.html +52 -59
  332. package/app/m/video/PerformerAsset/index.html +52 -59
  333. package/app/m/video/Scene/index.html +52 -59
  334. package/app/m/video/SceneAsset/index.html +52 -59
  335. package/app/m/video/VideoComposition/index.html +52 -59
  336. package/app/m/video/VideoCompositionAsset/index.html +52 -59
  337. package/app/m/video/VideoSequence/index.html +52 -59
  338. package/app/m/video/VideoSequenceAsset/index.html +52 -59
  339. package/app/m/video/VideoShot/index.html +52 -59
  340. package/app/m/video/VideoShotAsset/index.html +52 -59
  341. package/app/m/video/VideoShotCharacter/index.html +52 -59
  342. package/app/m/video/VideoWorkflow/index.html +52 -59
  343. package/app/m/voice/VoiceOutput/index.html +52 -59
  344. package/app/m/voice/VoiceProfile/index.html +52 -59
  345. package/app/m/voice/VoiceSample/index.html +52 -59
  346. package/app/packages/ads/index.html +50 -57
  347. package/app/packages/analytics/index.html +50 -57
  348. package/app/packages/approvals/index.html +50 -57
  349. package/app/packages/assets/index.html +50 -57
  350. package/app/packages/chat/index.html +50 -57
  351. package/app/packages/comments/index.html +50 -57
  352. package/app/packages/commerce/index.html +50 -57
  353. package/app/packages/content/index.html +50 -57
  354. package/app/packages/events/index.html +50 -57
  355. package/app/packages/expenses/index.html +50 -57
  356. package/app/packages/facts/index.html +50 -57
  357. package/app/packages/fields/index.html +50 -57
  358. package/app/packages/human-resources/index.html +50 -57
  359. package/app/packages/images/index.html +50 -57
  360. package/app/packages/index.html +49 -55
  361. package/app/packages/ingestion/index.html +85 -0
  362. package/app/packages/inventory/index.html +50 -57
  363. package/app/packages/ledgers/index.html +50 -57
  364. package/app/packages/manufacturing/index.html +50 -57
  365. package/app/packages/marketing/index.html +50 -57
  366. package/app/packages/messages/index.html +50 -57
  367. package/app/packages/places/index.html +50 -57
  368. package/app/packages/preferences/index.html +50 -57
  369. package/app/packages/products/index.html +50 -57
  370. package/app/packages/profiles/index.html +50 -57
  371. package/app/packages/projects/index.html +50 -57
  372. package/app/packages/properties/index.html +50 -57
  373. package/app/packages/reports/index.html +50 -57
  374. package/app/packages/sales/index.html +50 -57
  375. package/app/packages/sites/index.html +50 -57
  376. package/app/packages/social/index.html +50 -57
  377. package/app/packages/subscriptions/index.html +50 -57
  378. package/app/packages/support/index.html +50 -57
  379. package/app/packages/tags/index.html +50 -57
  380. package/app/packages/timesheets/index.html +50 -57
  381. package/app/packages/users/index.html +50 -57
  382. package/app/packages/video/index.html +50 -57
  383. package/app/packages/voice/index.html +50 -57
  384. package/app/packages/webhooks/index.html +85 -0
  385. package/app/recipes/account-access/help/index.html +52 -57
  386. package/app/recipes/account-access/index.html +57 -59
  387. package/app/recipes/activity/help/index.html +52 -57
  388. package/app/recipes/activity/index.html +57 -59
  389. package/app/recipes/agreements/help/index.html +52 -57
  390. package/app/recipes/agreements/index.html +57 -59
  391. package/app/recipes/analytics.reports/help/index.html +52 -57
  392. package/app/recipes/analytics.reports/index.html +57 -59
  393. package/app/recipes/assets/help/index.html +52 -57
  394. package/app/recipes/assets/index.html +57 -59
  395. package/app/recipes/billing/help/index.html +52 -57
  396. package/app/recipes/billing/index.html +57 -59
  397. package/app/recipes/chat.assistant/help/index.html +52 -57
  398. package/app/recipes/chat.assistant/index.html +57 -59
  399. package/app/recipes/comments/help/index.html +52 -57
  400. package/app/recipes/comments/index.html +57 -59
  401. package/app/recipes/commerce.customers/help/index.html +52 -57
  402. package/app/recipes/commerce.customers/index.html +57 -59
  403. package/app/recipes/commerce.estimates/help/index.html +52 -57
  404. package/app/recipes/commerce.estimates/index.html +57 -59
  405. package/app/recipes/commerce.purchases/help/index.html +52 -57
  406. package/app/recipes/commerce.purchases/index.html +57 -59
  407. package/app/recipes/commerce.sales/help/index.html +52 -57
  408. package/app/recipes/commerce.sales/index.html +57 -59
  409. package/app/recipes/commerce.vendors/help/index.html +52 -57
  410. package/app/recipes/commerce.vendors/index.html +57 -59
  411. package/app/recipes/commerce.wholesale/help/index.html +52 -57
  412. package/app/recipes/commerce.wholesale/index.html +57 -59
  413. package/app/recipes/events.calendar/help/index.html +52 -57
  414. package/app/recipes/events.calendar/index.html +57 -59
  415. package/app/recipes/expenses.tracking/help/index.html +88 -0
  416. package/app/recipes/expenses.tracking/index.html +92 -0
  417. package/app/recipes/fields.form-customization/help/index.html +52 -57
  418. package/app/recipes/fields.form-customization/index.html +57 -59
  419. package/app/recipes/ingestion/help/index.html +88 -0
  420. package/app/recipes/ingestion/index.html +93 -0
  421. package/app/recipes/integrations/help/index.html +88 -0
  422. package/app/recipes/integrations/index.html +92 -0
  423. package/app/recipes/inventory.stock/help/index.html +52 -57
  424. package/app/recipes/inventory.stock/index.html +57 -59
  425. package/app/recipes/ledgers.bookkeeping/help/index.html +52 -57
  426. package/app/recipes/ledgers.bookkeeping/index.html +57 -59
  427. package/app/recipes/messages/help/index.html +52 -57
  428. package/app/recipes/messages/index.html +57 -59
  429. package/app/recipes/products/help/index.html +52 -57
  430. package/app/recipes/products/index.html +57 -59
  431. package/app/recipes/projects.tracker/help/index.html +52 -57
  432. package/app/recipes/projects.tracker/index.html +57 -59
  433. package/app/recipes/reports.materialized/help/index.html +52 -57
  434. package/app/recipes/reports.materialized/index.html +57 -59
  435. package/app/recipes/reports.runtime/help/index.html +88 -0
  436. package/app/recipes/reports.runtime/index.html +92 -0
  437. package/app/recipes/sales.pipeline/help/index.html +52 -57
  438. package/app/recipes/sales.pipeline/index.html +57 -59
  439. package/app/recipes/tags.taxonomy/help/index.html +52 -57
  440. package/app/recipes/tags.taxonomy/index.html +57 -59
  441. package/app/recipes/team-collaboration/help/index.html +52 -57
  442. package/app/recipes/team-collaboration/index.html +57 -59
  443. package/app/recipes/timesheets.time-entries/help/index.html +88 -0
  444. package/app/recipes/timesheets.time-entries/index.html +92 -0
  445. package/app/s/custom-accounts/index.html +82 -0
  446. package/app/s/custom-appointments/index.html +82 -0
  447. package/app/s/custom-billing/index.html +47 -54
  448. package/app/s/custom-buying/index.html +47 -54
  449. package/app/s/custom-checkout/index.html +82 -0
  450. package/app/s/custom-classes/index.html +47 -54
  451. package/app/s/custom-clients/index.html +82 -0
  452. package/app/s/custom-events/index.html +82 -0
  453. package/app/s/custom-fleet/index.html +82 -0
  454. package/app/s/custom-giving/index.html +82 -0
  455. package/app/s/custom-jobs/index.html +47 -54
  456. package/app/s/custom-kitchen/index.html +47 -54
  457. package/app/s/custom-material/index.html +47 -54
  458. package/app/s/custom-meetings/index.html +82 -0
  459. package/app/s/custom-members/index.html +47 -54
  460. package/app/s/custom-parts/index.html +47 -54
  461. package/app/s/custom-rentals/index.html +82 -0
  462. package/app/s/custom-roastery/index.html +82 -0
  463. package/app/s/custom-schedule/index.html +47 -54
  464. package/app/s/custom-shelf/index.html +82 -0
  465. package/app/s/custom-shop/index.html +47 -54
  466. package/app/s/custom-wholesale/index.html +47 -54
  467. package/app/s/custom-work/index.html +82 -0
  468. package/app/s/custom-yard/index.html +82 -0
  469. package/app/s/section-access-control/index.html +47 -54
  470. package/app/s/section-account-security/index.html +47 -54
  471. package/app/s/section-accounting/index.html +47 -54
  472. package/app/s/section-activity/index.html +47 -54
  473. package/app/s/section-agreements/index.html +47 -54
  474. package/app/s/section-analytics/index.html +47 -54
  475. package/app/s/section-assets/index.html +47 -54
  476. package/app/s/section-billing/index.html +47 -54
  477. package/app/s/section-calendar/index.html +47 -54
  478. package/app/s/section-catalog/index.html +47 -54
  479. package/app/s/section-chat.assistant/index.html +47 -54
  480. package/app/s/section-comments/index.html +47 -54
  481. package/app/s/section-fields.form-customization/index.html +47 -54
  482. package/app/s/section-ingestion/index.html +82 -0
  483. package/app/s/section-integrations/index.html +82 -0
  484. package/app/s/section-messages/index.html +47 -54
  485. package/app/s/section-more/index.html +47 -54
  486. package/app/s/section-operations/index.html +47 -54
  487. package/app/s/section-projects/index.html +47 -54
  488. package/app/s/section-purchasing/index.html +47 -54
  489. package/app/s/section-reports.materialized/index.html +47 -54
  490. package/app/s/section-reports.runtime/index.html +82 -0
  491. package/app/s/section-sales/index.html +47 -54
  492. package/app/s/section-taxonomy/index.html +47 -54
  493. package/app/s/section-team/index.html +47 -54
  494. package/app/s/section-work/index.html +82 -0
  495. package/dist/ai/state.svelte.d.ts +22 -4
  496. package/dist/ai/state.svelte.js +78 -15
  497. package/dist/ai/status.js +8 -0
  498. package/dist/assistant/change.d.ts +14 -3
  499. package/dist/assistant/change.js +26 -3
  500. package/dist/assistant/engine.js +5 -1
  501. package/dist/assistant/prompt.js +7 -3
  502. package/dist/assistant/session.svelte.d.ts +1 -0
  503. package/dist/assistant/session.svelte.js +22 -4
  504. package/dist/catalog/catalog.json +11244 -14189
  505. package/dist/catalog/generate/exclusions.d.ts +8 -0
  506. package/dist/catalog/generate/exclusions.js +29 -0
  507. package/dist/catalog/generate/extract.js +29 -8
  508. package/dist/catalog/types.d.ts +7 -0
  509. package/dist/components/AdvancedStyles.svelte +138 -0
  510. package/dist/components/AdvancedStyles.svelte.d.ts +6 -0
  511. package/dist/components/AiModelsPage.svelte +40 -0
  512. package/dist/components/AiModelsPage.svelte.d.ts +7 -0
  513. package/dist/components/AiSetup.svelte +40 -8
  514. package/dist/components/AiStatusIcons.svelte +8 -5
  515. package/dist/components/AppSettings.svelte +105 -1
  516. package/dist/components/BrowserAssistant.svelte +25 -22
  517. package/dist/components/BrowserAssistant.svelte.d.ts +2 -0
  518. package/dist/components/ChildRecords.svelte +61 -14
  519. package/dist/components/ChildRecords.svelte.d.ts +1 -0
  520. package/dist/components/ConnectTools.svelte +5 -2
  521. package/dist/components/CookbooksPanel.svelte +56 -33
  522. package/dist/components/CopyButton.svelte +65 -0
  523. package/dist/components/CopyButton.svelte.d.ts +24 -0
  524. package/dist/components/ExportPanel.svelte +292 -57
  525. package/dist/components/ExportPanel.svelte.d.ts +10 -1
  526. package/dist/components/FeatureCard.svelte +21 -10
  527. package/dist/components/FeaturesPanel.svelte +4 -1
  528. package/dist/components/FieldInput.svelte +6 -3
  529. package/dist/components/FieldMapForm.svelte +6 -10
  530. package/dist/components/FieldMapForm.svelte.d.ts +1 -0
  531. package/dist/components/FormWorkspace.svelte +80 -9
  532. package/dist/components/FormWorkspace.svelte.d.ts +1 -0
  533. package/dist/components/HeaderIconLink.svelte +86 -0
  534. package/dist/components/HeaderIconLink.svelte.d.ts +14 -0
  535. package/dist/components/HelpView.svelte +3 -0
  536. package/dist/components/ModelOptions.svelte +13 -2
  537. package/dist/components/ModelPage.svelte +33 -5
  538. package/dist/components/ModelPage.svelte.d.ts +4 -0
  539. package/dist/components/ModelWorkspace.svelte +148 -50
  540. package/dist/components/ModelWorkspace.svelte.d.ts +4 -0
  541. package/dist/components/PackagePage.svelte +96 -0
  542. package/dist/components/PackagePage.svelte.d.ts +9 -0
  543. package/dist/components/ProductMedia.svelte +95 -0
  544. package/dist/components/ProductMedia.svelte.d.ts +10 -0
  545. package/dist/components/RecipeCards.svelte +13 -1
  546. package/dist/components/RecipeHelp.svelte +3 -0
  547. package/dist/components/RecipeOptions.svelte +13 -1
  548. package/dist/components/RecordFeatures.svelte +22 -8
  549. package/dist/components/RecordView.svelte +354 -0
  550. package/dist/components/RecordView.svelte.d.ts +14 -0
  551. package/dist/components/RelationField.svelte +5 -2
  552. package/dist/components/SectionActions.svelte +8 -5
  553. package/dist/components/SectionHeading.svelte +63 -0
  554. package/dist/components/SectionHeading.svelte.d.ts +11 -0
  555. package/dist/components/SectionIcons.svelte +15 -3
  556. package/dist/components/SectionOverview.svelte +33 -3
  557. package/dist/components/SectionOverview.svelte.d.ts +4 -0
  558. package/dist/components/SectionPage.svelte +25 -165
  559. package/dist/components/SectionView.svelte +172 -0
  560. package/dist/components/SectionView.svelte.d.ts +18 -0
  561. package/dist/components/SettingsPanel.svelte +3 -9
  562. package/dist/components/SettingsPanel.svelte.d.ts +1 -5
  563. package/dist/components/ThemeBridge.svelte +80 -4
  564. package/dist/components/ThemeBridge.svelte.d.ts +5 -1
  565. package/dist/components/ThemeSection.svelte +208 -117
  566. package/dist/components/ThemeSection.svelte.d.ts +3 -7
  567. package/dist/components/VariantGridForm.svelte +9 -13
  568. package/dist/components/VariantGridForm.svelte.d.ts +1 -0
  569. package/dist/components/VoiceTyping.svelte +3 -0
  570. package/dist/cookbook/describe.d.ts +29 -0
  571. package/dist/cookbook/describe.js +164 -0
  572. package/dist/cookbook/file.d.ts +6 -0
  573. package/dist/cookbook/file.js +18 -4
  574. package/dist/cookbook/prompt.d.ts +49 -0
  575. package/dist/cookbook/prompt.js +100 -0
  576. package/dist/cookbook/store.svelte.d.ts +13 -0
  577. package/dist/cookbook/store.svelte.js +36 -8
  578. package/dist/core/app.d.ts +33 -8
  579. package/dist/core/app.js +112 -8
  580. package/dist/core/prompt.js +10 -1
  581. package/dist/core/reply.d.ts +6 -1
  582. package/dist/data/children.d.ts +50 -6
  583. package/dist/data/children.js +146 -16
  584. package/dist/data/derived.d.ts +37 -29
  585. package/dist/data/derived.js +49 -30
  586. package/dist/data/display.d.ts +21 -8
  587. package/dist/data/display.js +74 -11
  588. package/dist/data/fakes.d.ts +48 -9
  589. package/dist/data/fakes.js +146 -22
  590. package/dist/data/labels.d.ts +7 -2
  591. package/dist/data/labels.js +12 -2
  592. package/dist/data/list-sort.d.ts +8 -0
  593. package/dist/data/list-sort.js +45 -0
  594. package/dist/data/money.d.ts +227 -0
  595. package/dist/data/money.js +413 -0
  596. package/dist/data/packs.d.ts +13 -0
  597. package/dist/data/packs.js +1224 -0
  598. package/dist/data/planner-source.js +123 -3
  599. package/dist/data/source.d.ts +13 -2
  600. package/dist/data/source.js +274 -40
  601. package/dist/features/palette.d.ts +2 -0
  602. package/dist/features/palette.js +1 -1
  603. package/dist/forms/stock.d.ts +1 -1
  604. package/dist/forms/stock.js +3 -1
  605. package/dist/index.d.ts +8 -3
  606. package/dist/index.js +6 -1
  607. package/dist/inference/byo.svelte.d.ts +8 -4
  608. package/dist/inference/byo.svelte.js +36 -8
  609. package/dist/inference/config.d.ts +12 -5
  610. package/dist/inference/config.js +96 -40
  611. package/dist/inference/openai.js +5 -0
  612. package/dist/kitchen/LiveKitchenBridge.svelte +73 -0
  613. package/dist/kitchen/LiveKitchenBridge.svelte.d.ts +8 -0
  614. package/dist/kitchen/client.js +10 -4
  615. package/dist/kitchen/live.d.ts +7 -0
  616. package/dist/kitchen/live.js +51 -0
  617. package/dist/library/icons.js +34 -0
  618. package/dist/library/library.json +1546 -15
  619. package/dist/library/pending.json +5 -0
  620. package/dist/library/types.d.ts +4 -0
  621. package/dist/motion/tokens.d.ts +6 -0
  622. package/dist/motion/tokens.js +32 -0
  623. package/dist/motion/view-transition.d.ts +13 -0
  624. package/dist/motion/view-transition.js +17 -0
  625. package/dist/overviews/definitions.d.ts +41 -2
  626. package/dist/overviews/definitions.js +111 -4
  627. package/dist/overviews/models.d.ts +10 -0
  628. package/dist/overviews/models.js +19 -0
  629. package/dist/overviews/registry.d.ts +92 -5
  630. package/dist/overviews/registry.js +468 -58
  631. package/dist/overviews/validate.js +2 -2
  632. package/dist/planner/Planner.svelte +374 -166
  633. package/dist/planner/PlannerControls.svelte +255 -0
  634. package/dist/planner/PlannerControls.svelte.d.ts +17 -0
  635. package/dist/planner/PlannerLifecycle.svelte +73 -0
  636. package/dist/planner/PlannerLifecycle.svelte.d.ts +9 -0
  637. package/dist/planner/app.svelte.d.ts +12 -2
  638. package/dist/planner/app.svelte.js +13 -3
  639. package/dist/planner/assistant.js +21 -3
  640. package/dist/planner/commands/adapter.js +9 -2
  641. package/dist/planner/commands/types.d.ts +1 -1
  642. package/dist/planner/commands/types.js +1 -0
  643. package/dist/planner/header-icons.d.ts +12 -0
  644. package/dist/planner/header-icons.js +12 -0
  645. package/dist/planner/host/HostPlanner.svelte +70 -0
  646. package/dist/planner/host/HostPlanner.svelte.d.ts +17 -0
  647. package/dist/planner/host/session.svelte.d.ts +28 -0
  648. package/dist/planner/host/session.svelte.js +186 -0
  649. package/dist/planner/routes.d.ts +49 -0
  650. package/dist/planner/routes.js +64 -0
  651. package/dist/planner/shell.d.ts +40 -0
  652. package/dist/planner/shell.js +56 -0
  653. package/dist/planner/tab.svelte.d.ts +6 -3
  654. package/dist/planner/tab.svelte.js +11 -4
  655. package/dist/planner/title.d.ts +15 -0
  656. package/dist/planner/title.js +21 -0
  657. package/dist/planner/title.svelte.d.ts +6 -0
  658. package/dist/planner/title.svelte.js +11 -0
  659. package/dist/planner/types.d.ts +39 -7
  660. package/dist/products/media.d.ts +20 -0
  661. package/dist/products/media.js +65 -0
  662. package/dist/recipes/help/descriptions.json +1 -3
  663. package/dist/recipes/index.d.ts +2 -0
  664. package/dist/recipes/index.js +6 -0
  665. package/dist/recipes/plumbing.d.ts +35 -1
  666. package/dist/recipes/plumbing.js +74 -0
  667. package/dist/screens/definition.d.ts +35 -0
  668. package/dist/screens/definition.js +132 -0
  669. package/dist/screens/relations.d.ts +17 -0
  670. package/dist/screens/relations.js +98 -0
  671. package/dist/screens/totals.d.ts +37 -0
  672. package/dist/screens/totals.js +65 -0
  673. package/dist/sections/info.d.ts +1 -1
  674. package/dist/sections/info.js +2 -2
  675. package/dist/settings/app-settings.d.ts +17 -1
  676. package/dist/settings/app-settings.js +40 -3
  677. package/dist/smrt-version.d.ts +2 -0
  678. package/dist/smrt-version.js +4 -0
  679. package/dist/styles/planner-forms.css +53 -0
  680. package/dist/styles/planner-lists.css +43 -0
  681. package/dist/theme/css-highlight.d.ts +6 -0
  682. package/dist/theme/css-highlight.js +34 -0
  683. package/dist/theme/custom-css.svelte.d.ts +34 -0
  684. package/dist/theme/custom-css.svelte.js +246 -0
  685. package/dist/theme/runtime.js +25 -5
  686. package/dist/theme/theme.d.ts +26 -3
  687. package/dist/theme/theme.js +70 -2
  688. package/dist/upstream/overlay.d.ts +14 -5
  689. package/dist/upstream/overlay.js +20 -2
  690. package/package.json +13 -6
  691. package/app/_app/immutable/assets/0.B5zXkXe_.css +0 -1
  692. package/app/_app/immutable/assets/10.hpcnxvK1.css +0 -1
  693. package/app/_app/immutable/assets/11.D7zoXfVV.css +0 -1
  694. package/app/_app/immutable/assets/12.CPobm1ED.css +0 -1
  695. package/app/_app/immutable/assets/2.CyaWdRdI.css +0 -1
  696. package/app/_app/immutable/assets/3.BlPQOes8.css +0 -1
  697. package/app/_app/immutable/assets/8.2gQeKBp_.css +0 -1
  698. package/app/_app/immutable/assets/9.HOPT4xtg.css +0 -1
  699. package/app/_app/immutable/assets/AiSetup.Cb22AigN.css +0 -1
  700. package/app/_app/immutable/assets/Button.DkP0qkG9.css +0 -1
  701. package/app/_app/immutable/assets/ConnectTools.BgIJOOGW.css +0 -1
  702. package/app/_app/immutable/assets/FieldMapForm.BCU-4pO4.css +0 -1
  703. package/app/_app/immutable/assets/ModelPage.Dd3LcMta.css +0 -1
  704. package/app/_app/immutable/assets/SectionActions.CTkVuNMF.css +0 -1
  705. package/app/_app/immutable/assets/SectionIcons.5Udq9vN-.css +0 -1
  706. package/app/_app/immutable/assets/SegmentedControl.B8SrQacd.css +0 -1
  707. package/app/_app/immutable/assets/dist.C5nHBk_O.css +0 -1
  708. package/app/_app/immutable/assets/feedback.BVKAwFck.css +0 -1
  709. package/app/_app/immutable/assets/forms.BChZ2RWM.css +0 -1
  710. package/app/_app/immutable/assets/percent.LH0z-ozZ.css +0 -1
  711. package/app/_app/immutable/assets/store.CGDwHkkF.css +0 -1
  712. package/app/_app/immutable/assets/ui.B1A1Zl2p.css +0 -1
  713. package/app/_app/immutable/assets/workspace.BIMkuZDb.css +0 -1
  714. package/app/_app/immutable/chunks/1okeBSoq.js +0 -1
  715. package/app/_app/immutable/chunks/B32EWqI8.js +0 -9
  716. package/app/_app/immutable/chunks/B4Kevpe0.js +0 -1
  717. package/app/_app/immutable/chunks/BKwRT_1p.js +0 -1
  718. package/app/_app/immutable/chunks/BS4h9ES-.js +0 -1
  719. package/app/_app/immutable/chunks/BYde9M_U.js +0 -1
  720. package/app/_app/immutable/chunks/CMhpRMKg.js +0 -1
  721. package/app/_app/immutable/chunks/CPRHZZeW.js +0 -1
  722. package/app/_app/immutable/chunks/CRQ1Pmzr.js +0 -1
  723. package/app/_app/immutable/chunks/CV-2zt0K.js +0 -2
  724. package/app/_app/immutable/chunks/CWtfVMDz.js +0 -1
  725. package/app/_app/immutable/chunks/Chyo8rdT.js +0 -3
  726. package/app/_app/immutable/chunks/CmmuWmp6.js +0 -2
  727. package/app/_app/immutable/chunks/CrFNLK0f.js +0 -1
  728. package/app/_app/immutable/chunks/CygC84VT.js +0 -2
  729. package/app/_app/immutable/chunks/D0VgZnk1.js +0 -1
  730. package/app/_app/immutable/chunks/DD7gpKb2.js +0 -1
  731. package/app/_app/immutable/chunks/DJtH-lRi.js +0 -3
  732. package/app/_app/immutable/chunks/DNRgqfTx.js +0 -1
  733. package/app/_app/immutable/chunks/DVRKjN-E.js +0 -1
  734. package/app/_app/immutable/chunks/D_J_XtJy.js +0 -846
  735. package/app/_app/immutable/chunks/Dp9GVO-9.js +0 -1
  736. package/app/_app/immutable/chunks/DqcD-WtP.js +0 -1
  737. package/app/_app/immutable/chunks/OJ_lLTHH.js +0 -1
  738. package/app/_app/immutable/chunks/QukgIHDX.js +0 -1
  739. package/app/_app/immutable/chunks/WxSPP8QW.js +0 -4
  740. package/app/_app/immutable/chunks/leQCwW2d.js +0 -1
  741. package/app/_app/immutable/chunks/p6bgzXiY.js +0 -1
  742. package/app/_app/immutable/chunks/ufuM4XBq.js +0 -33
  743. package/app/_app/immutable/entry/app.D5JJain6.js +0 -2
  744. package/app/_app/immutable/entry/start.CH9DJLgI.js +0 -1
  745. package/app/_app/immutable/nodes/0.CL1MxOva.js +0 -10
  746. package/app/_app/immutable/nodes/1.BO731RRg.js +0 -1
  747. package/app/_app/immutable/nodes/10.1nQxyH9H.js +0 -4
  748. package/app/_app/immutable/nodes/11.Cw0JnQF3.js +0 -1
  749. package/app/_app/immutable/nodes/12.BmZyLHbM.js +0 -1
  750. package/app/_app/immutable/nodes/2.BEw046av.js +0 -17
  751. package/app/_app/immutable/nodes/3.DvwpTAQA.js +0 -1
  752. package/app/_app/immutable/nodes/4.qrT4bnmS.js +0 -1
  753. package/app/_app/immutable/nodes/5.DDLa2uhV.js +0 -1
  754. package/app/_app/immutable/nodes/6.DN0QTY6z.js +0 -1
  755. package/app/_app/immutable/nodes/7.C_8N82Wq.js +0 -1
  756. package/app/_app/immutable/nodes/8.D2Mszsua.js +0 -3
  757. package/app/_app/immutable/nodes/9.CLYsywul.js +0 -1
  758. package/app/m/content/Contents/index.html +0 -96
  759. package/app/m/preferences/UiPreferenceRecord/index.html +0 -96
  760. package/app/m/users/AccessRequest/index.html +0 -96
  761. package/app/m/users/ResourceGrant/index.html +0 -96
  762. package/app/m/users/UsersCliAuthRequest/index.html +0 -96
  763. package/app/m/users/UsersMagicLinkToken/index.html +0 -96
@@ -1,8 +1,3 @@
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
1
  import type { CatalogField, CatalogModel } from '../catalog/types.ts';
7
2
  export declare const DEFAULT_LABEL_FIELDS: readonly ["name", "title", "label", "code"];
8
3
  /** The fields that may label a record of the model, best first. */
@@ -11,13 +6,31 @@ export declare function labelFields(model: CatalogModel): string[];
11
6
  export declare function displayLabel(model: CatalogModel, record: Readonly<Record<string, unknown>>): string | undefined;
12
7
  /** Finds the label of the record a relation field points at. */
13
8
  export type RelatedLabel = (field: CatalogField, id: string) => string | undefined;
9
+ /**
10
+ * The field that identifies a document to a person (`invoiceNumber`, an
11
+ * order's `reference`): the first field the framework's field roles
12
+ * (`deriveFieldRoles`, smrt#3718) give the `identifier` role. `undefined`
13
+ * for a model with a name of its own: a product's `code` is a detail, its
14
+ * `name` is what it is called.
15
+ */
16
+ export declare function identifierField(model: CatalogModel): CatalogField | undefined;
17
+ /** A document's identifier value, e.g. `WIL-1133`; `undefined` when empty. */
18
+ export declare function identifierOf(model: CatalogModel, record: Readonly<Record<string, unknown>>): string | undefined;
14
19
  /** A record's own number, e.g. `invoiceNumber` or `number`. */
15
20
  export declare function numberOf(model: CatalogModel, record: Readonly<Record<string, unknown>>): string | undefined;
16
21
  /** The relation field that best says what a record is about, if it has one. */
17
22
  export declare function partyField(fields: readonly CatalogField[], record: Readonly<Record<string, unknown>>): CatalogField | undefined;
18
23
  /**
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.
24
+ * The text that names a record: its label field, else its identifier (a
25
+ * document is its number: `GRA-3159`, never `Ridgeline Construction ·
26
+ * GRA-3159`), else, for a money record such as a payment allocation, the party
27
+ * it is for with its amount and date, else the party and a description.
28
+ * `undefined` when nothing names it.
22
29
  */
23
30
  export declare function recordName(model: CatalogModel, record: Readonly<Record<string, unknown>>, related: RelatedLabel, fields?: readonly CatalogField[]): string | undefined;
31
+ /**
32
+ * A record page's heading: a document is its kind and identifier
33
+ * (`Order GRA-3159`), anything else its name. `kind` is the model's name
34
+ * as a person reads it ("Order", "Purchase order").
35
+ */
36
+ export declare function recordHeading(model: CatalogModel, record: Readonly<Record<string, unknown>>, name: string, kind: string): string;
@@ -1,3 +1,9 @@
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 { deriveFieldRoles, fieldWithRole, } from '@happyvertical/smrt-svelte/screens';
1
7
  import { formatMoney } from "./format.js";
2
8
  export const DEFAULT_LABEL_FIELDS = ['name', 'title', 'label', 'code'];
3
9
  /** The fields that may label a record of the model, best first. */
@@ -27,11 +33,55 @@ const PARTY_ORDER = [
27
33
  /^payment/i,
28
34
  /^contract/i,
29
35
  ];
36
+ /** A document's own number, e.g. `invoiceNumber` or `number`. */
37
+ const NUMBER_NAME = /(^|[a-z])Number$|^number$/;
38
+ /**
39
+ * The field that identifies a document to a person (`invoiceNumber`, an
40
+ * order's `reference`): the first field the framework's field roles
41
+ * (`deriveFieldRoles`, smrt#3718) give the `identifier` role. `undefined`
42
+ * for a model with a name of its own: a product's `code` is a detail, its
43
+ * `name` is what it is called.
44
+ */
45
+ export function identifierField(model) {
46
+ if (labelFields(model).some((name) => name !== 'code'))
47
+ return undefined;
48
+ const own = model.fields.filter((f) => !f.system);
49
+ const roles = deriveFieldRoles({
50
+ objectRef: model.id,
51
+ className: model.name,
52
+ fields: Object.fromEntries(own.map((f) => [
53
+ f.name,
54
+ {
55
+ type: SCREEN_TYPES.has(f.type) ? f.type : 'text',
56
+ ...(f.enum?.length ? { enum: f.enum } : {}),
57
+ ...(f.ui ? { ui: { ...f.ui } } : {}),
58
+ },
59
+ ])),
60
+ });
61
+ const name = fieldWithRole(roles, 'identifier');
62
+ return name ? own.find((f) => f.name === name) : undefined;
63
+ }
64
+ const SCREEN_TYPES = new Set([
65
+ 'text',
66
+ 'integer',
67
+ 'decimal',
68
+ 'boolean',
69
+ 'datetime',
70
+ 'json',
71
+ 'foreignKey',
72
+ 'crossPackageRef',
73
+ ]);
74
+ /** A document's identifier value, e.g. `WIL-1133`; `undefined` when empty. */
75
+ export function identifierOf(model, record) {
76
+ const field = identifierField(model);
77
+ const value = field ? record[field.name] : undefined;
78
+ return typeof value === 'string' && value.trim() !== '' ? value : undefined;
79
+ }
30
80
  /** A record's own number, e.g. `invoiceNumber` or `number`. */
31
81
  export function numberOf(model, record) {
32
82
  const field = model.fields.find((f) => !f.system &&
33
83
  f.type === 'text' &&
34
- /(^|[a-z])Number$|^number$/.test(f.name) &&
84
+ NUMBER_NAME.test(f.name) &&
35
85
  typeof record[f.name] === 'string' &&
36
86
  String(record[f.name]).trim() !== '');
37
87
  return field ? String(record[field.name]) : undefined;
@@ -48,21 +98,23 @@ export function partyField(fields, record) {
48
98
  }
49
99
  const DATE_NAME = /(paid|allocated|issue|^date$|createdat)/i;
50
100
  /**
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.
101
+ * The text that names a record: its label field, else its identifier (a
102
+ * document is its number: `GRA-3159`, never `Ridgeline Construction ·
103
+ * GRA-3159`), else, for a money record such as a payment allocation, the party
104
+ * it is for with its amount and date, else the party and a description.
105
+ * `undefined` when nothing names it.
54
106
  */
55
107
  export function recordName(model, record, related, fields = model.fields) {
56
108
  const own = displayLabel(model, record);
57
109
  if (own)
58
110
  return own;
111
+ const identifier = identifierOf(model, record);
112
+ if (identifier)
113
+ return identifier;
59
114
  const partyOf = partyField(fields, record);
60
115
  const party = partyOf?.related
61
116
  ? related(partyOf, String(record[partyOf.name]))
62
117
  : undefined;
63
- const number = numberOf(model, record);
64
- if (number)
65
- return unique([number, party]);
66
118
  const moneyField = model.fields.find((f) => f.name === 'amount' && f.type === 'integer');
67
119
  if (moneyField && typeof record.amount === 'number') {
68
120
  const dateField = model.fields.find((f) => f.type === 'datetime' && DATE_NAME.test(f.name) && record[f.name]);
@@ -72,10 +124,21 @@ export function recordName(model, record, related, fields = model.fields) {
72
124
  dateField ? String(record[dateField.name]).slice(0, 10) : undefined,
73
125
  ]);
74
126
  }
75
- const reference = ['reference', 'description']
76
- .map((name) => record[name])
77
- .find((v) => typeof v === 'string' && v.trim() !== '');
78
- return unique([party, reference]);
127
+ const description = typeof record.description === 'string' && record.description.trim() !== ''
128
+ ? record.description
129
+ : undefined;
130
+ return unique([party, description]);
131
+ }
132
+ /**
133
+ * A record page's heading: a document is its kind and identifier
134
+ * (`Order GRA-3159`), anything else its name. `kind` is the model's name
135
+ * as a person reads it ("Order", "Purchase order").
136
+ */
137
+ export function recordHeading(model, record, name, kind) {
138
+ if (displayLabel(model, record))
139
+ return name;
140
+ const identifier = identifierOf(model, record);
141
+ return identifier && identifier === name ? `${kind} ${identifier}` : name;
79
142
  }
80
143
  function unique(parts) {
81
144
  const kept = parts.filter((p) => Boolean(p));
@@ -10,8 +10,10 @@ export declare function createRandom(seed: number): () => number;
10
10
  /** FNV-1a hash of a string, for seeding. */
11
11
  export declare function hashString(value: string): number;
12
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.
13
+ * Money is stored as integer minor units (cents). An integer field is money
14
+ * when the manifest says so (`ui.format === 'money'`); a field that declares
15
+ * any other format is not, and neither is a framework-managed one. With no
16
+ * declared format the field's name decides.
15
17
  */
16
18
  export declare function isMoneyField(field: CatalogField): boolean;
17
19
  /**
@@ -25,18 +27,53 @@ export declare const PRODUCT_CATALOG: readonly {
25
27
  }[];
26
28
  /** Fixed clock so seeded timestamps never change between runs. */
27
29
  export declare const EPOCH: number;
30
+ /** Sample rows per model unless a pack or {@link SAMPLE_ROW_COUNTS} says otherwise. */
31
+ export declare const DEFAULT_SAMPLE_ROWS = 8;
28
32
  /** A UUID-shaped id derived from a seed string. */
29
33
  export declare function fakeId(seed: string): string;
30
34
  /** Fractions a tax rate takes: 0%, 5%, 8.25%, 13% and 20%. */
31
35
  export declare const TAX_RATES: readonly [0, 0.05, 0.0825, 0.13, 0.2];
36
+ /**
37
+ * The sample tax rate when neither the app's setting nor the pack names one:
38
+ * every line of every document is taxed at it, so a document's tax is one
39
+ * rate of its subtotal, as on a real invoice.
40
+ */
41
+ export declare const DEFAULT_SAMPLE_TAX_RATE = 0.05;
32
42
  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`. */
43
+ /**
44
+ * How many rows of each customer-linked model (orders, quotes, invoices,
45
+ * payments: any model with a FK to a Customer) point at each sample customer:
46
+ * 3 to 6, uneven, seeded by the customer's index so it never changes. The
47
+ * slots interleave (every customer once, then again...), so a list's first
48
+ * rows still show different customers and row `n < customers` points at
49
+ * customer `n`.
50
+ */
51
+ export declare function customerSlots(customers: number): readonly number[];
52
+ /**
53
+ * Sample rows for a model: the pack's count, else the shared one, else, for a
54
+ * customer-linked model, one per {@link customerSlots} slot, else `fallback`.
55
+ */
34
56
  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: {
57
+ /**
58
+ * Which row of the target a sample relation points at. Rows are seeded with
59
+ * ids from `(model, index)`, so pointing at index `n` points at a real row;
60
+ * spread over every row of the target, so each sample record has related
61
+ * records (a customer several orders, quotes and invoices), not just the
62
+ * first few.
63
+ */
64
+ export declare function relatedIndex(field: CatalogField, context: FakeContext): number;
65
+ /**
66
+ * Where a fake value is made: the model, the row's index and the data
67
+ * source's rows per model (default {@link DEFAULT_SAMPLE_ROWS}), so a
68
+ * reference points at a row the source actually made.
69
+ */
70
+ export interface FakeContext {
37
71
  modelId: string;
38
72
  index: number;
39
- }): unknown;
73
+ rows?: number;
74
+ }
75
+ /** One fake value for a field. Money is an integer number of minor units. */
76
+ export declare function fakeValue(field: CatalogField, random: () => number, context: FakeContext): unknown;
40
77
  /** Fields a person edits: everything the framework does not manage. */
41
78
  export declare function editableFields(model: CatalogModel): CatalogField[];
42
79
  export declare const DAY: number;
@@ -47,6 +84,8 @@ export declare const DAY: number;
47
84
  */
48
85
  export declare function packLine(index: number): PackLine | undefined;
49
86
  /** 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[];
87
+ export declare function fakeRecord(model: CatalogModel, index: number, seed: number, rows?: number): ModelRecord;
88
+ /** Every `EXEMPT_EVERY`th sample customer does not pay sales tax. */
89
+ export declare const EXEMPT_EVERY = 8;
90
+ /** `count` seeded records for a model; `rows` is the source's rows per model. */
91
+ export declare function fakeRecords(model: CatalogModel, count: number, seed?: number, rows?: number): ModelRecord[];
@@ -1,5 +1,6 @@
1
+ import { getModelByQualifiedName } from "../catalog/index.js";
1
2
  import { isLineModel } from "./derived.js";
2
- import { GENERIC_PACK, getSamplePack, getSampleTaxRate, } from "./packs.js";
3
+ import { GENERIC_PACK, getSamplePack, getSamplePricing, getSampleTaxRate, } from "./packs.js";
3
4
  /** Deterministic PRNG (mulberry32): the same seed always yields the same run. */
4
5
  export function createRandom(seed) {
5
6
  let state = seed >>> 0;
@@ -20,16 +21,26 @@ export function hashString(value) {
20
21
  }
21
22
  return hash >>> 0;
22
23
  }
23
- const MONEY_NAME = /(price|amount|cost|total|balance|fee|tax|revenue|budget|salary|wage|subtotal|discount|spend|payout|commission|credit|debit|charge|refund|fare|rent)/i;
24
- const NOT_MONEY_NAME = /(count|quantity|qty|percent|ratio|level)/i;
24
+ // `...Minor` is smrt's name for an amount in minor units (`DocumentTax`'s
25
+ // `taxableMinor`, `TaxSummaryReport`'s `ledgerMovementMinor`).
26
+ const MONEY_NAME = /(price|amount|cost|total|balance|fee|tax|revenue|budget|salary|wage|subtotal|discount|spend|payout|commission|credit|debit|charge|refund|fare|rent|[a-z]Minor$)/i;
27
+ // A count is not money; a dis-count is (`discountTotal`).
28
+ const NOT_MONEY_NAME = /((?<!dis)count|quantity|qty|percent|ratio|level)/i;
25
29
  /**
26
- * Money is stored as integer minor units (cents). A field is money when it is
27
- * an integer whose name says so; everything else numeric is a plain number.
30
+ * Money is stored as integer minor units (cents). An integer field is money
31
+ * when the manifest says so (`ui.format === 'money'`); a field that declares
32
+ * any other format is not, and neither is a framework-managed one. With no
33
+ * declared format the field's name decides.
28
34
  */
29
35
  export function isMoneyField(field) {
30
- return (field.type === 'integer' &&
31
- MONEY_NAME.test(field.name) &&
32
- !NOT_MONEY_NAME.test(field.name));
36
+ if (field.type !== 'integer')
37
+ return false;
38
+ const format = field.ui?.format;
39
+ if (format !== undefined)
40
+ return format === 'money';
41
+ if (field.system)
42
+ return false;
43
+ return MONEY_NAME.test(field.name) && !NOT_MONEY_NAME.test(field.name);
33
44
  }
34
45
  const WORDS = [
35
46
  'Harbor',
@@ -76,6 +87,8 @@ const SENTENCES = [
76
87
  ];
77
88
  /** Fixed clock so seeded timestamps never change between runs. */
78
89
  export const EPOCH = Date.UTC(2026, 0, 1);
90
+ /** Sample rows per model unless a pack or {@link SAMPLE_ROW_COUNTS} says otherwise. */
91
+ export const DEFAULT_SAMPLE_ROWS = 8;
79
92
  const YEAR = 365 * 24 * 60 * 60 * 1000;
80
93
  function pick(random, list) {
81
94
  return list[Math.floor(random() * list.length)];
@@ -110,6 +123,12 @@ const CHANNELS = ['web', 'retail', 'phone', 'marketplace', 'wholesale'];
110
123
  const PERIODS = ['monthly', 'quarterly', 'annual'];
111
124
  /** Fractions a tax rate takes: 0%, 5%, 8.25%, 13% and 20%. */
112
125
  export const TAX_RATES = [0, 0.05, 0.0825, 0.13, 0.2];
126
+ /**
127
+ * The sample tax rate when neither the app's setting nor the pack names one:
128
+ * every line of every document is taxed at it, so a document's tax is one
129
+ * rate of its subtotal, as on a real invoice.
130
+ */
131
+ export const DEFAULT_SAMPLE_TAX_RATE = 0.05;
113
132
  function fakeText(field, random, modelName = '') {
114
133
  const name = field.name.toLowerCase();
115
134
  if (/terms/.test(name))
@@ -158,7 +177,7 @@ function fakeText(field, random, modelName = '') {
158
177
  return pick(random, ['active', 'pending', 'archived', 'draft']);
159
178
  }
160
179
  if (/(currency)/.test(name))
161
- return 'USD';
180
+ return getSamplePricing().currency;
162
181
  if (/(person|owner|author|contact|assignee|worker)/.test(name)) {
163
182
  return `${pick(random, FIRST)} ${pick(random, LAST)}`;
164
183
  }
@@ -175,7 +194,41 @@ export const SAMPLE_ROW_COUNTS = {
175
194
  '@happyvertical/smrt-profiles:Profile': 13,
176
195
  '@happyvertical/smrt-commerce:Vendor': 5,
177
196
  };
178
- /** Sample rows for a model: the pack's count, else the shared one, else `fallback`. */
197
+ const CUSTOMER_MODEL = '@happyvertical/smrt-commerce:Customer';
198
+ /**
199
+ * How many rows of each customer-linked model (orders, quotes, invoices,
200
+ * payments: any model with a FK to a Customer) point at each sample customer:
201
+ * 3 to 6, uneven, seeded by the customer's index so it never changes. The
202
+ * slots interleave (every customer once, then again...), so a list's first
203
+ * rows still show different customers and row `n < customers` points at
204
+ * customer `n`.
205
+ */
206
+ export function customerSlots(customers) {
207
+ const cached = slotCache.get(customers);
208
+ if (cached)
209
+ return cached;
210
+ const counts = Array.from({ length: customers }, (_, k) => 3 + (hashString(`customer-rows:${k}`) % 4));
211
+ const slots = [];
212
+ for (let round = 0; round < 6; round++) {
213
+ counts.forEach((count, k) => {
214
+ if (count > round)
215
+ slots.push(k);
216
+ });
217
+ }
218
+ slotCache.set(customers, slots);
219
+ return slots;
220
+ }
221
+ const slotCache = new Map();
222
+ /** Does the model's rows belong to a customer (a FK to Customer, not its Profile)? */
223
+ function isCustomerLinked(modelId) {
224
+ const model = getModelByQualifiedName(modelId)?.model;
225
+ return (model?.fields.some((f) => (f.type === 'foreignKey' || f.type === 'crossPackageRef') &&
226
+ f.related === CUSTOMER_MODEL) ?? false);
227
+ }
228
+ /**
229
+ * Sample rows for a model: the pack's count, else the shared one, else, for a
230
+ * customer-linked model, one per {@link customerSlots} slot, else `fallback`.
231
+ */
179
232
  export function sampleRowCount(modelId, fallback) {
180
233
  // Profiles: customers, then vendors, then the pack's instructors.
181
234
  if (modelId === PROFILE_MODEL) {
@@ -185,13 +238,19 @@ export function sampleRowCount(modelId, fallback) {
185
238
  }
186
239
  return (getSamplePack().rowCounts?.[modelId] ??
187
240
  SAMPLE_ROW_COUNTS[modelId] ??
188
- fallback);
241
+ (isCustomerLinked(modelId)
242
+ ? customerSlots(sampleRowCount(CUSTOMER_MODEL, fallback)).length
243
+ : fallback));
189
244
  }
190
245
  /**
191
246
  * Which row of the target a sample relation points at. Rows are seeded with
192
- * ids from `(model, index)`, so pointing at index `n` points at a real row.
247
+ * ids from `(model, index)`, so pointing at index `n` points at a real row;
248
+ * spread over every row of the target, so each sample record has related
249
+ * records (a customer several orders, quotes and invoices), not just the
250
+ * first few.
193
251
  */
194
- function relatedIndex(field, context) {
252
+ export function relatedIndex(field, context) {
253
+ const rows = context.rows ?? DEFAULT_SAMPLE_ROWS;
195
254
  const instructors = getSamplePack().instructors;
196
255
  if (field.name === 'organizerId' && instructors?.length) {
197
256
  // Organizers lead classes and jobs; they are staff, never customers.
@@ -206,7 +265,13 @@ function relatedIndex(field, context) {
206
265
  ? context.index
207
266
  : context.index % 8;
208
267
  }
209
- return context.index % 5;
268
+ const target = field.related ?? '';
269
+ if (target === CUSTOMER_MODEL) {
270
+ // Several rows per customer, 3 to 6 each (see `customerSlots`).
271
+ const slots = customerSlots(sampleRowCount(CUSTOMER_MODEL, rows));
272
+ return slots[context.index % slots.length] ?? 0;
273
+ }
274
+ return (context.index % (target.includes(':') ? sampleRowCount(target, rows) : rows));
210
275
  }
211
276
  /** One fake value for a field. Money is an integer number of minor units. */
212
277
  export function fakeValue(field, random, context) {
@@ -233,12 +298,12 @@ export function fakeValue(field, random, context) {
233
298
  }
234
299
  case 'decimal':
235
300
  if (/taxrate|vatrate/i.test(field.name)) {
236
- // A cookbook's default rate (0: untaxed) beats a random one.
237
- const rate = getSampleTaxRate();
238
- return rate ?? pick(random, TAX_RATES);
301
+ // The app's setting, else the pack's (0: untaxed), else 5%.
302
+ return getSampleTaxRate() ?? DEFAULT_SAMPLE_TAX_RATE;
239
303
  }
304
+ // Exact percent text, as smrt's money model reads it ("10" is 10%).
240
305
  if (/discountrate/i.test(field.name))
241
- return pick(random, [0, 0.05, 0.1]);
306
+ return pick(random, ['5', '10']);
242
307
  if (/(quantity|qty)/i.test(field.name))
243
308
  return 1 + Math.floor(random() * 5);
244
309
  return Math.round(random() * 10000) / 100;
@@ -422,7 +487,7 @@ export function packLine(index) {
422
487
  return lines?.length ? lines[index % lines.length] : undefined;
423
488
  }
424
489
  /** A single seeded record for a model. */
425
- export function fakeRecord(model, index, seed) {
490
+ export function fakeRecord(model, index, seed, rows) {
426
491
  const random = createRandom(hashString(`${seed}:${model.id}:${index}`));
427
492
  const record = { id: fakeId(`${model.id}:${index}`) };
428
493
  for (const field of model.fields) {
@@ -431,13 +496,72 @@ export function fakeRecord(model, index, seed) {
431
496
  record[field.name] = fakeValue(field, random, {
432
497
  modelId: model.id,
433
498
  index,
499
+ rows,
434
500
  });
435
501
  }
436
502
  orderDates(model, record, createRandom(hashString(`${seed}:${model.id}:${index}:dates`)));
437
503
  nameThings(model, record, index, random);
504
+ sampleMoneyFields(model, record, index);
438
505
  return record;
439
506
  }
440
- /** `count` seeded records for a model. */
441
- export function fakeRecords(model, count, seed = 1) {
442
- return Array.from({ length: count }, (_, i) => fakeRecord(model, i, seed));
507
+ const COMMERCE = '@happyvertical/smrt-commerce:';
508
+ /** Every `EXEMPT_EVERY`th sample customer does not pay sales tax. */
509
+ export const EXEMPT_EVERY = 8;
510
+ /**
511
+ * The money-model fields of a sample record, set on purpose rather than
512
+ * drawn: a document is priced the app's way (`lineAmountType`,
513
+ * `taxRoundingScope`) and is an invoice or a payment, never a credit note or
514
+ * a refund (those answer an issued document), with no reversal journal or
515
+ * party tax snapshot; its totals and a line's money
516
+ * are its document's to settle; tax codes come from the app default, so no
517
+ * party or product names one of its own; and one customer in eight is tax
518
+ * exempt.
519
+ */
520
+ function sampleMoneyFields(model, record, index) {
521
+ const set = (name, value) => {
522
+ if (has(model, name))
523
+ record[name] = value;
524
+ };
525
+ for (const name of [
526
+ 'defaultTaxCodeId',
527
+ 'defaultSalesTaxCodeId',
528
+ 'defaultPurchaseTaxCodeId',
529
+ ]) {
530
+ set(name, null);
531
+ }
532
+ if (!model.id.startsWith(COMMERCE))
533
+ return;
534
+ const pricing = getSamplePricing();
535
+ set('lineAmountType', pricing.pricesIncludeTax ? 'inclusive' : 'exclusive');
536
+ set('taxRoundingScope', pricing.taxRounding);
537
+ set('discountTotal', 0);
538
+ if (model.name === 'Invoice')
539
+ set('kind', 'invoice');
540
+ if (model.name === 'Payment')
541
+ set('kind', 'payment');
542
+ set('creditedInvoiceId', null);
543
+ set('creditedLineId', null);
544
+ set('creditedAmount', 0);
545
+ // Only a cancelled posted invoice has a reversal journal, and the party's
546
+ // tax id is snapshotted from the customer when a document is issued.
547
+ set('arReversalJournalId', null);
548
+ set('partyTaxId', null);
549
+ if (isLineModel(model))
550
+ set('taxAmount', 0);
551
+ set('taxMode', 'inherit');
552
+ set('taxCodeId', null);
553
+ set('taxCodeCode', null);
554
+ set('taxCodeName', null);
555
+ if (has(model, 'discountType')) {
556
+ set('discountType', 'none');
557
+ set('discountRate', null);
558
+ set('discount', 0);
559
+ }
560
+ if (model.name === 'Customer') {
561
+ set('taxExempt', index % EXEMPT_EVERY === EXEMPT_EVERY - 1);
562
+ }
563
+ }
564
+ /** `count` seeded records for a model; `rows` is the source's rows per model. */
565
+ export function fakeRecords(model, count, seed = 1, rows) {
566
+ return Array.from({ length: count }, (_, i) => fakeRecord(model, i, seed, rows));
443
567
  }
@@ -19,8 +19,13 @@ export declare const VENDOR = "@happyvertical/smrt-commerce:Vendor";
19
19
  export declare function shortId(id: unknown): string;
20
20
  /** Does the model get its name from a Profile (`profileId` referencing one)? */
21
21
  export declare function isProfileLabelled(model: CatalogModel): boolean;
22
- /** The text that names one record. Never an empty string. */
23
- export declare function recordLabel(source: DataSource, model: CatalogModel, record: ModelRecord, depth?: number): Promise<string>;
22
+ /**
23
+ * The text that names one record. Never an empty string. `omitParty` names
24
+ * a party field (`customerId`) whose label to leave out when the record has
25
+ * a name of its own without it: a customer's page lists its orders as
26
+ * `TIM-8288`, not `Ridgeline Construction · TIM-8288`.
27
+ */
28
+ export declare function recordLabel(source: DataSource, model: CatalogModel, record: ModelRecord, depth?: number, omitParty?: string): Promise<string>;
24
29
  /**
25
30
  * The labels of every record the `fields` of `rows` point at, keyed by
26
31
  * {@link labelKey}. A pointer to a record that is gone has no entry, so a view
@@ -36,8 +36,13 @@ async function profileOf(source, record) {
36
36
  }
37
37
  /** How many relations deep a label may reach (allocation > invoice > customer). */
38
38
  const LABEL_DEPTH = 3;
39
- /** The text that names one record. Never an empty string. */
40
- export async function recordLabel(source, model, record, depth = 0) {
39
+ /**
40
+ * The text that names one record. Never an empty string. `omitParty` names
41
+ * a party field (`customerId`) whose label to leave out when the record has
42
+ * a name of its own without it: a customer's page lists its orders as
43
+ * `TIM-8288`, not `Ridgeline Construction · TIM-8288`.
44
+ */
45
+ export async function recordLabel(source, model, record, depth = 0, omitParty) {
41
46
  if (isProfileLabelled(model)) {
42
47
  const profile = await profileOf(source, record);
43
48
  const name = profile && displayLabel(modelNamed(PROFILE), profile);
@@ -45,6 +50,11 @@ export async function recordLabel(source, model, record, depth = 0) {
45
50
  return name;
46
51
  }
47
52
  const party = partyField(model.fields, record);
53
+ if (party && party.name === omitParty) {
54
+ const own = recordName(model, record, () => undefined);
55
+ if (own)
56
+ return own;
57
+ }
48
58
  const target = party?.related
49
59
  ? getModelByQualifiedName(party.related)?.model
50
60
  : undefined;
@@ -0,0 +1,8 @@
1
+ /** Sort state belongs to a rendered list, never to its data source. */
2
+ export interface ListSort {
3
+ key: string;
4
+ direction: 'ascending' | 'descending';
5
+ }
6
+ export declare function nextListSort(current: ListSort | null, key: string): ListSort;
7
+ /** Stable, non-mutating sort. Empty values remain last in both directions. */
8
+ export declare function sortListRows<T>(rows: readonly T[], sort: ListSort | null, readValue: (row: T, key: string) => unknown): T[];
@@ -0,0 +1,45 @@
1
+ export function nextListSort(current, key) {
2
+ return {
3
+ key,
4
+ direction: current?.key === key && current.direction === 'ascending'
5
+ ? 'descending'
6
+ : 'ascending',
7
+ };
8
+ }
9
+ const collator = new Intl.Collator(undefined, {
10
+ numeric: true,
11
+ sensitivity: 'base',
12
+ });
13
+ function missing(value) {
14
+ return (value === null ||
15
+ value === undefined ||
16
+ value === '' ||
17
+ (typeof value === 'number' && !Number.isFinite(value)));
18
+ }
19
+ function compare(a, b) {
20
+ if (typeof a === 'number' && typeof b === 'number')
21
+ return a - b;
22
+ if (typeof a === 'boolean' && typeof b === 'boolean')
23
+ return Number(a) - Number(b);
24
+ const left = a instanceof Date ? a.getTime() : a;
25
+ const right = b instanceof Date ? b.getTime() : b;
26
+ if (typeof left === 'number' && typeof right === 'number')
27
+ return left - right;
28
+ return collator.compare(String(left), String(right));
29
+ }
30
+ /** Stable, non-mutating sort. Empty values remain last in both directions. */
31
+ export function sortListRows(rows, sort, readValue) {
32
+ if (!sort)
33
+ return [...rows];
34
+ return rows
35
+ .map((row, index) => ({ row, index, value: readValue(row, sort.key) }))
36
+ .sort((a, b) => {
37
+ const aMissing = missing(a.value);
38
+ const bMissing = missing(b.value);
39
+ if (aMissing !== bMissing)
40
+ return aMissing ? 1 : -1;
41
+ const order = aMissing ? 0 : compare(a.value, b.value);
42
+ return ((sort.direction === 'ascending' ? order : -order) || a.index - b.index);
43
+ })
44
+ .map(({ row }) => row);
45
+ }