@kiteapps/lite-ui 0.1.0 → 0.1.1

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.cjs CHANGED
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -26,11 +27,13 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
27
  ));
27
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
29
 
29
- // src/widgets/index.js
30
- var widgets_exports = {};
31
- __export(widgets_exports, {
30
+ // src/lib/index.ts
31
+ var lib_exports = {};
32
+ __export(lib_exports, {
33
+ ADMIN_GROUPS: () => ADMIN_GROUPS2,
32
34
  ActionBar: () => ActionBar,
33
35
  ActiveDirectoryChart: () => ActiveDirectoryChart,
36
+ AdminScreen: () => AdminScreen2,
34
37
  AdminShell: () => AdminShell,
35
38
  AppShell: () => AppShell,
36
39
  Button: () => Button,
@@ -38,12 +41,14 @@ __export(widgets_exports, {
38
41
  CheckRow: () => CheckRow,
39
42
  CollapsibleSidebar: () => CollapsibleSidebar,
40
43
  ConfigurationHeader: () => ConfigurationHeader,
44
+ ConfigurationPage: () => ConfigurationPage,
41
45
  ConfigurationSidebar: () => ConfigurationSidebar,
42
46
  DASHBOARD_METRICS: () => DASHBOARD_METRICS,
43
47
  DASHBOARD_SHORTCUTS: () => DASHBOARD_SHORTCUTS,
44
48
  DEMO_POLICIES: () => DEMO_POLICIES,
45
49
  DIRECTORY_REPORT_DATA: () => DIRECTORY_REPORT_DATA,
46
50
  DashboardLayout: () => DashboardLayout,
51
+ DashboardPage: () => DashboardPage,
47
52
  DashboardToolbar: () => DashboardToolbar,
48
53
  DataTable: () => DataTable,
49
54
  ExpandedWidget: () => ExpandedWidget,
@@ -73,6 +78,7 @@ __export(widgets_exports, {
73
78
  ReportNavigation: () => ReportNavigation,
74
79
  ReportPageHeading: () => ReportPageHeading,
75
80
  ReportResults: () => ReportResults,
81
+ ReportsPage: () => ReportsPage,
76
82
  SELF_SERVICE_REPORT_DATA: () => SELF_SERVICE_REPORT_DATA,
77
83
  SaveBar: () => SaveBar,
78
84
  SectionTitle: () => SectionTitle,
@@ -88,15 +94,16 @@ __export(widgets_exports, {
88
94
  WidgetFrame: () => WidgetFrame,
89
95
  normalizeReport: () => normalizeReport
90
96
  });
91
- module.exports = __toCommonJS(widgets_exports);
97
+ module.exports = __toCommonJS(lib_exports);
92
98
 
93
- // src/widgets/Primitives.jsx
94
- var import_react = __toESM(require("react"));
99
+ // src/widgets/Primitives.tsx
100
+ var import_react = require("react");
95
101
  var import_lucide_react = require("lucide-react");
96
102
  var import_jsx_runtime = require("react/jsx-runtime");
97
103
  function Button({ children, variant = "neutral", icon: Icon, className = "", ...props }) {
98
104
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { className: `ad-button ad-button--${variant} ${className}`, ...props, children: [
99
105
  Icon && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { size: 13, strokeWidth: 1.8 }),
106
+ " ",
100
107
  children
101
108
  ] });
102
109
  }
@@ -126,9 +133,9 @@ function CheckRow({ children, defaultChecked = false, checked, onChange, disable
126
133
  const [local, setLocal] = (0, import_react.useState)(defaultChecked);
127
134
  const isChecked = checked === void 0 ? local : checked;
128
135
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", { className: `ad-check-row ${disabled ? "is-disabled" : ""} ${className}`, children: [
129
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { type: "checkbox", checked: isChecked, disabled, onChange: (e) => {
130
- setLocal(e.target.checked);
131
- onChange?.(e.target.checked);
136
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { type: "checkbox", checked: isChecked, disabled, onChange: (event) => {
137
+ if (checked === void 0) setLocal(event.target.checked);
138
+ onChange?.(event.target.checked);
132
139
  } }),
133
140
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "ad-check-box", "aria-hidden": "true" }),
134
141
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children }),
@@ -195,21 +202,22 @@ function Notice({ children, tone = "info" }) {
195
202
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children })
196
203
  ] });
197
204
  }
198
- function DataTable({ columns = [], rows = [], empty = "No Data Available", onRowClick, getRowId = (row, index) => row.id ?? index }) {
205
+ function DataTable({ columns = [], rows = [], empty = "No Data Available", onRowClick, getRowId = (row, index) => !Array.isArray(row) && row.id != null ? String(row.id) : index }) {
199
206
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "ad-table-wrap", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("table", { className: "ad-table", children: [
200
207
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("tr", { children: columns.map((raw, index) => {
201
- const column = typeof raw === "string" ? { key: index, label: raw } : raw;
202
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: column.label }, column.key ?? index);
208
+ const column = typeof raw === "string" ? { key: String(index), label: raw } : raw;
209
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: column.label }, column.key);
203
210
  }) }) }),
204
211
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("tbody", { children: rows.length ? rows.map((row, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("tr", { onClick: () => onRowClick?.(row, index), children: columns.map((raw, columnIndex) => {
205
- const column = typeof raw === "string" ? { key: columnIndex, label: raw } : raw;
206
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { children: column.render ? column.render(row, index) : Array.isArray(row) ? row[columnIndex] : row[column.key] }, column.key ?? columnIndex);
212
+ const column = typeof raw === "string" ? { key: String(columnIndex), label: raw } : raw;
213
+ const value = "render" in column && column.render ? column.render(row, index) : Array.isArray(row) ? row[columnIndex] : row[column.key];
214
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { children: value }, column.key);
207
215
  }) }, getRowId(row, index))) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("tr", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: "ad-empty", colSpan: columns.length, children: empty }) }) })
208
216
  ] }) });
209
217
  }
210
218
  function Modal({ title, children, open, onClose, footer, closeLabel = "Close" }) {
211
219
  if (!open) return null;
212
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "ad-modal-backdrop", onMouseDown: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "ad-modal", role: "dialog", "aria-modal": "true", "aria-label": title, onMouseDown: (e) => e.stopPropagation(), children: [
220
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "ad-modal-backdrop", onMouseDown: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "ad-modal", role: "dialog", "aria-modal": "true", "aria-label": title, onMouseDown: (event) => event.stopPropagation(), children: [
213
221
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "ad-modal-head", children: [
214
222
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: title }),
215
223
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(IconButton, { icon: import_lucide_react.X, label: closeLabel, onClick: onClose })
@@ -219,8 +227,8 @@ function Modal({ title, children, open, onClose, footer, closeLabel = "Close" })
219
227
  ] }) });
220
228
  }
221
229
 
222
- // src/widgets/Shell.jsx
223
- var import_react2 = __toESM(require("react"));
230
+ // src/widgets/Shell.tsx
231
+ var import_react2 = require("react");
224
232
  var import_lucide_react2 = require("lucide-react");
225
233
  var import_jsx_runtime2 = require("react/jsx-runtime");
226
234
  var MAIN_SECTIONS = ["Dashboard", "Reports", "Configuration", "Admin", "Support"];
@@ -232,16 +240,18 @@ function TopNavigation({ sections = MAIN_SECTIONS, active = "Admin", onChange, a
232
240
  }) });
233
241
  }
234
242
  function ShellHeader({ brand = "ADSelfService Plus", brandIcon, showBrandOrbit = true, sections = MAIN_SECTIONS, navigationLabel = "Main navigation", activeSection = "Admin", onSectionChange, directories = ["Active Directory", "Microsoft Entra ID"], directory, defaultDirectory, onDirectoryChange, showDownload = true, downloadLabel = "Download Now", onDownload, utilityItems = ["License", "Talk Back"], showNotifications = true, notifications = 2, notificationLabel, onNotificationsClick, showUserMenu = true, userMenuLabel = "User menu", onUserClick, showSearch = true, searchPlaceholder = "Search Employee", searchLabel = "Search Employee", searchValue, onSearchChange, showSettings = true, settingsLabel = "Domain Settings", onSettingsClick, rightContent }) {
235
- const [localDirectory, setLocalDirectory] = (0, import_react2.useState)(defaultDirectory ?? directories[0]);
243
+ const initialDirectory = defaultDirectory ?? (typeof directories[0] === "string" ? directories[0] : directories[0]?.value);
244
+ const [localDirectory, setLocalDirectory] = (0, import_react2.useState)(initialDirectory);
236
245
  const [localSearch, setLocalSearch] = (0, import_react2.useState)("");
237
246
  const currentDirectory = directory ?? localDirectory;
238
247
  const directoryItem = directories.find((item) => (typeof item === "string" ? item : item.value) === currentDirectory);
239
248
  const currentDirectoryLabel = typeof directoryItem === "string" ? directoryItem : directoryItem?.label || currentDirectory;
240
249
  const currentSearch = searchValue ?? localSearch;
241
250
  const switchDirectory = () => {
251
+ if (!directories.length) return;
242
252
  const index = directories.findIndex((item) => (typeof item === "string" ? item : item.value) === currentDirectory);
243
253
  const next = directories[(index + 1) % directories.length];
244
- const value = typeof next === "string" ? next : next?.value;
254
+ const value = typeof next === "string" ? next : next.value;
245
255
  if (directory === void 0) setLocalDirectory(value);
246
256
  onDirectoryChange?.(value, next);
247
257
  };
@@ -337,8 +347,8 @@ function AdminShell({ groups = [], screen, onScreenChange, children, activeSecti
337
347
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(AppShell, { activeSection, onSectionChange, sidebar: sidebar || /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(CollapsibleSidebar, { groups, selected: screen, onSelect: onScreenChange }), hideSidebar, mainClassName, ...shellProps, children });
338
348
  }
339
349
 
340
- // src/widgets/DashboardWidgets.jsx
341
- var import_react3 = __toESM(require("react"));
350
+ // src/widgets/DashboardWidgets.tsx
351
+ var import_react3 = require("react");
342
352
  var import_lucide_react3 = require("lucide-react");
343
353
  var import_jsx_runtime3 = require("react/jsx-runtime");
344
354
  var DASHBOARD_METRICS = [
@@ -460,7 +470,7 @@ function DashboardToolbar({ domains = ["ADSELFSERVICE"], domain, defaultDomain,
460
470
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "dash-toolbar", children: [
461
471
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("label", { htmlFor: "dash-domain", children: domainLabel }),
462
472
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("select", { id: "dash-domain", value: domain, defaultValue: domain === void 0 ? defaultDomain ?? (typeof domains[0] === "string" ? domains[0] : domains[0]?.value) : void 0, onChange: (event) => {
463
- const item = domains.map((raw) => typeof raw === "string" ? { value: raw, label: raw } : raw).find((option) => option.value === event.target.value);
473
+ const item = domains.find((option) => (typeof option === "string" ? option : option.value) === event.target.value);
464
474
  onDomainChange?.(event.target.value, item);
465
475
  }, children: domains.map((option) => {
466
476
  const item = typeof option === "string" ? { value: option, label: option } : option;
@@ -491,7 +501,7 @@ function DashboardLayout({ metrics, charts, shortcuts, showShortcuts = true }) {
491
501
  }
492
502
  function ExpandedWidget({ title, onClose, children, closeLabel = "Close expanded widget" }) {
493
503
  if (!title) return null;
494
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "dash-overlay", role: "presentation", onMouseDown: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "dash-expanded", role: "dialog", "aria-modal": "true", "aria-label": title, onMouseDown: (e) => e.stopPropagation(), children: [
504
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "dash-overlay", role: "presentation", onMouseDown: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "dash-expanded", role: "dialog", "aria-modal": "true", "aria-label": title, onMouseDown: (event) => event.stopPropagation(), children: [
495
505
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "dash-expanded-heading", children: [
496
506
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("strong", { children: title }),
497
507
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { type: "button", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react3.X, { size: 18 }) })
@@ -500,8 +510,8 @@ function ExpandedWidget({ title, onClose, children, closeLabel = "Close expanded
500
510
  ] }) });
501
511
  }
502
512
 
503
- // src/widgets/ReportWidgets.jsx
504
- var import_react4 = __toESM(require("react"));
513
+ // src/widgets/ReportWidgets.tsx
514
+ var import_react4 = require("react");
505
515
  var import_lucide_react4 = require("lucide-react");
506
516
  var import_jsx_runtime4 = require("react/jsx-runtime");
507
517
  var REPORT_GROUPS = [
@@ -523,9 +533,9 @@ function ReportNavigation({ groups = REPORT_GROUPS, selected, defaultSelected, o
523
533
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "report-navigation", children: [
524
534
  /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("label", { className: "report-search", children: [
525
535
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_lucide_react4.Search, { size: 15 }),
526
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("input", { "aria-label": searchLabel, placeholder: searchPlaceholder, value: query, onChange: (e) => {
527
- setQuery(e.target.value);
528
- onSearchChange?.(e.target.value);
536
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("input", { "aria-label": searchLabel, placeholder: searchPlaceholder, value: query, onChange: (event) => {
537
+ setQuery(event.target.value);
538
+ onSearchChange?.(event.target.value);
529
539
  } })
530
540
  ] }),
531
541
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("nav", { "aria-label": ariaLabel, children: visibleGroups.map((group) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
@@ -550,13 +560,13 @@ function ReportCategoryBar({ groups = REPORT_GROUPS, selected, defaultSelected,
550
560
  group.label,
551
561
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_lucide_react4.ChevronDown, { size: 10 })
552
562
  ] }),
553
- open === group.label && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "report-category-menu", children: group.items.map((raw, i) => {
563
+ open === group.label && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "report-category-menu", children: group.items.map((raw, index) => {
554
564
  const item = normalizeReport(raw);
555
565
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: currentSelected === item.id ? "is-active" : "", onClick: () => {
556
566
  if (selected === void 0) setLocalSelected(item.id);
557
567
  onSelect?.(item.id, item);
558
568
  setOpen("");
559
- }, children: item.label }, item.id ?? i);
569
+ }, children: item.label }, item.id ?? index);
560
570
  }) })
561
571
  ] }, group.id ?? group.label)) });
562
572
  }
@@ -569,7 +579,7 @@ function ReportFilters({ domains = ["ADSELFSERVICE"], domain, defaultDomain, onD
569
579
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("label", { htmlFor: "report-domain", children: labels.domain || "Select Domain" }),
570
580
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("select", { id: "report-domain", value: domain, defaultValue: domain === void 0 ? defaultDomain ?? (typeof domains[0] === "string" ? domains[0] : domains[0]?.value) : void 0, onChange: (event) => {
571
581
  const value = event.target.value;
572
- const item = domains.map((raw) => typeof raw === "string" ? { value: raw, label: raw } : raw).find((option) => option.value === value);
582
+ const item = domains.find((raw) => (typeof raw === "string" ? raw : raw.value) === value);
573
583
  onDomainChange?.(value, item);
574
584
  }, children: domains.map((raw) => {
575
585
  const item = typeof raw === "string" ? { value: raw, label: raw } : raw;
@@ -587,8 +597,8 @@ function ReportFilters({ domains = ["ADSELFSERVICE"], domain, defaultDomain, onD
587
597
  const item = typeof raw === "string" ? { value: raw, label: raw } : raw;
588
598
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("label", { children: [
589
599
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("input", { type: "radio", name: "report-ou", checked: selectedOu === item.value, onChange: () => {
590
- setLocalOu(item.value);
591
- onOuChange?.(item.value, item);
600
+ if (ou === void 0) setLocalOu(item.value);
601
+ onOuChange?.(item.value, raw);
592
602
  setOuOpen(false);
593
603
  } }),
594
604
  " ",
@@ -624,8 +634,8 @@ function ReportPageHeading({ title, onSchedule, scheduleLabel = "Schedule Report
624
634
  ] });
625
635
  }
626
636
 
627
- // src/widgets/ConfigurationWidgets.jsx
628
- var import_react5 = __toESM(require("react"));
637
+ // src/widgets/ConfigurationWidgets.tsx
638
+ var import_react5 = require("react");
629
639
  var import_lucide_react5 = require("lucide-react");
630
640
  var import_jsx_runtime5 = require("react/jsx-runtime");
631
641
  var CONFIG_GROUPS = [
@@ -749,8 +759,8 @@ function PolicyTable({ policies = DEMO_POLICIES, columns = POLICY_COLUMNS, defau
749
759
  ] }) });
750
760
  }
751
761
 
752
- // src/widgets/SettingsWidgets.jsx
753
- var import_react6 = __toESM(require("react"));
762
+ // src/widgets/SettingsWidgets.tsx
763
+ var import_react6 = require("react");
754
764
  var import_jsx_runtime6 = require("react/jsx-runtime");
755
765
  function Frame({ title, tabs, activeTab, defaultTab, onTabChange, children, action, help, className = "" }) {
756
766
  const [localTab, setLocalTab] = (0, import_react6.useState)(defaultTab ?? (typeof tabs?.[0] === "string" ? tabs[0] : tabs?.[0]?.id));
@@ -790,3 +800,739 @@ function InlineSelect({ options = [], initial, value, onChange, width, ...props
790
800
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("option", { value: item.value, children: item.label }, item.value);
791
801
  }) });
792
802
  }
803
+
804
+ // src/pages/DashboardPage.tsx
805
+ var import_react7 = require("react");
806
+ var import_jsx_runtime7 = require("react/jsx-runtime");
807
+ function DashboardPage({ metrics = DASHBOARD_METRICS, directoryData = DIRECTORY_REPORT_DATA, mfaData = MFA_REPORT_DATA, selfServiceData = SELF_SERVICE_REPORT_DATA, shortcuts = DASHBOARD_SHORTCUTS, domains, domain, onDomainChange, chartTitles = {}, chartProps = {}, widgetProps = {}, toolbarProps = {}, onMetricSelect, onReportSelect, onShortcutSelect, onToolbarAction, renderMetric, renderShortcuts }) {
808
+ const [showShortcuts, setShowShortcuts] = (0, import_react7.useState)(true);
809
+ const [expanded, setExpanded] = (0, import_react7.useState)(null);
810
+ const titles = { directory: "Active Directory Reports", mfa: "MFA Reports", selfService: "Password Self-Service Reports", ...chartTitles };
811
+ const reportAction = (key, id, item) => {
812
+ chartProps[key]?.onSelect?.(id, item);
813
+ onReportSelect?.(id, item);
814
+ };
815
+ const charts = {
816
+ directory: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ActiveDirectoryChart, { ...chartProps.directory, data: directoryData, onSelect: (id, item) => reportAction("directory", id, item) }),
817
+ mfa: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(MfaChart, { ...chartProps.mfa, data: mfaData, onSelect: (id, item) => reportAction("mfa", id, item) }),
818
+ selfService: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SelfServiceChart, { ...chartProps.selfService, data: selfServiceData, onSelect: (id, item) => reportAction("selfService", id, item) })
819
+ };
820
+ const frame = (key, className = "") => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(WidgetFrame, { ...widgetProps[key], title: titles[key], className: className || widgetProps[key]?.className, onExpand: () => {
821
+ widgetProps[key]?.onExpand?.();
822
+ setExpanded(key);
823
+ }, children: charts[key] });
824
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "dash-page", children: [
825
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
826
+ DashboardToolbar,
827
+ {
828
+ ...toolbarProps,
829
+ domains: domains ?? toolbarProps.domains,
830
+ domain: domain ?? toolbarProps.domain,
831
+ onDomainChange: (value, item) => {
832
+ onDomainChange?.(value, item);
833
+ toolbarProps.onDomainChange?.(value, item);
834
+ },
835
+ showShortcuts,
836
+ onToggleShortcuts: () => {
837
+ setShowShortcuts(!showShortcuts);
838
+ toolbarProps.onToggleShortcuts?.(!showShortcuts);
839
+ },
840
+ onExpand: () => {
841
+ toolbarProps.onExpand?.();
842
+ setExpanded("directory");
843
+ },
844
+ onMenuAction: (id, item) => {
845
+ onToolbarAction?.(id, item);
846
+ toolbarProps.onMenuAction?.(id, item);
847
+ }
848
+ }
849
+ ),
850
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
851
+ DashboardLayout,
852
+ {
853
+ showShortcuts,
854
+ metrics: metrics.map((item, index) => renderMetric ? renderMetric(item, index) : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(MetricWidget, { ...item, onClick: () => {
855
+ item.onClick?.(item);
856
+ onMetricSelect?.(item);
857
+ if (item.report !== void 0) onReportSelect?.(item.report, item);
858
+ } }, item.id ?? item.title ?? index)),
859
+ charts: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
860
+ frame("directory"),
861
+ frame("mfa"),
862
+ frame("selfService", "dash-wide-widget")
863
+ ] }),
864
+ shortcuts: renderShortcuts ? renderShortcuts(shortcuts) : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ShortcutRail, { groups: shortcuts, onSelect: onShortcutSelect })
865
+ }
866
+ ),
867
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ExpandedWidget, { title: expanded ? titles[expanded] : null, onClose: () => setExpanded(null), children: expanded ? charts[expanded] : null })
868
+ ] });
869
+ }
870
+
871
+ // src/pages/ReportsPage.tsx
872
+ var import_react8 = require("react");
873
+ var import_jsx_runtime8 = require("react/jsx-runtime");
874
+ function ReportsPage({ groups = REPORT_GROUPS, selected, defaultSelected, onSelect, filtersProps = {}, labels = {}, status: controlledStatus, onGenerate, onStop, onSchedule, results }) {
875
+ const firstReport = groups[0]?.items[0] && normalizeReport(groups[0].items[0]);
876
+ const [localSelected, setLocalSelected] = (0, import_react8.useState)(defaultSelected ?? firstReport?.id);
877
+ const [localStatus, setLocalStatus] = (0, import_react8.useState)("empty");
878
+ const [showSchedule, setShowSchedule] = (0, import_react8.useState)(false);
879
+ const [localDomain, setLocalDomain] = (0, import_react8.useState)(filtersProps.defaultDomain ?? (typeof filtersProps.domains?.[0] === "string" ? filtersProps.domains[0] : filtersProps.domains?.[0]?.value) ?? "ADSELFSERVICE");
880
+ const [localOu, setLocalOu] = (0, import_react8.useState)(filtersProps.defaultOu ?? (typeof filtersProps.ouOptions?.[0] === "string" ? filtersProps.ouOptions[0] : filtersProps.ouOptions?.[0]?.value) ?? "All OU");
881
+ const currentSelected = selected ?? localSelected;
882
+ const report = groups.flatMap((group) => group.items.map(normalizeReport)).find((item) => item.id === currentSelected);
883
+ const title = report?.label || firstReport?.label || labels.untitled || "";
884
+ const status = controlledStatus ?? localStatus;
885
+ const domain = filtersProps.domain ?? localDomain;
886
+ const ou = filtersProps.ou ?? localOu;
887
+ const select = (id, item) => {
888
+ if (selected === void 0) setLocalSelected(id);
889
+ onSelect?.(id, item);
890
+ if (controlledStatus === void 0) setLocalStatus("empty");
891
+ };
892
+ const generate = () => {
893
+ if (onGenerate) onGenerate({ selected: currentSelected, report, domain, ou });
894
+ else {
895
+ setLocalStatus("loading");
896
+ window.setTimeout(() => setLocalStatus("empty"), 650);
897
+ }
898
+ };
899
+ const stop = () => {
900
+ onStop?.();
901
+ if (controlledStatus === void 0) setLocalStatus("empty");
902
+ };
903
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "reports-page", children: [
904
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ReportCategoryBar, { groups, selected: currentSelected, onSelect: select }),
905
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "report-page-body", children: [
906
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ReportPageHeading, { title, scheduleLabel: labels.schedule, helpText: labels.help, onSchedule: () => {
907
+ onSchedule?.(report);
908
+ setShowSchedule(!showSchedule);
909
+ } }),
910
+ showSchedule && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "report-schedule-note", children: labels.scheduleNote || "Schedule Reports lets you automate delivery of generated reports." }),
911
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ReportFilters, { ...filtersProps, domain, ou, onDomainChange: (value, item) => {
912
+ if (filtersProps.domain === void 0) setLocalDomain(value);
913
+ filtersProps.onDomainChange?.(value, item);
914
+ }, onOuChange: (value, item) => {
915
+ if (filtersProps.ou === void 0) setLocalOu(value);
916
+ filtersProps.onOuChange?.(value, item);
917
+ }, generating: status === "loading", onGenerate: generate, onStop: stop }),
918
+ results ?? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ReportResults, { status, emptyMessage: labels.empty, loadingMessage: labels.loading })
919
+ ] })
920
+ ] });
921
+ }
922
+
923
+ // src/pages/ConfigurationPage.tsx
924
+ var import_react9 = require("react");
925
+ var import_jsx_runtime9 = require("react/jsx-runtime");
926
+ function ConfigurationPage({ selected, policyId = "policy", groups = CONFIG_GROUPS, policies, initialPolicies = DEMO_POLICIES, onPoliciesChange, features = POLICY_FEATURES, columns = POLICY_COLUMNS, labels = {}, defaultDomain = "ADSELFSERVICE", onSavePolicy, onDeletePolicy, onCopyPolicy, onFeatureSelect, createPolicy, renderSection, renderPolicyForm, headerProps = {}, featureProps = {}, toolbarProps = {}, tableProps = {} }) {
927
+ const [localPolicies, setLocalPolicies] = (0, import_react9.useState)(initialPolicies);
928
+ const [query, setQuery] = (0, import_react9.useState)("");
929
+ const [page, setPage] = (0, import_react9.useState)(1);
930
+ const [editor, setEditor] = (0, import_react9.useState)(null);
931
+ const [name, setName] = (0, import_react9.useState)("");
932
+ const currentSelected = selected ?? policyId;
933
+ const currentPolicies = policies ?? localPolicies;
934
+ const update = (next) => {
935
+ if (policies === void 0) setLocalPolicies(next);
936
+ onPoliciesChange?.(next);
937
+ };
938
+ const item = groups.flatMap((group) => group.items).find((entry) => entry.id === currentSelected);
939
+ const title = item?.label || labels.title || "Policy Configuration";
940
+ const filtered = currentPolicies.filter((policy) => String(policy.name || "").toLowerCase().includes(query.toLowerCase()));
941
+ const pageSize = Math.max(1, toolbarProps.pageSize ?? 25);
942
+ const currentPage = Math.min(page, Math.max(1, Math.ceil(filtered.length / pageSize)));
943
+ const visiblePolicies = filtered.slice((currentPage - 1) * pageSize, currentPage * pageSize);
944
+ const openEditor = (policy) => {
945
+ setEditor(policy || { name: "" });
946
+ setName(policy?.name || "");
947
+ };
948
+ const savePolicy = () => {
949
+ if (!editor || !name.trim()) return;
950
+ const nextPolicy = editor.name ? { ...editor, name: name.trim() } : createPolicy ? createPolicy(name.trim()) : { name: name.trim(), permissions: "", domain: defaultDomain, modifiedBy: "", modified: "" };
951
+ const next = editor.name ? currentPolicies.map((policy) => policy === editor ? nextPolicy : policy) : [...currentPolicies, nextPolicy];
952
+ update(next);
953
+ onSavePolicy?.(nextPolicy, editor);
954
+ setEditor(null);
955
+ };
956
+ const removePolicy = (policy) => {
957
+ update(currentPolicies.filter((item2) => item2 !== policy));
958
+ onDeletePolicy?.(policy);
959
+ };
960
+ const copyPolicy = (policy) => {
961
+ const copy = { ...policy, name: `${policy.name} ${labels.copySuffix || "Copy"}` };
962
+ update([...currentPolicies, copy]);
963
+ onCopyPolicy?.(copy, policy);
964
+ };
965
+ const otherSection = renderSection?.(currentSelected, item);
966
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "config-page", children: [
967
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(ConfigurationHeader, { title, ...headerProps }),
968
+ currentSelected === policyId ? /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
969
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(PolicyFeatureStrip, { ...featureProps, title: labels.featuresTitle ?? featureProps.title, instruction: labels.instruction ?? featureProps.instruction, features, onFeatureSelect: (id, feature) => {
970
+ onFeatureSelect?.(id, feature);
971
+ featureProps.onFeatureSelect?.(id, feature);
972
+ } }),
973
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(PolicyToolbar, { ...toolbarProps, title: labels.policiesTitle || toolbarProps.title, addLabel: labels.add || toolbarProps.addLabel, count: filtered.length, page: currentPage, onPageChange: (next) => {
974
+ setPage(next);
975
+ toolbarProps.onPageChange?.(next);
976
+ }, query, onQueryChange: (value) => {
977
+ setQuery(value);
978
+ setPage(1);
979
+ toolbarProps.onQueryChange?.(value);
980
+ }, onAdd: () => {
981
+ openEditor();
982
+ toolbarProps.onAdd?.();
983
+ } }),
984
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(PolicyTable, { ...tableProps, policies: visiblePolicies, columns, defaultDomain, onEdit: (policy) => {
985
+ openEditor(policy);
986
+ tableProps.onEdit?.(policy);
987
+ }, onDelete: (policy) => {
988
+ removePolicy(policy);
989
+ tableProps.onDelete?.(policy);
990
+ }, onCopy: (policy) => {
991
+ copyPolicy(policy);
992
+ tableProps.onCopy?.(policy);
993
+ } })
994
+ ] }) : otherSection !== void 0 ? otherSection : /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(Panel, { className: "config-detail-panel", children: [
995
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h2", { children: title }),
996
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(FormRow, { label: labels.domain || "Select Domain", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("select", { className: "ad-select", defaultValue: defaultDomain, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("option", { children: defaultDomain }) }) }),
997
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(CheckRow, { children: [
998
+ labels.enable || "Enable",
999
+ " ",
1000
+ title
1001
+ ] }),
1002
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { children: labels.sectionDescription?.(title) || `Configure ${title.toLowerCase()} for the selected domain.` })
1003
+ ] }),
1004
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Modal, { title: editor?.name ? labels.editTitle || "Edit Policy" : labels.addTitle || "Add New Policy", open: !!editor, onClose: () => setEditor(null), footer: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
1005
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Button, { onClick: () => setEditor(null), children: labels.cancel || "Cancel" }),
1006
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Button, { variant: "primary", onClick: savePolicy, children: labels.save || "Save" })
1007
+ ] }), children: renderPolicyForm ? renderPolicyForm({ policy: editor, name, setName }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(TextField, { label: labels.policyName || "Policy Name", value: name, onChange: (event) => setName(event.target.value) }) })
1008
+ ] });
1009
+ }
1010
+
1011
+ // src/admin/screens.jsx
1012
+ var import_react10 = __toESM(require("react"));
1013
+ var import_lucide_react6 = require("lucide-react");
1014
+ var import_jsx_runtime10 = require("react/jsx-runtime");
1015
+ var ADMIN_GROUPS = [
1016
+ { label: "Customize", items: [{ id: "login", label: "Login Settings" }, { id: "personalize", label: "Personalize" }] },
1017
+ { label: "Enterprise Essentials", items: [{ id: "failover", label: "Failover and Secure Gateway" }, { id: "reverse", label: "Reverse Proxy" }] },
1018
+ { label: "Product Settings", items: [{ id: "connection", label: "Connection" }, { id: "mail", label: "Mail / SMS Settings" }, { id: "dashboard", label: "Dashboard Updater" }, { id: "backup", label: "Backup Settings" }, { id: "site", label: "Site Based DC Updater" }, { id: "integration", label: "Integration Settings" }, { id: "windows", label: "Windows Service" }, { id: "security", label: "Security and Privacy" }] },
1019
+ { label: "License Management", items: [{ id: "restrict", label: "Restrict Users" }] }
1020
+ ];
1021
+ function RowLink({ children, onClick }) {
1022
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextLink, { onClick, children });
1023
+ }
1024
+ function LoginSettings() {
1025
+ const [modal, setModal] = (0, import_react10.useState)("");
1026
+ const modalItems = modal === "Manage Custom Attributes" ? ["First Name", "Last Name", "Display Name", "Mail Address", "Mobile Number"] : ["ADSELFSERVICE", "Microsoft Entra ID"];
1027
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1028
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Frame, { title: "Login Settings", help: "Configure administrator and directory user login behavior", action: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { onClick: () => setModal("Manage Custom Attributes"), children: "Manage Custom Attributes" }), tabs: ["General", "Single Sign-On", "Smart Card Authentication"], children: (active) => active === "General" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1029
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SectionTitle, { children: "Login Settings" }),
1030
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-list", children: [
1031
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { help: "Hides the administrator option on the self-service login page", children: "Hide self-service admin login" }),
1032
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-inline", children: [
1033
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { disabled: true, children: "Allow/Restrict admin portal access based on IP addresses." }),
1034
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RowLink, { onClick: () => setModal("Configure IP addresses"), children: "Configure now" })
1035
+ ] }),
1036
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-inline", children: [
1037
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { defaultChecked: true, children: "Show the directory selection drop-down menu in the web portal's login page." }),
1038
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RowLink, { onClick: () => setModal("Configure Directory List"), children: "Configure Directory List" })
1039
+ ] }),
1040
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-inline", children: [
1041
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { defaultChecked: true, children: "Show the directory selection drop-down menu in the mobile app and mobile portal login screen." }),
1042
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RowLink, { onClick: () => setModal("Configure Directory List"), children: "Configure Directory List" })
1043
+ ] }),
1044
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-inline", children: [
1045
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { help: "Permit configured attributes as alternate login identifiers", children: "Enable other unique attributes to log in to the product." }),
1046
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RowLink, { onClick: () => setModal("Select attribute list"), children: "Select attribute list" })
1047
+ ] }),
1048
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-inline", children: [
1049
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Enable user disclaimer" }),
1050
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RowLink, { onClick: () => setModal("Customize disclaimer"), children: "Customize" })
1051
+ ] }),
1052
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-inline", children: [
1053
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Prevent hackers from finding out valid users." }),
1054
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RowLink, { onClick: () => setModal("Configure user protection"), children: "Configure" }),
1055
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(HelpTip, { text: "Use the same message for valid and invalid usernames" })
1056
+ ] })
1057
+ ] }),
1058
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SectionTitle, { children: "CAPTCHA settings" }),
1059
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-list", children: [
1060
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-inline", children: [
1061
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Show CAPTCHA (word verification image) on login page." }),
1062
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RowLink, { onClick: () => setModal("CAPTCHA settings"), children: "CAPTCHA settings" })
1063
+ ] }),
1064
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-indent", children: [
1065
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(CheckRow, { disabled: true, children: [
1066
+ "On ",
1067
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("em", { children: "Admin" }),
1068
+ " & ",
1069
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("em", { children: "Directory User" }),
1070
+ " login page."
1071
+ ] }),
1072
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(CheckRow, { disabled: true, children: [
1073
+ "On ",
1074
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("em", { children: "Reset Password" }),
1075
+ " & ",
1076
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("em", { children: "Unlock Account" }),
1077
+ " login page."
1078
+ ] })
1079
+ ] }),
1080
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { help: "Enable an audio alternative for the CAPTCHA", children: "Enable audio CAPTCHA." })
1081
+ ] }),
1082
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SectionTitle, { children: "Other Settings" }),
1083
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-list", children: [
1084
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(CheckRow, { children: [
1085
+ "Hide ",
1086
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("em", { children: "Help" }),
1087
+ " button on end users page"
1088
+ ] }),
1089
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(CheckRow, { children: [
1090
+ "Hide ",
1091
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("em", { children: "Mobile Access" }),
1092
+ " button on end users page"
1093
+ ] })
1094
+ ] }),
1095
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-tail-link", children: [
1096
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RowLink, { onClick: () => setModal("Customize HTML"), children: "Customize" }),
1097
+ " end user login page completely as HTML"
1098
+ ] }),
1099
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SaveBar, {})
1100
+ ] }) : active === "Single Sign-On" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1101
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-list", children: [
1102
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("strong", { children: "Enable SSO" }) }),
1103
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RadioRow, { name: "sso", value: "SAML", disabled: true, children: "SAML Authentication" }),
1104
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RadioRow, { name: "sso", value: "NTLM", checked: true, disabled: true, children: "NTLM Authentication" })
1105
+ ] }),
1106
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Notice, { children: [
1107
+ "To complete the NTLM SSO configuration, download the latest Jespa JAR file, add it to the /lib folder, and restart ADSelfService Plus. ",
1108
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextLink, { children: "Learn More" })
1109
+ ] }),
1110
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(DataTable, { columns: ["", "Domain Name", "Computer Account", "Status"], rows: [[/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, {}), "ADSELFSERVICE", "-", /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextLink, { onClick: () => setModal("Configure SSO"), children: "Configure now" })]] }),
1111
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SaveBar, { cancel: false })
1112
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1113
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-form-block", children: [
1114
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Import CA Root Certificate", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("input", { type: "file", "aria-label": "Choose certificate file" }) }),
1115
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Mapping Attribute in Certificate", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["SAN.OtherName", "Subject", "SAN.Email"] }) }),
1116
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Mapping Attribute in AD", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["userPrincipalName", "sAMAccountName", "mail"] }) }),
1117
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Linked Domains", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("input", { className: "ad-input", disabled: true, defaultValue: "adselfservice.com" }) }),
1118
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SaveBar, {})
1119
+ ] }),
1120
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Notice, { tone: "warning", children: "You must restart ADSelfService Plus for the changes to take effect. Smart Card Authentication is supported only for users in Active Directory." })
1121
+ ] }) }),
1122
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Modal, { title: modal, open: !!modal, onClose: () => setModal(""), footer: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1123
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { onClick: () => setModal(""), children: "Cancel" }),
1124
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { variant: "primary", onClick: () => setModal(""), children: "Done" })
1125
+ ] }), children: modal === "Configure IP addresses" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, { label: "Allowed IP address or range", placeholder: "192.168.1.0/24" }) : modal === "Customize disclaimer" || modal === "Customize HTML" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("textarea", { className: "ad-textarea", rows: "6", "aria-label": "Custom content" }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "ad-modal-options", children: modalItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { defaultChecked: true, children: item }, item)) }) })
1126
+ ] });
1127
+ }
1128
+ function Personalize() {
1129
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Frame, { title: "Personalize Settings", tabs: ["Display Settings", "Portal Rebranding", "Mobile Rebranding", "Change Password", "Language Customization"], children: (active) => active === "Display Settings" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-form-block", children: [
1130
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Choose Language", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["Browser Default", "English", "Japanese", "Spanish", "German", "French"] }) }),
1131
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Choose AD Welcome Name", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["SamAccountName", "UserPrincipalName", "DisplayName", "FirstName", "LastName"] }) }),
1132
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Choose Entra ID Welcome Name", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["UserPrincipalName", "DisplayName", "FirstName", "Mail Address"] }) }),
1133
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Time Format", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["02:45 PM", "14:45", "14:45:00"] }) }),
1134
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Date Format", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["2016/08/15 (yyyy/MM/dd)", "08/15/2016 (MM/dd/yyyy)", "15-08-2016 (dd-MM-yyyy)"], width: 230 }) }),
1135
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Time Zone", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["(GMT -8:00) Pacific Daylight Time(America/Los_Angeles)", "(GMT +5:30) India Standard Time(Asia/Kolkata)", "(GMT 00:00) UTC"], width: 355 }) }),
1136
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SaveBar, { cancelLabel: "Restore" })
1137
+ ] }) : active === "Portal Rebranding" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1138
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SectionTitle, { children: "General Customization" }),
1139
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Choose Theme Color", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["Dark Gray", "Blue", "Green"] }) }),
1140
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Browser Title", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, { defaultValue: "ADSelfService Plus" }) }),
1141
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Browser Title Image", hint: "Preferred image format is .ico", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("input", { type: "file", accept: ".ico" }) }),
1142
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Change Logo", hint: "Dimension: 200 x 50, Size 2MB", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("input", { type: "file", accept: "image/*" }) }),
1143
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SectionTitle, { children: "Login Customization" }),
1144
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Customize Login Page Buttons", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-list", children: [
1145
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { defaultChecked: true, children: "Log In" }),
1146
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { defaultChecked: true, children: "Forgot your password?" }),
1147
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { defaultChecked: true, children: "Account locked out?" })
1148
+ ] }) }),
1149
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Login Screen Background Image", hint: "Dimension: 1300 x 700, Size 2MB", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("input", { type: "file", accept: "image/*" }) }),
1150
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SaveBar, { cancelLabel: "Restore" })
1151
+ ] }) : active === "Mobile Rebranding" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1152
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Change Logo", hint: "Dimension 1000x400 - Size 2 MB", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("input", { type: "file", accept: "image/*" }) }),
1153
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SectionTitle, { children: "Customize Home Screen" }),
1154
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "ad-option-list", children: ["Password Reset", "Account Unlock", "Change Password", "Server Settings", "Login", "Help", "Feedback"].map((item) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { defaultChecked: item !== "Change Password", children: item }, item)) }),
1155
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Restrict Mobile Access" }),
1156
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-indent", children: [
1157
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { disabled: true, children: "Restrict Mobile site access" }),
1158
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { disabled: true, children: "Restrict Mobile app (iOS/android) access" })
1159
+ ] }),
1160
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Remember login in mobile app for auto login." }),
1161
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SectionTitle, { children: "Advanced" }),
1162
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "ad-spaced", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { children: "Preview" }) }),
1163
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SaveBar, { cancelLabel: "Restore" })
1164
+ ] }) : active === "Change Password" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1165
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-form-block", children: [
1166
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Old Password", required: true, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, { type: "password" }) }),
1167
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "New Password", required: true, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, { type: "password" }) }),
1168
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Confirm New Password", required: true, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, { type: "password" }) })
1169
+ ] }),
1170
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("ul", { className: "ad-password-rules", children: [
1171
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: "Minimum length should be at least 8" }),
1172
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: "Number of special characters to include 2" }),
1173
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: "Must contain at least 1 upper case character" }),
1174
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: "Number of numerals to include 1" }),
1175
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: "Must not be a palindrome" })
1176
+ ] }),
1177
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SaveBar, { saveLabel: "Change Password" })
1178
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1179
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Notice, { children: "Personalize ADSelfService Plus by modifying text displayed in its web interface. Retain curly braces in sentences that contain them, then reload the web console to view changes." }),
1180
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Select Language", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["English", "Japanese", "Chinese-Simplified", "Spanish", "German", "French"] }) }),
1181
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-language-toolbar", children: [
1182
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, { placeholder: "Enter text to search" }),
1183
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { children: "Find & Replace" }),
1184
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: "1 - 25 of 18324" })
1185
+ ] }),
1186
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(DataTable, { columns: ["Text", "Action"], rows: ["Force Enrollment using Logon Script", "Mandatory fields cannot be left empty.", "Logon Hours", "Modules", "Trusted IPs", "Embed Widget", "Active Directory account unlock failed.", "Successfully changed the password"].map((text) => [text, /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextLink, { children: "Modify" })]) })
1187
+ ] }) });
1188
+ }
1189
+ function Failover() {
1190
+ const [mode, setMode] = (0, import_react10.useState)("Load Balancing");
1191
+ const [open, setOpen] = (0, import_react10.useState)(false);
1192
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1193
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(PageHeader, { title: "Failover and Secure Gateway", action: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { variant: "outline", onClick: () => setOpen(true), children: "How to configure?" }) }),
1194
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Panel, { className: "ad-architecture-panel", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-architecture", children: [
1195
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h3", { children: "Load Balancer Architecture" }),
1196
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tabs, { tabs: ["Load Balancing", "Failover"], active: mode, onChange: setMode }),
1197
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-architecture-diagram", children: [
1198
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-architecture-node", children: [
1199
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_lucide_react6.LaptopMinimal, { size: 48 }),
1200
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: "Web Interface" })
1201
+ ] }),
1202
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_lucide_react6.ArrowRight, { size: 23 }),
1203
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-architecture-node", children: [
1204
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_lucide_react6.Network, { size: 48 }),
1205
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: "Virtual IP/Hostname" })
1206
+ ] }),
1207
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_lucide_react6.ArrowRight, { size: 23 }),
1208
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-server-stack", children: [
1209
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-architecture-node", children: [
1210
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_lucide_react6.Server, { size: 45 }),
1211
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("small", { children: "Primary" })
1212
+ ] }),
1213
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-architecture-node", children: [
1214
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_lucide_react6.Server, { size: 45 }),
1215
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("small", { children: "Secondary" })
1216
+ ] }),
1217
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: "ADSelfService Plus Servers" })
1218
+ ] }),
1219
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_lucide_react6.ArrowRight, { size: 23 }),
1220
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-architecture-node", children: [
1221
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_lucide_react6.Database, { size: 48 }),
1222
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: "ADSelfService Plus Database" })
1223
+ ] })
1224
+ ] })
1225
+ ] }) }),
1226
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "ad-configure-action", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { variant: "primary", onClick: () => setOpen(true), children: "Click to Configure" }) }),
1227
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Modal, { title: `${mode} Configuration`, open, onClose: () => setOpen(false), footer: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { variant: "primary", onClick: () => setOpen(false), children: "Close" }), children: [
1228
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Notice, { children: [
1229
+ "Specify the access URL and server details to configure ",
1230
+ mode.toLowerCase(),
1231
+ "."
1232
+ ] }),
1233
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, { label: "Access URL", placeholder: "https://adselfservice.example.com" })
1234
+ ] })
1235
+ ] });
1236
+ }
1237
+ function ReverseProxy() {
1238
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Frame, { title: "Reverse Proxy", children: [
1239
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-proxy", children: [
1240
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("strong", { children: "Context Based" }),
1241
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("dl", { children: [
1242
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("dt", { children: "Protocol" }),
1243
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("dd", { children: "HTTPS" }),
1244
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("dt", { children: "Port" }),
1245
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("dd", { children: "443" }),
1246
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("dt", { children: "Context" }),
1247
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("dd", { children: "adssp" }),
1248
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("dt", { children: "Access URL" }),
1249
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("dd", { children: "https://WIN-6VQ61ODR35T:443/adssp" }),
1250
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("dt", { children: "Target URL" }),
1251
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("dd", { children: "https://ADSSPDEMO1:443" })
1252
+ ] })
1253
+ ] }),
1254
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Notice, { tone: "warning", children: "To modify reverse proxy details, navigate to AD360 > Admin > Administration > Reverse Proxy." })
1255
+ ] });
1256
+ }
1257
+ function Connection() {
1258
+ const [port, setPort] = (0, import_react10.useState)("https");
1259
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Frame, { title: "Connection Settings", action: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextLink, { children: "Configure Access URL" }), tabs: ["Connection Settings", "Proxy Settings", "General Settings"], children: (active) => active === "Connection Settings" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1260
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-form-block", children: [
1261
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(FormRow, { label: "ADSelfService Plus Port [http]", children: [
1262
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RadioRow, { name: "port", value: "http", checked: port === "http", onChange: setPort }),
1263
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("input", { className: "ad-input ad-short", defaultValue: "8888", disabled: port !== "http" })
1264
+ ] }),
1265
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(FormRow, { label: "ADSelfService Plus Port [https]", children: [
1266
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RadioRow, { name: "port", value: "https", checked: port === "https", onChange: setPort }),
1267
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("input", { className: "ad-input ad-short", defaultValue: "443", disabled: port !== "https" }),
1268
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextLink, { children: "Apply SSL Certificate" })
1269
+ ] }),
1270
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(FormRow, { label: "Encrypt Keystore Password", children: [
1271
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, {}),
1272
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("input", { className: "ad-input", disabled: true, type: "password" })
1273
+ ] }),
1274
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Use LDAP SSL(LDAPS)" }) }),
1275
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextLink, { children: "Advanced Settings" }) })
1276
+ ] }),
1277
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SaveBar, {}),
1278
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "ad-footnote", children: "Changes will reflect only on restart of ADSelfService Plus." })
1279
+ ] }) : active === "Proxy Settings" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1280
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Enable Proxy Server" }),
1281
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-form-block", children: [
1282
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Server Name or IP", required: true, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, { placeholder: "Server Name or IP" }) }),
1283
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Port", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, { placeholder: "Port" }) }),
1284
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Username", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, {}) }),
1285
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Password", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, { type: "password" }) })
1286
+ ] }),
1287
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "ad-footnote", children: "Provide username and password if the proxy server requires authentication." }),
1288
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SaveBar, { cancelLabel: "Reset" }),
1289
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "ad-tail-link", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextLink, { children: "Test Connection" }) })
1290
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1291
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SectionTitle, { children: "Session Settings" }),
1292
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Session Expiration Time", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["10 mins", "15 mins", "20 mins", "25 mins", "30 mins", "45 mins", "60 mins", "24 hrs", "Never"] }) }),
1293
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Deny Concurrent Logins" }),
1294
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SectionTitle, { children: "Startup & Logging Settings" }),
1295
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SaveBar, { saveLabel: "Save Settings" }),
1296
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "ad-footnote", children: "Changes will reflect only on restart of ADSelfService Plus." })
1297
+ ] }) });
1298
+ }
1299
+ function MailSms() {
1300
+ const [mode, setMode] = (0, import_react10.useState)("SMTP");
1301
+ const [auth, setAuth] = (0, import_react10.useState)("basic");
1302
+ const [smsAlert, setSmsAlert] = (0, import_react10.useState)(false);
1303
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Frame, { title: "Mail / SMS Server Settings", action: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextLink, { children: "Mail/Mobile Attributes" }), tabs: ["Mail Settings", "SMS Settings", "Notification Settings"], children: (active) => active === "Mail Settings" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-form-block", children: [
1304
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SectionTitle, { children: "Configure Mail Server" }),
1305
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(FormRow, { label: "Mode", children: [
1306
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RadioRow, { name: "mailmode", value: "SMTP", checked: mode === "SMTP", onChange: setMode, children: "SMTP" }),
1307
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RadioRow, { name: "mailmode", value: "API", checked: mode === "API", onChange: setMode, children: "API" })
1308
+ ] }),
1309
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Server Name or IP", required: true, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, { defaultValue: "smtp" }) }),
1310
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Port", required: true, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, { defaultValue: "25" }) }),
1311
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "From Address", required: true, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, { defaultValue: "noreply@adselfserviceplus.com" }) }),
1312
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(FormRow, { label: "Admin Mail Address", required: true, hint: "Use comma (,) to separate multiple email addresses.", children: [
1313
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, { defaultValue: "noreply@adselfserviceplus.com" }),
1314
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextLink, { children: "Send a test mail" })
1315
+ ] }),
1316
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Secure Connection (SSL/TLS)", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["None", "SSL", "TLS"], initial: "SSL" }) }),
1317
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SectionTitle, { children: "Authentication" }),
1318
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(FormRow, { label: "Authentication Type", children: [
1319
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RadioRow, { name: "auth", value: "basic", checked: auth === "basic", onChange: setAuth, children: "Basic Authentication" }),
1320
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RadioRow, { name: "auth", value: "oauth", checked: auth === "oauth", onChange: setAuth, children: "OAuth Authentication" })
1321
+ ] }),
1322
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Username", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, {}) }),
1323
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Password", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, { type: "password" }) }),
1324
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SaveBar, { saveLabel: "Save Settings" }),
1325
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "ad-footnote", children: "Once the mail server settings are saved, a test mail will be sent to the Admin Mail Address." })
1326
+ ] }) : active === "SMS Settings" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1327
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(FormRow, { label: "SMS Provider", children: [
1328
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["GSMModem", "Clickatell", "Custom"], initial: "Clickatell" }),
1329
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextLink, { children: "Send Test SMS" })
1330
+ ] }),
1331
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-inline", children: [
1332
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { checked: smsAlert, onChange: setSmsAlert, children: "Please notify me when my credit balance reaches" }),
1333
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("input", { className: "ad-input ad-short", defaultValue: "10", disabled: !smsAlert })
1334
+ ] }),
1335
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SaveBar, { saveLabel: "Save Settings" }),
1336
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-notes", children: [
1337
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("strong", { children: "Quick Help" }),
1338
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("ul", { children: [
1339
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: "Mobile numbers should use the standard international format with country code." }),
1340
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: "Do not include a leading zero, plus sign, or spaces." }),
1341
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: "1 credit = 1 message of 70 characters." })
1342
+ ] })
1343
+ ] })
1344
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1345
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SectionTitle, { children: "Mail Notification" }),
1346
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-list", children: [
1347
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Enable License Expiry Notification" }),
1348
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Enable notifications for product startup and downtime events" }),
1349
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Enable notifications for new product updates" }),
1350
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Enable notifications for events and workshops" }),
1351
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Send notifications to the secondary email addresses of all end users" }),
1352
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-inline", children: [
1353
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Notify when SSL certificate is" }),
1354
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("input", { className: "ad-input ad-short", disabled: true }),
1355
+ "days before expiration"
1356
+ ] })
1357
+ ] }),
1358
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SectionTitle, { children: "SMS Notification" }),
1359
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-list", children: [
1360
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-inline", children: [
1361
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Enable product startup and downtime SMS notifications for this mobile number" }),
1362
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("input", { className: "ad-input", disabled: true, placeholder: "Enter the mobile Number" })
1363
+ ] }),
1364
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Send notifications to the secondary mobile numbers of all end users" })
1365
+ ] }),
1366
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SaveBar, { saveLabel: "Save Settings" })
1367
+ ] }) });
1368
+ }
1369
+ function DashboardUpdater() {
1370
+ const [selected, setSelected] = (0, import_react10.useState)("");
1371
+ const rows = [["AD Synchronizer", "ADSELFSERVICE", "Once in every 1 Hrs 0 Mins.", "Today 09:36 PM", "Success"], ["Locked Out Users", "ADSELFSERVICE", "Once in every 3 Hrs 0 Mins.", "Today 10:36 PM", "Success"], ["Password Expired Users", "ADSELFSERVICE", "Daily at 7 Hrs 0 Mins.", "2026/10/14 06:30 PM", "Success"], ["Soon-To-Expire User Passwords", "ADSELFSERVICE", "Daily at 7 Hrs 0 Mins.", "2026/10/14 06:30 PM", "Success"], ["Microsoft Entra ID Synchronizer", "Zoho", "Once in every 1 Hrs 0 Mins.", "Today 09:52 PM", "Success"]];
1372
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1373
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Frame, { title: "Dashboard Updater", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(DataTable, { columns: ["Actions", "Scheduler Name", "Applies to (Directories)", "Schedule Frequency", "Next Run", "Status"], rows: rows.map((row) => [/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextLink, { onClick: () => setSelected(row[0]), children: "Edit" }), ...row.slice(0, 4), /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "ad-success", children: row[4] })]) }) }),
1374
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Modal, { title: selected, open: !!selected, onClose: () => setSelected(""), footer: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { variant: "primary", onClick: () => setSelected(""), children: "Done" }), children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Schedule Frequency", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["Every hour", "Every 3 hours", "Daily"] }) }) })
1375
+ ] });
1376
+ }
1377
+ function Backup() {
1378
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Frame, { title: "Backup Settings", action: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextLink, { children: "Backup History" }), tabs: ["Backup Settings"], children: [
1379
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-form-block", children: [
1380
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(FormRow, { label: "Backup Frequency", children: [
1381
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["Daily", "Weekly", "Monthly"] }),
1382
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"] }),
1383
+ " hrs ",
1384
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["00", "05", "10", "15", "20", "25", "30", "35", "40", "45", "50", "55"] }),
1385
+ " mins"
1386
+ ] }),
1387
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(FormRow, { label: "Backup Storage Path", required: true, hint: "Path Format: C:\\local-path\\ (or) \\\\network-path\\", children: [
1388
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, {}),
1389
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextLink, { children: "Backup Now" })
1390
+ ] }),
1391
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FormRow, { label: "Retain Backup Files", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["Delete files older than 15 days", "Delete files older than 30 days", "Keep last 10 files", "Keep all files"] }) }),
1392
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "ad-inline-save", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SaveBar, { cancel: false }) })
1393
+ ] }),
1394
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-notes", children: [
1395
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("strong", { children: "Note:" }),
1396
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("ul", { children: [
1397
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: "If the specified path is wrong or unavailable, backup files will be stored in the default Backup folder." }),
1398
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: "You can protect your backup with a password under Admin > Product Settings > Security and Privacy." }),
1399
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: "Automatic backup can be enabled only if you are using the built-in PostgreSQL database." })
1400
+ ] })
1401
+ ] })
1402
+ ] });
1403
+ }
1404
+ function SiteBased() {
1405
+ const [selected, setSelected] = (0, import_react10.useState)("adselfservice.com");
1406
+ const [open, setOpen] = (0, import_react10.useState)(false);
1407
+ const ous = ["adselfservice.com", "Computers", "Demo-Admins", "Demo-Computers", "Demo-Contact", "Demo-Developers", "Demo-Engineering", "Demo-Finance", "Demo-Groups", "Demo-HR", "Demo-Marketing", "Demo-Sales", "Demo-SelfService", "Demo-Technical Support", "Demo-Testing", "Demo-Users", "Domain Controllers", "Users"];
1408
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1409
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Frame, { title: "Site Based DC Updater", help: "Configure site based domain controller selection", children: [
1410
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-site-domain", children: [
1411
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("strong", { children: "Select Domain" }),
1412
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["ADSELFSERVICE"] })
1413
+ ] }),
1414
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-site-picker", children: [
1415
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-site-column", children: [
1416
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("strong", { children: "OUs" }),
1417
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "ad-ou-tree", children: ous.map((ou, i) => /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("label", { className: "ad-ou-row", style: { paddingLeft: i === 0 ? 16 : 36 }, children: [
1418
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("input", { type: "checkbox", checked: selected === ou, onChange: () => setSelected(ou) }),
1419
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: i === 0 ? "\u25A3" : "\u25B8" }),
1420
+ ou
1421
+ ] }, ou)) })
1422
+ ] }),
1423
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-site-column", children: [
1424
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("strong", { children: [
1425
+ "Domain Controller (",
1426
+ selected,
1427
+ ")"
1428
+ ] }),
1429
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "ad-dc-list", children: "\u25A3 \xA0 adsspdemo1.adselfservice.com" }),
1430
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextLink, { onClick: () => setOpen(true), children: "Select More DCs" })
1431
+ ] })
1432
+ ] }),
1433
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Set higher priority to Site-based DC Updater over policy-based DC Updater" }),
1434
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SaveBar, {})
1435
+ ] }),
1436
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Modal, { title: "Select More DCs", open, onClose: () => setOpen(false), footer: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { variant: "primary", onClick: () => setOpen(false), children: "Done" }), children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { defaultChecked: true, children: "adsspdemo1.adselfservice.com" }) })
1437
+ ] });
1438
+ }
1439
+ function Integration() {
1440
+ const [selected, setSelected] = (0, import_react10.useState)("");
1441
+ const apps = [["ADManager Plus", "ADManager Plus"], ["ServiceDesk Plus", "ServiceDesk Plus"], ["splunk>", "Splunk Server"], ["SYSLOG", "Syslog Server"], ["Hibp?", "Have I Been Pwned?"], ["Log360 - EventLog Analyzer", "Log360"], ["ServiceDesk Plus Cloud", "ServiceDesk Plus Cloud"]];
1442
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1443
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Frame, { title: "Integration Settings", help: "Configure external integrations", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "ad-integration-grid", children: apps.map(([logo, label]) => /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("button", { className: "ad-integration-tile", onClick: () => setSelected(label), children: [
1444
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("strong", { children: logo }),
1445
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: label })
1446
+ ] }, label)) }) }),
1447
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Modal, { title: selected, open: !!selected, onClose: () => setSelected(""), footer: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { onClick: () => setSelected(""), children: "Close" }), children: [
1448
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Notice, { children: [
1449
+ "Configure the connection for ",
1450
+ selected,
1451
+ "."
1452
+ ] }),
1453
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, { label: "Server URL" })
1454
+ ] })
1455
+ ] });
1456
+ }
1457
+ function WindowsService() {
1458
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Frame, { title: "ADSelfService Plus as Windows Service", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-service-instructions", children: [
1459
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h2", { children: "To install and start ADSelfService Plus as a service:" }),
1460
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("ol", { children: [
1461
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: "Please stop ADSelfService Plus if it is running. (Start-->All Programs-->ADSelfService Plus-->Stop ADSelfService Plus)" }),
1462
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: "Install as a service. (Start-->All Programs-->ADSelfService Plus-->NT Service-->Install ADSelfService Plus as Service)" }),
1463
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("li", { children: [
1464
+ "Start as a service:",
1465
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("ol", { type: "i", children: [
1466
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: 'Start-->Run and type "services.msc"' }),
1467
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: 'Right-click on "ManageEngine ADSelfService Plus" and Click on Properties.' }),
1468
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: 'Go to Logon Tab and choose "This Account" option. Enter administrative credentials and click OK.' }),
1469
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: 'Right-click on "ManageEngine ADSelfService Plus" and Click on Start.' })
1470
+ ] })
1471
+ ] })
1472
+ ] })
1473
+ ] }) });
1474
+ }
1475
+ function Security() {
1476
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Frame, { title: "Security and Privacy", tabs: ["Privacy Settings"], children: [
1477
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SectionTitle, { children: "Data Security" }),
1478
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { children: "Enable password protection for" }),
1479
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-list", children: [
1480
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-inline", children: [
1481
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Scheduled and exported reports" }),
1482
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("input", { className: "ad-input", type: "password", disabled: true })
1483
+ ] }),
1484
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-option-inline", children: [
1485
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { children: "Database backup files" }),
1486
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("input", { className: "ad-input", type: "password", disabled: true })
1487
+ ] })
1488
+ ] }),
1489
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SectionTitle, { children: "Usage Statistics" }),
1490
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CheckRow, { defaultChecked: true, children: "Send product usage statistics anonymously" }),
1491
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SaveBar, { saveLabel: "Save Settings" })
1492
+ ] });
1493
+ }
1494
+ function RestrictUsers() {
1495
+ const [active, setActive] = (0, import_react10.useState)("Restrict Users");
1496
+ const [open, setOpen] = (0, import_react10.useState)(false);
1497
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1498
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Frame, { title: "Restricted Users", action: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-header-links", children: [
1499
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextLink, { children: "Schedule to Restrict/Derestrict" }),
1500
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextLink, { children: "License Info" })
1501
+ ] }), children: [
1502
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Notice, { tone: "warning", children: [
1503
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("strong", { children: "Note" }),
1504
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("ul", { children: [
1505
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: "Prevent licenses being wasted by stale user accounts." }),
1506
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: "Restrict inactive user accounts and prevent them from being exploited." }),
1507
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: "Enrolment data of a restricted user would be deleted automatically." }),
1508
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { children: "Restricting a user revokes and frees up the Endpoint MFA license they have consumed." })
1509
+ ] })
1510
+ ] }),
1511
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tabs, { tabs: ["Restrict Users", "Derestrict Users"], active, onChange: setActive }),
1512
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ad-restrict-toolbar", children: [
1513
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: "Select Directory" }),
1514
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["ADSELFSERVICE"] }),
1515
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "ad-restrict-count", children: "0-0 of 0" }),
1516
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(InlineSelect, { options: ["25", "50", "100"] })
1517
+ ] }),
1518
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(DataTable, { columns: [""], empty: `There are no ${active === "Restrict Users" ? "restricted" : "derestricted"} users in this directory. Click ${active} to start.` }),
1519
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "ad-spaced", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { variant: "primary", onClick: () => setOpen(true), children: active }) })
1520
+ ] }),
1521
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Modal, { title: active, open, onClose: () => setOpen(false), footer: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { variant: "primary", onClick: () => setOpen(false), children: "Done" }), children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TextField, { label: "Search Users", placeholder: "Search by name" }) })
1522
+ ] });
1523
+ }
1524
+ var SCREENS = { login: LoginSettings, personalize: Personalize, failover: Failover, reverse: ReverseProxy, connection: Connection, mail: MailSms, dashboard: DashboardUpdater, backup: Backup, site: SiteBased, integration: Integration, windows: WindowsService, security: Security, restrict: RestrictUsers };
1525
+ function AdminScreen({ screen, screens = {}, renderScreen, screenProps = {} }) {
1526
+ const override = renderScreen?.(screen);
1527
+ if (override !== void 0) return override;
1528
+ const Component = screens[screen] || SCREENS[screen] || LoginSettings;
1529
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Component, { ...screenProps }, screen);
1530
+ }
1531
+
1532
+ // src/pages/AdminScreen.tsx
1533
+ var import_jsx_runtime11 = require("react/jsx-runtime");
1534
+ var ADMIN_GROUPS2 = ADMIN_GROUPS;
1535
+ function AdminScreen2(props) {
1536
+ const Component = AdminScreen;
1537
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Component, { ...props });
1538
+ }