@pisell/private-materials 6.3.89 → 6.3.90

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 (94) 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 +1 -1
  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 +10 -10
  9. package/build/lowcode/view.css +1 -1
  10. package/build/lowcode/view.js +10 -10
  11. package/es/components/appointmentBooking/components/TimeSlicing/components/SelectDateOS.d.ts +1 -0
  12. package/es/components/booking/info/date/index.d.ts +0 -1
  13. package/es/components/ecocup/components/CupInfoCard/index.d.ts +1 -0
  14. package/es/components/ecocup/components/CustomerCard/index.d.ts +1 -0
  15. package/es/components/eftposPay/windcave/windcave.d.ts +1 -0
  16. package/es/index.d.ts +1 -0
  17. package/es/index.js +1 -0
  18. package/es/plus/saasAttendance/index.d.ts +6 -0
  19. package/es/plus/saasAttendance/index.js +5 -0
  20. package/es/plus/saasAttendance/locales.d.ts +318 -0
  21. package/es/plus/saasAttendance/locales.js +354 -0
  22. package/es/plus/saasAttendance/settings/BasicInfoTab.d.ts +5 -0
  23. package/es/plus/saasAttendance/settings/BasicInfoTab.js +96 -0
  24. package/es/plus/saasAttendance/settings/ClockInMethodTab.d.ts +8 -0
  25. package/es/plus/saasAttendance/settings/ClockInMethodTab.js +81 -0
  26. package/es/plus/saasAttendance/settings/CorrectionPolicyTab.d.ts +8 -0
  27. package/es/plus/saasAttendance/settings/CorrectionPolicyTab.js +293 -0
  28. package/es/plus/saasAttendance/settings/ShiftScheduleTab.d.ts +5 -0
  29. package/es/plus/saasAttendance/settings/ShiftScheduleTab.js +109 -0
  30. package/es/plus/saasAttendance/settings/components/MapField.d.ts +78 -0
  31. package/es/plus/saasAttendance/settings/components/MapField.js +810 -0
  32. package/es/plus/saasAttendance/settings/components/index.d.ts +3 -0
  33. package/es/plus/saasAttendance/settings/components/index.js +2 -0
  34. package/es/plus/saasAttendance/settings/components/membersField/index.d.ts +7 -0
  35. package/es/plus/saasAttendance/settings/components/membersField/index.js +216 -0
  36. package/es/plus/saasAttendance/settings/components/membersField/index.less +70 -0
  37. package/es/plus/saasAttendance/settings/components/shiftModal/index.d.ts +18 -0
  38. package/es/plus/saasAttendance/settings/components/shiftModal/index.js +438 -0
  39. package/es/plus/saasAttendance/settings/index.d.ts +18 -0
  40. package/es/plus/saasAttendance/settings/index.js +255 -0
  41. package/es/plus/saasAttendance/settings/index.less +495 -0
  42. package/es/plus/saasAttendance/settings/serve.d.ts +27 -0
  43. package/es/plus/saasAttendance/settings/serve.js +83 -0
  44. package/es/plus/saasAttendance/settings/types.d.ts +128 -0
  45. package/es/plus/saasAttendance/settings/types.js +1 -0
  46. package/es/plus/selectHolder/locales.d.ts +6 -0
  47. package/es/plus/selectHolder/locales.js +6 -0
  48. package/es/plus/skuOptionsSelection/components/TitleExtra/index.d.ts +1 -0
  49. package/es/plus/skuOptionsSelection/components/VariantCard/index.d.ts +1 -0
  50. package/es/pro/Selector/demo.d.ts +1 -0
  51. package/lib/components/appointmentBooking/components/TimeSlicing/components/SelectDateOS.d.ts +1 -0
  52. package/lib/components/booking/info/date/index.d.ts +0 -1
  53. package/lib/components/ecocup/components/CupInfoCard/index.d.ts +1 -0
  54. package/lib/components/ecocup/components/CustomerCard/index.d.ts +1 -0
  55. package/lib/components/eftposPay/windcave/windcave.d.ts +1 -0
  56. package/lib/index.d.ts +1 -0
  57. package/lib/index.js +3 -0
  58. package/lib/plus/saasAttendance/index.d.ts +6 -0
  59. package/lib/plus/saasAttendance/index.js +39 -0
  60. package/lib/plus/saasAttendance/locales.d.ts +318 -0
  61. package/lib/plus/saasAttendance/locales.js +342 -0
  62. package/lib/plus/saasAttendance/settings/BasicInfoTab.d.ts +5 -0
  63. package/lib/plus/saasAttendance/settings/BasicInfoTab.js +152 -0
  64. package/lib/plus/saasAttendance/settings/ClockInMethodTab.d.ts +8 -0
  65. package/lib/plus/saasAttendance/settings/ClockInMethodTab.js +88 -0
  66. package/lib/plus/saasAttendance/settings/CorrectionPolicyTab.d.ts +8 -0
  67. package/lib/plus/saasAttendance/settings/CorrectionPolicyTab.js +369 -0
  68. package/lib/plus/saasAttendance/settings/ShiftScheduleTab.d.ts +5 -0
  69. package/lib/plus/saasAttendance/settings/ShiftScheduleTab.js +106 -0
  70. package/lib/plus/saasAttendance/settings/components/MapField.d.ts +78 -0
  71. package/lib/plus/saasAttendance/settings/components/MapField.js +631 -0
  72. package/lib/plus/saasAttendance/settings/components/index.d.ts +3 -0
  73. package/lib/plus/saasAttendance/settings/components/index.js +42 -0
  74. package/lib/plus/saasAttendance/settings/components/membersField/index.d.ts +7 -0
  75. package/lib/plus/saasAttendance/settings/components/membersField/index.js +247 -0
  76. package/lib/plus/saasAttendance/settings/components/membersField/index.less +70 -0
  77. package/lib/plus/saasAttendance/settings/components/shiftModal/index.d.ts +18 -0
  78. package/lib/plus/saasAttendance/settings/components/shiftModal/index.js +447 -0
  79. package/lib/plus/saasAttendance/settings/index.d.ts +18 -0
  80. package/lib/plus/saasAttendance/settings/index.js +283 -0
  81. package/lib/plus/saasAttendance/settings/index.less +495 -0
  82. package/lib/plus/saasAttendance/settings/serve.d.ts +27 -0
  83. package/lib/plus/saasAttendance/settings/serve.js +54 -0
  84. package/lib/plus/saasAttendance/settings/types.d.ts +128 -0
  85. package/lib/plus/saasAttendance/settings/types.js +17 -0
  86. package/lib/plus/selectHolder/locales.d.ts +6 -0
  87. package/lib/plus/selectHolder/locales.js +6 -0
  88. package/lib/plus/skuOptionsSelection/components/TitleExtra/index.d.ts +1 -0
  89. package/lib/plus/skuOptionsSelection/components/VariantCard/index.d.ts +1 -0
  90. package/lib/pro/Selector/demo.d.ts +1 -0
  91. package/lowcode/eco-cup-list/meta.ts +1 -1
  92. package/lowcode/eco-customer-list/meta.ts +1 -1
  93. package/lowcode/saas-attendance-settings/meta.ts +56 -0
  94. package/package.json +3 -3
@@ -0,0 +1,631 @@
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/saasAttendance/settings/components/MapField.tsx
30
+ var MapField_exports = {};
31
+ __export(MapField_exports, {
32
+ default: () => MapField_default
33
+ });
34
+ module.exports = __toCommonJS(MapField_exports);
35
+ var import_react = __toESM(require("react"));
36
+ var import_antd = require("antd");
37
+ var import_materials = require("@pisell/materials");
38
+ var import_utils = require("@pisell/utils");
39
+ var import_useEngineContext = __toESM(require("../../../../hooks/useEngineContext"));
40
+ var DEFAULT_CENTER = { lat: -37.8136, lng: 144.9631 };
41
+ var DEFAULT_ZOOM = 14;
42
+ var CIRCLE_STROKE_COLOR = "#5d3f9f";
43
+ var CIRCLE_FILL_COLOR = "#5d3f9f";
44
+ var COORDINATE_NUMBER_PATTERN = /^-?\d+(\.\d+)?$/;
45
+ var getCurrentPosition = () => {
46
+ return new Promise((resolve) => {
47
+ if (!navigator.geolocation) {
48
+ resolve(null);
49
+ return;
50
+ }
51
+ navigator.geolocation.getCurrentPosition(
52
+ (position) => {
53
+ resolve({
54
+ lat: position.coords.latitude,
55
+ lng: position.coords.longitude
56
+ });
57
+ },
58
+ () => {
59
+ resolve(null);
60
+ },
61
+ { enableHighAccuracy: true, timeout: 1e4, maximumAge: 0 }
62
+ );
63
+ });
64
+ };
65
+ var toMultiLangName = (input) => {
66
+ if (!input) return { original: "" };
67
+ if (typeof input === "string") return { original: input };
68
+ if (typeof input === "object") return input;
69
+ return { original: String(input) };
70
+ };
71
+ var getLocationNameText = (name) => {
72
+ const n = toMultiLangName(name);
73
+ return n.original || n["zh-CN"] || n["zh-HK"] || n.en || "";
74
+ };
75
+ var createLocationId = () => {
76
+ const anyCrypto = typeof crypto !== "undefined" ? crypto : void 0;
77
+ if (anyCrypto == null ? void 0 : anyCrypto.randomUUID) return anyCrypto.randomUUID();
78
+ return `${Date.now()}_${Math.random().toString(16).slice(2)}`;
79
+ };
80
+ var normalizeLocations = (input) => {
81
+ if (!Array.isArray(input)) return [];
82
+ return input.map((item) => {
83
+ var _a, _b;
84
+ if ((item == null ? void 0 : item.address) && ((_a = item.address) == null ? void 0 : _a.lat) != null && ((_b = item.address) == null ? void 0 : _b.lng) != null) {
85
+ const lat2 = typeof item.address.lat === "number" ? item.address.lat : parseFloat(item.address.lat) || 0;
86
+ const lng2 = typeof item.address.lng === "number" ? item.address.lng : parseFloat(item.address.lng) || 0;
87
+ return {
88
+ id: String((item == null ? void 0 : item.id) ?? createLocationId()),
89
+ name: toMultiLangName(item.name),
90
+ radius: item == null ? void 0 : item.radius,
91
+ address: { lat: lat2, lng: lng2 }
92
+ };
93
+ }
94
+ const lat = typeof (item == null ? void 0 : item.lat) === "number" ? item.lat : parseFloat(item == null ? void 0 : item.lat) || 0;
95
+ const lng = typeof (item == null ? void 0 : item.lng) === "number" ? item.lng : parseFloat(item == null ? void 0 : item.lng) || 0;
96
+ return {
97
+ id: String((item == null ? void 0 : item.id) ?? createLocationId()),
98
+ name: toMultiLangName(item == null ? void 0 : item.name),
99
+ radius: item == null ? void 0 : item.radius,
100
+ address: { lat, lng }
101
+ };
102
+ });
103
+ };
104
+ var LocationFormMap = (0, import_react.forwardRef)(
105
+ (props, ref) => {
106
+ const { value, onChange, defaultRadius = 100 } = props;
107
+ const [form] = import_antd.Form.useForm();
108
+ const modalMapRef = (0, import_react.useRef)(null);
109
+ const [isModalMapReady, setIsModalMapReady] = (0, import_react.useState)(false);
110
+ const context = (0, import_useEngineContext.default)();
111
+ const GoogleMapComponent = (0, import_react.useMemo)(() => {
112
+ var _a, _b, _c;
113
+ const app = (_c = (_b = (_a = context == null ? void 0 : context.appHelper) == null ? void 0 : _a.utils) == null ? void 0 : _b.getApp) == null ? void 0 : _c.call(_b);
114
+ if (!app) return null;
115
+ return app.getPlugin("google-map") || null;
116
+ }, [context]);
117
+ const lat = import_antd.Form.useWatch("latitude", form);
118
+ const lng = import_antd.Form.useWatch("longitude", form);
119
+ const validRangeMeters = import_antd.Form.useWatch("validRangeMeters", form) ?? defaultRadius;
120
+ const [debouncedValidRangeMeters, setDebouncedValidRangeMeters] = (0, import_react.useState)(validRangeMeters);
121
+ (0, import_react.useEffect)(() => {
122
+ setDebouncedValidRangeMeters(validRangeMeters);
123
+ }, []);
124
+ (0, import_react.useEffect)(() => {
125
+ const timer = setTimeout(() => {
126
+ setDebouncedValidRangeMeters(validRangeMeters);
127
+ }, 200);
128
+ return () => clearTimeout(timer);
129
+ }, [validRangeMeters]);
130
+ (0, import_react.useEffect)(() => {
131
+ if (value) {
132
+ form.setFieldsValue(value);
133
+ if (value.latitude && value.longitude && modalMapRef.current) {
134
+ const center = {
135
+ lat: parseFloat(value.latitude),
136
+ lng: parseFloat(value.longitude)
137
+ };
138
+ modalMapRef.current.setCamera({
139
+ coordinate: center,
140
+ zoom: DEFAULT_ZOOM,
141
+ animate: true
142
+ });
143
+ }
144
+ } else {
145
+ form.resetFields();
146
+ form.setFieldsValue({ validRangeMeters: defaultRadius });
147
+ }
148
+ }, [value, form, defaultRadius]);
149
+ (0, import_react.useEffect)(() => {
150
+ if (!isModalMapReady || !modalMapRef.current) return;
151
+ const latNum = parseFloat(lat);
152
+ const lngNum = parseFloat(lng);
153
+ if (isNaN(latNum) || isNaN(lngNum)) return;
154
+ modalMapRef.current.setCamera({
155
+ coordinate: { lat: latNum, lng: lngNum },
156
+ zoom: DEFAULT_ZOOM,
157
+ animate: true
158
+ });
159
+ }, [isModalMapReady, lat, lng]);
160
+ (0, import_react.useImperativeHandle)(ref, () => ({
161
+ validate: () => form.validateFields()
162
+ }));
163
+ const handleMapClick = (0, import_react.useCallback)(
164
+ (coordinate) => {
165
+ const newValues = {
166
+ latitude: coordinate.lat.toFixed(6),
167
+ longitude: coordinate.lng.toFixed(6)
168
+ };
169
+ form.setFieldsValue(newValues);
170
+ const currentValues = form.getFieldsValue();
171
+ onChange == null ? void 0 : onChange({ ...currentValues, ...newValues });
172
+ },
173
+ [form, onChange]
174
+ );
175
+ const handleValuesChange = (changedValues, allValues) => {
176
+ onChange == null ? void 0 : onChange(allValues);
177
+ };
178
+ const mapVisualization = (0, import_react.useMemo)(() => {
179
+ const latNum = parseFloat(lat);
180
+ const lngNum = parseFloat(lng);
181
+ if (isNaN(latNum) || isNaN(lngNum)) {
182
+ return { markers: [], circles: [], center: DEFAULT_CENTER };
183
+ }
184
+ const coordinate = { lat: latNum, lng: lngNum };
185
+ const markers = [
186
+ {
187
+ id: "current-location",
188
+ coordinate,
189
+ draggable: false
190
+ }
191
+ ];
192
+ const circles = [
193
+ {
194
+ id: "current-range",
195
+ center: coordinate,
196
+ radius: debouncedValidRangeMeters,
197
+ strokeColor: CIRCLE_STROKE_COLOR,
198
+ strokeOpacity: 0.8,
199
+ strokeWeight: 2,
200
+ fillColor: CIRCLE_FILL_COLOR,
201
+ fillOpacity: 0.2
202
+ }
203
+ ];
204
+ return { markers, circles, center: coordinate };
205
+ }, [lat, lng, debouncedValidRangeMeters]);
206
+ return /* @__PURE__ */ import_react.default.createElement(
207
+ import_antd.Form,
208
+ {
209
+ form,
210
+ layout: "vertical",
211
+ className: "saas-attendance-group-settings__modal-form",
212
+ onValuesChange: handleValuesChange,
213
+ initialValues: { validRangeMeters: defaultRadius }
214
+ },
215
+ /* @__PURE__ */ import_react.default.createElement(
216
+ import_antd.Form.Item,
217
+ {
218
+ label: import_utils.locales.getText(
219
+ "pisell2.attendance.group-settings.clock-in-method.add-location-modal.location-name.label"
220
+ ),
221
+ name: "name",
222
+ required: true,
223
+ rules: [
224
+ {
225
+ validator: async (_rule, value2) => {
226
+ if (!value2) {
227
+ throw new Error(
228
+ import_utils.locales.getText(
229
+ "pisell2.attendance.group-settings.clock-in-method.add-location-modal.location-name.validation"
230
+ )
231
+ );
232
+ }
233
+ if (typeof value2 === "string") {
234
+ if (value2.trim()) return Promise.resolve();
235
+ } else if (typeof value2 === "object") {
236
+ const texts = Object.values(value2).filter(
237
+ (item) => typeof item === "string" && item.trim()
238
+ );
239
+ if (texts.length > 0) return Promise.resolve();
240
+ }
241
+ throw new Error(
242
+ import_utils.locales.getText(
243
+ "pisell2.attendance.group-settings.clock-in-method.add-location-modal.location-name.validation"
244
+ )
245
+ );
246
+ }
247
+ }
248
+ ]
249
+ },
250
+ /* @__PURE__ */ import_react.default.createElement(
251
+ import_materials.BaseTranslation,
252
+ {
253
+ placeholder: import_utils.locales.getText(
254
+ "pisell2.attendance.group-settings.clock-in-method.add-location-modal.location-name.placeholder"
255
+ )
256
+ }
257
+ )
258
+ ),
259
+ /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__modal-grid" }, /* @__PURE__ */ import_react.default.createElement(
260
+ import_antd.Form.Item,
261
+ {
262
+ label: import_utils.locales.getText(
263
+ "pisell2.attendance.group-settings.clock-in-method.add-location-modal.latitude.label"
264
+ ),
265
+ name: "latitude",
266
+ required: true,
267
+ rules: [
268
+ { required: true },
269
+ {
270
+ validator: async (_rule, value2) => {
271
+ const text = String(value2 ?? "").trim();
272
+ if (!text) return Promise.resolve();
273
+ if (!COORDINATE_NUMBER_PATTERN.test(text)) {
274
+ throw new Error(
275
+ import_utils.locales.getText(
276
+ "pisell2.attendance.group-settings.clock-in-method.add-location-modal.latitude.validation"
277
+ )
278
+ );
279
+ }
280
+ const latValue = parseFloat(text);
281
+ if (latValue < -90 || latValue > 90) {
282
+ throw new Error(
283
+ import_utils.locales.getText(
284
+ "pisell2.attendance.group-settings.clock-in-method.add-location-modal.latitude.validation"
285
+ )
286
+ );
287
+ }
288
+ return Promise.resolve();
289
+ }
290
+ }
291
+ ]
292
+ },
293
+ /* @__PURE__ */ import_react.default.createElement(
294
+ import_antd.Input,
295
+ {
296
+ placeholder: import_utils.locales.getText(
297
+ "pisell2.attendance.group-settings.clock-in-method.add-location-modal.latitude.placeholder"
298
+ )
299
+ }
300
+ )
301
+ ), /* @__PURE__ */ import_react.default.createElement(
302
+ import_antd.Form.Item,
303
+ {
304
+ label: import_utils.locales.getText(
305
+ "pisell2.attendance.group-settings.clock-in-method.add-location-modal.longitude.label"
306
+ ),
307
+ name: "longitude",
308
+ required: true,
309
+ rules: [
310
+ { required: true },
311
+ {
312
+ validator: async (_rule, value2) => {
313
+ const text = String(value2 ?? "").trim();
314
+ if (!text) return Promise.resolve();
315
+ if (!COORDINATE_NUMBER_PATTERN.test(text)) {
316
+ throw new Error(
317
+ import_utils.locales.getText(
318
+ "pisell2.attendance.group-settings.clock-in-method.add-location-modal.longitude.validation"
319
+ )
320
+ );
321
+ }
322
+ const lngValue = parseFloat(text);
323
+ if (lngValue < -180 || lngValue > 180) {
324
+ throw new Error(
325
+ import_utils.locales.getText(
326
+ "pisell2.attendance.group-settings.clock-in-method.add-location-modal.longitude.validation"
327
+ )
328
+ );
329
+ }
330
+ return Promise.resolve();
331
+ }
332
+ }
333
+ ]
334
+ },
335
+ /* @__PURE__ */ import_react.default.createElement(
336
+ import_antd.Input,
337
+ {
338
+ placeholder: import_utils.locales.getText(
339
+ "pisell2.attendance.group-settings.clock-in-method.add-location-modal.longitude.placeholder"
340
+ )
341
+ }
342
+ )
343
+ )),
344
+ /* @__PURE__ */ import_react.default.createElement(
345
+ import_antd.Form.Item,
346
+ {
347
+ label: import_utils.locales.getText(
348
+ "pisell2.attendance.group-settings.clock-in-method.add-location-modal.valid-range.label"
349
+ ),
350
+ required: true
351
+ },
352
+ /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__modal-slider-row" }, /* @__PURE__ */ import_react.default.createElement(
353
+ import_antd.Form.Item,
354
+ {
355
+ name: "validRangeMeters",
356
+ noStyle: true,
357
+ rules: [{ required: true }]
358
+ },
359
+ /* @__PURE__ */ import_react.default.createElement(import_antd.Slider, { min: 0, max: 1e3 })
360
+ ), /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__slider-value" }, import_utils.locales.getText(
361
+ "pisell2.attendance.group-settings.clock-in-method.meters"
362
+ )(validRangeMeters)))
363
+ ),
364
+ /* @__PURE__ */ import_react.default.createElement(
365
+ import_antd.Alert,
366
+ {
367
+ message: import_utils.locales.getText(
368
+ "pisell2.attendance.group-settings.clock-in-method.add-location-modal.tip.google-maps"
369
+ ),
370
+ type: "info",
371
+ showIcon: true
372
+ }
373
+ ),
374
+ /* @__PURE__ */ import_react.default.createElement(
375
+ "div",
376
+ {
377
+ className: "saas-attendance-group-settings__map-placeholder saas-attendance-map-field__modal-map",
378
+ style: { marginTop: "10px" }
379
+ },
380
+ GoogleMapComponent && /* @__PURE__ */ import_react.default.createElement(
381
+ GoogleMapComponent,
382
+ {
383
+ ref: modalMapRef,
384
+ config: {
385
+ center: mapVisualization.center,
386
+ zoom: DEFAULT_ZOOM
387
+ },
388
+ markers: mapVisualization.markers,
389
+ circles: mapVisualization.circles,
390
+ onReady: () => setIsModalMapReady(true),
391
+ onMapClick: handleMapClick,
392
+ onError: (err) => console.error("Map Error:", err)
393
+ }
394
+ )
395
+ )
396
+ );
397
+ }
398
+ );
399
+ var MapField = (0, import_react.forwardRef)((props, ref) => {
400
+ const { value = [], onChange, defaultRadius = 100, className } = props;
401
+ const locations = (0, import_react.useMemo)(() => normalizeLocations(value), [value]);
402
+ const [addLocationOpen, setAddLocationOpen] = (0, import_react.useState)(false);
403
+ const [editingLocationValue, setEditingLocationValue] = (0, import_react.useState)(null);
404
+ const locationFormMapRef = (0, import_react.useRef)(null);
405
+ const mapRef = (0, import_react.useRef)(null);
406
+ const [isMapReady, setIsMapReady] = (0, import_react.useState)(false);
407
+ const [activeLocationId, setActiveLocationId] = (0, import_react.useState)(null);
408
+ const context = (0, import_useEngineContext.default)();
409
+ (0, import_react.useEffect)(() => {
410
+ if (!onChange || !Array.isArray(value) || value.length === 0) return;
411
+ const needsNormalize = value.some(
412
+ (item) => !(item == null ? void 0 : item.address) || (item == null ? void 0 : item.lat) != null || (item == null ? void 0 : item.lng) != null || typeof (item == null ? void 0 : item.name) === "string" || (item == null ? void 0 : item.address) && typeof item.address === "object" && Object.keys(item.address).some((k) => k !== "lat" && k !== "lng")
413
+ );
414
+ if (!needsNormalize) return;
415
+ onChange(normalizeLocations(value));
416
+ }, [onChange, value]);
417
+ const GoogleMapComponent = (0, import_react.useMemo)(() => {
418
+ var _a, _b, _c;
419
+ const app = (_c = (_b = (_a = context == null ? void 0 : context.appHelper) == null ? void 0 : _a.utils) == null ? void 0 : _b.getApp) == null ? void 0 : _c.call(_b);
420
+ if (!app) return null;
421
+ return app.getPlugin("google-map") || null;
422
+ }, [context]);
423
+ (0, import_react.useEffect)(() => {
424
+ if (locations.length === 0) {
425
+ setActiveLocationId(null);
426
+ return;
427
+ }
428
+ if (activeLocationId && locations.some((loc) => loc.id === activeLocationId)) {
429
+ return;
430
+ }
431
+ setActiveLocationId(locations[0].id);
432
+ }, [locations, activeLocationId]);
433
+ const mapCenter = (0, import_react.useMemo)(() => {
434
+ if (locations.length === 0) return DEFAULT_CENTER;
435
+ const activeLocation = activeLocationId ? locations.find((loc) => loc.id === activeLocationId) : null;
436
+ if (activeLocation) {
437
+ return {
438
+ lat: activeLocation.address.lat,
439
+ lng: activeLocation.address.lng
440
+ };
441
+ }
442
+ return { lat: locations[0].address.lat, lng: locations[0].address.lng };
443
+ }, [locations, activeLocationId]);
444
+ const markers = (0, import_react.useMemo)(() => {
445
+ return locations.map((loc) => ({
446
+ id: loc.id,
447
+ coordinate: { lat: loc.address.lat, lng: loc.address.lng },
448
+ title: getLocationNameText(loc.name),
449
+ draggable: false
450
+ }));
451
+ }, [locations]);
452
+ const circles = (0, import_react.useMemo)(() => {
453
+ return locations.map((loc) => ({
454
+ id: `circle-${loc.id}`,
455
+ center: { lat: loc.address.lat, lng: loc.address.lng },
456
+ radius: loc.radius || defaultRadius,
457
+ strokeColor: CIRCLE_STROKE_COLOR,
458
+ strokeOpacity: 0.8,
459
+ strokeWeight: 2,
460
+ fillColor: CIRCLE_FILL_COLOR,
461
+ fillOpacity: 0.2
462
+ }));
463
+ }, [locations, defaultRadius]);
464
+ (0, import_react.useImperativeHandle)(
465
+ ref,
466
+ () => ({
467
+ onAddLocation: async () => {
468
+ const baseFormValue = {
469
+ name: { original: "", en: "", "zh-CN": "", "zh-HK": "" },
470
+ latitude: "",
471
+ longitude: "",
472
+ validRangeMeters: defaultRadius
473
+ };
474
+ setAddLocationOpen(true);
475
+ setEditingLocationValue(baseFormValue);
476
+ const currentPosition = await getCurrentPosition();
477
+ if (currentPosition) {
478
+ setEditingLocationValue({
479
+ ...baseFormValue,
480
+ latitude: currentPosition.lat.toFixed(6),
481
+ longitude: currentPosition.lng.toFixed(6)
482
+ });
483
+ }
484
+ }
485
+ }),
486
+ [defaultRadius]
487
+ );
488
+ const handleAddLocation = async () => {
489
+ if (!locationFormMapRef.current) return;
490
+ try {
491
+ const values = await locationFormMapRef.current.validate();
492
+ const newLocation = {
493
+ id: createLocationId(),
494
+ name: toMultiLangName(values.name),
495
+ radius: values.validRangeMeters,
496
+ address: {
497
+ lat: parseFloat(values.latitude) || 0,
498
+ lng: parseFloat(values.longitude) || 0
499
+ }
500
+ };
501
+ const nextLocations = [newLocation, ...locations];
502
+ onChange == null ? void 0 : onChange(nextLocations);
503
+ setActiveLocationId(newLocation.id);
504
+ setAddLocationOpen(false);
505
+ setEditingLocationValue(null);
506
+ } catch (error) {
507
+ console.error("Validation failed:", error);
508
+ }
509
+ };
510
+ const handleRemoveLocation = (locationId) => {
511
+ const nextLocations = locations.filter((loc) => loc.id !== locationId);
512
+ onChange == null ? void 0 : onChange(nextLocations);
513
+ };
514
+ const handleLocationItemClick = (0, import_react.useCallback)(
515
+ (location) => {
516
+ var _a;
517
+ setActiveLocationId(location.id);
518
+ (_a = mapRef.current) == null ? void 0 : _a.setCamera({
519
+ coordinate: { lat: location.address.lat, lng: location.address.lng },
520
+ zoom: DEFAULT_ZOOM,
521
+ animate: true
522
+ });
523
+ },
524
+ []
525
+ );
526
+ const handleMapReady = (0, import_react.useCallback)(() => {
527
+ setIsMapReady(true);
528
+ }, []);
529
+ const handleMarkerClick = (0, import_react.useCallback)(
530
+ (markerId, marker) => {
531
+ console.log("Marker clicked:", markerId, marker);
532
+ },
533
+ []
534
+ );
535
+ (0, import_react.useEffect)(() => {
536
+ if (!isMapReady || !mapRef.current || locations.length === 0) return;
537
+ const targetLocation = activeLocationId ? locations.find((loc) => loc.id === activeLocationId) : locations[0];
538
+ if (targetLocation) {
539
+ mapRef.current.setCamera({
540
+ coordinate: {
541
+ lat: targetLocation.address.lat,
542
+ lng: targetLocation.address.lng
543
+ },
544
+ zoom: DEFAULT_ZOOM,
545
+ animate: true
546
+ });
547
+ }
548
+ }, [isMapReady, activeLocationId, locations]);
549
+ const renderEmptyState = () => /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__locations-empty" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__locations-empty-icon" }, /* @__PURE__ */ import_react.default.createElement(import_materials.Icon, { type: "pisell2-marker-pin-01", size: 48 })), /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__locations-empty-title" }, import_utils.locales.getText(
550
+ "pisell2.attendance.group-settings.clock-in-method.approved-locations.empty.title"
551
+ )), /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__locations-empty-desc" }, import_utils.locales.getText(
552
+ "pisell2.attendance.group-settings.clock-in-method.approved-locations.empty.desc"
553
+ )));
554
+ const renderLocationsList = () => /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__locations-list" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-map-field__map-container" }, /* @__PURE__ */ import_react.default.createElement(
555
+ GoogleMapComponent,
556
+ {
557
+ ref: mapRef,
558
+ config: {
559
+ center: mapCenter,
560
+ zoom: DEFAULT_ZOOM
561
+ },
562
+ markers,
563
+ circles,
564
+ onReady: handleMapReady,
565
+ onMarkerClick: handleMarkerClick,
566
+ onError: (err) => console.error("Map Error:", err)
567
+ }
568
+ )), /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-map-field__locations" }, locations.map((location) => /* @__PURE__ */ import_react.default.createElement(
569
+ "div",
570
+ {
571
+ key: location.id,
572
+ className: `saas-attendance-group-settings__location-item${activeLocationId === location.id ? " saas-attendance-group-settings__location-item--active" : ""}`,
573
+ onClick: () => handleLocationItemClick(location),
574
+ style: { cursor: "pointer" }
575
+ },
576
+ /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-map-field__location-header" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__location-name" }, getLocationNameText(location.name)), /* @__PURE__ */ import_react.default.createElement(
577
+ import_antd.Button,
578
+ {
579
+ type: "text",
580
+ size: "small",
581
+ icon: /* @__PURE__ */ import_react.default.createElement(import_materials.Icon, { type: "pisell2-trash-01", size: 16 }),
582
+ className: "saas-attendance-map-field__delete-btn",
583
+ onClick: (e) => {
584
+ e.stopPropagation();
585
+ handleRemoveLocation(location.id);
586
+ }
587
+ }
588
+ )),
589
+ /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__location-meta" }, import_utils.locales.getText(
590
+ "pisell2.attendance.group-settings.clock-in-method.add-location-modal.valid-range.label"
591
+ ), ": ", /* @__PURE__ */ import_react.default.createElement("span", null, location.radius || defaultRadius))
592
+ ))));
593
+ return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(
594
+ "div",
595
+ {
596
+ className: `saas-attendance-group-settings__locations-box ${className || ""}`
597
+ },
598
+ locations.length === 0 ? renderEmptyState() : renderLocationsList()
599
+ ), /* @__PURE__ */ import_react.default.createElement(
600
+ import_materials.PisellModal,
601
+ {
602
+ open: addLocationOpen,
603
+ title: import_utils.locales.getText(
604
+ "pisell2.attendance.group-settings.clock-in-method.add-location-modal.title"
605
+ ),
606
+ destroyOnHidden: true,
607
+ onCancel: () => {
608
+ setAddLocationOpen(false);
609
+ setEditingLocationValue(null);
610
+ },
611
+ okText: import_utils.locales.getText(
612
+ "pisell2.attendance.group-settings.actions.add-location-confirm"
613
+ ),
614
+ cancelText: import_utils.locales.getText(
615
+ "pisell2.attendance.group-settings.actions.cancel"
616
+ ),
617
+ onOk: handleAddLocation
618
+ },
619
+ /* @__PURE__ */ import_react.default.createElement(
620
+ LocationFormMap,
621
+ {
622
+ ref: locationFormMapRef,
623
+ value: editingLocationValue,
624
+ onChange: setEditingLocationValue,
625
+ defaultRadius
626
+ }
627
+ )
628
+ ));
629
+ });
630
+ MapField.displayName = "MapField";
631
+ var MapField_default = MapField;
@@ -0,0 +1,3 @@
1
+ export { default as MapField } from './MapField';
2
+ export type { MapFieldProps, MapFieldRef } from './MapField';
3
+ export { default as MembersField } from './membersField';
@@ -0,0 +1,42 @@
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/saasAttendance/settings/components/index.tsx
30
+ var components_exports = {};
31
+ __export(components_exports, {
32
+ MapField: () => import_MapField.default,
33
+ MembersField: () => import_membersField.default
34
+ });
35
+ module.exports = __toCommonJS(components_exports);
36
+ var import_MapField = __toESM(require("./MapField"));
37
+ var import_membersField = __toESM(require("./membersField"));
38
+ // Annotate the CommonJS export names for ESM import in node:
39
+ 0 && (module.exports = {
40
+ MapField,
41
+ MembersField
42
+ });
@@ -0,0 +1,7 @@
1
+ import './index.less';
2
+ declare const MembersField: (props: {
3
+ id?: string | undefined;
4
+ value?: number[] | undefined;
5
+ onChange?: ((newValue: number[]) => void) | undefined;
6
+ }) => JSX.Element;
7
+ export default MembersField;