@neovici/cosmoz-queue 1.0.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.
Files changed (143) hide show
  1. package/README.md +3 -0
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +1 -0
  5. package/dist/queue/actions/index.d.ts +22 -0
  6. package/dist/queue/actions/index.d.ts.map +1 -0
  7. package/dist/queue/actions/index.js +20 -0
  8. package/dist/queue/icon.d.ts +2 -0
  9. package/dist/queue/icon.d.ts.map +1 -0
  10. package/dist/queue/icon.js +12 -0
  11. package/dist/queue/icons.d.ts +4 -0
  12. package/dist/queue/icons.d.ts.map +1 -0
  13. package/dist/queue/icons.js +61 -0
  14. package/dist/queue/index.d.ts +8 -0
  15. package/dist/queue/index.d.ts.map +1 -0
  16. package/dist/queue/index.js +5 -0
  17. package/dist/queue/item-click.d.ts +5 -0
  18. package/dist/queue/item-click.d.ts.map +1 -0
  19. package/dist/queue/item-click.js +15 -0
  20. package/dist/queue/list-core/column.d.ts +34 -0
  21. package/dist/queue/list-core/column.d.ts.map +1 -0
  22. package/dist/queue/list-core/column.js +10 -0
  23. package/dist/queue/list-core/index.d.ts +7 -0
  24. package/dist/queue/list-core/index.d.ts.map +1 -0
  25. package/dist/queue/list-core/index.js +6 -0
  26. package/dist/queue/list-core/list-core.d.ts +6 -0
  27. package/dist/queue/list-core/list-core.d.ts.map +1 -0
  28. package/dist/queue/list-core/list-core.js +6 -0
  29. package/dist/queue/list-core/render-generic-actions.d.ts +4 -0
  30. package/dist/queue/list-core/render-generic-actions.d.ts.map +1 -0
  31. package/dist/queue/list-core/render-generic-actions.js +14 -0
  32. package/dist/queue/list-core/render-list-core.d.ts +18 -0
  33. package/dist/queue/list-core/render-list-core.d.ts.map +1 -0
  34. package/dist/queue/list-core/render-list-core.js +42 -0
  35. package/dist/queue/list-core/style.css.d.ts +2 -0
  36. package/dist/queue/list-core/style.css.d.ts.map +1 -0
  37. package/dist/queue/list-core/style.css.js +20 -0
  38. package/dist/queue/list-core/use-inline-actions.d.ts +4 -0
  39. package/dist/queue/list-core/use-inline-actions.d.ts.map +1 -0
  40. package/dist/queue/list-core/use-inline-actions.js +10 -0
  41. package/dist/queue/list-core/use-list-core.d.ts +34 -0
  42. package/dist/queue/list-core/use-list-core.d.ts.map +1 -0
  43. package/dist/queue/list-core/use-list-core.js +36 -0
  44. package/dist/queue/list-core/use-list-state.d.ts +24 -0
  45. package/dist/queue/list-core/use-list-state.d.ts.map +1 -0
  46. package/dist/queue/list-core/use-list-state.js +25 -0
  47. package/dist/queue/list-core/use-more.d.ts +23 -0
  48. package/dist/queue/list-core/use-more.d.ts.map +1 -0
  49. package/dist/queue/list-core/use-more.js +41 -0
  50. package/dist/queue/omnitable.d.ts +19 -0
  51. package/dist/queue/omnitable.d.ts.map +1 -0
  52. package/dist/queue/omnitable.js +31 -0
  53. package/dist/queue/pagination.d.ts +5 -0
  54. package/dist/queue/pagination.d.ts.map +1 -0
  55. package/dist/queue/pagination.js +10 -0
  56. package/dist/queue/queue.d.ts +24 -0
  57. package/dist/queue/queue.d.ts.map +1 -0
  58. package/dist/queue/queue.js +58 -0
  59. package/dist/queue/render.d.ts +74 -0
  60. package/dist/queue/render.d.ts.map +1 -0
  61. package/dist/queue/render.js +134 -0
  62. package/dist/queue/style.d.ts +7 -0
  63. package/dist/queue/style.d.ts.map +1 -0
  64. package/dist/queue/style.js +182 -0
  65. package/dist/queue/test/__snapshots__/render.test.snap.d.ts +2 -0
  66. package/dist/queue/test/__snapshots__/render.test.snap.d.ts.map +1 -0
  67. package/dist/queue/test/__snapshots__/render.test.snap.js +64 -0
  68. package/dist/queue/test/item-click.test.d.ts +2 -0
  69. package/dist/queue/test/item-click.test.d.ts.map +1 -0
  70. package/dist/queue/test/item-click.test.js +28 -0
  71. package/dist/queue/test/render.test.d.ts +2 -0
  72. package/dist/queue/test/render.test.d.ts.map +1 -0
  73. package/dist/queue/test/render.test.js +27 -0
  74. package/dist/queue/test/use-pref.test.d.ts +2 -0
  75. package/dist/queue/test/use-pref.test.d.ts.map +1 -0
  76. package/dist/queue/test/use-pref.test.js +16 -0
  77. package/dist/queue/types.d.ts +10 -0
  78. package/dist/queue/types.d.ts.map +1 -0
  79. package/dist/queue/types.js +1 -0
  80. package/dist/queue/use-async-action.d.ts +15 -0
  81. package/dist/queue/use-async-action.d.ts.map +1 -0
  82. package/dist/queue/use-async-action.js +17 -0
  83. package/dist/queue/use-data-nav.d.ts +20 -0
  84. package/dist/queue/use-data-nav.d.ts.map +1 -0
  85. package/dist/queue/use-data-nav.js +59 -0
  86. package/dist/queue/use-data-service.d.ts +31 -0
  87. package/dist/queue/use-data-service.d.ts.map +1 -0
  88. package/dist/queue/use-data-service.js +26 -0
  89. package/dist/queue/use-fetch-actions.d.ts +42 -0
  90. package/dist/queue/use-fetch-actions.d.ts.map +1 -0
  91. package/dist/queue/use-fetch-actions.js +38 -0
  92. package/dist/queue/use-key-nav.d.ts +8 -0
  93. package/dist/queue/use-key-nav.d.ts.map +1 -0
  94. package/dist/queue/use-key-nav.js +49 -0
  95. package/dist/queue/use-list-sse.d.ts +42 -0
  96. package/dist/queue/use-list-sse.d.ts.map +1 -0
  97. package/dist/queue/use-list-sse.js +82 -0
  98. package/dist/queue/use-list.d.ts +33 -0
  99. package/dist/queue/use-list.d.ts.map +1 -0
  100. package/dist/queue/use-list.js +42 -0
  101. package/dist/queue/use-pref.d.ts +5 -0
  102. package/dist/queue/use-pref.d.ts.map +1 -0
  103. package/dist/queue/use-pref.js +11 -0
  104. package/dist/queue/use-queue.d.ts +132 -0
  105. package/dist/queue/use-queue.d.ts.map +1 -0
  106. package/dist/queue/use-queue.js +69 -0
  107. package/dist/queue/use-split.d.ts +8 -0
  108. package/dist/queue/use-split.d.ts.map +1 -0
  109. package/dist/queue/use-split.js +30 -0
  110. package/dist/queue/use-tabs.d.ts +54 -0
  111. package/dist/queue/use-tabs.d.ts.map +1 -0
  112. package/dist/queue/use-tabs.js +31 -0
  113. package/dist/queue/use-updates.d.ts +9 -0
  114. package/dist/queue/use-updates.d.ts.map +1 -0
  115. package/dist/queue/use-updates.js +17 -0
  116. package/dist/queue/util.d.ts +4 -0
  117. package/dist/queue/util.d.ts.map +1 -0
  118. package/dist/queue/util.js +16 -0
  119. package/dist/types/dialogable.d.ts +39 -0
  120. package/dist/types/dialogable.d.ts.map +1 -0
  121. package/dist/types/dialogable.js +5 -0
  122. package/dist/types/performable.d.ts +5 -0
  123. package/dist/types/performable.d.ts.map +1 -0
  124. package/dist/types/performable.js +1 -0
  125. package/dist/util/dom/active-element.d.ts +3 -0
  126. package/dist/util/dom/active-element.d.ts.map +1 -0
  127. package/dist/util/dom/active-element.js +11 -0
  128. package/dist/util/fetch/fetch.d.ts +41 -0
  129. package/dist/util/fetch/fetch.d.ts.map +1 -0
  130. package/dist/util/fetch/fetch.js +74 -0
  131. package/dist/util/fetch/url.d.ts +30 -0
  132. package/dist/util/fetch/url.d.ts.map +1 -0
  133. package/dist/util/fetch/url.js +29 -0
  134. package/dist/util/path.d.ts +42 -0
  135. package/dist/util/path.d.ts.map +1 -0
  136. package/dist/util/path.js +68 -0
  137. package/dist/util/polymer-property-changed-event.d.ts +6 -0
  138. package/dist/util/polymer-property-changed-event.d.ts.map +1 -0
  139. package/dist/util/polymer-property-changed-event.js +27 -0
  140. package/dist/util/test/path.test.d.ts +2 -0
  141. package/dist/util/test/path.test.d.ts.map +1 -0
  142. package/dist/util/test/path.test.js +99 -0
  143. package/package.json +113 -0
@@ -0,0 +1,41 @@
1
+ import { useEffect, useMemo, useState } from '@pionjs/pion';
2
+ export const useMore = ({ params: _params, list$, pageSize = 50, setTotalAvailable, }) => {
3
+ const [{ page, data$, totalAvailable, params }, setData] = useState({
4
+ page: 0,
5
+ data$: Promise.resolve([]),
6
+ totalAvailable: Infinity,
7
+ params: _params,
8
+ });
9
+ const hasMore = pageSize > 0 &&
10
+ totalAvailable < Infinity &&
11
+ totalAvailable >= pageSize &&
12
+ page < Math.ceil(totalAvailable / pageSize);
13
+ const loadMore = useMemo(() => hasMore ? () => setData((s) => ({ ...s, page: s.page + 1 })) : undefined, [hasMore]);
14
+ useEffect(() => setData((d) => ({
15
+ ...d,
16
+ params: _params,
17
+ page: 0,
18
+ data$: Promise.resolve([]),
19
+ })), [_params, list$]);
20
+ useEffect(() => {
21
+ setData(({ data$, params, page, ...thru }) => ({
22
+ ...thru,
23
+ params,
24
+ page,
25
+ data$: Promise.resolve(data$).then((prev) => list$({
26
+ params,
27
+ page,
28
+ pageSize,
29
+ }).then((data) => {
30
+ const totalAvailable = data.total;
31
+ setTotalAvailable(totalAvailable);
32
+ setData((s) => ({
33
+ ...s,
34
+ totalAvailable,
35
+ }));
36
+ return [...prev, ...data.items];
37
+ })),
38
+ }));
39
+ }, [page, params, list$, pageSize]);
40
+ return { data$, loadMore };
41
+ };
@@ -0,0 +1,19 @@
1
+ import '@neovici/cosmoz-omnitable';
2
+ import { Rec } from '@neovici/cosmoz-utils/object';
3
+ import { Ref } from '@pionjs/pion';
4
+ interface Props<I> {
5
+ exposedParts?: string;
6
+ settingsId?: string;
7
+ data$?: Promise<I[]>;
8
+ onData?: (v: I[]) => void;
9
+ selected?: I[];
10
+ onSelected?: (v: I[]) => void;
11
+ descending?: boolean;
12
+ onDescending?: (v: boolean) => void;
13
+ sortOn?: string;
14
+ onSort?: (v: string) => void;
15
+ ref?: Ref<HTMLElement | undefined>;
16
+ }
17
+ declare const omnitable: <I extends Rec>({ exposedParts, settingsId, data$, onData, selected, onSelected, descending, onDescending, sortOn, onSort, ref: omnitableRef, }: Props<I>, content?: unknown) => import("lit-html").TemplateResult<1>;
18
+ export default omnitable;
19
+ //# sourceMappingURL=omnitable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omnitable.d.ts","sourceRoot":"","sources":["../../src/queue/omnitable.ts"],"names":[],"mappings":"AAIA,OAAO,2BAA2B,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAC;AAEnD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGnC,UAAU,KAAK,CAAC,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAErB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;IACf,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAE9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAEpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAE7B,GAAG,CAAC,EAAE,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;CACnC;AA0BD,QAAA,MAAM,SAAS,GAAI,CAAC,SAAS,GAAG,EAC/B,iIAYG,KAAK,CAAC,CAAC,CAAC,EACX,UAAU,OAAO,yCAoBjB,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { html } from 'lit-html';
2
+ import { guard } from 'lit-html/directives/guard.js';
3
+ import { until } from 'lit-html/directives/until.js';
4
+ import { when } from 'lit-html/directives/when.js';
5
+ import '@neovici/cosmoz-omnitable';
6
+ import { updateWith } from '../util/polymer-property-changed-event.js';
7
+ import { ref } from 'lit-html/directives/ref.js';
8
+ const loading$$ = (data$, loading) => guard([data$, loading], () => when(data$, (data$) => until(data$?.then(() => false, () => false), true), () => loading));
9
+ const data$$ = (data$, data) => guard([data$, data], () => when(data$, () => until(data$, []), () => data));
10
+ const omnitable = ({ exposedParts, settingsId, data$, onData, selected, onSelected, descending, onDescending, sortOn, onSort, ref: omnitableRef, }, content) => html `
11
+ <cosmoz-omnitable
12
+ ${ref((el) => {
13
+ if (omnitableRef)
14
+ omnitableRef.current = el;
15
+ })}
16
+ class="ot"
17
+ .settingsId=${settingsId}
18
+ .data=${data$$(data$)}
19
+ ?loading=${loading$$(data$)}
20
+ exportparts=${exposedParts}
21
+ .sortOn=${sortOn}
22
+ @sort-on-changed=${updateWith(onSort)}
23
+ .descending=${descending}
24
+ @descending-changed=${updateWith(onDescending)}
25
+ .selectedItems=${selected}
26
+ @selected-items-changed=${updateWith(onSelected)}
27
+ @visible-data-changed=${updateWith(onData)}
28
+ >${content}</cosmoz-omnitable
29
+ >
30
+ `;
31
+ export default omnitable;
@@ -0,0 +1,5 @@
1
+ export declare const usePagination: () => {
2
+ page: number;
3
+ onPage: (page?: number) => void;
4
+ };
5
+ //# sourceMappingURL=pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/queue/pagination.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa;;oBAQhB,MAAM;CAIf,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { useCallback, useMemo } from '@pionjs/pion';
2
+ import { useHashParam } from '@neovici/cosmoz-router/use-hash-param';
3
+ import { parse as parseNumber } from '@neovici/cosmoz-utils/number';
4
+ export const usePagination = () => {
5
+ const [_page, setPageNumber] = useHashParam('page');
6
+ return {
7
+ page: useMemo(() => Math.max(1, parseNumber(_page) || 1), [_page]),
8
+ onPage: useCallback((page = 0) => setPageNumber(page < 2 ? undefined : page), []),
9
+ };
10
+ };
@@ -0,0 +1,24 @@
1
+ import type { TemplateResult } from 'lit-html';
2
+ import { RenderQueue } from './render';
3
+ import { Pagination } from './types';
4
+ import useQueue, { UseQueue } from './use-queue';
5
+ type QueueProps<I> = ReturnType<typeof useQueue<I>>;
6
+ type ViewProps<I> = Omit<QueueProps<I>, 'nav'> & {
7
+ nav: TemplateResult;
8
+ item: I;
9
+ };
10
+ interface Props<I, D> extends Pick<UseQueue<I>, 'id' | 'api' | 'fallback' | 'split'>, Pick<RenderQueue<I, D>, 'details' | 'afterHeading'> {
11
+ list: (thru: Record<string, any>, props: QueueProps<I> & {
12
+ onRef: (el?: Element) => void;
13
+ }) => TemplateResult;
14
+ view: (thru: Record<string, any>, props: ViewProps<I>) => TemplateResult;
15
+ loader: (thru: Record<string, any>, props: ViewProps<I>) => TemplateResult;
16
+ heading: string;
17
+ settingsId?: string;
18
+ idHashParam?: string;
19
+ tabHashParam?: string;
20
+ pagination?: Pagination;
21
+ }
22
+ export declare const queue: <I, D = I>(props: Props<I, D>) => TemplateResult<1>;
23
+ export {};
24
+ //# sourceMappingURL=queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/queue/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,OAAO,EAAe,WAAW,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEjD,KAAK,UAAU,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,KAAK,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG;IAChD,GAAG,EAAE,cAAc,CAAC;IACpB,IAAI,EAAE,CAAC,CAAC;CACR,CAAC;AAEF,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC,CACnB,SAAQ,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,UAAU,GAAG,OAAO,CAAC,EAC7D,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,GAAG,cAAc,CAAC;IACpD,IAAI,EAAE,CACL,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG;QAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,KACpD,cAAc,CAAC;IACpB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC;IACzE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC;IAC3E,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,UAAU,CAAC;CACxB;AAMD,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,sBAgGjD,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { updateWith } from '../util/polymer-property-changed-event.js';
2
+ import { renderQueue } from './render';
3
+ import useAsyncAction from './use-async-action';
4
+ import useQueue from './use-queue';
5
+ export const queue = (props) => {
6
+ const { heading, afterHeading, settingsId, idHashParam = 'qid', tabHashParam = 'qtab', id, api, details, list, view, loader, pagination, fallback, split, } = props;
7
+ const queueProps = useQueue({
8
+ id,
9
+ api,
10
+ idHashParam,
11
+ tabHashParam,
12
+ fallback,
13
+ split,
14
+ });
15
+ const { index, mobile, hideActions, items, setItems, setSelected, totalAvailable, setTotalAvailable, onItemClick, nav, tabnav, } = queueProps;
16
+ const { listRef, onAsyncSimpleAction } = useAsyncAction(nav);
17
+ const renderProps = {
18
+ ...queueProps,
19
+ onAsyncSimpleAction,
20
+ };
21
+ return renderQueue({
22
+ details,
23
+ heading,
24
+ afterHeading,
25
+ mobile,
26
+ index,
27
+ items,
28
+ tabnav,
29
+ totalAvailable,
30
+ nav,
31
+ pagination,
32
+ list: list({
33
+ id: 'list',
34
+ '.exposedParts': `itemRow, itemRow-${index}`,
35
+ '.settingsId': settingsId,
36
+ '@visible-items-changed': updateWith(setItems),
37
+ '@selected-items-changed': updateWith(setSelected),
38
+ '@total-available-changed': updateWith(setTotalAvailable),
39
+ '@async-simple-action': onAsyncSimpleAction,
40
+ '@omnitable-item-click': onItemClick,
41
+ }, {
42
+ ...renderProps,
43
+ onRef: (el) => (listRef.current = el),
44
+ }),
45
+ renderItem: ({ item, nav }) => view({
46
+ class: 'view-core',
47
+ exportparts: 'header, header-bg',
48
+ '.hideActions': hideActions,
49
+ '.item': item,
50
+ '@async-simple-action': onAsyncSimpleAction,
51
+ '@rendered': (event) => event.target.syncImageState(),
52
+ }, { ...renderProps, nav, item: item }),
53
+ renderLoader: ({ item, nav }) => loader({
54
+ class: 'view-core',
55
+ '.item': item,
56
+ }, { ...renderProps, nav, item }),
57
+ });
58
+ };
@@ -0,0 +1,74 @@
1
+ import { nothing, TemplateResult } from 'lit-html';
2
+ import { RenderTabs } from '@neovici/cosmoz-tabs/next/index.js';
3
+ import type { Tab } from './use-tabs';
4
+ import type { Pagination } from './types';
5
+ export declare const renderNav: ({ next, prev, }: {
6
+ next?: () => void;
7
+ prev?: () => void;
8
+ }) => TemplateResult<1>;
9
+ export declare const renderPagination: (pagination?: Pagination) => TemplateResult<1> | typeof nothing;
10
+ export declare const renderStats: <I>({ pagination, index, items, totalAvailable, nav, }: {
11
+ pagination?: Pagination;
12
+ totalAvailable?: number;
13
+ index?: number;
14
+ items: I[];
15
+ nav: {
16
+ items?: I[];
17
+ index: number;
18
+ };
19
+ }) => TemplateResult<1> | typeof nothing;
20
+ interface RenderView<I, D> {
21
+ animationEnd$: Promise<unknown>;
22
+ details?: (i: I) => PromiseLike<D>;
23
+ item: I;
24
+ next?: () => void;
25
+ prev?: () => void;
26
+ renderItem: (opts: {
27
+ item: I | D;
28
+ nav: TemplateResult;
29
+ next?: () => void;
30
+ prev?: () => void;
31
+ animationEnd$?: Promise<unknown>;
32
+ }) => TemplateResult;
33
+ renderLoader: (opts: {
34
+ item: I;
35
+ nav: TemplateResult;
36
+ }) => TemplateResult;
37
+ }
38
+ export declare const renderView: <I, D>({ animationEnd$, details, item, next, prev, renderItem, renderLoader, }: RenderView<I, D>) => import("lit-html/directive.js").DirectiveResult<{
39
+ new (_partInfo: import("lit-html/directive.js").PartInfo): import("lit-html/directives/guard.js").GuardDirective<import("lit-html/directive.js").DirectiveResult<typeof import("@neovici/cosmoz-utils/directives/lazy-until").UntilDirective>>;
40
+ }>;
41
+ interface RenderSlide<I, D> extends Omit<RenderView<I, D>, 'animationEnd$'> {
42
+ id: (i: I) => unknown;
43
+ forward?: boolean;
44
+ }
45
+ export declare const renderSlide: <I, D>({ id, forward, item, ...thru }: RenderSlide<I, D>) => {
46
+ id: string;
47
+ content: symbol;
48
+ animation: (inEl: HTMLElement, outEl: HTMLElement) => Promise<[Animation, Animation]>;
49
+ } | {
50
+ id: unknown;
51
+ render: (rnd: {
52
+ animationEnd$: Promise<unknown>;
53
+ }) => import("lit-html/directive.js").DirectiveResult<{
54
+ new (_partInfo: import("lit-html/directive.js").PartInfo): import("lit-html/directives/guard.js").GuardDirective<import("lit-html/directive.js").DirectiveResult<typeof import("@neovici/cosmoz-utils/directives/lazy-until").UntilDirective>>;
55
+ }>;
56
+ animation: (inEl: HTMLElement, outEl: HTMLElement) => Promise<[Animation, Animation]>;
57
+ };
58
+ export interface RenderQueue<I, D> extends Pick<RenderView<I, D>, 'renderItem' | 'renderLoader' | 'details'> {
59
+ heading?: string;
60
+ afterHeading?: unknown;
61
+ index?: number;
62
+ mobile?: boolean;
63
+ items: I[];
64
+ totalAvailable?: number;
65
+ list: TemplateResult;
66
+ pagination?: Pagination;
67
+ tabnav: RenderTabs<Tab>;
68
+ nav: Omit<RenderSlide<I, D>, 'renderItem' | 'renderLoader' | 'details'> & Pick<RenderView<I, D>, 'details'> & {
69
+ index: number;
70
+ };
71
+ }
72
+ export declare const renderQueue: <I, D>({ heading, afterHeading, index, mobile, tabnav, items, totalAvailable, nav, list, renderLoader, renderItem, details, pagination: _pagination, }: RenderQueue<I, D>) => TemplateResult<1>;
73
+ export {};
74
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/queue/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ import { html, nothing } from 'lit-html';
2
+ import { guard } from 'lit-html/directives/guard.js';
3
+ import { lazyUntil } from '@neovici/cosmoz-utils/directives/lazy-until';
4
+ import { t } from 'i18next';
5
+ import { renderTabs } from '@neovici/cosmoz-tabs/next/index.js';
6
+ import { slideInRight, slideInLeft } from '@neovici/cosmoz-slider';
7
+ import renderStyles from './style';
8
+ import { arrow } from './icon';
9
+ const _emptySlide = {
10
+ id: 'empty',
11
+ content: nothing,
12
+ animation: slideInRight,
13
+ };
14
+ const emptySlide = () => _emptySlide;
15
+ export const renderNav = ({ next, prev, }) => html ` <button
16
+ class="button-nav prev"
17
+ title="${t('Previous item')}"
18
+ ?disabled=${!prev}
19
+ slot="extra"
20
+ @click=${prev}
21
+ >
22
+ ${arrow}
23
+ </button>
24
+ <button
25
+ title="${t('Next item')}"
26
+ class="button-nav next"
27
+ ?disabled=${!next}
28
+ slot="extra"
29
+ @click=${next}
30
+ >
31
+ ${arrow}
32
+ </button>`;
33
+ export const renderPagination = (pagination) => {
34
+ if (!pagination)
35
+ return nothing;
36
+ const { pageNumber = -1, onPage } = pagination;
37
+ const totalPages = pagination.totalPages ??
38
+ Math.ceil((pagination.totalAvailable ?? 0) / (pagination.pageSize ?? 0));
39
+ return html ` <div class="tabn-pagination">
40
+ <button
41
+ title="${t('Previous page')}"
42
+ class="button-page page-prev"
43
+ ?disabled=${!(pageNumber > 1)}
44
+ @click=${(e) => onPage(e.ctrlKey ? 1 : pageNumber - 1)}
45
+ >
46
+ ${arrow}
47
+ </button>
48
+ <button
49
+ title="${t('Next page')}"
50
+ class="button-page page-next"
51
+ ?disabled=${!(pageNumber < totalPages)}
52
+ @click=${(e) => onPage(e.ctrlKey ? totalPages : pageNumber + 1)}
53
+ >
54
+ ${arrow}
55
+ </button>
56
+ </div>`;
57
+ };
58
+ export const renderStats = ({ pagination, index, items, totalAvailable, nav, }) => {
59
+ if (items.length < 1) {
60
+ return nothing;
61
+ }
62
+ return html `<div class="tabn-stats">
63
+ ${(() => {
64
+ if (pagination) {
65
+ const { pageNumber, pageSize } = pagination;
66
+ const size = pageSize ?? items.length;
67
+ const start = ((pageNumber ?? 1) - 1) * size + index + 1;
68
+ const end = items.length < size
69
+ ? pagination.totalAvailable
70
+ : (pageNumber ?? 1) * size;
71
+ return [start, end].join('-');
72
+ }
73
+ const qidx = nav.index;
74
+ const qlen = nav.items?.length;
75
+ return [
76
+ qlen !== items.length
77
+ ? [qidx < 0 ? '?' : qidx + 1, qlen].join('/')
78
+ : [index + 1, items.length].join('-'),
79
+ ];
80
+ })()}
81
+ ${[t('of'), totalAvailable ?? t('many')].join(' ')}
82
+ </div>`;
83
+ };
84
+ export const renderView = ({ animationEnd$, details, item, next, prev, renderItem, renderLoader, }) => {
85
+ const nav = renderNav({ next, prev });
86
+ if (!details) {
87
+ return renderItem({ item, nav, next, prev, animationEnd$ });
88
+ }
89
+ const detail$ = details(item);
90
+ return guard([detail$, animationEnd$, next], () => lazyUntil(Promise.all([detail$, animationEnd$]).then(([item]) => renderItem({ item, nav, next, prev })), renderLoader({ item, nav })));
91
+ };
92
+ export const renderSlide = ({ id, forward, item, ...thru }) => item
93
+ ? {
94
+ id: id(item),
95
+ render: (rnd) => renderView({
96
+ ...rnd,
97
+ item,
98
+ ...thru,
99
+ }),
100
+ animation: forward ? slideInRight : slideInLeft,
101
+ }
102
+ : emptySlide();
103
+ export const renderQueue = ({ heading, afterHeading, index, mobile, tabnav, items, totalAvailable, nav, list, renderLoader, renderItem, details = nav?.details, pagination: _pagination, }) => {
104
+ const activeTab = tabnav.active?.name;
105
+ const pagination = _pagination
106
+ ? { ..._pagination, totalAvailable }
107
+ : undefined;
108
+ return html `
109
+ <style>
110
+ ${renderStyles({ index, mobile })}
111
+ </style>
112
+
113
+ <cosmoz-tabs-next class="tabn">
114
+ <div class="tabn-heading">${heading}${afterHeading}</div>
115
+ ${renderTabs({ ...tabnav, className: 'tabn-tab' })}
116
+ ${renderStats({
117
+ pagination,
118
+ totalAvailable,
119
+ index,
120
+ items,
121
+ nav,
122
+ })}
123
+ ${renderPagination(pagination)}
124
+ </cosmoz-tabs-next>
125
+
126
+ <div class="split" data-active=${activeTab}>
127
+ ${list}
128
+ <cosmoz-slider
129
+ id="queue"
130
+ .slide=${renderSlide({ ...nav, renderLoader, renderItem, details })}
131
+ ></cosmoz-slider>
132
+ </div>
133
+ `;
134
+ };
@@ -0,0 +1,7 @@
1
+ export declare const base: string;
2
+ declare const _default: ({ index, mobile, }: {
3
+ index?: number | string;
4
+ mobile?: boolean;
5
+ }) => string;
6
+ export default _default;
7
+ //# sourceMappingURL=style.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/queue/style.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,IAAI,QA2JhB,CAAC;yBAEc,oBAGb;IACF,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAND,wBA8BE"}
@@ -0,0 +1,182 @@
1
+ import { css } from '@pionjs/pion';
2
+ export const base = css `
3
+ :host {
4
+ display: flex;
5
+ flex-direction: column;
6
+ height: 100%;
7
+ position: relative;
8
+ font-size: 14px;
9
+ }
10
+
11
+ .tabn {
12
+ --cosmoz-tabs-bg-color: var(--cz-bg-color);
13
+ box-shadow: none;
14
+ position: relative;
15
+ color: #959ba5;
16
+ }
17
+ .tabn-tab {
18
+ flex: 0 1 0.000001px;
19
+ flex: 0 1 min-content;
20
+ padding: 11px 16px;
21
+ background: inherit;
22
+ }
23
+ .tabn-tab:first-of-type {
24
+ margin-left: auto;
25
+ }
26
+ .tabn-tab[active] {
27
+ color: var(--cz-tabn-tab-active-color);
28
+ box-shadow: none;
29
+ }
30
+ .tabn-heading {
31
+ font-size: 17px;
32
+ font-weight: 600;
33
+ line-height: 25px;
34
+ color: var(--cz-tabn-heading-color, var(--cz-text-secondary-color));
35
+ margin-left: 18px;
36
+ white-space: nowrap;
37
+ }
38
+ .tabn-stats {
39
+ margin: 0 16px;
40
+ color: var(--cz-text-color);
41
+ white-space: nowrap;
42
+ }
43
+
44
+ .split {
45
+ display: flex;
46
+ flex: auto;
47
+ flex-direction: row;
48
+ min-height: 0;
49
+ }
50
+
51
+ .gutter {
52
+ cursor: col-resize;
53
+ flex: none;
54
+ display: flex;
55
+ background: var(--cz-queue-gutter-bg, var(--cz-header-bg-color, #fff));
56
+ z-index: 2;
57
+ position: relative;
58
+ }
59
+ .gutter::before {
60
+ content: '';
61
+ display: block;
62
+ flex: none;
63
+ background: var(--cz-queue-gutter-bg, var(--cz-header-bg-color, #bbb));
64
+ width: 1px;
65
+ margin-left: auto;
66
+ pointer-events: none;
67
+ }
68
+ .gutter:hover::before {
69
+ background: var(--cz-accent-color);
70
+ box-shadow: -1px 0 0 1px var(--cz-accent-color);
71
+ }
72
+ .gutter:hover::after {
73
+ content: '';
74
+ display: block;
75
+ position: absolute;
76
+ top: 0;
77
+ left: -2px;
78
+ right: -2px;
79
+ bottom: 0;
80
+ }
81
+
82
+ #list {
83
+ min-width: 0;
84
+ }
85
+ #list,
86
+ #queue {
87
+ flex: auto;
88
+ }
89
+
90
+ [data-active='split'] .view-core::part(header-bg) {
91
+ border-top-left-radius: 0;
92
+ }
93
+
94
+ [data-active='overview'] .view-core,
95
+ [data-active='queue'] #list {
96
+ display: none;
97
+ }
98
+ [data-active='overview'] #queue {
99
+ flex: none;
100
+ }
101
+
102
+ .button-nav {
103
+ width: 40px;
104
+ height: 40px;
105
+ cursor: pointer;
106
+ outline: none;
107
+ }
108
+
109
+ .button-nav:active {
110
+ background: rgba(52, 52, 52, 0.4);
111
+ }
112
+ .button-nav.prev,
113
+ .button-page.prev,
114
+ .page-prev {
115
+ transform: scaleX(-1);
116
+ }
117
+
118
+ .tabn-pagination {
119
+ font-size: 0;
120
+ display: flex;
121
+ border: var(--cz-pagination-border-color);
122
+ border-radius: var(--cz-pagination-border-radius);
123
+ }
124
+ .button-page {
125
+ width: 30px;
126
+ height: 30px;
127
+ padding: 0 5px;
128
+ cursor: pointer;
129
+ outline: none;
130
+ border: none;
131
+ border-radius: var(--cz-pagination-border);
132
+ fill: var(--cz-pagination-color);
133
+ position: relative;
134
+ background-color: transparent;
135
+ }
136
+ .button-page[disabled] {
137
+ opacity: 0.45;
138
+ pointer-events: none;
139
+ fill: var(--cz-pagination-inactive-color);
140
+ }
141
+
142
+ .button-page:active,
143
+ .button-page:hover {
144
+ fill: var(--cz-pagination-active-color);
145
+ }
146
+
147
+ .tabn-pagination .button-page + .button-page::before {
148
+ content: '';
149
+ position: absolute;
150
+ width: 1px;
151
+ height: 18.5px;
152
+ background-color: var(--cz-pagination-border-divider-color);
153
+ left: -0.5px;
154
+ top: 50%;
155
+ transform: translateY(-50%);
156
+ }
157
+ `;
158
+ export default ({ index, mobile, }) => css `
159
+ ${base}
160
+
161
+ #list::part(itemRow-${index || '0'}) {
162
+ background: var(
163
+ --cosmoz-omnitable-highlight-color,
164
+ rgba(80, 138, 239, 0.4)
165
+ );
166
+ }
167
+
168
+ ${(mobile &&
169
+ css `
170
+ .tabn-heading {
171
+ font-size: 14px;
172
+ margin-left: 12px;
173
+ }
174
+ .tabn-tab {
175
+ padding: 10px;
176
+ }
177
+ [name="split"] {
178
+ display: none;
179
+ }
180
+ }`) ||
181
+ ''}
182
+ `;
@@ -0,0 +1,2 @@
1
+ export const snapshots: typeof snapshots;
2
+ //# sourceMappingURL=render.test.snap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.test.snap.d.ts","sourceRoot":"","sources":["../../../../src/queue/test/__snapshots__/render.test.snap.js"],"names":[],"mappings":"AACA,yCAA4B"}