@solidxai/core-ui 0.1.9-beta.13 → 0.1.9-beta.16
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/components/common/SettingsComponent.js +1 -1
- package/dist/components/common/SettingsComponent.js.map +1 -1
- package/dist/components/common/SettingsComponent.module.css +17 -0
- package/dist/components/common/SettingsComponent.tsx +1 -1
- package/dist/components/core/chatter/SolidChatter.d.ts.map +1 -1
- package/dist/components/core/chatter/SolidChatter.js +24 -11
- package/dist/components/core/chatter/SolidChatter.js.map +1 -1
- package/dist/components/core/chatter/SolidChatter.tsx +20 -6
- package/dist/components/core/chatter/SolidChatterHeader.d.ts.map +1 -1
- package/dist/components/core/chatter/SolidChatterHeader.js +1 -1
- package/dist/components/core/chatter/SolidChatterHeader.js.map +1 -1
- package/dist/components/core/chatter/SolidChatterHeader.tsx +4 -0
- package/dist/components/core/chatter/SolidChatterMessageBox.d.ts +1 -0
- package/dist/components/core/chatter/SolidChatterMessageBox.d.ts.map +1 -1
- package/dist/components/core/chatter/SolidChatterMessageBox.js +150 -11
- package/dist/components/core/chatter/SolidChatterMessageBox.js.map +1 -1
- package/dist/components/core/chatter/SolidChatterMessageBox.tsx +252 -11
- package/dist/components/core/chatter/SolidMessageComposer.js +2 -2
- package/dist/components/core/chatter/SolidMessageComposer.js.map +1 -1
- package/dist/components/core/chatter/SolidMessageComposer.tsx +2 -2
- package/dist/components/core/chatter/chatter.module.css +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.js +13 -2
- package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.tsx +11 -2
- package/dist/components/core/dashboard/mappers/echartsOptionMapper.d.ts +4 -0
- package/dist/components/core/dashboard/mappers/echartsOptionMapper.d.ts.map +1 -0
- package/dist/components/core/dashboard/mappers/echartsOptionMapper.js +76 -0
- package/dist/components/core/dashboard/mappers/echartsOptionMapper.js.map +1 -0
- package/dist/components/core/dashboard/mappers/echartsOptionMapper.ts +78 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardBarChartWidget.d.ts +3 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardBarChartWidget.d.ts.map +1 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardBarChartWidget.js +17 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardBarChartWidget.js.map +1 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardBarChartWidget.tsx +6 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardChartWidget.d.ts +3 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardChartWidget.d.ts.map +1 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardChartWidget.js +41 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardChartWidget.js.map +1 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardChartWidget.tsx +56 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardKpiWidget.d.ts +3 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardKpiWidget.d.ts.map +1 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardKpiWidget.js +9 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardKpiWidget.js.map +1 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardKpiWidget.tsx +7 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardLineChartWidget.d.ts +3 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardLineChartWidget.d.ts.map +1 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardLineChartWidget.js +17 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardLineChartWidget.js.map +1 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardLineChartWidget.tsx +6 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardPieChartWidget.d.ts +3 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardPieChartWidget.d.ts.map +1 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardPieChartWidget.js +17 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardPieChartWidget.js.map +1 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardPieChartWidget.tsx +6 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardTableWidget.d.ts +3 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardTableWidget.d.ts.map +1 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardTableWidget.js +12 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardTableWidget.js.map +1 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardTableWidget.tsx +39 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardUnknownWidget.d.ts +3 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardUnknownWidget.d.ts.map +1 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardUnknownWidget.js +7 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardUnknownWidget.js.map +1 -0
- package/dist/components/core/dashboard/widgets/DefaultDashboardUnknownWidget.tsx +9 -0
- package/dist/components/core/dashboard/widgets/QueueSlaHeatmapWidget.d.ts +3 -0
- package/dist/components/core/dashboard/widgets/QueueSlaHeatmapWidget.d.ts.map +1 -0
- package/dist/components/core/dashboard/widgets/QueueSlaHeatmapWidget.js +159 -0
- package/dist/components/core/dashboard/widgets/QueueSlaHeatmapWidget.js.map +1 -0
- package/dist/components/core/dashboard/widgets/QueueSlaHeatmapWidget.tsx +205 -0
- package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
- package/dist/components/core/form/SolidFormView.js +3 -0
- package/dist/components/core/form/SolidFormView.js.map +1 -1
- package/dist/components/core/form/SolidFormView.tsx +3 -0
- package/dist/components/core/form/field-quality-check-fixes.md +201 -0
- package/dist/components/core/form/fields/SolidLongTextField.d.ts +0 -1
- package/dist/components/core/form/fields/SolidLongTextField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidLongTextField.js +0 -52
- package/dist/components/core/form/fields/SolidLongTextField.js.map +1 -1
- package/dist/components/core/form/fields/SolidLongTextField.tsx +0 -95
- package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.d.ts.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js +16 -14
- package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.tsx +9 -1
- package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.d.ts.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js +12 -12
- package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.tsx +10 -6
- package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.d.ts.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.js +9 -7
- package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.js.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.tsx +7 -1
- package/dist/components/core/list/field-quality-check-fixes.md +178 -0
- package/dist/components/layout/AdminTopHeader.d.ts.map +1 -1
- package/dist/components/layout/AdminTopHeader.js +5 -1
- package/dist/components/layout/AdminTopHeader.js.map +1 -1
- package/dist/components/layout/AdminTopHeader.tsx +5 -1
- package/dist/components/shad-cn-ui/SolidAutocomplete.d.ts +2 -1
- package/dist/components/shad-cn-ui/SolidAutocomplete.d.ts.map +1 -1
- package/dist/components/shad-cn-ui/SolidAutocomplete.js +45 -6
- package/dist/components/shad-cn-ui/SolidAutocomplete.js.map +1 -1
- package/dist/components/shad-cn-ui/SolidAutocomplete.tsx +68 -22
- package/dist/components/shad-cn-ui/SolidDialog.d.ts.map +1 -1
- package/dist/components/shad-cn-ui/SolidDialog.js +38 -4
- package/dist/components/shad-cn-ui/SolidDialog.js.map +1 -1
- package/dist/components/shad-cn-ui/SolidDialog.tsx +47 -3
- package/dist/helpers/registry.d.ts.map +1 -1
- package/dist/helpers/registry.js +15 -10
- package/dist/helpers/registry.js.map +1 -1
- package/dist/helpers/registry.ts +17 -13
- package/dist/index.d.ts +5 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -7
- package/dist/index.js.map +1 -1
- package/dist/index.ts +13 -13
- package/dist/redux/api/dashboardRuntimeApi.d.ts +34 -0
- package/dist/redux/api/dashboardRuntimeApi.d.ts.map +1 -0
- package/dist/redux/api/dashboardRuntimeApi.js +79 -0
- package/dist/redux/api/dashboardRuntimeApi.js.map +1 -0
- package/dist/redux/api/dashboardRuntimeApi.ts +75 -0
- package/dist/redux/api/solidChatterMessageApi.d.ts +2 -1
- package/dist/redux/api/solidChatterMessageApi.d.ts.map +1 -1
- package/dist/redux/api/solidChatterMessageApi.js +11 -1
- package/dist/redux/api/solidChatterMessageApi.js.map +1 -1
- package/dist/redux/api/solidChatterMessageApi.ts +10 -1
- package/dist/redux/store/defaultStoreConfig.d.ts +35 -9
- package/dist/redux/store/defaultStoreConfig.d.ts.map +1 -1
- package/dist/redux/store/defaultStoreConfig.js +2 -6
- package/dist/redux/store/defaultStoreConfig.js.map +1 -1
- package/dist/redux/store/defaultStoreConfig.ts +2 -6
- package/dist/resources/globals.css +5 -0
- package/dist/resources/shadcn-base.css +24 -0
- package/dist/routes/pages/admin/core/DashboardPage.d.ts +1 -0
- package/dist/routes/pages/admin/core/DashboardPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/DashboardPage.js +780 -5
- package/dist/routes/pages/admin/core/DashboardPage.js.map +1 -1
- package/dist/routes/pages/admin/core/DashboardPage.module.css +186 -0
- package/dist/routes/pages/admin/core/DashboardPage.tsx +898 -7
- package/dist/routes/solidRoutes.d.ts.map +1 -1
- package/dist/routes/solidRoutes.js +2 -2
- package/dist/routes/solidRoutes.js.map +1 -1
- package/dist/routes/solidRoutes.tsx +2 -2
- package/dist/routes/types.d.ts +1 -1
- package/dist/routes/types.d.ts.map +1 -1
- package/dist/routes/types.js.map +1 -1
- package/dist/routes/types.ts +1 -1
- package/dist/types/dashboard.d.ts +16 -0
- package/dist/types/dashboard.d.ts.map +1 -0
- package/dist/types/dashboard.js +2 -0
- package/dist/types/dashboard.js.map +1 -0
- package/dist/types/dashboard.ts +23 -0
- package/dist/types/extension-registry.d.ts +1 -0
- package/dist/types/extension-registry.d.ts.map +1 -1
- package/dist/types/extension-registry.js +1 -0
- package/dist/types/extension-registry.js.map +1 -1
- package/dist/types/extension-registry.ts +1 -0
- package/dist/types/index.d.ts +2 -0
- package/package.json +3 -1
|
@@ -346,6 +346,6 @@ export function SettingsComponent() {
|
|
|
346
346
|
})()) : null) : null] }))] }, setting.key));
|
|
347
347
|
}) })] }) }, group.key)); })) : (_jsx("div", { className: styles.emptyState, children: "No settings match the current filter." })) })),
|
|
348
348
|
}); });
|
|
349
|
-
return (_jsxs("div", { className: styles.page, children: [_jsxs("div", { className: "page-header secondary-border-bottom", children: [_jsxs("div", { className: styles.headerIntro, children: [_jsx("div", { className: "form-wrapper-title", children: "Settings" }), _jsx("div", { className: styles.subtitle, children: "Manage platform configuration across modules from a single workspace." }), _jsxs("div", { className: styles.summaryChips, children: [_jsxs("span", { className: styles.summaryChip, children: [moduleEntries.length, " module", moduleEntries.length === 1 ? "" : "s"] }), _jsxs("span", { className: styles.summaryChip, children: [totalSettingsCount, " setting", totalSettingsCount === 1 ? "" : "s"] }), _jsxs("button", { type: "button", className: "".concat(styles.summaryChip, " ").concat(styles.summaryChipButton, " ").concat(filterMode === "editable" ? styles.summaryChipActive : ""), "aria-pressed": filterMode === "editable", onClick: function () { return setFilterMode(function (current) { return (current === "editable" ? "all" : "editable"); }); }, children: [editableSettingsCount, " editable"] })] })] }), _jsxs("div", { className: styles.headerSearch, children: [_jsxs("div", { className: styles.searchIcon, children: [_jsx(Search, { size: 16 }), _jsx(SolidInput, { className: styles.searchInput, value: searchTerm, placeholder: "Search settings, groups, or modules", onChange: function (event) { return setSearchTerm(event.target.value); } })] }), searchTerm ? (_jsxs("span", { className: styles.resultsMeta, children: [filteredSettings.length, " result", filteredSettings.length === 1 ? "" : "s"] })) : null] }), _jsxs("div", { className: styles.toolbarActions, children: [_jsxs("div", { className: styles.legend, children: [_jsx("button", { type: "button", className: "".concat(styles.readonlyFilterButton, " ").concat(filterMode === "read-only" ? styles.readonlyFilterButtonActive : ""), "aria-pressed": filterMode === "read-only", "aria-label": filterMode === "read-only" ? "Disable read-only filter" : "Enable read-only filter", onClick: function () { return setFilterMode(function (current) { return (current === "read-only" ? "all" : "read-only"); }); }, children: _jsx(SolidTag, { tone: "warn", children: "Read only" }) }), _jsx("span", { className: filterMode === "read-only" ? styles.legendLabelActive : undefined, children: filterMode === "read-only" ? "Read-only filter active" : "System-managed value" }), _jsxs(SolidTooltip, { children: [_jsx(SolidTooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", className: styles.legendButton, "aria-label": "Read-only legend details", children: "i" }) }), _jsx(SolidTooltipContent, { children: "Read-only settings are visible here for context, but can only be changed through environment or backend configuration." })] })] }), _jsx(SolidButton, { size: "sm", type: "button", loading: false, onClick: handleSave, disabled: !hasChanges, children: "Save" })] })] }), _jsx("div", { className: styles.workspace, children: moduleTabs.length ? (_jsx(SolidTabGroup, { tabs: moduleTabs, value: activeModule, onValueChange: setActiveModule, className: styles.tabGroup, listClassName: styles.tabList, panelClassName: styles.tabPanel, orientation: "vertical" })) : (_jsx("div", { className: styles.emptyState, children: "No settings are available." })) })] }));
|
|
349
|
+
return (_jsxs("div", { className: styles.page, children: [_jsxs("div", { className: "page-header secondary-border-bottom ".concat(styles.pageHeader), children: [_jsxs("div", { className: styles.headerIntro, children: [_jsx("div", { className: "form-wrapper-title", children: "Settings" }), _jsx("div", { className: styles.subtitle, children: "Manage platform configuration across modules from a single workspace." }), _jsxs("div", { className: styles.summaryChips, children: [_jsxs("span", { className: styles.summaryChip, children: [moduleEntries.length, " module", moduleEntries.length === 1 ? "" : "s"] }), _jsxs("span", { className: styles.summaryChip, children: [totalSettingsCount, " setting", totalSettingsCount === 1 ? "" : "s"] }), _jsxs("button", { type: "button", className: "".concat(styles.summaryChip, " ").concat(styles.summaryChipButton, " ").concat(filterMode === "editable" ? styles.summaryChipActive : ""), "aria-pressed": filterMode === "editable", onClick: function () { return setFilterMode(function (current) { return (current === "editable" ? "all" : "editable"); }); }, children: [editableSettingsCount, " editable"] })] })] }), _jsxs("div", { className: styles.headerSearch, children: [_jsxs("div", { className: styles.searchIcon, children: [_jsx(Search, { size: 16 }), _jsx(SolidInput, { className: styles.searchInput, value: searchTerm, placeholder: "Search settings, groups, or modules", onChange: function (event) { return setSearchTerm(event.target.value); } })] }), searchTerm ? (_jsxs("span", { className: styles.resultsMeta, children: [filteredSettings.length, " result", filteredSettings.length === 1 ? "" : "s"] })) : null] }), _jsxs("div", { className: styles.toolbarActions, children: [_jsxs("div", { className: styles.legend, children: [_jsx("button", { type: "button", className: "".concat(styles.readonlyFilterButton, " ").concat(filterMode === "read-only" ? styles.readonlyFilterButtonActive : ""), "aria-pressed": filterMode === "read-only", "aria-label": filterMode === "read-only" ? "Disable read-only filter" : "Enable read-only filter", onClick: function () { return setFilterMode(function (current) { return (current === "read-only" ? "all" : "read-only"); }); }, children: _jsx(SolidTag, { tone: "warn", children: "Read only" }) }), _jsx("span", { className: filterMode === "read-only" ? styles.legendLabelActive : undefined, children: filterMode === "read-only" ? "Read-only filter active" : "System-managed value" }), _jsxs(SolidTooltip, { children: [_jsx(SolidTooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", className: styles.legendButton, "aria-label": "Read-only legend details", children: "i" }) }), _jsx(SolidTooltipContent, { children: "Read-only settings are visible here for context, but can only be changed through environment or backend configuration." })] })] }), _jsx(SolidButton, { size: "sm", type: "button", loading: false, onClick: handleSave, disabled: !hasChanges, children: "Save" })] })] }), _jsx("div", { className: styles.workspace, children: moduleTabs.length ? (_jsx(SolidTabGroup, { tabs: moduleTabs, value: activeModule, onValueChange: setActiveModule, className: styles.tabGroup, listClassName: styles.tabList, panelClassName: styles.tabPanel, orientation: "vertical" })) : (_jsx("div", { className: styles.emptyState, children: "No settings are available." })) })] }));
|
|
350
350
|
}
|
|
351
351
|
//# sourceMappingURL=SettingsComponent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsComponent.js","sourceRoot":"","sources":["../../../src/components/common/SettingsComponent.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useState, type ComponentType } from \"react\";\nimport { Search } from \"lucide-react\";\nimport { useDispatch } from \"react-redux\";\nimport { env } from \"../../adapters/env\";\nimport { ERROR_MESSAGES } from \"../../constants/error-messages\";\nimport { getExtensionComponent } from \"../../helpers/registry\";\nimport {\n extractSettingsList,\n getSettingOptionLabel,\n getSettingsMap,\n humanizeSettingToken,\n type AdminSettingDefinition,\n} from \"../../helpers/settingsPayload\";\nimport type { SolidSettingsWidgetProps } from \"../../types/solid-core\";\nimport { showToast } from \"../../redux/features/toastSlice\";\nimport {\n useBulkUpdateSolidSettingsMutation,\n useGetSolidSettingsQuery,\n} from \"../../redux/api/solidSettingsApi\";\nimport {\n SolidButton,\n SolidDatePicker,\n SolidInput,\n SolidSelect,\n SolidSwitch,\n SolidTabGroup,\n SolidTag,\n SolidTextarea,\n SolidTooltip,\n SolidTooltipContent,\n SolidTooltipTrigger,\n} from \"../shad-cn-ui\";\nimport { SettingDropzoneActivePlaceholder } from \"./SolidSettings/SettingDropzoneActivePlaceholder\";\nimport { SettingsImageRemoveButton } from \"./SolidSettings/SettingsImageRemoveButton\";\nimport { SolidUploadedImage } from \"./SolidSettings/SolidUploadedImage\";\nimport styles from \"./SettingsComponent.module.css\";\n\ntype SettingsFormValue = string | number | boolean | null | File;\ntype SettingsFilterMode = \"all\" | \"read-only\" | \"editable\";\n\nfunction normalizeAssetUrl(src?: string | null) {\n if (!src) return \"\";\n const isBlobOrAbsolute = src.startsWith(\"blob:\") || src.startsWith(\"http\");\n if (isBlobOrAbsolute || src.startsWith(\"/\")) return src;\n return `${env(\"API_URL\")}/${src}`;\n}\n\nfunction toModuleInitials(moduleName: string) {\n return moduleName\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((token) => token[0]?.toUpperCase())\n .join(\"\")\n .slice(0, 2);\n}\n\nfunction serializeValue(value: unknown) {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n return JSON.stringify(value);\n}\n\nfunction areValuesEqual(left: unknown, right: unknown) {\n if (left instanceof File || right instanceof File) return false;\n return serializeValue(left) === serializeValue(right);\n}\n\nfunction formatReadonlyValue(setting: AdminSettingDefinition, value: unknown) {\n if (value === null || value === undefined || value === \"\") {\n return \"Not set\";\n }\n\n if (setting.controlType === \"boolean\") {\n return value ? \"Enabled\" : \"Disabled\";\n }\n\n if (setting.controlType === \"selectionStatic\") {\n return getSettingOptionLabel(setting, value);\n }\n\n if (setting.controlType === \"mediaSingle\") {\n return String(value);\n }\n\n if (typeof value === \"object\") {\n return JSON.stringify(value, null, 2);\n }\n\n return String(value);\n}\n\nfunction getSettingsWidgetName(setting: AdminSettingDefinition) {\n return setting.settingsWidget || \"\";\n}\n\nfunction getCustomWidgetErrorText(setting: AdminSettingDefinition, widgetName: string, settingsWidget: ComponentType<any> | null) {\n if (setting.controlType !== \"custom\") return null;\n if (!widgetName) {\n return `controlType is \"custom\" for setting \"${setting.key}\" but no settingsWidget is specified.`;\n }\n if (!settingsWidget) {\n return `Widget \"${widgetName}\" is not registered for setting \"${setting.key}\".`;\n }\n return null;\n}\n\nexport function SettingsComponent() {\n const dispatch = useDispatch();\n const { data: settingsResponse, refetch } = useGetSolidSettingsQuery(undefined);\n const [bulkUpdateSolidSettings] = useBulkUpdateSolidSettingsMutation();\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [filterMode, setFilterMode] = useState<SettingsFilterMode>(\"all\");\n const [activeModule, setActiveModule] = useState(\"\");\n const [formValues, setFormValues] = useState<Record<string, SettingsFormValue>>({});\n const [filePreviews, setFilePreviews] = useState<Record<string, string>>({});\n\n const settingsList = useMemo(\n () => extractSettingsList(settingsResponse).filter((setting) => setting.level !== \"internal-user\"),\n [settingsResponse],\n );\n const settingsMap = useMemo(() => getSettingsMap(settingsResponse), [settingsResponse]);\n const totalSettingsCount = settingsList.length;\n const editableSettingsCount = useMemo(\n () => settingsList.filter((setting) => setting.editable).length,\n [settingsList],\n );\n\n useEffect(() => {\n if (!settingsList.length) return;\n const nextValues = Object.fromEntries(\n settingsList.map((setting) => [setting.key, settingsMap[setting.key] ?? setting.value ?? null]),\n );\n setFormValues(nextValues);\n }, [settingsList, settingsMap]);\n\n const filteredSettings = useMemo(() => {\n const scopedSettings = settingsList.filter((setting) => {\n if (filterMode === \"read-only\") return !setting.editable;\n if (filterMode === \"editable\") return setting.editable;\n return true;\n });\n const query = searchTerm.trim().toLowerCase();\n if (!query) return scopedSettings;\n\n return scopedSettings.filter((setting) => {\n const haystack = [\n setting.moduleName,\n setting.group,\n setting.key,\n setting.label,\n setting.description,\n setting.options?.map((option) => `${option.label} ${option.value}`).join(\" \"),\n ]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n\n return haystack.includes(query);\n });\n }, [filterMode, searchTerm, settingsList]);\n\n const moduleEntries = useMemo(() => {\n const grouped = new Map<string, AdminSettingDefinition[]>();\n filteredSettings.forEach((setting) => {\n const current = grouped.get(setting.moduleName) ?? [];\n current.push(setting);\n grouped.set(setting.moduleName, current);\n });\n\n return Array.from(grouped.entries()).map(([moduleName, moduleSettings]) => ({\n moduleName,\n label: humanizeSettingToken(moduleName),\n badge: toModuleInitials(moduleName) || \"S\",\n settings: moduleSettings,\n }));\n }, [filteredSettings]);\n\n useEffect(() => {\n if (!moduleEntries.length) {\n setActiveModule(\"\");\n return;\n }\n\n if (!moduleEntries.some((entry) => entry.moduleName === activeModule)) {\n setActiveModule(moduleEntries[0].moduleName);\n }\n }, [activeModule, moduleEntries]);\n\n const hasChanges = useMemo(\n () =>\n settingsList.some(\n (setting) =>\n setting.editable &&\n !areValuesEqual(formValues[setting.key], settingsMap[setting.key] ?? setting.value ?? null),\n ),\n [formValues, settingsList, settingsMap],\n );\n\n const groupedModuleSettings = useMemo(() => {\n const currentModule = moduleEntries.find((entry) => entry.moduleName === activeModule);\n if (!currentModule) return [];\n\n const grouped = new Map<string, AdminSettingDefinition[]>();\n currentModule.settings.forEach((setting) => {\n const groupKey = setting.group || \"general\";\n const current = grouped.get(groupKey) ?? [];\n current.push(setting);\n grouped.set(groupKey, current);\n });\n\n return Array.from(grouped.entries()).map(([groupKey, groupSettings]) => ({\n key: groupKey,\n label: humanizeSettingToken(groupKey),\n settings: groupSettings.sort((left, right) => {\n const leftSort = left.sortOrder ?? Number.MAX_SAFE_INTEGER;\n const rightSort = right.sortOrder ?? Number.MAX_SAFE_INTEGER;\n if (leftSort !== rightSort) return leftSort - rightSort;\n return (left.label ?? left.key).localeCompare(right.label ?? right.key);\n }),\n }));\n }, [activeModule, moduleEntries]);\n\n const updateValue = (key: string, value: SettingsFormValue) => {\n setFormValues((current) => ({ ...current, [key]: value }));\n };\n\n const updateFileValue = (key: string, file: File | null) => {\n if (!file) {\n if (filePreviews[key]) {\n URL.revokeObjectURL(filePreviews[key]);\n }\n setFilePreviews((current) => {\n const next = { ...current };\n delete next[key];\n return next;\n });\n updateValue(key, null);\n return;\n }\n\n if (file.size > 2 * 1024 * 1024) {\n dispatch(showToast({ severity: \"error\", summary: \"File too large\", detail: \"Maximum file size is 2MB\" }));\n return;\n }\n\n if (filePreviews[key]) {\n URL.revokeObjectURL(filePreviews[key]);\n }\n\n const preview = URL.createObjectURL(file);\n setFilePreviews((current) => ({ ...current, [key]: preview }));\n updateValue(key, file);\n };\n\n useEffect(\n () => () => {\n Object.values(filePreviews).forEach((preview) => URL.revokeObjectURL(preview));\n },\n [filePreviews],\n );\n\n const handleSave = async () => {\n try {\n const updatedSettingsArray: Array<{ key: string; value: string; type: string }> = [];\n const formData = new FormData();\n\n settingsList.forEach((setting) => {\n if (!setting.editable) return;\n\n const nextValue = formValues[setting.key];\n const currentValue = settingsMap[setting.key] ?? setting.value ?? null;\n\n if (nextValue instanceof File) {\n formData.append(setting.key, nextValue);\n updatedSettingsArray.push({ key: setting.key, value: \"\", type: \"system\" });\n return;\n }\n\n if (!areValuesEqual(nextValue, currentValue)) {\n updatedSettingsArray.push({\n key: setting.key,\n value: serializeValue(nextValue),\n type: \"system\",\n });\n }\n });\n\n if (!updatedSettingsArray.length) {\n dispatch(showToast({ severity: \"success\", summary: \"No Changes\", detail: \"No settings were updated\" }));\n return;\n }\n\n formData.append(\"settings\", JSON.stringify(updatedSettingsArray));\n const response = await bulkUpdateSolidSettings({ data: formData }).unwrap();\n\n if (response?.statusCode === 200) {\n dispatch(showToast({ severity: \"success\", summary: \"Updated\", detail: \"Settings updated\" }));\n } else {\n dispatch(showToast({ severity: \"error\", summary: ERROR_MESSAGES.FAILED, detail: ERROR_MESSAGES.SOMETHING_WRONG }));\n }\n\n await refetch();\n setFilePreviews({});\n } catch (error: any) {\n dispatch(showToast({ severity: \"error\", summary: ERROR_MESSAGES.FAILED, detail: error?.data?.message || ERROR_MESSAGES.SOMETHING_WRONG }));\n }\n };\n\n const moduleTabs = moduleEntries.map((entry) => ({\n value: entry.moduleName,\n label: (\n <span className={styles.moduleTab}>\n <span className={styles.moduleTabBadge}>{entry.badge}</span>\n <span className={styles.moduleTabText}>\n <span className={styles.moduleTabLabel}>{entry.label}</span>\n <span className={styles.moduleTabMeta}>{entry.settings.length} settings</span>\n </span>\n </span>\n ),\n content: (\n <div>\n {groupedModuleSettings.length ? (\n groupedModuleSettings.map((group) => (\n <section key={group.key} className={styles.groupSection}>\n <div className={styles.groupCard}>\n <div className={styles.groupHeader}>\n <div>\n <h3 className={styles.groupTitle}>{group.label}</h3>\n <div className={styles.groupMeta}>{group.settings.length} item{group.settings.length === 1 ? \"\" : \"s\"}</div>\n </div>\n </div>\n <div className={styles.groupBody}>\n {group.settings.map((setting) => {\n const value = formValues[setting.key];\n const settingsWidgetName = getSettingsWidgetName(setting);\n const SettingsWidget = settingsWidgetName ? getExtensionComponent(settingsWidgetName) : null;\n const customWidgetErrorText = getCustomWidgetErrorText(setting, settingsWidgetName, SettingsWidget);\n const settingsWidgetProps: SolidSettingsWidgetProps = {\n setting,\n value,\n settingsMap,\n formValues,\n editable: Boolean(setting.editable),\n updateValue,\n updateFileValue,\n };\n return (\n <div key={setting.key} className={styles.settingRow}>\n <div className={styles.settingLabelWrap}>\n <div className={styles.settingLabelLine}>\n <p className={styles.settingLabel}>{setting.label || humanizeSettingToken(setting.key)}</p>\n {!setting.editable ? (\n <SolidTooltip>\n <SolidTooltipTrigger asChild>\n <span>\n <SolidTag tone=\"warn\">Read only</SolidTag>\n </span>\n </SolidTooltipTrigger>\n <SolidTooltipContent>\n This value comes from system configuration and cannot be changed from the admin UI.\n </SolidTooltipContent>\n </SolidTooltip>\n ) : null}\n </div>\n {setting.description ? <p className={styles.settingDescription}>{setting.description}</p> : null}\n </div>\n\n {!setting.editable ? (\n setting.controlType === \"custom\" ? (\n customWidgetErrorText ? (\n <div className={styles.readonlyValue}>\n <span className={styles.customWidgetError}>{customWidgetErrorText}</span>\n </div>\n ) : SettingsWidget ? (\n (() => {\n const ResolvedSettingsWidget = SettingsWidget as ComponentType<any>;\n return <ResolvedSettingsWidget {...settingsWidgetProps} />;\n })()\n ) : null\n ) : setting.controlType === \"mediaSingle\" && value ? (\n <div className={styles.mediaPreview}>\n <SolidUploadedImage src={normalizeAssetUrl(String(value))} />\n </div>\n ) : (\n <div className={styles.readonlyValue}>\n <span className={value === null || value === undefined || value === \"\" ? styles.emptyValue : undefined}>\n {formatReadonlyValue(setting, value)}\n </span>\n </div>\n )\n ) : (\n <div className={`${styles.controlStack} ${setting.controlType === \"custom\" ? styles.customControlStack : \"\"}`}>\n {setting.controlType === \"boolean\" ? (\n <div className={styles.boolRow}>\n <SolidSwitch checked={Boolean(value)} onChange={(checked) => updateValue(setting.key, checked)} />\n <span className={styles.boolText}>{value ? \"Enabled\" : \"Disabled\"}</span>\n </div>\n ) : null}\n\n {setting.controlType === \"shortText\" ? (\n <SolidInput\n type=\"text\"\n value={value == null ? \"\" : String(value)}\n placeholder={setting.placeholder || setting.label}\n onChange={(event: any) => updateValue(setting.key, event.target.value)}\n />\n ) : null}\n\n {setting.controlType === \"longText\" ? (\n <SolidTextarea\n rows={4}\n value={value == null ? \"\" : typeof value === \"string\" ? value : JSON.stringify(value, null, 2)}\n placeholder={setting.placeholder || setting.label}\n onChange={(event: any) => updateValue(setting.key, event.target.value)}\n />\n ) : null}\n\n {setting.controlType === \"numeric\" ? (\n <SolidInput\n type=\"number\"\n value={value == null ? \"\" : String(value)}\n placeholder={setting.placeholder || setting.label}\n onChange={(event: any) => updateValue(setting.key, event.target.value === \"\" ? null : Number(event.target.value))}\n />\n ) : null}\n\n {setting.controlType === \"selectionStatic\" ? (\n <SolidSelect\n value={value}\n options={setting.options || []}\n placeholder={setting.placeholder || \"Select\"}\n onChange={(event) => updateValue(setting.key, event.value)}\n />\n ) : null}\n\n {setting.controlType === \"date\" || setting.controlType === \"datetime\" ? (\n <SolidDatePicker\n selected={value ? new Date(String(value)) : null}\n showTimeSelect={setting.controlType === \"datetime\"}\n dateFormat={setting.controlType === \"datetime\" ? \"yyyy-MM-dd HH:mm:ss\" : \"yyyy-MM-dd\"}\n onChange={(date: Date | null) => updateValue(setting.key, date instanceof Date ? date.toISOString() : null)}\n />\n ) : null}\n\n {setting.controlType === \"mediaSingle\" ? (\n <div className={styles.mediaField}>\n <div className={styles.mediaComposer}>\n <label className={styles.mediaDropzone}>\n <input\n className={styles.mediaInput}\n type=\"file\"\n accept=\".png,.jpg,.jpeg,.svg,.webp\"\n onChange={(event) => updateFileValue(setting.key, event.target.files?.[0] ?? null)}\n />\n <SettingDropzoneActivePlaceholder note=\"PNG, JPG, JPEG, SVG, WEBP | Max size: 2 MB\" />\n </label>\n {(filePreviews[setting.key] || value) ? (\n <div className={styles.mediaPreview}>\n <SolidUploadedImage src={filePreviews[setting.key] || normalizeAssetUrl(String(value))} />\n </div>\n ) : (\n <div className={styles.mediaEmptyState}>Preview appears here after upload</div>\n )}\n </div>\n {(filePreviews[setting.key] || value) ? (\n <SettingsImageRemoveButton onClick={() => updateFileValue(setting.key, null)} />\n ) : null}\n </div>\n ) : null}\n\n {setting.controlType === \"custom\" ? (\n customWidgetErrorText ? (\n <div className={styles.readonlyValue}>\n <span className={styles.customWidgetError}>{customWidgetErrorText}</span>\n </div>\n ) : SettingsWidget ? (\n (() => {\n const ResolvedSettingsWidget = SettingsWidget as ComponentType<any>;\n return <ResolvedSettingsWidget {...settingsWidgetProps} />;\n })()\n ) : null\n ) : null}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n </section>\n ))\n ) : (\n <div className={styles.emptyState}>No settings match the current filter.</div>\n )}\n </div>\n ),\n }));\n\n return (\n <div className={styles.page}>\n <div className=\"page-header secondary-border-bottom\">\n <div className={styles.headerIntro}>\n <div className=\"form-wrapper-title\">Settings</div>\n <div className={styles.subtitle}>Manage platform configuration across modules from a single workspace.</div>\n <div className={styles.summaryChips}>\n <span className={styles.summaryChip}>{moduleEntries.length} module{moduleEntries.length === 1 ? \"\" : \"s\"}</span>\n <span className={styles.summaryChip}>{totalSettingsCount} setting{totalSettingsCount === 1 ? \"\" : \"s\"}</span>\n <button\n type=\"button\"\n className={`${styles.summaryChip} ${styles.summaryChipButton} ${filterMode === \"editable\" ? styles.summaryChipActive : \"\"}`}\n aria-pressed={filterMode === \"editable\"}\n onClick={() => setFilterMode((current) => (current === \"editable\" ? \"all\" : \"editable\"))}\n >\n {editableSettingsCount} editable\n </button>\n </div>\n </div>\n <div className={styles.headerSearch}>\n <div className={styles.searchIcon}>\n <Search size={16} />\n <SolidInput\n className={styles.searchInput}\n value={searchTerm}\n placeholder=\"Search settings, groups, or modules\"\n onChange={(event: any) => setSearchTerm(event.target.value)}\n />\n </div>\n {searchTerm ? (\n <span className={styles.resultsMeta}>\n {filteredSettings.length} result{filteredSettings.length === 1 ? \"\" : \"s\"}\n </span>\n ) : null}\n </div>\n <div className={styles.toolbarActions}>\n <div className={styles.legend}>\n <button\n type=\"button\"\n className={`${styles.readonlyFilterButton} ${filterMode === \"read-only\" ? styles.readonlyFilterButtonActive : \"\"}`}\n aria-pressed={filterMode === \"read-only\"}\n aria-label={filterMode === \"read-only\" ? \"Disable read-only filter\" : \"Enable read-only filter\"}\n onClick={() => setFilterMode((current) => (current === \"read-only\" ? \"all\" : \"read-only\"))}\n >\n <SolidTag tone=\"warn\">Read only</SolidTag>\n </button>\n <span className={filterMode === \"read-only\" ? styles.legendLabelActive : undefined}>\n {filterMode === \"read-only\" ? \"Read-only filter active\" : \"System-managed value\"}\n </span>\n <SolidTooltip>\n <SolidTooltipTrigger asChild>\n <button type=\"button\" className={styles.legendButton} aria-label=\"Read-only legend details\">\n i\n </button>\n </SolidTooltipTrigger>\n <SolidTooltipContent>\n Read-only settings are visible here for context, but can only be changed through environment or backend configuration.\n </SolidTooltipContent>\n </SolidTooltip>\n </div>\n <SolidButton size=\"sm\" type=\"button\" loading={false} onClick={handleSave} disabled={!hasChanges}>\n Save\n </SolidButton>\n </div>\n </div>\n\n <div className={styles.workspace}>\n {moduleTabs.length ? (\n <SolidTabGroup\n tabs={moduleTabs}\n value={activeModule}\n onValueChange={setActiveModule}\n className={styles.tabGroup}\n listClassName={styles.tabList}\n panelClassName={styles.tabPanel}\n orientation=\"vertical\"\n />\n ) : (\n <div className={styles.emptyState}>No settings are available.</div>\n )}\n </div>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SettingsComponent.js","sourceRoot":"","sources":["../../../src/components/common/SettingsComponent.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useState, type ComponentType } from \"react\";\nimport { Search } from \"lucide-react\";\nimport { useDispatch } from \"react-redux\";\nimport { env } from \"../../adapters/env\";\nimport { ERROR_MESSAGES } from \"../../constants/error-messages\";\nimport { getExtensionComponent } from \"../../helpers/registry\";\nimport {\n extractSettingsList,\n getSettingOptionLabel,\n getSettingsMap,\n humanizeSettingToken,\n type AdminSettingDefinition,\n} from \"../../helpers/settingsPayload\";\nimport type { SolidSettingsWidgetProps } from \"../../types/solid-core\";\nimport { showToast } from \"../../redux/features/toastSlice\";\nimport {\n useBulkUpdateSolidSettingsMutation,\n useGetSolidSettingsQuery,\n} from \"../../redux/api/solidSettingsApi\";\nimport {\n SolidButton,\n SolidDatePicker,\n SolidInput,\n SolidSelect,\n SolidSwitch,\n SolidTabGroup,\n SolidTag,\n SolidTextarea,\n SolidTooltip,\n SolidTooltipContent,\n SolidTooltipTrigger,\n} from \"../shad-cn-ui\";\nimport { SettingDropzoneActivePlaceholder } from \"./SolidSettings/SettingDropzoneActivePlaceholder\";\nimport { SettingsImageRemoveButton } from \"./SolidSettings/SettingsImageRemoveButton\";\nimport { SolidUploadedImage } from \"./SolidSettings/SolidUploadedImage\";\nimport styles from \"./SettingsComponent.module.css\";\n\ntype SettingsFormValue = string | number | boolean | null | File;\ntype SettingsFilterMode = \"all\" | \"read-only\" | \"editable\";\n\nfunction normalizeAssetUrl(src?: string | null) {\n if (!src) return \"\";\n const isBlobOrAbsolute = src.startsWith(\"blob:\") || src.startsWith(\"http\");\n if (isBlobOrAbsolute || src.startsWith(\"/\")) return src;\n return `${env(\"API_URL\")}/${src}`;\n}\n\nfunction toModuleInitials(moduleName: string) {\n return moduleName\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((token) => token[0]?.toUpperCase())\n .join(\"\")\n .slice(0, 2);\n}\n\nfunction serializeValue(value: unknown) {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n return JSON.stringify(value);\n}\n\nfunction areValuesEqual(left: unknown, right: unknown) {\n if (left instanceof File || right instanceof File) return false;\n return serializeValue(left) === serializeValue(right);\n}\n\nfunction formatReadonlyValue(setting: AdminSettingDefinition, value: unknown) {\n if (value === null || value === undefined || value === \"\") {\n return \"Not set\";\n }\n\n if (setting.controlType === \"boolean\") {\n return value ? \"Enabled\" : \"Disabled\";\n }\n\n if (setting.controlType === \"selectionStatic\") {\n return getSettingOptionLabel(setting, value);\n }\n\n if (setting.controlType === \"mediaSingle\") {\n return String(value);\n }\n\n if (typeof value === \"object\") {\n return JSON.stringify(value, null, 2);\n }\n\n return String(value);\n}\n\nfunction getSettingsWidgetName(setting: AdminSettingDefinition) {\n return setting.settingsWidget || \"\";\n}\n\nfunction getCustomWidgetErrorText(setting: AdminSettingDefinition, widgetName: string, settingsWidget: ComponentType<any> | null) {\n if (setting.controlType !== \"custom\") return null;\n if (!widgetName) {\n return `controlType is \"custom\" for setting \"${setting.key}\" but no settingsWidget is specified.`;\n }\n if (!settingsWidget) {\n return `Widget \"${widgetName}\" is not registered for setting \"${setting.key}\".`;\n }\n return null;\n}\n\nexport function SettingsComponent() {\n const dispatch = useDispatch();\n const { data: settingsResponse, refetch } = useGetSolidSettingsQuery(undefined);\n const [bulkUpdateSolidSettings] = useBulkUpdateSolidSettingsMutation();\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [filterMode, setFilterMode] = useState<SettingsFilterMode>(\"all\");\n const [activeModule, setActiveModule] = useState(\"\");\n const [formValues, setFormValues] = useState<Record<string, SettingsFormValue>>({});\n const [filePreviews, setFilePreviews] = useState<Record<string, string>>({});\n\n const settingsList = useMemo(\n () => extractSettingsList(settingsResponse).filter((setting) => setting.level !== \"internal-user\"),\n [settingsResponse],\n );\n const settingsMap = useMemo(() => getSettingsMap(settingsResponse), [settingsResponse]);\n const totalSettingsCount = settingsList.length;\n const editableSettingsCount = useMemo(\n () => settingsList.filter((setting) => setting.editable).length,\n [settingsList],\n );\n\n useEffect(() => {\n if (!settingsList.length) return;\n const nextValues = Object.fromEntries(\n settingsList.map((setting) => [setting.key, settingsMap[setting.key] ?? setting.value ?? null]),\n );\n setFormValues(nextValues);\n }, [settingsList, settingsMap]);\n\n const filteredSettings = useMemo(() => {\n const scopedSettings = settingsList.filter((setting) => {\n if (filterMode === \"read-only\") return !setting.editable;\n if (filterMode === \"editable\") return setting.editable;\n return true;\n });\n const query = searchTerm.trim().toLowerCase();\n if (!query) return scopedSettings;\n\n return scopedSettings.filter((setting) => {\n const haystack = [\n setting.moduleName,\n setting.group,\n setting.key,\n setting.label,\n setting.description,\n setting.options?.map((option) => `${option.label} ${option.value}`).join(\" \"),\n ]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n\n return haystack.includes(query);\n });\n }, [filterMode, searchTerm, settingsList]);\n\n const moduleEntries = useMemo(() => {\n const grouped = new Map<string, AdminSettingDefinition[]>();\n filteredSettings.forEach((setting) => {\n const current = grouped.get(setting.moduleName) ?? [];\n current.push(setting);\n grouped.set(setting.moduleName, current);\n });\n\n return Array.from(grouped.entries()).map(([moduleName, moduleSettings]) => ({\n moduleName,\n label: humanizeSettingToken(moduleName),\n badge: toModuleInitials(moduleName) || \"S\",\n settings: moduleSettings,\n }));\n }, [filteredSettings]);\n\n useEffect(() => {\n if (!moduleEntries.length) {\n setActiveModule(\"\");\n return;\n }\n\n if (!moduleEntries.some((entry) => entry.moduleName === activeModule)) {\n setActiveModule(moduleEntries[0].moduleName);\n }\n }, [activeModule, moduleEntries]);\n\n const hasChanges = useMemo(\n () =>\n settingsList.some(\n (setting) =>\n setting.editable &&\n !areValuesEqual(formValues[setting.key], settingsMap[setting.key] ?? setting.value ?? null),\n ),\n [formValues, settingsList, settingsMap],\n );\n\n const groupedModuleSettings = useMemo(() => {\n const currentModule = moduleEntries.find((entry) => entry.moduleName === activeModule);\n if (!currentModule) return [];\n\n const grouped = new Map<string, AdminSettingDefinition[]>();\n currentModule.settings.forEach((setting) => {\n const groupKey = setting.group || \"general\";\n const current = grouped.get(groupKey) ?? [];\n current.push(setting);\n grouped.set(groupKey, current);\n });\n\n return Array.from(grouped.entries()).map(([groupKey, groupSettings]) => ({\n key: groupKey,\n label: humanizeSettingToken(groupKey),\n settings: groupSettings.sort((left, right) => {\n const leftSort = left.sortOrder ?? Number.MAX_SAFE_INTEGER;\n const rightSort = right.sortOrder ?? Number.MAX_SAFE_INTEGER;\n if (leftSort !== rightSort) return leftSort - rightSort;\n return (left.label ?? left.key).localeCompare(right.label ?? right.key);\n }),\n }));\n }, [activeModule, moduleEntries]);\n\n const updateValue = (key: string, value: SettingsFormValue) => {\n setFormValues((current) => ({ ...current, [key]: value }));\n };\n\n const updateFileValue = (key: string, file: File | null) => {\n if (!file) {\n if (filePreviews[key]) {\n URL.revokeObjectURL(filePreviews[key]);\n }\n setFilePreviews((current) => {\n const next = { ...current };\n delete next[key];\n return next;\n });\n updateValue(key, null);\n return;\n }\n\n if (file.size > 2 * 1024 * 1024) {\n dispatch(showToast({ severity: \"error\", summary: \"File too large\", detail: \"Maximum file size is 2MB\" }));\n return;\n }\n\n if (filePreviews[key]) {\n URL.revokeObjectURL(filePreviews[key]);\n }\n\n const preview = URL.createObjectURL(file);\n setFilePreviews((current) => ({ ...current, [key]: preview }));\n updateValue(key, file);\n };\n\n useEffect(\n () => () => {\n Object.values(filePreviews).forEach((preview) => URL.revokeObjectURL(preview));\n },\n [filePreviews],\n );\n\n const handleSave = async () => {\n try {\n const updatedSettingsArray: Array<{ key: string; value: string; type: string }> = [];\n const formData = new FormData();\n\n settingsList.forEach((setting) => {\n if (!setting.editable) return;\n\n const nextValue = formValues[setting.key];\n const currentValue = settingsMap[setting.key] ?? setting.value ?? null;\n\n if (nextValue instanceof File) {\n formData.append(setting.key, nextValue);\n updatedSettingsArray.push({ key: setting.key, value: \"\", type: \"system\" });\n return;\n }\n\n if (!areValuesEqual(nextValue, currentValue)) {\n updatedSettingsArray.push({\n key: setting.key,\n value: serializeValue(nextValue),\n type: \"system\",\n });\n }\n });\n\n if (!updatedSettingsArray.length) {\n dispatch(showToast({ severity: \"success\", summary: \"No Changes\", detail: \"No settings were updated\" }));\n return;\n }\n\n formData.append(\"settings\", JSON.stringify(updatedSettingsArray));\n const response = await bulkUpdateSolidSettings({ data: formData }).unwrap();\n\n if (response?.statusCode === 200) {\n dispatch(showToast({ severity: \"success\", summary: \"Updated\", detail: \"Settings updated\" }));\n } else {\n dispatch(showToast({ severity: \"error\", summary: ERROR_MESSAGES.FAILED, detail: ERROR_MESSAGES.SOMETHING_WRONG }));\n }\n\n await refetch();\n setFilePreviews({});\n } catch (error: any) {\n dispatch(showToast({ severity: \"error\", summary: ERROR_MESSAGES.FAILED, detail: error?.data?.message || ERROR_MESSAGES.SOMETHING_WRONG }));\n }\n };\n\n const moduleTabs = moduleEntries.map((entry) => ({\n value: entry.moduleName,\n label: (\n <span className={styles.moduleTab}>\n <span className={styles.moduleTabBadge}>{entry.badge}</span>\n <span className={styles.moduleTabText}>\n <span className={styles.moduleTabLabel}>{entry.label}</span>\n <span className={styles.moduleTabMeta}>{entry.settings.length} settings</span>\n </span>\n </span>\n ),\n content: (\n <div>\n {groupedModuleSettings.length ? (\n groupedModuleSettings.map((group) => (\n <section key={group.key} className={styles.groupSection}>\n <div className={styles.groupCard}>\n <div className={styles.groupHeader}>\n <div>\n <h3 className={styles.groupTitle}>{group.label}</h3>\n <div className={styles.groupMeta}>{group.settings.length} item{group.settings.length === 1 ? \"\" : \"s\"}</div>\n </div>\n </div>\n <div className={styles.groupBody}>\n {group.settings.map((setting) => {\n const value = formValues[setting.key];\n const settingsWidgetName = getSettingsWidgetName(setting);\n const SettingsWidget = settingsWidgetName ? getExtensionComponent(settingsWidgetName) : null;\n const customWidgetErrorText = getCustomWidgetErrorText(setting, settingsWidgetName, SettingsWidget);\n const settingsWidgetProps: SolidSettingsWidgetProps = {\n setting,\n value,\n settingsMap,\n formValues,\n editable: Boolean(setting.editable),\n updateValue,\n updateFileValue,\n };\n return (\n <div key={setting.key} className={styles.settingRow}>\n <div className={styles.settingLabelWrap}>\n <div className={styles.settingLabelLine}>\n <p className={styles.settingLabel}>{setting.label || humanizeSettingToken(setting.key)}</p>\n {!setting.editable ? (\n <SolidTooltip>\n <SolidTooltipTrigger asChild>\n <span>\n <SolidTag tone=\"warn\">Read only</SolidTag>\n </span>\n </SolidTooltipTrigger>\n <SolidTooltipContent>\n This value comes from system configuration and cannot be changed from the admin UI.\n </SolidTooltipContent>\n </SolidTooltip>\n ) : null}\n </div>\n {setting.description ? <p className={styles.settingDescription}>{setting.description}</p> : null}\n </div>\n\n {!setting.editable ? (\n setting.controlType === \"custom\" ? (\n customWidgetErrorText ? (\n <div className={styles.readonlyValue}>\n <span className={styles.customWidgetError}>{customWidgetErrorText}</span>\n </div>\n ) : SettingsWidget ? (\n (() => {\n const ResolvedSettingsWidget = SettingsWidget as ComponentType<any>;\n return <ResolvedSettingsWidget {...settingsWidgetProps} />;\n })()\n ) : null\n ) : setting.controlType === \"mediaSingle\" && value ? (\n <div className={styles.mediaPreview}>\n <SolidUploadedImage src={normalizeAssetUrl(String(value))} />\n </div>\n ) : (\n <div className={styles.readonlyValue}>\n <span className={value === null || value === undefined || value === \"\" ? styles.emptyValue : undefined}>\n {formatReadonlyValue(setting, value)}\n </span>\n </div>\n )\n ) : (\n <div className={`${styles.controlStack} ${setting.controlType === \"custom\" ? styles.customControlStack : \"\"}`}>\n {setting.controlType === \"boolean\" ? (\n <div className={styles.boolRow}>\n <SolidSwitch checked={Boolean(value)} onChange={(checked) => updateValue(setting.key, checked)} />\n <span className={styles.boolText}>{value ? \"Enabled\" : \"Disabled\"}</span>\n </div>\n ) : null}\n\n {setting.controlType === \"shortText\" ? (\n <SolidInput\n type=\"text\"\n value={value == null ? \"\" : String(value)}\n placeholder={setting.placeholder || setting.label}\n onChange={(event: any) => updateValue(setting.key, event.target.value)}\n />\n ) : null}\n\n {setting.controlType === \"longText\" ? (\n <SolidTextarea\n rows={4}\n value={value == null ? \"\" : typeof value === \"string\" ? value : JSON.stringify(value, null, 2)}\n placeholder={setting.placeholder || setting.label}\n onChange={(event: any) => updateValue(setting.key, event.target.value)}\n />\n ) : null}\n\n {setting.controlType === \"numeric\" ? (\n <SolidInput\n type=\"number\"\n value={value == null ? \"\" : String(value)}\n placeholder={setting.placeholder || setting.label}\n onChange={(event: any) => updateValue(setting.key, event.target.value === \"\" ? null : Number(event.target.value))}\n />\n ) : null}\n\n {setting.controlType === \"selectionStatic\" ? (\n <SolidSelect\n value={value}\n options={setting.options || []}\n placeholder={setting.placeholder || \"Select\"}\n onChange={(event) => updateValue(setting.key, event.value)}\n />\n ) : null}\n\n {setting.controlType === \"date\" || setting.controlType === \"datetime\" ? (\n <SolidDatePicker\n selected={value ? new Date(String(value)) : null}\n showTimeSelect={setting.controlType === \"datetime\"}\n dateFormat={setting.controlType === \"datetime\" ? \"yyyy-MM-dd HH:mm:ss\" : \"yyyy-MM-dd\"}\n onChange={(date: Date | null) => updateValue(setting.key, date instanceof Date ? date.toISOString() : null)}\n />\n ) : null}\n\n {setting.controlType === \"mediaSingle\" ? (\n <div className={styles.mediaField}>\n <div className={styles.mediaComposer}>\n <label className={styles.mediaDropzone}>\n <input\n className={styles.mediaInput}\n type=\"file\"\n accept=\".png,.jpg,.jpeg,.svg,.webp\"\n onChange={(event) => updateFileValue(setting.key, event.target.files?.[0] ?? null)}\n />\n <SettingDropzoneActivePlaceholder note=\"PNG, JPG, JPEG, SVG, WEBP | Max size: 2 MB\" />\n </label>\n {(filePreviews[setting.key] || value) ? (\n <div className={styles.mediaPreview}>\n <SolidUploadedImage src={filePreviews[setting.key] || normalizeAssetUrl(String(value))} />\n </div>\n ) : (\n <div className={styles.mediaEmptyState}>Preview appears here after upload</div>\n )}\n </div>\n {(filePreviews[setting.key] || value) ? (\n <SettingsImageRemoveButton onClick={() => updateFileValue(setting.key, null)} />\n ) : null}\n </div>\n ) : null}\n\n {setting.controlType === \"custom\" ? (\n customWidgetErrorText ? (\n <div className={styles.readonlyValue}>\n <span className={styles.customWidgetError}>{customWidgetErrorText}</span>\n </div>\n ) : SettingsWidget ? (\n (() => {\n const ResolvedSettingsWidget = SettingsWidget as ComponentType<any>;\n return <ResolvedSettingsWidget {...settingsWidgetProps} />;\n })()\n ) : null\n ) : null}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n </section>\n ))\n ) : (\n <div className={styles.emptyState}>No settings match the current filter.</div>\n )}\n </div>\n ),\n }));\n\n return (\n <div className={styles.page}>\n <div className={`page-header secondary-border-bottom ${styles.pageHeader}`}>\n <div className={styles.headerIntro}>\n <div className=\"form-wrapper-title\">Settings</div>\n <div className={styles.subtitle}>Manage platform configuration across modules from a single workspace.</div>\n <div className={styles.summaryChips}>\n <span className={styles.summaryChip}>{moduleEntries.length} module{moduleEntries.length === 1 ? \"\" : \"s\"}</span>\n <span className={styles.summaryChip}>{totalSettingsCount} setting{totalSettingsCount === 1 ? \"\" : \"s\"}</span>\n <button\n type=\"button\"\n className={`${styles.summaryChip} ${styles.summaryChipButton} ${filterMode === \"editable\" ? styles.summaryChipActive : \"\"}`}\n aria-pressed={filterMode === \"editable\"}\n onClick={() => setFilterMode((current) => (current === \"editable\" ? \"all\" : \"editable\"))}\n >\n {editableSettingsCount} editable\n </button>\n </div>\n </div>\n <div className={styles.headerSearch}>\n <div className={styles.searchIcon}>\n <Search size={16} />\n <SolidInput\n className={styles.searchInput}\n value={searchTerm}\n placeholder=\"Search settings, groups, or modules\"\n onChange={(event: any) => setSearchTerm(event.target.value)}\n />\n </div>\n {searchTerm ? (\n <span className={styles.resultsMeta}>\n {filteredSettings.length} result{filteredSettings.length === 1 ? \"\" : \"s\"}\n </span>\n ) : null}\n </div>\n <div className={styles.toolbarActions}>\n <div className={styles.legend}>\n <button\n type=\"button\"\n className={`${styles.readonlyFilterButton} ${filterMode === \"read-only\" ? styles.readonlyFilterButtonActive : \"\"}`}\n aria-pressed={filterMode === \"read-only\"}\n aria-label={filterMode === \"read-only\" ? \"Disable read-only filter\" : \"Enable read-only filter\"}\n onClick={() => setFilterMode((current) => (current === \"read-only\" ? \"all\" : \"read-only\"))}\n >\n <SolidTag tone=\"warn\">Read only</SolidTag>\n </button>\n <span className={filterMode === \"read-only\" ? styles.legendLabelActive : undefined}>\n {filterMode === \"read-only\" ? \"Read-only filter active\" : \"System-managed value\"}\n </span>\n <SolidTooltip>\n <SolidTooltipTrigger asChild>\n <button type=\"button\" className={styles.legendButton} aria-label=\"Read-only legend details\">\n i\n </button>\n </SolidTooltipTrigger>\n <SolidTooltipContent>\n Read-only settings are visible here for context, but can only be changed through environment or backend configuration.\n </SolidTooltipContent>\n </SolidTooltip>\n </div>\n <SolidButton size=\"sm\" type=\"button\" loading={false} onClick={handleSave} disabled={!hasChanges}>\n Save\n </SolidButton>\n </div>\n </div>\n\n <div className={styles.workspace}>\n {moduleTabs.length ? (\n <SolidTabGroup\n tabs={moduleTabs}\n value={activeModule}\n onValueChange={setActiveModule}\n className={styles.tabGroup}\n listClassName={styles.tabList}\n panelClassName={styles.tabPanel}\n orientation=\"vertical\"\n />\n ) : (\n <div className={styles.emptyState}>No settings are available.</div>\n )}\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
display: flex;
|
|
3
3
|
flex-direction: column;
|
|
4
4
|
gap: 0.6rem;
|
|
5
|
+
height: calc(100dvh - 46px);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.pageHeader {
|
|
9
|
+
flex-shrink: 0;
|
|
10
|
+
position: sticky;
|
|
11
|
+
top: 0;
|
|
12
|
+
z-index: 20;
|
|
13
|
+
background: var(--background);
|
|
5
14
|
}
|
|
6
15
|
|
|
7
16
|
.headerIntro {
|
|
@@ -150,12 +159,16 @@
|
|
|
150
159
|
border-radius: 1.25rem;
|
|
151
160
|
overflow: hidden;
|
|
152
161
|
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.05);
|
|
162
|
+
flex: 1 1 0;
|
|
163
|
+
min-height: 0;
|
|
153
164
|
}
|
|
154
165
|
|
|
155
166
|
.tabGroup {
|
|
156
167
|
display: grid;
|
|
157
168
|
grid-template-columns: minmax(210px, 236px) minmax(0, 1fr);
|
|
158
169
|
gap: 0;
|
|
170
|
+
height: 100%;
|
|
171
|
+
min-height: 0;
|
|
159
172
|
}
|
|
160
173
|
|
|
161
174
|
.tabList {
|
|
@@ -168,10 +181,14 @@
|
|
|
168
181
|
linear-gradient(180deg, color-mix(in srgb, var(--primary-color, #4f46e5) 10%, transparent), transparent 42%),
|
|
169
182
|
color-mix(in srgb, var(--surface-ground, #f8fafc) 90%, #ffffff 10%);
|
|
170
183
|
border-right: 1px solid color-mix(in srgb, var(--border) 86%, transparent);
|
|
184
|
+
overflow-y: auto;
|
|
185
|
+
min-height: 0;
|
|
171
186
|
}
|
|
172
187
|
|
|
173
188
|
.tabPanel {
|
|
174
189
|
padding: 0.85rem 0.95rem 1rem;
|
|
190
|
+
overflow-y: auto;
|
|
191
|
+
min-height: 0;
|
|
175
192
|
}
|
|
176
193
|
|
|
177
194
|
.moduleTab {
|
|
@@ -498,7 +498,7 @@ export function SettingsComponent() {
|
|
|
498
498
|
|
|
499
499
|
return (
|
|
500
500
|
<div className={styles.page}>
|
|
501
|
-
<div className=
|
|
501
|
+
<div className={`page-header secondary-border-bottom ${styles.pageHeader}`}>
|
|
502
502
|
<div className={styles.headerIntro}>
|
|
503
503
|
<div className="form-wrapper-title">Settings</div>
|
|
504
504
|
<div className={styles.subtitle}>Manage platform configuration across modules from a single workspace.</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolidChatter.d.ts","sourceRoot":"","sources":["../../../../src/components/core/chatter/SolidChatter.tsx"],"names":[],"mappings":"AA0BA,eAAO,MAAM,YAAY;uBAA+I,GAAG;QAAM,GAAG;2BAAyB,OAAO;sCAAoC,OAAO,KAAK,IAAI;;;;
|
|
1
|
+
{"version":3,"file":"SolidChatter.d.ts","sourceRoot":"","sources":["../../../../src/components/core/chatter/SolidChatter.tsx"],"names":[],"mappings":"AA0BA,eAAO,MAAM,YAAY;uBAA+I,GAAG;QAAM,GAAG;2BAAyB,OAAO;sCAAoC,OAAO,KAAK,IAAI;;;;6CA+RvQ,CAAA"}
|
|
@@ -106,7 +106,7 @@ export var SolidChatter = function (_a) {
|
|
|
106
106
|
}
|
|
107
107
|
};
|
|
108
108
|
var fetchData = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
109
|
-
var queryData, queryString, response, processedMessages, error_1;
|
|
109
|
+
var queryData, startOfDay, endOfDay, queryString, response, processedMessages, error_1;
|
|
110
110
|
var _a, _b;
|
|
111
111
|
return __generator(this, function (_c) {
|
|
112
112
|
switch (_c.label) {
|
|
@@ -120,19 +120,29 @@ export var SolidChatter = function (_a) {
|
|
|
120
120
|
queryData.filters = queryData.filters || {};
|
|
121
121
|
queryData.filters['user'] = { fullName: { $containsi: filters.name } };
|
|
122
122
|
}
|
|
123
|
+
startOfDay = function (d) {
|
|
124
|
+
var x = new Date(d);
|
|
125
|
+
x.setHours(0, 0, 0, 0);
|
|
126
|
+
return x;
|
|
127
|
+
};
|
|
128
|
+
endOfDay = function (d) {
|
|
129
|
+
var x = new Date(d);
|
|
130
|
+
x.setHours(23, 59, 59, 999);
|
|
131
|
+
return x;
|
|
132
|
+
};
|
|
123
133
|
if (filters.startDate && filters.endDate) {
|
|
124
134
|
queryData.filters = queryData.filters || {};
|
|
125
135
|
queryData.filters.createdAt = {
|
|
126
|
-
$between: [filters.startDate.toISOString(), filters.endDate.toISOString()]
|
|
136
|
+
$between: [startOfDay(filters.startDate).toISOString(), endOfDay(filters.endDate).toISOString()]
|
|
127
137
|
};
|
|
128
138
|
}
|
|
129
139
|
else if (filters.startDate) {
|
|
130
140
|
queryData.filters = queryData.filters || {};
|
|
131
|
-
queryData.filters.createdAt = { $gte: filters.startDate.toISOString() };
|
|
141
|
+
queryData.filters.createdAt = { $gte: startOfDay(filters.startDate).toISOString() };
|
|
132
142
|
}
|
|
133
143
|
else if (filters.endDate) {
|
|
134
144
|
queryData.filters = queryData.filters || {};
|
|
135
|
-
queryData.filters.createdAt = { $lte: filters.endDate.toISOString() };
|
|
145
|
+
queryData.filters.createdAt = { $lte: endOfDay(filters.endDate).toISOString() };
|
|
136
146
|
}
|
|
137
147
|
queryString = qs.stringify(queryData, {
|
|
138
148
|
encodeValuesOnly: true,
|
|
@@ -145,17 +155,19 @@ export var SolidChatter = function (_a) {
|
|
|
145
155
|
case 1:
|
|
146
156
|
response = _c.sent();
|
|
147
157
|
processedMessages = response.data.records.map(function (msg) {
|
|
148
|
-
var _a, _b, _c;
|
|
158
|
+
var _a, _b, _c, _d, _e;
|
|
149
159
|
if (msg.messageType === 'custom') {
|
|
160
|
+
var displayTimeSource = msg.updatedAt || msg.createdAt;
|
|
150
161
|
// Custom message
|
|
151
162
|
return {
|
|
152
163
|
id: msg.id,
|
|
153
164
|
user: ((_a = msg.user) === null || _a === void 0 ? void 0 : _a.fullName) || "System",
|
|
165
|
+
userId: (_b = msg.user) === null || _b === void 0 ? void 0 : _b.id,
|
|
154
166
|
messageType: "custom",
|
|
155
167
|
message: msg.messageBody,
|
|
156
|
-
time: new Date(
|
|
157
|
-
createdAt:
|
|
158
|
-
date: formatDate(
|
|
168
|
+
time: new Date(displayTimeSource).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }),
|
|
169
|
+
createdAt: displayTimeSource,
|
|
170
|
+
date: formatDate(displayTimeSource),
|
|
159
171
|
media: msg._media,
|
|
160
172
|
messageSubType: msg.messageSubType,
|
|
161
173
|
status: msg.status,
|
|
@@ -165,7 +177,7 @@ export var SolidChatter = function (_a) {
|
|
|
165
177
|
}
|
|
166
178
|
else {
|
|
167
179
|
// Audit message
|
|
168
|
-
var auditRecord = ((
|
|
180
|
+
var auditRecord = ((_c = msg.chatterMessageDetails) === null || _c === void 0 ? void 0 : _c.map(function (detail) { return ({
|
|
169
181
|
field: detail.fieldName,
|
|
170
182
|
fieldDisplayName: detail.fieldDisplayName,
|
|
171
183
|
fieldType: detail.fieldType,
|
|
@@ -184,7 +196,8 @@ export var SolidChatter = function (_a) {
|
|
|
184
196
|
}
|
|
185
197
|
return {
|
|
186
198
|
id: msg.id,
|
|
187
|
-
user: ((
|
|
199
|
+
user: ((_d = msg.user) === null || _d === void 0 ? void 0 : _d.fullName) || "System",
|
|
200
|
+
userId: (_e = msg.user) === null || _e === void 0 ? void 0 : _e.id,
|
|
188
201
|
messageType: "audit",
|
|
189
202
|
time: new Date(msg.createdAt).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }),
|
|
190
203
|
auditRecord: auditRecord,
|
|
@@ -228,7 +241,7 @@ export var SolidChatter = function (_a) {
|
|
|
228
241
|
var permissionError = function () { return (_jsx("div", { className: 'p-3', children: _jsx(SolidMessage, { severity: 'warn', text: "You do not have permission to view these messages.", className: 'justify-content-start' }) })); };
|
|
229
242
|
var renderMessages = function () { return (_jsxs("div", { className: 'flex flex-column gap-3', children: [messages.map(function (message, index) {
|
|
230
243
|
var showDateDivider = index === 0 || message.date !== messages[index - 1].date;
|
|
231
|
-
return (_jsxs("div", { children: [showDateDivider && _jsx(SolidChatterDateDivider, { date: message.date }), _jsx(SolidChatterMessageBox, { messageId: message.id, user: message.user, messageType: message.messageType, message: message.message, time: message.time, auditRecord: message.auditRecord, media: message.media, messageSubType: message.messageSubType, status: message.status, modelDisplayName: message.modelDisplayName, modelUserKey: message.modelUserKey, onRefresh: fetchData })] }, message.id));
|
|
244
|
+
return (_jsxs("div", { children: [showDateDivider && _jsx(SolidChatterDateDivider, { date: message.date }), _jsx(SolidChatterMessageBox, { messageId: message.id, user: message.user, userId: message.userId, messageType: message.messageType, message: message.message, time: message.time, auditRecord: message.auditRecord, media: message.media, messageSubType: message.messageSubType, status: message.status, modelDisplayName: message.modelDisplayName, modelUserKey: message.modelUserKey, onRefresh: fetchData })] }, message.id));
|
|
232
245
|
}), totalRecords > messages.length && (_jsx("div", { className: 'flex justify-content-center', children: _jsx(SolidButton, { type: 'button', size: 'sm', variant: 'outline', onClick: handleLoadMore, children: "Load more" }) }))] })); };
|
|
233
246
|
return (_jsxs("div", { className: 'h-full', children: [_jsx(SolidChatterHeader, { id: id, refetch: fetchData, modelSingularName: modelSingularName, activeTab: activeTab, handleTabClick: handleTabClick, visibleBox: visibleBox, onFilterChange: handleFilterChange, onComposerCancel: function () { return setVisibleBox(null); }, title: title, modelUserKey: modelUserKey }), _jsx("div", { className: 'solid-chatter-body', style: {
|
|
234
247
|
height: isMobileViewport
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolidChatter.js","sourceRoot":"","sources":["../../../../src/components/core/chatter/SolidChatter.tsx"],"names":[],"mappings":"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","sourcesContent":["\nimport React, { useState, useEffect } from 'react'\nimport { SolidChatterHeader } from './SolidChatterHeader'\nimport { SolidChatterDateDivider } from './SolidChatterDateDivider'\nimport { SolidChatterMessageBox } from './SolidChatterMessageBox'\nimport { useLazyGetchatterMessageQuery } from '../../../redux/api/solidChatterMessageApi'\nimport qs from \"qs\";\nimport { ERROR_MESSAGES } from '../../../constants/error-messages'\nimport { permissionExpression } from '../../../helpers/permissions'\nimport { SolidButton, SolidMessage } from '../../shad-cn-ui'\nimport { Inbox, Loader2 } from 'lucide-react'\n\ninterface FilterState {\n name: string;\n startDate: Date | null;\n endDate: Date | null;\n}\n\nconst isEmptyAuditValue = (value: string | null | undefined) => {\n if (value == null) return true;\n if (typeof value !== 'string') return false;\n\n const normalizedValue = value.trim().toLowerCase();\n return normalizedValue === '' || normalizedValue === 'none' || normalizedValue === 'null';\n};\n\nexport const SolidChatter = ({ modelSingularName, id, refreshChatterMessage, setRefreshChatterMessage, actionsAllowed = [], title, modelUserKey }: { modelSingularName: any, id: any, refreshChatterMessage: boolean, setRefreshChatterMessage: (value: boolean) => void, actionsAllowed?: string[], title?: string, modelUserKey?: string }) => {\n const [activeTab, setActiveTab] = useState<'email-message' | 'log' | null>('email-message');\n const [visibleBox, setVisibleBox] = useState<'email-message' | 'log' | null>(null);\n const [messages, setMessages] = useState<any[]>([]);\n const [limit, setLimit] = useState<number>(25);\n const [totalRecords, setTotalRecords] = useState<number>(0);\n const [filters, setFilters] = useState<FilterState>({\n name: '',\n startDate: null,\n endDate: null\n });\n const [isMobileViewport, setIsMobileViewport] = useState(false);\n\n const [getchatterMessage, { isLoading: isChatterLoading }] = useLazyGetchatterMessageQuery();\n\n useEffect(() => {\n const updateViewport = () => setIsMobileViewport(window.innerWidth <= 1199);\n updateViewport();\n window.addEventListener('resize', updateViewport);\n return () => window.removeEventListener('resize', updateViewport);\n }, []);\n\n useEffect(() => {\n if (refreshChatterMessage) {\n if (id !== 'new') {\n fetchData();\n setRefreshChatterMessage(false);\n }\n }\n }, [refreshChatterMessage]);\n\n useEffect(() => {\n if (id !== 'new') {\n fetchData();\n }\n }, [filters, limit]);\n\n const handleTabClick = (tab: 'email-message' | 'log') => {\n setActiveTab(tab);\n setVisibleBox(prev => (prev === tab ? null : tab));\n }\n\n const formatDate = (dateString: string) => {\n const date = new Date(dateString);\n const today = new Date();\n const yesterday = new Date(today);\n yesterday.setDate(yesterday.getDate() - 1);\n\n if (date.toDateString() === today.toDateString()) {\n return 'Today';\n } else if (date.toDateString() === yesterday.toDateString()) {\n return 'Yesterday';\n } else {\n return dateString;\n }\n };\n\n const fetchData = async () => {\n try {\n const queryData: any = {\n populate: ['user', 'chatterMessageDetails'],\n limit: limit\n };\n\n if (filters.name) {\n queryData.filters = queryData.filters || {};\n queryData.filters['user'] = { fullName: { $containsi: filters.name }};\n }\n if (filters.startDate && filters.endDate) {\n queryData.filters = queryData.filters || {};\n queryData.filters.createdAt = {\n $between: [filters.startDate.toISOString(), filters.endDate.toISOString()]\n };\n } else if (filters.startDate) {\n queryData.filters = queryData.filters || {};\n queryData.filters.createdAt = { $gte: filters.startDate.toISOString() };\n } else if (filters.endDate) {\n queryData.filters = queryData.filters || {};\n queryData.filters.createdAt = { $lte: filters.endDate.toISOString() };\n }\n\n const queryString = qs.stringify(queryData, {\n encodeValuesOnly: true,\n });\n const response = await getchatterMessage({\n entityId: id,\n entityName: modelSingularName,\n qs: queryString\n }).unwrap();\n const processedMessages = response.data.records.map((msg: any) => {\n if (msg.messageType === 'custom') {\n // Custom message\n return {\n id: msg.id,\n user: msg.user?.fullName || \"System\",\n messageType: \"custom\",\n message: msg.messageBody,\n time: new Date(msg.createdAt).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }),\n createdAt: msg.createdAt,\n date: formatDate(msg.createdAt),\n media: msg._media,\n messageSubType: msg.messageSubType,\n status: msg.status,\n modelDisplayName: msg.modelDisplayName,\n modelUserKey: msg.modelUserKey\n };\n } else {\n // Audit message\n const auditRecord = msg.chatterMessageDetails?.map((detail: any) => ({\n field: detail.fieldName,\n fieldDisplayName: detail.fieldDisplayName,\n fieldType: detail.fieldType,\n previous: detail.oldValue,\n current: detail.newValue,\n previousDisplay: detail.oldValueDisplay,\n currentDisplay: detail.newValueDisplay,\n })).filter((detail: any) => {\n const previousValue = detail.previousDisplay ?? detail.previous;\n const currentValue = detail.currentDisplay ?? detail.current;\n\n return !(isEmptyAuditValue(previousValue) && isEmptyAuditValue(currentValue));\n }) || [];\n\n if (auditRecord.length === 0) {\n return null;\n }\n\n return {\n id: msg.id,\n user: msg.user?.fullName || \"System\",\n messageType: \"audit\",\n time: new Date(msg.createdAt).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }),\n auditRecord: auditRecord,\n createdAt: msg.createdAt,\n date: formatDate(msg.createdAt),\n messageSubType: msg.messageSubType,\n modelDisplayName: msg.modelDisplayName,\n modelUserKey: msg.modelUserKey,\n message: msg.messageBody,\n };\n }\n }).filter(Boolean);\n setMessages(processedMessages);\n setTotalRecords(response?.data?.meta?.totalRecords || 0);\n } catch (error) {\n console.error(ERROR_MESSAGES.FETCHING_MESSAGE, error);\n }\n }\n\n const handleFilterChange = (newFilters: FilterState) => {\n setFilters({\n name: newFilters.name,\n startDate: newFilters.startDate,\n endDate: newFilters.endDate\n });\n setLimit(25);\n };\n\n const handleLoadMore = () => {\n setLimit(prevLimit => prevLimit + 25);\n };\n\n const canViewMessages = actionsAllowed.includes(`${permissionExpression('chatterMessage', 'findMany')}`);\n\n const renderLoadingState = () => (\n <div className='flex flex-column align-items-center justify-content-center gap-2 h-full text-center text-color-secondary'>\n <Loader2 size={20} className='text-primary animate-spin' />\n <span className='text-sm'>Loading recent activity…</span>\n </div>\n );\n\n const renderEmptyState = () => {\n const isLogComposerOpen = visibleBox === 'log';\n return (\n <div className='flex align-items-center justify-content-center h-full'>\n <div className='flex flex-column align-items-center gap-2 text-center text-color-secondary px-3'>\n <div className='p-2 border-round bg-primary-reverse text-primary'>\n <Inbox size={20} />\n </div>\n <p className='m-0 text-base font-medium text-color'>No activity yet</p>\n <p className='m-0 text-sm'>Log your first internal note or send a message to get things started.</p>\n <SolidButton size='sm' variant='outline' onClick={() => handleTabClick('log')}>\n {isLogComposerOpen ? 'Cancel' : 'Log a note'}\n </SolidButton>\n </div>\n </div>\n );\n };\n\n const permissionError = () => (\n <div className='p-3'>\n <SolidMessage severity='warn' text=\"You do not have permission to view these messages.\" className='justify-content-start' />\n </div>\n );\n\n const renderMessages = () => (\n <div className='flex flex-column gap-3'>\n {messages.map((message, index) => {\n const showDateDivider = index === 0 || message.date !== messages[index - 1].date;\n return (\n <div key={message.id}>\n {showDateDivider && <SolidChatterDateDivider date={message.date} />}\n <SolidChatterMessageBox\n messageId={message.id}\n user={message.user}\n messageType={message.messageType}\n message={message.message}\n time={message.time}\n auditRecord={message.auditRecord}\n media={message.media}\n messageSubType={message.messageSubType}\n status={message.status}\n modelDisplayName={message.modelDisplayName}\n modelUserKey={message.modelUserKey}\n onRefresh={fetchData}\n />\n </div>\n );\n })}\n {totalRecords > messages.length && (\n <div className='flex justify-content-center'>\n <SolidButton\n type='button'\n size='sm'\n variant='outline'\n onClick={handleLoadMore}\n >\n Load more\n </SolidButton>\n </div>\n )}\n </div>\n );\n\n return (\n <div className='h-full'>\n <SolidChatterHeader\n id={id}\n refetch={fetchData}\n modelSingularName={modelSingularName}\n activeTab={activeTab}\n handleTabClick={handleTabClick}\n visibleBox={visibleBox}\n onFilterChange={handleFilterChange}\n onComposerCancel={() => setVisibleBox(null)}\n title={title}\n modelUserKey={modelUserKey}\n />\n <div className='solid-chatter-body' style={{\n height:\n isMobileViewport\n ? (visibleBox === 'email-message'\n ? 'calc(100dvh - 248px)'\n : visibleBox === 'log'\n ? 'calc(100dvh - 210px)'\n : 'calc(100dvh - 60px)')\n : (visibleBox === 'email-message'\n ? 'calc(100vh - 196px)'\n : visibleBox === 'log'\n ? 'calc(100vh - 292px)'\n : 'calc(100vh - 127px)'),\n }}>\n {isChatterLoading\n ? renderLoadingState()\n : !canViewMessages\n ? permissionError()\n : messages.length === 0\n ? renderEmptyState()\n : renderMessages()\n }\n </div>\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SolidChatter.js","sourceRoot":"","sources":["../../../../src/components/core/chatter/SolidChatter.tsx"],"names":[],"mappings":"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","sourcesContent":["\nimport React, { useState, useEffect } from 'react'\nimport { SolidChatterHeader } from './SolidChatterHeader'\nimport { SolidChatterDateDivider } from './SolidChatterDateDivider'\nimport { SolidChatterMessageBox } from './SolidChatterMessageBox'\nimport { useLazyGetchatterMessageQuery } from '../../../redux/api/solidChatterMessageApi'\nimport qs from \"qs\";\nimport { ERROR_MESSAGES } from '../../../constants/error-messages'\nimport { permissionExpression } from '../../../helpers/permissions'\nimport { SolidButton, SolidMessage } from '../../shad-cn-ui'\nimport { Inbox, Loader2 } from 'lucide-react'\n\ninterface FilterState {\n name: string;\n startDate: Date | null;\n endDate: Date | null;\n}\n\nconst isEmptyAuditValue = (value: string | null | undefined) => {\n if (value == null) return true;\n if (typeof value !== 'string') return false;\n\n const normalizedValue = value.trim().toLowerCase();\n return normalizedValue === '' || normalizedValue === 'none' || normalizedValue === 'null';\n};\n\nexport const SolidChatter = ({ modelSingularName, id, refreshChatterMessage, setRefreshChatterMessage, actionsAllowed = [], title, modelUserKey }: { modelSingularName: any, id: any, refreshChatterMessage: boolean, setRefreshChatterMessage: (value: boolean) => void, actionsAllowed?: string[], title?: string, modelUserKey?: string }) => {\n const [activeTab, setActiveTab] = useState<'email-message' | 'log' | null>('email-message');\n const [visibleBox, setVisibleBox] = useState<'email-message' | 'log' | null>(null);\n const [messages, setMessages] = useState<any[]>([]);\n const [limit, setLimit] = useState<number>(25);\n const [totalRecords, setTotalRecords] = useState<number>(0);\n const [filters, setFilters] = useState<FilterState>({\n name: '',\n startDate: null,\n endDate: null\n });\n const [isMobileViewport, setIsMobileViewport] = useState(false);\n\n const [getchatterMessage, { isLoading: isChatterLoading }] = useLazyGetchatterMessageQuery();\n\n useEffect(() => {\n const updateViewport = () => setIsMobileViewport(window.innerWidth <= 1199);\n updateViewport();\n window.addEventListener('resize', updateViewport);\n return () => window.removeEventListener('resize', updateViewport);\n }, []);\n\n useEffect(() => {\n if (refreshChatterMessage) {\n if (id !== 'new') {\n fetchData();\n setRefreshChatterMessage(false);\n }\n }\n }, [refreshChatterMessage]);\n\n useEffect(() => {\n if (id !== 'new') {\n fetchData();\n }\n }, [filters, limit]);\n\n const handleTabClick = (tab: 'email-message' | 'log') => {\n setActiveTab(tab);\n setVisibleBox(prev => (prev === tab ? null : tab));\n }\n\n const formatDate = (dateString: string) => {\n const date = new Date(dateString);\n const today = new Date();\n const yesterday = new Date(today);\n yesterday.setDate(yesterday.getDate() - 1);\n\n if (date.toDateString() === today.toDateString()) {\n return 'Today';\n } else if (date.toDateString() === yesterday.toDateString()) {\n return 'Yesterday';\n } else {\n return dateString;\n }\n };\n\n const fetchData = async () => {\n try {\n const queryData: any = {\n populate: ['user', 'chatterMessageDetails'],\n limit: limit\n };\n\n if (filters.name) {\n queryData.filters = queryData.filters || {};\n queryData.filters['user'] = { fullName: { $containsi: filters.name }};\n }\n const startOfDay = (d: Date) => {\n const x = new Date(d);\n x.setHours(0, 0, 0, 0);\n return x;\n };\n const endOfDay = (d: Date) => {\n const x = new Date(d);\n x.setHours(23, 59, 59, 999);\n return x;\n };\n if (filters.startDate && filters.endDate) {\n queryData.filters = queryData.filters || {};\n queryData.filters.createdAt = {\n $between: [startOfDay(filters.startDate).toISOString(), endOfDay(filters.endDate).toISOString()]\n };\n } else if (filters.startDate) {\n queryData.filters = queryData.filters || {};\n queryData.filters.createdAt = { $gte: startOfDay(filters.startDate).toISOString() };\n } else if (filters.endDate) {\n queryData.filters = queryData.filters || {};\n queryData.filters.createdAt = { $lte: endOfDay(filters.endDate).toISOString() };\n }\n\n const queryString = qs.stringify(queryData, {\n encodeValuesOnly: true,\n });\n const response = await getchatterMessage({\n entityId: id,\n entityName: modelSingularName,\n qs: queryString\n }).unwrap();\n const processedMessages = response.data.records.map((msg: any) => {\n if (msg.messageType === 'custom') {\n const displayTimeSource = msg.updatedAt || msg.createdAt;\n // Custom message\n return {\n id: msg.id,\n user: msg.user?.fullName || \"System\",\n userId: msg.user?.id,\n messageType: \"custom\",\n message: msg.messageBody,\n time: new Date(displayTimeSource).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }),\n createdAt: displayTimeSource,\n date: formatDate(displayTimeSource),\n media: msg._media,\n messageSubType: msg.messageSubType,\n status: msg.status,\n modelDisplayName: msg.modelDisplayName,\n modelUserKey: msg.modelUserKey\n };\n } else {\n // Audit message\n const auditRecord = msg.chatterMessageDetails?.map((detail: any) => ({\n field: detail.fieldName,\n fieldDisplayName: detail.fieldDisplayName,\n fieldType: detail.fieldType,\n previous: detail.oldValue,\n current: detail.newValue,\n previousDisplay: detail.oldValueDisplay,\n currentDisplay: detail.newValueDisplay,\n })).filter((detail: any) => {\n const previousValue = detail.previousDisplay ?? detail.previous;\n const currentValue = detail.currentDisplay ?? detail.current;\n\n return !(isEmptyAuditValue(previousValue) && isEmptyAuditValue(currentValue));\n }) || [];\n\n if (auditRecord.length === 0) {\n return null;\n }\n\n return {\n id: msg.id,\n user: msg.user?.fullName || \"System\",\n userId: msg.user?.id,\n messageType: \"audit\",\n time: new Date(msg.createdAt).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }),\n auditRecord: auditRecord,\n createdAt: msg.createdAt,\n date: formatDate(msg.createdAt),\n messageSubType: msg.messageSubType,\n modelDisplayName: msg.modelDisplayName,\n modelUserKey: msg.modelUserKey,\n message: msg.messageBody,\n };\n }\n }).filter(Boolean);\n setMessages(processedMessages);\n setTotalRecords(response?.data?.meta?.totalRecords || 0);\n } catch (error) {\n console.error(ERROR_MESSAGES.FETCHING_MESSAGE, error);\n }\n }\n\n const handleFilterChange = (newFilters: FilterState) => {\n setFilters({\n name: newFilters.name,\n startDate: newFilters.startDate,\n endDate: newFilters.endDate\n });\n setLimit(25);\n };\n\n const handleLoadMore = () => {\n setLimit(prevLimit => prevLimit + 25);\n };\n\n const canViewMessages = actionsAllowed.includes(`${permissionExpression('chatterMessage', 'findMany')}`);\n\n const renderLoadingState = () => (\n <div className='flex flex-column align-items-center justify-content-center gap-2 h-full text-center text-color-secondary'>\n <Loader2 size={20} className='text-primary animate-spin' />\n <span className='text-sm'>Loading recent activity…</span>\n </div>\n );\n\n const renderEmptyState = () => {\n const isLogComposerOpen = visibleBox === 'log';\n return (\n <div className='flex align-items-center justify-content-center h-full'>\n <div className='flex flex-column align-items-center gap-2 text-center text-color-secondary px-3'>\n <div className='p-2 border-round bg-primary-reverse text-primary'>\n <Inbox size={20} />\n </div>\n <p className='m-0 text-base font-medium text-color'>No activity yet</p>\n <p className='m-0 text-sm'>Log your first internal note or send a message to get things started.</p>\n <SolidButton size='sm' variant='outline' onClick={() => handleTabClick('log')}>\n {isLogComposerOpen ? 'Cancel' : 'Log a note'}\n </SolidButton>\n </div>\n </div>\n );\n };\n\n const permissionError = () => (\n <div className='p-3'>\n <SolidMessage severity='warn' text=\"You do not have permission to view these messages.\" className='justify-content-start' />\n </div>\n );\n\n const renderMessages = () => (\n <div className='flex flex-column gap-3'>\n {messages.map((message, index) => {\n const showDateDivider = index === 0 || message.date !== messages[index - 1].date;\n return (\n <div key={message.id}>\n {showDateDivider && <SolidChatterDateDivider date={message.date} />}\n <SolidChatterMessageBox\n messageId={message.id}\n user={message.user}\n userId={message.userId}\n messageType={message.messageType}\n message={message.message}\n time={message.time}\n auditRecord={message.auditRecord}\n media={message.media}\n messageSubType={message.messageSubType}\n status={message.status}\n modelDisplayName={message.modelDisplayName}\n modelUserKey={message.modelUserKey}\n onRefresh={fetchData}\n />\n </div>\n );\n })}\n {totalRecords > messages.length && (\n <div className='flex justify-content-center'>\n <SolidButton\n type='button'\n size='sm'\n variant='outline'\n onClick={handleLoadMore}\n >\n Load more\n </SolidButton>\n </div>\n )}\n </div>\n );\n\n return (\n <div className='h-full'>\n <SolidChatterHeader\n id={id}\n refetch={fetchData}\n modelSingularName={modelSingularName}\n activeTab={activeTab}\n handleTabClick={handleTabClick}\n visibleBox={visibleBox}\n onFilterChange={handleFilterChange}\n onComposerCancel={() => setVisibleBox(null)}\n title={title}\n modelUserKey={modelUserKey}\n />\n <div className='solid-chatter-body' style={{\n height:\n isMobileViewport\n ? (visibleBox === 'email-message'\n ? 'calc(100dvh - 248px)'\n : visibleBox === 'log'\n ? 'calc(100dvh - 210px)'\n : 'calc(100dvh - 60px)')\n : (visibleBox === 'email-message'\n ? 'calc(100vh - 196px)'\n : visibleBox === 'log'\n ? 'calc(100vh - 292px)'\n : 'calc(100vh - 127px)'),\n }}>\n {isChatterLoading\n ? renderLoadingState()\n : !canViewMessages\n ? permissionError()\n : messages.length === 0\n ? renderEmptyState()\n : renderMessages()\n }\n </div>\n </div>\n )\n}\n"]}
|
|
@@ -92,17 +92,27 @@ export const SolidChatter = ({ modelSingularName, id, refreshChatterMessage, set
|
|
|
92
92
|
queryData.filters = queryData.filters || {};
|
|
93
93
|
queryData.filters['user'] = { fullName: { $containsi: filters.name }};
|
|
94
94
|
}
|
|
95
|
+
const startOfDay = (d: Date) => {
|
|
96
|
+
const x = new Date(d);
|
|
97
|
+
x.setHours(0, 0, 0, 0);
|
|
98
|
+
return x;
|
|
99
|
+
};
|
|
100
|
+
const endOfDay = (d: Date) => {
|
|
101
|
+
const x = new Date(d);
|
|
102
|
+
x.setHours(23, 59, 59, 999);
|
|
103
|
+
return x;
|
|
104
|
+
};
|
|
95
105
|
if (filters.startDate && filters.endDate) {
|
|
96
106
|
queryData.filters = queryData.filters || {};
|
|
97
107
|
queryData.filters.createdAt = {
|
|
98
|
-
$between: [filters.startDate.toISOString(), filters.endDate.toISOString()]
|
|
108
|
+
$between: [startOfDay(filters.startDate).toISOString(), endOfDay(filters.endDate).toISOString()]
|
|
99
109
|
};
|
|
100
110
|
} else if (filters.startDate) {
|
|
101
111
|
queryData.filters = queryData.filters || {};
|
|
102
|
-
queryData.filters.createdAt = { $gte: filters.startDate.toISOString() };
|
|
112
|
+
queryData.filters.createdAt = { $gte: startOfDay(filters.startDate).toISOString() };
|
|
103
113
|
} else if (filters.endDate) {
|
|
104
114
|
queryData.filters = queryData.filters || {};
|
|
105
|
-
queryData.filters.createdAt = { $lte: filters.endDate.toISOString() };
|
|
115
|
+
queryData.filters.createdAt = { $lte: endOfDay(filters.endDate).toISOString() };
|
|
106
116
|
}
|
|
107
117
|
|
|
108
118
|
const queryString = qs.stringify(queryData, {
|
|
@@ -115,15 +125,17 @@ export const SolidChatter = ({ modelSingularName, id, refreshChatterMessage, set
|
|
|
115
125
|
}).unwrap();
|
|
116
126
|
const processedMessages = response.data.records.map((msg: any) => {
|
|
117
127
|
if (msg.messageType === 'custom') {
|
|
128
|
+
const displayTimeSource = msg.updatedAt || msg.createdAt;
|
|
118
129
|
// Custom message
|
|
119
130
|
return {
|
|
120
131
|
id: msg.id,
|
|
121
132
|
user: msg.user?.fullName || "System",
|
|
133
|
+
userId: msg.user?.id,
|
|
122
134
|
messageType: "custom",
|
|
123
135
|
message: msg.messageBody,
|
|
124
|
-
time: new Date(
|
|
125
|
-
createdAt:
|
|
126
|
-
date: formatDate(
|
|
136
|
+
time: new Date(displayTimeSource).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }),
|
|
137
|
+
createdAt: displayTimeSource,
|
|
138
|
+
date: formatDate(displayTimeSource),
|
|
127
139
|
media: msg._media,
|
|
128
140
|
messageSubType: msg.messageSubType,
|
|
129
141
|
status: msg.status,
|
|
@@ -154,6 +166,7 @@ export const SolidChatter = ({ modelSingularName, id, refreshChatterMessage, set
|
|
|
154
166
|
return {
|
|
155
167
|
id: msg.id,
|
|
156
168
|
user: msg.user?.fullName || "System",
|
|
169
|
+
userId: msg.user?.id,
|
|
157
170
|
messageType: "audit",
|
|
158
171
|
time: new Date(msg.createdAt).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }),
|
|
159
172
|
auditRecord: auditRecord,
|
|
@@ -229,6 +242,7 @@ export const SolidChatter = ({ modelSingularName, id, refreshChatterMessage, set
|
|
|
229
242
|
<SolidChatterMessageBox
|
|
230
243
|
messageId={message.id}
|
|
231
244
|
user={message.user}
|
|
245
|
+
userId={message.userId}
|
|
232
246
|
messageType={message.messageType}
|
|
233
247
|
message={message.message}
|
|
234
248
|
time={message.time}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolidChatterHeader.d.ts","sourceRoot":"","sources":["../../../../src/components/core/chatter/SolidChatterHeader.tsx"],"names":[],"mappings":"AAkBA,UAAU,WAAW;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB;AAED,UAAU,KAAK;IACX,SAAS,EAAE,GAAG,CAAC;IACf,cAAc,EAAE,GAAG,CAAC;IACpB,UAAU,EAAE,GAAG,CAAC;IAChB,iBAAiB,EAAE,GAAG,CAAC;IACvB,OAAO,EAAE,GAAG,CAAC;IACb,EAAE,EAAE,GAAG,CAAC;IACR,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAChD,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,kBAAkB,UAAW,KAAK,
|
|
1
|
+
{"version":3,"file":"SolidChatterHeader.d.ts","sourceRoot":"","sources":["../../../../src/components/core/chatter/SolidChatterHeader.tsx"],"names":[],"mappings":"AAkBA,UAAU,WAAW;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB;AAED,UAAU,KAAK;IACX,SAAS,EAAE,GAAG,CAAC;IACf,cAAc,EAAE,GAAG,CAAC;IACpB,UAAU,EAAE,GAAG,CAAC;IAChB,iBAAiB,EAAE,GAAG,CAAC;IACvB,OAAO,EAAE,GAAG,CAAC;IACb,EAAE,EAAE,GAAG,CAAC;IACR,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAChD,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,kBAAkB,UAAW,KAAK,4CA8N9C,CAAA"}
|