jobsys-explore 4.7.11 → 4.7.13

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 (206) hide show
  1. package/.changeset/config.json +11 -11
  2. package/.eslintignore +3 -3
  3. package/.eslintrc.cjs +37 -37
  4. package/.prettierrc.cjs +38 -38
  5. package/CHANGELOG.md +542 -542
  6. package/README.md +41 -41
  7. package/TODOs.md +8 -8
  8. package/business-components/index.js +1 -1
  9. package/business-components/survey/ExSurvey.jsx +193 -193
  10. package/business-components/survey/index.js +5 -5
  11. package/business-components/survey/index.less +36 -36
  12. package/components/button/ExButton.jsx +120 -120
  13. package/components/button/index.js +4 -4
  14. package/components/button/index.less +7 -7
  15. package/components/decorator/ExDecorator.jsx +31 -31
  16. package/components/decorator/index.js +5 -5
  17. package/components/decorator/index.less +76 -76
  18. package/components/form/ExAddress.jsx +195 -195
  19. package/components/form/ExCascader.jsx +171 -171
  20. package/components/form/ExCheckbox.jsx +59 -59
  21. package/components/form/ExDate.jsx +143 -143
  22. package/components/form/ExDatetime.jsx +166 -166
  23. package/components/form/ExField.jsx +138 -138
  24. package/components/form/ExFieldUploader.jsx +50 -50
  25. package/components/form/ExForm.jsx +549 -549
  26. package/components/form/ExMatrixCheckbox.jsx +99 -99
  27. package/components/form/ExMatrixRadio.jsx +86 -86
  28. package/components/form/ExMatrixScale.jsx +97 -97
  29. package/components/form/ExNumber.jsx +51 -51
  30. package/components/form/ExRadio.jsx +58 -58
  31. package/components/form/ExRate.jsx +51 -51
  32. package/components/form/ExSelect.jsx +251 -251
  33. package/components/form/ExSlider.jsx +55 -55
  34. package/components/form/ExSwitch.jsx +51 -51
  35. package/components/form/ExTime.jsx +99 -99
  36. package/components/form/FormItem.jsx +307 -307
  37. package/components/form/PickerWrapper.jsx +120 -120
  38. package/components/form/index.js +46 -46
  39. package/components/form/index.less +178 -178
  40. package/components/form/utils.js +62 -63
  41. package/components/grid/ExGrid.jsx +53 -53
  42. package/components/grid/index.js +4 -4
  43. package/components/grid/index.less +2 -2
  44. package/components/index.js +12 -12
  45. package/components/pagination/ExPagination.jsx +459 -457
  46. package/components/pagination/index.js +5 -5
  47. package/components/pagination/index.less +3 -3
  48. package/components/provider/ExProvider.jsx +173 -173
  49. package/components/provider/index.js +4 -4
  50. package/components/qrcode/ExQrcode.jsx +86 -86
  51. package/components/qrcode/index.js +5 -5
  52. package/components/qrcode/index.less +8 -8
  53. package/components/result/ExResult.jsx +122 -122
  54. package/components/result/index.js +5 -5
  55. package/components/result/index.less +59 -59
  56. package/components/search/ExSearch.jsx +375 -375
  57. package/components/search/components/Expand.jsx +77 -77
  58. package/components/search/components/Field.jsx +27 -27
  59. package/components/search/components/Quick.jsx +57 -57
  60. package/components/search/components/index.js +5 -5
  61. package/components/search/index.js +5 -5
  62. package/components/search/index.less +118 -118
  63. package/components/search/utils.js +30 -30
  64. package/components/sector/ExSector.jsx +52 -52
  65. package/components/sector/README.md +26 -26
  66. package/components/sector/index.js +5 -5
  67. package/components/sector/index.less +122 -122
  68. package/components/theme/ExTheme.jsx +10 -10
  69. package/components/theme/index.js +4 -4
  70. package/components/theme/index.less +98 -98
  71. package/components/uploader/ExUploader.jsx +303 -303
  72. package/components/uploader/index.js +5 -5
  73. package/components/utils.js +187 -187
  74. package/directives/auth.js +113 -113
  75. package/directives/index.js +4 -4
  76. package/dist/cipher-98df1050.cjs.map +1 -1
  77. package/dist/cipher-f2ed5ee6.js.map +1 -1
  78. package/dist/directives.cjs.map +1 -1
  79. package/dist/directives.js.map +1 -1
  80. package/dist/hooks.cjs.map +1 -1
  81. package/dist/hooks.js.map +1 -1
  82. package/dist/jobsys-explore.cjs +5 -5
  83. package/dist/jobsys-explore.cjs.map +1 -1
  84. package/dist/jobsys-explore.js +10 -3
  85. package/dist/jobsys-explore.js.map +1 -1
  86. package/docgen.config.js +15 -15
  87. package/docs/.vuepress/.cache/deps/@vue_devtools-api.js +11 -11
  88. package/docs/.vuepress/.cache/deps/@vue_devtools-api.js.map +7 -7
  89. package/docs/.vuepress/.cache/deps/@vuepress_shared.js +110 -110
  90. package/docs/.vuepress/.cache/deps/@vuepress_shared.js.map +7 -7
  91. package/docs/.vuepress/.cache/deps/@vueuse_core.js +8758 -8758
  92. package/docs/.vuepress/.cache/deps/@vueuse_core.js.map +7 -7
  93. package/docs/.vuepress/.cache/deps/_metadata.json +52 -52
  94. package/docs/.vuepress/.cache/deps/chunk-37RBVGNF.js +10577 -10577
  95. package/docs/.vuepress/.cache/deps/chunk-37RBVGNF.js.map +7 -7
  96. package/docs/.vuepress/.cache/deps/chunk-H2FJVFR5.js +163 -163
  97. package/docs/.vuepress/.cache/deps/chunk-H2FJVFR5.js.map +7 -7
  98. package/docs/.vuepress/.cache/deps/chunk-L7E56NPU.js +306 -306
  99. package/docs/.vuepress/.cache/deps/chunk-L7E56NPU.js.map +7 -7
  100. package/docs/.vuepress/.cache/deps/lodash-es.js +8442 -8442
  101. package/docs/.vuepress/.cache/deps/lodash-es.js.map +7 -7
  102. package/docs/.vuepress/.cache/deps/package.json +3 -3
  103. package/docs/.vuepress/.cache/deps/vue-router.js +2667 -2667
  104. package/docs/.vuepress/.cache/deps/vue-router.js.map +7 -7
  105. package/docs/.vuepress/.cache/deps/vue.js +315 -315
  106. package/docs/.vuepress/.cache/deps/vue.js.map +7 -7
  107. package/docs/.vuepress/.temp/internal/clientConfigs.js +17 -17
  108. package/docs/.vuepress/.temp/internal/pagesComponents.js +24 -24
  109. package/docs/.vuepress/.temp/internal/pagesData.js +22 -22
  110. package/docs/.vuepress/.temp/internal/pagesRoutes.js +12 -12
  111. package/docs/.vuepress/.temp/internal/siteData.js +1 -1
  112. package/docs/.vuepress/.temp/internal/themeData.js +1 -1
  113. package/docs/.vuepress/.temp/pages/404.html.js +1 -1
  114. package/docs/.vuepress/.temp/pages/404.html.vue +3 -3
  115. package/docs/.vuepress/.temp/pages/components/button/ExButton.html.js +1 -1
  116. package/docs/.vuepress/.temp/pages/components/button/ExButton.html.vue +111 -111
  117. package/docs/.vuepress/.temp/pages/components/decorator/ExDecorator.html.js +1 -1
  118. package/docs/.vuepress/.temp/pages/components/decorator/ExDecorator.html.vue +37 -37
  119. package/docs/.vuepress/.temp/pages/components/form/ExForm.html.js +1 -1
  120. package/docs/.vuepress/.temp/pages/components/form/ExForm.html.vue +187 -187
  121. package/docs/.vuepress/.temp/pages/components/provider/ExProvider.html.js +1 -1
  122. package/docs/.vuepress/.temp/pages/components/provider/ExProvider.html.vue +51 -51
  123. package/docs/.vuepress/.temp/pages/components/search/ExSearch.html.js +1 -1
  124. package/docs/.vuepress/.temp/pages/components/search/ExSearch.html.vue +108 -108
  125. package/docs/.vuepress/.temp/pages/components/sector/ExSector.html.js +1 -1
  126. package/docs/.vuepress/.temp/pages/components/sector/ExSector.html.vue +71 -71
  127. package/docs/.vuepress/.temp/pages/components/uploader/ExUploader.html.js +1 -1
  128. package/docs/.vuepress/.temp/pages/components/uploader/ExUploader.html.vue +162 -162
  129. package/docs/.vuepress/.temp/pages/hooks.html.js +1 -1
  130. package/docs/.vuepress/.temp/pages/hooks.html.vue +697 -697
  131. package/docs/.vuepress/.temp/pages/index.html.js +1 -1
  132. package/docs/.vuepress/.temp/pages/index.html.vue +56 -56
  133. package/docs/.vuepress/.temp/styles/index.scss +1 -1
  134. package/docs/.vuepress/.temp/vite-root/index.html +13 -13
  135. package/docs/.vuepress/config.js +61 -61
  136. package/docs/.vuepress/dist/404.html +33 -33
  137. package/docs/.vuepress/dist/assets/404.html-a0ce2184.js +1 -1
  138. package/docs/.vuepress/dist/assets/404.html-f9875e7b.js +1 -1
  139. package/docs/.vuepress/dist/assets/ExButton.html-ad283101.js +1 -1
  140. package/docs/.vuepress/dist/assets/ExButton.html-b975c5b2.js +1 -1
  141. package/docs/.vuepress/dist/assets/ExDecorator.html-42d09114.js +1 -1
  142. package/docs/.vuepress/dist/assets/ExDecorator.html-c82c5fe8.js +1 -1
  143. package/docs/.vuepress/dist/assets/ExForm.html-24f42bf7.js +1 -1
  144. package/docs/.vuepress/dist/assets/ExForm.html-9e3f8000.js +1 -1
  145. package/docs/.vuepress/dist/assets/ExProvider.html-50d01930.js +1 -1
  146. package/docs/.vuepress/dist/assets/ExProvider.html-78fdc6cd.js +1 -1
  147. package/docs/.vuepress/dist/assets/ExSearch.html-103f6f34.js +1 -1
  148. package/docs/.vuepress/dist/assets/ExSearch.html-635a618b.js +1 -1
  149. package/docs/.vuepress/dist/assets/ExSector.html-a1e24c3a.js +7 -7
  150. package/docs/.vuepress/dist/assets/ExSector.html-cff3fefd.js +1 -1
  151. package/docs/.vuepress/dist/assets/ExUploader.html-8310e424.js +1 -1
  152. package/docs/.vuepress/dist/assets/ExUploader.html-f059c617.js +1 -1
  153. package/docs/.vuepress/dist/assets/app-29fe8d1e.js +10 -10
  154. package/docs/.vuepress/dist/assets/hooks.html-90ccbc1a.js +1 -1
  155. package/docs/.vuepress/dist/assets/hooks.html-ddb4f378.js +1 -1
  156. package/docs/.vuepress/dist/assets/index.html-85b79c97.js +43 -43
  157. package/docs/.vuepress/dist/assets/index.html-e18a38b1.js +1 -1
  158. package/docs/.vuepress/dist/assets/style-46d7e227.css +1 -1
  159. package/docs/.vuepress/dist/components/button/ExButton.html +33 -33
  160. package/docs/.vuepress/dist/components/decorator/ExDecorator.html +33 -33
  161. package/docs/.vuepress/dist/components/form/ExForm.html +33 -33
  162. package/docs/.vuepress/dist/components/provider/ExProvider.html +33 -33
  163. package/docs/.vuepress/dist/components/search/ExSearch.html +33 -33
  164. package/docs/.vuepress/dist/components/sector/ExSector.html +39 -39
  165. package/docs/.vuepress/dist/components/uploader/ExUploader.html +33 -33
  166. package/docs/.vuepress/dist/hooks.html +33 -33
  167. package/docs/.vuepress/dist/index.html +75 -75
  168. package/docs/.vuepress/styles/index.scss +7 -7
  169. package/docs/components/button/ExButton.md +30 -30
  170. package/docs/components/decorator/ExDecorator.md +14 -14
  171. package/docs/components/form/ExForm.md +39 -39
  172. package/docs/components/provider/ExProvider.md +16 -16
  173. package/docs/components/search/ExSearch.md +28 -28
  174. package/docs/components/sector/ExSector.md +43 -43
  175. package/docs/components/uploader/ExUploader.md +36 -36
  176. package/docs/index.md +82 -82
  177. package/hooks/cipher.js +44 -44
  178. package/hooks/datetime.js +69 -69
  179. package/hooks/form.js +188 -188
  180. package/hooks/index.js +5 -5
  181. package/hooks/network.js +122 -122
  182. package/hooks/utils.js +282 -282
  183. package/index.html +17 -17
  184. package/index.js +31 -31
  185. package/package.json +5 -5
  186. package/playground/App.vue +191 -192
  187. package/playground/TestButton.vue +61 -61
  188. package/playground/TestCascader.vue +2442 -2442
  189. package/playground/TestDecorator.vue +14 -14
  190. package/playground/TestForm.vue +429 -466
  191. package/playground/TestFormItem.vue +110 -110
  192. package/playground/TestGrid.vue +22 -22
  193. package/playground/TestPagination.vue +1250 -1250
  194. package/playground/TestQrcode.vue +7 -7
  195. package/playground/TestResult.vue +12 -12
  196. package/playground/TestSearch.vue +115 -115
  197. package/playground/TestSector.vue +15 -15
  198. package/playground/TestSurvey.vue +27 -27
  199. package/playground/TestUploader.vue +14 -14
  200. package/playground/http.js +23 -23
  201. package/playground/main.js +22 -22
  202. package/postcss.config.cjs +8 -8
  203. package/utils/style.js +13 -13
  204. package/utils/withInstall.js +7 -7
  205. package/vite.config.js +54 -54
  206. package/.changeset/twelve-fans-fix.md +0 -5
package/README.md CHANGED
@@ -1,41 +1,41 @@
1
- # TODOs
2
-
3
- ---
4
-
5
- ## 增强
6
-
7
- - [ ] ExploreForm
8
-
9
- - [x] Address
10
- - [x] Cascader
11
- - [x] Checkbox
12
- - [x] Date
13
- - [ ] Group
14
- - [ ] Html
15
- - [x] Input
16
- - [x] Number
17
- - [x] Radio
18
- - [ ] Remote
19
- - [x] Select
20
- - [x] Switch
21
- - [] Tag
22
- - [x] Text
23
- - [x] Time
24
- - [ ] TreeSelect
25
- - [x] Uploader
26
-
27
- - [x] ExploreSearch
28
-
29
- - [x] 同上
30
-
31
- - [x] Field
32
- - [x] Disabled
33
- - [x] Help
34
-
35
- ## 新增
36
-
37
- - [ ] 样式定制
38
- - [ ] 浮动按钮
39
- - [ ] 列表组件
40
- - [ ] 背景生成
41
- - [ ] 简易图表
1
+ # TODOs
2
+
3
+ ---
4
+
5
+ ## 增强
6
+
7
+ - [ ] ExploreForm
8
+
9
+ - [x] Address
10
+ - [x] Cascader
11
+ - [x] Checkbox
12
+ - [x] Date
13
+ - [ ] Group
14
+ - [ ] Html
15
+ - [x] Input
16
+ - [x] Number
17
+ - [x] Radio
18
+ - [ ] Remote
19
+ - [x] Select
20
+ - [x] Switch
21
+ - [] Tag
22
+ - [x] Text
23
+ - [x] Time
24
+ - [ ] TreeSelect
25
+ - [x] Uploader
26
+
27
+ - [x] ExploreSearch
28
+
29
+ - [x] 同上
30
+
31
+ - [x] Field
32
+ - [x] Disabled
33
+ - [x] Help
34
+
35
+ ## 新增
36
+
37
+ - [ ] 样式定制
38
+ - [ ] 浮动按钮
39
+ - [ ] 列表组件
40
+ - [ ] 背景生成
41
+ - [ ] 简易图表
package/TODOs.md CHANGED
@@ -1,8 +1,8 @@
1
- # Bugs
2
-
3
- - [ ] ExPagination 无限加载数据问题
4
-
5
- # Improvements
6
-
7
- # Features
8
-
1
+ # Bugs
2
+
3
+ - [ ] ExPagination 无限加载数据问题
4
+
5
+ # Improvements
6
+
7
+ # Features
8
+
@@ -1 +1 @@
1
- export * from "./survey"
1
+ export * from "./survey"
@@ -1,193 +1,193 @@
1
- import { computed, defineComponent, nextTick, reactive, watch } from "vue"
2
- import { Progress } from "vant"
3
- import "./index.less"
4
- import { ExButton, ExForm } from "../../components"
5
- import { cloneDeep } from "lodash-es"
6
- import { useProcessStatusSuccess } from "../../hooks"
7
-
8
- /**
9
- * 调查问卷
10
- * @version 4.4.0
11
- */
12
- export default defineComponent({
13
- name: "ExSurvey",
14
- props: {
15
- /**
16
- * 标题
17
- */
18
- title: { type: String, default: "" },
19
-
20
- /**
21
- * 问卷 slug
22
- */
23
- slug: { type: [Number, String], default: "", required: true },
24
- /**
25
- * 开场语
26
- */
27
- intro: { type: String, default: "" },
28
-
29
- /**
30
- * 结束语
31
- */
32
- outro: { type: String, default: "" },
33
-
34
- /**
35
- * 从哪个章节开始做
36
- */
37
- startChapter: { type: Number, default: 0 },
38
-
39
- /**
40
- * 表单项
41
- */
42
- formItems: { type: Array, default: () => [], required: true },
43
-
44
- /**
45
- * 提交地址
46
- */
47
- submitUrl: { type: String, default: "" },
48
-
49
- /**
50
- *
51
- * @typedef {Object} ExposedFormData
52
- * @property {Object} formatForm Format后的表单数据
53
- *
54
- *
55
- * 提交数据处理函数
56
- * @param {ExposedFormData} data
57
- * @return {Boolean|Object} return false会阻止提交操作,return Object会替换提交的数据
58
- *
59
- */
60
- beforeSubmit: { type: Function, default: null },
61
- },
62
- emits: [
63
- /**
64
- * @event click
65
- * @param {Event} event 完结事件
66
- */
67
- "finish",
68
- ],
69
-
70
- setup(props, { emit }) {
71
- const state = reactive({
72
- currentStep: "intro",
73
- formChapters: [], //二维数组,按章节存储
74
- currentChapter: 0, //当前章节
75
- })
76
-
77
- const isLastChapter = computed(() => state.currentChapter === state.formChapters.length)
78
- const progress = computed(() => (!state.formChapters.length ? 0 : (state.currentChapter / state.formChapters.length) * 100))
79
-
80
- // 将 props.formItems 按 break 划分成章节
81
- const prepareFormItems = () => {
82
- let chapter = [] //存储章节的数组
83
- const formItems = cloneDeep(props.formItems)
84
- for (let i = 0; i < formItems.length; i += 1) {
85
- const item = formItems[i] // 这个是用于渲染的配置
86
- item.defaultSlots = {
87
- label: () => (
88
- <span style={{ marginBottom: "10px" }}>
89
- {i + 1}.{item.title}
90
- </span>
91
- ),
92
- }
93
- if (item.break) {
94
- if (chapter.length) {
95
- state.formChapters.push(chapter)
96
- }
97
- delete item.break
98
- chapter = [item]
99
- } else {
100
- chapter.push(item)
101
- }
102
-
103
- if (i === formItems.length - 1) {
104
- state.formChapters.push(chapter)
105
- }
106
- }
107
- }
108
-
109
- watch(
110
- () => props.formItems,
111
- () => {
112
- prepareFormItems()
113
- nextTick(() => {
114
- if (props.startChapter) {
115
- state.currentChapter = Math.min(props.startChapter - 1, state.formChapters.length - 1)
116
- }
117
- })
118
- },
119
- { immediate: true },
120
- )
121
-
122
- const onBeforeSubmit = ({ formatForm }) => {
123
- let data = { slug: props.slug, answers: formatForm }
124
- if (props.beforeSubmit) {
125
- return props.beforeSubmit(data)
126
- }
127
- return data
128
- }
129
-
130
- const onAfterSubmit = (res) => {
131
- useProcessStatusSuccess(res, () => {
132
- state.currentChapter += 1
133
- if (state.currentChapter === state.formChapters.length) {
134
- state.currentStep = "outro"
135
- }
136
- })
137
- }
138
-
139
- const onFinish = () => {
140
- emit("finish")
141
- }
142
-
143
- const progressElem = () => {
144
- return state.formChapters.length <= 1 || state.currentStep !== "form" ? null : (
145
- <div class={`ex-survey__progress`}>
146
- <Progress showPivot={false} percentage={progress.value}></Progress>
147
- </div>
148
- )
149
- }
150
-
151
- const introElem = () =>
152
- (props.title || props.intro) && state.currentStep === "intro" ? (
153
- <div class={`ex-survey__intro`}>
154
- {props.title ? <div class={`ex-survey__title`}>{props.title}</div> : null}
155
- {props.intro || null}
156
- <ExButton type={"primary"} class={"ex-survey__start-btn"} onClick={() => (state.currentStep = "form")}>
157
- {() => "开始"}
158
- </ExButton>
159
- </div>
160
- ) : null
161
-
162
- const outroElem = () =>
163
- props.intro && state.currentStep === "outro" ? (
164
- <div class={`ex-survey__outro`}>
165
- {props.outro || "谢谢您的参与,祝您有美好的一天!"}
166
- <ExButton type={"primary"} class={"ex-survey__finish-btn"} onClick={onFinish}>
167
- {() => "完成"}
168
- </ExButton>
169
- </div>
170
- ) : null
171
-
172
- const formElem = () => {
173
- return state.currentStep === "form" ? (
174
- <div class={`ex-survey__form`}>
175
- <ExForm
176
- form={state.formChapters[state.currentChapter]}
177
- labelWidth={"100%"}
178
- fixed={true}
179
- submitUrl={props.submitUrl}
180
- closable={!isLastChapter.value && state.currentChapter !== 0}
181
- close={() => (state.currentChapter -= 1)}
182
- cancelButtonText={"上一步"}
183
- submitButtonText={"确定"}
184
- beforeSubmit={onBeforeSubmit}
185
- afterSubmit={onAfterSubmit}
186
- ></ExForm>
187
- </div>
188
- ) : null
189
- }
190
-
191
- return () => <div class={`ex-survey`}>{[introElem(), progressElem(), formElem(), outroElem()]}</div>
192
- },
193
- })
1
+ import { computed, defineComponent, nextTick, reactive, watch } from "vue"
2
+ import { Progress } from "vant"
3
+ import "./index.less"
4
+ import { ExButton, ExForm } from "../../components"
5
+ import { cloneDeep } from "lodash-es"
6
+ import { useProcessStatusSuccess } from "../../hooks"
7
+
8
+ /**
9
+ * 调查问卷
10
+ * @version 4.4.0
11
+ */
12
+ export default defineComponent({
13
+ name: "ExSurvey",
14
+ props: {
15
+ /**
16
+ * 标题
17
+ */
18
+ title: { type: String, default: "" },
19
+
20
+ /**
21
+ * 问卷 slug
22
+ */
23
+ slug: { type: [Number, String], default: "", required: true },
24
+ /**
25
+ * 开场语
26
+ */
27
+ intro: { type: String, default: "" },
28
+
29
+ /**
30
+ * 结束语
31
+ */
32
+ outro: { type: String, default: "" },
33
+
34
+ /**
35
+ * 从哪个章节开始做
36
+ */
37
+ startChapter: { type: Number, default: 0 },
38
+
39
+ /**
40
+ * 表单项
41
+ */
42
+ formItems: { type: Array, default: () => [], required: true },
43
+
44
+ /**
45
+ * 提交地址
46
+ */
47
+ submitUrl: { type: String, default: "" },
48
+
49
+ /**
50
+ *
51
+ * @typedef {Object} ExposedFormData
52
+ * @property {Object} formatForm Format后的表单数据
53
+ *
54
+ *
55
+ * 提交数据处理函数
56
+ * @param {ExposedFormData} data
57
+ * @return {Boolean|Object} return false会阻止提交操作,return Object会替换提交的数据
58
+ *
59
+ */
60
+ beforeSubmit: { type: Function, default: null },
61
+ },
62
+ emits: [
63
+ /**
64
+ * @event click
65
+ * @param {Event} event 完结事件
66
+ */
67
+ "finish",
68
+ ],
69
+
70
+ setup(props, { emit }) {
71
+ const state = reactive({
72
+ currentStep: "intro",
73
+ formChapters: [], //二维数组,按章节存储
74
+ currentChapter: 0, //当前章节
75
+ })
76
+
77
+ const isLastChapter = computed(() => state.currentChapter === state.formChapters.length)
78
+ const progress = computed(() => (!state.formChapters.length ? 0 : (state.currentChapter / state.formChapters.length) * 100))
79
+
80
+ // 将 props.formItems 按 break 划分成章节
81
+ const prepareFormItems = () => {
82
+ let chapter = [] //存储章节的数组
83
+ const formItems = cloneDeep(props.formItems)
84
+ for (let i = 0; i < formItems.length; i += 1) {
85
+ const item = formItems[i] // 这个是用于渲染的配置
86
+ item.defaultSlots = {
87
+ label: () => (
88
+ <span style={{ marginBottom: "10px" }}>
89
+ {i + 1}.{item.title}
90
+ </span>
91
+ ),
92
+ }
93
+ if (item.break) {
94
+ if (chapter.length) {
95
+ state.formChapters.push(chapter)
96
+ }
97
+ delete item.break
98
+ chapter = [item]
99
+ } else {
100
+ chapter.push(item)
101
+ }
102
+
103
+ if (i === formItems.length - 1) {
104
+ state.formChapters.push(chapter)
105
+ }
106
+ }
107
+ }
108
+
109
+ watch(
110
+ () => props.formItems,
111
+ () => {
112
+ prepareFormItems()
113
+ nextTick(() => {
114
+ if (props.startChapter) {
115
+ state.currentChapter = Math.min(props.startChapter - 1, state.formChapters.length - 1)
116
+ }
117
+ })
118
+ },
119
+ { immediate: true },
120
+ )
121
+
122
+ const onBeforeSubmit = ({ formatForm }) => {
123
+ let data = { slug: props.slug, answers: formatForm }
124
+ if (props.beforeSubmit) {
125
+ return props.beforeSubmit(data)
126
+ }
127
+ return data
128
+ }
129
+
130
+ const onAfterSubmit = (res) => {
131
+ useProcessStatusSuccess(res, () => {
132
+ state.currentChapter += 1
133
+ if (state.currentChapter === state.formChapters.length) {
134
+ state.currentStep = "outro"
135
+ }
136
+ })
137
+ }
138
+
139
+ const onFinish = () => {
140
+ emit("finish")
141
+ }
142
+
143
+ const progressElem = () => {
144
+ return state.formChapters.length <= 1 || state.currentStep !== "form" ? null : (
145
+ <div class={`ex-survey__progress`}>
146
+ <Progress showPivot={false} percentage={progress.value}></Progress>
147
+ </div>
148
+ )
149
+ }
150
+
151
+ const introElem = () =>
152
+ (props.title || props.intro) && state.currentStep === "intro" ? (
153
+ <div class={`ex-survey__intro`}>
154
+ {props.title ? <div class={`ex-survey__title`}>{props.title}</div> : null}
155
+ {props.intro || null}
156
+ <ExButton type={"primary"} class={"ex-survey__start-btn"} onClick={() => (state.currentStep = "form")}>
157
+ {() => "开始"}
158
+ </ExButton>
159
+ </div>
160
+ ) : null
161
+
162
+ const outroElem = () =>
163
+ props.intro && state.currentStep === "outro" ? (
164
+ <div class={`ex-survey__outro`}>
165
+ {props.outro || "谢谢您的参与,祝您有美好的一天!"}
166
+ <ExButton type={"primary"} class={"ex-survey__finish-btn"} onClick={onFinish}>
167
+ {() => "完成"}
168
+ </ExButton>
169
+ </div>
170
+ ) : null
171
+
172
+ const formElem = () => {
173
+ return state.currentStep === "form" ? (
174
+ <div class={`ex-survey__form`}>
175
+ <ExForm
176
+ form={state.formChapters[state.currentChapter]}
177
+ labelWidth={"100%"}
178
+ fixed={true}
179
+ submitUrl={props.submitUrl}
180
+ closable={!isLastChapter.value && state.currentChapter !== 0}
181
+ close={() => (state.currentChapter -= 1)}
182
+ cancelButtonText={"上一步"}
183
+ submitButtonText={"确定"}
184
+ beforeSubmit={onBeforeSubmit}
185
+ afterSubmit={onAfterSubmit}
186
+ ></ExForm>
187
+ </div>
188
+ ) : null
189
+ }
190
+
191
+ return () => <div class={`ex-survey`}>{[introElem(), progressElem(), formElem(), outroElem()]}</div>
192
+ },
193
+ })
@@ -1,5 +1,5 @@
1
- import _ExSurvey from "./ExSurvey.jsx"
2
- import withInstall from "../../utils/withInstall"
3
-
4
- export const ExSurvey = withInstall(_ExSurvey)
5
- export default ExSurvey
1
+ import _ExSurvey from "./ExSurvey.jsx"
2
+ import withInstall from "../../utils/withInstall"
3
+
4
+ export const ExSurvey = withInstall(_ExSurvey)
5
+ export default ExSurvey
@@ -1,37 +1,37 @@
1
- .ex-survey {
2
- .ex-survey__progress {
3
- position: fixed;
4
- top: 0;
5
- left: 0;
6
- right: 0;
7
- }
8
-
9
- .ex-survey__order {
10
- font-weight: bold;
11
- }
12
-
13
-
14
- .ex-survey__intro, .ex-survey__outro {
15
- background: #FFF;
16
- font-size: var(--van-font-size-md);
17
- margin: var(--van-padding-md);
18
- padding: 48px var(--van-padding-md);
19
- border-radius: var(--van-radius-lg, 8px);
20
-
21
- .ex-survey__title {
22
- text-align: center;
23
- font-size: var(--van-font-size-lg);
24
- font-weight: bold;
25
- margin-bottom: 48px;
26
- }
27
-
28
- .ex-survey__start-btn, .ex-survey__finish-btn {
29
- margin-top: var(--van-padding-xl);
30
- }
31
- }
32
-
33
- .ex-survey__form {
34
- margin-top: 5px;
35
- margin-bottom: 100px;
36
- }
1
+ .ex-survey {
2
+ .ex-survey__progress {
3
+ position: fixed;
4
+ top: 0;
5
+ left: 0;
6
+ right: 0;
7
+ }
8
+
9
+ .ex-survey__order {
10
+ font-weight: bold;
11
+ }
12
+
13
+
14
+ .ex-survey__intro, .ex-survey__outro {
15
+ background: #FFF;
16
+ font-size: var(--van-font-size-md);
17
+ margin: var(--van-padding-md);
18
+ padding: 48px var(--van-padding-md);
19
+ border-radius: var(--van-radius-lg, 8px);
20
+
21
+ .ex-survey__title {
22
+ text-align: center;
23
+ font-size: var(--van-font-size-lg);
24
+ font-weight: bold;
25
+ margin-bottom: 48px;
26
+ }
27
+
28
+ .ex-survey__start-btn, .ex-survey__finish-btn {
29
+ margin-top: var(--van-padding-xl);
30
+ }
31
+ }
32
+
33
+ .ex-survey__form {
34
+ margin-top: 5px;
35
+ margin-bottom: 100px;
36
+ }
37
37
  }