@pisell/private-materials 6.3.136 → 6.3.138
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lowcode/assets-daily.json +11 -11
- package/build/lowcode/assets-dev.json +2 -2
- package/build/lowcode/assets-prod.json +11 -11
- package/build/lowcode/meta.js +1 -1
- package/build/lowcode/render/default/view.js +1 -1
- package/build/lowcode/view.js +1 -1
- package/es/businessModel/SalesModel/index.d.ts +1 -0
- package/es/components/booking/addons/model.d.ts +1 -10
- package/es/components/booking/components/TabProduct/index.d.ts +1 -0
- package/es/components/booking/components/TabProduct/productItem/index.d.ts +1 -0
- package/es/components/booking/deposit/index.d.ts +1 -0
- package/es/components/booking/forms/model.d.ts +1 -10
- package/es/components/booking/forms/single/index.d.ts +1 -0
- package/es/components/booking/info/addServiceVariant/index.d.ts +1 -0
- package/es/components/booking/info/clientVariant/hooks/useClientFn.d.ts +1 -0
- package/es/components/booking/info/date/index.d.ts +1 -0
- package/es/components/booking/info/hooks/useInfoHolder.d.ts +1 -0
- package/es/components/booking/info/index.d.ts +1 -0
- package/es/components/booking/info/model.d.ts +1 -10
- package/es/components/booking/info/notes/index.d.ts +1 -0
- package/es/components/booking/info/service/Lists.d.ts +1 -0
- package/es/components/booking/info/service/actions/index.d.ts +1 -0
- package/es/components/booking/info/service/addService/index.d.ts +1 -0
- package/es/components/booking/info/service/addTimeModal/index.d.ts +1 -0
- package/es/components/booking/info/service/serviceList/index.d.ts +1 -0
- package/es/components/booking/info/service2/Lists.d.ts +1 -0
- package/es/components/booking/info/service2/utils.d.ts +1 -1
- package/es/components/booking/info2/service/actions/index.d.ts +1 -0
- package/es/components/booking/info2/service/addTimeModal/index.d.ts +1 -0
- package/es/components/booking/info2/service/contactInfoMode/index.d.ts +1 -0
- package/es/components/booking/info2/service/serviceList/index.d.ts +1 -0
- package/es/components/booking/materiels/duration/index.d.ts +1 -0
- package/es/components/booking/materiels/holder/index.d.ts +1 -0
- package/es/components/booking/materiels/startTime/index.d.ts +1 -0
- package/es/components/booking/model.d.ts +1 -9
- package/es/components/booking/notes/model.d.ts +1 -10
- package/es/components/booking/payments/model.d.ts +1 -10
- package/es/components/eftposPay/amount.d.ts +1 -0
- package/es/components/eftposPay/app.d.ts +1 -0
- package/es/components/eftposPay/component/fail/failCustom.d.ts +1 -0
- package/es/components/eftposPay/device.d.ts +1 -0
- package/es/components/eftposPay/hooks.d.ts +2 -2
- package/es/components/eftposPay/index.d.ts +1 -0
- package/es/components/eftposPay/linkly/index.d.ts +1 -0
- package/es/components/eftposPay/pay.d.ts +1 -0
- package/es/components/eftposPay/store/index.d.ts +5 -5
- package/es/components/eventBooking/components/Provider/Cart/Deposit/index.d.ts +1 -0
- package/es/components/eventBooking/components/Provider/Content/index.d.ts +1 -0
- package/es/components/eventBooking/components/Provider/Header/index.d.ts +1 -0
- package/es/components/eventBooking/components/Provider/SelectHolderModal.d.ts +1 -0
- package/es/components/eventBooking/components/bookingDetailModal/components/Resource.d.ts +1 -0
- package/es/components/eventBooking/components/bookingDetailModal/components/Schedule.d.ts +1 -0
- package/es/components/eventBooking/index.d.ts +1 -0
- package/es/components/pay/toC/PaymentMethods/StripePay/Stripe/index.d.ts +1 -0
- package/es/components/pay/toC/model.d.ts +1 -9
- package/es/components/pisellSelectCustomerModal/RightPanel/Add/PhoneField/index.d.ts +1 -0
- package/es/components/pisellSelectCustomerModal/RightPanel/Add/index.d.ts +1 -0
- package/es/components/pisellSelectCustomerModal/RightPanel/index.d.ts +1 -0
- package/es/components/productExtension/fields/Actor/index.d.ts +1 -0
- package/es/components/productExtension/fields/Forms/index.d.ts +1 -0
- package/es/components/productExtension/fields/SelectProducts/ProductItem/index.d.ts +1 -0
- package/es/components/productExtension/fields/SelectProducts/index.d.ts +1 -0
- package/es/components/productExtension/fields/SelectResourcesTable/index.d.ts +1 -0
- package/es/components/productExtension/index.d.ts +1 -0
- package/es/components/ruleSetting/index.d.ts +1 -0
- package/es/components/scanOrder/components/Content/index.js +251 -69
- package/es/components/scanOrder/context.js +6 -18
- package/es/components/scanOrder/utils/toShoppingCartProducts.d.ts +2 -1
- package/es/components/scanOrder/utils/toShoppingCartProducts.js +15 -9
- package/es/components/scanOrder/utils/transformProductDetail.d.ts +2 -1
- package/es/components/scanOrder/utils/transformProductDetail.js +7 -6
- package/es/components/schedules/model.d.ts +1 -9
- package/es/components/shoppingCart/components/Empty/index.d.ts +1 -0
- package/es/components/shoppingCart/components/Render/index.d.ts +1 -0
- package/es/components/shoppingCart/index.d.ts +1 -0
- package/es/components/ticketBooking/components/addServiceVariant/index.d.ts +1 -0
- package/es/components/venueBooking/components/Checkout/index.js +36 -5
- package/es/components/venueBooking/components/VenueSelection/components/TimeGrid.js +1 -1
- package/es/components/venueBooking/context.js +32 -6
- package/es/components/venueBooking/locales.d.ts +15 -0
- package/es/components/venueBooking/locales.js +15 -0
- package/es/plus/clinetSearch/Add/PhoneField/index.d.ts +1 -0
- package/es/plus/pisellSalesManagement/config/booking.d.ts +6 -6
- package/es/plus/pisellSalesProductCard/index.js +16 -1
- package/es/plus/pisellSalesProductCard/types.d.ts +21 -1
- package/es/plus/productSelect/ProductCard/ProductCardV2.js +6 -2
- package/es/plus/walletEditor/components/ImageUpload/index.d.ts +1 -1
- package/es/pro/NumericStepper/index.d.ts +19 -0
- package/es/pro/NumericStepper/index.js +37 -6
- package/lib/businessModel/SalesModel/index.d.ts +1 -0
- package/lib/components/booking/addons/model.d.ts +1 -10
- package/lib/components/booking/components/TabProduct/index.d.ts +1 -0
- package/lib/components/booking/components/TabProduct/productItem/index.d.ts +1 -0
- package/lib/components/booking/deposit/index.d.ts +1 -0
- package/lib/components/booking/forms/model.d.ts +1 -10
- package/lib/components/booking/forms/single/index.d.ts +1 -0
- package/lib/components/booking/info/addServiceVariant/index.d.ts +1 -0
- package/lib/components/booking/info/clientVariant/hooks/useClientFn.d.ts +1 -0
- package/lib/components/booking/info/date/index.d.ts +1 -0
- package/lib/components/booking/info/hooks/useInfoHolder.d.ts +1 -0
- package/lib/components/booking/info/index.d.ts +1 -0
- package/lib/components/booking/info/model.d.ts +1 -10
- package/lib/components/booking/info/notes/index.d.ts +1 -0
- package/lib/components/booking/info/service/Lists.d.ts +1 -0
- package/lib/components/booking/info/service/actions/index.d.ts +1 -0
- package/lib/components/booking/info/service/addService/index.d.ts +1 -0
- package/lib/components/booking/info/service/addTimeModal/index.d.ts +1 -0
- package/lib/components/booking/info/service/serviceList/index.d.ts +1 -0
- package/lib/components/booking/info/service2/Lists.d.ts +1 -0
- package/lib/components/booking/info/service2/utils.d.ts +1 -1
- package/lib/components/booking/info2/service/actions/index.d.ts +1 -0
- package/lib/components/booking/info2/service/addTimeModal/index.d.ts +1 -0
- package/lib/components/booking/info2/service/contactInfoMode/index.d.ts +1 -0
- package/lib/components/booking/info2/service/serviceList/index.d.ts +1 -0
- package/lib/components/booking/materiels/duration/index.d.ts +1 -0
- package/lib/components/booking/materiels/holder/index.d.ts +1 -0
- package/lib/components/booking/materiels/startTime/index.d.ts +1 -0
- package/lib/components/booking/model.d.ts +1 -9
- package/lib/components/booking/notes/model.d.ts +1 -10
- package/lib/components/booking/payments/model.d.ts +1 -10
- package/lib/components/eftposPay/amount.d.ts +1 -0
- package/lib/components/eftposPay/app.d.ts +1 -0
- package/lib/components/eftposPay/component/fail/failCustom.d.ts +1 -0
- package/lib/components/eftposPay/device.d.ts +1 -0
- package/lib/components/eftposPay/hooks.d.ts +2 -2
- package/lib/components/eftposPay/index.d.ts +1 -0
- package/lib/components/eftposPay/linkly/index.d.ts +1 -0
- package/lib/components/eftposPay/pay.d.ts +1 -0
- package/lib/components/eftposPay/store/index.d.ts +5 -5
- package/lib/components/eventBooking/components/Provider/Cart/Deposit/index.d.ts +1 -0
- package/lib/components/eventBooking/components/Provider/Content/index.d.ts +1 -0
- package/lib/components/eventBooking/components/Provider/Header/index.d.ts +1 -0
- package/lib/components/eventBooking/components/Provider/SelectHolderModal.d.ts +1 -0
- package/lib/components/eventBooking/components/bookingDetailModal/components/Resource.d.ts +1 -0
- package/lib/components/eventBooking/components/bookingDetailModal/components/Schedule.d.ts +1 -0
- package/lib/components/eventBooking/index.d.ts +1 -0
- package/lib/components/pay/toC/PaymentMethods/StripePay/Stripe/index.d.ts +1 -0
- package/lib/components/pay/toC/model.d.ts +1 -9
- package/lib/components/pisellSelectCustomerModal/RightPanel/Add/PhoneField/index.d.ts +1 -0
- package/lib/components/pisellSelectCustomerModal/RightPanel/Add/index.d.ts +1 -0
- package/lib/components/pisellSelectCustomerModal/RightPanel/index.d.ts +1 -0
- package/lib/components/productExtension/fields/Actor/index.d.ts +1 -0
- package/lib/components/productExtension/fields/Forms/index.d.ts +1 -0
- package/lib/components/productExtension/fields/SelectProducts/ProductItem/index.d.ts +1 -0
- package/lib/components/productExtension/fields/SelectProducts/index.d.ts +1 -0
- package/lib/components/productExtension/fields/SelectResourcesTable/index.d.ts +1 -0
- package/lib/components/productExtension/index.d.ts +1 -0
- package/lib/components/ruleSetting/index.d.ts +1 -0
- package/lib/components/scanOrder/components/Content/index.js +150 -41
- package/lib/components/scanOrder/context.js +0 -10
- package/lib/components/scanOrder/utils/toShoppingCartProducts.d.ts +2 -1
- package/lib/components/scanOrder/utils/toShoppingCartProducts.js +8 -5
- package/lib/components/scanOrder/utils/transformProductDetail.d.ts +2 -1
- package/lib/components/scanOrder/utils/transformProductDetail.js +1 -9
- package/lib/components/schedules/model.d.ts +1 -9
- package/lib/components/shoppingCart/components/Empty/index.d.ts +1 -0
- package/lib/components/shoppingCart/components/Render/index.d.ts +1 -0
- package/lib/components/shoppingCart/index.d.ts +1 -0
- package/lib/components/ticketBooking/components/addServiceVariant/index.d.ts +1 -0
- package/lib/components/venueBooking/components/Checkout/index.js +28 -3
- package/lib/components/venueBooking/components/VenueSelection/components/TimeGrid.js +1 -1
- package/lib/components/venueBooking/context.js +14 -6
- package/lib/components/venueBooking/locales.d.ts +15 -0
- package/lib/components/venueBooking/locales.js +15 -0
- package/lib/plus/clinetSearch/Add/PhoneField/index.d.ts +1 -0
- package/lib/plus/pisellSalesManagement/config/booking.d.ts +6 -6
- package/lib/plus/pisellSalesProductCard/index.js +10 -0
- package/lib/plus/pisellSalesProductCard/types.d.ts +21 -1
- package/lib/plus/productSelect/ProductCard/ProductCardV2.js +6 -2
- package/lib/plus/walletEditor/components/ImageUpload/index.d.ts +1 -1
- package/lib/pro/NumericStepper/index.d.ts +19 -0
- package/lib/pro/NumericStepper/index.js +21 -4
- package/package.json +1 -1
|
@@ -48,6 +48,28 @@ var import_Check = __toESM(require("../Check"));
|
|
|
48
48
|
var import_PolicyModal = __toESM(require("../../../appointmentBooking/deposit/components/PolicyModal"));
|
|
49
49
|
var import_useComponents = __toESM(require("../../../../hooks/useComponents"));
|
|
50
50
|
var import_index = require("./index.less");
|
|
51
|
+
function extractEntryPaxNumber(payload) {
|
|
52
|
+
if (payload == null) return null;
|
|
53
|
+
if (typeof payload === "number" && Number.isFinite(payload) && payload >= 1) {
|
|
54
|
+
return Math.floor(payload);
|
|
55
|
+
}
|
|
56
|
+
if (typeof payload === "string") {
|
|
57
|
+
const n = Number(payload);
|
|
58
|
+
if (Number.isFinite(n) && n >= 1) return Math.floor(n);
|
|
59
|
+
}
|
|
60
|
+
if (typeof payload === "object") {
|
|
61
|
+
const o = payload;
|
|
62
|
+
for (const k of ["entryPaxNumber", "pax", "num", "count", "value"]) {
|
|
63
|
+
const v = o[k];
|
|
64
|
+
if (typeof v === "number" && Number.isFinite(v) && v >= 1) return Math.floor(v);
|
|
65
|
+
if (typeof v === "string") {
|
|
66
|
+
const n = Number(v);
|
|
67
|
+
if (Number.isFinite(n) && n >= 1) return Math.floor(n);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
51
73
|
function ReadyState() {
|
|
52
74
|
var _a, _b, _c, _d;
|
|
53
75
|
const {
|
|
@@ -78,6 +100,16 @@ function ReadyState() {
|
|
|
78
100
|
content: null
|
|
79
101
|
});
|
|
80
102
|
const [pendingFormPayload, setPendingFormPayload] = (0, import_react.useState)(null);
|
|
103
|
+
const [entryMode, setEntryMode] = (0, import_react.useState)("default");
|
|
104
|
+
const requestEntryPaxRef = (0, import_react.useRef)(0);
|
|
105
|
+
const requestPaxMinRef = (0, import_react.useRef)(1);
|
|
106
|
+
const requestPaxMaxRef = (0, import_react.useRef)(1);
|
|
107
|
+
const tableFormRecordRef = (0, import_react.useRef)(null);
|
|
108
|
+
const getLocalizedName = (nameMap) => {
|
|
109
|
+
if (!nameMap) return "";
|
|
110
|
+
const currentLocale = import_utils.locales.getLocale();
|
|
111
|
+
return nameMap[currentLocale] || nameMap.original || nameMap.en || "";
|
|
112
|
+
};
|
|
81
113
|
const normalizeFormPayload = (formPayload, partyroomBookingPayload) => {
|
|
82
114
|
const sourcePayload = formPayload ?? partyroomBookingPayload;
|
|
83
115
|
if (!sourcePayload) return null;
|
|
@@ -97,6 +129,17 @@ function ReadyState() {
|
|
|
97
129
|
const link = `/order/details?id=${order_id}`;
|
|
98
130
|
location.replace(link);
|
|
99
131
|
};
|
|
132
|
+
const handleBack = () => {
|
|
133
|
+
if (currentStep !== "product") {
|
|
134
|
+
prevStep();
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (entryMode === "additional_order" && (entryContext == null ? void 0 : entryContext.order_id)) {
|
|
138
|
+
handleOrderDetail(entryContext.order_id);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
location.replace("/");
|
|
142
|
+
};
|
|
100
143
|
const enterProductStep = async () => {
|
|
101
144
|
try {
|
|
102
145
|
await runModuleAction("applyItemRulePrefill");
|
|
@@ -107,6 +150,40 @@ function ReadyState() {
|
|
|
107
150
|
goToStep("product");
|
|
108
151
|
}
|
|
109
152
|
};
|
|
153
|
+
const runEntryPaxGateThenEnterProduct = async () => {
|
|
154
|
+
if (requestEntryPaxRef.current !== 1) {
|
|
155
|
+
await enterProductStep();
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const pax = await new Promise((resolve) => {
|
|
159
|
+
var _a2;
|
|
160
|
+
if (typeof (utils == null ? void 0 : utils.action) !== "function") {
|
|
161
|
+
resolve(null);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
utils.action({
|
|
165
|
+
type: "pisell1.handlePaxModal",
|
|
166
|
+
data: {
|
|
167
|
+
tableName: getLocalizedName((_a2 = tableFormRecordRef.current) == null ? void 0 : _a2.name),
|
|
168
|
+
requestPaxMin: requestPaxMinRef.current,
|
|
169
|
+
requestPaxMax: requestPaxMaxRef.current
|
|
170
|
+
},
|
|
171
|
+
callback: (result) => {
|
|
172
|
+
resolve(extractEntryPaxNumber(result));
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
if (pax == null) {
|
|
177
|
+
location.replace("/");
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
await runModuleAction("setEntryPaxNumber", pax);
|
|
182
|
+
} catch (error) {
|
|
183
|
+
console.warn("[scanOrder] setOtherParams failed", error);
|
|
184
|
+
}
|
|
185
|
+
await enterProductStep();
|
|
186
|
+
};
|
|
110
187
|
const closePolicyAndBack = () => {
|
|
111
188
|
setPolicyModal({
|
|
112
189
|
open: false,
|
|
@@ -139,7 +216,7 @@ function ReadyState() {
|
|
|
139
216
|
content: null
|
|
140
217
|
});
|
|
141
218
|
setPendingFormPayload(null);
|
|
142
|
-
void
|
|
219
|
+
void runEntryPaxGateThenEnterProduct();
|
|
143
220
|
};
|
|
144
221
|
const handleFormConfirm = () => {
|
|
145
222
|
var _a2, _b2;
|
|
@@ -156,7 +233,7 @@ function ReadyState() {
|
|
|
156
233
|
openFormModal(pendingFormPayload);
|
|
157
234
|
return;
|
|
158
235
|
}
|
|
159
|
-
void
|
|
236
|
+
void runEntryPaxGateThenEnterProduct();
|
|
160
237
|
};
|
|
161
238
|
const depositProtocolRequest = (id) => {
|
|
162
239
|
var _a2, _b2;
|
|
@@ -165,28 +242,45 @@ function ReadyState() {
|
|
|
165
242
|
(0, import_react.useEffect)(() => {
|
|
166
243
|
const checkResourceAvailable = async () => {
|
|
167
244
|
const hasOrderId = !!(entryContext == null ? void 0 : entryContext.order_id);
|
|
168
|
-
const {
|
|
245
|
+
const {
|
|
246
|
+
mode,
|
|
247
|
+
order_id,
|
|
248
|
+
errorTips,
|
|
249
|
+
policy,
|
|
250
|
+
form,
|
|
251
|
+
partyroom_booking,
|
|
252
|
+
requestEntryPax,
|
|
253
|
+
requestPaxMin,
|
|
254
|
+
requestPaxMax,
|
|
255
|
+
table_form_record
|
|
256
|
+
} = await runModuleAction(
|
|
169
257
|
"checkResourceAvailable",
|
|
170
258
|
entryContext == null ? void 0 : entryContext.resource_id,
|
|
171
259
|
hasOrderId
|
|
172
260
|
);
|
|
261
|
+
requestEntryPaxRef.current = Number(requestEntryPax) === 1 ? 1 : 0;
|
|
262
|
+
requestPaxMinRef.current = Number(requestPaxMin) || 1;
|
|
263
|
+
requestPaxMaxRef.current = Number(requestPaxMax) || 1;
|
|
264
|
+
tableFormRecordRef.current = table_form_record || {};
|
|
173
265
|
const normalizedFormPayload = normalizeFormPayload(form, partyroom_booking);
|
|
174
|
-
|
|
266
|
+
const isAdditionalOrder = mode === "additional_order" || mode === "additional_order_with_code";
|
|
267
|
+
setEntryMode(isAdditionalOrder ? "additional_order" : "default");
|
|
268
|
+
if (mode === "idle") {
|
|
175
269
|
const normalizedPolicyPayload = typeof policy === "object" && policy !== null ? policy : { id: policy };
|
|
176
|
-
if (
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
270
|
+
if (normalizedPolicyPayload == null ? void 0 : normalizedPolicyPayload.id) {
|
|
271
|
+
setPendingFormPayload(normalizedFormPayload);
|
|
272
|
+
setPolicyModal({
|
|
273
|
+
open: true,
|
|
274
|
+
content: normalizedPolicyPayload
|
|
275
|
+
});
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
if (normalizedFormPayload) {
|
|
279
|
+
openFormModal(normalizedFormPayload);
|
|
280
|
+
return;
|
|
189
281
|
}
|
|
282
|
+
await runEntryPaxGateThenEnterProduct();
|
|
283
|
+
} else if (isAdditionalOrder) {
|
|
190
284
|
await enterProductStep();
|
|
191
285
|
} else if (mode === "resource_busy") {
|
|
192
286
|
if (!isLogin) {
|
|
@@ -251,37 +345,52 @@ function ReadyState() {
|
|
|
251
345
|
check: /* @__PURE__ */ import_react.default.createElement(import_Check.default, null),
|
|
252
346
|
error: /* @__PURE__ */ import_react.default.createElement(import_ErrorState.default, { message: import_utils.locales.getText("pisell2.scan.order.store.status.exception") })
|
|
253
347
|
};
|
|
254
|
-
const
|
|
348
|
+
const getFirstFailedProductIds = () => {
|
|
255
349
|
const firstFailure = Array.isArray(cartValidation == null ? void 0 : cartValidation.failures) ? cartValidation.failures[0] : null;
|
|
256
|
-
const
|
|
257
|
-
const
|
|
258
|
-
|
|
259
|
-
|
|
350
|
+
const targets = Array.isArray(firstFailure == null ? void 0 : firstFailure.targets) ? firstFailure.targets : [];
|
|
351
|
+
const ids = [];
|
|
352
|
+
const seen = /* @__PURE__ */ new Set();
|
|
353
|
+
for (const target of targets) {
|
|
354
|
+
const id = Number(target == null ? void 0 : target.product_id);
|
|
355
|
+
if (Number.isFinite(id) && id > 0 && !seen.has(id)) {
|
|
356
|
+
seen.add(id);
|
|
357
|
+
ids.push(id);
|
|
358
|
+
}
|
|
260
359
|
}
|
|
261
|
-
return
|
|
360
|
+
return ids;
|
|
262
361
|
};
|
|
263
|
-
const
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
});
|
|
273
|
-
failedProductElement.classList.add("highlight-product-item");
|
|
274
|
-
setTimeout(() => {
|
|
362
|
+
const scrollAndHighlightProductsByIds = (productIds) => {
|
|
363
|
+
if (!(productIds == null ? void 0 : productIds.length)) return false;
|
|
364
|
+
let scrolled = false;
|
|
365
|
+
let highlighted = false;
|
|
366
|
+
for (const productId of productIds) {
|
|
367
|
+
const failedProductElement = document.querySelector(
|
|
368
|
+
`[data-product-id="${String(productId)}"]`
|
|
369
|
+
);
|
|
370
|
+
if (!failedProductElement) continue;
|
|
275
371
|
failedProductElement.classList.remove("highlight-product-item");
|
|
276
|
-
|
|
277
|
-
|
|
372
|
+
if (!scrolled) {
|
|
373
|
+
failedProductElement.scrollIntoView({
|
|
374
|
+
behavior: "smooth",
|
|
375
|
+
block: "center"
|
|
376
|
+
});
|
|
377
|
+
scrolled = true;
|
|
378
|
+
}
|
|
379
|
+
void failedProductElement.offsetWidth;
|
|
380
|
+
failedProductElement.classList.add("highlight-product-item");
|
|
381
|
+
setTimeout(() => {
|
|
382
|
+
failedProductElement.classList.remove("highlight-product-item");
|
|
383
|
+
}, 3e3);
|
|
384
|
+
highlighted = true;
|
|
385
|
+
}
|
|
386
|
+
return highlighted;
|
|
278
387
|
};
|
|
279
388
|
const gotoCheckOrder = async () => {
|
|
280
389
|
const firstFailure = Array.isArray(cartValidation == null ? void 0 : cartValidation.failures) ? cartValidation.failures[0] : null;
|
|
281
390
|
if ((cartValidation == null ? void 0 : cartValidation.passed) === false) {
|
|
282
|
-
const
|
|
283
|
-
if (
|
|
284
|
-
|
|
391
|
+
const failedProductIds = getFirstFailedProductIds();
|
|
392
|
+
if (failedProductIds.length) {
|
|
393
|
+
scrollAndHighlightProductsByIds(failedProductIds);
|
|
285
394
|
}
|
|
286
395
|
const failureTips = String((firstFailure == null ? void 0 : firstFailure.validationMessage) || "").trim();
|
|
287
396
|
(0, import_materials.PisellToast)({
|
|
@@ -326,7 +435,7 @@ function ReadyState() {
|
|
|
326
435
|
if (isMobileView) return false;
|
|
327
436
|
return currentStep === "product";
|
|
328
437
|
}, [currentStep, isMobileView]);
|
|
329
|
-
return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(import_Header.default, { currentStep, onBack:
|
|
438
|
+
return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(import_Header.default, { currentStep, onBack: handleBack }), /* @__PURE__ */ import_react.default.createElement(
|
|
330
439
|
"div",
|
|
331
440
|
{
|
|
332
441
|
className: `pisell-scan-order-content-wrap ${isMobileView ? "pisell-scan-order-content-mobile-wrap" : ""}`,
|
|
@@ -149,16 +149,6 @@ function ScanOrderProvider({
|
|
|
149
149
|
if (typeof scanOrderModule.getPageConfig === "function") {
|
|
150
150
|
await scanOrderModule.getPageConfig(entryContext);
|
|
151
151
|
}
|
|
152
|
-
await (0, import_hooks.safeRunModuleAction)(scanOrderModule, "setItemRuleRuntimeConfig", {
|
|
153
|
-
pax: {
|
|
154
|
-
total: 2,
|
|
155
|
-
adult: 2,
|
|
156
|
-
child: 0
|
|
157
|
-
},
|
|
158
|
-
serviceType: "dine-in",
|
|
159
|
-
submissionIndex: 0,
|
|
160
|
-
historicalItems: []
|
|
161
|
-
});
|
|
162
152
|
await refreshViewModel();
|
|
163
153
|
if (!unmounted) {
|
|
164
154
|
setErrorMessage("");
|
|
@@ -2,8 +2,9 @@ interface ScanOrderOrderProduct {
|
|
|
2
2
|
product_id: number | null;
|
|
3
3
|
product_variant_id: number;
|
|
4
4
|
num?: number;
|
|
5
|
-
|
|
5
|
+
/** 券后单品单价(订单域成交单价)。 */
|
|
6
6
|
selling_price?: string | number;
|
|
7
|
+
/** 券前单品单价(店铺售价)。 */
|
|
7
8
|
original_price?: string | number;
|
|
8
9
|
product_option_item?: any[];
|
|
9
10
|
product_bundle?: any[];
|
|
@@ -37,19 +37,22 @@ function getDisplayName(product) {
|
|
|
37
37
|
const origin = (product == null ? void 0 : product._origin) || {};
|
|
38
38
|
const callbackData = (origin == null ? void 0 : origin.callbackData) || {};
|
|
39
39
|
const callbackOrigin = (callbackData == null ? void 0 : callbackData.origin) || {};
|
|
40
|
-
|
|
40
|
+
const sourceItem = (origin == null ? void 0 : origin.sourceItem) || {};
|
|
41
|
+
return (callbackData == null ? void 0 : callbackData.name) || (callbackData == null ? void 0 : callbackData.title) || (callbackOrigin == null ? void 0 : callbackOrigin.name) || (callbackOrigin == null ? void 0 : callbackOrigin.title) || (sourceItem == null ? void 0 : sourceItem.name) || (sourceItem == null ? void 0 : sourceItem.title) || (origin == null ? void 0 : origin.name) || (origin == null ? void 0 : origin.title) || ((_b = (_a = origin == null ? void 0 : origin.resources) == null ? void 0 : _a[0]) == null ? void 0 : _b.main_field) || ((_c = product == null ? void 0 : product.metadata) == null ? void 0 : _c.resource_name) || `Product #${product.product_id ?? "unknown"}`;
|
|
41
42
|
}
|
|
42
43
|
function getDisplayImage(product) {
|
|
43
44
|
const origin = (product == null ? void 0 : product._origin) || {};
|
|
44
45
|
const callbackData = (origin == null ? void 0 : origin.callbackData) || {};
|
|
45
46
|
const callbackOrigin = (callbackData == null ? void 0 : callbackData.origin) || {};
|
|
46
|
-
|
|
47
|
+
const sourceItem = (origin == null ? void 0 : origin.sourceItem) || {};
|
|
48
|
+
return (callbackData == null ? void 0 : callbackData.image) || (callbackData == null ? void 0 : callbackData.cover) || (callbackOrigin == null ? void 0 : callbackOrigin.image) || (callbackOrigin == null ? void 0 : callbackOrigin.cover) || (sourceItem == null ? void 0 : sourceItem.image) || (sourceItem == null ? void 0 : sourceItem.cover) || (origin == null ? void 0 : origin.image) || (origin == null ? void 0 : origin.cover) || "";
|
|
47
49
|
}
|
|
48
50
|
function getUnitPrice(product) {
|
|
49
|
-
|
|
50
|
-
const callbackData = (
|
|
51
|
+
var _a, _b;
|
|
52
|
+
const callbackData = ((_a = product == null ? void 0 : product._origin) == null ? void 0 : _a.callbackData) || {};
|
|
51
53
|
const callbackOrigin = (callbackData == null ? void 0 : callbackData.origin) || {};
|
|
52
|
-
|
|
54
|
+
const sourceItem = ((_b = product == null ? void 0 : product._origin) == null ? void 0 : _b.sourceItem) || {};
|
|
55
|
+
return toNumber(product.selling_price, NaN) || toNumber(product.original_price, NaN) || toNumber(callbackData == null ? void 0 : callbackData.price, NaN) || toNumber(callbackOrigin == null ? void 0 : callbackOrigin.price, NaN) || toNumber(sourceItem == null ? void 0 : sourceItem.price, 0);
|
|
53
56
|
}
|
|
54
57
|
function normalizeOptions(product) {
|
|
55
58
|
var _a;
|
|
@@ -43,9 +43,10 @@ export interface ScanOrderOrderProductInput {
|
|
|
43
43
|
price: number;
|
|
44
44
|
}>;
|
|
45
45
|
product_bundle: ProductDetailBundleItem[];
|
|
46
|
+
/** 券后单品单价;初次加购由入口置为 selling_price,之后由 SDK Rules 引擎维护。 */
|
|
46
47
|
selling_price: string;
|
|
48
|
+
/** 券前单品单价(店铺售价)。 */
|
|
47
49
|
original_price: string;
|
|
48
|
-
payment_price: string;
|
|
49
50
|
tax_fee: string;
|
|
50
51
|
is_charge_tax: number;
|
|
51
52
|
metadata: Record<string, any>;
|
|
@@ -83,14 +83,7 @@ function transformProductDetailToOrderProduct(params) {
|
|
|
83
83
|
(payload == null ? void 0 : payload.price) ?? (payload == null ? void 0 : payload.selling_price) ?? (callbackOrigin == null ? void 0 : callbackOrigin.price) ?? (sourceItem == null ? void 0 : sourceItem.price) ?? (sourceItem == null ? void 0 : sourceItem.selling_price) ?? (sourceItem == null ? void 0 : sourceItem.base_price),
|
|
84
84
|
"0.00"
|
|
85
85
|
);
|
|
86
|
-
const originalPrice =
|
|
87
|
-
(payload == null ? void 0 : payload.original_price) ?? (callbackOrigin == null ? void 0 : callbackOrigin.original_price) ?? (sourceItem == null ? void 0 : sourceItem.original_price) ?? sellingPrice,
|
|
88
|
-
sellingPrice
|
|
89
|
-
);
|
|
90
|
-
const paymentPrice = toPriceString(
|
|
91
|
-
(payload == null ? void 0 : payload.payment_price) ?? (callbackOrigin == null ? void 0 : callbackOrigin.payment_price) ?? (sourceItem == null ? void 0 : sourceItem.payment_price) ?? sellingPrice,
|
|
92
|
-
sellingPrice
|
|
93
|
-
);
|
|
86
|
+
const originalPrice = sellingPrice;
|
|
94
87
|
const taxFee = toPriceString(
|
|
95
88
|
(payload == null ? void 0 : payload.tax_fee) ?? (callbackOrigin == null ? void 0 : callbackOrigin.tax_fee) ?? (sourceItem == null ? void 0 : sourceItem.tax_fee),
|
|
96
89
|
"0.00"
|
|
@@ -111,7 +104,6 @@ function transformProductDetailToOrderProduct(params) {
|
|
|
111
104
|
),
|
|
112
105
|
selling_price: sellingPrice,
|
|
113
106
|
original_price: originalPrice,
|
|
114
|
-
payment_price: paymentPrice,
|
|
115
107
|
tax_fee: taxFee,
|
|
116
108
|
is_charge_tax: isChargeTax,
|
|
117
109
|
metadata: {
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
1
|
import { CalendarDataItem, ScheduleItem } from "./type";
|
|
3
2
|
import dayjs from "dayjs";
|
|
4
3
|
export interface FormState {
|
|
@@ -69,11 +68,4 @@ export interface FormState {
|
|
|
69
68
|
};
|
|
70
69
|
setGlobalState: Function | null;
|
|
71
70
|
}
|
|
72
|
-
export declare const Provider:
|
|
73
|
-
state: FormState;
|
|
74
|
-
} & {
|
|
75
|
-
dispatch: (params: {
|
|
76
|
-
type: string;
|
|
77
|
-
payload: any;
|
|
78
|
-
}) => void;
|
|
79
|
-
}>;
|
|
71
|
+
export declare const Provider: any, Context: any;
|
|
@@ -190,6 +190,33 @@ function toContactsInfoPayload(formValues) {
|
|
|
190
190
|
}
|
|
191
191
|
];
|
|
192
192
|
}
|
|
193
|
+
function applyI18nPlaceholders(template, vars) {
|
|
194
|
+
let result = template;
|
|
195
|
+
for (const [key, value] of Object.entries(vars)) {
|
|
196
|
+
result = result.split(`{${key}}`).join(String(value));
|
|
197
|
+
}
|
|
198
|
+
return result;
|
|
199
|
+
}
|
|
200
|
+
function formatCheckoutDurationText(totalMinutes) {
|
|
201
|
+
const hours = Math.floor(totalMinutes / 60);
|
|
202
|
+
const minutes = totalMinutes % 60;
|
|
203
|
+
if (hours > 0 && minutes > 0) {
|
|
204
|
+
const tpl2 = String(
|
|
205
|
+
import_utils.locales.getText("pisell2.venue.checkout.duration.hours_minutes") || "{hours}h {minutes}min"
|
|
206
|
+
);
|
|
207
|
+
return applyI18nPlaceholders(tpl2, { hours, minutes });
|
|
208
|
+
}
|
|
209
|
+
if (hours > 0) {
|
|
210
|
+
const tpl2 = String(
|
|
211
|
+
import_utils.locales.getText("pisell2.venue.checkout.duration.hours") || "{hours}h"
|
|
212
|
+
);
|
|
213
|
+
return applyI18nPlaceholders(tpl2, { hours });
|
|
214
|
+
}
|
|
215
|
+
const tpl = String(
|
|
216
|
+
import_utils.locales.getText("pisell2.venue.checkout.duration.minutes") || "{minutes}min"
|
|
217
|
+
);
|
|
218
|
+
return applyI18nPlaceholders(tpl, { minutes });
|
|
219
|
+
}
|
|
193
220
|
function getSessionDisplayText(item) {
|
|
194
221
|
const startRaw = String((item == null ? void 0 : item.start_date) || "");
|
|
195
222
|
const endRaw = String((item == null ? void 0 : item.end_date) || "");
|
|
@@ -198,9 +225,7 @@ function getSessionDisplayText(item) {
|
|
|
198
225
|
if (!start.isValid() || !end.isValid())
|
|
199
226
|
return String((item == null ? void 0 : item.description) || (item == null ? void 0 : item.subtitle) || "-");
|
|
200
227
|
const durationMinutes = Math.max(0, end.diff(start, "minute"));
|
|
201
|
-
const
|
|
202
|
-
const minutes = durationMinutes % 60;
|
|
203
|
-
const durationText = hours > 0 && minutes > 0 ? `${hours}h ${minutes}m` : hours > 0 ? `${hours}h` : `${minutes}m`;
|
|
228
|
+
const durationText = formatCheckoutDurationText(durationMinutes);
|
|
204
229
|
return `${start.format("HH:mm")} ~ ${end.format("HH:mm")} ${start.format("DD/MM/YYYY")} (${durationText})`;
|
|
205
230
|
}
|
|
206
231
|
function getVenueResourceName(item) {
|
|
@@ -289,7 +289,7 @@ function TimeGrid() {
|
|
|
289
289
|
symbol,
|
|
290
290
|
precision: 2,
|
|
291
291
|
showCurrencySymbol: true,
|
|
292
|
-
hideDecimalForWholeNumbers:
|
|
292
|
+
hideDecimalForWholeNumbers: true,
|
|
293
293
|
className: `text-[13px] font-normal leading-4 ${priceClass} md:text-sm`
|
|
294
294
|
}
|
|
295
295
|
), tag ? /* @__PURE__ */ import_react.default.createElement("div", { className: `inline-flex rounded-full px-1.5 py-0 text-[8px] font-semibold leading-4 ring-1 md:text-[9px] ${tag.className}` }, tagText) : null)
|
|
@@ -122,6 +122,7 @@ function VenueBookingProvider({ entryContext, children }) {
|
|
|
122
122
|
const [isSubmittingOrder, setIsSubmittingOrder] = (0, import_react.useState)(false);
|
|
123
123
|
const anchorDateRef = (0, import_react.useRef)(anchorDate);
|
|
124
124
|
anchorDateRef.current = anchorDate;
|
|
125
|
+
const bootstrappedRef = (0, import_react.useRef)(false);
|
|
125
126
|
const canNext = (0, import_react.useMemo)(() => {
|
|
126
127
|
const allSelected = (0, import_hooks.getAllSelectedSlots)(venueBookingModule);
|
|
127
128
|
if (Array.isArray(allSelected) && allSelected.length > 0) return true;
|
|
@@ -303,6 +304,12 @@ function VenueBookingProvider({ entryContext, children }) {
|
|
|
303
304
|
console.warn("[venueBooking] handleLoginSuccess failed", error);
|
|
304
305
|
}
|
|
305
306
|
}, [syncCustomerLoginToModule, venueBookingModule, refreshViewModel]);
|
|
307
|
+
const syncCustomerLoginRef = (0, import_react.useRef)(syncCustomerLoginToModule);
|
|
308
|
+
syncCustomerLoginRef.current = syncCustomerLoginToModule;
|
|
309
|
+
const goToNearestAvailableDateRef = (0, import_react.useRef)(goToNearestAvailableDate);
|
|
310
|
+
goToNearestAvailableDateRef.current = goToNearestAvailableDate;
|
|
311
|
+
const handleLoginSuccessRef = (0, import_react.useRef)(handleLoginSuccess);
|
|
312
|
+
handleLoginSuccessRef.current = handleLoginSuccess;
|
|
306
313
|
const submitOrder = (0, import_react.useCallback)(async () => {
|
|
307
314
|
var _a2, _b2, _c2;
|
|
308
315
|
if (isSubmittingOrder) return;
|
|
@@ -414,7 +421,7 @@ function VenueBookingProvider({ entryContext, children }) {
|
|
|
414
421
|
if (!pubsub) return;
|
|
415
422
|
const onGlobalLoginSuccess = async (res) => {
|
|
416
423
|
if (res === "success" || (res == null ? void 0 : res.status) === "success") {
|
|
417
|
-
await
|
|
424
|
+
await handleLoginSuccessRef.current();
|
|
418
425
|
}
|
|
419
426
|
};
|
|
420
427
|
(_a2 = pubsub.subscribe) == null ? void 0 : _a2.call(pubsub, "pisell1.login.success", onGlobalLoginSuccess);
|
|
@@ -422,7 +429,7 @@ function VenueBookingProvider({ entryContext, children }) {
|
|
|
422
429
|
var _a3;
|
|
423
430
|
(_a3 = pubsub.unsubscribe) == null ? void 0 : _a3.call(pubsub, "pisell1.login.success", onGlobalLoginSuccess);
|
|
424
431
|
};
|
|
425
|
-
}, [utils == null ? void 0 : utils.pubsub
|
|
432
|
+
}, [utils == null ? void 0 : utils.pubsub]);
|
|
426
433
|
(0, import_react.useEffect)(() => {
|
|
427
434
|
if (!venueBookingModule) return;
|
|
428
435
|
setIsGridTransition(true);
|
|
@@ -463,15 +470,16 @@ function VenueBookingProvider({ entryContext, children }) {
|
|
|
463
470
|
};
|
|
464
471
|
}, [pisellOS, venueBookingModule]);
|
|
465
472
|
(0, import_react.useEffect)(() => {
|
|
466
|
-
if (!venueBookingModule) return;
|
|
473
|
+
if (bootstrappedRef.current || !venueBookingModule) return;
|
|
474
|
+
bootstrappedRef.current = true;
|
|
467
475
|
let unmounted = false;
|
|
468
476
|
const bootstrap = async () => {
|
|
469
477
|
try {
|
|
470
478
|
setIsLoading(true);
|
|
471
|
-
await
|
|
479
|
+
await syncCustomerLoginRef.current();
|
|
472
480
|
await (0, import_hooks.loadVenueProducts)(venueBookingModule, import_hooks.VENUE_PRODUCT_IDS);
|
|
473
481
|
const venueProducts = typeof (venueBookingModule == null ? void 0 : venueBookingModule.getVenueProducts) === "function" ? venueBookingModule.getVenueProducts() : [];
|
|
474
|
-
await
|
|
482
|
+
await goToNearestAvailableDateRef.current(anchorDateRef.current);
|
|
475
483
|
const moduleData = (0, import_hooks.createVenueBookingViewModel)(venueBookingModule);
|
|
476
484
|
if (!unmounted) {
|
|
477
485
|
setViewModel((prev) => ({
|
|
@@ -506,7 +514,7 @@ function VenueBookingProvider({ entryContext, children }) {
|
|
|
506
514
|
return () => {
|
|
507
515
|
unmounted = true;
|
|
508
516
|
};
|
|
509
|
-
}, [venueBookingModule
|
|
517
|
+
}, [venueBookingModule]);
|
|
510
518
|
const value = (0, import_react.useMemo)(() => ({
|
|
511
519
|
venueBookingModule,
|
|
512
520
|
currentStep,
|
|
@@ -78,6 +78,9 @@ declare const _default: {
|
|
|
78
78
|
'pisell2.venue.checkout.hotline': string;
|
|
79
79
|
'pisell2.venue.checkout.estimated.total': string;
|
|
80
80
|
'pisell2.venue.checkout.change': string;
|
|
81
|
+
'pisell2.venue.checkout.duration.hours_minutes': string;
|
|
82
|
+
'pisell2.venue.checkout.duration.hours': string;
|
|
83
|
+
'pisell2.venue.checkout.duration.minutes': string;
|
|
81
84
|
'pisell2.venue.grid.loading': string;
|
|
82
85
|
'pisell2.venue.legend.product.fallback': string;
|
|
83
86
|
'pisell2.venue.addons.empty': string;
|
|
@@ -199,6 +202,9 @@ declare const _default: {
|
|
|
199
202
|
'pisell2.venue.checkout.hotline': string;
|
|
200
203
|
'pisell2.venue.checkout.estimated.total': string;
|
|
201
204
|
'pisell2.venue.checkout.change': string;
|
|
205
|
+
'pisell2.venue.checkout.duration.hours_minutes': string;
|
|
206
|
+
'pisell2.venue.checkout.duration.hours': string;
|
|
207
|
+
'pisell2.venue.checkout.duration.minutes': string;
|
|
202
208
|
'pisell2.venue.grid.loading': string;
|
|
203
209
|
'pisell2.venue.legend.product.fallback': string;
|
|
204
210
|
'pisell2.venue.addons.empty': string;
|
|
@@ -320,6 +326,9 @@ declare const _default: {
|
|
|
320
326
|
'pisell2.venue.checkout.hotline': string;
|
|
321
327
|
'pisell2.venue.checkout.estimated.total': string;
|
|
322
328
|
'pisell2.venue.checkout.change': string;
|
|
329
|
+
'pisell2.venue.checkout.duration.hours_minutes': string;
|
|
330
|
+
'pisell2.venue.checkout.duration.hours': string;
|
|
331
|
+
'pisell2.venue.checkout.duration.minutes': string;
|
|
323
332
|
'pisell2.venue.grid.loading': string;
|
|
324
333
|
'pisell2.venue.legend.product.fallback': string;
|
|
325
334
|
'pisell2.venue.addons.empty': string;
|
|
@@ -441,6 +450,9 @@ declare const _default: {
|
|
|
441
450
|
'pisell2.venue.checkout.hotline': string;
|
|
442
451
|
'pisell2.venue.checkout.estimated.total': string;
|
|
443
452
|
'pisell2.venue.checkout.change': string;
|
|
453
|
+
'pisell2.venue.checkout.duration.hours_minutes': string;
|
|
454
|
+
'pisell2.venue.checkout.duration.hours': string;
|
|
455
|
+
'pisell2.venue.checkout.duration.minutes': string;
|
|
444
456
|
'pisell2.venue.grid.loading': string;
|
|
445
457
|
'pisell2.venue.legend.product.fallback': string;
|
|
446
458
|
'pisell2.venue.addons.empty': string;
|
|
@@ -562,6 +574,9 @@ declare const _default: {
|
|
|
562
574
|
'pisell2.venue.checkout.hotline': string;
|
|
563
575
|
'pisell2.venue.checkout.estimated.total': string;
|
|
564
576
|
'pisell2.venue.checkout.change': string;
|
|
577
|
+
'pisell2.venue.checkout.duration.hours_minutes': string;
|
|
578
|
+
'pisell2.venue.checkout.duration.hours': string;
|
|
579
|
+
'pisell2.venue.checkout.duration.minutes': string;
|
|
565
580
|
'pisell2.venue.grid.loading': string;
|
|
566
581
|
'pisell2.venue.legend.product.fallback': string;
|
|
567
582
|
'pisell2.venue.addons.empty': string;
|
|
@@ -98,6 +98,9 @@ var locales_default = {
|
|
|
98
98
|
"pisell2.venue.checkout.hotline": "Support hotline",
|
|
99
99
|
"pisell2.venue.checkout.estimated.total": "Estimated total",
|
|
100
100
|
"pisell2.venue.checkout.change": "Change",
|
|
101
|
+
"pisell2.venue.checkout.duration.hours_minutes": "{hours}h {minutes}min",
|
|
102
|
+
"pisell2.venue.checkout.duration.hours": "{hours}h",
|
|
103
|
+
"pisell2.venue.checkout.duration.minutes": "{minutes}min",
|
|
101
104
|
"pisell2.venue.grid.loading": "Loading...",
|
|
102
105
|
"pisell2.venue.legend.product.fallback": "Product",
|
|
103
106
|
"pisell2.venue.addons.empty": "No add-ons available.",
|
|
@@ -219,6 +222,9 @@ var locales_default = {
|
|
|
219
222
|
"pisell2.venue.checkout.hotline": "客服热线",
|
|
220
223
|
"pisell2.venue.checkout.estimated.total": "预估总价",
|
|
221
224
|
"pisell2.venue.checkout.change": "修改",
|
|
225
|
+
"pisell2.venue.checkout.duration.hours_minutes": "{hours}小时{minutes}分钟",
|
|
226
|
+
"pisell2.venue.checkout.duration.hours": "{hours}小时",
|
|
227
|
+
"pisell2.venue.checkout.duration.minutes": "{minutes}分钟",
|
|
222
228
|
"pisell2.venue.grid.loading": "加载中...",
|
|
223
229
|
"pisell2.venue.legend.product.fallback": "商品",
|
|
224
230
|
"pisell2.venue.addons.empty": "暂无可选附加商品",
|
|
@@ -340,6 +346,9 @@ var locales_default = {
|
|
|
340
346
|
"pisell2.venue.checkout.hotline": "客服熱線",
|
|
341
347
|
"pisell2.venue.checkout.estimated.total": "預估總價",
|
|
342
348
|
"pisell2.venue.checkout.change": "修改",
|
|
349
|
+
"pisell2.venue.checkout.duration.hours_minutes": "{hours}小時{minutes}分鐘",
|
|
350
|
+
"pisell2.venue.checkout.duration.hours": "{hours}小時",
|
|
351
|
+
"pisell2.venue.checkout.duration.minutes": "{minutes}分鐘",
|
|
343
352
|
"pisell2.venue.grid.loading": "加載中...",
|
|
344
353
|
"pisell2.venue.legend.product.fallback": "商品",
|
|
345
354
|
"pisell2.venue.addons.empty": "暫無可選附加商品",
|
|
@@ -461,6 +470,9 @@ var locales_default = {
|
|
|
461
470
|
"pisell2.venue.checkout.hotline": "サポート窓口",
|
|
462
471
|
"pisell2.venue.checkout.estimated.total": "見積合計",
|
|
463
472
|
"pisell2.venue.checkout.change": "変更",
|
|
473
|
+
"pisell2.venue.checkout.duration.hours_minutes": "{hours}時間{minutes}分",
|
|
474
|
+
"pisell2.venue.checkout.duration.hours": "{hours}時間",
|
|
475
|
+
"pisell2.venue.checkout.duration.minutes": "{minutes}分",
|
|
464
476
|
"pisell2.venue.grid.loading": "読み込み中...",
|
|
465
477
|
"pisell2.venue.legend.product.fallback": "商品",
|
|
466
478
|
"pisell2.venue.addons.empty": "追加できる商品がありません。",
|
|
@@ -582,6 +594,9 @@ var locales_default = {
|
|
|
582
594
|
"pisell2.venue.checkout.hotline": "Central de suporte",
|
|
583
595
|
"pisell2.venue.checkout.estimated.total": "Total estimado",
|
|
584
596
|
"pisell2.venue.checkout.change": "Alterar",
|
|
597
|
+
"pisell2.venue.checkout.duration.hours_minutes": "{hours} h {minutes} min",
|
|
598
|
+
"pisell2.venue.checkout.duration.hours": "{hours} h",
|
|
599
|
+
"pisell2.venue.checkout.duration.minutes": "{minutes} min",
|
|
585
600
|
"pisell2.venue.grid.loading": "Carregando...",
|
|
586
601
|
"pisell2.venue.legend.product.fallback": "Produto",
|
|
587
602
|
"pisell2.venue.addons.empty": "Nenhum adicional disponível.",
|