@pisell/private-materials 6.6.28 → 6.6.30

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 (196) hide show
  1. package/build/lowcode/assets-daily.json +11 -11
  2. package/build/lowcode/assets-dev.json +2 -2
  3. package/build/lowcode/assets-prod.json +11 -11
  4. package/build/lowcode/index.js +1 -1
  5. package/build/lowcode/meta.js +2 -2
  6. package/build/lowcode/preview.js +7 -7
  7. package/build/lowcode/render/default/view.css +1 -1
  8. package/build/lowcode/render/default/view.js +8 -8
  9. package/build/lowcode/view.css +1 -1
  10. package/build/lowcode/view.js +9 -9
  11. package/es/components/booking/forms/sendModal/useSendModal.d.ts +0 -1
  12. package/es/components/booking/info/clientVariant/hooks/useIsLowSpeedNetwork.d.ts +0 -1
  13. package/es/components/booking/info/hooks/useInfoHolder.d.ts +0 -1
  14. package/es/components/booking/info/service2/utils.d.ts +1 -1
  15. package/es/components/eftpos/hooks.d.ts +0 -1
  16. package/es/components/eftposPay/amount.d.ts +1 -1
  17. package/es/components/eftposPay/device.d.ts +1 -1
  18. package/es/components/eftposPay/hooks.d.ts +2 -2
  19. package/es/components/eftposPay/store/index.d.ts +5 -5
  20. package/es/components/eftposPay/tyro/hooks.d.ts +0 -1
  21. package/es/components/eventBooking/components/ErrorTip/index.d.ts +0 -1
  22. package/es/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateStatus/index.d.ts +0 -1
  23. package/es/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/CallToBook/index.d.ts +0 -1
  24. package/es/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/WeekItem/index.d.ts +0 -1
  25. package/es/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/index.d.ts +0 -1
  26. package/es/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/Item/DayItem/index.d.ts +0 -1
  27. package/es/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/Item/index.d.ts +0 -1
  28. package/es/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/Status/index.d.ts +0 -1
  29. package/es/components/pay/toC/PaymentMethods/StripePay/Stripe/Finish/index.d.ts +0 -1
  30. package/es/components/pay/toC/PaymentMethods/StripePay/Stripe/StripeSDK/index.d.ts +0 -1
  31. package/es/components/pay/toC/PaymentMethods/StripePay/Stripe/components/PageLoading/index.d.ts +0 -1
  32. package/es/components/shoppingCart/components/Empty/index.d.ts +0 -1
  33. package/es/components/ticketBooking/utils/index.d.ts +1 -1
  34. package/es/hooks/usePaymentLogger.d.ts +0 -1
  35. package/es/index.d.ts +4 -0
  36. package/es/index.js +4 -1
  37. package/es/plus/productSelect/ProductCard/SkuCard/components/Capacity/index.d.ts +1 -1
  38. package/es/plus/productSelect/ProductCard/SkuCard/components/CardMask/index.d.ts +1 -1
  39. package/es/plus/productSelect/ProductCard/SkuCard/components/Countdown/index.d.ts +1 -1
  40. package/es/plus/productSelect/ProductCard/SkuCard/components/Duration/index.d.ts +1 -1
  41. package/es/plus/productSelect/ProductCard/SkuCard/components/MemberPrice/index.d.ts +1 -1
  42. package/es/plus/productSelect/ProductCard/SkuCard/components/Resource/index.d.ts +1 -1
  43. package/es/plus/productSelect/ProductCard/SkuCard/components/Stock/index.d.ts +1 -1
  44. package/es/plus/productSelect/ProductCard/SkuCard/components/Time/index.d.ts +1 -1
  45. package/es/plus/saasAttendance/index.d.ts +6 -0
  46. package/es/plus/saasAttendance/index.js +5 -0
  47. package/es/plus/saasAttendance/locales.d.ts +318 -0
  48. package/es/plus/saasAttendance/locales.js +354 -0
  49. package/es/plus/saasAttendance/settings/BasicInfoTab.d.ts +5 -0
  50. package/es/plus/saasAttendance/settings/BasicInfoTab.js +96 -0
  51. package/es/plus/saasAttendance/settings/ClockInMethodTab.d.ts +8 -0
  52. package/es/plus/saasAttendance/settings/ClockInMethodTab.js +81 -0
  53. package/es/plus/saasAttendance/settings/CorrectionPolicyTab.d.ts +8 -0
  54. package/es/plus/saasAttendance/settings/CorrectionPolicyTab.js +293 -0
  55. package/es/plus/saasAttendance/settings/ShiftScheduleTab.d.ts +5 -0
  56. package/es/plus/saasAttendance/settings/ShiftScheduleTab.js +109 -0
  57. package/es/plus/saasAttendance/settings/components/MapField.d.ts +78 -0
  58. package/es/plus/saasAttendance/settings/components/MapField.js +810 -0
  59. package/es/plus/saasAttendance/settings/components/index.d.ts +3 -0
  60. package/es/plus/saasAttendance/settings/components/index.js +2 -0
  61. package/es/plus/saasAttendance/settings/components/membersField/index.d.ts +8 -0
  62. package/es/plus/saasAttendance/settings/components/membersField/index.js +216 -0
  63. package/es/plus/saasAttendance/settings/components/membersField/index.less +70 -0
  64. package/es/plus/saasAttendance/settings/components/shiftModal/index.d.ts +18 -0
  65. package/es/plus/saasAttendance/settings/components/shiftModal/index.js +438 -0
  66. package/es/plus/saasAttendance/settings/index.d.ts +18 -0
  67. package/es/plus/saasAttendance/settings/index.js +255 -0
  68. package/es/plus/saasAttendance/settings/index.less +495 -0
  69. package/es/plus/saasAttendance/settings/serve.d.ts +27 -0
  70. package/es/plus/saasAttendance/settings/serve.js +83 -0
  71. package/es/plus/saasAttendance/settings/types.d.ts +128 -0
  72. package/es/plus/saasAttendance/settings/types.js +1 -0
  73. package/es/plus/saasRole/components/PermissionManager/index.d.ts +19 -0
  74. package/es/plus/saasRole/components/PermissionManager/index.js +211 -0
  75. package/es/plus/saasRole/components/PermissionManager/index.less +71 -0
  76. package/es/plus/saasRole/index.d.ts +14 -0
  77. package/es/plus/saasRole/index.js +1036 -0
  78. package/es/plus/saasRole/index.less +196 -0
  79. package/es/plus/saasRole/locales.d.ts +193 -0
  80. package/es/plus/saasRole/locales.js +193 -0
  81. package/es/plus/saasRole/serve.d.ts +72 -0
  82. package/es/plus/saasRole/serve.js +304 -0
  83. package/es/plus/saasRole/types.d.ts +175 -0
  84. package/es/plus/saasRole/types.js +1 -0
  85. package/es/plus/saasRole/utils.d.ts +0 -0
  86. package/es/plus/saasRole/utils.js +0 -0
  87. package/es/plus/saasTeamMembers/components/MemberDrawer/ExtensionFormTabContent.d.ts +31 -0
  88. package/es/plus/saasTeamMembers/components/MemberDrawer/ExtensionFormTabContent.js +503 -0
  89. package/es/plus/saasTeamMembers/components/MemberDrawer/index.d.ts +23 -0
  90. package/es/plus/saasTeamMembers/components/MemberDrawer/index.js +634 -0
  91. package/es/plus/saasTeamMembers/components/MemberDrawer/index.less +178 -0
  92. package/es/plus/saasTeamMembers/index.d.ts +5 -0
  93. package/es/plus/saasTeamMembers/index.js +529 -0
  94. package/es/plus/saasTeamMembers/index.less +87 -0
  95. package/es/plus/saasTeamMembers/locales.d.ts +330 -0
  96. package/es/plus/saasTeamMembers/locales.js +375 -0
  97. package/es/plus/saasTeamMembers/serve.d.ts +95 -0
  98. package/es/plus/saasTeamMembers/serve.js +374 -0
  99. package/es/plus/saasTeamMembers/type.d.ts +156 -0
  100. package/es/plus/saasTeamMembers/type.js +1 -0
  101. package/es/plus/selectHolder/components/ErrorTip/index.d.ts +0 -1
  102. package/lib/components/booking/forms/sendModal/useSendModal.d.ts +0 -1
  103. package/lib/components/booking/info/clientVariant/hooks/useIsLowSpeedNetwork.d.ts +0 -1
  104. package/lib/components/booking/info/hooks/useInfoHolder.d.ts +0 -1
  105. package/lib/components/booking/info/service2/utils.d.ts +1 -1
  106. package/lib/components/eftpos/hooks.d.ts +0 -1
  107. package/lib/components/eftposPay/amount.d.ts +1 -1
  108. package/lib/components/eftposPay/device.d.ts +1 -1
  109. package/lib/components/eftposPay/hooks.d.ts +2 -2
  110. package/lib/components/eftposPay/store/index.d.ts +5 -5
  111. package/lib/components/eftposPay/tyro/hooks.d.ts +0 -1
  112. package/lib/components/eventBooking/components/ErrorTip/index.d.ts +0 -1
  113. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateStatus/index.d.ts +0 -1
  114. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/CallToBook/index.d.ts +0 -1
  115. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/WeekItem/index.d.ts +0 -1
  116. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/index.d.ts +0 -1
  117. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/Item/DayItem/index.d.ts +0 -1
  118. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/Item/index.d.ts +0 -1
  119. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/Status/index.d.ts +0 -1
  120. package/lib/components/pay/toC/PaymentMethods/StripePay/Stripe/Finish/index.d.ts +0 -1
  121. package/lib/components/pay/toC/PaymentMethods/StripePay/Stripe/StripeSDK/index.d.ts +0 -1
  122. package/lib/components/pay/toC/PaymentMethods/StripePay/Stripe/components/PageLoading/index.d.ts +0 -1
  123. package/lib/components/shoppingCart/components/Empty/index.d.ts +0 -1
  124. package/lib/components/ticketBooking/utils/index.d.ts +1 -1
  125. package/lib/hooks/usePaymentLogger.d.ts +0 -1
  126. package/lib/index.d.ts +4 -0
  127. package/lib/index.js +9 -0
  128. package/lib/plus/productSelect/ProductCard/SkuCard/components/Capacity/index.d.ts +1 -1
  129. package/lib/plus/productSelect/ProductCard/SkuCard/components/CardMask/index.d.ts +1 -1
  130. package/lib/plus/productSelect/ProductCard/SkuCard/components/Countdown/index.d.ts +1 -1
  131. package/lib/plus/productSelect/ProductCard/SkuCard/components/Duration/index.d.ts +1 -1
  132. package/lib/plus/productSelect/ProductCard/SkuCard/components/MemberPrice/index.d.ts +1 -1
  133. package/lib/plus/productSelect/ProductCard/SkuCard/components/Resource/index.d.ts +1 -1
  134. package/lib/plus/productSelect/ProductCard/SkuCard/components/Stock/index.d.ts +1 -1
  135. package/lib/plus/productSelect/ProductCard/SkuCard/components/Time/index.d.ts +1 -1
  136. package/lib/plus/saasAttendance/index.d.ts +6 -0
  137. package/lib/plus/saasAttendance/index.js +39 -0
  138. package/lib/plus/saasAttendance/locales.d.ts +318 -0
  139. package/lib/plus/saasAttendance/locales.js +342 -0
  140. package/lib/plus/saasAttendance/settings/BasicInfoTab.d.ts +5 -0
  141. package/lib/plus/saasAttendance/settings/BasicInfoTab.js +152 -0
  142. package/lib/plus/saasAttendance/settings/ClockInMethodTab.d.ts +8 -0
  143. package/lib/plus/saasAttendance/settings/ClockInMethodTab.js +88 -0
  144. package/lib/plus/saasAttendance/settings/CorrectionPolicyTab.d.ts +8 -0
  145. package/lib/plus/saasAttendance/settings/CorrectionPolicyTab.js +369 -0
  146. package/lib/plus/saasAttendance/settings/ShiftScheduleTab.d.ts +5 -0
  147. package/lib/plus/saasAttendance/settings/ShiftScheduleTab.js +106 -0
  148. package/lib/plus/saasAttendance/settings/components/MapField.d.ts +78 -0
  149. package/lib/plus/saasAttendance/settings/components/MapField.js +631 -0
  150. package/lib/plus/saasAttendance/settings/components/index.d.ts +3 -0
  151. package/lib/plus/saasAttendance/settings/components/index.js +42 -0
  152. package/lib/plus/saasAttendance/settings/components/membersField/index.d.ts +8 -0
  153. package/lib/plus/saasAttendance/settings/components/membersField/index.js +247 -0
  154. package/lib/plus/saasAttendance/settings/components/membersField/index.less +70 -0
  155. package/lib/plus/saasAttendance/settings/components/shiftModal/index.d.ts +18 -0
  156. package/lib/plus/saasAttendance/settings/components/shiftModal/index.js +447 -0
  157. package/lib/plus/saasAttendance/settings/index.d.ts +18 -0
  158. package/lib/plus/saasAttendance/settings/index.js +283 -0
  159. package/lib/plus/saasAttendance/settings/index.less +495 -0
  160. package/lib/plus/saasAttendance/settings/serve.d.ts +27 -0
  161. package/lib/plus/saasAttendance/settings/serve.js +54 -0
  162. package/lib/plus/saasAttendance/settings/types.d.ts +128 -0
  163. package/lib/plus/saasAttendance/settings/types.js +17 -0
  164. package/lib/plus/saasRole/components/PermissionManager/index.d.ts +19 -0
  165. package/lib/plus/saasRole/components/PermissionManager/index.js +159 -0
  166. package/lib/plus/saasRole/components/PermissionManager/index.less +71 -0
  167. package/lib/plus/saasRole/index.d.ts +14 -0
  168. package/lib/plus/saasRole/index.js +780 -0
  169. package/lib/plus/saasRole/index.less +196 -0
  170. package/lib/plus/saasRole/locales.d.ts +193 -0
  171. package/lib/plus/saasRole/locales.js +219 -0
  172. package/lib/plus/saasRole/serve.d.ts +72 -0
  173. package/lib/plus/saasRole/serve.js +100 -0
  174. package/lib/plus/saasRole/types.d.ts +175 -0
  175. package/lib/plus/saasRole/types.js +17 -0
  176. package/lib/plus/saasRole/utils.d.ts +0 -0
  177. package/lib/plus/saasRole/utils.js +0 -0
  178. package/lib/plus/saasTeamMembers/components/MemberDrawer/ExtensionFormTabContent.d.ts +31 -0
  179. package/lib/plus/saasTeamMembers/components/MemberDrawer/ExtensionFormTabContent.js +393 -0
  180. package/lib/plus/saasTeamMembers/components/MemberDrawer/index.d.ts +23 -0
  181. package/lib/plus/saasTeamMembers/components/MemberDrawer/index.js +672 -0
  182. package/lib/plus/saasTeamMembers/components/MemberDrawer/index.less +178 -0
  183. package/lib/plus/saasTeamMembers/index.d.ts +5 -0
  184. package/lib/plus/saasTeamMembers/index.js +448 -0
  185. package/lib/plus/saasTeamMembers/index.less +87 -0
  186. package/lib/plus/saasTeamMembers/locales.d.ts +330 -0
  187. package/lib/plus/saasTeamMembers/locales.js +401 -0
  188. package/lib/plus/saasTeamMembers/serve.d.ts +95 -0
  189. package/lib/plus/saasTeamMembers/serve.js +132 -0
  190. package/lib/plus/saasTeamMembers/type.d.ts +156 -0
  191. package/lib/plus/saasTeamMembers/type.js +17 -0
  192. package/lib/plus/selectHolder/components/ErrorTip/index.d.ts +0 -1
  193. package/lowcode/saas-attendance-settings/meta.ts +56 -0
  194. package/lowcode/saas-role/meta.ts +35 -0
  195. package/lowcode/saas-team-members/meta.ts +35 -0
  196. package/package.json +4 -4
@@ -0,0 +1,672 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+
29
+ // src/plus/saasTeamMembers/components/MemberDrawer/index.tsx
30
+ var MemberDrawer_exports = {};
31
+ __export(MemberDrawer_exports, {
32
+ default: () => MemberDrawer_default
33
+ });
34
+ module.exports = __toCommonJS(MemberDrawer_exports);
35
+ var import_react = __toESM(require("react"));
36
+ var import_antd = require("antd");
37
+ var import_materials = require("@pisell/materials");
38
+ var import_ahooks = require("ahooks");
39
+ var import_lodash = require("lodash");
40
+ var import_serve = require("../../serve");
41
+ var import_ExtensionFormTabContent = __toESM(require("./ExtensionFormTabContent"));
42
+ var import_index = require("./index.less");
43
+ var AntdDrawer = import_materials.Drawer;
44
+ var AntdButton = import_materials.Button;
45
+ var isValueEqual = (a, b) => {
46
+ if (a === "" && b == null || a == null && b === "") return true;
47
+ if (Array.isArray(a) && Array.isArray(b)) {
48
+ return (0, import_lodash.isEqual)((0, import_lodash.sortBy)(a), (0, import_lodash.sortBy)(b));
49
+ }
50
+ return (0, import_lodash.isEqual)(a, b);
51
+ };
52
+ var PREFIX = "saas-member-drawer";
53
+ var MemberDrawer = ({
54
+ visible,
55
+ mode,
56
+ currentMember,
57
+ roleOptions,
58
+ roles,
59
+ onClose,
60
+ onSubmit,
61
+ loading,
62
+ getText,
63
+ getLocaleText,
64
+ tenantId,
65
+ mypisellData,
66
+ locale
67
+ }) => {
68
+ const [form] = import_antd.Form.useForm();
69
+ const [activeTab, setActiveTab] = (0, import_react.useState)("basic");
70
+ const [selectedRoleIds, setSelectedRoleIds] = (0, import_react.useState)([]);
71
+ const [isEmailRegistered, setIsEmailRegistered] = (0, import_react.useState)(false);
72
+ const [checkingEmail, setCheckingEmail] = (0, import_react.useState)(false);
73
+ const [isBasicFormDirty, setIsBasicFormDirty] = (0, import_react.useState)(false);
74
+ const [iframeDirtyStates, setIframeDirtyStates] = (0, import_react.useState)({});
75
+ const extensionTabRefs = (0, import_react.useRef)(
76
+ {}
77
+ );
78
+ const initialValuesRef = (0, import_react.useRef)(null);
79
+ const [modal, contextHolder] = import_antd.Modal.useModal();
80
+ const isFormDirty = (0, import_react.useMemo)(() => {
81
+ const hasIframeDirty = Object.values(iframeDirtyStates).some(Boolean);
82
+ return isBasicFormDirty || hasIframeDirty;
83
+ }, [isBasicFormDirty, iframeDirtyStates]);
84
+ const handleIframeDirtyChange = (0, import_react.useCallback)(
85
+ (formId, isDirty) => {
86
+ setIframeDirtyStates((prev) => ({
87
+ ...prev,
88
+ [formId]: isDirty
89
+ }));
90
+ },
91
+ []
92
+ );
93
+ const checkFormDirty = (0, import_react.useCallback)(() => {
94
+ if (!initialValuesRef.current) return;
95
+ const currentValues = form.getFieldsValue();
96
+ const initialValues = initialValuesRef.current;
97
+ const fieldsToCompare = [
98
+ "nickname",
99
+ "member_id",
100
+ "status",
101
+ "tenant_role_ids",
102
+ "email",
103
+ "password",
104
+ "first_name",
105
+ "last_name",
106
+ "phone"
107
+ ];
108
+ for (const field of fieldsToCompare) {
109
+ if (!isValueEqual(currentValues[field], initialValues[field])) {
110
+ setIsBasicFormDirty(true);
111
+ return;
112
+ }
113
+ }
114
+ setIsBasicFormDirty(false);
115
+ }, [form]);
116
+ (0, import_react.useEffect)(() => {
117
+ var _a, _b, _c, _d, _e;
118
+ if (visible) {
119
+ let values;
120
+ if (mode === "edit" && currentMember) {
121
+ const roleIds = ((_a = currentMember.roles) == null ? void 0 : _a.map((r) => r.id)) || [];
122
+ values = {
123
+ nickname: currentMember.nickname || "",
124
+ member_id: currentMember.member_id || "",
125
+ status: currentMember.status || "active",
126
+ tenant_role_ids: roleIds,
127
+ email: ((_b = currentMember.account) == null ? void 0 : _b.email) || "",
128
+ first_name: ((_c = currentMember.account) == null ? void 0 : _c.first_name) || "",
129
+ last_name: ((_d = currentMember.account) == null ? void 0 : _d.last_name) || "",
130
+ phone: ((_e = currentMember.account) == null ? void 0 : _e.phone) || ""
131
+ };
132
+ form.setFieldsValue(values);
133
+ setSelectedRoleIds(roleIds);
134
+ setIsEmailRegistered(false);
135
+ } else {
136
+ values = {
137
+ nickname: "",
138
+ member_id: "",
139
+ status: "active",
140
+ tenant_role_ids: [],
141
+ email: "",
142
+ password: "",
143
+ first_name: "",
144
+ last_name: "",
145
+ phone: ""
146
+ };
147
+ form.resetFields();
148
+ form.setFieldsValue(values);
149
+ setSelectedRoleIds([]);
150
+ setIsEmailRegistered(false);
151
+ }
152
+ initialValuesRef.current = values;
153
+ setIsBasicFormDirty(false);
154
+ setIframeDirtyStates({});
155
+ setActiveTab("basic");
156
+ }
157
+ }, [visible, mode, currentMember, form]);
158
+ const handleFormValuesChange = (0, import_react.useCallback)(() => {
159
+ setTimeout(checkFormDirty, 0);
160
+ }, [checkFormDirty]);
161
+ const { run: checkEmail } = (0, import_ahooks.useDebounceFn)(
162
+ async (email) => {
163
+ if (!email || mode === "edit") {
164
+ setIsEmailRegistered(false);
165
+ setCheckingEmail(false);
166
+ return;
167
+ }
168
+ setCheckingEmail(true);
169
+ try {
170
+ const account = await (0, import_serve.getAccountByEmail)({
171
+ filter: JSON.stringify({
172
+ tenant_id: tenantId,
173
+ email
174
+ })
175
+ });
176
+ if (account == null ? void 0 : account.id) {
177
+ const { first_name, last_name, phone } = account;
178
+ form.setFieldsValue({
179
+ first_name,
180
+ last_name,
181
+ phone
182
+ });
183
+ setIsEmailRegistered(true);
184
+ } else {
185
+ setIsEmailRegistered(false);
186
+ }
187
+ } catch (error) {
188
+ } finally {
189
+ setCheckingEmail(false);
190
+ }
191
+ },
192
+ { wait: 500 }
193
+ );
194
+ const handleEmailChange = (0, import_react.useCallback)(
195
+ (e) => {
196
+ const email = e.target.value;
197
+ if (mode === "create") {
198
+ checkEmail(email);
199
+ }
200
+ },
201
+ [mode, checkEmail]
202
+ );
203
+ const selectedRoles = (0, import_react.useMemo)(() => {
204
+ return roles.filter((role) => selectedRoleIds.includes(role.id));
205
+ }, [roles, selectedRoleIds]);
206
+ const extensionFormIds = (0, import_react.useMemo)(() => {
207
+ const formIds = /* @__PURE__ */ new Set();
208
+ selectedRoles.forEach((role) => {
209
+ var _a;
210
+ if ((_a = role.metadata) == null ? void 0 : _a.extension_form_id) {
211
+ formIds.add(role.metadata.extension_form_id);
212
+ }
213
+ });
214
+ return Array.from(formIds);
215
+ }, [selectedRoles]);
216
+ const extensionFormRoles = (0, import_react.useMemo)(() => {
217
+ const formRoles = {};
218
+ selectedRoles.forEach((role) => {
219
+ var _a;
220
+ const formId = (_a = role.metadata) == null ? void 0 : _a.extension_form_id;
221
+ if (formId) {
222
+ if (!formRoles[formId]) {
223
+ formRoles[formId] = [];
224
+ }
225
+ formRoles[formId].push(getLocaleText(role.name));
226
+ }
227
+ });
228
+ return formRoles;
229
+ }, [selectedRoles, getLocaleText]);
230
+ const prevExtensionFormRolesRef = (0, import_react.useRef)({});
231
+ const prevAccountIdRef = (0, import_react.useRef)(void 0);
232
+ const {
233
+ data: relationList,
234
+ run: runGetRelationList,
235
+ refresh: refreshRelationList
236
+ } = (0, import_ahooks.useRequest)(
237
+ async () => {
238
+ if (!(currentMember == null ? void 0 : currentMember.id)) return [];
239
+ if (extensionFormIds.length === 0) return [];
240
+ const data = await (0, import_serve.getRelationRecords)({
241
+ relation_type: "tenant_account",
242
+ relation_id: currentMember.id,
243
+ form_id: extensionFormIds
244
+ });
245
+ return Array.isArray(data) ? data : [];
246
+ },
247
+ { manual: true }
248
+ );
249
+ (0, import_react.useEffect)(() => {
250
+ if ((currentMember == null ? void 0 : currentMember.id) !== prevAccountIdRef.current) {
251
+ prevExtensionFormRolesRef.current = {};
252
+ prevAccountIdRef.current = currentMember == null ? void 0 : currentMember.id;
253
+ }
254
+ }, [currentMember == null ? void 0 : currentMember.id]);
255
+ (0, import_react.useEffect)(() => {
256
+ if (!visible) return;
257
+ if (!(currentMember == null ? void 0 : currentMember.id)) return;
258
+ const prev = prevExtensionFormRolesRef.current || {};
259
+ const curr = extensionFormRoles || {};
260
+ const normalize = (obj) => {
261
+ const result = {};
262
+ Object.keys(obj).forEach((key) => {
263
+ const k = Number(key);
264
+ result[k] = (0, import_lodash.sortBy)(obj[k] || []);
265
+ });
266
+ return result;
267
+ };
268
+ const changed = !(0, import_lodash.isEqual)(normalize(prev), normalize(curr));
269
+ if (changed) {
270
+ runGetRelationList();
271
+ }
272
+ prevExtensionFormRolesRef.current = curr;
273
+ }, [
274
+ visible,
275
+ currentMember == null ? void 0 : currentMember.account_id,
276
+ extensionFormRoles,
277
+ runGetRelationList
278
+ ]);
279
+ const handleTabChange = (0, import_react.useCallback)(
280
+ (key) => {
281
+ const currentTabDirty = activeTab === "basic" ? isBasicFormDirty : iframeDirtyStates[parseInt(activeTab.replace("extension-", ""))] || false;
282
+ if (currentTabDirty) {
283
+ modal.confirm({
284
+ title: getText("pisell2.saas.team-members.confirm.unsaved-title"),
285
+ content: getText("pisell2.saas.team-members.confirm.unsaved-content"),
286
+ okText: getText("pisell2.saas.team-members.confirm.leave"),
287
+ cancelText: getText("pisell2.saas.team-members.drawer.cancel"),
288
+ onOk: () => {
289
+ var _a, _b;
290
+ if (activeTab === "basic") {
291
+ setIsBasicFormDirty(false);
292
+ if (initialValuesRef.current) {
293
+ form.setFieldsValue(initialValuesRef.current);
294
+ }
295
+ } else {
296
+ const formId = parseInt(activeTab.replace("extension-", ""));
297
+ (_b = (_a = extensionTabRefs.current[formId]) == null ? void 0 : _a.reset) == null ? void 0 : _b.call(_a);
298
+ setIframeDirtyStates((prev) => ({
299
+ ...prev,
300
+ [formId]: false
301
+ }));
302
+ }
303
+ setActiveTab(key);
304
+ }
305
+ });
306
+ } else {
307
+ setActiveTab(key);
308
+ }
309
+ },
310
+ [activeTab, isBasicFormDirty, iframeDirtyStates, getText, form]
311
+ );
312
+ const handleClose = (0, import_react.useCallback)(() => {
313
+ if (isFormDirty) {
314
+ modal.confirm({
315
+ title: getText("pisell2.saas.team-members.confirm.unsaved-title"),
316
+ content: getText("pisell2.saas.team-members.confirm.unsaved-content"),
317
+ okText: getText("pisell2.saas.team-members.confirm.leave"),
318
+ cancelText: getText("pisell2.saas.team-members.drawer.cancel"),
319
+ onOk: () => {
320
+ setIsBasicFormDirty(false);
321
+ setIframeDirtyStates({});
322
+ onClose();
323
+ }
324
+ });
325
+ } else {
326
+ onClose();
327
+ }
328
+ }, [isFormDirty, onClose, getText]);
329
+ const handleBasicInfoSubmit = (0, import_react.useCallback)(async () => {
330
+ try {
331
+ const values = await form.validateFields();
332
+ await onSubmit(values);
333
+ setSelectedRoleIds((values == null ? void 0 : values.tenant_role_ids) || []);
334
+ setIsBasicFormDirty(false);
335
+ initialValuesRef.current = form.getFieldsValue();
336
+ } catch (error) {
337
+ console.error("Form validation failed:", error);
338
+ }
339
+ }, [form, onSubmit]);
340
+ const isFounder = mode === "edit" && (currentMember == null ? void 0 : currentMember.type) === "founder";
341
+ const renderBasicInfoTab = () => /* @__PURE__ */ import_react.default.createElement("div", { className: `${PREFIX}_tab-content` }, /* @__PURE__ */ import_react.default.createElement(
342
+ import_antd.Form,
343
+ {
344
+ form,
345
+ layout: "vertical",
346
+ size: "large",
347
+ onValuesChange: handleFormValuesChange,
348
+ autoComplete: "false"
349
+ },
350
+ /* @__PURE__ */ import_react.default.createElement("div", { className: `${PREFIX}_section` }, /* @__PURE__ */ import_react.default.createElement("h6", { className: `${PREFIX}_section-header` }, getText("pisell2.saas.team-members.form.section.team-member-info")), /* @__PURE__ */ import_react.default.createElement(
351
+ import_antd.Form.Item,
352
+ {
353
+ name: "nickname",
354
+ label: getText("pisell2.saas.team-members.form.name"),
355
+ rules: [
356
+ {
357
+ required: true,
358
+ message: getText(
359
+ "pisell2.saas.team-members.form.name-required"
360
+ )
361
+ }
362
+ ],
363
+ help: getText("pisell2.saas.team-members.form.name-hint")
364
+ },
365
+ /* @__PURE__ */ import_react.default.createElement(
366
+ import_materials.Input,
367
+ {
368
+ placeholder: getText(
369
+ "pisell2.saas.team-members.form.name-placeholder"
370
+ )
371
+ }
372
+ )
373
+ ), /* @__PURE__ */ import_react.default.createElement(
374
+ import_antd.Form.Item,
375
+ {
376
+ name: "member_id",
377
+ label: getText("pisell2.saas.team-members.form.member-id"),
378
+ help: getText("pisell2.saas.team-members.form.member-id-hint")
379
+ },
380
+ /* @__PURE__ */ import_react.default.createElement(
381
+ import_materials.Input,
382
+ {
383
+ placeholder: getText(
384
+ "pisell2.saas.team-members.form.member-id-placeholder"
385
+ )
386
+ }
387
+ )
388
+ ), /* @__PURE__ */ import_react.default.createElement(
389
+ import_antd.Form.Item,
390
+ {
391
+ name: "status",
392
+ label: getText("pisell2.saas.team-members.form.status"),
393
+ initialValue: "active",
394
+ rules: [
395
+ {
396
+ required: true,
397
+ message: getText(
398
+ "pisell2.saas.team-members.form.status-required"
399
+ )
400
+ }
401
+ ]
402
+ },
403
+ /* @__PURE__ */ import_react.default.createElement(import_materials.Select, { disabled: isFounder }, /* @__PURE__ */ import_react.default.createElement(import_materials.Select.Option, { value: "active" }, getText("pisell2.saas.team-members.status.active")), /* @__PURE__ */ import_react.default.createElement(import_materials.Select.Option, { value: "inactive" }, getText("pisell2.saas.team-members.status.inactive")))
404
+ ), /* @__PURE__ */ import_react.default.createElement(
405
+ import_antd.Form.Item,
406
+ {
407
+ name: "tenant_role_ids",
408
+ label: getText("pisell2.saas.team-members.form.roles"),
409
+ rules: [
410
+ {
411
+ required: true,
412
+ message: getText(
413
+ "pisell2.saas.team-members.form.roles-required"
414
+ )
415
+ }
416
+ ],
417
+ extra: isFounder ? /* @__PURE__ */ import_react.default.createElement(
418
+ import_materials.Alert,
419
+ {
420
+ message: getText("pisell2.saas.team-members.founder-notice"),
421
+ type: "info",
422
+ showIcon: true,
423
+ icon: /* @__PURE__ */ import_react.default.createElement(
424
+ import_materials.Icon,
425
+ {
426
+ type: "pisell2-info-circle",
427
+ size: 16,
428
+ color: "#7f8694",
429
+ style: {
430
+ marginTop: 2,
431
+ alignSelf: "flex-start"
432
+ }
433
+ }
434
+ ),
435
+ className: `${PREFIX}_founder-notice`
436
+ }
437
+ ) : getText("pisell2.saas.team-members.form.roles-hint")
438
+ },
439
+ /* @__PURE__ */ import_react.default.createElement(
440
+ import_materials.Select,
441
+ {
442
+ mode: "multiple",
443
+ placeholder: getText(
444
+ "pisell2.saas.team-members.form.roles-placeholder"
445
+ ),
446
+ options: roleOptions
447
+ }
448
+ )
449
+ )),
450
+ /* @__PURE__ */ import_react.default.createElement("div", { className: `${PREFIX}_section` }, /* @__PURE__ */ import_react.default.createElement("h6", { className: `${PREFIX}_section-header` }, getText(
451
+ "pisell2.saas.team-members.form.section.account-email-login"
452
+ )), /* @__PURE__ */ import_react.default.createElement(
453
+ import_antd.Form.Item,
454
+ {
455
+ name: "email",
456
+ label: getText("pisell2.saas.team-members.form.email"),
457
+ rules: mode === "create" ? [
458
+ {
459
+ required: true,
460
+ message: getText(
461
+ "pisell2.saas.team-members.form.email-required"
462
+ )
463
+ },
464
+ {
465
+ type: "email",
466
+ message: getText(
467
+ "pisell2.saas.team-members.form.email-invalid"
468
+ )
469
+ }
470
+ ] : [],
471
+ extra: mode === "create" && isEmailRegistered && /* @__PURE__ */ import_react.default.createElement(
472
+ import_materials.Alert,
473
+ {
474
+ type: "info",
475
+ showIcon: true,
476
+ icon: /* @__PURE__ */ import_react.default.createElement(
477
+ import_materials.Icon,
478
+ {
479
+ type: "pisell2-info-circle",
480
+ size: 16,
481
+ color: "#7f8694"
482
+ }
483
+ ),
484
+ className: `${PREFIX}_email-registered-alert`,
485
+ message: getText(
486
+ "pisell2.saas.team-members.form.email-registered"
487
+ )
488
+ }
489
+ )
490
+ },
491
+ /* @__PURE__ */ import_react.default.createElement(
492
+ import_materials.Input,
493
+ {
494
+ placeholder: getText(
495
+ "pisell2.saas.team-members.form.email-placeholder"
496
+ ),
497
+ disabled: mode === "edit",
498
+ onChange: handleEmailChange,
499
+ prefix: /* @__PURE__ */ import_react.default.createElement(import_materials.Icon, { type: "pisell2-mail-01", size: 18, color: "#98A2B3" })
500
+ }
501
+ )
502
+ ), mode === "create" && !isEmailRegistered && /* @__PURE__ */ import_react.default.createElement(
503
+ import_antd.Form.Item,
504
+ {
505
+ name: "password",
506
+ label: getText("pisell2.saas.team-members.form.password"),
507
+ rules: [
508
+ {
509
+ required: true,
510
+ message: getText(
511
+ "pisell2.saas.team-members.form.password-required"
512
+ )
513
+ },
514
+ {
515
+ // 至少6个字符且不包含空格
516
+ pattern: /^\S{6,}$/,
517
+ message: getText(
518
+ "pisell2.saas.team-members.form.password-invalid"
519
+ )
520
+ }
521
+ ]
522
+ },
523
+ /* @__PURE__ */ import_react.default.createElement(
524
+ import_materials.Input.Password,
525
+ {
526
+ placeholder: getText(
527
+ "pisell2.saas.team-members.form.password-placeholder"
528
+ )
529
+ }
530
+ )
531
+ )),
532
+ /* @__PURE__ */ import_react.default.createElement("div", { className: `${PREFIX}_section` }, /* @__PURE__ */ import_react.default.createElement("h6", { className: `${PREFIX}_section-header` }, getText("pisell2.saas.team-members.form.section.personal-info")), /* @__PURE__ */ import_react.default.createElement(
533
+ "div",
534
+ {
535
+ style: {
536
+ display: "grid",
537
+ gridTemplateColumns: "1fr 1fr",
538
+ gap: 16
539
+ }
540
+ },
541
+ /* @__PURE__ */ import_react.default.createElement(
542
+ import_antd.Form.Item,
543
+ {
544
+ name: "first_name",
545
+ label: getText("pisell2.saas.team-members.form.first-name")
546
+ },
547
+ /* @__PURE__ */ import_react.default.createElement(
548
+ import_materials.Input,
549
+ {
550
+ placeholder: getText(
551
+ "pisell2.saas.team-members.form.first-name-placeholder"
552
+ ),
553
+ disabled: mode === "edit" || isEmailRegistered
554
+ }
555
+ )
556
+ ),
557
+ /* @__PURE__ */ import_react.default.createElement(
558
+ import_antd.Form.Item,
559
+ {
560
+ name: "last_name",
561
+ label: getText("pisell2.saas.team-members.form.last-name")
562
+ },
563
+ /* @__PURE__ */ import_react.default.createElement(
564
+ import_materials.Input,
565
+ {
566
+ placeholder: getText(
567
+ "pisell2.saas.team-members.form.last-name-placeholder"
568
+ ),
569
+ disabled: mode === "edit" || isEmailRegistered
570
+ }
571
+ )
572
+ )
573
+ ), /* @__PURE__ */ import_react.default.createElement(
574
+ import_materials.FormItemInput.Phone,
575
+ {
576
+ type: "tel",
577
+ name: "phone",
578
+ label: getText("pisell2.saas.team-members.form.mobile"),
579
+ disabled: mode === "edit" || isEmailRegistered
580
+ }
581
+ ))
582
+ ));
583
+ const renderExtensionFormTab = (formId) => {
584
+ const roleNames = extensionFormRoles[formId] || [];
585
+ const tabLabel = roleNames.join(" / ");
586
+ return /* @__PURE__ */ import_react.default.createElement(
587
+ import_ExtensionFormTabContent.default,
588
+ {
589
+ ref: (instance) => {
590
+ extensionTabRefs.current[formId] = instance;
591
+ },
592
+ formId,
593
+ domain: (mypisellData == null ? void 0 : mypisellData.domain) || "",
594
+ token: (mypisellData == null ? void 0 : mypisellData.account_token) || "",
595
+ locale,
596
+ tenantAccountId: currentMember == null ? void 0 : currentMember.id,
597
+ onDirtyChange: (isDirty) => handleIframeDirtyChange(formId, isDirty),
598
+ onCancel: onClose,
599
+ getText,
600
+ tabLabel,
601
+ prefix: PREFIX,
602
+ relationList: relationList || [],
603
+ refreshRelationList: runGetRelationList
604
+ }
605
+ );
606
+ };
607
+ const tabItems = (0, import_react.useMemo)(() => {
608
+ const items = [
609
+ {
610
+ key: "basic",
611
+ label: getText("pisell2.saas.team-members.tab.basic-info"),
612
+ children: renderBasicInfoTab()
613
+ }
614
+ ];
615
+ if (mode === "edit" && selectedRoleIds.length > 0) {
616
+ extensionFormIds.forEach((formId) => {
617
+ const roleNames = extensionFormRoles[formId] || [];
618
+ const tabLabel = roleNames.join(" / ");
619
+ items.push({
620
+ key: `extension-${formId}`,
621
+ label: tabLabel,
622
+ children: renderExtensionFormTab(formId)
623
+ });
624
+ });
625
+ }
626
+ return items;
627
+ }, [
628
+ mode,
629
+ selectedRoleIds,
630
+ extensionFormIds,
631
+ extensionFormRoles,
632
+ isEmailRegistered,
633
+ checkingEmail,
634
+ loading,
635
+ relationList,
636
+ refreshRelationList
637
+ ]);
638
+ return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(
639
+ AntdDrawer,
640
+ {
641
+ title: mode === "create" ? getText("pisell2.saas.team-members.drawer.create-title") : getText("pisell2.saas.team-members.drawer.edit-title"),
642
+ open: visible,
643
+ onClose: handleClose,
644
+ width: 600,
645
+ className: "saas-member-drawer",
646
+ headerStyle: {
647
+ borderBottom: "2px solid #f0f0f0"
648
+ },
649
+ destroyOnHidden: true,
650
+ footer: activeTab === "basic" ? /* @__PURE__ */ import_react.default.createElement("div", { className: `${PREFIX}_footer` }, /* @__PURE__ */ import_react.default.createElement(AntdButton, { onClick: handleClose, style: { marginRight: 8 } }, getText("pisell2.saas.team-members.drawer.cancel")), /* @__PURE__ */ import_react.default.createElement(
651
+ AntdButton,
652
+ {
653
+ type: "primary",
654
+ onClick: handleBasicInfoSubmit,
655
+ loading,
656
+ disabled: checkingEmail || mode === "edit" && !isBasicFormDirty
657
+ },
658
+ getText("pisell2.saas.team-members.drawer.save")
659
+ )) : false
660
+ },
661
+ /* @__PURE__ */ import_react.default.createElement(
662
+ import_antd.Tabs,
663
+ {
664
+ activeKey: activeTab,
665
+ onChange: handleTabChange,
666
+ items: tabItems,
667
+ className: `${PREFIX}_tabs`
668
+ }
669
+ )
670
+ ), contextHolder);
671
+ };
672
+ var MemberDrawer_default = MemberDrawer;