@ncds/ui-admin 1.8.13 → 1.8.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/cjs/src/components/forms-and-input/date-picker/DatePicker.js +17 -20
  2. package/dist/cjs/src/components/forms-and-input/date-picker/__tests__/DatePicker.memo.test.js +53 -0
  3. package/dist/cjs/src/components/forms-and-input/date-picker/__tests__/DatePicker.test.js +129 -0
  4. package/dist/cjs/src/components/forms-and-input/select/Select.js +12 -1
  5. package/dist/cjs/src/components/forms-and-input/select-box/SelectBox.js +5 -2
  6. package/dist/cjs/src/utils/__tests__/date-picker.test.js +29 -0
  7. package/dist/cjs/src/utils/date-picker.js +15 -1
  8. package/dist/esm/src/components/forms-and-input/date-picker/DatePicker.js +18 -21
  9. package/dist/esm/src/components/forms-and-input/date-picker/__tests__/DatePicker.memo.test.js +50 -0
  10. package/dist/esm/src/components/forms-and-input/date-picker/__tests__/DatePicker.test.js +126 -0
  11. package/dist/esm/src/components/forms-and-input/select/Select.js +12 -1
  12. package/dist/esm/src/components/forms-and-input/select-box/SelectBox.js +5 -2
  13. package/dist/esm/src/utils/__tests__/date-picker.test.js +26 -0
  14. package/dist/esm/src/utils/date-picker.js +13 -0
  15. package/dist/temp/src/components/forms-and-input/date-picker/DatePicker.js +18 -28
  16. package/dist/temp/src/components/forms-and-input/date-picker/__tests__/DatePicker.memo.test.d.ts +1 -0
  17. package/dist/temp/src/components/forms-and-input/date-picker/__tests__/DatePicker.memo.test.js +43 -0
  18. package/dist/temp/src/components/forms-and-input/date-picker/__tests__/DatePicker.test.d.ts +1 -0
  19. package/dist/temp/src/components/forms-and-input/date-picker/__tests__/DatePicker.test.js +109 -0
  20. package/dist/temp/src/components/forms-and-input/select/Select.d.ts +1 -0
  21. package/dist/temp/src/components/forms-and-input/select/Select.js +10 -2
  22. package/dist/temp/src/components/forms-and-input/select-box/SelectBox.d.ts +1 -0
  23. package/dist/temp/src/components/forms-and-input/select-box/SelectBox.js +5 -4
  24. package/dist/temp/src/utils/__tests__/date-picker.test.d.ts +1 -0
  25. package/dist/temp/src/utils/__tests__/date-picker.test.js +26 -0
  26. package/dist/temp/src/utils/date-picker.d.ts +2 -0
  27. package/dist/temp/src/utils/date-picker.js +13 -0
  28. package/dist/types/src/components/forms-and-input/date-picker/__tests__/DatePicker.memo.test.d.ts +1 -0
  29. package/dist/types/src/components/forms-and-input/date-picker/__tests__/DatePicker.test.d.ts +1 -0
  30. package/dist/types/src/components/forms-and-input/select/Select.d.ts +1 -0
  31. package/dist/types/src/components/forms-and-input/select-box/SelectBox.d.ts +1 -0
  32. package/dist/types/src/utils/__tests__/date-picker.test.d.ts +1 -0
  33. package/dist/types/src/utils/date-picker.d.ts +2 -0
  34. package/dist/ui-admin/assets/styles/style.css +18 -2
  35. package/package.json +2 -1
@@ -0,0 +1,26 @@
1
+ import moment from 'moment';
2
+ import { describe, expect, it } from 'vitest';
3
+ import { convertToMomentFormat } from '../date-picker';
4
+ describe('convertToMomentFormat', () => {
5
+ it('날짜 전용 포맷을 moment 토큰으로 변환한다 (기존 동작 보존)', () => {
6
+ expect(convertToMomentFormat('Y-m-d')).toBe('YYYY-MM-DD');
7
+ });
8
+ it('2자리 연도(y)를 YY로 변환한다', () => {
9
+ expect(convertToMomentFormat('y-m-d')).toBe('YY-MM-DD');
10
+ });
11
+ it('시간 포함 포맷의 H/i/S를 모두 변환한다 (버그 수정 지점)', () => {
12
+ expect(convertToMomentFormat('Y-m-d H:i')).toBe('YYYY-MM-DD HH:mm');
13
+ expect(convertToMomentFormat('Y-m-d H:i:S')).toBe('YYYY-MM-DD HH:mm:ss');
14
+ });
15
+ it('월(m)과 분(i)이 함께 있어도 서로 침범하지 않는다', () => {
16
+ // m -> MM(월) 먼저, i -> mm(분) 나중 순서가 지켜져야 함
17
+ expect(convertToMomentFormat('Y-m-d H:i')).not.toContain('i');
18
+ expect(convertToMomentFormat('Y-m-d H:i')).toBe('YYYY-MM-DD HH:mm');
19
+ });
20
+ it('실제 moment 출력이 의도한 문자열과 일치한다 (회귀 핵심)', () => {
21
+ const date = moment('2024-03-20 14:30:05', 'YYYY-MM-DD HH:mm:ss').toDate();
22
+ expect(moment(date).format(convertToMomentFormat('Y-m-d'))).toBe('2024-03-20');
23
+ expect(moment(date).format(convertToMomentFormat('Y-m-d H:i'))).toBe('2024-03-20 14:30');
24
+ expect(moment(date).format(convertToMomentFormat('Y-m-d H:i:S'))).toBe('2024-03-20 14:30:05');
25
+ });
26
+ });
@@ -6,6 +6,8 @@ export declare function getSubtractDate({ date, period, unit, }: {
6
6
  period: DurationInputArg1;
7
7
  unit: DurationInputArg2;
8
8
  }): Date;
9
+ /** flatpickr dateFormat 토큰을 moment 포맷 토큰으로 변환 (단일 패스 치환으로 토큰 간 간섭 방지) */
10
+ export declare const convertToMomentFormat: (format: string) => string;
9
11
  export declare const formatDateInput: (input: string) => string;
10
12
  export declare const formatHourInput: (input: string) => string;
11
13
  export declare const formatMinuteInput: (input: string) => string;
@@ -15,6 +15,19 @@ export function getToday() {
15
15
  export function getSubtractDate({ date = getToday(), period, unit, }) {
16
16
  return moment(date).subtract(period, unit).toDate();
17
17
  }
18
+ /** flatpickr dateFormat 토큰을 moment 포맷 토큰으로 변환 (단일 패스 치환으로 토큰 간 간섭 방지) */
19
+ export const convertToMomentFormat = (format) => {
20
+ const tokenMap = {
21
+ Y: 'YYYY',
22
+ y: 'YY',
23
+ m: 'MM',
24
+ d: 'DD',
25
+ H: 'HH',
26
+ i: 'mm',
27
+ S: 'ss',
28
+ };
29
+ return format.replace(/[YymdHiS]/g, (matched) => tokenMap[matched] || matched);
30
+ };
18
31
  export const formatDateInput = (input) => {
19
32
  const dateRegex = /^(19|20)\d{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[0-1])$/;
20
33
  if (dateRegex.test(input)) {
@@ -7,6 +7,7 @@ export interface SelectProps extends Omit<ComponentPropsWithRef<'select'>, 'size
7
7
  disabledPlaceholder?: boolean;
8
8
  hintText?: string;
9
9
  destructive?: boolean;
10
+ readOnly?: boolean;
10
11
  size?: Extract<Size, 'xs' | 'sm' | 'md'>;
11
12
  optionItems?: OptionType[];
12
13
  register?: UseFormRegisterReturn;
@@ -16,6 +16,7 @@ type SelectBoxProps = Omit<ComponentPropsWithRef<'div'>, 'size' | 'onChange'> &
16
16
  value?: OptionValue;
17
17
  onChange?: OptionChangeHandler;
18
18
  disabled?: boolean;
19
+ readOnly?: boolean;
19
20
  register?: UseFormRegisterReturn;
20
21
  maxHeight?: number;
21
22
  multiple?: boolean;
@@ -6,6 +6,8 @@ export declare function getSubtractDate({ date, period, unit, }: {
6
6
  period: DurationInputArg1;
7
7
  unit: DurationInputArg2;
8
8
  }): Date;
9
+ /** flatpickr dateFormat 토큰을 moment 포맷 토큰으로 변환 (단일 패스 치환으로 토큰 간 간섭 방지) */
10
+ export declare const convertToMomentFormat: (format: string) => string;
9
11
  export declare const formatDateInput: (input: string) => string;
10
12
  export declare const formatHourInput: (input: string) => string;
11
13
  export declare const formatMinuteInput: (input: string) => string;
@@ -3415,6 +3415,12 @@ button {
3415
3415
  .ncua-select__content:has(.ncua-select__tag:disabled) {
3416
3416
  border-color: var(--gray-200);
3417
3417
  }
3418
+ .ncua-select--readonly .ncua-select__tag {
3419
+ pointer-events: none;
3420
+ background-color: var(--gray-50);
3421
+ color: var(--gray-700);
3422
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 14 14' fill='none'%3E%3Cpath d='M3.5 5.25L7 8.75L10.5 5.25' stroke='%23a4a5a8' stroke-width='1.16667' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
3423
+ }
3418
3424
  .ncua-select.destructive .ncua-select__content {
3419
3425
  border-color: var(--primary-red-600);
3420
3426
  }
@@ -3644,7 +3650,7 @@ button {
3644
3650
  cursor: pointer;
3645
3651
  transition: all 0.15s ease-in-out;
3646
3652
  }
3647
- .ncua-selectbox__content:hover:not(.ncua-selectbox--disabled .ncua-selectbox__content) {
3653
+ .ncua-selectbox__content:hover:not(.ncua-selectbox--disabled .ncua-selectbox__content):not(.ncua-selectbox--readonly .ncua-selectbox__content) {
3648
3654
  border-color: var(--gray-300);
3649
3655
  }
3650
3656
  .ncua-selectbox__content:focus {
@@ -3727,6 +3733,16 @@ button {
3727
3733
  .ncua-selectbox--disabled .ncua-selectbox__arrow {
3728
3734
  color: var(--gray-300);
3729
3735
  }
3736
+ .ncua-selectbox--readonly .ncua-selectbox__content {
3737
+ background-color: var(--gray-50);
3738
+ cursor: default;
3739
+ }
3740
+ .ncua-selectbox--readonly .ncua-selectbox__value {
3741
+ color: var(--gray-700);
3742
+ }
3743
+ .ncua-selectbox--readonly .ncua-selectbox__arrow {
3744
+ color: var(--gray-300);
3745
+ }
3730
3746
  .ncua-selectbox.destructive .ncua-selectbox__content {
3731
3747
  border-color: var(--primary-red-600);
3732
3748
  }
@@ -3791,7 +3807,7 @@ button {
3791
3807
  border: 0;
3792
3808
  background-color: transparent;
3793
3809
  }
3794
- .ncua-selectbox--simple .ncua-selectbox__content:hover:not(.ncua-selectbox--disabled .ncua-selectbox--simple .ncua-selectbox__content) {
3810
+ .ncua-selectbox--simple .ncua-selectbox__content:hover:not(.ncua-selectbox--disabled .ncua-selectbox--simple .ncua-selectbox__content):not(.ncua-selectbox--readonly .ncua-selectbox--simple .ncua-selectbox__content) {
3795
3811
  border-color: transparent;
3796
3812
  }
3797
3813
  .ncua-selectbox--simple .ncua-selectbox__content:focus {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ncds/ui-admin",
3
- "version": "1.8.13",
3
+ "version": "1.8.14",
4
4
  "description": "nhn-commerce의 어드민 디자인 시스템입니다.",
5
5
  "scripts": {
6
6
  "barrel": "node barrel.js",
@@ -105,6 +105,7 @@
105
105
  "eslint-config-react-app": "7.0.1",
106
106
  "file-loader": "6.2.0",
107
107
  "html-webpack-plugin": "5.6.6",
108
+ "jsdom": "26.1.0",
108
109
  "mini-css-extract-plugin": "2.10.1",
109
110
  "prop-types": "15.8.1",
110
111
  "react": "18.2.0",