@solidxai/core-ui 0.1.13-beta.3 → 0.1.13-beta.5
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/auth/AuthTabs.d.ts.map +1 -1
- package/dist/components/auth/AuthTabs.js +1 -1
- package/dist/components/auth/AuthTabs.js.map +1 -1
- package/dist/components/auth/AuthTabs.tsx +1 -0
- package/dist/components/auth/SolidChangeForcePassword.d.ts.map +1 -1
- package/dist/components/auth/SolidChangeForcePassword.js +2 -2
- package/dist/components/auth/SolidChangeForcePassword.js.map +1 -1
- package/dist/components/auth/SolidChangeForcePassword.tsx +9 -8
- package/dist/components/common/SettingsComponent.d.ts.map +1 -1
- package/dist/components/common/SettingsComponent.js +1 -1
- package/dist/components/common/SettingsComponent.js.map +1 -1
- package/dist/components/common/SettingsComponent.tsx +1 -0
- package/dist/components/common/SolidFieldTooltip.d.ts.map +1 -1
- package/dist/components/common/SolidFieldTooltip.js +1 -33
- package/dist/components/common/SolidFieldTooltip.js.map +1 -1
- package/dist/components/common/SolidFieldTooltip.tsx +8 -64
- package/dist/components/common/SolidMaterialSymbol.d.ts +1 -1
- package/dist/components/common/SolidMaterialSymbol.d.ts.map +1 -1
- package/dist/components/common/SolidMaterialSymbol.js +6 -37
- package/dist/components/common/SolidMaterialSymbol.js.map +1 -1
- package/dist/components/common/SolidMaterialSymbol.tsx +6 -54
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts.map +1 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js +2 -2
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js.map +1 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx +2 -0
- package/dist/components/core/card/CardItem.d.ts.map +1 -1
- package/dist/components/core/card/CardItem.js +1 -1
- package/dist/components/core/card/CardItem.js.map +1 -1
- package/dist/components/core/card/CardItem.tsx +16 -14
- package/dist/components/core/card/SolidCardView.d.ts.map +1 -1
- package/dist/components/core/card/SolidCardView.js +75 -51
- package/dist/components/core/card/SolidCardView.js.map +1 -1
- package/dist/components/core/card/SolidCardView.tsx +61 -35
- package/dist/components/core/card/SolidCardViewConfigure.d.ts.map +1 -1
- package/dist/components/core/card/SolidCardViewConfigure.js +3 -7
- package/dist/components/core/card/SolidCardViewConfigure.js.map +1 -1
- package/dist/components/core/card/SolidCardViewConfigure.tsx +3 -9
- package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.module.css +99 -0
- package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.d.ts.map +1 -1
- package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.js +76 -5
- package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.js.map +1 -1
- package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.tsx +39 -4
- package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.js +172 -124
- package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.tsx +73 -84
- package/dist/components/core/common/globalSearchPersistence.d.ts +3 -0
- package/dist/components/core/common/globalSearchPersistence.d.ts.map +1 -1
- package/dist/components/core/common/globalSearchPersistence.js +33 -24
- package/dist/components/core/common/globalSearchPersistence.js.map +1 -1
- package/dist/components/core/common/globalSearchPersistence.ts +34 -27
- package/dist/components/core/filter/fields/SolidMediaMultipleField.js +2 -2
- package/dist/components/core/filter/fields/SolidMediaMultipleField.js.map +1 -1
- package/dist/components/core/filter/fields/SolidMediaMultipleField.tsx +2 -2
- package/dist/components/core/filter/fields/SolidMediaSingleField.js +2 -2
- package/dist/components/core/filter/fields/SolidMediaSingleField.js.map +1 -1
- package/dist/components/core/filter/fields/SolidMediaSingleField.tsx +2 -2
- package/dist/components/core/filter/fields/SolidShortTextField.js +2 -2
- package/dist/components/core/filter/fields/SolidShortTextField.js.map +1 -1
- package/dist/components/core/filter/fields/SolidShortTextField.tsx +2 -2
- package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
- package/dist/components/core/form/SolidFormView.js +2 -10
- package/dist/components/core/form/SolidFormView.js.map +1 -1
- package/dist/components/core/form/SolidFormView.tsx +2 -10
- package/dist/components/core/kanban/KanbanCard.d.ts.map +1 -1
- package/dist/components/core/kanban/KanbanCard.js +1 -1
- package/dist/components/core/kanban/KanbanCard.js.map +1 -1
- package/dist/components/core/kanban/KanbanCard.tsx +18 -16
- package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.js +73 -59
- package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.tsx +57 -22
- package/dist/components/core/kanban/SolidKanbanViewConfigure.d.ts +1 -1
- package/dist/components/core/kanban/SolidKanbanViewConfigure.d.ts.map +1 -1
- package/dist/components/core/kanban/SolidKanbanViewConfigure.js +14 -9
- package/dist/components/core/kanban/SolidKanbanViewConfigure.js.map +1 -1
- package/dist/components/core/kanban/SolidKanbanViewConfigure.tsx +38 -9
- package/dist/components/core/list/SolidEmptyListViewPlaceholder.d.ts.map +1 -1
- package/dist/components/core/list/SolidEmptyListViewPlaceholder.js +2 -3
- package/dist/components/core/list/SolidEmptyListViewPlaceholder.js.map +1 -1
- package/dist/components/core/list/SolidEmptyListViewPlaceholder.tsx +2 -3
- package/dist/components/core/list/SolidListView.d.ts.map +1 -1
- package/dist/components/core/list/SolidListView.js +8 -16
- package/dist/components/core/list/SolidListView.js.map +1 -1
- package/dist/components/core/list/SolidListView.tsx +9 -15
- package/dist/components/core/list/SolidListViewConfigure.d.ts.map +1 -1
- package/dist/components/core/list/SolidListViewConfigure.js +22 -16
- package/dist/components/core/list/SolidListViewConfigure.js.map +1 -1
- package/dist/components/core/list/SolidListViewConfigure.tsx +32 -11
- package/dist/components/core/list/SolidListViewHeaderContextMenuButton.d.ts +1 -1
- package/dist/components/core/list/SolidListViewHeaderContextMenuButton.d.ts.map +1 -1
- package/dist/components/core/list/SolidListViewHeaderContextMenuButton.js +3 -1
- package/dist/components/core/list/SolidListViewHeaderContextMenuButton.js.map +1 -1
- package/dist/components/core/list/SolidListViewHeaderContextMenuButton.tsx +3 -1
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.js +7 -0
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.tsx +5 -0
- package/dist/components/core/list/columns/SolidMediaSingleColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidMediaSingleColumn.js +3 -0
- package/dist/components/core/list/columns/SolidMediaSingleColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidMediaSingleColumn.tsx +2 -0
- package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.d.ts.map +1 -1
- package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.js +3 -0
- package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.js.map +1 -1
- package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.tsx +2 -0
- package/dist/components/core/model/CreateModel.css +10 -0
- package/dist/components/core/model/FieldMetaDataForm.css +10 -0
- package/dist/components/core/model/FieldMetaDataForm.js +8 -8
- package/dist/components/core/model/FieldMetaDataForm.js.map +1 -1
- package/dist/components/core/model/FieldMetaDataForm.tsx +13 -13
- package/dist/components/core/module/ModuleMetadataExplorer.css +23 -0
- package/dist/components/core/module/ModuleMetadataExplorer.d.ts.map +1 -1
- package/dist/components/core/module/ModuleMetadataExplorer.js +1 -1
- package/dist/components/core/module/ModuleMetadataExplorer.js.map +1 -1
- package/dist/components/core/module/ModuleMetadataExplorer.tsx +9 -0
- package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -1
- package/dist/components/core/tree/SolidTreeView.js +251 -152
- package/dist/components/core/tree/SolidTreeView.js.map +1 -1
- package/dist/components/core/tree/SolidTreeView.tsx +222 -106
- package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.d.ts.map +1 -1
- package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.js +1 -1
- package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.js.map +1 -1
- package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.tsx +1 -0
- package/dist/components/layout/AdminHeaderActions.js +6 -13
- package/dist/components/layout/AdminHeaderActions.js.map +1 -1
- package/dist/components/layout/AdminHeaderActions.tsx +11 -11
- package/dist/components/layout/AdminLayout.d.ts.map +1 -1
- package/dist/components/layout/AdminLayout.js +2 -2
- package/dist/components/layout/AdminLayout.js.map +1 -1
- package/dist/components/layout/AdminLayout.tsx +5 -4
- package/dist/components/layout/AppSidebar.d.ts.map +1 -1
- package/dist/components/layout/AppSidebar.js +17 -2
- package/dist/components/layout/AppSidebar.js.map +1 -1
- package/dist/components/layout/AppSidebar.tsx +21 -2
- package/dist/components/shad-cn-ui/SolidDatePicker.d.ts +1 -1
- package/dist/components/shad-cn-ui/SolidDatePicker.d.ts.map +1 -1
- package/dist/components/shad-cn-ui/SolidDatePicker.js +35 -3
- package/dist/components/shad-cn-ui/SolidDatePicker.js.map +1 -1
- package/dist/components/shad-cn-ui/SolidDatePicker.tsx +84 -0
- package/dist/components/shad-cn-ui/SolidTooltip.d.ts.map +1 -1
- package/dist/components/shad-cn-ui/SolidTooltip.js +55 -2
- package/dist/components/shad-cn-ui/SolidTooltip.js.map +1 -1
- package/dist/components/shad-cn-ui/SolidTooltip.tsx +95 -1
- package/dist/helpers/permissions.d.ts +13 -0
- package/dist/helpers/permissions.d.ts.map +1 -1
- package/dist/helpers/permissions.js +79 -0
- package/dist/helpers/permissions.js.map +1 -1
- package/dist/helpers/permissions.ts +92 -1
- package/dist/resources/globals.css +109 -1
- package/dist/resources/solid-custom.css +53 -3
- package/dist/resources/solid-tailwind-generated.css +1 -1
- package/dist/routes/pages/admin/core/DashboardPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/DashboardPage.js +2 -2
- package/dist/routes/pages/admin/core/DashboardPage.js.map +1 -1
- package/dist/routes/pages/admin/core/DashboardPage.tsx +2 -0
- package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.js +1 -1
- package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.js.map +1 -1
- package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.tsx +1 -0
- package/dist/types/css-modules.d.ts +2 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolidDatePicker.js","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidDatePicker.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport ReactDatePicker from \"react-datepicker\";\nimport \"react-datepicker/dist/react-datepicker.css\";\nimport { SolidInput } from \"./SolidInput\";\n\ntype SolidDatePickerProps = React.ComponentProps<typeof ReactDatePicker> & {\n timeOnly?: boolean;\n inputClassName?: string;\n};\n\ntype SolidDatePickerInputProps = React.InputHTMLAttributes<HTMLInputElement> & {\n displayValue?: string;\n};\n\nfunction formatDateValue(value: Date | null | undefined, pattern?: string) {\n if (!value || !(value instanceof Date) || Number.isNaN(value.getTime())) {\n return \"\";\n }\n if (!pattern) {\n return value.toISOString();\n }\n const pad = (num: number, length = 2) => String(num).padStart(length, \"0\");\n const hours = value.getHours();\n const minutes = value.getMinutes();\n const seconds = value.getSeconds();\n const ampm = hours >= 12 ? \"PM\" : \"AM\";\n const h12 = hours % 12 || 12;\n\n return pattern\n .replace(/yyyy/g, String(value.getFullYear()))\n .replace(/MM/g, pad(value.getMonth() + 1))\n .replace(/dd/g, pad(value.getDate()))\n .replace(/HH/g, pad(hours))\n .replace(/hh/g, pad(h12))\n .replace(/h/g, String(h12))\n .replace(/mm/g, pad(minutes))\n .replace(/ss/g, pad(seconds))\n .replace(/aa/g, ampm)\n .replace(/a/g, ampm);\n}\n\nconst SolidDatePickerInput = React.forwardRef<HTMLInputElement, SolidDatePickerInputProps>(\n ({ className, displayValue, ...props }, ref) => (\n <SolidInput\n ref={ref}\n {...props}\n value={displayValue ?? (typeof props.value === \"string\" ? props.value : \"\")}\n readOnly\n className={className}\n />\n )\n);\n\nSolidDatePickerInput.displayName = \"SolidDatePickerInput\";\n\nfunction cx(...parts: Array<string | false | undefined>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nexport function SolidDatePicker({\n timeOnly,\n showTimeSelect,\n inputClassName,\n selected,\n dateFormat,\n calendarClassName,\n popperClassName,\n className,\n ...props\n}: SolidDatePickerProps) {\n const resolvedShowTime = timeOnly ? true : showTimeSelect;\n const resolvedFormat = (Array.isArray(dateFormat) ? dateFormat[0] : dateFormat) ?? \"yyyy-MM-dd\";\n const displayValue = formatDateValue(selected as Date | null | undefined, resolvedFormat);\n\n return (\n <ReactDatePicker\n popperProps={{ strategy: \"fixed\" }}\n popperPlacement=\"bottom-start\"\n {...props}\n selected={selected}\n showTimeSelect={resolvedShowTime}\n showTimeSelectOnly={timeOnly}\n calendarClassName={cx(\"solid-react-datepicker-calendar\", calendarClassName)}\n popperClassName={cx(\"solid-react-datepicker-popper\", popperClassName)}\n customInput={<SolidDatePickerInput className={inputClassName} displayValue={displayValue} />}\n className={cx(\"solid-datepicker\", className)}\n />\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SolidDatePicker.js","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidDatePicker.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport ReactDatePicker from \"react-datepicker\";\nimport \"react-datepicker/dist/react-datepicker.css\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { SolidInput } from \"./SolidInput\";\nimport { SolidSelect } from \"./SolidSelect\";\n\ntype SolidDatePickerProps = React.ComponentProps<typeof ReactDatePicker> & {\n timeOnly?: boolean;\n inputClassName?: string;\n};\n\ntype SolidDatePickerInputProps = React.InputHTMLAttributes<HTMLInputElement> & {\n displayValue?: string;\n};\n\nfunction formatDateValue(value: Date | null | undefined, pattern?: string) {\n if (!value || !(value instanceof Date) || Number.isNaN(value.getTime())) {\n return \"\";\n }\n if (!pattern) {\n return value.toISOString();\n }\n const pad = (num: number, length = 2) => String(num).padStart(length, \"0\");\n const hours = value.getHours();\n const minutes = value.getMinutes();\n const seconds = value.getSeconds();\n const ampm = hours >= 12 ? \"PM\" : \"AM\";\n const h12 = hours % 12 || 12;\n\n return pattern\n .replace(/yyyy/g, String(value.getFullYear()))\n .replace(/MM/g, pad(value.getMonth() + 1))\n .replace(/dd/g, pad(value.getDate()))\n .replace(/HH/g, pad(hours))\n .replace(/hh/g, pad(h12))\n .replace(/h/g, String(h12))\n .replace(/mm/g, pad(minutes))\n .replace(/ss/g, pad(seconds))\n .replace(/aa/g, ampm)\n .replace(/a/g, ampm);\n}\n\nconst SolidDatePickerInput = React.forwardRef<HTMLInputElement, SolidDatePickerInputProps>(\n ({ className, displayValue, ...props }, ref) => (\n <SolidInput\n ref={ref}\n {...props}\n value={displayValue ?? (typeof props.value === \"string\" ? props.value : \"\")}\n readOnly\n className={className}\n />\n )\n);\n\nSolidDatePickerInput.displayName = \"SolidDatePickerInput\";\n\nfunction cx(...parts: Array<string | false | undefined>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nconst MONTH_OPTIONS = Array.from({ length: 12 }, (_, monthIndex) => ({\n value: monthIndex,\n label: new Intl.DateTimeFormat(undefined, { month: \"long\" }).format(new Date(2026, monthIndex, 1)),\n}));\n\nfunction buildYearOptions(selected: Date | null | undefined, minDate?: Date | null, maxDate?: Date | null) {\n const selectedYear = selected?.getFullYear() ?? new Date().getFullYear();\n const minYear = minDate?.getFullYear() ?? 1900;\n const maxYear = maxDate?.getFullYear() ?? Math.max(2100, selectedYear + 25);\n const years: number[] = [];\n\n for (let year = minYear; year <= maxYear; year += 1) {\n years.push(year);\n }\n\n return years;\n}\n\nexport function SolidDatePicker({\n timeOnly,\n showTimeSelect,\n inputClassName,\n selected,\n dateFormat,\n calendarClassName,\n popperClassName,\n className,\n minDate,\n maxDate,\n renderCustomHeader,\n showMonthDropdown,\n showYearDropdown,\n ...props\n}: SolidDatePickerProps) {\n const resolvedShowTime = timeOnly ? true : showTimeSelect;\n const resolvedFormat = (Array.isArray(dateFormat) ? dateFormat[0] : dateFormat) ?? \"yyyy-MM-dd\";\n const displayValue = formatDateValue(selected as Date | null | undefined, resolvedFormat);\n const enableMonthDropdown = showMonthDropdown ?? !timeOnly;\n const enableYearDropdown = showYearDropdown ?? !timeOnly;\n const shouldUseCustomHeader = !timeOnly && !renderCustomHeader;\n const yearOptions = buildYearOptions(selected as Date | null | undefined, minDate as Date | null | undefined, maxDate as Date | null | undefined);\n\n return (\n <ReactDatePicker\n popperProps={{ strategy: \"fixed\" }}\n popperPlacement=\"bottom-start\"\n {...props}\n selected={selected}\n minDate={minDate}\n maxDate={maxDate}\n showTimeSelect={resolvedShowTime}\n showTimeSelectOnly={timeOnly}\n showMonthDropdown={enableMonthDropdown}\n showYearDropdown={enableYearDropdown}\n renderCustomHeader={\n shouldUseCustomHeader\n ? ({ date, changeYear, changeMonth, decreaseMonth, increaseMonth, prevMonthButtonDisabled, nextMonthButtonDisabled }: any) => (\n <div className=\"solid-react-datepicker-header\">\n <button\n type=\"button\"\n className=\"solid-react-datepicker-nav\"\n onClick={decreaseMonth}\n disabled={prevMonthButtonDisabled}\n aria-label=\"Previous month\"\n >\n <ChevronLeft size={16} />\n </button>\n\n <div className=\"solid-react-datepicker-selects\">\n <div className=\"solid-react-datepicker-select-shell solid-react-datepicker-select-shell--month\">\n <SolidSelect\n native={false}\n className=\"solid-react-datepicker-select-wrap\"\n value={date.getMonth()}\n options={MONTH_OPTIONS}\n menuPlacement=\"bottom\"\n onChange={({ value }) => changeMonth(Number(value))}\n />\n </div>\n\n <div className=\"solid-react-datepicker-select-shell solid-react-datepicker-select-shell--year\">\n <SolidSelect\n native={false}\n className=\"solid-react-datepicker-select-wrap\"\n value={date.getFullYear()}\n options={yearOptions.map((year) => ({ label: String(year), value: year }))}\n menuPlacement=\"bottom\"\n onChange={({ value }) => changeYear(Number(value))}\n />\n </div>\n </div>\n\n <button\n type=\"button\"\n className=\"solid-react-datepicker-nav\"\n onClick={increaseMonth}\n disabled={nextMonthButtonDisabled}\n aria-label=\"Next month\"\n >\n <ChevronRight size={16} />\n </button>\n </div>\n )\n : renderCustomHeader\n }\n calendarClassName={cx(\"solid-react-datepicker-calendar\", calendarClassName)}\n popperClassName={cx(\"solid-react-datepicker-popper\", popperClassName)}\n customInput={<SolidDatePickerInput className={inputClassName} displayValue={displayValue} />}\n className={cx(\"solid-datepicker\", className)}\n />\n );\n}\n"]}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import ReactDatePicker from "react-datepicker";
|
|
3
3
|
import "react-datepicker/dist/react-datepicker.css";
|
|
4
|
+
import { ChevronLeft, ChevronRight } from "lucide-react";
|
|
4
5
|
import { SolidInput } from "./SolidInput";
|
|
6
|
+
import { SolidSelect } from "./SolidSelect";
|
|
5
7
|
|
|
6
8
|
type SolidDatePickerProps = React.ComponentProps<typeof ReactDatePicker> & {
|
|
7
9
|
timeOnly?: boolean;
|
|
@@ -57,6 +59,24 @@ function cx(...parts: Array<string | false | undefined>) {
|
|
|
57
59
|
return parts.filter(Boolean).join(" ");
|
|
58
60
|
}
|
|
59
61
|
|
|
62
|
+
const MONTH_OPTIONS = Array.from({ length: 12 }, (_, monthIndex) => ({
|
|
63
|
+
value: monthIndex,
|
|
64
|
+
label: new Intl.DateTimeFormat(undefined, { month: "long" }).format(new Date(2026, monthIndex, 1)),
|
|
65
|
+
}));
|
|
66
|
+
|
|
67
|
+
function buildYearOptions(selected: Date | null | undefined, minDate?: Date | null, maxDate?: Date | null) {
|
|
68
|
+
const selectedYear = selected?.getFullYear() ?? new Date().getFullYear();
|
|
69
|
+
const minYear = minDate?.getFullYear() ?? 1900;
|
|
70
|
+
const maxYear = maxDate?.getFullYear() ?? Math.max(2100, selectedYear + 25);
|
|
71
|
+
const years: number[] = [];
|
|
72
|
+
|
|
73
|
+
for (let year = minYear; year <= maxYear; year += 1) {
|
|
74
|
+
years.push(year);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return years;
|
|
78
|
+
}
|
|
79
|
+
|
|
60
80
|
export function SolidDatePicker({
|
|
61
81
|
timeOnly,
|
|
62
82
|
showTimeSelect,
|
|
@@ -66,11 +86,20 @@ export function SolidDatePicker({
|
|
|
66
86
|
calendarClassName,
|
|
67
87
|
popperClassName,
|
|
68
88
|
className,
|
|
89
|
+
minDate,
|
|
90
|
+
maxDate,
|
|
91
|
+
renderCustomHeader,
|
|
92
|
+
showMonthDropdown,
|
|
93
|
+
showYearDropdown,
|
|
69
94
|
...props
|
|
70
95
|
}: SolidDatePickerProps) {
|
|
71
96
|
const resolvedShowTime = timeOnly ? true : showTimeSelect;
|
|
72
97
|
const resolvedFormat = (Array.isArray(dateFormat) ? dateFormat[0] : dateFormat) ?? "yyyy-MM-dd";
|
|
73
98
|
const displayValue = formatDateValue(selected as Date | null | undefined, resolvedFormat);
|
|
99
|
+
const enableMonthDropdown = showMonthDropdown ?? !timeOnly;
|
|
100
|
+
const enableYearDropdown = showYearDropdown ?? !timeOnly;
|
|
101
|
+
const shouldUseCustomHeader = !timeOnly && !renderCustomHeader;
|
|
102
|
+
const yearOptions = buildYearOptions(selected as Date | null | undefined, minDate as Date | null | undefined, maxDate as Date | null | undefined);
|
|
74
103
|
|
|
75
104
|
return (
|
|
76
105
|
<ReactDatePicker
|
|
@@ -78,8 +107,63 @@ export function SolidDatePicker({
|
|
|
78
107
|
popperPlacement="bottom-start"
|
|
79
108
|
{...props}
|
|
80
109
|
selected={selected}
|
|
110
|
+
minDate={minDate}
|
|
111
|
+
maxDate={maxDate}
|
|
81
112
|
showTimeSelect={resolvedShowTime}
|
|
82
113
|
showTimeSelectOnly={timeOnly}
|
|
114
|
+
showMonthDropdown={enableMonthDropdown}
|
|
115
|
+
showYearDropdown={enableYearDropdown}
|
|
116
|
+
renderCustomHeader={
|
|
117
|
+
shouldUseCustomHeader
|
|
118
|
+
? ({ date, changeYear, changeMonth, decreaseMonth, increaseMonth, prevMonthButtonDisabled, nextMonthButtonDisabled }: any) => (
|
|
119
|
+
<div className="solid-react-datepicker-header">
|
|
120
|
+
<button
|
|
121
|
+
type="button"
|
|
122
|
+
className="solid-react-datepicker-nav"
|
|
123
|
+
onClick={decreaseMonth}
|
|
124
|
+
disabled={prevMonthButtonDisabled}
|
|
125
|
+
aria-label="Previous month"
|
|
126
|
+
>
|
|
127
|
+
<ChevronLeft size={16} />
|
|
128
|
+
</button>
|
|
129
|
+
|
|
130
|
+
<div className="solid-react-datepicker-selects">
|
|
131
|
+
<div className="solid-react-datepicker-select-shell solid-react-datepicker-select-shell--month">
|
|
132
|
+
<SolidSelect
|
|
133
|
+
native={false}
|
|
134
|
+
className="solid-react-datepicker-select-wrap"
|
|
135
|
+
value={date.getMonth()}
|
|
136
|
+
options={MONTH_OPTIONS}
|
|
137
|
+
menuPlacement="bottom"
|
|
138
|
+
onChange={({ value }) => changeMonth(Number(value))}
|
|
139
|
+
/>
|
|
140
|
+
</div>
|
|
141
|
+
|
|
142
|
+
<div className="solid-react-datepicker-select-shell solid-react-datepicker-select-shell--year">
|
|
143
|
+
<SolidSelect
|
|
144
|
+
native={false}
|
|
145
|
+
className="solid-react-datepicker-select-wrap"
|
|
146
|
+
value={date.getFullYear()}
|
|
147
|
+
options={yearOptions.map((year) => ({ label: String(year), value: year }))}
|
|
148
|
+
menuPlacement="bottom"
|
|
149
|
+
onChange={({ value }) => changeYear(Number(value))}
|
|
150
|
+
/>
|
|
151
|
+
</div>
|
|
152
|
+
</div>
|
|
153
|
+
|
|
154
|
+
<button
|
|
155
|
+
type="button"
|
|
156
|
+
className="solid-react-datepicker-nav"
|
|
157
|
+
onClick={increaseMonth}
|
|
158
|
+
disabled={nextMonthButtonDisabled}
|
|
159
|
+
aria-label="Next month"
|
|
160
|
+
>
|
|
161
|
+
<ChevronRight size={16} />
|
|
162
|
+
</button>
|
|
163
|
+
</div>
|
|
164
|
+
)
|
|
165
|
+
: renderCustomHeader
|
|
166
|
+
}
|
|
83
167
|
calendarClassName={cx("solid-react-datepicker-calendar", calendarClassName)}
|
|
84
168
|
popperClassName={cx("solid-react-datepicker-popper", popperClassName)}
|
|
85
169
|
customInput={<SolidDatePickerInput className={inputClassName} displayValue={displayValue} />}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolidTooltip.d.ts","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidTooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"SolidTooltip.d.ts","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidTooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC3C,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAgCF,eAAO,MAAM,YAAY,iEAKtB,iBAAiB,4CA4CnB,CAAC;AAEF,eAAO,MAAM,mBAAmB,0BAAmC,wBAAwB,4CAa1F,CAAC;AAEF,eAAO,MAAM,mBAAmB,0CAK7B,wBAAwB,4CAkC1B,CAAC"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
2
3
|
import * as Tooltip from "@radix-ui/react-tooltip";
|
|
4
|
+
import { SolidPopover, SolidPopoverContent, SolidPopoverTrigger } from "./SolidPopover";
|
|
5
|
+
var SolidTooltipContext = React.createContext(null);
|
|
3
6
|
function cx() {
|
|
4
7
|
var parts = [];
|
|
5
8
|
for (var _i = 0; _i < arguments.length; _i++) {
|
|
@@ -7,16 +10,66 @@ function cx() {
|
|
|
7
10
|
}
|
|
8
11
|
return parts.filter(Boolean).join(" ");
|
|
9
12
|
}
|
|
13
|
+
function canUseTapPopoverTrigger(children, asChild, isTouchDevice) {
|
|
14
|
+
if (!isTouchDevice) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
if (!asChild || !React.isValidElement(children)) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
var childProps = children.props;
|
|
21
|
+
return (typeof childProps.onClick !== "function" &&
|
|
22
|
+
typeof childProps.href !== "string" &&
|
|
23
|
+
typeof childProps.to !== "string");
|
|
24
|
+
}
|
|
10
25
|
export var SolidTooltip = function (_a) {
|
|
11
26
|
var children = _a.children, defaultOpen = _a.defaultOpen, _b = _a.delayDuration, delayDuration = _b === void 0 ? 200 : _b, _c = _a.skipDelayDuration, skipDelayDuration = _c === void 0 ? 300 : _c;
|
|
12
|
-
|
|
27
|
+
var _d = React.useState(false), isTouchDevice = _d[0], setIsTouchDevice = _d[1];
|
|
28
|
+
var _e = React.useState(false), useTapPopover = _e[0], setUseTapPopover = _e[1];
|
|
29
|
+
React.useEffect(function () {
|
|
30
|
+
if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
var touchMedia = window.matchMedia("(hover: none), (pointer: coarse)");
|
|
34
|
+
var updateMode = function () { return setIsTouchDevice(touchMedia.matches); };
|
|
35
|
+
updateMode();
|
|
36
|
+
if (typeof touchMedia.addEventListener === "function") {
|
|
37
|
+
touchMedia.addEventListener("change", updateMode);
|
|
38
|
+
return function () { return touchMedia.removeEventListener("change", updateMode); };
|
|
39
|
+
}
|
|
40
|
+
touchMedia.addListener(updateMode);
|
|
41
|
+
return function () { return touchMedia.removeListener(updateMode); };
|
|
42
|
+
}, []);
|
|
43
|
+
React.useEffect(function () {
|
|
44
|
+
if (!isTouchDevice && useTapPopover) {
|
|
45
|
+
setUseTapPopover(false);
|
|
46
|
+
}
|
|
47
|
+
}, [isTouchDevice, useTapPopover]);
|
|
48
|
+
var content = (_jsx(SolidTooltipContext.Provider, { value: { isTouchDevice: isTouchDevice, useTapPopover: useTapPopover, setUseTapPopover: setUseTapPopover }, children: children }));
|
|
49
|
+
if (isTouchDevice && useTapPopover) {
|
|
50
|
+
return _jsx(SolidPopover, { autoCloseGroup: "solid-tooltip", children: content });
|
|
51
|
+
}
|
|
52
|
+
return (_jsx(Tooltip.Provider, { delayDuration: delayDuration, skipDelayDuration: skipDelayDuration, children: _jsx(Tooltip.Root, { defaultOpen: defaultOpen, children: content }) }));
|
|
13
53
|
};
|
|
14
54
|
export var SolidTooltipTrigger = function (_a) {
|
|
15
|
-
var
|
|
55
|
+
var _b;
|
|
56
|
+
var children = _a.children, _c = _a.asChild, asChild = _c === void 0 ? false : _c;
|
|
57
|
+
var context = React.useContext(SolidTooltipContext);
|
|
58
|
+
var shouldUseTapPopover = canUseTapPopoverTrigger(children, asChild, (_b = context === null || context === void 0 ? void 0 : context.isTouchDevice) !== null && _b !== void 0 ? _b : false);
|
|
59
|
+
React.useEffect(function () {
|
|
60
|
+
context === null || context === void 0 ? void 0 : context.setUseTapPopover(shouldUseTapPopover);
|
|
61
|
+
}, [context, shouldUseTapPopover]);
|
|
62
|
+
if (context === null || context === void 0 ? void 0 : context.useTapPopover) {
|
|
63
|
+
return _jsx(SolidPopoverTrigger, { asChild: asChild, children: children });
|
|
64
|
+
}
|
|
16
65
|
return _jsx(Tooltip.Trigger, { asChild: asChild, children: children });
|
|
17
66
|
};
|
|
18
67
|
export var SolidTooltipContent = function (_a) {
|
|
19
68
|
var children = _a.children, _b = _a.side, side = _b === void 0 ? "top" : _b, _c = _a.align, align = _c === void 0 ? "center" : _c, className = _a.className;
|
|
69
|
+
var context = React.useContext(SolidTooltipContext);
|
|
70
|
+
if ((context === null || context === void 0 ? void 0 : context.isTouchDevice) && context.useTapPopover) {
|
|
71
|
+
return (_jsx(SolidPopoverContent, { side: side, align: align, className: cx("solid-tooltip-content", className), sideOffset: 6, children: children }));
|
|
72
|
+
}
|
|
20
73
|
return (_jsx(Tooltip.Portal, { children: _jsx(Tooltip.Content, { side: side, align: align, className: cx("solid-tooltip-content", className), sideOffset: 6, children: children }) }));
|
|
21
74
|
};
|
|
22
75
|
//# sourceMappingURL=SolidTooltip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolidTooltip.js","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidTooltip.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"SolidTooltip.js","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidTooltip.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\";\nimport * as Tooltip from \"@radix-ui/react-tooltip\";\nimport { SolidPopover, SolidPopoverContent, SolidPopoverTrigger } from \"./SolidPopover\";\n\ntype SolidTooltipProps = {\n children: React.ReactNode;\n defaultOpen?: boolean;\n delayDuration?: number;\n skipDelayDuration?: number;\n};\n\ntype SolidTooltipContentProps = {\n children: React.ReactNode;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n align?: \"start\" | \"center\" | \"end\";\n className?: string;\n};\n\ntype SolidTooltipTriggerProps = {\n children: React.ReactNode;\n asChild?: boolean;\n};\n\ntype SolidTooltipContextValue = {\n isTouchDevice: boolean;\n useTapPopover: boolean;\n setUseTapPopover: (value: boolean) => void;\n};\n\nconst SolidTooltipContext = React.createContext<SolidTooltipContextValue | null>(null);\n\nfunction cx(...parts: Array<string | false | undefined>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nfunction canUseTapPopoverTrigger(children: React.ReactNode, asChild: boolean, isTouchDevice: boolean) {\n if (!isTouchDevice) {\n return false;\n }\n\n if (!asChild || !React.isValidElement(children)) {\n return true;\n }\n\n const childProps = children.props as Record<string, unknown>;\n\n return (\n typeof childProps.onClick !== \"function\" &&\n typeof childProps.href !== \"string\" &&\n typeof childProps.to !== \"string\"\n );\n}\n\nexport const SolidTooltip = ({\n children,\n defaultOpen,\n delayDuration = 200,\n skipDelayDuration = 300,\n}: SolidTooltipProps) => {\n const [isTouchDevice, setIsTouchDevice] = React.useState(false);\n const [useTapPopover, setUseTapPopover] = React.useState(false);\n\n React.useEffect(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return;\n }\n\n const touchMedia = window.matchMedia(\"(hover: none), (pointer: coarse)\");\n const updateMode = () => setIsTouchDevice(touchMedia.matches);\n\n updateMode();\n\n if (typeof touchMedia.addEventListener === \"function\") {\n touchMedia.addEventListener(\"change\", updateMode);\n return () => touchMedia.removeEventListener(\"change\", updateMode);\n }\n\n touchMedia.addListener(updateMode);\n return () => touchMedia.removeListener(updateMode);\n }, []);\n\n React.useEffect(() => {\n if (!isTouchDevice && useTapPopover) {\n setUseTapPopover(false);\n }\n }, [isTouchDevice, useTapPopover]);\n\n const content = (\n <SolidTooltipContext.Provider value={{ isTouchDevice, useTapPopover, setUseTapPopover }}>\n {children}\n </SolidTooltipContext.Provider>\n );\n\n if (isTouchDevice && useTapPopover) {\n return <SolidPopover autoCloseGroup=\"solid-tooltip\">{content}</SolidPopover>;\n }\n\n return (\n <Tooltip.Provider delayDuration={delayDuration} skipDelayDuration={skipDelayDuration}>\n <Tooltip.Root defaultOpen={defaultOpen}>{content}</Tooltip.Root>\n </Tooltip.Provider>\n );\n};\n\nexport const SolidTooltipTrigger = ({ children, asChild = false }: SolidTooltipTriggerProps) => {\n const context = React.useContext(SolidTooltipContext);\n const shouldUseTapPopover = canUseTapPopoverTrigger(children, asChild, context?.isTouchDevice ?? false);\n\n React.useEffect(() => {\n context?.setUseTapPopover(shouldUseTapPopover);\n }, [context, shouldUseTapPopover]);\n\n if (context?.useTapPopover) {\n return <SolidPopoverTrigger asChild={asChild}>{children}</SolidPopoverTrigger>;\n }\n\n return <Tooltip.Trigger asChild={asChild}>{children}</Tooltip.Trigger>;\n};\n\nexport const SolidTooltipContent = ({\n children,\n side = \"top\",\n align = \"center\",\n className,\n}: SolidTooltipContentProps) => {\n const context = React.useContext(SolidTooltipContext);\n\n if (context?.isTouchDevice && context.useTapPopover) {\n return (\n <SolidPopoverContent\n side={side}\n align={align}\n className={cx(\n \"solid-tooltip-content\",\n className\n )}\n sideOffset={6}\n >\n {children}\n </SolidPopoverContent>\n );\n }\n\n return (\n <Tooltip.Portal>\n <Tooltip.Content\n side={side}\n align={align}\n className={cx(\n \"solid-tooltip-content\",\n className\n )}\n sideOffset={6}\n >\n {children}\n </Tooltip.Content>\n </Tooltip.Portal>\n );\n};\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import * as Tooltip from "@radix-ui/react-tooltip";
|
|
3
|
+
import { SolidPopover, SolidPopoverContent, SolidPopoverTrigger } from "./SolidPopover";
|
|
3
4
|
|
|
4
5
|
type SolidTooltipProps = {
|
|
5
6
|
children: React.ReactNode;
|
|
@@ -20,24 +21,99 @@ type SolidTooltipTriggerProps = {
|
|
|
20
21
|
asChild?: boolean;
|
|
21
22
|
};
|
|
22
23
|
|
|
24
|
+
type SolidTooltipContextValue = {
|
|
25
|
+
isTouchDevice: boolean;
|
|
26
|
+
useTapPopover: boolean;
|
|
27
|
+
setUseTapPopover: (value: boolean) => void;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const SolidTooltipContext = React.createContext<SolidTooltipContextValue | null>(null);
|
|
31
|
+
|
|
23
32
|
function cx(...parts: Array<string | false | undefined>) {
|
|
24
33
|
return parts.filter(Boolean).join(" ");
|
|
25
34
|
}
|
|
26
35
|
|
|
36
|
+
function canUseTapPopoverTrigger(children: React.ReactNode, asChild: boolean, isTouchDevice: boolean) {
|
|
37
|
+
if (!isTouchDevice) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (!asChild || !React.isValidElement(children)) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const childProps = children.props as Record<string, unknown>;
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
typeof childProps.onClick !== "function" &&
|
|
49
|
+
typeof childProps.href !== "string" &&
|
|
50
|
+
typeof childProps.to !== "string"
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
27
54
|
export const SolidTooltip = ({
|
|
28
55
|
children,
|
|
29
56
|
defaultOpen,
|
|
30
57
|
delayDuration = 200,
|
|
31
58
|
skipDelayDuration = 300,
|
|
32
59
|
}: SolidTooltipProps) => {
|
|
60
|
+
const [isTouchDevice, setIsTouchDevice] = React.useState(false);
|
|
61
|
+
const [useTapPopover, setUseTapPopover] = React.useState(false);
|
|
62
|
+
|
|
63
|
+
React.useEffect(() => {
|
|
64
|
+
if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const touchMedia = window.matchMedia("(hover: none), (pointer: coarse)");
|
|
69
|
+
const updateMode = () => setIsTouchDevice(touchMedia.matches);
|
|
70
|
+
|
|
71
|
+
updateMode();
|
|
72
|
+
|
|
73
|
+
if (typeof touchMedia.addEventListener === "function") {
|
|
74
|
+
touchMedia.addEventListener("change", updateMode);
|
|
75
|
+
return () => touchMedia.removeEventListener("change", updateMode);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
touchMedia.addListener(updateMode);
|
|
79
|
+
return () => touchMedia.removeListener(updateMode);
|
|
80
|
+
}, []);
|
|
81
|
+
|
|
82
|
+
React.useEffect(() => {
|
|
83
|
+
if (!isTouchDevice && useTapPopover) {
|
|
84
|
+
setUseTapPopover(false);
|
|
85
|
+
}
|
|
86
|
+
}, [isTouchDevice, useTapPopover]);
|
|
87
|
+
|
|
88
|
+
const content = (
|
|
89
|
+
<SolidTooltipContext.Provider value={{ isTouchDevice, useTapPopover, setUseTapPopover }}>
|
|
90
|
+
{children}
|
|
91
|
+
</SolidTooltipContext.Provider>
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
if (isTouchDevice && useTapPopover) {
|
|
95
|
+
return <SolidPopover autoCloseGroup="solid-tooltip">{content}</SolidPopover>;
|
|
96
|
+
}
|
|
97
|
+
|
|
33
98
|
return (
|
|
34
99
|
<Tooltip.Provider delayDuration={delayDuration} skipDelayDuration={skipDelayDuration}>
|
|
35
|
-
<Tooltip.Root defaultOpen={defaultOpen}>{
|
|
100
|
+
<Tooltip.Root defaultOpen={defaultOpen}>{content}</Tooltip.Root>
|
|
36
101
|
</Tooltip.Provider>
|
|
37
102
|
);
|
|
38
103
|
};
|
|
39
104
|
|
|
40
105
|
export const SolidTooltipTrigger = ({ children, asChild = false }: SolidTooltipTriggerProps) => {
|
|
106
|
+
const context = React.useContext(SolidTooltipContext);
|
|
107
|
+
const shouldUseTapPopover = canUseTapPopoverTrigger(children, asChild, context?.isTouchDevice ?? false);
|
|
108
|
+
|
|
109
|
+
React.useEffect(() => {
|
|
110
|
+
context?.setUseTapPopover(shouldUseTapPopover);
|
|
111
|
+
}, [context, shouldUseTapPopover]);
|
|
112
|
+
|
|
113
|
+
if (context?.useTapPopover) {
|
|
114
|
+
return <SolidPopoverTrigger asChild={asChild}>{children}</SolidPopoverTrigger>;
|
|
115
|
+
}
|
|
116
|
+
|
|
41
117
|
return <Tooltip.Trigger asChild={asChild}>{children}</Tooltip.Trigger>;
|
|
42
118
|
};
|
|
43
119
|
|
|
@@ -47,6 +123,24 @@ export const SolidTooltipContent = ({
|
|
|
47
123
|
align = "center",
|
|
48
124
|
className,
|
|
49
125
|
}: SolidTooltipContentProps) => {
|
|
126
|
+
const context = React.useContext(SolidTooltipContext);
|
|
127
|
+
|
|
128
|
+
if (context?.isTouchDevice && context.useTapPopover) {
|
|
129
|
+
return (
|
|
130
|
+
<SolidPopoverContent
|
|
131
|
+
side={side}
|
|
132
|
+
align={align}
|
|
133
|
+
className={cx(
|
|
134
|
+
"solid-tooltip-content",
|
|
135
|
+
className
|
|
136
|
+
)}
|
|
137
|
+
sideOffset={6}
|
|
138
|
+
>
|
|
139
|
+
{children}
|
|
140
|
+
</SolidPopoverContent>
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
50
144
|
return (
|
|
51
145
|
<Tooltip.Portal>
|
|
52
146
|
<Tooltip.Content
|
|
@@ -1,2 +1,15 @@
|
|
|
1
1
|
export declare const permissionExpression: (modelName: string, permissionName: string) => string;
|
|
2
|
+
export declare const importPermissionExpressions: string[];
|
|
3
|
+
export declare const exportPermissionExpressions: string[];
|
|
4
|
+
export declare const hasAllPermissions: (actionsAllowed?: string[], permissionNames?: string[]) => boolean;
|
|
5
|
+
type CollectionViewPermissionOptions = {
|
|
6
|
+
includeDeleteMany?: boolean;
|
|
7
|
+
includeFindOne?: boolean;
|
|
8
|
+
includeInsertMany?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare const getCollectionViewPermissionNames: (modelName: string, options?: CollectionViewPermissionOptions) => string[];
|
|
11
|
+
export declare const getFormViewPermissionNames: (modelName: string) => string[];
|
|
12
|
+
export declare const canImportRecords: (actionsAllowed?: string[], modelName?: string) => boolean;
|
|
13
|
+
export declare const canExportRecords: (actionsAllowed?: string[], modelName?: string) => boolean;
|
|
14
|
+
export {};
|
|
2
15
|
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/helpers/permissions.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,oBAAoB,cAAe,MAAM,kBAAmB,MAAM,WAE9E,CAAC"}
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/helpers/permissions.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,oBAAoB,cAAe,MAAM,kBAAmB,MAAM,WAE9E,CAAC;AAEF,eAAO,MAAM,2BAA2B,UASvC,CAAC;AAEF,eAAO,MAAM,2BAA2B,UAMvC,CAAC;AAEF,eAAO,MAAM,iBAAiB,oBAAoB,MAAM,EAAE,oBAAwB,MAAM,EAAE,YAEzF,CAAC;AAEF,KAAK,+BAA+B,GAAG;IACnC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,gCAAgC,cAC9B,MAAM,YACR,+BAA+B,aAgC3C,CAAC;AAEF,eAAO,MAAM,0BAA0B,cAAe,MAAM,aAU3D,CAAC;AAEF,eAAO,MAAM,gBAAgB,oBAAoB,MAAM,EAAE,cAAmB,MAAM,YAKjF,CAAC;AAEF,eAAO,MAAM,gBAAgB,oBAAoB,MAAM,EAAE,cAAmB,MAAM,YAKjF,CAAC"}
|
|
@@ -1,6 +1,85 @@
|
|
|
1
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
2
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
3
|
+
if (ar || !(i in from)) {
|
|
4
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
5
|
+
ar[i] = from[i];
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
9
|
+
};
|
|
1
10
|
import { camelCase, upperFirst } from "lodash";
|
|
2
11
|
//Dynamic permission expression
|
|
3
12
|
export var permissionExpression = function (modelName, permissionName) {
|
|
4
13
|
return "".concat(upperFirst(camelCase(modelName)), "Controller.").concat(permissionName);
|
|
5
14
|
};
|
|
15
|
+
export var importPermissionExpressions = [
|
|
16
|
+
"ImportTransactionController.create",
|
|
17
|
+
"ImportTransactionController.getImportTemplate",
|
|
18
|
+
"ImportTransactionController.getImportInstructions",
|
|
19
|
+
"ImportTransactionController.getImportMappingInfo",
|
|
20
|
+
"ImportTransactionController.partialUpdate",
|
|
21
|
+
"ImportTransactionController.startImportSync",
|
|
22
|
+
"ImportTransactionController.startImportAsync",
|
|
23
|
+
"ImportTransactionController.exportFailedImportedImports",
|
|
24
|
+
];
|
|
25
|
+
export var exportPermissionExpressions = [
|
|
26
|
+
"ExportTemplateController.create",
|
|
27
|
+
"ExportTemplateController.delete",
|
|
28
|
+
"ExportTemplateController.findMany",
|
|
29
|
+
"ExportTemplateController.startExportSync",
|
|
30
|
+
"ExportTemplateController.startExportAsync",
|
|
31
|
+
];
|
|
32
|
+
export var hasAllPermissions = function (actionsAllowed, permissionNames) {
|
|
33
|
+
if (actionsAllowed === void 0) { actionsAllowed = []; }
|
|
34
|
+
if (permissionNames === void 0) { permissionNames = []; }
|
|
35
|
+
return permissionNames.every(function (permissionName) { return actionsAllowed.includes(permissionName); });
|
|
36
|
+
};
|
|
37
|
+
export var getCollectionViewPermissionNames = function (modelName, options) {
|
|
38
|
+
if (options === void 0) { options = {}; }
|
|
39
|
+
var _a = options.includeDeleteMany, includeDeleteMany = _a === void 0 ? true : _a, _b = options.includeFindOne, includeFindOne = _b === void 0 ? true : _b, _c = options.includeInsertMany, includeInsertMany = _c === void 0 ? true : _c;
|
|
40
|
+
var permissionNames = __spreadArray(__spreadArray(__spreadArray([
|
|
41
|
+
permissionExpression(modelName, "create"),
|
|
42
|
+
permissionExpression(modelName, "delete"),
|
|
43
|
+
permissionExpression(modelName, "update"),
|
|
44
|
+
permissionExpression(modelName, "findMany")
|
|
45
|
+
], importPermissionExpressions, true), exportPermissionExpressions, true), [
|
|
46
|
+
permissionExpression("userViewMetadata", "create"),
|
|
47
|
+
permissionExpression("savedFilters", "create"),
|
|
48
|
+
], false);
|
|
49
|
+
if (includeDeleteMany) {
|
|
50
|
+
permissionNames.push(permissionExpression(modelName, "deleteMany"));
|
|
51
|
+
}
|
|
52
|
+
if (includeFindOne) {
|
|
53
|
+
permissionNames.push(permissionExpression(modelName, "findOne"));
|
|
54
|
+
}
|
|
55
|
+
if (includeInsertMany) {
|
|
56
|
+
permissionNames.push(permissionExpression(modelName, "insertMany"));
|
|
57
|
+
}
|
|
58
|
+
return permissionNames;
|
|
59
|
+
};
|
|
60
|
+
export var getFormViewPermissionNames = function (modelName) {
|
|
61
|
+
return [
|
|
62
|
+
permissionExpression(modelName, "create"),
|
|
63
|
+
permissionExpression(modelName, "delete"),
|
|
64
|
+
permissionExpression(modelName, "update"),
|
|
65
|
+
permissionExpression(modelName, "findOne"),
|
|
66
|
+
permissionExpression(modelName, "publish"),
|
|
67
|
+
permissionExpression(modelName, "unpublish"),
|
|
68
|
+
permissionExpression("chatterMessage", "findMany"),
|
|
69
|
+
];
|
|
70
|
+
};
|
|
71
|
+
export var canImportRecords = function (actionsAllowed, modelName) {
|
|
72
|
+
if (actionsAllowed === void 0) { actionsAllowed = []; }
|
|
73
|
+
if (!modelName)
|
|
74
|
+
return false;
|
|
75
|
+
return actionsAllowed.includes(permissionExpression(modelName, "create")) &&
|
|
76
|
+
hasAllPermissions(actionsAllowed, importPermissionExpressions);
|
|
77
|
+
};
|
|
78
|
+
export var canExportRecords = function (actionsAllowed, modelName) {
|
|
79
|
+
if (actionsAllowed === void 0) { actionsAllowed = []; }
|
|
80
|
+
if (!modelName)
|
|
81
|
+
return false;
|
|
82
|
+
return actionsAllowed.includes(permissionExpression(modelName, "findMany")) &&
|
|
83
|
+
hasAllPermissions(actionsAllowed, exportPermissionExpressions);
|
|
84
|
+
};
|
|
6
85
|
//# sourceMappingURL=permissions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/helpers/permissions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE/C,+BAA+B;AAC/B,MAAM,CAAC,IAAM,oBAAoB,GAAG,UAAC,SAAiB,EAAE,cAAuB;IAC3E,OAAO,UAAG,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,wBAAc,cAAc,CAAE,CAAA;AAC5E,CAAC,CAAC","sourcesContent":["\nimport { camelCase, upperFirst } from \"lodash\";\n\n//Dynamic permission expression\nexport const permissionExpression = (modelName: string, permissionName : string) => {\n return `${upperFirst(camelCase(modelName))}Controller.${permissionName}`\n}
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/helpers/permissions.ts"],"names":[],"mappings":"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","sourcesContent":["\nimport { camelCase, upperFirst } from \"lodash\";\n\n//Dynamic permission expression\nexport const permissionExpression = (modelName: string, permissionName : string) => {\n return `${upperFirst(camelCase(modelName))}Controller.${permissionName}`\n};\n\nexport const importPermissionExpressions = [\n \"ImportTransactionController.create\",\n \"ImportTransactionController.getImportTemplate\",\n \"ImportTransactionController.getImportInstructions\",\n \"ImportTransactionController.getImportMappingInfo\",\n \"ImportTransactionController.partialUpdate\",\n \"ImportTransactionController.startImportSync\",\n \"ImportTransactionController.startImportAsync\",\n \"ImportTransactionController.exportFailedImportedImports\",\n];\n\nexport const exportPermissionExpressions = [\n \"ExportTemplateController.create\",\n \"ExportTemplateController.delete\",\n \"ExportTemplateController.findMany\",\n \"ExportTemplateController.startExportSync\",\n \"ExportTemplateController.startExportAsync\",\n];\n\nexport const hasAllPermissions = (actionsAllowed: string[] = [], permissionNames: string[] = []) => {\n return permissionNames.every((permissionName) => actionsAllowed.includes(permissionName));\n};\n\ntype CollectionViewPermissionOptions = {\n includeDeleteMany?: boolean;\n includeFindOne?: boolean;\n includeInsertMany?: boolean;\n};\n\nexport const getCollectionViewPermissionNames = (\n modelName: string,\n options: CollectionViewPermissionOptions = {},\n) => {\n const {\n includeDeleteMany = true,\n includeFindOne = true,\n includeInsertMany = true,\n } = options;\n\n const permissionNames = [\n permissionExpression(modelName, \"create\"),\n permissionExpression(modelName, \"delete\"),\n permissionExpression(modelName, \"update\"),\n permissionExpression(modelName, \"findMany\"),\n ...importPermissionExpressions,\n ...exportPermissionExpressions,\n permissionExpression(\"userViewMetadata\", \"create\"),\n permissionExpression(\"savedFilters\", \"create\"),\n ];\n\n if (includeDeleteMany) {\n permissionNames.push(permissionExpression(modelName, \"deleteMany\"));\n }\n\n if (includeFindOne) {\n permissionNames.push(permissionExpression(modelName, \"findOne\"));\n }\n\n if (includeInsertMany) {\n permissionNames.push(permissionExpression(modelName, \"insertMany\"));\n }\n\n return permissionNames;\n};\n\nexport const getFormViewPermissionNames = (modelName: string) => {\n return [\n permissionExpression(modelName, \"create\"),\n permissionExpression(modelName, \"delete\"),\n permissionExpression(modelName, \"update\"),\n permissionExpression(modelName, \"findOne\"),\n permissionExpression(modelName, \"publish\"),\n permissionExpression(modelName, \"unpublish\"),\n permissionExpression(\"chatterMessage\", \"findMany\"),\n ];\n};\n\nexport const canImportRecords = (actionsAllowed: string[] = [], modelName?: string) => {\n if (!modelName) return false;\n\n return actionsAllowed.includes(permissionExpression(modelName, \"create\")) &&\n hasAllPermissions(actionsAllowed, importPermissionExpressions);\n};\n\nexport const canExportRecords = (actionsAllowed: string[] = [], modelName?: string) => {\n if (!modelName) return false;\n\n return actionsAllowed.includes(permissionExpression(modelName, \"findMany\")) &&\n hasAllPermissions(actionsAllowed, exportPermissionExpressions);\n};\n"]}
|
|
@@ -4,4 +4,95 @@ import { camelCase, upperFirst } from "lodash";
|
|
|
4
4
|
//Dynamic permission expression
|
|
5
5
|
export const permissionExpression = (modelName: string, permissionName : string) => {
|
|
6
6
|
return `${upperFirst(camelCase(modelName))}Controller.${permissionName}`
|
|
7
|
-
};
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const importPermissionExpressions = [
|
|
10
|
+
"ImportTransactionController.create",
|
|
11
|
+
"ImportTransactionController.getImportTemplate",
|
|
12
|
+
"ImportTransactionController.getImportInstructions",
|
|
13
|
+
"ImportTransactionController.getImportMappingInfo",
|
|
14
|
+
"ImportTransactionController.partialUpdate",
|
|
15
|
+
"ImportTransactionController.startImportSync",
|
|
16
|
+
"ImportTransactionController.startImportAsync",
|
|
17
|
+
"ImportTransactionController.exportFailedImportedImports",
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
export const exportPermissionExpressions = [
|
|
21
|
+
"ExportTemplateController.create",
|
|
22
|
+
"ExportTemplateController.delete",
|
|
23
|
+
"ExportTemplateController.findMany",
|
|
24
|
+
"ExportTemplateController.startExportSync",
|
|
25
|
+
"ExportTemplateController.startExportAsync",
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
export const hasAllPermissions = (actionsAllowed: string[] = [], permissionNames: string[] = []) => {
|
|
29
|
+
return permissionNames.every((permissionName) => actionsAllowed.includes(permissionName));
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
type CollectionViewPermissionOptions = {
|
|
33
|
+
includeDeleteMany?: boolean;
|
|
34
|
+
includeFindOne?: boolean;
|
|
35
|
+
includeInsertMany?: boolean;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export const getCollectionViewPermissionNames = (
|
|
39
|
+
modelName: string,
|
|
40
|
+
options: CollectionViewPermissionOptions = {},
|
|
41
|
+
) => {
|
|
42
|
+
const {
|
|
43
|
+
includeDeleteMany = true,
|
|
44
|
+
includeFindOne = true,
|
|
45
|
+
includeInsertMany = true,
|
|
46
|
+
} = options;
|
|
47
|
+
|
|
48
|
+
const permissionNames = [
|
|
49
|
+
permissionExpression(modelName, "create"),
|
|
50
|
+
permissionExpression(modelName, "delete"),
|
|
51
|
+
permissionExpression(modelName, "update"),
|
|
52
|
+
permissionExpression(modelName, "findMany"),
|
|
53
|
+
...importPermissionExpressions,
|
|
54
|
+
...exportPermissionExpressions,
|
|
55
|
+
permissionExpression("userViewMetadata", "create"),
|
|
56
|
+
permissionExpression("savedFilters", "create"),
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
if (includeDeleteMany) {
|
|
60
|
+
permissionNames.push(permissionExpression(modelName, "deleteMany"));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (includeFindOne) {
|
|
64
|
+
permissionNames.push(permissionExpression(modelName, "findOne"));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (includeInsertMany) {
|
|
68
|
+
permissionNames.push(permissionExpression(modelName, "insertMany"));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return permissionNames;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export const getFormViewPermissionNames = (modelName: string) => {
|
|
75
|
+
return [
|
|
76
|
+
permissionExpression(modelName, "create"),
|
|
77
|
+
permissionExpression(modelName, "delete"),
|
|
78
|
+
permissionExpression(modelName, "update"),
|
|
79
|
+
permissionExpression(modelName, "findOne"),
|
|
80
|
+
permissionExpression(modelName, "publish"),
|
|
81
|
+
permissionExpression(modelName, "unpublish"),
|
|
82
|
+
permissionExpression("chatterMessage", "findMany"),
|
|
83
|
+
];
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export const canImportRecords = (actionsAllowed: string[] = [], modelName?: string) => {
|
|
87
|
+
if (!modelName) return false;
|
|
88
|
+
|
|
89
|
+
return actionsAllowed.includes(permissionExpression(modelName, "create")) &&
|
|
90
|
+
hasAllPermissions(actionsAllowed, importPermissionExpressions);
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export const canExportRecords = (actionsAllowed: string[] = [], modelName?: string) => {
|
|
94
|
+
if (!modelName) return false;
|
|
95
|
+
|
|
96
|
+
return actionsAllowed.includes(permissionExpression(modelName, "findMany")) &&
|
|
97
|
+
hasAllPermissions(actionsAllowed, exportPermissionExpressions);
|
|
98
|
+
};
|