@infuro/cms-core 1.0.42 → 1.0.43

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.
package/dist/admin.cjs CHANGED
@@ -492,7 +492,7 @@ var init_admin_config_context = __esm({
492
492
  var CMS_VERSION;
493
493
  var init_cms_version = __esm({
494
494
  "src/lib/cms-version.ts"() {
495
- CMS_VERSION = "1.0.42" ;
495
+ CMS_VERSION = "1.0.43" ;
496
496
  }
497
497
  });
498
498
  function useCatalogCategories(enabled = true) {
@@ -6708,9 +6708,10 @@ var init_CategoryAutocomplete = __esm({
6708
6708
  __name(CategoryAutocomplete, "CategoryAutocomplete");
6709
6709
  }
6710
6710
  });
6711
- function UserAutocomplete({ selectedUserId, onUserChange, placeholder = "Select author...", className = "" }) {
6711
+ function UserAutocomplete({ selectedUserId, onUserChange, placeholder = "Select author...", className = "", groupName = ADMIN_GROUP_NAME }) {
6712
6712
  const [inputValue, setInputValue] = React26.useState("");
6713
6713
  const [suggestions, setSuggestions] = React26.useState([]);
6714
+ const [selectedUser, setSelectedUser] = React26.useState(null);
6714
6715
  const [isLoading, setIsLoading] = React26.useState(false);
6715
6716
  const [showSuggestions, setShowSuggestions] = React26.useState(false);
6716
6717
  const inputRef = React26.useRef(null);
@@ -6719,14 +6720,18 @@ function UserAutocomplete({ selectedUserId, onUserChange, placeholder = "Select
6719
6720
  setIsLoading(true);
6720
6721
  try {
6721
6722
  const params = new URLSearchParams();
6722
- if (query.trim()) {
6723
- params.append("search", query);
6724
- }
6723
+ if (query.trim()) params.append("search", query);
6725
6724
  params.append("limit", "50");
6725
+ const group = groupName.trim() || ADMIN_GROUP_NAME;
6726
+ params.append("groupName", group);
6726
6727
  const response = await fetch(`/api/users?${params}`);
6727
6728
  if (response.ok) {
6728
6729
  const data = await response.json();
6729
- setSuggestions(data.data || []);
6730
+ const rows = Array.isArray(data.data) ? data.data : [];
6731
+ setSuggestions(rows.filter((u) => {
6732
+ const g = u.group?.name;
6733
+ return g == null || g === group;
6734
+ }));
6730
6735
  }
6731
6736
  } catch (error) {
6732
6737
  console.error("Error fetching users:", error);
@@ -6740,28 +6745,57 @@ function UserAutocomplete({ selectedUserId, onUserChange, placeholder = "Select
6740
6745
  }, 300);
6741
6746
  return () => clearTimeout(timeoutId);
6742
6747
  }, [
6743
- inputValue
6748
+ inputValue,
6749
+ groupName
6750
+ ]);
6751
+ React26.useEffect(() => {
6752
+ if (selectedUserId == null) {
6753
+ setSelectedUser(null);
6754
+ return;
6755
+ }
6756
+ if (selectedUser?.id === selectedUserId) return;
6757
+ let cancelled = false;
6758
+ (async () => {
6759
+ try {
6760
+ const res = await fetch(`/api/users/${selectedUserId}`);
6761
+ if (!res.ok || cancelled) return;
6762
+ const data = await res.json();
6763
+ if (!cancelled && data?.id != null) {
6764
+ setSelectedUser({
6765
+ id: Number(data.id),
6766
+ name: String(data.name ?? ""),
6767
+ email: String(data.email ?? "")
6768
+ });
6769
+ }
6770
+ } catch {
6771
+ }
6772
+ })();
6773
+ return () => {
6774
+ cancelled = true;
6775
+ };
6776
+ }, [
6777
+ selectedUserId,
6778
+ selectedUser?.id
6744
6779
  ]);
6745
6780
  const handleInputChange = /* @__PURE__ */ __name((e) => {
6746
- const value = e.target.value;
6747
- setInputValue(value);
6781
+ setInputValue(e.target.value);
6748
6782
  setShowSuggestions(true);
6749
6783
  }, "handleInputChange");
6750
6784
  const handleSuggestionSelect = /* @__PURE__ */ __name((user) => {
6751
6785
  onUserChange(user.id);
6786
+ setSelectedUser(user);
6752
6787
  setInputValue("");
6753
6788
  setShowSuggestions(false);
6754
6789
  setSuggestions([]);
6755
6790
  }, "handleSuggestionSelect");
6756
6791
  const handleRemoveUser = /* @__PURE__ */ __name(() => {
6757
6792
  onUserChange(null);
6793
+ setSelectedUser(null);
6758
6794
  }, "handleRemoveUser");
6759
6795
  const handleKeyPress = /* @__PURE__ */ __name((e) => {
6760
6796
  if (e.key === "Enter") {
6761
6797
  e.preventDefault();
6762
- if (suggestions.length > 0) {
6763
- handleSuggestionSelect(suggestions[0]);
6764
- }
6798
+ if (suggestions.length > 0) handleSuggestionSelect(suggestions[0]);
6765
6799
  } else if (e.key === "Escape") {
6766
6800
  setShowSuggestions(false);
6767
6801
  inputRef.current?.blur();
@@ -6776,14 +6810,13 @@ function UserAutocomplete({ selectedUserId, onUserChange, placeholder = "Select
6776
6810
  document.addEventListener("mousedown", handleClickOutside);
6777
6811
  return () => document.removeEventListener("mousedown", handleClickOutside);
6778
6812
  }, []);
6779
- const selectedUser = suggestions.find((user) => user.id === selectedUserId);
6780
6813
  return /* @__PURE__ */ React.createElement("div", {
6781
6814
  className: `relative ${className}`
6782
6815
  }, selectedUser && /* @__PURE__ */ React.createElement("div", {
6783
6816
  className: "mb-2"
6784
6817
  }, /* @__PURE__ */ React.createElement(Badge, {
6785
6818
  className: "flex items-center gap-1"
6786
- }, selectedUser.name, /* @__PURE__ */ React.createElement(LucideIcons.X, {
6819
+ }, selectedUser.name || selectedUser.email || `User #${selectedUser.id}`, /* @__PURE__ */ React.createElement(LucideIcons.X, {
6787
6820
  size: 12,
6788
6821
  className: "cursor-pointer hover:text-red-500",
6789
6822
  onClick: handleRemoveUser
@@ -6827,6 +6860,7 @@ var init_UserAutocomplete = __esm({
6827
6860
  "use client";
6828
6861
  init_input();
6829
6862
  init_badge();
6863
+ init_permission_entities();
6830
6864
  __name(UserAutocomplete, "UserAutocomplete");
6831
6865
  }
6832
6866
  });
@@ -7257,7 +7291,8 @@ function BlogEditor({ existingBlog, duplicateSource }) {
7257
7291
  selectedUserId: authorId,
7258
7292
  onUserChange: setAuthorId,
7259
7293
  placeholder: "Select author...",
7260
- className: "w-full"
7294
+ className: "w-full",
7295
+ groupName: "Administrator"
7261
7296
  })), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(ImageUpload, {
7262
7297
  value: coverImage,
7263
7298
  onChange: setCoverImage,
@@ -13991,7 +14026,11 @@ function ScheduleAuthorSelect({ value, onChange, disabled }) {
13991
14026
  (async () => {
13992
14027
  setLoading(true);
13993
14028
  try {
13994
- const res = await fetch("/api/users?limit=500");
14029
+ const params = new URLSearchParams({
14030
+ limit: "100",
14031
+ groupName: ADMIN_GROUP_NAME
14032
+ });
14033
+ const res = await fetch(`/api/users?${params}`);
13995
14034
  if (!res.ok || cancelled) return;
13996
14035
  const data = await res.json();
13997
14036
  const rows = Array.isArray(data.data) ? data.data : [];
@@ -14024,7 +14063,7 @@ function ScheduleAuthorSelect({ value, onChange, disabled }) {
14024
14063
  }, /* @__PURE__ */ React.createElement(SelectTrigger, {
14025
14064
  className: "w-full"
14026
14065
  }, /* @__PURE__ */ React.createElement(SelectValue, {
14027
- placeholder: users.length === 0 ? "No users found" : "Select author"
14066
+ placeholder: users.length === 0 ? "No administrators found" : "Select author"
14028
14067
  })), /* @__PURE__ */ React.createElement(SelectContent, {
14029
14068
  className: "max-h-72"
14030
14069
  }, users.map((u) => /* @__PURE__ */ React.createElement(SelectItem, {
@@ -14036,6 +14075,7 @@ var init_ScheduleAuthorSelect = __esm({
14036
14075
  "src/admin/ScheduleAuthorSelect.tsx"() {
14037
14076
  "use client";
14038
14077
  init_select();
14078
+ init_permission_entities();
14039
14079
  __name(userLabel, "userLabel");
14040
14080
  __name(ScheduleAuthorSelect, "ScheduleAuthorSelect");
14041
14081
  }
package/dist/admin.d.cts CHANGED
@@ -407,8 +407,10 @@ interface UserAutocompleteProps {
407
407
  onUserChange: (userId: number | null) => void;
408
408
  placeholder?: string;
409
409
  className?: string;
410
+ /** When set, only users in this group are listed (default: Administrator / super admins). */
411
+ groupName?: string;
410
412
  }
411
- declare function UserAutocomplete({ selectedUserId, onUserChange, placeholder, className }: UserAutocompleteProps): react_jsx_runtime.JSX.Element;
413
+ declare function UserAutocomplete({ selectedUserId, onUserChange, placeholder, className, groupName, }: UserAutocompleteProps): react_jsx_runtime.JSX.Element;
412
414
 
413
415
  interface ComponentSettingsProps {
414
416
  meta: ComponentMeta;
package/dist/admin.d.ts CHANGED
@@ -407,8 +407,10 @@ interface UserAutocompleteProps {
407
407
  onUserChange: (userId: number | null) => void;
408
408
  placeholder?: string;
409
409
  className?: string;
410
+ /** When set, only users in this group are listed (default: Administrator / super admins). */
411
+ groupName?: string;
410
412
  }
411
- declare function UserAutocomplete({ selectedUserId, onUserChange, placeholder, className }: UserAutocompleteProps): react_jsx_runtime.JSX.Element;
413
+ declare function UserAutocomplete({ selectedUserId, onUserChange, placeholder, className, groupName, }: UserAutocompleteProps): react_jsx_runtime.JSX.Element;
412
414
 
413
415
  interface ComponentSettingsProps {
414
416
  meta: ComponentMeta;
package/dist/admin.js CHANGED
@@ -457,7 +457,7 @@ var init_admin_config_context = __esm({
457
457
  var CMS_VERSION;
458
458
  var init_cms_version = __esm({
459
459
  "src/lib/cms-version.ts"() {
460
- CMS_VERSION = "1.0.42" ;
460
+ CMS_VERSION = "1.0.43" ;
461
461
  }
462
462
  });
463
463
  function useCatalogCategories(enabled = true) {
@@ -6673,9 +6673,10 @@ var init_CategoryAutocomplete = __esm({
6673
6673
  __name(CategoryAutocomplete, "CategoryAutocomplete");
6674
6674
  }
6675
6675
  });
6676
- function UserAutocomplete({ selectedUserId, onUserChange, placeholder = "Select author...", className = "" }) {
6676
+ function UserAutocomplete({ selectedUserId, onUserChange, placeholder = "Select author...", className = "", groupName = ADMIN_GROUP_NAME }) {
6677
6677
  const [inputValue, setInputValue] = useState("");
6678
6678
  const [suggestions, setSuggestions] = useState([]);
6679
+ const [selectedUser, setSelectedUser] = useState(null);
6679
6680
  const [isLoading, setIsLoading] = useState(false);
6680
6681
  const [showSuggestions, setShowSuggestions] = useState(false);
6681
6682
  const inputRef = useRef(null);
@@ -6684,14 +6685,18 @@ function UserAutocomplete({ selectedUserId, onUserChange, placeholder = "Select
6684
6685
  setIsLoading(true);
6685
6686
  try {
6686
6687
  const params = new URLSearchParams();
6687
- if (query.trim()) {
6688
- params.append("search", query);
6689
- }
6688
+ if (query.trim()) params.append("search", query);
6690
6689
  params.append("limit", "50");
6690
+ const group = groupName.trim() || ADMIN_GROUP_NAME;
6691
+ params.append("groupName", group);
6691
6692
  const response = await fetch(`/api/users?${params}`);
6692
6693
  if (response.ok) {
6693
6694
  const data = await response.json();
6694
- setSuggestions(data.data || []);
6695
+ const rows = Array.isArray(data.data) ? data.data : [];
6696
+ setSuggestions(rows.filter((u) => {
6697
+ const g = u.group?.name;
6698
+ return g == null || g === group;
6699
+ }));
6695
6700
  }
6696
6701
  } catch (error) {
6697
6702
  console.error("Error fetching users:", error);
@@ -6705,28 +6710,57 @@ function UserAutocomplete({ selectedUserId, onUserChange, placeholder = "Select
6705
6710
  }, 300);
6706
6711
  return () => clearTimeout(timeoutId);
6707
6712
  }, [
6708
- inputValue
6713
+ inputValue,
6714
+ groupName
6715
+ ]);
6716
+ useEffect(() => {
6717
+ if (selectedUserId == null) {
6718
+ setSelectedUser(null);
6719
+ return;
6720
+ }
6721
+ if (selectedUser?.id === selectedUserId) return;
6722
+ let cancelled = false;
6723
+ (async () => {
6724
+ try {
6725
+ const res = await fetch(`/api/users/${selectedUserId}`);
6726
+ if (!res.ok || cancelled) return;
6727
+ const data = await res.json();
6728
+ if (!cancelled && data?.id != null) {
6729
+ setSelectedUser({
6730
+ id: Number(data.id),
6731
+ name: String(data.name ?? ""),
6732
+ email: String(data.email ?? "")
6733
+ });
6734
+ }
6735
+ } catch {
6736
+ }
6737
+ })();
6738
+ return () => {
6739
+ cancelled = true;
6740
+ };
6741
+ }, [
6742
+ selectedUserId,
6743
+ selectedUser?.id
6709
6744
  ]);
6710
6745
  const handleInputChange = /* @__PURE__ */ __name((e) => {
6711
- const value = e.target.value;
6712
- setInputValue(value);
6746
+ setInputValue(e.target.value);
6713
6747
  setShowSuggestions(true);
6714
6748
  }, "handleInputChange");
6715
6749
  const handleSuggestionSelect = /* @__PURE__ */ __name((user) => {
6716
6750
  onUserChange(user.id);
6751
+ setSelectedUser(user);
6717
6752
  setInputValue("");
6718
6753
  setShowSuggestions(false);
6719
6754
  setSuggestions([]);
6720
6755
  }, "handleSuggestionSelect");
6721
6756
  const handleRemoveUser = /* @__PURE__ */ __name(() => {
6722
6757
  onUserChange(null);
6758
+ setSelectedUser(null);
6723
6759
  }, "handleRemoveUser");
6724
6760
  const handleKeyPress = /* @__PURE__ */ __name((e) => {
6725
6761
  if (e.key === "Enter") {
6726
6762
  e.preventDefault();
6727
- if (suggestions.length > 0) {
6728
- handleSuggestionSelect(suggestions[0]);
6729
- }
6763
+ if (suggestions.length > 0) handleSuggestionSelect(suggestions[0]);
6730
6764
  } else if (e.key === "Escape") {
6731
6765
  setShowSuggestions(false);
6732
6766
  inputRef.current?.blur();
@@ -6741,14 +6775,13 @@ function UserAutocomplete({ selectedUserId, onUserChange, placeholder = "Select
6741
6775
  document.addEventListener("mousedown", handleClickOutside);
6742
6776
  return () => document.removeEventListener("mousedown", handleClickOutside);
6743
6777
  }, []);
6744
- const selectedUser = suggestions.find((user) => user.id === selectedUserId);
6745
6778
  return /* @__PURE__ */ React.createElement("div", {
6746
6779
  className: `relative ${className}`
6747
6780
  }, selectedUser && /* @__PURE__ */ React.createElement("div", {
6748
6781
  className: "mb-2"
6749
6782
  }, /* @__PURE__ */ React.createElement(Badge, {
6750
6783
  className: "flex items-center gap-1"
6751
- }, selectedUser.name, /* @__PURE__ */ React.createElement(X, {
6784
+ }, selectedUser.name || selectedUser.email || `User #${selectedUser.id}`, /* @__PURE__ */ React.createElement(X, {
6752
6785
  size: 12,
6753
6786
  className: "cursor-pointer hover:text-red-500",
6754
6787
  onClick: handleRemoveUser
@@ -6792,6 +6825,7 @@ var init_UserAutocomplete = __esm({
6792
6825
  "use client";
6793
6826
  init_input();
6794
6827
  init_badge();
6828
+ init_permission_entities();
6795
6829
  __name(UserAutocomplete, "UserAutocomplete");
6796
6830
  }
6797
6831
  });
@@ -7222,7 +7256,8 @@ function BlogEditor({ existingBlog, duplicateSource }) {
7222
7256
  selectedUserId: authorId,
7223
7257
  onUserChange: setAuthorId,
7224
7258
  placeholder: "Select author...",
7225
- className: "w-full"
7259
+ className: "w-full",
7260
+ groupName: "Administrator"
7226
7261
  })), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(ImageUpload, {
7227
7262
  value: coverImage,
7228
7263
  onChange: setCoverImage,
@@ -13956,7 +13991,11 @@ function ScheduleAuthorSelect({ value, onChange, disabled }) {
13956
13991
  (async () => {
13957
13992
  setLoading(true);
13958
13993
  try {
13959
- const res = await fetch("/api/users?limit=500");
13994
+ const params = new URLSearchParams({
13995
+ limit: "100",
13996
+ groupName: ADMIN_GROUP_NAME
13997
+ });
13998
+ const res = await fetch(`/api/users?${params}`);
13960
13999
  if (!res.ok || cancelled) return;
13961
14000
  const data = await res.json();
13962
14001
  const rows = Array.isArray(data.data) ? data.data : [];
@@ -13989,7 +14028,7 @@ function ScheduleAuthorSelect({ value, onChange, disabled }) {
13989
14028
  }, /* @__PURE__ */ React.createElement(SelectTrigger, {
13990
14029
  className: "w-full"
13991
14030
  }, /* @__PURE__ */ React.createElement(SelectValue, {
13992
- placeholder: users.length === 0 ? "No users found" : "Select author"
14031
+ placeholder: users.length === 0 ? "No administrators found" : "Select author"
13993
14032
  })), /* @__PURE__ */ React.createElement(SelectContent, {
13994
14033
  className: "max-h-72"
13995
14034
  }, users.map((u) => /* @__PURE__ */ React.createElement(SelectItem, {
@@ -14001,6 +14040,7 @@ var init_ScheduleAuthorSelect = __esm({
14001
14040
  "src/admin/ScheduleAuthorSelect.tsx"() {
14002
14041
  "use client";
14003
14042
  init_select();
14043
+ init_permission_entities();
14004
14044
  __name(userLabel, "userLabel");
14005
14045
  __name(ScheduleAuthorSelect, "ScheduleAuthorSelect");
14006
14046
  }
package/dist/api.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkGINYYPXK_cjs = require('./chunk-GINYYPXK.cjs');
3
+ var chunkSCPKMZG5_cjs = require('./chunk-SCPKMZG5.cjs');
4
4
  require('./chunk-22FFHLTO.cjs');
5
5
  require('./chunk-UCKN4BBY.cjs');
6
6
  require('./chunk-7NMT3GBR.cjs');
@@ -20,127 +20,127 @@ require('./chunk-USNT2KNT.cjs');
20
20
 
21
21
  Object.defineProperty(exports, "createAnalyticsHandlers", {
22
22
  enumerable: true,
23
- get: function () { return chunkGINYYPXK_cjs.createAnalyticsHandlers; }
23
+ get: function () { return chunkSCPKMZG5_cjs.createAnalyticsHandlers; }
24
24
  });
25
25
  Object.defineProperty(exports, "createBlogBySlugHandler", {
26
26
  enumerable: true,
27
- get: function () { return chunkGINYYPXK_cjs.createBlogBySlugHandler; }
27
+ get: function () { return chunkSCPKMZG5_cjs.createBlogBySlugHandler; }
28
28
  });
29
29
  Object.defineProperty(exports, "createChangePasswordHandler", {
30
30
  enumerable: true,
31
- get: function () { return chunkGINYYPXK_cjs.createChangePasswordHandler; }
31
+ get: function () { return chunkSCPKMZG5_cjs.createChangePasswordHandler; }
32
32
  });
33
33
  Object.defineProperty(exports, "createCmsApiHandler", {
34
34
  enumerable: true,
35
- get: function () { return chunkGINYYPXK_cjs.createCmsApiHandler; }
35
+ get: function () { return chunkSCPKMZG5_cjs.createCmsApiHandler; }
36
36
  });
37
37
  Object.defineProperty(exports, "createCrudByIdHandler", {
38
38
  enumerable: true,
39
- get: function () { return chunkGINYYPXK_cjs.createCrudByIdHandler; }
39
+ get: function () { return chunkSCPKMZG5_cjs.createCrudByIdHandler; }
40
40
  });
41
41
  Object.defineProperty(exports, "createCrudHandler", {
42
42
  enumerable: true,
43
- get: function () { return chunkGINYYPXK_cjs.createCrudHandler; }
43
+ get: function () { return chunkSCPKMZG5_cjs.createCrudHandler; }
44
44
  });
45
45
  Object.defineProperty(exports, "createDashboardStatsHandler", {
46
46
  enumerable: true,
47
- get: function () { return chunkGINYYPXK_cjs.createDashboardStatsHandler; }
47
+ get: function () { return chunkSCPKMZG5_cjs.createDashboardStatsHandler; }
48
48
  });
49
49
  Object.defineProperty(exports, "createEcommerceAnalyticsHandler", {
50
50
  enumerable: true,
51
- get: function () { return chunkGINYYPXK_cjs.createEcommerceAnalyticsHandler; }
51
+ get: function () { return chunkSCPKMZG5_cjs.createEcommerceAnalyticsHandler; }
52
52
  });
53
53
  Object.defineProperty(exports, "createForgotPasswordHandler", {
54
54
  enumerable: true,
55
- get: function () { return chunkGINYYPXK_cjs.createForgotPasswordHandler; }
55
+ get: function () { return chunkSCPKMZG5_cjs.createForgotPasswordHandler; }
56
56
  });
57
57
  Object.defineProperty(exports, "createFormBySlugHandler", {
58
58
  enumerable: true,
59
- get: function () { return chunkGINYYPXK_cjs.createFormBySlugHandler; }
59
+ get: function () { return chunkSCPKMZG5_cjs.createFormBySlugHandler; }
60
60
  });
61
61
  Object.defineProperty(exports, "createInviteAcceptHandler", {
62
62
  enumerable: true,
63
- get: function () { return chunkGINYYPXK_cjs.createInviteAcceptHandler; }
63
+ get: function () { return chunkSCPKMZG5_cjs.createInviteAcceptHandler; }
64
64
  });
65
65
  Object.defineProperty(exports, "createJobScheduleHandlers", {
66
66
  enumerable: true,
67
- get: function () { return chunkGINYYPXK_cjs.createJobScheduleHandlers; }
67
+ get: function () { return chunkSCPKMZG5_cjs.createJobScheduleHandlers; }
68
68
  });
69
69
  Object.defineProperty(exports, "createLlmAgentKnowledgeHandlers", {
70
70
  enumerable: true,
71
- get: function () { return chunkGINYYPXK_cjs.createLlmAgentKnowledgeHandlers; }
71
+ get: function () { return chunkSCPKMZG5_cjs.createLlmAgentKnowledgeHandlers; }
72
72
  });
73
73
  Object.defineProperty(exports, "createMediaZipExtractHandler", {
74
74
  enumerable: true,
75
- get: function () { return chunkGINYYPXK_cjs.createMediaZipExtractHandler; }
75
+ get: function () { return chunkSCPKMZG5_cjs.createMediaZipExtractHandler; }
76
76
  });
77
77
  Object.defineProperty(exports, "createSetPasswordHandler", {
78
78
  enumerable: true,
79
- get: function () { return chunkGINYYPXK_cjs.createSetPasswordHandler; }
79
+ get: function () { return chunkSCPKMZG5_cjs.createSetPasswordHandler; }
80
80
  });
81
81
  Object.defineProperty(exports, "createSettingsApiHandlers", {
82
82
  enumerable: true,
83
- get: function () { return chunkGINYYPXK_cjs.createSettingsApiHandlers; }
83
+ get: function () { return chunkSCPKMZG5_cjs.createSettingsApiHandlers; }
84
84
  });
85
85
  Object.defineProperty(exports, "createStorefrontApiHandler", {
86
86
  enumerable: true,
87
- get: function () { return chunkGINYYPXK_cjs.createStorefrontApiHandler; }
87
+ get: function () { return chunkSCPKMZG5_cjs.createStorefrontApiHandler; }
88
88
  });
89
89
  Object.defineProperty(exports, "createUploadHandler", {
90
90
  enumerable: true,
91
- get: function () { return chunkGINYYPXK_cjs.createUploadHandler; }
91
+ get: function () { return chunkSCPKMZG5_cjs.createUploadHandler; }
92
92
  });
93
93
  Object.defineProperty(exports, "createUserAuthApiRouter", {
94
94
  enumerable: true,
95
- get: function () { return chunkGINYYPXK_cjs.createUserAuthApiRouter; }
95
+ get: function () { return chunkSCPKMZG5_cjs.createUserAuthApiRouter; }
96
96
  });
97
97
  Object.defineProperty(exports, "createUserAvatarHandler", {
98
98
  enumerable: true,
99
- get: function () { return chunkGINYYPXK_cjs.createUserAvatarHandler; }
99
+ get: function () { return chunkSCPKMZG5_cjs.createUserAvatarHandler; }
100
100
  });
101
101
  Object.defineProperty(exports, "createUserProfileHandler", {
102
102
  enumerable: true,
103
- get: function () { return chunkGINYYPXK_cjs.createUserProfileHandler; }
103
+ get: function () { return chunkSCPKMZG5_cjs.createUserProfileHandler; }
104
104
  });
105
105
  Object.defineProperty(exports, "createUsersApiHandlers", {
106
106
  enumerable: true,
107
- get: function () { return chunkGINYYPXK_cjs.createUsersApiHandlers; }
107
+ get: function () { return chunkSCPKMZG5_cjs.createUsersApiHandlers; }
108
108
  });
109
109
  Object.defineProperty(exports, "createVendorDashboardHandler", {
110
110
  enumerable: true,
111
- get: function () { return chunkGINYYPXK_cjs.createVendorDashboardHandler; }
111
+ get: function () { return chunkSCPKMZG5_cjs.createVendorDashboardHandler; }
112
112
  });
113
113
  Object.defineProperty(exports, "createVendorOnboardHandlers", {
114
114
  enumerable: true,
115
- get: function () { return chunkGINYYPXK_cjs.createVendorOnboardHandlers; }
115
+ get: function () { return chunkSCPKMZG5_cjs.createVendorOnboardHandlers; }
116
116
  });
117
117
  Object.defineProperty(exports, "getPublicSettingsGroup", {
118
118
  enumerable: true,
119
- get: function () { return chunkGINYYPXK_cjs.getPublicSettingsGroup; }
119
+ get: function () { return chunkSCPKMZG5_cjs.getPublicSettingsGroup; }
120
120
  });
121
121
  Object.defineProperty(exports, "mergeGuardrailsIntoSystemPrompt", {
122
122
  enumerable: true,
123
- get: function () { return chunkGINYYPXK_cjs.mergeGuardrailsIntoSystemPrompt; }
123
+ get: function () { return chunkSCPKMZG5_cjs.mergeGuardrailsIntoSystemPrompt; }
124
124
  });
125
125
  Object.defineProperty(exports, "parseLlmAgentValidationRules", {
126
126
  enumerable: true,
127
- get: function () { return chunkGINYYPXK_cjs.parseLlmAgentValidationRules; }
127
+ get: function () { return chunkSCPKMZG5_cjs.parseLlmAgentValidationRules; }
128
128
  });
129
129
  Object.defineProperty(exports, "simpleDecrypt", {
130
130
  enumerable: true,
131
- get: function () { return chunkGINYYPXK_cjs.simpleDecrypt; }
131
+ get: function () { return chunkSCPKMZG5_cjs.simpleDecrypt; }
132
132
  });
133
133
  Object.defineProperty(exports, "simpleEncrypt", {
134
134
  enumerable: true,
135
- get: function () { return chunkGINYYPXK_cjs.simpleEncrypt; }
135
+ get: function () { return chunkSCPKMZG5_cjs.simpleEncrypt; }
136
136
  });
137
137
  Object.defineProperty(exports, "validateUserMessageAgainstAgentRules", {
138
138
  enumerable: true,
139
- get: function () { return chunkGINYYPXK_cjs.validateUserMessageAgainstAgentRules; }
139
+ get: function () { return chunkSCPKMZG5_cjs.validateUserMessageAgainstAgentRules; }
140
140
  });
141
141
  Object.defineProperty(exports, "validateUserMessageAgainstStructuredRules", {
142
142
  enumerable: true,
143
- get: function () { return chunkGINYYPXK_cjs.validateUserMessageAgainstStructuredRules; }
143
+ get: function () { return chunkSCPKMZG5_cjs.validateUserMessageAgainstStructuredRules; }
144
144
  });
145
145
  Object.defineProperty(exports, "createCmsAuthBundle", {
146
146
  enumerable: true,
package/dist/api.js CHANGED
@@ -1,4 +1,4 @@
1
- export { createAnalyticsHandlers, createBlogBySlugHandler, createChangePasswordHandler, createCmsApiHandler, createCrudByIdHandler, createCrudHandler, createDashboardStatsHandler, createEcommerceAnalyticsHandler, createForgotPasswordHandler, createFormBySlugHandler, createInviteAcceptHandler, createJobScheduleHandlers, createLlmAgentKnowledgeHandlers, createMediaZipExtractHandler, createSetPasswordHandler, createSettingsApiHandlers, createStorefrontApiHandler, createUploadHandler, createUserAuthApiRouter, createUserAvatarHandler, createUserProfileHandler, createUsersApiHandlers, createVendorDashboardHandler, createVendorOnboardHandlers, getPublicSettingsGroup, mergeGuardrailsIntoSystemPrompt, parseLlmAgentValidationRules, simpleDecrypt, simpleEncrypt, validateUserMessageAgainstAgentRules, validateUserMessageAgainstStructuredRules } from './chunk-W2NL365N.js';
1
+ export { createAnalyticsHandlers, createBlogBySlugHandler, createChangePasswordHandler, createCmsApiHandler, createCrudByIdHandler, createCrudHandler, createDashboardStatsHandler, createEcommerceAnalyticsHandler, createForgotPasswordHandler, createFormBySlugHandler, createInviteAcceptHandler, createJobScheduleHandlers, createLlmAgentKnowledgeHandlers, createMediaZipExtractHandler, createSetPasswordHandler, createSettingsApiHandlers, createStorefrontApiHandler, createUploadHandler, createUserAuthApiRouter, createUserAvatarHandler, createUserProfileHandler, createUsersApiHandlers, createVendorDashboardHandler, createVendorOnboardHandlers, getPublicSettingsGroup, mergeGuardrailsIntoSystemPrompt, parseLlmAgentValidationRules, simpleDecrypt, simpleEncrypt, validateUserMessageAgainstAgentRules, validateUserMessageAgainstStructuredRules } from './chunk-IX7X4ILO.js';
2
2
  import './chunk-NNQBWDCI.js';
3
3
  import './chunk-HCIRL37O.js';
4
4
  import './chunk-JXF23MPG.js';
@@ -8625,6 +8625,12 @@ function createUploadHandler(config) {
8625
8625
  parentId
8626
8626
  });
8627
8627
  } catch (err) {
8628
+ console.error("[upload] File upload failed", {
8629
+ error: err instanceof Error ? err.message : String(err),
8630
+ stack: err instanceof Error ? err.stack : void 0,
8631
+ name: err instanceof Error ? err.name : void 0,
8632
+ metadata: err && typeof err === "object" && "$metadata" in err ? err.$metadata : void 0
8633
+ });
8628
8634
  return json({
8629
8635
  error: "File upload failed"
8630
8636
  }, {
@@ -9330,41 +9336,68 @@ function createUsersApiHandlers(config) {
9330
9336
  const page = Math.max(1, parseInt(url.searchParams.get("page") || "1", 10));
9331
9337
  const limit = Math.min(100, parseInt(url.searchParams.get("limit") || "10", 10));
9332
9338
  const skip = (page - 1) * limit;
9333
- const sortField = url.searchParams.get("sortField") || "createdAt";
9339
+ const sortFieldRaw = url.searchParams.get("sortField") || "createdAt";
9340
+ const allowedSort = /* @__PURE__ */ new Set([
9341
+ "createdAt",
9342
+ "updatedAt",
9343
+ "name",
9344
+ "email",
9345
+ "id",
9346
+ "blocked"
9347
+ ]);
9348
+ const sortField = allowedSort.has(sortFieldRaw) ? sortFieldRaw : "createdAt";
9334
9349
  const sortOrder = url.searchParams.get("sortOrder") === "desc" ? "DESC" : "ASC";
9335
- const search = url.searchParams.get("search");
9336
- const where = search ? [
9337
- {
9338
- name: ILike(`%${search}%`),
9339
- deleted: false
9340
- },
9341
- {
9342
- email: ILike(`%${search}%`),
9343
- deleted: false
9344
- }
9345
- ] : {
9350
+ const search = url.searchParams.get("search")?.trim() || "";
9351
+ const groupName = url.searchParams.get("groupName")?.trim() || "";
9352
+ const qb = userRepo().createQueryBuilder("u").leftJoinAndSelect("u.group", "g").where("u.deleted = :deleted", {
9346
9353
  deleted: false
9347
- };
9348
- const [data, total] = await userRepo().findAndCount({
9349
- skip,
9350
- take: limit,
9351
- order: {
9352
- [sortField]: sortOrder
9353
- },
9354
- where,
9355
- relations: [
9356
- "group"
9357
- ],
9358
- select: [
9359
- "id",
9360
- "name",
9361
- "email",
9362
- "blocked",
9363
- "createdAt",
9364
- "updatedAt",
9365
- "groupId"
9366
- ]
9367
- });
9354
+ }).orderBy(`u.${sortField}`, sortOrder).skip(skip).take(limit).select([
9355
+ "u.id",
9356
+ "u.name",
9357
+ "u.email",
9358
+ "u.blocked",
9359
+ "u.createdAt",
9360
+ "u.updatedAt",
9361
+ "u.groupId",
9362
+ "g.id",
9363
+ "g.name"
9364
+ ]);
9365
+ if (search) {
9366
+ qb.andWhere("(u.name ILIKE :search OR u.email ILIKE :search)", {
9367
+ search: `%${search}%`
9368
+ });
9369
+ }
9370
+ if (groupName) {
9371
+ if (!entityMap.user_groups) {
9372
+ return json({
9373
+ total: 0,
9374
+ page,
9375
+ limit,
9376
+ totalPages: 0,
9377
+ data: []
9378
+ });
9379
+ }
9380
+ const groupRepo = dataSource.getRepository(entityMap.user_groups);
9381
+ const group = await groupRepo.findOne({
9382
+ where: {
9383
+ name: groupName,
9384
+ deleted: false
9385
+ }
9386
+ });
9387
+ if (!group) {
9388
+ return json({
9389
+ total: 0,
9390
+ page,
9391
+ limit,
9392
+ totalPages: 0,
9393
+ data: []
9394
+ });
9395
+ }
9396
+ qb.andWhere("u.groupId = :groupId", {
9397
+ groupId: Number(group.id)
9398
+ });
9399
+ }
9400
+ const [data, total] = await qb.getManyAndCount();
9368
9401
  return json({
9369
9402
  total,
9370
9403
  page,