diff --git a/cassandra-distributed-task-queue-ui/package.json b/cassandra-distributed-task-queue-ui/package.json index eeb4bc36..554b01ba 100644 --- a/cassandra-distributed-task-queue-ui/package.json +++ b/cassandra-distributed-task-queue-ui/package.json @@ -37,12 +37,13 @@ }, "peerDependencies": { "@skbkontur/icons": ">=1 <2", - "@skbkontur/react-ui": ">=2 <=4", + "@skbkontur/react-ui": ">=4", "react": ">=16 <=18", "react-dom": ">=16 <=18", "react-router-dom": ">=6" }, "dependencies": { + "@skbkontur/edi-ui": "^0.2.4", "@skbkontur/react-stack-layout": "^1.0.3", "copy-to-clipboard": "^3.3.1", "date-fns": "^2.29.2", @@ -54,7 +55,7 @@ }, "devDependencies": { "@skbkontur/icons": "^1.3.0", - "@skbkontur/react-ui": "^4.1.0", + "@skbkontur/react-ui": "^4.22.0", "@storybook/addon-actions": "^7.0.7", "@storybook/addons": "^7.0.7", "@storybook/cli": "^7.4.6", diff --git a/cassandra-distributed-task-queue-ui/src/Domain/CustomRenderer.ts b/cassandra-distributed-task-queue-ui/src/Domain/CustomRenderer.ts index 2326b40e..9af128f8 100644 --- a/cassandra-distributed-task-queue-ui/src/Domain/CustomRenderer.ts +++ b/cassandra-distributed-task-queue-ui/src/Domain/CustomRenderer.ts @@ -1,8 +1,9 @@ +import { TimeUtils } from "@skbkontur/edi-ui"; + import { RangeSelector } from "../components/DateTimeRangePicker/RangeSelector"; import { RtqMonitoringSearchRequest } from "./Api/RtqMonitoringSearchRequest"; import { RtqMonitoringTaskModel } from "./Api/RtqMonitoringTaskModel"; -import { TimeUtils } from "./Utils/TimeUtils"; export interface ICustomRenderer { renderDetails: (target: any, path: string[]) => null | JSX.Element; diff --git a/cassandra-distributed-task-queue-ui/src/Domain/DataTypes/DateTimeRange.ts b/cassandra-distributed-task-queue-ui/src/Domain/DataTypes/DateTimeRange.ts index 95e4fc9b..35f826ce 100644 --- a/cassandra-distributed-task-queue-ui/src/Domain/DataTypes/DateTimeRange.ts +++ b/cassandra-distributed-task-queue-ui/src/Domain/DataTypes/DateTimeRange.ts @@ -1,5 +1,3 @@ -export type RussianDateFormat = string; - export interface DateTimeRange { lowerBound: Nullable; upperBound: Nullable; diff --git a/cassandra-distributed-task-queue-ui/src/Domain/DataTypes/Time.ts b/cassandra-distributed-task-queue-ui/src/Domain/DataTypes/Time.ts deleted file mode 100644 index d21d4a0b..00000000 --- a/cassandra-distributed-task-queue-ui/src/Domain/DataTypes/Time.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type Time = string; -export type TimeZone = 0 | 180 | 300; -export type Ticks = string; diff --git a/cassandra-distributed-task-queue-ui/src/Domain/QueryStringMapping/Mappers.ts b/cassandra-distributed-task-queue-ui/src/Domain/QueryStringMapping/Mappers.ts index 899be364..bb82b702 100644 --- a/cassandra-distributed-task-queue-ui/src/Domain/QueryStringMapping/Mappers.ts +++ b/cassandra-distributed-task-queue-ui/src/Domain/QueryStringMapping/Mappers.ts @@ -1,13 +1,14 @@ +import { DateUtils } from "@skbkontur/edi-ui"; import { endOfDay, isValid, parse as parseDateInternal, startOfDay } from "date-fns"; import difference from "lodash/difference"; import { DateTimeRange } from "../DataTypes/DateTimeRange"; -import { DateUtils } from "../Utils/DateUtils"; export type QueryObject = any; export interface Mapper { parse(parsedQueryString: QueryObject): Nullable; + stringify(parsedQueryString: QueryObject, value: Nullable): QueryObject; } @@ -132,7 +133,7 @@ export class DateTimeRangeMapper { } public stringifyDate(value: Nullable): Nullable { - return value ? DateUtils.convertDateToString(value, undefined, "yyyy-MM-dd") : undefined; + return value ? DateUtils.formatDate(value, "yyyy-MM-dd") : undefined; } public parse(parsedQueryString: QueryObject): Nullable { diff --git a/cassandra-distributed-task-queue-ui/src/Domain/QueryStringMapping/QueryStringMappingBuilder.ts b/cassandra-distributed-task-queue-ui/src/Domain/QueryStringMapping/QueryStringMappingBuilder.ts index fa6536bb..c8fea8b6 100644 --- a/cassandra-distributed-task-queue-ui/src/Domain/QueryStringMapping/QueryStringMappingBuilder.ts +++ b/cassandra-distributed-task-queue-ui/src/Domain/QueryStringMapping/QueryStringMappingBuilder.ts @@ -1,5 +1,6 @@ +import { Lens, pathLens, PropertyPicker } from "@skbkontur/edi-ui"; + import { DateTimeRange } from "../DataTypes/DateTimeRange"; -import { Lens, pathLens, PropertyPicker } from "../lens"; import { Mapper, IntegerMapper, StringArrayMapper, DateTimeRangeMapper, StringMapper, SetMapper } from "./Mappers"; import { Parser, QueryStringMapping, Stringifier } from "./QueryStringMapping"; diff --git a/cassandra-distributed-task-queue-ui/src/Domain/RtqMonitoringSearchRequestUtils.tsx b/cassandra-distributed-task-queue-ui/src/Domain/RtqMonitoringSearchRequestUtils.tsx index 05dbe2d8..d29059be 100644 --- a/cassandra-distributed-task-queue-ui/src/Domain/RtqMonitoringSearchRequestUtils.tsx +++ b/cassandra-distributed-task-queue-ui/src/Domain/RtqMonitoringSearchRequestUtils.tsx @@ -1,8 +1,9 @@ +import { TimeUtils } from "@skbkontur/edi-ui"; + import { RangeSelector } from "../components/DateTimeRangePicker/RangeSelector"; import { RtqMonitoringSearchRequest } from "./Api/RtqMonitoringSearchRequest"; import { DateTimeRange } from "./DataTypes/DateTimeRange"; -import { TimeUtils } from "./Utils/TimeUtils"; function isDateTimeRangeEmpty(range: Nullable): boolean { return !(range && (range.lowerBound || range.upperBound)); diff --git a/cassandra-distributed-task-queue-ui/src/Domain/Utils/ConvertTimeUtil.tsx b/cassandra-distributed-task-queue-ui/src/Domain/Utils/ConvertTimeUtil.tsx index a3c5f503..4436b047 100644 --- a/cassandra-distributed-task-queue-ui/src/Domain/Utils/ConvertTimeUtil.tsx +++ b/cassandra-distributed-task-queue-ui/src/Domain/Utils/ConvertTimeUtil.tsx @@ -1,9 +1,9 @@ import Decimal from "decimal.js"; -export function ticksToMilliseconds(timeStr: Nullable): Nullable { +export const ticksToMilliseconds = (timeStr: Nullable): Nullable => { if (!timeStr) { return null; } const commonTime = new Decimal(timeStr); return commonTime.div(10000).toString(); -} +}; diff --git a/cassandra-distributed-task-queue-ui/src/Domain/Utils/DateUtils.ts b/cassandra-distributed-task-queue-ui/src/Domain/Utils/DateUtils.ts deleted file mode 100644 index 9e4b2a87..00000000 --- a/cassandra-distributed-task-queue-ui/src/Domain/Utils/DateUtils.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { addMinutes, format, parse, subMinutes } from "date-fns"; - -import { RussianDateFormat } from "../DataTypes/DateTimeRange"; -import { TimeZone } from "../DataTypes/Time"; - -export class DateUtils { - private static readonly datePickerFormat: RussianDateFormat = "dd.MM.yyyy"; - - public static isCorrectTime(time: string): boolean { - return Boolean(time.match(/^([01]?[0-9]|2[0-3]):[0-5][0-9]/)); - } - - public static convertDateToString( - date: Date | string, - timeZone: number | undefined, - dateformat: string = this.datePickerFormat - ): string { - const zonedDate = timeZone == undefined ? new Date(date) : this.toTimeZone(new Date(date), timeZone); - return format(zonedDate, dateformat); - } - - public static convertStringToDate(date: RussianDateFormat): Date { - return parse(date, this.datePickerFormat, new Date()); - } - - public static toTimeZone(date: Date | string, timeZone: TimeZone | number): Date { - const dateDate = new Date(date); - return addMinutes(dateDate, dateDate.getTimezoneOffset() + timeZone); - } - - public static fromLocalToUtc(date: Date | string): Date { - const dateDate = new Date(date); - return subMinutes(dateDate, dateDate.getTimezoneOffset()); - } -} diff --git a/cassandra-distributed-task-queue-ui/src/Domain/Utils/StringUtils.tsx b/cassandra-distributed-task-queue-ui/src/Domain/Utils/StringUtils.tsx deleted file mode 100644 index c79b6434..00000000 --- a/cassandra-distributed-task-queue-ui/src/Domain/Utils/StringUtils.tsx +++ /dev/null @@ -1,5 +0,0 @@ -export class StringUtils { - public static isNullOrWhitespace(value: Nullable): value is null | undefined | "" { - return value === null || value === undefined || value.trim() === ""; - } -} diff --git a/cassandra-distributed-task-queue-ui/src/Domain/Utils/TimeUtils.ts b/cassandra-distributed-task-queue-ui/src/Domain/Utils/TimeUtils.ts deleted file mode 100644 index 3f6af6e5..00000000 --- a/cassandra-distributed-task-queue-ui/src/Domain/Utils/TimeUtils.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Ticks, TimeZone } from "../DataTypes/Time"; - -export class TimeUtils { - public static TimeZones: { [x: string]: TimeZone } = { - UTC: 0, - Moscow: 180, - Yekaterinburg: 300, - }; - - public static ticksToDate(value: Ticks): Date { - const unixTimestamp = (parseInt(value, 10) - 621355968000000000) / 10000; - return new Date(unixTimestamp); - } - - public static dateToTicks(value: Date): Ticks { - return (value.getTime() * 10000 + 621355968000000000).toString(); - } - - public static getAllTimeZones(): TimeZone[] { - return [this.TimeZones.UTC, this.TimeZones.Moscow, this.TimeZones.Yekaterinburg]; - } - - public static getTimeZoneOffsetOrDefault(timeZone?: Nullable): number { - return timeZone != null ? timeZone : -new Date().getTimezoneOffset(); - } - - public static timeZoneOffsetToString(timeZoneOffset: number): string { - const { floor, abs } = Math; - const hours = this.padLeft(String(floor(abs(timeZoneOffset) / 60))); - const minutes = this.padLeft(String(abs(timeZoneOffset) % 60)); - return `${timeZoneOffset < 0 ? "-" : "+"}${hours}:${minutes}`; - } - - private static readonly padLeft = (str: string) => "00".substring(0, "00".length - str.length) + str; -} diff --git a/cassandra-distributed-task-queue-ui/src/Domain/lens.ts b/cassandra-distributed-task-queue-ui/src/Domain/lens.ts deleted file mode 100644 index 6f0c7a82..00000000 --- a/cassandra-distributed-task-queue-ui/src/Domain/lens.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* eslint-disable no-useless-escape */ -import get from "lodash/get"; - -export type PropertyPicker = (x: T) => V; - -export interface Lens { - get(target: T): TResult; - set(target: T, value: TResult): T; -} - -export function pathLens(propertyPicker: (target: TTarget) => TProp): Lens { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - const fieldsString = /(?:return|=>)[^{}()]*?\.([^{}()]*?)([;})]|$)/.exec(propertyPicker.toString())[1]; - return { - get: (x: TTarget) => get(x, fieldsString), - set: (x: TTarget, value: TProp) => { - return fieldsString - .split(".") - .reduce((result: any[], path: string, index: number) => { - const target = result[index - 1] ? result[index - 1][2] : x; - return [...result, [path, target, target == null ? null : target[path]]]; - }, []) - .reduceRight((nextValue, [path, target]) => { - return { - ...target, - [path]: nextValue, - }; - }, value); - }, - }; -} diff --git a/cassandra-distributed-task-queue-ui/src/components/Accordion/Accordion.styles.ts b/cassandra-distributed-task-queue-ui/src/components/Accordion/Accordion.styles.ts deleted file mode 100644 index cc2f761d..00000000 --- a/cassandra-distributed-task-queue-ui/src/components/Accordion/Accordion.styles.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { css } from "@skbkontur/react-ui/lib/theming/Emotion"; -import { Theme } from "@skbkontur/react-ui/lib/theming/Theme"; - -import { baseSize } from "../Layouts/CommonLayout.styles"; - -export const jsStyles = { - valueWrapper(): string { - return css` - padding-left: ${4 * baseSize}px; - `; - }, - - titleBlockHasTitle(t: Theme): string { - return css` - &:hover a { - color: ${t.linkColor}; - } - `; - }, - - toggleAllLink(): string { - return css` - display: inline-block; - margin-left: ${2 * baseSize}px; - `; - }, - - stringWrapper(t: Theme): string { - return css` - padding: ${baseSize}px 0 ${baseSize}px ${4 * baseSize}px; - - & + .stringWrapper { - border-top: 1px solid ${t.borderColorGrayLight}; - } - `; - }, - - toggleButton(): string { - return css` - color: inherit; - font-size: inherit; - font-family: inherit; - background: none; - border: none; - padding: ${baseSize}px 0; - margin-left: ${-4 * baseSize}px; - cursor: pointer; - outline: none; - text-transform: capitalize; - `; - }, - - toggleButtonText(): string { - return css` - margin-left: ${baseSize}px; - `; - }, - - title(): string { - return css` - text-transform: capitalize; - min-width: 140px; - display: inline-block; - padding-right: ${2 * baseSize}px; - `; - }, - - value(): string { - return css` - min-width: 1%; - word-wrap: break-word; - `; - }, - - mutedKeyword(t: Theme): string { - return css` - color: ${t.textColorDisabled}; - `; - }, -}; diff --git a/cassandra-distributed-task-queue-ui/src/components/Accordion/Accordion.tsx b/cassandra-distributed-task-queue-ui/src/components/Accordion/Accordion.tsx deleted file mode 100644 index 0a708aaf..00000000 --- a/cassandra-distributed-task-queue-ui/src/components/Accordion/Accordion.tsx +++ /dev/null @@ -1,250 +0,0 @@ -import { ArrowShapeTriangleADownIcon16Regular } from "@skbkontur/icons/ArrowShapeTriangleADownIcon16Regular"; -import { ArrowShapeTriangleARightIcon16Regular } from "@skbkontur/icons/ArrowShapeTriangleARightIcon16Regular"; -import { Fill, Fit, RowStack } from "@skbkontur/react-stack-layout"; -import { ThemeContext, Hint, Link } from "@skbkontur/react-ui"; -import { Theme } from "@skbkontur/react-ui/lib/theming/Theme"; -import isArray from "lodash/isArray"; -import isEqual from "lodash/isEqual"; -import isPlainObject from "lodash/isPlainObject"; -import React from "react"; - -import { jsStyles } from "./Accordion.styles"; - -type CaptionRenderer = (path: string[]) => null | string; -type ValueRenderer = (target: { [key: string]: any }, path: string[]) => null | JSX.Element; - -export interface TaskAccordionProps { - renderCaption: null | CaptionRenderer; - renderValue: null | ValueRenderer; - value: { [key: string]: any }; - title: null | string; - pathPrefix?: string[]; - defaultCollapsed?: boolean; - showToggleAll?: boolean; - _internalForceCollapsed?: boolean; // internal prop for recursive behaviour -} - -interface TaskAccordionState { - collapsedSelf: boolean; - collapsedRecursive: boolean; - isForced: boolean; -} - -export class Accordion extends React.Component { - public static defaultProps = { - pathPrefix: [], - }; - - private theme!: Theme; - - public constructor(props: TaskAccordionProps) { - super(props); - const canCollapseSelf = props.title != null; - const defaultCollapsedValue = props.defaultCollapsed || false; - const collapsed = canCollapseSelf && defaultCollapsedValue; - - if (props._internalForceCollapsed !== undefined) { - this.state = { - collapsedSelf: props._internalForceCollapsed, - collapsedRecursive: props._internalForceCollapsed, - isForced: props._internalForceCollapsed, - }; - } else { - this.state = { - collapsedSelf: collapsed, - collapsedRecursive: defaultCollapsedValue, - isForced: false, - }; - } - } - - public shouldComponentUpdate(nextProps: TaskAccordionProps, nextState: TaskAccordionState): boolean { - const isValueChanged = !isEqual(this.props.value, nextProps.value); - const isForceCollapsedChanged = this.props._internalForceCollapsed !== nextProps._internalForceCollapsed; - const isDefaultCollapsedChanged = this.props.defaultCollapsed !== nextProps.defaultCollapsed; - const isStateChanged = !isEqual(this.state, nextState); - return isValueChanged || isForceCollapsedChanged || isDefaultCollapsedChanged || isStateChanged; - } - - public componentDidUpdate(prevProps: TaskAccordionProps): void { - const isForcedRecursively = this.props._internalForceCollapsed !== undefined; - if (isForcedRecursively && this.props._internalForceCollapsed !== prevProps._internalForceCollapsed) { - this.setState({ - collapsedSelf: this.props._internalForceCollapsed as boolean, - collapsedRecursive: this.props._internalForceCollapsed as boolean, - isForced: true, - }); - } - if (this.props.defaultCollapsed !== prevProps.defaultCollapsed) { - this.setState({ - collapsedSelf: this.props.defaultCollapsed as boolean, - collapsedRecursive: this.props.defaultCollapsed as boolean, - isForced: true, - }); - } - } - - public render(): JSX.Element { - return ( - - {theme => { - this.theme = theme; - return this.renderMain(); - }} - - ); - } - - public renderMain(): JSX.Element { - const { showToggleAll, value, title } = this.props; - const { collapsedSelf, collapsedRecursive } = this.state; - - const isToggleLinkVisible = showToggleAll && this.isThereItemsToToggleAtFirstLevel(); - const showTitleBlock = title != null || isToggleLinkVisible; - return ( -
- {showTitleBlock && ( - - {this.renderTitle()} - {isToggleLinkVisible && ( - - - {collapsedRecursive ? "Развернуть всё" : "Свернуть всё"} - - - )} - - )} - {value && !collapsedSelf && this.renderValue()} -
- ); - } - - public renderValue(): JSX.Element[] { - const { value, renderCaption, renderValue, pathPrefix = [], defaultCollapsed } = this.props; - const { collapsedRecursive, isForced } = this.state; - const keys = Object.keys(value); - - let defaultCollapsedValue = true; - let forceCollapsedValue: undefined | boolean; - - if (isForced) { - defaultCollapsedValue = collapsedRecursive; - forceCollapsedValue = collapsedRecursive; - } else { - defaultCollapsedValue = defaultCollapsed || false; - forceCollapsedValue = undefined; - } - - return keys.map(key => { - const valueToRender = value[key]; - if (isPlainObject(valueToRender) || isArray(valueToRender)) { - const newValueRender: null | ValueRenderer = - renderValue != null ? (target, path) => renderValue(value, [key, ...path]) : null; - - const newCaptionRenderer: null | CaptionRenderer = - renderCaption != null ? path => renderCaption([key, ...path]) : null; - - return ( - - ); - } - return ( - - - {this.renderItemTitle(key, [key])}: - - - {(renderValue && renderValue(value, [key])) || - (Array.isArray(value[key]) ? value[key].join(", ") : String(value[key]))} - - - ); - }); - } - - private readonly renderItemTitle = (title: string | null, path: string[]) => { - const { renderCaption } = this.props; - const caption = renderCaption?.(path); - if (caption != null) { - return {title}; - } - return title; - }; - - private readonly renderTitle = () => { - const { title, renderCaption } = this.props; - const { collapsedSelf } = this.state; - if (title == null) { - return null; - } - const caption = renderCaption?.([]); - return ( - - - - - {caption && ( - - {caption} - - )} - - ); - }; - - private readonly toggleCollapseManual = () => { - this.setState(state => ({ collapsedSelf: !state.collapsedSelf, isForced: false })); - }; - - private readonly toggleCollapseAll = () => { - const { title } = this.props; - const needToggleFirstLevel = title != null; - this.setState(state => ({ - collapsedSelf: needToggleFirstLevel ? !state.collapsedRecursive : state.collapsedSelf, - collapsedRecursive: !state.collapsedRecursive, - isForced: true, - })); - }; - - private getPath(pathPrefix: string[], key: string): string { - return [...pathPrefix, key].join("_").replace("[", "").replace("]", ""); - } - - private readonly isThereItemsToToggleAtFirstLevel = (): boolean => - Object.values(this.props.value).some(item => isPlainObject(item) || isArray(item)); -} diff --git a/cassandra-distributed-task-queue-ui/src/components/AllowCopyToClipboard.tsx b/cassandra-distributed-task-queue-ui/src/components/AllowCopyToClipboard.tsx deleted file mode 100644 index eb9e0b4a..00000000 --- a/cassandra-distributed-task-queue-ui/src/components/AllowCopyToClipboard.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { CopyIcon16Regular } from "@skbkontur/icons/CopyIcon16Regular"; -import { Link, Toast } from "@skbkontur/react-ui"; -import copy from "copy-to-clipboard"; -import React, { PropsWithChildren } from "react"; - -import { StringUtils } from "../Domain/Utils/StringUtils"; - -export class CopyToClipboardToast { - public static copyText(value: string): void { - copy(value); - Toast.push("Скопировано в буфер"); - } -} - -export class AllowCopyToClipboard extends React.Component> { - public children: null | HTMLSpanElement = null; - - public render(): JSX.Element { - return ( - - (this.children = x)}>{this.props.children}{" "} - } onClick={this.handleCopy} /> - - ); - } - - private readonly handleCopy = () => { - if (this.children && !StringUtils.isNullOrWhitespace(this.children.innerText)) { - CopyToClipboardToast.copyText(this.children.innerText); - } - }; -} diff --git a/cassandra-distributed-task-queue-ui/src/components/DateTimeRangePicker/DatePicker.tsx b/cassandra-distributed-task-queue-ui/src/components/DateTimeRangePicker/DatePicker.tsx index 0b012c56..9b431af0 100644 --- a/cassandra-distributed-task-queue-ui/src/components/DateTimeRangePicker/DatePicker.tsx +++ b/cassandra-distributed-task-queue-ui/src/components/DateTimeRangePicker/DatePicker.tsx @@ -1,12 +1,7 @@ +import { StringUtils, TimeUtils, TimeZone, Time, DateUtils, RussianDateFormat } from "@skbkontur/edi-ui"; import { DatePicker as DefaultDatePicker } from "@skbkontur/react-ui"; import React from "react"; -import { RussianDateFormat } from "../../Domain/DataTypes/DateTimeRange"; -import { Time, TimeZone } from "../../Domain/DataTypes/Time"; -import { DateUtils } from "../../Domain/Utils/DateUtils"; -import { StringUtils } from "../../Domain/Utils/StringUtils"; -import { TimeUtils } from "../../Domain/Utils/TimeUtils"; - interface DatePickerProps { value: Nullable; onChange: (value: Nullable) => void; @@ -88,8 +83,8 @@ export class DatePicker extends React.Component { const { timeZone } = this.props; - const date = DateUtils.convertStringToDate(newStringifiedDate); - const ISODate = DateUtils.convertDateToString(date, undefined, "yyyy-MM-dd"); + const date = DateUtils.formatDate(newStringifiedDate, "dd.MM.yyyy"); + const ISODate = DateUtils.formatDate(date, "yyyy-MM-dd"); const time = this.props.defaultTime || defaultTime; const timeZoneOffset = TimeUtils.getTimeZoneOffsetOrDefault(timeZone); return new Date(`${ISODate}T${time}${TimeUtils.timeZoneOffsetToString(timeZoneOffset)}`); @@ -97,6 +92,6 @@ export class DatePicker extends React.Component, timeZone?: number) => { const timeZoneOffset = TimeUtils.getTimeZoneOffsetOrDefault(timeZone); - return date ? DateUtils.convertDateToString(date, timeZoneOffset) : ""; + return date ? DateUtils.formatDate(date, "dd.MM.yyyy", timeZoneOffset) : ""; }; } diff --git a/cassandra-distributed-task-queue-ui/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx b/cassandra-distributed-task-queue-ui/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx index ca36dbbf..8c499ac2 100644 --- a/cassandra-distributed-task-queue-ui/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx +++ b/cassandra-distributed-task-queue-ui/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx @@ -1,10 +1,9 @@ +import { TimeUtils, TimeZone } from "@skbkontur/edi-ui"; import { ColumnStack, Fit } from "@skbkontur/react-stack-layout"; import { ThemeContext } from "@skbkontur/react-ui"; import React from "react"; import { DateTimeRange } from "../../Domain/DataTypes/DateTimeRange"; -import { TimeZone } from "../../Domain/DataTypes/Time"; -import { TimeUtils } from "../../Domain/Utils/TimeUtils"; import { DatePicker } from "./DatePicker"; import { jsStyles } from "./DateTimeRangePicker.styles"; diff --git a/cassandra-distributed-task-queue-ui/src/components/DateTimeRangePicker/RangeSelector.tsx b/cassandra-distributed-task-queue-ui/src/components/DateTimeRangePicker/RangeSelector.tsx index 5bec1605..472fceeb 100644 --- a/cassandra-distributed-task-queue-ui/src/components/DateTimeRangePicker/RangeSelector.tsx +++ b/cassandra-distributed-task-queue-ui/src/components/DateTimeRangePicker/RangeSelector.tsx @@ -1,9 +1,7 @@ +import { TimeUtils, DateUtils, TimeZone } from "@skbkontur/edi-ui"; import { endOfDay, startOfDay, subDays, subMonths, subYears } from "date-fns"; import { DateTimeRange } from "../../Domain/DataTypes/DateTimeRange"; -import { TimeZone } from "../../Domain/DataTypes/Time"; -import { DateUtils } from "../../Domain/Utils/DateUtils"; -import { TimeUtils } from "../../Domain/Utils/TimeUtils"; function utc(): Date { return DateUtils.toTimeZone(new Date(), TimeUtils.TimeZones.UTC); diff --git a/cassandra-distributed-task-queue-ui/src/components/DateTimeView/DateTimeView.styles.ts b/cassandra-distributed-task-queue-ui/src/components/DateTimeView/DateTimeView.styles.ts deleted file mode 100644 index ca78a1d7..00000000 --- a/cassandra-distributed-task-queue-ui/src/components/DateTimeView/DateTimeView.styles.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { css } from "@skbkontur/react-ui/lib/theming/Emotion"; - -export const jsStyles = { - timezone(): string { - return css` - cursor: pointer; - text-decoration: underline; - `; - }, -}; diff --git a/cassandra-distributed-task-queue-ui/src/components/DateTimeView/DateTimeView.tsx b/cassandra-distributed-task-queue-ui/src/components/DateTimeView/DateTimeView.tsx deleted file mode 100644 index f9770d46..00000000 --- a/cassandra-distributed-task-queue-ui/src/components/DateTimeView/DateTimeView.tsx +++ /dev/null @@ -1,173 +0,0 @@ -import { Button, RadioGroup, Tooltip } from "@skbkontur/react-ui"; -import React from "react"; - -import { Ticks, TimeZone } from "../../Domain/DataTypes/Time"; -import { DateUtils } from "../../Domain/Utils/DateUtils"; -import { TimeUtils } from "../../Domain/Utils/TimeUtils"; - -import { jsStyles } from "./DateTimeView.styles"; - -interface DateTimeViewProps { - value: Nullable; -} - -interface DateTimeViewState { - timezone: TimeZone; - defaultTimezone: TimeZone; -} - -class LocalStorageUtils { - public static getNumberOrDefault(key: string, defaultValue: number): number { - try { - const value = localStorage.getItem(key); - if (value == null) { - return defaultValue; - } - const result = JSON.parse(value); - if (result != null && typeof result === "number") { - return result; - } - return defaultValue; - } catch (e) { - return defaultValue; - } - } -} - -type Action = () => void; - -class DateTimeViewStorage { - public callbacks: Action[] = []; - public timezone: TimeZone | null = null; - - public set(timezone: TimeZone) { - this.timezone = timezone; - try { - localStorage.setItem("RemoteTaskQueueMonitoring.DateTimeView.TimeZone", JSON.stringify(timezone)); - } catch (e) { - // Если ничего не вышло, то и ладно - } - for (const callback of this.callbacks) { - callback(); - } - } - - public get(): TimeZone { - if (this.timezone == null) { - const result = LocalStorageUtils.getNumberOrDefault( - "RemoteTaskQueueMonitoring.DateTimeView.TimeZone", - TimeUtils.TimeZones.UTC - ); - if (result === 0 || result === 180 || result === 300) { - this.timezone = result; - return result; - } - this.timezone = TimeUtils.TimeZones.UTC; - return TimeUtils.TimeZones.UTC; - } - return this.timezone; - } - - public subscribe(callback: () => void) { - this.callbacks.push(callback); - } - - public unsubscribe(callback: () => void) { - const index = this.callbacks.indexOf(callback); - if (index >= 0) { - this.callbacks.splice(index, 1); - } - } -} - -const storage = new DateTimeViewStorage(); - -export class DateTimeView extends React.Component { - public state: DateTimeViewState = { - defaultTimezone: storage.get(), - timezone: storage.get(), - }; - - private handleUpdateGlobalTimeZone = () => { - this.setState({ - defaultTimezone: storage.get(), - timezone: storage.get(), - }); - }; - - public componentDidMount(): void { - storage.subscribe(this.handleUpdateGlobalTimeZone); - } - - public componentWillUnmount(): void { - storage.unsubscribe(this.handleUpdateGlobalTimeZone); - } - - public getTimeZoneShortName(timezone: TimeZone): string { - switch (timezone) { - case 0: - return "UTC"; - case 180: - return "МСК"; - case 300: - return "ЕКБ"; - default: - throw new Error("OutOfRange"); - } - } - - public renderWithTimeZone(timezone: TimeZone): string { - const { value } = this.props; - return DateUtils.convertDateToString( - value ? TimeUtils.ticksToDate(value) : new Date(), - timezone, - "dd.MM.yyyy HH:mm:ss.SSS" - ); - } - - private handleChangeDefault() { - storage.set(this.state.timezone); - } - - public selectTimeZone(): JSX.Element { - return ( -
-
- - items={TimeUtils.getAllTimeZones()} - value={this.state.timezone} - data-tid="TimeZones" - onValueChange={value => this.setState({ timezone: value })} - renderItem={value => ( - <> - {this.renderWithTimeZone(value)} ({this.getTimeZoneShortName(value)}) - - )} - /> -
-
- -
-
- ); - } - - public render(): JSX.Element { - const { defaultTimezone } = this.state; - const { value } = this.props; - if (!value) { - return -; - } - return ( - - {this.renderWithTimeZone(defaultTimezone)} ( - this.selectTimeZone()} trigger="click" pos="right top"> - {this.getTimeZoneShortName(defaultTimezone)} - - ) - - ); - } -} diff --git a/cassandra-distributed-task-queue-ui/src/components/ErrorHandling/ErrorHandlingContainerModal.tsx b/cassandra-distributed-task-queue-ui/src/components/ErrorHandling/ErrorHandlingContainerModal.tsx index f6c49dae..6dc308f0 100644 --- a/cassandra-distributed-task-queue-ui/src/components/ErrorHandling/ErrorHandlingContainerModal.tsx +++ b/cassandra-distributed-task-queue-ui/src/components/ErrorHandling/ErrorHandlingContainerModal.tsx @@ -1,11 +1,10 @@ +import { CopyToClipboardToast } from "@skbkontur/edi-ui"; import { CopyIcon16Regular } from "@skbkontur/icons/CopyIcon16Regular"; import { Fit, RowStack } from "@skbkontur/react-stack-layout"; import { Button, Link, Modal, ThemeContext } from "@skbkontur/react-ui"; import { Theme } from "@skbkontur/react-ui/lib/theming/Theme"; import React from "react"; -import { CopyToClipboardToast } from "../AllowCopyToClipboard"; - import { jsStyles } from "./ErrorHandlingContainer.styles"; interface ErrorHandlingContainerModalState { diff --git a/cassandra-distributed-task-queue-ui/src/components/TaskChainTree/TaskChainTree.tsx b/cassandra-distributed-task-queue-ui/src/components/TaskChainTree/TaskChainTree.tsx index 5dc0fa1a..3817f9f3 100644 --- a/cassandra-distributed-task-queue-ui/src/components/TaskChainTree/TaskChainTree.tsx +++ b/cassandra-distributed-task-queue-ui/src/components/TaskChainTree/TaskChainTree.tsx @@ -1,3 +1,4 @@ +import { AllowCopyToClipboard } from "@skbkontur/edi-ui"; import { ColumnStack, Fit } from "@skbkontur/react-stack-layout"; import { ThemeContext } from "@skbkontur/react-ui"; import reverse from "lodash/reverse"; @@ -7,7 +8,6 @@ import React from "react"; import { Location } from "react-router-dom"; import { RtqMonitoringTaskModel } from "../../Domain/Api/RtqMonitoringTaskModel"; -import { AllowCopyToClipboard } from "../AllowCopyToClipboard"; import { RouterLink } from "../RouterLink/RouterLink"; import { TimeLine } from "../TaskTimeLine/TimeLine/TimeLine"; diff --git a/cassandra-distributed-task-queue-ui/src/components/TaskDetailsMetaTable/TaskDetailsMetaTable.tsx b/cassandra-distributed-task-queue-ui/src/components/TaskDetailsMetaTable/TaskDetailsMetaTable.tsx index 442e9907..c2d98e94 100644 --- a/cassandra-distributed-task-queue-ui/src/components/TaskDetailsMetaTable/TaskDetailsMetaTable.tsx +++ b/cassandra-distributed-task-queue-ui/src/components/TaskDetailsMetaTable/TaskDetailsMetaTable.tsx @@ -1,12 +1,10 @@ +import { Timestamp, AllowCopyToClipboard, Ticks } from "@skbkontur/edi-ui"; import { ThemeContext } from "@skbkontur/react-ui"; import React, { ReactNode } from "react"; import { useCustomSettings } from "../../CustomSettingsContext"; import { RtqMonitoringTaskMeta } from "../../Domain/Api/RtqMonitoringTaskMeta"; -import { Ticks } from "../../Domain/DataTypes/Time"; import { ticksToMilliseconds } from "../../Domain/Utils/ConvertTimeUtil"; -import { AllowCopyToClipboard } from "../AllowCopyToClipboard"; -import { DateTimeView } from "../DateTimeView/DateTimeView"; import { RouterLink } from "../RouterLink/RouterLink"; import { jsStyles } from "./TaskDetailsMetaTable.styles"; @@ -37,16 +35,7 @@ export const TaskDetailsMetaTable = ({ const theme = React.useContext(ThemeContext); const { customStateCaptions, hideMissingMeta } = useCustomSettings(); - const renderDate = (date?: Nullable): JSX.Element => ( - - {" "} - {date && ( - - ({date}) - - )} - - ); + const renderDate = (date?: Nullable): JSX.Element => ; const renderRow = (name: string, value: Nullable, render?: (x: Nullable) => ReactNode) => value || !hideMissingMeta ? ( diff --git a/cassandra-distributed-task-queue-ui/src/components/TaskDetailsPage/TaskDetailsPage.tsx b/cassandra-distributed-task-queue-ui/src/components/TaskDetailsPage/TaskDetailsPage.tsx index 1768222d..48458247 100644 --- a/cassandra-distributed-task-queue-ui/src/components/TaskDetailsPage/TaskDetailsPage.tsx +++ b/cassandra-distributed-task-queue-ui/src/components/TaskDetailsPage/TaskDetailsPage.tsx @@ -1,3 +1,4 @@ +import { Accordion } from "@skbkontur/edi-ui"; import { ArrowRoundTimeForwardIcon16Regular } from "@skbkontur/icons/ArrowRoundTimeForwardIcon16Regular"; import { TextAlignCenterJustifyIcon16Regular } from "@skbkontur/icons/TextAlignCenterJustifyIcon16Regular"; import { XIcon16Regular } from "@skbkontur/icons/XIcon16Regular"; @@ -10,7 +11,6 @@ import { useCustomSettings } from "../../CustomSettingsContext"; import { RtqMonitoringTaskModel } from "../../Domain/Api/RtqMonitoringTaskModel"; import { cancelableStates, rerunableStates } from "../../Domain/TaskStateExtensions"; import { searchRequestMapping } from "../../containers/TasksPageContainer"; -import { Accordion } from "../Accordion/Accordion"; import { CommonLayout } from "../Layouts/CommonLayout"; import { RouterLink } from "../RouterLink/RouterLink"; import { TaskDetailsMetaTable } from "../TaskDetailsMetaTable/TaskDetailsMetaTable"; diff --git a/cassandra-distributed-task-queue-ui/src/components/TaskTable/TaskDetails/TaskDetails.tsx b/cassandra-distributed-task-queue-ui/src/components/TaskTable/TaskDetails/TaskDetails.tsx index 1f74af87..0a568063 100644 --- a/cassandra-distributed-task-queue-ui/src/components/TaskTable/TaskDetails/TaskDetails.tsx +++ b/cassandra-distributed-task-queue-ui/src/components/TaskTable/TaskDetails/TaskDetails.tsx @@ -1,3 +1,4 @@ +import { Timestamp, AllowCopyToClipboard, Ticks } from "@skbkontur/edi-ui"; import { ArrowRoundTimeForwardIcon16Regular } from "@skbkontur/icons/ArrowRoundTimeForwardIcon16Regular"; import { XIcon16Regular } from "@skbkontur/icons/XIcon16Regular"; import { ColumnStack, Fill, Fit, RowStack } from "@skbkontur/react-stack-layout"; @@ -7,10 +8,7 @@ import { Location } from "react-router-dom"; import { useCustomSettings } from "../../../CustomSettingsContext"; import { RtqMonitoringTaskMeta } from "../../../Domain/Api/RtqMonitoringTaskMeta"; -import { Ticks } from "../../../Domain/DataTypes/Time"; import { cancelableStates, rerunableStates } from "../../../Domain/TaskStateExtensions"; -import { AllowCopyToClipboard } from "../../AllowCopyToClipboard"; -import { DateTimeView } from "../../DateTimeView/DateTimeView"; import { RouterLink } from "../../RouterLink/RouterLink"; import { jsStyles } from "./TaskDetails.styles"; @@ -29,7 +27,7 @@ function dateFormatter( item: RtqMonitoringTaskMeta, selector: (obj: RtqMonitoringTaskMeta) => Nullable ): JSX.Element { - return ; + return ; } export function TaskDetails(props: TaskDetailsProps): JSX.Element { diff --git a/cassandra-distributed-task-queue-ui/src/components/TaskTimeLine/TaskTimeLine.tsx b/cassandra-distributed-task-queue-ui/src/components/TaskTimeLine/TaskTimeLine.tsx index 2814afee..fa2f1f78 100644 --- a/cassandra-distributed-task-queue-ui/src/components/TaskTimeLine/TaskTimeLine.tsx +++ b/cassandra-distributed-task-queue-ui/src/components/TaskTimeLine/TaskTimeLine.tsx @@ -1,3 +1,4 @@ +import { Timestamp, AllowCopyToClipboard, Ticks } from "@skbkontur/edi-ui"; import { ArrowADownIcon16Regular } from "@skbkontur/icons/ArrowADownIcon16Regular"; import { ArrowAUpIcon16Regular } from "@skbkontur/icons/ArrowAUpIcon16Regular"; import { ArrowDCornerDownRightIcon16Regular } from "@skbkontur/icons/ArrowDCornerDownRightIcon16Regular"; @@ -14,9 +15,6 @@ import { Location } from "react-router-dom"; import { RtqMonitoringTaskMeta } from "../../Domain/Api/RtqMonitoringTaskMeta"; import { TaskState } from "../../Domain/Api/TaskState"; -import { Ticks } from "../../Domain/DataTypes/Time"; -import { AllowCopyToClipboard } from "../AllowCopyToClipboard"; -import { DateTimeView } from "../DateTimeView/DateTimeView"; import { RouterLink } from "../RouterLink/RouterLink"; import { getIconColor } from "../TaskChainTree/TaskStateIcon"; @@ -48,7 +46,7 @@ export function TaskTimeLine({ taskMeta, childTaskIds, getHrefToTask }: TaskTime
{entry.title}
{entry.date && (
- +
)} diff --git a/cassandra-distributed-task-queue-ui/stories/Api/RtqMonitoringApiFake.tsx b/cassandra-distributed-task-queue-ui/stories/Api/RtqMonitoringApiFake.tsx index 254303f7..bbd9805f 100644 --- a/cassandra-distributed-task-queue-ui/stories/Api/RtqMonitoringApiFake.tsx +++ b/cassandra-distributed-task-queue-ui/stories/Api/RtqMonitoringApiFake.tsx @@ -1,4 +1,6 @@ -import { IRtqMonitoringApi } from "../../src/Domain/Api/RtqMonitoringApi"; +import { TimeUtils } from "@skbkontur/edi-ui"; + +import { IRtqMonitoringApi } from "../../src"; import { RtqMonitoringSearchRequest } from "../../src/Domain/Api/RtqMonitoringSearchRequest"; import { RtqMonitoringSearchResults } from "../../src/Domain/Api/RtqMonitoringSearchResults"; import { RtqMonitoringTaskMeta } from "../../src/Domain/Api/RtqMonitoringTaskMeta"; @@ -6,7 +8,6 @@ import { RtqMonitoringTaskModel } from "../../src/Domain/Api/RtqMonitoringTaskMo import { TaskManipulationResult } from "../../src/Domain/Api/TaskManipulationResult"; import { TaskState } from "../../src/Domain/Api/TaskState"; import { delay } from "../../src/Domain/Utils/PromiseUtils"; -import { TimeUtils } from "../../src/Domain/Utils/TimeUtils"; import names from "./names.json"; import task from "./task.json"; diff --git a/cassandra-distributed-task-queue-ui/stories/DateTimeView.stories.tsx b/cassandra-distributed-task-queue-ui/stories/DateTimeView.stories.tsx index 5144274e..cc09075d 100644 --- a/cassandra-distributed-task-queue-ui/stories/DateTimeView.stories.tsx +++ b/cassandra-distributed-task-queue-ui/stories/DateTimeView.stories.tsx @@ -1,20 +1,19 @@ -import { TimeUtils } from "../src/Domain/Utils/TimeUtils"; -import { DateTimeView } from "../src/components/DateTimeView/DateTimeView"; +import { TimeUtils, Timestamp } from "@skbkontur/edi-ui"; export default { title: "RemoteTaskQueueMonitoring/DateTimeView", decorators: [(story: any) =>
{story()}
], }; -export const Direct = () => ; +export const Direct = () => ; export const TwoValues = () => (
- +
- +
); diff --git a/cassandra-distributed-task-queue-ui/stories/TaskAccordion.stories.tsx b/cassandra-distributed-task-queue-ui/stories/TaskAccordion.stories.tsx index 4547d580..599f44d0 100644 --- a/cassandra-distributed-task-queue-ui/stories/TaskAccordion.stories.tsx +++ b/cassandra-distributed-task-queue-ui/stories/TaskAccordion.stories.tsx @@ -1,7 +1,6 @@ +import { Accordion } from "@skbkontur/edi-ui"; import _ from "lodash"; -import { Accordion } from "../src/components/Accordion/Accordion"; - export default { title: "RemoteTaskQueueMonitoring/TaskAccordion", component: Accordion, @@ -35,21 +34,14 @@ ToggleAllMultipleItemsWithTitle.story = { }; export const ToggleAllWithoutTitle = () => ( - + ); ToggleAllWithoutTitle.story = { name: "Toggle all, without title", }; export const ToggleAllHiddenNothingToToggle = () => ( - + ); ToggleAllHiddenNothingToToggle.story = { name: "Toggle all hidden, nothing to toggle", diff --git a/cassandra-distributed-task-queue-ui/stories/TaskMetaInformationUtils.tsx b/cassandra-distributed-task-queue-ui/stories/TaskMetaInformationUtils.tsx index 9c9ad25f..5f762b12 100644 --- a/cassandra-distributed-task-queue-ui/stories/TaskMetaInformationUtils.tsx +++ b/cassandra-distributed-task-queue-ui/stories/TaskMetaInformationUtils.tsx @@ -1,6 +1,7 @@ +import { TimeUtils } from "@skbkontur/edi-ui"; + import { RtqMonitoringTaskMeta } from "../src/Domain/Api/RtqMonitoringTaskMeta"; import { TaskState } from "../src/Domain/Api/TaskState"; -import { TimeUtils } from "../src/Domain/Utils/TimeUtils"; export function createTask(override: Partial): RtqMonitoringTaskMeta { const defaultTaskMeta: RtqMonitoringTaskMeta = { diff --git a/cassandra-distributed-task-queue-ui/tests/RemoteTaskQueueMonitoring/pathLens.test.tsx b/cassandra-distributed-task-queue-ui/tests/RemoteTaskQueueMonitoring/pathLens.test.tsx deleted file mode 100644 index 3cedd82d..00000000 --- a/cassandra-distributed-task-queue-ui/tests/RemoteTaskQueueMonitoring/pathLens.test.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import { expect, describe, it } from "vitest"; - -import { Lens, pathLens } from "../../src/Domain/lens"; - -interface X1 { - p1: string; -} - -interface X2 { - c1: { - p1: string; - }; -} - -interface X3 { - c1?: Nullable<{ - p1: Nullable; - }>; -} - -export const view = (lens: Lens, target: TTarget): TProp => lens.get(target); - -export const set = (lens: Lens, value: TProp, target: TTarget): TTarget => - lens.set(target, value); - -export const idx = (t: TTarget, pick: (target: TTarget) => TProp): TProp => view(pathLens(pick), t); - -describe("LensTest", () => { - describe("for arrow function", () => { - it("get simple property", () => { - const lens = pathLens(x => x.p1); - const target: X1 = { p1: "1" }; - expect(view(lens, target)).to.eql("1"); - }); - - it("get by path", () => { - const lens = pathLens(x => x.c1.p1); - const target: X2 = { c1: { p1: "1" } }; - expect(view(lens, target)).to.eql("1"); - }); - - it("set by path", () => { - const lens = pathLens(x => x.c1.p1); - const target: X2 = { c1: { p1: "1" } }; - expect(set(lens, "2", target)).to.eql({ c1: { p1: "2" } }); - }); - - it("set by path with null", () => { - const lens = pathLens(x => idx(x, (y: any) => y.c1.p1)); - const target: X3 = { c1: null }; - expect(set(lens, "2", target)).to.eql({ c1: { p1: "2" } }); - }); - - it("check not mutate target", () => { - const lens = pathLens(x => x.c1.p1); - const target: X2 = { c1: { p1: "1" } }; - const newTarget = set(lens, "2", target); - expect(newTarget !== target).to.eql(true); - expect(target.c1.p1).to.eql("1"); - }); - - it("set by path with nulls", () => { - const lens = pathLens(x => idx(x, (y: any) => y.c1.p1)); - const target: X3 = {}; - expect(set(lens, "2", target)).to.eql({ c1: { p1: "2" } }); - }); - }); - - describe("for function", () => { - it("get simple property", () => { - const lens = pathLens(function (x) { - return x.p1; - }); - const target: X1 = { p1: "1" }; - expect(view(lens, target)).to.eql("1"); - }); - - it("get by path", () => { - const lens = pathLens(function (x) { - return x.c1.p1; - }); - const target: X2 = { c1: { p1: "1" } }; - expect(view(lens, target)).to.eql("1"); - }); - - it("set by path", () => { - const lens = pathLens(function (x) { - return x.c1.p1; - }); - const target: X2 = { c1: { p1: "1" } }; - expect(set(lens, "2", target)).to.eql({ c1: { p1: "2" } }); - }); - - it("set by path with null", () => { - const lens = pathLens(function (x) { - return idx(x, (y: any) => y.c1.p1); - }); - const target: X3 = { c1: null }; - expect(set(lens, "2", target)).to.eql({ c1: { p1: "2" } }); - }); - - it("check not mutate target", () => { - const lens = pathLens(function (x) { - return x.c1.p1; - }); - const target: X2 = { c1: { p1: "1" } }; - const newTarget = set(lens, "2", target); - expect(newTarget !== target).to.eql(true); - expect(target.c1.p1).to.eql("1"); - }); - - it("set by path with nulls", () => { - const lens = pathLens(function (x) { - return idx(x, (y: any) => y.c1.p1); - }); - const target: X3 = {}; - expect(set(lens, "2", target)).to.eql({ c1: { p1: "2" } }); - }); - }); -}); diff --git a/cassandra-distributed-task-queue-ui/yarn.lock b/cassandra-distributed-task-queue-ui/yarn.lock index d25c0f2d..61e1854b 100644 --- a/cassandra-distributed-task-queue-ui/yarn.lock +++ b/cassandra-distributed-task-queue-ui/yarn.lock @@ -1491,6 +1491,16 @@ __metadata: languageName: node linkType: hard +"@babel/runtime-corejs3@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/runtime-corejs3@npm:7.24.4" + dependencies: + core-js-pure: "npm:^3.30.2" + regenerator-runtime: "npm:^0.14.0" + checksum: bc8566abb1e85b2eb5c5476db0712c5fd67bca3ed318d28ee44b1be95db866a5be31301cc6db980dbb7c8a0a73d8c7d7f87a8473106d8422d4937433c9d17c96 + languageName: node + linkType: hard + "@babel/runtime@npm:7.16.5": version: 7.16.5 resolution: "@babel/runtime@npm:7.16.5" @@ -2913,9 +2923,10 @@ __metadata: version: 0.0.0-use.local resolution: "@skbkontur/cassandra-distributed-task-queue-ui@workspace:." dependencies: + "@skbkontur/edi-ui": "npm:^0.2.4" "@skbkontur/icons": "npm:^1.3.0" "@skbkontur/react-stack-layout": "npm:^1.0.3" - "@skbkontur/react-ui": "npm:^4.1.0" + "@skbkontur/react-ui": "npm:^4.22.0" "@storybook/addon-actions": "npm:^7.0.7" "@storybook/addons": "npm:^7.0.7" "@storybook/cli": "npm:^7.4.6" @@ -2956,13 +2967,54 @@ __metadata: whatwg-fetch: "npm:^3.5.0" peerDependencies: "@skbkontur/icons": ">=1 <2" - "@skbkontur/react-ui": ">=2 <=4" + "@skbkontur/react-ui": ">=4" react: ">=16 <=18" react-dom: ">=16 <=18" react-router-dom: ">=6" languageName: unknown linkType: soft +"@skbkontur/colors@npm:0.4.4": + version: 0.4.4 + resolution: "@skbkontur/colors@npm:0.4.4" + checksum: 9f560a9ed6ad0546b35778e866aa0b2525eb30b72c6ee2e8461f5724db3eca8e0f347719b913d0a5300ebbb9fa3fdeeb89dc66fb608105748be769c9f65d033d + languageName: node + linkType: hard + +"@skbkontur/edi-ui@npm:^0.2.4": + version: 0.2.4 + resolution: "@skbkontur/edi-ui@npm:0.2.4" + dependencies: + "@skbkontur/colors": "npm:0.4.4" + "@skbkontur/icons": "npm:1.10.0" + "@skbkontur/react-stack-layout": "npm:1.2.0" + date-fns: "npm:2.21.1" + lodash.get: "npm:4.4.2" + lodash.isequal: "npm:4.5.0" + lodash.isplainobject: "npm:4.0.6" + peerDependencies: + "@skbkontur/icons": ">=1 <2" + "@skbkontur/react-ui": ">=4" + react: ">=16 <=18" + react-dom: ">=16 <=18" + checksum: 315a87be3b3bb8e7637b220e327e73c8cbaa32603a75484af64cda934be02920f386231e828b910d7970c8f3b0b8bb38e4d96dc52a2c41e5bb89e4e8f338873c + languageName: node + linkType: hard + +"@skbkontur/global-object@npm:^0.4.2": + version: 0.4.4 + resolution: "@skbkontur/global-object@npm:0.4.4" + checksum: bb5724cc6c6a5ac9ab516bb7e72e5e53963f481e8c0599e20f01fe3ac5c6623fab7e32b91d0d180a134954637de5658dbba1579ebe1940973f93b63720f570cd + languageName: node + linkType: hard + +"@skbkontur/icons@npm:1.10.0": + version: 1.10.0 + resolution: "@skbkontur/icons@npm:1.10.0" + checksum: 1c95607c18532fb0ae409ea6e9ec27a7f6786d89dfab11da8b4991d061e65324db8194c4a42016607041eea3b95dc0d61488c299de558217681dfab073fd7e04 + languageName: node + linkType: hard + "@skbkontur/icons@npm:^1.3.0": version: 1.3.0 resolution: "@skbkontur/icons@npm:1.3.0" @@ -2970,6 +3022,15 @@ __metadata: languageName: node linkType: hard +"@skbkontur/react-stack-layout@npm:1.2.0": + version: 1.2.0 + resolution: "@skbkontur/react-stack-layout@npm:1.2.0" + peerDependencies: + react: "*" + checksum: e0de1ef7608725d84805eeac80df9232f35f6f23e16d8b299ad971b8dada12d5e95eede1e0b65941317e88a49fdb074ffc7907f825fd3f8f46c887928591a4bc + languageName: node + linkType: hard + "@skbkontur/react-stack-layout@npm:^1.0.3": version: 1.0.3 resolution: "@skbkontur/react-stack-layout@npm:1.0.3" @@ -2979,12 +3040,13 @@ __metadata: languageName: node linkType: hard -"@skbkontur/react-ui@npm:^4.1.0": - version: 4.1.0 - resolution: "@skbkontur/react-ui@npm:4.1.0" +"@skbkontur/react-ui@npm:^4.22.0": + version: 4.22.0 + resolution: "@skbkontur/react-ui@npm:4.22.0" dependencies: "@babel/runtime": "npm:7.16.5" "@emotion/css": "npm:^11.7.1" + "@skbkontur/global-object": "npm:^0.4.2" eventemitter3: "npm:^4.0.7" invariant: "npm:2.2.4" lodash.debounce: "npm:^4.0.8" @@ -2992,19 +3054,19 @@ __metadata: lodash.throttle: "npm:^4.1.1" normalize-wheel: "npm:^1.0.1" prop-types: "npm:^15.8.0" - raf: "npm:^3.4.1" react-focus-lock: "npm:^2.7.1" + react-imask: "npm:^7.4.0" react-input-mask: "npm:2.0.4" react-is: "npm:^17.0.2" react-transition-group: "npm:^4.4.2" shallowequal: "npm:^1.1.0" stylis-plugin-extra-scope: "npm:^0.3.0" - tabbable: "npm:^5.2.1" + tabbable: "npm:5.2.1" warning: "npm:^4.0.3" peerDependencies: react: ">=16.9" react-dom: ">=16.9" - checksum: 36edb294e6a58c1671549c6ee7ee98c28fd9edd56ed278596bf03e89bd6e9000c874c36020211cead0cad7f712c269a6283e888d4a354ae7d301a3b1683ebba7 + checksum: 7cdfc03dffaa56975e733af978b66ed7b161fe9cd83b82dc1f6adad69c2179a1cd42d13216ac4bb7db801d48dc0769425b1f251a688ea492cd122e903a4c1898 languageName: node linkType: hard @@ -5338,6 +5400,13 @@ __metadata: languageName: node linkType: hard +"core-js-pure@npm:^3.30.2": + version: 3.36.1 + resolution: "core-js-pure@npm:3.36.1" + checksum: 76389c2fb83d8fc5945129ff343801f60a99baf4ebf743521cb3b358f1f840ff4aeaa3676b48a4b09052140c7432776cdd5635ebf1b7a8b4b3bb1a2efcfd1c4c + languageName: node + linkType: hard + "core-util-is@npm:~1.0.0": version: 1.0.2 resolution: "core-util-is@npm:1.0.2" @@ -5416,6 +5485,13 @@ __metadata: languageName: node linkType: hard +"date-fns@npm:2.21.1": + version: 2.21.1 + resolution: "date-fns@npm:2.21.1" + checksum: abb7e94c0dd413bce1ee5c046c49bcc0d77eb848e4efacb31b78e2102ed5f67e6eb2cf25c17b3efdb7ddda97eb75c56163f99bfc6d0bfffd08ba908e40c1c3d7 + languageName: node + linkType: hard + "date-fns@npm:^2.29.2": version: 2.29.2 resolution: "date-fns@npm:2.29.2" @@ -7446,6 +7522,15 @@ __metadata: languageName: node linkType: hard +"imask@npm:^7.6.0": + version: 7.6.0 + resolution: "imask@npm:7.6.0" + dependencies: + "@babel/runtime-corejs3": "npm:^7.24.4" + checksum: c38723917967ab3dbc2b123c065e2f047a1318f7f210c7dca6e82160e14db8482c74dd7cc48f23649704eb02c6c8b2e3aaf08225edebbf794c2ecaeef49137f2 + languageName: node + linkType: hard + "import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" @@ -8279,13 +8364,27 @@ __metadata: languageName: node linkType: hard -"lodash.isequal@npm:^4.5.0": +"lodash.get@npm:4.4.2": + version: 4.4.2 + resolution: "lodash.get@npm:4.4.2" + checksum: 2a4925f6e89bc2c010a77a802d1ba357e17ed1ea03c2ddf6a146429f2856a216663e694a6aa3549a318cbbba3fd8b7decb392db457e6ac0b83dc745ed0a17380 + languageName: node + linkType: hard + +"lodash.isequal@npm:4.5.0, lodash.isequal@npm:^4.5.0": version: 4.5.0 resolution: "lodash.isequal@npm:4.5.0" checksum: 82fc58a83a1555f8df34ca9a2cd300995ff94018ac12cc47c349655f0ae1d4d92ba346db4c19bbfc90510764e0c00ddcc985a358bdcd4b3b965abf8f2a48a214 languageName: node linkType: hard +"lodash.isplainobject@npm:4.0.6": + version: 4.0.6 + resolution: "lodash.isplainobject@npm:4.0.6" + checksum: 29c6351f281e0d9a1d58f1a4c8f4400924b4c79f18dfc4613624d7d54784df07efaff97c1ff2659f3e085ecf4fff493300adc4837553104cef2634110b0d5337 + languageName: node + linkType: hard + "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" @@ -9459,13 +9558,6 @@ __metadata: languageName: node linkType: hard -"performance-now@npm:^2.1.0": - version: 2.1.0 - resolution: "performance-now@npm:2.1.0" - checksum: 534e641aa8f7cba160f0afec0599b6cecefbb516a2e837b512be0adbe6c1da5550e89c78059c7fabc5c9ffdf6627edabe23eb7c518c4500067a898fa65c2b550 - languageName: node - linkType: hard - "picocolors@npm:^1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" @@ -9679,7 +9771,7 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:^15.8.0": +"prop-types@npm:^15.8.0, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -9818,15 +9910,6 @@ __metadata: languageName: node linkType: hard -"raf@npm:^3.4.1": - version: 3.4.1 - resolution: "raf@npm:3.4.1" - dependencies: - performance-now: "npm:^2.1.0" - checksum: 4c4b4c826b09d2aec6ca809f1a3c3c12136e7ec8d13fbb91f495dd2c99cd43345240e003da3bfd16036a432e635049fc6d9f69f9187f5f22ea88bb146ec75881 - languageName: node - linkType: hard - "ramda@npm:0.29.0": version: 0.29.0 resolution: "ramda@npm:0.29.0" @@ -9940,6 +10023,18 @@ __metadata: languageName: node linkType: hard +"react-imask@npm:^7.4.0": + version: 7.6.0 + resolution: "react-imask@npm:7.6.0" + dependencies: + imask: "npm:^7.6.0" + prop-types: "npm:^15.8.1" + peerDependencies: + react: ">=0.14.0" + checksum: 2c253419bae26266c206e30a029c8cd845589071a524c7e3469897f6c08ba1e923dbcad9c4ad58f9e70d13147cb1301d32dd7fd4f826363828f072e7066b3a6f + languageName: node + linkType: hard + "react-input-mask@npm:2.0.4": version: 2.0.4 resolution: "react-input-mask@npm:2.0.4" @@ -11269,10 +11364,10 @@ __metadata: languageName: node linkType: hard -"tabbable@npm:^5.2.1": - version: 5.3.3 - resolution: "tabbable@npm:5.3.3" - checksum: 5da150c9ac7aaed95f901623214794ffac9472a86009a1762c7b436249d33b157b7d86d93610986090d0fb1ef152f5dec2c201552e0b67ca895ba00c145a51c5 +"tabbable@npm:5.2.1": + version: 5.2.1 + resolution: "tabbable@npm:5.2.1" + checksum: 9fa960479964713b1f403ae00ee6fea8061a1453c29e3f2add6aec21e9fc256c76eb0833cbe48f74cbf2559a2f37e9496fcb2567477b501316e66812e27d9832 languageName: node linkType: hard