@licklist/design 0.70.0-dev.3 → 0.70.0-dev.5
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/dist/assets/iframe/available.svg +4 -4
- package/dist/assets/iframe/available.svg.js +16 -18
- package/dist/availability-indicator/AvailabilityIndicator.d.ts +3 -1
- package/dist/availability-indicator/AvailabilityIndicator.d.ts.map +1 -1
- package/dist/availability-indicator/AvailabilityIndicator.js +112 -18
- package/dist/calendar/Calendar.d.ts +2 -0
- package/dist/calendar/Calendar.d.ts.map +1 -1
- package/dist/calendar/components/CalendarDates/CalendarDates.d.ts +2 -2
- package/dist/calendar/components/CalendarDates/CalendarDates.d.ts.map +1 -1
- package/dist/calendar/components/CalendarDates/CalendarDates.js +3 -2
- package/dist/custom-fields/field-set/components/CustomFieldSet/CustomFieldSet.d.ts.map +1 -1
- package/dist/custom-fields/field-set/components/CustomFieldSet/CustomFieldSet.js +14 -0
- package/dist/date-time-button/DateTimeButton.d.ts +3 -1
- package/dist/date-time-button/DateTimeButton.d.ts.map +1 -1
- package/dist/date-time-button/DateTimeButton.js +2 -1
- package/dist/iframe/activity-card/ActivityCard.d.ts +3 -1
- package/dist/iframe/activity-card/ActivityCard.d.ts.map +1 -1
- package/dist/iframe/activity-card/ActivityCard.js +5 -3
- package/dist/snippet/snippet-template/preview/Preview.js +1 -0
- package/dist/styles/availability-indicator/AvailabilityIndicator.scss +9 -0
- package/dist/styles/date-time-button/DateTimeButton.scss +1 -1
- package/package.json +3 -3
- package/src/assets/iframe/available.svg +4 -4
- package/src/availability-indicator/AvailabilityIndicator.tsx +91 -16
- package/src/calendar/Calendar.tsx +2 -0
- package/src/calendar/components/CalendarDates/CalendarDates.tsx +3 -0
- package/src/custom-fields/field-set/components/CustomFieldSet/CustomFieldSet.tsx +16 -1
- package/src/date-time-button/DateTimeButton.tsx +4 -0
- package/src/iframe/activity-card/ActivityCard.tsx +15 -2
- package/src/styles/availability-indicator/AvailabilityIndicator.scss +9 -0
- package/src/styles/date-time-button/DateTimeButton.scss +1 -1
- package/yarn.lock +225 -191
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import { FunctionComponent, SVGProps } from 'react'
|
|
2
2
|
import { useTranslation } from 'react-i18next'
|
|
3
3
|
import { ZoneResourcesAvailability } from '@licklist/core/dist/DataMapper/Order/ZoneResourcesAvailabilityDataMapper'
|
|
4
|
+
import {
|
|
5
|
+
AVAILABILITY_FORMAT_NUMBER,
|
|
6
|
+
AvailabilityFormat,
|
|
7
|
+
} from '@licklist/core/dist/DataMapper/Provider/SnippetDataMapper'
|
|
8
|
+
import { useWindowDimensions } from '@licklist/plugins'
|
|
4
9
|
import { ReactComponent as AvailableIcon } from '../assets/iframe/available.svg'
|
|
5
10
|
import { ReactComponent as LimitedIcon } from '../assets/iframe/limited.svg'
|
|
6
11
|
import { ReactComponent as SoldOutIcon } from '../assets/iframe/soldOut.svg'
|
|
12
|
+
import { TAB_WIDTH } from '../iframe/page/components/PageBody/constants'
|
|
7
13
|
|
|
8
14
|
const LOTS_OF_SPACE_LIMIT = 0.2
|
|
9
15
|
const LIMITED_LIMIT = 0.8
|
|
@@ -13,38 +19,94 @@ type Config = {
|
|
|
13
19
|
Icon: FunctionComponent<SVGProps<SVGSVGElement>>
|
|
14
20
|
}
|
|
15
21
|
|
|
16
|
-
|
|
22
|
+
type GetIconsAndLabelsWithArgumentResult = Config & {
|
|
23
|
+
argument?: number
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface GetIconsAndLabels extends ZoneResourcesAvailability {
|
|
27
|
+
availabilityFormat?: AvailabilityFormat | null
|
|
28
|
+
}
|
|
29
|
+
interface GetAppropreateLabelFormat extends GetIconsAndLabels {
|
|
30
|
+
label?: string
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const getLabelsWithArgument = ({
|
|
17
34
|
bookedResources,
|
|
18
35
|
totalResources,
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
36
|
+
availabilityFormat,
|
|
37
|
+
label,
|
|
38
|
+
}: GetAppropreateLabelFormat): {
|
|
39
|
+
label: string
|
|
40
|
+
argument?: number
|
|
41
|
+
} => {
|
|
42
|
+
const availableResources = totalResources - bookedResources
|
|
43
|
+
|
|
44
|
+
if (availabilityFormat !== AVAILABILITY_FORMAT_NUMBER) {
|
|
45
|
+
return { label }
|
|
22
46
|
}
|
|
23
47
|
|
|
48
|
+
return availableResources === 1
|
|
49
|
+
? { label: 'availableSingleResource' }
|
|
50
|
+
: { label: 'availableMultipleResources', argument: availableResources }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const getIconsAndLabelsWithArgument = ({
|
|
54
|
+
bookedResources,
|
|
55
|
+
totalResources,
|
|
56
|
+
availabilityFormat,
|
|
57
|
+
}: GetIconsAndLabels): GetIconsAndLabelsWithArgumentResult => {
|
|
24
58
|
// lots of space if less than 80% booked
|
|
25
59
|
if (bookedResources / totalResources <= LOTS_OF_SPACE_LIMIT) {
|
|
26
|
-
return {
|
|
60
|
+
return {
|
|
61
|
+
...getLabelsWithArgument({
|
|
62
|
+
bookedResources,
|
|
63
|
+
totalResources,
|
|
64
|
+
availabilityFormat,
|
|
65
|
+
label: 'lotsOfSpace',
|
|
66
|
+
}),
|
|
67
|
+
Icon: AvailableIcon,
|
|
68
|
+
}
|
|
27
69
|
}
|
|
28
70
|
|
|
29
71
|
if (bookedResources / totalResources >= LIMITED_LIMIT) {
|
|
30
|
-
return {
|
|
72
|
+
return {
|
|
73
|
+
...getLabelsWithArgument({
|
|
74
|
+
bookedResources,
|
|
75
|
+
totalResources,
|
|
76
|
+
availabilityFormat,
|
|
77
|
+
label: 'limited',
|
|
78
|
+
}),
|
|
79
|
+
Icon: LimitedIcon,
|
|
80
|
+
}
|
|
31
81
|
}
|
|
32
82
|
|
|
33
|
-
return {
|
|
83
|
+
return {
|
|
84
|
+
...getLabelsWithArgument({
|
|
85
|
+
bookedResources,
|
|
86
|
+
totalResources,
|
|
87
|
+
availabilityFormat,
|
|
88
|
+
label: 'available',
|
|
89
|
+
}),
|
|
90
|
+
Icon: AvailableIcon,
|
|
91
|
+
}
|
|
34
92
|
}
|
|
35
93
|
|
|
36
94
|
type AvailabilityIndicatorProps = {
|
|
37
95
|
resources: ZoneResourcesAvailability
|
|
38
96
|
isUnavailable?: boolean
|
|
39
97
|
isSoldOut?: boolean
|
|
98
|
+
availabilityFormat?: AvailabilityFormat | null
|
|
40
99
|
}
|
|
41
100
|
|
|
42
101
|
export const AvailabilityIndicator = ({
|
|
43
102
|
resources,
|
|
44
103
|
isUnavailable,
|
|
45
|
-
isSoldOut,
|
|
104
|
+
isSoldOut: _isSoldOut,
|
|
105
|
+
availabilityFormat,
|
|
46
106
|
}: AvailabilityIndicatorProps) => {
|
|
47
107
|
const { t } = useTranslation('Design')
|
|
108
|
+
const isSoldOut =
|
|
109
|
+
_isSoldOut || resources.bookedResources === resources.totalResources
|
|
48
110
|
|
|
49
111
|
if (isUnavailable) {
|
|
50
112
|
return <Indicator Icon={SoldOutIcon} label={t('notAvailable')} />
|
|
@@ -54,14 +116,27 @@ export const AvailabilityIndicator = ({
|
|
|
54
116
|
return <Indicator Icon={SoldOutIcon} label={t('soldOut')} />
|
|
55
117
|
}
|
|
56
118
|
|
|
57
|
-
const { Icon, label } =
|
|
119
|
+
const { Icon, label, argument } = getIconsAndLabelsWithArgument({
|
|
120
|
+
...resources,
|
|
121
|
+
availabilityFormat,
|
|
122
|
+
})
|
|
58
123
|
|
|
59
|
-
return
|
|
124
|
+
return (
|
|
125
|
+
<Indicator
|
|
126
|
+
Icon={Icon}
|
|
127
|
+
label={t(label, argument ? { argument } : undefined)}
|
|
128
|
+
/>
|
|
129
|
+
)
|
|
60
130
|
}
|
|
61
131
|
|
|
62
|
-
const Indicator = ({ Icon, label }: Config) =>
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
132
|
+
const Indicator = ({ Icon, label }: Config) => {
|
|
133
|
+
const { width } = useWindowDimensions()
|
|
134
|
+
const iconSizes =
|
|
135
|
+
width > TAB_WIDTH ? { height: 15, width: 11 } : { height: 11, width: 7 }
|
|
136
|
+
return (
|
|
137
|
+
<div className='availability-indicator'>
|
|
138
|
+
<Icon height={iconSizes.height} width={iconSizes.width} viewBox='auto' />
|
|
139
|
+
<div className='indicator-label'>{label}</div>
|
|
140
|
+
</div>
|
|
141
|
+
)
|
|
142
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Dispatch, ReactElement, SetStateAction } from 'react'
|
|
2
2
|
import { DateTime } from 'luxon'
|
|
3
|
+
import { AvailabilityFormat } from '@licklist/core/dist/DataMapper/Provider/SnippetDataMapper'
|
|
3
4
|
import { DateTimeButtonProps } from 'src/date-time-button'
|
|
4
5
|
import { CalendarButtons } from './components/CalendarButtons'
|
|
5
6
|
import { CalendarDates } from './components/CalendarDates'
|
|
@@ -21,6 +22,7 @@ export type CalendarProps = {
|
|
|
21
22
|
fromPrice?: string | ReactElement | null
|
|
22
23
|
isLoading?: boolean
|
|
23
24
|
initialDate?: DateTime
|
|
25
|
+
availabilityFormat?: AvailabilityFormat | null
|
|
24
26
|
getDateTimeButtonProps: (
|
|
25
27
|
date: DateTime,
|
|
26
28
|
) => Pick<DateTimeButtonProps, 'resources' | 'showResources' | 'isDisabled'>
|
|
@@ -11,6 +11,7 @@ export type CalendarDatesProps = Pick<
|
|
|
11
11
|
| 'setSelectedDate'
|
|
12
12
|
| 'fromPrice'
|
|
13
13
|
| 'getDateTimeButtonProps'
|
|
14
|
+
| 'availabilityFormat'
|
|
14
15
|
>
|
|
15
16
|
|
|
16
17
|
export const CalendarDates = ({
|
|
@@ -18,6 +19,7 @@ export const CalendarDates = ({
|
|
|
18
19
|
selectedDate,
|
|
19
20
|
setSelectedDate,
|
|
20
21
|
fromPrice,
|
|
22
|
+
availabilityFormat,
|
|
21
23
|
getDateTimeButtonProps,
|
|
22
24
|
}: CalendarDatesProps) => {
|
|
23
25
|
const fillCalendarDates = useMemo(() => {
|
|
@@ -56,6 +58,7 @@ export const CalendarDates = ({
|
|
|
56
58
|
onSelect={() => setSelectedDate(date)}
|
|
57
59
|
price={fromPrice}
|
|
58
60
|
variant={Variant.month}
|
|
61
|
+
availabilityFormat={availabilityFormat}
|
|
59
62
|
{...props}
|
|
60
63
|
/>
|
|
61
64
|
)
|
|
@@ -17,6 +17,7 @@ import { HasPermissionProp } from '@licklist/plugins/dist/types/permission/Permi
|
|
|
17
17
|
import FormErrorService from '@licklist/plugins/dist/services/Form/FormErrorService'
|
|
18
18
|
import { ServerError } from '@licklist/plugins/dist/hooks/Api/useHttpQuery'
|
|
19
19
|
import HookFormService from '@licklist/plugins/dist/services/Form/HookFormService'
|
|
20
|
+
import useNotification from '@licklist/plugins/dist/context/app/hooks/useNotification'
|
|
20
21
|
|
|
21
22
|
import {
|
|
22
23
|
CreateSortableListItem,
|
|
@@ -84,7 +85,7 @@ export const CustomFieldSet = ({
|
|
|
84
85
|
useEffect(() => {
|
|
85
86
|
FormErrorService.handleServerErrors(serverErrors, setError)
|
|
86
87
|
}, [serverErrors, setError])
|
|
87
|
-
|
|
88
|
+
const notification = useNotification()
|
|
88
89
|
const { fields, append, remove } = useFieldArray({
|
|
89
90
|
control,
|
|
90
91
|
name: CUSTOM_FIELDS,
|
|
@@ -97,6 +98,13 @@ export const CustomFieldSet = ({
|
|
|
97
98
|
|
|
98
99
|
if (!response) return
|
|
99
100
|
|
|
101
|
+
notification.success({
|
|
102
|
+
title: t('App:success'),
|
|
103
|
+
message: t('Notification:createSuccessfully', {
|
|
104
|
+
argument: t('customField'),
|
|
105
|
+
}),
|
|
106
|
+
})
|
|
107
|
+
|
|
100
108
|
setFieldSets((prevFieldSets) => {
|
|
101
109
|
const nextFieldSets = [...prevFieldSets]
|
|
102
110
|
|
|
@@ -115,6 +123,13 @@ export const CustomFieldSet = ({
|
|
|
115
123
|
const removeFieldSet = async () => {
|
|
116
124
|
if (fieldSet.id !== null) {
|
|
117
125
|
await onFieldSetDelete(fieldSet)
|
|
126
|
+
|
|
127
|
+
notification.success({
|
|
128
|
+
title: t('App:success'),
|
|
129
|
+
message: t('Notification:theRemovedSuccessfully', {
|
|
130
|
+
argument: t('customField'),
|
|
131
|
+
}),
|
|
132
|
+
})
|
|
118
133
|
}
|
|
119
134
|
|
|
120
135
|
setFieldSets(
|
|
@@ -2,6 +2,7 @@ import { ReactElement } from 'react'
|
|
|
2
2
|
import clsx from 'clsx'
|
|
3
3
|
import { DateTime } from 'luxon'
|
|
4
4
|
import { ZoneResourcesAvailability } from '@licklist/core/dist/DataMapper/Order/ZoneResourcesAvailabilityDataMapper'
|
|
5
|
+
import { AvailabilityFormat } from '@licklist/core/dist/DataMapper/Provider/SnippetDataMapper'
|
|
5
6
|
import { AvailabilityIndicator } from '../availability-indicator'
|
|
6
7
|
import { DateContent } from './DateContent'
|
|
7
8
|
|
|
@@ -21,6 +22,7 @@ export type DateTimeButtonProps = {
|
|
|
21
22
|
resources?: ZoneResourcesAvailability | null
|
|
22
23
|
showResources?: boolean
|
|
23
24
|
variant: Variant
|
|
25
|
+
availabilityFormat?: AvailabilityFormat | null
|
|
24
26
|
}
|
|
25
27
|
|
|
26
28
|
export const DateTimeButton = ({
|
|
@@ -33,6 +35,7 @@ export const DateTimeButton = ({
|
|
|
33
35
|
resources,
|
|
34
36
|
showResources,
|
|
35
37
|
variant = Variant.week,
|
|
38
|
+
availabilityFormat,
|
|
36
39
|
}: DateTimeButtonProps) => {
|
|
37
40
|
const isSoldOut =
|
|
38
41
|
_isSoldOut ||
|
|
@@ -69,6 +72,7 @@ export const DateTimeButton = ({
|
|
|
69
72
|
{price && !isDisabled && <div className='price'>{price}</div>}
|
|
70
73
|
{showResources && resources && (
|
|
71
74
|
<AvailabilityIndicator
|
|
75
|
+
availabilityFormat={availabilityFormat}
|
|
72
76
|
resources={resources}
|
|
73
77
|
isUnavailable={_isDisabled || isPast}
|
|
74
78
|
isSoldOut={isSoldOut}
|
|
@@ -2,6 +2,7 @@ import { ReactNode } from 'react'
|
|
|
2
2
|
import clsx from 'clsx'
|
|
3
3
|
import { Image } from '@licklist/core/dist/DataMapper/Media/ImageDataMapper'
|
|
4
4
|
import { ZoneResourcesAvailability } from '@licklist/core/dist/DataMapper/Order/ZoneResourcesAvailabilityDataMapper'
|
|
5
|
+
import { AvailabilityFormat } from '@licklist/core/dist/DataMapper/Provider/SnippetDataMapper'
|
|
5
6
|
import { AvailabilityIndicator } from '../../availability-indicator'
|
|
6
7
|
|
|
7
8
|
export const LAYOUT_GRID = 'grid'
|
|
@@ -18,6 +19,7 @@ export type ActivityCardProps = {
|
|
|
18
19
|
availableTimes?: string | null
|
|
19
20
|
image?: Image | null
|
|
20
21
|
resources?: ZoneResourcesAvailability
|
|
22
|
+
availabilityFormat?: AvailabilityFormat | null
|
|
21
23
|
}
|
|
22
24
|
|
|
23
25
|
export const ActivityCard = ({
|
|
@@ -30,6 +32,7 @@ export const ActivityCard = ({
|
|
|
30
32
|
onSelect,
|
|
31
33
|
isSelected,
|
|
32
34
|
layout = LAYOUT_GRID,
|
|
35
|
+
availabilityFormat,
|
|
33
36
|
resources,
|
|
34
37
|
}: ActivityCardProps) => {
|
|
35
38
|
if (layout === LAYOUT_GRID) {
|
|
@@ -50,7 +53,12 @@ export const ActivityCard = ({
|
|
|
50
53
|
{description && (
|
|
51
54
|
<div className='mt-2 activity-card-description'>{description}</div>
|
|
52
55
|
)}
|
|
53
|
-
{resources &&
|
|
56
|
+
{resources && (
|
|
57
|
+
<AvailabilityIndicator
|
|
58
|
+
resources={resources}
|
|
59
|
+
availabilityFormat={availabilityFormat}
|
|
60
|
+
/>
|
|
61
|
+
)}
|
|
54
62
|
</div>
|
|
55
63
|
</button>
|
|
56
64
|
)
|
|
@@ -76,7 +84,12 @@ export const ActivityCard = ({
|
|
|
76
84
|
{description && (
|
|
77
85
|
<div className='mt-2 activity-card-description'>{description}</div>
|
|
78
86
|
)}
|
|
79
|
-
{resources &&
|
|
87
|
+
{resources && (
|
|
88
|
+
<AvailabilityIndicator
|
|
89
|
+
resources={resources}
|
|
90
|
+
availabilityFormat={availabilityFormat}
|
|
91
|
+
/>
|
|
92
|
+
)}
|
|
80
93
|
</div>
|
|
81
94
|
|
|
82
95
|
<hr className='list-activity-card-hr' />
|