Add group details gen & recode input with text field component #22
| @ -2,31 +2,6 @@ | |||||||
| 
 | 
 | ||||||
| $line-min-height: 26px; | $line-min-height: 26px; | ||||||
| 
 | 
 | ||||||
| div.label-picker-root { | div.label-picker { | ||||||
| 	width: 100%; |     min-height: $line-min-height; | ||||||
| 	display: flex; |  | ||||||
| 	flex-wrap: wrap; |  | ||||||
| 	min-height: $line-min-height; |  | ||||||
| 	padding: 5px 0; |  | ||||||
| 
 |  | ||||||
|     div.input-intro { |  | ||||||
| 		width: 50%; |  | ||||||
| 		height: 100%; |  | ||||||
| 		min-height: $line-min-height; |  | ||||||
| 		max-width: 220px; |  | ||||||
| 		display: flex; |  | ||||||
| 		align-items: center; |  | ||||||
|         padding-right: 5px; |  | ||||||
|         box-sizing: border-box; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
|     div.root-content { |  | ||||||
|         width: 50%; |  | ||||||
|         height: 100%; |  | ||||||
|         max-width: 180px; |  | ||||||
|         min-height: $line-min-height; |  | ||||||
|         border-radius: 3px; |  | ||||||
|         overflow: hidden; |  | ||||||
|         display: flex; |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| @ -1,14 +1,12 @@ | |||||||
| import { AllI18nKeys, Localization } from "@Component/Localization/Localization"; |  | ||||||
| import { PickerList } from "../PickerList/PickerList"; | import { PickerList } from "../PickerList/PickerList"; | ||||||
| import { Label } from "@Model/Label"; | import { Label } from "@Model/Label"; | ||||||
|  | import { TextField, ITextFieldProps } from "../TextField/TextField"; | ||||||
| import { useStatusWithEvent, IMixinStatusProps } from "@Context/Status"; | import { useStatusWithEvent, IMixinStatusProps } from "@Context/Status"; | ||||||
| import { Component, ReactNode, createRef } from "react"; | import { Component, ReactNode, createRef } from "react"; | ||||||
| import { LabelList } from "../LabelList/LabelList"; | import { LabelList } from "../LabelList/LabelList"; | ||||||
| import "./LabelPicker.scss" | import "./LabelPicker.scss" | ||||||
| 
 | 
 | ||||||
| interface ILabelPickerProps { | interface ILabelPickerProps extends ITextFieldProps { | ||||||
| 	keyI18n: AllI18nKeys; |  | ||||||
|     infoI18n?: AllI18nKeys; |  | ||||||
| 	labels: Label[]; | 	labels: Label[]; | ||||||
| 	labelAdd?: (label: Label) => any; | 	labelAdd?: (label: Label) => any; | ||||||
| 	labelDelete?: (label: Label) => any; | 	labelDelete?: (label: Label) => any; | ||||||
| @ -47,47 +45,50 @@ class LabelPicker extends Component<ILabelPickerProps & IMixinStatusProps, ILabe | |||||||
| 		return res; | 		return res; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |     private renderPicker() { | ||||||
|  |         return <PickerList | ||||||
|  |             noData="Common.Attr.Key.Label.Picker.Nodata" | ||||||
|  |             objectList={this.getOtherLabel()} | ||||||
|  |             dismiss={() => { | ||||||
|  |                 this.setState({ | ||||||
|  |                     isPickerVisible: false | ||||||
|  |                 }); | ||||||
|  |             }} | ||||||
|  |             clickObjectItems={(label) => { | ||||||
|  |                 if (label instanceof Label && this.props.labelAdd) { | ||||||
|  |                     this.props.labelAdd(label) | ||||||
|  |                 } | ||||||
|  |                 this.setState({ | ||||||
|  |                     isPickerVisible: false | ||||||
|  |                 }); | ||||||
|  |             }} | ||||||
|  |             target={this.addButtonRef} | ||||||
|  |         />; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
| 	public render(): ReactNode { | 	public render(): ReactNode { | ||||||
| 		return <div | 		return <TextField | ||||||
| 			className="label-picker-root" |             {...this.props} | ||||||
| 		> |             className="label-picker" | ||||||
| 			<div className="input-intro"> |             customHoverStyle | ||||||
| 				<Localization i18nKey={this.props.keyI18n}/> |             customStyle | ||||||
| 			</div> |             keyI18n={this.props.keyI18n} | ||||||
| 			<div className="root-content"> |         > | ||||||
| 				<LabelList |             <LabelList | ||||||
| 					addRef={this.addButtonRef} |                 addRef={this.addButtonRef} | ||||||
| 					labels={this.props.labels} |                 labels={this.props.labels} | ||||||
| 					minHeight={26} |                 minHeight={26} | ||||||
| 					deleteLabel={(label) => { |                 deleteLabel={(label) => { | ||||||
| 						this.props.labelDelete ? this.props.labelDelete(label) : 0; |                     this.props.labelDelete ? this.props.labelDelete(label) : 0; | ||||||
| 					}} |                 }} | ||||||
| 					addLabel={() => { |                 addLabel={() => { | ||||||
| 						this.setState({ |                     this.setState({ | ||||||
| 							isPickerVisible: true |                         isPickerVisible: true | ||||||
| 						}); |                     }); | ||||||
| 					}} |                 }} | ||||||
| 				/> |             /> | ||||||
| 				{this.state.isPickerVisible ? <PickerList |             {this.state.isPickerVisible ? this.renderPicker(): null} | ||||||
|                     noData="Common.Attr.Key.Label.Picker.Nodata" |         </TextField>; | ||||||
| 					objectList={this.getOtherLabel()} |  | ||||||
| 					dismiss={() => { |  | ||||||
| 						this.setState({ |  | ||||||
| 							isPickerVisible: false |  | ||||||
| 						}); |  | ||||||
| 					}} |  | ||||||
| 					clickObjectItems={(label) => { |  | ||||||
| 						if (label instanceof Label && this.props.labelAdd) { |  | ||||||
| 							this.props.labelAdd(label) |  | ||||||
| 						} |  | ||||||
| 						this.setState({ |  | ||||||
| 							isPickerVisible: false |  | ||||||
| 						}); |  | ||||||
| 					}} |  | ||||||
| 					target={this.addButtonRef} |  | ||||||
| 				/> : null} |  | ||||||
| 			</div> |  | ||||||
| 		</div> |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,86 +1,31 @@ | |||||||
| @import "../Theme/Theme.scss"; | @import "../Theme/Theme.scss"; | ||||||
| 
 | 
 | ||||||
| $line-min-height: 26px; | $line-min-height: 24px; | ||||||
| 
 | 
 | ||||||
| div.object-picker-root { | div.object-picker { | ||||||
| 	width: 100%; |  | ||||||
| 	display: flex; |  | ||||||
| 	min-height: $line-min-height; |  | ||||||
| 	padding: 5px 0; |  | ||||||
| 
 | 
 | ||||||
|     div.input-intro { |     div.value-view { | ||||||
| 		width: 50%; |         width: 100%; | ||||||
| 		height: 100%; |  | ||||||
| 		max-width: 220px; |  | ||||||
|         min-height: $line-min-height; |  | ||||||
| 		display: flex; |  | ||||||
| 		align-items: center; |  | ||||||
|         padding-right: 5px; |  | ||||||
|         box-sizing: border-box; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
|     div.root-content { |  | ||||||
|         width: 50%; |  | ||||||
|         height: 100%; |         height: 100%; | ||||||
|         max-width: 180px; |  | ||||||
|         min-height: $line-min-height; |         min-height: $line-min-height; | ||||||
|         border-radius: 3px; |  | ||||||
|         overflow: hidden; |  | ||||||
|         display: flex; |         display: flex; | ||||||
|         cursor: pointer; |         align-items: center; | ||||||
|  |         white-space: nowrap; | ||||||
|  |         word-break: keep-all; | ||||||
|  |         text-overflow: ellipsis; | ||||||
|  |         overflow: hidden; | ||||||
| 
 | 
 | ||||||
|         div.value-view { |         span { | ||||||
|             width: 100%; |             display: block; | ||||||
|             height: 100%; |  | ||||||
|             min-height: $line-min-height; |  | ||||||
|             display: flex; |  | ||||||
|             align-items: center; |  | ||||||
|             white-space: nowrap; |  | ||||||
|             word-break: keep-all; |  | ||||||
|             text-overflow: ellipsis; |  | ||||||
|             overflow: hidden; |  | ||||||
| 
 |  | ||||||
|             span { |  | ||||||
|                 display: block; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         div.list-button { |  | ||||||
|             width: $line-min-height; |  | ||||||
|             height: $line-min-height; |  | ||||||
|             flex-shrink: 0; |  | ||||||
|             display: flex; |  | ||||||
|             justify-content: center; |  | ||||||
|             align-items: center; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | 
 | ||||||
| 
 |     div.list-button { | ||||||
| div.dark.object-picker-root { |         width: $line-min-height; | ||||||
| 
 |         height: $line-min-height; | ||||||
| 	div.root-content { |         flex-shrink: 0; | ||||||
| 		background-color: $lt-bg-color-lvl3-dark; |         display: flex; | ||||||
| 		color: $lt-font-color-normal-dark; |         justify-content: center; | ||||||
| 	} |         align-items: center; | ||||||
| 
 |     } | ||||||
| 	div.root-content:hover { |  | ||||||
| 		background-color: $lt-bg-color-lvl2-dark; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| div.light.object-picker-root { |  | ||||||
| 
 |  | ||||||
| 	div.root-content { |  | ||||||
| 		background-color: $lt-bg-color-lvl3-light; |  | ||||||
| 		color: $lt-font-color-normal-light; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	div.root-content:hover { |  | ||||||
| 		background-color: $lt-bg-color-lvl2-light; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| div.combo-picker-root { |  | ||||||
|     width: 300px; |  | ||||||
|     height: 340px; |  | ||||||
| } | } | ||||||
| @ -2,19 +2,17 @@ import { Component, createRef, ReactNode } from "react"; | |||||||
| import { Label } from "@Model/Label"; | import { Label } from "@Model/Label"; | ||||||
| import { Group } from "@Model/Group"; | import { Group } from "@Model/Group"; | ||||||
| import { Range } from "@Model/Range"; | import { Range } from "@Model/Range"; | ||||||
|  | import { TextField, ITextFieldProps } from "../TextField/TextField"; | ||||||
| import { useStatusWithEvent, IMixinStatusProps } from "@Context/Status"; | import { useStatusWithEvent, IMixinStatusProps } from "@Context/Status"; | ||||||
| import { FontLevel, Theme } from "@Component/Theme/Theme"; |  | ||||||
| import { PickerList, IDisplayItem } from "../PickerList/PickerList"; | import { PickerList, IDisplayItem } from "../PickerList/PickerList"; | ||||||
| import { AllI18nKeys, Localization } from "@Component/Localization/Localization"; | import { Localization } from "@Component/Localization/Localization"; | ||||||
| import { Icon } from "@fluentui/react"; | import { Icon } from "@fluentui/react"; | ||||||
| import CtrlObject from "@Model/CtrlObject"; | import CtrlObject from "@Model/CtrlObject"; | ||||||
| import "./ObjectPicker.scss"; | import "./ObjectPicker.scss"; | ||||||
| 
 | 
 | ||||||
| type IObjectType = Label | Group | Range | CtrlObject; | type IObjectType = Label | Group | Range | CtrlObject; | ||||||
| 
 | 
 | ||||||
| interface IObjectPickerProps { | interface IObjectPickerProps extends ITextFieldProps { | ||||||
|     keyI18n: AllI18nKeys; |  | ||||||
|     infoI18n?: AllI18nKeys; |  | ||||||
|     type: Array<"L" | "G" | "R">; |     type: Array<"L" | "G" | "R">; | ||||||
|     value?: IObjectType; |     value?: IObjectType; | ||||||
|     valueChange?: (value: IObjectType) => any; |     valueChange?: (value: IObjectType) => any; | ||||||
| @ -109,31 +107,28 @@ class ObjectPicker extends Component<IObjectPickerProps & IMixinStatusProps, IOb | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return <> |         return <> | ||||||
|             <Theme className="object-picker-root" fontLevel={FontLevel.normal}> |             <TextField | ||||||
|                 <div className="input-intro"> |                 {...this.props} | ||||||
|                     <Localization i18nKey={this.props.keyI18n}/> |                 className="object-picker" | ||||||
|  |                 keyI18n={this.props.keyI18n} | ||||||
|  |                 targetRef={this.pickerTarget} | ||||||
|  |                 onClick={() => { | ||||||
|  |                     this.setState({ | ||||||
|  |                         isPickerVisible: true | ||||||
|  |                     }) | ||||||
|  |                 }} | ||||||
|  |             > | ||||||
|  |                 <div className="list-button"> | ||||||
|  |                     <Icon iconName={icon}/> | ||||||
|                 </div> |                 </div> | ||||||
|                 <div |                 <div className="value-view"> | ||||||
|                     className="root-content" |                     {    | ||||||
|                     ref={this.pickerTarget} |                         name ?  | ||||||
|                     onClick={() => { |                             <span>{name}</span> : | ||||||
|                         this.setState({ |                             <Localization i18nKey="Input.Error.Select"/> | ||||||
|                             isPickerVisible: true |                     } | ||||||
|                         }) |  | ||||||
|                     }} |  | ||||||
|                 > |  | ||||||
|                     <div className="list-button"> |  | ||||||
|                         <Icon iconName={icon}/> |  | ||||||
|                     </div> |  | ||||||
|                     <div className="value-view"> |  | ||||||
|                         {    |  | ||||||
|                             name ?  |  | ||||||
|                                 <span>{name}</span> : |  | ||||||
|                                 <Localization i18nKey="Input.Error.Select"/> |  | ||||||
|                         } |  | ||||||
|                     </div> |  | ||||||
|                 </div> |                 </div> | ||||||
|             </Theme> |             </TextField> | ||||||
| 
 | 
 | ||||||
|             {this.state.isPickerVisible ?  this.renderPicker(): null} |             {this.state.isPickerVisible ?  this.renderPicker(): null} | ||||||
|         </> |         </> | ||||||
|  | |||||||
| @ -3,62 +3,40 @@ | |||||||
| $line-min-height: 26px; | $line-min-height: 26px; | ||||||
| 
 | 
 | ||||||
| div.toggles-input { | div.toggles-input { | ||||||
| 	width: 100%; |  | ||||||
| 	display: flex; |  | ||||||
| 	min-height: $line-min-height; |  | ||||||
| 	padding: 5px 0; |  | ||||||
| 
 | 
 | ||||||
| 	div.toggles-intro { |     div.checkbox { | ||||||
| 		width: 50%; |         width: $line-min-height; | ||||||
| 		height: 100%; |         height: $line-min-height; | ||||||
| 		max-width: 220px; |         overflow: hidden; | ||||||
|         min-height: $line-min-height; |         border-radius: 3px; | ||||||
| 		display: flex; |         display: flex; | ||||||
| 		align-items: center; |         align-items: center; | ||||||
|         padding-right: 5px; |         justify-content: center; | ||||||
|         box-sizing: border-box; |         cursor: pointer; | ||||||
| 	} |         user-select: none; | ||||||
| 
 |  | ||||||
|     div.toggles-content { |  | ||||||
|         width: 50%; |  | ||||||
|         height: 100%; |  | ||||||
|         max-width: 180px; |  | ||||||
|         min-height: $line-min-height; |  | ||||||
| 
 |  | ||||||
|         div.checkbox { |  | ||||||
|             width: $line-min-height; |  | ||||||
|             height: $line-min-height; |  | ||||||
|             overflow: hidden; |  | ||||||
|             border-radius: 3px; |  | ||||||
|             display: flex; |  | ||||||
|             align-items: center; |  | ||||||
|             justify-content: center; |  | ||||||
|             cursor: pointer; |  | ||||||
|             user-select: none; |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| div.dark.toggles-input { | div.dark.text-field-root { | ||||||
| 
 | 
 | ||||||
|     div.toggles-content div.checkbox { |     div.toggles-input div.checkbox { | ||||||
|         background-color: $lt-bg-color-lvl3-dark; |         background-color: $lt-bg-color-lvl3-dark; | ||||||
| 		color: $lt-font-color-normal-dark; | 		color: $lt-font-color-normal-dark; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 	div.toggles-content div.checkbox:hover { | 	div.toggles-input div.checkbox:hover { | ||||||
| 		background-color: $lt-bg-color-lvl2-dark; | 		background-color: $lt-bg-color-lvl2-dark; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| div.light.toggles-input { | div.light.text-field-root { | ||||||
| 
 | 
 | ||||||
|     div.toggles-content div.checkbox { |     div.toggles-input div.checkbox { | ||||||
|         background-color: $lt-bg-color-lvl3-light; |         background-color: $lt-bg-color-lvl3-light; | ||||||
| 		color: $lt-font-color-normal-light; | 		color: $lt-font-color-normal-light; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 	div.toggles-content div.checkbox:hover { | 	div.toggles-input div.checkbox:hover { | ||||||
| 		background-color: $lt-bg-color-lvl2-light; | 		background-color: $lt-bg-color-lvl2-light; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @ -1,14 +1,10 @@ | |||||||
| import { AllI18nKeys, Localization } from "@Component/Localization/Localization"; |  | ||||||
| import { Theme } from "@Component/Theme/Theme"; |  | ||||||
| import { Icon } from "@fluentui/react"; | import { Icon } from "@fluentui/react"; | ||||||
| import { Component, ReactNode } from "react"; | import { Component, ReactNode } from "react"; | ||||||
|  | import { TextField, ITextFieldProps } from "../TextField/TextField"; | ||||||
| import "./TogglesInput.scss"; | import "./TogglesInput.scss"; | ||||||
| 
 | 
 | ||||||
| interface ITogglesInputProps { | interface ITogglesInputProps extends ITextFieldProps { | ||||||
|     keyI18n: AllI18nKeys; |  | ||||||
|     infoI18n?: AllI18nKeys; |  | ||||||
|     value?: boolean; |     value?: boolean; | ||||||
|     disable?: boolean; |  | ||||||
|     onIconName?: string; |     onIconName?: string; | ||||||
|     offIconName?: string; |     offIconName?: string; | ||||||
|     valueChange?: (value: boolean) => any; |     valueChange?: (value: boolean) => any; | ||||||
| @ -16,39 +12,40 @@ interface ITogglesInputProps { | |||||||
| 
 | 
 | ||||||
| class TogglesInput extends Component<ITogglesInputProps> { | class TogglesInput extends Component<ITogglesInputProps> { | ||||||
|     public render(): ReactNode { |     public render(): ReactNode { | ||||||
|         return <Theme className="toggles-input"> |         return <TextField | ||||||
|             <div className="toggles-intro"> |             {...this.props} | ||||||
|                 <Localization i18nKey={this.props.keyI18n}/> |             className="toggles-input" | ||||||
|             </div> |             keyI18n={this.props.keyI18n} | ||||||
|             <div className="toggles-content"> |             customHoverStyle | ||||||
|                 <div |             customStyle | ||||||
|                     className="checkbox" |         > | ||||||
|  |             <div | ||||||
|  |                 className="checkbox" | ||||||
|  |                 style={{ | ||||||
|  |                     cursor: this.props.disableI18n ? "not-allowed" : "pointer" | ||||||
|  |                 }} | ||||||
|  |                 onClick={(() => { | ||||||
|  |                     if (this.props.disableI18n) { | ||||||
|  |                         return; | ||||||
|  |                     } | ||||||
|  |                     if (this.props.valueChange) { | ||||||
|  |                         this.props.valueChange(!this.props.value); | ||||||
|  |                     } | ||||||
|  |                 })} | ||||||
|  |             > | ||||||
|  |                 <Icon | ||||||
|  |                     iconName={ | ||||||
|  |                         this.props.value ?  | ||||||
|  |                             this.props.onIconName ?? "CheckMark" : | ||||||
|  |                             this.props.offIconName ?? undefined | ||||||
|  |                     } | ||||||
|                     style={{ |                     style={{ | ||||||
|                         cursor: this.props.disable ? "not-allowed" : "pointer" |                         display: this.props.value ? "inline-block" :  | ||||||
|  |                             this.props.offIconName ? "inline-block" : "none" | ||||||
|                     }} |                     }} | ||||||
|                     onClick={(() => { |                 /> | ||||||
|                         if (this.props.disable) { |  | ||||||
|                             return; |  | ||||||
|                         } |  | ||||||
|                         if (this.props.valueChange) { |  | ||||||
|                             this.props.valueChange(!this.props.value); |  | ||||||
|                         } |  | ||||||
|                     })} |  | ||||||
|                 > |  | ||||||
|                     <Icon |  | ||||||
|                         iconName={ |  | ||||||
|                             this.props.value ?  |  | ||||||
|                                 this.props.onIconName ?? "CheckMark" : |  | ||||||
|                                 this.props.offIconName ?? undefined |  | ||||||
|                         } |  | ||||||
|                         style={{ |  | ||||||
|                             display: this.props.value ? "inline-block" :  |  | ||||||
|                                 this.props.offIconName ? "inline-block" : "none" |  | ||||||
|                         }} |  | ||||||
|                     ></Icon> |  | ||||||
|                 </div>     |  | ||||||
|             </div>   |             </div>   | ||||||
|         </Theme> |         </TextField>; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user