@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.
Files changed (162) hide show
  1. package/dist/components/auth/AuthTabs.d.ts.map +1 -1
  2. package/dist/components/auth/AuthTabs.js +1 -1
  3. package/dist/components/auth/AuthTabs.js.map +1 -1
  4. package/dist/components/auth/AuthTabs.tsx +1 -0
  5. package/dist/components/auth/SolidChangeForcePassword.d.ts.map +1 -1
  6. package/dist/components/auth/SolidChangeForcePassword.js +2 -2
  7. package/dist/components/auth/SolidChangeForcePassword.js.map +1 -1
  8. package/dist/components/auth/SolidChangeForcePassword.tsx +9 -8
  9. package/dist/components/common/SettingsComponent.d.ts.map +1 -1
  10. package/dist/components/common/SettingsComponent.js +1 -1
  11. package/dist/components/common/SettingsComponent.js.map +1 -1
  12. package/dist/components/common/SettingsComponent.tsx +1 -0
  13. package/dist/components/common/SolidFieldTooltip.d.ts.map +1 -1
  14. package/dist/components/common/SolidFieldTooltip.js +1 -33
  15. package/dist/components/common/SolidFieldTooltip.js.map +1 -1
  16. package/dist/components/common/SolidFieldTooltip.tsx +8 -64
  17. package/dist/components/common/SolidMaterialSymbol.d.ts +1 -1
  18. package/dist/components/common/SolidMaterialSymbol.d.ts.map +1 -1
  19. package/dist/components/common/SolidMaterialSymbol.js +6 -37
  20. package/dist/components/common/SolidMaterialSymbol.js.map +1 -1
  21. package/dist/components/common/SolidMaterialSymbol.tsx +6 -54
  22. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts.map +1 -1
  23. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js +2 -2
  24. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js.map +1 -1
  25. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx +2 -0
  26. package/dist/components/core/card/CardItem.d.ts.map +1 -1
  27. package/dist/components/core/card/CardItem.js +1 -1
  28. package/dist/components/core/card/CardItem.js.map +1 -1
  29. package/dist/components/core/card/CardItem.tsx +16 -14
  30. package/dist/components/core/card/SolidCardView.d.ts.map +1 -1
  31. package/dist/components/core/card/SolidCardView.js +75 -51
  32. package/dist/components/core/card/SolidCardView.js.map +1 -1
  33. package/dist/components/core/card/SolidCardView.tsx +61 -35
  34. package/dist/components/core/card/SolidCardViewConfigure.d.ts.map +1 -1
  35. package/dist/components/core/card/SolidCardViewConfigure.js +3 -7
  36. package/dist/components/core/card/SolidCardViewConfigure.js.map +1 -1
  37. package/dist/components/core/card/SolidCardViewConfigure.tsx +3 -9
  38. package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.module.css +99 -0
  39. package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.d.ts.map +1 -1
  40. package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.js +76 -5
  41. package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.js.map +1 -1
  42. package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.tsx +39 -4
  43. package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
  44. package/dist/components/core/common/SolidGlobalSearchElement.js +172 -124
  45. package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
  46. package/dist/components/core/common/SolidGlobalSearchElement.tsx +73 -84
  47. package/dist/components/core/common/globalSearchPersistence.d.ts +3 -0
  48. package/dist/components/core/common/globalSearchPersistence.d.ts.map +1 -1
  49. package/dist/components/core/common/globalSearchPersistence.js +33 -24
  50. package/dist/components/core/common/globalSearchPersistence.js.map +1 -1
  51. package/dist/components/core/common/globalSearchPersistence.ts +34 -27
  52. package/dist/components/core/filter/fields/SolidMediaMultipleField.js +2 -2
  53. package/dist/components/core/filter/fields/SolidMediaMultipleField.js.map +1 -1
  54. package/dist/components/core/filter/fields/SolidMediaMultipleField.tsx +2 -2
  55. package/dist/components/core/filter/fields/SolidMediaSingleField.js +2 -2
  56. package/dist/components/core/filter/fields/SolidMediaSingleField.js.map +1 -1
  57. package/dist/components/core/filter/fields/SolidMediaSingleField.tsx +2 -2
  58. package/dist/components/core/filter/fields/SolidShortTextField.js +2 -2
  59. package/dist/components/core/filter/fields/SolidShortTextField.js.map +1 -1
  60. package/dist/components/core/filter/fields/SolidShortTextField.tsx +2 -2
  61. package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
  62. package/dist/components/core/form/SolidFormView.js +2 -10
  63. package/dist/components/core/form/SolidFormView.js.map +1 -1
  64. package/dist/components/core/form/SolidFormView.tsx +2 -10
  65. package/dist/components/core/kanban/KanbanCard.d.ts.map +1 -1
  66. package/dist/components/core/kanban/KanbanCard.js +1 -1
  67. package/dist/components/core/kanban/KanbanCard.js.map +1 -1
  68. package/dist/components/core/kanban/KanbanCard.tsx +18 -16
  69. package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
  70. package/dist/components/core/kanban/SolidKanbanView.js +73 -59
  71. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  72. package/dist/components/core/kanban/SolidKanbanView.tsx +57 -22
  73. package/dist/components/core/kanban/SolidKanbanViewConfigure.d.ts +1 -1
  74. package/dist/components/core/kanban/SolidKanbanViewConfigure.d.ts.map +1 -1
  75. package/dist/components/core/kanban/SolidKanbanViewConfigure.js +14 -9
  76. package/dist/components/core/kanban/SolidKanbanViewConfigure.js.map +1 -1
  77. package/dist/components/core/kanban/SolidKanbanViewConfigure.tsx +38 -9
  78. package/dist/components/core/list/SolidEmptyListViewPlaceholder.d.ts.map +1 -1
  79. package/dist/components/core/list/SolidEmptyListViewPlaceholder.js +2 -3
  80. package/dist/components/core/list/SolidEmptyListViewPlaceholder.js.map +1 -1
  81. package/dist/components/core/list/SolidEmptyListViewPlaceholder.tsx +2 -3
  82. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  83. package/dist/components/core/list/SolidListView.js +8 -16
  84. package/dist/components/core/list/SolidListView.js.map +1 -1
  85. package/dist/components/core/list/SolidListView.tsx +9 -15
  86. package/dist/components/core/list/SolidListViewConfigure.d.ts.map +1 -1
  87. package/dist/components/core/list/SolidListViewConfigure.js +22 -16
  88. package/dist/components/core/list/SolidListViewConfigure.js.map +1 -1
  89. package/dist/components/core/list/SolidListViewConfigure.tsx +32 -11
  90. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.d.ts +1 -1
  91. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.d.ts.map +1 -1
  92. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.js +3 -1
  93. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.js.map +1 -1
  94. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.tsx +3 -1
  95. package/dist/components/core/list/columns/SolidMediaMultipleColumn.d.ts.map +1 -1
  96. package/dist/components/core/list/columns/SolidMediaMultipleColumn.js +7 -0
  97. package/dist/components/core/list/columns/SolidMediaMultipleColumn.js.map +1 -1
  98. package/dist/components/core/list/columns/SolidMediaMultipleColumn.tsx +5 -0
  99. package/dist/components/core/list/columns/SolidMediaSingleColumn.d.ts.map +1 -1
  100. package/dist/components/core/list/columns/SolidMediaSingleColumn.js +3 -0
  101. package/dist/components/core/list/columns/SolidMediaSingleColumn.js.map +1 -1
  102. package/dist/components/core/list/columns/SolidMediaSingleColumn.tsx +2 -0
  103. package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.d.ts.map +1 -1
  104. package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.js +3 -0
  105. package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.js.map +1 -1
  106. package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.tsx +2 -0
  107. package/dist/components/core/model/CreateModel.css +10 -0
  108. package/dist/components/core/model/FieldMetaDataForm.css +10 -0
  109. package/dist/components/core/model/FieldMetaDataForm.js +8 -8
  110. package/dist/components/core/model/FieldMetaDataForm.js.map +1 -1
  111. package/dist/components/core/model/FieldMetaDataForm.tsx +13 -13
  112. package/dist/components/core/module/ModuleMetadataExplorer.css +23 -0
  113. package/dist/components/core/module/ModuleMetadataExplorer.d.ts.map +1 -1
  114. package/dist/components/core/module/ModuleMetadataExplorer.js +1 -1
  115. package/dist/components/core/module/ModuleMetadataExplorer.js.map +1 -1
  116. package/dist/components/core/module/ModuleMetadataExplorer.tsx +9 -0
  117. package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -1
  118. package/dist/components/core/tree/SolidTreeView.js +251 -152
  119. package/dist/components/core/tree/SolidTreeView.js.map +1 -1
  120. package/dist/components/core/tree/SolidTreeView.tsx +222 -106
  121. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.d.ts.map +1 -1
  122. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.js +1 -1
  123. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.js.map +1 -1
  124. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.tsx +1 -0
  125. package/dist/components/layout/AdminHeaderActions.js +6 -13
  126. package/dist/components/layout/AdminHeaderActions.js.map +1 -1
  127. package/dist/components/layout/AdminHeaderActions.tsx +11 -11
  128. package/dist/components/layout/AdminLayout.d.ts.map +1 -1
  129. package/dist/components/layout/AdminLayout.js +2 -2
  130. package/dist/components/layout/AdminLayout.js.map +1 -1
  131. package/dist/components/layout/AdminLayout.tsx +5 -4
  132. package/dist/components/layout/AppSidebar.d.ts.map +1 -1
  133. package/dist/components/layout/AppSidebar.js +17 -2
  134. package/dist/components/layout/AppSidebar.js.map +1 -1
  135. package/dist/components/layout/AppSidebar.tsx +21 -2
  136. package/dist/components/shad-cn-ui/SolidDatePicker.d.ts +1 -1
  137. package/dist/components/shad-cn-ui/SolidDatePicker.d.ts.map +1 -1
  138. package/dist/components/shad-cn-ui/SolidDatePicker.js +35 -3
  139. package/dist/components/shad-cn-ui/SolidDatePicker.js.map +1 -1
  140. package/dist/components/shad-cn-ui/SolidDatePicker.tsx +84 -0
  141. package/dist/components/shad-cn-ui/SolidTooltip.d.ts.map +1 -1
  142. package/dist/components/shad-cn-ui/SolidTooltip.js +55 -2
  143. package/dist/components/shad-cn-ui/SolidTooltip.js.map +1 -1
  144. package/dist/components/shad-cn-ui/SolidTooltip.tsx +95 -1
  145. package/dist/helpers/permissions.d.ts +13 -0
  146. package/dist/helpers/permissions.d.ts.map +1 -1
  147. package/dist/helpers/permissions.js +79 -0
  148. package/dist/helpers/permissions.js.map +1 -1
  149. package/dist/helpers/permissions.ts +92 -1
  150. package/dist/resources/globals.css +109 -1
  151. package/dist/resources/solid-custom.css +53 -3
  152. package/dist/resources/solid-tailwind-generated.css +1 -1
  153. package/dist/routes/pages/admin/core/DashboardPage.d.ts.map +1 -1
  154. package/dist/routes/pages/admin/core/DashboardPage.js +2 -2
  155. package/dist/routes/pages/admin/core/DashboardPage.js.map +1 -1
  156. package/dist/routes/pages/admin/core/DashboardPage.tsx +2 -0
  157. package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.d.ts.map +1 -1
  158. package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.js +1 -1
  159. package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.js.map +1 -1
  160. package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.tsx +1 -0
  161. package/dist/types/css-modules.d.ts +2 -0
  162. 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;AAG/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;AAMF,eAAO,MAAM,YAAY,iEAKtB,iBAAiB,4CAMnB,CAAC;AAEF,eAAO,MAAM,mBAAmB,0BAAmC,wBAAwB,4CAE1F,CAAC;AAEF,eAAO,MAAM,mBAAmB,0CAK7B,wBAAwB,4CAgB1B,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
- return (_jsx(Tooltip.Provider, { delayDuration: delayDuration, skipDelayDuration: skipDelayDuration, children: _jsx(Tooltip.Root, { defaultOpen: defaultOpen, children: children }) }));
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 children = _a.children, _b = _a.asChild, asChild = _b === void 0 ? false : _b;
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":";AACA,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAC;AAqBnD,SAAS,EAAE;IAAC,eAA2C;SAA3C,UAA2C,EAA3C,qBAA2C,EAA3C,IAA2C;QAA3C,0BAA2C;;IACrD,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,IAAM,YAAY,GAAG,UAAC,EAKT;QAJlB,QAAQ,cAAA,EACR,WAAW,iBAAA,EACX,qBAAmB,EAAnB,aAAa,mBAAG,GAAG,KAAA,EACnB,yBAAuB,EAAvB,iBAAiB,mBAAG,GAAG,KAAA;IAEvB,OAAO,CACL,KAAC,OAAO,CAAC,QAAQ,IAAC,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,YAClF,KAAC,OAAO,CAAC,IAAI,IAAC,WAAW,EAAE,WAAW,YAAG,QAAQ,GAAgB,GAChD,CACpB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,mBAAmB,GAAG,UAAC,EAAuD;QAArD,QAAQ,cAAA,EAAE,eAAe,EAAf,OAAO,mBAAG,KAAK,KAAA;IAC7D,OAAO,KAAC,OAAO,CAAC,OAAO,IAAC,OAAO,EAAE,OAAO,YAAG,QAAQ,GAAmB,CAAC;AACzE,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,mBAAmB,GAAG,UAAC,EAKT;QAJzB,QAAQ,cAAA,EACR,YAAY,EAAZ,IAAI,mBAAG,KAAK,KAAA,EACZ,aAAgB,EAAhB,KAAK,mBAAG,QAAQ,KAAA,EAChB,SAAS,eAAA;IAET,OAAO,CACL,KAAC,OAAO,CAAC,MAAM,cACb,KAAC,OAAO,CAAC,OAAO,IACd,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,EAAE,CACX,uBAAuB,EACvB,SAAS,CACV,EACD,UAAU,EAAE,CAAC,YAEZ,QAAQ,GACO,GACH,CAClB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import * as React from \"react\";\nimport * as Tooltip from \"@radix-ui/react-tooltip\";\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\nfunction cx(...parts: Array<string | false | undefined>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nexport const SolidTooltip = ({\n children,\n defaultOpen,\n delayDuration = 200,\n skipDelayDuration = 300,\n}: SolidTooltipProps) => {\n return (\n <Tooltip.Provider delayDuration={delayDuration} skipDelayDuration={skipDelayDuration}>\n <Tooltip.Root defaultOpen={defaultOpen}>{children}</Tooltip.Root>\n </Tooltip.Provider>\n );\n};\n\nexport const SolidTooltipTrigger = ({ children, asChild = false }: SolidTooltipTriggerProps) => {\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 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
+ {"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}>{children}</Tooltip.Root>
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
+ };