@cgboiler/biz-mobile 1.17.5 → 1.17.7

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.
package/es/index.d.ts CHANGED
@@ -7,7 +7,7 @@ declare namespace _default {
7
7
  }
8
8
  export default _default;
9
9
  export function install(app: any): void;
10
- export const version: "1.17.4";
10
+ export const version: "1.17.6";
11
11
  import MdPreview from './md-preview';
12
12
  import OrgPicker from './org-picker';
13
13
  import ProjectSelect from './project-select';
package/es/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import MdPreview from "./md-preview";
2
2
  import OrgPicker from "./org-picker";
3
3
  import ProjectSelect from "./project-select";
4
- const version = "1.17.4";
4
+ const version = "1.17.6";
5
5
  function install(app) {
6
6
  const components = [
7
7
  MdPreview,
@@ -1 +1 @@
1
- .katex-block{display:block;margin:1em 0;text-align:center;overflow-x:auto;overflow-y:hidden}.cgx-markdown-preview .diff-container{border:1px solid #ebeef5;border-radius:4px;overflow:auto}.cgx-markdown-preview .diff-equal{color:#606266}.cgx-markdown-preview .diff-delete{background-color:#ffeef0;color:#f56c6c;text-decoration:line-through}.cgx-markdown-preview .diff-insert{background-color:#e6ffec;color:#67c23a}.cgx-markdown-preview .diff-unified-view pre{margin:0;padding:8px;white-space:pre-wrap;word-break:break-word}.cgx-markdown-preview{line-height:1.6;font-size:var(--font-base, 16px)}.cgx-markdown-preview ol{list-style:auto}.cgx-markdown-preview ul{list-style:disc}.cgx-markdown-preview ol,.cgx-markdown-preview ul{padding-left:2em;margin:0 0 12px}.cgx-markdown-preview li::marker{text-align:start!important}.cgx-markdown-preview h1{font-size:2em;font-weight:700;margin:16px 0}.cgx-markdown-preview h2{font-size:1.5em;font-weight:700;margin:14px 0}.cgx-markdown-preview p{margin:12px 0}.cgx-markdown-preview blockquote{margin:0;padding-left:1em;border-left:4px solid #ddd;color:#666}.cgx-markdown-preview table{border-collapse:collapse;width:100%;margin-bottom:16px}.cgx-markdown-preview th,.cgx-markdown-preview td{border:1px solid #ddd;padding:8px;text-align:left}.cgx-markdown-preview th{background-color:#f6f8fa}
1
+ .katex-block{display:block;margin:1em 0;text-align:center;overflow-x:auto;overflow-y:hidden}.cgx-markdown-preview .diff-container{border:1px solid #ebeef5;border-radius:4px;overflow:auto}.cgx-markdown-preview .diff-equal{color:#606266}.cgx-markdown-preview .diff-delete{background-color:#ffeef0;color:#f56c6c;text-decoration:line-through}.cgx-markdown-preview .diff-insert{background-color:#e6ffec;color:#67c23a}.cgx-markdown-preview .diff-unified-view pre{margin:0;padding:8px;white-space:pre-wrap;word-break:break-word}.cgx-markdown-preview{line-height:1.6;font-size:var(--font-base, 16px)}.cgx-markdown-preview ol{list-style:auto}.cgx-markdown-preview ul{list-style:disc}.cgx-markdown-preview ol,.cgx-markdown-preview ul{padding-left:1.5em;margin:0 0 12px}.cgx-markdown-preview li::marker{text-align:start!important}.cgx-markdown-preview h1{font-size:2em;font-weight:700;margin:16px 0}.cgx-markdown-preview h2{font-size:1.5em;font-weight:700;margin:14px 0}.cgx-markdown-preview p{margin:12px 0}.cgx-markdown-preview blockquote{margin:0;padding-left:1em;border-left:4px solid #ddd;color:#666}.cgx-markdown-preview table{border-collapse:collapse;width:100%;margin-bottom:16px}.cgx-markdown-preview th,.cgx-markdown-preview td{border:1px solid #ddd;padding:8px;text-align:left}.cgx-markdown-preview th{background-color:#f6f8fa}
@@ -51,7 +51,7 @@
51
51
 
52
52
  ol,
53
53
  ul {
54
- padding-left: 2em;
54
+ padding-left: 1.5em;
55
55
  margin: 0 0 12px 0;
56
56
  }
57
57
 
@@ -18,14 +18,15 @@ var __async = (__this, __arguments, generator) => {
18
18
  step((generator = generator.apply(__this, __arguments)).next());
19
19
  });
20
20
  };
21
- import { createVNode as _createVNode, createTextVNode as _createTextVNode } from "vue";
21
+ import { createVNode as _createVNode, createTextVNode as _createTextVNode, Fragment as _Fragment } from "vue";
22
22
  import "./_atomic.css";
23
23
  import { defineComponent, ref, computed, watch, nextTick } from "vue";
24
- import { ActionSheet, Search, List, Image, Empty } from "vant";
24
+ import { ActionSheet, Search, List, Image, Empty, Tabs, Tab } from "vant";
25
25
  import DeptImg from "./components/DeptImg";
26
26
  import { orgPickerProps } from "./types";
27
27
  import { useApi } from "./useApi";
28
28
  import "./index.css";
29
+ import { watchEffect, h } from "vue";
29
30
  var stdin_default = defineComponent({
30
31
  name: "OrgPicker",
31
32
  props: orgPickerProps,
@@ -39,9 +40,12 @@ var stdin_default = defineComponent({
39
40
  currentDeptId,
40
41
  deptPath,
41
42
  searchOrgList,
42
- userList
43
+ userList,
44
+ getRecentSelectedUsers,
45
+ setRecentSelectedUsers
43
46
  } = useApi();
44
47
  getOrgList();
48
+ const activeTab = ref("zjxz");
45
49
  const selectedItems = ref([]);
46
50
  watch(() => props.modelValue, (newValue) => {
47
51
  var _a;
@@ -73,16 +77,37 @@ var stdin_default = defineComponent({
73
77
  selectedItems.value = [item];
74
78
  emit("update:modelValue", [item.id]);
75
79
  emit("update:show", false);
80
+ setRecentSelectedUsers(selectedItems.value);
76
81
  }
77
82
  };
83
+ const handleHistorySelect = (item) => {
84
+ selectedItems.value = item.selectedUsers;
85
+ };
78
86
  const handleConfirm = () => {
79
87
  emit("update:show", false);
80
88
  emit("update:modelValue", selectedItems.value.map((item) => item.id));
89
+ setRecentSelectedUsers(selectedItems.value);
81
90
  };
82
91
  const keyword = ref("");
83
92
  const loading = ref(false);
84
93
  const finished = ref(true);
85
94
  const searchRef = ref();
95
+ const recentSelectedHistory = ref([]);
96
+ const filterRecentSelectedHistory = ref([]);
97
+ watchEffect(() => {
98
+ if (activeTab.value === "zjxz") {
99
+ recentSelectedHistory.value = getRecentSelectedUsers();
100
+ }
101
+ });
102
+ watchEffect(() => {
103
+ if (activeTab.value === "zjxz") {
104
+ if (keyword.value) {
105
+ filterRecentSelectedHistory.value = recentSelectedHistory.value.filter((item) => item.selectedUsers.some((user) => keyword.value.split("").some((char) => user.name.includes(char))));
106
+ } else {
107
+ filterRecentSelectedHistory.value = recentSelectedHistory.value;
108
+ }
109
+ }
110
+ });
86
111
  watch(() => props.show, (newVal) => __async(this, null, function* () {
87
112
  if (newVal && props.autoFocus) {
88
113
  yield nextTick();
@@ -113,6 +138,15 @@ var stdin_default = defineComponent({
113
138
  const onLoad = () => {
114
139
  finished.value = true;
115
140
  };
141
+ const highlightText = (text, keyword2) => {
142
+ if (!keyword2) {
143
+ return text;
144
+ }
145
+ const keywordChars = keyword2.split("");
146
+ return Array.from(text).map((char, index) => keywordChars.some((kChar) => char.toLowerCase() === kChar.toLowerCase()) ? h("span", {
147
+ class: "highlight"
148
+ }, char) : char);
149
+ };
116
150
  return () => _createVNode(ActionSheet, {
117
151
  "show": props.show,
118
152
  "onUpdate:show": (val) => emit("update:show", val),
@@ -140,7 +174,28 @@ var stdin_default = defineComponent({
140
174
  "class": "close-icon"
141
175
  }, [_createTextVNode("X")])])) : _createVNode("p", {
142
176
  "class": "color-[#aaa] text-[14px] text-center w-full leading-[38px]"
143
- }, [_createTextVNode("\u672A\u9009\u62E9\u4EBA\u5458")])]), !keyword.value && _createVNode("div", {
177
+ }, [_createTextVNode("\u672A\u9009\u62E9\u4EBA\u5458")])]), _createVNode(Tabs, {
178
+ "active": activeTab.value,
179
+ "onUpdate:active": ($event) => activeTab.value = $event
180
+ }, {
181
+ default: () => [_createVNode(Tab, {
182
+ "title": "\u6700\u8FD1\u9009\u62E9",
183
+ "name": "zjxz"
184
+ }, null), _createVNode(Tab, {
185
+ "title": "\u901A\u8BAF\u5F55",
186
+ "name": "txl"
187
+ }, null)]
188
+ }), _createVNode("div", {
189
+ "class": "org-content-wrap"
190
+ }, [activeTab.value === "zjxz" ? _createVNode("div", {
191
+ "class": "recent-list-wrap flex-1 overflow-auto px-[16px] py-[8px]"
192
+ }, [filterRecentSelectedHistory.value.length === 0 ? _createVNode(Empty, {
193
+ "description": "\u6682\u65E0\u6700\u8FD1\u9009\u62E9\u8BB0\u5F55"
194
+ }, null) : filterRecentSelectedHistory.value.map((historyItem) => _createVNode("div", {
195
+ "key": historyItem.id,
196
+ "onClick": () => handleHistorySelect(historyItem),
197
+ "class": "px-16px py-8px border-b border-[#eee]"
198
+ }, [_createVNode("span", null, [historyItem.selectedUsers.map((user) => highlightText(user.name, keyword.value)).reduce((prev, curr) => [prev, "\uFF0C", curr])])]))]) : _createVNode(_Fragment, null, [!keyword.value && _createVNode("div", {
144
199
  "class": "breadcrumb-nav"
145
200
  }, [deptPath.value.map((dept, index) => _createVNode("span", {
146
201
  "key": dept.id
@@ -174,7 +229,7 @@ var stdin_default = defineComponent({
174
229
  }, [item.name, _createVNode("span", {
175
230
  "class": "org-item-select-icon"
176
231
  }, [_createTextVNode("\u2713")])])]))]
177
- })]), props.multiple && _createVNode("div", {
232
+ })])])]), props.multiple && _createVNode("div", {
178
233
  "class": "bottom-section"
179
234
  }, [_createVNode("div", {
180
235
  "class": "action-buttons"
@@ -32,6 +32,14 @@
32
32
 
33
33
  /* layer: default */
34
34
  .cgx-atm .w-full{width:100%;}
35
+ .cgx-atm .flex-1{flex:1 1 0%;}
36
+ .cgx-atm .overflow-auto{overflow:auto;}
37
+ .cgx-atm .border-b{border-bottom-width:1px;border-bottom-style:solid;}
38
+ .cgx-atm .border-\[\#eee\]{--un-border-opacity:1;border-color:rgba(238,238,238,var(--un-border-opacity));}
39
+ .cgx-atm .px-\[16px\],
40
+ .cgx-atm .px-16px{padding-left:16px;padding-right:16px;}
41
+ .cgx-atm .py-\[8px\],
42
+ .cgx-atm .py-8px{padding-top:8px;padding-bottom:8px;}
35
43
  .cgx-atm .text-center{text-align:center;}
36
44
  .cgx-atm .text-\[14px\]{font-size:14px;}
37
45
  .cgx-atm .leading-\[38px\]{line-height:38px;}
@@ -1 +1 @@
1
- :root:root{--van-action-sheet-max-height: 100%}.org-list{height:85vh;display:flex;flex-direction:column}.org-list .breadcrumb-nav{margin-bottom:4px;padding:2px 16px;border-radius:4px;font-size:12px}.org-list .breadcrumb-nav .dept-name.current-dept{color:#969799}.org-list .breadcrumb-nav .separator{color:#969799;margin:0 4px}.org-list .search-bar{position:-webkit-sticky;position:-webkit-sticky;position:sticky;top:0;z-index:1}.org-list .org-selected-items{display:flex;flex-wrap:nowrap;padding:12px 16px;gap:12px;background-color:#fff;overflow-x:auto;height:68px;border-bottom:1px solid #eee}.org-list .org-selected-items .selected-tag{flex-shrink:0;background:none;border:none;padding:0;margin:0;position:relative}.org-list .org-selected-items .selected-tag .close-icon{position:absolute;top:0;right:0;z-index:1;background-color:#fff;border-radius:50%;border:1px solid #eee;width:10px;height:10px;display:flex;align-items:center;justify-content:center;font-size:6px;color:#969799}.org-list .org-selected-items .selected-tag .tag-avatar{width:40px;height:40px}.org-list .org-selected-items .selected-tag .tag-avatar img{border-radius:4px;border:1px solid #eee;object-fit:contain}.org-list .bottom-section{border-top:1px solid #eee;background-color:#fff}.org-list .van-list{flex:1;overflow-y:auto;padding:0 16px}.org-list .feed-list-wrap{flex:1;display:flex;overflow:hidden;position:relative;justify-content:center}.org-list .search-result-list{position:absolute;top:0;left:0;right:0;bottom:0;z-index:1;background-color:#fff;overflow-y:auto;padding:0 16px}.org-list .org-item{padding:12px 0;border-bottom:1px solid #eee;cursor:pointer;display:flex;align-items:center;gap:12px}.org-list .org-item .org-item-select-icon{display:none;padding-left:4px}.org-list .org-item.selected{color:var(--van-primary-color)}.org-list .org-item.selected .org-item-select-icon{display:inline}.org-list .org-item .org-avatar{flex-shrink:0;width:40px;height:40px;display:flex;align-items:center;justify-content:center}.org-list .org-item .org-avatar img{border-radius:4px;border:1px solid #eee;object-fit:contain}.org-list .org-item .org-name{font-size:14px;flex:1}.org-list .org-item:last-child{border-bottom:none}.org-list .action-buttons{padding:16px;display:flex;justify-content:center}.org-list .action-buttons .confirm-button{background-color:var(--van-primary-color);color:#fff;padding:10px 0;border-radius:4px;text-align:center;width:100%;font-size:14px}
1
+ :root:root{--van-action-sheet-max-height: 100%}.org-list{height:85vh;display:flex;flex-direction:column}.org-list .highlight{color:var(--van-primary-color);font-weight:700}.org-list .breadcrumb-nav{margin-bottom:4px;padding:2px 16px;border-radius:4px;font-size:12px}.org-list .breadcrumb-nav .dept-name.current-dept{color:#969799}.org-list .breadcrumb-nav .separator{color:#969799;margin:0 4px}.org-list .search-bar{position:-webkit-sticky;position:-webkit-sticky;position:sticky;top:0;z-index:1}.org-list .org-selected-items{display:flex;flex-wrap:nowrap;padding:12px 16px;gap:12px;background-color:#fff;overflow-x:auto;height:68px;border-bottom:1px solid #eee}.org-list .org-selected-items .selected-tag{flex-shrink:0;background:none;border:none;padding:0;margin:0;position:relative}.org-list .org-selected-items .selected-tag .close-icon{position:absolute;top:0;right:0;z-index:1;background-color:#fff;border-radius:50%;border:1px solid #eee;width:10px;height:10px;display:flex;align-items:center;justify-content:center;font-size:6px;color:#969799}.org-list .org-selected-items .selected-tag .tag-avatar{width:40px;height:40px}.org-list .org-selected-items .selected-tag .tag-avatar img{border-radius:4px;border:1px solid #eee;object-fit:contain}.org-list .bottom-section{border-top:1px solid #eee;background-color:#fff}.org-list .van-list{flex:1;overflow-y:auto;padding:0 16px}.org-list .org-content-wrap{flex:1;display:flex;flex-direction:column;overflow:hidden}.org-list .feed-list-wrap{flex:1;display:flex;overflow:hidden;position:relative;justify-content:center}.org-list .search-result-list{position:absolute;top:0;left:0;right:0;bottom:0;z-index:1;background-color:#fff;overflow-y:auto;padding:0 16px}.org-list .org-item{padding:12px 0;border-bottom:1px solid #eee;cursor:pointer;display:flex;align-items:center;gap:12px}.org-list .org-item .org-item-select-icon{display:none;padding-left:4px}.org-list .org-item.selected{color:var(--van-primary-color)}.org-list .org-item.selected .org-item-select-icon{display:inline}.org-list .org-item .org-avatar{flex-shrink:0;width:40px;height:40px;display:flex;align-items:center;justify-content:center}.org-list .org-item .org-avatar img{border-radius:4px;border:1px solid #eee;object-fit:contain}.org-list .org-item .org-name{font-size:14px;flex:1}.org-list .org-item:last-child{border-bottom:none}.org-list .action-buttons{padding:16px;display:flex;justify-content:center}.org-list .action-buttons .confirm-button{background-color:var(--van-primary-color);color:#fff;padding:10px 0;border-radius:4px;text-align:center;width:100%;font-size:14px}
@@ -5,6 +5,11 @@
5
5
  height: 85vh;
6
6
  display: flex;
7
7
  flex-direction: column;
8
+
9
+ .highlight {
10
+ color: var(--van-primary-color);
11
+ font-weight: bold;
12
+ }
8
13
 
9
14
  .breadcrumb-nav {
10
15
  margin-bottom: 4px;
@@ -87,6 +92,13 @@
87
92
  padding: 0 16px;
88
93
  }
89
94
 
95
+ .org-content-wrap {
96
+ flex: 1;
97
+ display: flex;
98
+ flex-direction: column;
99
+ overflow: hidden;
100
+ }
101
+
90
102
  .feed-list-wrap {
91
103
  flex: 1;
92
104
  display: flex;
@@ -31,3 +31,8 @@ export declare const orgPickerProps: {
31
31
  };
32
32
  };
33
33
  export type OrgPickerProps = ExtractPropTypes<typeof orgPickerProps>;
34
+ export interface RecentSelection {
35
+ id: string;
36
+ selectedUsers: OrgItem[];
37
+ timestamp: number;
38
+ }
@@ -1,6 +1,7 @@
1
- import { type OrgItem } from './types';
1
+ import { Ref } from 'vue';
2
+ import { type OrgItem, RecentSelection } from './types';
2
3
  export declare const useApi: () => {
3
- userList: import("vue").Ref<{
4
+ userList: Ref<{
4
5
  [x: string]: any;
5
6
  id: string | number;
6
7
  name: string;
@@ -13,7 +14,7 @@ export declare const useApi: () => {
13
14
  type: string;
14
15
  avatar?: string | undefined;
15
16
  }[]>;
16
- orgList: import("vue").Ref<{
17
+ orgList: Ref<{
17
18
  [x: string]: any;
18
19
  id: string | number;
19
20
  name: string;
@@ -27,8 +28,8 @@ export declare const useApi: () => {
27
28
  avatar?: string | undefined;
28
29
  }[]>;
29
30
  getOrgList: (deptId?: string) => Promise<void>;
30
- currentDeptId: import("vue").Ref<string, string>;
31
- deptPath: import("vue").Ref<{
31
+ currentDeptId: Ref<string, string>;
32
+ deptPath: Ref<{
32
33
  id: string | number;
33
34
  name: string;
34
35
  }[], {
@@ -39,4 +40,6 @@ export declare const useApi: () => {
39
40
  name: string;
40
41
  }[]>;
41
42
  searchOrgList: import("lodash-es").DebouncedFunc<(userName: string) => Promise<void>>;
43
+ getRecentSelectedUsers: () => RecentSelection[];
44
+ setRecentSelectedUsers: (users: OrgItem[]) => void;
42
45
  };
@@ -71,13 +71,48 @@ const useApi = () => {
71
71
  const url = `https://wflow.cgboiler.com/v1/oa/org/tree/user/search/cloud?userName=${userName}`;
72
72
  orgList.value = yield fetchData(url);
73
73
  }), 300);
74
+ const RECENT_SELECTED_USERS_KEY = "recent_selected_users_history";
75
+ const MAX_RECENT_SELECTIONS = 15;
76
+ const getRecentSelectedUsers = () => {
77
+ try {
78
+ const data = localStorage.getItem(RECENT_SELECTED_USERS_KEY);
79
+ return data ? JSON.parse(data) : [];
80
+ } catch (error) {
81
+ console.error("Failed to get recent selected users history from localStorage", error);
82
+ return [];
83
+ }
84
+ };
85
+ const setRecentSelectedUsers = (users) => {
86
+ if (!users || users.length === 0)
87
+ return;
88
+ const history = getRecentSelectedUsers();
89
+ const newSelection = {
90
+ id: Date.now().toString(),
91
+ // 使用时间戳作为唯一ID
92
+ selectedUsers: users,
93
+ timestamp: Date.now()
94
+ };
95
+ const filteredHistory = history.filter((item) => {
96
+ return !(item.selectedUsers.length === newSelection.selectedUsers.length && item.selectedUsers.every(
97
+ (user) => newSelection.selectedUsers.some((sUser) => sUser.id === user.id)
98
+ ));
99
+ });
100
+ const updatedHistory = [newSelection, ...filteredHistory].slice(0, MAX_RECENT_SELECTIONS);
101
+ try {
102
+ localStorage.setItem(RECENT_SELECTED_USERS_KEY, JSON.stringify(updatedHistory));
103
+ } catch (error) {
104
+ console.error("Failed to set recent selected users history to localStorage", error);
105
+ }
106
+ };
74
107
  return {
75
108
  userList,
76
109
  orgList,
77
110
  getOrgList,
78
111
  currentDeptId,
79
112
  deptPath,
80
- searchOrgList
113
+ searchOrgList,
114
+ getRecentSelectedUsers,
115
+ setRecentSelectedUsers
81
116
  };
82
117
  };
83
118
  export {
package/lib/index.d.ts CHANGED
@@ -7,7 +7,7 @@ declare namespace _default {
7
7
  }
8
8
  export default _default;
9
9
  export function install(app: any): void;
10
- export const version: "1.17.4";
10
+ export const version: "1.17.6";
11
11
  import MdPreview from './md-preview';
12
12
  import OrgPicker from './org-picker';
13
13
  import ProjectSelect from './project-select';
package/lib/index.js CHANGED
@@ -42,7 +42,7 @@ var import_project_select = __toESM(require("./project-select"));
42
42
  __reExport(stdin_exports, require("./md-preview"), module.exports);
43
43
  __reExport(stdin_exports, require("./org-picker"), module.exports);
44
44
  __reExport(stdin_exports, require("./project-select"), module.exports);
45
- const version = "1.17.4";
45
+ const version = "1.17.6";
46
46
  function install(app) {
47
47
  const components = [
48
48
  import_md_preview.default,
@@ -1 +1 @@
1
- .katex-block{display:block;margin:1em 0;text-align:center;overflow-x:auto;overflow-y:hidden}.cgx-markdown-preview .diff-container{border:1px solid #ebeef5;border-radius:4px;overflow:auto}.cgx-markdown-preview .diff-equal{color:#606266}.cgx-markdown-preview .diff-delete{background-color:#ffeef0;color:#f56c6c;text-decoration:line-through}.cgx-markdown-preview .diff-insert{background-color:#e6ffec;color:#67c23a}.cgx-markdown-preview .diff-unified-view pre{margin:0;padding:8px;white-space:pre-wrap;word-break:break-word}.cgx-markdown-preview{line-height:1.6;font-size:var(--font-base, 16px)}.cgx-markdown-preview ol{list-style:auto}.cgx-markdown-preview ul{list-style:disc}.cgx-markdown-preview ol,.cgx-markdown-preview ul{padding-left:2em;margin:0 0 12px}.cgx-markdown-preview li::marker{text-align:start!important}.cgx-markdown-preview h1{font-size:2em;font-weight:700;margin:16px 0}.cgx-markdown-preview h2{font-size:1.5em;font-weight:700;margin:14px 0}.cgx-markdown-preview p{margin:12px 0}.cgx-markdown-preview blockquote{margin:0;padding-left:1em;border-left:4px solid #ddd;color:#666}.cgx-markdown-preview table{border-collapse:collapse;width:100%;margin-bottom:16px}.cgx-markdown-preview th,.cgx-markdown-preview td{border:1px solid #ddd;padding:8px;text-align:left}.cgx-markdown-preview th{background-color:#f6f8fa}
1
+ .katex-block{display:block;margin:1em 0;text-align:center;overflow-x:auto;overflow-y:hidden}.cgx-markdown-preview .diff-container{border:1px solid #ebeef5;border-radius:4px;overflow:auto}.cgx-markdown-preview .diff-equal{color:#606266}.cgx-markdown-preview .diff-delete{background-color:#ffeef0;color:#f56c6c;text-decoration:line-through}.cgx-markdown-preview .diff-insert{background-color:#e6ffec;color:#67c23a}.cgx-markdown-preview .diff-unified-view pre{margin:0;padding:8px;white-space:pre-wrap;word-break:break-word}.cgx-markdown-preview{line-height:1.6;font-size:var(--font-base, 16px)}.cgx-markdown-preview ol{list-style:auto}.cgx-markdown-preview ul{list-style:disc}.cgx-markdown-preview ol,.cgx-markdown-preview ul{padding-left:1.5em;margin:0 0 12px}.cgx-markdown-preview li::marker{text-align:start!important}.cgx-markdown-preview h1{font-size:2em;font-weight:700;margin:16px 0}.cgx-markdown-preview h2{font-size:1.5em;font-weight:700;margin:14px 0}.cgx-markdown-preview p{margin:12px 0}.cgx-markdown-preview blockquote{margin:0;padding-left:1em;border-left:4px solid #ddd;color:#666}.cgx-markdown-preview table{border-collapse:collapse;width:100%;margin-bottom:16px}.cgx-markdown-preview th,.cgx-markdown-preview td{border:1px solid #ddd;padding:8px;text-align:left}.cgx-markdown-preview th{background-color:#f6f8fa}
@@ -51,7 +51,7 @@
51
51
 
52
52
  ol,
53
53
  ul {
54
- padding-left: 2em;
54
+ padding-left: 1.5em;
55
55
  margin: 0 0 12px 0;
56
56
  }
57
57
 
@@ -58,6 +58,7 @@ var import_DeptImg = __toESM(require("./components/DeptImg"));
58
58
  var import_types = require("./types");
59
59
  var import_useApi = require("./useApi");
60
60
  var import_index = require("./index.css");
61
+ var import_vue3 = require("vue");
61
62
  var stdin_default = (0, import_vue2.defineComponent)({
62
63
  name: "OrgPicker",
63
64
  props: import_types.orgPickerProps,
@@ -71,9 +72,12 @@ var stdin_default = (0, import_vue2.defineComponent)({
71
72
  currentDeptId,
72
73
  deptPath,
73
74
  searchOrgList,
74
- userList
75
+ userList,
76
+ getRecentSelectedUsers,
77
+ setRecentSelectedUsers
75
78
  } = (0, import_useApi.useApi)();
76
79
  getOrgList();
80
+ const activeTab = (0, import_vue2.ref)("zjxz");
77
81
  const selectedItems = (0, import_vue2.ref)([]);
78
82
  (0, import_vue2.watch)(() => props.modelValue, (newValue) => {
79
83
  var _a;
@@ -105,16 +109,37 @@ var stdin_default = (0, import_vue2.defineComponent)({
105
109
  selectedItems.value = [item];
106
110
  emit("update:modelValue", [item.id]);
107
111
  emit("update:show", false);
112
+ setRecentSelectedUsers(selectedItems.value);
108
113
  }
109
114
  };
115
+ const handleHistorySelect = (item) => {
116
+ selectedItems.value = item.selectedUsers;
117
+ };
110
118
  const handleConfirm = () => {
111
119
  emit("update:show", false);
112
120
  emit("update:modelValue", selectedItems.value.map((item) => item.id));
121
+ setRecentSelectedUsers(selectedItems.value);
113
122
  };
114
123
  const keyword = (0, import_vue2.ref)("");
115
124
  const loading = (0, import_vue2.ref)(false);
116
125
  const finished = (0, import_vue2.ref)(true);
117
126
  const searchRef = (0, import_vue2.ref)();
127
+ const recentSelectedHistory = (0, import_vue2.ref)([]);
128
+ const filterRecentSelectedHistory = (0, import_vue2.ref)([]);
129
+ (0, import_vue3.watchEffect)(() => {
130
+ if (activeTab.value === "zjxz") {
131
+ recentSelectedHistory.value = getRecentSelectedUsers();
132
+ }
133
+ });
134
+ (0, import_vue3.watchEffect)(() => {
135
+ if (activeTab.value === "zjxz") {
136
+ if (keyword.value) {
137
+ filterRecentSelectedHistory.value = recentSelectedHistory.value.filter((item) => item.selectedUsers.some((user) => keyword.value.split("").some((char) => user.name.includes(char))));
138
+ } else {
139
+ filterRecentSelectedHistory.value = recentSelectedHistory.value;
140
+ }
141
+ }
142
+ });
118
143
  (0, import_vue2.watch)(() => props.show, (newVal) => __async(this, null, function* () {
119
144
  if (newVal && props.autoFocus) {
120
145
  yield (0, import_vue2.nextTick)();
@@ -145,6 +170,15 @@ var stdin_default = (0, import_vue2.defineComponent)({
145
170
  const onLoad = () => {
146
171
  finished.value = true;
147
172
  };
173
+ const highlightText = (text, keyword2) => {
174
+ if (!keyword2) {
175
+ return text;
176
+ }
177
+ const keywordChars = keyword2.split("");
178
+ return Array.from(text).map((char, index) => keywordChars.some((kChar) => char.toLowerCase() === kChar.toLowerCase()) ? (0, import_vue3.h)("span", {
179
+ class: "highlight"
180
+ }, char) : char);
181
+ };
148
182
  return () => (0, import_vue.createVNode)(import_vant.ActionSheet, {
149
183
  "show": props.show,
150
184
  "onUpdate:show": (val) => emit("update:show", val),
@@ -172,7 +206,28 @@ var stdin_default = (0, import_vue2.defineComponent)({
172
206
  "class": "close-icon"
173
207
  }, [(0, import_vue.createTextVNode)("X")])])) : (0, import_vue.createVNode)("p", {
174
208
  "class": "color-[#aaa] text-[14px] text-center w-full leading-[38px]"
175
- }, [(0, import_vue.createTextVNode)("\u672A\u9009\u62E9\u4EBA\u5458")])]), !keyword.value && (0, import_vue.createVNode)("div", {
209
+ }, [(0, import_vue.createTextVNode)("\u672A\u9009\u62E9\u4EBA\u5458")])]), (0, import_vue.createVNode)(import_vant.Tabs, {
210
+ "active": activeTab.value,
211
+ "onUpdate:active": ($event) => activeTab.value = $event
212
+ }, {
213
+ default: () => [(0, import_vue.createVNode)(import_vant.Tab, {
214
+ "title": "\u6700\u8FD1\u9009\u62E9",
215
+ "name": "zjxz"
216
+ }, null), (0, import_vue.createVNode)(import_vant.Tab, {
217
+ "title": "\u901A\u8BAF\u5F55",
218
+ "name": "txl"
219
+ }, null)]
220
+ }), (0, import_vue.createVNode)("div", {
221
+ "class": "org-content-wrap"
222
+ }, [activeTab.value === "zjxz" ? (0, import_vue.createVNode)("div", {
223
+ "class": "recent-list-wrap flex-1 overflow-auto px-[16px] py-[8px]"
224
+ }, [filterRecentSelectedHistory.value.length === 0 ? (0, import_vue.createVNode)(import_vant.Empty, {
225
+ "description": "\u6682\u65E0\u6700\u8FD1\u9009\u62E9\u8BB0\u5F55"
226
+ }, null) : filterRecentSelectedHistory.value.map((historyItem) => (0, import_vue.createVNode)("div", {
227
+ "key": historyItem.id,
228
+ "onClick": () => handleHistorySelect(historyItem),
229
+ "class": "px-16px py-8px border-b border-[#eee]"
230
+ }, [(0, import_vue.createVNode)("span", null, [historyItem.selectedUsers.map((user) => highlightText(user.name, keyword.value)).reduce((prev, curr) => [prev, "\uFF0C", curr])])]))]) : (0, import_vue.createVNode)(import_vue.Fragment, null, [!keyword.value && (0, import_vue.createVNode)("div", {
176
231
  "class": "breadcrumb-nav"
177
232
  }, [deptPath.value.map((dept, index) => (0, import_vue.createVNode)("span", {
178
233
  "key": dept.id
@@ -206,7 +261,7 @@ var stdin_default = (0, import_vue2.defineComponent)({
206
261
  }, [item.name, (0, import_vue.createVNode)("span", {
207
262
  "class": "org-item-select-icon"
208
263
  }, [(0, import_vue.createTextVNode)("\u2713")])])]))]
209
- })]), props.multiple && (0, import_vue.createVNode)("div", {
264
+ })])])]), props.multiple && (0, import_vue.createVNode)("div", {
210
265
  "class": "bottom-section"
211
266
  }, [(0, import_vue.createVNode)("div", {
212
267
  "class": "action-buttons"
@@ -32,6 +32,14 @@
32
32
 
33
33
  /* layer: default */
34
34
  .cgx-atm .w-full{width:100%;}
35
+ .cgx-atm .flex-1{flex:1 1 0%;}
36
+ .cgx-atm .overflow-auto{overflow:auto;}
37
+ .cgx-atm .border-b{border-bottom-width:1px;border-bottom-style:solid;}
38
+ .cgx-atm .border-\[\#eee\]{--un-border-opacity:1;border-color:rgba(238,238,238,var(--un-border-opacity));}
39
+ .cgx-atm .px-\[16px\],
40
+ .cgx-atm .px-16px{padding-left:16px;padding-right:16px;}
41
+ .cgx-atm .py-\[8px\],
42
+ .cgx-atm .py-8px{padding-top:8px;padding-bottom:8px;}
35
43
  .cgx-atm .text-center{text-align:center;}
36
44
  .cgx-atm .text-\[14px\]{font-size:14px;}
37
45
  .cgx-atm .leading-\[38px\]{line-height:38px;}
@@ -1 +1 @@
1
- :root:root{--van-action-sheet-max-height: 100%}.org-list{height:85vh;display:flex;flex-direction:column}.org-list .breadcrumb-nav{margin-bottom:4px;padding:2px 16px;border-radius:4px;font-size:12px}.org-list .breadcrumb-nav .dept-name.current-dept{color:#969799}.org-list .breadcrumb-nav .separator{color:#969799;margin:0 4px}.org-list .search-bar{position:-webkit-sticky;position:-webkit-sticky;position:sticky;top:0;z-index:1}.org-list .org-selected-items{display:flex;flex-wrap:nowrap;padding:12px 16px;gap:12px;background-color:#fff;overflow-x:auto;height:68px;border-bottom:1px solid #eee}.org-list .org-selected-items .selected-tag{flex-shrink:0;background:none;border:none;padding:0;margin:0;position:relative}.org-list .org-selected-items .selected-tag .close-icon{position:absolute;top:0;right:0;z-index:1;background-color:#fff;border-radius:50%;border:1px solid #eee;width:10px;height:10px;display:flex;align-items:center;justify-content:center;font-size:6px;color:#969799}.org-list .org-selected-items .selected-tag .tag-avatar{width:40px;height:40px}.org-list .org-selected-items .selected-tag .tag-avatar img{border-radius:4px;border:1px solid #eee;object-fit:contain}.org-list .bottom-section{border-top:1px solid #eee;background-color:#fff}.org-list .van-list{flex:1;overflow-y:auto;padding:0 16px}.org-list .feed-list-wrap{flex:1;display:flex;overflow:hidden;position:relative;justify-content:center}.org-list .search-result-list{position:absolute;top:0;left:0;right:0;bottom:0;z-index:1;background-color:#fff;overflow-y:auto;padding:0 16px}.org-list .org-item{padding:12px 0;border-bottom:1px solid #eee;cursor:pointer;display:flex;align-items:center;gap:12px}.org-list .org-item .org-item-select-icon{display:none;padding-left:4px}.org-list .org-item.selected{color:var(--van-primary-color)}.org-list .org-item.selected .org-item-select-icon{display:inline}.org-list .org-item .org-avatar{flex-shrink:0;width:40px;height:40px;display:flex;align-items:center;justify-content:center}.org-list .org-item .org-avatar img{border-radius:4px;border:1px solid #eee;object-fit:contain}.org-list .org-item .org-name{font-size:14px;flex:1}.org-list .org-item:last-child{border-bottom:none}.org-list .action-buttons{padding:16px;display:flex;justify-content:center}.org-list .action-buttons .confirm-button{background-color:var(--van-primary-color);color:#fff;padding:10px 0;border-radius:4px;text-align:center;width:100%;font-size:14px}
1
+ :root:root{--van-action-sheet-max-height: 100%}.org-list{height:85vh;display:flex;flex-direction:column}.org-list .highlight{color:var(--van-primary-color);font-weight:700}.org-list .breadcrumb-nav{margin-bottom:4px;padding:2px 16px;border-radius:4px;font-size:12px}.org-list .breadcrumb-nav .dept-name.current-dept{color:#969799}.org-list .breadcrumb-nav .separator{color:#969799;margin:0 4px}.org-list .search-bar{position:-webkit-sticky;position:-webkit-sticky;position:sticky;top:0;z-index:1}.org-list .org-selected-items{display:flex;flex-wrap:nowrap;padding:12px 16px;gap:12px;background-color:#fff;overflow-x:auto;height:68px;border-bottom:1px solid #eee}.org-list .org-selected-items .selected-tag{flex-shrink:0;background:none;border:none;padding:0;margin:0;position:relative}.org-list .org-selected-items .selected-tag .close-icon{position:absolute;top:0;right:0;z-index:1;background-color:#fff;border-radius:50%;border:1px solid #eee;width:10px;height:10px;display:flex;align-items:center;justify-content:center;font-size:6px;color:#969799}.org-list .org-selected-items .selected-tag .tag-avatar{width:40px;height:40px}.org-list .org-selected-items .selected-tag .tag-avatar img{border-radius:4px;border:1px solid #eee;object-fit:contain}.org-list .bottom-section{border-top:1px solid #eee;background-color:#fff}.org-list .van-list{flex:1;overflow-y:auto;padding:0 16px}.org-list .org-content-wrap{flex:1;display:flex;flex-direction:column;overflow:hidden}.org-list .feed-list-wrap{flex:1;display:flex;overflow:hidden;position:relative;justify-content:center}.org-list .search-result-list{position:absolute;top:0;left:0;right:0;bottom:0;z-index:1;background-color:#fff;overflow-y:auto;padding:0 16px}.org-list .org-item{padding:12px 0;border-bottom:1px solid #eee;cursor:pointer;display:flex;align-items:center;gap:12px}.org-list .org-item .org-item-select-icon{display:none;padding-left:4px}.org-list .org-item.selected{color:var(--van-primary-color)}.org-list .org-item.selected .org-item-select-icon{display:inline}.org-list .org-item .org-avatar{flex-shrink:0;width:40px;height:40px;display:flex;align-items:center;justify-content:center}.org-list .org-item .org-avatar img{border-radius:4px;border:1px solid #eee;object-fit:contain}.org-list .org-item .org-name{font-size:14px;flex:1}.org-list .org-item:last-child{border-bottom:none}.org-list .action-buttons{padding:16px;display:flex;justify-content:center}.org-list .action-buttons .confirm-button{background-color:var(--van-primary-color);color:#fff;padding:10px 0;border-radius:4px;text-align:center;width:100%;font-size:14px}
@@ -5,6 +5,11 @@
5
5
  height: 85vh;
6
6
  display: flex;
7
7
  flex-direction: column;
8
+
9
+ .highlight {
10
+ color: var(--van-primary-color);
11
+ font-weight: bold;
12
+ }
8
13
 
9
14
  .breadcrumb-nav {
10
15
  margin-bottom: 4px;
@@ -87,6 +92,13 @@
87
92
  padding: 0 16px;
88
93
  }
89
94
 
95
+ .org-content-wrap {
96
+ flex: 1;
97
+ display: flex;
98
+ flex-direction: column;
99
+ overflow: hidden;
100
+ }
101
+
90
102
  .feed-list-wrap {
91
103
  flex: 1;
92
104
  display: flex;
@@ -31,3 +31,8 @@ export declare const orgPickerProps: {
31
31
  };
32
32
  };
33
33
  export type OrgPickerProps = ExtractPropTypes<typeof orgPickerProps>;
34
+ export interface RecentSelection {
35
+ id: string;
36
+ selectedUsers: OrgItem[];
37
+ timestamp: number;
38
+ }
@@ -1,6 +1,7 @@
1
- import { type OrgItem } from './types';
1
+ import { Ref } from 'vue';
2
+ import { type OrgItem, RecentSelection } from './types';
2
3
  export declare const useApi: () => {
3
- userList: import("vue").Ref<{
4
+ userList: Ref<{
4
5
  [x: string]: any;
5
6
  id: string | number;
6
7
  name: string;
@@ -13,7 +14,7 @@ export declare const useApi: () => {
13
14
  type: string;
14
15
  avatar?: string | undefined;
15
16
  }[]>;
16
- orgList: import("vue").Ref<{
17
+ orgList: Ref<{
17
18
  [x: string]: any;
18
19
  id: string | number;
19
20
  name: string;
@@ -27,8 +28,8 @@ export declare const useApi: () => {
27
28
  avatar?: string | undefined;
28
29
  }[]>;
29
30
  getOrgList: (deptId?: string) => Promise<void>;
30
- currentDeptId: import("vue").Ref<string, string>;
31
- deptPath: import("vue").Ref<{
31
+ currentDeptId: Ref<string, string>;
32
+ deptPath: Ref<{
32
33
  id: string | number;
33
34
  name: string;
34
35
  }[], {
@@ -39,4 +40,6 @@ export declare const useApi: () => {
39
40
  name: string;
40
41
  }[]>;
41
42
  searchOrgList: import("lodash-es").DebouncedFunc<(userName: string) => Promise<void>>;
43
+ getRecentSelectedUsers: () => RecentSelection[];
44
+ setRecentSelectedUsers: (users: OrgItem[]) => void;
42
45
  };
@@ -93,12 +93,47 @@ const useApi = () => {
93
93
  const url = `https://wflow.cgboiler.com/v1/oa/org/tree/user/search/cloud?userName=${userName}`;
94
94
  orgList.value = yield fetchData(url);
95
95
  }), 300);
96
+ const RECENT_SELECTED_USERS_KEY = "recent_selected_users_history";
97
+ const MAX_RECENT_SELECTIONS = 15;
98
+ const getRecentSelectedUsers = () => {
99
+ try {
100
+ const data = localStorage.getItem(RECENT_SELECTED_USERS_KEY);
101
+ return data ? JSON.parse(data) : [];
102
+ } catch (error) {
103
+ console.error("Failed to get recent selected users history from localStorage", error);
104
+ return [];
105
+ }
106
+ };
107
+ const setRecentSelectedUsers = (users) => {
108
+ if (!users || users.length === 0)
109
+ return;
110
+ const history = getRecentSelectedUsers();
111
+ const newSelection = {
112
+ id: Date.now().toString(),
113
+ // 使用时间戳作为唯一ID
114
+ selectedUsers: users,
115
+ timestamp: Date.now()
116
+ };
117
+ const filteredHistory = history.filter((item) => {
118
+ return !(item.selectedUsers.length === newSelection.selectedUsers.length && item.selectedUsers.every(
119
+ (user) => newSelection.selectedUsers.some((sUser) => sUser.id === user.id)
120
+ ));
121
+ });
122
+ const updatedHistory = [newSelection, ...filteredHistory].slice(0, MAX_RECENT_SELECTIONS);
123
+ try {
124
+ localStorage.setItem(RECENT_SELECTED_USERS_KEY, JSON.stringify(updatedHistory));
125
+ } catch (error) {
126
+ console.error("Failed to set recent selected users history to localStorage", error);
127
+ }
128
+ };
96
129
  return {
97
130
  userList,
98
131
  orgList,
99
132
  getOrgList,
100
133
  currentDeptId,
101
134
  deptPath,
102
- searchOrgList
135
+ searchOrgList,
136
+ getRecentSelectedUsers,
137
+ setRecentSelectedUsers
103
138
  };
104
139
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cgboiler/biz-mobile",
3
- "version": "1.17.5",
3
+ "version": "1.17.7",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",
@@ -44,7 +44,7 @@
44
44
  "dependencies": {
45
45
  "lodash-es": "^4.17.21",
46
46
  "vant": "^4.9.19",
47
- "@cgboiler/core": "1.2.1",
47
+ "@cgboiler/core": "1.2.2",
48
48
  "@cgboiler/shared": "1.1.1"
49
49
  },
50
50
  "scripts": {