@licklist/design 0.63.3-dev.4 → 0.63.3
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/bitbucket-pipelines.yml +8 -0
- package/dist/date-time-button/DateTimeButton.js +1 -1
- package/dist/events/edit-event-modal/component/SelectEventProductSet/SelectEventProductSet.d.ts.map +1 -1
- package/dist/events/edit-event-modal/component/SelectEventProductSet/SelectEventProductSet.js +1 -1
- package/dist/events/edit-event-modal/component/SelectEventProductSet/component/EditEventProductSet.d.ts.map +1 -1
- package/dist/events/edit-event-modal/component/SelectEventProductSet/component/EditEventProductSet.js +1 -1
- package/dist/iframe/payment/order-items-table/utils/paymentSummary.d.ts.map +1 -1
- package/dist/iframe/ryft/RyftPaymentForm.d.ts +1 -4
- package/dist/iframe/ryft/RyftPaymentForm.d.ts.map +1 -1
- package/dist/iframe/ryft/RyftPaymentForm.js +1 -1
- package/dist/iframe/ryft/utils/ryft-form.d.ts +2 -5
- package/dist/iframe/ryft/utils/ryft-form.d.ts.map +1 -1
- package/dist/iframe/ryft/utils/ryft-form.js +1 -1
- package/dist/product-set/control/DateAndRecurrenceInput.d.ts +1 -1
- package/dist/product-set/control/DateAndRecurrenceInput.d.ts.map +1 -1
- package/dist/product-set/control/DateAndRecurrenceInput.js +1 -1
- package/dist/product-set/control/DateInput.js +1 -1
- package/dist/product-set/control/ProductSetControl.d.ts +2 -3
- package/dist/product-set/control/ProductSetControl.d.ts.map +1 -1
- package/dist/product-set/control/ProductSetControl.js +1 -1
- package/dist/product-set/form/ProductCategoriesControl.d.ts +1 -3
- package/dist/product-set/form/ProductCategoriesControl.d.ts.map +1 -1
- package/dist/product-set/form/ProductCategoriesControl.js +1 -1
- package/dist/product-set/form/ProductSetForm.d.ts +2 -6
- package/dist/product-set/form/ProductSetForm.d.ts.map +1 -1
- package/dist/product-set/form/ProductSetForm.js +1 -1
- package/dist/product-set/form/ProductsControl.d.ts +1 -3
- package/dist/product-set/form/ProductsControl.d.ts.map +1 -1
- package/dist/product-set/form/ProductsControl.js +1 -1
- package/dist/product-set/form/StepsControl.d.ts +1 -3
- package/dist/product-set/form/StepsControl.d.ts.map +1 -1
- package/dist/product-set/form/StepsControl.js +1 -1
- package/dist/product-set/product/ProductControl.d.ts +0 -1
- package/dist/product-set/product/ProductControl.d.ts.map +1 -1
- package/dist/product-set/product/ProductControl.js +1 -1
- package/dist/product-set/step/StepControl.d.ts +1 -2
- package/dist/product-set/step/StepControl.d.ts.map +1 -1
- package/dist/product-set/step/StepControl.js +1 -1
- package/dist/provider/working-hours-input/WorkingHoursInputDescription.d.ts.map +1 -1
- package/dist/provider/working-hours-input/WorkingHoursInputDescription.js +1 -1
- package/dist/recurring-date-picker-input/RecurrenceIntervalAndFrequencyInput.d.ts.map +1 -1
- package/dist/recurring-date-picker-input/RecurrenceIntervalAndFrequencyInput.js +1 -1
- package/dist/recurring-date-picker-input/RecurringDatePickerInput.d.ts +1 -3
- package/dist/recurring-date-picker-input/RecurringDatePickerInput.d.ts.map +1 -1
- package/dist/recurring-date-picker-input/RecurringDatePickerInput.js +1 -1
- package/dist/recurring-date-picker-input/utils.d.ts +0 -5
- package/dist/recurring-date-picker-input/utils.d.ts.map +1 -1
- package/dist/recurring-date-picker-input/utils.js +1 -1
- package/dist/sales/booking/results/components/ResultCard.d.ts.map +1 -1
- package/dist/setting/admin/AdminSettingForm.d.ts +2 -2
- package/dist/setting/admin/AdminSettingForm.d.ts.map +1 -1
- package/dist/sortable-tree/SortableTreeItem.d.ts +2 -1
- package/dist/sortable-tree/SortableTreeItem.d.ts.map +1 -1
- package/dist/sortable-tree/SortableTreeItem.js +1 -1
- package/dist/styles/date-time-button/DateTimeButton.scss +0 -1
- package/dist/styles/iframe-page/PageBody.scss +1 -0
- package/dist/styles/ryft-payment-form/RyftPaymentForm.scss +0 -8
- package/dist/styles/sales/BookingResults.scss +1 -1
- package/dist/styles/zones/ZoneForm.scss +1 -2
- package/dist/zone/form/ZoneForm.d.ts +2 -2
- package/dist/zone/form/ZoneForm.d.ts.map +1 -1
- package/dist/zone/form/ZoneForm.js +1 -1
- package/dist/zone/form/components/ZoneControl.d.ts +2 -2
- package/dist/zone/form/components/ZoneControl.d.ts.map +1 -1
- package/dist/zone/form/components/ZoneControl.js +1 -1
- package/dist/zone/form/components/ZoneRecurrencesControl.d.ts +4 -4
- package/dist/zone/form/components/ZoneRecurrencesControl.d.ts.map +1 -1
- package/dist/zone/form/components/ZoneRecurrencesControl.js +1 -1
- package/dist/zone/form/utils/dates.d.ts.map +1 -1
- package/jest.config.js +29 -0
- package/package.json +39 -14
- package/src/date-time-button/DateTimeButton.stories.tsx +1 -2
- package/src/date-time-button/DateTimeButton.tsx +5 -7
- package/src/events/edit-event-modal/component/SelectEventProductSet/SelectEventProductSet.tsx +9 -14
- package/src/events/edit-event-modal/component/SelectEventProductSet/component/EditEventProductSet.tsx +0 -2
- package/src/iframe/payment/order-items-table/utils/paymentSummary.tsx +0 -1
- package/src/iframe/ryft/RyftPaymentForm.tsx +2 -11
- package/src/iframe/ryft/utils/ryft-form.ts +4 -23
- package/src/product-set/control/DateAndRecurrenceInput.tsx +4 -3
- package/src/product-set/control/DateInput.tsx +2 -2
- package/src/product-set/control/ProductSetControl.tsx +4 -11
- package/src/product-set/form/ProductCategoriesControl.tsx +4 -15
- package/src/product-set/form/ProductSetForm.tsx +2 -13
- package/src/product-set/form/ProductsControl.tsx +77 -93
- package/src/product-set/form/StepsControl.tsx +7 -15
- package/src/product-set/product/ProductControl.tsx +5 -8
- package/src/product-set/step/StepControl.tsx +3 -4
- package/src/provider/working-hours-input/WorkingHoursInputDescription.tsx +18 -4
- package/src/recurring-date-picker-input/RecurrenceIntervalAndFrequencyInput.tsx +21 -40
- package/src/recurring-date-picker-input/RecurringDatePickerInput.stories.tsx +7 -13
- package/src/recurring-date-picker-input/RecurringDatePickerInput.tsx +1 -12
- package/src/recurring-date-picker-input/utils.ts +1 -90
- package/src/sales/booking/results/components/ResultCard.tsx +3 -0
- package/src/setting/admin/AdminSettingForm.tsx +2 -2
- package/src/sortable-tree/SortableTreeItem.tsx +3 -0
- package/src/static/switch/BooleanSwitch.tsx +1 -1
- package/src/styles/date-time-button/DateTimeButton.scss +0 -1
- package/src/styles/iframe-page/PageBody.scss +1 -0
- package/src/styles/ryft-payment-form/RyftPaymentForm.scss +0 -8
- package/src/styles/sales/BookingResults.scss +1 -1
- package/src/styles/zones/ZoneForm.scss +1 -2
- package/src/zone/form/ZoneForm.tsx +2 -3
- package/src/zone/form/components/ZoneControl.tsx +3 -3
- package/src/zone/form/components/ZoneRecurrencesControl.tsx +5 -7
- package/src/zone/form/utils/dates.ts +10 -9
- package/tests/Auth/Authorizer.test.tsx +194 -0
- package/tests/Auth/Layout/UserNavDropDown.test.tsx +43 -0
- package/tests/Auth/Layout/UserNavDropDownToggle.test.tsx +33 -0
- package/tests/Auth/Login/LoginComponent.test.tsx +246 -0
- package/tests/Auth/Login/LoginFormComponent.test.tsx +182 -0
- package/tests/Auth/Register/RegisterComponent.test.tsx +285 -0
- package/tests/Auth/Register/RegisterFormComponent.test.tsx +170 -0
- package/tests/Auth/Settings/Dashboard/IpInput.test.tsx +130 -0
- package/tests/Auth/Social/SocialCallbackComponent.test.tsx +133 -0
- package/tests/Auth/Social/SocialFormComponent.test.tsx +118 -0
- package/tests/FileUpload/FileUpload.test.tsx +42 -0
- package/tests/Notification/EmailTemplate.test.tsx +82 -0
- package/tests/ProductSet/ProductSetPopover.test.tsx +40 -0
- package/tests/Report/Report.test.tsx +48 -0
- package/tests/Sales/Coupon.test.tsx +51 -0
- package/tests/Sales/SalesAndVIews.test.tsx +63 -0
- package/tests/SnippetTemplates/SnippetTemplates.test.tsx +56 -0
- package/tests/Table/FilterHelperComponent.test.tsx +88 -0
- package/tests/Table/PaginationHelperComponent.test.tsx +109 -0
- package/tests/Table/PerPageHelperComponent.test.tsx +34 -0
- package/tests/Table/TableHelperComponent.test.tsx +295 -0
- package/tests/TipTapEditor/TipTapEditor.test.tsx +28 -0
- package/tests/__mock__/hooks/useAuthApi.ts +13 -0
- package/tests/__mock__/hooks/useAuthMock.ts +13 -0
- package/tests/__mock__/hooks/useFormMock.ts +27 -0
- package/tests/__mock__/hooks/useNotificationMock.ts +13 -0
- package/tests/__mock__/hooks/useQueryMock.ts +16 -0
- package/tests/__mock__/hooks/useSocialApiMock.ts +20 -0
- package/tests/__mock__/hooks/useTranslationMock.ts +17 -0
- package/tests/__mock__/hooks/useUserApiMock.ts +18 -0
- package/tests/__mock__/hooks/useUserMock.ts +13 -0
- package/tests/__mock__/styleMock.js +1 -0
- package/tests/__mock__/windowMock.ts +5 -0
- package/tests/packages/react-query.tsx +28 -0
- package/tests/setupTests.ts +10 -0
|
@@ -35,8 +35,6 @@ interface ProductsControlProps extends WithIsLoading {
|
|
|
35
35
|
categoryType: CategoryType;
|
|
36
36
|
zones?: Zone[];
|
|
37
37
|
isOverrides?: boolean;
|
|
38
|
-
isEventEditProductSet?: boolean;
|
|
39
|
-
isCreateNewOverrides?: boolean;
|
|
40
38
|
}
|
|
41
39
|
|
|
42
40
|
const getDefaultProductValue = (sort: number): Product => ({
|
|
@@ -59,7 +57,6 @@ const getDefaultProductValue = (sort: number): Product => ({
|
|
|
59
57
|
quantitySelector: 1,
|
|
60
58
|
hasSpecialNotes: false,
|
|
61
59
|
weight: 0,
|
|
62
|
-
originalProductId: null,
|
|
63
60
|
type: DEFAULT_PRODUCT_TYPE,
|
|
64
61
|
tierId: Number(uniqueId()),
|
|
65
62
|
zoneId: null,
|
|
@@ -82,8 +79,6 @@ export function ProductsControl({
|
|
|
82
79
|
categoryType,
|
|
83
80
|
zones,
|
|
84
81
|
isOverrides,
|
|
85
|
-
isEventEditProductSet,
|
|
86
|
-
isCreateNewOverrides,
|
|
87
82
|
}: ProductsControlProps) {
|
|
88
83
|
const { t } = useTranslation("Design");
|
|
89
84
|
const form = useFormContext<ProductSetFormValues>();
|
|
@@ -208,101 +203,90 @@ export function ProductsControl({
|
|
|
208
203
|
onDragEnd={handleDragEnd}
|
|
209
204
|
sensors={[mouseSensor]}
|
|
210
205
|
>
|
|
211
|
-
{fields.map((product, index) =>
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
<
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
<
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
</span>
|
|
259
|
-
</div>
|
|
260
|
-
}
|
|
261
|
-
modalLabel={t("addNewProduct")}
|
|
262
|
-
modalClass={ProductSetModalClasses.product}
|
|
263
|
-
isNewAdded={showProductModal}
|
|
264
|
-
body={
|
|
265
|
-
<ProductControl<ProductSetFormValues>
|
|
266
|
-
isLoading={isLoading}
|
|
267
|
-
quantityType={quantityType}
|
|
268
|
-
allowDeposits={allowDeposits}
|
|
269
|
-
hasBookingManagement={false}
|
|
270
|
-
fieldNamePrefix={
|
|
271
|
-
`${productControlFieldName}.${index}` as const
|
|
272
|
-
}
|
|
273
|
-
productName={value}
|
|
274
|
-
onProductNameChange={onChange}
|
|
275
|
-
hasTicket={hasTicket}
|
|
276
|
-
categoryType={categoryType}
|
|
277
|
-
zoneDuration={catergoryZone?.defaultDuration}
|
|
278
|
-
isOverrides={
|
|
279
|
-
isNewProductOverrides || isOverridesProductSet
|
|
280
|
-
}
|
|
281
|
-
/>
|
|
282
|
-
}
|
|
283
|
-
onDelete={() => onProductRemove(index)}
|
|
284
|
-
validate={() =>
|
|
285
|
-
trigger(`${productControlFieldName}.${index}`)
|
|
286
|
-
}
|
|
287
|
-
saveValidField={saveValidField}
|
|
288
|
-
// preItem={<Popover className="d-none d-sm-block" />}
|
|
289
|
-
>
|
|
290
|
-
<SubProductsControl
|
|
206
|
+
{fields.map((product, index) => (
|
|
207
|
+
<Controller
|
|
208
|
+
key={product._id}
|
|
209
|
+
control={control}
|
|
210
|
+
name={`${productControlFieldName}.${index}.name` as const}
|
|
211
|
+
rules={{
|
|
212
|
+
required: t("Validation:fieldRequired", {
|
|
213
|
+
attribute: t("name"),
|
|
214
|
+
}) as string,
|
|
215
|
+
}}
|
|
216
|
+
render={({ field: { value, onChange } }) => (
|
|
217
|
+
<SortableTree.Item
|
|
218
|
+
key={`product-${product._id}`}
|
|
219
|
+
id={String(product._id)}
|
|
220
|
+
isExpanded={isFirstProductAdded}
|
|
221
|
+
isInvalid={!!categoryProductErrors}
|
|
222
|
+
title={value}
|
|
223
|
+
isOverride={isOverrides}
|
|
224
|
+
badge={<Badge className="product-badge">{t("product")}</Badge>}
|
|
225
|
+
isIconInHeader={false}
|
|
226
|
+
cancelChanges={() => cancelChanges(index)}
|
|
227
|
+
edit={() => edit(index)}
|
|
228
|
+
isProduct
|
|
229
|
+
secondaryBadge={getBadgeConfig(categoryType, t(categoryType))}
|
|
230
|
+
subTitle={
|
|
231
|
+
<div className="product-set-badges-container">
|
|
232
|
+
<div className="product-set-subtitle-dot product-set-subtitle-product-dot" />
|
|
233
|
+
<span>
|
|
234
|
+
{`£${prices[index]} ${t("each")} - ${t("qty")}:${
|
|
235
|
+
!isUnlimitedQuantities[index]
|
|
236
|
+
? ` ${quantities[index]}`
|
|
237
|
+
: t(" unlimited")
|
|
238
|
+
} ${
|
|
239
|
+
!isUnlimitedQuantities[index]
|
|
240
|
+
? ` - ${t("possibleRevenue")} £${
|
|
241
|
+
prices[index] * quantities[index]
|
|
242
|
+
}`
|
|
243
|
+
: ""
|
|
244
|
+
} `}
|
|
245
|
+
</span>
|
|
246
|
+
</div>
|
|
247
|
+
}
|
|
248
|
+
modalLabel={t("addNewProduct")}
|
|
249
|
+
modalClass={ProductSetModalClasses.product}
|
|
250
|
+
isNewAdded={showProductModal}
|
|
251
|
+
body={
|
|
252
|
+
<ProductControl<ProductSetFormValues>
|
|
291
253
|
isLoading={isLoading}
|
|
292
254
|
quantityType={quantityType}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
255
|
+
allowDeposits={allowDeposits}
|
|
256
|
+
hasBookingManagement={false}
|
|
257
|
+
fieldNamePrefix={
|
|
258
|
+
`${productControlFieldName}.${index}` as const
|
|
259
|
+
}
|
|
260
|
+
productName={value}
|
|
261
|
+
onProductNameChange={onChange}
|
|
262
|
+
hasTicket={hasTicket}
|
|
263
|
+
categoryType={categoryType}
|
|
264
|
+
zoneDuration={catergoryZone?.defaultDuration}
|
|
265
|
+
isOverrides={isOverrides}
|
|
296
266
|
/>
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
267
|
+
}
|
|
268
|
+
onDelete={() => onProductRemove(index)}
|
|
269
|
+
validate={() => trigger(`${productControlFieldName}.${index}`)}
|
|
270
|
+
saveValidField={saveValidField}
|
|
271
|
+
// preItem={<Popover className="d-none d-sm-block" />}
|
|
272
|
+
>
|
|
273
|
+
<SubProductsControl
|
|
274
|
+
isLoading={isLoading}
|
|
275
|
+
quantityType={quantityType}
|
|
276
|
+
stepIndex={stepIndex}
|
|
277
|
+
productCategoryIndex={productCategoryIndex}
|
|
278
|
+
productIndex={index}
|
|
279
|
+
/>
|
|
280
|
+
</SortableTree.Item>
|
|
281
|
+
)}
|
|
282
|
+
/>
|
|
283
|
+
))}
|
|
302
284
|
</SortableTree>
|
|
303
285
|
<CreateProductSetItem
|
|
304
286
|
title={t("addProduct")}
|
|
287
|
+
isOverride={isOverrides}
|
|
305
288
|
onClick={() => {
|
|
289
|
+
if (isOverrides) return;
|
|
306
290
|
append(getDefaultProductValue(fields.length));
|
|
307
291
|
setShowProductModal(true);
|
|
308
292
|
|
|
@@ -19,16 +19,9 @@ import { ProductSetFormValues } from "./ProductSetForm";
|
|
|
19
19
|
interface StepsControlProps {
|
|
20
20
|
isLoading: boolean;
|
|
21
21
|
isOverrides?: boolean;
|
|
22
|
-
isEventEditProductSet?: boolean;
|
|
23
|
-
isCreateNewOverrides?: boolean;
|
|
24
22
|
}
|
|
25
23
|
|
|
26
|
-
export function StepsControl({
|
|
27
|
-
isLoading,
|
|
28
|
-
isOverrides,
|
|
29
|
-
isEventEditProductSet,
|
|
30
|
-
isCreateNewOverrides,
|
|
31
|
-
}: StepsControlProps) {
|
|
24
|
+
export function StepsControl({ isLoading, isOverrides }: StepsControlProps) {
|
|
32
25
|
const form = useFormContext<ProductSetFormValues>();
|
|
33
26
|
const { t } = useTranslation("Design");
|
|
34
27
|
const [showStepModal, setShowStepModal] = useState(false);
|
|
@@ -75,9 +68,9 @@ export function StepsControl({
|
|
|
75
68
|
<>
|
|
76
69
|
{fields.map((step, index) => {
|
|
77
70
|
const stepFieldName = `steps.${index}` as const;
|
|
71
|
+
|
|
78
72
|
const stepData = getValues(stepFieldName);
|
|
79
|
-
|
|
80
|
-
(isOverrides || isCreateNewOverrides) && !!step.id;
|
|
73
|
+
|
|
81
74
|
return (
|
|
82
75
|
<Controller
|
|
83
76
|
key={`step-${step._id}`}
|
|
@@ -99,9 +92,9 @@ export function StepsControl({
|
|
|
99
92
|
modalLabel={t("addNewStep")}
|
|
100
93
|
modalClass={ProductSetModalClasses.step}
|
|
101
94
|
isNewAdded={showStepModal}
|
|
102
|
-
edit={() => edit(index)}
|
|
95
|
+
edit={() => !isOverrides && edit(index)}
|
|
103
96
|
cancelChanges={() => cancelChanges(index)}
|
|
104
|
-
isOverride={
|
|
97
|
+
isOverride={isOverrides}
|
|
105
98
|
subTitle={
|
|
106
99
|
<div className="product-set-badges-container">
|
|
107
100
|
<div className="product-set-subtitle-dot product-set-subtitle-step-dot" />
|
|
@@ -117,7 +110,6 @@ export function StepsControl({
|
|
|
117
110
|
stepIndex={index}
|
|
118
111
|
stepName={value}
|
|
119
112
|
onStepNameChange={onChange}
|
|
120
|
-
isOverrides={isOverrideStep}
|
|
121
113
|
/>
|
|
122
114
|
}
|
|
123
115
|
onDelete={() => remove(index)}
|
|
@@ -148,8 +140,6 @@ export function StepsControl({
|
|
|
148
140
|
isLoading={isLoading}
|
|
149
141
|
stepIndex={index}
|
|
150
142
|
isOverrides={isOverrides}
|
|
151
|
-
isCreateNewOverrides={isCreateNewOverrides}
|
|
152
|
-
isEventEditProductSet={isEventEditProductSet}
|
|
153
143
|
/>
|
|
154
144
|
</SortableTree.Item>
|
|
155
145
|
)}
|
|
@@ -159,7 +149,9 @@ export function StepsControl({
|
|
|
159
149
|
|
|
160
150
|
<CreateProductSetItem
|
|
161
151
|
title={t("addStep")}
|
|
152
|
+
isOverride={isOverrides}
|
|
162
153
|
onClick={() => {
|
|
154
|
+
if (isOverrides) return;
|
|
163
155
|
append(getDefaultStepsValues());
|
|
164
156
|
setShowStepModal(true);
|
|
165
157
|
if (errors.steps?.type === HookFormService.manualErrorType) {
|
|
@@ -7,17 +7,14 @@ import {
|
|
|
7
7
|
QUANTITY_TYPE_LIST_DTO,
|
|
8
8
|
QUANTITY_TYPE_RECHARGING,
|
|
9
9
|
} from "@licklist/core/dist/DataMapper/Product/ProductCategoryDataMapper";
|
|
10
|
-
import {
|
|
11
|
-
ProductType,
|
|
12
|
-
PRODUCT_DEfAULT_COLORS,
|
|
13
|
-
} from "@licklist/core/dist/DataMapper/Product/ProductDataMapper";
|
|
10
|
+
import { ProductType } from "@licklist/core/dist/DataMapper/Product/ProductDataMapper";
|
|
14
11
|
import HookFormService from "@licklist/plugins/dist/services/Form/HookFormService";
|
|
15
|
-
import clsx from "clsx";
|
|
16
12
|
import {
|
|
17
13
|
FieldNamePrefixPath,
|
|
18
14
|
FormValues,
|
|
19
15
|
} from "@licklist/plugins/dist/types/services/Form/hook-form-service";
|
|
20
16
|
import { useId } from "@react-aria/utils";
|
|
17
|
+
import clsx from "clsx";
|
|
21
18
|
import React, {
|
|
22
19
|
ChangeEvent,
|
|
23
20
|
useCallback,
|
|
@@ -39,7 +36,7 @@ import {
|
|
|
39
36
|
} from "react-hook-form";
|
|
40
37
|
import { useTranslation } from "react-i18next";
|
|
41
38
|
import { useImages } from "@licklist/plugins/dist/hooks/Media/useImages";
|
|
42
|
-
|
|
39
|
+
import { PRODUCT_DEfAULT_COLORS } from "@licklist/core/dist/DataMapper/Product/ProductDataMapper";
|
|
43
40
|
import {
|
|
44
41
|
Image,
|
|
45
42
|
IMAGE_TYPE_IMAGE,
|
|
@@ -89,7 +86,6 @@ export interface ProductControlValues
|
|
|
89
86
|
totalQuantity: number;
|
|
90
87
|
isAvailable: boolean;
|
|
91
88
|
isSoldOut: boolean;
|
|
92
|
-
originalProductId: number | null;
|
|
93
89
|
isUnlimited: boolean;
|
|
94
90
|
isRequired: boolean;
|
|
95
91
|
quantitySelector: number;
|
|
@@ -160,6 +156,7 @@ export function ProductControl<T extends FormValues>({
|
|
|
160
156
|
);
|
|
161
157
|
const capacity = watch(`${fieldNamePrefix}.capacity` as Path<T>);
|
|
162
158
|
const disabledDuration = capacity === "0" || !capacity;
|
|
159
|
+
|
|
163
160
|
const advancedId = useId();
|
|
164
161
|
const nameId = useId();
|
|
165
162
|
|
|
@@ -413,7 +410,7 @@ export function ProductControl<T extends FormValues>({
|
|
|
413
410
|
`${fieldNamePrefix}.productGroupId` as Path<T>,
|
|
414
411
|
errors
|
|
415
412
|
)}
|
|
416
|
-
disabled={isLoading
|
|
413
|
+
disabled={isLoading}
|
|
417
414
|
defaultValue=""
|
|
418
415
|
>
|
|
419
416
|
<option value="">{t("Design:selectProductGroup")}</option>
|
|
@@ -26,7 +26,6 @@ export interface StepControlProps extends IsDeletableEvent {
|
|
|
26
26
|
stepIndex: number;
|
|
27
27
|
stepName: string;
|
|
28
28
|
onStepNameChange: (args: any) => void;
|
|
29
|
-
isOverrides?: boolean;
|
|
30
29
|
}
|
|
31
30
|
|
|
32
31
|
export function StepControl({
|
|
@@ -34,7 +33,6 @@ export function StepControl({
|
|
|
34
33
|
stepIndex,
|
|
35
34
|
stepName,
|
|
36
35
|
onStepNameChange,
|
|
37
|
-
isOverrides = false,
|
|
38
36
|
}: StepControlProps) {
|
|
39
37
|
const { providerHasMap } = useContext(ProductSetLoadingContext);
|
|
40
38
|
const {
|
|
@@ -44,6 +42,7 @@ export function StepControl({
|
|
|
44
42
|
watch,
|
|
45
43
|
} = useFormContext<ProductSetFormValues>();
|
|
46
44
|
const { t } = useTranslation("Design");
|
|
45
|
+
|
|
47
46
|
const fieldName = `steps.${stepIndex}.name` as const;
|
|
48
47
|
const productCategoriesFieldName =
|
|
49
48
|
`steps.${stepIndex}.productCategories` as const;
|
|
@@ -72,7 +71,7 @@ export function StepControl({
|
|
|
72
71
|
fieldName,
|
|
73
72
|
errors
|
|
74
73
|
)}
|
|
75
|
-
disabled={isLoading
|
|
74
|
+
disabled={isLoading}
|
|
76
75
|
/>
|
|
77
76
|
)}
|
|
78
77
|
control={control}
|
|
@@ -115,7 +114,7 @@ export function StepControl({
|
|
|
115
114
|
name={name}
|
|
116
115
|
value={Boolean(value)}
|
|
117
116
|
onChange={onChange}
|
|
118
|
-
disabled={isLoading
|
|
117
|
+
disabled={isLoading}
|
|
119
118
|
/>
|
|
120
119
|
)}
|
|
121
120
|
control={control}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { DateTime } from "luxon";
|
|
1
2
|
import React from "react";
|
|
2
3
|
import { Col, Row } from "react-bootstrap";
|
|
3
4
|
import { useFormContext } from "react-hook-form";
|
|
4
5
|
import { useTranslation } from "react-i18next";
|
|
6
|
+
import { TIME_FORMAT } from "@licklist/core/dist/Config";
|
|
5
7
|
import { WorkingHoursInputValues } from ".";
|
|
6
8
|
import { useWeekdays } from "./utils";
|
|
7
9
|
|
|
@@ -23,10 +25,22 @@ export function WorkingHoursInputDescription() {
|
|
|
23
25
|
<Row key={i}>
|
|
24
26
|
<Col xs="auto">{weekdays[i]}:</Col>
|
|
25
27
|
<Col>
|
|
26
|
-
{
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
{weekday?.end
|
|
29
|
+
? weekday.start
|
|
30
|
+
? t("timeInterval", {
|
|
31
|
+
start: DateTime.fromISO(weekday.start).toFormat(
|
|
32
|
+
TIME_FORMAT
|
|
33
|
+
),
|
|
34
|
+
end: DateTime.fromISO(weekday.start).toFormat(
|
|
35
|
+
TIME_FORMAT
|
|
36
|
+
),
|
|
37
|
+
})
|
|
38
|
+
: t("timeFrom", {
|
|
39
|
+
start: DateTime.fromISO(weekday.start).toFormat(
|
|
40
|
+
TIME_FORMAT
|
|
41
|
+
),
|
|
42
|
+
})
|
|
43
|
+
: null}
|
|
30
44
|
</Col>
|
|
31
45
|
</Row>
|
|
32
46
|
);
|
|
@@ -2,18 +2,8 @@ import React, { useEffect } from "react";
|
|
|
2
2
|
import { DateTime } from "luxon";
|
|
3
3
|
import { Col, Form, Row } from "react-bootstrap";
|
|
4
4
|
import { useTranslation } from "react-i18next";
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
useFormContext,
|
|
8
|
-
useWatch,
|
|
9
|
-
Validate,
|
|
10
|
-
} from "react-hook-form";
|
|
11
|
-
import {
|
|
12
|
-
DATE_FORMAT,
|
|
13
|
-
TIME_FORMAT,
|
|
14
|
-
TIME_FULL_FORMAT,
|
|
15
|
-
} from "@licklist/core/dist/Config";
|
|
16
|
-
import { fromFormat } from "@licklist/plugins/dist/utils/dateTime";
|
|
5
|
+
import { RegisterOptions, useFormContext } from "react-hook-form";
|
|
6
|
+
import { DATE_FORMAT } from "@licklist/core/dist/Config";
|
|
17
7
|
import { RecurringDatePickerInputValues } from "./RecurringDatePickerInput";
|
|
18
8
|
|
|
19
9
|
interface RecurrenceIntervalAndFrequencyInputProps {
|
|
@@ -33,8 +23,6 @@ interface RecurrenceIntervalAndFrequencyInputProps {
|
|
|
33
23
|
>;
|
|
34
24
|
}
|
|
35
25
|
|
|
36
|
-
const fromTimeFullFormat = fromFormat(TIME_FULL_FORMAT);
|
|
37
|
-
|
|
38
26
|
function RecurrenceIntervalAndFrequencyInput({
|
|
39
27
|
disabled = false,
|
|
40
28
|
minDate,
|
|
@@ -48,20 +36,16 @@ function RecurrenceIntervalAndFrequencyInput({
|
|
|
48
36
|
const { t } = useTranslation(["Design", "Notification", "App"]);
|
|
49
37
|
|
|
50
38
|
const {
|
|
39
|
+
getValues,
|
|
51
40
|
formState: { errors },
|
|
52
41
|
register,
|
|
53
42
|
trigger,
|
|
54
|
-
control,
|
|
55
43
|
} = useFormContext<RecurringDatePickerInputValues>();
|
|
56
44
|
|
|
57
|
-
const startDate =
|
|
58
|
-
const endDate =
|
|
59
|
-
|
|
60
|
-
const
|
|
61
|
-
const startTime = fromTimeFullFormat(_startTime).toFormat(TIME_FORMAT);
|
|
62
|
-
|
|
63
|
-
const _endTime = useWatch({ control, name: "endTime" });
|
|
64
|
-
const endTime = fromTimeFullFormat(_endTime).toFormat(TIME_FORMAT);
|
|
45
|
+
const startDate = getValues("startDate");
|
|
46
|
+
const endDate = getValues("endDate");
|
|
47
|
+
const startTime = getValues("startTime");
|
|
48
|
+
const endTime = getValues("endTime");
|
|
65
49
|
|
|
66
50
|
useEffect(() => {
|
|
67
51
|
if (!startDate || !endDate) {
|
|
@@ -165,25 +149,22 @@ function RecurrenceIntervalAndFrequencyInput({
|
|
|
165
149
|
type="time"
|
|
166
150
|
{...register("endTime", {
|
|
167
151
|
required: false,
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
}
|
|
175
|
-
const currentStartTime = DateTime.fromISO(startTime);
|
|
176
|
-
const currentEndTime = DateTime.fromISO(time);
|
|
152
|
+
validate: (time) => {
|
|
153
|
+
if (!startTime || !time) {
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
const currentStartTime = DateTime.fromISO(startTime);
|
|
157
|
+
const currentEndTime = DateTime.fromISO(time);
|
|
177
158
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
},
|
|
159
|
+
return currentEndTime?.diff(currentStartTime, ["minutes"])
|
|
160
|
+
?.minutes >= 0
|
|
161
|
+
? true
|
|
162
|
+
: `${t(`Validation:fieldLaterDate`, {
|
|
163
|
+
attribute: t("Design:endTimeSmall"),
|
|
164
|
+
min: t("Design:startTimeSmall"),
|
|
165
|
+
})}`;
|
|
186
166
|
},
|
|
167
|
+
...endTimeRules,
|
|
187
168
|
})}
|
|
188
169
|
placeholder="hh:mm"
|
|
189
170
|
defaultValue={endTime}
|
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { Meta, Story } from "@storybook/react";
|
|
3
3
|
import { Card } from "react-bootstrap";
|
|
4
|
-
import { DateTime } from "luxon";
|
|
5
|
-
import { DATE_FORMAT, TIME_FORMAT } from "@licklist/core/dist/Config/Date";
|
|
6
4
|
import {
|
|
7
5
|
RecurringDatePickerInput,
|
|
8
6
|
RecurringDatePickerInputProps,
|
|
9
7
|
} from "./RecurringDatePickerInput";
|
|
8
|
+
import { DateTime } from "luxon";
|
|
9
|
+
import { DATE_FORMAT, TIME_FORMAT } from "@licklist/core/dist/Config/Date";
|
|
10
10
|
|
|
11
11
|
export default {
|
|
12
12
|
title: "RecurringDatePickerInput",
|
|
13
13
|
component: RecurringDatePickerInput,
|
|
14
14
|
} as Meta;
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
interface DefaultRecurringDatePickerInputProps
|
|
17
|
+
extends RecurringDatePickerInputProps {}
|
|
18
|
+
|
|
19
|
+
export const Default: Story<DefaultRecurringDatePickerInputProps> = (args) => {
|
|
17
20
|
return (
|
|
18
21
|
<Card style={{ maxWidth: "max-content" }}>
|
|
19
22
|
<Card.Body>
|
|
@@ -22,7 +25,7 @@ export const Default: Story<RecurringDatePickerInputProps> = (args) => {
|
|
|
22
25
|
</Card>
|
|
23
26
|
);
|
|
24
27
|
};
|
|
25
|
-
export const Valid: Story<
|
|
28
|
+
export const Valid: Story<DefaultRecurringDatePickerInputProps> = (args) => {
|
|
26
29
|
return (
|
|
27
30
|
<Card style={{ maxWidth: "max-content" }}>
|
|
28
31
|
<Card.Body>
|
|
@@ -33,15 +36,6 @@ export const Valid: Story<RecurringDatePickerInputProps> = (args) => {
|
|
|
33
36
|
};
|
|
34
37
|
Default.args = {
|
|
35
38
|
onChange: (data) => console.log("onSubmit", data),
|
|
36
|
-
workHours: [
|
|
37
|
-
{ start: "20:00", end: "04:00", day: 0, description: "" },
|
|
38
|
-
{ start: "20:00", end: "04:00", day: 1, description: "" },
|
|
39
|
-
{ start: "20:00", end: "04:00", day: 2, description: "" },
|
|
40
|
-
{ start: "20:00", end: "12:00", day: 3, description: "" },
|
|
41
|
-
{ start: "20:00", end: "23:00", day: 4, description: "" },
|
|
42
|
-
{ start: "08:00", end: "12:00", day: 5, description: "" },
|
|
43
|
-
{ start: "10:00", end: "16:00", day: 6, description: "" },
|
|
44
|
-
],
|
|
45
39
|
};
|
|
46
40
|
Valid.args = {
|
|
47
41
|
onChange: (data) => console.log("onSubmit", data),
|
|
@@ -12,14 +12,9 @@ import {
|
|
|
12
12
|
import { usePreviousValue } from "@licklist/plugins/dist/hooks/Value/usePreviousValue";
|
|
13
13
|
import { FormProvider, useForm } from "react-hook-form";
|
|
14
14
|
import { Form } from "react-bootstrap";
|
|
15
|
-
import { WorkHour } from "@licklist/core/dist/DataMapper/Provider/WorkHourDataMapper";
|
|
16
15
|
import RecurrenceIntervalAndFrequencyInput from "./RecurrenceIntervalAndFrequencyInput";
|
|
17
16
|
import RecurrenceWeekdaysInput from "./RecurrenceWeekdaysInput";
|
|
18
|
-
import {
|
|
19
|
-
parseAndValidateRRule,
|
|
20
|
-
SupportedFrequency,
|
|
21
|
-
useWorkHoursValidation,
|
|
22
|
-
} from "./utils";
|
|
17
|
+
import { parseAndValidateRRule, SupportedFrequency } from "./utils";
|
|
23
18
|
import { ConfirmModal } from "../modals";
|
|
24
19
|
import { DeleteFieldButton } from "../product-set/elements";
|
|
25
20
|
|
|
@@ -31,7 +26,6 @@ export interface RecurringDatePickerInputProps {
|
|
|
31
26
|
initialFrequency?: Frequency;
|
|
32
27
|
setInitialStartDateAfterSelect?: boolean;
|
|
33
28
|
minDate?: string;
|
|
34
|
-
workHours: WorkHour[] | undefined;
|
|
35
29
|
}
|
|
36
30
|
|
|
37
31
|
export interface RecurringDatePickerInputValues {
|
|
@@ -57,7 +51,6 @@ export function RecurringDatePickerInput({
|
|
|
57
51
|
setInitialStartDateAfterSelect = false,
|
|
58
52
|
children,
|
|
59
53
|
minDate,
|
|
60
|
-
workHours,
|
|
61
54
|
}: PropsWithChildren<RecurringDatePickerInputProps>) {
|
|
62
55
|
const { t } = useTranslation(["Design"]);
|
|
63
56
|
|
|
@@ -91,8 +84,6 @@ export function RecurringDatePickerInput({
|
|
|
91
84
|
byWeekDay,
|
|
92
85
|
});
|
|
93
86
|
|
|
94
|
-
const validator = useWorkHoursValidation(byWeekDay, workHours);
|
|
95
|
-
|
|
96
87
|
const onSubmit = (nextState: RecurringDatePickerInputValues) => {
|
|
97
88
|
const end = getDateTimeObject(endDate, endTime || "23:59:59");
|
|
98
89
|
|
|
@@ -197,8 +188,6 @@ export function RecurringDatePickerInput({
|
|
|
197
188
|
<RecurrenceIntervalAndFrequencyInput
|
|
198
189
|
disabled={disabled}
|
|
199
190
|
minDate={minDate}
|
|
200
|
-
startTimeRules={validator}
|
|
201
|
-
endTimeRules={validator}
|
|
202
191
|
/>
|
|
203
192
|
|
|
204
193
|
{children}
|