@gravity-ui/querieskit 1.4.0 → 1.5.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 (41) hide show
  1. package/build/cjs/components/LazyList/LazyList.css +4 -0
  2. package/build/cjs/components/LazyList/LazyList.css.map +1 -1
  3. package/build/cjs/components/LazyList/LazyList.js +32 -10
  4. package/build/cjs/components/LazyList/LazyList.js.map +1 -1
  5. package/build/cjs/components/QueryDuration/QueryDuration.stories.js +7 -0
  6. package/build/cjs/components/QueryDuration/QueryDuration.stories.js.map +1 -1
  7. package/build/cjs/components/QueryDuration/useQueryDuration.d.ts +1 -1
  8. package/build/cjs/components/QueryDuration/useQueryDuration.js +22 -16
  9. package/build/cjs/components/QueryDuration/useQueryDuration.js.map +1 -1
  10. package/build/cjs/helpers/time.d.ts +1 -1
  11. package/build/cjs/helpers/time.js +17 -12
  12. package/build/cjs/helpers/time.js.map +1 -1
  13. package/build/cjs/modules/HistoryRow/HistoryRow.css +2 -1
  14. package/build/cjs/modules/HistoryRow/HistoryRow.css.map +1 -1
  15. package/build/cjs/modules/HistoryRow/HistoryRow.js +2 -2
  16. package/build/cjs/modules/HistoryRow/HistoryRow.js.map +1 -1
  17. package/build/cjs/widgets/QueriesHistory/QueriesHistory.stories.d.ts +2 -0
  18. package/build/cjs/widgets/QueriesHistory/QueriesHistory.stories.js +82 -3
  19. package/build/cjs/widgets/QueriesHistory/QueriesHistory.stories.js.map +1 -1
  20. package/build/esm/components/LazyList/LazyList.css +4 -0
  21. package/build/esm/components/LazyList/LazyList.css.map +1 -1
  22. package/build/esm/components/LazyList/LazyList.js +33 -11
  23. package/build/esm/components/LazyList/LazyList.js.map +1 -1
  24. package/build/esm/components/LazyList/LazyList.scss +5 -0
  25. package/build/esm/components/QueryDuration/QueryDuration.stories.js +7 -0
  26. package/build/esm/components/QueryDuration/QueryDuration.stories.js.map +1 -1
  27. package/build/esm/components/QueryDuration/useQueryDuration.d.ts +1 -1
  28. package/build/esm/components/QueryDuration/useQueryDuration.js +22 -16
  29. package/build/esm/components/QueryDuration/useQueryDuration.js.map +1 -1
  30. package/build/esm/helpers/time.d.ts +1 -1
  31. package/build/esm/helpers/time.js +18 -13
  32. package/build/esm/helpers/time.js.map +1 -1
  33. package/build/esm/modules/HistoryRow/HistoryRow.css +2 -1
  34. package/build/esm/modules/HistoryRow/HistoryRow.css.map +1 -1
  35. package/build/esm/modules/HistoryRow/HistoryRow.js +2 -2
  36. package/build/esm/modules/HistoryRow/HistoryRow.js.map +1 -1
  37. package/build/esm/modules/HistoryRow/HistoryRow.scss +2 -1
  38. package/build/esm/widgets/QueriesHistory/QueriesHistory.stories.d.ts +2 -0
  39. package/build/esm/widgets/QueriesHistory/QueriesHistory.stories.js +81 -2
  40. package/build/esm/widgets/QueriesHistory/QueriesHistory.stories.js.map +1 -1
  41. package/package.json +7 -3
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_uikit","_components","_QueriesHistory","_actions","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_interopRequireDefault","now","Date","min","QUERY","BASE_ITEMS","header","height","id","title","status","engine","mode","startTime","endTime","query","LINK_ITEMS","map","item","_objectSpread","href","concat","PAGINATION_PAGES","slice","activeFields","fields","filterFields","type","initialValue","items","logFilterApply","action","logFilterReset","renderRouterLink","_ref","_onClick","onClick","props","_objectWithoutProperties","_excluded","_jsx","event","defaultPrevented","button","metaKey","ctrlKey","shiftKey","altKey","preventDefault","meta","component","QueriesHistory","tags","parameters","layout","operationFilterOptions","value","content","_default","exports","DefaultStory","_useState","useState","_toConsumableArray","_useState2","_slicedToArray","setItems","_useState3","fullSearch","_useState4","search","setSearch","_useState5","_useState6","visibleFields","setVisibleFields","_useState7","_useState8","compareMode","setCompareMode","_useState9","_useState0","comparedRows","setComparedRows","_useState1","undefined","_useState10","editingId","setEditingId","handleCompareChange","selected","result","filter","length","handleCompareCancel","handleEditSubmit","index","findIndex","handleEditCancel","handleCompare","handleOnSearch","data","newItems","_item$query","toLowerCase","searchValue","includes","style","width","children","onChange","hasClear","onUpdate","onApply","onReset","getRowActions","text","comparison","enabled","comparedRowIds","onCancel","onCompare","editing","rowId","onSubmit","renderLink","EmptyStory","_useState11","_useState12","WithHeaderStory","_useState13","_useState14","_useState15","_useState16","logo","SegmentedRadioGroup","options","PaginatedStory","_useState17","_useState18","_useState19","_useState20","page","setPage","_useState21","_useState22","loading","setLoading","handleLoadMore","nextPage","window","setTimeout","currentItems","currentPage","selectedRowId","hasMore","onLoadMore","FullSearchUnavailableStory","_useState23","_useState24","fullSearchAvailable","RouterLinksStory","_useState25","_useState26","CustomRowRendererStory","renderRowItem","_ref2","HistoryGroupHeader","RowLink","Text","Default","render","Empty","InitialLoading","args","decorators","StoryComponent","Paginated","FullSearchUnavailable","RouterLinks","CustomRowRenderer","WithHeader"],"sources":["QueriesHistory.stories.tsx"],"sourcesContent":["import React, {useState} from 'react';\nimport type {Meta, StoryObj} from '@storybook/react';\nimport {SegmentedRadioGroup, Text} from '@gravity-ui/uikit';\nimport {HistoryGroupHeader, RowLink} from '../../components';\nimport {QueriesHistory} from './QueriesHistory';\nimport {\n QueryListFieldKey,\n QueryListFilterConfig,\n QueryListItem,\n QueryListLinkRenderer,\n QueryListVisibleFieldsConfig,\n} from '../../types/queryList';\nimport {QueryHistoryRow} from '../../types/history';\nimport {action} from 'storybook/actions';\n\nconst now = Date.now();\nconst min = 60 * 1000;\n\nconst QUERY = `use test;\n\nSELECT\n \"test_session\" AS session_id,\n \"test_task\" AS task_id,\n SUBSTRING(\"test\", 1, 1) AS truncated_char`;\n\nconst BASE_ITEMS: QueryListItem<QueryHistoryRow>[] = [\n {header: 'Today', height: 28},\n {\n id: 1,\n title: 'Query 1',\n status: 'completed',\n engine: 'YQL',\n mode: 'Validation',\n startTime: now - 2 * min,\n endTime: now - min,\n query: QUERY,\n height: 52,\n },\n {\n id: 2,\n title: 'Query 2',\n status: 'failed',\n engine: 'YQL',\n mode: 'Test',\n startTime: now - 10 * min,\n endTime: now - 9 * min,\n query: QUERY,\n height: 52,\n },\n {\n id: 3,\n title: 'Query 3',\n status: 'running',\n engine: 'YQL',\n mode: 'Test',\n startTime: now - min,\n query: QUERY,\n height: 52,\n },\n {header: 'Yesterday', height: 28},\n {\n id: 4,\n title: 'Query 4',\n status: 'aborted',\n engine: 'YQL',\n mode: 'Validation',\n startTime: now - 25 * 60 * min,\n endTime: now - 24 * 60 * min,\n query: 'SELECT 1',\n height: 52,\n },\n {\n id: 5,\n title: 'Query 5',\n status: 'draft',\n engine: 'YQL',\n mode: 'Test',\n startTime: now - 30 * 60 * min,\n query: QUERY,\n height: 52,\n },\n {\n id: 6,\n title: 'Query 6',\n status: 'draft',\n engine: 'YQL',\n mode: 'Test',\n startTime: now - 30 * 60 * min,\n query: QUERY,\n height: 52,\n },\n {\n id: 7,\n title: 'Query 7',\n status: 'draft',\n engine: 'YQL',\n mode: 'Test',\n startTime: now - 30 * 60 * min,\n query: QUERY,\n height: 52,\n },\n {\n id: 8,\n title: 'Query 8',\n status: 'draft',\n engine: 'YQL',\n mode: 'Test',\n startTime: now - 30 * 60 * min,\n query: QUERY,\n height: 52,\n },\n];\n\nconst LINK_ITEMS = BASE_ITEMS.map((item) =>\n 'id' in item ? {...item, href: `/queries/${item.id}`} : item,\n);\n\nconst PAGINATION_PAGES = [LINK_ITEMS.slice(0, 3), LINK_ITEMS.slice(3, 6), LINK_ITEMS.slice(6)];\n\ntype VisibleFields = QueryListVisibleFieldsConfig<QueryHistoryRow>['fields'];\nconst activeFields: QueryListFieldKey<QueryHistoryRow>[] = [\n 'duration',\n 'mode',\n 'startTime',\n 'engine',\n 'isPrivate',\n];\nconst fields: VisibleFields = [\n {\n id: 'duration',\n title: 'Duration',\n },\n {\n id: 'mode',\n title: 'Mode',\n },\n {\n id: 'startTime',\n title: 'Start time',\n },\n {\n id: 'engine',\n title: 'Engine',\n },\n {\n id: 'isPrivate',\n title: 'ACO',\n },\n];\n\nconst filterFields: QueryListFilterConfig['fields'] = [\n {id: 'onlyMine', type: 'switch', title: 'My queries only', initialValue: true},\n {id: 'range', type: 'rangeDatePicker', title: 'Period'},\n {\n id: 'dialect',\n type: 'checkboxGroup',\n title: 'Dialect',\n initialValue: [],\n items: [\n {id: 'yql', title: 'YQL'},\n {id: 'sql', title: 'SQL'},\n ],\n },\n];\n\nconst logFilterApply = action('onFilterApply');\nconst logFilterReset = action('onFilterReset');\n\nconst renderRouterLink: QueryListLinkRenderer = ({onClick, ...props}) => (\n <a\n {...props}\n data-router-link\n onClick={(event) => {\n onClick?.(event);\n\n if (\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey\n ) {\n return;\n }\n\n event.preventDefault();\n action('routerNavigate')(props.href);\n }}\n />\n);\n\nconst meta: Meta<typeof QueriesHistory> = {\n title: 'Widgets/QueriesHistory',\n component: QueriesHistory,\n tags: ['autodocs'],\n parameters: {\n layout: 'padded',\n },\n};\n\nconst operationFilterOptions = [\n {\n value: 'My',\n content: 'My',\n },\n {\n value: 'All',\n content: 'All',\n },\n];\n\nexport default meta;\ntype Story = StoryObj<typeof QueriesHistory>;\n\nconst DefaultStory = () => {\n const [items, setItems] = useState([...LINK_ITEMS]);\n const [search, setSearch] = useState({value: '', fullSearch: false});\n const [visibleFields, setVisibleFields] =\n useState<QueryListFieldKey<QueryHistoryRow>[]>(activeFields);\n const [compareMode, setCompareMode] = useState(false);\n const [comparedRows, setComparedRows] = useState<(number | string)[]>([]);\n const [editingId, setEditingId] = useState<number | string | undefined>(undefined);\n\n const handleCompareChange = (item: QueryHistoryRow, selected: boolean) => {\n const result = selected\n ? [...comparedRows.slice(0, 1), item.id]\n : comparedRows.filter((id) => id !== item.id);\n setComparedRows(result);\n\n if (!result.length) setCompareMode(false);\n };\n\n const handleCompareCancel = () => {\n setComparedRows([]);\n setCompareMode(false);\n };\n\n const handleEditSubmit = (item: QueryHistoryRow, title: string) => {\n const index = items.findIndex((i) => 'id' in i && i.id === item.id);\n if (index < 0) return;\n\n const result = [...items];\n result[index] = {...result[index], title};\n setItems(result);\n setEditingId(undefined);\n };\n\n const handleEditCancel = () => {\n setEditingId(undefined);\n };\n\n const handleCompare = () => {\n action('onCompare')(comparedRows);\n };\n\n const handleOnSearch = (data: {value: string; fullSearch: boolean}) => {\n setSearch(data);\n\n if (!data.value) {\n setItems(LINK_ITEMS);\n return;\n }\n\n const newItems = LINK_ITEMS.filter((item) => {\n if (!('id' in item)) return false;\n\n const title = item.title.toLowerCase();\n const query = item.query?.toLowerCase();\n const searchValue = data.value.toLowerCase();\n\n if (data.fullSearch) {\n return title.includes(searchValue) || query?.includes(searchValue);\n }\n\n return title.includes(searchValue);\n });\n setItems(newItems);\n };\n\n return (\n <div style={{width: 300, height: 500}}>\n <QueriesHistory\n title=\"History\"\n items={items}\n visibleFields={{value: visibleFields, fields, onChange: setVisibleFields}}\n search={{\n value: search.value,\n fullSearch: search.fullSearch,\n hasClear: true,\n onUpdate: handleOnSearch,\n }}\n filter={{\n fields: filterFields,\n onApply: logFilterApply,\n onReset: logFilterReset('reset'),\n }}\n getRowActions={() => [\n {\n text: 'Compare',\n onClick: (item) => {\n setCompareMode(true);\n setComparedRows([item.id]);\n },\n },\n {\n text: 'Edit',\n onClick: (item) => {\n setEditingId(item.id);\n },\n },\n ]}\n comparison={{\n enabled: compareMode,\n comparedRowIds: comparedRows,\n onChange: handleCompareChange,\n onCancel: handleCompareCancel,\n onCompare: handleCompare,\n }}\n editing={{\n rowId: editingId,\n onSubmit: handleEditSubmit,\n onCancel: handleEditCancel,\n }}\n renderLink={renderRouterLink}\n />\n </div>\n );\n};\n\nconst EmptyStory = () => {\n const [search, setSearch] = useState({value: '', fullSearch: false});\n\n return (\n <div style={{width: 300, height: 500}}>\n <QueriesHistory\n title=\"History\"\n items={[]}\n search={{\n value: search.value,\n fullSearch: search.fullSearch,\n hasClear: true,\n onUpdate: setSearch,\n }}\n />\n </div>\n );\n};\n\nconst WithHeaderStory = () => {\n const [search, setSearch] = useState({value: '', fullSearch: false});\n const [visibleFields, setVisibleFields] =\n useState<QueryListFieldKey<QueryHistoryRow>[]>(activeFields);\n\n return (\n <div style={{width: 300, height: 500}}>\n <QueriesHistory\n items={BASE_ITEMS}\n logo={<SegmentedRadioGroup options={operationFilterOptions} />}\n visibleFields={{value: visibleFields, fields, onChange: setVisibleFields}}\n filter={{\n fields: filterFields,\n onApply: logFilterApply,\n onReset: logFilterReset('reset'),\n }}\n search={{\n value: search.value,\n fullSearch: search.fullSearch,\n hasClear: true,\n onUpdate: setSearch,\n }}\n />\n </div>\n );\n};\n\nconst PaginatedStory = () => {\n const [items, setItems] = useState<QueryListItem<QueryHistoryRow>[]>(PAGINATION_PAGES[0]);\n const [page, setPage] = useState(1);\n const [loading, setLoading] = useState(false);\n\n const handleLoadMore = () => {\n const nextPage = PAGINATION_PAGES[page];\n\n if (loading || !nextPage) {\n return;\n }\n\n action('onLoadMore')(page);\n setLoading(true);\n\n window.setTimeout(() => {\n setItems((currentItems) => [...currentItems, ...nextPage]);\n setPage((currentPage) => currentPage + 1);\n setLoading(false);\n }, 700);\n };\n\n return (\n <div style={{width: 300, height: 300}}>\n <QueriesHistory\n title=\"Paginated history\"\n items={items}\n selectedRowId={2}\n loading={loading}\n hasMore={page < PAGINATION_PAGES.length}\n onLoadMore={handleLoadMore}\n search={{onUpdate: action('onSearchUpdate')}}\n />\n </div>\n );\n};\n\nconst FullSearchUnavailableStory = () => {\n const [search, setSearch] = useState({value: 'Query', fullSearch: true});\n\n return (\n <div style={{width: 300, height: 500}}>\n <QueriesHistory\n title=\"Basic search only\"\n items={LINK_ITEMS}\n search={{\n ...search,\n fullSearchAvailable: false,\n hasClear: true,\n onUpdate: (data) => {\n action('onSearchUpdate')(data);\n setSearch(data);\n },\n }}\n />\n </div>\n );\n};\n\nconst RouterLinksStory = () => {\n const [search, setSearch] = useState({value: '', fullSearch: false});\n\n return (\n <div style={{width: 500, height: 500}}>\n <QueriesHistory\n title=\"Router links\"\n items={LINK_ITEMS}\n renderLink={renderRouterLink}\n search={{...search, hasClear: true, onUpdate: setSearch}}\n />\n </div>\n );\n};\n\nconst CustomRowRendererStory = () => (\n <div style={{width: 300, height: 300}}>\n <QueriesHistory\n title=\"Custom row renderer\"\n items={LINK_ITEMS.slice(0, 3)}\n renderLink={renderRouterLink}\n renderRowItem={({item, renderLink}) =>\n 'header' in item ? (\n <HistoryGroupHeader title={item.header} />\n ) : (\n <RowLink href={item.href} renderLink={renderLink}>\n <Text>{item.title}</Text>\n </RowLink>\n )\n }\n search={{onUpdate: action('onSearchUpdate')}}\n />\n </div>\n);\n\nexport const Default: Story = {render: () => <DefaultStory />};\nexport const Empty: Story = {render: () => <EmptyStory />};\nexport const InitialLoading: Story = {\n args: {\n title: 'Loading history',\n items: [],\n loading: true,\n search: {onUpdate: action('onSearchUpdate')},\n },\n decorators: [\n (StoryComponent) => (\n <div style={{width: 300, height: 500}}>\n <StoryComponent />\n </div>\n ),\n ],\n};\nexport const Paginated: Story = {render: () => <PaginatedStory />};\nexport const FullSearchUnavailable: Story = {\n render: () => <FullSearchUnavailableStory />,\n};\nexport const RouterLinks: Story = {render: () => <RouterLinksStory />};\nexport const CustomRowRenderer: Story = {render: () => <CustomRowRendererStory />};\nexport const WithHeader: Story = {render: () => <WithHeaderStory />};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_uikit","_components","_QueriesHistory","_actions","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_interopRequireDefault","now","Date","min","QUERY","BASE_ITEMS","header","height","id","title","status","engine","mode","startTime","endTime","query","LINK_ITEMS","map","item","_objectSpread","href","concat","PAGINATION_PAGES","slice","NARROW_HISTORY_START","UTC","NARROW_HISTORY_ITEMS","isPrivate","activeFields","fields","filterFields","type","initialValue","items","logFilterApply","action","logFilterReset","renderRouterLink","_ref","_onClick","onClick","props","_objectWithoutProperties","_excluded","_jsx","event","defaultPrevented","button","metaKey","ctrlKey","shiftKey","altKey","preventDefault","meta","component","QueriesHistory","tags","parameters","layout","operationFilterOptions","value","content","_default","exports","DefaultStory","_useState","useState","_toConsumableArray","_useState2","_slicedToArray","setItems","_useState3","fullSearch","_useState4","search","setSearch","_useState5","_useState6","visibleFields","setVisibleFields","_useState7","_useState8","compareMode","setCompareMode","_useState9","_useState0","comparedRows","setComparedRows","_useState1","undefined","_useState10","editingId","setEditingId","handleCompareChange","selected","result","filter","length","handleCompareCancel","handleEditSubmit","index","findIndex","handleEditCancel","handleCompare","handleOnSearch","data","newItems","_item$query","toLowerCase","searchValue","includes","style","width","children","onChange","hasClear","onUpdate","onApply","onReset","getRowActions","text","comparison","enabled","comparedRowIds","onCancel","onCompare","editing","rowId","onSubmit","renderLink","EmptyStory","_useState11","_useState12","WithHeaderStory","_useState13","_useState14","_useState15","_useState16","logo","SegmentedRadioGroup","options","PaginatedStory","_useState17","_useState18","_useState19","_useState20","page","setPage","_useState21","_useState22","loading","setLoading","handleLoadMore","nextPage","window","setTimeout","currentItems","currentPage","selectedRowId","hasMore","onLoadMore","FullSearchUnavailableStory","_useState23","_useState24","fullSearchAvailable","RouterLinksStory","_useState25","_useState26","CustomRowRendererStory","renderRowItem","_ref2","HistoryGroupHeader","RowLink","Text","NarrowDurationStory","Default","render","Empty","InitialLoading","args","decorators","StoryComponent","Paginated","LoadingMore","NarrowDuration","FullSearchUnavailable","RouterLinks","CustomRowRenderer","WithHeader"],"sources":["QueriesHistory.stories.tsx"],"sourcesContent":["import React, {useState} from 'react';\nimport type {Meta, StoryObj} from '@storybook/react';\nimport {SegmentedRadioGroup, Text} from '@gravity-ui/uikit';\nimport {HistoryGroupHeader, RowLink} from '../../components';\nimport {QueriesHistory} from './QueriesHistory';\nimport {\n QueryListFieldKey,\n QueryListFilterConfig,\n QueryListItem,\n QueryListLinkRenderer,\n QueryListVisibleFieldsConfig,\n} from '../../types/queryList';\nimport {QueryHistoryRow} from '../../types/history';\nimport {action} from 'storybook/actions';\n\nconst now = Date.now();\nconst min = 60 * 1000;\n\nconst QUERY = `use test;\n\nSELECT\n \"test_session\" AS session_id,\n \"test_task\" AS task_id,\n SUBSTRING(\"test\", 1, 1) AS truncated_char`;\n\nconst BASE_ITEMS: QueryListItem<QueryHistoryRow>[] = [\n {header: 'Today', height: 28},\n {\n id: 1,\n title: 'Query 1',\n status: 'completed',\n engine: 'YQL',\n mode: 'Validation',\n startTime: now - 2 * min,\n endTime: now - min,\n query: QUERY,\n height: 52,\n },\n {\n id: 2,\n title: 'Query 2',\n status: 'failed',\n engine: 'YQL',\n mode: 'Test',\n startTime: now - 10 * min,\n endTime: now - 9 * min,\n query: QUERY,\n height: 52,\n },\n {\n id: 3,\n title: 'Query 3',\n status: 'running',\n engine: 'YQL',\n mode: 'Test',\n startTime: now - min,\n query: QUERY,\n height: 52,\n },\n {header: 'Yesterday', height: 28},\n {\n id: 4,\n title: 'Query 4',\n status: 'aborted',\n engine: 'YQL',\n mode: 'Validation',\n startTime: now - 25 * 60 * min,\n endTime: now - 24 * 60 * min,\n query: 'SELECT 1',\n height: 52,\n },\n {\n id: 5,\n title: 'Query 5',\n status: 'draft',\n engine: 'YQL',\n mode: 'Test',\n startTime: now - 30 * 60 * min,\n query: QUERY,\n height: 52,\n },\n {\n id: 6,\n title: 'Query 6',\n status: 'draft',\n engine: 'YQL',\n mode: 'Test',\n startTime: now - 30 * 60 * min,\n query: QUERY,\n height: 52,\n },\n {\n id: 7,\n title: 'Query 7',\n status: 'draft',\n engine: 'YQL',\n mode: 'Test',\n startTime: now - 30 * 60 * min,\n query: QUERY,\n height: 52,\n },\n {\n id: 8,\n title: 'Query 8',\n status: 'draft',\n engine: 'YQL',\n mode: 'Test',\n startTime: now - 30 * 60 * min,\n query: QUERY,\n height: 52,\n },\n];\n\nconst LINK_ITEMS = BASE_ITEMS.map((item) =>\n 'id' in item ? {...item, href: `/queries/${item.id}`} : item,\n);\n\nconst PAGINATION_PAGES = [LINK_ITEMS.slice(0, 6), LINK_ITEMS.slice(6)];\n\nconst NARROW_HISTORY_START = Date.UTC(2024, 0, 15, 12, 0, 0);\nconst NARROW_HISTORY_ITEMS: QueryListItem<QueryHistoryRow>[] = [\n {\n id: 'five-minutes',\n title: 'Five-minute query',\n status: 'completed',\n engine: 'YQL',\n mode: 'Test',\n isPrivate: false,\n startTime: NARROW_HISTORY_START,\n endTime: NARROW_HISTORY_START + 5 * min,\n height: 52,\n },\n {\n id: 'three-hours',\n title: 'Three-hour query',\n status: 'completed',\n engine: 'YQL',\n mode: 'Test',\n isPrivate: true,\n startTime: NARROW_HISTORY_START,\n endTime: NARROW_HISTORY_START + 190 * min,\n height: 52,\n },\n {\n id: 'twenty-seven-hours',\n title: 'Twenty-seven-hour query',\n status: 'completed',\n engine: 'YQL',\n mode: 'Test',\n isPrivate: false,\n startTime: NARROW_HISTORY_START,\n endTime: NARROW_HISTORY_START + 1_635 * min,\n height: 52,\n },\n];\n\ntype VisibleFields = QueryListVisibleFieldsConfig<QueryHistoryRow>['fields'];\nconst activeFields: QueryListFieldKey<QueryHistoryRow>[] = [\n 'duration',\n 'mode',\n 'startTime',\n 'engine',\n 'isPrivate',\n];\nconst fields: VisibleFields = [\n {\n id: 'duration',\n title: 'Duration',\n },\n {\n id: 'mode',\n title: 'Mode',\n },\n {\n id: 'startTime',\n title: 'Start time',\n },\n {\n id: 'engine',\n title: 'Engine',\n },\n {\n id: 'isPrivate',\n title: 'ACO',\n },\n];\n\nconst filterFields: QueryListFilterConfig['fields'] = [\n {id: 'onlyMine', type: 'switch', title: 'My queries only', initialValue: true},\n {id: 'range', type: 'rangeDatePicker', title: 'Period'},\n {\n id: 'dialect',\n type: 'checkboxGroup',\n title: 'Dialect',\n initialValue: [],\n items: [\n {id: 'yql', title: 'YQL'},\n {id: 'sql', title: 'SQL'},\n ],\n },\n];\n\nconst logFilterApply = action('onFilterApply');\nconst logFilterReset = action('onFilterReset');\n\nconst renderRouterLink: QueryListLinkRenderer = ({onClick, ...props}) => (\n <a\n {...props}\n data-router-link\n onClick={(event) => {\n onClick?.(event);\n\n if (\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey\n ) {\n return;\n }\n\n event.preventDefault();\n action('routerNavigate')(props.href);\n }}\n />\n);\n\nconst meta: Meta<typeof QueriesHistory> = {\n title: 'Widgets/QueriesHistory',\n component: QueriesHistory,\n tags: ['autodocs'],\n parameters: {\n layout: 'padded',\n },\n};\n\nconst operationFilterOptions = [\n {\n value: 'My',\n content: 'My',\n },\n {\n value: 'All',\n content: 'All',\n },\n];\n\nexport default meta;\ntype Story = StoryObj<typeof QueriesHistory>;\n\nconst DefaultStory = () => {\n const [items, setItems] = useState([...LINK_ITEMS]);\n const [search, setSearch] = useState({value: '', fullSearch: false});\n const [visibleFields, setVisibleFields] =\n useState<QueryListFieldKey<QueryHistoryRow>[]>(activeFields);\n const [compareMode, setCompareMode] = useState(false);\n const [comparedRows, setComparedRows] = useState<(number | string)[]>([]);\n const [editingId, setEditingId] = useState<number | string | undefined>(undefined);\n\n const handleCompareChange = (item: QueryHistoryRow, selected: boolean) => {\n const result = selected\n ? [...comparedRows.slice(0, 1), item.id]\n : comparedRows.filter((id) => id !== item.id);\n setComparedRows(result);\n\n if (!result.length) setCompareMode(false);\n };\n\n const handleCompareCancel = () => {\n setComparedRows([]);\n setCompareMode(false);\n };\n\n const handleEditSubmit = (item: QueryHistoryRow, title: string) => {\n const index = items.findIndex((i) => 'id' in i && i.id === item.id);\n if (index < 0) return;\n\n const result = [...items];\n result[index] = {...result[index], title};\n setItems(result);\n setEditingId(undefined);\n };\n\n const handleEditCancel = () => {\n setEditingId(undefined);\n };\n\n const handleCompare = () => {\n action('onCompare')(comparedRows);\n };\n\n const handleOnSearch = (data: {value: string; fullSearch: boolean}) => {\n setSearch(data);\n\n if (!data.value) {\n setItems(LINK_ITEMS);\n return;\n }\n\n const newItems = LINK_ITEMS.filter((item) => {\n if (!('id' in item)) return false;\n\n const title = item.title.toLowerCase();\n const query = item.query?.toLowerCase();\n const searchValue = data.value.toLowerCase();\n\n if (data.fullSearch) {\n return title.includes(searchValue) || query?.includes(searchValue);\n }\n\n return title.includes(searchValue);\n });\n setItems(newItems);\n };\n\n return (\n <div style={{width: 300, height: 500}}>\n <QueriesHistory\n title=\"History\"\n items={items}\n visibleFields={{value: visibleFields, fields, onChange: setVisibleFields}}\n search={{\n value: search.value,\n fullSearch: search.fullSearch,\n hasClear: true,\n onUpdate: handleOnSearch,\n }}\n filter={{\n fields: filterFields,\n onApply: logFilterApply,\n onReset: logFilterReset('reset'),\n }}\n getRowActions={() => [\n {\n text: 'Compare',\n onClick: (item) => {\n setCompareMode(true);\n setComparedRows([item.id]);\n },\n },\n {\n text: 'Edit',\n onClick: (item) => {\n setEditingId(item.id);\n },\n },\n ]}\n comparison={{\n enabled: compareMode,\n comparedRowIds: comparedRows,\n onChange: handleCompareChange,\n onCancel: handleCompareCancel,\n onCompare: handleCompare,\n }}\n editing={{\n rowId: editingId,\n onSubmit: handleEditSubmit,\n onCancel: handleEditCancel,\n }}\n renderLink={renderRouterLink}\n />\n </div>\n );\n};\n\nconst EmptyStory = () => {\n const [search, setSearch] = useState({value: '', fullSearch: false});\n\n return (\n <div style={{width: 300, height: 500}}>\n <QueriesHistory\n title=\"History\"\n items={[]}\n search={{\n value: search.value,\n fullSearch: search.fullSearch,\n hasClear: true,\n onUpdate: setSearch,\n }}\n />\n </div>\n );\n};\n\nconst WithHeaderStory = () => {\n const [search, setSearch] = useState({value: '', fullSearch: false});\n const [visibleFields, setVisibleFields] =\n useState<QueryListFieldKey<QueryHistoryRow>[]>(activeFields);\n\n return (\n <div style={{width: 300, height: 500}}>\n <QueriesHistory\n items={BASE_ITEMS}\n logo={<SegmentedRadioGroup options={operationFilterOptions} />}\n visibleFields={{value: visibleFields, fields, onChange: setVisibleFields}}\n filter={{\n fields: filterFields,\n onApply: logFilterApply,\n onReset: logFilterReset('reset'),\n }}\n search={{\n value: search.value,\n fullSearch: search.fullSearch,\n hasClear: true,\n onUpdate: setSearch,\n }}\n />\n </div>\n );\n};\n\nconst PaginatedStory = () => {\n const [items, setItems] = useState<QueryListItem<QueryHistoryRow>[]>(PAGINATION_PAGES[0]);\n const [page, setPage] = useState(1);\n const [loading, setLoading] = useState(false);\n\n const handleLoadMore = () => {\n const nextPage = PAGINATION_PAGES[page];\n\n if (loading || !nextPage) {\n return;\n }\n\n action('onLoadMore')(page);\n setLoading(true);\n\n window.setTimeout(() => {\n setItems((currentItems) => [...currentItems, ...nextPage]);\n setPage((currentPage) => currentPage + 1);\n setLoading(false);\n }, 1500);\n };\n\n return (\n <div style={{width: 300, height: 300}}>\n <QueriesHistory\n title=\"Paginated history\"\n items={items}\n selectedRowId={2}\n loading={loading}\n hasMore={page < PAGINATION_PAGES.length}\n onLoadMore={handleLoadMore}\n search={{onUpdate: action('onSearchUpdate')}}\n />\n </div>\n );\n};\n\nconst FullSearchUnavailableStory = () => {\n const [search, setSearch] = useState({value: 'Query', fullSearch: true});\n\n return (\n <div style={{width: 300, height: 500}}>\n <QueriesHistory\n title=\"Basic search only\"\n items={LINK_ITEMS}\n search={{\n ...search,\n fullSearchAvailable: false,\n hasClear: true,\n onUpdate: (data) => {\n action('onSearchUpdate')(data);\n setSearch(data);\n },\n }}\n />\n </div>\n );\n};\n\nconst RouterLinksStory = () => {\n const [search, setSearch] = useState({value: '', fullSearch: false});\n\n return (\n <div style={{width: 500, height: 500}}>\n <QueriesHistory\n title=\"Router links\"\n items={LINK_ITEMS}\n renderLink={renderRouterLink}\n search={{...search, hasClear: true, onUpdate: setSearch}}\n />\n </div>\n );\n};\n\nconst CustomRowRendererStory = () => (\n <div style={{width: 300, height: 300}}>\n <QueriesHistory\n title=\"Custom row renderer\"\n items={LINK_ITEMS.slice(0, 3)}\n renderLink={renderRouterLink}\n renderRowItem={({item, renderLink}) =>\n 'header' in item ? (\n <HistoryGroupHeader title={item.header} />\n ) : (\n <RowLink href={item.href} renderLink={renderLink}>\n <Text>{item.title}</Text>\n </RowLink>\n )\n }\n search={{onUpdate: action('onSearchUpdate')}}\n />\n </div>\n);\n\nconst NarrowDurationStory = () => (\n <div style={{width: 300, height: 300}}>\n <QueriesHistory\n title=\"Duration examples\"\n items={NARROW_HISTORY_ITEMS}\n visibleFields={{value: activeFields, fields, onChange: action('onVisibleFieldsChange')}}\n search={{onUpdate: action('onSearchUpdate')}}\n />\n </div>\n);\n\nexport const Default: Story = {render: () => <DefaultStory />};\nexport const Empty: Story = {render: () => <EmptyStory />};\nexport const InitialLoading: Story = {\n args: {\n title: 'Loading history',\n items: [],\n loading: true,\n search: {onUpdate: action('onSearchUpdate')},\n },\n decorators: [\n (StoryComponent) => (\n <div style={{width: 300, height: 500}}>\n <StoryComponent />\n </div>\n ),\n ],\n};\nexport const Paginated: Story = {render: () => <PaginatedStory />};\nexport const LoadingMore: Story = {\n args: {\n title: 'Loading next page',\n items: LINK_ITEMS.slice(0, 3),\n loading: true,\n hasMore: true,\n onLoadMore: action('onLoadMore'),\n search: {onUpdate: action('onSearchUpdate')},\n },\n decorators: [\n (StoryComponent) => (\n <div style={{width: 300, height: 300}}>\n <StoryComponent />\n </div>\n ),\n ],\n};\nexport const NarrowDuration: Story = {render: () => <NarrowDurationStory />};\nexport const FullSearchUnavailable: Story = {\n render: () => <FullSearchUnavailableStory />,\n};\nexport const RouterLinks: Story = {render: () => <RouterLinksStory />};\nexport const CustomRowRenderer: Story = {render: () => <CustomRowRendererStory />};\nexport const WithHeader: Story = {render: () => <WithHeaderStory />};\n"],"mappings":"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","ignoreList":[]}
@@ -3,6 +3,10 @@
3
3
  }
4
4
  .qp-lazy-list__sentinel {
5
5
  height: 1px;
6
+ width: 100%;
7
+ }
8
+ .qp-lazy-list__sentinel_loading {
9
+ height: 40px;
6
10
  }
7
11
  .qp-lazy-list__spinner {
8
12
  height: 100%;
@@ -1 +1 @@
1
- {"version":3,"sources":["LazyList.scss"],"names":[],"mappings":"AACE;EACE,qDAAA;AAAJ;AAGE;EACE,WAAA;AADJ;AAIE;EACE,YAAA;AAFJ","file":"LazyList.css","sourcesContent":[".qp-lazy-list {\n .g-list__item_selected:hover {\n background-color: var(--g-color-base-selection-hover);\n }\n\n &__sentinel {\n height: 1px;\n }\n\n &__spinner {\n height: 100%;\n }\n}\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["LazyList.scss"],"names":[],"mappings":"AACE;EACE,qDAAA;AAAJ;AAGE;EACE,WAAA;EACA,WAAA;AADJ;AAGI;EACE,YAAA;AADN;AAKE;EACE,YAAA;AAHJ","file":"LazyList.css","sourcesContent":[".qp-lazy-list {\n .g-list__item_selected:hover {\n background-color: var(--g-color-base-selection-hover);\n }\n\n &__sentinel {\n height: 1px;\n width: 100%;\n\n &_loading {\n height: 40px;\n }\n }\n\n &__spinner {\n height: 100%;\n }\n}\n"],"sourceRoot":""}
@@ -6,7 +6,7 @@ import "core-js/modules/es.iterator.constructor.js";
6
6
  import "core-js/modules/es.iterator.reduce.js";
7
7
  import "core-js/modules/es.object.to-string.js";
8
8
  import React, { useLayoutEffect, useMemo, useRef } from 'react';
9
- import { List } from '@gravity-ui/uikit';
9
+ import { Flex, List, Loader } from '@gravity-ui/uikit';
10
10
  import cn from 'bem-cn-lite';
11
11
  import { useLoadMoreSentinel } from "../../helpers/useLoadMoreSentinel";
12
12
  import { ListSpinner } from "../ListSpinner";
@@ -14,6 +14,7 @@ import "./LazyList.css";
14
14
  import { jsx as _jsx } from "react/jsx-runtime";
15
15
  var block = cn('qp-lazy-list');
16
16
  var SENTINEL_ROW_HEIGHT = 1;
17
+ var LOADING_ROW_HEIGHT = 40;
17
18
  var isSentinelRow = function isSentinelRow(row) {
18
19
  return Boolean(row) && _typeof(row) === 'object' && '__sentinel' in row;
19
20
  };
@@ -33,24 +34,36 @@ export var LazyList = function LazyList(_ref) {
33
34
  isEmpty = _ref.isEmpty,
34
35
  className = _ref.className;
35
36
  var listRef = useRef(null);
36
- var previousItemsLengthRef = useRef(items.length);
37
+ var previousListStateRef = useRef({
38
+ itemsLength: items.length,
39
+ loading: loading,
40
+ hasMore: hasMore
41
+ });
37
42
  var sentinelRef = useLoadMoreSentinel(hasMore, onLoadMore, loading, items.length);
38
43
  var rows = useMemo(function () {
39
- return hasMore ? [].concat(_toConsumableArray(items), [{
44
+ return hasMore || loading ? [].concat(_toConsumableArray(items), [{
40
45
  __sentinel: true
41
46
  }]) : items;
42
- }, [items, hasMore]);
47
+ }, [items, hasMore, loading]);
43
48
  var getRowHeight = function getRowHeight(row) {
44
- return isSentinelRow(row) ? SENTINEL_ROW_HEIGHT : itemHeight(row);
49
+ if (isSentinelRow(row)) {
50
+ return loading ? LOADING_ROW_HEIGHT : SENTINEL_ROW_HEIGHT;
51
+ }
52
+ return itemHeight(row);
45
53
  };
46
54
  useLayoutEffect(function () {
47
- var previousItemsLength = previousItemsLengthRef.current;
48
- if (previousItemsLength !== items.length) {
55
+ var previousListState = previousListStateRef.current;
56
+ var listStateChanged = previousListState.itemsLength !== items.length || previousListState.loading !== loading || previousListState.hasMore !== hasMore;
57
+ if (listStateChanged) {
49
58
  var _listRef$current;
50
- (_listRef$current = listRef.current) === null || _listRef$current === void 0 || (_listRef$current = _listRef$current.refContainer.current) === null || _listRef$current === void 0 || _listRef$current.resetAfterIndex(Math.min(previousItemsLength, items.length), true);
51
- previousItemsLengthRef.current = items.length;
59
+ (_listRef$current = listRef.current) === null || _listRef$current === void 0 || (_listRef$current = _listRef$current.refContainer.current) === null || _listRef$current === void 0 || _listRef$current.resetAfterIndex(Math.min(previousListState.itemsLength, items.length), true);
60
+ previousListStateRef.current = {
61
+ itemsLength: items.length,
62
+ loading: loading,
63
+ hasMore: hasMore
64
+ };
52
65
  }
53
- }, [items.length]);
66
+ }, [hasMore, items.length, loading]);
54
67
  if (error) {
55
68
  return /*#__PURE__*/_jsx(React.Fragment, {
56
69
  children: error
@@ -81,7 +94,16 @@ export var LazyList = function LazyList(_ref) {
81
94
  renderItem: function renderItem(row, isActive, index) {
82
95
  return isSentinelRow(row) ? /*#__PURE__*/_jsx("div", {
83
96
  ref: sentinelRef,
84
- className: block('sentinel')
97
+ className: block('sentinel', {
98
+ loading: Boolean(loading)
99
+ }),
100
+ children: loading && /*#__PURE__*/_jsx(Flex, {
101
+ alignItems: "center",
102
+ justifyContent: "center",
103
+ width: "100%",
104
+ height: "100%",
105
+ children: /*#__PURE__*/_jsx(Loader, {})
106
+ })
85
107
  }) : _renderItem(row, isActive, index);
86
108
  },
87
109
  selectedItemIndex: selectedItemIndex,
@@ -1 +1 @@
1
- {"version":3,"names":["React","useLayoutEffect","useMemo","useRef","List","cn","useLoadMoreSentinel","ListSpinner","jsx","_jsx","block","SENTINEL_ROW_HEIGHT","isSentinelRow","row","Boolean","_typeof","LazyList","_ref","items","itemHeight","renderItem","hasMore","onLoadMore","onItemClick","selectedItemIndex","_ref$filterable","filterable","loading","error","emptyContent","isEmpty","className","listRef","previousItemsLengthRef","length","sentinelRef","rows","concat","_toConsumableArray","__sentinel","getRowHeight","previousItemsLength","current","_listRef$current","refContainer","resetAfterIndex","Math","min","Fragment","children","empty","ref","itemsHeight","listRows","reduce","total","isActive","index"],"sources":["LazyList.tsx"],"sourcesContent":["import React, {useLayoutEffect, useMemo, useRef} from 'react';\nimport {List} from '@gravity-ui/uikit';\nimport cn from 'bem-cn-lite';\nimport {useLoadMoreSentinel} from '../../helpers/useLoadMoreSentinel';\nimport {ListSpinner} from '../ListSpinner';\nimport './LazyList.scss';\n\nconst block = cn('qp-lazy-list');\n\nconst SENTINEL_ROW_HEIGHT = 1;\n\ntype SentinelRow = {__sentinel: true};\ntype LazyListRow<T> = T | SentinelRow;\n\nconst isSentinelRow = <T,>(row: LazyListRow<T>): row is SentinelRow =>\n Boolean(row) && typeof row === 'object' && '__sentinel' in (row as object);\n\nexport type LazyListProps<T extends object> = {\n items: T[];\n itemHeight: (item: T) => number;\n renderItem: (item: T, isActive: boolean, index: number) => React.ReactNode;\n hasMore?: boolean;\n onLoadMore?: () => void;\n onItemClick?: (item: T, index: number) => void;\n selectedItemIndex?: T[keyof T] | number;\n filterable?: boolean;\n loading?: boolean;\n error?: React.ReactNode;\n emptyContent?: React.ReactNode;\n isEmpty?: boolean;\n className?: string;\n};\n\nexport const LazyList = <T extends object>({\n items,\n itemHeight,\n renderItem,\n hasMore,\n onLoadMore,\n onItemClick,\n selectedItemIndex,\n filterable = false,\n loading,\n error,\n emptyContent,\n isEmpty,\n className,\n}: LazyListProps<T>) => {\n const listRef = useRef<List<LazyListRow<T>>>(null);\n const previousItemsLengthRef = useRef(items.length);\n const sentinelRef = useLoadMoreSentinel(hasMore, onLoadMore, loading, items.length);\n\n const rows: LazyListRow<T>[] = useMemo(\n () => (hasMore ? [...items, {__sentinel: true}] : items),\n [items, hasMore],\n );\n\n const getRowHeight = (row: LazyListRow<T>) =>\n isSentinelRow(row) ? SENTINEL_ROW_HEIGHT : itemHeight(row);\n\n useLayoutEffect(() => {\n const previousItemsLength = previousItemsLengthRef.current;\n\n if (previousItemsLength !== items.length) {\n listRef.current?.refContainer.current?.resetAfterIndex(\n Math.min(previousItemsLength, items.length),\n true,\n );\n previousItemsLengthRef.current = items.length;\n }\n }, [items.length]);\n\n if (error) {\n return <React.Fragment>{error}</React.Fragment>;\n }\n\n const empty = isEmpty ?? !items.length;\n\n if (loading && empty) {\n return <ListSpinner className={block('spinner', className)} />;\n }\n\n if (empty) {\n return <React.Fragment>{emptyContent}</React.Fragment>;\n }\n\n return (\n <List<LazyListRow<T>>\n ref={listRef}\n className={block(null, className)}\n filterable={filterable}\n items={rows}\n itemHeight={getRowHeight}\n itemsHeight={(listRows) =>\n listRows.reduce((total, row) => total + getRowHeight(row), 0)\n }\n renderItem={(row, isActive, index) =>\n isSentinelRow(row) ? (\n <div ref={sentinelRef} className={block('sentinel')} />\n ) : (\n renderItem(row, isActive, index)\n )\n }\n selectedItemIndex={selectedItemIndex as never}\n onItemClick={(row, index) => {\n if (!isSentinelRow(row)) {\n onItemClick?.(row, index);\n }\n }}\n />\n );\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useLayoutEffect","useMemo","useRef","Flex","List","Loader","cn","useLoadMoreSentinel","ListSpinner","jsx","_jsx","block","SENTINEL_ROW_HEIGHT","LOADING_ROW_HEIGHT","isSentinelRow","row","Boolean","_typeof","LazyList","_ref","items","itemHeight","renderItem","hasMore","onLoadMore","onItemClick","selectedItemIndex","_ref$filterable","filterable","loading","error","emptyContent","isEmpty","className","listRef","previousListStateRef","itemsLength","length","sentinelRef","rows","concat","_toConsumableArray","__sentinel","getRowHeight","previousListState","current","listStateChanged","_listRef$current","refContainer","resetAfterIndex","Math","min","Fragment","children","empty","ref","itemsHeight","listRows","reduce","total","isActive","index","alignItems","justifyContent","width","height"],"sources":["LazyList.tsx"],"sourcesContent":["import React, {useLayoutEffect, useMemo, useRef} from 'react';\nimport {Flex, List, Loader} from '@gravity-ui/uikit';\nimport cn from 'bem-cn-lite';\nimport {useLoadMoreSentinel} from '../../helpers/useLoadMoreSentinel';\nimport {ListSpinner} from '../ListSpinner';\nimport './LazyList.scss';\n\nconst block = cn('qp-lazy-list');\n\nconst SENTINEL_ROW_HEIGHT = 1;\nconst LOADING_ROW_HEIGHT = 40;\n\ntype SentinelRow = {__sentinel: true};\ntype LazyListRow<T> = T | SentinelRow;\n\nconst isSentinelRow = <T,>(row: LazyListRow<T>): row is SentinelRow =>\n Boolean(row) && typeof row === 'object' && '__sentinel' in (row as object);\n\nexport type LazyListProps<T extends object> = {\n items: T[];\n itemHeight: (item: T) => number;\n renderItem: (item: T, isActive: boolean, index: number) => React.ReactNode;\n hasMore?: boolean;\n onLoadMore?: () => void;\n onItemClick?: (item: T, index: number) => void;\n selectedItemIndex?: T[keyof T] | number;\n filterable?: boolean;\n loading?: boolean;\n error?: React.ReactNode;\n emptyContent?: React.ReactNode;\n isEmpty?: boolean;\n className?: string;\n};\n\nexport const LazyList = <T extends object>({\n items,\n itemHeight,\n renderItem,\n hasMore,\n onLoadMore,\n onItemClick,\n selectedItemIndex,\n filterable = false,\n loading,\n error,\n emptyContent,\n isEmpty,\n className,\n}: LazyListProps<T>) => {\n const listRef = useRef<List<LazyListRow<T>>>(null);\n const previousListStateRef = useRef({itemsLength: items.length, loading, hasMore});\n const sentinelRef = useLoadMoreSentinel(hasMore, onLoadMore, loading, items.length);\n\n const rows: LazyListRow<T>[] = useMemo(\n () => (hasMore || loading ? [...items, {__sentinel: true}] : items),\n [items, hasMore, loading],\n );\n\n const getRowHeight = (row: LazyListRow<T>) => {\n if (isSentinelRow(row)) {\n return loading ? LOADING_ROW_HEIGHT : SENTINEL_ROW_HEIGHT;\n }\n\n return itemHeight(row);\n };\n\n useLayoutEffect(() => {\n const previousListState = previousListStateRef.current;\n const listStateChanged =\n previousListState.itemsLength !== items.length ||\n previousListState.loading !== loading ||\n previousListState.hasMore !== hasMore;\n\n if (listStateChanged) {\n listRef.current?.refContainer.current?.resetAfterIndex(\n Math.min(previousListState.itemsLength, items.length),\n true,\n );\n previousListStateRef.current = {itemsLength: items.length, loading, hasMore};\n }\n }, [hasMore, items.length, loading]);\n\n if (error) {\n return <React.Fragment>{error}</React.Fragment>;\n }\n\n const empty = isEmpty ?? !items.length;\n\n if (loading && empty) {\n return <ListSpinner className={block('spinner', className)} />;\n }\n\n if (empty) {\n return <React.Fragment>{emptyContent}</React.Fragment>;\n }\n\n return (\n <List<LazyListRow<T>>\n ref={listRef}\n className={block(null, className)}\n filterable={filterable}\n items={rows}\n itemHeight={getRowHeight}\n itemsHeight={(listRows) =>\n listRows.reduce((total, row) => total + getRowHeight(row), 0)\n }\n renderItem={(row, isActive, index) =>\n isSentinelRow(row) ? (\n <div\n ref={sentinelRef}\n className={block('sentinel', {loading: Boolean(loading)})}\n >\n {loading && (\n <Flex\n alignItems=\"center\"\n justifyContent=\"center\"\n width=\"100%\"\n height=\"100%\"\n >\n <Loader />\n </Flex>\n )}\n </div>\n ) : (\n renderItem(row, isActive, index)\n )\n }\n selectedItemIndex={selectedItemIndex as never}\n onItemClick={(row, index) => {\n if (!isSentinelRow(row)) {\n onItemClick?.(row, index);\n }\n }}\n />\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -5,6 +5,11 @@
5
5
 
6
6
  &__sentinel {
7
7
  height: 1px;
8
+ width: 100%;
9
+
10
+ &_loading {
11
+ height: 40px;
12
+ }
8
13
  }
9
14
 
10
15
  &__spinner {
@@ -41,6 +41,13 @@ export var AllStatuses = {
41
41
  status: "aborted",
42
42
  startTime: fiveMinutesAgo,
43
43
  endTime: now
44
+ }), /*#__PURE__*/_jsx(QueryDuration, {
45
+ status: "completed",
46
+ startTime: now - (27 * 60 + 15) * 60 * 1000,
47
+ endTime: now
48
+ }), /*#__PURE__*/_jsx(QueryDuration, {
49
+ status: "completed",
50
+ startTime: fiveMinutesAgo
44
51
  }), /*#__PURE__*/_jsx(QueryDuration, {
45
52
  status: "running",
46
53
  startTime: fiveMinutesAgo
@@ -1 +1 @@
1
- {"version":3,"names":["React","QueryDuration","jsx","_jsx","jsxs","_jsxs","now","Date","fiveMinutesAgo","oneHourAgo","meta","title","component","tags","Default","args","status","startTime","AllStatuses","render","style","display","gap","flexWrap","alignItems","children","endTime"],"sources":["QueryDuration.stories.tsx"],"sourcesContent":["import React from 'react';\nimport type {Meta, StoryObj} from '@storybook/react';\nimport {QueryDuration} from './QueryDuration';\n\nconst now = Date.now();\nconst fiveMinutesAgo = now - 5 * 60 * 1000;\nconst oneHourAgo = now - 60 * 60 * 1000;\n\nconst meta: Meta<typeof QueryDuration> = {\n title: 'Components/QueryDuration',\n component: QueryDuration,\n tags: ['autodocs'],\n};\n\nexport default meta;\ntype Story = StoryObj<typeof QueryDuration>;\n\n/** Live timer: endTime not provided — counter ticks every second */\nexport const Default: Story = {\n args: {\n status: 'running',\n startTime: fiveMinutesAgo,\n },\n};\n\n/** All variants side by side: Running updates in real time, Draft is static */\nexport const AllStatuses: Story = {\n render: () => (\n <div style={{display: 'flex', gap: 8, flexWrap: 'wrap', alignItems: 'center'}}>\n {/* Static */}\n <QueryDuration status=\"completed\" startTime={fiveMinutesAgo} endTime={now} />\n <QueryDuration status=\"failed\" startTime={oneHourAgo} endTime={now} />\n <QueryDuration status=\"aborted\" startTime={fiveMinutesAgo} endTime={now} />\n {/* Live timer */}\n <QueryDuration status=\"running\" startTime={fiveMinutesAgo} />\n {/* Always --:-- */}\n <QueryDuration status=\"draft\" startTime={now} />\n </div>\n ),\n};\n"],"mappings":";AAAA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SAAQC,aAAa;AAAyB,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAE9C,IAAMC,GAAG,GAAGC,IAAI,CAACD,GAAG,CAAC,CAAC;AACtB,IAAME,cAAc,GAAGF,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI;AAC1C,IAAMG,UAAU,GAAGH,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;AAEvC,IAAMI,IAAgC,GAAG;EACrCC,KAAK,EAAE,0BAA0B;EACjCC,SAAS,EAAEX,aAAa;EACxBY,IAAI,EAAE,CAAC,UAAU;AACrB,CAAC;AAED,eAAeH,IAAI;AAGnB;AACA,OAAO,IAAMI,OAAc,GAAG;EAC1BC,IAAI,EAAE;IACFC,MAAM,EAAE,SAAS;IACjBC,SAAS,EAAET;EACf;AACJ,CAAC;;AAED;AACA,OAAO,IAAMU,WAAkB,GAAG;EAC9BC,MAAM,EAAE,SAARA,MAAMA,CAAA;IAAA,oBACFd,KAAA;MAAKe,KAAK,EAAE;QAACC,OAAO,EAAE,MAAM;QAAEC,GAAG,EAAE,CAAC;QAAEC,QAAQ,EAAE,MAAM;QAAEC,UAAU,EAAE;MAAQ,CAAE;MAAAC,QAAA,gBAE1EtB,IAAA,CAACF,aAAa;QAACe,MAAM,EAAC,WAAW;QAACC,SAAS,EAAET,cAAe;QAACkB,OAAO,EAAEpB;MAAI,CAAE,CAAC,eAC7EH,IAAA,CAACF,aAAa;QAACe,MAAM,EAAC,QAAQ;QAACC,SAAS,EAAER,UAAW;QAACiB,OAAO,EAAEpB;MAAI,CAAE,CAAC,eACtEH,IAAA,CAACF,aAAa;QAACe,MAAM,EAAC,SAAS;QAACC,SAAS,EAAET,cAAe;QAACkB,OAAO,EAAEpB;MAAI,CAAE,CAAC,eAE3EH,IAAA,CAACF,aAAa;QAACe,MAAM,EAAC,SAAS;QAACC,SAAS,EAAET;MAAe,CAAE,CAAC,eAE7DL,IAAA,CAACF,aAAa;QAACe,MAAM,EAAC,OAAO;QAACC,SAAS,EAAEX;MAAI,CAAE,CAAC;IAAA,CAC/C,CAAC;EAAA;AAEd,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","QueryDuration","jsx","_jsx","jsxs","_jsxs","now","Date","fiveMinutesAgo","oneHourAgo","meta","title","component","tags","Default","args","status","startTime","AllStatuses","render","style","display","gap","flexWrap","alignItems","children","endTime"],"sources":["QueryDuration.stories.tsx"],"sourcesContent":["import React from 'react';\nimport type {Meta, StoryObj} from '@storybook/react';\nimport {QueryDuration} from './QueryDuration';\n\nconst now = Date.now();\nconst fiveMinutesAgo = now - 5 * 60 * 1000;\nconst oneHourAgo = now - 60 * 60 * 1000;\n\nconst meta: Meta<typeof QueryDuration> = {\n title: 'Components/QueryDuration',\n component: QueryDuration,\n tags: ['autodocs'],\n};\n\nexport default meta;\ntype Story = StoryObj<typeof QueryDuration>;\n\n/** Live timer: endTime not provided — counter ticks every second */\nexport const Default: Story = {\n args: {\n status: 'running',\n startTime: fiveMinutesAgo,\n },\n};\n\n/** All variants side by side: Running updates in real time, Draft is static */\nexport const AllStatuses: Story = {\n render: () => (\n <div style={{display: 'flex', gap: 8, flexWrap: 'wrap', alignItems: 'center'}}>\n {/* Static */}\n <QueryDuration status=\"completed\" startTime={fiveMinutesAgo} endTime={now} />\n <QueryDuration status=\"failed\" startTime={oneHourAgo} endTime={now} />\n <QueryDuration status=\"aborted\" startTime={fiveMinutesAgo} endTime={now} />\n <QueryDuration\n status=\"completed\"\n startTime={now - (27 * 60 + 15) * 60 * 1000}\n endTime={now}\n />\n <QueryDuration status=\"completed\" startTime={fiveMinutesAgo} />\n {/* Live timer */}\n <QueryDuration status=\"running\" startTime={fiveMinutesAgo} />\n {/* Always --:-- */}\n <QueryDuration status=\"draft\" startTime={now} />\n </div>\n ),\n};\n"],"mappings":";AAAA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SAAQC,aAAa;AAAyB,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAE9C,IAAMC,GAAG,GAAGC,IAAI,CAACD,GAAG,CAAC,CAAC;AACtB,IAAME,cAAc,GAAGF,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI;AAC1C,IAAMG,UAAU,GAAGH,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;AAEvC,IAAMI,IAAgC,GAAG;EACrCC,KAAK,EAAE,0BAA0B;EACjCC,SAAS,EAAEX,aAAa;EACxBY,IAAI,EAAE,CAAC,UAAU;AACrB,CAAC;AAED,eAAeH,IAAI;AAGnB;AACA,OAAO,IAAMI,OAAc,GAAG;EAC1BC,IAAI,EAAE;IACFC,MAAM,EAAE,SAAS;IACjBC,SAAS,EAAET;EACf;AACJ,CAAC;;AAED;AACA,OAAO,IAAMU,WAAkB,GAAG;EAC9BC,MAAM,EAAE,SAARA,MAAMA,CAAA;IAAA,oBACFd,KAAA;MAAKe,KAAK,EAAE;QAACC,OAAO,EAAE,MAAM;QAAEC,GAAG,EAAE,CAAC;QAAEC,QAAQ,EAAE,MAAM;QAAEC,UAAU,EAAE;MAAQ,CAAE;MAAAC,QAAA,gBAE1EtB,IAAA,CAACF,aAAa;QAACe,MAAM,EAAC,WAAW;QAACC,SAAS,EAAET,cAAe;QAACkB,OAAO,EAAEpB;MAAI,CAAE,CAAC,eAC7EH,IAAA,CAACF,aAAa;QAACe,MAAM,EAAC,QAAQ;QAACC,SAAS,EAAER,UAAW;QAACiB,OAAO,EAAEpB;MAAI,CAAE,CAAC,eACtEH,IAAA,CAACF,aAAa;QAACe,MAAM,EAAC,SAAS;QAACC,SAAS,EAAET,cAAe;QAACkB,OAAO,EAAEpB;MAAI,CAAE,CAAC,eAC3EH,IAAA,CAACF,aAAa;QACVe,MAAM,EAAC,WAAW;QAClBC,SAAS,EAAEX,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAK;QAC5CoB,OAAO,EAAEpB;MAAI,CAChB,CAAC,eACFH,IAAA,CAACF,aAAa;QAACe,MAAM,EAAC,WAAW;QAACC,SAAS,EAAET;MAAe,CAAE,CAAC,eAE/DL,IAAA,CAACF,aAAa;QAACe,MAAM,EAAC,SAAS;QAACC,SAAS,EAAET;MAAe,CAAE,CAAC,eAE7DL,IAAA,CAACF,aAAa;QAACe,MAAM,EAAC,OAAO;QAACC,SAAS,EAAEX;MAAI,CAAE,CAAC;IAAA,CAC/C,CAAC;EAAA;AAEd,CAAC","ignoreList":[]}
@@ -1,2 +1,2 @@
1
1
  import { QueryStatus } from '../../types/history';
2
- export declare const useQueryDuration: (state: QueryStatus, startTime?: string | number, endTime?: string | number) => string | undefined;
2
+ export declare const useQueryDuration: (state: QueryStatus, startTime?: string | number, endTime?: string | number) => string;
@@ -1,33 +1,39 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
2
  import "core-js/modules/es.array.includes.js";
3
+ import "core-js/modules/es.date.now.js";
3
4
  import "core-js/modules/es.string.includes.js";
4
5
  import "core-js/modules/web.timers.js";
5
6
  import { useEffect, useState } from 'react';
6
7
  import { CompletedQueryStates } from "../../constants/query";
7
8
  import { durationDates } from "../../helpers/time";
9
+ var calculateDuration = function calculateDuration(state, startTime, endTime) {
10
+ if (state === 'draft' || startTime === undefined) {
11
+ return '--:--';
12
+ }
13
+ if (CompletedQueryStates.includes(state)) {
14
+ return endTime === undefined ? '--:--' : durationDates(startTime, endTime);
15
+ }
16
+ return durationDates(startTime, endTime !== null && endTime !== void 0 ? endTime : Date.now());
17
+ };
8
18
  export var useQueryDuration = function useQueryDuration(state, startTime, endTime) {
9
- var _useState = useState(durationDates(startTime, endTime)),
19
+ var _useState = useState(function () {
20
+ return calculateDuration(state, startTime, endTime);
21
+ }),
10
22
  _useState2 = _slicedToArray(_useState, 2),
11
23
  duration = _useState2[0],
12
24
  setDuration = _useState2[1];
13
25
  useEffect(function () {
14
- if (state === 'draft' || !startTime) {
15
- setDuration('--:--');
16
- return;
17
- }
18
- if (CompletedQueryStates.includes(state)) {
19
- setDuration(endTime ? durationDates(startTime, endTime) : '--:--');
20
- return;
21
- }
22
- setDuration(durationDates(startTime, endTime));
23
- if (endTime) {
24
- return;
26
+ setDuration(calculateDuration(state, startTime, endTime));
27
+ var timer;
28
+ if (!(state === 'draft' || startTime === undefined || CompletedQueryStates.includes(state) || endTime !== undefined)) {
29
+ timer = setInterval(function () {
30
+ return setDuration(durationDates(startTime, Date.now()));
31
+ }, 1000);
25
32
  }
26
- var timer = setInterval(function () {
27
- return setDuration(durationDates(startTime, endTime));
28
- }, 1000);
29
33
  return function () {
30
- clearInterval(timer);
34
+ if (timer !== undefined) {
35
+ clearInterval(timer);
36
+ }
31
37
  };
32
38
  }, [state, startTime, endTime]);
33
39
  return duration;
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useState","CompletedQueryStates","durationDates","useQueryDuration","state","startTime","endTime","_useState","_useState2","_slicedToArray","duration","setDuration","includes","timer","setInterval","clearInterval"],"sources":["useQueryDuration.ts"],"sourcesContent":["import {useEffect, useState} from 'react';\nimport {QueryStatus} from '../../types/history';\nimport {CompletedQueryStates} from '../../constants/query';\nimport {durationDates} from '../../helpers/time';\n\nexport const useQueryDuration = (\n state: QueryStatus,\n startTime?: string | number,\n endTime?: string | number,\n) => {\n const [duration, setDuration] = useState(durationDates(startTime, endTime));\n\n useEffect(() => {\n if (state === 'draft' || !startTime) {\n setDuration('--:--');\n return;\n }\n if (CompletedQueryStates.includes(state)) {\n setDuration(endTime ? durationDates(startTime, endTime) : '--:--');\n return;\n }\n setDuration(durationDates(startTime, endTime));\n if (endTime) {\n return;\n }\n const timer = setInterval(() => setDuration(durationDates(startTime, endTime)), 1000);\n\n return () => {\n clearInterval(timer);\n };\n }, [state, startTime, endTime]);\n\n return duration;\n};\n"],"mappings":";;;;AAAA,SAAQA,SAAS,EAAEC,QAAQ,QAAO,OAAO;AAEzC,SAAQC,oBAAoB;AAC5B,SAAQC,aAAa;AAErB,OAAO,IAAMC,gBAAgB,GAAG,SAAnBA,gBAAgBA,CACzBC,KAAkB,EAClBC,SAA2B,EAC3BC,OAAyB,EACxB;EACD,IAAAC,SAAA,GAAgCP,QAAQ,CAACE,aAAa,CAACG,SAAS,EAAEC,OAAO,CAAC,CAAC;IAAAE,UAAA,GAAAC,cAAA,CAAAF,SAAA;IAApEG,QAAQ,GAAAF,UAAA;IAAEG,WAAW,GAAAH,UAAA;EAE5BT,SAAS,CAAC,YAAM;IACZ,IAAIK,KAAK,KAAK,OAAO,IAAI,CAACC,SAAS,EAAE;MACjCM,WAAW,CAAC,OAAO,CAAC;MACpB;IACJ;IACA,IAAIV,oBAAoB,CAACW,QAAQ,CAACR,KAAK,CAAC,EAAE;MACtCO,WAAW,CAACL,OAAO,GAAGJ,aAAa,CAACG,SAAS,EAAEC,OAAO,CAAC,GAAG,OAAO,CAAC;MAClE;IACJ;IACAK,WAAW,CAACT,aAAa,CAACG,SAAS,EAAEC,OAAO,CAAC,CAAC;IAC9C,IAAIA,OAAO,EAAE;MACT;IACJ;IACA,IAAMO,KAAK,GAAGC,WAAW,CAAC;MAAA,OAAMH,WAAW,CAACT,aAAa,CAACG,SAAS,EAAEC,OAAO,CAAC,CAAC;IAAA,GAAE,IAAI,CAAC;IAErF,OAAO,YAAM;MACTS,aAAa,CAACF,KAAK,CAAC;IACxB,CAAC;EACL,CAAC,EAAE,CAACT,KAAK,EAAEC,SAAS,EAAEC,OAAO,CAAC,CAAC;EAE/B,OAAOI,QAAQ;AACnB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useState","CompletedQueryStates","durationDates","calculateDuration","state","startTime","endTime","undefined","includes","Date","now","useQueryDuration","_useState","_useState2","_slicedToArray","duration","setDuration","timer","setInterval","clearInterval"],"sources":["useQueryDuration.ts"],"sourcesContent":["import {useEffect, useState} from 'react';\nimport {QueryStatus} from '../../types/history';\nimport {CompletedQueryStates} from '../../constants/query';\nimport {durationDates} from '../../helpers/time';\n\nconst calculateDuration = (\n state: QueryStatus,\n startTime?: string | number,\n endTime?: string | number,\n) => {\n if (state === 'draft' || startTime === undefined) {\n return '--:--';\n }\n\n if (CompletedQueryStates.includes(state)) {\n return endTime === undefined ? '--:--' : durationDates(startTime, endTime);\n }\n\n return durationDates(startTime, endTime ?? Date.now());\n};\n\nexport const useQueryDuration = (\n state: QueryStatus,\n startTime?: string | number,\n endTime?: string | number,\n) => {\n const [duration, setDuration] = useState(() => calculateDuration(state, startTime, endTime));\n\n useEffect(() => {\n setDuration(calculateDuration(state, startTime, endTime));\n\n let timer: ReturnType<typeof setInterval> | undefined;\n\n if (!(\n state === 'draft' ||\n startTime === undefined ||\n CompletedQueryStates.includes(state) ||\n endTime !== undefined\n )) {\n timer = setInterval(() => setDuration(durationDates(startTime, Date.now())), 1000);\n }\n\n return () => {\n if (timer !== undefined) {\n clearInterval(timer);\n }\n };\n }, [state, startTime, endTime]);\n\n return duration;\n};\n"],"mappings":";;;;;AAAA,SAAQA,SAAS,EAAEC,QAAQ,QAAO,OAAO;AAEzC,SAAQC,oBAAoB;AAC5B,SAAQC,aAAa;AAErB,IAAMC,iBAAiB,GAAG,SAApBA,iBAAiBA,CACnBC,KAAkB,EAClBC,SAA2B,EAC3BC,OAAyB,EACxB;EACD,IAAIF,KAAK,KAAK,OAAO,IAAIC,SAAS,KAAKE,SAAS,EAAE;IAC9C,OAAO,OAAO;EAClB;EAEA,IAAIN,oBAAoB,CAACO,QAAQ,CAACJ,KAAK,CAAC,EAAE;IACtC,OAAOE,OAAO,KAAKC,SAAS,GAAG,OAAO,GAAGL,aAAa,CAACG,SAAS,EAAEC,OAAO,CAAC;EAC9E;EAEA,OAAOJ,aAAa,CAACG,SAAS,EAAEC,OAAO,aAAPA,OAAO,cAAPA,OAAO,GAAIG,IAAI,CAACC,GAAG,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,OAAO,IAAMC,gBAAgB,GAAG,SAAnBA,gBAAgBA,CACzBP,KAAkB,EAClBC,SAA2B,EAC3BC,OAAyB,EACxB;EACD,IAAAM,SAAA,GAAgCZ,QAAQ,CAAC;MAAA,OAAMG,iBAAiB,CAACC,KAAK,EAAEC,SAAS,EAAEC,OAAO,CAAC;IAAA,EAAC;IAAAO,UAAA,GAAAC,cAAA,CAAAF,SAAA;IAArFG,QAAQ,GAAAF,UAAA;IAAEG,WAAW,GAAAH,UAAA;EAE5Bd,SAAS,CAAC,YAAM;IACZiB,WAAW,CAACb,iBAAiB,CAACC,KAAK,EAAEC,SAAS,EAAEC,OAAO,CAAC,CAAC;IAEzD,IAAIW,KAAiD;IAErD,IAAI,EACAb,KAAK,KAAK,OAAO,IACjBC,SAAS,KAAKE,SAAS,IACvBN,oBAAoB,CAACO,QAAQ,CAACJ,KAAK,CAAC,IACpCE,OAAO,KAAKC,SAAS,CACxB,EAAE;MACCU,KAAK,GAAGC,WAAW,CAAC;QAAA,OAAMF,WAAW,CAACd,aAAa,CAACG,SAAS,EAAEI,IAAI,CAACC,GAAG,CAAC,CAAC,CAAC,CAAC;MAAA,GAAE,IAAI,CAAC;IACtF;IAEA,OAAO,YAAM;MACT,IAAIO,KAAK,KAAKV,SAAS,EAAE;QACrBY,aAAa,CAACF,KAAK,CAAC;MACxB;IACJ,CAAC;EACL,CAAC,EAAE,CAACb,KAAK,EAAEC,SAAS,EAAEC,OAAO,CAAC,CAAC;EAE/B,OAAOS,QAAQ;AACnB,CAAC","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  import { DateTime } from '@gravity-ui/date-utils';
2
2
  type Date = DateTime | string | number | undefined;
3
3
  export declare const formatTime: (date: Date) => string | undefined;
4
- export declare const durationDates: (date1: Date, date2: Date) => string | undefined;
4
+ export declare const durationDates: (date1: Date, date2: Date) => string;
5
5
  export declare const formatTimeCanonical: (ts: Date) => string | undefined;
6
6
  export declare const formatDateCanonical: (ts: Date) => string | undefined;
7
7
  export declare const getTimestampFromDate: (date: Date) => number | undefined;
@@ -1,26 +1,31 @@
1
- import { dateTime, dateTimeParse } from '@gravity-ui/date-utils';
1
+ import "core-js/modules/es.array.concat.js";
2
+ import "core-js/modules/es.string.pad-start.js";
3
+ import { dateTimeParse } from '@gravity-ui/date-utils';
2
4
  export var formatTime = function formatTime(date) {
3
5
  var _dateTimeParse;
4
6
  return (_dateTimeParse = dateTimeParse(date)) === null || _dateTimeParse === void 0 ? void 0 : _dateTimeParse.format('HH:mm');
5
7
  };
6
8
  export var durationDates = function durationDates(date1, date2) {
7
- var _dateTimeParse2;
8
- if (!date1 && !date2) return '--:--';
9
- var start = dateTimeParse(date1) || dateTime();
10
- var end = dateTimeParse(date2) || dateTime();
11
- var diff = end === null || end === void 0 ? void 0 : end.diff(start);
12
- return (_dateTimeParse2 = dateTimeParse(diff)) === null || _dateTimeParse2 === void 0 ? void 0 : _dateTimeParse2.format('HH:mm');
9
+ if (date1 === undefined || date2 === undefined) return '--:--';
10
+ var start = dateTimeParse(date1);
11
+ var end = dateTimeParse(date2);
12
+ if (!start || !end) return '--:--';
13
+ var diffMs = Math.max(0, end.valueOf() - start.valueOf());
14
+ var totalMinutes = Math.floor(diffMs / 60000);
15
+ var hours = Math.floor(totalMinutes / 60);
16
+ var minutes = totalMinutes % 60;
17
+ return "".concat(String(hours).padStart(2, '0'), ":").concat(String(minutes).padStart(2, '0'));
13
18
  };
14
19
  export var formatTimeCanonical = function formatTimeCanonical(ts) {
15
- var _dateTimeParse3;
16
- return (_dateTimeParse3 = dateTimeParse(ts)) === null || _dateTimeParse3 === void 0 ? void 0 : _dateTimeParse3.format('DD.MM.YYYY, HH:mm');
20
+ var _dateTimeParse2;
21
+ return (_dateTimeParse2 = dateTimeParse(ts)) === null || _dateTimeParse2 === void 0 ? void 0 : _dateTimeParse2.format('DD.MM.YYYY, HH:mm');
17
22
  };
18
23
  export var formatDateCanonical = function formatDateCanonical(ts) {
19
- var _dateTimeParse4;
20
- return (_dateTimeParse4 = dateTimeParse(ts)) === null || _dateTimeParse4 === void 0 ? void 0 : _dateTimeParse4.format('DD.MM.YYYY');
24
+ var _dateTimeParse3;
25
+ return (_dateTimeParse3 = dateTimeParse(ts)) === null || _dateTimeParse3 === void 0 ? void 0 : _dateTimeParse3.format('DD.MM.YYYY');
21
26
  };
22
27
  export var getTimestampFromDate = function getTimestampFromDate(date) {
23
- var _dateTimeParse5;
24
- return (_dateTimeParse5 = dateTimeParse(date)) === null || _dateTimeParse5 === void 0 ? void 0 : _dateTimeParse5.valueOf();
28
+ var _dateTimeParse4;
29
+ return (_dateTimeParse4 = dateTimeParse(date)) === null || _dateTimeParse4 === void 0 ? void 0 : _dateTimeParse4.valueOf();
25
30
  };
26
31
  // #sourceMappingURL=time.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["dateTime","dateTimeParse","formatTime","date","_dateTimeParse","format","durationDates","date1","date2","_dateTimeParse2","start","end","diff","formatTimeCanonical","ts","_dateTimeParse3","formatDateCanonical","_dateTimeParse4","getTimestampFromDate","_dateTimeParse5","valueOf"],"sources":["time.ts"],"sourcesContent":["import {DateTime, dateTime, dateTimeParse} from '@gravity-ui/date-utils';\n\ntype Date = DateTime | string | number | undefined;\n\nexport const formatTime = (date: Date) => {\n return dateTimeParse(date)?.format('HH:mm');\n};\n\nexport const durationDates = (date1: Date, date2: Date) => {\n if (!date1 && !date2) return '--:--';\n\n const start = dateTimeParse(date1) || dateTime();\n const end = dateTimeParse(date2) || dateTime();\n const diff = end?.diff(start);\n\n return dateTimeParse(diff)?.format('HH:mm');\n};\n\nexport const formatTimeCanonical = (ts: Date) => {\n return dateTimeParse(ts)?.format('DD.MM.YYYY, HH:mm');\n};\n\nexport const formatDateCanonical = (ts: Date) => {\n return dateTimeParse(ts)?.format('DD.MM.YYYY');\n};\n\nexport const getTimestampFromDate = (date: Date) => {\n return dateTimeParse(date)?.valueOf();\n};\n"],"mappings":"AAAA,SAAkBA,QAAQ,EAAEC,aAAa,QAAO,wBAAwB;AAIxE,OAAO,IAAMC,UAAU,GAAG,SAAbA,UAAUA,CAAIC,IAAU,EAAK;EAAA,IAAAC,cAAA;EACtC,QAAAA,cAAA,GAAOH,aAAa,CAACE,IAAI,CAAC,cAAAC,cAAA,uBAAnBA,cAAA,CAAqBC,MAAM,CAAC,OAAO,CAAC;AAC/C,CAAC;AAED,OAAO,IAAMC,aAAa,GAAG,SAAhBA,aAAaA,CAAIC,KAAW,EAAEC,KAAW,EAAK;EAAA,IAAAC,eAAA;EACvD,IAAI,CAACF,KAAK,IAAI,CAACC,KAAK,EAAE,OAAO,OAAO;EAEpC,IAAME,KAAK,GAAGT,aAAa,CAACM,KAAK,CAAC,IAAIP,QAAQ,CAAC,CAAC;EAChD,IAAMW,GAAG,GAAGV,aAAa,CAACO,KAAK,CAAC,IAAIR,QAAQ,CAAC,CAAC;EAC9C,IAAMY,IAAI,GAAGD,GAAG,aAAHA,GAAG,uBAAHA,GAAG,CAAEC,IAAI,CAACF,KAAK,CAAC;EAE7B,QAAAD,eAAA,GAAOR,aAAa,CAACW,IAAI,CAAC,cAAAH,eAAA,uBAAnBA,eAAA,CAAqBJ,MAAM,CAAC,OAAO,CAAC;AAC/C,CAAC;AAED,OAAO,IAAMQ,mBAAmB,GAAG,SAAtBA,mBAAmBA,CAAIC,EAAQ,EAAK;EAAA,IAAAC,eAAA;EAC7C,QAAAA,eAAA,GAAOd,aAAa,CAACa,EAAE,CAAC,cAAAC,eAAA,uBAAjBA,eAAA,CAAmBV,MAAM,CAAC,mBAAmB,CAAC;AACzD,CAAC;AAED,OAAO,IAAMW,mBAAmB,GAAG,SAAtBA,mBAAmBA,CAAIF,EAAQ,EAAK;EAAA,IAAAG,eAAA;EAC7C,QAAAA,eAAA,GAAOhB,aAAa,CAACa,EAAE,CAAC,cAAAG,eAAA,uBAAjBA,eAAA,CAAmBZ,MAAM,CAAC,YAAY,CAAC;AAClD,CAAC;AAED,OAAO,IAAMa,oBAAoB,GAAG,SAAvBA,oBAAoBA,CAAIf,IAAU,EAAK;EAAA,IAAAgB,eAAA;EAChD,QAAAA,eAAA,GAAOlB,aAAa,CAACE,IAAI,CAAC,cAAAgB,eAAA,uBAAnBA,eAAA,CAAqBC,OAAO,CAAC,CAAC;AACzC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["dateTimeParse","formatTime","date","_dateTimeParse","format","durationDates","date1","date2","undefined","start","end","diffMs","Math","max","valueOf","totalMinutes","floor","hours","minutes","concat","String","padStart","formatTimeCanonical","ts","_dateTimeParse2","formatDateCanonical","_dateTimeParse3","getTimestampFromDate","_dateTimeParse4"],"sources":["time.ts"],"sourcesContent":["import {DateTime, dateTimeParse} from '@gravity-ui/date-utils';\n\ntype Date = DateTime | string | number | undefined;\n\nexport const formatTime = (date: Date) => {\n return dateTimeParse(date)?.format('HH:mm');\n};\n\nexport const durationDates = (date1: Date, date2: Date) => {\n if (date1 === undefined || date2 === undefined) return '--:--';\n\n const start = dateTimeParse(date1);\n const end = dateTimeParse(date2);\n\n if (!start || !end) return '--:--';\n\n const diffMs = Math.max(0, end.valueOf() - start.valueOf());\n const totalMinutes = Math.floor(diffMs / 60_000);\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;\n};\n\nexport const formatTimeCanonical = (ts: Date) => {\n return dateTimeParse(ts)?.format('DD.MM.YYYY, HH:mm');\n};\n\nexport const formatDateCanonical = (ts: Date) => {\n return dateTimeParse(ts)?.format('DD.MM.YYYY');\n};\n\nexport const getTimestampFromDate = (date: Date) => {\n return dateTimeParse(date)?.valueOf();\n};\n"],"mappings":";;AAAA,SAAkBA,aAAa,QAAO,wBAAwB;AAI9D,OAAO,IAAMC,UAAU,GAAG,SAAbA,UAAUA,CAAIC,IAAU,EAAK;EAAA,IAAAC,cAAA;EACtC,QAAAA,cAAA,GAAOH,aAAa,CAACE,IAAI,CAAC,cAAAC,cAAA,uBAAnBA,cAAA,CAAqBC,MAAM,CAAC,OAAO,CAAC;AAC/C,CAAC;AAED,OAAO,IAAMC,aAAa,GAAG,SAAhBA,aAAaA,CAAIC,KAAW,EAAEC,KAAW,EAAK;EACvD,IAAID,KAAK,KAAKE,SAAS,IAAID,KAAK,KAAKC,SAAS,EAAE,OAAO,OAAO;EAE9D,IAAMC,KAAK,GAAGT,aAAa,CAACM,KAAK,CAAC;EAClC,IAAMI,GAAG,GAAGV,aAAa,CAACO,KAAK,CAAC;EAEhC,IAAI,CAACE,KAAK,IAAI,CAACC,GAAG,EAAE,OAAO,OAAO;EAElC,IAAMC,MAAM,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEH,GAAG,CAACI,OAAO,CAAC,CAAC,GAAGL,KAAK,CAACK,OAAO,CAAC,CAAC,CAAC;EAC3D,IAAMC,YAAY,GAAGH,IAAI,CAACI,KAAK,CAACL,MAAM,GAAG,KAAM,CAAC;EAChD,IAAMM,KAAK,GAAGL,IAAI,CAACI,KAAK,CAACD,YAAY,GAAG,EAAE,CAAC;EAC3C,IAAMG,OAAO,GAAGH,YAAY,GAAG,EAAE;EAEjC,UAAAI,MAAA,CAAUC,MAAM,CAACH,KAAK,CAAC,CAACI,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,OAAAF,MAAA,CAAIC,MAAM,CAACF,OAAO,CAAC,CAACG,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAChF,CAAC;AAED,OAAO,IAAMC,mBAAmB,GAAG,SAAtBA,mBAAmBA,CAAIC,EAAQ,EAAK;EAAA,IAAAC,eAAA;EAC7C,QAAAA,eAAA,GAAOxB,aAAa,CAACuB,EAAE,CAAC,cAAAC,eAAA,uBAAjBA,eAAA,CAAmBpB,MAAM,CAAC,mBAAmB,CAAC;AACzD,CAAC;AAED,OAAO,IAAMqB,mBAAmB,GAAG,SAAtBA,mBAAmBA,CAAIF,EAAQ,EAAK;EAAA,IAAAG,eAAA;EAC7C,QAAAA,eAAA,GAAO1B,aAAa,CAACuB,EAAE,CAAC,cAAAG,eAAA,uBAAjBA,eAAA,CAAmBtB,MAAM,CAAC,YAAY,CAAC;AAClD,CAAC;AAED,OAAO,IAAMuB,oBAAoB,GAAG,SAAvBA,oBAAoBA,CAAIzB,IAAU,EAAK;EAAA,IAAA0B,eAAA;EAChD,QAAAA,eAAA,GAAO5B,aAAa,CAACE,IAAI,CAAC,cAAA0B,eAAA,uBAAnBA,eAAA,CAAqBd,OAAO,CAAC,CAAC;AACzC,CAAC","ignoreList":[]}
@@ -19,10 +19,11 @@
19
19
  }
20
20
  .qp-history-row__data {
21
21
  display: grid;
22
- grid-template-columns: 52px 1fr;
22
+ grid-template-columns: minmax(64px, max-content) 1fr;
23
23
  grid-gap: 8px;
24
24
  }
25
25
  .qp-history-row__duration {
26
26
  text-align: center;
27
+ white-space: nowrap;
27
28
  }
28
29
  /*# sourceMappingURL=HistoryRow.css.map */
@@ -1 +1 @@
1
- {"version":3,"sources":["HistoryRow.scss"],"names":[],"mappings":"AAAA;EACE,YAAA;EACA,aAAA;EACA,+BAAA;EACA,aAAA;EAAA,QAAA;AACF;AACE;EACE,mDAAA;AACJ;AAEE;EACE,cAAA;AAAJ;AAGE;EACE,YAAA;AADJ;AAIE;EACE,gBAAA;AAFJ;AAKE;EACE,aAAA;EACA,+BAAA;EACA,aAAA;AAHJ;AAME;EACE,kBAAA;AAJJ","file":"HistoryRow.css","sourcesContent":[".qp-history-row {\n height: 100%;\n display: grid;\n grid-template-columns: 20px 1fr;\n gap: 4px;\n\n &_compared {\n background-color: var(--g-color-base-utility-light);\n }\n\n &__icon {\n flex: 0 0 20px;\n }\n\n &__header {\n height: 20px;\n }\n\n &__right-column {\n overflow: hidden;\n }\n\n &__data {\n display: grid;\n grid-template-columns: 52px 1fr;\n grid-gap: 8px;\n }\n\n &__duration {\n text-align: center;\n }\n}\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["HistoryRow.scss"],"names":[],"mappings":"AAAA;EACE,YAAA;EACA,aAAA;EACA,+BAAA;EACA,aAAA;EAAA,QAAA;AACF;AACE;EACE,mDAAA;AACJ;AAEE;EACE,cAAA;AAAJ;AAGE;EACE,YAAA;AADJ;AAIE;EACE,gBAAA;AAFJ;AAKE;EACE,aAAA;EACA,oDAAA;EACA,aAAA;AAHJ;AAME;EACE,kBAAA;EACA,mBAAA;AAJJ","file":"HistoryRow.css","sourcesContent":[".qp-history-row {\n height: 100%;\n display: grid;\n grid-template-columns: 20px 1fr;\n gap: 4px;\n\n &_compared {\n background-color: var(--g-color-base-utility-light);\n }\n\n &__icon {\n flex: 0 0 20px;\n }\n\n &__header {\n height: 20px;\n }\n\n &__right-column {\n overflow: hidden;\n }\n\n &__data {\n display: grid;\n grid-template-columns: minmax(64px, max-content) 1fr;\n grid-gap: 8px;\n }\n\n &__duration {\n text-align: center;\n white-space: nowrap;\n }\n}\n"],"sourceRoot":""}
@@ -50,7 +50,7 @@ export var HistoryRow = function HistoryRow(_ref) {
50
50
  })]
51
51
  }), /*#__PURE__*/_jsxs("div", {
52
52
  className: block('data'),
53
- children: [isFieldVisible(visibleFields, 'duration') && startTime && /*#__PURE__*/_jsx(QueryDuration, {
53
+ children: [isFieldVisible(visibleFields, 'duration') && startTime !== undefined && /*#__PURE__*/_jsx(QueryDuration, {
54
54
  className: block('duration'),
55
55
  status: status,
56
56
  startTime: startTime,
@@ -60,7 +60,7 @@ export var HistoryRow = function HistoryRow(_ref) {
60
60
  children: [isFieldVisible(visibleFields, 'mode') && mode && /*#__PURE__*/_jsx(Text, {
61
61
  color: "complementary",
62
62
  children: mode
63
- }), isFieldVisible(visibleFields, 'startTime') && startTime && /*#__PURE__*/_jsx(Text, {
63
+ }), isFieldVisible(visibleFields, 'startTime') && startTime !== undefined && /*#__PURE__*/_jsx(Text, {
64
64
  color: "complementary",
65
65
  children: formatTime(startTime)
66
66
  }), isFieldVisible(visibleFields, 'engine') && engine && /*#__PURE__*/_jsx(Text, {