@pushwoosh/smart-components-kit 1.10.0 → 1.11.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.
@@ -1,4 +1,6 @@
1
1
  import { type PickerSortOrder } from './types';
2
2
  /** Every order a picker may offer, in menu order. */
3
3
  export declare const PICKER_SORT_ORDERS: readonly PickerSortOrder[];
4
+ /** Orders `popupFormsContents.List` can serve; it has no created date. */
5
+ export declare const POPUP_CONTENTS_SORT_ORDERS: readonly PickerSortOrder[];
4
6
  export declare const PICKER_SORT_STORAGE_PREFIX = "picker-sort";
@@ -1,3 +1,5 @@
1
1
  /** Every order a picker may offer, in menu order. */
2
2
  export const PICKER_SORT_ORDERS = ['created-desc', 'created-asc', 'updated-desc', 'name-asc', 'name-desc'];
3
+ /** Orders `popupFormsContents.List` can serve; it has no created date. */
4
+ export const POPUP_CONTENTS_SORT_ORDERS = ['updated-desc', 'name-asc', 'name-desc'];
3
5
  export const PICKER_SORT_STORAGE_PREFIX = 'picker-sort';
@@ -1,6 +1,12 @@
1
- import { type PickerContentType, type PickerSortOrder, type PresetListOrder } from './types';
1
+ import { type PickerContentType, type PickerSortAccessors, type PickerSortOrder, type PopupContentsListOrder, type PresetListOrder, type RichMediaListOrder } from './types';
2
2
  /** Map a picker order to the `orderBy` / `orderDirection` of the preset `List` RPCs. */
3
3
  export declare function toPresetListOrder(order: PickerSortOrder): PresetListOrder;
4
+ /** Map a picker order to the `orderBy` / `orderType` of `richMedia.List`. */
5
+ export declare function toRichMediaListOrder(order: PickerSortOrder): RichMediaListOrder;
6
+ /** Map a picker order to `popupFormsContents.List`; created orders, which it lacks, fall back to the updated date. */
7
+ export declare function toPopupContentsListOrder(order: PickerSortOrder): PopupContentsListOrder;
8
+ /** Sort a list the source returns whole, as the picker order asks; stable, returns a new array. */
9
+ export declare function sortItemsByPickerOrder<T>(items: readonly T[], order: PickerSortOrder, { getName, getCreated, getUpdated }: PickerSortAccessors<T>): T[];
4
10
  export declare function isPickerSortOrder(value: unknown): value is PickerSortOrder;
5
11
  export declare function resolvePickerSortOrder(stored: unknown, defaultOrder: PickerSortOrder, supportedOrders: readonly PickerSortOrder[]): PickerSortOrder;
6
12
  export declare function pickerSortStorageKey(userEmail: string, contentType: PickerContentType): string;
@@ -21,10 +21,109 @@ const PRESET_LIST_ORDERS = {
21
21
  orderDirection: 'DESC'
22
22
  }
23
23
  };
24
+ const RICH_MEDIA_LIST_ORDERS = {
25
+ 'created-desc': {
26
+ orderBy: 'CREATED_DATE',
27
+ orderType: 'DESC'
28
+ },
29
+ 'created-asc': {
30
+ orderBy: 'CREATED_DATE',
31
+ orderType: 'ASC'
32
+ },
33
+ 'updated-desc': {
34
+ orderBy: 'UPDATED_DATE',
35
+ orderType: 'DESC'
36
+ },
37
+ 'name-asc': {
38
+ orderBy: 'NAME',
39
+ orderType: 'ASC'
40
+ },
41
+ 'name-desc': {
42
+ orderBy: 'NAME',
43
+ orderType: 'DESC'
44
+ }
45
+ };
46
+ const POPUP_CONTENTS_LIST_ORDERS = {
47
+ 'created-desc': {
48
+ orderBy: 'UPDATED',
49
+ orderDirection: 'DESC'
50
+ },
51
+ 'created-asc': {
52
+ orderBy: 'UPDATED',
53
+ orderDirection: 'ASC'
54
+ },
55
+ 'updated-desc': {
56
+ orderBy: 'UPDATED',
57
+ orderDirection: 'DESC'
58
+ },
59
+ 'name-asc': {
60
+ orderBy: 'NAME',
61
+ orderDirection: 'ASC'
62
+ },
63
+ 'name-desc': {
64
+ orderBy: 'NAME',
65
+ orderDirection: 'DESC'
66
+ }
67
+ };
68
+ const nameCollator = new Intl.Collator(undefined, {
69
+ numeric: true,
70
+ sensitivity: 'base'
71
+ });
24
72
  /** Map a picker order to the `orderBy` / `orderDirection` of the preset `List` RPCs. */
25
73
  export function toPresetListOrder(order) {
26
74
  return PRESET_LIST_ORDERS[order];
27
75
  }
76
+ /** Map a picker order to the `orderBy` / `orderType` of `richMedia.List`. */
77
+ export function toRichMediaListOrder(order) {
78
+ return RICH_MEDIA_LIST_ORDERS[order];
79
+ }
80
+ /** Map a picker order to `popupFormsContents.List`; created orders, which it lacks, fall back to the updated date. */
81
+ export function toPopupContentsListOrder(order) {
82
+ return POPUP_CONTENTS_LIST_ORDERS[order];
83
+ }
84
+ function toTime(date) {
85
+ if (date === null || date === undefined || date === '') {
86
+ return undefined;
87
+ }
88
+ const time = date instanceof Date ? date.getTime() : new Date(date).getTime();
89
+ return Number.isNaN(time) ? undefined : time;
90
+ }
91
+ function sortByDate(items, getDate, direction) {
92
+ if (!getDate) {
93
+ return [...items];
94
+ }
95
+ const dated = items.map(item => ({
96
+ item,
97
+ time: toTime(getDate(item))
98
+ }));
99
+ return dated.sort((a, b) => {
100
+ if (a.time === undefined || b.time === undefined) {
101
+ return Number(a.time === undefined) - Number(b.time === undefined);
102
+ }
103
+ return (a.time - b.time) * direction;
104
+ }).map(({
105
+ item
106
+ }) => item);
107
+ }
108
+ /** Sort a list the source returns whole, as the picker order asks; stable, returns a new array. */
109
+ export function sortItemsByPickerOrder(items, order, {
110
+ getName,
111
+ getCreated,
112
+ getUpdated
113
+ }) {
114
+ switch (order) {
115
+ case 'name-asc':
116
+ return [...items].sort((a, b) => nameCollator.compare(getName(a), getName(b)));
117
+ case 'name-desc':
118
+ return [...items].sort((a, b) => nameCollator.compare(getName(b), getName(a)));
119
+ case 'created-desc':
120
+ return sortByDate(items, getCreated, -1);
121
+ case 'created-asc':
122
+ return sortByDate(items, getCreated, 1);
123
+ case 'updated-desc':
124
+ return sortByDate(items, getUpdated, -1);
125
+ }
126
+ }
28
127
  export function isPickerSortOrder(value) {
29
128
  return typeof value === 'string' && PICKER_SORT_ORDERS.includes(value);
30
129
  }
@@ -1,7 +1,7 @@
1
1
  export { PickerSortMenu } from './components/PickerSortMenu';
2
- export { PICKER_SORT_ORDERS } from './constants';
3
- export { toPresetListOrder } from './helpers';
2
+ export { PICKER_SORT_ORDERS, POPUP_CONTENTS_SORT_ORDERS } from './constants';
3
+ export { sortItemsByPickerOrder, toPopupContentsListOrder, toPresetListOrder, toRichMediaListOrder } from './helpers';
4
4
  export { usePagedItems } from './usePagedItems';
5
5
  export { usePickerSortOrder } from './usePickerSortOrder';
6
6
  export type { PickerSortMenuProps } from './components/PickerSortMenu/types';
7
- export type { LoadPagedItems, PagedItemsPage, PagedItemsState, PickerContentType, PickerSortOrder, PickerSortOrderState, PresetListOrder, UsePickerSortOrderOptions, } from './types';
7
+ export type { LoadPagedItems, PagedItemsPage, PagedItemsState, PickerContentType, PickerSortAccessors, PickerSortDate, PickerSortOrder, PickerSortOrderState, PopupContentsListOrder, PresetListOrder, RichMediaListOrder, RichMediaListOrderBy, UsePickerSortOrderOptions, } from './types';
@@ -1,5 +1,5 @@
1
1
  export { PickerSortMenu } from './components/PickerSortMenu';
2
- export { PICKER_SORT_ORDERS } from './constants';
3
- export { toPresetListOrder } from './helpers';
2
+ export { PICKER_SORT_ORDERS, POPUP_CONTENTS_SORT_ORDERS } from './constants';
3
+ export { sortItemsByPickerOrder, toPopupContentsListOrder, toPresetListOrder, toRichMediaListOrder } from './helpers';
4
4
  export { usePagedItems } from './usePagedItems';
5
5
  export { usePickerSortOrder } from './usePickerSortOrder';
@@ -1,4 +1,6 @@
1
1
  import { type ListPresetsRequest_OrderBy, type ListPresetsRequest_OrderDirection } from '@pushwoosh/rpc-v2-http-api-data/presets';
2
+ import { type ListRequest_OrderBy as PopupContentsListRequestOrderBy, type ListRequest_OrderDirection as PopupContentsListRequestOrderDirection } from '@pushwoosh/rpc-v2-http-api-data/pushwoosh_rpc_popup_forms_contents_v3';
3
+ import { type ListRequest_OrderType as RichMediaListRequestOrderType } from '@pushwoosh/rpc-v2-http-api-data/rich_medias';
2
4
  /** Order a picker can list its items in. */
3
5
  export type PickerSortOrder = 'created-desc' | 'created-asc' | 'updated-desc' | 'name-asc' | 'name-desc';
4
6
  /** Content kind a picker lists; the chosen order is remembered per user and per kind. */
@@ -8,6 +10,26 @@ export type PresetListOrder = {
8
10
  readonly orderBy: ListPresetsRequest_OrderBy;
9
11
  readonly orderDirection: ListPresetsRequest_OrderDirection;
10
12
  };
13
+ /** `orderBy` of `richMedia.List`; local until `NAME` reaches the published rpc-v2 types. */
14
+ export type RichMediaListOrderBy = 'CREATED_DATE' | 'UPDATED_DATE' | 'NAME';
15
+ /** `orderBy` / `orderType` pair of `richMedia.List`. */
16
+ export type RichMediaListOrder = {
17
+ readonly orderBy: RichMediaListOrderBy;
18
+ readonly orderType: RichMediaListRequestOrderType;
19
+ };
20
+ /** `orderBy` / `orderDirection` pair of `popupFormsContents.List`. */
21
+ export type PopupContentsListOrder = {
22
+ readonly orderBy: PopupContentsListRequestOrderBy;
23
+ readonly orderDirection: PopupContentsListRequestOrderDirection;
24
+ };
25
+ /** Date accepted by {@link sortItemsByPickerOrder}; an unparsable or missing one counts as no date. */
26
+ export type PickerSortDate = Date | string | number | null | undefined;
27
+ /** Getters {@link sortItemsByPickerOrder} reads; a date order without its getter keeps the input order. */
28
+ export type PickerSortAccessors<T> = {
29
+ readonly getName: (item: T) => string;
30
+ readonly getCreated?: (item: T) => PickerSortDate;
31
+ readonly getUpdated?: (item: T) => PickerSortDate;
32
+ };
11
33
  /** Options of {@link usePickerSortOrder}. */
12
34
  export type UsePickerSortOrderOptions = {
13
35
  /** Content kind the picker lists. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pushwoosh/smart-components-kit",
3
- "version": "1.10.0",
3
+ "version": "1.11.0",
4
4
  "description": "Stateful, data-connected React components shared by Pushwoosh micro-frontends",
5
5
  "repository": {
6
6
  "type": "git",