@licklist/design 0.70.10 → 0.71.0
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 +4 -2
- 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/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 +5 -3
- package/dist/events/edit-event-modal/component/SelectEventProductSet/component/EditEventProductSet.js +1 -0
- 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/product-set/product/advanced-options/AdvancedOptions.js +1 -0
- package/dist/snippet/snippet-template/preview/Preview.js +2 -0
- package/dist/styles/availability-indicator/AvailabilityIndicator.scss +9 -0
- package/dist/styles/date-time-button/DateTimeButton.scss +2 -2
- package/dist/styles/iframe-events/Calendar.scss +1 -1
- package/package.json +6 -6
- package/src/assets/iframe/available.svg +4 -4
- package/src/availability-indicator/AvailabilityIndicator.tsx +92 -17
- package/src/calendar/Calendar.tsx +2 -0
- package/src/calendar/components/CalendarDates/CalendarDates.tsx +3 -0
- package/src/date-time-button/DateTimeButton.tsx +7 -3
- 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 +2 -2
- package/src/styles/iframe-events/Calendar.scss +1 -1
- package/yarn.lock +156 -132
|
@@ -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: 'availableSingleSpace' }
|
|
50
|
+
: { label: 'availableMultipleSpaces', 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
|
-
resources
|
|
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
|
)
|
|
@@ -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 ||
|
|
@@ -43,7 +46,7 @@ export const DateTimeButton = ({
|
|
|
43
46
|
const isPast = variant === Variant.time ? isPastTime(date) : isPastDate(date)
|
|
44
47
|
|
|
45
48
|
const isDisabled = _isDisabled || isSoldOut || isPast
|
|
46
|
-
|
|
49
|
+
const isUnavailable = _isDisabled || isPast
|
|
47
50
|
return (
|
|
48
51
|
<button
|
|
49
52
|
type='button'
|
|
@@ -67,10 +70,11 @@ export const DateTimeButton = ({
|
|
|
67
70
|
variant={variant}
|
|
68
71
|
/>
|
|
69
72
|
{price && !isDisabled && <div className='price'>{price}</div>}
|
|
70
|
-
{showResources && resources && (
|
|
73
|
+
{showResources && (resources || isUnavailable) && (
|
|
71
74
|
<AvailabilityIndicator
|
|
75
|
+
availabilityFormat={availabilityFormat}
|
|
72
76
|
resources={resources}
|
|
73
|
-
isUnavailable={
|
|
77
|
+
isUnavailable={isUnavailable}
|
|
74
78
|
isSoldOut={isSoldOut}
|
|
75
79
|
/>
|
|
76
80
|
)}
|
|
@@ -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' />
|
|
@@ -79,13 +79,13 @@
|
|
|
79
79
|
|
|
80
80
|
&.only-time-container {
|
|
81
81
|
min-width: 5.3rem;
|
|
82
|
-
max-width:
|
|
82
|
+
max-width: 8.3rem;
|
|
83
|
+
flex-grow: 1;
|
|
83
84
|
min-height: 2.75rem;
|
|
84
85
|
border: 2px solid $snippet-calendar-disabled-button-border-color;
|
|
85
86
|
}
|
|
86
87
|
|
|
87
88
|
&.calendar-view {
|
|
88
|
-
min-width: auto;
|
|
89
89
|
max-width: none;
|
|
90
90
|
min-height: auto;
|
|
91
91
|
}
|