@nocobase/app-plugin-office-flows-example 0.0.0-stage → 0.1.0-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 (189) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +55 -2
  3. package/dist/client/components/flow-ui.d.ts +111 -0
  4. package/dist/client/components/flow-ui.d.ts.map +1 -0
  5. package/dist/client/components/flow-ui.js +175 -0
  6. package/dist/client/components/flow-ui.js.map +1 -0
  7. package/dist/client/components/page-container.d.ts +4 -0
  8. package/dist/client/components/page-container.d.ts.map +1 -0
  9. package/dist/client/components/page-container.js +6 -0
  10. package/dist/client/components/page-container.js.map +1 -0
  11. package/dist/client/components/page-header.d.ts +8 -0
  12. package/dist/client/components/page-header.d.ts.map +1 -0
  13. package/dist/client/components/page-header.js +5 -0
  14. package/dist/client/components/page-header.js.map +1 -0
  15. package/dist/client/components/ui/badge.d.ts +7 -0
  16. package/dist/client/components/ui/badge.d.ts.map +1 -0
  17. package/dist/client/components/ui/badge.js +19 -0
  18. package/dist/client/components/ui/badge.js.map +1 -0
  19. package/dist/client/components/ui/button.d.ts +8 -0
  20. package/dist/client/components/ui/button.d.ts.map +1 -0
  21. package/dist/client/components/ui/button.js +25 -0
  22. package/dist/client/components/ui/button.js.map +1 -0
  23. package/dist/client/components/ui/card.d.ts +11 -0
  24. package/dist/client/components/ui/card.d.ts.map +1 -0
  25. package/dist/client/components/ui/card.js +19 -0
  26. package/dist/client/components/ui/card.js.map +1 -0
  27. package/dist/client/components/ui/input.d.ts +4 -0
  28. package/dist/client/components/ui/input.d.ts.map +1 -0
  29. package/dist/client/components/ui/input.js +8 -0
  30. package/dist/client/components/ui/input.js.map +1 -0
  31. package/dist/client/components/ui/select.d.ts +16 -0
  32. package/dist/client/components/ui/select.d.ts.map +1 -0
  33. package/dist/client/components/ui/select.js +36 -0
  34. package/dist/client/components/ui/select.js.map +1 -0
  35. package/dist/client/index.d.ts +2 -0
  36. package/dist/client/index.d.ts.map +1 -0
  37. package/dist/client/index.js +4 -0
  38. package/dist/client/index.js.map +1 -0
  39. package/dist/client/lib/api.d.ts +93 -0
  40. package/dist/client/lib/api.d.ts.map +1 -0
  41. package/dist/client/lib/api.js +67 -0
  42. package/dist/client/lib/api.js.map +1 -0
  43. package/dist/client/lib/format.d.ts +4 -0
  44. package/dist/client/lib/format.d.ts.map +1 -0
  45. package/dist/client/lib/format.js +8 -0
  46. package/dist/client/lib/format.js.map +1 -0
  47. package/dist/client/lib/labels.d.ts +5 -0
  48. package/dist/client/lib/labels.d.ts.map +1 -0
  49. package/dist/client/lib/labels.js +38 -0
  50. package/dist/client/lib/labels.js.map +1 -0
  51. package/dist/client/lib/use-loader.d.ts +10 -0
  52. package/dist/client/lib/use-loader.d.ts.map +1 -0
  53. package/dist/client/lib/use-loader.js +43 -0
  54. package/dist/client/lib/use-loader.js.map +1 -0
  55. package/dist/client/lib/utils.d.ts +2 -0
  56. package/dist/client/lib/utils.d.ts.map +1 -0
  57. package/dist/client/lib/utils.js +2 -0
  58. package/dist/client/lib/utils.js.map +1 -0
  59. package/dist/client/locales/en-US.d.ts +99 -0
  60. package/dist/client/locales/en-US.d.ts.map +1 -0
  61. package/dist/client/locales/en-US.js +92 -0
  62. package/dist/client/locales/en-US.js.map +1 -0
  63. package/dist/client/locales/index.d.ts +4 -0
  64. package/dist/client/locales/index.d.ts.map +1 -0
  65. package/dist/client/locales/index.js +7 -0
  66. package/dist/client/locales/index.js.map +1 -0
  67. package/dist/client/locales/zh-CN.d.ts +4 -0
  68. package/dist/client/locales/zh-CN.d.ts.map +1 -0
  69. package/dist/client/locales/zh-CN.js +92 -0
  70. package/dist/client/locales/zh-CN.js.map +1 -0
  71. package/dist/client/pages/configuration.d.ts +4 -0
  72. package/dist/client/pages/configuration.d.ts.map +1 -0
  73. package/dist/client/pages/configuration.js +34 -0
  74. package/dist/client/pages/configuration.js.map +1 -0
  75. package/dist/client/pages/data-requests.d.ts +3 -0
  76. package/dist/client/pages/data-requests.d.ts.map +1 -0
  77. package/dist/client/pages/data-requests.js +216 -0
  78. package/dist/client/pages/data-requests.js.map +1 -0
  79. package/dist/client/pages/incoming.d.ts +3 -0
  80. package/dist/client/pages/incoming.d.ts.map +1 -0
  81. package/dist/client/pages/incoming.js +128 -0
  82. package/dist/client/pages/incoming.js.map +1 -0
  83. package/dist/client/pages/tasks.d.ts +3 -0
  84. package/dist/client/pages/tasks.d.ts.map +1 -0
  85. package/dist/client/pages/tasks.js +116 -0
  86. package/dist/client/pages/tasks.js.map +1 -0
  87. package/dist/client/plugin.d.ts +4 -0
  88. package/dist/client/plugin.d.ts.map +1 -0
  89. package/dist/client/plugin.js +10 -0
  90. package/dist/client/plugin.js.map +1 -0
  91. package/dist/client/routes.d.ts +4 -0
  92. package/dist/client/routes.d.ts.map +1 -0
  93. package/dist/client/routes.js +51 -0
  94. package/dist/client/routes.js.map +1 -0
  95. package/dist/database/migrations/.manifest.json +9 -0
  96. package/dist/database/migrations/202610010001_office_flows_example_create_collections.d.ts +4 -0
  97. package/dist/database/migrations/202610010001_office_flows_example_create_collections.d.ts.map +1 -0
  98. package/dist/database/migrations/202610010001_office_flows_example_create_collections.js +280 -0
  99. package/dist/database/migrations/202610010001_office_flows_example_create_collections.js.map +1 -0
  100. package/dist/database/seeds/.manifest.json +9 -0
  101. package/dist/database/seeds/202610010002_office_flows_example_seed_configuration.d.ts +10 -0
  102. package/dist/database/seeds/202610010002_office_flows_example_seed_configuration.d.ts.map +1 -0
  103. package/dist/database/seeds/202610010002_office_flows_example_seed_configuration.js +104 -0
  104. package/dist/database/seeds/202610010002_office_flows_example_seed_configuration.js.map +1 -0
  105. package/dist/server/calendar.d.ts +35 -0
  106. package/dist/server/calendar.d.ts.map +1 -0
  107. package/dist/server/calendar.js +103 -0
  108. package/dist/server/calendar.js.map +1 -0
  109. package/dist/server/index.d.ts +2 -0
  110. package/dist/server/index.d.ts.map +1 -0
  111. package/dist/server/index.js +2 -0
  112. package/dist/server/index.js.map +1 -0
  113. package/dist/server/lifecycles/data-request.d.ts +36 -0
  114. package/dist/server/lifecycles/data-request.d.ts.map +1 -0
  115. package/dist/server/lifecycles/data-request.js +182 -0
  116. package/dist/server/lifecycles/data-request.js.map +1 -0
  117. package/dist/server/lifecycles/extraction.d.ts +21 -0
  118. package/dist/server/lifecycles/extraction.d.ts.map +1 -0
  119. package/dist/server/lifecycles/extraction.js +60 -0
  120. package/dist/server/lifecycles/extraction.js.map +1 -0
  121. package/dist/server/lifecycles/incoming.d.ts +27 -0
  122. package/dist/server/lifecycles/incoming.d.ts.map +1 -0
  123. package/dist/server/lifecycles/incoming.js +177 -0
  124. package/dist/server/lifecycles/incoming.js.map +1 -0
  125. package/dist/server/lifecycles/index.d.ts +8 -0
  126. package/dist/server/lifecycles/index.d.ts.map +1 -0
  127. package/dist/server/lifecycles/index.js +20 -0
  128. package/dist/server/lifecycles/index.js.map +1 -0
  129. package/dist/server/lifecycles/tasks.d.ts +63 -0
  130. package/dist/server/lifecycles/tasks.d.ts.map +1 -0
  131. package/dist/server/lifecycles/tasks.js +259 -0
  132. package/dist/server/lifecycles/tasks.js.map +1 -0
  133. package/dist/server/plugin.d.ts +4 -0
  134. package/dist/server/plugin.d.ts.map +1 -0
  135. package/dist/server/plugin.js +16 -0
  136. package/dist/server/plugin.js.map +1 -0
  137. package/dist/server/providers/index.d.ts +4 -0
  138. package/dist/server/providers/index.d.ts.map +1 -0
  139. package/dist/server/providers/index.js +6 -0
  140. package/dist/server/providers/index.js.map +1 -0
  141. package/dist/server/providers/office-flows.d.ts +23 -0
  142. package/dist/server/providers/office-flows.d.ts.map +1 -0
  143. package/dist/server/providers/office-flows.js +90 -0
  144. package/dist/server/providers/office-flows.js.map +1 -0
  145. package/dist/server/routes/index.d.ts +8 -0
  146. package/dist/server/routes/index.d.ts.map +1 -0
  147. package/dist/server/routes/index.js +553 -0
  148. package/dist/server/routes/index.js.map +1 -0
  149. package/dist/server/routes/schemas.d.ts +157 -0
  150. package/dist/server/routes/schemas.d.ts.map +1 -0
  151. package/dist/server/routes/schemas.js +188 -0
  152. package/dist/server/routes/schemas.js.map +1 -0
  153. package/dist/server/scope.d.ts +23 -0
  154. package/dist/server/scope.d.ts.map +1 -0
  155. package/dist/server/scope.js +23 -0
  156. package/dist/server/scope.js.map +1 -0
  157. package/dist/server/services/office-flows.d.ts +151 -0
  158. package/dist/server/services/office-flows.d.ts.map +1 -0
  159. package/dist/server/services/office-flows.js +603 -0
  160. package/dist/server/services/office-flows.js.map +1 -0
  161. package/dist/server/services/store.d.ts +119 -0
  162. package/dist/server/services/store.d.ts.map +1 -0
  163. package/dist/server/services/store.js +389 -0
  164. package/dist/server/services/store.js.map +1 -0
  165. package/dist/server/tokens.d.ts +4 -0
  166. package/dist/server/tokens.d.ts.map +1 -0
  167. package/dist/server/tokens.js +3 -0
  168. package/dist/server/tokens.js.map +1 -0
  169. package/dist/shared/data-request.d.ts +73 -0
  170. package/dist/shared/data-request.d.ts.map +1 -0
  171. package/dist/shared/data-request.js +182 -0
  172. package/dist/shared/data-request.js.map +1 -0
  173. package/dist/shared/fields.d.ts +12 -0
  174. package/dist/shared/fields.d.ts.map +1 -0
  175. package/dist/shared/fields.js +48 -0
  176. package/dist/shared/fields.js.map +1 -0
  177. package/dist/shared/people.d.ts +29 -0
  178. package/dist/shared/people.d.ts.map +1 -0
  179. package/dist/shared/people.js +54 -0
  180. package/dist/shared/people.js.map +1 -0
  181. package/dist/shared/routes.d.ts +7 -0
  182. package/dist/shared/routes.d.ts.map +1 -0
  183. package/dist/shared/routes.js +7 -0
  184. package/dist/shared/routes.js.map +1 -0
  185. package/dist/shared/text.d.ts +3 -0
  186. package/dist/shared/text.d.ts.map +1 -0
  187. package/dist/shared/text.js +9 -0
  188. package/dist/shared/text.js.map +1 -0
  189. package/package.json +72 -3
@@ -0,0 +1,182 @@
1
+ /**
2
+ * The data usage request form: which fields exist, which options they offer
3
+ * and when they appear. The page renders from these rules and the server
4
+ * validates with them, so the two cannot drift apart.
5
+ */
6
+ export const VOLUMES = [
7
+ 'x<50',
8
+ '50≤x<2万',
9
+ '2万≤x<50万',
10
+ 'x≥50万',
11
+ ];
12
+ export const FREQUENCIES = [
13
+ { value: 'once', label: '一次性' },
14
+ { value: 'quarterly', label: '每季度' },
15
+ { value: 'monthly', label: '每月' },
16
+ { value: 'weekly', label: '每周' },
17
+ { value: 'daily', label: '每日' },
18
+ { value: 'other', label: '其他固定频次' },
19
+ ];
20
+ export const SCOPES = [
21
+ { value: 'external', label: '对外交付' },
22
+ { value: 'internal', label: '内部离线使用' },
23
+ ];
24
+ export const CONSUMERS = {
25
+ external: [
26
+ '监管机构',
27
+ '第三方合作',
28
+ '客户',
29
+ '公检法',
30
+ '股东',
31
+ '外部合规风险审计',
32
+ ],
33
+ internal: ['内部合规风险审计', '内部管理及分析'],
34
+ };
35
+ export const WEEKDAYS = [
36
+ '周一',
37
+ '周二',
38
+ '周三',
39
+ '周四',
40
+ '周五',
41
+ '周六',
42
+ '周日',
43
+ ];
44
+ export const INTERNAL_ANALYSIS = '内部管理及分析';
45
+ export const THIRD_PARTY = '第三方合作';
46
+ export function emptyDataRequest() {
47
+ return {
48
+ subject: '',
49
+ reason: '',
50
+ volume: '',
51
+ frequency: '',
52
+ deliveryDate: '',
53
+ firstUseDate: '',
54
+ lastDeliveryDate: '',
55
+ quarterDay: null,
56
+ monthDay: null,
57
+ weekDay: null,
58
+ frequencyNote: '',
59
+ scope: '',
60
+ consumers: [],
61
+ fileShieldAccepted: null,
62
+ fileShieldScope: '',
63
+ fileShieldCopy: null,
64
+ fileShieldValidUntil: '',
65
+ ndaFiles: [],
66
+ securityFiles: [],
67
+ };
68
+ }
69
+ export function visibility(form) {
70
+ const periodic = form.frequency !== '' && form.frequency !== 'once';
71
+ return {
72
+ deliveryDate: form.frequency === 'once',
73
+ periodDates: periodic,
74
+ quarterDay: form.frequency === 'quarterly',
75
+ monthDay: form.frequency === 'monthly',
76
+ weekDay: form.frequency === 'weekly',
77
+ frequencyNote: form.frequency === 'other',
78
+ fileShield: form.consumers.includes(INTERNAL_ANALYSIS),
79
+ thirdParty: form.consumers.includes(THIRD_PARTY),
80
+ };
81
+ }
82
+ /** The consumer types the chosen scope offers. */
83
+ export function consumerOptions(scope) {
84
+ return scope === '' ? [] : CONSUMERS[scope];
85
+ }
86
+ const DATE = /^\d{4}-\d{2}-\d{2}$/;
87
+ /** A `YYYY-MM-DD` that names a real day: `2026-02-31` is refused, not moved to March. */
88
+ export function isDate(value) {
89
+ if (!DATE.test(value))
90
+ return false;
91
+ const time = Date.parse(`${value}T00:00:00Z`);
92
+ return (!Number.isNaN(time) && new Date(time).toISOString().slice(0, 10) === value);
93
+ }
94
+ /**
95
+ * Field → message for every problem; empty when the form may be submitted.
96
+ * Fields that are hidden for these values are neither required nor checked.
97
+ */
98
+ export function validateDataRequest(form) {
99
+ const errors = {};
100
+ const shown = visibility(form);
101
+ if (!form.subject.trim())
102
+ errors.subject = '请填写主题';
103
+ if (!form.reason.trim())
104
+ errors.reason = '请填写原因';
105
+ if (!VOLUMES.includes(form.volume))
106
+ errors.volume = '请选择预估数据量';
107
+ if (!FREQUENCIES.some((item) => item.value === form.frequency))
108
+ errors.frequency = '请选择数据使用频次';
109
+ if (shown.deliveryDate && !isDate(form.deliveryDate))
110
+ errors.deliveryDate = '请填写数据交付日期';
111
+ if (shown.periodDates) {
112
+ if (!isDate(form.firstUseDate))
113
+ errors.firstUseDate = '请填写数据首次使用日期';
114
+ if (!isDate(form.lastDeliveryDate))
115
+ errors.lastDeliveryDate = '请填写最后一次交付日期';
116
+ else if (isDate(form.firstUseDate) &&
117
+ form.lastDeliveryDate < form.firstUseDate)
118
+ errors.lastDeliveryDate = '最后一次交付日期不能早于首次使用日期';
119
+ }
120
+ if (shown.quarterDay &&
121
+ !(Number.isInteger(form.quarterDay) &&
122
+ form.quarterDay >= 1 &&
123
+ form.quarterDay <= 92))
124
+ errors.quarterDay = '请填写每季度的第几天(1–92)';
125
+ if (shown.monthDay &&
126
+ !(Number.isInteger(form.monthDay) &&
127
+ form.monthDay >= 1 &&
128
+ form.monthDay <= 31))
129
+ errors.monthDay = '请填写每月几号(1–31)';
130
+ if (shown.weekDay &&
131
+ !(Number.isInteger(form.weekDay) &&
132
+ form.weekDay >= 1 &&
133
+ form.weekDay <= 7))
134
+ errors.weekDay = '请选择周几';
135
+ if (shown.frequencyNote && !form.frequencyNote.trim())
136
+ errors.frequencyNote = '请填写其他频次描述';
137
+ if (!SCOPES.some((item) => item.value === form.scope))
138
+ errors.scope = '请选择数据使用范围';
139
+ const allowed = consumerOptions(form.scope);
140
+ if (!form.consumers.length)
141
+ errors.consumers = '请选择使用方类型';
142
+ else if (form.consumers.some((item) => !allowed.includes(item)))
143
+ errors.consumers = '使用方类型与数据使用范围不符';
144
+ if (shown.fileShield) {
145
+ if (form.fileShieldAccepted === null)
146
+ errors.fileShieldAccepted = '请选择是否接受使用文件盾';
147
+ if (!form.fileShieldScope.trim())
148
+ errors.fileShieldScope = '请填写授权人员范围';
149
+ if (form.fileShieldCopy === null)
150
+ errors.fileShieldCopy = '请选择复制权限';
151
+ if (!isDate(form.fileShieldValidUntil))
152
+ errors.fileShieldValidUntil = '请填写数据有效截至日期';
153
+ }
154
+ if (shown.thirdParty && !form.ndaFiles.length)
155
+ errors.ndaFiles = '请上传第三方保密协议';
156
+ return errors;
157
+ }
158
+ /**
159
+ * Drops the values of fields the choices hide, so a stored request never
160
+ * carries an answer to a question it did not ask.
161
+ */
162
+ export function normalizeDataRequest(form) {
163
+ const shown = visibility(form);
164
+ return {
165
+ ...form,
166
+ deliveryDate: shown.deliveryDate ? form.deliveryDate : '',
167
+ firstUseDate: shown.periodDates ? form.firstUseDate : '',
168
+ lastDeliveryDate: shown.periodDates ? form.lastDeliveryDate : '',
169
+ quarterDay: shown.quarterDay ? form.quarterDay : null,
170
+ monthDay: shown.monthDay ? form.monthDay : null,
171
+ weekDay: shown.weekDay ? form.weekDay : null,
172
+ frequencyNote: shown.frequencyNote ? form.frequencyNote : '',
173
+ consumers: form.consumers.filter((item) => consumerOptions(form.scope).includes(item)),
174
+ fileShieldAccepted: shown.fileShield ? form.fileShieldAccepted : null,
175
+ fileShieldScope: shown.fileShield ? form.fileShieldScope : '',
176
+ fileShieldCopy: shown.fileShield ? form.fileShieldCopy : null,
177
+ fileShieldValidUntil: shown.fileShield ? form.fileShieldValidUntil : '',
178
+ ndaFiles: shown.thirdParty ? form.ndaFiles : [],
179
+ securityFiles: shown.thirdParty ? form.securityFiles : [],
180
+ };
181
+ }
182
+ //# sourceMappingURL=data-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-request.js","sourceRoot":"","sources":["../../shared/data-request.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The fields a page may edit on each kind of record, in the state that
3
+ * allows it. The server keeps only these, and the pages send only these, so
4
+ * an edit never writes back a whole record it read.
5
+ */
6
+ export declare const INCOMING_FIELDS: readonly string[];
7
+ export declare const EXTRACTION_FIELDS: readonly string[];
8
+ export type TaskKind = 'clerk' | 'team' | 'executor';
9
+ export declare const TASK_FIELDS: Readonly<Record<TaskKind, readonly string[]>>;
10
+ /** `values` with only `fields`, as an edit sends them. */
11
+ export declare function pickEditable(values: Readonly<Record<string, unknown>>, fields: readonly string[]): Record<string, unknown>;
12
+ //# sourceMappingURL=fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../shared/fields.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAY5C,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAW9C,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;AAErD,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC,CAUrE,CAAC;AAEF,0DAA0D;AAC1D,wBAAgB,YAAY,CAC1B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzC,MAAM,EAAE,SAAS,MAAM,EAAE,GACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzB"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * The fields a page may edit on each kind of record, in the state that
3
+ * allows it. The server keeps only these, and the pages send only these, so
4
+ * an edit never writes back a whole record it read.
5
+ */
6
+ export const INCOMING_FIELDS = [
7
+ 'title',
8
+ 'code',
9
+ 'sender',
10
+ 'senderRef',
11
+ 'summary',
12
+ 'officeOpinion',
13
+ 'attachments',
14
+ 'distributionType',
15
+ 'officeHeadId',
16
+ 'officeLeaderId',
17
+ 'ccManagement',
18
+ ];
19
+ export const EXTRACTION_FIELDS = [
20
+ 'category',
21
+ 'complexity',
22
+ 'agreedDeliveryAt',
23
+ 'sourceSystem',
24
+ 'needsDownload',
25
+ 'feedbackNote',
26
+ 'feedbackFiles',
27
+ 'reviewerId',
28
+ 'managerId',
29
+ 'confirmerId',
30
+ ];
31
+ export const TASK_FIELDS = {
32
+ clerk: [
33
+ 'opinion',
34
+ 'redHeadFeedback',
35
+ 'outgoingRef',
36
+ 'attachments',
37
+ 'feedback',
38
+ ],
39
+ team: ['opinion', 'redHeadFeedback', 'attachments', 'feedback'],
40
+ executor: ['redHeadFeedback', 'attachments', 'feedback'],
41
+ };
42
+ /** `values` with only `fields`, as an edit sends them. */
43
+ export function pickEditable(values, fields) {
44
+ return Object.fromEntries(fields
45
+ .filter((field) => field in values)
46
+ .map((field) => [field, values[field]]));
47
+ }
48
+ //# sourceMappingURL=fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../shared/fields.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAsB;IAChD,OAAO;IACP,MAAM;IACN,QAAQ;IACR,WAAW;IACX,SAAS;IACT,eAAe;IACf,aAAa;IACb,kBAAkB;IAClB,cAAc;IACd,gBAAgB;IAChB,cAAc;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD,UAAU;IACV,YAAY;IACZ,kBAAkB;IAClB,cAAc;IACd,eAAe;IACf,cAAc;IACd,eAAe;IACf,YAAY;IACZ,WAAW;IACX,aAAa;CACd,CAAC;AAIF,MAAM,CAAC,MAAM,WAAW,GAAkD;IACxE,KAAK,EAAE;QACL,SAAS;QACT,iBAAiB;QACjB,aAAa;QACb,aAAa;QACb,UAAU;KACX;IACD,IAAI,EAAE,CAAC,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,UAAU,CAAC;IAC/D,QAAQ,EAAE,CAAC,iBAAiB,EAAE,aAAa,EAAE,UAAU,CAAC;CACzD,CAAC;AAEF,0DAA0D;AAC1D,MAAM,UAAU,YAAY,CAC1B,MAAyC,EACzC,MAAyB;IAEzB,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM;SACH,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,MAAM,CAAC;SAClC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAC1C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The people the example's pages let you act as. A real application takes
3
+ * the actor from the signed-in user and its organization; the example keeps
4
+ * a fixed cast so one person can play every role.
5
+ */
6
+ export interface Person {
7
+ readonly id: string;
8
+ readonly name: string;
9
+ readonly title: string;
10
+ }
11
+ export declare const PEOPLE: readonly Person[];
12
+ export declare function isPerson(id: unknown): id is string;
13
+ export declare function personName(id: string): string;
14
+ /** The fixed approval chain of a data usage request. */
15
+ export declare const DATA_REQUEST_ROLES: {
16
+ readonly applicant: string;
17
+ readonly level1: string;
18
+ readonly level2: string;
19
+ readonly level3: string;
20
+ readonly acceptor: string;
21
+ readonly executors: readonly string[];
22
+ };
23
+ /** The office roles of an incoming document. */
24
+ export declare const INCOMING_ROLES: {
25
+ readonly registrar: string;
26
+ readonly officeHead: string;
27
+ readonly officeLeader: string;
28
+ };
29
+ //# sourceMappingURL=people.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"people.d.ts","sourceRoot":"","sources":["../../shared/people.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,MAAM,EAAE,SAAS,MAAM,EA8BnC,CAAC;AAMF,wBAAgB,QAAQ,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,MAAM,CAElD;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,EAAE;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CAQtC,CAAC;AAEH,gDAAgD;AAChD,eAAO,MAAM,cAAc,EAAE;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAK9B,CAAC"}
@@ -0,0 +1,54 @@
1
+ export const PEOPLE = [
2
+ // Data usage request
3
+ { id: 'zhangwei', name: '张伟', title: '业务部门 · 申请人' },
4
+ { id: 'lina', name: '李娜', title: '一级主管' },
5
+ { id: 'wangqiang', name: '王强', title: '二级主管' },
6
+ { id: 'zhaomin', name: '赵敏', title: '三级主管' },
7
+ { id: 'chenjing', name: '陈静', title: '数据管理 · 抽数受理' },
8
+ { id: 'liuyang', name: '刘洋', title: '抽数执行人' },
9
+ { id: 'sunli', name: '孙丽', title: '抽数执行人' },
10
+ // Incoming documents: the office
11
+ { id: 'zhoujie', name: '周杰', title: '办公室 · 收文员' },
12
+ { id: 'wuhua', name: '吴华', title: '办公室部门主管' },
13
+ { id: 'zhengkai', name: '郑凯', title: '办公室分管领导' },
14
+ // Incoming documents: departments
15
+ { id: 'huangtao', name: '黄涛', title: '信息技术部 · 办事人员' },
16
+ { id: 'xulei', name: '徐磊', title: '信息技术部 · 部门主管' },
17
+ { id: 'gaoyan', name: '高燕', title: '财务部 · 办事人员' },
18
+ { id: 'linfeng', name: '林峰', title: '财务部 · 办事人员' },
19
+ { id: 'heming', name: '何明', title: '财务部、工会 · 部门主管' },
20
+ { id: 'mahui', name: '马慧', title: '分管领导' },
21
+ { id: 'luoxin', name: '罗欣', title: '工会 · 办事人员' },
22
+ { id: 'songyu', name: '宋雨', title: '分管领导' },
23
+ { id: 'tangjun', name: '唐军', title: '董事会办公室 · 办事人员' },
24
+ { id: 'fanqing', name: '范青', title: '董事会办公室 · 部门主管' },
25
+ { id: 'guoning', name: '郭宁', title: '风险管理部 · 办事人员' },
26
+ { id: 'denghui', name: '邓辉', title: '风险管理部 · 部门主管' },
27
+ // Company management
28
+ { id: 'yeqing', name: '叶青', title: '公司管理层' },
29
+ { id: 'caobin', name: '曹斌', title: '公司管理层' },
30
+ { id: 'jiangli', name: '江丽', title: '公司管理层' },
31
+ ];
32
+ const BY_ID = new Map(PEOPLE.map((person) => [person.id, person]));
33
+ export function isPerson(id) {
34
+ return typeof id === 'string' && BY_ID.has(id);
35
+ }
36
+ export function personName(id) {
37
+ return BY_ID.get(id)?.name ?? id;
38
+ }
39
+ /** The fixed approval chain of a data usage request. */
40
+ export const DATA_REQUEST_ROLES = Object.freeze({
41
+ applicant: 'zhangwei',
42
+ level1: 'lina',
43
+ level2: 'wangqiang',
44
+ level3: 'zhaomin',
45
+ acceptor: 'chenjing',
46
+ executors: ['liuyang', 'sunli'],
47
+ });
48
+ /** The office roles of an incoming document. */
49
+ export const INCOMING_ROLES = Object.freeze({
50
+ registrar: 'zhoujie',
51
+ officeHead: 'wuhua',
52
+ officeLeader: 'zhengkai',
53
+ });
54
+ //# sourceMappingURL=people.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"people.js","sourceRoot":"","sources":["../../shared/people.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Where this plugin's routes start, relative to the API base: the plugin's
3
+ * namespace, and so the domain of its errors. Every server route and the
4
+ * client's requests read it, so they cannot drift apart.
5
+ */
6
+ export declare const OFFICE_FLOWS_ROUTES: string;
7
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../shared/routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAA6B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Where this plugin's routes start, relative to the API base: the plugin's
3
+ * namespace, and so the domain of its errors. Every server route and the
4
+ * client's requests read it, so they cannot drift apart.
5
+ */
6
+ export const OFFICE_FLOWS_ROUTES = 'officeFlowsExample';
7
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../shared/routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAW,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** A stored scalar as display text; anything else is empty. */
2
+ export declare function text(value: unknown): string;
3
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../shared/text.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAK3C"}
@@ -0,0 +1,9 @@
1
+ /** A stored scalar as display text; anything else is empty. */
2
+ export function text(value) {
3
+ if (typeof value === 'string')
4
+ return value;
5
+ if (typeof value === 'number' || typeof value === 'boolean')
6
+ return String(value);
7
+ return '';
8
+ }
9
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../shared/text.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,UAAU,IAAI,CAAC,KAAc;IACjC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;QACzD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC;AACZ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,75 @@
1
1
  {
2
2
  "name": "@nocobase/app-plugin-office-flows-example",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "displayName": "Office Flows Example App Plugin",
4
+ "description": "Example app plugin running two office processes on record lifecycles: a data usage request with scheduled extraction tasks, and incoming document distribution with three levels of sub-tasks.",
5
+ "version": "0.1.0-beta.0",
6
+ "type": "module",
7
+ "prettier": "@nocobase/dev-config/prettier",
8
+ "engines": {
9
+ "node": ">=24.0.0"
10
+ },
11
+ "sideEffects": false,
12
+ "exports": {
13
+ "./server": {
14
+ "types": "./dist/server/index.d.ts",
15
+ "import": "./dist/server/index.js"
16
+ },
17
+ "./client": {
18
+ "types": "./dist/client/index.d.ts",
19
+ "import": "./dist/client/index.js"
20
+ },
21
+ "./package.json": "./package.json"
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "README.md",
26
+ "CHANGELOG.md"
27
+ ],
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "dependencies": {
32
+ "hono": "^4.13.2",
33
+ "zod": "^4.6.5"
34
+ },
35
+ "peerDependencies": {
36
+ "@base-ui/react": "^1.6.0",
37
+ "class-variance-authority": "^0.7.1",
38
+ "cn": "^0.4.0",
39
+ "lucide-react": "^0.487.0",
40
+ "react": "^19.0.0",
41
+ "@nocobase/app-client": "^2.0.0-beta.2",
42
+ "@nocobase/app-plugin-authentication": "^2.0.0-beta.2",
43
+ "@nocobase/app-server": "^2.0.0-beta.1",
44
+ "@nocobase/db": "^1.0.0-beta.18",
45
+ "@nocobase/i18n": "^1.0.0-beta.5",
46
+ "@nocobase/jobs": "^0.1.0-beta.2",
47
+ "@nocobase/lifecycle": "^0.1.0-beta.0",
48
+ "@nocobase/service-provider": "^0.0.2-beta.1"
49
+ },
50
+ "devDependencies": {
51
+ "@testing-library/jest-dom": "^7.0.0",
52
+ "@testing-library/react": "^16.3.2",
53
+ "@types/node": "^24.0.0",
54
+ "@types/react": "^19.2.0",
55
+ "eslint": "^10.0.0",
56
+ "jsdom": "^30.0.1",
57
+ "prettier": "^3.9.6",
58
+ "react-dom": "^19.2.8",
59
+ "typescript": "^6.0.3",
60
+ "vitest": "^4.1.10",
61
+ "@nocobase/app-testing": "0.1.0-beta.1",
62
+ "@nocobase/dev-config": "0.1.0-beta.19"
63
+ },
64
+ "scripts": {
65
+ "build": "tsc -p tsconfig.json && nocobase-db-manifests",
66
+ "typecheck": "tsc -p tsconfig.json --noEmit",
67
+ "test": "vitest run --passWithNoTests",
68
+ "lint": "eslint . --max-warnings 0",
69
+ "lint:fix": "eslint . --fix --max-warnings 0",
70
+ "format": "prettier . --write",
71
+ "format:check": "prettier . --check",
72
+ "check": "pnpm lint && pnpm format:check && pnpm typecheck && pnpm test && pnpm build",
73
+ "fix": "pnpm lint:fix && pnpm format"
74
+ }
6
75
  }