@cundi/refine-xaf 1.0.5 → 1.0.7

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/index.js CHANGED
@@ -36,6 +36,7 @@ __export(index_exports, {
36
36
  ApplicationUserEdit: () => ApplicationUserEdit,
37
37
  ApplicationUserList: () => ApplicationUserList,
38
38
  AuthCallback: () => AuthCallback,
39
+ BackgroundJobList: () => BackgroundJobList,
39
40
  Base64Upload: () => Base64Upload,
40
41
  ColorModeContext: () => ColorModeContext,
41
42
  ColorModeContextProvider: () => ColorModeContextProvider,
@@ -74,13 +75,13 @@ var TOKEN_KEY = "refine-auth";
74
75
  var MAX_RETRIES = 3;
75
76
  var BASE_RETRY_DELAY = 1e3;
76
77
  var HttpError = class _HttpError extends Error {
77
- constructor(statusCode, message2, body) {
78
- super(message2);
78
+ constructor(statusCode, message3, body) {
79
+ super(message3);
79
80
  __publicField(this, "statusCode");
80
81
  __publicField(this, "message");
81
82
  __publicField(this, "body");
82
83
  this.statusCode = statusCode;
83
- this.message = message2;
84
+ this.message = message3;
84
85
  this.body = body;
85
86
  Object.setPrototypeOf(this, _HttpError.prototype);
86
87
  }
@@ -620,7 +621,7 @@ var parseFilter = (filter) => {
620
621
  // src/dataProvider.ts
621
622
  var dataProvider = (apiUrl) => ({
622
623
  getList: async ({ resource, pagination, sorters, filters }) => {
623
- const url = new URL(`${apiUrl}/${resource}`);
624
+ const url = new URL(`${apiUrl}/${resource}`, window.location.origin);
624
625
  if (pagination) {
625
626
  const { current, pageSize } = pagination;
626
627
  if (current && pageSize) {
@@ -648,7 +649,7 @@ var dataProvider = (apiUrl) => ({
648
649
  };
649
650
  },
650
651
  getOne: async ({ resource, id, meta }) => {
651
- const url = new URL(`${apiUrl}/${resource}(${id})`);
652
+ const url = new URL(`${apiUrl}/${resource}(${id})`, window.location.origin);
652
653
  if (meta?.expand) {
653
654
  const expand = meta.expand.map((item) => item.field ?? item).join(",");
654
655
  if (expand) {
@@ -661,7 +662,8 @@ var dataProvider = (apiUrl) => ({
661
662
  return { data: { ...data, id: data.Oid } };
662
663
  },
663
664
  create: async ({ resource, variables }) => {
664
- const response = await httpClient(`${apiUrl}/${resource}`, {
665
+ const url = new URL(`${apiUrl}/${resource}`, window.location.origin);
666
+ const response = await httpClient(url.toString(), {
665
667
  method: "POST",
666
668
  body: JSON.stringify(variables)
667
669
  });
@@ -670,7 +672,8 @@ var dataProvider = (apiUrl) => ({
670
672
  return { data };
671
673
  },
672
674
  update: async ({ resource, id, variables }) => {
673
- const response = await httpClient(`${apiUrl}/${resource}(${id})`, {
675
+ const url = new URL(`${apiUrl}/${resource}(${id})`, window.location.origin);
676
+ const response = await httpClient(url.toString(), {
674
677
  method: "PATCH",
675
678
  body: JSON.stringify(variables)
676
679
  });
@@ -681,14 +684,15 @@ var dataProvider = (apiUrl) => ({
681
684
  return { data };
682
685
  },
683
686
  deleteOne: async ({ resource, id }) => {
684
- await httpClient(`${apiUrl}/${resource}(${id})`, {
687
+ const url = new URL(`${apiUrl}/${resource}(${id})`, window.location.origin);
688
+ await httpClient(url.toString(), {
685
689
  method: "DELETE"
686
690
  });
687
691
  return { data: { id } };
688
692
  },
689
693
  getApiUrl: () => apiUrl,
690
694
  getMany: async ({ resource, ids }) => {
691
- const url = new URL(`${apiUrl}/${resource}`);
695
+ const url = new URL(`${apiUrl}/${resource}`, window.location.origin);
692
696
  const filter = ids.map((id) => {
693
697
  const isGuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(id.toString());
694
698
  return `Oid eq ${isGuid ? id : `'${id}'`}`;
@@ -713,7 +717,10 @@ var dataProvider = (apiUrl) => ({
713
717
  throw new Error("Not implemented");
714
718
  },
715
719
  custom: async ({ url, method, filters, sorters, payload, query, headers }) => {
716
- let requestUrl = new URL(`${url.startsWith("http") ? url : `${apiUrl}${url}`}`);
720
+ let requestUrl = new URL(
721
+ url.startsWith("http") ? url : `${apiUrl}${url}`,
722
+ window.location.origin
723
+ );
717
724
  if (filters) {
718
725
  const filterString = generateFilterString(filters);
719
726
  if (filterString) {
@@ -884,7 +891,58 @@ var en = {
884
891
  drawioExamples: "Drawio Examples",
885
892
  users: "Users",
886
893
  roles: "Roles",
887
- settings: "Settings"
894
+ settings: "Settings",
895
+ backgroundJobs: "Background Jobs"
896
+ },
897
+ backgroundJobs: {
898
+ title: "Background Jobs",
899
+ tabs: {
900
+ recurring: "Recurring",
901
+ succeeded: "Succeeded",
902
+ failed: "Failed",
903
+ processing: "Processing"
904
+ },
905
+ columns: {
906
+ id: "ID",
907
+ jobId: "Job ID",
908
+ jobName: "Job Name",
909
+ cron: "Cron",
910
+ queue: "Queue",
911
+ nextExecution: "Next Execution",
912
+ lastState: "Last State",
913
+ succeededAt: "Succeeded At",
914
+ failedAt: "Failed At",
915
+ startedAt: "Started At",
916
+ duration: "Duration (ms)",
917
+ exception: "Exception",
918
+ serverId: "Server ID",
919
+ actions: "Actions"
920
+ },
921
+ status: {
922
+ succeeded: "Succeeded",
923
+ failed: "Failed",
924
+ processing: "Processing",
925
+ scheduled: "Scheduled",
926
+ unknown: "Unknown"
927
+ },
928
+ actions: {
929
+ trigger: "Trigger Now",
930
+ delete: "Delete",
931
+ triggerSuccess: "Job triggered successfully",
932
+ deleteSuccess: "Job deleted successfully",
933
+ triggerError: "Failed to trigger job",
934
+ deleteError: "Failed to delete job"
935
+ },
936
+ drawer: {
937
+ title: "Job Details",
938
+ jobName: "Job Name",
939
+ createdAt: "Created At",
940
+ history: "History",
941
+ state: "State",
942
+ reason: "Reason",
943
+ data: "Data",
944
+ noData: "No Data"
945
+ }
888
946
  }
889
947
  };
890
948
  var zhTW = {
@@ -983,7 +1041,58 @@ var zhTW = {
983
1041
  drawioExamples: "Drawio \u7BC4\u4F8B",
984
1042
  users: "\u4F7F\u7528\u8005",
985
1043
  roles: "\u89D2\u8272",
986
- settings: "\u8A2D\u5B9A"
1044
+ settings: "\u8A2D\u5B9A",
1045
+ backgroundJobs: "\u80CC\u666F\u6392\u7A0B"
1046
+ },
1047
+ backgroundJobs: {
1048
+ title: "\u80CC\u666F\u6392\u7A0B",
1049
+ tabs: {
1050
+ recurring: "\u9031\u671F\u6027\u4EFB\u52D9",
1051
+ succeeded: "\u6210\u529F",
1052
+ failed: "\u5931\u6557",
1053
+ processing: "\u57F7\u884C\u4E2D"
1054
+ },
1055
+ columns: {
1056
+ id: "ID",
1057
+ jobId: "\u4EFB\u52D9 ID",
1058
+ jobName: "\u4EFB\u52D9\u540D\u7A31",
1059
+ cron: "\u6392\u7A0B\u8868\u9054\u5F0F",
1060
+ queue: "\u4F47\u5217",
1061
+ nextExecution: "\u4E0B\u6B21\u57F7\u884C",
1062
+ lastState: "\u6700\u5F8C\u72C0\u614B",
1063
+ succeededAt: "\u6210\u529F\u6642\u9593",
1064
+ failedAt: "\u5931\u6557\u6642\u9593",
1065
+ startedAt: "\u958B\u59CB\u6642\u9593",
1066
+ duration: "\u8017\u6642 (\u6BEB\u79D2)",
1067
+ exception: "\u4F8B\u5916",
1068
+ serverId: "\u4F3A\u670D\u5668 ID",
1069
+ actions: "\u64CD\u4F5C"
1070
+ },
1071
+ status: {
1072
+ succeeded: "\u6210\u529F",
1073
+ failed: "\u5931\u6557",
1074
+ processing: "\u57F7\u884C\u4E2D",
1075
+ scheduled: "\u5DF2\u6392\u7A0B",
1076
+ unknown: "\u672A\u77E5"
1077
+ },
1078
+ actions: {
1079
+ trigger: "\u7ACB\u5373\u57F7\u884C",
1080
+ delete: "\u522A\u9664",
1081
+ triggerSuccess: "\u4EFB\u52D9\u5DF2\u6210\u529F\u89F8\u767C",
1082
+ deleteSuccess: "\u4EFB\u52D9\u5DF2\u6210\u529F\u522A\u9664",
1083
+ triggerError: "\u89F8\u767C\u4EFB\u52D9\u5931\u6557",
1084
+ deleteError: "\u522A\u9664\u4EFB\u52D9\u5931\u6557"
1085
+ },
1086
+ drawer: {
1087
+ title: "\u4EFB\u52D9\u8A73\u60C5",
1088
+ jobName: "\u4EFB\u52D9\u540D\u7A31",
1089
+ createdAt: "\u5EFA\u7ACB\u6642\u9593",
1090
+ history: "\u6B77\u53F2\u7D00\u9304",
1091
+ state: "\u72C0\u614B",
1092
+ reason: "\u539F\u56E0",
1093
+ data: "\u8CC7\u6599",
1094
+ noData: "\u7121\u8CC7\u6599"
1095
+ }
987
1096
  }
988
1097
  };
989
1098
  var refineXafTranslations = {
@@ -5242,8 +5351,8 @@ var StepResult = class _StepResult {
5242
5351
  /**
5243
5352
  Create a failed step result.
5244
5353
  */
5245
- static fail(message2) {
5246
- return new _StepResult(null, message2);
5354
+ static fail(message3) {
5355
+ return new _StepResult(null, message3);
5247
5356
  }
5248
5357
  /**
5249
5358
  Call [`Node.replace`](https://prosemirror.net/docs/ref/#model.Node.replace) with the given
@@ -6455,8 +6564,8 @@ var DocAttrStep = class _DocAttrStep extends Step {
6455
6564
  Step.jsonID("docAttr", DocAttrStep);
6456
6565
  var TransformError = class extends Error {
6457
6566
  };
6458
- TransformError = function TransformError2(message2) {
6459
- let err = Error.call(this, message2);
6567
+ TransformError = function TransformError2(message3) {
6568
+ let err = Error.call(this, message3);
6460
6569
  err.__proto__ = TransformError2.prototype;
6461
6570
  return err;
6462
6571
  };
@@ -19741,7 +19850,7 @@ var import_react14 = __toESM(require("react"));
19741
19850
  var import_antd9 = require("@refinedev/antd");
19742
19851
  var import_lib12 = require("antd/lib");
19743
19852
  var ApplicationUserEdit = () => {
19744
- const { message: message2 } = import_lib12.App.useApp();
19853
+ const { message: message3 } = import_lib12.App.useApp();
19745
19854
  const { formProps, saveButtonProps, id, form } = (0, import_antd9.useForm)({
19746
19855
  meta: {
19747
19856
  expand: ["Roles"]
@@ -19762,12 +19871,12 @@ var ApplicationUserEdit = () => {
19762
19871
  })
19763
19872
  });
19764
19873
  if (response.ok) {
19765
- message2.success("Roles updated successfully");
19874
+ message3.success("Roles updated successfully");
19766
19875
  } else {
19767
- message2.error("Failed to update roles");
19876
+ message3.error("Failed to update roles");
19768
19877
  }
19769
19878
  } catch (e) {
19770
- message2.error("Error updating roles");
19879
+ message3.error("Error updating roles");
19771
19880
  }
19772
19881
  }
19773
19882
  });
@@ -20113,12 +20222,355 @@ var RoleEdit = () => {
20113
20222
  )
20114
20223
  ));
20115
20224
  };
20225
+
20226
+ // src/pages/background-jobs/list.tsx
20227
+ var import_react19 = __toESM(require("react"));
20228
+ var import_core22 = require("@refinedev/core");
20229
+ var import_antd14 = require("@refinedev/antd");
20230
+ var import_antd15 = require("antd");
20231
+ var import_icons6 = require("@ant-design/icons");
20232
+ var BackgroundJobList = ({
20233
+ title,
20234
+ apiUrl: customApiUrl
20235
+ }) => {
20236
+ const t = (0, import_core22.useTranslate)();
20237
+ const defaultApiUrl = (0, import_core22.useApiUrl)();
20238
+ const apiUrl = customApiUrl || defaultApiUrl?.replace("/odata", "");
20239
+ const { token } = import_antd15.theme.useToken();
20240
+ const [refreshKey, setRefreshKey] = (0, import_react19.useState)(0);
20241
+ const [activeTab, setActiveTab] = (0, import_react19.useState)("recurring");
20242
+ const [loading, setLoading] = (0, import_react19.useState)(false);
20243
+ const [recurringJobs, setRecurringJobs] = (0, import_react19.useState)([]);
20244
+ const [succeededResult, setSucceededResult] = (0, import_react19.useState)(null);
20245
+ const [failedResult, setFailedResult] = (0, import_react19.useState)(null);
20246
+ const [processingResult, setProcessingResult] = (0, import_react19.useState)(null);
20247
+ const [drawerVisible, setDrawerVisible] = (0, import_react19.useState)(false);
20248
+ const [jobDetails, setJobDetails] = (0, import_react19.useState)(null);
20249
+ const [detailLoading, setDetailLoading] = (0, import_react19.useState)(false);
20250
+ const fetchData = (0, import_react19.useCallback)(async () => {
20251
+ setLoading(true);
20252
+ const token2 = localStorage.getItem("refine-auth") || localStorage.getItem("access_token");
20253
+ const headers = token2 ? { "Authorization": `Bearer ${token2}` } : {};
20254
+ try {
20255
+ const [recurringRes, succeededRes, failedRes, processingRes] = await Promise.all([
20256
+ fetch(`${apiUrl}/hangfire/recurring`, { headers }),
20257
+ fetch(`${apiUrl}/hangfire/jobs/succeeded`, { headers }),
20258
+ fetch(`${apiUrl}/hangfire/jobs/failed`, { headers }),
20259
+ fetch(`${apiUrl}/hangfire/jobs/processing`, { headers })
20260
+ ]);
20261
+ if (recurringRes.ok) {
20262
+ const data = await recurringRes.json();
20263
+ setRecurringJobs(data.value || data || []);
20264
+ }
20265
+ if (succeededRes.ok) {
20266
+ setSucceededResult(await succeededRes.json());
20267
+ }
20268
+ if (failedRes.ok) {
20269
+ setFailedResult(await failedRes.json());
20270
+ }
20271
+ if (processingRes.ok) {
20272
+ setProcessingResult(await processingRes.json());
20273
+ }
20274
+ } catch (error) {
20275
+ console.error("Failed to fetch Hangfire data:", error);
20276
+ } finally {
20277
+ setLoading(false);
20278
+ }
20279
+ }, [apiUrl]);
20280
+ (0, import_react19.useEffect)(() => {
20281
+ fetchData();
20282
+ }, [fetchData, refreshKey]);
20283
+ const handleRefresh = () => {
20284
+ setRefreshKey((prev) => prev + 1);
20285
+ };
20286
+ const handleTrigger = async (jobId) => {
20287
+ try {
20288
+ const token2 = localStorage.getItem("refine-auth") || localStorage.getItem("access_token");
20289
+ const headers = token2 ? { "Authorization": `Bearer ${token2}` } : {};
20290
+ const response = await fetch(`${apiUrl}/hangfire/trigger/${jobId}`, {
20291
+ method: "POST",
20292
+ headers
20293
+ });
20294
+ if (response.ok) {
20295
+ import_antd15.message.success(t("backgroundJobs.actions.triggerSuccess"));
20296
+ handleRefresh();
20297
+ } else {
20298
+ import_antd15.message.error(t("backgroundJobs.actions.triggerError"));
20299
+ }
20300
+ } catch {
20301
+ import_antd15.message.error(t("backgroundJobs.actions.triggerError"));
20302
+ }
20303
+ };
20304
+ const handleDelete = async (jobId) => {
20305
+ try {
20306
+ const token2 = localStorage.getItem("refine-auth") || localStorage.getItem("access_token");
20307
+ const headers = token2 ? { "Authorization": `Bearer ${token2}` } : {};
20308
+ const response = await fetch(`${apiUrl}/hangfire/recurring/${jobId}`, {
20309
+ method: "DELETE",
20310
+ headers
20311
+ });
20312
+ if (response.ok) {
20313
+ import_antd15.message.success(t("backgroundJobs.actions.deleteSuccess"));
20314
+ handleRefresh();
20315
+ } else {
20316
+ import_antd15.message.error(t("backgroundJobs.actions.deleteError"));
20317
+ }
20318
+ } catch {
20319
+ import_antd15.message.error(t("backgroundJobs.actions.deleteError"));
20320
+ }
20321
+ };
20322
+ const showDetails = async (jobId) => {
20323
+ setDrawerVisible(true);
20324
+ setDetailLoading(true);
20325
+ setJobDetails(null);
20326
+ try {
20327
+ const token2 = localStorage.getItem("refine-auth") || localStorage.getItem("access_token");
20328
+ const headers = token2 ? { "Authorization": `Bearer ${token2}` } : {};
20329
+ const res = await fetch(`${apiUrl}/hangfire/jobs/${jobId}`, { headers });
20330
+ if (res.ok) {
20331
+ const data = await res.json();
20332
+ setJobDetails(data);
20333
+ } else {
20334
+ import_antd15.message.error("Failed to load details");
20335
+ }
20336
+ } catch {
20337
+ import_antd15.message.error("Failed to load details");
20338
+ } finally {
20339
+ setDetailLoading(false);
20340
+ }
20341
+ };
20342
+ const closeDrawer = () => {
20343
+ setDrawerVisible(false);
20344
+ setJobDetails(null);
20345
+ };
20346
+ const getStateTag = (state) => {
20347
+ if (!state) return /* @__PURE__ */ import_react19.default.createElement(import_antd15.Tag, null, t("backgroundJobs.status.unknown"));
20348
+ switch (state.toLowerCase()) {
20349
+ case "succeeded":
20350
+ return /* @__PURE__ */ import_react19.default.createElement(import_antd15.Tag, { icon: /* @__PURE__ */ import_react19.default.createElement(import_icons6.CheckCircleOutlined, null), color: "success" }, t("backgroundJobs.status.succeeded"));
20351
+ case "failed":
20352
+ return /* @__PURE__ */ import_react19.default.createElement(import_antd15.Tag, { icon: /* @__PURE__ */ import_react19.default.createElement(import_icons6.CloseCircleOutlined, null), color: "error" }, t("backgroundJobs.status.failed"));
20353
+ case "processing":
20354
+ return /* @__PURE__ */ import_react19.default.createElement(import_antd15.Tag, { icon: /* @__PURE__ */ import_react19.default.createElement(import_icons6.SyncOutlined, { spin: true }), color: "processing" }, t("backgroundJobs.status.processing"));
20355
+ case "scheduled":
20356
+ return /* @__PURE__ */ import_react19.default.createElement(import_antd15.Tag, { icon: /* @__PURE__ */ import_react19.default.createElement(import_icons6.ClockCircleOutlined, null), color: "warning" }, t("backgroundJobs.status.scheduled"));
20357
+ default:
20358
+ return /* @__PURE__ */ import_react19.default.createElement(import_antd15.Tag, null, state);
20359
+ }
20360
+ };
20361
+ const recurringColumns = [
20362
+ { title: t("backgroundJobs.columns.id"), dataIndex: "Id", key: "Id" },
20363
+ {
20364
+ title: t("backgroundJobs.columns.cron"),
20365
+ dataIndex: "Cron",
20366
+ key: "Cron",
20367
+ render: (cron) => /* @__PURE__ */ import_react19.default.createElement(import_antd15.Tag, { color: "blue" }, cron)
20368
+ },
20369
+ { title: t("backgroundJobs.columns.queue"), dataIndex: "Queue", key: "Queue" },
20370
+ {
20371
+ title: t("backgroundJobs.columns.nextExecution"),
20372
+ dataIndex: "NextExecution",
20373
+ key: "NextExecution",
20374
+ render: (date) => date ? new Date(date).toLocaleString() : "-"
20375
+ },
20376
+ {
20377
+ title: t("backgroundJobs.columns.lastState"),
20378
+ dataIndex: "LastJobState",
20379
+ key: "LastJobState",
20380
+ render: (state) => getStateTag(state)
20381
+ },
20382
+ {
20383
+ title: t("backgroundJobs.columns.actions"),
20384
+ key: "actions",
20385
+ render: (_, record) => /* @__PURE__ */ import_react19.default.createElement(import_antd15.Space, null, /* @__PURE__ */ import_react19.default.createElement(import_antd15.Tooltip, { title: t("backgroundJobs.actions.trigger") }, /* @__PURE__ */ import_react19.default.createElement(
20386
+ import_antd15.Button,
20387
+ {
20388
+ type: "primary",
20389
+ icon: /* @__PURE__ */ import_react19.default.createElement(import_icons6.PlayCircleOutlined, null),
20390
+ size: "small",
20391
+ onClick: () => handleTrigger(record.Id)
20392
+ }
20393
+ )), /* @__PURE__ */ import_react19.default.createElement(import_antd15.Tooltip, { title: t("backgroundJobs.actions.delete") }, /* @__PURE__ */ import_react19.default.createElement(
20394
+ import_antd15.Button,
20395
+ {
20396
+ danger: true,
20397
+ icon: /* @__PURE__ */ import_react19.default.createElement(import_icons6.DeleteOutlined, null),
20398
+ size: "small",
20399
+ onClick: () => handleDelete(record.Id)
20400
+ }
20401
+ )))
20402
+ }
20403
+ ];
20404
+ const succeededColumns = [
20405
+ {
20406
+ title: t("backgroundJobs.columns.jobId"),
20407
+ dataIndex: "JobId",
20408
+ key: "JobId",
20409
+ render: (text) => /* @__PURE__ */ import_react19.default.createElement("a", { onClick: () => showDetails(text) }, text)
20410
+ },
20411
+ { title: t("backgroundJobs.columns.jobName"), dataIndex: "JobName", key: "JobName" },
20412
+ {
20413
+ title: t("backgroundJobs.columns.succeededAt"),
20414
+ dataIndex: "SucceededAt",
20415
+ key: "SucceededAt",
20416
+ render: (date) => date ? new Date(date).toLocaleString() : "-"
20417
+ },
20418
+ { title: t("backgroundJobs.columns.duration"), dataIndex: "TotalDuration", key: "TotalDuration" }
20419
+ ];
20420
+ const failedColumns = [
20421
+ {
20422
+ title: t("backgroundJobs.columns.jobId"),
20423
+ dataIndex: "JobId",
20424
+ key: "JobId",
20425
+ render: (text) => /* @__PURE__ */ import_react19.default.createElement("a", { onClick: () => showDetails(text) }, text)
20426
+ },
20427
+ { title: t("backgroundJobs.columns.jobName"), dataIndex: "JobName", key: "JobName" },
20428
+ {
20429
+ title: t("backgroundJobs.columns.failedAt"),
20430
+ dataIndex: "FailedAt",
20431
+ key: "FailedAt",
20432
+ render: (date) => date ? new Date(date).toLocaleString() : "-"
20433
+ },
20434
+ {
20435
+ title: t("backgroundJobs.columns.exception"),
20436
+ dataIndex: "ExceptionMessage",
20437
+ key: "ExceptionMessage",
20438
+ render: (msg) => /* @__PURE__ */ import_react19.default.createElement(import_antd15.Tooltip, { title: msg }, /* @__PURE__ */ import_react19.default.createElement("span", null, msg?.substring(0, 50), msg && msg.length > 50 ? "..." : ""))
20439
+ }
20440
+ ];
20441
+ const processingColumns = [
20442
+ {
20443
+ title: t("backgroundJobs.columns.jobId"),
20444
+ dataIndex: "JobId",
20445
+ key: "JobId",
20446
+ render: (text) => /* @__PURE__ */ import_react19.default.createElement("a", { onClick: () => showDetails(text) }, text)
20447
+ },
20448
+ { title: t("backgroundJobs.columns.jobName"), dataIndex: "JobName", key: "JobName" },
20449
+ {
20450
+ title: t("backgroundJobs.columns.startedAt"),
20451
+ dataIndex: "StartedAt",
20452
+ key: "StartedAt",
20453
+ render: (date) => date ? new Date(date).toLocaleString() : "-"
20454
+ },
20455
+ { title: t("backgroundJobs.columns.serverId"), dataIndex: "ServerId", key: "ServerId" }
20456
+ ];
20457
+ const items = [
20458
+ {
20459
+ key: "recurring",
20460
+ label: `${t("backgroundJobs.tabs.recurring")} (${recurringJobs.length})`,
20461
+ children: /* @__PURE__ */ import_react19.default.createElement(
20462
+ import_antd15.Table,
20463
+ {
20464
+ dataSource: recurringJobs,
20465
+ columns: recurringColumns,
20466
+ rowKey: "Id",
20467
+ loading,
20468
+ pagination: false
20469
+ }
20470
+ )
20471
+ },
20472
+ {
20473
+ key: "succeeded",
20474
+ label: /* @__PURE__ */ import_react19.default.createElement("span", null, /* @__PURE__ */ import_react19.default.createElement(import_icons6.CheckCircleOutlined, { style: { color: "#52c41a" } }), " ", t("backgroundJobs.tabs.succeeded"), " (", succeededResult?.Total || 0, ")"),
20475
+ children: /* @__PURE__ */ import_react19.default.createElement(
20476
+ import_antd15.Table,
20477
+ {
20478
+ dataSource: succeededResult?.Jobs || [],
20479
+ columns: succeededColumns,
20480
+ rowKey: "JobId",
20481
+ loading,
20482
+ pagination: { pageSize: 10 }
20483
+ }
20484
+ )
20485
+ },
20486
+ {
20487
+ key: "failed",
20488
+ label: /* @__PURE__ */ import_react19.default.createElement("span", null, /* @__PURE__ */ import_react19.default.createElement(import_icons6.CloseCircleOutlined, { style: { color: "#ff4d4f" } }), " ", t("backgroundJobs.tabs.failed"), " (", failedResult?.Total || 0, ")"),
20489
+ children: /* @__PURE__ */ import_react19.default.createElement(
20490
+ import_antd15.Table,
20491
+ {
20492
+ dataSource: failedResult?.Jobs || [],
20493
+ columns: failedColumns,
20494
+ rowKey: "JobId",
20495
+ loading,
20496
+ pagination: { pageSize: 10 }
20497
+ }
20498
+ )
20499
+ },
20500
+ {
20501
+ key: "processing",
20502
+ label: /* @__PURE__ */ import_react19.default.createElement("span", null, /* @__PURE__ */ import_react19.default.createElement(import_icons6.SyncOutlined, { spin: true, style: { color: "#1890ff" } }), " ", t("backgroundJobs.tabs.processing"), " (", processingResult?.Total || 0, ")"),
20503
+ children: /* @__PURE__ */ import_react19.default.createElement(
20504
+ import_antd15.Table,
20505
+ {
20506
+ dataSource: processingResult?.Jobs || [],
20507
+ columns: processingColumns,
20508
+ rowKey: "JobId",
20509
+ loading,
20510
+ pagination: false
20511
+ }
20512
+ )
20513
+ }
20514
+ ];
20515
+ return /* @__PURE__ */ import_react19.default.createElement(
20516
+ import_antd14.List,
20517
+ {
20518
+ title: title || t("backgroundJobs.title"),
20519
+ headerButtons: /* @__PURE__ */ import_react19.default.createElement(import_antd15.Button, { icon: /* @__PURE__ */ import_react19.default.createElement(import_icons6.ReloadOutlined, null), onClick: handleRefresh, loading }, t("buttons.refresh"))
20520
+ },
20521
+ /* @__PURE__ */ import_react19.default.createElement(import_antd15.Row, { gutter: 16, style: { marginBottom: 16 } }, /* @__PURE__ */ import_react19.default.createElement(import_antd15.Col, { span: 6 }, /* @__PURE__ */ import_react19.default.createElement(import_antd15.Card, null, /* @__PURE__ */ import_react19.default.createElement(
20522
+ import_antd15.Statistic,
20523
+ {
20524
+ title: t("backgroundJobs.tabs.recurring"),
20525
+ value: recurringJobs.length,
20526
+ prefix: /* @__PURE__ */ import_react19.default.createElement(import_icons6.ClockCircleOutlined, null)
20527
+ }
20528
+ ))), /* @__PURE__ */ import_react19.default.createElement(import_antd15.Col, { span: 6 }, /* @__PURE__ */ import_react19.default.createElement(import_antd15.Card, null, /* @__PURE__ */ import_react19.default.createElement(
20529
+ import_antd15.Statistic,
20530
+ {
20531
+ title: t("backgroundJobs.tabs.succeeded"),
20532
+ value: succeededResult?.Total || 0,
20533
+ valueStyle: { color: "#3f8600" },
20534
+ prefix: /* @__PURE__ */ import_react19.default.createElement(import_icons6.CheckCircleOutlined, null)
20535
+ }
20536
+ ))), /* @__PURE__ */ import_react19.default.createElement(import_antd15.Col, { span: 6 }, /* @__PURE__ */ import_react19.default.createElement(import_antd15.Card, null, /* @__PURE__ */ import_react19.default.createElement(
20537
+ import_antd15.Statistic,
20538
+ {
20539
+ title: t("backgroundJobs.tabs.failed"),
20540
+ value: failedResult?.Total || 0,
20541
+ valueStyle: { color: "#cf1322" },
20542
+ prefix: /* @__PURE__ */ import_react19.default.createElement(import_icons6.CloseCircleOutlined, null)
20543
+ }
20544
+ ))), /* @__PURE__ */ import_react19.default.createElement(import_antd15.Col, { span: 6 }, /* @__PURE__ */ import_react19.default.createElement(import_antd15.Card, null, /* @__PURE__ */ import_react19.default.createElement(
20545
+ import_antd15.Statistic,
20546
+ {
20547
+ title: t("backgroundJobs.tabs.processing"),
20548
+ value: processingResult?.Total || 0,
20549
+ valueStyle: { color: "#1890ff" },
20550
+ prefix: /* @__PURE__ */ import_react19.default.createElement(import_icons6.SyncOutlined, null)
20551
+ }
20552
+ )))),
20553
+ /* @__PURE__ */ import_react19.default.createElement(import_antd15.Tabs, { activeKey: activeTab, onChange: setActiveTab, items }),
20554
+ /* @__PURE__ */ import_react19.default.createElement(
20555
+ import_antd15.Drawer,
20556
+ {
20557
+ title: t("backgroundJobs.drawer.title"),
20558
+ placement: "right",
20559
+ onClose: closeDrawer,
20560
+ open: drawerVisible,
20561
+ width: 600
20562
+ },
20563
+ detailLoading ? /* @__PURE__ */ import_react19.default.createElement(import_antd15.Skeleton, { active: true }) : jobDetails ? /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement(import_antd15.Descriptions, { column: 1, bordered: true, size: "small" }, /* @__PURE__ */ import_react19.default.createElement(import_antd15.Descriptions.Item, { label: t("backgroundJobs.drawer.jobName") }, jobDetails.JobName), /* @__PURE__ */ import_react19.default.createElement(import_antd15.Descriptions.Item, { label: t("backgroundJobs.drawer.createdAt") }, jobDetails.CreatedAt ? new Date(jobDetails.CreatedAt).toLocaleString() : "-")), /* @__PURE__ */ import_react19.default.createElement("div", { style: { marginTop: 24 } }, /* @__PURE__ */ import_react19.default.createElement("h3", null, t("backgroundJobs.drawer.history")), /* @__PURE__ */ import_react19.default.createElement(import_antd15.Timeline, { mode: "left" }, jobDetails.History.map((h, i) => /* @__PURE__ */ import_react19.default.createElement(import_antd15.Timeline.Item, { key: i, color: h.StateName === "Succeeded" ? "green" : h.StateName === "Failed" ? "red" : "blue" }, /* @__PURE__ */ import_react19.default.createElement("p", null, /* @__PURE__ */ import_react19.default.createElement("strong", null, h.StateName), " - ", new Date(h.CreatedAt).toLocaleString()), h.Reason && /* @__PURE__ */ import_react19.default.createElement("p", null, t("backgroundJobs.drawer.reason"), ": ", h.Reason), h.Data && Object.keys(h.Data).length > 0 && /* @__PURE__ */ import_react19.default.createElement("div", { style: { background: token.colorFillAlter, padding: 8, borderRadius: 4, overflowX: "auto", marginTop: 8 } }, /* @__PURE__ */ import_react19.default.createElement("pre", { style: { margin: 0, fontSize: 12, color: token.colorText } }, JSON.stringify(h.Data, null, 2)))))))) : /* @__PURE__ */ import_react19.default.createElement("div", null, t("backgroundJobs.drawer.noData"))
20564
+ )
20565
+ );
20566
+ };
20116
20567
  // Annotate the CommonJS export names for ESM import in node:
20117
20568
  0 && (module.exports = {
20118
20569
  ApplicationUserCreate,
20119
20570
  ApplicationUserEdit,
20120
20571
  ApplicationUserList,
20121
20572
  AuthCallback,
20573
+ BackgroundJobList,
20122
20574
  Base64Upload,
20123
20575
  ColorModeContext,
20124
20576
  ColorModeContextProvider,