@sellmate/design-system 0.0.39 → 0.0.40

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.
@@ -156,11 +156,17 @@ const SdSelectMultipleGroup = class extends selectKeyboardNavigation.BaseDropdow
156
156
  handleAllOptionClick = (detail) => {
157
157
  if (detail.isSelected) {
158
158
  // 이미 선택된 옵션인 경우, 선택 해제
159
- this.value = [];
159
+ const filterDisabledOptions = this.filteredOptions.filter(opt => opt.type === 'item' && !opt.disabled);
160
+ this.value =
161
+ this.value?.filter(selected => !filterDisabledOptions.some(opt => opt.value === selected.value)) || this.value;
160
162
  }
161
163
  else {
162
164
  // 새로운 옵션 선택
163
- this.value = [...this.filteredOptions.filter(opt => opt.type === 'item' && !opt.disabled)];
165
+ const valueSet = new Set([
166
+ ...(this.value || []),
167
+ ...this.filteredOptions.filter(opt => opt.type === 'item' && !opt.disabled),
168
+ ]);
169
+ this.value = Array.from(valueSet);
164
170
  }
165
171
  };
166
172
  handleOptionClick = (detail) => {
@@ -255,23 +261,23 @@ const SdSelectMultipleGroup = class extends selectKeyboardNavigation.BaseDropdow
255
261
  this.value = [...(this.value || []), option];
256
262
  }
257
263
  };
258
- getAllItemsUnderOption(parentOption) {
259
- const childOptions = this.filteredOptions.filter(option => option.parent === parentOption.value && !option.disabled);
260
- if (parentOption.type === 'group') {
261
- // Group - 모든 하위 item들을 수집
262
- const subgroupOptions = childOptions.filter(option => option.type === 'subgroup');
263
- const allItemsUnderGroup = [];
264
- // subgroup 하위의 모든 item
265
- subgroupOptions.forEach(subgroup => {
266
- const itemsUnderSubgroup = this.filteredOptions.filter(option => option.parent === subgroup.value && option.type === 'item' && !option.disabled);
267
- allItemsUnderGroup.push(...itemsUnderSubgroup);
268
- });
269
- // Group 바로 하위 item
270
- const directItems = childOptions.filter(option => option.type === 'item');
271
- allItemsUnderGroup.push(...directItems);
272
- return allItemsUnderGroup;
264
+ getAllItemsUnderOption(parentOption, includeDisabled = false) {
265
+ const filterChildrenWithParent = (option) => option.parent === parentOption.value && (includeDisabled || !option.disabled);
266
+ if (parentOption.type === 'subgroup') {
267
+ return this.filteredOptions.filter(option => filterChildrenWithParent(option) && option.type === 'item');
273
268
  }
274
- return childOptions.filter(option => option.type === 'item');
269
+ const allItems = [];
270
+ const childOptions = this.filteredOptions.filter(filterChildrenWithParent);
271
+ const subgroupOptions = childOptions.filter(option => option.type === 'subgroup');
272
+ subgroupOptions.forEach(subgroup => {
273
+ const itemsUnderSubgroup = this.filteredOptions.filter(option => option.parent === subgroup.value &&
274
+ option.type === 'item' &&
275
+ (includeDisabled ? true : !option.disabled));
276
+ allItems.push(...itemsUnderSubgroup);
277
+ });
278
+ const directItems = childOptions.filter(option => option.type === 'item');
279
+ allItems.push(...directItems);
280
+ return allItems;
275
281
  }
276
282
  isAllChildrenSelected(groupOption) {
277
283
  const allItems = this.getAllItemsUnderOption(groupOption);
@@ -285,25 +291,21 @@ const SdSelectMultipleGroup = class extends selectKeyboardNavigation.BaseDropdow
285
291
  return false;
286
292
  }
287
293
  getChildrenOptions(parentOption) {
288
- if (parentOption.type === 'group') {
289
- const allItems = this.getAllItemsUnderOption(parentOption);
290
- const selectedItems = allItems.filter(item => this.value?.some(selected => selected.value === item.value));
291
- return {
292
- selectedCount: selectedItems.length,
293
- totalCount: allItems.length,
294
- };
295
- }
296
- // Subgroup의 경우
297
- const children = this.filteredOptions.filter(option => option.parent === parentOption.value);
294
+ const allItems = this.getAllItemsUnderOption(parentOption, true);
295
+ const selectedCount = allItems.filter(item => this.value?.some(val => val.value === item.value)).length;
298
296
  return {
299
- selectedCount: children.filter(child => this.value?.some(val => val.value === child.value))
300
- .length,
301
- totalCount: children.length,
297
+ selectedCount,
298
+ totalCount: allItems.length,
302
299
  };
303
300
  }
304
301
  isAllOptionsSelected() {
305
- const selectedOption = this.getSelectedOption();
306
- return (selectedOption.length === this.options.filter(opt => !opt.disabled && opt.type === 'item').length);
302
+ if (!this.value || this.value.length === 0)
303
+ return false;
304
+ const selectableItems = this.options.filter(opt => opt.type === 'item' && !opt.disabled);
305
+ if (selectableItems.length === 0)
306
+ return false;
307
+ const selectedValues = new Set(this.value.map(v => v.value));
308
+ return selectableItems.every(option => selectedValues.has(option.value));
307
309
  }
308
310
  getTriggerLabel() {
309
311
  const selectedOption = this.getSelectedOption();
@@ -343,11 +345,11 @@ const SdSelectMultipleGroup = class extends selectKeyboardNavigation.BaseDropdow
343
345
  '--select-width': this.width || '200px',
344
346
  '--select-dropdown-height': this.dropdownHeight || '260px',
345
347
  };
346
- return (index.h(index.Host, { key: '3657f1c9c91e6ef006acb50bd83790f45ec38ccd', style: style }, index.h("div", { key: '9bb5379eb59eef6dc706686fb08f8bd9f3c5eaab', class: {
348
+ return (index.h(index.Host, { key: 'b94c7ab29fd483d5e02b330465ca1ee52e633614', style: style }, index.h("div", { key: 'fa4f208be81c4c70f499d45bd353e17e852b00f1', class: {
347
349
  'sd-select-multiple-group': true,
348
350
  'sd-select-multiple-group--open': this.isOpen,
349
351
  'sd-select-multiple-group--disabled': this.disabled,
350
- }, style: this.containerStyle, ref: el => (this.selectRef = el) }, this.renderLabel(this.label, this.labelStyle), index.h("div", { key: '4f0a9205a38450ab205e57d3ec80b95ee3b028e0', class: "sd-select-multiple-group__container" }, this.renderTrigger(), this.renderDropdown()))));
352
+ }, style: this.containerStyle, ref: el => (this.selectRef = el) }, this.renderLabel(this.label, this.labelStyle), index.h("div", { key: 'fa4a306d932a9c182ae16c05192dce0c0d25d915', class: "sd-select-multiple-group__container" }, this.renderTrigger(), this.renderDropdown()))));
351
353
  }
352
354
  renderLabel(label, labelStyle) {
353
355
  if (!label)
@@ -381,8 +383,7 @@ const SdSelectMultipleGroup = class extends selectKeyboardNavigation.BaseDropdow
381
383
  }, onKeyDown: e => {
382
384
  if (e.code === 'Enter')
383
385
  e.stopPropagation();
384
- } }, index.h("sd-icon", { name: "search", size: 16, color: "#737373", slot: "prefix" })))), this.filteredOptions.length > 0 ? (index.h(index.Fragment, null, this.useAll && (index.h("sd-select-option-group", { option: { label: this.allCheckOptionLabel, value: '', type: 'all' }, index: 0, isSelected: this.value?.length ===
385
- this.options.filter(opt => !opt.disabled && opt.type === 'item').length, isFocused: this.itemIndex === 0, optionStyle: this.optionStyle, onOptionClick: ({ detail, }) => this.handleAllOptionClick(detail), useCheckbox: this.useCheckbox, useIndicator: false })), this.filteredOptions.map((option, index$1) => (index.h("slot", { name: `option-${option.value}` }, index.h("sd-select-option-group", { option: option, index: index$1, isSelected: option.type === 'item'
386
+ } }, index.h("sd-icon", { name: "search", size: 16, color: "#737373", slot: "prefix" })))), this.filteredOptions.length > 0 ? (index.h(index.Fragment, null, this.useAll && (index.h("sd-select-option-group", { option: { label: this.allCheckOptionLabel, value: '', type: 'all' }, index: 0, isSelected: this.isAllOptionsSelected(), isFocused: this.itemIndex === 0, optionStyle: this.optionStyle, onOptionClick: ({ detail, }) => this.handleAllOptionClick(detail), useCheckbox: this.useCheckbox, useIndicator: false })), this.filteredOptions.map((option, index$1) => (index.h("slot", { name: `option-${option.value}` }, index.h("sd-select-option-group", { option: option, index: index$1, isSelected: option.type === 'item'
386
387
  ? this.value?.some(selected => selected.value === option.value)
387
388
  : this.isAllChildrenSelected(option), isFocused: index$1 === this.itemIndex, optionStyle: this.optionStyle, onOptionClick: ({ detail, }) => {
388
389
  if (option.type !== 'item' && !this.useCheckbox) {
@@ -1 +1 @@
1
- {"version":3,"file":"sd-select-multiple-group.entry.cjs.js","sources":["src/components/sd-select-multiple-group/sd-select-multiple-group.scss?tag=sd-select-multiple-group","src/components/sd-select-multiple-group/sd-select-multiple-group.tsx"],"sourcesContent":["@import 'variables';\n@import 'extend';\n\nsd-select-multiple-group {\n display: inline-block;\n height: fit-content;\n .sd-select-multiple-group {\n display: flex;\n flex-wrap: nowrap;\n width: var(--select-width, 200px);\n cursor: pointer;\n user-select: none;\n border: 1px solid $grey_55;\n border-radius: 4px;\n background-color: white;\n color: $grey_90;\n\n &:hover:not(.sd-select-multiple-group--disabled) {\n background: $grey_10;\n }\n\n &.sd-select-multiple-group--disabled {\n cursor: not-allowed;\n background-color: $grey_20;\n border-color: $grey_45;\n\n .sd-select-multiple-group__label {\n border-right: 1px solid $grey_45;\n }\n\n .sd-select-multiple-group__trigger {\n color: $grey_65;\n &:focus,\n &:focus-visible,\n &:focus-within {\n outline: none !important;\n }\n }\n }\n\n &__label {\n font-size: 12px;\n font-weight: 500;\n color: $grey_90;\n padding: 4px 12px;\n border-right: 1px solid $grey_45;\n border-radius: 4px 0 0 4px;\n background-color: $grey_10;\n }\n\n &__container {\n position: relative;\n width: 100%;\n display: flex;\n\n .sd-select-multiple-group__trigger {\n padding: 4px 20px 4px 12px;\n display: flex;\n width: 100%;\n align-items: center;\n\n .sd-select-multiple-group__value {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n line-height: 20px;\n font-size: 12px;\n font-weight: 400;\n }\n\n .sd-select-multiple-group__clear {\n margin: 0 4px;\n width: 8px;\n height: 8px;\n background-color: transparent;\n outline: none;\n border: none;\n }\n }\n\n .sd-select-multiple-group__arrow {\n position: absolute;\n top: 8px;\n right: 8px;\n width: 12px;\n height: 12px;\n color: $grey_65;\n transition: transform 0.3s ease;\n\n &--open {\n transform: rotate(180deg);\n }\n }\n }\n }\n}\n\n.sd-select-multiple-group__dropdown {\n @extend %scrollBar;\n width: var(--select-width, 200px);\n max-height: var(--select-dropdown-height, 260px);\n padding-bottom: 2px;\n background-color: white;\n box-shadow: 2px 2px 12px 2px rgba(0, 0, 0, 0.1);\n border-radius: 4px;\n overflow-y: auto;\n color: $grey_90;\n\n .sd-select-multiple-group__search-container {\n position: sticky;\n top: 0;\n display: flex;\n width: 100%;\n background-color: white;\n align-items: center;\n padding: 4px 8px;\n\n sd-input {\n width: 100%;\n }\n\n &--scrolled {\n box-shadow: 2px 2px 8px 2px rgba(0, 0, 0, 0.2);\n }\n }\n\n .sd-select-multiple-group__option-placeholder {\n padding: 4px 12px;\n font-size: 12px;\n line-height: 20px;\n }\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n Fragment,\n Host,\n Prop,\n State,\n Watch,\n h,\n} from '@stencil/core';\nimport { BaseDropdownEvent } from '../../utils/base-dropdown-event';\nimport { SelectMultipleEvents, SelectOption, SelectStyleProps } from '../sd-select/sd-select';\nimport { SelectKeyboardNavigation } from '../../utils/select-keyboard-navigation';\n\nexport interface SelectOptionGroup extends SelectOption {\n type: 'group' | 'subgroup' | 'item' | 'all';\n parent?: string;\n}\n\n@Component({\n tag: 'sd-select-multiple-group',\n styleUrl: 'sd-select-multiple-group.scss',\n})\nexport class SdSelectMultipleGroup extends BaseDropdownEvent {\n @Element() el!: HTMLElement;\n\n // props\n @Prop({ mutable: true }) value: SelectOptionGroup[] | null = null;\n @Prop() label: string = '';\n @Prop({ mutable: true }) options: SelectOptionGroup[] = [];\n @Prop() placeholder: string = '선택';\n @Prop() optionPlaceholder: string = '옵션이 없습니다.';\n @Prop() width: string = '200px';\n @Prop() dropdownHeight: string = '260px';\n @Prop() disabled: boolean = false;\n @Prop() clearable: boolean = false;\n @Prop() searchable: boolean = false;\n @Prop() useCheckbox: boolean = false;\n @Prop() useAll: boolean = false;\n @Prop() allCheckedLabel = '전체';\n @Prop() allCheckOptionLabel = '전체';\n\n // props - custom styles\n @Prop() containerStyle: SelectStyleProps['containerStyle'] = {};\n @Prop() triggerStyle: SelectStyleProps['triggerStyle'] = {};\n @Prop() dropdownStyle: SelectStyleProps['dropdownStyle'] = {};\n @Prop() optionStyle: SelectStyleProps['optionStyle'] = {};\n @Prop() labelStyle: SelectStyleProps['labelStyle'] = {};\n\n // props - custom slots\n @Prop() optionRenderer?: (option: SelectOption, index: number, isSelected: boolean) => any;\n\n // states\n @State() filteredOptions = this.options;\n @State() isOpen: boolean = false;\n @State() searchText: string | null = null;\n @State() itemIndex: number = -1;\n @State() isScrolled: boolean = false;\n\n // events\n @Event() sdChange?: EventEmitter<SelectMultipleEvents['sdChange']>;\n @Event() dropDownShow?: EventEmitter<SelectMultipleEvents['dropDownShow']>;\n\n private selectRef?: HTMLElement;\n private searchRef?: HTMLSdInputElement;\n private optionRef?: HTMLSdSelectOptionGroupElement;\n private dropdownRef?: HTMLElement;\n\n @Watch('value')\n valueChanged() {\n this.sdChange?.emit(this.value);\n }\n\n @Watch('options')\n optionsChanged() {\n this.filteredOptions = this.options;\n this.filterOptions();\n }\n\n @Watch('searchText')\n searchTextChanged() {\n this.filterOptions();\n }\n\n @Watch('itemIndex')\n async itemIndexChanged(newIndex: number, oldIndex: number) {\n if (this.searchable) {\n const searchInput = await this.getNativeInputElement();\n if (this.itemIndex === -1) {\n searchInput?.focus();\n return;\n } else if (searchInput?.matches(':focus')) {\n searchInput?.blur();\n }\n }\n\n const optionElements = Array.from(\n this.dropdownRef?.querySelectorAll(\n '.sd-select-multiple-group__dropdown sd-select-option-group',\n ) || [],\n );\n const currentItem = optionElements?.[this.itemIndex];\n\n if (!currentItem || !this.isOpen) return;\n\n this.optionRef = currentItem as HTMLSdSelectOptionGroupElement;\n const isOptionDisabled = await this.optionRef.isDisabled();\n\n if (isOptionDisabled) {\n newIndex > oldIndex ? this.itemIndex++ : this.itemIndex--;\n return;\n }\n\n this.scrollToOption(currentItem as HTMLElement);\n }\n\n @Watch('isOpen')\n async isOpenChanged() {\n // Base class의 이벤트 관리 호출 - 다른 select와의 이벤트 충돌 방지\n this.onDropdownToggle(this.isOpen);\n\n const selectedOption = this.getSelectedOption();\n if (!selectedOption) {\n this.itemIndex = -1;\n } else {\n this.itemIndex = this.options.indexOf(selectedOption[0]);\n }\n\n this.dropDownShow?.emit({ isOpen: this.isOpen });\n\n if (this.isOpen === false) return;\n\n await new Promise(resolve => setTimeout(resolve, 10));\n\n const optionElements = Array.from(\n this.dropdownRef?.querySelectorAll('.sd-select-multiple__dropdown sd-select-item') || [],\n );\n const currentItem = optionElements?.[this.itemIndex];\n\n // 드롭다운이 열릴 때 검색 입력에 포커스\n if (this.searchable) {\n const searchInput = await this.getNativeInputElement();\n searchInput?.focus();\n }\n\n if (!currentItem) return;\n\n await new Promise(resolve => setTimeout(resolve, 10)); // 추가 딜레이\n this.scrollToOption(currentItem as HTMLElement);\n }\n\n componentWillLoad() {\n // props가 모두 설정된 후에 실행되므로 올바른 options 값을 가져올 수 있음\n this.filteredOptions = this.options;\n this.initializeEvent(); // global dropdown Manager에 등록 + 이벤트 핸들러 초기화\n }\n\n disconnectedCallback() {\n this.cleanupEvent(); // global dropdown Manager에서 제거 + 이벤트 정리\n }\n\n protected handleDocumentClick(event: Event): void {\n if (!this.selectRef?.contains(event.target as Node)) {\n this.isOpen = false;\n }\n }\n\n protected handleDocumentKeydown(keyboardEvent: KeyboardEvent): void {\n keyboardEvent.stopPropagation();\n const targetKey = ['ArrowDown', 'ArrowUp', 'Enter', 'Escape'];\n if (!targetKey.includes(keyboardEvent.key)) return;\n\n keyboardEvent.preventDefault();\n switch (keyboardEvent.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n const keyboardNavigation = new SelectKeyboardNavigation(this.searchable, this.filteredOptions);\n const nextIndex = keyboardNavigation.getNextIndex(this.itemIndex, keyboardEvent.key);\n this.itemIndex = nextIndex;\n break;\n case 'Enter':\n const selectedOption = this.filteredOptions[this.itemIndex];\n if (selectedOption && !selectedOption.disabled) {\n this.handleOptionSelection(selectedOption);\n }\n break;\n case 'Escape':\n this.isOpen = false;\n break;\n }\n }\n\n // event handlers\n handleTriggerClick = (event: Event) => {\n event.stopPropagation();\n\n if (!this.disabled) {\n this.isOpen = !this.isOpen;\n this.dropDownShow?.emit({ isOpen: this.isOpen });\n }\n };\n\n handleAllOptionClick = (detail: {\n option: SelectOptionGroup;\n isSelected: boolean | null;\n index: number;\n event: MouseEvent;\n }) => {\n if (detail.isSelected) {\n // 이미 선택된 옵션인 경우, 선택 해제\n this.value = [];\n } else {\n // 새로운 옵션 선택\n this.value = [...this.filteredOptions.filter(opt => opt.type === 'item' && !opt.disabled)];\n }\n };\n\n handleOptionClick = (detail: {\n option: SelectOptionGroup;\n isSelected: boolean | null;\n index: number;\n event: MouseEvent;\n }) => {\n const { option, event } = detail;\n event.stopPropagation();\n\n if (option.type === 'group') this.handleGroupOptionClick(detail);\n if (option.type === 'subgroup') this.handleSubGroupOptionClick(detail);\n if (option.type === 'item') this.handleOptionSelection(option);\n };\n\n handleGroupOptionClick = (detail: {\n option: SelectOptionGroup;\n isSelected: boolean | null;\n index: number;\n }) => {\n const { option, isSelected } = detail;\n const childOptions = this.filteredOptions.filter(\n opt => opt.parent === option.value && !opt.disabled,\n );\n\n childOptions.forEach(subgroup => {\n this.handleSubGroupOptionClick({\n option: subgroup,\n isSelected: isSelected || isSelected === null,\n });\n });\n };\n\n handleSubGroupOptionClick = (detail: {\n option: SelectOptionGroup;\n isSelected: boolean | null;\n }) => {\n const { option, isSelected } = detail;\n\n const childOptions = this.filteredOptions.filter(\n opt => opt.parent === option.value && !opt.disabled,\n );\n\n if (isSelected || isSelected === null) {\n // 모든 자식 옵션이 선택된 경우, 모두 선택 해제\n this.value =\n this.value?.filter(selected => !childOptions.some(child => child.value === selected.value)) ||\n null;\n } else {\n // 일부 또는 전체 자식 옵션이 선택되지 않은 경우, 모두 선택\n const newSelections = childOptions.filter(\n child => !this.value?.some(selected => selected.value === child.value),\n );\n this.value = [...(this.value || []), ...newSelections];\n }\n };\n\n private filterOptions() {\n if (!this.searchText || this.searchText.trim() === '') {\n // 검색어가 없으면 전체 옵션 표시\n this.filteredOptions = this.options;\n return;\n }\n\n const searchTerm = this.searchText.toLowerCase();\n const matchedOptions = new Set<SelectOptionGroup>();\n\n // 1. 직접 매칭되는 옵션들 찾기\n this.options.forEach(option => {\n if (option.label.toLowerCase().includes(searchTerm)) {\n matchedOptions.add(option);\n\n // 매칭된 옵션의 상위 그룹들도 포함\n this.addParentGroups(option, matchedOptions);\n }\n });\n\n // 2. Set을 배열로 변환하고 원본 순서 유지\n this.filteredOptions = this.options.filter(option => matchedOptions.has(option));\n }\n\n private addParentGroups(option: SelectOptionGroup, matchedSet: Set<SelectOptionGroup>) {\n if (!option.parent) return;\n\n const parentOption = this.options.find(opt => opt.value === option.parent);\n if (parentOption && !matchedSet.has(parentOption)) {\n matchedSet.add(parentOption);\n // 재귀적으로 상위 그룹들도 추가\n this.addParentGroups(parentOption, matchedSet);\n }\n }\n\n private getSelectedOption(): SelectOptionGroup[] {\n return this.options.filter(option => this.value?.includes(option));\n }\n\n private handleDropdownScroll = (event: Event) => {\n const target = event.target as HTMLElement;\n const scrollTop = target.scrollTop;\n\n // 스크롤이 조금이라도 되면 그림자 표시\n this.isScrolled = scrollTop > 0;\n };\n\n private async getNativeInputElement(): Promise<HTMLInputElement | null> {\n if (this.searchRef) {\n return this.searchRef.getNativeElement();\n }\n return null;\n }\n\n private handleOptionSelection = (option: SelectOptionGroup) => {\n if (!option || option.disabled) return;\n\n const isAlreadySelected = this.value?.some(opt => opt.value === option.value);\n if (isAlreadySelected) {\n // 이미 선택된 옵션인 경우, 선택 해제\n this.value = this.value?.filter(opt => opt.value !== option.value) || null;\n } else {\n // 새로운 옵션 선택\n this.value = [...(this.value || []), option];\n }\n };\n\n private getAllItemsUnderOption(parentOption: SelectOptionGroup): SelectOptionGroup[] {\n const childOptions = this.filteredOptions.filter(\n option => option.parent === parentOption.value && !option.disabled,\n );\n\n if (parentOption.type === 'group') {\n // Group - 모든 하위 item들을 수집\n const subgroupOptions = childOptions.filter(option => option.type === 'subgroup');\n const allItemsUnderGroup: SelectOptionGroup[] = [];\n\n // subgroup 하위의 모든 item\n subgroupOptions.forEach(subgroup => {\n const itemsUnderSubgroup = this.filteredOptions.filter(\n option => option.parent === subgroup.value && option.type === 'item' && !option.disabled,\n );\n allItemsUnderGroup.push(...itemsUnderSubgroup);\n });\n\n // Group 바로 하위 item\n const directItems = childOptions.filter(option => option.type === 'item');\n allItemsUnderGroup.push(...directItems);\n\n return allItemsUnderGroup;\n }\n\n return childOptions.filter(option => option.type === 'item');\n }\n\n private isAllChildrenSelected(groupOption: SelectOptionGroup): boolean | null {\n const allItems = this.getAllItemsUnderOption(groupOption);\n\n if (allItems.length === 0) return false;\n\n const selectedItems = allItems.filter(item =>\n this.value?.some(selected => selected.value === item.value),\n );\n\n if (selectedItems.length === allItems.length) return true;\n if (selectedItems.length > 0) return null;\n return false;\n }\n\n private getChildrenOptions(parentOption: SelectOptionGroup) {\n if (parentOption.type === 'group') {\n const allItems = this.getAllItemsUnderOption(parentOption);\n const selectedItems = allItems.filter(item =>\n this.value?.some(selected => selected.value === item.value),\n );\n\n return {\n selectedCount: selectedItems.length,\n totalCount: allItems.length,\n };\n }\n\n // Subgroup의 경우\n const children = this.filteredOptions.filter(option => option.parent === parentOption.value);\n return {\n selectedCount: children.filter(child => this.value?.some(val => val.value === child.value))\n .length,\n totalCount: children.length,\n };\n }\n\n private isAllOptionsSelected() {\n const selectedOption = this.getSelectedOption();\n return (\n selectedOption.length === this.options.filter(opt => !opt.disabled && opt.type === 'item').length\n );\n }\n\n private getTriggerLabel() {\n const selectedOption = this.getSelectedOption();\n if (!selectedOption) return '선택';\n\n if (selectedOption.length === 0) return this.placeholder;\n\n const isAllChecked = this.isAllOptionsSelected();\n\n return isAllChecked\n ? this.allCheckedLabel\n : selectedOption.map(option => option.label).join(', ');\n }\n\n closeDropdown() {\n this.isOpen = false;\n }\n\n private scrollToOption(optionElement: HTMLElement) {\n if (!this.dropdownRef || !optionElement) return;\n\n const dropdown = this.dropdownRef;\n const optionTop = optionElement.offsetTop;\n const optionHeight = optionElement.offsetHeight;\n const dropdownScrollTop = dropdown.scrollTop;\n const dropdownHeight = dropdown.clientHeight;\n\n const searchContainer = dropdown.querySelector('.sd-select__search-container');\n const searchOffset = searchContainer ? (searchContainer as HTMLElement).offsetHeight : 0;\n\n const visibleTop = dropdownScrollTop + searchOffset;\n const visibleBottom = dropdownScrollTop + dropdownHeight;\n\n if (optionTop < visibleTop) {\n dropdown.scrollTop = optionTop - searchOffset;\n } else if (optionTop + optionHeight > visibleBottom) {\n dropdown.scrollTop = optionTop + optionHeight - dropdownHeight + searchOffset;\n }\n }\n\n render() {\n const style = {\n '--select-width': this.width || '200px',\n '--select-dropdown-height': this.dropdownHeight || '260px',\n };\n\n return (\n <Host style={style}>\n <div\n class={{\n 'sd-select-multiple-group': true,\n 'sd-select-multiple-group--open': this.isOpen,\n 'sd-select-multiple-group--disabled': this.disabled,\n }}\n style={this.containerStyle}\n ref={el => (this.selectRef = el)}\n >\n {this.renderLabel(this.label, this.labelStyle)}\n <div class=\"sd-select-multiple-group__container\">\n {this.renderTrigger()}\n {this.renderDropdown()}\n </div>\n </div>\n </Host>\n );\n }\n\n private renderLabel(label?: string, labelStyle?: { [key: string]: string }) {\n if (!label) return null;\n\n return (\n <label class=\"sd-select-multiple-group__label\" style={labelStyle}>\n {label}\n </label>\n );\n }\n\n private renderTrigger() {\n const selectedOption = this.getSelectedOption();\n return (\n <div\n class=\"sd-select-multiple-group__trigger\"\n tabindex={this.disabled ? -1 : 0}\n onClick={this.handleTriggerClick}\n style={this.triggerStyle}\n >\n <span class=\"sd-select-multiple-group__value\">{this.getTriggerLabel()}</span>\n {this.clearable && selectedOption?.length > 0 && !this.disabled && (\n <sd-icon\n key=\"close-icon\"\n name=\"close\"\n size={10}\n color=\"#888\"\n class=\"sd-select-multiple-group__clear\"\n onClick={event => {\n event.stopPropagation();\n this.value = null;\n }}\n ></sd-icon>\n )}\n\n <sd-icon\n key=\"arrow-icon\"\n name=\"arrowDown\"\n color=\"#888\"\n class={{\n 'sd-select-multiple-group__arrow': true,\n 'sd-select-multiple-group__arrow--open': this.isOpen,\n }}\n ></sd-icon>\n </div>\n );\n }\n\n private renderDropdown() {\n const style = {\n '--select-width': this.width || '200px',\n '--select-dropdown-height': this.dropdownHeight || '260px',\n };\n\n if (this.isOpen === false) return null;\n\n return (\n <sd-portal open={this.isOpen} parentRef={this.selectRef} onSdClose={this.closeDropdown}>\n <div\n class=\"sd-select-multiple-group__dropdown\"\n style={{ ...style, ...this.dropdownStyle }}\n onScroll={this.handleDropdownScroll}\n ref={el => (this.dropdownRef = el)}\n >\n {this.searchable && (\n <div\n class={{\n 'sd-select-multiple-group__search-container': true,\n 'sd-select-multiple-group__search-container--scrolled': this.isScrolled,\n }}\n onClick={event => event.stopPropagation()}\n >\n <sd-input\n ref={el => (this.searchRef = el)}\n value={this.searchText}\n placeholder=\"검색\"\n clearable\n inputStyle={{ 'padding-left': '8px' }}\n autofocus\n onSdInput={event => {\n this.searchText = String(event?.detail);\n }}\n onSdFocus={() => {\n this.itemIndex = -1;\n }}\n onKeyDown={e => {\n if (e.code === 'Enter') e.stopPropagation();\n }}\n >\n <sd-icon name=\"search\" size={16} color=\"#737373\" slot=\"prefix\"></sd-icon>\n </sd-input>\n </div>\n )}\n\n {this.filteredOptions.length > 0 ? (\n <Fragment>\n {this.useAll && (\n <sd-select-option-group\n option={{ label: this.allCheckOptionLabel, value: '', type: 'all' }}\n index={0}\n isSelected={\n this.value?.length ===\n this.options.filter(opt => !opt.disabled && opt.type === 'item').length\n }\n isFocused={this.itemIndex === 0}\n optionStyle={this.optionStyle}\n onOptionClick={({\n detail,\n }: {\n detail: {\n option: SelectOptionGroup;\n isSelected: boolean | null;\n index: number;\n event: MouseEvent;\n };\n }) => this.handleAllOptionClick(detail)}\n useCheckbox={this.useCheckbox}\n useIndicator={false}\n ></sd-select-option-group>\n )}\n {this.filteredOptions.map((option, index) => (\n <slot name={`option-${option.value}`}>\n <sd-select-option-group\n option={option}\n index={index}\n isSelected={\n option.type === 'item'\n ? this.value?.some(selected => selected.value === option.value)\n : this.isAllChildrenSelected(option)\n }\n isFocused={index === this.itemIndex}\n optionStyle={this.optionStyle}\n onOptionClick={({\n detail,\n }: {\n detail: {\n option: SelectOptionGroup;\n isSelected: boolean | null;\n index: number;\n event: MouseEvent;\n };\n }) => {\n if (option.type !== 'item' && !this.useCheckbox) {\n return;\n }\n\n this.handleOptionClick(detail);\n }}\n useCheckbox={this.useCheckbox}\n {...(option.type !== 'item' && { countInfo: this.getChildrenOptions(option) })}\n ></sd-select-option-group>\n </slot>\n ))}\n </Fragment>\n ) : (\n <slot name=\"option-placeholder\">\n <div class={'sd-select-multiple-group__option-placeholder'} style={this.optionStyle}>\n {this.optionPlaceholder}\n </div>\n </slot>\n )}\n </div>\n </sd-portal>\n );\n }\n}\n"],"names":["BaseDropdownEvent","SelectKeyboardNavigation","h","Host","Fragment","index"],"mappings":"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"}
1
+ {"version":3,"file":"sd-select-multiple-group.entry.cjs.js","sources":["src/components/sd-select-multiple-group/sd-select-multiple-group.scss?tag=sd-select-multiple-group","src/components/sd-select-multiple-group/sd-select-multiple-group.tsx"],"sourcesContent":["@import 'variables';\n@import 'extend';\n\nsd-select-multiple-group {\n display: inline-block;\n height: fit-content;\n .sd-select-multiple-group {\n display: flex;\n flex-wrap: nowrap;\n width: var(--select-width, 200px);\n cursor: pointer;\n user-select: none;\n border: 1px solid $grey_55;\n border-radius: 4px;\n background-color: white;\n color: $grey_90;\n\n &:hover:not(.sd-select-multiple-group--disabled) {\n background: $grey_10;\n }\n\n &.sd-select-multiple-group--disabled {\n cursor: not-allowed;\n background-color: $grey_20;\n border-color: $grey_45;\n\n .sd-select-multiple-group__label {\n border-right: 1px solid $grey_45;\n }\n\n .sd-select-multiple-group__trigger {\n color: $grey_65;\n &:focus,\n &:focus-visible,\n &:focus-within {\n outline: none !important;\n }\n }\n }\n\n &__label {\n font-size: 12px;\n font-weight: 500;\n color: $grey_90;\n padding: 4px 12px;\n border-right: 1px solid $grey_45;\n border-radius: 4px 0 0 4px;\n background-color: $grey_10;\n }\n\n &__container {\n position: relative;\n width: 100%;\n display: flex;\n\n .sd-select-multiple-group__trigger {\n padding: 4px 20px 4px 12px;\n display: flex;\n width: 100%;\n align-items: center;\n\n .sd-select-multiple-group__value {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n line-height: 20px;\n font-size: 12px;\n font-weight: 400;\n }\n\n .sd-select-multiple-group__clear {\n margin: 0 4px;\n width: 8px;\n height: 8px;\n background-color: transparent;\n outline: none;\n border: none;\n }\n }\n\n .sd-select-multiple-group__arrow {\n position: absolute;\n top: 8px;\n right: 8px;\n width: 12px;\n height: 12px;\n color: $grey_65;\n transition: transform 0.3s ease;\n\n &--open {\n transform: rotate(180deg);\n }\n }\n }\n }\n}\n\n.sd-select-multiple-group__dropdown {\n @extend %scrollBar;\n width: var(--select-width, 200px);\n max-height: var(--select-dropdown-height, 260px);\n padding-bottom: 2px;\n background-color: white;\n box-shadow: 2px 2px 12px 2px rgba(0, 0, 0, 0.1);\n border-radius: 4px;\n overflow-y: auto;\n color: $grey_90;\n\n .sd-select-multiple-group__search-container {\n position: sticky;\n top: 0;\n display: flex;\n width: 100%;\n background-color: white;\n align-items: center;\n padding: 4px 8px;\n\n sd-input {\n width: 100%;\n }\n\n &--scrolled {\n box-shadow: 2px 2px 8px 2px rgba(0, 0, 0, 0.2);\n }\n }\n\n .sd-select-multiple-group__option-placeholder {\n padding: 4px 12px;\n font-size: 12px;\n line-height: 20px;\n }\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n Fragment,\n Host,\n Prop,\n State,\n Watch,\n h,\n} from '@stencil/core';\nimport { BaseDropdownEvent } from '../../utils/base-dropdown-event';\nimport { SelectMultipleEvents, SelectOption, SelectStyleProps } from '../sd-select/sd-select';\nimport { SelectKeyboardNavigation } from '../../utils/select-keyboard-navigation';\n\nexport interface SelectOptionGroup extends SelectOption {\n type: 'group' | 'subgroup' | 'item' | 'all';\n parent?: string;\n}\n\n@Component({\n tag: 'sd-select-multiple-group',\n styleUrl: 'sd-select-multiple-group.scss',\n})\nexport class SdSelectMultipleGroup extends BaseDropdownEvent {\n @Element() el!: HTMLElement;\n\n // props\n @Prop({ mutable: true }) value: SelectOptionGroup[] | null = null;\n @Prop() label: string = '';\n @Prop({ mutable: true }) options: SelectOptionGroup[] = [];\n @Prop() placeholder: string = '선택';\n @Prop() optionPlaceholder: string = '옵션이 없습니다.';\n @Prop() width: string = '200px';\n @Prop() dropdownHeight: string = '260px';\n @Prop() disabled: boolean = false;\n @Prop() clearable: boolean = false;\n @Prop() searchable: boolean = false;\n @Prop() useCheckbox: boolean = false;\n @Prop() useAll: boolean = false;\n @Prop() allCheckedLabel = '전체';\n @Prop() allCheckOptionLabel = '전체';\n\n // props - custom styles\n @Prop() containerStyle: SelectStyleProps['containerStyle'] = {};\n @Prop() triggerStyle: SelectStyleProps['triggerStyle'] = {};\n @Prop() dropdownStyle: SelectStyleProps['dropdownStyle'] = {};\n @Prop() optionStyle: SelectStyleProps['optionStyle'] = {};\n @Prop() labelStyle: SelectStyleProps['labelStyle'] = {};\n\n // props - custom slots\n @Prop() optionRenderer?: (option: SelectOption, index: number, isSelected: boolean) => any;\n\n // states\n @State() filteredOptions = this.options;\n @State() isOpen: boolean = false;\n @State() searchText: string | null = null;\n @State() itemIndex: number = -1;\n @State() isScrolled: boolean = false;\n\n // events\n @Event() sdChange?: EventEmitter<SelectMultipleEvents['sdChange']>;\n @Event() dropDownShow?: EventEmitter<SelectMultipleEvents['dropDownShow']>;\n\n private selectRef?: HTMLElement;\n private searchRef?: HTMLSdInputElement;\n private optionRef?: HTMLSdSelectOptionGroupElement;\n private dropdownRef?: HTMLElement;\n\n @Watch('value')\n valueChanged() {\n this.sdChange?.emit(this.value);\n }\n\n @Watch('options')\n optionsChanged() {\n this.filteredOptions = this.options;\n this.filterOptions();\n }\n\n @Watch('searchText')\n searchTextChanged() {\n this.filterOptions();\n }\n\n @Watch('itemIndex')\n async itemIndexChanged(newIndex: number, oldIndex: number) {\n if (this.searchable) {\n const searchInput = await this.getNativeInputElement();\n if (this.itemIndex === -1) {\n searchInput?.focus();\n return;\n } else if (searchInput?.matches(':focus')) {\n searchInput?.blur();\n }\n }\n\n const optionElements = Array.from(\n this.dropdownRef?.querySelectorAll(\n '.sd-select-multiple-group__dropdown sd-select-option-group',\n ) || [],\n );\n const currentItem = optionElements?.[this.itemIndex];\n\n if (!currentItem || !this.isOpen) return;\n\n this.optionRef = currentItem as HTMLSdSelectOptionGroupElement;\n const isOptionDisabled = await this.optionRef.isDisabled();\n\n if (isOptionDisabled) {\n newIndex > oldIndex ? this.itemIndex++ : this.itemIndex--;\n return;\n }\n\n this.scrollToOption(currentItem as HTMLElement);\n }\n\n @Watch('isOpen')\n async isOpenChanged() {\n // Base class의 이벤트 관리 호출 - 다른 select와의 이벤트 충돌 방지\n this.onDropdownToggle(this.isOpen);\n\n const selectedOption = this.getSelectedOption();\n if (!selectedOption) {\n this.itemIndex = -1;\n } else {\n this.itemIndex = this.options.indexOf(selectedOption[0]);\n }\n\n this.dropDownShow?.emit({ isOpen: this.isOpen });\n\n if (this.isOpen === false) return;\n\n await new Promise(resolve => setTimeout(resolve, 10));\n\n const optionElements = Array.from(\n this.dropdownRef?.querySelectorAll('.sd-select-multiple__dropdown sd-select-item') || [],\n );\n const currentItem = optionElements?.[this.itemIndex];\n\n // 드롭다운이 열릴 때 검색 입력에 포커스\n if (this.searchable) {\n const searchInput = await this.getNativeInputElement();\n searchInput?.focus();\n }\n\n if (!currentItem) return;\n\n await new Promise(resolve => setTimeout(resolve, 10)); // 추가 딜레이\n this.scrollToOption(currentItem as HTMLElement);\n }\n\n componentWillLoad() {\n // props가 모두 설정된 후에 실행되므로 올바른 options 값을 가져올 수 있음\n this.filteredOptions = this.options;\n this.initializeEvent(); // global dropdown Manager에 등록 + 이벤트 핸들러 초기화\n }\n\n disconnectedCallback() {\n this.cleanupEvent(); // global dropdown Manager에서 제거 + 이벤트 정리\n }\n\n protected handleDocumentClick(event: Event): void {\n if (!this.selectRef?.contains(event.target as Node)) {\n this.isOpen = false;\n }\n }\n\n protected handleDocumentKeydown(keyboardEvent: KeyboardEvent): void {\n keyboardEvent.stopPropagation();\n const targetKey = ['ArrowDown', 'ArrowUp', 'Enter', 'Escape'];\n if (!targetKey.includes(keyboardEvent.key)) return;\n\n keyboardEvent.preventDefault();\n switch (keyboardEvent.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n const keyboardNavigation = new SelectKeyboardNavigation(this.searchable, this.filteredOptions);\n const nextIndex = keyboardNavigation.getNextIndex(this.itemIndex, keyboardEvent.key);\n this.itemIndex = nextIndex;\n break;\n case 'Enter':\n const selectedOption = this.filteredOptions[this.itemIndex];\n if (selectedOption && !selectedOption.disabled) {\n this.handleOptionSelection(selectedOption);\n }\n break;\n case 'Escape':\n this.isOpen = false;\n break;\n }\n }\n\n // event handlers\n handleTriggerClick = (event: Event) => {\n event.stopPropagation();\n\n if (!this.disabled) {\n this.isOpen = !this.isOpen;\n this.dropDownShow?.emit({ isOpen: this.isOpen });\n }\n };\n\n handleAllOptionClick = (detail: {\n option: SelectOptionGroup;\n isSelected: boolean | null;\n index: number;\n event: MouseEvent;\n }) => {\n if (detail.isSelected) {\n // 이미 선택된 옵션인 경우, 선택 해제\n const filterDisabledOptions = this.filteredOptions.filter(\n opt => opt.type === 'item' && !opt.disabled,\n );\n this.value =\n this.value?.filter(\n selected => !filterDisabledOptions.some(opt => opt.value === selected.value),\n ) || this.value;\n } else {\n // 새로운 옵션 선택\n const valueSet = new Set([\n ...(this.value || []),\n ...this.filteredOptions.filter(opt => opt.type === 'item' && !opt.disabled),\n ]);\n this.value = Array.from(valueSet);\n }\n };\n\n handleOptionClick = (detail: {\n option: SelectOptionGroup;\n isSelected: boolean | null;\n index: number;\n event: MouseEvent;\n }) => {\n const { option, event } = detail;\n event.stopPropagation();\n\n if (option.type === 'group') this.handleGroupOptionClick(detail);\n if (option.type === 'subgroup') this.handleSubGroupOptionClick(detail);\n if (option.type === 'item') this.handleOptionSelection(option);\n };\n\n handleGroupOptionClick = (detail: {\n option: SelectOptionGroup;\n isSelected: boolean | null;\n index: number;\n }) => {\n const { option, isSelected } = detail;\n const childOptions = this.filteredOptions.filter(\n opt => opt.parent === option.value && !opt.disabled,\n );\n\n childOptions.forEach(subgroup => {\n this.handleSubGroupOptionClick({\n option: subgroup,\n isSelected: isSelected || isSelected === null,\n });\n });\n };\n\n handleSubGroupOptionClick = (detail: {\n option: SelectOptionGroup;\n isSelected: boolean | null;\n }) => {\n const { option, isSelected } = detail;\n\n const childOptions = this.filteredOptions.filter(\n opt => opt.parent === option.value && !opt.disabled,\n );\n\n if (isSelected || isSelected === null) {\n // 모든 자식 옵션이 선택된 경우, 모두 선택 해제\n this.value =\n this.value?.filter(selected => !childOptions.some(child => child.value === selected.value)) ||\n null;\n } else {\n // 일부 또는 전체 자식 옵션이 선택되지 않은 경우, 모두 선택\n const newSelections = childOptions.filter(\n child => !this.value?.some(selected => selected.value === child.value),\n );\n this.value = [...(this.value || []), ...newSelections];\n }\n };\n\n private filterOptions() {\n if (!this.searchText || this.searchText.trim() === '') {\n // 검색어가 없으면 전체 옵션 표시\n this.filteredOptions = this.options;\n return;\n }\n\n const searchTerm = this.searchText.toLowerCase();\n const matchedOptions = new Set<SelectOptionGroup>();\n\n // 1. 직접 매칭되는 옵션들 찾기\n this.options.forEach(option => {\n if (option.label.toLowerCase().includes(searchTerm)) {\n matchedOptions.add(option);\n\n // 매칭된 옵션의 상위 그룹들도 포함\n this.addParentGroups(option, matchedOptions);\n }\n });\n\n // 2. Set을 배열로 변환하고 원본 순서 유지\n this.filteredOptions = this.options.filter(option => matchedOptions.has(option));\n }\n\n private addParentGroups(option: SelectOptionGroup, matchedSet: Set<SelectOptionGroup>) {\n if (!option.parent) return;\n\n const parentOption = this.options.find(opt => opt.value === option.parent);\n if (parentOption && !matchedSet.has(parentOption)) {\n matchedSet.add(parentOption);\n // 재귀적으로 상위 그룹들도 추가\n this.addParentGroups(parentOption, matchedSet);\n }\n }\n\n private getSelectedOption(): SelectOptionGroup[] {\n return this.options.filter(option => this.value?.includes(option));\n }\n\n private handleDropdownScroll = (event: Event) => {\n const target = event.target as HTMLElement;\n const scrollTop = target.scrollTop;\n\n // 스크롤이 조금이라도 되면 그림자 표시\n this.isScrolled = scrollTop > 0;\n };\n\n private async getNativeInputElement(): Promise<HTMLInputElement | null> {\n if (this.searchRef) {\n return this.searchRef.getNativeElement();\n }\n return null;\n }\n\n private handleOptionSelection = (option: SelectOptionGroup) => {\n if (!option || option.disabled) return;\n\n const isAlreadySelected = this.value?.some(opt => opt.value === option.value);\n if (isAlreadySelected) {\n // 이미 선택된 옵션인 경우, 선택 해제\n this.value = this.value?.filter(opt => opt.value !== option.value) || null;\n } else {\n // 새로운 옵션 선택\n this.value = [...(this.value || []), option];\n }\n };\n\n private getAllItemsUnderOption(\n parentOption: SelectOptionGroup,\n includeDisabled: boolean = false,\n ): SelectOptionGroup[] {\n const filterChildrenWithParent = (option: SelectOptionGroup) =>\n option.parent === parentOption.value && (includeDisabled || !option.disabled);\n\n if (parentOption.type === 'subgroup') {\n return this.filteredOptions.filter(\n option => filterChildrenWithParent(option) && option.type === 'item',\n );\n }\n\n const allItems: SelectOptionGroup[] = [];\n const childOptions = this.filteredOptions.filter(filterChildrenWithParent);\n const subgroupOptions = childOptions.filter(option => option.type === 'subgroup');\n subgroupOptions.forEach(subgroup => {\n const itemsUnderSubgroup = this.filteredOptions.filter(\n option =>\n option.parent === subgroup.value &&\n option.type === 'item' &&\n (includeDisabled ? true : !option.disabled),\n );\n allItems.push(...itemsUnderSubgroup);\n });\n const directItems = childOptions.filter(option => option.type === 'item');\n allItems.push(...directItems);\n\n return allItems;\n }\n\n private isAllChildrenSelected(groupOption: SelectOptionGroup): boolean | null {\n const allItems = this.getAllItemsUnderOption(groupOption);\n\n if (allItems.length === 0) return false;\n\n const selectedItems = allItems.filter(item =>\n this.value?.some(selected => selected.value === item.value),\n );\n\n if (selectedItems.length === allItems.length) return true;\n if (selectedItems.length > 0) return null;\n return false;\n }\n\n private getChildrenOptions(parentOption: SelectOptionGroup) {\n const allItems = this.getAllItemsUnderOption(parentOption, true);\n const selectedCount = allItems.filter(item =>\n this.value?.some(val => val.value === item.value),\n ).length;\n\n return {\n selectedCount,\n totalCount: allItems.length,\n };\n }\n\n private isAllOptionsSelected(): boolean {\n if (!this.value || this.value.length === 0) return false;\n\n const selectableItems = this.options.filter(opt => opt.type === 'item' && !opt.disabled);\n\n if (selectableItems.length === 0) return false;\n\n const selectedValues = new Set(this.value.map(v => v.value));\n return selectableItems.every(option => selectedValues.has(option.value));\n }\n\n private getTriggerLabel() {\n const selectedOption = this.getSelectedOption();\n if (!selectedOption) return '선택';\n\n if (selectedOption.length === 0) return this.placeholder;\n\n const isAllChecked = this.isAllOptionsSelected();\n\n return isAllChecked\n ? this.allCheckedLabel\n : selectedOption.map(option => option.label).join(', ');\n }\n\n closeDropdown() {\n this.isOpen = false;\n }\n\n private scrollToOption(optionElement: HTMLElement) {\n if (!this.dropdownRef || !optionElement) return;\n\n const dropdown = this.dropdownRef;\n const optionTop = optionElement.offsetTop;\n const optionHeight = optionElement.offsetHeight;\n const dropdownScrollTop = dropdown.scrollTop;\n const dropdownHeight = dropdown.clientHeight;\n\n const searchContainer = dropdown.querySelector('.sd-select__search-container');\n const searchOffset = searchContainer ? (searchContainer as HTMLElement).offsetHeight : 0;\n\n const visibleTop = dropdownScrollTop + searchOffset;\n const visibleBottom = dropdownScrollTop + dropdownHeight;\n\n if (optionTop < visibleTop) {\n dropdown.scrollTop = optionTop - searchOffset;\n } else if (optionTop + optionHeight > visibleBottom) {\n dropdown.scrollTop = optionTop + optionHeight - dropdownHeight + searchOffset;\n }\n }\n\n render() {\n const style = {\n '--select-width': this.width || '200px',\n '--select-dropdown-height': this.dropdownHeight || '260px',\n };\n\n return (\n <Host style={style}>\n <div\n class={{\n 'sd-select-multiple-group': true,\n 'sd-select-multiple-group--open': this.isOpen,\n 'sd-select-multiple-group--disabled': this.disabled,\n }}\n style={this.containerStyle}\n ref={el => (this.selectRef = el)}\n >\n {this.renderLabel(this.label, this.labelStyle)}\n <div class=\"sd-select-multiple-group__container\">\n {this.renderTrigger()}\n {this.renderDropdown()}\n </div>\n </div>\n </Host>\n );\n }\n\n private renderLabel(label?: string, labelStyle?: { [key: string]: string }) {\n if (!label) return null;\n\n return (\n <label class=\"sd-select-multiple-group__label\" style={labelStyle}>\n {label}\n </label>\n );\n }\n\n private renderTrigger() {\n const selectedOption = this.getSelectedOption();\n return (\n <div\n class=\"sd-select-multiple-group__trigger\"\n tabindex={this.disabled ? -1 : 0}\n onClick={this.handleTriggerClick}\n style={this.triggerStyle}\n >\n <span class=\"sd-select-multiple-group__value\">{this.getTriggerLabel()}</span>\n {this.clearable && selectedOption?.length > 0 && !this.disabled && (\n <sd-icon\n key=\"close-icon\"\n name=\"close\"\n size={10}\n color=\"#888\"\n class=\"sd-select-multiple-group__clear\"\n onClick={event => {\n event.stopPropagation();\n this.value = null;\n }}\n ></sd-icon>\n )}\n\n <sd-icon\n key=\"arrow-icon\"\n name=\"arrowDown\"\n color=\"#888\"\n class={{\n 'sd-select-multiple-group__arrow': true,\n 'sd-select-multiple-group__arrow--open': this.isOpen,\n }}\n ></sd-icon>\n </div>\n );\n }\n\n private renderDropdown() {\n const style = {\n '--select-width': this.width || '200px',\n '--select-dropdown-height': this.dropdownHeight || '260px',\n };\n\n if (this.isOpen === false) return null;\n\n return (\n <sd-portal open={this.isOpen} parentRef={this.selectRef} onSdClose={this.closeDropdown}>\n <div\n class=\"sd-select-multiple-group__dropdown\"\n style={{ ...style, ...this.dropdownStyle }}\n onScroll={this.handleDropdownScroll}\n ref={el => (this.dropdownRef = el)}\n >\n {this.searchable && (\n <div\n class={{\n 'sd-select-multiple-group__search-container': true,\n 'sd-select-multiple-group__search-container--scrolled': this.isScrolled,\n }}\n onClick={event => event.stopPropagation()}\n >\n <sd-input\n ref={el => (this.searchRef = el)}\n value={this.searchText}\n placeholder=\"검색\"\n clearable\n inputStyle={{ 'padding-left': '8px' }}\n autofocus\n onSdInput={event => {\n this.searchText = String(event?.detail);\n }}\n onSdFocus={() => {\n this.itemIndex = -1;\n }}\n onKeyDown={e => {\n if (e.code === 'Enter') e.stopPropagation();\n }}\n >\n <sd-icon name=\"search\" size={16} color=\"#737373\" slot=\"prefix\"></sd-icon>\n </sd-input>\n </div>\n )}\n\n {this.filteredOptions.length > 0 ? (\n <Fragment>\n {this.useAll && (\n <sd-select-option-group\n option={{ label: this.allCheckOptionLabel, value: '', type: 'all' }}\n index={0}\n isSelected={this.isAllOptionsSelected()}\n isFocused={this.itemIndex === 0}\n optionStyle={this.optionStyle}\n onOptionClick={({\n detail,\n }: {\n detail: {\n option: SelectOptionGroup;\n isSelected: boolean | null;\n index: number;\n event: MouseEvent;\n };\n }) => this.handleAllOptionClick(detail)}\n useCheckbox={this.useCheckbox}\n useIndicator={false}\n ></sd-select-option-group>\n )}\n {this.filteredOptions.map((option, index) => (\n <slot name={`option-${option.value}`}>\n <sd-select-option-group\n option={option}\n index={index}\n isSelected={\n option.type === 'item'\n ? this.value?.some(selected => selected.value === option.value)\n : this.isAllChildrenSelected(option)\n }\n isFocused={index === this.itemIndex}\n optionStyle={this.optionStyle}\n onOptionClick={({\n detail,\n }: {\n detail: {\n option: SelectOptionGroup;\n isSelected: boolean | null;\n index: number;\n event: MouseEvent;\n };\n }) => {\n if (option.type !== 'item' && !this.useCheckbox) {\n return;\n }\n\n this.handleOptionClick(detail);\n }}\n useCheckbox={this.useCheckbox}\n {...(option.type !== 'item' && { countInfo: this.getChildrenOptions(option) })}\n ></sd-select-option-group>\n </slot>\n ))}\n </Fragment>\n ) : (\n <slot name=\"option-placeholder\">\n <div class={'sd-select-multiple-group__option-placeholder'} style={this.optionStyle}>\n {this.optionPlaceholder}\n </div>\n </slot>\n )}\n </div>\n </sd-portal>\n );\n }\n}\n"],"names":["BaseDropdownEvent","SelectKeyboardNavigation","h","Host","Fragment","index"],"mappings":"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"}
@@ -149,11 +149,17 @@ export class SdSelectMultipleGroup extends BaseDropdownEvent {
149
149
  handleAllOptionClick = (detail) => {
150
150
  if (detail.isSelected) {
151
151
  // 이미 선택된 옵션인 경우, 선택 해제
152
- this.value = [];
152
+ const filterDisabledOptions = this.filteredOptions.filter(opt => opt.type === 'item' && !opt.disabled);
153
+ this.value =
154
+ this.value?.filter(selected => !filterDisabledOptions.some(opt => opt.value === selected.value)) || this.value;
153
155
  }
154
156
  else {
155
157
  // 새로운 옵션 선택
156
- this.value = [...this.filteredOptions.filter(opt => opt.type === 'item' && !opt.disabled)];
158
+ const valueSet = new Set([
159
+ ...(this.value || []),
160
+ ...this.filteredOptions.filter(opt => opt.type === 'item' && !opt.disabled),
161
+ ]);
162
+ this.value = Array.from(valueSet);
157
163
  }
158
164
  };
159
165
  handleOptionClick = (detail) => {
@@ -248,23 +254,23 @@ export class SdSelectMultipleGroup extends BaseDropdownEvent {
248
254
  this.value = [...(this.value || []), option];
249
255
  }
250
256
  };
251
- getAllItemsUnderOption(parentOption) {
252
- const childOptions = this.filteredOptions.filter(option => option.parent === parentOption.value && !option.disabled);
253
- if (parentOption.type === 'group') {
254
- // Group - 모든 하위 item들을 수집
255
- const subgroupOptions = childOptions.filter(option => option.type === 'subgroup');
256
- const allItemsUnderGroup = [];
257
- // subgroup 하위의 모든 item
258
- subgroupOptions.forEach(subgroup => {
259
- const itemsUnderSubgroup = this.filteredOptions.filter(option => option.parent === subgroup.value && option.type === 'item' && !option.disabled);
260
- allItemsUnderGroup.push(...itemsUnderSubgroup);
261
- });
262
- // Group 바로 하위 item
263
- const directItems = childOptions.filter(option => option.type === 'item');
264
- allItemsUnderGroup.push(...directItems);
265
- return allItemsUnderGroup;
257
+ getAllItemsUnderOption(parentOption, includeDisabled = false) {
258
+ const filterChildrenWithParent = (option) => option.parent === parentOption.value && (includeDisabled || !option.disabled);
259
+ if (parentOption.type === 'subgroup') {
260
+ return this.filteredOptions.filter(option => filterChildrenWithParent(option) && option.type === 'item');
266
261
  }
267
- return childOptions.filter(option => option.type === 'item');
262
+ const allItems = [];
263
+ const childOptions = this.filteredOptions.filter(filterChildrenWithParent);
264
+ const subgroupOptions = childOptions.filter(option => option.type === 'subgroup');
265
+ subgroupOptions.forEach(subgroup => {
266
+ const itemsUnderSubgroup = this.filteredOptions.filter(option => option.parent === subgroup.value &&
267
+ option.type === 'item' &&
268
+ (includeDisabled ? true : !option.disabled));
269
+ allItems.push(...itemsUnderSubgroup);
270
+ });
271
+ const directItems = childOptions.filter(option => option.type === 'item');
272
+ allItems.push(...directItems);
273
+ return allItems;
268
274
  }
269
275
  isAllChildrenSelected(groupOption) {
270
276
  const allItems = this.getAllItemsUnderOption(groupOption);
@@ -278,25 +284,21 @@ export class SdSelectMultipleGroup extends BaseDropdownEvent {
278
284
  return false;
279
285
  }
280
286
  getChildrenOptions(parentOption) {
281
- if (parentOption.type === 'group') {
282
- const allItems = this.getAllItemsUnderOption(parentOption);
283
- const selectedItems = allItems.filter(item => this.value?.some(selected => selected.value === item.value));
284
- return {
285
- selectedCount: selectedItems.length,
286
- totalCount: allItems.length,
287
- };
288
- }
289
- // Subgroup의 경우
290
- const children = this.filteredOptions.filter(option => option.parent === parentOption.value);
287
+ const allItems = this.getAllItemsUnderOption(parentOption, true);
288
+ const selectedCount = allItems.filter(item => this.value?.some(val => val.value === item.value)).length;
291
289
  return {
292
- selectedCount: children.filter(child => this.value?.some(val => val.value === child.value))
293
- .length,
294
- totalCount: children.length,
290
+ selectedCount,
291
+ totalCount: allItems.length,
295
292
  };
296
293
  }
297
294
  isAllOptionsSelected() {
298
- const selectedOption = this.getSelectedOption();
299
- return (selectedOption.length === this.options.filter(opt => !opt.disabled && opt.type === 'item').length);
295
+ if (!this.value || this.value.length === 0)
296
+ return false;
297
+ const selectableItems = this.options.filter(opt => opt.type === 'item' && !opt.disabled);
298
+ if (selectableItems.length === 0)
299
+ return false;
300
+ const selectedValues = new Set(this.value.map(v => v.value));
301
+ return selectableItems.every(option => selectedValues.has(option.value));
300
302
  }
301
303
  getTriggerLabel() {
302
304
  const selectedOption = this.getSelectedOption();
@@ -336,11 +338,11 @@ export class SdSelectMultipleGroup extends BaseDropdownEvent {
336
338
  '--select-width': this.width || '200px',
337
339
  '--select-dropdown-height': this.dropdownHeight || '260px',
338
340
  };
339
- return (h(Host, { key: '3657f1c9c91e6ef006acb50bd83790f45ec38ccd', style: style }, h("div", { key: '9bb5379eb59eef6dc706686fb08f8bd9f3c5eaab', class: {
341
+ return (h(Host, { key: 'b94c7ab29fd483d5e02b330465ca1ee52e633614', style: style }, h("div", { key: 'fa4f208be81c4c70f499d45bd353e17e852b00f1', class: {
340
342
  'sd-select-multiple-group': true,
341
343
  'sd-select-multiple-group--open': this.isOpen,
342
344
  'sd-select-multiple-group--disabled': this.disabled,
343
- }, style: this.containerStyle, ref: el => (this.selectRef = el) }, this.renderLabel(this.label, this.labelStyle), h("div", { key: '4f0a9205a38450ab205e57d3ec80b95ee3b028e0', class: "sd-select-multiple-group__container" }, this.renderTrigger(), this.renderDropdown()))));
345
+ }, style: this.containerStyle, ref: el => (this.selectRef = el) }, this.renderLabel(this.label, this.labelStyle), h("div", { key: 'fa4a306d932a9c182ae16c05192dce0c0d25d915', class: "sd-select-multiple-group__container" }, this.renderTrigger(), this.renderDropdown()))));
344
346
  }
345
347
  renderLabel(label, labelStyle) {
346
348
  if (!label)
@@ -374,8 +376,7 @@ export class SdSelectMultipleGroup extends BaseDropdownEvent {
374
376
  }, onKeyDown: e => {
375
377
  if (e.code === 'Enter')
376
378
  e.stopPropagation();
377
- } }, h("sd-icon", { name: "search", size: 16, color: "#737373", slot: "prefix" })))), this.filteredOptions.length > 0 ? (h(Fragment, null, this.useAll && (h("sd-select-option-group", { option: { label: this.allCheckOptionLabel, value: '', type: 'all' }, index: 0, isSelected: this.value?.length ===
378
- this.options.filter(opt => !opt.disabled && opt.type === 'item').length, isFocused: this.itemIndex === 0, optionStyle: this.optionStyle, onOptionClick: ({ detail, }) => this.handleAllOptionClick(detail), useCheckbox: this.useCheckbox, useIndicator: false })), this.filteredOptions.map((option, index) => (h("slot", { name: `option-${option.value}` }, h("sd-select-option-group", { option: option, index: index, isSelected: option.type === 'item'
379
+ } }, h("sd-icon", { name: "search", size: 16, color: "#737373", slot: "prefix" })))), this.filteredOptions.length > 0 ? (h(Fragment, null, this.useAll && (h("sd-select-option-group", { option: { label: this.allCheckOptionLabel, value: '', type: 'all' }, index: 0, isSelected: this.isAllOptionsSelected(), isFocused: this.itemIndex === 0, optionStyle: this.optionStyle, onOptionClick: ({ detail, }) => this.handleAllOptionClick(detail), useCheckbox: this.useCheckbox, useIndicator: false })), this.filteredOptions.map((option, index) => (h("slot", { name: `option-${option.value}` }, h("sd-select-option-group", { option: option, index: index, isSelected: option.type === 'item'
379
380
  ? this.value?.some(selected => selected.value === option.value)
380
381
  : this.isAllChildrenSelected(option), isFocused: index === this.itemIndex, optionStyle: this.optionStyle, onOptionClick: ({ detail, }) => {
381
382
  if (option.type !== 'item' && !this.useCheckbox) {