@antscorp/antsomi-ui 1.3.5-beta.993 → 1.3.5-beta.995

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.
@@ -2,7 +2,10 @@ import React from 'react';
2
2
  import { CodeStructureData } from './type';
3
3
  interface CodeStructureProps {
4
4
  initialData: CodeStructureData;
5
- onChange: (data: CodeStructureData) => void;
5
+ onChange: ({ data, isError }: {
6
+ data: CodeStructureData;
7
+ isError: boolean;
8
+ }) => void;
6
9
  }
7
10
  export declare const CodeStructure: React.FC<CodeStructureProps>;
8
11
  export {};
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // Libraries
3
- import { useCallback, useEffect } from 'react';
3
+ import { useEffect } from 'react';
4
4
  import { Form, InputNumber, Radio, Select, Typography, Flex, Input, Row, Col } from 'antd';
5
5
  import { useImmer } from 'use-immer';
6
6
  import { translate, translations } from '@antscorp/antsomi-locales';
@@ -18,12 +18,10 @@ export const CodeStructure = ({ initialData, onChange }) => {
18
18
  const [state, setState] = useImmer({
19
19
  codeSample: '',
20
20
  maxCodes: 0,
21
- refillThreshold: 0,
22
21
  refillInterval: 'auto',
23
- refillUnit: 'codes',
24
22
  codeWithPrefixAndSuffix: '',
25
23
  });
26
- const { codeSample, maxCodes, refillThreshold, refillUnit } = state;
24
+ const { codeSample, maxCodes } = state;
27
25
  const setCodeSample = (value) => {
28
26
  setState(draft => {
29
27
  draft.codeSample = value;
@@ -43,37 +41,26 @@ export const CodeStructure = ({ initialData, onChange }) => {
43
41
  draft.codeWithPrefixAndSuffix = value;
44
42
  });
45
43
  };
46
- const setRefillThreshold = useCallback((value) => {
47
- setState(draft => {
48
- draft.refillThreshold = value;
49
- });
50
- }, [setState]);
51
- const setRefillUnit = useCallback((value) => {
52
- if (value === RefillUnitType.PERCENT) {
53
- setRefillThreshold(1);
54
- }
55
- else {
56
- setRefillThreshold(0);
57
- }
58
- setState(draft => {
59
- draft.refillUnit = value;
60
- });
61
- }, [setState, setRefillThreshold]);
62
44
  const debouncedOnChange = useDebouncedCallbackV2(onChange, 350);
63
- const updateFormValues = (data) => {
45
+ const updateFormValues = async (fieldKeyChange, isError) => {
46
+ // Get all values from the form
64
47
  const allValues = form.getFieldsValue();
65
48
  const numLetters = form.getFieldValue('alphabetLetters');
66
49
  const numDigits = form.getFieldValue('digitalNumbers');
67
50
  const type = form.getFieldValue('characterType');
68
51
  form.setFieldsValue(allValues);
69
52
  let totalPredicted = maxCodes;
70
- const isRelevantChangeMaxCode = Object.keys(data).some(key => key === 'alphabetLetters' || key === 'digitalNumbers' || key === 'characterType');
71
- const isRelevantChangeCodeKey = Object.keys(data).some(key => key !== 'quantity' &&
72
- key !== 'suffix' &&
73
- key !== 'prefix' &&
74
- key !== 'refillInterval' &&
75
- key !== 'separator');
76
- const isChangePrefix = Object.keys(data).some(key => key === 'suffix' || key === 'prefix' || key === 'separator');
53
+ const isRelevantChangeMaxCode = fieldKeyChange === 'alphabetLetters' ||
54
+ fieldKeyChange === 'digitalNumbers' ||
55
+ fieldKeyChange === 'characterType';
56
+ const isRelevantChangeCodeKey = fieldKeyChange !== 'quantity' &&
57
+ fieldKeyChange !== 'suffix' &&
58
+ fieldKeyChange !== 'prefix' &&
59
+ fieldKeyChange !== 'refillInterval' &&
60
+ fieldKeyChange !== 'refillThreshold' &&
61
+ fieldKeyChange !== 'refillUnit' &&
62
+ fieldKeyChange !== 'separator';
63
+ const isChangePrefix = fieldKeyChange === 'suffix' || fieldKeyChange === 'prefix' || fieldKeyChange === 'separator';
77
64
  if (isRelevantChangeMaxCode) {
78
65
  const total = calculateTotalCodes(numLetters, numDigits, type);
79
66
  totalPredicted = total;
@@ -88,29 +75,46 @@ export const CodeStructure = ({ initialData, onChange }) => {
88
75
  const dataOnChange = {
89
76
  ...allValues,
90
77
  totalPredicted,
91
- ...(allValues.refillInterval === 'auto' ? { refillThreshold, refillUnit } : {}),
92
78
  };
93
- debouncedOnChange(dataOnChange);
79
+ debouncedOnChange({
80
+ data: dataOnChange,
81
+ isError,
82
+ });
94
83
  };
95
- // Effects
96
- useEffect(() => {
97
- setRefillThreshold(initialData.refillThreshold || 0);
98
- }, [initialData.refillThreshold, setRefillThreshold]);
99
- useEffect(() => {
100
- setRefillUnit(initialData.refillUnit || RefillUnitType.CODES);
101
- }, [initialData.refillUnit, setRefillUnit]);
102
84
  useEffect(() => {
103
- setCodeSample(generateRandomCodeWithConfig(form.getFieldsValue()));
104
- setMaxCodes(calculateTotalCodes(form.getFieldValue('alphabetLetters'), form.getFieldValue('digitalNumbers'), form.getFieldValue('characterType')));
105
- }, []);
85
+ setCodeSample(generateRandomCodeWithConfig(initialData));
86
+ setMaxCodes(calculateTotalCodes(initialData.alphabetLetters, initialData.digitalNumbers, initialData.characterType));
87
+ }, [initialData]);
106
88
  useEffect(() => {
107
89
  form.setFieldsValue(initialData);
108
90
  }, [initialData, form]);
109
- return (_jsx(CodeStructureWrapper, { children: _jsxs(Form, { form: form, layout: "horizontal", labelCol: { span: 6 }, colon: false, wrapperCol: { span: 24 }, labelAlign: "left", initialValues: initialData, onValuesChange: updateFormValues, children: [_jsx(Title, { level: 5, 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: "", style: {
91
+ return (_jsx(CodeStructureWrapper, { children: _jsxs(Form, { form: form, layout: "horizontal", labelCol: { span: 6 }, colon: false, wrapperCol: { span: 24 }, labelAlign: "left", initialValues: initialData, onFieldsChange: (changedFields, _allFields) => {
92
+ const fieldKeyChange = changedFields[0].name[0];
93
+ const isValidate = form.getFieldsError().some(field => field.errors.length > 0);
94
+ updateFormValues(fieldKeyChange, isValidate);
95
+ }, children: [_jsx(Title, { level: 5, 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: "", style: {
110
96
  maxWidth: 465,
111
97
  } }) }), _jsxs(Row, { children: [_jsx(Col, { span: 6, 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: 6, 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: 6, 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: 6, 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: 6, 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: "", style: {
112
98
  maxWidth: 465,
113
- } }) }), _jsx(Form.Item, { label: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_SEPARATOR, 'Separator'), name: "separator", children: _jsx(Select, { options: SEPARATOR_OPTIONS, style: { width: '180px' } }) }), _jsxs(Row, { children: [_jsx(Col, { span: 6, 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: 5, children: "Code Refill" }), _jsx(Form.Item, { label: "Refill Interval", name: "refillInterval", children: _jsxs(Radio.Group, { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, onChange: e => {
114
- e.preventDefault();
115
- }, 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: refillUnit === RefillUnitType.CODES ? 0 : 1, max: refillUnit === RefillUnitType.PERCENT ? 100 : undefined, 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"] }) })] }) })] }) }));
99
+ } }) }), _jsx(Form.Item, { label: translate(translations._POOL_RULE_SETTING_CODE_STRUCTURE_SEPARATOR, 'Separator'), name: "separator", children: _jsx(Select, { options: SEPARATOR_OPTIONS, style: { width: '180px' } }) }), _jsxs(Row, { children: [_jsx(Col, { span: 6, 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, { required: true, name: "quantity", rules: [{ required: true }], 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: 5, children: "Code Refill" }), _jsx(Form.Item, { label: "Refill Interval", name: "refillInterval", children: _jsxs(Radio.Group, { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, 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(Form.Item, { noStyle: true, shouldUpdate: true, children: ({ getFieldValue }) => {
100
+ const refillUnit = getFieldValue('refillUnit');
101
+ return (_jsx(Form.Item, { name: "refillThreshold", noStyle: true, rules: [
102
+ { required: true, message: '' },
103
+ {
104
+ validator: (_, value) => {
105
+ if (refillUnit === RefillUnitType.PERCENT) {
106
+ if (value < 1 || value > 100) {
107
+ return Promise.reject(new Error(''));
108
+ }
109
+ }
110
+ else if (refillUnit === RefillUnitType.CODES) {
111
+ if (value < 0) {
112
+ return Promise.reject(new Error(''));
113
+ }
114
+ }
115
+ return Promise.resolve();
116
+ },
117
+ },
118
+ ], children: _jsx(InputNumber, { min: refillUnit === RefillUnitType.CODES ? 0 : 1, max: refillUnit === RefillUnitType.PERCENT ? 100 : undefined, style: { width: '63px' } }) }));
119
+ } }), _jsx(Form.Item, { name: "refillUnit", noStyle: true, children: _jsx(Select, { options: REFILL_UNIT_OPTIONS, style: { width: '63px' }, onClick: e => e.preventDefault() }) }), "remaining"] }) })] }) })] }) }));
116
120
  };
@@ -57,7 +57,8 @@ export const calculateTotalCodes = (numberOfLetters, numberOfDigits, characterTy
57
57
  totalCodes = 26 * 26 ** (numberOfLetters - 1) * 10 ** numberOfDigits;
58
58
  break;
59
59
  default:
60
- throw new Error('Invalid character type');
60
+ totalCodes = 0;
61
+ break;
61
62
  }
62
63
  return totalCodes;
63
64
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antscorp/antsomi-ui",
3
- "version": "1.3.5-beta.993",
3
+ "version": "1.3.5-beta.995",
4
4
  "description": "An enterprise-class UI design language and React UI library.",
5
5
  "sideEffects": [
6
6
  "dist/*",