plain-design 1.0.0-beta.93 → 1.0.0-beta.95

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.93",
3
+ "version": "1.0.0-beta.95",
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
 
@@ -172,7 +172,7 @@
172
172
  .#{componentName(icon)}, .#{componentName(loading)} {
173
173
  //vertical-align: text-top;
174
174
  position: relative;
175
- top: 1px;
175
+ top: 0.15em;
176
176
  }
177
177
 
178
178
  //&:not(.button-icon-only) {
@@ -0,0 +1,16 @@
1
+ @include comp(confirm-popup) {
2
+ .popup-content {
3
+ .popper-head {
4
+ color: plv(text-1);
5
+ text-align: center;
6
+ padding: 1em 1.25em 0;
7
+ }
8
+
9
+ .confirm-popup-button-bar {
10
+ display: flex;
11
+ align-items: center;
12
+ justify-content: flex-end;
13
+ padding: 1em 1.25em;
14
+ }
15
+ }
16
+ }
@@ -0,0 +1,72 @@
1
+ import {designComponent, getComponentCls, PropType, useModel} from "plain-design-composition";
2
+ import Popup from "../Popup";
3
+ import Space from "../Space";
4
+ import Button from "../Button";
5
+ import i18n from "../i18n";
6
+ import './confirm-popup.scss';
7
+ import {ePopupTrigger, iPopupTrigger} from "../usePopup/utils/popup.utils";
8
+
9
+ export const ConfirmPopup = designComponent({
10
+ name: 'confirm-popup',
11
+ inheritPropsType: Popup,
12
+ props: {
13
+ title: { type: String },
14
+ trigger: { type: String as PropType<iPopupTrigger>, default: ePopupTrigger.click },
15
+ confirmLabel: { type: String },
16
+ cancelLabel: { type: String },
17
+ modelValue: { type: Boolean },
18
+ },
19
+ emits: {
20
+ onConfirm: () => true,
21
+ onCancel: () => true,
22
+ onUpdateModelValue: (val: boolean) => true,
23
+ },
24
+ slots: ['default'],
25
+ setup({ props, slots, attrs, event: { emit } }) {
26
+
27
+ const model = useModel(() => props.modelValue, emit.onUpdateModelValue);
28
+
29
+ const handler = {
30
+ onConfirm: () => {
31
+ model.value = false;
32
+ emit.onConfirm();
33
+ },
34
+ onCancel: () => {
35
+ model.value = false;
36
+ emit.onCancel();
37
+ },
38
+ };
39
+
40
+ return () => {
41
+ const hasTitle = !!props.title;
42
+ return (
43
+ <Popup
44
+ title={props.title}
45
+ placement={attrs.placement || (hasTitle ? 'bottom-end' : 'bottom-center')}
46
+ popperClass={getComponentCls('confirm-popup')}
47
+ v-model={model.value}
48
+ trigger={props.trigger}
49
+ noPadding
50
+ v-slots={{
51
+ default: () => slots.default(),
52
+ popper: () => (
53
+ hasTitle ? (
54
+ <Space className="confirm-popup-button-bar" size="mini">
55
+ <Button mode="fill" status="primary" label={props.confirmLabel || i18n.$it('base.confirm').d('确定')} onClick={handler.onConfirm}/>
56
+ <Button mode="stroke" status="secondary" label={props.cancelLabel || i18n.$it('base.cancel').d('取消')} onClick={handler.onCancel}/>
57
+ </Space>
58
+ ) : (
59
+ <Space className="confirm-popup-button-bar">
60
+ <Button mode="text" status="primary" icon="pi-check" label={props.confirmLabel || i18n.$it('base.confirm').d('确定')} onClick={handler.onConfirm}/>
61
+ <Button mode="text" status="error" icon="pi-close" label={props.cancelLabel || i18n.$it('base.cancel').d('取消')} onClick={handler.onCancel}/>
62
+ </Space>
63
+ )
64
+ )
65
+ }}
66
+ />
67
+ );
68
+ };
69
+ },
70
+ });
71
+
72
+ export default ConfirmPopup;
@@ -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()}
@@ -105,7 +105,7 @@
105
105
  }
106
106
 
107
107
  &.popup-item-dark-app {
108
- filter: drop-shadow(0 0 0.5px plv(secondary-6));
108
+ filter: drop-shadow(0 0 16px var(--custom-bg-1));
109
109
  }
110
110
 
111
111
  &.popup-item-no-background {
@@ -89,6 +89,7 @@ export type {FileServiceChooseFileConfig, FileServiceSingleFile, FileServiceUplo
89
89
  export {CascadePanel} from './components/CascadePanel';
90
90
  export {usePopup} from './components/usePopup';
91
91
  export {Popup} from './components/Popup';
92
+ export {ConfirmPopup} from './components/ConfirmPopup';
92
93
  export {createPopup} from './components/createPopup';
93
94
  export type {
94
95
  iPopupAlign,