plain-design 1.0.0-beta.13 → 1.0.0-beta.15

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.13",
3
+ "version": "1.0.0-beta.15",
4
4
  "description": "",
5
5
  "main": "dist/plain-design.min.js",
6
6
  "module": "dist/plain-design.commonjs.min.js",
@@ -128,9 +128,7 @@ function createOtherVars(prefix: string | null, referenceVariable: (name: string
128
128
  'dialog-foot-padding': '8px 16px',
129
129
  'dialog-head-size': '48px',
130
130
  /*---------------------------------------message-------------------------------------------*/
131
- 'message-padding': '12px 20px',
132
131
  'message-box-shadow': '0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05)',
133
- 'message-font-size': referenceVariable('font-size-normal'),
134
132
  /*---------------------------------------notice-------------------------------------------*/
135
133
  'notice-padding': '20px 24px',
136
134
  'notice-box-shadow': '0 3px 6px -4px rgba(0, 0, 0, .12), 0 6px 16px 0 rgba(0, 0, 0, .08), 0 9px 28px 8px rgba(0, 0, 0, .05)',
@@ -1,4 +1,4 @@
1
- import {computed, designComponent, PropType} from "plain-design-composition";
1
+ import {computed, designComponent, iMouseEvent, PropType} from "plain-design-composition";
2
2
  import {DropdownContextProvider, DropdownOptionContextProvider, DropdownOptionTrigger, iDropdownOptionContext, renderDropdownOption} from "../Dropdown/dropdown.utils";
3
3
  import Icon from "../Icon";
4
4
  import {createCounter} from "plain-utils/utils/createCounter";
@@ -18,7 +18,7 @@ export const DropdownOption = designComponent({
18
18
  },
19
19
  slots: ['default', 'content'],
20
20
  emits: {
21
- onClick: (e: MouseEvent) => true,
21
+ onClick: (e: iMouseEvent) => true,
22
22
  },
23
23
  setup({ props, event: { emit }, slots }) {
24
24
 
@@ -38,7 +38,7 @@ export const DropdownOption = designComponent({
38
38
  };
39
39
 
40
40
  const handler = {
41
- onClick: (e: MouseEvent) => {
41
+ onClick: (e: iMouseEvent) => {
42
42
  if (props.disabled || props.readonly) {return;}
43
43
  emit.onClick(e);
44
44
  dropdown.handler.onClickOption(dropdownOptionContext);
@@ -1,10 +1,11 @@
1
- import {designComponent, mergeAttrs, nextTick, PropType, reactive, useStyles, watch} from "plain-design-composition";
1
+ import {designComponent, mergeAttrs, nextTick, PropType, reactive, RenderNode, useStyles, watch} from "plain-design-composition";
2
2
  import {PlTabComponent} from "../Tab";
3
3
 
4
4
  export const TabsInner = designComponent({
5
5
  props: {
6
6
  item: { type: Object as PropType<PlTabComponent>, required: true },
7
7
  active: { type: Boolean },
8
+ render: { type: Function as PropType<() => RenderNode>, required: true }
8
9
  },
9
10
  slots: ['default'],
10
11
  setup({ props, slots }) {
@@ -51,7 +52,7 @@ export const TabsInner = designComponent({
51
52
  { class: 'inner-tab', style: styles.value },
52
53
  props.item.attrs
53
54
  )}>
54
- {!!state.init && slots.default()}
55
+ {!!state.init && props.render()}
55
56
  </div>
56
57
  )
57
58
  };
@@ -101,9 +101,7 @@ export const TabGroup = designComponent({
101
101
  const body = (
102
102
  <div className="tabs-body">
103
103
  {[...tabs.value].sort((a, b) => String(a.val).localeCompare(String(b.val))).map((tab, index) => (
104
- <TabsInner item={tab.item} key={index} active={tab.active}>
105
- {tab.item.slots.default()}
106
- </TabsInner>
104
+ <TabsInner item={tab.item} key={index} active={tab.active} render={() => tab.item.slots.default()}/>
107
105
  ))}
108
106
  </div>
109
107
  );
@@ -90,6 +90,7 @@ export const RenderTreeNode = designComponent({
90
90
  */
91
91
  onClickNodeContent: () => {
92
92
  if (props.treeNode.empty) {return;}
93
+ if (tree.draggier.value?.isDragging()) {return;}
93
94
  tree.hooks.onClickNodeContent.exec({ treeNode: props.treeNode, el: refs.el! });
94
95
  },
95
96
  /**
@@ -15,6 +15,7 @@ import {onParentElementsScroll} from "../../utils/onParentElementsScroll";
15
15
  import {addClass} from "plain-utils/dom/addClass";
16
16
  import {iTreeHooks} from "./createTreeHooks";
17
17
  import {ClientZoom} from "../ClientZoom";
18
+ import {delay} from "plain-utils/utils/delay";
18
19
 
19
20
  export function createTreeDraggier(
20
21
  {
@@ -109,6 +110,8 @@ export function createTreeDraggier(
109
110
  */
110
111
  const shadowTreeNode = (() => {
111
112
 
113
+ const reactiveState = reactive({ dragging: false, });
114
+
112
115
  let staticState = null as null | {
113
116
  startNode: iTreeNode, // 拖拽开始的时候节点
114
117
  rowElement: HTMLElement, // 拖拽开始的row对象
@@ -233,62 +236,68 @@ export function createTreeDraggier(
233
236
  },
234
237
  data: null,
235
238
  };
239
+ reactiveState.dragging = true;
236
240
  /**
237
241
  * 拖拽结束之后,处理拖拽数据
238
242
  * @author 韦胜健
239
243
  * @date 2023/6/1 21:13
240
244
  */
241
245
  draggierEffects.push(async () => {
242
- if (!!staticState?.data) {
243
- const { startNode, } = staticState;
244
- const { moveNode, dropType, droppable, isHideDraggier } = staticState.data.move;
245
- if (!droppable || isHideDraggier) {
246
- return;
247
- }
248
- const newParentNode = moveNode.parent;
249
- const oldParentNode = startNode.parent;
250
- const newSiblings = dropType === eTreeDropType.inner ? methods.getReactiveChildrenData(moveNode) : methods.getParentChildrenData(moveNode);
251
- const newSiblingsBak = [...newSiblings];
252
- const oldSiblings = methods.getParentChildrenData(startNode);
253
- const oldSiblingsBak = [...oldSiblings];
254
-
255
- methods.removeSelf(startNode!);
256
- switch (dropType) {
257
- case eTreeDropType.prev:
258
- methods.previousSibling(moveNode!, startNode!);
259
- break;
260
- case eTreeDropType.inner:
261
- methods.unshiftChild(moveNode!, startNode!);
262
- await methods.expand(moveNode!);
263
- break;
264
- case eTreeDropType.next:
265
- methods.nextSibling(moveNode!, startNode!);
266
- await methods.collapse(moveNode);
267
- break;
246
+ await (async () => {
247
+ if (!!staticState?.data) {
248
+ const { startNode, } = staticState;
249
+ const { moveNode, dropType, droppable, isHideDraggier } = staticState.data.move;
250
+ if (!droppable || isHideDraggier) {
251
+ return;
252
+ }
253
+ const newParentNode = moveNode.parent;
254
+ const oldParentNode = startNode.parent;
255
+ const newSiblings = dropType === eTreeDropType.inner ? methods.getReactiveChildrenData(moveNode) : methods.getParentChildrenData(moveNode);
256
+ const newSiblingsBak = [...newSiblings];
257
+ const oldSiblings = methods.getParentChildrenData(startNode);
258
+ const oldSiblingsBak = [...oldSiblings];
259
+
260
+ methods.removeSelf(startNode!);
261
+ switch (dropType) {
262
+ case eTreeDropType.prev:
263
+ methods.previousSibling(moveNode!, startNode!);
264
+ break;
265
+ case eTreeDropType.inner:
266
+ methods.unshiftChild(moveNode!, startNode!);
267
+ await methods.expand(moveNode!);
268
+ break;
269
+ case eTreeDropType.next:
270
+ methods.nextSibling(moveNode!, startNode!);
271
+ await methods.collapse(moveNode);
272
+ break;
273
+ }
274
+ await nextTick();
275
+ await Promise.all([
276
+ methods.refreshCheckStatus(startNode!.parent),
277
+ methods.refreshCheckStatus(moveNode!.parent)
278
+ ]);
279
+ await hooks.onDragChange.exec({
280
+ data: startNode.data,
281
+ newParent: newParentNode?.data,
282
+ oldParent: oldParentNode?.data,
283
+ node: startNode,
284
+ newParentNode,
285
+ oldParentNode,
286
+ newSiblings,
287
+ oldSiblings,
288
+ newSiblingsBak,
289
+ oldSiblingsBak,
290
+ undo: () => {
291
+ newSiblings.splice(0, newSiblings.length, ...newSiblingsBak);
292
+ oldSiblings.splice(0, oldSiblings.length, ...oldSiblingsBak);
293
+ },
294
+ });
268
295
  }
269
- await nextTick();
270
- await Promise.all([
271
- methods.refreshCheckStatus(startNode!.parent),
272
- methods.refreshCheckStatus(moveNode!.parent)
273
- ]);
274
- await hooks.onDragChange.exec({
275
- data: startNode.data,
276
- newParent: newParentNode?.data,
277
- oldParent: oldParentNode?.data,
278
- node: startNode,
279
- newParentNode,
280
- oldParentNode,
281
- newSiblings,
282
- oldSiblings,
283
- newSiblingsBak,
284
- oldSiblingsBak,
285
- undo: () => {
286
- newSiblings.splice(0, newSiblings.length, ...newSiblingsBak);
287
- oldSiblings.splice(0, oldSiblings.length, ...oldSiblingsBak);
288
- },
289
- });
290
- }
291
- staticState = null;
296
+ })();
297
+ delay().then(() => {
298
+ staticState = null;
299
+ reactiveState.dragging = false;
300
+ });
292
301
  });
293
302
  };
294
303
 
@@ -370,7 +379,7 @@ export function createTreeDraggier(
370
379
  indicatorHandler.update();
371
380
  };
372
381
 
373
- const isDragging = () => !staticState;
382
+ const isDragging = () => reactiveState.dragging;
374
383
 
375
384
  const getState = () => staticState;
376
385
 
@@ -388,7 +397,8 @@ export function createTreeDraggier(
388
397
  document.removeEventListener('mouseup', draggierEffects.clear);
389
398
  });
390
399
  },
391
- onMousemoveRow: null as null | ((e: iMouseEvent, node: iTreeNode) => void)
400
+ onMousemoveRow: null as null | ((e: iMouseEvent, node: iTreeNode) => void),
401
+ isDragging: () => shadowTreeNode.isDragging(),
392
402
  });
393
403
 
394
404
  return ret;
@@ -1,14 +1,19 @@
1
- import {cacheComputed, computed, designComponent, getComponentCls, iHTMLDivElement, iMouseEvent, PropType, useClassCache, useRefs} from "plain-design-composition";
2
- import Icon from "../Icon";
1
+ import {cacheComputed, ComponentPropsType, computed, designComponent, getComponentCls, iHTMLDivElement, iMouseEvent, PropType, useClassCache, useRefs} from "plain-design-composition";
2
+ import {Icon} from "../Icon";
3
3
  import {iTreeNode} from "../TreeCore/createTreeNode";
4
4
  import './tree-node-with-menu.scss';
5
- import Tree from "../Tree";
5
+ import {Tree} from "../Tree";
6
6
  import {useTooltip} from "../useTooltip";
7
+ import {iTreeNodeWithMenuOption} from "./treeNodeWithMenu.utils";
8
+ import {Dropdown} from "../Dropdown";
9
+ import {DropdownOption} from "../DropdownOption";
7
10
 
8
11
  export const TreeNodeWithMenu = designComponent({
9
12
  name: 'tree-node-with-menu',
10
13
  props: {
11
14
  treeNode: { type: Object as PropType<iTreeNode>, required: true },
15
+ dropdownOptions: { type: Array as PropType<iTreeNodeWithMenuOption[]> },
16
+ dropdownAttrs: { type: Object as PropType<ComponentPropsType<typeof Dropdown>> },
12
17
  },
13
18
  setup({ props }) {
14
19
 
@@ -25,6 +30,14 @@ export const TreeNodeWithMenu = designComponent({
25
30
  }
26
31
  ]);
27
32
 
33
+ const dropdownAttrs = computed(() => {
34
+ return {
35
+ trigger: 'hover' as const,
36
+ placement: 'right-start' as const,
37
+ ...props.dropdownAttrs,
38
+ };
39
+ });
40
+
28
41
  const handler = {
29
42
  onMousedownDraggier: computed(() => !tree.draggier.value ? undefined : ((e: iMouseEvent) => {
30
43
  tree.draggier.value!.onMousedownDraggier(e, props.treeNode);
@@ -42,9 +55,34 @@ export const TreeNodeWithMenu = designComponent({
42
55
  return () => (
43
56
  <div className={classes.value}>
44
57
  <div className="tree-node-with-menu-content" ref={onRef.content}>{props.treeNode.label()}</div>
45
- <div className="tree-node-with-menu-button" onMouseDown={handler.onMousedownDraggier.value}>
46
- <Icon icon="pi-drag-dot-vertical"/>
47
- </div>
58
+ {(() => {
59
+ let btn = (
60
+ <div className="tree-node-with-menu-button" onMouseDown={handler.onMousedownDraggier.value}>
61
+ <Icon icon="pi-drag-dot-vertical"/>
62
+ </div>
63
+ );
64
+ let ret = btn;
65
+ if (!!props.dropdownOptions?.length && !tree.draggier.value?.isDragging()) {
66
+ ret = (
67
+ <Dropdown
68
+ {...dropdownAttrs.value}
69
+ v-slots={{
70
+ default: () => btn,
71
+ popper: () => (
72
+ props.dropdownOptions!.map((option, index) => {
73
+ const { renderDefault, renderContent, ...leftOption } = option;
74
+ const vSlots = {} as any;
75
+ if (!!renderDefault) {vSlots.default = () => renderDefault();}
76
+ if (!!renderContent) {vSlots.content = () => renderContent();}
77
+ return <DropdownOption key={index} {...leftOption} v-slots={vSlots}/>;
78
+ })
79
+ )
80
+ }}
81
+ />
82
+ );
83
+ }
84
+ return ret;
85
+ })()}
48
86
  </div>
49
87
  );
50
88
  },
@@ -23,6 +23,7 @@
23
23
  &.tree-node-with-menu-draggable {
24
24
  .tree-node-with-menu-button {
25
25
  cursor: row-resize;
26
+ padding-right: 6px;
26
27
  }
27
28
  }
28
29
  }
@@ -0,0 +1,12 @@
1
+ import {iMouseEvent, RenderNode} from "plain-design-composition";
2
+
3
+ export interface iTreeNodeWithMenuOption {
4
+ label?: string,
5
+ disabled?: boolean,
6
+ readonly?: boolean,
7
+ icon?: string,
8
+ val?: any,
9
+ onClick?: (e: iMouseEvent) => void
10
+ renderDefault?: () => RenderNode,
11
+ renderContent?: () => RenderNode,
12
+ }
@@ -2,6 +2,7 @@ import {designComponent, getComponentCls, iMouseEvent, nextIndex, onMounted, Pro
2
2
  import {closeMessageServiceHook, iMessageServiceOption} from "./message.service.utils";
3
3
  import Icon from "../Icon";
4
4
  import './message.scss';
5
+ import {useStyle} from "../../uses/useStyle";
5
6
 
6
7
  export const Message = designComponent({
7
8
  name: 'message-service',
@@ -16,9 +17,12 @@ export const Message = designComponent({
16
17
 
17
18
  onMounted(() => emit.onReady());
18
19
 
20
+ const { styleComputed } = useStyle();
21
+
19
22
  const classes = useClasses(() => [
20
23
  getComponentCls('message'),
21
- `message-status-${props.option.status}`
24
+ `message-status-${props.option.status}`,
25
+ `message-size-${styleComputed.value.size}`
22
26
  ]);
23
27
  const styles = { zIndex: nextIndex() };
24
28
 
@@ -142,4 +142,8 @@
142
142
  }
143
143
  }
144
144
  }
145
+
146
+ @include sizeMixin(message, (font-size)) {
147
+ padding: calc(#{plv(dropdown-size-#{$name}-padding-y)} * 2);
148
+ }
145
149
  }
@@ -148,6 +148,11 @@ export type {iOvMeta} from './components/$ov/ov.utils';
148
148
  export {$configuration} from './components/$configuration';
149
149
  export {createAddressService} from './components/createAddressService';
150
150
  export {createHttp} from './components/createHttp';
151
+ export type {
152
+ iHttpRequestConfig,
153
+ iPlainResponseDataType,
154
+ iHttpResponseDataType
155
+ } from './components/createHttp/http.utils';
151
156
 
152
157
  export {Address} from './components/Address';
153
158
  export {AddressCascade} from './components/AddressCascade';
@@ -8,6 +8,7 @@ import {deepcopy} from 'plain-utils/object/deepcopy';
8
8
  import {iTreeProps} from "../../../../packages/components/TreeCore/TreeCore.type";
9
9
  import {iTreeDragChangeData} from "../../../../packages/components/TreeCore/createTreeProps";
10
10
  import {delay} from "plain-utils/utils/delay";
11
+ import {iTreeNodeWithMenuOption} from "../../../../packages/components/TreeNodeWithMenu/treeNodeWithMenu.utils";
11
12
 
12
13
  export const demo1 = designPage(() => {
13
14
 
@@ -1115,6 +1116,20 @@ export const demoCustomDraggier = designPage(() => {
1115
1116
  }
1116
1117
  };
1117
1118
 
1119
+ const getNodeOptions = (treeNode: iTreeNode): iTreeNodeWithMenuOption[] | undefined => {
1120
+ if (treeNode.level === 0) {
1121
+ return [
1122
+ { label: '新建菜单', onClick: () => {$message(`${treeNode.label()} -> 新建菜单`);} },
1123
+ { label: '新建菜单分组', onClick: () => {$message(`${treeNode.label()} -> 新建菜单分组`);} },
1124
+ ];
1125
+ }
1126
+ if (treeNode.level === 1) {
1127
+ return [
1128
+ { label: '新建菜单', onClick: () => {$message(`${treeNode.label()} -> 新建菜单`);} },
1129
+ ];
1130
+ }
1131
+ };
1132
+
1118
1133
  return () => (
1119
1134
  <DemoRow title="自定义拖拽节点">
1120
1135
  <ButtonGroup style={{ margin: '4px 0' }}>
@@ -1151,7 +1166,7 @@ export const demoCustomDraggier = designPage(() => {
1151
1166
  expandOnClickNode
1152
1167
  v-slots={{
1153
1168
  default: ({ treeNode }: { treeNode: iTreeNode }) => (
1154
- <TreeNodeWithMenu treeNode={treeNode}/>
1169
+ <TreeNodeWithMenu treeNode={treeNode} dropdownOptions={getNodeOptions(treeNode)}/>
1155
1170
  )
1156
1171
  }}
1157
1172
  />