plain-design 1.0.0-beta.94 → 1.0.0-beta.96

Sign up to get free protection for your applications and to get access to all the features.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "plain-design",
3
- "version": "1.0.0-beta.94",
3
+ "version": "1.0.0-beta.96",
4
4
  "description": "",
5
5
  "main": "dist/plain-design.min.js",
6
6
  "module": "dist/plain-design.commonjs.min.js",
@@ -37,6 +37,7 @@
37
37
  padding-right: $close-width;
38
38
 
39
39
  .alert-close {
40
+ border-radius: inherit;
40
41
  position: absolute;
41
42
  top: 0;
42
43
  right: 0;
@@ -112,6 +113,7 @@
112
113
 
113
114
  &.alert-theme-lite {
114
115
  @include statusMixin(alert) {
116
+ border:solid 1px $color-3;
115
117
  background-color: $color-light-2;
116
118
  color: $color-6;
117
119
  .alert-close {
@@ -17,7 +17,7 @@ export const Alert = designComponent({
17
17
  theme: { type: String, default: 'lite' }, // 主题,lite轻色,deep深色
18
18
  noClose: { type: Boolean }, // 禁用关闭
19
19
  icon: { type: String as PropType<string | null | undefined>, default: undefined }, // 显示的图标
20
- message: { type: String }, // desc内容消息
20
+ description: { type: String }, // desc内容消息
21
21
  },
22
22
  slots: ['desc', 'close', 'default'],
23
23
  setup({ props, slots, attrs }) {
@@ -46,7 +46,7 @@ export const Alert = designComponent({
46
46
  `alert-align-${props.align}`,
47
47
  {
48
48
  'alert-has-icon': !!icon.value,
49
- 'alert-has-desc': !!props.message || slots.desc.isExist(),
49
+ 'alert-has-desc': !!props.description || slots.desc.isExist(),
50
50
  'alert-has-close': !props.noClose,
51
51
  }
52
52
  ]);
@@ -76,9 +76,9 @@ export const Alert = designComponent({
76
76
  {slots.default(props.label)}
77
77
  </div>
78
78
  )}
79
- {(props.message || slots.desc.isExist()) && (
79
+ {(props.description || slots.desc.isExist()) && (
80
80
  <div className="alert-desc">
81
- {slots.desc(props.message)}
81
+ {slots.desc(props.description)}
82
82
  </div>
83
83
  )}
84
84
  </div>
@@ -111,7 +111,7 @@
111
111
 
112
112
  &.button-mode-stroke {
113
113
  @include statusMixin(button) {
114
- background-color: transparent;
114
+ background-color: plv(bg-2);
115
115
  border-color: plv(secondary-light-3);
116
116
  color: plv(text-2);
117
117
 
@@ -49,6 +49,12 @@
49
49
  .form-item-content {
50
50
  display: inline-block;
51
51
  box-sizing: border-box;
52
+
53
+ .form-item-content-inner {
54
+ & > .#{componentName(form-item)}:first-child {
55
+ margin-top: 0 !important;
56
+ }
57
+ }
52
58
  }
53
59
 
54
60
  &.form-item-label-align-left {
@@ -3,6 +3,8 @@ 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
5
  import {InputMode, ThemeSize, tStyleComputed} from "../../../uses/useStyle";
6
+ import ApplicationConfigurationProvider from "../../ApplicationConfigurationProvider";
7
+ import {PlainObject} from "plain-utils/utils/event";
6
8
 
7
9
  /**
8
10
  * 表单的文本以及内容对齐方式
@@ -59,6 +61,7 @@ export type tFormLayoutPropsType = ExtractPropTypes<typeof FormLayoutPropsOption
59
61
  * @date 2022.9.4 22:46
60
62
  */
61
63
  export const FormItemLayoutPropsOption = {
64
+ hideLabel: { type: Boolean }, // 隐藏label
62
65
  labelWidth: { type: [String, Number] as PropType<string | number> }, // 显示文本宽度
63
66
  column: { type: [String, Number] as PropType<string | number>, default: 1 }, // 多列表单的列数
64
67
  block: { type: Boolean as PropType<boolean> }, // 占用一行
@@ -94,8 +97,12 @@ export const DefaultFormLabelWidth = (() => {
94
97
  export const useFormLayout = (() => {
95
98
 
96
99
  const FORM_LAYOUT_PROVIDER = '@@FORM_LAYOUT_PROVIDER';
100
+ const FORM_ITEM_LAYOUT_PROVIDER = '@@FORM_ITEM_LAYOUT_PROVIDER';
97
101
 
98
102
  const useForm = (props: tFormLayoutPropsType, styleComputed: tStyleComputed) => {
103
+
104
+ const configuration = ApplicationConfigurationProvider.inject();
105
+
99
106
  /*是否为单列*/
100
107
  const isSingleColumn = computed(() => props.column === 1);
101
108
  /*列间距*/
@@ -112,7 +119,10 @@ export const useFormLayout = (() => {
112
119
  if (props.rowGutter != null) {
113
120
  return removeUnit(props.rowGutter) as any;
114
121
  }
115
- return FormSizeRowsGutter[styleComputed.value.size];
122
+ return Math.max(
123
+ 1.25 * ((removeUnit(configuration.value.theme.vars[`margin-${styleComputed.value.size}`]) || 0) as number),
124
+ 14,
125
+ );
116
126
  });
117
127
  /*校验消息的位置*/
118
128
  const validateMessagePosition = computed(() => {
@@ -147,8 +157,11 @@ export const useFormLayout = (() => {
147
157
  };
148
158
 
149
159
  const useFormItem = (props: tFormItemLayoutPropsType) => {
160
+
150
161
  const form = inject<ReturnType<typeof useForm>>(FORM_LAYOUT_PROVIDER)!;
151
162
 
163
+ const parentFormItem = inject<PlainObject | null>(FORM_ITEM_LAYOUT_PROVIDER, null);
164
+
152
165
  /**
153
166
  * 文本宽度
154
167
  * @author 韦胜健
@@ -211,7 +224,7 @@ export const useFormLayout = (() => {
211
224
  * @author 韦胜健
212
225
  * @date 2022.9.4 23:22
213
226
  */
214
- const contentAlign = computed(() => props.contentAlign || form.props.contentAlign || eFormContentAlign.left);
227
+ const contentAlign = computed(() => props.contentAlign || form.props.contentAlign);
215
228
 
216
229
  const validateMessagePosition = computed(() => props.validateMessagePosition || form.validateMessagePosition.value);
217
230
  /**
@@ -229,7 +242,11 @@ export const useFormLayout = (() => {
229
242
  return `calc(${Number((itemColumn / totalColumn).toFixed(4)) * 100}%)`;
230
243
  })();
231
244
  styles.padding = `0 ${unit(form.gutter.value / 2)}`;
232
- styles.margin = `${form.rowGutter.value / 2}px 0`;
245
+ if (!parentFormItem) {
246
+ styles.margin = `${form.rowGutter.value / 2}px 0`;
247
+ } else {
248
+ styles.marginTop = `${form.rowGutter.value}px`;
249
+ }
233
250
  });
234
251
 
235
252
  /**
@@ -270,7 +287,7 @@ export const useFormLayout = (() => {
270
287
  }
271
288
  });
272
289
 
273
- return {
290
+ const refer = {
274
291
  colon,
275
292
  labelAlign,
276
293
  contentAlign,
@@ -280,11 +297,20 @@ export const useFormLayout = (() => {
280
297
  form,
281
298
  validateMessagePosition,
282
299
  };
300
+
301
+ provide(FORM_ITEM_LAYOUT_PROVIDER, refer);
302
+
303
+ return refer;
283
304
  };
284
305
 
285
306
  return { useForm, useFormItem };
286
307
  })();
287
308
 
309
+ /**
310
+ * 不同尺寸下的默认列间距
311
+ * @author 韦胜健
312
+ * @date 2024.7.18 20:52
313
+ */
288
314
  const FormSizeGutter: Record<typeof ThemeSize.TYPE, number> = {
289
315
  large: 16,
290
316
  normal: 12,
@@ -292,13 +318,6 @@ const FormSizeGutter: Record<typeof ThemeSize.TYPE, number> = {
292
318
  mini: 4,
293
319
  };
294
320
 
295
- const FormSizeRowsGutter: Record<typeof ThemeSize.TYPE, number> = {
296
- large: 32,
297
- normal: 24,
298
- small: 16,
299
- mini: 14,
300
- };
301
-
302
321
  export const FormValidateMessagePosition = createEnum([
303
322
  'bottom-left',
304
323
  'bottom-right',
@@ -61,10 +61,10 @@ export const FormItem = designComponent({
61
61
 
62
62
  const classes = useClasses(() => [
63
63
  getComponentCls('form-item'),
64
- `form-item-label-align-${formItemLayout.labelAlign.value}`,
65
- `form-item-content-align-${formItemLayout.contentAlign.value}`,
66
64
  `form-item-validate-position-${formItemLayout.validateMessagePosition.value}`,
67
65
  {
66
+ [`form-item-label-align-${formItemLayout.labelAlign.value}`]: !!formItemLayout.labelAlign.value,
67
+ [`form-item-content-align-${formItemLayout.contentAlign.value}`]: !!formItemLayout.contentAlign.value,
68
68
  'form-item-required': formItemValidation.isRequired.value,
69
69
  'form-item-has-label': !!props.label,
70
70
  'form-item-has-prepend': slots.prepend.isExist(),
@@ -97,7 +97,7 @@ export const FormItem = designComponent({
97
97
  },
98
98
  render: () => (
99
99
  <div className={classes.value} style={formItemLayout.styles.value} ref={onRef.el}>
100
- {props.label !== null && (
100
+ {props.label !== null && !props.hideLabel && (
101
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()}
@@ -21,15 +21,19 @@ export function createScrollDraggier(
21
21
  getScroll,
22
22
  dataModel,
23
23
  getItemElements,
24
+ getHost,
25
+ getStrut,
24
26
  onDraggierStart,
25
27
  onDraggierMove,
26
28
  onDraggierEnd,
27
29
  onDraggierTap,
28
30
  }: {
29
31
  props: { horizontal: boolean },
30
- getScroll: () => PlainScroll | undefined,
32
+ getScroll: undefined | null | (() => PlainScroll | undefined),
31
33
  dataModel: { value: any[] | undefined | null },
32
34
  getItemElements: () => HTMLElement[],
35
+ getHost?: () => HTMLElement,
36
+ getStrut?: () => HTMLElement,
33
37
 
34
38
  onDraggierStart?: iVirtualDraggierHandler,
35
39
  onDraggierMove?: iVirtualDraggierHandler,
@@ -39,7 +43,7 @@ export function createScrollDraggier(
39
43
  ) {
40
44
 
41
45
  /*管理自动滚动*/
42
- const autoScrollManager = createAutoScrollManager(getScroll);
46
+ const autoScrollManager = !getScroll ? null : createAutoScrollManager(getScroll);
43
47
 
44
48
  /*静态变量*/
45
49
  const dragStaticState = {
@@ -83,11 +87,11 @@ export function createScrollDraggier(
83
87
  throw new Error(`Can't find [data-vid] elements!`);
84
88
  }
85
89
 
86
- dragStaticState.hostElement = findParentElement(dragStaticState.dragElement, el => hasClass(el, getComponentCls('scroll')))!;
90
+ dragStaticState.hostElement = getHost ? getHost() : findParentElement(dragStaticState.dragElement, el => hasClass(el, getComponentCls('scroll')))!;
87
91
  if (!dragStaticState.hostElement) {
88
92
  throw new Error(`Can't find host elements`);
89
93
  }
90
- dragStaticState.strutElement = findParentElement(dragStaticState.dragElement, el => hasClass(el, 'scroll-content'))!;
94
+ dragStaticState.strutElement = getStrut ? getStrut() : findParentElement(dragStaticState.dragElement, el => hasClass(el, 'scroll-content'))!;
91
95
  if (!dragStaticState.strutElement) {
92
96
  throw new Error(`Can't find strut elements`);
93
97
  }
@@ -200,14 +204,14 @@ export function createScrollDraggier(
200
204
  dragReactiveState.onScroll = (e: Event) => {
201
205
  update();
202
206
  };
203
- const ejectOnScroll = getScroll()!.on.onScroll(dragReactiveState.onScroll);
207
+ const ejectOnScroll = !getScroll ? null : getScroll()?.on.onScroll(dragReactiveState.onScroll);
204
208
  draggierEffects.push(() => {
205
- ejectOnScroll();
209
+ ejectOnScroll?.();
206
210
  dragReactiveState.onScroll = doNothing;
207
211
  });
208
212
 
209
213
  /*拖拽结束的时候停止自动滚动*/
210
- draggierEffects.push(() => getScroll()?.methods.stopAutoScroll());
214
+ draggierEffects.push(() => getScroll?.()?.methods.stopAutoScroll());
211
215
  draggierEffects.push(async () => {
212
216
  await dragReactiveState.endingDefer.promise;
213
217
  dragReactiveState.pointIndex = null;
@@ -301,11 +305,11 @@ export function createScrollDraggier(
301
305
  const resultStart = Math.max(minStart, Math.min(maxStart, newStart));
302
306
 
303
307
  if (resultStart == minStart) {
304
- autoScrollManager.set(props.horizontal ? 'left' : 'top');
308
+ autoScrollManager?.set(props.horizontal ? 'left' : 'top');
305
309
  } else if (resultStart == maxStart) {
306
- autoScrollManager.set(props.horizontal ? 'right' : 'bottom');
310
+ autoScrollManager?.set(props.horizontal ? 'right' : 'bottom');
307
311
  } else {
308
- autoScrollManager.set(null);
312
+ autoScrollManager?.set(null);
309
313
  }
310
314
 
311
315
  const styleName = props.horizontal ? 'left' : 'top';