@yqg/permission 1.0.4-beta.0 → 1.0.5-beta.0

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 (38) hide show
  1. package/.arcconfig +8 -0
  2. package/.husky/commit-msg +20 -0
  3. package/.husky/pre-commit +4 -0
  4. package/README.md +126 -3
  5. package/arcanist/.phutil_module_cache +1 -0
  6. package/arcanist/__phutil_library_init__.php +3 -0
  7. package/arcanist/__phutil_library_map__.php +18 -0
  8. package/arcanist/lint/engine/YqgWebDiffLintEngine.php +68 -0
  9. package/commitlint.config.js +32 -0
  10. package/dist/{apply-modal-C7hVR1xJ.js → apply-modal-CzowWeBJ.js} +1231 -1216
  11. package/dist/card.png +0 -0
  12. package/dist/{checkbox-item-Bf_S20_z.js → checkbox-item-zQ0rw1If.js} +405 -418
  13. package/dist/dialog.png +0 -0
  14. package/dist/image.png +0 -0
  15. package/dist/{index-B0kTXjfX.js → index-DA6ClyIX.js} +2 -2
  16. package/dist/index.js +2 -2
  17. package/dist/index.umd.cjs +45 -45
  18. package/dist/{yqg-permission-CbkviMn9.js → yqg-permission-BrJJoGxC.js} +444 -427
  19. package/eslint.config.js +26 -0
  20. package/package.json +10 -4
  21. package/public/card.png +0 -0
  22. package/public/dialog.png +0 -0
  23. package/public/image.png +0 -0
  24. package/src/App.vue +1 -1
  25. package/src/axios/axios.ts +1 -1
  26. package/src/components/apply-modal.vue +17 -4
  27. package/src/components/approval-steps.vue +10 -8
  28. package/src/components/checkbox-item.vue +5 -18
  29. package/src/components/success-modal.vue +16 -7
  30. package/src/components/yqg-permission.vue +27 -15
  31. package/src/i18n/zh-CH.ts +4 -1
  32. package/src/main.ts +1 -1
  33. package/src/typings/index.d.ts +1 -0
  34. package/src/yqg-permission/index.ts +2 -2
  35. package/tsconfig.app.json +10 -1
  36. package/tsconfig.json +2 -2
  37. package/dist/vite.svg +0 -1
  38. package/public/vite.svg +0 -1
@@ -0,0 +1,26 @@
1
+ import typescriptEslintParser from '@typescript-eslint/parser';
2
+
3
+ export default {
4
+ parser: typescriptEslintParser,
5
+ parserOptions: {
6
+ ecmaVersion: 2020,
7
+ sourceType: 'module',
8
+ },
9
+ plugins: ['@typescript-eslint', 'vue'],
10
+ extends: [
11
+ 'plugin:@typescript-eslint/recommended',
12
+ 'plugin:vue/vue3-recommended',
13
+ ],
14
+ rules: {
15
+ 'vue/no-multiple-template-root': 'off',
16
+ },
17
+ env: {
18
+ browser: true,
19
+ node: true,
20
+ },
21
+ settings: {
22
+ 'import/resolver': {
23
+ typescript: {},
24
+ },
25
+ },
26
+ }
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@yqg/permission",
3
- "version": "1.0.4-beta.0",
4
- "main": "dist/index.js",
5
- "module": "dist/index.js",
3
+ "version": "1.0.5-beta.0",
4
+ "main": "dist/index.js",
5
+ "module": "dist/index.js",
6
6
  "type": "module",
7
- "publishConfig": {
7
+ "publishConfig": {
8
8
  "access": "public",
9
9
  "registry": "https://registry.npmjs.org/"
10
10
  },
@@ -15,13 +15,19 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "@ant-design/icons-vue": "^7.0.1",
18
+ "@commitlint/cli": "^19.5.0",
19
+ "@commitlint/config-conventional": "^19.5.0",
18
20
  "ant-design-vue": "4.x",
19
21
  "axios": "^1.7.7",
20
22
  "vite-plugin-css-injected-by-js": "^3.5.2",
21
23
  "vue": "^3.5.12"
22
24
  },
23
25
  "devDependencies": {
26
+ "@typescript-eslint/parser": "^8.13.0",
24
27
  "@vitejs/plugin-vue": "^5.1.4",
28
+ "eslint": "^9.14.0",
29
+ "husky": "^9",
30
+ "lint-staged": "^13.2.0",
25
31
  "typescript": "~5.5.4",
26
32
  "vite": "^5.4.9",
27
33
  "vue-tsc": "^2.1.8"
Binary file
Binary file
Binary file
package/src/App.vue CHANGED
@@ -31,7 +31,7 @@ const changeLocale = () => {
31
31
  <!-- 05184 -->
32
32
  <yqg-permission
33
33
  :permissions="permissions"
34
- workNumber="05184"
34
+ workNumber="H00408"
35
35
  businessCode="PPDL"
36
36
  :color="color"
37
37
  :locale="locale"
@@ -8,7 +8,7 @@ const YQG_NOT_LOGIN = 10008;
8
8
  axios.defaults.withCredentials = true;
9
9
  // instance.defaults.paramsSerializer = (params) => qs.stringify(params, { arrayFormat: 'repeat' });
10
10
 
11
- axios.defaults.headers.common['Accept-Language'] = localStorage.getItem('permission_locale') as string;
11
+ axios.defaults.headers.common['Accept-Language'] = localStorage.getItem('permission_locale');
12
12
 
13
13
  axios.interceptors.response.use(
14
14
  (res: any) => {
@@ -35,9 +35,15 @@
35
35
  <FormItem
36
36
  name="applyReason"
37
37
  :label="t('applyReason')"
38
- :rules="[{ required: true, message: t('reasonPlaceholder')}]">
38
+ :rules="[{
39
+ required: true, message: t('reasonPlaceholder')
40
+ }, {
41
+ max: 300, message: t('maxLengthTips', {length: 300})
42
+ }]">
39
43
  <Textarea
40
44
  v-model:value="formState.applyReason"
45
+ show-count
46
+ :maxlength="300"
41
47
  :placeholder="t('applyReasonPlaceholder')"
42
48
  :auto-size="{ minRows: 2, maxRows: 5 }">
43
49
  </Textarea>
@@ -62,7 +68,6 @@
62
68
  </template>
63
69
  <script lang="ts" setup>
64
70
  import {
65
- defineModel,
66
71
  reactive,
67
72
  defineAsyncComponent,
68
73
  toRef,
@@ -77,6 +82,7 @@
77
82
  CheckboxGroup,
78
83
  Textarea,
79
84
  Tag,
85
+ message
80
86
  } from 'ant-design-vue';
81
87
  import SuccessModal from './success-modal.vue';
82
88
  import ApprovalSteps from './approval-steps.vue';
@@ -138,6 +144,9 @@
138
144
  }
139
145
 
140
146
  const handleOk = async() => {
147
+ if (formState.roleIds.length > 5) {
148
+ return message.warning(t('maxCountTips', {count: 5}));
149
+ }
141
150
  formRef.value.validate().then(async() => {
142
151
  loading.value = true;
143
152
  const params = getParams();
@@ -145,8 +154,8 @@
145
154
  const url = res?.body?.oaFlowUrl;
146
155
  open.value = false;
147
156
  loading.value = false;
148
- emit('onSuccess');
149
- successModal.value?.countDown(url);
157
+
158
+ successModal.value?.countDown(url, () => emit('onSuccess'));
150
159
  })
151
160
  };
152
161
 
@@ -161,6 +170,10 @@
161
170
  }
162
171
 
163
172
  const onChangeHandler = throttle(async () => {
173
+ if (formState.roleIds.length > 5) {
174
+ return message.warning(t('maxCountTips', {count: 5}));
175
+ }
176
+
164
177
  if (!formState.roleIds.length) {
165
178
  stepNodes.value = [];
166
179
  return;
@@ -2,16 +2,18 @@
2
2
  <div v-if="stepNodes?.length > 1" class="crane-step-wraper">
3
3
  <div v-for="(item, index) in stepNodes" :key="item.auditorName" class="crane-step-node">
4
4
  <span style="white-space: nowrap;">
5
- {{ item.auditorName }} {{ getSubTip(index) }}
5
+ {{ item.auditorName }}
6
+ <Popover v-if="item.employeeNameList?.length">
7
+ <template #content>
8
+ <div style="max-width: 400px;">
9
+ {{ item.employeeNameList.join('、')}}
10
+ </div>
11
+ </template>
12
+ <ExclamationCircleOutlined style="margin: 0 2px; color: #1677ff;"/>
13
+ </Popover>
14
+ {{ getSubTip(index) }}
6
15
  </span>
7
16
 
8
- <Popover v-if="item.employeeNameList?.length">
9
- <template #content>
10
- {{item.auditorName}}:{{ item.employeeNameList.join(',')}}
11
- </template>
12
- <ExclamationCircleOutlined style="margin: 0 2px"/>
13
- </Popover>
14
-
15
17
  <img
16
18
  v-if="index !== stepNodes.length - 1"
17
19
  :src="arrowImg"
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div class="crane-checkbox-line">
3
- <Checkbox :value="item.roleId" :disabled="!!item.businessApplyType" @change="onCheck">
3
+ <Checkbox :value="item.roleId" :disabled="disabled" @change="onCheck">
4
4
  <div class="crane-flex-center crane-checkbox-label">
5
5
  <Tag
6
6
  v-if="item.securityLevel"
@@ -23,7 +23,7 @@
23
23
  :bordered="false"
24
24
  class="crane-tag-position crane-margin-left-4 crane-margin-right-0"
25
25
  :class="item.businessApplyType !== StatusTypePending ? 'crane-disabled-color' : ''">
26
- {{ statusMap[item.businessApplyType].text }}
26
+ {{ statusMap[item.businessApplyType] }}
27
27
  </Tag>
28
28
  </div>
29
29
  </Checkbox>
@@ -39,7 +39,7 @@
39
39
  <template #content>
40
40
  {{t('adaptDepartment')}}:{{ item.relatedDepartments.map((item: any) => {
41
41
  return item.name;
42
- }).join(',') }}
42
+ }).join('') }}
43
43
  </template>
44
44
  <span class="crane-flex-center crane-margin-left-4">
45
45
  <img :src="departmentImg" height="14" width="14">
@@ -81,21 +81,6 @@
81
81
  text: t('levels.L3')
82
82
  },
83
83
  };
84
-
85
- const statusMap:StatusMapType = {
86
- PENDING: {
87
- color: 'orange',
88
- text: t('status.PENDING')
89
- },
90
- OWNER: {
91
- color: 'green',
92
- text: t('status.OWNER')
93
- },
94
- NO: {
95
- color: 'red',
96
- text: t('status.NO')
97
- }
98
- }
99
84
 
100
85
  let props = defineProps({
101
86
  item: {
@@ -112,7 +97,9 @@
112
97
  }
113
98
  });
114
99
  const timeStatusOptions = formatOptions('availiables');
100
+ const statusMap = t('status');
115
101
  const StatusTypePending = 'PENDING';
102
+ const disabled = ['NO', 'PENDING'].includes(props.item.businessApplyType);
116
103
  const validTime = ref('');
117
104
 
118
105
  //1登录人所在部门 = 权限适用范围,都默认90天,不需要区分等级和类型,
@@ -9,22 +9,31 @@
9
9
 
10
10
  const [modal, contextHolder] = Modal.useModal();
11
11
 
12
- const countDown = (url: string) => {
12
+ const countDown = (url: string, callback?: ()=>void) => {
13
13
  let secondsToGo = 10;
14
14
  const modal1 = modal.confirm({
15
15
  title: t('resoultTitle'),
16
16
  content: t('successTips'),
17
17
  cancelText: `${t('close')}(${secondsToGo}s)`,
18
18
  okText:`${t('viewApprovalDetail')}>>`,
19
- wrapClassName: 'success-modal-wrap',
19
+ wrapClassName: 'yqg-permission-modal-wrap',
20
20
  icon: createVNode(CheckCircleFilled, {style: 'color: #52c41a;'}),
21
21
  onOk: () => {
22
22
  window.open(url);
23
- location.reload();
23
+ modal1.destroy();
24
+ if (callback) {
25
+ callback();
26
+ } else {
27
+ location.reload();
28
+ }
24
29
  },
25
30
  onCancel: () => {
26
31
  modal1.destroy();
27
- location.reload();
32
+ if (callback) {
33
+ callback();
34
+ } else {
35
+ location.reload();
36
+ }
28
37
  },
29
38
  });
30
39
 
@@ -44,8 +53,8 @@
44
53
  defineExpose({countDown});
45
54
 
46
55
  </script>
47
- <style scoped>
48
- ::v-deep .success-modal-wrap .yqg-permission-modal-confirm-btns {
49
- text-align: center;
56
+ <style>
57
+ .yqg-permission-modal-wrap .yqg-permission-modal-confirm-btns {
58
+ text-align: center!important;
50
59
  }
51
60
  </style>
@@ -2,7 +2,6 @@
2
2
  <ConfigProvider
3
3
  v-if="allPermissions.length"
4
4
  prefixCls="yqg-permission"
5
- iconPrefixCls="yqg-permission"
6
5
  :theme="{
7
6
  token: {
8
7
  colorPrimary: props.color,
@@ -17,13 +16,14 @@
17
16
  </div>
18
17
  </template>
19
18
  <template v-else>
20
- <img
21
- :src="curStatus.imageUrl"
22
- height="200"
23
- width="200"
24
- style="margin-top: calc(50vh - 273px)" />
19
+
25
20
  <!-- 可申请 -->
26
21
  <template v-if="curStatus.status === statusMap.DEFAULT">
22
+ <img
23
+ :src="curStatus.imageUrl"
24
+ height="200"
25
+ width="200"
26
+ style="margin-top: calc(50vh - 273px)" />
27
27
  <div class="crane-margin10">
28
28
  {{ t('unavailableTips') }}
29
29
  </div>
@@ -33,6 +33,11 @@
33
33
  </template>
34
34
  <!-- 审批中 -->
35
35
  <template v-if="curStatus.status === statusMap.PENDING">
36
+ <img
37
+ :src="curStatus.imageUrl"
38
+ height="200"
39
+ width="200"
40
+ style="margin-top: calc(50vh - 273px)" />
36
41
  <div class="crane-margin10">
37
42
  <span
38
43
  class="crane-unapply"
@@ -47,14 +52,21 @@
47
52
  </div>
48
53
  </template>
49
54
  <!-- 不可申请 -->
50
- <div v-if="curStatus.status === statusMap.NO" class="crane-margin10">
51
- {{ t('unapplyTips') }}
52
- <Popover>
53
- <template #content>
54
- <div style="max-width: 400px;">{{t('manager')}}: {{ curStatus.tips }}</div>
55
- </template>
56
- <span style="color: #1677ff;">{{t('callManager') }}</span>
57
- </Popover>
55
+ <div v-if="curStatus.status === statusMap.NO" class="crane-wraper">
56
+ <img
57
+ :src="curStatus.imageUrl"
58
+ height="200"
59
+ width="200"
60
+ style="margin-top: calc(50vh - 273px)" />
61
+ <div class="crane-margin10">
62
+ {{ t('unapplyTips') }}
63
+ <Popover>
64
+ <template #content>
65
+ <div style="max-width: 400px;">{{t('manager')}}: {{ curStatus.tips }}</div>
66
+ </template>
67
+ <span style="color: #1677ff;">{{t('callManager') }}</span>
68
+ </Popover>
69
+ </div>
58
70
  </div>
59
71
  </template>
60
72
  </div>
@@ -173,7 +185,7 @@
173
185
  return {
174
186
  imageUrl: noauthority,
175
187
  status: statusMap.NO,
176
- tips: data[0].admin?.map((item) => item.name)?.join('、'),
188
+ tips: data[0].admin?.map((item) => `${item.name}(${item.departmentName})`)?.join('、'),
177
189
  };
178
190
  };
179
191
  return {
package/src/i18n/zh-CH.ts CHANGED
@@ -28,6 +28,8 @@ export default {
28
28
  availableTime: '有效期',
29
29
  selectPlaceholder: '请选择权限点',
30
30
  reasonPlaceholder: '请输入申请理由',
31
+ maxCountTips: '一次最多只可申请{count}个权限',
32
+ maxLengthTips: '最多{length}个字符',
31
33
  availiables: {
32
34
  SEVEN_DAYS: '7天',
33
35
  THIRTY_DAYS: '30天',
@@ -43,7 +45,8 @@ export default {
43
45
  status: {
44
46
  PENDING: '审批中',
45
47
  NO: '不可申请',
46
- OWNER: '已拥有',
48
+ OWNER: '永久拥有',
49
+ TEMP_OWNER: '临时拥有',
47
50
  },
48
51
  operationType: {
49
52
  QUERY: '查询',
package/src/main.ts CHANGED
@@ -3,7 +3,7 @@ import App from './App.vue';
3
3
  import './style.css';
4
4
  import yqgPermission from './yqg-permission';
5
5
  // import yqgPermission from '../dist';
6
- yqgPermission.start();
6
+ yqgPermission.init();
7
7
 
8
8
  const app = createApp(App);
9
9
  app.mount('#app');
@@ -7,6 +7,7 @@ declare enum LevelType {
7
7
  declare enum StatusType {
8
8
  PENDING = 'PENDING',
9
9
  OWNER = 'OWNER',
10
+ TEMP_OWNER = 'TEMP_OWNER',
10
11
  NO = 'NO'
11
12
  };
12
13
 
@@ -18,7 +18,7 @@ interface Options {
18
18
  interface YqgPermissionType {
19
19
  tagName: string;
20
20
  hasInit: boolean;
21
- start: (options: Options) => void;
21
+ init: (options: Options) => void;
22
22
  }
23
23
 
24
24
  class YqgPermission implements YqgPermissionType {
@@ -30,7 +30,7 @@ class YqgPermission implements YqgPermissionType {
30
30
  this.hasInit = false;
31
31
  }
32
32
 
33
- start(options?: Options): void {
33
+ init(options?: Options): void {
34
34
  if (!window || !window.customElements) {
35
35
  console.error('yqg-permission is not supported in this environment');
36
36
  return;
package/tsconfig.app.json CHANGED
@@ -21,5 +21,14 @@
21
21
  "noFallthroughCasesInSwitch": true
22
22
  },
23
23
  "composite": true,
24
- "include": ["src"]
24
+ "include": [
25
+ "src/**/*.ts",
26
+ "src/**/*.d.ts",
27
+ "src/**/*.tsx",
28
+ "src/**/*.vue"
29
+ ],
30
+ "exclude": [
31
+ "node_modules",
32
+ "vite.config.ts" // 如果不需要解析 vite.config.ts
33
+ ],
25
34
  }
package/tsconfig.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "files": [],
3
- "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }],
3
+ "references": [{ "path": "./tsconfig.app.json" }],
4
4
  "path": {
5
5
  "@src": "./src"
6
6
  },
7
7
  "compilerOptions": {
8
8
  "typeRoots": ["node_modules/ant-design-vue/typings", "./src/typings"]
9
- }
9
+ },
10
10
  }
package/dist/vite.svg DELETED
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
package/public/vite.svg DELETED
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>