@skbkontur/react-ui 4.6.0 → 4.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -0
- package/cjs/components/ComboBox/ComboBox.d.ts +15 -0
- package/cjs/components/ComboBox/ComboBox.js +16 -0
- package/cjs/components/ComboBox/ComboBox.js.map +1 -1
- package/cjs/components/ComboBox/ComboBox.md +10 -1
- package/cjs/components/DropdownMenu/DropdownMenu.md +11 -9
- package/cjs/components/FileUploader/FileUploader.d.ts +9 -1
- package/cjs/components/FileUploader/FileUploader.js +67 -18
- package/cjs/components/FileUploader/FileUploader.js.map +1 -1
- package/cjs/components/FileUploader/FileUploader.mixins.d.ts +1 -0
- package/cjs/components/FileUploader/FileUploader.mixins.js +10 -0
- package/cjs/components/FileUploader/FileUploader.mixins.js.map +1 -0
- package/cjs/components/FileUploader/FileUploader.styles.d.ts +12 -1
- package/cjs/components/FileUploader/FileUploader.styles.js +119 -22
- package/cjs/components/FileUploader/FileUploader.styles.js.map +1 -1
- package/cjs/components/Hint/Hint.d.ts +1 -0
- package/cjs/components/Hint/Hint.js +6 -2
- package/cjs/components/Hint/Hint.js.map +1 -1
- package/cjs/components/Paging/Paging.js +20 -15
- package/cjs/components/Paging/Paging.js.map +1 -1
- package/cjs/components/Paging/Paging.md +13 -0
- package/cjs/components/Paging/Paging.styles.d.ts +6 -2
- package/cjs/components/Paging/Paging.styles.js +40 -15
- package/cjs/components/Paging/Paging.styles.js.map +1 -1
- package/cjs/components/Select/Select.js +5 -3
- package/cjs/components/Select/Select.js.map +1 -1
- package/cjs/components/SidePage/SidePage.d.ts +0 -1
- package/cjs/components/SidePage/SidePage.js +0 -2
- package/cjs/components/SidePage/SidePage.js.map +1 -1
- package/cjs/components/SidePage/SidePageBody.d.ts +0 -1
- package/cjs/components/SidePage/SidePageBody.js +6 -11
- package/cjs/components/SidePage/SidePageBody.js.map +1 -1
- package/cjs/components/Toggle/Toggle.js +2 -1
- package/cjs/components/Toggle/Toggle.js.map +1 -1
- package/cjs/internal/CustomComboBox/ComboBoxMenu.d.ts +1 -0
- package/cjs/internal/CustomComboBox/ComboBoxMenu.js +3 -1
- package/cjs/internal/CustomComboBox/ComboBoxMenu.js.map +1 -1
- package/cjs/internal/CustomComboBox/ComboBoxView.d.ts +1 -0
- package/cjs/internal/CustomComboBox/ComboBoxView.js +3 -1
- package/cjs/internal/CustomComboBox/ComboBoxView.js.map +1 -1
- package/cjs/internal/CustomComboBox/CustomComboBox.d.ts +1 -0
- package/cjs/internal/CustomComboBox/CustomComboBox.js +3 -1
- package/cjs/internal/CustomComboBox/CustomComboBox.js.map +1 -1
- package/cjs/internal/CustomComboBox/CustomComboBoxReducer.js +4 -1
- package/cjs/internal/CustomComboBox/CustomComboBoxReducer.js.map +1 -1
- package/cjs/internal/FileUploaderControl/FileUploaderControlContext.d.ts +2 -0
- package/cjs/internal/FileUploaderControl/FileUploaderControlContext.js +2 -0
- package/cjs/internal/FileUploaderControl/FileUploaderControlContext.js.map +1 -1
- package/cjs/internal/FileUploaderControl/FileUploaderControlProvider.js +4 -1
- package/cjs/internal/FileUploaderControl/FileUploaderControlProvider.js.map +1 -1
- package/cjs/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile.d.ts +3 -0
- package/cjs/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile.js +46 -11
- package/cjs/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile.js.map +1 -1
- package/cjs/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile.styles.d.ts +7 -0
- package/cjs/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile.styles.js +54 -7
- package/cjs/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile.styles.js.map +1 -1
- package/cjs/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList.d.ts +2 -0
- package/cjs/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList.js +15 -3
- package/cjs/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList.js.map +1 -1
- package/cjs/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList.styles.d.ts +3 -0
- package/cjs/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList.styles.js +19 -1
- package/cjs/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList.styles.js.map +1 -1
- package/cjs/internal/FileUploaderControl/hooks/useFileUploaderSize.d.ts +2 -0
- package/cjs/internal/FileUploaderControl/hooks/useFileUploaderSize.js +18 -0
- package/cjs/internal/FileUploaderControl/hooks/useFileUploaderSize.js.map +1 -0
- package/cjs/internal/Popup/Popup.d.ts +5 -0
- package/cjs/internal/Popup/Popup.js +10 -2
- package/cjs/internal/Popup/Popup.js.map +1 -1
- package/cjs/internal/ThemeShowcase/VariablesCollector.d.ts +1 -1
- package/cjs/internal/themes/DarkTheme.d.ts +1 -0
- package/cjs/internal/themes/DarkTheme.js +2 -1
- package/cjs/internal/themes/DarkTheme.js.map +1 -1
- package/cjs/internal/themes/DefaultTheme.d.ts +16 -0
- package/cjs/internal/themes/DefaultTheme.js +41 -1
- package/cjs/internal/themes/DefaultTheme.js.map +1 -1
- package/cjs/lib/utils.d.ts +2 -3
- package/cjs/lib/utils.js +1 -2
- package/cjs/lib/utils.js.map +1 -1
- package/components/ComboBox/ComboBox/ComboBox.js.map +1 -1
- package/components/ComboBox/ComboBox.d.ts +15 -0
- package/components/ComboBox/ComboBox.md +10 -1
- package/components/DropdownMenu/DropdownMenu.md +11 -9
- package/components/FileUploader/FileUploader/FileUploader.js +56 -20
- package/components/FileUploader/FileUploader/FileUploader.js.map +1 -1
- package/components/FileUploader/FileUploader.d.ts +9 -1
- package/components/FileUploader/FileUploader.mixins/FileUploader.mixins.js +8 -0
- package/components/FileUploader/FileUploader.mixins/FileUploader.mixins.js.map +1 -0
- package/components/FileUploader/FileUploader.mixins/package.json +6 -0
- package/components/FileUploader/FileUploader.mixins.d.ts +1 -0
- package/components/FileUploader/FileUploader.styles/FileUploader.styles.js +51 -17
- package/components/FileUploader/FileUploader.styles/FileUploader.styles.js.map +1 -1
- package/components/FileUploader/FileUploader.styles.d.ts +12 -1
- package/components/Hint/Hint/Hint.js +13 -5
- package/components/Hint/Hint/Hint.js.map +1 -1
- package/components/Hint/Hint.d.ts +1 -0
- package/components/Paging/Paging/Paging.js +12 -9
- package/components/Paging/Paging/Paging.js.map +1 -1
- package/components/Paging/Paging.md +13 -0
- package/components/Paging/Paging.styles/Paging.styles.js +27 -15
- package/components/Paging/Paging.styles/Paging.styles.js.map +1 -1
- package/components/Paging/Paging.styles.d.ts +6 -2
- package/components/Select/Select/Select.js +5 -5
- package/components/Select/Select/Select.js.map +1 -1
- package/components/SidePage/SidePage/SidePage.js +0 -1
- package/components/SidePage/SidePage/SidePage.js.map +1 -1
- package/components/SidePage/SidePage.d.ts +0 -1
- package/components/SidePage/SidePageBody/SidePageBody.js +1 -9
- package/components/SidePage/SidePageBody/SidePageBody.js.map +1 -1
- package/components/SidePage/SidePageBody.d.ts +0 -1
- package/components/Toggle/Toggle/Toggle.js +2 -1
- package/components/Toggle/Toggle/Toggle.js.map +1 -1
- package/internal/CustomComboBox/ComboBoxMenu/ComboBoxMenu.js +3 -1
- package/internal/CustomComboBox/ComboBoxMenu/ComboBoxMenu.js.map +1 -1
- package/internal/CustomComboBox/ComboBoxMenu.d.ts +1 -0
- package/internal/CustomComboBox/ComboBoxView/ComboBoxView.js +3 -1
- package/internal/CustomComboBox/ComboBoxView/ComboBoxView.js.map +1 -1
- package/internal/CustomComboBox/ComboBoxView.d.ts +1 -0
- package/internal/CustomComboBox/CustomComboBox/CustomComboBox.js +1 -0
- package/internal/CustomComboBox/CustomComboBox/CustomComboBox.js.map +1 -1
- package/internal/CustomComboBox/CustomComboBox.d.ts +1 -0
- package/internal/CustomComboBox/CustomComboBoxReducer/CustomComboBoxReducer.js +5 -1
- package/internal/CustomComboBox/CustomComboBoxReducer/CustomComboBoxReducer.js.map +1 -1
- package/internal/FileUploaderControl/FileUploaderControlContext/FileUploaderControlContext.js.map +1 -1
- package/internal/FileUploaderControl/FileUploaderControlContext.d.ts +2 -0
- package/internal/FileUploaderControl/FileUploaderControlProvider/FileUploaderControlProvider.js +7 -1
- package/internal/FileUploaderControl/FileUploaderControlProvider/FileUploaderControlProvider.js.map +1 -1
- package/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile/FileUploaderFile.js +38 -13
- package/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile/FileUploaderFile.js.map +1 -1
- package/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile.d.ts +3 -0
- package/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile.styles/FileUploaderFile.styles.js +26 -5
- package/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile.styles/FileUploaderFile.styles.js.map +1 -1
- package/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile.styles.d.ts +7 -0
- package/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList/FileUploaderFileList.js +13 -3
- package/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList/FileUploaderFileList.js.map +1 -1
- package/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList.d.ts +2 -0
- package/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList.styles/FileUploaderFileList.styles.js +10 -1
- package/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList.styles/FileUploaderFileList.styles.js.map +1 -1
- package/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList.styles.d.ts +3 -0
- package/internal/FileUploaderControl/hooks/useFileUploaderSize/package.json +6 -0
- package/internal/FileUploaderControl/hooks/useFileUploaderSize/useFileUploaderSize.js +21 -0
- package/internal/FileUploaderControl/hooks/useFileUploaderSize/useFileUploaderSize.js.map +1 -0
- package/internal/FileUploaderControl/hooks/useFileUploaderSize.d.ts +2 -0
- package/internal/Popup/Popup/Popup.js +5 -1
- package/internal/Popup/Popup/Popup.js.map +1 -1
- package/internal/Popup/Popup.d.ts +5 -0
- package/internal/ThemeShowcase/VariablesCollector.d.ts +1 -1
- package/internal/themes/DarkTheme/DarkTheme.js +1 -0
- package/internal/themes/DarkTheme/DarkTheme.js.map +1 -1
- package/internal/themes/DarkTheme.d.ts +1 -0
- package/internal/themes/DefaultTheme/DefaultTheme.js +64 -0
- package/internal/themes/DefaultTheme/DefaultTheme.js.map +1 -1
- package/internal/themes/DefaultTheme.d.ts +16 -0
- package/lib/utils/utils.js.map +1 -1
- package/lib/utils.d.ts +2 -3
- package/package.json +2 -2
package/cjs/lib/utils.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");exports.__esModule = true;exports.emptyHandler = exports.delay = exports.CancelationError = void 0;exports.escapeRegExpSpecChars = escapeRegExpSpecChars;exports.getRandomID = exports.formatBytes = exports.extractDataProps = void 0;exports.isClassComponent = isClassComponent;exports.isExternalLink = void 0;exports.isFunction = isFunction;exports.isFunctionalComponent = isFunctionalComponent;exports.isIntrinsicElement = isIntrinsicElement;exports.isReactUINode = exports.isReactUIComponent = exports.isNullable = exports.isNonNullable = void 0;exports.isRefableElement = isRefableElement;exports.mergeRefs = mergeRefs;exports.startsWithOneOf = void 0;exports.taskWithDelay = taskWithDelay;var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper"));
|
|
2
|
-
var _react = _interopRequireDefault(require("react"));
|
|
1
|
+
"use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");exports.__esModule = true;exports.emptyHandler = exports.delay = exports.CancelationError = void 0;exports.escapeRegExpSpecChars = escapeRegExpSpecChars;exports.getRandomID = exports.formatBytes = exports.extractDataProps = void 0;exports.isClassComponent = isClassComponent;exports.isExternalLink = void 0;exports.isFunction = isFunction;exports.isFunctionalComponent = isFunctionalComponent;exports.isIntrinsicElement = isIntrinsicElement;exports.isReactUINode = exports.isReactUIComponent = exports.isNullable = exports.isNonNullable = void 0;exports.isRefableElement = isRefableElement;exports.mergeRefs = mergeRefs;exports.startsWithOneOf = void 0;exports.taskWithDelay = taskWithDelay;var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper"));var _react = _interopRequireDefault(require("react"));
|
|
3
2
|
var _reactIs = require("react-is");
|
|
4
3
|
|
|
5
4
|
var _client = require("./client");
|
package/cjs/lib/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["utils.ts"],"names":["delay","ms","Promise","resolve","setTimeout","emptyHandler","CancelationError","code","Error","taskWithDelay","task","cancelationToken","reject","then","catch","isFunction","x","isFunctionalComponent","Component","Boolean","prototype","isReactComponent","isClassComponent","isIntrinsicElement","element","type","isRefableElement","escapeRegExpSpecChars","s","replace","getRandomID","Math","random","toString","slice","isExternalLink","link","RegExp","isBrowser","window","location","host","test","isReactUINode","componentName","node","React","isValidElement","Object","hasOwnProperty","call","__KONTUR_REACT_UI__","KB","UNITS","calculateDecimals","decimals","formatBytes","bytes","calculatedDecimals","i","floor","log2","formattedBytes","parseFloat","pow","toFixed","isNonNullable","value","undefined","isNullable","isReactUIComponent","name","child","mergeRefs","refs","forEach","ref","current","extractDataProps","props","dataProps","restWithoutDataProps","entries","map","startsWith","startsWithOneOf","searchKeys","inputString","keyIndex","findIndex","key"],"mappings":"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","sourcesContent":["import { ReactComponentLike } from 'prop-types';\nimport React from 'react';\nimport { isForwardRef } from 'react-is';\n\nimport { isBrowser } from './client';\n\n// NOTE: Copy-paste from @types/react\nexport type Defaultize<P, D> = P extends any\n ? string extends keyof P\n ? P\n : Pick<P, Exclude<keyof P, keyof D>> &\n Partial<Pick<P, Extract<keyof P, keyof D>>> &\n Partial<Pick<D, Exclude<keyof D, keyof P>>>\n : never;\n\nexport type DefaultizeProps<C, P> = C extends { defaultProps: infer D } ? Defaultize<P, D> : P;\n\nexport type AnyObject = Record<string, unknown>;\n\nexport const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport const emptyHandler = () => {\n /* noop */\n};\n\nexport class CancelationError extends Error {\n public code = 'CancelationError';\n}\n\nexport function taskWithDelay(task: () => void, ms: number) {\n let cancelationToken: () => void = () => null;\n\n new Promise((resolve, reject) => {\n cancelationToken = reject;\n setTimeout(resolve, ms);\n })\n .then(task)\n .catch(() => null);\n\n return cancelationToken;\n}\n\nexport type FunctionWithParams<R = any> = (...args: any[]) => R;\nexport function isFunction<T>(x: T | FunctionWithParams): x is FunctionWithParams {\n return typeof x === 'function';\n}\n\nexport function isFunctionalComponent(Component: ReactComponentLike): boolean {\n return Boolean(typeof Component === 'function' && !(Component.prototype && Component.prototype.isReactComponent));\n}\n\nexport function isClassComponent(Component: ReactComponentLike): boolean {\n return Boolean(typeof Component === 'function' && Component.prototype && Component.prototype.isReactComponent);\n}\n\nexport function isIntrinsicElement(element: React.ReactElement): boolean {\n return typeof element.type === 'string';\n}\n\nexport function isRefableElement(element: React.ReactElement): boolean {\n return Boolean(isIntrinsicElement(element) || isClassComponent(element.type) || isForwardRef(element));\n}\n\nexport function escapeRegExpSpecChars(s: string): string {\n return s.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nexport const getRandomID = (): string => Math.random().toString(16).slice(2);\n\nexport const isExternalLink = (link: string): boolean => {\n return new RegExp(`^(https?:)?//${isBrowser ? `(?!${window.location.host})` : ``}\\\\S+`, 'gi').test(link);\n};\n\n/**\n * Check if the given ReactNode is an element of the specified ReactUI component\n */\nexport const isReactUINode = (componentName: string, node: React.ReactNode): boolean => {\n if (React.isValidElement(node)) {\n return (\n Object.prototype.hasOwnProperty.call(node.type, '__KONTUR_REACT_UI__') &&\n // @ts-expect-error: React doesn't know about existence of __KONTUR_REACT_UI__.\n node.type.__KONTUR_REACT_UI__ === componentName\n );\n }\n\n return false;\n};\n\nconst KB = 1024;\nconst UNITS = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\nconst calculateDecimals = (decimals: number) => {\n if (decimals < 0) {\n return 0;\n }\n\n return 0;\n};\n\nexport const formatBytes = (bytes: number, decimals = 2): string | null => {\n if (bytes === 0) {\n return '0 Bytes';\n }\n\n if (!bytes) {\n return null;\n }\n\n const calculatedDecimals = calculateDecimals(decimals);\n\n const i = Math.floor(Math.log2(bytes) / Math.log2(KB));\n const formattedBytes = parseFloat((bytes / Math.pow(KB, i)).toFixed(calculatedDecimals));\n\n return `${formattedBytes} ${UNITS[i]}`;\n};\n\n/**\n * Проверяет, не является ли переданный аргумент null или undefined и исключает типы null и undefined из типа аргумента\n *\n * @param value Значение, которое нужно проверить и исключить из него типы\n * @returns Возвращает true, если переданный аргумент не является null или undefined иначе false\n */\nexport const isNonNullable = <T>(value: T): value is NonNullable<T> => {\n return value !== null && value !== undefined;\n};\n\n/**\n * Checks if the value `null` or `undefined`.\n *\n * @param value Value to check for `null` and `undefined`.\n * @returns Returns `true` if `value` is `null` or `undefined`, else `false`.\n */\nexport const isNullable = (value: unknown): value is null | undefined => {\n return value === null || value === undefined;\n};\n\n/**\n * Creates a function that checks if the given `child`\n * is an instance of some component specified by `name`.\n *\n * @param name Component name for which function will be created.\n * @returns A function that checks if the given `child` is an instance of the component specified by `name`.\n */\nexport const isReactUIComponent = <P = any>(name: string) => {\n return (child: React.ReactNode): child is React.ReactElement<P> => {\n // @ts-expect-error: Property `type` doesn't exist on type `React.ReactNode`, but exists on type `React.ReactElement` meanwhile `React.ReactElement` is not compatible with `React` `children` type.\n return child?.type?.__KONTUR_REACT_UI__ === name;\n };\n};\n\n/**\n * Merges two or more refs into one.\n *\n * @param refs Array of refs.\n * @returns A single ref composing all the refs passed.\n *\n * @example\n * const SomeComponent = forwardRef((props, ref) => {\n * const localRef = useRef();\n *\n * return <div ref={mergeRefs([localRef, ref])} />;\n * });\n */\nexport function mergeRefs<T = any>(refs: Array<React.MutableRefObject<T> | React.LegacyRef<T>>): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === 'function') {\n return ref(value);\n } else if (isNonNullable(ref)) {\n return ((ref as React.MutableRefObject<T | null>).current = value);\n }\n });\n };\n}\n\n/**\n * Extracts all data attributes from props and returns them as well as props.\n *\n * @param props Props object to extract data attributes from.\n * @returns Separated data attributes and all other props.\n */\nexport const extractDataProps = <T>(props: T) => {\n const dataProps: Record<string, any> = {};\n const restWithoutDataProps: Record<string, any> = {};\n\n Object.entries(props).map(([name, value]) => {\n if (name.startsWith('data-')) {\n return (dataProps[name] = value);\n }\n\n return (restWithoutDataProps[name] = value);\n });\n\n return { dataProps, restWithoutDataProps };\n};\n\n/**\n * Basically `.startsWith` for arrays.\n *\n * @param searchKeys Array of strings to test against `inputString`.\n * @param inputString String on which search will be performed.\n * @returns `true` if `inputString` starts with one of keys, else `false`.\n */\nexport const startsWithOneOf = (searchKeys: string[], inputString: string) => {\n const keyIndex = searchKeys.findIndex((key) => {\n return inputString.startsWith(key);\n });\n\n return keyIndex >= 0;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["utils.ts"],"names":["delay","ms","Promise","resolve","setTimeout","emptyHandler","CancelationError","code","Error","taskWithDelay","task","cancelationToken","reject","then","catch","isFunction","x","isFunctionalComponent","Component","Boolean","prototype","isReactComponent","isClassComponent","isIntrinsicElement","element","type","isRefableElement","escapeRegExpSpecChars","s","replace","getRandomID","Math","random","toString","slice","isExternalLink","link","RegExp","isBrowser","window","location","host","test","isReactUINode","componentName","node","React","isValidElement","Object","hasOwnProperty","call","__KONTUR_REACT_UI__","KB","UNITS","calculateDecimals","decimals","formatBytes","bytes","calculatedDecimals","i","floor","log2","formattedBytes","parseFloat","pow","toFixed","isNonNullable","value","undefined","isNullable","isReactUIComponent","name","child","mergeRefs","refs","forEach","ref","current","extractDataProps","props","dataProps","restWithoutDataProps","entries","map","startsWith","startsWithOneOf","searchKeys","inputString","keyIndex","findIndex","key"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { isForwardRef } from 'react-is';\n\nimport { isBrowser } from './client';\n\n// NOTE: Copy-paste from @types/react\nexport type Defaultize<P, D> = P extends any\n ? string extends keyof P\n ? P\n : Pick<P, Exclude<keyof P, keyof D>> &\n Partial<Pick<P, Extract<keyof P, keyof D>>> &\n Partial<Pick<D, Exclude<keyof D, keyof P>>>\n : never;\n\nexport type DefaultizeProps<C, P> = C extends { defaultProps: infer D } ? Defaultize<P, D> : P;\n\nexport type AnyObject = Record<string, unknown>;\n\nexport const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport const emptyHandler = () => {\n /* noop */\n};\n\nexport class CancelationError extends Error {\n public code = 'CancelationError';\n}\n\nexport function taskWithDelay(task: () => void, ms: number) {\n let cancelationToken: () => void = () => null;\n\n new Promise((resolve, reject) => {\n cancelationToken = reject;\n setTimeout(resolve, ms);\n })\n .then(task)\n .catch(() => null);\n\n return cancelationToken;\n}\n\nexport type FunctionWithParams<R = any> = (...args: any[]) => R;\nexport function isFunction<T>(x: T | FunctionWithParams): x is FunctionWithParams {\n return typeof x === 'function';\n}\n\nexport function isFunctionalComponent(Component: unknown): Component is React.ComponentType {\n return Boolean(typeof Component === 'function' && !(Component.prototype && Component.prototype.isReactComponent));\n}\n\nexport function isClassComponent(Component: unknown): Component is React.ComponentType {\n return Boolean(typeof Component === 'function' && Component.prototype && Component.prototype.isReactComponent);\n}\n\nexport function isIntrinsicElement(element: React.ReactElement): boolean {\n return typeof element.type === 'string';\n}\n\nexport function isRefableElement(element: React.ReactElement): boolean {\n return Boolean(isIntrinsicElement(element) || isClassComponent(element.type) || isForwardRef(element));\n}\n\nexport function escapeRegExpSpecChars(s: string): string {\n return s.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nexport const getRandomID = (): string => Math.random().toString(16).slice(2);\n\nexport const isExternalLink = (link: string): boolean => {\n return new RegExp(`^(https?:)?//${isBrowser ? `(?!${window.location.host})` : ``}\\\\S+`, 'gi').test(link);\n};\n\n/**\n * Check if the given ReactNode is an element of the specified ReactUI component\n */\nexport const isReactUINode = (componentName: string, node: React.ReactNode): boolean => {\n if (React.isValidElement(node)) {\n return (\n Object.prototype.hasOwnProperty.call(node.type, '__KONTUR_REACT_UI__') &&\n // @ts-expect-error: React doesn't know about existence of __KONTUR_REACT_UI__.\n node.type.__KONTUR_REACT_UI__ === componentName\n );\n }\n\n return false;\n};\n\nconst KB = 1024;\nconst UNITS = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\nconst calculateDecimals = (decimals: number) => {\n if (decimals < 0) {\n return 0;\n }\n\n return 0;\n};\n\nexport const formatBytes = (bytes: number, decimals = 2): string | null => {\n if (bytes === 0) {\n return '0 Bytes';\n }\n\n if (!bytes) {\n return null;\n }\n\n const calculatedDecimals = calculateDecimals(decimals);\n\n const i = Math.floor(Math.log2(bytes) / Math.log2(KB));\n const formattedBytes = parseFloat((bytes / Math.pow(KB, i)).toFixed(calculatedDecimals));\n\n return `${formattedBytes} ${UNITS[i]}`;\n};\n\n/**\n * Проверяет, не является ли переданный аргумент null или undefined и исключает типы null и undefined из типа аргумента\n *\n * @param value Значение, которое нужно проверить и исключить из него типы\n * @returns Возвращает true, если переданный аргумент не является null или undefined иначе false\n */\nexport const isNonNullable = <T>(value: T): value is NonNullable<T> => {\n return value !== null && value !== undefined;\n};\n\n/**\n * Checks if the value `null` or `undefined`.\n *\n * @param value Value to check for `null` and `undefined`.\n * @returns Returns `true` if `value` is `null` or `undefined`, else `false`.\n */\nexport const isNullable = (value: unknown): value is null | undefined => {\n return value === null || value === undefined;\n};\n\n/**\n * Creates a function that checks if the given `child`\n * is an instance of some component specified by `name`.\n *\n * @param name Component name for which function will be created.\n * @returns A function that checks if the given `child` is an instance of the component specified by `name`.\n */\nexport const isReactUIComponent = <P = any>(name: string) => {\n return (child: React.ReactNode): child is React.ReactElement<P> => {\n // @ts-expect-error: Property `type` doesn't exist on type `React.ReactNode`, but exists on type `React.ReactElement` meanwhile `React.ReactElement` is not compatible with `React` `children` type.\n return child?.type?.__KONTUR_REACT_UI__ === name;\n };\n};\n\n/**\n * Merges two or more refs into one.\n *\n * @param refs Array of refs.\n * @returns A single ref composing all the refs passed.\n *\n * @example\n * const SomeComponent = forwardRef((props, ref) => {\n * const localRef = useRef();\n *\n * return <div ref={mergeRefs([localRef, ref])} />;\n * });\n */\nexport function mergeRefs<T = any>(refs: Array<React.MutableRefObject<T> | React.LegacyRef<T>>): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === 'function') {\n return ref(value);\n } else if (isNonNullable(ref)) {\n return ((ref as React.MutableRefObject<T | null>).current = value);\n }\n });\n };\n}\n\n/**\n * Extracts all data attributes from props and returns them as well as props.\n *\n * @param props Props object to extract data attributes from.\n * @returns Separated data attributes and all other props.\n */\nexport const extractDataProps = <T>(props: T) => {\n const dataProps: Record<string, any> = {};\n const restWithoutDataProps: Record<string, any> = {};\n\n Object.entries(props).map(([name, value]) => {\n if (name.startsWith('data-')) {\n return (dataProps[name] = value);\n }\n\n return (restWithoutDataProps[name] = value);\n });\n\n return { dataProps, restWithoutDataProps };\n};\n\n/**\n * Basically `.startsWith` for arrays.\n *\n * @param searchKeys Array of strings to test against `inputString`.\n * @param inputString String on which search will be performed.\n * @returns `true` if `inputString` starts with one of keys, else `false`.\n */\nexport const startsWithOneOf = (searchKeys: string[], inputString: string) => {\n const keyIndex = searchKeys.findIndex((key) => {\n return inputString.startsWith(key);\n });\n\n return keyIndex >= 0;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["ComboBox.tsx"],"names":["React","CustomComboBox","rootNode","createPropsGetter","ComboBox","getProps","defaultProps","comboboxElement","customComboBoxRef","element","setRootNode","focus","blur","search","query","cancelSearch","open","close","selectInputText","reset","render","Component","__KONTUR_REACT_UI__","itemToValue","item","value","valueToString","label","renderValue","renderItem","menuAlign","searchOnFocus","drawArrow"],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport { CustomComboBox } from '../../internal/CustomComboBox';\nimport { Nullable } from '../../typings/utility-types';\nimport { MenuItemState } from '../MenuItem';\nimport { InputIconType } from '../Input';\nimport { CommonProps } from '../../internal/CommonWrapper';\nimport { rootNode, TSetRootNode } from '../../lib/rootNode';\nimport { createPropsGetter } from '../../lib/createPropsGetter';\n\nexport interface ComboBoxProps<T> extends CommonProps {\n align?: 'left' | 'center' | 'right';\n /**\n * Вызывает функцию поиска `getItems` при фокусе и очистке поля ввода\n * @default true\n */\n searchOnFocus?: boolean;\n /**\n * Рисует справа иконку в виде стрелки\n * @default true\n */\n drawArrow?: boolean;\n\n autoFocus?: boolean;\n\n borderless?: boolean;\n\n /**\n * Не использовать Portal для рендеринга меню.\n * См. https://github.com/skbkontur/retail-ui/issues/15\n * @default false\n */\n disablePortal?: boolean;\n\n disabled?: boolean;\n /**\n * Состояние валидации при ошибке.\n */\n error?: boolean;\n\n leftIcon?: InputIconType;\n\n rightIcon?: InputIconType;\n\n /**\n * Функция поиска элементов, должна возвращать Promise с массивом элементов.\n * По умолчанию ожидаются объекты с типом `{ value: string, label: string }`.\n *\n * Элементы могут быть любого типа. В этом случае необходимо определить\n * свойства `itemToValue`, `renderValue`, `renderItem`, `valueToString`\n */\n getItems: (query: string) => Promise<T[]>;\n\n /**\n * Необходим для сравнения полученных результатов с `value`\n * @default item => item.label\n */\n itemToValue?: (item: T) => string | number;\n\n maxLength?: number;\n\n menuAlign?: 'left' | 'right';\n\n onBlur?: () => void;\n\n /** Вызывается при изменении `value` */\n onValueChange?: (value: T) => void;\n\n onFocus?: () => void;\n\n /**\n * Вызывается при изменении текста в поле ввода,\n * если результатом функции будет строка,\n * то она станет следующим состоянием полем ввода\n */\n onInputValueChange?: (value: string) => Nullable<string> | void;\n\n /**\n * Функция для обработки ситуации, когда была введена\n * строка в инпут и был потерян фокус с элемента.\n *\n * Если при потере фокуса в выпадающем списке будет только один\n * элемент и результат `renderValue` с этим элементом будет\n * совпадать со значение в текстовом поле, то\n * сработает onValueChange со значением данного элемента\n *\n * Сама функция также может вернуть значение,\n * неравное `undefined`,\n * с которым будет вызван onValueChange.\n */\n onUnexpectedInput?: (value: string) => void | null | T;\n\n placeholder?: string;\n\n /**\n * Функция отрисовки элементов результата поиска.\n * Не применяется если элемент является функцией или React-элементом\n * @default item => item.label\n */\n renderItem?: (item: T, state?: MenuItemState) => React.ReactNode;\n\n /**\n * Функция для отрисовки сообщения о пустом результате поиска\n * Если есть renderAddButton - не работает\n */\n renderNotFound?: () => React.ReactNode;\n\n /**\n * Функция отображающая сообщение об общем количестве элементов.\n * `found` учитывает только компонент `MenuItem`. Им \"оборачиваются\" элементы, возвращаемые `getItems()`.\n */\n renderTotalCount?: (found: number, total: number) => React.ReactNode;\n\n /**\n * Функция отрисовки выбранного значения\n * @default item => item.label\n */\n renderValue?: (item: T) => React.ReactNode;\n\n /**\n * Функция отрисовки кнопки добавления в выпадающем списке\n */\n renderAddButton?: (query?: string) => React.ReactNode;\n\n /**\n * Общее количество элементов.\n * Необходим для работы `renderTotalCount`\n */\n totalCount?: number;\n\n /**\n * Выбранное значение\n * Ожидается, что `value` того же типа что и элементы в массиве,\n * возвращаемом в `getItems`\n */\n value?: Nullable<T>;\n\n /**\n * Необходим для преобразования `value` в строку при фокусировке\n * @default item => item.label\n */\n valueToString?: (item: T) => string;\n\n size?: 'small' | 'medium' | 'large';\n /**\n * Состояние валидации при предупреждении.\n */\n warning?: boolean;\n\n width?: string | number;\n\n maxMenuHeight?: number | string;\n\n onMouseEnter?: (e: React.MouseEvent) => void;\n\n onMouseOver?: (e: React.MouseEvent) => void;\n\n onMouseLeave?: (e: React.MouseEvent) => void;\n\n onInputKeyDown?: (e: React.KeyboardEvent<HTMLElement>) => void;\n\n inputMode?: React.HTMLAttributes<HTMLInputElement>['inputMode'];\n}\n\nexport interface ComboBoxItem {\n value: string;\n label: string;\n}\n\ntype DefaultProps<T> = Required<\n Pick<\n ComboBoxProps<T>,\n 'itemToValue' | 'valueToString' | 'renderValue' | 'renderItem' | 'menuAlign' | 'searchOnFocus' | 'drawArrow'\n >\n>;\n\n@rootNode\nexport class ComboBox<T = ComboBoxItem> extends React.Component<ComboBoxProps<T>> {\n public static __KONTUR_REACT_UI__ = 'ComboBox';\n\n public static defaultProps: DefaultProps<any> = {\n itemToValue: (item: ComboBoxItem) => item.value,\n valueToString: (item: ComboBoxItem) => item.label,\n renderValue: (item: ComboBoxItem) => item.label,\n renderItem: (item: ComboBoxItem) => item.label,\n menuAlign: 'left',\n searchOnFocus: true,\n drawArrow: true,\n };\n\n private getProps = createPropsGetter(ComboBox.defaultProps);\n\n private comboboxElement: Nullable<CustomComboBox<T>> = null;\n private setRootNode!: TSetRootNode;\n\n /**\n * @public\n */\n public focus() {\n if (this.comboboxElement) {\n this.comboboxElement.focus();\n }\n }\n\n /**\n * @public\n */\n public blur() {\n if (this.comboboxElement) {\n this.comboboxElement.blur();\n }\n }\n\n /**\n * Открывает выпадающий список и запускает поиск элементов\n *\n * @public\n * @param {string} [query] Текст поиска. По умолчанию берется\n * текст из инпута или результат `valueToString(value)`\n */\n public search(query?: string) {\n if (this.comboboxElement) {\n this.comboboxElement.search(query);\n }\n }\n\n /**\n * @public\n */\n public cancelSearch() {\n if (this.comboboxElement) {\n this.comboboxElement.cancelSearch();\n }\n }\n\n /**\n * @public Открывает выпадающий список\n */\n public open() {\n if (this.comboboxElement) {\n this.comboboxElement.open();\n }\n }\n\n /**\n * @public Закрывает выпадающий список\n */\n public close() {\n if (this.comboboxElement) {\n this.comboboxElement.close();\n }\n }\n\n /**\n * Выделяет текст внутри input\n * @public\n */\n public selectInputText() {\n if (this.comboboxElement) {\n this.comboboxElement.selectInputText();\n }\n }\n\n /**\n * Сбрасывает введенное пользователем значение\n * @public\n */\n public reset() {\n if (this.comboboxElement) {\n this.comboboxElement.reset();\n }\n }\n\n public render() {\n return <CustomComboBox {...this.getProps()} ref={this.customComboBoxRef} />;\n }\n\n private customComboBoxRef = (element: Nullable<CustomComboBox<T>>) => {\n this.setRootNode(element);\n this.comboboxElement = element;\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["ComboBox.tsx"],"names":["React","CustomComboBox","rootNode","createPropsGetter","ComboBox","getProps","defaultProps","comboboxElement","customComboBoxRef","element","setRootNode","focus","blur","search","query","cancelSearch","open","close","selectInputText","reset","render","Component","__KONTUR_REACT_UI__","itemToValue","item","value","valueToString","label","renderValue","renderItem","menuAlign","searchOnFocus","drawArrow"],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport { CustomComboBox } from '../../internal/CustomComboBox';\nimport { Nullable } from '../../typings/utility-types';\nimport { MenuItemState } from '../MenuItem';\nimport { InputIconType } from '../Input';\nimport { CommonProps } from '../../internal/CommonWrapper';\nimport { rootNode, TSetRootNode } from '../../lib/rootNode';\nimport { createPropsGetter } from '../../lib/createPropsGetter';\n\nexport interface ComboBoxProps<T> extends CommonProps {\n align?: 'left' | 'center' | 'right';\n /**\n * Вызывает функцию поиска `getItems` при фокусе и очистке поля ввода\n * @default true\n */\n searchOnFocus?: boolean;\n /**\n * Рисует справа иконку в виде стрелки\n * @default true\n */\n drawArrow?: boolean;\n\n autoFocus?: boolean;\n\n borderless?: boolean;\n\n /**\n * Не использовать Portal для рендеринга меню.\n * См. https://github.com/skbkontur/retail-ui/issues/15\n * @default false\n */\n disablePortal?: boolean;\n\n disabled?: boolean;\n /**\n * Состояние валидации при ошибке.\n */\n error?: boolean;\n\n leftIcon?: InputIconType;\n\n rightIcon?: InputIconType;\n\n /**\n * Функция поиска элементов, должна возвращать Promise с массивом элементов.\n * По умолчанию ожидаются объекты с типом `{ value: string, label: string }`.\n *\n * Элементы могут быть любого типа. В этом случае необходимо определить\n * свойства `itemToValue`, `renderValue`, `renderItem`, `valueToString`\n */\n getItems: (query: string) => Promise<T[]>;\n\n /**\n * Необходим для сравнения полученных результатов с `value`\n * @default item => item.label\n */\n itemToValue?: (item: T) => string | number;\n\n maxLength?: number;\n\n menuAlign?: 'left' | 'right';\n\n onBlur?: () => void;\n\n /** Вызывается при изменении `value` */\n onValueChange?: (value: T) => void;\n\n onFocus?: () => void;\n\n /**\n * Вызывается при изменении текста в поле ввода,\n * если результатом функции будет строка,\n * то она станет следующим состоянием полем ввода\n */\n onInputValueChange?: (value: string) => Nullable<string> | void;\n\n /**\n * Функция для обработки ситуации, когда была введена\n * строка в инпут и был потерян фокус с элемента.\n *\n * Если при потере фокуса в выпадающем списке будет только один\n * элемент и результат `renderValue` с этим элементом будет\n * совпадать со значение в текстовом поле, то\n * сработает onValueChange со значением данного элемента\n *\n * Сама функция также может вернуть значение,\n * неравное `undefined`,\n * с которым будет вызван onValueChange.\n */\n onUnexpectedInput?: (value: string) => void | null | T;\n\n placeholder?: string;\n\n /**\n * Функция отрисовки элементов результата поиска.\n * Не применяется если элемент является функцией или React-элементом\n * @default item => item.label\n */\n renderItem?: (item: T, state?: MenuItemState) => React.ReactNode;\n\n /**\n * Компонент, заменяющий собой обёртку элементов результата поиска.\n *\n * По умолчанию все элементы результата поиска оборачиваются в тег `<button />`.\n *\n * @example\n * itemWrapper={(item) => {\n * if (item.value === 3) {\n * return (props) => {\n * return <a {...props} />\n * }\n * }\n * }}\n */\n itemWrapper?: (item?: T) => React.ComponentType<unknown>;\n\n /**\n * Функция для отрисовки сообщения о пустом результате поиска\n * Если есть renderAddButton - не работает\n */\n renderNotFound?: () => React.ReactNode;\n\n /**\n * Функция отображающая сообщение об общем количестве элементов.\n * `found` учитывает только компонент `MenuItem`. Им \"оборачиваются\" элементы, возвращаемые `getItems()`.\n */\n renderTotalCount?: (found: number, total: number) => React.ReactNode;\n\n /**\n * Функция отрисовки выбранного значения\n * @default item => item.label\n */\n renderValue?: (item: T) => React.ReactNode;\n\n /**\n * Функция отрисовки кнопки добавления в выпадающем списке\n */\n renderAddButton?: (query?: string) => React.ReactNode;\n\n /**\n * Общее количество элементов.\n * Необходим для работы `renderTotalCount`\n */\n totalCount?: number;\n\n /**\n * Выбранное значение\n * Ожидается, что `value` того же типа что и элементы в массиве,\n * возвращаемом в `getItems`\n */\n value?: Nullable<T>;\n\n /**\n * Необходим для преобразования `value` в строку при фокусировке\n * @default item => item.label\n */\n valueToString?: (item: T) => string;\n\n size?: 'small' | 'medium' | 'large';\n /**\n * Состояние валидации при предупреждении.\n */\n warning?: boolean;\n\n width?: string | number;\n\n maxMenuHeight?: number | string;\n\n onMouseEnter?: (e: React.MouseEvent) => void;\n\n onMouseOver?: (e: React.MouseEvent) => void;\n\n onMouseLeave?: (e: React.MouseEvent) => void;\n\n onInputKeyDown?: (e: React.KeyboardEvent<HTMLElement>) => void;\n\n inputMode?: React.HTMLAttributes<HTMLInputElement>['inputMode'];\n}\n\nexport interface ComboBoxItem {\n value: string;\n label: string;\n}\n\ntype DefaultProps<T> = Required<\n Pick<\n ComboBoxProps<T>,\n 'itemToValue' | 'valueToString' | 'renderValue' | 'renderItem' | 'menuAlign' | 'searchOnFocus' | 'drawArrow'\n >\n>;\n\n@rootNode\nexport class ComboBox<T = ComboBoxItem> extends React.Component<ComboBoxProps<T>> {\n public static __KONTUR_REACT_UI__ = 'ComboBox';\n\n public static defaultProps: DefaultProps<any> = {\n itemToValue: (item: ComboBoxItem) => item.value,\n valueToString: (item: ComboBoxItem) => item.label,\n renderValue: (item: ComboBoxItem) => item.label,\n renderItem: (item: ComboBoxItem) => item.label,\n menuAlign: 'left',\n searchOnFocus: true,\n drawArrow: true,\n };\n\n private getProps = createPropsGetter(ComboBox.defaultProps);\n\n private comboboxElement: Nullable<CustomComboBox<T>> = null;\n private setRootNode!: TSetRootNode;\n\n /**\n * @public\n */\n public focus() {\n if (this.comboboxElement) {\n this.comboboxElement.focus();\n }\n }\n\n /**\n * @public\n */\n public blur() {\n if (this.comboboxElement) {\n this.comboboxElement.blur();\n }\n }\n\n /**\n * Открывает выпадающий список и запускает поиск элементов\n *\n * @public\n * @param {string} [query] Текст поиска. По умолчанию берется\n * текст из инпута или результат `valueToString(value)`\n */\n public search(query?: string) {\n if (this.comboboxElement) {\n this.comboboxElement.search(query);\n }\n }\n\n /**\n * @public\n */\n public cancelSearch() {\n if (this.comboboxElement) {\n this.comboboxElement.cancelSearch();\n }\n }\n\n /**\n * @public Открывает выпадающий список\n */\n public open() {\n if (this.comboboxElement) {\n this.comboboxElement.open();\n }\n }\n\n /**\n * @public Закрывает выпадающий список\n */\n public close() {\n if (this.comboboxElement) {\n this.comboboxElement.close();\n }\n }\n\n /**\n * Выделяет текст внутри input\n * @public\n */\n public selectInputText() {\n if (this.comboboxElement) {\n this.comboboxElement.selectInputText();\n }\n }\n\n /**\n * Сбрасывает введенное пользователем значение\n * @public\n */\n public reset() {\n if (this.comboboxElement) {\n this.comboboxElement.reset();\n }\n }\n\n public render() {\n return <CustomComboBox {...this.getProps()} ref={this.customComboBoxRef} />;\n }\n\n private customComboBoxRef = (element: Nullable<CustomComboBox<T>>) => {\n this.setRootNode(element);\n this.comboboxElement = element;\n };\n}\n"]}
|
|
@@ -76,6 +76,21 @@ export interface ComboBoxProps<T> extends CommonProps {
|
|
|
76
76
|
* @default item => item.label
|
|
77
77
|
*/
|
|
78
78
|
renderItem?: (item: T, state?: MenuItemState) => React.ReactNode;
|
|
79
|
+
/**
|
|
80
|
+
* Компонент, заменяющий собой обёртку элементов результата поиска.
|
|
81
|
+
*
|
|
82
|
+
* По умолчанию все элементы результата поиска оборачиваются в тег `<button />`.
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* itemWrapper={(item) => {
|
|
86
|
+
* if (item.value === 3) {
|
|
87
|
+
* return (props) => {
|
|
88
|
+
* return <a {...props} />
|
|
89
|
+
* }
|
|
90
|
+
* }
|
|
91
|
+
* }}
|
|
92
|
+
*/
|
|
93
|
+
itemWrapper?: (item?: T) => React.ComponentType<unknown>;
|
|
79
94
|
/**
|
|
80
95
|
* Функция для отрисовки сообщения о пустом результате поиска
|
|
81
96
|
* Если есть renderAddButton - не работает
|
|
@@ -147,7 +147,7 @@ let renderItem = item => (
|
|
|
147
147
|
/>;
|
|
148
148
|
```
|
|
149
149
|
|
|
150
|
-
Переопределение renderValue и
|
|
150
|
+
Переопределение `renderValue`, `renderItem` и `itemWrapper`:
|
|
151
151
|
|
|
152
152
|
```jsx harmony
|
|
153
153
|
import OkIcon from '@skbkontur/react-icons/Ok';
|
|
@@ -226,6 +226,14 @@ const customRenderItem = item => (
|
|
|
226
226
|
</div>
|
|
227
227
|
);
|
|
228
228
|
|
|
229
|
+
const customItemWrapper = item => {
|
|
230
|
+
if (item.value === 3) {
|
|
231
|
+
return (props) => <div {...props} />;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return (props) => <button {...props} />
|
|
235
|
+
}
|
|
236
|
+
|
|
229
237
|
const customRenderValue = item => (
|
|
230
238
|
<div
|
|
231
239
|
style={{
|
|
@@ -261,6 +269,7 @@ const customRenderValue = item => (
|
|
|
261
269
|
placeholder="Enter number"
|
|
262
270
|
value={selected}
|
|
263
271
|
renderItem={customRenderItem}
|
|
272
|
+
itemWrapper={customItemWrapper}
|
|
264
273
|
renderValue={customRenderValue}
|
|
265
274
|
width="400px"
|
|
266
275
|
/>
|
|
@@ -126,7 +126,7 @@ import { MenuItem } from '@skbkontur/react-ui';
|
|
|
126
126
|
Пример с чекбоксом внутри MenuItem.
|
|
127
127
|
|
|
128
128
|
```jsx harmony
|
|
129
|
-
import { MenuItem, Checkbox, Button } from '@skbkontur/react-ui';
|
|
129
|
+
import { MenuItem, Checkbox, Button, ThemeContext, ThemeFactory } from '@skbkontur/react-ui';
|
|
130
130
|
|
|
131
131
|
const [checked, setChecked] = React.useState(false);
|
|
132
132
|
|
|
@@ -143,14 +143,16 @@ const renderCaption = ({ openMenu, closeMenu }) => {
|
|
|
143
143
|
|
|
144
144
|
<DropdownMenu caption={renderCaption}>
|
|
145
145
|
<MenuItem onClick={(e) => e.preventDefault()}>Просто пункт</MenuItem>
|
|
146
|
-
<
|
|
147
|
-
|
|
148
|
-
e
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
146
|
+
<ThemeContext.Provider value={ThemeFactory.create({ menuItemHoverBg: 'initial' })}>
|
|
147
|
+
<MenuItem
|
|
148
|
+
onClick={(e) => {
|
|
149
|
+
e.preventDefault();
|
|
150
|
+
setChecked(!checked);
|
|
151
|
+
}}
|
|
152
|
+
>
|
|
153
|
+
<Checkbox checked={checked}>с чекбоксом</Checkbox>
|
|
154
|
+
</MenuItem>
|
|
155
|
+
</ThemeContext.Provider>
|
|
154
156
|
<MenuItem
|
|
155
157
|
onClick={(e) => {
|
|
156
158
|
e.preventDefault();
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
3
3
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
4
|
-
var _excluded = ["disabled", "error", "warning", "multiple", "width", "hideFiles", "onBlur", "onFocus", "onChange", "request", "validateBeforeUpload", "onRequestSuccess", "onRequestError", "renderFile"];
|
|
4
|
+
var _excluded = ["disabled", "error", "warning", "multiple", "width", "hideFiles", "onBlur", "onFocus", "onChange", "request", "validateBeforeUpload", "onRequestSuccess", "onRequestError", "size", "renderFile"];
|
|
5
5
|
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
6
|
-
import React, { useCallback, useContext, useImperativeHandle, useRef, useState } from 'react';
|
|
6
|
+
import React, { useCallback, useContext, useEffect, useImperativeHandle, useRef, useState } from 'react';
|
|
7
7
|
import { getAttachedFile } from "../../../internal/FileUploaderControl/fileUtils";
|
|
8
8
|
import { cx } from "../../../lib/theming/Emotion";
|
|
9
9
|
import { useMemoObject } from "../../../hooks/useMemoObject";
|
|
@@ -20,6 +20,7 @@ import { FileUploaderFileList } from "../../../internal/FileUploaderControl/File
|
|
|
20
20
|
import { isBrowser } from "../../../lib/client";
|
|
21
21
|
import { CommonWrapper } from "../../../internal/CommonWrapper";
|
|
22
22
|
import { FileUploaderFileValidationResult } from "../../../internal/FileUploaderControl/FileUploaderFileValidationResult";
|
|
23
|
+
import { useFileUploaderSize } from "../../../internal/FileUploaderControl/hooks/useFileUploaderSize";
|
|
23
24
|
import { jsStyles } from "../FileUploader.styles";
|
|
24
25
|
|
|
25
26
|
var stopPropagation = function stopPropagation(e) {
|
|
@@ -37,7 +38,7 @@ var defaultRenderFile = function defaultRenderFile(file, fileNode) {
|
|
|
37
38
|
};
|
|
38
39
|
|
|
39
40
|
var _FileUploader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
40
|
-
var _cx, _cx2, _cx3, _cx4;
|
|
41
|
+
var _cx, _cx2, _cx3, _cx4, _cx5;
|
|
41
42
|
|
|
42
43
|
var theme = useContext(ThemeContext);
|
|
43
44
|
|
|
@@ -57,6 +58,8 @@ var _FileUploader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
57
58
|
validateBeforeUpload = props.validateBeforeUpload,
|
|
58
59
|
onRequestSuccess = props.onRequestSuccess,
|
|
59
60
|
onRequestError = props.onRequestError,
|
|
61
|
+
_props$size = props.size,
|
|
62
|
+
size = _props$size === void 0 ? 'small' : _props$size,
|
|
60
63
|
_props$renderFile = props.renderFile,
|
|
61
64
|
renderFile = _props$renderFile === void 0 ? defaultRenderFile : _props$renderFile,
|
|
62
65
|
inputProps = _objectWithoutPropertiesLoose(props, _excluded);
|
|
@@ -66,12 +69,19 @@ var _FileUploader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
66
69
|
setFiles = _useContext.setFiles,
|
|
67
70
|
removeFile = _useContext.removeFile,
|
|
68
71
|
reset = _useContext.reset,
|
|
69
|
-
setFileValidationResult = _useContext.setFileValidationResult
|
|
72
|
+
setFileValidationResult = _useContext.setFileValidationResult,
|
|
73
|
+
isMinLengthReached = _useContext.isMinLengthReached;
|
|
70
74
|
|
|
71
75
|
var locale = useControlLocale();
|
|
72
76
|
var inputRef = useRef(null);
|
|
77
|
+
var fileDivRef = useRef(null);
|
|
73
78
|
var isAsync = !!request;
|
|
74
79
|
var isSingleMode = !multiple;
|
|
80
|
+
|
|
81
|
+
var _useState = useState(true),
|
|
82
|
+
isLinkVisible = _useState[0],
|
|
83
|
+
setIsLinkVisible = _useState[1];
|
|
84
|
+
|
|
75
85
|
var upload = useUpload(request, onRequestSuccess, onRequestError);
|
|
76
86
|
var tryValidateAndUpload = useCallback(function (files) {
|
|
77
87
|
files.forEach( /*#__PURE__*/function () {
|
|
@@ -116,6 +126,21 @@ var _FileUploader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
116
126
|
};
|
|
117
127
|
}());
|
|
118
128
|
}, [validateBeforeUpload, isAsync, upload, setFileValidationResult]);
|
|
129
|
+
var sizeClassName = useFileUploaderSize(size, {
|
|
130
|
+
small: cx(jsStyles.sizeSmall(theme)),
|
|
131
|
+
medium: cx(jsStyles.sizeMedium(theme)),
|
|
132
|
+
large: cx(jsStyles.sizeLarge(theme))
|
|
133
|
+
});
|
|
134
|
+
var sizeIconClass = useFileUploaderSize(size, {
|
|
135
|
+
small: jsStyles.iconSmall(theme),
|
|
136
|
+
medium: jsStyles.iconMedium(theme),
|
|
137
|
+
large: jsStyles.iconLarge(theme)
|
|
138
|
+
});
|
|
139
|
+
var contentInnerClass = useFileUploaderSize(size, {
|
|
140
|
+
small: jsStyles.contentInnerSmall(theme),
|
|
141
|
+
medium: jsStyles.contentInnerMedium(theme),
|
|
142
|
+
large: jsStyles.contentInnerLarge(theme)
|
|
143
|
+
});
|
|
119
144
|
/** common part **/
|
|
120
145
|
|
|
121
146
|
var handleChange = useCallback(function (newFiles) {
|
|
@@ -190,9 +215,9 @@ var _FileUploader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
190
215
|
};
|
|
191
216
|
}, [ref, blur, focus, reset]);
|
|
192
217
|
|
|
193
|
-
var
|
|
194
|
-
focusedByTab =
|
|
195
|
-
setFocusedByTab =
|
|
218
|
+
var _useState2 = useState(false),
|
|
219
|
+
focusedByTab = _useState2[0],
|
|
220
|
+
setFocusedByTab = _useState2[1];
|
|
196
221
|
|
|
197
222
|
var handleInputChange = function handleInputChange(event) {
|
|
198
223
|
onChange == null ? void 0 : onChange(event);
|
|
@@ -220,16 +245,20 @@ var _FileUploader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
220
245
|
}
|
|
221
246
|
};
|
|
222
247
|
|
|
223
|
-
var
|
|
224
|
-
hovered =
|
|
225
|
-
setHovered =
|
|
248
|
+
var _useState3 = useState(false),
|
|
249
|
+
hovered = _useState3[0],
|
|
250
|
+
setHovered = _useState3[1];
|
|
226
251
|
|
|
227
|
-
var uploadButtonClassNames = cx(jsStyles.uploadButton(theme), (_cx = {}, _cx[jsStyles.uploadButtonFocus(theme)] = focusedByTab, _cx[jsStyles.disabled(theme)] = disabled, _cx[jsStyles.hovered(theme)] = !disabled && hovered, _cx[jsStyles.warning(theme)] = !!warning, _cx[jsStyles.error(theme)] = !!error, _cx[jsStyles.dragOver(theme)] = isDraggable && !disabled, _cx));
|
|
252
|
+
var uploadButtonClassNames = cx(jsStyles.uploadButton(theme), (_cx = {}, _cx[jsStyles.uploadButtonFocus(theme)] = focusedByTab, _cx[jsStyles.disabled(theme)] = disabled, _cx[jsStyles.hovered(theme)] = !disabled && hovered, _cx[jsStyles.warning(theme)] = !!warning, _cx[jsStyles.error(theme)] = !!error, _cx[jsStyles.dragOver(theme)] = isDraggable && !disabled, _cx[sizeClassName] = true, _cx));
|
|
228
253
|
var uploadButtonWrapperClassNames = cx((_cx2 = {}, _cx2[jsStyles.windowDragOver(theme)] = isWindowDraggable && !disabled, _cx2));
|
|
229
|
-
var uploadButtonIconClassNames = cx(jsStyles.icon(theme), (_cx3 = {}, _cx3[jsStyles.iconDisabled(theme)] = disabled, _cx3));
|
|
254
|
+
var uploadButtonIconClassNames = cx(jsStyles.icon(theme), (_cx3 = {}, _cx3[jsStyles.iconDisabled(theme)] = disabled, _cx3[sizeIconClass] = true, _cx3));
|
|
230
255
|
var hasOneFile = files.length === 1;
|
|
231
256
|
var hasOneFileForSingle = isSingleMode && hasOneFile && !hideFiles;
|
|
232
|
-
var
|
|
257
|
+
var contentClassNames = cx(jsStyles.content(), (_cx4 = {}, _cx4[jsStyles.contentWithFiles()] = hasOneFileForSingle, _cx4));
|
|
258
|
+
var linkClassNames = cx(jsStyles.link(theme), (_cx5 = {}, _cx5[jsStyles.linkHovered(theme)] = !disabled && hovered, _cx5[jsStyles.linkDisabled(theme)] = disabled, _cx5));
|
|
259
|
+
useEffect(function () {
|
|
260
|
+
setIsLinkVisible(hasOneFileForSingle ? !isMinLengthReached : true);
|
|
261
|
+
}, [isMinLengthReached, hasOneFileForSingle]);
|
|
233
262
|
var rootNodeRef = useRef(null);
|
|
234
263
|
return /*#__PURE__*/React.createElement(CommonWrapper, props, /*#__PURE__*/React.createElement("div", {
|
|
235
264
|
"data-tid": FileUploaderDataTids.root,
|
|
@@ -239,7 +268,8 @@ var _FileUploader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
239
268
|
}),
|
|
240
269
|
ref: rootNodeRef
|
|
241
270
|
}, !hideFiles && !isSingleMode && !!files.length && /*#__PURE__*/React.createElement(FileUploaderFileList, {
|
|
242
|
-
renderFile: renderFile
|
|
271
|
+
renderFile: renderFile,
|
|
272
|
+
size: size
|
|
243
273
|
}), /*#__PURE__*/React.createElement("div", {
|
|
244
274
|
className: uploadButtonWrapperClassNames
|
|
245
275
|
}, /*#__PURE__*/React.createElement("label", {
|
|
@@ -251,21 +281,27 @@ var _FileUploader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
251
281
|
},
|
|
252
282
|
ref: labelRef,
|
|
253
283
|
className: uploadButtonClassNames
|
|
284
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
285
|
+
className: contentInnerClass
|
|
254
286
|
}, /*#__PURE__*/React.createElement("div", {
|
|
255
287
|
"data-tid": FileUploaderDataTids.content,
|
|
256
|
-
className:
|
|
257
|
-
}, /*#__PURE__*/React.createElement("span", {
|
|
288
|
+
className: contentClassNames
|
|
289
|
+
}, isLinkVisible && /*#__PURE__*/React.createElement("span", {
|
|
258
290
|
"data-tid": FileUploaderDataTids.link,
|
|
259
291
|
className: linkClassNames
|
|
260
|
-
}, hasOneFileForSingle ? locale.choosedFile : locale.chooseFile),
|
|
261
|
-
|
|
292
|
+
}, hasOneFileForSingle ? locale.choosedFile : locale.chooseFile), isLinkVisible && String.fromCharCode(0xa0)
|
|
293
|
+
/* */
|
|
294
|
+
, /*#__PURE__*/React.createElement("div", {
|
|
295
|
+
className: hasOneFileForSingle ? jsStyles.afterLinkText_HasFiles() : jsStyles.afterLinkText()
|
|
262
296
|
}, hasOneFileForSingle ? /*#__PURE__*/React.createElement("div", {
|
|
297
|
+
ref: fileDivRef,
|
|
263
298
|
className: jsStyles.singleFile()
|
|
264
299
|
}, renderFile(files[0], /*#__PURE__*/React.createElement(FileUploaderFile, {
|
|
265
|
-
file: files[0]
|
|
300
|
+
file: files[0],
|
|
301
|
+
size: size
|
|
266
302
|
}))) : /*#__PURE__*/React.createElement(React.Fragment, null, locale.orDragHere, "\xA0", /*#__PURE__*/React.createElement("div", {
|
|
267
303
|
className: uploadButtonIconClassNames
|
|
268
|
-
}, /*#__PURE__*/React.createElement(UploadIcon, null))))), /*#__PURE__*/React.createElement("input", _extends({}, inputProps, {
|
|
304
|
+
}, /*#__PURE__*/React.createElement(UploadIcon, null)))))), /*#__PURE__*/React.createElement("input", _extends({}, inputProps, {
|
|
269
305
|
ref: inputRef,
|
|
270
306
|
tabIndex: disabled ? -1 : 0,
|
|
271
307
|
type: "file",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["FileUploader.tsx"],"names":["React","useCallback","useContext","useImperativeHandle","useRef","useState","getAttachedFile","cx","useMemoObject","FileUploaderControlContext","useControlLocale","useUpload","useDrop","ThemeContext","UploadIcon","withFileUploaderControlProvider","keyListener","FileUploaderFile","FileUploaderFileList","isBrowser","CommonWrapper","FileUploaderFileValidationResult","jsStyles","stopPropagation","e","FileUploaderDataTids","root","content","link","defaultRenderFile","file","fileNode","_FileUploader","forwardRef","props","ref","theme","disabled","error","warning","multiple","width","fileUploaderWidth","hideFiles","onBlur","onFocus","onChange","request","validateBeforeUpload","onRequestSuccess","onRequestError","renderFile","inputProps","files","setFiles","removeFile","reset","setFileValidationResult","locale","inputRef","isAsync","isSingleMode","upload","tryValidateAndUpload","forEach","validationMessage","id","handleChange","newFiles","filesArray","Array","from","attachedFiles","map","length","handleDrop","event","dataTransfer","clearData","onDrop","isDraggable","labelRef","isWindowDraggable","windowRef","current","window","document","focus","isTabPressed","blur","getRootNode","rootNodeRef","focusedByTab","setFocusedByTab","handleInputChange","target","handleFocus","requestAnimationFrame","handleBlur","hovered","setHovered","uploadButtonClassNames","uploadButton","uploadButtonFocus","dragOver","uploadButtonWrapperClassNames","windowDragOver","uploadButtonIconClassNames","icon","iconDisabled","hasOneFile","hasOneFileForSingle","linkClassNames","linkHovered","linkDisabled","choosedFile","chooseFile","afterLinkText","singleFile","orDragHere","fileInput","FileUploader","memo","displayName"],"mappings":"kfAAA,OAAOA,KAAP,IAAgBC,WAAhB,EAA6BC,UAA7B,EAAyCC,mBAAzC,EAA8DC,MAA9D,EAAsEC,QAAtE,QAAsF,OAAtF;;AAEA,SAAmCC,eAAnC,QAA0D,8CAA1D;AACA,SAASC,EAAT,QAAmB,2BAAnB;;AAEA,SAASC,aAAT,QAA8B,2BAA9B;AACA,SAASC,0BAAT,QAA2C,+DAA3C;AACA,SAASC,gBAAT,QAAiC,2DAAjC;AACA,SAASC,SAAT,QAA0B,oDAA1B;AACA,SAASC,OAAT,QAAwB,qBAAxB;AACA,SAASC,YAAT,QAA6B,gCAA7B;AACA,SAASC,UAAT,QAA2B,2BAA3B;;AAEA,SAASC,+BAAT,QAAgD,oEAAhD;AACA,SAASC,WAAT,QAA4B,8BAA5B;AACA,SAASC,gBAAT,QAAiC,sEAAjC;AACA,SAASC,oBAAT,QAAqC,8EAArC;AACA,SAASC,SAAT,QAA0B,kBAA1B;AACA,SAAsBC,aAAtB,QAA2C,8BAA3C;;AAEA,SAASC,gCAAT,QAAiD,qEAAjD;;AAEA,SAASC,QAAT,QAAyB,uBAAzB;;AAEA,IAAMC,eAAwC,GAAG,SAA3CA,eAA2C,CAACC,CAAD,UAAOA,CAAC,CAACD,eAAF,EAAP,EAAjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,OAAO,IAAME,oBAAoB,GAAG;AAClCC,EAAAA,IAAI,EAAE,oBAD4B;AAElCC,EAAAA,OAAO,EAAE,uBAFyB;AAGlCC,EAAAA,IAAI,EAAE,oBAH4B,EAA7B;;;AAMP,IAAMC,iBAAiB,GAAG,SAApBA,iBAAoB,CAACC,IAAD,EAAiCC,QAAjC,UAAkEA,QAAlE,EAA1B;;AAEA,IAAMC,aAAa,gBAAGhC,KAAK,CAACiC,UAAN,CAAsD,UAACC,KAAD,EAA4BC,GAA5B,EAAoC;AAC9G,MAAMC,KAAK,GAAGlC,UAAU,CAACW,YAAD,CAAxB;;AAEA;AACEwB,EAAAA,QADF;;;;;;;;;;;;;;;AAgBIH,EAAAA,KAhBJ,CACEG,QADF,CAEEC,KAFF,GAgBIJ,KAhBJ,CAEEI,KAFF,CAGEC,OAHF,GAgBIL,KAhBJ,CAGEK,OAHF,mBAgBIL,KAhBJ,CAIEM,QAJF,CAIEA,QAJF,gCAIa,KAJb,kCAgBIN,KAhBJ,CAKEO,KALF,CAKEA,KALF,6BAKUL,KAAK,CAACM,iBALhB,mCAgBIR,KAhBJ,CAMES,SANF,CAMEA,SANF,iCAMc,KANd,oBAOEC,MAPF,GAgBIV,KAhBJ,CAOEU,MAPF,CAQEC,OARF,GAgBIX,KAhBJ,CAQEW,OARF,CASEC,QATF,GAgBIZ,KAhBJ,CASEY,QATF,CAUEC,OAVF,GAgBIb,KAhBJ,CAUEa,OAVF,CAWEC,oBAXF,GAgBId,KAhBJ,CAWEc,oBAXF,CAYEC,gBAZF,GAgBIf,KAhBJ,CAYEe,gBAZF,CAaEC,cAbF,GAgBIhB,KAhBJ,CAaEgB,cAbF,qBAgBIhB,KAhBJ,CAcEiB,UAdF,CAcEA,UAdF,kCAcetB,iBAdf,qBAeKuB,UAfL,iCAgBIlB,KAhBJ;;AAkBA,oBAAwEhC,UAAU,CAACO,0BAAD,CAAlF,CAAQ4C,KAAR,eAAQA,KAAR,CAAeC,QAAf,eAAeA,QAAf,CAAyBC,UAAzB,eAAyBA,UAAzB,CAAqCC,KAArC,eAAqCA,KAArC,CAA4CC,uBAA5C,eAA4CA,uBAA5C;;AAEA,MAAMC,MAAM,GAAGhD,gBAAgB,EAA/B;;AAEA,MAAMiD,QAAQ,GAAGvD,MAAM,CAAmB,IAAnB,CAAvB;;AAEA,MAAMwD,OAAO,GAAG,CAAC,CAACb,OAAlB;AACA,MAAMc,YAAY,GAAG,CAACrB,QAAtB;;AAEA,MAAMsB,MAAM,GAAGnD,SAAS,CAACoC,OAAD,EAAUE,gBAAV,EAA4BC,cAA5B,CAAxB;;AAEA,MAAMa,oBAAoB,GAAG9D,WAAW;AACtC,YAACoD,KAAD,EAAuC;AACrCA,IAAAA,KAAK,CAACW,OAAN,gGAAc,iBAAOlC,IAAP;AACckB,gBAAAA,oBADd,sEAC6CA,oBAAoB,CAAClB,IAAD,CADjE,2CACNmC,iBADM;;AAGZ,oBAAI,CAACA,iBAAL,EAAwB;AACtBL,kBAAAA,OAAO,IAAIE,MAAM,CAAChC,IAAD,CAAjB;AACD,iBAFD,MAEO;AACL2B,kBAAAA,uBAAuB,CAAC3B,IAAI,CAACoC,EAAN,EAAU7C,gCAAgC,CAACiB,KAAjC,CAAuC2B,iBAAvC,CAAV,CAAvB;AACD,iBAPW,wDAAd;;AASD,GAXqC;AAYtC,GAACjB,oBAAD,EAAuBY,OAAvB,EAAgCE,MAAhC,EAAwCL,uBAAxC,CAZsC,CAAxC;;;AAeA;AACA,MAAMU,YAAY,GAAGlE,WAAW;AAC9B,YAACmE,QAAD,EAA+B;AAC7B,QAAI,CAACA,QAAL,EAAe;AACb;AACD;;AAED,QAAIC,UAAU,GAAGC,KAAK,CAACC,IAAN,CAAWH,QAAX,CAAjB;;AAEA,QAAIP,YAAJ,EAAkB;AAChBQ,MAAAA,UAAU,GAAG,CAACA,UAAU,CAAC,CAAD,CAAX,CAAb;AACD;;AAED,QAAMG,aAAa,GAAGH,UAAU,CAACI,GAAX,CAAenE,eAAf,CAAtB;;AAEA,QAAIuD,YAAY,IAAIW,aAAa,CAACE,MAA9B,IAAwCrB,KAAK,CAACqB,MAAlD,EAA0D;AACxDnB,MAAAA,UAAU,CAACF,KAAK,CAAC,CAAD,CAAL,CAASa,EAAV,CAAV;AACD;;AAED,QAAIM,aAAa,CAACE,MAAlB,EAA0B;AACxBpB,MAAAA,QAAQ,CAACkB,aAAD,CAAR;AACAT,MAAAA,oBAAoB,CAACS,aAAD,CAApB;AACD;AACF,GAtB6B;AAuB9B,GAACT,oBAAD,EAAuBT,QAAvB,EAAiCO,YAAjC,EAA+CR,KAA/C,EAAsDE,UAAtD,CAvB8B,CAAhC;;;AA0BA,MAAMoB,UAAU,GAAG1E,WAAW;AAC5B,YAAC2E,KAAD,EAAW;AACT,QAAIvC,QAAJ,EAAc;AACZ;AACD;;AAED,QAAQwC,YAAR,GAAyBD,KAAzB,CAAQC,YAAR;AACA,QAAQxB,KAAR,GAAkBwB,YAAlB,CAAQxB,KAAR;;AAEA,QAAI,CAAAA,KAAK,QAAL,YAAAA,KAAK,CAAEqB,MAAP,IAAgB,CAApB,EAAuB;AACrBP,MAAAA,YAAY,CAACd,KAAD,CAAZ;AACAwB,MAAAA,YAAY,CAACC,SAAb;AACD;AACF,GAb2B;AAc5B,GAACX,YAAD,EAAe9B,QAAf,CAd4B,CAA9B;;;AAiBA,iBAAuCzB,OAAO,CAAmB,EAAEmE,MAAM,EAAEJ,UAAV,EAAnB,CAA9C,CAAQK,WAAR,YAAQA,WAAR,CAA0BC,QAA1B,YAAqB9C,GAArB;AACA,kBAA2DvB,OAAO,EAAlE,CAAqBsE,iBAArB,aAAQF,WAAR,CAA6CG,SAA7C,aAAwChD,GAAxC;;AAEA,MAAIhB,SAAJ,EAAe;AACbgE,IAAAA,SAAS,CAACC,OAAV,GAAoBC,MAAM,CAACC,QAA3B;AACD;;AAED,MAAMC,KAAK,GAAGtF,WAAW,CAAC,YAAM;AAC9Be,IAAAA,WAAW,CAACwE,YAAZ,GAA2B,IAA3B;AACA,yBAAA7B,QAAQ,CAACyB,OAAT,uCAAkBG,KAAlB;AACD,GAHwB,EAGtB,EAHsB,CAAzB;;AAKA,MAAME,IAAI,GAAGxF,WAAW,CAAC,YAAM;AAC7B,0BAAA0D,QAAQ,CAACyB,OAAT,wCAAkBK,IAAlB;AACD,GAFuB,EAErB,EAFqB,CAAxB;;AAIAtF,EAAAA,mBAAmB,CAACgC,GAAD,EAAM,oBAAO,EAAEoD,KAAK,EAALA,KAAF,EAASE,IAAI,EAAJA,IAAT,EAAejC,KAAK,EAALA,KAAf,EAAsBkC,WAAW,EAAE,+BAAMC,WAAW,CAACP,OAAlB,EAAnC,EAAP,EAAN,EAA8E;AAC/FjD,EAAAA,GAD+F;AAE/FsD,EAAAA,IAF+F;AAG/FF,EAAAA,KAH+F;AAI/F/B,EAAAA,KAJ+F,CAA9E,CAAnB;;;AAOA,kBAAwCnD,QAAQ,CAAC,KAAD,CAAhD,CAAOuF,YAAP,gBAAqBC,eAArB;AACA,MAAMC,iBAAiB,GAAG,SAApBA,iBAAoB,CAAClB,KAAD,EAAgD;AACxE9B,IAAAA,QAAQ,QAAR,YAAAA,QAAQ,CAAG8B,KAAH,CAAR;AACAT,IAAAA,YAAY,CAACS,KAAK,CAACmB,MAAN,CAAa1C,KAAd,CAAZ;AACD,GAHD;;AAKA,MAAM2C,WAAW,GAAG,SAAdA,WAAc,CAACxE,CAAD,EAA2C;AAC7D,QAAI,CAACa,QAAL,EAAe;AACb;AACA;AACA4D,MAAAA,qBAAqB,CAAC,YAAM;AAC1B,YAAIjF,WAAW,CAACwE,YAAhB,EAA8B;AAC5BK,UAAAA,eAAe,CAAC,IAAD,CAAf;AACD;AACF,OAJoB,CAArB;AAKAhD,MAAAA,OAAO,QAAP,YAAAA,OAAO,CAAGrB,CAAH,CAAP;AACD;AACF,GAXD;;AAaA,MAAM0E,UAAU,GAAG,SAAbA,UAAa,CAAC1E,CAAD,EAA2C;AAC5DqE,IAAAA,eAAe,CAAC,KAAD,CAAf;AACA,QAAI,CAACxD,QAAL,EAAe;AACbO,MAAAA,MAAM,QAAN,YAAAA,MAAM,CAAGpB,CAAH,CAAN;AACD;AACF,GALD;;AAOA,mBAA8BnB,QAAQ,CAAC,KAAD,CAAtC,CAAO8F,OAAP,iBAAgBC,UAAhB;;AAEA,MAAMC,sBAAsB,GAAG9F,EAAE,CAACe,QAAQ,CAACgF,YAAT,CAAsBlE,KAAtB,CAAD;AAC9Bd,EAAAA,QAAQ,CAACiF,iBAAT,CAA2BnE,KAA3B,CAD8B,IACMwD,YADN;AAE9BtE,EAAAA,QAAQ,CAACe,QAAT,CAAkBD,KAAlB,CAF8B,IAEHC,QAFG;AAG9Bf,EAAAA,QAAQ,CAAC6E,OAAT,CAAiB/D,KAAjB,CAH8B,IAGJ,CAACC,QAAD,IAAa8D,OAHT;AAI9B7E,EAAAA,QAAQ,CAACiB,OAAT,CAAiBH,KAAjB,CAJ8B,IAIJ,CAAC,CAACG,OAJE;AAK9BjB,EAAAA,QAAQ,CAACgB,KAAT,CAAeF,KAAf,CAL8B,IAKN,CAAC,CAACE,KALI;AAM9BhB,EAAAA,QAAQ,CAACkF,QAAT,CAAkBpE,KAAlB,CAN8B,IAMH4C,WAAW,IAAI,CAAC3C,QANb,OAAjC;;;AASA,MAAMoE,6BAA6B,GAAGlG,EAAE;AACrCe,EAAAA,QAAQ,CAACoF,cAAT,CAAwBtE,KAAxB,CADqC,IACJ8C,iBAAiB,IAAI,CAAC7C,QADlB,QAAxC;;;AAIA,MAAMsE,0BAA0B,GAAGpG,EAAE,CAACe,QAAQ,CAACsF,IAAT,CAAcxE,KAAd,CAAD;AAClCd,EAAAA,QAAQ,CAACuF,YAAT,CAAsBzE,KAAtB,CADkC,IACHC,QADG,QAArC;;;AAIA,MAAMyE,UAAU,GAAGzD,KAAK,CAACqB,MAAN,KAAiB,CAApC;AACA,MAAMqC,mBAAmB,GAAGlD,YAAY,IAAIiD,UAAhB,IAA8B,CAACnE,SAA3D;;AAEA,MAAMqE,cAAc,GAAGzG,EAAE,CAACe,QAAQ,CAACM,IAAT,CAAcQ,KAAd,CAAD;AACtBd,EAAAA,QAAQ,CAAC2F,WAAT,CAAqB7E,KAArB,CADsB,IACQ,CAACC,QAAD,IAAa8D,OADrB;AAEtB7E,EAAAA,QAAQ,CAAC4F,YAAT,CAAsB9E,KAAtB,CAFsB,IAESC,QAFT,QAAzB;;;AAKA,MAAMsD,WAAW,GAAGvF,MAAM,CAAC,IAAD,CAA1B;;AAEA;AACE,wBAAC,aAAD,EAAmB8B,KAAnB;AACE;AACE,kBAAUT,oBAAoB,CAACC,IADjC;AAEE,MAAA,SAAS,EAAEJ,QAAQ,CAACI,IAAT,CAAcU,KAAd,CAFb;AAGE,MAAA,KAAK,EAAE5B,aAAa,CAAC,EAAEiC,KAAK,EAALA,KAAF,EAAD,CAHtB;AAIE,MAAA,GAAG,EAAEkD,WAJP;;AAMG,KAAChD,SAAD,IAAc,CAACkB,YAAf,IAA+B,CAAC,CAACR,KAAK,CAACqB,MAAvC,iBAAiD,oBAAC,oBAAD,IAAsB,UAAU,EAAEvB,UAAlC,GANpD;AAOE,iCAAK,SAAS,EAAEsD,6BAAhB;AACE;AACE,MAAA,YAAY,EAAE,gCAAML,UAAU,CAAC,IAAD,CAAhB,EADhB;AAEE,MAAA,YAAY,EAAE,gCAAMA,UAAU,CAAC,KAAD,CAAhB,EAFhB;AAGE,MAAA,GAAG,EAAEnB,QAHP;AAIE,MAAA,SAAS,EAAEoB,sBAJb;;AAME,iCAAK,YAAU5E,oBAAoB,CAACE,OAApC,EAA6C,SAAS,EAAEL,QAAQ,CAACK,OAAT,EAAxD;AACE,kCAAM,YAAUF,oBAAoB,CAACG,IAArC,EAA2C,SAAS,EAAEoF,cAAtD;AACGD,IAAAA,mBAAmB,GAAGrD,MAAM,CAACyD,WAAV,GAAwBzD,MAAM,CAAC0D,UADrD,CADF;;;AAKE,iCAAK,SAAS,EAAE9F,QAAQ,CAAC+F,aAAT,EAAhB;AACGN,IAAAA,mBAAmB;AAClB,iCAAK,SAAS,EAAEzF,QAAQ,CAACgG,UAAT,EAAhB;AACGnE,IAAAA,UAAU,CAACE,KAAK,CAAC,CAAD,CAAN,eAAW,oBAAC,gBAAD,IAAkB,IAAI,EAAEA,KAAK,CAAC,CAAD,CAA7B,GAAX,CADb,CADkB;;;AAKlB;AACGK,IAAAA,MAAM,CAAC6D,UADV;AAEE,iCAAK,SAAS,EAAEZ,0BAAhB;AACE,wBAAC,UAAD,OADF,CAFF,CANJ,CALF,CANF;;;;;;AA0BE;AACMvD,IAAAA,UADN;AAEE,MAAA,GAAG,EAAEO,QAFP;AAGE,MAAA,QAAQ,EAAEtB,QAAQ,GAAG,CAAC,CAAJ,GAAQ,CAH5B;AAIE,MAAA,IAAI,EAAC,MAJP;AAKE,MAAA,QAAQ,EAAEA,QALZ;AAME,MAAA,QAAQ,EAAEG,QANZ;AAOE,MAAA,SAAS,EAAElB,QAAQ,CAACkG,SAAT,EAPb;AAQE,MAAA,OAAO,EAAEjG,eARX;AASE,MAAA,QAAQ,EAAEuE,iBATZ;AAUE,MAAA,OAAO,EAAEE,WAVX;AAWE,MAAA,MAAM,EAAEE;AACR;AAZF,QAaE,KAAK,EAAE,EAbT,IA1BF,CADF,CAPF,CADF,CADF;;;;;;;AAwDD,CAjOqB,CAAtB;;;;AAqOA,OAAO,IAAMuB,YAAY,GAAG1G,+BAA+B;AACzDf,KAAK,CAAC0H,IAAN,CAAW1F,aAAX,CADyD,CAApD;;AAGPyF,YAAY,CAACE,WAAb,GAA2B,cAA3B","sourcesContent":["import React, { useCallback, useContext, useImperativeHandle, useRef, useState } from 'react';\n\nimport { FileUploaderAttachedFile, getAttachedFile } from '../../internal/FileUploaderControl/fileUtils';\nimport { cx } from '../../lib/theming/Emotion';\nimport { InstanceWithRootNode } from '../../lib/rootNode';\nimport { useMemoObject } from '../../hooks/useMemoObject';\nimport { FileUploaderControlContext } from '../../internal/FileUploaderControl/FileUploaderControlContext';\nimport { useControlLocale } from '../../internal/FileUploaderControl/hooks/useControlLocale';\nimport { useUpload } from '../../internal/FileUploaderControl/hooks/useUpload';\nimport { useDrop } from '../../hooks/useDrop';\nimport { ThemeContext } from '../../lib/theming/ThemeContext';\nimport { UploadIcon } from '../../internal/icons/16px';\nimport { FileUploaderControlProviderProps } from '../../internal/FileUploaderControl/FileUploaderControlProvider';\nimport { withFileUploaderControlProvider } from '../../internal/FileUploaderControl/withFileUploaderControlProvider';\nimport { keyListener } from '../../lib/events/keyListener';\nimport { FileUploaderFile } from '../../internal/FileUploaderControl/FileUploaderFile/FileUploaderFile';\nimport { FileUploaderFileList } from '../../internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList';\nimport { isBrowser } from '../../lib/client';\nimport { CommonProps, CommonWrapper } from '../../internal/CommonWrapper';\nimport { Nullable } from '../../typings/utility-types';\nimport { FileUploaderFileValidationResult } from '../../internal/FileUploaderControl/FileUploaderFileValidationResult';\n\nimport { jsStyles } from './FileUploader.styles';\n\nconst stopPropagation: React.ReactEventHandler = (e) => e.stopPropagation();\n\ninterface _FileUploaderProps extends CommonProps, React.InputHTMLAttributes<HTMLInputElement> {\n /** Состояние ошибки всего контрола */\n error?: boolean;\n /** Состояние предупреждения всего контрола */\n warning?: boolean;\n /** Свойство ширины. */\n width?: React.CSSProperties['width'];\n /** Свойство, скрывающее отображение файлов. */\n hideFiles?: boolean;\n\n /** Функция, через которую отправляем файлы. Используется для отслеживания статуса загрузки файла. */\n request?: (file: FileUploaderAttachedFile) => Promise<void>;\n /** Срабатывает при удачной попытке отправки через request */\n onRequestSuccess?: (fileId: string) => void;\n /** Срабатывает при неудачной попытке отправки через request */\n onRequestError?: (fileId: string) => void;\n\n /**\n * Функция валидации каждого файла.\n * Срабатывает после выбора файлов и перед попыткой отправить в request.\n * Чтобы вывести валидацию ошибки, промис должен вернуть строку.\n * */\n validateBeforeUpload?: (file: FileUploaderAttachedFile) => Promise<Nullable<string>>;\n\n /**\n * Функция, позволяющая кастомизировать файлы.\n * Через нее можно вешать кастомные валидации на каждый файл.\n * */\n renderFile?: (file: FileUploaderAttachedFile, fileNode: React.ReactElement) => React.ReactNode;\n}\n\nexport interface FileUploaderRef extends InstanceWithRootNode {\n focus: () => void;\n blur: () => void;\n /** Сбрасывает выбранные файлы */\n reset: () => void;\n}\n\nexport const FileUploaderDataTids = {\n root: 'FileUploader__root',\n content: 'FileUploader__content',\n link: 'FileUploader__link',\n} as const;\n\nconst defaultRenderFile = (file: FileUploaderAttachedFile, fileNode: React.ReactElement) => fileNode;\n\nconst _FileUploader = React.forwardRef<FileUploaderRef, _FileUploaderProps>((props: _FileUploaderProps, ref) => {\n const theme = useContext(ThemeContext);\n\n const {\n disabled,\n error,\n warning,\n multiple = false,\n width = theme.fileUploaderWidth,\n hideFiles = false,\n onBlur,\n onFocus,\n onChange,\n request,\n validateBeforeUpload,\n onRequestSuccess,\n onRequestError,\n renderFile = defaultRenderFile,\n ...inputProps\n } = props;\n\n const { files, setFiles, removeFile, reset, setFileValidationResult } = useContext(FileUploaderControlContext);\n\n const locale = useControlLocale();\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n const isAsync = !!request;\n const isSingleMode = !multiple;\n\n const upload = useUpload(request, onRequestSuccess, onRequestError);\n\n const tryValidateAndUpload = useCallback(\n (files: FileUploaderAttachedFile[]) => {\n files.forEach(async (file) => {\n const validationMessage = validateBeforeUpload && (await validateBeforeUpload(file));\n\n if (!validationMessage) {\n isAsync && upload(file);\n } else {\n setFileValidationResult(file.id, FileUploaderFileValidationResult.error(validationMessage));\n }\n });\n },\n [validateBeforeUpload, isAsync, upload, setFileValidationResult],\n );\n\n /** common part **/\n const handleChange = useCallback(\n (newFiles: FileList | null) => {\n if (!newFiles) {\n return;\n }\n\n let filesArray = Array.from(newFiles);\n\n if (isSingleMode) {\n filesArray = [filesArray[0]];\n }\n\n const attachedFiles = filesArray.map(getAttachedFile);\n\n if (isSingleMode && attachedFiles.length && files.length) {\n removeFile(files[0].id);\n }\n\n if (attachedFiles.length) {\n setFiles(attachedFiles);\n tryValidateAndUpload(attachedFiles);\n }\n },\n [tryValidateAndUpload, setFiles, isSingleMode, files, removeFile],\n );\n\n const handleDrop = useCallback(\n (event) => {\n if (disabled) {\n return;\n }\n\n const { dataTransfer } = event;\n const { files } = dataTransfer;\n\n if (files?.length > 0) {\n handleChange(files);\n dataTransfer.clearData();\n }\n },\n [handleChange, disabled],\n );\n\n const { isDraggable, ref: labelRef } = useDrop<HTMLLabelElement>({ onDrop: handleDrop });\n const { isDraggable: isWindowDraggable, ref: windowRef } = useDrop<Document>();\n\n if (isBrowser) {\n windowRef.current = window.document;\n }\n\n const focus = useCallback(() => {\n keyListener.isTabPressed = true;\n inputRef.current?.focus();\n }, []);\n\n const blur = useCallback(() => {\n inputRef.current?.blur();\n }, []);\n\n useImperativeHandle(ref, () => ({ focus, blur, reset, getRootNode: () => rootNodeRef.current }), [\n ref,\n blur,\n focus,\n reset,\n ]);\n\n const [focusedByTab, setFocusedByTab] = useState(false);\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(event);\n handleChange(event.target.files);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n if (!disabled) {\n // focus event fires before keyDown eventlistener\n // so we should check tabPressed in async way\n requestAnimationFrame(() => {\n if (keyListener.isTabPressed) {\n setFocusedByTab(true);\n }\n });\n onFocus?.(e);\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocusedByTab(false);\n if (!disabled) {\n onBlur?.(e);\n }\n };\n\n const [hovered, setHovered] = useState(false);\n\n const uploadButtonClassNames = cx(jsStyles.uploadButton(theme), {\n [jsStyles.uploadButtonFocus(theme)]: focusedByTab,\n [jsStyles.disabled(theme)]: disabled,\n [jsStyles.hovered(theme)]: !disabled && hovered,\n [jsStyles.warning(theme)]: !!warning,\n [jsStyles.error(theme)]: !!error,\n [jsStyles.dragOver(theme)]: isDraggable && !disabled,\n });\n\n const uploadButtonWrapperClassNames = cx({\n [jsStyles.windowDragOver(theme)]: isWindowDraggable && !disabled,\n });\n\n const uploadButtonIconClassNames = cx(jsStyles.icon(theme), {\n [jsStyles.iconDisabled(theme)]: disabled,\n });\n\n const hasOneFile = files.length === 1;\n const hasOneFileForSingle = isSingleMode && hasOneFile && !hideFiles;\n\n const linkClassNames = cx(jsStyles.link(theme), {\n [jsStyles.linkHovered(theme)]: !disabled && hovered,\n [jsStyles.linkDisabled(theme)]: disabled,\n });\n\n const rootNodeRef = useRef(null);\n\n return (\n <CommonWrapper {...props}>\n <div\n data-tid={FileUploaderDataTids.root}\n className={jsStyles.root(theme)}\n style={useMemoObject({ width })}\n ref={rootNodeRef}\n >\n {!hideFiles && !isSingleMode && !!files.length && <FileUploaderFileList renderFile={renderFile} />}\n <div className={uploadButtonWrapperClassNames}>\n <label\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n ref={labelRef}\n className={uploadButtonClassNames}\n >\n <div data-tid={FileUploaderDataTids.content} className={jsStyles.content()}>\n <span data-tid={FileUploaderDataTids.link} className={linkClassNames}>\n {hasOneFileForSingle ? locale.choosedFile : locale.chooseFile}\n </span>\n \n <div className={jsStyles.afterLinkText()}>\n {hasOneFileForSingle ? (\n <div className={jsStyles.singleFile()}>\n {renderFile(files[0], <FileUploaderFile file={files[0]} />)}\n </div>\n ) : (\n <>\n {locale.orDragHere} \n <div className={uploadButtonIconClassNames}>\n <UploadIcon />\n </div>\n </>\n )}\n </div>\n </div>\n <input\n {...inputProps}\n ref={inputRef}\n tabIndex={disabled ? -1 : 0}\n type=\"file\"\n disabled={disabled}\n multiple={multiple}\n className={jsStyles.fileInput()}\n onClick={stopPropagation}\n onChange={handleInputChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n // для того, чтобы срабатывало событие change при выборе одного и того же файла подряд\n value={''}\n />\n </label>\n </div>\n </div>\n </CommonWrapper>\n );\n});\n\nexport interface FileUploaderProps extends _FileUploaderProps, FileUploaderControlProviderProps {}\n\nexport const FileUploader = withFileUploaderControlProvider<FileUploaderProps, FileUploaderRef>(\n React.memo(_FileUploader),\n);\nFileUploader.displayName = 'FileUploader';\n"]}
|
|
1
|
+
{"version":3,"sources":["FileUploader.tsx"],"names":["React","useCallback","useContext","useEffect","useImperativeHandle","useRef","useState","getAttachedFile","cx","useMemoObject","FileUploaderControlContext","useControlLocale","useUpload","useDrop","ThemeContext","UploadIcon","withFileUploaderControlProvider","keyListener","FileUploaderFile","FileUploaderFileList","isBrowser","CommonWrapper","FileUploaderFileValidationResult","useFileUploaderSize","jsStyles","stopPropagation","e","FileUploaderDataTids","root","content","link","defaultRenderFile","file","fileNode","_FileUploader","forwardRef","props","ref","theme","disabled","error","warning","multiple","width","fileUploaderWidth","hideFiles","onBlur","onFocus","onChange","request","validateBeforeUpload","onRequestSuccess","onRequestError","size","renderFile","inputProps","files","setFiles","removeFile","reset","setFileValidationResult","isMinLengthReached","locale","inputRef","fileDivRef","isAsync","isSingleMode","isLinkVisible","setIsLinkVisible","upload","tryValidateAndUpload","forEach","validationMessage","id","sizeClassName","small","sizeSmall","medium","sizeMedium","large","sizeLarge","sizeIconClass","iconSmall","iconMedium","iconLarge","contentInnerClass","contentInnerSmall","contentInnerMedium","contentInnerLarge","handleChange","newFiles","filesArray","Array","from","attachedFiles","map","length","handleDrop","event","dataTransfer","clearData","onDrop","isDraggable","labelRef","isWindowDraggable","windowRef","current","window","document","focus","isTabPressed","blur","getRootNode","rootNodeRef","focusedByTab","setFocusedByTab","handleInputChange","target","handleFocus","requestAnimationFrame","handleBlur","hovered","setHovered","uploadButtonClassNames","uploadButton","uploadButtonFocus","dragOver","uploadButtonWrapperClassNames","windowDragOver","uploadButtonIconClassNames","icon","iconDisabled","hasOneFile","hasOneFileForSingle","contentClassNames","contentWithFiles","linkClassNames","linkHovered","linkDisabled","choosedFile","chooseFile","String","fromCharCode","afterLinkText_HasFiles","afterLinkText","singleFile","orDragHere","fileInput","FileUploader","memo","displayName"],"mappings":"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","sourcesContent":["import React, { useCallback, useContext, useEffect, useImperativeHandle, useRef, useState } from 'react';\n\nimport { FileUploaderAttachedFile, getAttachedFile } from '../../internal/FileUploaderControl/fileUtils';\nimport { cx } from '../../lib/theming/Emotion';\nimport { InstanceWithRootNode } from '../../lib/rootNode';\nimport { useMemoObject } from '../../hooks/useMemoObject';\nimport { FileUploaderControlContext } from '../../internal/FileUploaderControl/FileUploaderControlContext';\nimport { useControlLocale } from '../../internal/FileUploaderControl/hooks/useControlLocale';\nimport { useUpload } from '../../internal/FileUploaderControl/hooks/useUpload';\nimport { useDrop } from '../../hooks/useDrop';\nimport { ThemeContext } from '../../lib/theming/ThemeContext';\nimport { UploadIcon } from '../../internal/icons/16px';\nimport { FileUploaderControlProviderProps } from '../../internal/FileUploaderControl/FileUploaderControlProvider';\nimport { withFileUploaderControlProvider } from '../../internal/FileUploaderControl/withFileUploaderControlProvider';\nimport { keyListener } from '../../lib/events/keyListener';\nimport { FileUploaderFile } from '../../internal/FileUploaderControl/FileUploaderFile/FileUploaderFile';\nimport { FileUploaderFileList } from '../../internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList';\nimport { isBrowser } from '../../lib/client';\nimport { CommonProps, CommonWrapper } from '../../internal/CommonWrapper';\nimport { Nullable } from '../../typings/utility-types';\nimport { FileUploaderFileValidationResult } from '../../internal/FileUploaderControl/FileUploaderFileValidationResult';\nimport { useFileUploaderSize } from '../../internal/FileUploaderControl/hooks/useFileUploaderSize';\n\nimport { jsStyles } from './FileUploader.styles';\n\nconst stopPropagation: React.ReactEventHandler = (e) => e.stopPropagation();\n\nexport type FileUploaderSize = 'small' | 'medium' | 'large';\n\ntype FileUploaderOverriddenProps = 'size';\n\ninterface _FileUploaderProps\n extends CommonProps,\n Omit<React.InputHTMLAttributes<HTMLInputElement>, FileUploaderOverriddenProps> {\n /** Состояние ошибки всего контрола */\n error?: boolean;\n /** Состояние предупреждения всего контрола */\n warning?: boolean;\n /** Свойство ширины. */\n width?: React.CSSProperties['width'];\n /**\n * Задаёт размер контрола.\n *\n * **Допустимые значения**: `\"small\"`, `\"medium\"`, `\"large\"`.\n */\n size?: FileUploaderSize;\n /** Свойство, скрывающее отображение файлов. */\n hideFiles?: boolean;\n\n /** Функция, через которую отправляем файлы. Используется для отслеживания статуса загрузки файла. */\n request?: (file: FileUploaderAttachedFile) => Promise<void>;\n /** Срабатывает при удачной попытке отправки через request */\n onRequestSuccess?: (fileId: string) => void;\n /** Срабатывает при неудачной попытке отправки через request */\n onRequestError?: (fileId: string) => void;\n\n /**\n * Функция валидации каждого файла.\n * Срабатывает после выбора файлов и перед попыткой отправить в request.\n * Чтобы вывести валидацию ошибки, промис должен вернуть строку.\n * */\n validateBeforeUpload?: (file: FileUploaderAttachedFile) => Promise<Nullable<string>>;\n\n /**\n * Функция, позволяющая кастомизировать файлы.\n * Через нее можно вешать кастомные валидации на каждый файл.\n * */\n renderFile?: (file: FileUploaderAttachedFile, fileNode: React.ReactElement) => React.ReactNode;\n}\n\nexport interface FileUploaderRef extends InstanceWithRootNode {\n focus: () => void;\n blur: () => void;\n /** Сбрасывает выбранные файлы */\n reset: () => void;\n}\n\nexport const FileUploaderDataTids = {\n root: 'FileUploader__root',\n content: 'FileUploader__content',\n link: 'FileUploader__link',\n} as const;\n\nconst defaultRenderFile = (file: FileUploaderAttachedFile, fileNode: React.ReactElement) => fileNode;\n\nconst _FileUploader = React.forwardRef<FileUploaderRef, _FileUploaderProps>((props: _FileUploaderProps, ref) => {\n const theme = useContext(ThemeContext);\n\n const {\n disabled,\n error,\n warning,\n multiple = false,\n width = theme.fileUploaderWidth,\n hideFiles = false,\n onBlur,\n onFocus,\n onChange,\n request,\n validateBeforeUpload,\n onRequestSuccess,\n onRequestError,\n size = 'small',\n renderFile = defaultRenderFile,\n ...inputProps\n } = props;\n\n const { files, setFiles, removeFile, reset, setFileValidationResult, isMinLengthReached } =\n useContext(FileUploaderControlContext);\n\n const locale = useControlLocale();\n\n const inputRef = useRef<HTMLInputElement>(null);\n const fileDivRef = useRef<HTMLDivElement>(null);\n\n const isAsync = !!request;\n const isSingleMode = !multiple;\n\n const [isLinkVisible, setIsLinkVisible] = useState(true);\n const upload = useUpload(request, onRequestSuccess, onRequestError);\n\n const tryValidateAndUpload = useCallback(\n (files: FileUploaderAttachedFile[]) => {\n files.forEach(async (file) => {\n const validationMessage = validateBeforeUpload && (await validateBeforeUpload(file));\n\n if (!validationMessage) {\n isAsync && upload(file);\n } else {\n setFileValidationResult(file.id, FileUploaderFileValidationResult.error(validationMessage));\n }\n });\n },\n [validateBeforeUpload, isAsync, upload, setFileValidationResult],\n );\n\n const sizeClassName = useFileUploaderSize(size, {\n small: cx(jsStyles.sizeSmall(theme)),\n medium: cx(jsStyles.sizeMedium(theme)),\n large: cx(jsStyles.sizeLarge(theme)),\n });\n\n const sizeIconClass = useFileUploaderSize(size, {\n small: jsStyles.iconSmall(theme),\n medium: jsStyles.iconMedium(theme),\n large: jsStyles.iconLarge(theme),\n });\n\n const contentInnerClass = useFileUploaderSize(size, {\n small: jsStyles.contentInnerSmall(theme),\n medium: jsStyles.contentInnerMedium(theme),\n large: jsStyles.contentInnerLarge(theme),\n });\n\n /** common part **/\n const handleChange = useCallback(\n (newFiles: FileList | null) => {\n if (!newFiles) {\n return;\n }\n\n let filesArray = Array.from(newFiles);\n\n if (isSingleMode) {\n filesArray = [filesArray[0]];\n }\n\n const attachedFiles = filesArray.map(getAttachedFile);\n\n if (isSingleMode && attachedFiles.length && files.length) {\n removeFile(files[0].id);\n }\n\n if (attachedFiles.length) {\n setFiles(attachedFiles);\n tryValidateAndUpload(attachedFiles);\n }\n },\n [tryValidateAndUpload, setFiles, isSingleMode, files, removeFile],\n );\n\n const handleDrop = useCallback(\n (event) => {\n if (disabled) {\n return;\n }\n\n const { dataTransfer } = event;\n const { files } = dataTransfer;\n\n if (files?.length > 0) {\n handleChange(files);\n dataTransfer.clearData();\n }\n },\n [handleChange, disabled],\n );\n\n const { isDraggable, ref: labelRef } = useDrop<HTMLLabelElement>({ onDrop: handleDrop });\n const { isDraggable: isWindowDraggable, ref: windowRef } = useDrop<Document>();\n\n if (isBrowser) {\n windowRef.current = window.document;\n }\n\n const focus = useCallback(() => {\n keyListener.isTabPressed = true;\n inputRef.current?.focus();\n }, []);\n\n const blur = useCallback(() => {\n inputRef.current?.blur();\n }, []);\n\n useImperativeHandle(ref, () => ({ focus, blur, reset, getRootNode: () => rootNodeRef.current }), [\n ref,\n blur,\n focus,\n reset,\n ]);\n\n const [focusedByTab, setFocusedByTab] = useState(false);\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(event);\n handleChange(event.target.files);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n if (!disabled) {\n // focus event fires before keyDown eventlistener\n // so we should check tabPressed in async way\n requestAnimationFrame(() => {\n if (keyListener.isTabPressed) {\n setFocusedByTab(true);\n }\n });\n onFocus?.(e);\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocusedByTab(false);\n if (!disabled) {\n onBlur?.(e);\n }\n };\n\n const [hovered, setHovered] = useState(false);\n\n const uploadButtonClassNames = cx(jsStyles.uploadButton(theme), {\n [jsStyles.uploadButtonFocus(theme)]: focusedByTab,\n [jsStyles.disabled(theme)]: disabled,\n [jsStyles.hovered(theme)]: !disabled && hovered,\n [jsStyles.warning(theme)]: !!warning,\n [jsStyles.error(theme)]: !!error,\n [jsStyles.dragOver(theme)]: isDraggable && !disabled,\n [sizeClassName]: true,\n });\n\n const uploadButtonWrapperClassNames = cx({\n [jsStyles.windowDragOver(theme)]: isWindowDraggable && !disabled,\n });\n\n const uploadButtonIconClassNames = cx(jsStyles.icon(theme), {\n [jsStyles.iconDisabled(theme)]: disabled,\n [sizeIconClass]: true,\n });\n\n const hasOneFile = files.length === 1;\n const hasOneFileForSingle = isSingleMode && hasOneFile && !hideFiles;\n\n const contentClassNames = cx(jsStyles.content(), {\n [jsStyles.contentWithFiles()]: hasOneFileForSingle,\n });\n\n const linkClassNames = cx(jsStyles.link(theme), {\n [jsStyles.linkHovered(theme)]: !disabled && hovered,\n [jsStyles.linkDisabled(theme)]: disabled,\n });\n\n useEffect(() => {\n setIsLinkVisible(hasOneFileForSingle ? !isMinLengthReached : true);\n }, [isMinLengthReached, hasOneFileForSingle]);\n\n const rootNodeRef = useRef(null);\n\n return (\n <CommonWrapper {...props}>\n <div\n data-tid={FileUploaderDataTids.root}\n className={jsStyles.root(theme)}\n style={useMemoObject({ width })}\n ref={rootNodeRef}\n >\n {!hideFiles && !isSingleMode && !!files.length && <FileUploaderFileList renderFile={renderFile} size={size} />}\n <div className={uploadButtonWrapperClassNames}>\n <label\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n ref={labelRef}\n className={uploadButtonClassNames}\n >\n <div className={contentInnerClass}>\n <div data-tid={FileUploaderDataTids.content} className={contentClassNames}>\n {isLinkVisible && (\n <span data-tid={FileUploaderDataTids.link} className={linkClassNames}>\n {hasOneFileForSingle ? locale.choosedFile : locale.chooseFile}\n </span>\n )}\n {isLinkVisible && String.fromCharCode(0xa0) /* */}\n <div className={hasOneFileForSingle ? jsStyles.afterLinkText_HasFiles() : jsStyles.afterLinkText()}>\n {hasOneFileForSingle ? (\n <div ref={fileDivRef} className={jsStyles.singleFile()}>\n {renderFile(files[0], <FileUploaderFile file={files[0]} size={size} />)}\n </div>\n ) : (\n <>\n {locale.orDragHere} \n <div className={uploadButtonIconClassNames}>\n <UploadIcon />\n </div>\n </>\n )}\n </div>\n </div>\n </div>\n <input\n {...inputProps}\n ref={inputRef}\n tabIndex={disabled ? -1 : 0}\n type=\"file\"\n disabled={disabled}\n multiple={multiple}\n className={jsStyles.fileInput()}\n onClick={stopPropagation}\n onChange={handleInputChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n // для того, чтобы срабатывало событие change при выборе одного и того же файла подряд\n value={''}\n />\n </label>\n </div>\n </div>\n </CommonWrapper>\n );\n});\n\nexport interface FileUploaderProps extends _FileUploaderProps, FileUploaderControlProviderProps {}\n\nexport const FileUploader = withFileUploaderControlProvider<FileUploaderProps, FileUploaderRef>(\n React.memo(_FileUploader),\n);\nFileUploader.displayName = 'FileUploader';\n"]}
|
|
@@ -4,13 +4,21 @@ import { InstanceWithRootNode } from '../../lib/rootNode';
|
|
|
4
4
|
import { FileUploaderControlProviderProps } from '../../internal/FileUploaderControl/FileUploaderControlProvider';
|
|
5
5
|
import { CommonProps } from '../../internal/CommonWrapper';
|
|
6
6
|
import { Nullable } from '../../typings/utility-types';
|
|
7
|
-
|
|
7
|
+
export declare type FileUploaderSize = 'small' | 'medium' | 'large';
|
|
8
|
+
declare type FileUploaderOverriddenProps = 'size';
|
|
9
|
+
interface _FileUploaderProps extends CommonProps, Omit<React.InputHTMLAttributes<HTMLInputElement>, FileUploaderOverriddenProps> {
|
|
8
10
|
/** Состояние ошибки всего контрола */
|
|
9
11
|
error?: boolean;
|
|
10
12
|
/** Состояние предупреждения всего контрола */
|
|
11
13
|
warning?: boolean;
|
|
12
14
|
/** Свойство ширины. */
|
|
13
15
|
width?: React.CSSProperties['width'];
|
|
16
|
+
/**
|
|
17
|
+
* Задаёт размер контрола.
|
|
18
|
+
*
|
|
19
|
+
* **Допустимые значения**: `"small"`, `"medium"`, `"large"`.
|
|
20
|
+
*/
|
|
21
|
+
size?: FileUploaderSize;
|
|
14
22
|
/** Свойство, скрывающее отображение файлов. */
|
|
15
23
|
hideFiles?: boolean;
|
|
16
24
|
/** Функция, через которую отправляем файлы. Используется для отслеживания статуса загрузки файла. */
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import _taggedTemplateLiteralLoose from "@babel/runtime/helpers/esm/taggedTemplateLiteralLoose";
|
|
2
|
+
|
|
3
|
+
var _templateObject;
|
|
4
|
+
|
|
5
|
+
import { css } from "../../../lib/theming/Emotion";
|
|
6
|
+
export var fileUploaderSizeMixin = function fileUploaderSizeMixin(fontSize, lineHeight, paddingX, paddingY) {
|
|
7
|
+
return css(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["\n font-size: ", ";\n box-sizing: border-box;\n padding: ", " ", ";\n line-height: ", ";\n "])), fontSize, paddingY, paddingX, lineHeight);
|
|
8
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["FileUploader.mixins.ts"],"names":["css","fileUploaderSizeMixin","fontSize","lineHeight","paddingX","paddingY"],"mappings":"oHAAA,SAASA,GAAT,QAAoB,2BAApB;;AAEA,OAAO,IAAMC,qBAAqB,GAAG,SAAxBA,qBAAwB,CAACC,QAAD,EAAmBC,UAAnB,EAAuCC,QAAvC,EAAyDC,QAAzD,EAA8E;AACjH,SAAOL,GAAP;AACeE,EAAAA,QADf;;AAGaG,EAAAA,QAHb,EAGyBD,QAHzB;AAIiBD,EAAAA,UAJjB;;AAMD,CAPM","sourcesContent":["import { css } from '../../lib/theming/Emotion';\n\nexport const fileUploaderSizeMixin = (fontSize: string, lineHeight: string, paddingX: string, paddingY: string) => {\n return css`\n font-size: ${fontSize};\n box-sizing: border-box;\n padding: ${paddingY} ${paddingX};\n line-height: ${lineHeight};\n `;\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const fileUploaderSizeMixin: (fontSize: string, lineHeight: string, paddingX: string, paddingY: string) => string;
|