git.iko.soy/dashared/hookah-tau
on develop help sign in
вертухан для экрана просмотра/изменения брони
commitcd3732f47a77bad4db5f29f60f741725bd6a0905 authorDarya Rednikina <rednikina.com@yandex.ru> dateFri 20 Dec 2019, 22:57 (7 years ago) parentec15126
2 files changed+340−11
Hookah Tau/Controllers/Admin/Reservations/Views/AdminReservationView.swift+268 Hookah Tau/Controllers/Admin/Reservations/Views/AdminReservationView.xib+72−11
Hookah Tau/Controllers/Admin/Reservations/Views/AdminReservationView.swift+268
@@ -35,6 +35,45 @@ class AdminReservationView: UIView {
3535
3636 @IBOutlet weak var intervalsContainerView: UIView?
3737
38+ @IBOutlet weak var scrollView: UIScrollView!
39+
40+ @IBOutlet weak var intervalsStackView: UIStackView!
41+
42+ // MARK: - Properties
43+
44+ // констрейнты начала и конца интервала
45+ var startLeadingConstraint: NSLayoutConstraint!
46+ var endLeadingConstraint: NSLayoutConstraint!
47+
48+ var startPoint: UIImageView = {
49+ var view = UIImageView()
50+ view.isUserInteractionEnabled = true
51+ view.image = #imageLiteral(resourceName: "handle_left")
52+ view.translatesAutoresizingMaskIntoConstraints = false
53+ return view
54+ }()
55+
56+ var endPoint: UIImageView = {
57+ var view = UIImageView()
58+ view.isUserInteractionEnabled = true
59+ view.image = #imageLiteral(resourceName: "Group")
60+ view.translatesAutoresizingMaskIntoConstraints = false
61+ return view
62+ }()
63+
64+ /// Интервал
65+ var fillInterval: UIView = {
66+ var view = UIView()
67+ view.backgroundColor = #colorLiteral(red: 0, green: 0.5921568627, blue: 1, alpha: 0.3426262843)
68+ view.translatesAutoresizingMaskIntoConstraints = false
69+ return view
70+ }()
71+
72+ /// Время начала вертелки.
73+ /// Для клиента это 12:00 смены (надо вызвать метод для получения текущей смены).
74+ /// Для администратора это `t` - 24h
75+ var startDate: Date?
76+
3877 // MARK:- Properties
3978
4079 var intervalPickerView: IntervalPickerView?
@@ -64,10 +103,25 @@ class AdminReservationView: UIView {
64103 endTime: model.endTime,
65104 numberOfGuests: model.numberOfGuests,
66105 reservedTable: model.reservedTable)
106+ self.model = model
107+
108+ let (start, _) = model.owner.isAdmin ? model.startTime.getAdminStartingAndEndPoint() : model.startTime.getClientStartingAndEndPoint()
109+
110+ startDate = start
111+
112+ setUpIntervals(model.owner.isAdmin)
113+
114+ guestSlider?.maximumValue = Float((TotalStorage.standard.getTable(establishment: model.establishment, table: model.reservedTable)?.maxGuestNumber ?? 2) + 1)
67115 }
68116
69117 func bind(withIntervals intervals: [ReservationPeriod]) {
118+ guard
119+ let data = data,
120+ let isAdmin = model?.owner.isAdmin
121+ else { return }
70122
123+ setUpReservedIntervals(intervals, isAdmin)
124+ setUpBookingPeriod(data.startTime, data.endTime)
71125 }
72126
73127 func updateDateAndTime(withData d: ReservationData?) {
@@ -77,6 +131,220 @@ class AdminReservationView: UIView {
77131 dateLabel?.text = date
78132 timeLabel?.text = time
79133 }
134+
135+ @IBAction func valueChanged(_ sender: UISlider) {
136+ let value = Int(sender.value)
137+
138+ if sender.value == sender.maximumValue {
139+ numberOfGuestLabel?.text = "Количество гостей: \(Int(value) - 1)+"
140+ } else {
141+ numberOfGuestLabel?.text = "Количество гостей: \(value)"
142+ }
143+
144+ guard let d = data else { return }
145+
146+ data = ReservationData(establishment: d.establishment,
147+ startTime: d.startTime,
148+ endTime: d.endTime,
149+ numberOfGuests: value,
150+ reservedTable: d.reservedTable)
151+ }
152+
153+
154+ func getNumberOfCalians(_ sliderValue: Int) -> String {
155+ return "Минимальное количество кальянов: \(sliderValue > 6 ? 2 : 1)"
156+ }
157+
158+ // MARK: - Setup
159+
160+ /// Тут происходит установка интервалов. Разное для клиента и админа
161+ func setUpIntervals(_ isAdmin: Bool) {
162+ guard let startPoint = startDate else { return }
163+
164+ let startingPoint = isAdmin ? startPoint.getAdminsStartingPoint() : Constants.clientStartingPoint
165+ let endingPoint = startingPoint + (isAdmin ? Constants.adminDuration : Constants.clientDuration)
166+
167+ for period in startingPoint...endingPoint {
168+ let timePointView = TimePointView.loadFromNib()
169+ timePointView?.setUp(withTimePoint: period)
170+ let view = UIView(frame: CGRect(x: 0, y: 0, width: 35, height: 106))
171+ view.addSubviewThatFills(timePointView)
172+ intervalsStackView.addArrangedSubview(view)
173+ }
174+ }
175+
176+
177+ private func setUpBookingPeriod(_ startTime: Date, _ endTime: Date? = nil) {
178+ self.scrollView.addSubview(startPoint)
179+ self.scrollView.addSubview(endPoint)
180+ self.scrollView.addSubview(fillInterval)
181+
182+ guard let startDate = startDate else { return }
183+
184+ let startConstr = CGFloat(startTime.getMinutesPeriods(fromStart: startDate) * Constants.widthTimePoint)
185+
186+ scrollView.setContentOffset(CGPoint(x: startConstr - 50, y: 0), animated: true)
187+
188+ startLeadingConstraint = startPoint.leftAnchor.constraint(equalTo: scrollView.leftAnchor,
189+ constant: startConstr)
190+
191+ if let end = endTime {
192+ let endConstr = CGFloat(end.getMinutesPeriods(fromStart: startDate) * Constants.widthTimePoint)
193+ endLeadingConstraint = endPoint.leftAnchor.constraint(equalTo: scrollView.leftAnchor,
194+ constant: endConstr)
195+ } else {
196+ endLeadingConstraint = endPoint.leftAnchor.constraint(equalTo: scrollView.leftAnchor,
197+ constant:startConstr + Constants.minBookingLength)
198+ }
199+
200+ NSLayoutConstraint.activate([
201+
202+ startPoint.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: 0),
203+ endPoint.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: 0),
204+
205+ startPoint.widthAnchor.constraint(equalToConstant: Constants.pointWidth),
206+ endPoint.widthAnchor.constraint(equalToConstant: Constants.pointWidth),
207+
208+ startPoint.heightAnchor.constraint(equalToConstant: Constants.pointHeight),
209+ endPoint.heightAnchor.constraint(equalToConstant: Constants.pointHeight),
210+
211+ startLeadingConstraint,
212+ endLeadingConstraint,
213+
214+ fillInterval.leftAnchor.constraint(equalTo: startPoint.rightAnchor, constant: 0),
215+ fillInterval.rightAnchor.constraint(equalTo: endPoint.leftAnchor, constant: 0),
216+
217+ fillInterval.heightAnchor.constraint(equalToConstant: Constants.pointHeight),
218+ fillInterval.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: 0)
219+ ])
220+
221+ let scrollViewPanStartGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePanStart(recognizer:)))
222+ startPoint.addGestureRecognizer(scrollViewPanStartGesture)
223+
224+ let scrollViewPanEndGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePanEnd(recognizer:)))
225+ endPoint.addGestureRecognizer(scrollViewPanEndGesture)
226+ }
227+
228+ func setUpReservedIntervals(_ reservations: [ReservationPeriod], _ isAdmin: Bool) {
229+
230+ for reservation in reservations {
231+ let uiview = UIView(frame: CGRect(x: 0, y: 0, width: Constants.widthTimePoint * reservation.duration, height: Constants.heightIntervals))
232+ uiview.backgroundColor = #colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 0.5)
233+
234+
235+ uiview.translatesAutoresizingMaskIntoConstraints = false
236+ scrollView.addSubview(uiview)
237+
238+ guard let startDate = startDate else { return }
239+
240+ let s = reservation.startTime.getMinutesPeriods(fromStart: startDate) * Constants.widthTimePoint
241+ let d = reservation.duration * Constants.widthTimePoint
242+
243+ let startTime = s < 0 ? 0 : s
244+
245+ let total = (isAdmin ? Constants.adminDuration : Constants.clientDuration) * Constants.widthTimePoint
246+ var duration = 0
247+ if s < 0 {
248+ duration = reservation.endTime.getMinutesPeriods(fromStart: startDate) * Constants.widthTimePoint
249+ } else {
250+ duration = (s + d) > total ? total - s : d
251+ }
252+
253+ NSLayoutConstraint.activate([
254+ uiview.bottomAnchor.constraint(equalToSystemSpacingBelow: scrollView.bottomAnchor, multiplier: 0),
255+ uiview.leftAnchor.constraint(equalTo: scrollView.leftAnchor,
256+ constant: CGFloat(Constants.widthTimePoint / 2 + startTime)),
257+ uiview.widthAnchor.constraint(equalToConstant: CGFloat(duration)),
258+ uiview.heightAnchor.constraint(equalToConstant: CGFloat(Constants.heightIntervals))
259+ ])
260+ }
261+ }
262+
263+ // MARK: - Pan
264+
265+ @objc func handlePanStart(recognizer:UIPanGestureRecognizer) {
266+
267+ let translation = recognizer.translation(in: self.intervalsStackView)
268+ let duration = abs(startLeadingConstraint.constant + translation.x - endLeadingConstraint.constant)
269+
270+ if let view = recognizer.view, duration >= Constants.minBookingLength {
271+ startLeadingConstraint.constant += translation.x
272+
273+ changeTime(startLeadingConstraint, .start)
274+
275+ view.setNeedsUpdateConstraints()
276+ }
277+
278+ recognizer.setTranslation(CGPoint.zero, in: self.intervalsStackView)
279+ }
280+
281+ @objc func handlePanEnd(recognizer:UIPanGestureRecognizer) {
282+
283+ let translation = recognizer.translation(in: self.intervalsStackView)
284+ let duration = abs(startLeadingConstraint.constant - (endLeadingConstraint.constant + translation.x))
285+
286+ if let view = recognizer.view, duration >= Constants.minBookingLength {
287+ endLeadingConstraint.constant += translation.x
288+
289+ changeTime(endLeadingConstraint, .end)
290+ view.setNeedsUpdateConstraints()
291+ }
292+
293+ recognizer.setTranslation(CGPoint.zero, in: self.intervalsStackView)
294+ }
295+
296+ func changeTime(_ constraint: NSLayoutConstraint, _ period: Period) {
297+ guard let startDate = startDate, let d = data else { return }
298+
299+ let offset = Int(constraint.constant) % Constants.widthTimePoint
300+
301+ if offset == 0 {
302+ let p = Int(constraint.constant) / Constants.widthTimePoint
303+ let time = startDate.addPeriods(p)
304+
305+ switch period {
306+ case .start:
307+ data = ReservationData(establishment: d.establishment,
308+ startTime: time,
309+ endTime: d.endTime,
310+ numberOfGuests: d.numberOfGuests,
311+ reservedTable: d.reservedTable)
312+ case .end:
313+ data = ReservationData(establishment: d.establishment,
314+ startTime: d.startTime,
315+ endTime: time,
316+ numberOfGuests: d.numberOfGuests,
317+ reservedTable: d.reservedTable)
318+ }
319+
320+ updateDateAndTime(withData: data)
321+ }
322+ }
323+}
324+
325+// MARK: - Nested types
326+
327+extension AdminReservationView {
328+ enum Constants {
329+ static let widthTimePoint = 11
330+
331+ static let adminDuration = 288
332+ static let clientDuration = 90
333+ // 12:00 = 12 * 6
334+ static let clientStartingPoint = 72
335+
336+ static let pointWidth: CGFloat = 19
337+ static let pointHeight: CGFloat = 85
338+
339+ static let minBookingLength: CGFloat = 132
340+
341+ static let heightIntervals = 85
342+ }
343+
344+ enum Period {
345+ case start
346+ case end
347+ }
80348}
81349
82350
Hookah Tau/Controllers/Admin/Reservations/Views/AdminReservationView.xib+72−11
@@ -15,10 +15,10 @@
1515 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
1616 <subviews>
1717 <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" spacing="48" translatesAutoresizingMaskIntoConstraints="NO" id="AEf-R4-K1F">
18− <rect key="frame" x="21" y="16" width="372" height="404"/>
18+ <rect key="frame" x="0.0" y="16" width="414" height="404"/>
1919 <subviews>
2020 <stackView opaque="NO" contentMode="scaleToFill" alignment="top" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="oh7-ka-ctS">
21− <rect key="frame" x="0.0" y="0.0" width="372" height="143.5"/>
21+ <rect key="frame" x="21" y="0.0" width="372" height="143.5"/>
2222 <subviews>
2323 <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="top" spacing="22" translatesAutoresizingMaskIntoConstraints="NO" id="IY6-F4-aln">
2424 <rect key="frame" x="0.0" y="0.0" width="129" height="136.5"/>
@@ -89,7 +89,7 @@
8989 </subviews>
9090 </stackView>
9191 <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="9RO-aK-yNh">
92− <rect key="frame" x="0.0" y="191.5" width="372" height="58.5"/>
92+ <rect key="frame" x="21" y="191.5" width="372" height="58.5"/>
9393 <subviews>
9494 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Количество гостей: 2" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yTM-U5-XjI">
9595 <rect key="frame" x="0.0" y="0.0" width="372" height="20.5"/>
@@ -99,24 +99,83 @@
9999 </label>
100100 <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="2" minValue="1" maxValue="8" translatesAutoresizingMaskIntoConstraints="NO" id="Lqw-9Z-34d">
101101 <rect key="frame" x="-2" y="28.5" width="376" height="31"/>
102+ <connections>
103+ <action selector="valueChanged:" destination="iN0-l3-epB" eventType="valueChanged" id="OwE-Nq-PHY"/>
104+ </connections>
102105 </slider>
103106 </subviews>
104107 </stackView>
105108 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="vKS-ia-RxW">
106− <rect key="frame" x="0.0" y="298" width="372" height="106"/>
107− <color key="backgroundColor" red="0.34509803919999998" green="0.33725490200000002" blue="0.83921568629999999" alpha="0.33104130993150682" colorSpace="custom" customColorSpace="sRGB"/>
109+ <rect key="frame" x="0.0" y="298" width="414" height="106"/>
110+ <subviews>
111+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="EiP-QO-PbU">
112+ <rect key="frame" x="0.0" y="20" width="414" height="85"/>
113+ <subviews>
114+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="OpX-io-LgH">
115+ <rect key="frame" x="0.0" y="0.0" width="414" height="1"/>
116+ <color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
117+ <constraints>
118+ <constraint firstAttribute="height" constant="1" id="k2D-mj-31b"/>
119+ </constraints>
120+ </view>
121+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fOe-cM-riJ">
122+ <rect key="frame" x="0.0" y="84" width="414" height="1"/>
123+ <color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
124+ <constraints>
125+ <constraint firstAttribute="height" constant="1" id="A2B-su-3Hi"/>
126+ </constraints>
127+ </view>
128+ </subviews>
129+ <color key="backgroundColor" red="0.8901960784313725" green="0.8901960784313725" blue="0.8901960784313725" alpha="0.6951519692" colorSpace="calibratedRGB"/>
130+ <constraints>
131+ <constraint firstItem="OpX-io-LgH" firstAttribute="top" secondItem="EiP-QO-PbU" secondAttribute="top" id="73d-6U-4Jc"/>
132+ <constraint firstAttribute="height" constant="85" id="JMc-tA-wHe"/>
133+ <constraint firstAttribute="trailing" secondItem="fOe-cM-riJ" secondAttribute="trailing" id="JVQ-ub-pEy"/>
134+ <constraint firstItem="OpX-io-LgH" firstAttribute="leading" secondItem="EiP-QO-PbU" secondAttribute="leading" id="hBd-hJ-yz7"/>
135+ <constraint firstAttribute="bottom" secondItem="fOe-cM-riJ" secondAttribute="bottom" id="im0-y1-nC8"/>
136+ <constraint firstItem="fOe-cM-riJ" firstAttribute="leading" secondItem="EiP-QO-PbU" secondAttribute="leading" id="qH9-Ww-nd5"/>
137+ <constraint firstAttribute="trailing" secondItem="OpX-io-LgH" secondAttribute="trailing" id="ueR-ZM-ELi"/>
138+ </constraints>
139+ </view>
140+ <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="trF-VM-0qV">
141+ <rect key="frame" x="0.0" y="0.0" width="414" height="106"/>
142+ <subviews>
143+ <stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bpJ-pe-tQf">
144+ <rect key="frame" x="0.0" y="0.0" width="414" height="106"/>
145+ </stackView>
146+ </subviews>
147+ <constraints>
148+ <constraint firstAttribute="bottom" secondItem="bpJ-pe-tQf" secondAttribute="bottom" id="BxY-h0-LHi"/>
149+ <constraint firstItem="bpJ-pe-tQf" firstAttribute="leading" secondItem="trF-VM-0qV" secondAttribute="leading" id="Ec5-Lb-NsX"/>
150+ <constraint firstAttribute="trailing" secondItem="bpJ-pe-tQf" secondAttribute="trailing" id="d0a-8z-CE6"/>
151+ <constraint firstItem="bpJ-pe-tQf" firstAttribute="width" secondItem="trF-VM-0qV" secondAttribute="width" priority="250" id="mYw-sK-G8B"/>
152+ <constraint firstItem="bpJ-pe-tQf" firstAttribute="height" secondItem="trF-VM-0qV" secondAttribute="height" id="wdB-oa-hvt"/>
153+ <constraint firstItem="bpJ-pe-tQf" firstAttribute="top" secondItem="trF-VM-0qV" secondAttribute="top" id="x6e-gw-nXA"/>
154+ </constraints>
155+ <viewLayoutGuide key="contentLayoutGuide" id="QAB-NG-eb4"/>
156+ <viewLayoutGuide key="frameLayoutGuide" id="xUW-w2-Jj1"/>
157+ </scrollView>
158+ </subviews>
159+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
108160 <constraints>
161+ <constraint firstAttribute="bottom" secondItem="trF-VM-0qV" secondAttribute="bottom" id="4kT-64-W5t"/>
162+ <constraint firstItem="trF-VM-0qV" firstAttribute="top" secondItem="vKS-ia-RxW" secondAttribute="top" id="M4X-6f-0WX"/>
163+ <constraint firstItem="trF-VM-0qV" firstAttribute="leading" secondItem="vKS-ia-RxW" secondAttribute="leading" id="ZXK-Vm-o6S"/>
164+ <constraint firstAttribute="trailing" secondItem="trF-VM-0qV" secondAttribute="trailing" id="a2R-kF-NcS"/>
109165 <constraint firstAttribute="height" constant="106" id="ebp-l7-k9Z"/>
166+ <constraint firstItem="EiP-QO-PbU" firstAttribute="leading" secondItem="vKS-ia-RxW" secondAttribute="leading" id="fHc-26-5lu"/>
167+ <constraint firstAttribute="bottom" secondItem="EiP-QO-PbU" secondAttribute="bottom" constant="1" id="kxj-VY-srA"/>
168+ <constraint firstAttribute="trailing" secondItem="EiP-QO-PbU" secondAttribute="trailing" id="sbQ-sE-GAh"/>
110169 </constraints>
111170 </view>
112171 </subviews>
113172 <constraints>
114173 <constraint firstItem="vKS-ia-RxW" firstAttribute="leading" secondItem="AEf-R4-K1F" secondAttribute="leading" id="0cO-AV-PJL"/>
115− <constraint firstAttribute="trailing" secondItem="oh7-ka-ctS" secondAttribute="trailing" id="KeE-6F-h5x"/>
116− <constraint firstAttribute="trailing" secondItem="9RO-aK-yNh" secondAttribute="trailing" id="Kh6-4l-QJO"/>
174+ <constraint firstAttribute="trailing" secondItem="oh7-ka-ctS" secondAttribute="trailing" constant="21" id="KeE-6F-h5x"/>
175+ <constraint firstAttribute="trailing" secondItem="9RO-aK-yNh" secondAttribute="trailing" constant="21" id="Kh6-4l-QJO"/>
117176 <constraint firstAttribute="bottom" secondItem="vKS-ia-RxW" secondAttribute="bottom" id="TKW-xo-b61"/>
118− <constraint firstItem="9RO-aK-yNh" firstAttribute="leading" secondItem="AEf-R4-K1F" secondAttribute="leading" id="Teg-kp-nZt"/>
119− <constraint firstItem="oh7-ka-ctS" firstAttribute="leading" secondItem="AEf-R4-K1F" secondAttribute="leading" id="mJ2-gh-vCg"/>
177+ <constraint firstItem="9RO-aK-yNh" firstAttribute="leading" secondItem="AEf-R4-K1F" secondAttribute="leading" constant="21" id="Teg-kp-nZt"/>
178+ <constraint firstItem="oh7-ka-ctS" firstAttribute="leading" secondItem="AEf-R4-K1F" secondAttribute="leading" constant="21" id="mJ2-gh-vCg"/>
120179 <constraint firstAttribute="trailing" secondItem="vKS-ia-RxW" secondAttribute="trailing" id="uDV-uM-jby"/>
121180 </constraints>
122181 </stackView>
@@ -124,8 +183,8 @@
124183 <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
125184 <constraints>
126185 <constraint firstItem="vUN-kp-3ea" firstAttribute="bottom" secondItem="AEf-R4-K1F" secondAttribute="bottom" constant="21" id="4MN-Yl-hYv"/>
127− <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="AEf-R4-K1F" secondAttribute="trailing" constant="21" id="C1h-bA-S6p"/>
128− <constraint firstItem="AEf-R4-K1F" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="21" id="H1o-ua-Tnn"/>
186+ <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="AEf-R4-K1F" secondAttribute="trailing" id="C1h-bA-S6p"/>
187+ <constraint firstItem="AEf-R4-K1F" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="H1o-ua-Tnn"/>
129188 <constraint firstItem="vUN-kp-3ea" firstAttribute="top" secondItem="AEf-R4-K1F" secondAttribute="top" constant="-16" id="eYI-is-YLt"/>
130189 </constraints>
131190 <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
@@ -136,8 +195,10 @@
136195 <outlet property="dateLabel" destination="KHM-Yj-bBa" id="iS8-eN-OFW"/>
137196 <outlet property="guestSlider" destination="Lqw-9Z-34d" id="cEj-JF-J4D"/>
138197 <outlet property="intervalsContainerView" destination="vKS-ia-RxW" id="0Ig-rh-hXD"/>
198+ <outlet property="intervalsStackView" destination="bpJ-pe-tQf" id="aF0-Qm-kuh"/>
139199 <outlet property="nameLabel" destination="OoG-F4-OVu" id="rnW-fG-jFs"/>
140200 <outlet property="numberOfGuestLabel" destination="yTM-U5-XjI" id="z0O-94-Mp7"/>
201+ <outlet property="scrollView" destination="trF-VM-0qV" id="P5v-fg-hUW"/>
141202 <outlet property="tableLabel" destination="qNR-EO-oMK" id="63P-AS-fgf"/>
142203 <outlet property="timeLabel" destination="gau-aS-vtT" id="7Iy-Cz-zdY"/>
143204 </connections>