@sellmate/design-system 0.0.38 → 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.
- package/dist/cjs/sd-select-multiple-group.cjs.entry.js +38 -37
- package/dist/cjs/sd-select-multiple-group.entry.cjs.js.map +1 -1
- package/dist/cjs/sd-table-backup.cjs.entry.js +1 -1
- package/dist/cjs/sd-table-backup.entry.cjs.js.map +1 -1
- package/dist/collection/components/sd-select-multiple-group/sd-select-multiple-group.js +38 -37
- package/dist/collection/components/sd-select-multiple-group/sd-select-multiple-group.js.map +1 -1
- package/dist/collection/components/sd-table-backup/sd-table-backup.css +1 -1
- package/dist/components/sd-select-multiple-group.js +38 -37
- package/dist/components/sd-select-multiple-group.js.map +1 -1
- package/dist/components/sd-table-backup.js +1 -1
- package/dist/components/sd-table-backup.js.map +1 -1
- package/dist/design-system/design-system.esm.js +1 -1
- package/dist/design-system/p-03658389.entry.js +2 -0
- package/dist/design-system/p-03658389.entry.js.map +1 -0
- package/dist/design-system/{p-7689f3a7.entry.js → p-932d666a.entry.js} +2 -2
- package/dist/design-system/sd-select-multiple-group.entry.esm.js.map +1 -1
- package/dist/design-system/sd-table-backup.entry.esm.js.map +1 -1
- package/dist/esm/sd-select-multiple-group.entry.js +38 -37
- package/dist/esm/sd-select-multiple-group.entry.js.map +1 -1
- package/dist/esm/sd-table-backup.entry.js +1 -1
- package/dist/esm/sd-table-backup.entry.js.map +1 -1
- package/hydrate/index.js +40 -39
- package/hydrate/index.mjs +40 -39
- package/package.json +2 -2
- package/dist/design-system/p-b544c93d.entry.js +0 -2
- package/dist/design-system/p-b544c93d.entry.js.map +0 -1
- /package/dist/design-system/{p-7689f3a7.entry.js.map → p-932d666a.entry.js.map} +0 -0
|
@@ -149,11 +149,17 @@ export class SdSelectMultipleGroup extends BaseDropdownEvent {
|
|
|
149
149
|
handleAllOptionClick = (detail) => {
|
|
150
150
|
if (detail.isSelected) {
|
|
151
151
|
// 이미 선택된 옵션인 경우, 선택 해제
|
|
152
|
-
this.
|
|
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
|
-
|
|
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
|
|
253
|
-
if (parentOption.type === '
|
|
254
|
-
|
|
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
|
-
|
|
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
|
-
|
|
282
|
-
|
|
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
|
|
293
|
-
|
|
294
|
-
totalCount: children.length,
|
|
290
|
+
selectedCount,
|
|
291
|
+
totalCount: allItems.length,
|
|
295
292
|
};
|
|
296
293
|
}
|
|
297
294
|
isAllOptionsSelected() {
|
|
298
|
-
|
|
299
|
-
|
|
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: '
|
|
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: '
|
|
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
|
|
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) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-select-multiple-group.js","sourceRoot":"","sources":["../../../src/components/sd-select-multiple-group/sd-select-multiple-group.tsx"],"names":[],"mappings":"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","sourcesContent":["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"]}
|
|
1
|
+
{"version":3,"file":"sd-select-multiple-group.js","sourceRoot":"","sources":["../../../src/components/sd-select-multiple-group/sd-select-multiple-group.tsx"],"names":[],"mappings":"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","sourcesContent":["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"]}
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
.sd-table__wrapper .sd-table__container {
|
|
31
31
|
width: 100%;
|
|
32
32
|
height: var(--table-height, auto);
|
|
33
|
+
position: relative;
|
|
33
34
|
border: 1px solid #e1e1e1;
|
|
34
35
|
border-radius: 8px;
|
|
35
36
|
font-size: 12px;
|
|
@@ -38,7 +39,6 @@
|
|
|
38
39
|
}
|
|
39
40
|
.sd-table__wrapper .sd-table__container .sd-table__middle {
|
|
40
41
|
overflow: auto;
|
|
41
|
-
position: relative;
|
|
42
42
|
will-change: scroll-position;
|
|
43
43
|
}
|
|
44
44
|
.sd-table__wrapper .sd-table__container .sd-table__middle--scrollable {
|
|
@@ -161,11 +161,17 @@ const SdSelectMultipleGroup$1 = /*@__PURE__*/ proxyCustomElement(class SdSelectM
|
|
|
161
161
|
handleAllOptionClick = (detail) => {
|
|
162
162
|
if (detail.isSelected) {
|
|
163
163
|
// 이미 선택된 옵션인 경우, 선택 해제
|
|
164
|
-
this.
|
|
164
|
+
const filterDisabledOptions = this.filteredOptions.filter(opt => opt.type === 'item' && !opt.disabled);
|
|
165
|
+
this.value =
|
|
166
|
+
this.value?.filter(selected => !filterDisabledOptions.some(opt => opt.value === selected.value)) || this.value;
|
|
165
167
|
}
|
|
166
168
|
else {
|
|
167
169
|
// 새로운 옵션 선택
|
|
168
|
-
|
|
170
|
+
const valueSet = new Set([
|
|
171
|
+
...(this.value || []),
|
|
172
|
+
...this.filteredOptions.filter(opt => opt.type === 'item' && !opt.disabled),
|
|
173
|
+
]);
|
|
174
|
+
this.value = Array.from(valueSet);
|
|
169
175
|
}
|
|
170
176
|
};
|
|
171
177
|
handleOptionClick = (detail) => {
|
|
@@ -260,23 +266,23 @@ const SdSelectMultipleGroup$1 = /*@__PURE__*/ proxyCustomElement(class SdSelectM
|
|
|
260
266
|
this.value = [...(this.value || []), option];
|
|
261
267
|
}
|
|
262
268
|
};
|
|
263
|
-
getAllItemsUnderOption(parentOption) {
|
|
264
|
-
const
|
|
265
|
-
if (parentOption.type === '
|
|
266
|
-
|
|
267
|
-
const subgroupOptions = childOptions.filter(option => option.type === 'subgroup');
|
|
268
|
-
const allItemsUnderGroup = [];
|
|
269
|
-
// subgroup 하위의 모든 item
|
|
270
|
-
subgroupOptions.forEach(subgroup => {
|
|
271
|
-
const itemsUnderSubgroup = this.filteredOptions.filter(option => option.parent === subgroup.value && option.type === 'item' && !option.disabled);
|
|
272
|
-
allItemsUnderGroup.push(...itemsUnderSubgroup);
|
|
273
|
-
});
|
|
274
|
-
// Group 바로 하위 item
|
|
275
|
-
const directItems = childOptions.filter(option => option.type === 'item');
|
|
276
|
-
allItemsUnderGroup.push(...directItems);
|
|
277
|
-
return allItemsUnderGroup;
|
|
269
|
+
getAllItemsUnderOption(parentOption, includeDisabled = false) {
|
|
270
|
+
const filterChildrenWithParent = (option) => option.parent === parentOption.value && (includeDisabled || !option.disabled);
|
|
271
|
+
if (parentOption.type === 'subgroup') {
|
|
272
|
+
return this.filteredOptions.filter(option => filterChildrenWithParent(option) && option.type === 'item');
|
|
278
273
|
}
|
|
279
|
-
|
|
274
|
+
const allItems = [];
|
|
275
|
+
const childOptions = this.filteredOptions.filter(filterChildrenWithParent);
|
|
276
|
+
const subgroupOptions = childOptions.filter(option => option.type === 'subgroup');
|
|
277
|
+
subgroupOptions.forEach(subgroup => {
|
|
278
|
+
const itemsUnderSubgroup = this.filteredOptions.filter(option => option.parent === subgroup.value &&
|
|
279
|
+
option.type === 'item' &&
|
|
280
|
+
(includeDisabled ? true : !option.disabled));
|
|
281
|
+
allItems.push(...itemsUnderSubgroup);
|
|
282
|
+
});
|
|
283
|
+
const directItems = childOptions.filter(option => option.type === 'item');
|
|
284
|
+
allItems.push(...directItems);
|
|
285
|
+
return allItems;
|
|
280
286
|
}
|
|
281
287
|
isAllChildrenSelected(groupOption) {
|
|
282
288
|
const allItems = this.getAllItemsUnderOption(groupOption);
|
|
@@ -290,25 +296,21 @@ const SdSelectMultipleGroup$1 = /*@__PURE__*/ proxyCustomElement(class SdSelectM
|
|
|
290
296
|
return false;
|
|
291
297
|
}
|
|
292
298
|
getChildrenOptions(parentOption) {
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
const selectedItems = allItems.filter(item => this.value?.some(selected => selected.value === item.value));
|
|
296
|
-
return {
|
|
297
|
-
selectedCount: selectedItems.length,
|
|
298
|
-
totalCount: allItems.length,
|
|
299
|
-
};
|
|
300
|
-
}
|
|
301
|
-
// Subgroup의 경우
|
|
302
|
-
const children = this.filteredOptions.filter(option => option.parent === parentOption.value);
|
|
299
|
+
const allItems = this.getAllItemsUnderOption(parentOption, true);
|
|
300
|
+
const selectedCount = allItems.filter(item => this.value?.some(val => val.value === item.value)).length;
|
|
303
301
|
return {
|
|
304
|
-
selectedCount
|
|
305
|
-
|
|
306
|
-
totalCount: children.length,
|
|
302
|
+
selectedCount,
|
|
303
|
+
totalCount: allItems.length,
|
|
307
304
|
};
|
|
308
305
|
}
|
|
309
306
|
isAllOptionsSelected() {
|
|
310
|
-
|
|
311
|
-
|
|
307
|
+
if (!this.value || this.value.length === 0)
|
|
308
|
+
return false;
|
|
309
|
+
const selectableItems = this.options.filter(opt => opt.type === 'item' && !opt.disabled);
|
|
310
|
+
if (selectableItems.length === 0)
|
|
311
|
+
return false;
|
|
312
|
+
const selectedValues = new Set(this.value.map(v => v.value));
|
|
313
|
+
return selectableItems.every(option => selectedValues.has(option.value));
|
|
312
314
|
}
|
|
313
315
|
getTriggerLabel() {
|
|
314
316
|
const selectedOption = this.getSelectedOption();
|
|
@@ -348,11 +350,11 @@ const SdSelectMultipleGroup$1 = /*@__PURE__*/ proxyCustomElement(class SdSelectM
|
|
|
348
350
|
'--select-width': this.width || '200px',
|
|
349
351
|
'--select-dropdown-height': this.dropdownHeight || '260px',
|
|
350
352
|
};
|
|
351
|
-
return (h(Host, { key: '
|
|
353
|
+
return (h(Host, { key: 'b94c7ab29fd483d5e02b330465ca1ee52e633614', style: style }, h("div", { key: 'fa4f208be81c4c70f499d45bd353e17e852b00f1', class: {
|
|
352
354
|
'sd-select-multiple-group': true,
|
|
353
355
|
'sd-select-multiple-group--open': this.isOpen,
|
|
354
356
|
'sd-select-multiple-group--disabled': this.disabled,
|
|
355
|
-
}, style: this.containerStyle, ref: el => (this.selectRef = el) }, this.renderLabel(this.label, this.labelStyle), h("div", { key: '
|
|
357
|
+
}, 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()))));
|
|
356
358
|
}
|
|
357
359
|
renderLabel(label, labelStyle) {
|
|
358
360
|
if (!label)
|
|
@@ -386,8 +388,7 @@ const SdSelectMultipleGroup$1 = /*@__PURE__*/ proxyCustomElement(class SdSelectM
|
|
|
386
388
|
}, onKeyDown: e => {
|
|
387
389
|
if (e.code === 'Enter')
|
|
388
390
|
e.stopPropagation();
|
|
389
|
-
} }, 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
|
|
390
|
-
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'
|
|
391
|
+
} }, 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'
|
|
391
392
|
? this.value?.some(selected => selected.value === option.value)
|
|
392
393
|
: this.isAllChildrenSelected(option), isFocused: index === this.itemIndex, optionStyle: this.optionStyle, onOptionClick: ({ detail, }) => {
|
|
393
394
|
if (option.type !== 'item' && !this.useCheckbox) {
|