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

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.
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