@antscorp/antsomi-ui 1.3.5-beta.987 → 1.3.5-beta.988

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.
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import { CodeStructureData } from './type';
3
+ interface CodeStructureProps {
4
+ initialData: CodeStructureData;
5
+ onChange: (data: CodeStructureData) => void;
6
+ }
7
+ export declare const CodeStructure: React.FC<CodeStructureProps>;
8
+ export {};
@@ -0,0 +1,111 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Libraries
3
+ import { useCallback, useEffect } from 'react';
4
+ import { Form, InputNumber, Radio, Select, Typography, Flex, Input, Row, Col } from 'antd';
5
+ import { useImmer } from 'use-immer';
6
+ import { translate, translations } from '@antscorp/antsomi-locales';
7
+ // Utils
8
+ import { calculateTotalCodes, generateCodeWithPrefixAndSuffix, generateRandomCodeWithConfig, } from './utils';
9
+ // Types
10
+ import { RefillUnitType } from './type';
11
+ // Constants
12
+ import { CAPITALIZATION_OPTIONS, CHARACTER_ORDER_OPTIONS, CHARACTER_TYPE_OPTIONS, REFILL_UNIT_OPTIONS, SEPARATOR_OPTIONS, } from './constants';
13
+ import { CodeStructureWrapper } from './styled';
14
+ const { Title } = Typography;
15
+ export const CodeStructure = ({ initialData, onChange }) => {
16
+ const [form] = Form.useForm();
17
+ const [state, setState] = useImmer({
18
+ codeSample: '',
19
+ maxCodes: 0,
20
+ refillThreshold: 1,
21
+ refillInterval: 'auto',
22
+ refillUnit: 'codes',
23
+ codeWithPrefixAndSuffix: '',
24
+ });
25
+ const { codeSample, maxCodes, refillThreshold, refillUnit } = state;
26
+ const setCodeSample = (value) => {
27
+ setState(draft => {
28
+ draft.codeSample = value;
29
+ });
30
+ };
31
+ const setMaxCodes = (value) => {
32
+ setState(draft => {
33
+ draft.maxCodes = value;
34
+ });
35
+ };
36
+ /** *********** ✨ Codeium Command ⭐ ************ */
37
+ /**
38
+ * Update the code sample with prefix and suffix
39
+ * @param {string} value The new value of code sample with prefix and suffix
40
+ */
41
+ /** **** 99b15217-c7a7-4093-8b8f-ea4b4271af48 ****** */
42
+ const setCodeWithPrefixAndSuffix = (value) => {
43
+ setState(draft => {
44
+ draft.codeWithPrefixAndSuffix = value;
45
+ });
46
+ };
47
+ const setRefillThreshold = useCallback((value) => {
48
+ setState(draft => {
49
+ draft.refillThreshold = value;
50
+ });
51
+ }, [setState]);
52
+ const setRefillUnit = useCallback((value) => {
53
+ setState(draft => {
54
+ draft.refillUnit = value;
55
+ });
56
+ }, [setState]);
57
+ const updateFormValues = (data) => {
58
+ const allValues = form.getFieldsValue();
59
+ form.setFieldsValue(allValues);
60
+ const dataOnChange = {
61
+ ...allValues,
62
+ ...(allValues.refillInterval === 'auto' ? { refillThreshold, refillUnit } : {}),
63
+ };
64
+ onChange(dataOnChange);
65
+ const isRelevantChangeCodeKey = Object.keys(data).some(key => key !== 'quantity' &&
66
+ key !== 'suffix' &&
67
+ key !== 'prefix' &&
68
+ key !== 'refillInterval' &&
69
+ key !== 'separator');
70
+ const isChangePrefix = Object.keys(data).some(key => key === 'suffix' || key === 'prefix' || key === 'separator');
71
+ if (isRelevantChangeCodeKey) {
72
+ setCodeSample(generateRandomCodeWithConfig(form.getFieldsValue()));
73
+ }
74
+ if (isChangePrefix) {
75
+ setCodeWithPrefixAndSuffix(generateCodeWithPrefixAndSuffix(codeSample, form.getFieldValue('prefix'), form.getFieldValue('suffix'), form.getFieldValue('separator')));
76
+ }
77
+ };
78
+ const computeTotalCodes = useCallback(() => {
79
+ const numLetters = form.getFieldValue('alphabetLetters');
80
+ const numDigits = form.getFieldValue('digitalNumbers');
81
+ const type = form.getFieldValue('characterType');
82
+ if (numLetters && numDigits && type) {
83
+ const total = calculateTotalCodes(numLetters, numDigits, type);
84
+ setMaxCodes(total);
85
+ }
86
+ }, [form]);
87
+ // Effects
88
+ useEffect(() => {
89
+ setRefillThreshold(initialData.refillThreshold || 1);
90
+ }, [initialData.refillThreshold, setRefillThreshold]);
91
+ useEffect(() => {
92
+ setRefillUnit(initialData.refillUnit || RefillUnitType.CODES);
93
+ }, [initialData.refillUnit, setRefillUnit]);
94
+ useEffect(() => {
95
+ computeTotalCodes();
96
+ }, [
97
+ form.getFieldValue('alphabetLetters'),
98
+ form.getFieldValue('digitalNumbers'),
99
+ form.getFieldValue('characterType'),
100
+ ]);
101
+ useEffect(() => {
102
+ setCodeSample(generateRandomCodeWithConfig(form.getFieldsValue()));
103
+ setMaxCodes(calculateTotalCodes(form.getFieldValue('alphabetLetters'), form.getFieldValue('digitalNumbers'), form.getFieldValue('characterType')));
104
+ }, []);
105
+ useEffect(() => {
106
+ form.setFieldsValue(initialData);
107
+ }, [initialData, form]);
108
+ return (_jsx(CodeStructureWrapper, { children: _jsxs(Form, { form: form, layout: "horizontal", labelCol: { span: 8 }, colon: false, wrapperCol: { span: 16 }, labelAlign: "left", initialValues: initialData, onValuesChange: updateFormValues, children: [_jsx(Title, { level: 2, children: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE, 'Code Structure') }), _jsx(Form.Item, { label: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_PREFIX, 'Prefix'), name: "prefix", children: _jsx(Input, { placeholder: "" }) }), _jsxs(Row, { children: [_jsx(Col, { span: 8, offset: 0, children: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_INFIX, 'Infix') }), _jsx(Col, { span: 16, offset: 0, children: _jsxs(Flex, { vertical: true, gap: 10, children: [_jsx(Row, { children: _jsx(Col, { offset: 0, children: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_CHAC_TYPE, 'Character Type') }) }), _jsx(Form.Item, { name: "characterType", children: _jsx(Radio.Group, { options: CHARACTER_TYPE_OPTIONS }) })] }) })] }), _jsx(Row, { children: _jsx(Col, { offset: 8, children: _jsxs(Flex, { gap: 10, align: "center", children: [_jsx(Form.Item, { name: "digitalNumbers", children: _jsx(InputNumber, { min: 1, max: 50, style: { width: '40px' } }) }), _jsx("div", { style: { marginBottom: '15px' }, children: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_CHAC_TYPE_DIG_NO, 'digital numbers') })] }) }) }), _jsx(Row, { children: _jsx(Col, { offset: 8, children: _jsxs(Flex, { gap: 10, align: "center", children: [_jsx(Form.Item, { name: "alphabetLetters", children: _jsx(InputNumber, { min: 1, max: 50, style: { width: '40px' } }) }), _jsx("div", { style: { marginBottom: '15px' }, children: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_CHAC_TYPE_LET_NO, 'alphabet letters') })] }) }) }), _jsxs(Flex, { vertical: true, gap: 10, children: [_jsx(Row, { children: _jsx(Col, { offset: 8, children: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_CAP, 'Letters Capitalization') }) }), _jsx(Form.Item, { label: _jsx("span", { children: "\u00A0" }), name: "capitalization", children: _jsx(Radio.Group, { options: CAPITALIZATION_OPTIONS }) })] }), _jsxs(Flex, { vertical: true, gap: 10, children: [_jsx(Row, { children: _jsx(Col, { offset: 8, children: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_CHAC_ORDER, 'Character Order') }) }), _jsx(Form.Item, { label: _jsx("span", { children: "\u00A0" }), name: "characterOrder", children: _jsx(Radio.Group, { options: CHARACTER_ORDER_OPTIONS }) })] }), _jsx(Form.Item, { label: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_SUFFIX, 'Suffix'), name: "suffix", children: _jsx(Input, { placeholder: "" }) }), _jsx(Form.Item, { label: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_SEPARATOR, 'Separator'), name: "separator", children: _jsx(Select, { options: SEPARATOR_OPTIONS, style: { width: '50%' } }) }), _jsxs(Row, { children: [_jsx(Col, { span: 8, children: _jsxs(Flex, { justify: "start", align: "center", gap: 5, children: [translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_QUANTITY, 'Quantity'), ' ', _jsx("span", { style: { color: 'red' }, children: "*" })] }) }), _jsx(Col, { children: _jsxs(Flex, { gap: 10, align: "center", children: [_jsx(Form.Item, { name: "quantity", children: _jsx(InputNumber, { min: 1, max: 10000 }) }), _jsx("div", { style: { marginBottom: '15px' }, children: "code(s) per time" })] }) })] }), _jsxs(Form.Item, { label: translate(translations._ACT_PREVIEW, 'Preview'), children: ["Maximum of ", _jsx("b", { children: maxCodes.toLocaleString() }), " codes (sample", ' ', generateCodeWithPrefixAndSuffix(codeSample, form.getFieldValue('prefix'), form.getFieldValue('suffix'), form.getFieldValue('separator')), ") to be generated"] }), _jsx(Title, { level: 4, children: "Code Refill" }), _jsx(Form.Item, { label: "Refill Interval", name: "refillInterval", children: _jsxs(Radio.Group, { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, onChange: e => {
109
+ e.preventDefault();
110
+ }, children: [_jsx(Radio, { value: "manual", children: "Manual refill only" }), _jsx(Radio, { value: "auto", children: _jsxs(Flex, { gap: 10, align: "center", children: [_jsx(Typography.Text, { style: { whiteSpace: 'nowrap' }, children: "Add codes when less than" }), _jsx(InputNumber, { min: 1, max: 10000, style: { width: '63px' }, value: refillThreshold, onChange: value => setRefillThreshold(value || 1) }), _jsx(Select, { onClick: e => e.preventDefault(), value: refillUnit, onChange: setRefillUnit, options: REFILL_UNIT_OPTIONS, style: { width: '63px' } }), "remaining"] }) })] }) })] }) }));
111
+ };
@@ -0,0 +1,21 @@
1
+ import { CapitalizationType, CharacterOrderType, CharacterType, RefillUnitType, SeparatorType } from './type';
2
+ export declare const SEPARATOR_OPTIONS: {
3
+ value: SeparatorType;
4
+ label: string;
5
+ }[];
6
+ export declare const CHARACTER_TYPE_OPTIONS: {
7
+ value: CharacterType;
8
+ label: string;
9
+ }[];
10
+ export declare const CAPITALIZATION_OPTIONS: {
11
+ value: CapitalizationType;
12
+ label: string;
13
+ }[];
14
+ export declare const CHARACTER_ORDER_OPTIONS: {
15
+ value: CharacterOrderType;
16
+ label: string;
17
+ }[];
18
+ export declare const REFILL_UNIT_OPTIONS: {
19
+ value: RefillUnitType;
20
+ label: string;
21
+ }[];
@@ -0,0 +1,60 @@
1
+ import { CapitalizationType, CharacterOrderType, CharacterType, RefillUnitType, SeparatorType, } from './type';
2
+ import { translate, translations } from '@antscorp/antsomi-locales';
3
+ export const SEPARATOR_OPTIONS = [
4
+ { value: SeparatorType.HYPHEN, label: 'Hyphen (-)' },
5
+ { value: SeparatorType.UNDERSCORE, label: 'Underscore (_)' },
6
+ { value: SeparatorType.NONE, label: 'None' },
7
+ { value: SeparatorType.DOT, label: 'Dot (.)' },
8
+ ];
9
+ export const CHARACTER_TYPE_OPTIONS = [
10
+ {
11
+ value: CharacterType.DIGITS,
12
+ label: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_CHAC_TYPE_DIG, 'Digits only'),
13
+ },
14
+ {
15
+ value: CharacterType.LETTERS,
16
+ label: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_CHAC_TYPE_LET, 'Letters only'),
17
+ },
18
+ {
19
+ value: CharacterType.DIGIT_AND_LETTERS,
20
+ label: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_CHAC_TYPE_BOTH, 'Digit & letters'),
21
+ },
22
+ ];
23
+ export const CAPITALIZATION_OPTIONS = [
24
+ {
25
+ value: CapitalizationType.UPPERCASE,
26
+ label: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_CAP_UP, 'Uppercase'),
27
+ },
28
+ {
29
+ value: CapitalizationType.LOWERCASE,
30
+ label: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_CAP_LOW, 'lowercase'),
31
+ },
32
+ {
33
+ value: CapitalizationType.TITLE_CASE,
34
+ label: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_CAP_TITL, 'Title case'),
35
+ },
36
+ ];
37
+ export const CHARACTER_ORDER_OPTIONS = [
38
+ {
39
+ value: CharacterOrderType.RANDOM,
40
+ label: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_CHAC_ORDER_RANDOM, 'Random'),
41
+ },
42
+ {
43
+ value: CharacterOrderType.LETTER_FIRST,
44
+ label: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_CHAC_ORDER_LET, 'Letter first'),
45
+ },
46
+ {
47
+ value: CharacterOrderType.NUMBER_FIRST,
48
+ label: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_CHAC_ORDER_NO, 'Number first'),
49
+ },
50
+ ];
51
+ export const REFILL_UNIT_OPTIONS = [
52
+ {
53
+ value: RefillUnitType.CODES,
54
+ label: 'codes',
55
+ },
56
+ {
57
+ value: RefillUnitType.PERCENT,
58
+ label: '%',
59
+ },
60
+ ];
@@ -0,0 +1 @@
1
+ export declare const CodeStructureWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
@@ -0,0 +1,2 @@
1
+ import styled from 'styled-components';
2
+ export const CodeStructureWrapper = styled.div ``;
@@ -0,0 +1,43 @@
1
+ export declare enum CharacterType {
2
+ DIGITS = "digits",
3
+ LETTERS = "letters",
4
+ DIGIT_AND_LETTERS = "digitAndLetters"
5
+ }
6
+ export declare enum CharacterOrderType {
7
+ RANDOM = "random",
8
+ LETTER_FIRST = "letterFirst",
9
+ NUMBER_FIRST = "numberFirst"
10
+ }
11
+ export declare enum CapitalizationType {
12
+ UPPERCASE = "uppercase",
13
+ LOWERCASE = "lowercase",
14
+ TITLE_CASE = "titlecase"
15
+ }
16
+ export declare enum SeparatorType {
17
+ HYPHEN = "hyphen",
18
+ UNDERSCORE = "underscore",
19
+ DOT = "dot",
20
+ NONE = "none"
21
+ }
22
+ export declare enum RefillType {
23
+ AUTO = "auto",
24
+ MANUAL = "manual"
25
+ }
26
+ export declare enum RefillUnitType {
27
+ CODES = "codes",
28
+ PERCENT = "percent"
29
+ }
30
+ export interface CodeStructureData {
31
+ characterType: CharacterType;
32
+ digitalNumbers: number;
33
+ alphabetLetters: number;
34
+ capitalization: CapitalizationType;
35
+ characterOrder: CharacterOrderType;
36
+ separator: SeparatorType;
37
+ quantity: number;
38
+ suffix: string;
39
+ refillInterval: RefillType;
40
+ prefix: string;
41
+ refillThreshold?: number;
42
+ refillUnit?: RefillUnitType;
43
+ }
@@ -0,0 +1,35 @@
1
+ export var CharacterType;
2
+ (function (CharacterType) {
3
+ CharacterType["DIGITS"] = "digits";
4
+ CharacterType["LETTERS"] = "letters";
5
+ CharacterType["DIGIT_AND_LETTERS"] = "digitAndLetters";
6
+ })(CharacterType || (CharacterType = {}));
7
+ export var CharacterOrderType;
8
+ (function (CharacterOrderType) {
9
+ CharacterOrderType["RANDOM"] = "random";
10
+ CharacterOrderType["LETTER_FIRST"] = "letterFirst";
11
+ CharacterOrderType["NUMBER_FIRST"] = "numberFirst";
12
+ })(CharacterOrderType || (CharacterOrderType = {}));
13
+ export var CapitalizationType;
14
+ (function (CapitalizationType) {
15
+ CapitalizationType["UPPERCASE"] = "uppercase";
16
+ CapitalizationType["LOWERCASE"] = "lowercase";
17
+ CapitalizationType["TITLE_CASE"] = "titlecase";
18
+ })(CapitalizationType || (CapitalizationType = {}));
19
+ export var SeparatorType;
20
+ (function (SeparatorType) {
21
+ SeparatorType["HYPHEN"] = "hyphen";
22
+ SeparatorType["UNDERSCORE"] = "underscore";
23
+ SeparatorType["DOT"] = "dot";
24
+ SeparatorType["NONE"] = "none";
25
+ })(SeparatorType || (SeparatorType = {}));
26
+ export var RefillType;
27
+ (function (RefillType) {
28
+ RefillType["AUTO"] = "auto";
29
+ RefillType["MANUAL"] = "manual";
30
+ })(RefillType || (RefillType = {}));
31
+ export var RefillUnitType;
32
+ (function (RefillUnitType) {
33
+ RefillUnitType["CODES"] = "codes";
34
+ RefillUnitType["PERCENT"] = "percent";
35
+ })(RefillUnitType || (RefillUnitType = {}));
@@ -0,0 +1,4 @@
1
+ import { CharacterType, CodeStructureData, SeparatorType } from './type';
2
+ export declare const generateRandomCodeWithConfig: ({ characterType, digitalNumbers, alphabetLetters, capitalization, characterOrder, }: CodeStructureData) => string;
3
+ export declare const generateCodeWithPrefixAndSuffix: (code: string, prefix: string, suffix: string, separator: SeparatorType) => string;
4
+ export declare const calculateTotalCodes: (numberOfLetters: number, numberOfDigits: number, characterType: CharacterType) => number;
@@ -0,0 +1,63 @@
1
+ import { CapitalizationType, CharacterOrderType, CharacterType, SeparatorType, } from './type';
2
+ export const generateRandomCodeWithConfig = ({ characterType, digitalNumbers, alphabetLetters, capitalization, characterOrder, }) => {
3
+ const digits = '0123456789';
4
+ const letters = 'abcdefghijklmnopqrstuvwxyz';
5
+ let numPart = '';
6
+ let letterPart = '';
7
+ if (characterType === CharacterType.DIGITS || characterType === CharacterType.DIGIT_AND_LETTERS) {
8
+ numPart = Array.from({ length: digitalNumbers }, () => digits[Math.floor(Math.random() * digits.length)]).join('');
9
+ }
10
+ if (characterType === CharacterType.LETTERS ||
11
+ characterType === CharacterType.DIGIT_AND_LETTERS) {
12
+ letterPart = Array.from({ length: alphabetLetters }, () => letters[Math.floor(Math.random() * letters.length)]).join('');
13
+ }
14
+ // Apply capitalization
15
+ if (capitalization === CapitalizationType.UPPERCASE) {
16
+ letterPart = letterPart.toUpperCase();
17
+ }
18
+ else if (capitalization === CapitalizationType.LOWERCASE) {
19
+ letterPart = letterPart.toLowerCase();
20
+ }
21
+ else if (capitalization === CapitalizationType.TITLE_CASE && letterPart.length > 0) {
22
+ letterPart = letterPart.charAt(0).toUpperCase() + letterPart.slice(1).toLowerCase();
23
+ }
24
+ // Order characters
25
+ let finalCode = '';
26
+ if (characterOrder === CharacterOrderType.RANDOM) {
27
+ finalCode = (numPart + letterPart)
28
+ .split('')
29
+ .sort(() => Math.random() - 0.5)
30
+ .join('');
31
+ }
32
+ else if (characterOrder === CharacterOrderType.LETTER_FIRST) {
33
+ finalCode = letterPart + numPart;
34
+ }
35
+ else {
36
+ finalCode = numPart + letterPart;
37
+ }
38
+ return finalCode;
39
+ };
40
+ export const generateCodeWithPrefixAndSuffix = (code, prefix, suffix, separator) => {
41
+ let finalCode = code;
42
+ // Apply prefix and suffix
43
+ if (prefix)
44
+ finalCode = `${prefix}${separator !== SeparatorType.NONE ? (separator === SeparatorType.HYPHEN ? '-' : separator === SeparatorType.DOT ? '.' : '_') : ''}${finalCode}`;
45
+ if (suffix)
46
+ finalCode = `${finalCode}${separator !== SeparatorType.NONE ? (separator === SeparatorType.HYPHEN ? '-' : separator === SeparatorType.DOT ? '.' : '_') : ''}${suffix}`;
47
+ return finalCode;
48
+ };
49
+ export const calculateTotalCodes = (numberOfLetters, numberOfDigits, characterType) => {
50
+ let totalCodes = 0;
51
+ switch (characterType) {
52
+ case CharacterType.LETTERS:
53
+ case CharacterType.DIGITS:
54
+ totalCodes = 26 ** numberOfLetters * 10 ** numberOfDigits;
55
+ break;
56
+ case CharacterType.DIGIT_AND_LETTERS:
57
+ totalCodes = 26 * 26 ** (numberOfLetters - 1) * 10 ** numberOfDigits;
58
+ break;
59
+ default:
60
+ throw new Error('Invalid character type');
61
+ }
62
+ return totalCodes;
63
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antscorp/antsomi-ui",
3
- "version": "1.3.5-beta.987",
3
+ "version": "1.3.5-beta.988",
4
4
  "description": "An enterprise-class UI design language and React UI library.",
5
5
  "sideEffects": [
6
6
  "dist/*",
@@ -61,7 +61,7 @@
61
61
  "not op_mini all"
62
62
  ],
63
63
  "dependencies": {
64
- "@antscorp/antsomi-locales": "1.0.34",
64
+ "@antscorp/antsomi-locales": "1.0.35",
65
65
  "@ant-design/cssinjs": "^1.6.2",
66
66
  "@antscorp/icons": "0.27.54",
67
67
  "@antscorp/image-editor": "1.0.2",