d2aura 23.0.80 → 23.0.81
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.
|
@@ -92,8 +92,16 @@ export default class AbstractMultiSelect extends React.Component {
|
|
|
92
92
|
value.code,
|
|
93
93
|
(value.code && value.name) ? ` (${value.name})` : value.name)
|
|
94
94
|
};
|
|
95
|
-
}), loading: this.state.loading, onChange: (
|
|
96
|
-
|
|
95
|
+
}), loading: this.state.loading, onChange: (newValue) => {
|
|
96
|
+
const selectedIds = new Set(newValue.map(opt => opt.value));
|
|
97
|
+
const allKnownEntities = [...this.state.options, ...this.props.value];
|
|
98
|
+
const seen = new Set();
|
|
99
|
+
onChange(allKnownEntities.filter(e => {
|
|
100
|
+
if (seen.has(e.id) || !selectedIds.has(e.id))
|
|
101
|
+
return false;
|
|
102
|
+
seen.add(e.id);
|
|
103
|
+
return true;
|
|
104
|
+
}));
|
|
97
105
|
}, onFocus: () => {
|
|
98
106
|
this.onLoadData();
|
|
99
107
|
}, onClick: event => {
|
|
@@ -105,7 +113,6 @@ export default class AbstractMultiSelect extends React.Component {
|
|
|
105
113
|
value: value.id,
|
|
106
114
|
code: value.code,
|
|
107
115
|
name: value.name,
|
|
108
|
-
data: value,
|
|
109
116
|
};
|
|
110
117
|
}), optionRender: option => {
|
|
111
118
|
const data = option.data;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstractMultiSelect.js","sourceRoot":"","sources":["../../../../../coreui/components/select/abstractMultiSelect.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\r\nimport {Select, SelectProps, Spin} from \"antd\";\r\nimport {\r\n AdvancedFilterApi,\r\n AdvancedFilterCondition,\r\n AdvancedFilterLogicalOperator,\r\n AdvancedFilterOperator\r\n} from \"../../../api/advancedFilterApi\";\r\nimport AdvancedFilterUtils from \"../advancedFilter/advancedFilterUtils\";\r\nimport {\r\n GeneralEntityColumn,\r\n getStringAdvancedFilterColumn\r\n} from \"../advancedFilter/advancedFilterColumnDefinitions\";\r\nimport debounce from \"lodash/debounce\";\r\nimport {CloseCircleOutlined, LoadingOutlined, SelectOutlined} from \"@ant-design/icons\";\r\nimport {ERROR_COLOR} from \"../../../api/constants/constants\";\r\nimport i18n from \"d2core/i18n/i18n\";\r\nimport Entity from \"../../../api/types/entity\";\r\nimport AbstractEntityApi from \"../../../api/abstractEntityApi\";\r\nimport {SelectedEntity} from \"./abstractSelect\";\r\nimport ColorTag from \"../colorTag/colorTag\";\r\n\r\nexport interface AbstractMultiSelectProps<T extends Entity> extends SelectProps {\r\n api: AbstractEntityApi<T>\r\n advancedFilterApi: AdvancedFilterApi\r\n\r\n value: SelectedEntity[]\r\n filterConditions?: AdvancedFilterCondition[]\r\n\r\n onChange(value: T[]): void\r\n}\r\n\r\ninterface AbstractMultiSelectSelectState<T extends Entity> {\r\n selectDialogOpen: boolean\r\n loading: boolean\r\n options: T[]\r\n}\r\n\r\nexport default abstract class AbstractMultiSelect<T extends Entity,\r\n P extends AbstractMultiSelectProps<T>,\r\n S extends AbstractMultiSelectSelectState<T> = AbstractMultiSelectSelectState<T>> extends React.Component<P, S> {\r\n\r\n constructor(props: Readonly<P>) {\r\n super(props);\r\n\r\n // @ts-ignore\r\n this.onLoadData = debounce(this.onLoadData.bind(this), 250);\r\n }\r\n\r\n protected initialState: AbstractMultiSelectSelectState<T> = {\r\n selectDialogOpen: false,\r\n loading: false,\r\n options: [],\r\n }\r\n\r\n private getFilterConditionForCode(searchString?: string): AdvancedFilterCondition {\r\n return AdvancedFilterUtils.newCondition(getStringAdvancedFilterColumn(GeneralEntityColumn.CODE), {\r\n operator: AdvancedFilterOperator.LIKE,\r\n value: `%${searchString ?? \"\"}%`,\r\n });\r\n }\r\n\r\n private getFilterConditionForName(searchString?: string): AdvancedFilterCondition {\r\n return AdvancedFilterUtils.newCondition(getStringAdvancedFilterColumn(GeneralEntityColumn.NAME), {\r\n operator: AdvancedFilterOperator.LIKE,\r\n value: `%${searchString ?? \"\"}%`,\r\n })\r\n }\r\n\r\n private getFilterConditions(searchString?: string): AdvancedFilterCondition[] {\r\n const filterConditionForCode = this.getFilterConditionForCode(searchString);\r\n filterConditionForCode.left_par = 1;\r\n filterConditionForCode.logical_operator = AdvancedFilterLogicalOperator.OR;\r\n\r\n const filterConditionForName = this.getFilterConditionForName(searchString);\r\n filterConditionForName.right_par = 1;\r\n\r\n return [\r\n filterConditionForCode,\r\n filterConditionForName,\r\n ]\r\n }\r\n\r\n async onLoadData(searchString?: string) {\r\n this.setState({loading: true});\r\n\r\n const filterConditions = this.getFilterConditions(searchString);\r\n if (this.props.filterConditions) {\r\n filterConditions[filterConditions.length - 1].logical_operator = AdvancedFilterLogicalOperator.AND;\r\n filterConditions.push(...this.props.filterConditions);\r\n }\r\n\r\n const pageableList = await this.getData(filterConditions);\r\n\r\n this.setState({options: pageableList.data, loading: false});\r\n }\r\n\r\n protected async getData(filterConditions: AdvancedFilterCondition[]) {\r\n return await this.props.api.getAllData(0, 10, \"\", filterConditions, true);\r\n }\r\n\r\n private showCancelButton(): boolean {\r\n return this.props.value.length > 0;\r\n }\r\n\r\n protected getSuffixIcon(): React.ReactNode {\r\n if (this.state.loading) {\r\n return <LoadingOutlined/>;\r\n } else {\r\n return (\r\n <>\r\n {this.showCancelButton() &&\r\n <CloseCircleOutlined\r\n style={{color: ERROR_COLOR}}\r\n title={i18n(\"Cancel Selected Entity\")}\r\n onClick={() => {\r\n this.props.onChange([]);\r\n }}\r\n />\r\n }\r\n <SelectOutlined\r\n title={i18n(\"Open Select Dialog\")}\r\n onClick={() => {\r\n this.setState({selectDialogOpen: true})\r\n }}\r\n />\r\n </>\r\n );\r\n }\r\n }\r\n\r\n abstract renderSelectDialog(): React.ReactNode;\r\n\r\n render() {\r\n const {\r\n disabled,\r\n value,\r\n onChange,\r\n api,\r\n advancedFilterApi,\r\n filterConditions,\r\n ...rest\r\n } = this.props;\r\n\r\n return (\r\n <div\r\n onDoubleClick={() => {\r\n if (!disabled && !this.state.selectDialogOpen) {\r\n this.setState({selectDialogOpen: true});\r\n }\r\n }}\r\n >\r\n {this.renderSelectDialog()}\r\n <Select\r\n disabled={disabled}\r\n style={{width: \"100%\"}}\r\n labelInValue\r\n filterOption={false}\r\n mode=\"multiple\"\r\n maxTagCount=\"responsive\"\r\n notFoundContent={\r\n this.state.loading\r\n ?\r\n <div style={{textAlign: \"center\"}}>\r\n <Spin indicator={<LoadingOutlined spin/>} spinning/>\r\n </div>\r\n :\r\n null\r\n }\r\n value={\r\n value.map(value => {\r\n return {\r\n value: value.id,\r\n label:\r\n <span>\r\n {value.code}\r\n {(value.code && value.name) ? ` (${value.name})` : value.name}\r\n </span>\r\n }\r\n })\r\n }\r\n loading={this.state.loading}\r\n onChange={(_, option) => {\r\n onChange((option as any[]).map(value => value.data));\r\n }}\r\n onFocus={() => {\r\n this.onLoadData();\r\n }}\r\n onClick={event => {\r\n if (event.target instanceof HTMLInputElement || event.target instanceof HTMLSpanElement) {\r\n this.onLoadData();\r\n }\r\n }}\r\n onSearch={this.onLoadData}\r\n options={\r\n this.state.options.map(value => {\r\n\r\n return {\r\n value: value.id,\r\n code: value.code,\r\n name: value.name,\r\n data: value,\r\n }\r\n })\r\n }\r\n optionRender={option => {\r\n const data = option.data;\r\n const displayName = data.name ?? \"\";\r\n\r\n return (\r\n <div style={{display: \"flex\", justifyContent: \"space-between\"}}>\r\n {data.code && <ColorTag>{data.code}</ColorTag>}\r\n <div title={displayName}>{displayName}</div>\r\n </div>\r\n )\r\n }}\r\n suffixIcon={\r\n <span style={{display: \"flex\", gap: 4, fontSize: 14, color: \"rgba(0, 0, 0, 0.55)\"}}>\r\n {this.getSuffixIcon()}\r\n </span>\r\n }\r\n {...rest}\r\n />\r\n </div>\r\n );\r\n }\r\n}"]}
|
|
1
|
+
{"version":3,"file":"abstractMultiSelect.js","sourceRoot":"","sources":["../../../../../coreui/components/select/abstractMultiSelect.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\r\nimport {Select, SelectProps, Spin} from \"antd\";\r\nimport {\r\n AdvancedFilterApi,\r\n AdvancedFilterCondition,\r\n AdvancedFilterLogicalOperator,\r\n AdvancedFilterOperator\r\n} from \"../../../api/advancedFilterApi\";\r\nimport AdvancedFilterUtils from \"../advancedFilter/advancedFilterUtils\";\r\nimport {\r\n GeneralEntityColumn,\r\n getStringAdvancedFilterColumn\r\n} from \"../advancedFilter/advancedFilterColumnDefinitions\";\r\nimport debounce from \"lodash/debounce\";\r\nimport {CloseCircleOutlined, LoadingOutlined, SelectOutlined} from \"@ant-design/icons\";\r\nimport {ERROR_COLOR} from \"../../../api/constants/constants\";\r\nimport i18n from \"d2core/i18n/i18n\";\r\nimport Entity from \"../../../api/types/entity\";\r\nimport AbstractEntityApi from \"../../../api/abstractEntityApi\";\r\nimport {SelectedEntity} from \"./abstractSelect\";\r\nimport ColorTag from \"../colorTag/colorTag\";\r\n\r\nexport interface AbstractMultiSelectProps<T extends Entity> extends SelectProps {\r\n api: AbstractEntityApi<T>\r\n advancedFilterApi: AdvancedFilterApi\r\n\r\n value: SelectedEntity[]\r\n filterConditions?: AdvancedFilterCondition[]\r\n\r\n onChange(value: T[]): void\r\n}\r\n\r\ninterface AbstractMultiSelectSelectState<T extends Entity> {\r\n selectDialogOpen: boolean\r\n loading: boolean\r\n options: T[]\r\n}\r\n\r\nexport default abstract class AbstractMultiSelect<T extends Entity,\r\n P extends AbstractMultiSelectProps<T>,\r\n S extends AbstractMultiSelectSelectState<T> = AbstractMultiSelectSelectState<T>> extends React.Component<P, S> {\r\n\r\n constructor(props: Readonly<P>) {\r\n super(props);\r\n\r\n // @ts-ignore\r\n this.onLoadData = debounce(this.onLoadData.bind(this), 250);\r\n }\r\n\r\n protected initialState: AbstractMultiSelectSelectState<T> = {\r\n selectDialogOpen: false,\r\n loading: false,\r\n options: [],\r\n }\r\n\r\n private getFilterConditionForCode(searchString?: string): AdvancedFilterCondition {\r\n return AdvancedFilterUtils.newCondition(getStringAdvancedFilterColumn(GeneralEntityColumn.CODE), {\r\n operator: AdvancedFilterOperator.LIKE,\r\n value: `%${searchString ?? \"\"}%`,\r\n });\r\n }\r\n\r\n private getFilterConditionForName(searchString?: string): AdvancedFilterCondition {\r\n return AdvancedFilterUtils.newCondition(getStringAdvancedFilterColumn(GeneralEntityColumn.NAME), {\r\n operator: AdvancedFilterOperator.LIKE,\r\n value: `%${searchString ?? \"\"}%`,\r\n })\r\n }\r\n\r\n private getFilterConditions(searchString?: string): AdvancedFilterCondition[] {\r\n const filterConditionForCode = this.getFilterConditionForCode(searchString);\r\n filterConditionForCode.left_par = 1;\r\n filterConditionForCode.logical_operator = AdvancedFilterLogicalOperator.OR;\r\n\r\n const filterConditionForName = this.getFilterConditionForName(searchString);\r\n filterConditionForName.right_par = 1;\r\n\r\n return [\r\n filterConditionForCode,\r\n filterConditionForName,\r\n ]\r\n }\r\n\r\n async onLoadData(searchString?: string) {\r\n this.setState({loading: true});\r\n\r\n const filterConditions = this.getFilterConditions(searchString);\r\n if (this.props.filterConditions) {\r\n filterConditions[filterConditions.length - 1].logical_operator = AdvancedFilterLogicalOperator.AND;\r\n filterConditions.push(...this.props.filterConditions);\r\n }\r\n\r\n const pageableList = await this.getData(filterConditions);\r\n\r\n this.setState({options: pageableList.data, loading: false});\r\n }\r\n\r\n protected async getData(filterConditions: AdvancedFilterCondition[]) {\r\n return await this.props.api.getAllData(0, 10, \"\", filterConditions, true);\r\n }\r\n\r\n private showCancelButton(): boolean {\r\n return this.props.value.length > 0;\r\n }\r\n\r\n protected getSuffixIcon(): React.ReactNode {\r\n if (this.state.loading) {\r\n return <LoadingOutlined/>;\r\n } else {\r\n return (\r\n <>\r\n {this.showCancelButton() &&\r\n <CloseCircleOutlined\r\n style={{color: ERROR_COLOR}}\r\n title={i18n(\"Cancel Selected Entity\")}\r\n onClick={() => {\r\n this.props.onChange([]);\r\n }}\r\n />\r\n }\r\n <SelectOutlined\r\n title={i18n(\"Open Select Dialog\")}\r\n onClick={() => {\r\n this.setState({selectDialogOpen: true})\r\n }}\r\n />\r\n </>\r\n );\r\n }\r\n }\r\n\r\n abstract renderSelectDialog(): React.ReactNode;\r\n\r\n render() {\r\n const {\r\n disabled,\r\n value,\r\n onChange,\r\n api,\r\n advancedFilterApi,\r\n filterConditions,\r\n ...rest\r\n } = this.props;\r\n\r\n return (\r\n <div\r\n onDoubleClick={() => {\r\n if (!disabled && !this.state.selectDialogOpen) {\r\n this.setState({selectDialogOpen: true});\r\n }\r\n }}\r\n >\r\n {this.renderSelectDialog()}\r\n <Select\r\n disabled={disabled}\r\n style={{width: \"100%\"}}\r\n labelInValue\r\n filterOption={false}\r\n mode=\"multiple\"\r\n maxTagCount=\"responsive\"\r\n notFoundContent={\r\n this.state.loading\r\n ?\r\n <div style={{textAlign: \"center\"}}>\r\n <Spin indicator={<LoadingOutlined spin/>} spinning/>\r\n </div>\r\n :\r\n null\r\n }\r\n value={\r\n value.map(value => {\r\n return {\r\n value: value.id,\r\n label:\r\n <span>\r\n {value.code}\r\n {(value.code && value.name) ? ` (${value.name})` : value.name}\r\n </span>\r\n }\r\n })\r\n }\r\n loading={this.state.loading}\r\n onChange={(newValue) => {\r\n const selectedIds = new Set((newValue as any[]).map(opt => opt.value));\r\n const allKnownEntities = [...this.state.options, ...this.props.value as unknown as T[]];\r\n const seen = new Set();\r\n onChange(\r\n allKnownEntities.filter(e => {\r\n if (seen.has(e.id) || !selectedIds.has(e.id)) return false;\r\n seen.add(e.id);\r\n return true;\r\n })\r\n );\r\n }}\r\n onFocus={() => {\r\n this.onLoadData();\r\n }}\r\n onClick={event => {\r\n if (event.target instanceof HTMLInputElement || event.target instanceof HTMLSpanElement) {\r\n this.onLoadData();\r\n }\r\n }}\r\n onSearch={this.onLoadData}\r\n options={\r\n this.state.options.map(value => {\r\n return {\r\n value: value.id,\r\n code: value.code,\r\n name: value.name,\r\n }\r\n })\r\n }\r\n optionRender={option => {\r\n const data = option.data;\r\n const displayName = data.name ?? \"\";\r\n\r\n return (\r\n <div style={{display: \"flex\", justifyContent: \"space-between\"}}>\r\n {data.code && <ColorTag>{data.code}</ColorTag>}\r\n <div title={displayName}>{displayName}</div>\r\n </div>\r\n )\r\n }}\r\n suffixIcon={\r\n <span style={{display: \"flex\", gap: 4, fontSize: 14, color: \"rgba(0, 0, 0, 0.55)\"}}>\r\n {this.getSuffixIcon()}\r\n </span>\r\n }\r\n {...rest}\r\n />\r\n </div>\r\n );\r\n }\r\n}"]}
|