km-card-layout-component-miniprogram 0.1.19 → 0.1.20

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 (46) hide show
  1. package/example/app.js +11 -1
  2. package/example/pages/home/index.js +324 -101
  3. package/example/pages/home/index.wxml +2 -1
  4. package/miniprogram_dist/components/card-layout/elements/custom-element/index.js +12 -6
  5. package/miniprogram_dist/components/card-layout/elements/custom-element/index.wxml +4 -6
  6. package/miniprogram_dist/components/card-layout/elements/custom-element/index.wxss +1 -1
  7. package/miniprogram_dist/components/card-layout/elements/icon-element/index.js +32 -15
  8. package/miniprogram_dist/components/card-layout/elements/icon-element/index.wxml +3 -7
  9. package/miniprogram_dist/components/card-layout/elements/icon-element/index.wxss +3 -17
  10. package/miniprogram_dist/components/card-layout/elements/icon-font.wxss +438 -0
  11. package/miniprogram_dist/components/card-layout/elements/image-element/index.js +18 -9
  12. package/miniprogram_dist/components/card-layout/elements/image-element/index.wxml +8 -10
  13. package/miniprogram_dist/components/card-layout/elements/image-element/index.wxss +1 -1
  14. package/miniprogram_dist/components/card-layout/elements/layout-panel-element/index.js +37 -0
  15. package/miniprogram_dist/components/card-layout/elements/layout-panel-element/index.json +3 -0
  16. package/miniprogram_dist/components/card-layout/elements/layout-panel-element/index.wxml +5 -0
  17. package/miniprogram_dist/components/card-layout/elements/layout-panel-element/index.wxss +10 -0
  18. package/miniprogram_dist/components/card-layout/elements/text-element/index.js +41 -17
  19. package/miniprogram_dist/components/card-layout/elements/text-element/index.wxml +8 -34
  20. package/miniprogram_dist/components/card-layout/elements/text-element/index.wxss +5 -18
  21. package/miniprogram_dist/components/card-layout/index.js +31 -108
  22. package/miniprogram_dist/components/card-layout/index.json +9 -1
  23. package/miniprogram_dist/components/card-layout/index.wxml +25 -46
  24. package/miniprogram_dist/components/card-layout/index.wxss +1 -538
  25. package/package.json +1 -1
  26. package/src/components/card-layout/elements/custom-element/index.ts +13 -7
  27. package/src/components/card-layout/elements/custom-element/index.wxml +4 -6
  28. package/src/components/card-layout/elements/custom-element/index.wxss +1 -1
  29. package/src/components/card-layout/elements/icon-element/index.ts +34 -16
  30. package/src/components/card-layout/elements/icon-element/index.wxml +3 -7
  31. package/src/components/card-layout/elements/icon-element/index.wxss +3 -17
  32. package/src/components/card-layout/elements/icon-font.wxss +438 -0
  33. package/src/components/card-layout/elements/image-element/index.ts +21 -11
  34. package/src/components/card-layout/elements/image-element/index.wxml +8 -10
  35. package/src/components/card-layout/elements/image-element/index.wxss +1 -1
  36. package/src/components/card-layout/elements/layout-panel-element/index.json +3 -0
  37. package/src/components/card-layout/elements/layout-panel-element/index.ts +40 -0
  38. package/src/components/card-layout/elements/layout-panel-element/index.wxml +5 -0
  39. package/src/components/card-layout/elements/layout-panel-element/index.wxss +10 -0
  40. package/src/components/card-layout/elements/text-element/index.ts +48 -19
  41. package/src/components/card-layout/elements/text-element/index.wxml +8 -34
  42. package/src/components/card-layout/elements/text-element/index.wxss +5 -18
  43. package/src/components/card-layout/index.json +9 -1
  44. package/src/components/card-layout/index.ts +36 -156
  45. package/src/components/card-layout/index.wxml +25 -46
  46. package/src/components/card-layout/index.wxss +1 -538
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("../../../../vendor/km-card-layout-core/index");
4
+ Component({
5
+ options: {
6
+ styleIsolation: "apply-shared",
7
+ },
8
+ properties: {
9
+ element: {
10
+ type: Object,
11
+ value: {},
12
+ },
13
+ rootData: {
14
+ type: Object,
15
+ value: {},
16
+ },
17
+ },
18
+ data: {
19
+ wrapperStyle: "",
20
+ contentStyle: "",
21
+ },
22
+ observers: {
23
+ element() {
24
+ this.rebuild();
25
+ },
26
+ },
27
+ methods: {
28
+ rebuild() {
29
+ const el = this.data.element;
30
+ if (!el)
31
+ return;
32
+ const wrapperStyle = (0, index_1.styleObjectToString)((0, index_1.buildWrapperStyle)(el, "rpx"), "rpx");
33
+ const contentStyle = (0, index_1.styleObjectToString)((0, index_1.buildPanelContentStyle)(el, "rpx"), "rpx");
34
+ this.setData({ wrapperStyle, contentStyle });
35
+ },
36
+ },
37
+ });
@@ -0,0 +1,5 @@
1
+ <view class="km-node itemClass" style="{{wrapperStyle}}">
2
+ <view class="km-node__panel itemClass" style="{{contentStyle}}">
3
+ <slot></slot>
4
+ </view>
5
+ </view>
@@ -0,0 +1,10 @@
1
+ .km-node {
2
+ box-sizing: border-box;
3
+ color: inherit;
4
+ }
5
+
6
+ .km-node__panel {
7
+ width: 100%;
8
+ height: 100%;
9
+ box-sizing: border-box;
10
+ }
@@ -2,17 +2,26 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const index_1 = require("../../../../vendor/km-card-layout-core/index");
4
4
  const icon_map_1 = require("../../icon-map");
5
- const mapIconGlyph = (name, fallback) => {
5
+ const normalizeIconName = (name) => {
6
6
  if (!name)
7
- return fallback;
8
- const glyph = icon_map_1.ICON_CODE_MAP[name];
9
- if (glyph)
10
- return String.fromCharCode(parseInt(glyph, 16));
11
- return fallback || name;
7
+ return "";
8
+ return name.startsWith("icon-") ? name.slice(5) : name;
9
+ };
10
+ const buildIconClassName = (name) => {
11
+ const normalized = normalizeIconName(name);
12
+ if (!normalized)
13
+ return "";
14
+ return `icon-${normalized}`;
15
+ };
16
+ const buildIconCode = (name) => {
17
+ const normalized = normalizeIconName(name);
18
+ if (!normalized)
19
+ return "";
20
+ return icon_map_1.ICON_CODE_MAP[normalized] || "";
12
21
  };
13
22
  Component({
14
23
  options: {
15
- styleIsolation: 'apply-shared',
24
+ styleIsolation: "apply-shared",
16
25
  },
17
26
  properties: {
18
27
  element: {
@@ -25,28 +34,43 @@ Component({
25
34
  },
26
35
  },
27
36
  data: {
28
- wrapperStyle: '',
29
- contentStyle: '',
30
- textValue: '',
37
+ wrapperStyle: "",
38
+ contentStyle: "",
39
+ textValue: "",
40
+ textStyle: "",
31
41
  iconMeta: null,
32
42
  },
33
43
  observers: {
34
- element(el) {
44
+ element() {
45
+ this.rebuild();
46
+ },
47
+ rootData() {
48
+ this.rebuild();
49
+ },
50
+ },
51
+ methods: {
52
+ rebuild() {
53
+ const el = this.data.element;
35
54
  if (!el)
36
55
  return;
37
56
  const data = this.data.rootData || {};
38
- const wrapperStyle = (0, index_1.styleObjectToString)((0, index_1.buildWrapperStyle)(el, 'rpx'), 'rpx');
39
- const contentStyle = (0, index_1.styleObjectToString)((0, index_1.buildTextContentStyle)(el, 'rpx'), 'rpx');
57
+ const wrapperStyle = (0, index_1.styleObjectToString)((0, index_1.buildWrapperStyle)(el, "rpx"), "rpx");
58
+ const contentStyle = (0, index_1.styleObjectToString)((0, index_1.buildTextContentStyle)(el, "rpx"), "rpx");
40
59
  const textValue = (0, index_1.getTextValue)(el, data);
41
- const iconRaw = (0, index_1.buildTextIconMeta)(el, 'rpx');
60
+ const textStyle = (0, index_1.styleObjectToString)({
61
+ ...(0, index_1.buildTextContentStyle)(el, "rpx"),
62
+ ...(0, index_1.buildTextValueStyle)(el, "rpx"),
63
+ }, "rpx");
64
+ const iconRaw = (0, index_1.buildTextIconMeta)(el, "rpx");
42
65
  const iconMeta = iconRaw && iconRaw.name
43
66
  ? {
44
67
  ...iconRaw,
45
- text: mapIconGlyph(iconRaw.name, iconRaw.name),
46
- wrapperStyle: (0, index_1.styleObjectToString)(iconRaw.wrapperStyle, 'rpx'),
68
+ className: buildIconClassName(iconRaw.name),
69
+ iconCode: buildIconCode(iconRaw.name),
70
+ wrapperStyle: (0, index_1.styleObjectToString)(iconRaw.wrapperStyle, "rpx"),
47
71
  }
48
72
  : iconRaw;
49
- this.setData({ wrapperStyle, contentStyle, textValue, iconMeta });
73
+ this.setData({ wrapperStyle, contentStyle, textValue, textStyle, iconMeta });
50
74
  },
51
75
  },
52
76
  });
@@ -1,44 +1,18 @@
1
- <template name="text-element">
2
- <view class="km-node km-node--text" style="{{wrapperStyle}}">
3
- <view class="km-node__text" style="{{contentStyle}}">
4
- <block wx:if="{{(iconMeta && (iconMeta.name || iconMeta.text)) && (element.icon && element.icon.style !== 'text')}}">
5
- <view class="km-node__text-content">
6
-
7
- <!-- icon 在右侧 -->
8
- <block wx:if="{{iconMeta && iconMeta.align === 'right'}}">
9
- <text class="km-node__text-value">{{(element.icon && element.icon.style === 'text' && element.icon.enable) ? (element.label + ':') : ''}}{{textValue || ''}}</text>
1
+ <view class="km-node km-node--text canvas-item" style="{{wrapperStyle}}">
2
+ <view class="km-node__text canvas-item" style="{{contentStyle}}">
3
+ <block wx:if="{{iconMeta && iconMeta.name && (element.icon && element.icon.style !== 'text')}}">
4
+ <view class="km-node__text-content canvas-item">
10
5
  <view
11
- class="km-node__text-icon--wrapper"
6
+ class="km-node__text-icon--wrapper canvas-item"
12
7
  style="{{iconMeta.wrapperStyle}}"
13
8
  >
14
- <text
15
- class="km-node__text-icon icon"
16
- style="font-size: {{iconMeta.size || '16px'}}; color: {{iconMeta.color || ''}}; margin-right: {{iconMeta.gap || ''}};"
17
- >{{iconMeta.text || iconMeta.name || ''}}</text>
9
+ <i class="km-node__text-icon icon {{iconMeta.className}} canvas-item" style="font-size: {{iconMeta.size || '16px'}}; color: {{iconMeta.color || ''}}; margin-right: {{iconMeta.gap || ''}};" data-icon="{{iconMeta.iconCode}}" ></i>
18
10
  </view>
19
- </block>
20
-
21
- <!-- icon 在左侧 -->
22
- <block wx:else>
23
- <view
24
- class="km-node__text-icon--wrapper"
25
- style="{{iconMeta.wrapperStyle}}"
26
- >
27
- <text
28
- class="km-node__text-icon icon"
29
- style="font-size: {{iconMeta.size || '16px'}}; color: {{iconMeta.color || ''}}; margin-right: {{iconMeta.gap || ''}};"
30
- >{{iconMeta.text || iconMeta.name || ''}}</text>
31
- </view>
32
- <text class="km-node__text-value">{{textValue || ''}}</text>
33
- </block>
34
-
11
+ <text class="km-node__text-value canvas-item" style="{{textStyle}}" data-text="{{textValue || ''}}">{{textValue || ''}}</text>
35
12
  </view>
36
13
  </block>
37
-
38
- <!-- 无 icon -->
39
14
  <block wx:else>
40
- <text class="km-node__text-value">{{(element.icon && element.icon.style === 'text' && element.icon.enable) ? (element.label + ':') : ''}}{{textValue || ''}}</text>
15
+ <text class="km-node__text-value canvas-item" style="{{textStyle}}" data-text="{{(element.icon && element.icon.style === 'text' && element.icon.enable) ? (element.label + ':') : ''}}{{textValue || ''}}">{{(element.icon && element.icon.style === 'text' && element.icon.enable) ? (element.label + ':') : ''}}{{textValue || ''}}</text>
41
16
  </block>
42
17
  </view>
43
18
  </view>
44
- </template>
@@ -1,3 +1,5 @@
1
+ @import "../icon-font.wxss";
2
+
1
3
  .km-node {
2
4
  box-sizing: border-box;
3
5
  color: inherit;
@@ -19,6 +21,7 @@
19
21
  display: inline-block;
20
22
  vertical-align: middle;
21
23
  height: 100%;
24
+ display: inline-flex;
22
25
  }
23
26
 
24
27
  .km-node__text-icon {
@@ -34,22 +37,6 @@
34
37
  vertical-align: middle;
35
38
  }
36
39
 
37
- @font-face {
38
- font-family: 'km-icon';
39
- src: url('data:font/woff;charset=utf-8;base64,d09GRgABAAAAAEl4AA0AAAAAcmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAABJXAAAABoAAAAcrMtJV0dERUYAAEk8AAAAHgAAAB4AKQByT1MvMgAAAaQAAABGAAAAYDw3SVljbWFwAAAC7AAAAM8AAAIW8XL3K2dhc3AAAEk0AAAACAAAAAj//wADZ2x5ZgAABJgAAEBZAABkZPJymXJoZWFkAAABMAAAADEAAAA2MtZiFmhoZWEAAAFkAAAAIAAAACQNagmCaG10eAAAAewAAAD/AAABqqs3Ii9sb2NhAAADvAAAANoAAADaKv0P7G1heHAAAAGEAAAAHwAAACABmQHEbmFtZQAARPQAAAFGAAACgl6CAQJwb3N0AABGPAAAAvUAAATh1g15W3jaY2BkYGAA4lqffPd4fpuvDNwsDCDwVIyfA0b///i/gXMWcyeQy8HABBIFAAVdCfwAAAB42mNgZGBgbvjfwBDDOfP/x///OWcxAEVQQCYAuxgH/XjaY2BkYGDIYdzBoMwAAkxAzAWEDAz/wXwGACjlAl8AeNpjYGFRYJzAwMrAwNTJdIaBgaEfQjO+ZjBi5ACKMrAyM2AFAWmuKQwHnjE+y2Ju+N/AwMB8h6ERKMyIpESBgREAenQNCwAAeNo90cErBGEYx/Hf1LMH7MVxoigHtS600pzWnMjBlt2dFAeiNuWgXLgokgslbpyE/Aduyl38J3ty4aCs7/vOk6lPv+d5531n3nfGVF5JIZlUx9fAbawnEfIFq14/YhddFPjFmynZ9n4TbYzg2tcMW6Epr4NQT3jSJ2lcW9ec1fSEAheMnVume7KKBbQwiMye+5/kEpqYwQoOY59pn1xGw3Lt8NwHS7UY35frivqbet2fNYZp+4j76vj+GpUhjZJreLfxODecay/eTzVPzmIj9uX7VLnUmfdb/2fN4trcv0kYv8Oxe/V5Rzhg7inZ8wzjN5b0f6z8PV2d/AHivi0JAHja3dBFUoVRDITR88PD3d3d3d3d3d33zQqYwwVGbIGk8qV6kK7qIN7vlIsCRdlBRT865iPsWOig318/PwOjbwYd+7mKSZAoSbIUqdKky5ApS7YcufLkK1CoSLESpcqCZ4VKVarVqFWnXoNGTZq1aNWmXYdOXbr16NWn34BBQ4aNGDVm3IRJU6bNmDVn3oJFS5atWLVm3YZNW7bt2LVn34FDR46dOHXm3IVLV67duHXn3oNHT8Hv2YtXbyFaot9HfMeMC4jztyL/vr4AXx4eawAAAAAAAAAAAACwAPIDSgQ8BLIFUgWUBcIF/gY8BpIHCgdAB3wHoAgOCHAIxgk+CV4JzAnqCkQKrgtUC8QMEAxsDNQNFA1SDegONg6qDyQPgg/CEAIQxBEwEaQSHBLYE14T4hRcFPIVTBYMFkwWqBckGGAYxhmYGegaEBpeGuIbXhvwHPQd5B62Hygf6CBeILog9CFUIbgiBCJ0ItQjbCQSJGgkuCVsJcImKib0J44ocijOKSApUCo2KmQqtituK34sJixkLMgtdC3WLpgvPC+QMBww/DGCMagyMgAA') format('woff');
40
- font-weight: normal;
41
- font-style: normal;
42
- font-display: swap;
43
- }
44
-
45
- .icon {
46
- font-family: 'km-icon' !important;
47
- font-size: 16px;
48
- font-style: normal;
49
- -webkit-font-smoothing: antialiased;
50
- -moz-osx-font-smoothing: grayscale;
51
- }
52
-
53
- .km-node__text-icon--wrapper{
40
+ .km-node__text-icon--wrapper {
54
41
  display: inline-block;
55
- }
42
+ }
@@ -2,18 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.hasCompanyDutyKey = exports.normalizeMoreCompany = void 0;
4
4
  const index_1 = require("../../vendor/km-card-layout-core/index");
5
- const icon_map_1 = require("./icon-map");
6
- const mapIconGlyph = (name, fallback) => {
7
- if (!name)
8
- return fallback;
9
- const glyph = icon_map_1.ICON_CODE_MAP[name];
10
- if (glyph)
11
- return String.fromCharCode(parseInt(glyph, 16));
12
- return fallback || name;
13
- };
14
5
  const EMPTY_COMPANY_DUTY = {
15
- company: '',
16
- duty: '',
6
+ company: "",
7
+ duty: "",
17
8
  };
18
9
  /**
19
10
  * 规范化 moreCardInfo.company,保证长度始终为 2
@@ -52,136 +43,54 @@ const handleSpecialFields = (data) => {
52
43
  ...data,
53
44
  user: {
54
45
  ...user,
55
- baseCompanyDuty: user.company && user.duty
56
- ? `${user.company} ${user.duty}`
57
- : user.baseCompanyDuty,
46
+ baseCompanyDuty: user.company && user.duty ? `${user.company} ${user.duty}` : user.baseCompanyDuty,
58
47
  moreCardInfo: user.moreCardInfo
59
48
  ? {
60
49
  ...user.moreCardInfo,
61
50
  company: Array.isArray(user.moreCardInfo.company)
62
- ? user.moreCardInfo.company.map(item => `${item.company} ${item.duty}`)
51
+ ? user.moreCardInfo.company.map((item) => `${item.company} ${item.duty}`)
63
52
  : user.moreCardInfo.company,
64
53
  }
65
54
  : user.moreCardInfo,
66
55
  },
67
56
  };
68
57
  };
69
- const ensureArray = (input) => {
70
- if (!input)
71
- return [];
72
- return Array.isArray(input) ? input : [input];
73
- };
74
58
  const pickCardId = (layout, idx) => {
75
59
  if (layout && (layout.name || layout.id))
76
60
  return layout.name || layout.id;
77
61
  return `card-${idx}`;
78
62
  };
79
- const decorateElements = (children = [], rootData) => {
80
- const data = rootData || {};
81
- return (children || []).map(el => {
82
- const wrapperStyle = (0, index_1.styleObjectToString)((0, index_1.buildWrapperStyle)(el, 'rpx'), 'rpx');
83
- switch (el.type) {
84
- case 'layout-panel': {
85
- const panel = el;
86
- return {
87
- ...panel,
88
- wrapperStyle,
89
- contentStyle: (0, index_1.styleObjectToString)((0, index_1.buildPanelContentStyle)(panel, 'rpx'), 'rpx'),
90
- children: decorateElements(panel.children || [], rootData),
91
- };
92
- }
93
- case 'image': {
94
- const imageEl = el;
95
- const contentStyle = (0, index_1.styleObjectToString)((0, index_1.buildImageContentStyle)(imageEl), 'rpx');
96
- const imageSrc = (0, index_1.getImageSrc)(imageEl, data);
97
- const mode = imageEl.fit === 'contain' ? 'aspectFit' : 'aspectFill';
98
- return {
99
- ...imageEl,
100
- wrapperStyle,
101
- contentStyle,
102
- imageSrc,
103
- mode,
104
- };
105
- }
106
- case 'icon': {
107
- const iconEl = el;
108
- const contentStyle = (0, index_1.styleObjectToString)((0, index_1.buildBaseContentStyle)(iconEl), 'rpx');
109
- const name = (0, index_1.getIconName)(iconEl);
110
- const iconText = mapIconGlyph(name, name || '');
111
- return {
112
- ...iconEl,
113
- wrapperStyle,
114
- contentStyle,
115
- iconText,
116
- };
117
- }
118
- case 'custom': {
119
- const customEl = el;
120
- const contentStyle = (0, index_1.styleObjectToString)((0, index_1.buildBaseContentStyle)(customEl), 'rpx');
121
- return {
122
- ...customEl,
123
- wrapperStyle,
124
- contentStyle,
125
- };
126
- }
127
- default: {
128
- const textEl = el;
129
- const contentStyle = (0, index_1.styleObjectToString)((0, index_1.buildTextContentStyle)(textEl, 'rpx'), 'rpx');
130
- const textValue = (0, index_1.getTextValue)(textEl, data);
131
- const iconRaw = (0, index_1.buildTextIconMeta)(textEl, 'rpx');
132
- const iconMeta = iconRaw && iconRaw.name
133
- ? {
134
- ...iconRaw,
135
- text: mapIconGlyph(iconRaw.name, iconRaw.name),
136
- wrapperStyle: (0, index_1.styleObjectToString)(iconRaw.wrapperStyle, 'rpx'),
137
- }
138
- : iconRaw;
139
- return {
140
- ...textEl,
141
- wrapperStyle,
142
- contentStyle,
143
- textValue,
144
- iconMeta,
145
- };
146
- }
147
- }
148
- });
149
- };
150
- const buildCards = (layouts, rootData) => {
63
+ const buildCards = (layouts) => {
151
64
  return layouts.map((layout, idx) => ({
152
65
  id: pickCardId(layouts[idx], idx),
153
- cardStyle: (0, index_1.styleObjectToString)((0, index_1.buildCardStyle)(layout, 'rpx'), 'rpx'),
154
- backgroundImage: layout.backgroundImage || '',
155
- backgroundStyle: (0, index_1.styleObjectToString)((0, index_1.buildBackgroundStyle)(layout, 'rpx'), 'rpx'),
156
- elements: decorateElements(layout.children || [], rootData),
66
+ cardStyle: (0, index_1.styleObjectToString)((0, index_1.buildCardStyle)(layout, "rpx"), "rpx"),
67
+ backgroundImage: layout.backgroundImage || "",
68
+ backgroundStyle: (0, index_1.styleObjectToString)((0, index_1.buildBackgroundStyle)(layout, "rpx"), "rpx"),
69
+ elements: layout.children || [],
157
70
  }));
158
71
  };
159
72
  const hasCompanyDutyKey = (schemas) => {
160
- const TARGET_KEYS = new Set([
161
- 'company_duty_custom',
162
- 'company_duty_1',
163
- 'company_duty_2',
164
- ]);
73
+ const TARGET_KEYS = new Set(["company_duty_custom", "company_duty_1", "company_duty_2"]);
165
74
  const traverse = (elements) => {
166
- return elements.some(el => {
75
+ return elements.some((el) => {
167
76
  var _a;
168
77
  // 命中 key
169
78
  if (el.key && TARGET_KEYS.has(el.key)) {
170
79
  return true;
171
80
  }
172
81
  // 递归 layout-panel
173
- if (el.type === 'layout-panel' && ((_a = el.children) === null || _a === void 0 ? void 0 : _a.length)) {
82
+ if (el.type === "layout-panel" && ((_a = el.children) === null || _a === void 0 ? void 0 : _a.length)) {
174
83
  return traverse(el.children);
175
84
  }
176
85
  return false;
177
86
  });
178
87
  };
179
- return schemas.some(schema => traverse(schema.children));
88
+ return schemas.some((schema) => traverse(schema.children));
180
89
  };
181
90
  exports.hasCompanyDutyKey = hasCompanyDutyKey;
182
91
  Component({
183
92
  options: {
184
- styleIsolation: 'apply-shared',
93
+ styleIsolation: "apply-shared",
185
94
  },
186
95
  properties: {
187
96
  layout: {
@@ -199,6 +108,7 @@ Component({
199
108
  data: {
200
109
  cards: [],
201
110
  rootData: {},
111
+ firstCard: [],
202
112
  },
203
113
  observers: {
204
114
  layout() {
@@ -216,15 +126,28 @@ Component({
216
126
  methods: {
217
127
  rebuild() {
218
128
  const data = normalizeMoreCompany(this.data.data);
219
- const layoutInput = (0, exports.hasCompanyDutyKey)(this.data.layout) ? (0, index_1.processCardLayout)(this.data.layout, data) : this.data.layout;
129
+ const layoutInput = (0, exports.hasCompanyDutyKey)(this.data.layout)
130
+ ? (0, index_1.processCardLayout)(this.data.layout, data)
131
+ : this.data.layout;
220
132
  const rootData = handleSpecialFields(data);
221
133
  if (!layoutInput.length) {
222
134
  this.setData({ cards: [], rootData });
223
135
  return;
224
136
  }
225
137
  const normalizedLayouts = (0, index_1.normalizeLayout)(layoutInput);
226
- const cards = buildCards(normalizedLayouts, rootData);
227
- this.setData({ cards, rootData });
138
+ const cards = buildCards(normalizedLayouts);
139
+ this.setData({ cards, rootData, firstCard: [cards[0]] });
140
+ },
141
+ async handleDrawCanvas() {
142
+ try {
143
+ const canvas = this.selectComponent(`#layout-canvas`);
144
+ await canvas.draw(this);
145
+ const filePath = await canvas.toTempFilePath();
146
+ return filePath;
147
+ }
148
+ catch (_a) {
149
+ wx.showToast({ title: "保存失败", icon: "error" });
150
+ }
228
151
  },
229
152
  },
230
153
  });
@@ -1,3 +1,11 @@
1
1
  {
2
- "component": true
2
+ "component": true,
3
+ "usingComponents": {
4
+ "text-element": "./elements/text-element/index",
5
+ "image-element": "./elements/image-element/index",
6
+ "icon-element": "./elements/icon-element/index",
7
+ "custom-element": "./elements/custom-element/index",
8
+ "layout-panel-element": "./elements/layout-panel-element/index",
9
+ "wxml2canvas": "../../vendor/wxml2canvas-2d/index"
10
+ }
3
11
  }
@@ -1,59 +1,38 @@
1
- <import src="./elements/custom-element/index.wxml" />
2
- <import src="./elements/icon-element/index.wxml" />
3
- <import src="./elements/image-element/index.wxml" />
4
- <import src="./elements/text-element/index.wxml" />
5
-
6
- <view class="km-card-layout">
7
- <block wx:for="{{cards}}" wx:key="id">
8
- <view class="km-card-layout__item">
9
- <view class="km-card" style="{{item.cardStyle}}">
10
- <image
11
- wx:if="{{item.backgroundImage}}"
12
- class="km-card__bg"
13
- style="{{item.backgroundStyle}}"
14
- src="{{item.backgroundImage}}"
15
- mode="aspectFill"
16
- />
17
- <block wx:for="{{item.elements}}" wx:key="id">
18
- <template wx:if="{{item.visible !== false}}" is="render-element" data="{{el:item, rootData: rootData}}" />
19
- </block>
1
+ <template name="layout-template">
2
+ <view class="km-card-layout layout-container">
3
+ <block wx:for="{{renderCards}}" wx:key="id">
4
+ <view class="km-card-layout__item canvas-item">
5
+ <view class="km-card canvas-item" style="{{item.cardStyle}}">
6
+ <image wx:if="{{item.backgroundImage}}" class="km-card__bg canvas-item" style="{{item.backgroundStyle}}" src="{{item.backgroundImage}}" mode="aspectFill" />
7
+ <block wx:for="{{item.elements}}" wx:key="id">
8
+ <template wx:if="{{item.visible !== false}}" is="render-element" data="{{el:item, rootData: rootData}}" />
9
+ </block>
10
+ </view>
20
11
  </view>
21
- </view>
22
- </block>
23
- </view>
24
-
12
+ </block>
13
+ </view>
14
+ </template>
15
+ <template is="layout-template" data="{{ renderCards: cards, rootData: rootData }}"></template>
16
+ <!-- 暂时只绘制第一张卡片 -->
17
+ <wxml2canvas id="layout-canvas" container-class="layout-container" item-class="canvas-item"></wxml2canvas>
25
18
  <template name="render-element">
26
19
  <block wx:if="{{el.type === 'image'}}">
27
- <template
28
- is="image-element"
29
- data="{{wrapperStyle: el.wrapperStyle, contentStyle: el.contentStyle, imageSrc: el.imageSrc, mode: el.mode}}"
30
- />
20
+ <image-element id="node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}" />
31
21
  </block>
32
22
  <block wx:elif="{{el.type === 'icon'}}">
33
- <template
34
- is="icon-element"
35
- data="{{wrapperStyle: el.wrapperStyle, contentStyle: el.contentStyle, iconText: el.iconText}}"
36
- />
23
+ <icon-element id="node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}" />
37
24
  </block>
38
25
  <block wx:elif="{{el.type === 'layout-panel'}}">
39
- <view class="km-node" style="{{el.wrapperStyle}}">
40
- <view class="km-node__panel" style="{{el.contentStyle}}">
41
- <block wx:for="{{el.children}}" wx:key="id">
42
- <template is="render-element" data="{{el:item, rootData: rootData}}" />
43
- </block>
44
- </view>
45
- </view>
26
+ <layout-panel-element id="node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}">
27
+ <block wx:for="{{el.children}}" wx:key="id">
28
+ <template is="render-element" data="{{el:item, rootData: rootData}}" />
29
+ </block>
30
+ </layout-panel-element>
46
31
  </block>
47
32
  <block wx:elif="{{el.type === 'custom'}}">
48
- <template
49
- is="custom-element"
50
- data="{{wrapperStyle: el.wrapperStyle, contentStyle: el.contentStyle, element: el}}"
51
- />
33
+ <custom-element id="node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}" />
52
34
  </block>
53
35
  <block wx:else>
54
- <template
55
- is="text-element"
56
- data="{{wrapperStyle: el.wrapperStyle, contentStyle: el.contentStyle, textValue: el.textValue, iconMeta: el.iconMeta, element: el}}"
57
- />
36
+ <text-element id="node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}" />
58
37
  </block>
59
38
  </template>