plain-design 1.0.0-beta.75 → 1.0.0-beta.77

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. package/dist/plain-design.commonjs.min.js +2 -2
  2. package/dist/plain-design.min.css +30 -28
  3. package/dist/plain-design.min.js +2 -2
  4. package/dist/report.html +2 -2
  5. package/package.json +1 -1
  6. package/src/packages/components/Application/utils/application.utils.ts +2 -7
  7. package/src/packages/components/ArrowStepGroup/arrow-step.scss +13 -0
  8. package/src/packages/components/Box/box.scss +6 -0
  9. package/src/packages/components/Box/index.tsx +29 -0
  10. package/src/packages/components/ColorPicker/color-picker.scss +6 -0
  11. package/src/packages/components/DatePicker/createDateRender.multiple.tsx +1 -0
  12. package/src/packages/components/DatePicker/createDateRender.single.tsx +1 -0
  13. package/src/packages/components/DatePicker/createRangeDateRender.range.tsx +33 -25
  14. package/src/packages/components/DatePicker/createRangeDateRender.separate.tsx +11 -3
  15. package/src/packages/components/DatePicker/date.utils.tsx +2 -1
  16. package/src/packages/components/DatePicker/index.tsx +1 -1
  17. package/src/packages/components/DatePicker/useRangeDateRender.tsx +1 -0
  18. package/src/packages/components/Form/form.scss +17 -0
  19. package/src/packages/components/Form/index.tsx +9 -1
  20. package/src/packages/components/Form/layout/useFormLayout.tsx +3 -1
  21. package/src/packages/components/Form/validate/createValidation.tsx +6 -2
  22. package/src/packages/components/Form/validate/validate.utils.tsx +4 -1
  23. package/src/packages/components/FormItem/index.tsx +3 -3
  24. package/src/packages/components/Input/index.scss +32 -10
  25. package/src/packages/components/Input/index.tsx +14 -6
  26. package/src/packages/components/Input/input.utils.ts +1 -2
  27. package/src/packages/components/Input/useMultipleInput.tsx +15 -13
  28. package/src/packages/components/Input/useSingleInput.tsx +15 -13
  29. package/src/packages/components/Input/useTextareaInput.tsx +23 -20
  30. package/src/packages/components/Input/uses/useInputSuffixIcon.tsx +12 -8
  31. package/src/packages/components/InputNumber/number.scss +6 -0
  32. package/src/packages/components/PageCard/index.tsx +48 -0
  33. package/src/packages/components/PageCard/page-card.scss +124 -0
  34. package/src/packages/components/PageCardContent/index.tsx +44 -0
  35. package/src/packages/components/PageCardTitle/index.tsx +51 -0
  36. package/src/packages/components/PageThemeUtils/index.tsx +3 -0
  37. package/src/packages/components/RollingNumber/index.tsx +66 -0
  38. package/src/packages/components/Space/index.tsx +7 -1
  39. package/src/packages/components/Space/space.scss +13 -0
  40. package/src/packages/components/Table/standard/PlcExpand.tsx +7 -1
  41. package/src/packages/components/Table/table/utils/table.utils.ts +1 -0
  42. package/src/packages/components/TimePicker/createRangeTimeRender.tsx +11 -3
  43. package/src/packages/components/TimePicker/createSeparateRangeTimeRender.tsx +11 -3
  44. package/src/packages/components/TimePicker/createSingleTimeRender.tsx +1 -0
  45. package/src/packages/components/TimePicker/index.tsx +1 -1
  46. package/src/packages/components/TimePicker/time.utils.ts +2 -1
  47. package/src/packages/components/TimePicker/useRangeTimeRender.tsx +1 -0
  48. package/src/packages/components/Toggle/index.tsx +6 -2
  49. package/src/packages/components/Toggle/toggle.scss +102 -98
  50. package/src/packages/components/VirtualList/useVirtualList.tsx +55 -32
  51. package/src/packages/components/useTooltip/index.tsx +2 -1
  52. package/src/packages/entry.tsx +20 -2
  53. package/src/packages/i18n/lang/en-us.ts +2 -0
  54. package/src/packages/i18n/lang/zh-cn.ts +2 -0
  55. package/src/packages/styles/global.import.scss +16 -0
  56. package/src/packages/uses/useStyle.tsx +8 -4
  57. package/src/packages/utils/renderInputModeTextRangeValue.tsx +25 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "plain-design",
3
- "version": "1.0.0-beta.75",
3
+ "version": "1.0.0-beta.77",
4
4
  "description": "",
5
5
  "main": "dist/plain-design.min.js",
6
6
  "module": "dist/plain-design.commonjs.min.js",
@@ -1,15 +1,10 @@
1
1
  import {ComputedRef, createRenderHook, inject, provide} from "plain-design-composition";
2
2
  import {iThemeConfiguration} from "../theme/theme";
3
- import {InputMode, ThemeMode, ThemeShape, ThemeSize} from "../../../uses/useStyle";
3
+ import {UseStyleProvideData} from "../../../uses/useStyle";
4
4
 
5
5
  export interface iApplicationConfiguration {
6
6
  theme: iThemeConfiguration;
7
- default: {
8
- size: typeof ThemeSize.TYPE,
9
- shape: typeof ThemeShape.TYPE,
10
- inputMode: typeof InputMode.TYPE,
11
- buttonMode: typeof ThemeMode.TYPE,
12
- },
7
+ default: UseStyleProvideData['default'];
13
8
  }
14
9
 
15
10
  export const ApplicationConfigurationProvider = (() => {
@@ -102,5 +102,18 @@
102
102
  color: plv(error-6);
103
103
  }
104
104
  }
105
+
106
+ &:first-child {
107
+ .arrow-step-content {
108
+ border-top-left-radius: plv(box-size-normal-border-radius);
109
+ border-bottom-left-radius: plv(box-size-normal-border-radius);
110
+ }
111
+ }
112
+ &:last-child {
113
+ .arrow-step-content {
114
+ border-top-right-radius: plv(box-size-normal-border-radius);
115
+ border-bottom-right-radius: plv(box-size-normal-border-radius);
116
+ }
117
+ }
105
118
  }
106
119
  }
@@ -0,0 +1,6 @@
1
+ @include comp(box) {
2
+
3
+ @include sizeMixin(box, (font-size, border-radius)) {
4
+ }
5
+
6
+ }
@@ -0,0 +1,29 @@
1
+ import {designComponent, getComponentCls, useClassCache} from "plain-design-composition";
2
+ import {StyleProps, useStyle} from "../../uses/useStyle";
3
+ import {EditProps, useEdit} from "../../uses/useEdit";
4
+ import './box.scss';
5
+
6
+ export const Box = designComponent({
7
+ props: {
8
+ ...StyleProps,
9
+ ...EditProps,
10
+ },
11
+ slots: ['default'],
12
+ setup({ props, slots }) {
13
+
14
+ const { styleComputed } = useStyle();
15
+ useEdit();
16
+
17
+ const classes = useClassCache(() => [
18
+ getComponentCls('box'),
19
+ `box-size-${styleComputed.value.size}`,
20
+ `box-shape-${styleComputed.value.size}`,
21
+ ]);
22
+
23
+ return () => (
24
+ <div className={classes.value}>
25
+ {slots.default()}
26
+ </div>
27
+ );
28
+ },
29
+ });
@@ -31,6 +31,12 @@
31
31
  }
32
32
  }
33
33
  }
34
+
35
+ &.input-mode-text {
36
+ .color-picker-tag {
37
+ margin-left: 0px;
38
+ }
39
+ }
34
40
  }
35
41
 
36
42
  @include prefix(color-button) {
@@ -165,6 +165,7 @@ export function createDateRenderMultiple({ props, emit, formatString, getPublicP
165
165
  slotRender: slots.default,
166
166
  defaultRender: () => (
167
167
  <Input
168
+ className={getComponentCls('date-picker')}
168
169
  ref={onRef.input}
169
170
  suffixIcon="pi-calendar"
170
171
  multiple
@@ -146,6 +146,7 @@ export function createDateRenderSingle({ props, emit, slots, hooks, formatString
146
146
  slotRender: slots.default,
147
147
  defaultRender: () => (
148
148
  <Input
149
+ className={getComponentCls('date-picker')}
149
150
  ref={onRef.input}
150
151
  suffixIcon="pi-calendar"
151
152
  modelValue={state.input}
@@ -6,6 +6,7 @@ import {DatePanel} from "./panel/DatePanel";
6
6
  import {createPopupEditor} from "../usePopupEditor";
7
7
  import {FixInput} from "../../utils/FixInput";
8
8
  import {iKeyboardEvent} from "plain-design-composition";
9
+ import {renderInputModeTextRangeValue} from "../../utils/renderInputModeTextRangeValue";
9
10
 
10
11
  /**
11
12
  * 日期范围选择
@@ -14,7 +15,7 @@ import {iKeyboardEvent} from "plain-design-composition";
14
15
  */
15
16
  export function createRangeDateRenderRange(params: tDateCompositionPublicParams) {
16
17
 
17
- const { props, hooks, editComputed, getPublicPopperAttrs, getInheritPublicDateAttrs, formatString, slots } = params;
18
+ const { props, hooks, editComputed, getPublicPopperAttrs, getInheritPublicDateAttrs, formatString, slots, styleComputed } = params;
18
19
 
19
20
  const { effects, refs, onRef, state, startModel, endModel, renderPickerFoot, getInputAttrs, handler, reference, focusRange } = useRangeDateRender({
20
21
  ...params,
@@ -66,30 +67,37 @@ export function createRangeDateRenderRange(params: tDateCompositionPublicParams)
66
67
  slotRender: slots.default,
67
68
  defaultRender: () => (
68
69
  <Input{...getInputAttrs()}>
69
- <FixInput
70
- ref={onRef.start}
71
- type="text"
72
- placeholder={props.startPlaceholder}
73
- className="input-box input-fill"
74
- value={state.input.start}
75
- onInput={handler.onStartInputChange}
76
- onKeyDown={customHandler.onKeyboardInput}
77
- disabled={!!editComputed.value.disabled}
78
- readOnly={!!editComputed.value.readonly}
79
- onFocus={focusRange.onStartFocus}
80
- />
81
- <FixInput
82
- ref={onRef.end}
83
- type="text"
84
- placeholder={props.endPlaceholder}
85
- className="input-box input-fill"
86
- value={state.input.end}
87
- onInput={handler.onEndInputChange}
88
- onKeyDown={customHandler.onKeyboardInput}
89
- disabled={!!editComputed.value.disabled}
90
- readOnly={!!editComputed.value.readonly}
91
- onFocus={focusRange.onEndFocus}
92
- />
70
+ {renderInputModeTextRangeValue({
71
+ styleComputed,
72
+ startValue: state.input.start,
73
+ endValue: state.input.end,
74
+ defaultRender: () => <>
75
+ <FixInput
76
+ ref={onRef.start}
77
+ type="text"
78
+ placeholder={props.startPlaceholder}
79
+ className="input-box input-fill"
80
+ value={state.input.start}
81
+ onInput={handler.onStartInputChange}
82
+ onKeyDown={customHandler.onKeyboardInput}
83
+ disabled={!!editComputed.value.disabled}
84
+ readOnly={!!editComputed.value.readonly}
85
+ onFocus={focusRange.onStartFocus}
86
+ />
87
+ <FixInput
88
+ ref={onRef.end}
89
+ type="text"
90
+ placeholder={props.endPlaceholder}
91
+ className="input-box input-fill"
92
+ value={state.input.end}
93
+ onInput={handler.onEndInputChange}
94
+ onKeyDown={customHandler.onKeyboardInput}
95
+ disabled={!!editComputed.value.disabled}
96
+ readOnly={!!editComputed.value.readonly}
97
+ onFocus={focusRange.onEndFocus}
98
+ />
99
+ </>
100
+ })}
93
101
  </Input>
94
102
  )
95
103
  })
@@ -7,6 +7,7 @@ import {DatePanel} from "./panel/DatePanel";
7
7
  import {createPopupEditor} from "../usePopupEditor";
8
8
  import {FixInput} from "../../utils/FixInput";
9
9
  import {iKeyboardEvent} from "plain-design-composition";
10
+ import {renderInputModeTextRangeValue} from "../../utils/renderInputModeTextRangeValue";
10
11
 
11
12
  /**
12
13
  * 日期范围选择(分开选择)
@@ -15,7 +16,7 @@ import {iKeyboardEvent} from "plain-design-composition";
15
16
  */
16
17
  export function createRangeDateRenderSeparate(params: tDateCompositionPublicParams) {
17
18
 
18
- const { props, hooks, editComputed, getPublicPopperAttrs, getInheritPublicDateAttrs, formatString } = params;
19
+ const { props, hooks, editComputed, getPublicPopperAttrs, getInheritPublicDateAttrs, formatString, styleComputed } = params;
19
20
 
20
21
  const { effects, refs, onRef, startModel, endModel, state, getInputAttrs, renderPickerFoot, utils, handler } = useRangeDateRender({
21
22
  ...params,
@@ -91,8 +92,15 @@ export function createRangeDateRenderSeparate(params: tDateCompositionPublicPara
91
92
 
92
93
  effects.push(hooks.onRenderInput.use(() => (
93
94
  <Input{...getInputAttrs()}>
94
- <FixInput ref={onRef.start} type="text" placeholder={props.startPlaceholder} className="input-box input-fill" value={state.input.start} onInput={handler.onStartInputChange} onKeyDown={e => customHandler.onKeyboardInput(e, TimeRangePanelType.start)} disabled={!!editComputed.value.disabled} readOnly={!!editComputed.value.readonly}/>
95
- <FixInput ref={onRef.end} type="text" placeholder={props.endPlaceholder} className="input-box input-fill" value={state.input.end} onInput={handler.onEndInputChange} onKeyDown={e => customHandler.onKeyboardInput(e, TimeRangePanelType.end)} disabled={!!editComputed.value.disabled} readOnly={!!editComputed.value.readonly}/>
95
+ {renderInputModeTextRangeValue({
96
+ styleComputed,
97
+ startValue: state.input.start,
98
+ endValue: state.input.end,
99
+ defaultRender: () => <>
100
+ <FixInput ref={onRef.start} type="text" placeholder={props.startPlaceholder} className="input-box input-fill" value={state.input.start} onInput={handler.onStartInputChange} onKeyDown={e => customHandler.onKeyboardInput(e, TimeRangePanelType.start)} disabled={!!editComputed.value.disabled} readOnly={!!editComputed.value.readonly}/>
101
+ <FixInput ref={onRef.end} type="text" placeholder={props.endPlaceholder} className="input-box input-fill" value={state.input.end} onInput={handler.onEndInputChange} onKeyDown={e => customHandler.onKeyboardInput(e, TimeRangePanelType.end)} disabled={!!editComputed.value.disabled} readOnly={!!editComputed.value.readonly}/>
102
+ </>
103
+ })}
96
104
  </Input>
97
105
  )));
98
106
 
@@ -9,7 +9,7 @@ import {classnames} from "plain-utils/dom/classnames";
9
9
  import {UseDateType} from "./panel/useDatePanel";
10
10
  import {eMultipleValueType} from "../../uses/useMultipleModel";
11
11
  import {EditProps, tEditComputed} from "../../uses/useEdit";
12
- import {StyleProps} from "../../uses/useStyle";
12
+ import {StyleProps, tStyleComputed} from "../../uses/useStyle";
13
13
  import {Input} from "../Input";
14
14
  import i18n from "../i18n";
15
15
  import {iPopupEditorUseOption} from "../usePopupEditor";
@@ -390,6 +390,7 @@ export type tDateCompositionPublicParams = {
390
390
  },
391
391
  getPublicPopperAttrs: () => any,
392
392
  editComputed: tEditComputed,
393
+ styleComputed: tStyleComputed,
393
394
  getInheritPublicDateAttrs: () => any,
394
395
  displayPattern: { value: RegExp },
395
396
  today: { value: PDate },
@@ -62,7 +62,7 @@ export const DatePicker = designComponent({
62
62
  onReady: emit.onReady,
63
63
  });
64
64
 
65
- const dateCompositionPublicParams: tDateCompositionPublicParams = { props, emit, hooks, slots, formatString, getPublicPopperAttrs, editComputed, getInheritPublicDateAttrs, displayPattern, today, maxmin };
65
+ const dateCompositionPublicParams: tDateCompositionPublicParams = { props, emit, hooks, slots, formatString, getPublicPopperAttrs, editComputed, styleComputed, getInheritPublicDateAttrs, displayPattern, today, maxmin };
66
66
 
67
67
  useWatchAutoClear(() => ({
68
68
  range: props.range,
@@ -290,6 +290,7 @@ export function useRangeDateRender(
290
290
  );
291
291
 
292
292
  const getInputAttrs = () => ({
293
+ className: getComponentCls('date-picker'),
293
294
  ref: onRef.input,
294
295
  suffixIcon: 'pi-calendar',
295
296
  placeValue: [startModel.value, endModel.value].join('-'),
@@ -223,4 +223,21 @@
223
223
  display: none;
224
224
  }
225
225
  }
226
+
227
+ &.form-full {
228
+ height: 100%;
229
+ width: 100%;
230
+
231
+ .form-inner {
232
+ height: 100%;
233
+ width: 100%;
234
+ margin: 0 !important;
235
+ }
236
+ }
237
+
238
+ &.form-input-mode-text {
239
+ .form-item-label, .form-item-content {
240
+ line-height: calc(1em + 8px) !important;
241
+ }
242
+ }
226
243
  }
@@ -13,6 +13,7 @@ export const Form = designComponent({
13
13
  DefaultFormLabelWidth,
14
14
  },
15
15
  props: {
16
+ full: { type: Boolean },
16
17
  ...EditProps,
17
18
  ...StyleProps,
18
19
  ...FormValidatePropsOption,
@@ -25,7 +26,12 @@ export const Form = designComponent({
25
26
  setup({ props, slots }) {
26
27
 
27
28
  /*编辑控制*/
28
- useEdit({ adjust: (ret) => {ret.loading = null;} });
29
+ useEdit({
30
+ adjust: (ret) => {
31
+ ret.loading = null;
32
+ props.inputMode === 'text' && (ret.readonly = true);
33
+ }
34
+ });
29
35
 
30
36
  /*样式控制*/
31
37
  const { styleComputed } = useStyle();
@@ -44,6 +50,8 @@ export const Form = designComponent({
44
50
  ['form-vertical-label']: !!props.verticalLabel,
45
51
  ['form-column-center']: !!props.singleColumnCenter,
46
52
  ['form-hide-label']: !!props.hideLabel,
53
+ 'form-full': props.full,
54
+ 'form-input-mode-text': props.inputMode === 'text',
47
55
  },
48
56
  ]);
49
57
 
@@ -2,7 +2,7 @@ import {computed, ExtractPropTypes, inject, PropType, provide, useStyles} from "
2
2
  import {createEnum} from "plain-utils/utils/createEnum";
3
3
  import {unit} from "plain-utils/string/unit";
4
4
  import {removeUnit} from "plain-utils/string/removeUnit";
5
- import {ThemeSize, tStyleComputed} from "../../../uses/useStyle";
5
+ import {InputMode, ThemeSize, tStyleComputed} from "../../../uses/useStyle";
6
6
 
7
7
  /**
8
8
  * 表单的文本以及内容对齐方式
@@ -43,6 +43,7 @@ export const FormLayoutPropsOption = {
43
43
  rowGutter: { type: Number }, // 行间隔
44
44
  validateMessagePosition: { type: String as PropType<typeof FormValidateMessagePosition.TYPE> }, // 校验消息的位置
45
45
  hideLabel: { type: Boolean }, // 隐藏form-item的label
46
+ inputMode: { type: String as PropType<typeof InputMode.TYPE> }, // 内部Input的类型mode
46
47
  } as const;
47
48
 
48
49
  /**
@@ -107,6 +108,7 @@ export const useFormLayout = (() => {
107
108
  });
108
109
  /*行间距*/
109
110
  const rowGutter = computed((): number => {
111
+ if (props.inputMode === 'text') {return 4;}
110
112
  if (props.rowGutter != null) {
111
113
  return removeUnit(props.rowGutter) as any;
112
114
  }
@@ -54,7 +54,7 @@ export function createValidation() {
54
54
  * @author 韦胜健
55
55
  * @date 2022.11.5 22:43
56
56
  */
57
- const useValidationParent = (formProps: { rules?: iFormValidatePropsType["rules"] }) => {
57
+ const useValidationParent = (formProps: { rules?: iFormValidatePropsType["rules"], anotherRules?: iFormValidatePropsType['anotherRules'] }) => {
58
58
 
59
59
  /**
60
60
  * 从FormItem等子组件中收集来的校验规则
@@ -68,7 +68,11 @@ export function createValidation() {
68
68
  * @author 韦胜健
69
69
  * @date 2022/8/22 18:22
70
70
  */
71
- const rules = computed((): iValidateRule[] => ruleGetters.value.map((i) => i()).flat(1));
71
+ const rules = computed((): iValidateRule[] => {
72
+ let ret = ruleGetters.value.map((i) => i()).flat(1);
73
+ !!formProps.anotherRules && (ret = [...formProps.anotherRules, ...ret]);
74
+ return ret;
75
+ });
72
76
 
73
77
  /**
74
78
  * field映射label
@@ -69,7 +69,8 @@ export type iFormItemValidatePropsType = ExtractPropTypes<typeof FormItemValidat
69
69
  */
70
70
  export const FormValidatePropsOption = {
71
71
  modelValue: { type: Object as PropType<PlainObject> }, // 校验的表单对象
72
- rules: { type: Object as PropType<Record<string, iValidateRule | iValidateRule[]>> }, // 额外的校验规则,key为field,value为校验规则
72
+ rules: { type: Object as PropType<Record<string, iValidateRule | iValidateRule[]>> }, // 额外的校验规则,key为field,value为校验规则,依赖于FormItem,如果对应field的FormItem不存在,则这个校验规则也不存在
73
+ anotherRules: { type: Array as PropType<iAnotherRule[]> }, // 额外的校验规则,不同于rules, 不依赖于FormItem,一直有效
73
74
  validateMode: { type: String as PropType<typeof eFormValidateMode.TYPE> }, // 校验模式,看eFormValidateMode说明
74
75
  // associateFields: { type: Object as PropType<Record<string, string>> }, // 校验关联字段,当key的field校验时自动校验value对应的field
75
76
  hideRequiredAsterisk: { type: Boolean }, // 是否隐藏label旁边的红色必填星号标识
@@ -127,6 +128,8 @@ export interface iValidateRule {
127
128
  message?: string | ((value: any, formData: PlainObject | null | undefined) => string), // 校验失败的时候的提示信息
128
129
  }
129
130
 
131
+ export type iAnotherRule = Omit<iValidateRule, 'label' | 'field'> & { label: string, field: string }
132
+
130
133
  /**
131
134
  * 注册校验类型的函数类型
132
135
  * @author 韦胜健
@@ -1,4 +1,4 @@
1
- import {designComponent, getComponentCls, useClasses, useRefs} from "plain-design-composition";
1
+ import {designComponent, Fragment, getComponentCls, useClasses, useRefs} from "plain-design-composition";
2
2
  import {FormItemValidatePropsOption} from "../Form/validate/validate.utils";
3
3
  import {EditProps, useEdit} from "../../uses/useEdit";
4
4
  import {StyleProps, ThemeStatus, useStyle} from "../../uses/useStyle";
@@ -98,7 +98,7 @@ export const FormItem = designComponent({
98
98
  render: () => (
99
99
  <div className={classes.value} style={formItemLayout.styles.value} ref={onRef.el}>
100
100
  {props.label !== null && (
101
- <div className="form-item-label" style={formItemLayout.labelStyles.value}>
101
+ <div className="form-item-label" style={formItemLayout.labelStyles.value} title={props.label}>
102
102
  {formItemValidation.isRequired.value && <i className="form-item-required-tag">*</i>}
103
103
  {slots.labelPrepend()}
104
104
  {slots.labelSlot(props.label)}
@@ -109,7 +109,7 @@ export const FormItem = designComponent({
109
109
  <div className="form-item-content box-message-reference" style={formItemLayout.contentStyles.value}>
110
110
  {slots.prepend.isExist() && <div className="form-item-prepend-content">{slots.prepend()}</div>}
111
111
  <div className="form-item-content-inner">
112
- {slots.default()}
112
+ <Fragment key="slot_default">{slots.default()}</Fragment>
113
113
  {/*校验消息放下边的时候放在 form-item-content-inner 内部使得与输入框左或者右对齐*/}
114
114
  {formItemLayout.validateMessagePosition.value !== 'right' && <FormItemValidateMessage message={formItemValidation.validateMessage.value!}/>}
115
115
  </div>
@@ -52,6 +52,16 @@
52
52
  flex: 1;
53
53
  }
54
54
 
55
+ .input-text {
56
+ word-break: break-all;
57
+ border: none !important;
58
+ }
59
+
60
+ .input-mode-text-separate-icon {
61
+ align-self: center;
62
+ margin: 0 0.5em;
63
+ }
64
+
55
65
  /*所有的直接子节点,垂直居中,加上左右边距,除了第一个直接子节点之外,其他节点都加上左边框*/
56
66
  & > div, & > span, & > input, & > textarea {
57
67
  box-sizing: border-box;
@@ -63,6 +73,14 @@
63
73
  }
64
74
  }
65
75
 
76
+ &.input-mode-text {
77
+ & > div, & > span, & > input, & > textarea {
78
+ &:not(:first-child) {
79
+ border-left: none;
80
+ }
81
+ }
82
+ }
83
+
66
84
  /*prefix icon and suffix icon*/
67
85
 
68
86
  /*prefix icon右侧的input-box不需要左边框以及左边距*/
@@ -191,10 +209,12 @@
191
209
  }
192
210
 
193
211
  /*所有的直接子节点,垂直居中,加上左右边距,除了第一个直接子节点之外,其他节点都加上左边框*/
194
- & > div, & > span, & > input, & > textarea {
195
- &:not(.input-suffix-icon-wrapper) {
196
- padding-right: plv(input-padding-x-#{$name});
197
- padding-left: plv(input-padding-x-#{$name});
212
+ &:not(.input-mode-text) {
213
+ & > div, & > span, & > input, & > textarea {
214
+ &:not(.input-suffix-icon-wrapper) {
215
+ padding-right: plv(input-padding-x-#{$name});
216
+ padding-left: plv(input-padding-x-#{$name});
217
+ }
198
218
  }
199
219
  }
200
220
  }
@@ -211,9 +231,11 @@
211
231
  background-color: plv(background-color);
212
232
  border-color: $color-3;
213
233
  }
214
- @include hover(input) {
215
- background-color: $color-light-3;
216
- border-color: $color-light-4;
234
+ &:not(.input-mode-text) {
235
+ @include hover(input) {
236
+ background-color: $color-light-3;
237
+ border-color: $color-light-4;
238
+ }
217
239
  }
218
240
  @include focus(input) {
219
241
  border-color: $color-5;
@@ -332,7 +354,7 @@
332
354
  }
333
355
  }
334
356
 
335
- &:not(.input-empty) {
357
+ &:not(.input-empty):not(.input-mode-text) {
336
358
  .input-box.input-tag-container {
337
359
  padding-left: 3px;
338
360
  padding-right: 0;
@@ -360,7 +382,7 @@
360
382
  padding: 0;
361
383
  height: auto;
362
384
 
363
- span, textarea {
385
+ .input-textarea-shadow, textarea {
364
386
  display: inline-block;
365
387
  padding: 3px 12px;
366
388
  box-sizing: border-box;
@@ -368,7 +390,7 @@
368
390
  word-break: break-all;
369
391
  }
370
392
 
371
- span {
393
+ .input-textarea-shadow {
372
394
  opacity: 0;
373
395
  pointer-events: none;
374
396
  min-height: calc(30px + 2em);
@@ -1,4 +1,4 @@
1
- import {computed, designComponent, getComponentCls, iHTMLDivElement, mergeAttrs, useClasses, useRefs, useStyles} from "plain-design-composition";
1
+ import {computed, designComponent, Fragment, getComponentCls, iHTMLDivElement, mergeAttrs, useClasses, useRefs, useStyles} from "plain-design-composition";
2
2
  import './index.scss';
3
3
  import {ThemeStatus, useStyle} from "../../uses/useStyle";
4
4
  import {useEdit} from "../../uses/useEdit";
@@ -29,7 +29,11 @@ export const Input = designComponent({
29
29
 
30
30
  const { refs, onRef } = useRefs(InputRefsOptions);
31
31
  const { styleComputed } = useStyle();
32
- const { editComputed, editState } = useEdit();
32
+ const { editComputed, editState } = useEdit({
33
+ adjust: (ret) => {
34
+ if (styleComputed.value.inputMode === 'text') {ret.readonly = true;}
35
+ },
36
+ });
33
37
  const parentPopupId = useParentPopupId();
34
38
  const model = useMultipleModel(() => props.modelValue, emit.onUpdateModelValue, props);
35
39
  const hooks = useInputHooks();
@@ -76,7 +80,7 @@ export const Input = designComponent({
76
80
  attrs.className,
77
81
  `input-size-${styleComputed.value.size}`,
78
82
  `input-shape-${styleComputed.value.shape}`,
79
- `input-mode-${props.mode || styleComputed.value.default.inputMode}`,
83
+ `input-mode-${styleComputed.value.inputMode}`,
80
84
  {
81
85
  [`input-status-${status.value}`]: !!status.value,
82
86
  [`input-align-${props.align}`]: !!props.align,
@@ -88,8 +92,12 @@ export const Input = designComponent({
88
92
  ]));
89
93
  const styles = useStyles((style) => {
90
94
  style.display = 'inline-flex';
91
- if (!!props.width) {
92
- style.width = unit(props.width);
95
+ if (styleComputed.value.inputMode === 'text') {
96
+ style.width = 'unset';
97
+ } else {
98
+ if (!!props.width) {
99
+ style.width = unit(props.width);
100
+ }
93
101
  }
94
102
  !!attrs.style && Object.assign(style, attrs.style);
95
103
  });
@@ -126,7 +134,7 @@ export const Input = designComponent({
126
134
  {content}
127
135
 
128
136
  {inputSuffixIcon.render()}
129
- {hooks.onRenderSuffix.exec(slots.suffix())}
137
+ {hooks.onRenderSuffix.exec(<Fragment key="slot_suffix">{slots.suffix()}</Fragment>)}
130
138
  </span>
131
139
  );
132
140
  },
@@ -1,7 +1,7 @@
1
1
  import {tInputHooks} from "./uses/useInputHooks";
2
2
  import {ComponentEvent, ExtractPropTypes, iMouseEvent, PropType, SimpleFunction, tRefs, tSlotsType} from "plain-design-composition";
3
3
  import {createError} from "../../utils/createError";
4
- import {InputMode, StyleProps, tStyleComputed} from "../../uses/useStyle";
4
+ import {StyleProps, tStyleComputed} from "../../uses/useStyle";
5
5
  import {EditProps, tEditComputed} from "../../uses/useEdit";
6
6
  import {iSelectOptionProps} from "../Select/select.utils";
7
7
 
@@ -11,7 +11,6 @@ export const InputPropsOption = {
11
11
 
12
12
  /*public*/
13
13
  type: { type: String }, // input type
14
- mode: { type: String as PropType<typeof InputMode.TYPE> }, // input的样式类型,flat填充,stroke线型
15
14
  modelValue: {}, // 输入框双向绑定值
16
15
  placeValue: {}, // 与modelValue一起判断当前是否有值
17
16
  isFocus: { type: Boolean }, // 当前是否为获取焦点的状态
@@ -13,7 +13,7 @@ import {useDragHorizontalScroll} from "../../uses/useDragHorizontalScroll";
13
13
  * @author 韦胜健
14
14
  * @date 2022.5.22 10:06
15
15
  */
16
- export const useMultipleInput = createEffectiveHandler(({ hooks, props, model, refs, editComputed, emit }: iInputCompositionData) => {
16
+ export const useMultipleInput = createEffectiveHandler(({ hooks, props, model, refs, editComputed, emit, styleComputed }: iInputCompositionData) => {
17
17
 
18
18
  const text = useModel(() => props.multipleText as any, emit.onUpdateMultipleText);
19
19
  const { effects } = createEffects();
@@ -22,7 +22,7 @@ export const useMultipleInput = createEffectiveHandler(({ hooks, props, model, r
22
22
 
23
23
  const handler = {
24
24
  onRef: (input: typeof AutoWidthInput.use.class | null) => hooks.onRefInput.exec(input?.refs.input || null),
25
- onMousedownContainer: () => {delay(23).then(() => refs.input!.focus());},
25
+ onMousedownContainer: () => {delay(23).then(() => refs.input?.focus());},
26
26
  onRemoveTag: async (index: number) => {
27
27
  if (!editComputed.value.editable) {return;}
28
28
  if (!model.value || !model.value.length) {return; }
@@ -103,17 +103,19 @@ export const useMultipleInput = createEffectiveHandler(({ hooks, props, model, r
103
103
  {!!editComputed.value.editable && <Icon icon="pi-close" onClick={() => handler.onRemoveTag(index)}/>}
104
104
  </span>
105
105
  ))}
106
- <AutoWidthInput
107
- modelValue={text.value}
108
- onChange={handler.onChange}
109
- placeholder={!(model.value as any)?.length ? editComputed.value.placeholder : undefined}
110
- disabled={!!editComputed.value.disabled}
111
- readonly={!!editComputed.value.readonly || !!props.customReadonly || !!editComputed.value.loading}
112
- {...props.nativeAttrs}
113
- ref={handler.onRef as any}
114
- key="auto-width-input"
115
- minWidth="1px"
116
- />
106
+ {styleComputed.value.inputMode !== 'text' && (
107
+ <AutoWidthInput
108
+ modelValue={text.value}
109
+ onChange={handler.onChange}
110
+ placeholder={!(model.value as any)?.length ? editComputed.value.placeholder : undefined}
111
+ disabled={!!editComputed.value.disabled}
112
+ readonly={!!editComputed.value.readonly || !!props.customReadonly || !!editComputed.value.loading}
113
+ {...props.nativeAttrs}
114
+ ref={handler.onRef as any}
115
+ key="auto-width-input"
116
+ minWidth="1px"
117
+ />
118
+ )}
117
119
  </span>
118
120
  )));
119
121