@fecp/designer 5.5.100 → 5.5.102

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 (75) hide show
  1. package/es/designer/package.json.mjs +1 -1
  2. package/es/designer/src/packages/dialog/useDialogDialog.mjs +1 -1
  3. package/es/designer/src/packages/dialogGlobal/useDialogGlobalDialog.mjs +1 -1
  4. package/es/designer/src/packages/form/property/widgets.vue.mjs +2 -2
  5. package/es/designer.css +436 -125
  6. package/es/packages/mobile/index.mjs +4 -0
  7. package/es/packages/mobile/src/components/all.mjs +4 -0
  8. package/es/packages/mobile/src/components/custom/appDetail/AppDetail.vue.mjs +69 -9
  9. package/es/packages/mobile/src/components/custom/approvalBar/ApprovalBar.vue.mjs +191 -0
  10. package/es/packages/mobile/src/components/custom/approvalBar/index.mjs +10 -0
  11. package/es/packages/mobile/src/components/custom/approvalList/ApprovalList.vue.mjs +391 -0
  12. package/es/packages/mobile/src/components/custom/approvalList/index.mjs +10 -0
  13. package/es/packages/mobile/src/components/dataDisplay/cardList/CardList.vue.mjs +2 -18
  14. package/es/packages/mobile/src/components/dataDisplay/table/Table.vue.mjs +43 -11
  15. package/es/packages/mobile/src/components/form/field/Field.vue.mjs +38 -26
  16. package/es/packages/mobile/src/components/form/fieldArea/FieldArea.vue.mjs +4 -2
  17. package/es/packages/mobile/src/components/form/fieldCalendarPicker/FieldCalendarPicker.vue.mjs +1 -1
  18. package/es/packages/mobile/src/components/form/fieldCascaderPicker/fieldCascaderPicker.vue.mjs +1 -1
  19. package/es/packages/mobile/src/components/form/fieldDatePicker/FieldDatePicker.vue.mjs +1 -1
  20. package/es/packages/mobile/src/components/form/fieldDateTimePicker/FieldDateTimePicker.vue.mjs +1 -1
  21. package/es/packages/mobile/src/components/form/fieldIndustry/FieldIndustry.vue.mjs +38 -27
  22. package/es/packages/mobile/src/components/form/fieldPicker/FieldPicker.vue.mjs +58 -41
  23. package/es/packages/mobile/src/components/form/fieldTimePicker/FieldTimePicker.vue.mjs +1 -1
  24. package/es/packages/mobile/src/components/navigation/tabs/Tabs.vue.mjs +34 -5
  25. package/es/packages/mobile/src/composables/usePageEvents.mjs +80 -0
  26. package/es/packages/mobile/src/index.vue.mjs +11 -21
  27. package/es/packages/mobile/src/page.vue.mjs +152 -12
  28. package/es/packages/mobile/src/utils/common.mjs +15 -0
  29. package/es/packages/mobile/src/utils/datasource.mjs +12 -1
  30. package/es/packages/mobile/src/utils/eventFlow/actionHandlers.mjs +852 -0
  31. package/es/packages/mobile/src/utils/eventFlow/eventFlowHandler.mjs +94 -0
  32. package/es/packages/mobile/src/utils/eventFlowParser.mjs +396 -0
  33. package/es/packages/mobile/src/utils/formatterUtil.mjs +1 -0
  34. package/es/packages/mobile/src/utils/parseFilterConfig.mjs +98 -0
  35. package/es/packages/vue/src/components/forms/form/Form.vue.mjs +1 -1
  36. package/es/packages/vue/src/components/forms/subTable/SubTable.vue.mjs +8 -7
  37. package/es/packages/vue/src/components/table/Table.vue.mjs +11 -1
  38. package/lib/designer/package.json.js +1 -1
  39. package/lib/designer/src/packages/dialog/useDialogDialog.js +1 -1
  40. package/lib/designer/src/packages/dialogGlobal/useDialogGlobalDialog.js +1 -1
  41. package/lib/designer/src/packages/form/property/widgets.vue.js +2 -2
  42. package/lib/designer.css +436 -125
  43. package/lib/packages/mobile/index.js +6 -2
  44. package/lib/packages/mobile/src/components/all.js +4 -0
  45. package/lib/packages/mobile/src/components/custom/appDetail/AppDetail.vue.js +68 -8
  46. package/lib/packages/mobile/src/components/custom/approvalBar/ApprovalBar.vue.js +191 -0
  47. package/lib/packages/mobile/src/components/custom/approvalBar/index.js +10 -0
  48. package/lib/packages/mobile/src/components/custom/approvalList/ApprovalList.vue.js +391 -0
  49. package/lib/packages/mobile/src/components/custom/approvalList/index.js +10 -0
  50. package/lib/packages/mobile/src/components/dataDisplay/cardList/CardList.vue.js +2 -18
  51. package/lib/packages/mobile/src/components/dataDisplay/table/Table.vue.js +43 -11
  52. package/lib/packages/mobile/src/components/form/field/Field.vue.js +37 -25
  53. package/lib/packages/mobile/src/components/form/fieldArea/FieldArea.vue.js +4 -2
  54. package/lib/packages/mobile/src/components/form/fieldCalendarPicker/FieldCalendarPicker.vue.js +1 -1
  55. package/lib/packages/mobile/src/components/form/fieldCascaderPicker/fieldCascaderPicker.vue.js +1 -1
  56. package/lib/packages/mobile/src/components/form/fieldDatePicker/FieldDatePicker.vue.js +1 -1
  57. package/lib/packages/mobile/src/components/form/fieldDateTimePicker/FieldDateTimePicker.vue.js +1 -1
  58. package/lib/packages/mobile/src/components/form/fieldIndustry/FieldIndustry.vue.js +37 -26
  59. package/lib/packages/mobile/src/components/form/fieldPicker/FieldPicker.vue.js +57 -40
  60. package/lib/packages/mobile/src/components/form/fieldTimePicker/FieldTimePicker.vue.js +1 -1
  61. package/lib/packages/mobile/src/components/navigation/tabs/Tabs.vue.js +33 -4
  62. package/lib/packages/mobile/src/composables/usePageEvents.js +80 -0
  63. package/lib/packages/mobile/src/index.vue.js +11 -21
  64. package/lib/packages/mobile/src/page.vue.js +151 -11
  65. package/lib/packages/mobile/src/utils/common.js +15 -0
  66. package/lib/packages/mobile/src/utils/datasource.js +14 -3
  67. package/lib/packages/mobile/src/utils/eventFlow/actionHandlers.js +852 -0
  68. package/lib/packages/mobile/src/utils/eventFlow/eventFlowHandler.js +94 -0
  69. package/lib/packages/mobile/src/utils/eventFlowParser.js +396 -0
  70. package/lib/packages/mobile/src/utils/formatterUtil.js +1 -0
  71. package/lib/packages/mobile/src/utils/parseFilterConfig.js +98 -0
  72. package/lib/packages/vue/src/components/forms/form/Form.vue.js +1 -1
  73. package/lib/packages/vue/src/components/forms/subTable/SubTable.vue.js +7 -6
  74. package/lib/packages/vue/src/components/table/Table.vue.js +11 -1
  75. package/package.json +1 -1
@@ -3,7 +3,7 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
3
3
  const all = require("./src/components/all.js");
4
4
  require("./node_modules/@vant/touch-emulator/dist/index.js");
5
5
  ;/* empty css */
6
- const index$16 = ;/* empty css */
6
+ const index$18 = ;/* empty css */
7
7
  const index$1 = require("./src/components/base/button/index.js");
8
8
  const index$2 = require("./src/components/base/icon/index.js");
9
9
  const index$3 = require("./src/components/base/cell/index.js");
@@ -73,6 +73,8 @@ const index$12 = require("./src/components/navigation/treeSelect/index.js");
73
73
  const index$13 = require("./src/components/layout/layout/index.js");
74
74
  const index$14 = require("./src/components/custom/timeLineFilter/index.js");
75
75
  const index$15 = require("./src/components/custom/appDetail/index.js");
76
+ const index$16 = require("./src/components/custom/approvalBar/index.js");
77
+ const index$17 = require("./src/components/custom/approvalList/index.js");
76
78
  const functionCall = require("./node_modules/vant/es/dialog/function-call.js");
77
79
  const functionCall$1 = require("./node_modules/vant/es/image-preview/function-call.js");
78
80
  const functionCall$2 = require("./node_modules/vant/es/notify/function-call.js");
@@ -82,7 +84,7 @@ const index = {
82
84
  for (let c in all) {
83
85
  app.use(all[c]);
84
86
  }
85
- app.component("FecMobileApp", index$16.default);
87
+ app.component("FecMobileApp", index$18.default);
86
88
  }
87
89
  };
88
90
  exports.MobileButton = index$1.MobileButton;
@@ -154,6 +156,8 @@ exports.MobileTreeSelect = index$12.MobileTreeSelect;
154
156
  exports.MobileLayout = index$13.MobileLayout;
155
157
  exports.MobileTimeLineFilter = index$14.MobileTimeLineFilter;
156
158
  exports.MobileAppDetail = index$15.MobileAppDetail;
159
+ exports.MobileApprovalBar = index$16.MobileApprovalBar;
160
+ exports.MobileApprovalList = index$17.MobileApprovalList;
157
161
  exports.closeDialog = functionCall.closeDialog;
158
162
  exports.showConfirmDialog = functionCall.showConfirmDialog;
159
163
  exports.showDialog = functionCall.showDialog;
@@ -69,6 +69,8 @@ const index$11 = require("./navigation/treeSelect/index.js");
69
69
  const index$12 = require("./layout/layout/index.js");
70
70
  const index$13 = require("./custom/timeLineFilter/index.js");
71
71
  const index$14 = require("./custom/appDetail/index.js");
72
+ const index$15 = require("./custom/approvalBar/index.js");
73
+ const index$16 = require("./custom/approvalList/index.js");
72
74
  exports.MobileButton = index.MobileButton;
73
75
  exports.MobileIcon = index$1.MobileIcon;
74
76
  exports.MobileCell = index$2.MobileCell;
@@ -138,3 +140,5 @@ exports.MobileTreeSelect = index$11.MobileTreeSelect;
138
140
  exports.MobileLayout = index$12.MobileLayout;
139
141
  exports.MobileTimeLineFilter = index$13.MobileTimeLineFilter;
140
142
  exports.MobileAppDetail = index$14.MobileAppDetail;
143
+ exports.MobileApprovalBar = index$15.MobileApprovalBar;
144
+ exports.MobileApprovalList = index$16.MobileApprovalList;
@@ -6,27 +6,87 @@ const _pluginVue_exportHelper = require("../../../../../../_virtual/_plugin-vue_
6
6
  const _sfc_main = {
7
7
  __name: "AppDetail",
8
8
  props: {
9
- //任务对象+流程变量
9
+ params: {
10
+ type: Object,
11
+ default: {}
12
+ },
13
+ baseInfoPageSource: {
14
+ type: String,
15
+ default: "dynamic"
16
+ },
17
+ baseInfoPageId: {
18
+ type: String,
19
+ default: ""
20
+ },
10
21
  options: {
11
22
  type: Array,
12
23
  default: []
24
+ },
25
+ document: {
26
+ type: Boolean,
27
+ default: false
28
+ },
29
+ approvalHistory: {
30
+ type: Boolean,
31
+ default: false
32
+ },
33
+ actionBar: {
34
+ type: Object
35
+ },
36
+ taskId: {
37
+ type: String,
38
+ default: ""
39
+ },
40
+ taskType: {
41
+ type: String,
42
+ default: ""
13
43
  }
14
44
  },
15
45
  setup(__props) {
16
46
  const props = __props;
47
+ const currentInstance = Vue.getCurrentInstance();
48
+ const ctx = currentInstance.proxy;
49
+ ctx.route;
50
+ const activeName = Vue.ref("tab_base_info");
51
+ const baseInfoPageId = Vue.ref("");
52
+ if (props.baseInfoPageSource == "dynamic") ;
53
+ else {
54
+ baseInfoPageId.value = props.baseInfoPageId;
55
+ }
17
56
  const tabsOptions = Vue.computed(() => {
18
- return [
19
- { id: "tab_base_info", title: "基本信息" },
20
- ...props.options || [],
21
- { id: "tab_doc_info", title: "要件信息" },
22
- { id: "tab_timeline_info", title: "审批历史" }
57
+ const tabs = [
58
+ {
59
+ id: "tab_base_info",
60
+ title: "基本信息",
61
+ pageId: baseInfoPageId.value
62
+ },
63
+ ...props.options || []
23
64
  ];
65
+ if (props.document) {
66
+ tabs.push({ id: "tab_doc_info", title: "要件信息" });
67
+ }
68
+ if (props.approvalHistory) {
69
+ tabs.push({ id: "tab_timeline_info", title: "审批历史" });
70
+ }
71
+ return tabs;
72
+ });
73
+ Vue.computed(() => {
74
+ return tabsOptions.value.find((item) => item.id == activeName.value);
24
75
  });
25
76
  return (_ctx, _cache) => {
26
77
  const _component_FecMobileTabs = Vue.resolveComponent("FecMobileTabs");
27
- return Vue.openBlock(), Vue.createBlock(_component_FecMobileTabs, { options: Vue.unref(tabsOptions) }, null, 8, ["options"]);
78
+ const _component_FecMobileApprovalBar = Vue.resolveComponent("FecMobileApprovalBar");
79
+ return Vue.openBlock(), Vue.createElementBlock(Vue.Fragment, null, [
80
+ Vue.createVNode(_component_FecMobileTabs, {
81
+ modelValue: Vue.unref(activeName),
82
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => Vue.isRef(activeName) ? activeName.value = $event : null),
83
+ options: Vue.unref(tabsOptions),
84
+ params: __props.params
85
+ }, null, 8, ["modelValue", "options", "params"]),
86
+ __props.actionBar ? (Vue.openBlock(), Vue.createBlock(_component_FecMobileApprovalBar, Vue.normalizeProps(Vue.mergeProps({ key: 0 }, __props.actionBar)), null, 16)) : Vue.createCommentVNode("", true)
87
+ ], 64);
28
88
  };
29
89
  }
30
90
  };
31
- const _AppDetail = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-8844ccf3"]]);
91
+ const _AppDetail = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-ab2095bf"]]);
32
92
  exports.default = _AppDetail;
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ ;/* empty css */
4
+ ;/* empty css */
5
+ ;/* empty css */
6
+ ;/* empty css */
7
+ ;/* empty css */
8
+ ;/* empty css */
9
+ ;/* empty css */
10
+ ;/* empty css */
11
+ ;/* empty css */
12
+ ;/* empty css */
13
+ ;/* empty css */
14
+ ;/* empty css */
15
+ ;/* empty css */
16
+ ;/* empty css */
17
+ ;/* empty css */
18
+ ;/* empty css */
19
+ ;/* empty css */
20
+ ;/* empty css */
21
+ const Vue = require("vue");
22
+ ;/* empty css */
23
+ const _pluginVue_exportHelper = require("../../../../../../_virtual/_plugin-vue_export-helper.js");
24
+ const index = require("../../../../node_modules/vant/es/action-bar/index.js");
25
+ const index$1 = require("../../../../node_modules/vant/es/action-bar-button/index.js");
26
+ const index$2 = require("../../../../node_modules/vant/es/popup/index.js");
27
+ const index$3 = require("../../../../node_modules/vant/es/field/index.js");
28
+ const index$4 = require("../../../../node_modules/vant/es/picker/index.js");
29
+ const _hoisted_1 = { class: "appPopContent" };
30
+ const _hoisted_2 = { class: "appOptContent" };
31
+ const _sfc_main = {
32
+ __name: "ApprovalBar",
33
+ props: {
34
+ actionBarOptions: {
35
+ type: Array,
36
+ default: []
37
+ }
38
+ },
39
+ setup(__props) {
40
+ const showAgreePop = Vue.ref(false);
41
+ const showOtherPop = Vue.ref(false);
42
+ const showOpinionPicker = Vue.ref(false);
43
+ const showTargetNodePicker = Vue.ref(false);
44
+ const currentActionItem = Vue.ref({});
45
+ const opinionForm = Vue.reactive({
46
+ opinionType: "",
47
+ opinionContent: "",
48
+ targetNode: ""
49
+ });
50
+ function clickHandler(item) {
51
+ console.log("🚀 ~ clickHandler ~ item:", item);
52
+ if (item.approvalType == "agree") {
53
+ showAgreePop.value = true;
54
+ } else if (item.approvalType == "other") {
55
+ currentActionItem.value = item;
56
+ opinionForm.opinionType = "";
57
+ opinionForm.opinionContent = "";
58
+ opinionForm.targetNode = "";
59
+ showOtherPop.value = true;
60
+ }
61
+ }
62
+ function onOpinionConfirm({ selectedOptions }) {
63
+ var _a;
64
+ opinionForm.opinionType = ((_a = selectedOptions[0]) == null ? void 0 : _a.value) || "";
65
+ showOpinionPicker.value = false;
66
+ }
67
+ function onTargetNodeConfirm({ selectedOptions }) {
68
+ var _a;
69
+ opinionForm.targetNode = ((_a = selectedOptions[0]) == null ? void 0 : _a.value) || "";
70
+ showTargetNodePicker.value = false;
71
+ }
72
+ function submitOpinion() {
73
+ console.log("提交审批意见:", opinionForm);
74
+ showOtherPop.value = false;
75
+ }
76
+ return (_ctx, _cache) => {
77
+ const _component_van_action_bar_button = index$1.ActionBarButton;
78
+ const _component_van_action_bar = index.ActionBar;
79
+ const _component_van_popup = index$2.Popup;
80
+ const _component_van_field = index$3.Field;
81
+ const _component_van_picker = index$4.Picker;
82
+ return Vue.openBlock(), Vue.createElementBlock(Vue.Fragment, null, [
83
+ Vue.createVNode(_component_van_action_bar, { "safe-area-inset-bottom": "" }, {
84
+ default: Vue.withCtx(() => [
85
+ (Vue.openBlock(true), Vue.createElementBlock(Vue.Fragment, null, Vue.renderList(__props.actionBarOptions, (item) => {
86
+ return Vue.openBlock(), Vue.createBlock(_component_van_action_bar_button, {
87
+ class: Vue.normalizeClass(item.bgClass || "icon-blue"),
88
+ text: item.text,
89
+ onClick: ($event) => clickHandler(item)
90
+ }, null, 8, ["class", "text", "onClick"]);
91
+ }), 256))
92
+ ]),
93
+ _: 1
94
+ }),
95
+ Vue.createVNode(_component_van_popup, {
96
+ show: Vue.unref(showAgreePop),
97
+ "onUpdate:show": _cache[0] || (_cache[0] = ($event) => Vue.isRef(showAgreePop) ? showAgreePop.value = $event : null),
98
+ round: "",
99
+ position: "bottom",
100
+ style: { height: "30%" }
101
+ }, null, 8, ["show"]),
102
+ Vue.createVNode(_component_van_popup, {
103
+ show: Vue.unref(showOtherPop),
104
+ "onUpdate:show": _cache[6] || (_cache[6] = ($event) => Vue.isRef(showOtherPop) ? showOtherPop.value = $event : null),
105
+ round: "",
106
+ position: "bottom"
107
+ }, {
108
+ default: Vue.withCtx(() => [
109
+ Vue.createElementVNode("div", _hoisted_1, [
110
+ Vue.createElementVNode("div", _hoisted_2, [
111
+ Vue.createVNode(_component_van_field, {
112
+ modelValue: Vue.unref(currentActionItem).opinionType,
113
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => Vue.unref(currentActionItem).opinionType = $event),
114
+ "is-link": "",
115
+ readonly: "",
116
+ label: "审批意见",
117
+ placeholder: "请选择审批意见",
118
+ onClick: _cache[2] || (_cache[2] = ($event) => showOpinionPicker.value = true)
119
+ }, null, 8, ["modelValue"]),
120
+ Vue.unref(currentActionItem).needTargetNode ? (Vue.openBlock(), Vue.createBlock(_component_van_field, {
121
+ key: 0,
122
+ modelValue: Vue.unref(opinionForm).targetNode,
123
+ "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => Vue.unref(opinionForm).targetNode = $event),
124
+ "is-link": "",
125
+ readonly: "",
126
+ label: "目标节点",
127
+ placeholder: "请选择目标节点",
128
+ onClick: _cache[4] || (_cache[4] = ($event) => showTargetNodePicker.value = true)
129
+ }, null, 8, ["modelValue"])) : Vue.createCommentVNode("", true),
130
+ Vue.createVNode(_component_van_field, {
131
+ modelValue: Vue.unref(opinionForm).opinionContent,
132
+ "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => Vue.unref(opinionForm).opinionContent = $event),
133
+ rows: "6",
134
+ autosize: "",
135
+ label: "意见内容",
136
+ type: "textarea",
137
+ maxlength: "500",
138
+ "show-word-limit": "",
139
+ placeholder: "请输入审批意见"
140
+ }, null, 8, ["modelValue"])
141
+ ]),
142
+ Vue.createVNode(_component_van_action_bar, { "safe-area-inset-bottom": "" }, {
143
+ default: Vue.withCtx(() => [
144
+ Vue.createVNode(_component_van_action_bar_button, {
145
+ class: Vue.normalizeClass("icon-blue"),
146
+ text: "提交",
147
+ onClick: submitOpinion
148
+ })
149
+ ]),
150
+ _: 1
151
+ })
152
+ ])
153
+ ]),
154
+ _: 1
155
+ }, 8, ["show"]),
156
+ Vue.createVNode(_component_van_popup, {
157
+ show: Vue.unref(showOpinionPicker),
158
+ "onUpdate:show": _cache[8] || (_cache[8] = ($event) => Vue.isRef(showOpinionPicker) ? showOpinionPicker.value = $event : null),
159
+ round: "",
160
+ position: "bottom"
161
+ }, {
162
+ default: Vue.withCtx(() => [
163
+ Vue.createVNode(_component_van_picker, {
164
+ columns: Vue.unref(currentActionItem).opinionOptions || [],
165
+ onConfirm: onOpinionConfirm,
166
+ onCancel: _cache[7] || (_cache[7] = ($event) => showOpinionPicker.value = false)
167
+ }, null, 8, ["columns"])
168
+ ]),
169
+ _: 1
170
+ }, 8, ["show"]),
171
+ Vue.createVNode(_component_van_popup, {
172
+ show: Vue.unref(showTargetNodePicker),
173
+ "onUpdate:show": _cache[10] || (_cache[10] = ($event) => Vue.isRef(showTargetNodePicker) ? showTargetNodePicker.value = $event : null),
174
+ round: "",
175
+ position: "bottom"
176
+ }, {
177
+ default: Vue.withCtx(() => [
178
+ Vue.createVNode(_component_van_picker, {
179
+ columns: Vue.unref(currentActionItem).targetNodeOptions || [],
180
+ onConfirm: onTargetNodeConfirm,
181
+ onCancel: _cache[9] || (_cache[9] = ($event) => showTargetNodePicker.value = false)
182
+ }, null, 8, ["columns"])
183
+ ]),
184
+ _: 1
185
+ }, 8, ["show"])
186
+ ], 64);
187
+ };
188
+ }
189
+ };
190
+ const _ApprovalBar = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-fc8cdb72"]]);
191
+ exports.default = _ApprovalBar;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const ApprovalBar = require("./ApprovalBar.vue.js");
4
+ const install = require("../../../utils/install.js");
5
+ const MobileApprovalBar = install.default.withInstall(
6
+ "MobileApprovalBar",
7
+ ApprovalBar.default
8
+ );
9
+ exports.MobileApprovalBar = MobileApprovalBar;
10
+ exports.default = MobileApprovalBar;