@pisell/private-materials 6.12.355 → 6.12.356

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 (52) hide show
  1. package/build/lowcode/assets-daily.json +11 -11
  2. package/build/lowcode/assets-dev.json +2 -2
  3. package/build/lowcode/assets-prod.json +11 -11
  4. package/build/lowcode/meta.js +1 -1
  5. package/build/lowcode/render/default/view.js +12 -12
  6. package/build/lowcode/view.js +12 -12
  7. package/es/components/bigSale/components/BookingFloatingPanel/useBookingPanelController.js +0 -1
  8. package/es/components/bigSale/components/ProductList/index.js +0 -1
  9. package/es/components/bigSale/components/TimeBar/index.js +0 -1
  10. package/es/components/bigSale/dialog.js +0 -1
  11. package/es/components/bigSale/hooks/useBigSaleContext.js +0 -1
  12. package/es/components/bigSale/hooks/useSelectFloorMapResourceForBigSale.js +0 -1
  13. package/es/components/bigSale/index.js +0 -1
  14. package/es/components/bigSale/templates/Kiosk/index.js +0 -1
  15. package/es/components/sharedSecondaryBigSale/SharedSecondaryBigSaleReceiver.js +0 -1
  16. package/es/index.js +0 -2
  17. package/es/plus/invoice/README.md +8 -2
  18. package/es/plus/invoice/ReceiptRenderer.js +1 -1
  19. package/es/plus/invoice/receipt.d.ts +2 -0
  20. package/es/plus/invoice/receipt.js +38 -8
  21. package/es/plus/invoice/receiptTranslations.js +8 -2
  22. package/es/plus/multiCurrencySettlement/index.js +1 -1
  23. package/es/plus/pisellReservation/data/bookingToReservationTables.js +1 -1
  24. package/es/plus/pisellReservation/floorMap/floorPlanApi.js +1 -1
  25. package/es/plus/pisellReservation/floorMap/reservationMock.js +1 -1
  26. package/es/plus/saasDevice/devicePasscodes/model.js +4 -4
  27. package/es/plus/saleDetail/Base.js +0 -1
  28. package/es/plus/saleDetail/components/Client/hooks/useClientSelectorProps.js +0 -1
  29. package/es/plus/saleDetail/components/DetailActions/PrintAction.js +0 -1
  30. package/es/plus/saleDetail/components/DetailActions/index.js +0 -1
  31. package/es/plus/saleDetail/components/SummaryFinancialSections/index.js +0 -1
  32. package/es/plus/saleDetail/index.js +0 -1
  33. package/es/plus/saleDetail/tmpl/B/components/Dish/index.js +0 -1
  34. package/es/plus/saleDetail/tmpl/B/components/Invoice/useInvoiceReceiptPreview.js +19 -13
  35. package/es/plus/saleDetail/tmpl/B/index.js +0 -1
  36. package/es/plus/salesSdk/utils/addProductWithFlowDebounced.js +1 -1
  37. package/es/plus/salesSdk/utils/bookingDate.js +1 -1
  38. package/es/plus/salesSdk/utils/enrichCartLineHolderDisplay.js +1 -1
  39. package/es/plus/walletPassGallery/components/timelineSection/index.js +4 -4
  40. package/es/private-materials/lowcode/authmodal/meta.d.ts +1 -0
  41. package/es/pro/Login2.0/AuthModal.d.ts +1 -1
  42. package/es/pro/Login2.0/index.d.ts +2 -2
  43. package/es/pro/Login2.0/shared/types.d.ts +1 -1
  44. package/lib/plus/invoice/README.md +8 -2
  45. package/lib/plus/invoice/ReceiptRenderer.js +1 -1
  46. package/lib/plus/invoice/receipt.d.ts +2 -0
  47. package/lib/plus/invoice/receipt.js +38 -8
  48. package/lib/plus/invoice/receiptTranslations.js +8 -2
  49. package/lib/plus/saleDetail/tmpl/B/components/Invoice/useInvoiceReceiptPreview.js +18 -12
  50. package/package.json +3 -3
  51. package/es/plus/pisellReservation/index.js +0 -17
  52. package/es/plus/salesSdk/index.js +0 -54
@@ -1,6 +1,5 @@
1
1
  import useEngineContext from "../../../../hooks/useEngineContext.js";
2
2
  import { subscribeBookingDateChange } from "../../../../plus/salesSdk/utils/bookingDate.js";
3
- import "../../../../plus/salesSdk/index.js";
4
3
  import dayjs from "dayjs";
5
4
  import { useCallback, useEffect, useState } from "react";
6
5
  //#region src/components/bigSale/components/BookingFloatingPanel/useBookingPanelController.ts
@@ -15,7 +15,6 @@ import { useSalesSdkBusinessAvailability } from "../../../../plus/salesSdk/conte
15
15
  import { showAddToCartToast } from "../../../../plus/salesSdk/components/showAddToCartToast.js";
16
16
  import { mergeBookingsForDisplay } from "../../../../plus/salesSdk/utils/mergeBookingsForDisplay.js";
17
17
  import useSalesSdkGlobalScanHandler from "../../../../plus/salesSdk/hooks/useSalesSdkGlobalScanHandler.js";
18
- import "../../../../plus/salesSdk/index.js";
19
18
  import { buildBigSaleProductListPreferencesKey, readBigSaleProductListPreferences, readStoredBigSaleProductListPreferences, removeBigSaleProductListPreferences, resolveBigSaleAutoProductListPreferences, writeBigSaleProductListPreferences } from "../../utils/productListPreferences.js";
20
19
  import { resolveBigSaleProductDisplayConfig, useBigSaleProductListConfig } from "../../hooks/useBigSaleProductListConfig.js";
21
20
  import locales_default from "../../locales/index.js";
@@ -5,7 +5,6 @@ import useInitLocalesOnce from "../../../../hooks/useInitLocalesOnce.js";
5
5
  import { subscribeBookingDateChange } from "../../../../plus/salesSdk/utils/bookingDate.js";
6
6
  import { setBookingTimeSelectionIntent } from "../../../../plus/salesSdk/utils/bookingTimeSelection.js";
7
7
  import { useSalesSdkBookingContext } from "../../../../plus/salesSdk/context/SalesSdkBookingContext.js";
8
- import "../../../../plus/salesSdk/index.js";
9
8
  import locales_default from "../../locales/index.js";
10
9
  import { getPosWeekStartsOn, resolvePosCountryCode } from "../../../../utils/posDateLocale.js";
11
10
  import dayjs from "dayjs";
@@ -6,7 +6,6 @@ import { buildInitBookingContextParams, collectBookingIdsFromTempOrder } from ".
6
6
  import { useSalesSdk } from "../../plus/salesSdk/hooks/useSalesSdk.js";
7
7
  import { useSalesSdkCart } from "../../plus/salesSdk/hooks/useSalesSdkCart.js";
8
8
  import { SalesSdkPrepareOrderSwitchContext, SalesSdkRootRefreshContext } from "../../plus/salesSdk/context/SalesSdkProvider.js";
9
- import "../../plus/salesSdk/index.js";
10
9
  import { isPersistedBigSaleOrderId } from "./utils/orderIdentity.js";
11
10
  import { seedDineInReservationToCart } from "../../plus/pisellReservation/utils/seedDineInReservationToCart.js";
12
11
  import BigSale from "./index.js";
@@ -4,7 +4,6 @@ import { useSalesSdkCustomer } from "../../../plus/salesSdk/hooks/useSalesSdkCus
4
4
  import { useSalesSdkBookingContext } from "../../../plus/salesSdk/context/SalesSdkBookingContext.js";
5
5
  import { useSalesSdkSummary } from "../../../plus/salesSdk/hooks/useSalesSdkSummary.js";
6
6
  import { useSalesSdkProducts } from "../../../plus/salesSdk/hooks/useSalesSdkProducts.js";
7
- import "../../../plus/salesSdk/index.js";
8
7
  import { useMemo } from "react";
9
8
  //#region src/components/bigSale/hooks/useBigSaleContext.ts
10
9
  /**
@@ -3,7 +3,6 @@ import { _asyncToGenerator } from "../../../_virtual/_@oxc-project_runtime@0.122
3
3
  import { buildInitBookingContextParams, collectBookingIdsFromTempOrder } from "../../../plus/salesSdk/utils/buildDefaultLoadProductsParams.js";
4
4
  import { useSalesSdkUIHosts } from "../../../plus/salesSdk/context/SalesSdkUIHostsContext.js";
5
5
  import { SalesSdkRootRefreshContext } from "../../../plus/salesSdk/context/SalesSdkProvider.js";
6
- import "../../../plus/salesSdk/index.js";
7
6
  import { isPersistedBigSaleOrderId } from "../utils/orderIdentity.js";
8
7
  import { resolveOrderIdForHostActions } from "../../../plus/pisellReservation/components/bookingDetailModal/bookingDetailHostActions.js";
9
8
  import { usePicoCodingOpenData } from "../../../plus/pisellReservation/hooks/usePicoCodingOpenData.js";
@@ -8,7 +8,6 @@ import { useSalesSdk } from "../../plus/salesSdk/hooks/useSalesSdk.js";
8
8
  import { useSalesSdkCustomer } from "../../plus/salesSdk/hooks/useSalesSdkCustomer.js";
9
9
  import { SalesSdkProvider } from "../../plus/salesSdk/context/SalesSdkProvider.js";
10
10
  import { SalesSdkBookingContextProvider } from "../../plus/salesSdk/context/SalesSdkBookingContext.js";
11
- import "../../plus/salesSdk/index.js";
12
11
  import { resolveCustomerDetailAppearance } from "../../pro/skuDetailModal/customerDetailPolicy.js";
13
12
  import { ResponsiveBigSaleBase } from "./Base.js";
14
13
  import { isBigSaleProductSelectionFlowScene, resolveBigSaleSelectionFlowConfig } from "./selectionFlowConfig.js";
@@ -12,7 +12,6 @@ import { useSalesSdkBusinessAvailability } from "../../../../plus/salesSdk/conte
12
12
  import { collectUnassignedHolderLines } from "../../../../plus/salesSdk/utils/holderSubmitValidation.js";
13
13
  import { isFulfillmentTimingBooking } from "../../../../plus/salesSdk/utils/fulfillmentTimingBooking.js";
14
14
  import { useSalesSdk } from "../../../../plus/salesSdk/hooks/useSalesSdk.js";
15
- import "../../../../plus/salesSdk/index.js";
16
15
  import { usePickSaleDetailContext } from "../../hooks/usePickSaleDetailContext.js";
17
16
  import { resolveBigSaleAutoProductListPreferences } from "../../utils/productListPreferences.js";
18
17
  import { resolveBigSaleProductDisplayConfig } from "../../hooks/useBigSaleProductListConfig.js";
@@ -2,7 +2,6 @@ import useEngineContext from "../../hooks/useEngineContext.js";
2
2
  import { _asyncToGenerator } from "../../_virtual/_@oxc-project_runtime@0.122.0/helpers/asyncToGenerator.js";
3
3
  import { useSalesSdk } from "../../plus/salesSdk/hooks/useSalesSdk.js";
4
4
  import { getTempOrderSyncPayload, shouldApplySharedTempOrderPayload } from "../../plus/salesSdk/tempOrderSync.js";
5
- import "../../plus/salesSdk/index.js";
6
5
  import { useEffect, useRef } from "react";
7
6
  import { useMemoizedFn } from "ahooks";
8
7
  //#region src/components/sharedSecondaryBigSale/SharedSecondaryBigSaleReceiver.tsx
package/es/index.js CHANGED
@@ -90,7 +90,6 @@ import { useSalesSdkProducts } from "./plus/salesSdk/hooks/useSalesSdkProducts.j
90
90
  import SalesSdkDemo from "./plus/salesSdk/demo/index.js";
91
91
  import { useSalesSdkDish } from "./plus/salesSdk/hooks/useSalesSdkDish.js";
92
92
  import { useSyncOsModule } from "./plus/salesSdk/hooks/useSyncOsModule.js";
93
- import "./plus/salesSdk/index.js";
94
93
  import BigSaleRightActionPanel from "./components/BigSaleRightActionPanel/index.js";
95
94
  import ResponsiveWrapper from "./components/list/ResponsiveWrapper.js";
96
95
  import { resolveBigSaleSelectionFlowConfig } from "./components/bigSale/selectionFlowConfig.js";
@@ -145,7 +144,6 @@ import PisellVenueControlPage from "./plus/pisellReservation/PisellVenueControlP
145
144
  import PisellVenueWallPage from "./plus/pisellReservation/PisellVenueWallPage.js";
146
145
  import PisellReservationTablePage from "./plus/pisellReservation/PisellReservationTablePage.js";
147
146
  import SelectFloorMapResourceDialog from "./plus/pisellReservation/components/SelectFloorMapResourceDialog.js";
148
- import "./plus/pisellReservation/index.js";
149
147
  import { PisellTopology, PisellTopologyCore } from "./plus/pisellTopology/PisellTopology.js";
150
148
  import cupProject_default from "./components/ecocup/cupProject/index.js";
151
149
  import CupList from "./components/ecocup/cupList/index.js";
@@ -77,8 +77,14 @@ type OrderInvoiceHandle = {
77
77
 
78
78
  OS `OrderInvoicePreview` 从模板 language 中提供 `languageOptions` 和
79
79
  `selectedLanguage`;宿主选择器调用实例 `selectLanguage(code)`,不重新准备订单或
80
- 加载低代码页面。`result.locale` 为主语言,`secondaryLocale` 仅在 `cn_en` 时为
81
- `zh_CN`。页面 UI 的 `locale` 不随此选择改变。
80
+ 加载低代码页面。`result.locale` 为主语言;`cn_en` 沿用英语在前、简体中文在后,
81
+ `ja_en` 为日语在前、英语在后,`secondaryLocale` 为对应的第二语言。
82
+ 页面 UI 的 `locale` 不随此选择改变。
83
+
84
+ POS Invoice 预览从同一份 `getInvoiceTemplateSettings()` 配置取得 modules 和
85
+ language,展示首个启用的语言模式(打印份数不重复预览),并请求该模式所需的所有
86
+ 语言快照。双语模式任一语言缺失时保留重试提示,不静默降级为单语。旧 OS 仅提供
87
+ layout 或 DEFAULT 模板未指定语言时,继续按界面语言选择。
82
88
 
83
89
  物料使用 `receipt_key` 关联来源相同的双语节点,保留仅次语言有内容的行。
84
90
  `receipt_item_kind` / `receipt_value_kind` 区分共享值和翻译文本,避免时间、编号和
@@ -26,7 +26,7 @@ function ReceiptRows({ locale, rows }) {
26
26
  return /* @__PURE__ */ React.createElement("div", {
27
27
  className: `${PREFIX}__receipt-row ${row.size === 2 ? `${PREFIX}__receipt-row--strong` : ""} ${singleValue ? `${PREFIX}__receipt-row--single` : ""} ${alignment ? `${PREFIX}__receipt-row--align-${alignment}` : ""}`,
28
28
  key: `${row.item}-${row.value}-${index}`
29
- }, row.item ? /* @__PURE__ */ React.createElement("span", null, label(String(row.item), locale)) : null, row.value ? /* @__PURE__ */ React.createElement("span", null, row.value) : null);
29
+ }, row.item ? /* @__PURE__ */ React.createElement("span", null, label(String(row.item), row.labelLocale || locale)) : null, row.value ? /* @__PURE__ */ React.createElement("span", null, row.value) : null);
30
30
  }));
31
31
  }
32
32
  function ReceiptSectionTitle({ children }) {
@@ -10,6 +10,8 @@ interface InvoiceLayoutConfig {
10
10
  module: InvoiceModuleConfig[];
11
11
  }
12
12
  interface SmallTicketItem {
13
+ /** View-only locale retained when primary and secondary rows are merged. */
14
+ labelLocale?: string;
13
15
  receipt_key?: string;
14
16
  receipt_value_kind?: 'shared' | 'text';
15
17
  receipt_item_kind?: 'shared' | 'text';
@@ -317,12 +317,8 @@ function findLocaleKey(data, candidate) {
317
317
  const lowerCandidate = candidate.toLowerCase().replace(/-/g, "_");
318
318
  return Object.keys(data).find((key) => key.toLowerCase().replace(/-/g, "_") === lowerCandidate);
319
319
  }
320
- function selectSmallTicketLocale(data, appLocale, primaryLocale) {
321
- const candidates = [
322
- ...localeCandidates(appLocale),
323
- "en",
324
- ...localeCandidates(primaryLocale || "")
325
- ];
320
+ function selectSmallTicketLocale(data, appLocale, primaryLocale, allowFallback = true) {
321
+ const candidates = [...localeCandidates(appLocale), ...allowFallback ? ["en", ...localeCandidates(primaryLocale || "")] : []];
326
322
  for (const candidate of candidates) {
327
323
  const key = findLocaleKey(data, candidate);
328
324
  if (key && hasLocalePayload(data[key])) return {
@@ -330,7 +326,7 @@ function selectSmallTicketLocale(data, appLocale, primaryLocale) {
330
326
  locale: key
331
327
  };
332
328
  }
333
- const first = Object.keys(data).find((key) => hasLocalePayload(data[key]));
329
+ const first = allowFallback ? Object.keys(data).find((key) => hasLocalePayload(data[key])) : void 0;
334
330
  return first ? {
335
331
  data: data[first],
336
332
  locale: first
@@ -362,6 +358,40 @@ function _resolveInvoiceLayoutConfig() {
362
358
  });
363
359
  return _resolveInvoiceLayoutConfig.apply(this, arguments);
364
360
  }
361
+ const INVOICE_PREVIEW_LANGUAGES = {
362
+ en: ["en"],
363
+ zh_cn: ["zh_CN"],
364
+ zh_hk: ["zh_HK"],
365
+ ja: ["ja"],
366
+ pt: ["pt"],
367
+ cn_en: ["en", "zh_CN"],
368
+ ja_en: ["ja", "en"]
369
+ };
370
+ /** Use the first enabled print mode once, regardless of its copy count. */
371
+ function resolveInvoicePreviewConfig(_x2) {
372
+ return _resolveInvoicePreviewConfig.apply(this, arguments);
373
+ }
374
+ function _resolveInvoicePreviewConfig() {
375
+ _resolveInvoicePreviewConfig = _asyncToGenerator(function* (salesModule) {
376
+ if (typeof (salesModule === null || salesModule === void 0 ? void 0 : salesModule.getInvoiceTemplateSettings) === "function") {
377
+ const settings = yield salesModule.getInvoiceTemplateSettings();
378
+ if (isRecord(settings)) {
379
+ const layout = normalizeInvoiceLayoutConfig({ module: settings.modules });
380
+ if (typeof settings.template === "string" && settings.template.trim() && settings.template.trim().toUpperCase() !== "DEFAULT" && isRecord(settings.language)) for (const [rawCode, count] of Object.entries(settings.language)) {
381
+ if (typeof count !== "number" || !Number.isFinite(count) || count <= 0) continue;
382
+ const locales = INVOICE_PREVIEW_LANGUAGES[rawCode.trim().toLowerCase().replace(/-/g, "_")];
383
+ if (Array.isArray(locales)) return {
384
+ layout,
385
+ locales: [...locales]
386
+ };
387
+ }
388
+ return { layout };
389
+ }
390
+ }
391
+ return { layout: yield resolveInvoiceLayoutConfig(salesModule) };
392
+ });
393
+ return _resolveInvoicePreviewConfig.apply(this, arguments);
394
+ }
365
395
  function text(value) {
366
396
  return value === void 0 || value === null ? "" : String(value).trim();
367
397
  }
@@ -893,4 +923,4 @@ function getModuleImage(module) {
893
923
  return text(module.image.value);
894
924
  }
895
925
  //#endregion
896
- export { buildInvoiceReceiptViewModel, formatReceiptPreviewTime, getModuleImage, getModuleText, getReceiptBookingId, getReceiptLabel, getReceiptProductTotal, isSmallTicketData, multiplyReceiptMoney, receiptMoneyValuesDiffer, resolveInvoiceLayoutConfig, resolveSmallTicketData, selectSmallTicketLocale, subtractReceiptMoney, sumReceiptMoney };
926
+ export { buildInvoiceReceiptViewModel, formatReceiptPreviewTime, getModuleImage, getModuleText, getReceiptBookingId, getReceiptLabel, getReceiptProductTotal, isSmallTicketData, multiplyReceiptMoney, receiptMoneyValuesDiffer, resolveInvoicePreviewConfig, resolveSmallTicketData, selectSmallTicketLocale, subtractReceiptMoney, sumReceiptMoney };
@@ -42,9 +42,14 @@ function receiptLabel(receipt, key) {
42
42
  return bilingualText(getReceiptLabel(receipt.locale, key), receipt.secondary && getReceiptLabel(receipt.secondary.locale, key));
43
43
  }
44
44
  function mergeTranslatedRows(primary, secondary, locale, secondaryLocale, sharedValues = false) {
45
+ const primaryRows = new Set(primary);
45
46
  return pairReceiptEntries(primary, secondary, (row) => row.receipt_key).flatMap(({ primary: row, secondary: other }) => {
46
- const item = getReceiptLabel(locale, row.item || "");
47
- const result = [_objectSpread2(_objectSpread2({}, row), {}, { item })];
47
+ const labelLocale = primaryRows.has(row) ? locale : secondaryLocale;
48
+ const item = getReceiptLabel(labelLocale, row.item || "");
49
+ const result = [_objectSpread2(_objectSpread2({}, row), {}, {
50
+ item,
51
+ labelLocale
52
+ })];
48
53
  if (!other) return result;
49
54
  let secondItem = getReceiptLabel(secondaryLocale, other.item || "");
50
55
  if (row.receipt_key === "settlement/tax-included") secondItem = secondItem.replace(/\s-?[^\s\d]*\d[\d,.]*\s(?=\()/, " ");
@@ -53,6 +58,7 @@ function mergeTranslatedRows(primary, secondary, locale, secondaryLocale, shared
53
58
  if (!secondItem && !secondValue) return result;
54
59
  result.push(_objectSpread2(_objectSpread2({}, other), {}, {
55
60
  item: secondItem,
61
+ labelLocale: secondaryLocale,
56
62
  value: secondValue,
57
63
  receipt_key: `${other.receipt_key}/secondary`
58
64
  }));
@@ -280,4 +280,4 @@ function attachSelectedSettlement(item, selectedSettlement) {
280
280
  });
281
281
  }
282
282
  //#endregion
283
- export { attachSelectedSettlement, buildSettlementPriceRows, createVirtualOnlySkuDisplayProduct, findFirstVirtualCurrencyAsset, formatSettlementAmount, formatSettlementSelectionTotal, formatTempOrderSettlementAmount, getReservedVirtualSettlementAmount, getSettlementKey, getSettlementOptions, hasSettlementOptions, hasSufficientVirtualCurrencyBalance, isVirtualOnlySettlementProduct, isVirtualSettlementTempOrder, resolveConfiguredUnavailableReason, resolveLegalSettlementAddOnUnitPrice, resolveSettlementOptionEntries, resolveVirtualSettlementErrorMessage, showVirtualSettlementErrorToast };
283
+ export { attachSelectedSettlement, buildSettlementPriceRows, createVirtualOnlySkuDisplayProduct, formatSettlementAmount, formatSettlementSelectionTotal, formatTempOrderSettlementAmount, getSettlementKey, getSettlementOptions, hasSettlementOptions, hasSufficientVirtualCurrencyBalance, isVirtualOnlySettlementProduct, isVirtualSettlementTempOrder, resolveConfiguredUnavailableReason, resolveLegalSettlementAddOnUnitPrice, resolveSettlementOptionEntries, resolveVirtualSettlementErrorMessage, showVirtualSettlementErrorToast };
@@ -259,4 +259,4 @@ function bookingListToReservationTableRows(bookings) {
259
259
  return rows;
260
260
  }
261
261
  //#endregion
262
- export { applyHostResourceShellToBaseRow, bookingListToReservationTableRows, customerBrief, extractResourceRecordIds, filterBookingsByResourceIds, hostBookingStatusToCardStatus, hostBookingUiPatchFromRecord, mergeBookingsForResourceRecord };
262
+ export { applyHostResourceShellToBaseRow, bookingListToReservationTableRows, customerBrief, extractResourceRecordIds, filterBookingsByResourceIds, hostBookingUiPatchFromRecord, mergeBookingsForResourceRecord };
@@ -78,4 +78,4 @@ function toastFloorPlanLoadError(err) {
78
78
  PisellToast({ content: err instanceof Error ? err.message : String(err) });
79
79
  }
80
80
  //#endregion
81
- export { PISELL_RESERVATION_FLOOR_PLAN_CODE, buildDefaultReservationFloorPlanPostBody, ensureShopFloorPlanByCode, putShopFloorPlan, saveViewConfigToShopFloorPlan, shopLayoutToSceneElements$1 as shopLayoutToSceneElements, toastFloorPlanLoadError, toastFloorPlanSaveError, unsubscribeShopFloorPlanCodeQuery };
81
+ export { PISELL_RESERVATION_FLOOR_PLAN_CODE, ensureShopFloorPlanByCode, saveViewConfigToShopFloorPlan, shopLayoutToSceneElements$1 as shopLayoutToSceneElements, toastFloorPlanLoadError, toastFloorPlanSaveError, unsubscribeShopFloorPlanCodeQuery };
@@ -927,4 +927,4 @@ function getReservationDataSourceFormColumns() {
927
927
  ];
928
928
  }
929
929
  //#endregion
930
- export { RESERVATION_BOUND_ROUND_TABLE_ELEMENT_KIND, RESERVATION_BOUND_TABLE_ELEMENT_KIND, applyReservationFloorMapLiveLabels, defaultReservationSceneElements, defaultReservationTableRows, getDefaultReservationFloorMapConfig, getReservationDataSourceFormColumns, getReservationFloorMapShellConfig, mergeFloorMapElementKindCategoriesWithDefaults, mergeFloorMapElementKindsWithDefaults };
930
+ export { RESERVATION_BOUND_ROUND_TABLE_ELEMENT_KIND, RESERVATION_BOUND_TABLE_ELEMENT_KIND, applyReservationFloorMapLiveLabels, defaultReservationTableRows, getDefaultReservationFloorMapConfig, getReservationDataSourceFormColumns, getReservationFloorMapShellConfig, mergeFloorMapElementKindCategoriesWithDefaults, mergeFloorMapElementKindsWithDefaults };
@@ -1,10 +1,10 @@
1
1
  import { _objectSpread2 } from "../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/objectSpread2.js";
2
2
  import dayjs from "dayjs";
3
- import timezone from "dayjs/plugin/timezone";
4
- import utc from "dayjs/plugin/utc";
3
+ import timezonePlugin from "dayjs/plugin/timezone";
4
+ import utcPlugin from "dayjs/plugin/utc";
5
5
  //#region src/plus/saasDevice/devicePasscodes/model.ts
6
- dayjs.extend(utc);
7
- dayjs.extend(timezone);
6
+ dayjs.extend(utcPlugin);
7
+ dayjs.extend(timezonePlugin);
8
8
  const INITIAL_DEVICE_PASSCODE_STATE = {
9
9
  deviceIds: [],
10
10
  devicesById: {}
@@ -13,7 +13,6 @@ import { useSalesSdkCustomer } from "../salesSdk/hooks/useSalesSdkCustomer.js";
13
13
  import locales_default from "./locales.js";
14
14
  import { useSalesSdkBookingContext } from "../salesSdk/context/SalesSdkBookingContext.js";
15
15
  import { useSalesSdkSummary } from "../salesSdk/hooks/useSalesSdkSummary.js";
16
- import "../salesSdk/index.js";
17
16
  import locales_default$1 from "./components/LineItem/locales.js";
18
17
  import { SaleOrderActionBoundary } from "./actions/index.js";
19
18
  import { SaleDetailTemplateRenderer } from "./tmpl/index.js";
@@ -1,7 +1,6 @@
1
1
  import useEngineContext from "../../../../../hooks/useEngineContext.js";
2
2
  import { _objectSpread2 } from "../../../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/objectSpread2.js";
3
3
  import { useSalesSdkBookingContext } from "../../../../salesSdk/context/SalesSdkBookingContext.js";
4
- import "../../../../salesSdk/index.js";
5
4
  import { useMemo } from "react";
6
5
  import { useMemoizedFn } from "ahooks";
7
6
  //#region src/plus/saleDetail/components/Client/hooks/useClientSelectorProps.ts
@@ -4,7 +4,6 @@ import { _asyncToGenerator } from "../../../../_virtual/_@oxc-project_runtime@0.
4
4
  import { _objectWithoutProperties } from "../../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/objectWithoutProperties.js";
5
5
  import useLogger from "../../../../hooks/useLogger.js";
6
6
  import { useSalesSdk } from "../../../salesSdk/hooks/useSalesSdk.js";
7
- import "../../../salesSdk/index.js";
8
7
  import { invokeLocalReceiptPrint, resolveLocalReceiptPrintModule, resolveSaleDetailOrderIdFromSales } from "./utils.js";
9
8
  import { getRemotePrintActions, getWristbandList } from "../../serve.js";
10
9
  import { EBizPrintType } from "./types.js";
@@ -10,7 +10,6 @@ import { useSalesSdk } from "../../../salesSdk/hooks/useSalesSdk.js";
10
10
  import { useSalesSdkCart } from "../../../salesSdk/hooks/useSalesSdkCart.js";
11
11
  import { useSalesSdkGlobalScanActivity } from "../../../salesSdk/context/SalesSdkGlobalScanActivityContext.js";
12
12
  import { useSalesSdkSummary } from "../../../salesSdk/hooks/useSalesSdkSummary.js";
13
- import "../../../salesSdk/index.js";
14
13
  import { resolveSaleDetailTempOrder } from "../../utils.js";
15
14
  import { getNumericAmount, getSalesHostModule, resolveSaleDetailOrderIdFromSales, resolveSaleDetailOrderIdFromSalesResult, shouldCloseDialogAfterCheckout, updateLocalOrder } from "./utils.js";
16
15
  import { deriveSaleOrderSubmitState } from "../../actions/state.js";
@@ -5,7 +5,6 @@ import { isAppliedPaymentRecord } from "../../../salesSdk/utils/paymentStatus.js
5
5
  import { useSalesSdk } from "../../../salesSdk/hooks/useSalesSdk.js";
6
6
  import { useSalesSdkCart } from "../../../salesSdk/hooks/useSalesSdkCart.js";
7
7
  import { useSalesSdkSummary } from "../../../salesSdk/hooks/useSalesSdkSummary.js";
8
- import "../../../salesSdk/index.js";
9
8
  import { resolveSaleDetailTempOrder } from "../../utils.js";
10
9
  import React, { memo, useMemo } from "react";
11
10
  import { formatAmount, locales } from "@pisell/utils";
@@ -5,7 +5,6 @@ import { useSalesSdk } from "../salesSdk/hooks/useSalesSdk.js";
5
5
  import { SalesSdkProvider } from "../salesSdk/context/SalesSdkProvider.js";
6
6
  import { SalesSdkDishProvider } from "../salesSdk/context/SalesSdkDishContext.js";
7
7
  import { SalesSdkBookingContextProvider } from "../salesSdk/context/SalesSdkBookingContext.js";
8
- import "../salesSdk/index.js";
9
8
  import Base_default from "./Base.js";
10
9
  import { resolveSaleDetailOsProps } from "./osProps.js";
11
10
  import React, { forwardRef, useImperativeHandle } from "react";
@@ -1,7 +1,6 @@
1
1
  import useStableInstanceId from "../../../../../../hooks/useStableInstanceId.js";
2
2
  import { useSalesSdkDish } from "../../../../../salesSdk/hooks/useSalesSdkDish.js";
3
3
  import { useCurrentSalesSdkDish } from "../../../../../salesSdk/hooks/useCurrentSalesSdkDish.js";
4
- import "../../../../../salesSdk/index.js";
5
4
  import { SaleDetailStatusOverview } from "../shared/StatusOverview.js";
6
5
  import { DishGroupView } from "./DishGroupView.js";
7
6
  import dayjs from "dayjs";
@@ -6,7 +6,7 @@ import { isVirtualSettlementTempOrder } from "../../../../../multiCurrencySettle
6
6
  import { getLocalOrderReceiptSnapshot, getOrderSmallTicketData } from "../../../../serve.js";
7
7
  import { withDisplayedReceiptFormTitles } from "../../../../utils/formTitleDisplay.js";
8
8
  import { hasInvoiceDetailSettings, hasInvoicePaymentTimeKeys, isInvoiceResourceTitleVisible, requiresInvoiceDataFiltering, requiresInvoicePaymentTimeKeys } from "../../../../../invoice/invoiceVisibility.js";
9
- import { buildInvoiceReceiptViewModel, formatReceiptPreviewTime, isSmallTicketData, resolveInvoiceLayoutConfig, resolveSmallTicketData, selectSmallTicketLocale } from "../../../../../invoice/receipt.js";
9
+ import { buildInvoiceReceiptViewModel, formatReceiptPreviewTime, isSmallTicketData, resolveInvoicePreviewConfig, resolveSmallTicketData, selectSmallTicketLocale } from "../../../../../invoice/receipt.js";
10
10
  import { useEffect, useMemo, useState } from "react";
11
11
  //#region src/plus/saleDetail/tmpl/B/components/Invoice/useInvoiceReceiptPreview.ts
12
12
  const LOADING_STATE = {
@@ -81,13 +81,12 @@ function useInvoiceReceiptPreview(context) {
81
81
  setState(_objectSpread2(_objectSpread2({}, LOADING_STATE), {}, { scope }));
82
82
  (function() {
83
83
  var _ref3 = _asyncToGenerator(function* () {
84
- var _bookingTicket$getFor;
85
84
  const { appLocale, bookingTicket, engineContext, orderId, platform, previewCreatedAt, salesDetail, salesModule, tempOrder } = scope;
86
- const layout = yield resolveInvoiceLayoutConfig(salesModule);
85
+ const { layout, locales } = yield resolveInvoicePreviewConfig(salesModule);
87
86
  if (cancelled) return null;
88
87
  const mustFilter = requiresInvoiceDataFiltering(layout);
89
88
  const needsPaymentTimeKeys = requiresInvoicePaymentTimeKeys(layout);
90
- const useSharedConfig = hasInvoiceDetailSettings(layout) || mustFilter;
89
+ const useSharedConfig = hasInvoiceDetailSettings(layout) || mustFilter || Boolean(locales);
91
90
  const isVirtualOrder = isVirtualSettlementTempOrder(tempOrder) || isVirtualSettlementTempOrder(salesDetail === null || salesDetail === void 0 ? void 0 : salesDetail.raw);
92
91
  const legacyVirtualResult = {
93
92
  receipt: null,
@@ -97,11 +96,12 @@ function useInvoiceReceiptPreview(context) {
97
96
  };
98
97
  if (isVirtualOrder && !useSharedConfig) return legacyVirtualResult;
99
98
  const requiresSource = isVirtualOrder && useSharedConfig;
99
+ const requiresFreshSnapshot = mustFilter || needsPaymentTimeKeys || requiresSource || ((locales === null || locales === void 0 ? void 0 : locales.length) || 0) > 1;
100
100
  const embeddedSnapshot = resolveSmallTicketData(salesDetail, tempOrder);
101
101
  const { snapshot, source } = yield function() {
102
102
  var _ref2 = _asyncToGenerator(function* () {
103
103
  if (platform !== "h5" && orderId !== null && orderId !== void 0) try {
104
- const freshSnapshot = yield getLocalOrderReceiptSnapshot(orderId, [appLocale], layout);
104
+ const freshSnapshot = yield getLocalOrderReceiptSnapshot(orderId, locales || [appLocale], layout);
105
105
  if (!freshSnapshot || !isSmallTicketData(freshSnapshot.small_ticket_data)) throw new Error("Receipt snapshot is unavailable");
106
106
  if (mustFilter && freshSnapshot.template_visibility_applied !== true) throw new Error("Receipt snapshot does not support template filtering");
107
107
  if (needsPaymentTimeKeys && !hasInvoicePaymentTimeKeys(freshSnapshot.small_ticket_data)) throw new Error("Receipt snapshot does not identify payment history times");
@@ -111,10 +111,10 @@ function useInvoiceReceiptPreview(context) {
111
111
  source: freshSnapshot.source || null
112
112
  };
113
113
  } catch (error) {
114
- if (mustFilter || needsPaymentTimeKeys || requiresSource) throw error;
114
+ if (requiresFreshSnapshot) throw error;
115
115
  console.warn("[SaleDetail.Invoice] Failed to rebuild local receipt snapshot", error);
116
116
  }
117
- if (mustFilter || needsPaymentTimeKeys || requiresSource) throw new Error("A template-aware local receipt snapshot is required");
117
+ if (requiresFreshSnapshot) throw new Error("A template-aware local receipt snapshot is required");
118
118
  return {
119
119
  snapshot: embeddedSnapshot || (orderId !== null && orderId !== void 0 ? yield getOrderSmallTicketData(orderId) : null),
120
120
  source: null
@@ -128,17 +128,23 @@ function useInvoiceReceiptPreview(context) {
128
128
  const isVirtualSource = isVirtualSettlementTempOrder(source);
129
129
  if (isVirtualSource && !useSharedConfig) return legacyVirtualResult;
130
130
  const shopInfo = getShopInfo(engineContext);
131
- const selected = selectSmallTicketLocale(isInvoiceResourceTitleVisible(layout) ? withDisplayedReceiptFormTitles(snapshot, (bookingTicket === null || bookingTicket === void 0 || (_bookingTicket$getFor = bookingTicket.getFormTitleMap) === null || _bookingTicket$getFor === void 0 ? void 0 : _bookingTicket$getFor.call(bookingTicket)) || {}, appLocale, (salesDetail === null || salesDetail === void 0 ? void 0 : salesDetail.bookings) || []) : snapshot, appLocale, shopInfo.primary_locale);
132
- if (!selected) throw new Error("Receipt language data is unavailable");
133
- return {
134
- receipt: buildInvoiceReceiptViewModel({
135
- data: selected.data,
131
+ const buildReceipt = (locale) => {
132
+ var _bookingTicket$getFor;
133
+ const selected = selectSmallTicketLocale(snapshot, locale, shopInfo.primary_locale, !locales);
134
+ if (!selected) throw new Error(`Receipt language data is unavailable: ${locale}`);
135
+ return buildInvoiceReceiptViewModel({
136
+ data: isInvoiceResourceTitleVisible(layout) ? withDisplayedReceiptFormTitles(selected.data, (bookingTicket === null || bookingTicket === void 0 || (_bookingTicket$getFor = bookingTicket.getFormTitleMap) === null || _bookingTicket$getFor === void 0 ? void 0 : _bookingTicket$getFor.call(bookingTicket)) || {}, selected.locale, (salesDetail === null || salesDetail === void 0 ? void 0 : salesDetail.bookings) || []) : selected.data,
136
137
  layout,
137
138
  locale: selected.locale,
138
139
  previewTime: formatReceiptPreviewTime(previewCreatedAt, selected.locale),
139
140
  shopLogo: getShopLogo(shopInfo),
140
141
  taxNumberLabel: shopInfo.tax_number_title || (String(shopInfo.tax_country_code || "").toUpperCase() === "AU" ? "ABN" : void 0)
141
- }),
142
+ });
143
+ };
144
+ const receipt = buildReceipt((locales === null || locales === void 0 ? void 0 : locales[0]) || appLocale);
145
+ if (locales === null || locales === void 0 ? void 0 : locales[1]) receipt.secondary = buildReceipt(locales[1]);
146
+ return {
147
+ receipt,
142
148
  source,
143
149
  useLegacyVirtualCurrencyInvoice: false,
144
150
  useVirtualCurrencyReceipt: useSharedConfig && isVirtualSource
@@ -1,7 +1,6 @@
1
1
  import useEngineContext from "../../../../hooks/useEngineContext.js";
2
2
  import { _objectSpread2 } from "../../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/objectSpread2.js";
3
3
  import { useCurrentSalesSdkDish } from "../../../salesSdk/hooks/useCurrentSalesSdkDish.js";
4
- import "../../../salesSdk/index.js";
5
4
  import { getInternalNotesByScheduleEvent } from "../../serve.js";
6
5
  import { TEMPLATE_B_PAY_ACTIONS, TEMPLATE_B_SUMMARY_ACTIONS } from "../../components/DetailActions/configs/index.js";
7
6
  import { DetailActions } from "../../components/DetailActions/index.js";
@@ -407,4 +407,4 @@ function createAddProductWithFlowDebounced(deps) {
407
407
  };
408
408
  }
409
409
  //#endregion
410
- export { createAddProductWithFlowDebounced, shouldBypassAddProductDebounce };
410
+ export { createAddProductWithFlowDebounced };
@@ -31,4 +31,4 @@ function subscribeBookingDateChange(bookingTicket, callback) {
31
31
  return typeof off === "function" ? off : () => {};
32
32
  }
33
33
  //#endregion
34
- export { BOOKING_CONTEXT_DATE_EVENT, formatBookingDateTime, subscribeBookingDateChange };
34
+ export { formatBookingDateTime, subscribeBookingDateChange };
@@ -102,4 +102,4 @@ function buildHolderListRequestKey(params) {
102
102
  });
103
103
  }
104
104
  //#endregion
105
- export { buildHolderListRequestKey, buildHolderListRequestParams, enrichCartBookingHolderDisplay, enrichCartProductHolderDisplay, pickHolderIdFromBooking, resolveHolderDisplayConfig };
105
+ export { buildHolderListRequestKey, buildHolderListRequestParams, enrichCartBookingHolderDisplay, enrichCartProductHolderDisplay, resolveHolderDisplayConfig };
@@ -6,12 +6,12 @@ import React, { useCallback, useEffect, useMemo, useRef } from "react";
6
6
  import { locales } from "@pisell/utils";
7
7
  import { Button, PisellEmpty, PisellModal, PisellStatisticList, Skeleton, Timeline, usePisellConfig } from "@pisell/materials";
8
8
  import { useRequest } from "ahooks";
9
- import timezone from "dayjs/plugin/timezone";
10
- import utc from "dayjs/plugin/utc";
9
+ import timezonePlugin from "dayjs/plugin/timezone";
10
+ import utcPlugin from "dayjs/plugin/utc";
11
11
  import "./index.less";
12
12
  //#region src/plus/walletPassGallery/components/timelineSection/index.tsx
13
- dayjs.extend(timezone);
14
- dayjs.extend(utc);
13
+ dayjs.extend(timezonePlugin);
14
+ dayjs.extend(utcPlugin);
15
15
  const stateTimeUnix = 1723255863;
16
16
  const POLL_INTERVAL = 2e3;
17
17
  const POLL_MAX_TIMES = 5;
@@ -0,0 +1 @@
1
+ export { };
@@ -14,4 +14,4 @@ interface AuthModalProps {
14
14
  */
15
15
  declare const AuthModal: React.FC<AuthModalProps>;
16
16
  //#endregion
17
- export { AuthModal };
17
+ export { AuthModal, AuthModalProps };
@@ -1,4 +1,4 @@
1
- import { AuthMethodType, EmailAuthConfig, EmailRegistrationVerification, LoginFormData, OAuthConfig, PhoneAuthConfig, RegisterFormData, UIConfig, VerificationMethod } from "./shared/types.js";
1
+ import { AuthMethodType, VerificationMethod } from "./shared/types.js";
2
2
  import { Login2, Login2Config, Login2Events, Login2Props } from "./Login2.js";
3
3
  import { Register2, Register2Config, Register2Events, Register2Props } from "./Register2.js";
4
- import { AuthModal } from "./AuthModal.js";
4
+ import { AuthModal, AuthModalProps } from "./AuthModal.js";
@@ -226,4 +226,4 @@ interface RegisterFormData {
226
226
  verification_token?: string;
227
227
  }
228
228
  //#endregion
229
- export { AuthMethodType, EmailAuthConfig, EmailRegistrationVerification, LegalTermsConfig, LoginFormData, LoginMethodItem, OAuthConfig, PhoneAuthConfig, RegisterFormData, RegistrationMethodItem, UIConfig, VerificationMethod };
229
+ export { AuthMethodType, EmailAuthConfig, LegalTermsConfig, LoginFormData, LoginMethodItem, OAuthConfig, PhoneAuthConfig, RegisterFormData, RegistrationMethodItem, UIConfig, VerificationMethod };
@@ -77,8 +77,14 @@ type OrderInvoiceHandle = {
77
77
 
78
78
  OS `OrderInvoicePreview` 从模板 language 中提供 `languageOptions` 和
79
79
  `selectedLanguage`;宿主选择器调用实例 `selectLanguage(code)`,不重新准备订单或
80
- 加载低代码页面。`result.locale` 为主语言,`secondaryLocale` 仅在 `cn_en` 时为
81
- `zh_CN`。页面 UI 的 `locale` 不随此选择改变。
80
+ 加载低代码页面。`result.locale` 为主语言;`cn_en` 沿用英语在前、简体中文在后,
81
+ `ja_en` 为日语在前、英语在后,`secondaryLocale` 为对应的第二语言。
82
+ 页面 UI 的 `locale` 不随此选择改变。
83
+
84
+ POS Invoice 预览从同一份 `getInvoiceTemplateSettings()` 配置取得 modules 和
85
+ language,展示首个启用的语言模式(打印份数不重复预览),并请求该模式所需的所有
86
+ 语言快照。双语模式任一语言缺失时保留重试提示,不静默降级为单语。旧 OS 仅提供
87
+ layout 或 DEFAULT 模板未指定语言时,继续按界面语言选择。
82
88
 
83
89
  物料使用 `receipt_key` 关联来源相同的双语节点,保留仅次语言有内容的行。
84
90
  `receipt_item_kind` / `receipt_value_kind` 区分共享值和翻译文本,避免时间、编号和
@@ -29,7 +29,7 @@ function ReceiptRows({ locale, rows }) {
29
29
  return /* @__PURE__ */ react.default.createElement("div", {
30
30
  className: `${PREFIX}__receipt-row ${row.size === 2 ? `${PREFIX}__receipt-row--strong` : ""} ${singleValue ? `${PREFIX}__receipt-row--single` : ""} ${alignment ? `${PREFIX}__receipt-row--align-${alignment}` : ""}`,
31
31
  key: `${row.item}-${row.value}-${index}`
32
- }, row.item ? /* @__PURE__ */ react.default.createElement("span", null, label(String(row.item), locale)) : null, row.value ? /* @__PURE__ */ react.default.createElement("span", null, row.value) : null);
32
+ }, row.item ? /* @__PURE__ */ react.default.createElement("span", null, label(String(row.item), row.labelLocale || locale)) : null, row.value ? /* @__PURE__ */ react.default.createElement("span", null, row.value) : null);
33
33
  }));
34
34
  }
35
35
  function ReceiptSectionTitle({ children }) {
@@ -10,6 +10,8 @@ interface InvoiceLayoutConfig {
10
10
  module: InvoiceModuleConfig[];
11
11
  }
12
12
  interface SmallTicketItem {
13
+ /** View-only locale retained when primary and secondary rows are merged. */
14
+ labelLocale?: string;
13
15
  receipt_key?: string;
14
16
  receipt_value_kind?: 'shared' | 'text';
15
17
  receipt_item_kind?: 'shared' | 'text';