@pisell/private-materials 6.11.125 → 6.11.126
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/es/plus/pisellReservation/components/bookingChangeModal/demo.d.ts +2 -0
- package/es/plus/pisellReservation/components/bookingChangeModal/demo.js +433 -0
- package/es/plus/pisellReservation/components/bookingChangeModal/index.d.ts +154 -0
- package/es/plus/pisellReservation/components/bookingChangeModal/index.js +685 -0
- package/es/plus/pisellReservation/components/bookingChangeModal/index.less +320 -0
- package/lib/plus/pisellReservation/components/bookingChangeModal/demo.d.ts +2 -0
- package/lib/plus/pisellReservation/components/bookingChangeModal/demo.js +388 -0
- package/lib/plus/pisellReservation/components/bookingChangeModal/index.d.ts +154 -0
- package/lib/plus/pisellReservation/components/bookingChangeModal/index.js +632 -0
- package/lib/plus/pisellReservation/components/bookingChangeModal/index.less +320 -0
- package/package.json +2 -2
- package/es/plus/pisellReservation/PisellReservation.d.ts +0 -11
- package/es/plus/pisellReservation/hooks/usePisellReservationBookingData.d.ts +0 -51
- package/lib/plus/pisellReservation/PisellReservation.d.ts +0 -11
- package/lib/plus/pisellReservation/hooks/usePisellReservationBookingData.d.ts +0 -51
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
5
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
6
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
7
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
8
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
9
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
10
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
11
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
12
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
13
|
+
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
|
|
14
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
15
|
+
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
16
|
+
import React, { useMemo, useState } from 'react';
|
|
17
|
+
import bookingChangeModal from "./index";
|
|
18
|
+
var courts = [{
|
|
19
|
+
id: 'court-a',
|
|
20
|
+
name: 'Court A'
|
|
21
|
+
}, {
|
|
22
|
+
id: 'court-b',
|
|
23
|
+
name: 'Court B'
|
|
24
|
+
}, {
|
|
25
|
+
id: 'court-c',
|
|
26
|
+
name: 'Court C'
|
|
27
|
+
}];
|
|
28
|
+
var bookings = [{
|
|
29
|
+
id: 'booking-1',
|
|
30
|
+
courtId: 'court-a',
|
|
31
|
+
date: '2026-04-17',
|
|
32
|
+
startHour: 10,
|
|
33
|
+
endHour: 12,
|
|
34
|
+
name: 'Alice Johnson',
|
|
35
|
+
kind: 'booking',
|
|
36
|
+
phone: '0412 111 222'
|
|
37
|
+
}, {
|
|
38
|
+
id: 'booking-2',
|
|
39
|
+
courtId: 'court-b',
|
|
40
|
+
date: '2026-04-17',
|
|
41
|
+
startHour: 13,
|
|
42
|
+
endHour: 15,
|
|
43
|
+
name: 'Bob Martin',
|
|
44
|
+
kind: 'booking',
|
|
45
|
+
phone: '0412 333 444'
|
|
46
|
+
}, {
|
|
47
|
+
id: 'booking-3',
|
|
48
|
+
courtId: 'court-c',
|
|
49
|
+
date: '2026-04-18',
|
|
50
|
+
startHour: 9,
|
|
51
|
+
endHour: 10.5,
|
|
52
|
+
name: 'Cindy Brown',
|
|
53
|
+
kind: 'booking',
|
|
54
|
+
phone: '0412 555 666'
|
|
55
|
+
}, {
|
|
56
|
+
id: 'booking-4',
|
|
57
|
+
courtId: 'court-a',
|
|
58
|
+
date: '2026-04-18',
|
|
59
|
+
startHour: 15,
|
|
60
|
+
endHour: 17,
|
|
61
|
+
name: 'David Lee',
|
|
62
|
+
kind: 'booking',
|
|
63
|
+
phone: '0412 777 888'
|
|
64
|
+
}];
|
|
65
|
+
var hourSlots = Array.from({
|
|
66
|
+
length: 25
|
|
67
|
+
}, function (_, index) {
|
|
68
|
+
return 8 + index * 0.5;
|
|
69
|
+
});
|
|
70
|
+
function formatHourLabel(hour) {
|
|
71
|
+
var hours = Math.floor(hour);
|
|
72
|
+
var minutes = Math.round((hour - hours) * 60);
|
|
73
|
+
return "".concat(String(hours).padStart(2, '0'), ":").concat(String(minutes).padStart(2, '0'));
|
|
74
|
+
}
|
|
75
|
+
function hasConflict(list, targetCourtId, targetDate, startHour, endHour, excludeBookingId) {
|
|
76
|
+
return list.some(function (booking) {
|
|
77
|
+
if (booking.id === excludeBookingId) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
if (booking.courtId !== targetCourtId || booking.date !== targetDate) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
return !(endHour <= booking.startHour || startHour >= booking.endHour);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
function getBookingDetailData(item) {
|
|
87
|
+
var _courts$find;
|
|
88
|
+
var courtName = ((_courts$find = courts.find(function (court) {
|
|
89
|
+
return court.id === item.courtId;
|
|
90
|
+
})) === null || _courts$find === void 0 ? void 0 : _courts$find.name) || 'Court';
|
|
91
|
+
return {
|
|
92
|
+
customer: {
|
|
93
|
+
name: item.name || 'Unknown customer',
|
|
94
|
+
phone: item.phone || '',
|
|
95
|
+
email: "".concat(String(item.name || 'guest').toLowerCase().replace(/\s+/g, '.'), "@example.com")
|
|
96
|
+
},
|
|
97
|
+
headerSummary: {
|
|
98
|
+
customerName: item.name || 'Unknown customer',
|
|
99
|
+
resourceLabel: courtName
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function createCustomerChangeHandler(scenarioLabel) {
|
|
104
|
+
return /*#__PURE__*/function () {
|
|
105
|
+
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
|
|
106
|
+
var customer;
|
|
107
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
108
|
+
while (1) switch (_context.prev = _context.next) {
|
|
109
|
+
case 0:
|
|
110
|
+
customer = _ref.customer;
|
|
111
|
+
if (!(scenarioLabel === 'No customer change')) {
|
|
112
|
+
_context.next = 3;
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
return _context.abrupt("return", null);
|
|
116
|
+
case 3:
|
|
117
|
+
return _context.abrupt("return", {
|
|
118
|
+
name: "".concat(customer.name, " (").concat(scenarioLabel, ")"),
|
|
119
|
+
phone: '0400 000 000',
|
|
120
|
+
email: "".concat(scenarioLabel.toLowerCase().replace(/\s+/g, '-'), "@example.com")
|
|
121
|
+
});
|
|
122
|
+
case 4:
|
|
123
|
+
case "end":
|
|
124
|
+
return _context.stop();
|
|
125
|
+
}
|
|
126
|
+
}, _callee);
|
|
127
|
+
}));
|
|
128
|
+
return function (_x) {
|
|
129
|
+
return _ref2.apply(this, arguments);
|
|
130
|
+
};
|
|
131
|
+
}();
|
|
132
|
+
}
|
|
133
|
+
export default (function () {
|
|
134
|
+
var _useState = useState(null),
|
|
135
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
136
|
+
latestResult = _useState2[0],
|
|
137
|
+
setLatestResult = _useState2[1];
|
|
138
|
+
var _useState3 = useState(null),
|
|
139
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
140
|
+
latestReject = _useState4[0],
|
|
141
|
+
setLatestReject = _useState4[1];
|
|
142
|
+
var _useState5 = useState(''),
|
|
143
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
144
|
+
activeScenario = _useState6[0],
|
|
145
|
+
setActiveScenario = _useState6[1];
|
|
146
|
+
var currentItem = useMemo(function () {
|
|
147
|
+
return bookings[0];
|
|
148
|
+
}, []);
|
|
149
|
+
var scenarios = useMemo(function () {
|
|
150
|
+
return [{
|
|
151
|
+
key: 'default-dark',
|
|
152
|
+
title: 'Default dark',
|
|
153
|
+
description: '最基础的打开方式,初始值与当前 booking 一致。',
|
|
154
|
+
buildOptions: function buildOptions(item) {
|
|
155
|
+
return {
|
|
156
|
+
item: item,
|
|
157
|
+
targetCourtId: item.courtId,
|
|
158
|
+
targetDate: item.date,
|
|
159
|
+
targetHour: item.startHour,
|
|
160
|
+
theme: 'dark',
|
|
161
|
+
onCustomerChange: createCustomerChangeHandler('Default dark')
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}, {
|
|
165
|
+
key: 'drag-target',
|
|
166
|
+
title: 'Drag target preset',
|
|
167
|
+
description: '模拟从日历拖拽进入弹窗,打开时就已经带有新的 court 和 time。',
|
|
168
|
+
buildOptions: function buildOptions(item) {
|
|
169
|
+
return {
|
|
170
|
+
item: item,
|
|
171
|
+
targetCourtId: 'court-c',
|
|
172
|
+
targetDate: item.date,
|
|
173
|
+
targetHour: 16,
|
|
174
|
+
theme: 'dark',
|
|
175
|
+
onCustomerChange: createCustomerChangeHandler('Drag target')
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}, {
|
|
179
|
+
key: 'cross-date',
|
|
180
|
+
title: 'Change date',
|
|
181
|
+
description: '初始目标日期不是原日期,方便验证 Original / Drop target 对比。',
|
|
182
|
+
buildOptions: function buildOptions(item) {
|
|
183
|
+
return {
|
|
184
|
+
item: item,
|
|
185
|
+
targetCourtId: 'court-b',
|
|
186
|
+
targetDate: '2026-04-18',
|
|
187
|
+
targetHour: 11,
|
|
188
|
+
theme: 'dark',
|
|
189
|
+
onCustomerChange: createCustomerChangeHandler('Change date')
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}, {
|
|
193
|
+
key: 'light-theme',
|
|
194
|
+
title: 'Light theme',
|
|
195
|
+
description: '浅色主题展示,便于确认两套视觉是否都正常。',
|
|
196
|
+
buildOptions: function buildOptions(item) {
|
|
197
|
+
return {
|
|
198
|
+
item: item,
|
|
199
|
+
targetCourtId: 'court-b',
|
|
200
|
+
targetDate: item.date,
|
|
201
|
+
targetHour: 9,
|
|
202
|
+
theme: 'light',
|
|
203
|
+
onCustomerChange: createCustomerChangeHandler('Light theme')
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
}, {
|
|
207
|
+
key: 'conflict-case',
|
|
208
|
+
title: 'Conflict state',
|
|
209
|
+
description: '目标时间与已有 booking 冲突,确认底部错误提示和 Confirm disabled。',
|
|
210
|
+
buildOptions: function buildOptions(item) {
|
|
211
|
+
return {
|
|
212
|
+
item: item,
|
|
213
|
+
targetCourtId: 'court-b',
|
|
214
|
+
targetDate: '2026-04-17',
|
|
215
|
+
targetHour: 13,
|
|
216
|
+
theme: 'dark',
|
|
217
|
+
onCustomerChange: createCustomerChangeHandler('Conflict state')
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
}, {
|
|
221
|
+
key: 'custom-copy',
|
|
222
|
+
title: 'Custom copy',
|
|
223
|
+
description: '自定义标题、描述和按钮文案,验证配置项是否生效。',
|
|
224
|
+
buildOptions: function buildOptions(item) {
|
|
225
|
+
return {
|
|
226
|
+
item: item,
|
|
227
|
+
targetCourtId: 'court-c',
|
|
228
|
+
targetDate: '2026-04-18',
|
|
229
|
+
targetHour: 9.5,
|
|
230
|
+
theme: 'dark',
|
|
231
|
+
title: 'Move this booking',
|
|
232
|
+
description: 'Review the destination before saving the booking update.',
|
|
233
|
+
confirmText: 'Save change',
|
|
234
|
+
cancelText: 'Dismiss',
|
|
235
|
+
onCustomerChange: createCustomerChangeHandler('Custom copy')
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
}, {
|
|
239
|
+
key: 'no-customer-change',
|
|
240
|
+
title: 'Without customer change',
|
|
241
|
+
description: '不传或无效切换客户时,顶部 Change 区域也能正常展示禁用态。',
|
|
242
|
+
buildOptions: function buildOptions(item) {
|
|
243
|
+
return {
|
|
244
|
+
item: item,
|
|
245
|
+
targetCourtId: item.courtId,
|
|
246
|
+
targetDate: item.date,
|
|
247
|
+
targetHour: item.startHour,
|
|
248
|
+
theme: 'dark'
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
}];
|
|
252
|
+
}, []);
|
|
253
|
+
var openScenario = /*#__PURE__*/function () {
|
|
254
|
+
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(scenario) {
|
|
255
|
+
var result;
|
|
256
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
257
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
258
|
+
case 0:
|
|
259
|
+
setActiveScenario(scenario.title);
|
|
260
|
+
setLatestResult(null);
|
|
261
|
+
setLatestReject(null);
|
|
262
|
+
_context2.prev = 3;
|
|
263
|
+
_context2.next = 6;
|
|
264
|
+
return bookingChangeModal.open(_objectSpread({
|
|
265
|
+
courts: courts,
|
|
266
|
+
visibleCourts: courts,
|
|
267
|
+
bookings: bookings,
|
|
268
|
+
hourSlots: hourSlots,
|
|
269
|
+
firstTimelineHour: 8,
|
|
270
|
+
endTimelineExclusive: 20.5,
|
|
271
|
+
getBookingDetailData: getBookingDetailData,
|
|
272
|
+
formatHourLabel: formatHourLabel,
|
|
273
|
+
isBusinessHour: function isBusinessHour(hour) {
|
|
274
|
+
return hour >= 8 && hour <= 20;
|
|
275
|
+
},
|
|
276
|
+
hasConflict: hasConflict
|
|
277
|
+
}, scenario.buildOptions(currentItem)));
|
|
278
|
+
case 6:
|
|
279
|
+
result = _context2.sent;
|
|
280
|
+
setLatestResult(result);
|
|
281
|
+
_context2.next = 13;
|
|
282
|
+
break;
|
|
283
|
+
case 10:
|
|
284
|
+
_context2.prev = 10;
|
|
285
|
+
_context2.t0 = _context2["catch"](3);
|
|
286
|
+
setLatestReject(_context2.t0);
|
|
287
|
+
case 13:
|
|
288
|
+
case "end":
|
|
289
|
+
return _context2.stop();
|
|
290
|
+
}
|
|
291
|
+
}, _callee2, null, [[3, 10]]);
|
|
292
|
+
}));
|
|
293
|
+
return function openScenario(_x2) {
|
|
294
|
+
return _ref3.apply(this, arguments);
|
|
295
|
+
};
|
|
296
|
+
}();
|
|
297
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
298
|
+
style: {
|
|
299
|
+
padding: 24,
|
|
300
|
+
background: '#f8fafc'
|
|
301
|
+
}
|
|
302
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
303
|
+
style: {
|
|
304
|
+
marginBottom: 8,
|
|
305
|
+
fontSize: 18,
|
|
306
|
+
fontWeight: 600
|
|
307
|
+
}
|
|
308
|
+
}, "BookingChangeModal Demo"), /*#__PURE__*/React.createElement("div", {
|
|
309
|
+
style: {
|
|
310
|
+
marginBottom: 20,
|
|
311
|
+
color: '#64748b',
|
|
312
|
+
fontSize: 14
|
|
313
|
+
}
|
|
314
|
+
}, "\u4E0B\u9762\u6BCF\u4E2A\u6309\u94AE\u90FD\u4F1A\u6253\u5F00\u4E00\u4E2A\u4E0D\u540C\u573A\u666F\u7684\u5F39\u7A97\uFF0C\u65B9\u4FBF\u5FEB\u901F\u68C0\u67E5\u89C6\u89C9\u548C\u4EA4\u4E92\u3002"), /*#__PURE__*/React.createElement("div", {
|
|
315
|
+
style: {
|
|
316
|
+
display: 'grid',
|
|
317
|
+
gridTemplateColumns: 'repeat(auto-fit, minmax(240px, 1fr))',
|
|
318
|
+
gap: 12
|
|
319
|
+
}
|
|
320
|
+
}, scenarios.map(function (scenario) {
|
|
321
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
322
|
+
key: scenario.key,
|
|
323
|
+
style: {
|
|
324
|
+
padding: 16,
|
|
325
|
+
border: '1px solid #e2e8f0',
|
|
326
|
+
borderRadius: 12,
|
|
327
|
+
background: '#fff'
|
|
328
|
+
}
|
|
329
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
330
|
+
style: {
|
|
331
|
+
fontSize: 15,
|
|
332
|
+
fontWeight: 600,
|
|
333
|
+
marginBottom: 8
|
|
334
|
+
}
|
|
335
|
+
}, scenario.title), /*#__PURE__*/React.createElement("div", {
|
|
336
|
+
style: {
|
|
337
|
+
minHeight: 40,
|
|
338
|
+
marginBottom: 12,
|
|
339
|
+
color: '#64748b',
|
|
340
|
+
fontSize: 13,
|
|
341
|
+
lineHeight: 1.5
|
|
342
|
+
}
|
|
343
|
+
}, scenario.description), /*#__PURE__*/React.createElement("button", {
|
|
344
|
+
type: "button",
|
|
345
|
+
onClick: function onClick() {
|
|
346
|
+
return openScenario(scenario);
|
|
347
|
+
},
|
|
348
|
+
style: {
|
|
349
|
+
width: '100%',
|
|
350
|
+
padding: '10px 16px',
|
|
351
|
+
border: 'none',
|
|
352
|
+
borderRadius: 8,
|
|
353
|
+
background: '#7c3aed',
|
|
354
|
+
color: '#fff',
|
|
355
|
+
cursor: 'pointer'
|
|
356
|
+
}
|
|
357
|
+
}, "Open ", scenario.title));
|
|
358
|
+
})), /*#__PURE__*/React.createElement("div", {
|
|
359
|
+
style: {
|
|
360
|
+
marginTop: 20,
|
|
361
|
+
padding: 16,
|
|
362
|
+
border: '1px solid #e5e7eb',
|
|
363
|
+
borderRadius: 12,
|
|
364
|
+
background: '#fafafa',
|
|
365
|
+
whiteSpace: 'pre-wrap',
|
|
366
|
+
fontSize: 13,
|
|
367
|
+
lineHeight: 1.6
|
|
368
|
+
}
|
|
369
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
370
|
+
style: {
|
|
371
|
+
marginBottom: 8,
|
|
372
|
+
fontWeight: 600
|
|
373
|
+
}
|
|
374
|
+
}, "Current booking"), /*#__PURE__*/React.createElement("div", null, JSON.stringify(currentItem, null, 2))), /*#__PURE__*/React.createElement("div", {
|
|
375
|
+
style: {
|
|
376
|
+
marginTop: 16,
|
|
377
|
+
padding: 16,
|
|
378
|
+
border: '1px solid #e5e7eb',
|
|
379
|
+
borderRadius: 12,
|
|
380
|
+
background: '#fff',
|
|
381
|
+
whiteSpace: 'pre-wrap',
|
|
382
|
+
fontSize: 13,
|
|
383
|
+
lineHeight: 1.6
|
|
384
|
+
}
|
|
385
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
386
|
+
style: {
|
|
387
|
+
marginBottom: 8,
|
|
388
|
+
fontWeight: 600
|
|
389
|
+
}
|
|
390
|
+
}, "All bookings"), /*#__PURE__*/React.createElement("div", null, JSON.stringify(bookings, null, 2))), activeScenario && /*#__PURE__*/React.createElement("div", {
|
|
391
|
+
style: {
|
|
392
|
+
marginTop: 16,
|
|
393
|
+
padding: 12,
|
|
394
|
+
borderRadius: 12,
|
|
395
|
+
background: '#ede9fe',
|
|
396
|
+
color: '#5b21b6',
|
|
397
|
+
fontSize: 13,
|
|
398
|
+
fontWeight: 600
|
|
399
|
+
}
|
|
400
|
+
}, "Last opened scenario: ", activeScenario), latestResult && /*#__PURE__*/React.createElement("div", {
|
|
401
|
+
style: {
|
|
402
|
+
marginTop: 16,
|
|
403
|
+
padding: 16,
|
|
404
|
+
border: '1px solid #d1fae5',
|
|
405
|
+
borderRadius: 12,
|
|
406
|
+
background: '#ecfdf5',
|
|
407
|
+
whiteSpace: 'pre-wrap',
|
|
408
|
+
fontSize: 13,
|
|
409
|
+
lineHeight: 1.6
|
|
410
|
+
}
|
|
411
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
412
|
+
style: {
|
|
413
|
+
marginBottom: 8,
|
|
414
|
+
fontWeight: 600
|
|
415
|
+
}
|
|
416
|
+
}, "Resolved result"), /*#__PURE__*/React.createElement("div", null, JSON.stringify(latestResult, null, 2))), latestReject && /*#__PURE__*/React.createElement("div", {
|
|
417
|
+
style: {
|
|
418
|
+
marginTop: 16,
|
|
419
|
+
padding: 16,
|
|
420
|
+
border: '1px solid #fecaca',
|
|
421
|
+
borderRadius: 12,
|
|
422
|
+
background: '#fef2f2',
|
|
423
|
+
whiteSpace: 'pre-wrap',
|
|
424
|
+
fontSize: 13,
|
|
425
|
+
lineHeight: 1.6
|
|
426
|
+
}
|
|
427
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
428
|
+
style: {
|
|
429
|
+
marginBottom: 8,
|
|
430
|
+
fontWeight: 600
|
|
431
|
+
}
|
|
432
|
+
}, "Rejected reason"), /*#__PURE__*/React.createElement("div", null, JSON.stringify(latestReject, null, 2))));
|
|
433
|
+
});
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import './index.less';
|
|
2
|
+
export interface BookingChangeModalCourt {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
formId?: string | number;
|
|
6
|
+
form_id?: string | number;
|
|
7
|
+
relationId?: string | number;
|
|
8
|
+
relation_id?: string | number;
|
|
9
|
+
relationType?: string;
|
|
10
|
+
relation_type?: string;
|
|
11
|
+
resourceId?: string | number;
|
|
12
|
+
resource_id?: string | number;
|
|
13
|
+
capacity?: number;
|
|
14
|
+
likeStatus?: string;
|
|
15
|
+
like_status?: string;
|
|
16
|
+
formName?: string;
|
|
17
|
+
form_name?: string;
|
|
18
|
+
resourceName?: string;
|
|
19
|
+
resource_name?: string;
|
|
20
|
+
metadata?: Record<string, unknown>;
|
|
21
|
+
raw?: Record<string, unknown>;
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
export interface BookingChangeModalCustomer {
|
|
25
|
+
name: string;
|
|
26
|
+
phone?: string;
|
|
27
|
+
email?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface BookingChangeModalItem {
|
|
30
|
+
id: string;
|
|
31
|
+
courtId: string;
|
|
32
|
+
date: string;
|
|
33
|
+
startHour: number;
|
|
34
|
+
endHour: number;
|
|
35
|
+
name?: string;
|
|
36
|
+
kind?: string;
|
|
37
|
+
phone?: string;
|
|
38
|
+
relation_id?: string | number;
|
|
39
|
+
relation_type?: string;
|
|
40
|
+
like_status?: string;
|
|
41
|
+
is_all?: number;
|
|
42
|
+
schedule_id?: string | number;
|
|
43
|
+
sub_type?: string;
|
|
44
|
+
number?: number;
|
|
45
|
+
metadata?: Record<string, unknown>;
|
|
46
|
+
resources?: Array<Record<string, unknown>>;
|
|
47
|
+
raw?: Record<string, unknown>;
|
|
48
|
+
[key: string]: unknown;
|
|
49
|
+
}
|
|
50
|
+
export interface BookingChangeModalDraft {
|
|
51
|
+
targetCourtId: string;
|
|
52
|
+
targetDate: string;
|
|
53
|
+
targetHour: number;
|
|
54
|
+
}
|
|
55
|
+
export interface BookingChangeModalDetailData {
|
|
56
|
+
customer?: BookingChangeModalCustomer | null;
|
|
57
|
+
headerSummary?: {
|
|
58
|
+
customerName?: string;
|
|
59
|
+
resourceLabel?: string;
|
|
60
|
+
[key: string]: unknown;
|
|
61
|
+
};
|
|
62
|
+
[key: string]: unknown;
|
|
63
|
+
}
|
|
64
|
+
export interface BookingChangeModalOpenOptions extends BookingChangeModalDraft {
|
|
65
|
+
item: BookingChangeModalItem;
|
|
66
|
+
courts?: BookingChangeModalCourt[];
|
|
67
|
+
visibleCourts?: BookingChangeModalCourt[];
|
|
68
|
+
bookings?: BookingChangeModalItem[];
|
|
69
|
+
hourSlots?: number[];
|
|
70
|
+
firstTimelineHour?: number;
|
|
71
|
+
endTimelineExclusive?: number;
|
|
72
|
+
selectedCustomer?: BookingChangeModalCustomer | null;
|
|
73
|
+
getBookingDetailData?: (item: BookingChangeModalItem, courts: BookingChangeModalCourt[]) => BookingChangeModalDetailData;
|
|
74
|
+
formatHourLabel?: (hour: number) => string;
|
|
75
|
+
isBusinessHour?: (hour: number) => boolean;
|
|
76
|
+
hasConflict?: (bookings: BookingChangeModalItem[], targetCourtId: string, targetDate: string, startHour: number, endHour: number, excludeBookingId?: string) => boolean;
|
|
77
|
+
onCustomerChange?: (context: {
|
|
78
|
+
item: BookingChangeModalItem;
|
|
79
|
+
customer: BookingChangeModalCustomer;
|
|
80
|
+
draft: BookingChangeModalDraft;
|
|
81
|
+
options: BookingChangeModalOpenOptions;
|
|
82
|
+
}) => Promise<BookingChangeModalCustomer | null | void> | BookingChangeModalCustomer | null | void;
|
|
83
|
+
title?: string;
|
|
84
|
+
description?: string;
|
|
85
|
+
confirmText?: string;
|
|
86
|
+
cancelText?: string;
|
|
87
|
+
closeOnBackdrop?: boolean;
|
|
88
|
+
zIndex?: number;
|
|
89
|
+
theme?: 'light' | 'dark';
|
|
90
|
+
submitErrorMessage?: string;
|
|
91
|
+
onSubmit?: (context: BookingChangeModalSubmitContext) => Promise<unknown> | unknown;
|
|
92
|
+
}
|
|
93
|
+
export interface BookingChangeModalResult {
|
|
94
|
+
item: BookingChangeModalItem;
|
|
95
|
+
original: BookingChangeModalDraft;
|
|
96
|
+
draft: BookingChangeModalDraft;
|
|
97
|
+
customer: BookingChangeModalCustomer;
|
|
98
|
+
duration: number;
|
|
99
|
+
nextEndHour: number;
|
|
100
|
+
changed: boolean;
|
|
101
|
+
submitPayload: BookingChangeModalSubmitPayload;
|
|
102
|
+
submitResult?: unknown;
|
|
103
|
+
}
|
|
104
|
+
export interface BookingChangeModalSubmitPayload {
|
|
105
|
+
id: string | number;
|
|
106
|
+
relation_id: string | number;
|
|
107
|
+
like_status: string;
|
|
108
|
+
relation_type: string;
|
|
109
|
+
is_all: number;
|
|
110
|
+
schedule_id: string | number;
|
|
111
|
+
sub_type: string;
|
|
112
|
+
select_date: string;
|
|
113
|
+
number: number;
|
|
114
|
+
metadata: Record<string, unknown>;
|
|
115
|
+
resources: Array<{
|
|
116
|
+
form_id: string | number;
|
|
117
|
+
relation_type: string;
|
|
118
|
+
relation_id: string | number;
|
|
119
|
+
capacity: number;
|
|
120
|
+
like_status: string;
|
|
121
|
+
metadata: Record<string, unknown>;
|
|
122
|
+
}>;
|
|
123
|
+
start_date: string;
|
|
124
|
+
start_time: string;
|
|
125
|
+
end_date: string;
|
|
126
|
+
end_time: string;
|
|
127
|
+
duration: number;
|
|
128
|
+
}
|
|
129
|
+
export interface BookingChangeModalSubmitContext {
|
|
130
|
+
item: BookingChangeModalItem;
|
|
131
|
+
original: BookingChangeModalDraft;
|
|
132
|
+
draft: BookingChangeModalDraft;
|
|
133
|
+
customer: BookingChangeModalCustomer;
|
|
134
|
+
duration: number;
|
|
135
|
+
nextEndHour: number;
|
|
136
|
+
changed: boolean;
|
|
137
|
+
submitPayload: BookingChangeModalSubmitPayload;
|
|
138
|
+
options: BookingChangeModalOpenOptions;
|
|
139
|
+
}
|
|
140
|
+
export interface BookingChangeModalCloseReason {
|
|
141
|
+
type: 'cancel' | 'backdrop' | 'escape' | 'programmatic-close' | 'replaced';
|
|
142
|
+
message?: string;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Open the booking change modal as a Promise-based singleton.
|
|
146
|
+
*/
|
|
147
|
+
declare function open(options: BookingChangeModalOpenOptions): Promise<BookingChangeModalResult>;
|
|
148
|
+
declare function close(reason?: BookingChangeModalCloseReason): void;
|
|
149
|
+
declare const bookingChangeModal: {
|
|
150
|
+
open: typeof open;
|
|
151
|
+
close: typeof close;
|
|
152
|
+
};
|
|
153
|
+
export { open as openBookingChangeModal, close as closeBookingChangeModal };
|
|
154
|
+
export default bookingChangeModal;
|