@pisell/private-materials 3.4.77 → 3.4.78

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 (81) 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 +2 -2
  9. package/build/lowcode/view.css +1 -1
  10. package/build/lowcode/view.js +2 -2
  11. package/es/components/booking/addons/model.d.ts +1 -10
  12. package/es/components/booking/forms/model.d.ts +1 -10
  13. package/es/components/booking/forms/sendModal/useSendModal.d.ts +0 -1
  14. package/es/components/booking/info/model.d.ts +1 -10
  15. package/es/components/booking/info/service/addService/utils.d.ts +1 -1
  16. package/es/components/booking/info2/service/addService/utils.d.ts +1 -1
  17. package/es/components/booking/model.d.ts +1 -9
  18. package/es/components/booking/notes/model.d.ts +1 -10
  19. package/es/components/booking/payments/model.d.ts +1 -10
  20. package/es/components/eftposPay/amount.d.ts +1 -1
  21. package/es/components/eftposPay/device.d.ts +1 -1
  22. package/es/components/eftposPay/hooks.d.ts +1 -1
  23. package/es/components/eftposPay/store/index.d.ts +3 -3
  24. package/es/components/eventBooking/components/ErrorTip/index.d.ts +0 -1
  25. package/es/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/CallToBook/index.d.ts +0 -1
  26. package/es/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/WeekItem/index.d.ts +0 -1
  27. package/es/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/index.d.ts +0 -1
  28. package/es/components/pay/toC/model.d.ts +1 -9
  29. package/es/components/schedules/model.d.ts +1 -9
  30. package/es/plus/saasAttendance/locales.d.ts +63 -0
  31. package/es/plus/saasAttendance/locales.js +71 -2
  32. package/es/plus/saasAttendance/settings/PermissonTab.d.ts +5 -0
  33. package/es/plus/saasAttendance/settings/PermissonTab.js +79 -0
  34. package/es/plus/saasAttendance/settings/ShiftScheduleTab.js +9 -3
  35. package/es/plus/saasAttendance/settings/components/MapField.js +69 -33
  36. package/es/plus/saasAttendance/settings/components/shiftModal/ShiftPreview.d.ts +7 -0
  37. package/es/plus/saasAttendance/settings/components/shiftModal/ShiftPreview.js +149 -0
  38. package/es/plus/saasAttendance/settings/components/shiftModal/ShiftPreview.less +119 -0
  39. package/es/plus/saasAttendance/settings/index.js +7 -0
  40. package/es/plus/saasAttendance/settings/index.less +15 -0
  41. package/es/plus/saasAttendance/settings/types.d.ts +6 -0
  42. package/es/plus/selectHolder/components/ErrorTip/index.d.ts +0 -1
  43. package/es/plus/walletEditor/components/ImageUpload/index.d.ts +1 -1
  44. package/es/pro/Selector/Selector.d.ts +1 -1
  45. package/lib/components/booking/addons/model.d.ts +1 -10
  46. package/lib/components/booking/forms/model.d.ts +1 -10
  47. package/lib/components/booking/forms/sendModal/useSendModal.d.ts +0 -1
  48. package/lib/components/booking/info/model.d.ts +1 -10
  49. package/lib/components/booking/info/service/addService/utils.d.ts +1 -1
  50. package/lib/components/booking/info2/service/addService/utils.d.ts +1 -1
  51. package/lib/components/booking/model.d.ts +1 -9
  52. package/lib/components/booking/notes/model.d.ts +1 -10
  53. package/lib/components/booking/payments/model.d.ts +1 -10
  54. package/lib/components/eftposPay/amount.d.ts +1 -1
  55. package/lib/components/eftposPay/device.d.ts +1 -1
  56. package/lib/components/eftposPay/hooks.d.ts +1 -1
  57. package/lib/components/eftposPay/store/index.d.ts +3 -3
  58. package/lib/components/eventBooking/components/ErrorTip/index.d.ts +0 -1
  59. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/CallToBook/index.d.ts +0 -1
  60. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/WeekItem/index.d.ts +0 -1
  61. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/index.d.ts +0 -1
  62. package/lib/components/pay/toC/model.d.ts +1 -9
  63. package/lib/components/schedules/model.d.ts +1 -9
  64. package/lib/plus/saasAttendance/locales.d.ts +63 -0
  65. package/lib/plus/saasAttendance/locales.js +65 -2
  66. package/lib/plus/saasAttendance/settings/PermissonTab.d.ts +5 -0
  67. package/lib/plus/saasAttendance/settings/PermissonTab.js +128 -0
  68. package/lib/plus/saasAttendance/settings/ShiftScheduleTab.js +2 -1
  69. package/lib/plus/saasAttendance/settings/components/MapField.js +50 -11
  70. package/lib/plus/saasAttendance/settings/components/shiftModal/ShiftPreview.d.ts +7 -0
  71. package/lib/plus/saasAttendance/settings/components/shiftModal/ShiftPreview.js +150 -0
  72. package/lib/plus/saasAttendance/settings/components/shiftModal/ShiftPreview.less +119 -0
  73. package/lib/plus/saasAttendance/settings/index.js +12 -0
  74. package/lib/plus/saasAttendance/settings/index.less +15 -0
  75. package/lib/plus/saasAttendance/settings/types.d.ts +6 -0
  76. package/lib/plus/selectHolder/components/ErrorTip/index.d.ts +0 -1
  77. package/lib/plus/walletEditor/components/ImageUpload/index.d.ts +1 -1
  78. package/lib/pro/Selector/Selector.d.ts +1 -1
  79. package/lowcode/eco-cup-list/meta.ts +1 -1
  80. package/lowcode/eco-customer-list/meta.ts +1 -1
  81. package/package.json +3 -3
@@ -0,0 +1,128 @@
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/PermissonTab.tsx
30
+ var PermissonTab_exports = {};
31
+ __export(PermissonTab_exports, {
32
+ default: () => PermissonTab_default
33
+ });
34
+ module.exports = __toCommonJS(PermissonTab_exports);
35
+ var import_react = __toESM(require("react"));
36
+ var import_antd = require("antd");
37
+ var import_utils = require("@pisell/utils");
38
+ var PermissionField = (props) => {
39
+ var _a;
40
+ (0, import_react.useEffect)(() => {
41
+ var _a2, _b;
42
+ if (typeof ((_a2 = props.value) == null ? void 0 : _a2.member_data_view_range) === "undefined") {
43
+ (_b = props.onChange) == null ? void 0 : _b.call(props, {
44
+ ...props.value || {},
45
+ member_data_view_range: ["this_week"]
46
+ });
47
+ }
48
+ }, []);
49
+ const options = [
50
+ {
51
+ label: import_utils.locales.getText(
52
+ "pisell2.attendance.group-settings.basic-info.permission.this-week.recommended"
53
+ ),
54
+ value: "this_week"
55
+ },
56
+ {
57
+ label: import_utils.locales.getText(
58
+ "pisell2.attendance.group-settings.basic-info.permission.last-week"
59
+ ),
60
+ value: "last_week"
61
+ },
62
+ {
63
+ label: import_utils.locales.getText(
64
+ "pisell2.attendance.group-settings.basic-info.permission.this-month"
65
+ ),
66
+ value: "this_month"
67
+ }
68
+ ];
69
+ const value = (_a = props.value) == null ? void 0 : _a.member_data_view_range;
70
+ const isLimited = Array.isArray(value) && value.length > 0;
71
+ return /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement(
72
+ import_antd.Radio.Group,
73
+ {
74
+ value: isLimited ? "limited" : "unlimited",
75
+ onChange: (e) => {
76
+ var _a2, _b;
77
+ const nextMode = e.target.value;
78
+ if (nextMode === "limited") {
79
+ const next = Array.isArray(value) && value.length > 0 ? value : ["this_week"];
80
+ (_a2 = props.onChange) == null ? void 0 : _a2.call(props, {
81
+ ...props.value || {},
82
+ member_data_view_range: next
83
+ });
84
+ } else {
85
+ (_b = props.onChange) == null ? void 0 : _b.call(props, {
86
+ ...props.value || {},
87
+ member_data_view_range: []
88
+ });
89
+ }
90
+ },
91
+ style: { marginBottom: 8 }
92
+ },
93
+ /* @__PURE__ */ import_react.default.createElement(import_antd.Radio, { value: "limited" }, import_utils.locales.getText(
94
+ "pisell2.attendance.group-settings.basic-info.permission.limited"
95
+ )),
96
+ /* @__PURE__ */ import_react.default.createElement(import_antd.Radio, { value: "unlimited" }, import_utils.locales.getText(
97
+ "pisell2.attendance.group-settings.basic-info.permission.unlimited"
98
+ ))
99
+ ), isLimited && /* @__PURE__ */ import_react.default.createElement(
100
+ import_antd.Select,
101
+ {
102
+ mode: "multiple",
103
+ allowClear: true,
104
+ value,
105
+ options,
106
+ onChange: (next) => {
107
+ var _a2;
108
+ (_a2 = props.onChange) == null ? void 0 : _a2.call(props, {
109
+ ...props.value || {},
110
+ member_data_view_range: next.length > 0 ? next : []
111
+ });
112
+ }
113
+ }
114
+ ));
115
+ };
116
+ var PermissonTab = (props) => {
117
+ return /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__panel", id: props.id }, /* @__PURE__ */ import_react.default.createElement(
118
+ import_antd.Form.Item,
119
+ {
120
+ label: import_utils.locales.getText(
121
+ "pisell2.attendance.group-settings.data-permission.employee-data-view-range"
122
+ ),
123
+ name: "permission"
124
+ },
125
+ /* @__PURE__ */ import_react.default.createElement(PermissionField, null)
126
+ ));
127
+ };
128
+ var PermissonTab_default = PermissonTab;
@@ -37,6 +37,7 @@ var import_antd = require("antd");
37
37
  var import_materials = require("@pisell/materials");
38
38
  var import_utils = require("@pisell/utils");
39
39
  var import_shiftModal = __toESM(require("./components/shiftModal"));
40
+ var import_ShiftPreview = __toESM(require("./components/shiftModal/ShiftPreview"));
40
41
  var ScheduleSetting = (props) => {
41
42
  const { value, onChange } = props;
42
43
  const [open, setOpen] = (0, import_react.useState)(false);
@@ -101,6 +102,6 @@ var ShiftScheduleTab = (props) => {
101
102
  ]
102
103
  },
103
104
  /* @__PURE__ */ import_react.default.createElement(ScheduleSetting, null)
104
- ));
105
+ ), /* @__PURE__ */ import_react.default.createElement(import_antd.Form.Item, { noStyle: true, shouldUpdate: true }, (form) => /* @__PURE__ */ import_react.default.createElement(import_ShiftPreview.default, { value: form.getFieldValue(["shift", "fixed"]) })));
105
106
  };
106
107
  var ShiftScheduleTab_default = ShiftScheduleTab;
@@ -401,6 +401,9 @@ var MapField = (0, import_react.forwardRef)((props, ref) => {
401
401
  const locations = (0, import_react.useMemo)(() => normalizeLocations(value), [value]);
402
402
  const [addLocationOpen, setAddLocationOpen] = (0, import_react.useState)(false);
403
403
  const [editingLocationValue, setEditingLocationValue] = (0, import_react.useState)(null);
404
+ const [editingLocationId, setEditingLocationId] = (0, import_react.useState)(
405
+ null
406
+ );
404
407
  const locationFormMapRef = (0, import_react.useRef)(null);
405
408
  const mapRef = (0, import_react.useRef)(null);
406
409
  const [isMapReady, setIsMapReady] = (0, import_react.useState)(false);
@@ -472,6 +475,7 @@ var MapField = (0, import_react.forwardRef)((props, ref) => {
472
475
  validRangeMeters: defaultRadius
473
476
  };
474
477
  setAddLocationOpen(true);
478
+ setEditingLocationId(null);
475
479
  setEditingLocationValue(baseFormValue);
476
480
  const currentPosition = await getCurrentPosition();
477
481
  if (currentPosition) {
@@ -485,12 +489,12 @@ var MapField = (0, import_react.forwardRef)((props, ref) => {
485
489
  }),
486
490
  [defaultRadius]
487
491
  );
488
- const handleAddLocation = async () => {
492
+ const handleSubmitLocation = async () => {
489
493
  if (!locationFormMapRef.current) return;
490
494
  try {
491
495
  const values = await locationFormMapRef.current.validate();
492
- const newLocation = {
493
- id: createLocationId(),
496
+ const nextLocation = {
497
+ id: editingLocationId ?? createLocationId(),
494
498
  name: toMultiLangName(values.name),
495
499
  radius: values.validRangeMeters,
496
500
  address: {
@@ -498,15 +502,37 @@ var MapField = (0, import_react.forwardRef)((props, ref) => {
498
502
  lng: parseFloat(values.longitude) || 0
499
503
  }
500
504
  };
501
- const nextLocations = [newLocation, ...locations];
502
- onChange == null ? void 0 : onChange(nextLocations);
503
- setActiveLocationId(newLocation.id);
505
+ if (editingLocationId) {
506
+ const nextLocations = locations.map(
507
+ (loc) => loc.id === editingLocationId ? nextLocation : loc
508
+ );
509
+ onChange == null ? void 0 : onChange(nextLocations);
510
+ setActiveLocationId(editingLocationId);
511
+ } else {
512
+ const nextLocations = [nextLocation, ...locations];
513
+ onChange == null ? void 0 : onChange(nextLocations);
514
+ setActiveLocationId(nextLocation.id);
515
+ }
504
516
  setAddLocationOpen(false);
505
517
  setEditingLocationValue(null);
518
+ setEditingLocationId(null);
506
519
  } catch (error) {
507
520
  console.error("Validation failed:", error);
508
521
  }
509
522
  };
523
+ const handleEditLocation = (0, import_react.useCallback)(
524
+ (location) => {
525
+ setAddLocationOpen(true);
526
+ setEditingLocationId(location.id);
527
+ setEditingLocationValue({
528
+ name: toMultiLangName(location.name),
529
+ latitude: String(location.address.lat ?? ""),
530
+ longitude: String(location.address.lng ?? ""),
531
+ validRangeMeters: location.radius ?? defaultRadius
532
+ });
533
+ },
534
+ [defaultRadius]
535
+ );
510
536
  const handleRemoveLocation = (locationId) => {
511
537
  const nextLocations = locations.filter((loc) => loc.id !== locationId);
512
538
  onChange == null ? void 0 : onChange(nextLocations);
@@ -573,7 +599,19 @@ var MapField = (0, import_react.forwardRef)((props, ref) => {
573
599
  onClick: () => handleLocationItemClick(location),
574
600
  style: { cursor: "pointer" }
575
601
  },
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(
602
+ /* @__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("div", { className: "saas-attendance-map-field__location-actions" }, /* @__PURE__ */ import_react.default.createElement(
603
+ import_antd.Button,
604
+ {
605
+ type: "text",
606
+ size: "small",
607
+ icon: /* @__PURE__ */ import_react.default.createElement(import_materials.Icon, { type: "pisell2-edit-05", size: 16 }),
608
+ className: "saas-attendance-map-field__edit-btn",
609
+ onClick: (e) => {
610
+ e.stopPropagation();
611
+ handleEditLocation(location);
612
+ }
613
+ }
614
+ ), /* @__PURE__ */ import_react.default.createElement(
577
615
  import_antd.Button,
578
616
  {
579
617
  type: "text",
@@ -585,7 +623,7 @@ var MapField = (0, import_react.forwardRef)((props, ref) => {
585
623
  handleRemoveLocation(location.id);
586
624
  }
587
625
  }
588
- )),
626
+ ))),
589
627
  /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__location-meta" }, import_utils.locales.getText(
590
628
  "pisell2.attendance.group-settings.clock-in-method.add-location-modal.valid-range.label"
591
629
  ), ": ", /* @__PURE__ */ import_react.default.createElement("span", null, location.radius || defaultRadius))
@@ -601,20 +639,21 @@ var MapField = (0, import_react.forwardRef)((props, ref) => {
601
639
  {
602
640
  open: addLocationOpen,
603
641
  title: import_utils.locales.getText(
604
- "pisell2.attendance.group-settings.clock-in-method.add-location-modal.title"
642
+ editingLocationId ? "pisell2.attendance.group-settings.clock-in-method.edit-location-modal.title" : "pisell2.attendance.group-settings.clock-in-method.add-location-modal.title"
605
643
  ),
606
644
  destroyOnHidden: true,
607
645
  onCancel: () => {
608
646
  setAddLocationOpen(false);
609
647
  setEditingLocationValue(null);
648
+ setEditingLocationId(null);
610
649
  },
611
650
  okText: import_utils.locales.getText(
612
- "pisell2.attendance.group-settings.actions.add-location-confirm"
651
+ editingLocationId ? "pisell2.attendance.group-settings.actions.edit-location-confirm" : "pisell2.attendance.group-settings.actions.add-location-confirm"
613
652
  ),
614
653
  cancelText: import_utils.locales.getText(
615
654
  "pisell2.attendance.group-settings.actions.cancel"
616
655
  ),
617
- onOk: handleAddLocation
656
+ onOk: handleSubmitLocation
618
657
  },
619
658
  /* @__PURE__ */ import_react.default.createElement(
620
659
  LocationFormMap,
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { ShiftScheduleItem } from './index';
3
+ import './ShiftPreview.less';
4
+ declare const ShiftPreview: React.FC<{
5
+ value?: ShiftScheduleItem[];
6
+ }>;
7
+ export default ShiftPreview;
@@ -0,0 +1,150 @@
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/shiftModal/ShiftPreview.tsx
30
+ var ShiftPreview_exports = {};
31
+ __export(ShiftPreview_exports, {
32
+ default: () => ShiftPreview_default
33
+ });
34
+ module.exports = __toCommonJS(ShiftPreview_exports);
35
+ var import_react = __toESM(require("react"));
36
+ var import_utils = require("@pisell/utils");
37
+ var import_ShiftPreview = require("./ShiftPreview.less");
38
+ var WEEKDAYS = [1, 2, 3, 4, 5, 6, 7];
39
+ var getWeekdayText = (weekday) => {
40
+ return import_utils.locales.getText(
41
+ `pisell2.attendance.group-settings.shift-schedule.modal.weekday.${weekday}`
42
+ );
43
+ };
44
+ var parseMinutes = (hhmm) => {
45
+ const [h, m] = (hhmm || "").split(":").map((v) => Number(v));
46
+ if (!Number.isFinite(h) || !Number.isFinite(m)) {
47
+ return null;
48
+ }
49
+ return h * 60 + m;
50
+ };
51
+ var formatClock = (hhmm) => {
52
+ const totalMinutes = parseMinutes(hhmm);
53
+ if (totalMinutes === null) return "";
54
+ const hours24 = Math.floor(totalMinutes / 60) % 24;
55
+ const minutes = totalMinutes % 60;
56
+ const suffix = hours24 >= 12 ? import_utils.locales.getText(
57
+ "pisell2.attendance.group-settings.shift-schedule.preview.period.pm"
58
+ ) : import_utils.locales.getText(
59
+ "pisell2.attendance.group-settings.shift-schedule.preview.period.am"
60
+ );
61
+ const hours12 = hours24 % 12 === 0 ? 12 : hours24 % 12;
62
+ return `${hours12}:${String(minutes).padStart(2, "0")} ${suffix}`;
63
+ };
64
+ var formatWeeklyHours = (totalMinutes) => {
65
+ const hours = totalMinutes / 60;
66
+ if (Number.isInteger(hours)) return `${hours}`;
67
+ return `${hours.toFixed(2)}`.replace(/\.?0+$/, "");
68
+ };
69
+ var formatDuration = (totalMinutes) => {
70
+ const hours = Math.floor(totalMinutes / 60);
71
+ const minutes = totalMinutes % 60;
72
+ return import_utils.locales.getText(
73
+ "pisell2.attendance.group-settings.shift-schedule.preview.duration"
74
+ )(hours, minutes);
75
+ };
76
+ var ShiftPreview = (props) => {
77
+ const schedule = Array.isArray(props.value) ? props.value : [];
78
+ const previewDays = (0, import_react.useMemo)(() => {
79
+ const byWeekday = /* @__PURE__ */ new Map();
80
+ schedule.forEach((item) => {
81
+ if (item && typeof item.weekday === "number") {
82
+ byWeekday.set(item.weekday, item);
83
+ }
84
+ });
85
+ return WEEKDAYS.map((weekday) => {
86
+ const item = byWeekday.get(weekday);
87
+ const times = Array.isArray(item == null ? void 0 : item.times) ? item.times : [];
88
+ const timeRanges = times.map((time) => {
89
+ const startText = formatClock(time == null ? void 0 : time.start);
90
+ const endText = formatClock(time == null ? void 0 : time.end);
91
+ if (!startText || !endText) return null;
92
+ return { startText, endText };
93
+ }).filter(Boolean);
94
+ const totalMinutes = times.reduce((sum, time) => {
95
+ const start = parseMinutes(time == null ? void 0 : time.start);
96
+ const end = parseMinutes(time == null ? void 0 : time.end);
97
+ if (start === null || end === null || end <= start) {
98
+ return sum;
99
+ }
100
+ return sum + (end - start);
101
+ }, 0);
102
+ return {
103
+ weekday,
104
+ timeRanges,
105
+ totalMinutes
106
+ };
107
+ });
108
+ }, [schedule]);
109
+ const workingDays = previewDays.filter((day) => day.totalMinutes > 0).length;
110
+ const weeklyMinutes = previewDays.reduce(
111
+ (sum, day) => sum + day.totalMinutes,
112
+ 0
113
+ );
114
+ return /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-preview" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-summary" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-summary-card" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-summary-label" }, import_utils.locales.getText(
115
+ "pisell2.attendance.group-settings.shift-schedule.preview.working-days"
116
+ )), /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-summary-value" }, workingDays), /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-summary-unit" }, import_utils.locales.getText(
117
+ "pisell2.attendance.group-settings.shift-schedule.preview.days-per-week"
118
+ ))), /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-summary-card" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-summary-label" }, import_utils.locales.getText(
119
+ "pisell2.attendance.group-settings.shift-schedule.preview.weekly-hours"
120
+ )), /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-summary-value" }, formatWeeklyHours(weeklyMinutes)), /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-summary-unit" }, import_utils.locales.getText(
121
+ "pisell2.attendance.group-settings.shift-schedule.preview.hours"
122
+ )))), /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-table" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-table-head" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-table-cell" }, import_utils.locales.getText(
123
+ "pisell2.attendance.group-settings.shift-schedule.preview.table.day"
124
+ )), /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-table-cell" }, import_utils.locales.getText(
125
+ "pisell2.attendance.group-settings.shift-schedule.preview.table.shift-times"
126
+ )), /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-table-cell" }, import_utils.locales.getText(
127
+ "pisell2.attendance.group-settings.shift-schedule.preview.table.duration"
128
+ ))), previewDays.map((day) => /* @__PURE__ */ import_react.default.createElement(
129
+ "div",
130
+ {
131
+ key: day.weekday,
132
+ className: "saas-attendance-group-settings__shift-table-row"
133
+ },
134
+ /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-table-cell" }, getWeekdayText(day.weekday)),
135
+ /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-table-cell" }, day.timeRanges.length > 0 ? /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-times" }, day.timeRanges.map((range, index) => /* @__PURE__ */ import_react.default.createElement(
136
+ "div",
137
+ {
138
+ key: `${day.weekday}-${index}`,
139
+ className: "saas-attendance-group-settings__shift-time-tag"
140
+ },
141
+ /* @__PURE__ */ import_react.default.createElement("span", { className: "saas-attendance-group-settings__shift-time-text" }, range.startText),
142
+ /* @__PURE__ */ import_react.default.createElement("span", { className: "saas-attendance-group-settings__shift-time-arrow" }, "→"),
143
+ /* @__PURE__ */ import_react.default.createElement("span", { className: "saas-attendance-group-settings__shift-time-text" }, range.endText)
144
+ ))) : /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-empty" }, import_utils.locales.getText(
145
+ "pisell2.attendance.group-settings.shift-schedule.preview.no-shift"
146
+ ))),
147
+ /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-table-cell" }, day.totalMinutes > 0 ? /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-duration" }, formatDuration(day.totalMinutes)) : /* @__PURE__ */ import_react.default.createElement("div", { className: "saas-attendance-group-settings__shift-duration-empty" }, formatDuration(0)))
148
+ ))));
149
+ };
150
+ var ShiftPreview_default = ShiftPreview;
@@ -0,0 +1,119 @@
1
+ .saas-attendance-group-settings__shift-preview {
2
+ margin-top: 12px;
3
+ }
4
+
5
+ .saas-attendance-group-settings__shift-summary {
6
+ display: grid;
7
+ grid-template-columns: 1fr 1fr;
8
+ gap: 12px;
9
+ margin-top: 12px;
10
+ }
11
+
12
+ .saas-attendance-group-settings__shift-summary-card {
13
+ border: 1px solid #e5e7eb;
14
+ border-radius: 10px;
15
+ background: #ffffff;
16
+ padding: 14px 16px;
17
+ }
18
+
19
+ .saas-attendance-group-settings__shift-summary-label {
20
+ font-size: 12px;
21
+ line-height: 18px;
22
+ color: #6b7280;
23
+ }
24
+
25
+ .saas-attendance-group-settings__shift-summary-value {
26
+ margin-top: 8px;
27
+ font-size: 28px;
28
+ line-height: 32px;
29
+ font-weight: 600;
30
+ color: #111827;
31
+ }
32
+
33
+ .saas-attendance-group-settings__shift-summary-unit {
34
+ margin-top: 4px;
35
+ font-size: 12px;
36
+ line-height: 18px;
37
+ color: #6b7280;
38
+ }
39
+
40
+ .saas-attendance-group-settings__shift-table {
41
+ margin-top: 12px;
42
+ border: 1px solid #e5e7eb;
43
+ border-radius: 10px;
44
+ overflow: hidden;
45
+ background: #ffffff;
46
+ }
47
+
48
+ .saas-attendance-group-settings__shift-table-head {
49
+ display: grid;
50
+ grid-template-columns: 1fr 3fr 1fr;
51
+ gap: 0;
52
+ padding: 12px 16px;
53
+ background: #f9fafb;
54
+ border-bottom: 1px solid #e5e7eb;
55
+ font-size: 12px;
56
+ color: #6b7280;
57
+ }
58
+
59
+ .saas-attendance-group-settings__shift-table-row {
60
+ display: grid;
61
+ grid-template-columns: 1fr 3fr 1fr;
62
+ gap: 0;
63
+ padding: 12px 16px;
64
+ border-bottom: 1px solid #f3f4f6;
65
+ }
66
+
67
+ .saas-attendance-group-settings__shift-table-row:last-child {
68
+ border-bottom: none;
69
+ }
70
+
71
+ .saas-attendance-group-settings__shift-table-cell {
72
+ display: flex;
73
+ align-items: center;
74
+ }
75
+
76
+ .saas-attendance-group-settings__shift-times {
77
+ display: flex;
78
+ flex-direction: column;
79
+ gap: 8px;
80
+ }
81
+
82
+ .saas-attendance-group-settings__shift-time-tag {
83
+ padding: 2px 4px;
84
+ border-radius: 6px;
85
+ background: #f3f4f6;
86
+ color: #374151;
87
+ font-size: 12px;
88
+ font-weight: 500;
89
+ display: inline-flex;
90
+ align-items: center;
91
+ gap: 6px;
92
+ }
93
+
94
+ .saas-attendance-group-settings__shift-time-text {
95
+ color: inherit;
96
+ }
97
+
98
+ .saas-attendance-group-settings__shift-time-arrow {
99
+ color: #6b7280;
100
+ }
101
+
102
+ .saas-attendance-group-settings__shift-empty {
103
+ color: #9ca3af;
104
+ font-size: 12px;
105
+ }
106
+
107
+ .saas-attendance-group-settings__shift-duration {
108
+ padding: 2px 4px;
109
+ border-radius: 2px;
110
+ background: #ecfdf5;
111
+ color: #14532d;
112
+ font-size: 10px;
113
+ font-weight: 600;
114
+ }
115
+
116
+ .saas-attendance-group-settings__shift-duration-empty {
117
+ color: #9ca3af;
118
+ font-size: 12px;
119
+ }
@@ -43,6 +43,7 @@ var import_useEngineContext = __toESM(require("../../../hooks/useEngineContext")
43
43
  var import_utils2 = require("../../../utils");
44
44
  var import_locales = __toESM(require("../locales"));
45
45
  var import_BasicInfoTab = __toESM(require("./BasicInfoTab"));
46
+ var import_PermissonTab = __toESM(require("./PermissonTab"));
46
47
  var import_ShiftScheduleTab = __toESM(require("./ShiftScheduleTab"));
47
48
  var import_ClockInMethodTab = __toESM(require("./ClockInMethodTab"));
48
49
  var import_CorrectionPolicyTab = __toESM(require("./CorrectionPolicyTab"));
@@ -68,6 +69,11 @@ var TAB_CONFIGS = [
68
69
  key: "correction",
69
70
  icon: "pisell2-clock",
70
71
  labelKey: "pisell2.attendance.group-settings.correction-policy"
72
+ },
73
+ {
74
+ key: "permission",
75
+ icon: "pisell2-user-01",
76
+ labelKey: "pisell2.attendance.group-settings.data-permission"
71
77
  }
72
78
  ];
73
79
  var generateSimpleUUID = () => {
@@ -272,6 +278,12 @@ var Settings = (0, import_react.forwardRef)((props, ref) => {
272
278
  form,
273
279
  id: `saas-attendance-settings-section-${_uniqueId}-correction`
274
280
  }
281
+ ),
282
+ /* @__PURE__ */ import_react.default.createElement(
283
+ import_PermissonTab.default,
284
+ {
285
+ id: `saas-attendance-settings-section-${_uniqueId}-permission`
286
+ }
275
287
  )
276
288
  )
277
289
  ));
@@ -485,6 +485,21 @@
485
485
  gap: 8px;
486
486
  }
487
487
 
488
+ .saas-attendance-map-field__location-actions {
489
+ display: flex;
490
+ align-items: center;
491
+ gap: 4px;
492
+ }
493
+
494
+ .saas-attendance-map-field__edit-btn {
495
+ color: #9ca3af;
496
+ transition: color 0.2s ease;
497
+
498
+ &:hover {
499
+ color: #7f56d9;
500
+ }
501
+ }
502
+
488
503
  .saas-attendance-map-field__delete-btn {
489
504
  color: #9ca3af;
490
505
  transition: color 0.2s ease;
@@ -65,6 +65,10 @@ export interface AttendanceCorrection {
65
65
  period_type: FrequencyType;
66
66
  period_custom: number | null;
67
67
  }
68
+ export declare type MemberDataViewRange = 'this_week' | 'last_week' | 'this_month';
69
+ export interface AttendancePermission {
70
+ member_data_view_range?: MemberDataViewRange[];
71
+ }
68
72
  /**
69
73
  * 考勤组设置值 - 完整的API数据结构
70
74
  */
@@ -76,6 +80,7 @@ export interface AttendanceGroupSettingsValue {
76
80
  place: AttendancePlace;
77
81
  member_ids: number[];
78
82
  correction: AttendanceCorrection;
83
+ permission?: AttendancePermission;
79
84
  creator_type?: string;
80
85
  creator_id?: number;
81
86
  editor_type?: string;
@@ -90,6 +95,7 @@ export interface BasicInfoTabValue {
90
95
  name: MultiLangName;
91
96
  timezone: string;
92
97
  member_ids: number[];
98
+ permission?: AttendancePermission;
93
99
  }
94
100
  /**
95
101
  * 排班规则Tab的值
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import './index.less';
3
2
  declare const ErrorTip: ({ text }: any) => import("react").JSX.Element;
4
3
  export default ErrorTip;
@@ -3,6 +3,6 @@ export interface ImageUploadProps {
3
3
  value?: string;
4
4
  onChange?: (val: string) => void;
5
5
  }
6
- export declare const getBaseTime: (size: number) => 1000 | 2000 | 4000 | 8000;
6
+ export declare const getBaseTime: (size: number) => 2000 | 1000 | 4000 | 8000;
7
7
  declare const ImageUpload: React.FC<ImageUploadProps>;
8
8
  export default ImageUpload;
@@ -3,7 +3,7 @@ import { ItemLayout, ItemProps, PresetConfig, SelectorProps, SelectorVariant } f
3
3
  import './selector.less';
4
4
  export declare const SelectorContext: React.Context<{
5
5
  disabled?: boolean | undefined;
6
- mode?: "single" | "multiple" | undefined;
6
+ mode?: "multiple" | "single" | undefined;
7
7
  itemLayout?: ItemLayout | undefined;
8
8
  valueType?: "object" | "primitive" | undefined;
9
9
  variant?: SelectorVariant | undefined;
@@ -9,7 +9,7 @@ const EcoCupListMeta: ComponentMetadata = {
9
9
  "devMode": "proCode",
10
10
  "npm": {
11
11
  "package": "@pisell/private-materials",
12
- "version": "6.3.93",
12
+ "version": "6.3.94",
13
13
  "exportName": "EcoCupList",
14
14
  "main": "src/index.ts",
15
15
  "destructuring": true,