@ayasofyazilim/ui 0.0.4 → 0.0.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/accordion.js +1 -1
- package/dist/components/accordion.js.map +1 -1
- package/dist/components/alert-dialog.js +2 -2
- package/dist/components/alert-dialog.js.map +1 -1
- package/dist/components/alert.js +1 -1
- package/dist/components/alert.js.map +1 -1
- package/dist/components/avatar.js +1 -1
- package/dist/components/avatar.js.map +1 -1
- package/dist/components/badge.js +1 -1
- package/dist/components/badge.js.map +1 -1
- package/dist/components/breadcrumb.js +1 -1
- package/dist/components/breadcrumb.js.map +1 -1
- package/dist/components/button-group.js +2 -2
- package/dist/components/button-group.js.map +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/button.js.map +1 -1
- package/dist/components/calendar.js +2 -5
- package/dist/components/calendar.js.map +1 -1
- package/dist/components/card.js +1 -1
- package/dist/components/card.js.map +1 -1
- package/dist/components/carousel.js +2 -2
- package/dist/components/carousel.js.map +1 -1
- package/dist/components/chart.js +1 -1
- package/dist/components/chart.js.map +1 -1
- package/dist/components/checkbox.js +1 -1
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/command.js +2 -2
- package/dist/components/command.js.map +1 -1
- package/dist/components/context-menu.js +1 -1
- package/dist/components/context-menu.js.map +1 -1
- package/dist/components/dialog.js +1 -1
- package/dist/components/dialog.js.map +1 -1
- package/dist/components/drawer.js +1 -1
- package/dist/components/drawer.js.map +1 -1
- package/dist/components/dropdown-menu.js +1 -1
- package/dist/components/dropdown-menu.js.map +1 -1
- package/dist/components/field.js +3 -3
- package/dist/components/field.js.map +1 -1
- package/dist/components/form.js +2 -2
- package/dist/components/form.js.map +1 -1
- package/dist/components/hover-card.js +1 -1
- package/dist/components/hover-card.js.map +1 -1
- package/dist/components/input-group.js +4 -4
- package/dist/components/input-group.js.map +1 -1
- package/dist/components/input-otp.js +1 -1
- package/dist/components/input-otp.js.map +1 -1
- package/dist/components/input.js +1 -1
- package/dist/components/input.js.map +1 -1
- package/dist/components/item.js +2 -2
- package/dist/components/item.js.map +1 -1
- package/dist/components/kbd.js +1 -1
- package/dist/components/kbd.js.map +1 -1
- package/dist/components/label.js +1 -1
- package/dist/components/label.js.map +1 -1
- package/dist/components/menubar.js +1 -1
- package/dist/components/menubar.js.map +1 -1
- package/dist/components/navigation-menu.js +1 -1
- package/dist/components/navigation-menu.js.map +1 -1
- package/dist/components/pagination.js +2 -4
- package/dist/components/pagination.js.map +1 -1
- package/dist/components/progress.js +1 -1
- package/dist/components/progress.js.map +1 -1
- package/dist/components/radio-group.js +1 -1
- package/dist/components/radio-group.js.map +1 -1
- package/dist/components/resizable.js +1 -1
- package/dist/components/resizable.js.map +1 -1
- package/dist/components/scroll-area.js +1 -1
- package/dist/components/scroll-area.js.map +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/select.js.map +1 -1
- package/dist/components/separator.js +1 -1
- package/dist/components/separator.js.map +1 -1
- package/dist/components/sheet.js +1 -1
- package/dist/components/sheet.js.map +1 -1
- package/dist/components/skeleton.js +1 -1
- package/dist/components/skeleton.js.map +1 -1
- package/dist/components/slider.js +1 -1
- package/dist/components/slider.js.map +1 -1
- package/dist/components/spinner.js +1 -1
- package/dist/components/spinner.js.map +1 -1
- package/dist/components/stepper.js +1 -1
- package/dist/components/stepper.js.map +1 -1
- package/dist/components/switch.js +1 -1
- package/dist/components/switch.js.map +1 -1
- package/dist/components/table.js +1 -1
- package/dist/components/table.js.map +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/textarea.js +1 -1
- package/dist/components/textarea.js.map +1 -1
- package/dist/components/toggle-group.js +2 -2
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/toggle.js +1 -1
- package/dist/components/toggle.js.map +1 -1
- package/dist/components/tooltip.js +1 -1
- package/dist/components/tooltip.js.map +1 -1
- package/dist/custom/action-button.js +2 -4
- package/dist/custom/action-button.js.map +1 -1
- package/dist/custom/async-select.js +7 -7
- package/dist/custom/async-select.js.map +1 -1
- package/dist/custom/awesome-not-found.js +3 -3
- package/dist/custom/awesome-not-found.js.map +1 -1
- package/dist/custom/charts/area-chart.js +2 -2
- package/dist/custom/charts/area-chart.js.map +1 -1
- package/dist/custom/charts/bar-chart.js +2 -2
- package/dist/custom/charts/bar-chart.js.map +1 -1
- package/dist/custom/charts/chart-card.js +3 -3
- package/dist/custom/charts/chart-card.js.map +1 -1
- package/dist/custom/charts/pie-chart.js +2 -2
- package/dist/custom/charts/pie-chart.js.map +1 -1
- package/dist/custom/charts/radar-chart.js +2 -2
- package/dist/custom/charts/radar-chart.js.map +1 -1
- package/dist/custom/combobox.js +8 -8
- package/dist/custom/combobox.js.map +1 -1
- package/dist/custom/confirm-dialog.js +3 -3
- package/dist/custom/confirm-dialog.js.map +1 -1
- package/dist/custom/country-selector.js +6 -6
- package/dist/custom/country-selector.js.map +1 -1
- package/dist/custom/date-picker/calendar-rac.js +1 -1
- package/dist/custom/date-picker/calendar-rac.js.map +1 -1
- package/dist/custom/date-picker/datefield-rac.js +1 -1
- package/dist/custom/date-picker/datefield-rac.js.map +1 -1
- package/dist/custom/date-picker/index.js +3 -3
- package/dist/custom/date-picker/index.js.map +1 -1
- package/dist/custom/date-picker-old.js +4 -4
- package/dist/custom/date-picker-old.js.map +1 -1
- package/dist/custom/date-tooltip.js +1 -1
- package/dist/custom/date-tooltip.js.map +1 -1
- package/dist/custom/document-scanner/corner-adjustment/action-buttons.js +1 -1
- package/dist/custom/document-scanner/corner-adjustment/action-buttons.js.map +1 -1
- package/dist/custom/document-scanner/corner-adjustment/corner-handle.js +1 -1
- package/dist/custom/document-scanner/corner-adjustment/corner-handle.js.map +1 -1
- package/dist/custom/document-scanner/index.js +2 -2
- package/dist/custom/document-scanner/index.js.map +1 -1
- package/dist/custom/document-viewer/controllers.js +3 -3
- package/dist/custom/document-viewer/controllers.js.map +1 -1
- package/dist/custom/document-viewer/index.js +1 -1
- package/dist/custom/document-viewer/index.js.map +1 -1
- package/dist/custom/document-viewer/renderers/pdf.js +1 -1
- package/dist/custom/document-viewer/renderers/pdf.js.map +1 -1
- package/dist/custom/email-input/email.js +4 -4
- package/dist/custom/email-input/email.js.map +1 -1
- package/dist/custom/file-uploader.js +6 -6
- package/dist/custom/file-uploader.js.map +1 -1
- package/dist/custom/filter-component/fields/async-select.js +1 -1
- package/dist/custom/filter-component/fields/async-select.js.map +1 -1
- package/dist/custom/filter-component/fields/date.js +3 -3
- package/dist/custom/filter-component/fields/date.js.map +1 -1
- package/dist/custom/filter-component/fields/multi-select.js +1 -1
- package/dist/custom/filter-component/fields/multi-select.js.map +1 -1
- package/dist/custom/filter-component/index.js +4 -4
- package/dist/custom/filter-component/index.js.map +1 -1
- package/dist/custom/image-canvas.js +1 -1
- package/dist/custom/image-canvas.js.map +1 -1
- package/dist/custom/master-data-grid/components/filters/client-filter.js +2 -2
- package/dist/custom/master-data-grid/components/filters/client-filter.js.map +1 -1
- package/dist/custom/master-data-grid/components/filters/multi-filter-dialog.js +2 -2
- package/dist/custom/master-data-grid/components/filters/multi-filter-dialog.js.map +1 -1
- package/dist/custom/master-data-grid/components/filters/server-filter.js +5 -5
- package/dist/custom/master-data-grid/components/filters/server-filter.js.map +1 -1
- package/dist/custom/master-data-grid/components/table/cell-renderer.js +1 -1
- package/dist/custom/master-data-grid/components/table/cell-renderer.js.map +1 -1
- package/dist/custom/master-data-grid/hooks/use-columns.js +1 -1
- package/dist/custom/master-data-grid/hooks/use-columns.js.map +1 -1
- package/dist/custom/multi-select.js +6 -6
- package/dist/custom/multi-select.js.map +1 -1
- package/dist/custom/password-input.js +1 -1
- package/dist/custom/password-input.js.map +1 -1
- package/dist/custom/phone-input.js +2 -2
- package/dist/custom/phone-input.js.map +1 -1
- package/dist/custom/schema-form/custom/label.js +3 -3
- package/dist/custom/schema-form/custom/label.js.map +1 -1
- package/dist/custom/schema-form/fields/base-input-field.js +2 -2
- package/dist/custom/schema-form/fields/base-input-field.js.map +1 -1
- package/dist/custom/schema-form/fields/field.js +2 -2
- package/dist/custom/schema-form/fields/field.js.map +1 -1
- package/dist/custom/schema-form/fields/table-array/array-field-item.js +5 -5
- package/dist/custom/schema-form/fields/table-array/array-field-item.js.map +1 -1
- package/dist/custom/schema-form/fields/table-array/array-field-template.js +3 -3
- package/dist/custom/schema-form/fields/table-array/array-field-template.js.map +1 -1
- package/dist/custom/schema-form/index.js +1 -1
- package/dist/custom/schema-form/index.js.map +1 -1
- package/dist/custom/schema-form/templates/description.js +1 -1
- package/dist/custom/schema-form/templates/description.js.map +1 -1
- package/dist/custom/schema-form/templates/submit.js +2 -2
- package/dist/custom/schema-form/templates/submit.js.map +1 -1
- package/dist/custom/schema-form/utils/schemas.js +1 -1
- package/dist/custom/schema-form/utils/schemas.js.map +1 -1
- package/dist/custom/schema-form/widgets/boolean.js +4 -4
- package/dist/custom/schema-form/widgets/boolean.js.map +1 -1
- package/dist/custom/schema-form/widgets/combobox.js +7 -7
- package/dist/custom/schema-form/widgets/combobox.js.map +1 -1
- package/dist/custom/schema-form/widgets/date.js +1 -1
- package/dist/custom/schema-form/widgets/date.js.map +1 -1
- package/dist/custom/schema-form/widgets/email.js +2 -2
- package/dist/custom/schema-form/widgets/email.js.map +1 -1
- package/dist/custom/schema-form/widgets/password.js +1 -1
- package/dist/custom/schema-form/widgets/password.js.map +1 -1
- package/dist/custom/schema-form/widgets/phone.js +1 -1
- package/dist/custom/schema-form/widgets/phone.js.map +1 -1
- package/dist/custom/schema-form/widgets/select.js +3 -3
- package/dist/custom/schema-form/widgets/select.js.map +1 -1
- package/dist/custom/schema-form/widgets/selectable.js +1 -1
- package/dist/custom/schema-form/widgets/selectable.js.map +1 -1
- package/dist/custom/schema-form/widgets/string-array.js +3 -3
- package/dist/custom/schema-form/widgets/string-array.js.map +1 -1
- package/dist/custom/schema-form/widgets/url.js +2 -2
- package/dist/custom/schema-form/widgets/url.js.map +1 -1
- package/dist/custom/section-layout-v2.js +3 -3
- package/dist/custom/section-layout-v2.js.map +1 -1
- package/dist/custom/select-tabs.js +2 -2
- package/dist/custom/select-tabs.js.map +1 -1
- package/dist/custom/stepper.js +2 -2
- package/dist/custom/stepper.js.map +1 -1
- package/dist/custom/tab-layout.js +2 -2
- package/dist/custom/tab-layout.js.map +1 -1
- package/dist/custom/tanstack-table/fields/tanstack-table-column-header.js +3 -3
- package/dist/custom/tanstack-table/fields/tanstack-table-column-header.js.map +1 -1
- package/dist/custom/tanstack-table/fields/tanstack-table-filter-date.js +4 -4
- package/dist/custom/tanstack-table/fields/tanstack-table-filter-date.js.map +1 -1
- package/dist/custom/tanstack-table/fields/tanstack-table-filter-faceted.js +6 -6
- package/dist/custom/tanstack-table/fields/tanstack-table-filter-faceted.js.map +1 -1
- package/dist/custom/tanstack-table/fields/tanstack-table-filter-text.js +5 -8
- package/dist/custom/tanstack-table/fields/tanstack-table-filter-text.js.map +1 -1
- package/dist/custom/tanstack-table/fields/tanstack-table-pagination.js +2 -2
- package/dist/custom/tanstack-table/fields/tanstack-table-pagination.js.map +1 -1
- package/dist/custom/tanstack-table/fields/tanstack-table-plain-table.js +2 -2
- package/dist/custom/tanstack-table/fields/tanstack-table-plain-table.js.map +1 -1
- package/dist/custom/tanstack-table/fields/tanstack-table-row-actions-confirmation.js +2 -2
- package/dist/custom/tanstack-table/fields/tanstack-table-row-actions-confirmation.js.map +1 -1
- package/dist/custom/tanstack-table/fields/tanstack-table-row-actions-custom-dialog.js +2 -2
- package/dist/custom/tanstack-table/fields/tanstack-table-row-actions-custom-dialog.js.map +1 -1
- package/dist/custom/tanstack-table/fields/tanstack-table-row-actions.js +3 -3
- package/dist/custom/tanstack-table/fields/tanstack-table-row-actions.js.map +1 -1
- package/dist/custom/tanstack-table/fields/tanstack-table-table-actions-custom-dialog.js +3 -3
- package/dist/custom/tanstack-table/fields/tanstack-table-table-actions-custom-dialog.js.map +1 -1
- package/dist/custom/tanstack-table/fields/tanstack-table-table-actions-schemaform-dialog.js +2 -2
- package/dist/custom/tanstack-table/fields/tanstack-table-table-actions-schemaform-dialog.js.map +1 -1
- package/dist/custom/tanstack-table/fields/tanstack-table-toolbar.js +1 -1
- package/dist/custom/tanstack-table/fields/tanstack-table-toolbar.js.map +1 -1
- package/dist/custom/tanstack-table/fields/tanstack-table-view-options.js +2 -2
- package/dist/custom/tanstack-table/fields/tanstack-table-view-options.js.map +1 -1
- package/dist/custom/tanstack-table/utils/columns-by-row-data.js +3 -3
- package/dist/custom/tanstack-table/utils/columns-by-row-data.js.map +1 -1
- package/dist/custom/tanstack-table/utils/editable-columns-by-row-data.js +5 -5
- package/dist/custom/tanstack-table/utils/editable-columns-by-row-data.js.map +1 -1
- package/dist/custom/timeline.js +1 -1
- package/dist/custom/timeline.js.map +1 -1
- package/dist/custom/tree.js +1 -1
- package/dist/custom/tree.js.map +1 -1
- package/dist/custom/webcam.js +2 -2
- package/dist/custom/webcam.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/custom/master-data-grid/hooks/use-columns.tsx"],"sourcesContent":["import { cn } from \"@repo/ayasofyazilim-ui/lib/utils\";\r\nimport { GenericObjectType } from \"@rjsf/utils\";\r\nimport type { ColumnDef } from \"@tanstack/react-table\";\r\nimport { MoreHorizontal, Pencil, Save, X } from \"lucide-react\";\r\nimport { useMemo, type RefObject } from \"react\";\r\nimport { Button } from \"../../../components/button\";\r\nimport { Checkbox } from \"../../../components/checkbox\";\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuTrigger,\r\n} from \"../../../components/dropdown-menu\";\r\nimport type {\r\n CellProps,\r\n ColumnConfig,\r\n ExpandableColumnMeta,\r\n JSONSchema,\r\n MasterDataGridConfig,\r\n MasterDataGridResources,\r\n} from \"../types\";\r\nimport {\r\n generateColumnsFromSchema,\r\n mergeColumns,\r\n} from \"../utils/column-generator\";\r\n\r\nexport interface UseColumnsProps<TData> {\r\n config: MasterDataGridConfig<TData>;\r\n configRef: RefObject<MasterDataGridConfig<TData>>;\r\n schema?: JSONSchema | GenericObjectType;\r\n customColumns?: ColumnConfig<TData>[];\r\n enableRowSelection: boolean;\r\n enableColumnVisibility: boolean;\r\n editingRowsRef: RefObject<Record<string, Record<string, unknown>>>;\r\n updateCellValue: (rowId: string, columnId: string, value: unknown) => void;\r\n getRowId?: (row: TData, index: number) => string;\r\n t?: MasterDataGridResources;\r\n startEditingRow: (rowId: string, row: TData) => void;\r\n cancelEditingRow: (rowId: string, row: TData) => void;\r\n saveEditingRow: (rowId: string, row: TData) => Promise<void>;\r\n}\r\n\r\nexport function useColumns<TData>({\r\n config,\r\n configRef,\r\n schema,\r\n customColumns,\r\n enableRowSelection,\r\n enableColumnVisibility,\r\n editingRowsRef,\r\n updateCellValue,\r\n getRowId,\r\n t,\r\n startEditingRow,\r\n cancelEditingRow,\r\n saveEditingRow,\r\n}: UseColumnsProps<TData>): ColumnDef<TData>[] {\r\n return useMemo<ColumnDef<TData>[]>(() => {\r\n const editingContext = config.editing?.enabled\r\n ? {\r\n get editingRows() {\r\n return editingRowsRef.current;\r\n },\r\n onCellUpdate: updateCellValue,\r\n getRowId: getRowId || ((row: TData, index: number) => String(index)),\r\n }\r\n : undefined;\r\n\r\n const generatedColumns = schema\r\n ? generateColumnsFromSchema<TData>(\r\n schema,\r\n configRef.current.localization,\r\n t,\r\n editingContext,\r\n configRef.current.cellClassName,\r\n configRef.current.dateOptions,\r\n configRef.current.customRenderers,\r\n configRef.current.editing?.errorDisplayMode,\r\n enableColumnVisibility,\r\n config.expansion?.expanderColumns,\r\n config.schemaColumns\r\n )\r\n : [];\r\n\r\n const mergeContext = editingContext\r\n ? {\r\n get editingRows() {\r\n return editingRowsRef.current;\r\n },\r\n getRowId: editingContext.getRowId,\r\n }\r\n : undefined;\r\n\r\n const merged = mergeColumns<TData>(\r\n generatedColumns,\r\n customColumns,\r\n mergeContext,\r\n enableColumnVisibility,\r\n t\r\n );\r\n\r\n const mergedWithExpansion = merged.map((col) => {\r\n const shouldExpandOnClick =\r\n (col.meta as ExpandableColumnMeta)?.isExpanderColumn ||\r\n customColumns?.find((c) => c.id === col.id)?.isExpanderColumn;\r\n\r\n if (!shouldExpandOnClick || !configRef.current.expansion?.enabled) {\r\n return col;\r\n }\r\n\r\n const originalCell = col.cell;\r\n return {\r\n ...col,\r\n cell: (props: CellProps<TData>) => {\r\n const content =\r\n typeof originalCell === \"function\"\r\n ? originalCell(props)\r\n : originalCell;\r\n\r\n return (\r\n <div\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n props.row.toggleExpanded();\r\n }}\r\n className=\"cursor-pointer hover:bg-muted/50 h-full flex items-center\"\r\n >\r\n {content}\r\n </div>\r\n );\r\n },\r\n };\r\n });\r\n\r\n const finalColumns: ColumnDef<TData>[] = [];\r\n\r\n if (enableRowSelection) {\r\n finalColumns.push({\r\n id: \"select\",\r\n header: ({ table }) => (\r\n <Checkbox\r\n checked={table.getIsAllPageRowsSelected()}\r\n onCheckedChange={(value) =>\r\n table.toggleAllPageRowsSelected(!!value)\r\n }\r\n aria-label={t?.[\"select_all\"]}\r\n />\r\n ),\r\n cell: ({ row }) => (\r\n <Checkbox\r\n checked={row.getIsSelected()}\r\n onCheckedChange={(value) => row.toggleSelected(!!value)}\r\n aria-label={t?.[\"select_row\"]}\r\n />\r\n ),\r\n enableSorting: false,\r\n enableHiding: false,\r\n });\r\n }\r\n\r\n finalColumns.push(...mergedWithExpansion);\r\n\r\n if (config.rowActions && config.rowActions.length > 0) {\r\n finalColumns.push({\r\n id: \"actions\",\r\n header: t?.[\"actions\"],\r\n cell: ({ row }) => {\r\n const rowActions = config.rowActions?.filter((action) => {\r\n if (typeof action.hidden === \"function\") {\r\n return !action.hidden(row.original);\r\n }\r\n return !action.hidden;\r\n });\r\n\r\n if (!rowActions || rowActions.length === 0) return null;\r\n\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon-xs\"\r\n className=\"w-full\"\r\n aria-label={t?.[\"open_menu\"]}\r\n >\r\n <MoreHorizontal />\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\">\r\n {rowActions.map((action) => {\r\n const disabled =\r\n typeof action.disabled === \"function\"\r\n ? action.disabled(row.original)\r\n : action.disabled;\r\n\r\n // For custom render, let the rendered content handle onClick\r\n if (\"render\" in action && action.render) {\r\n return (\r\n <DropdownMenuItem\r\n key={action.id}\r\n disabled={disabled}\r\n className={cn(\"w-full\", action.className)}\r\n onSelect={(e) => e.preventDefault()}\r\n asChild\r\n >\r\n {action.render(row.original)}\r\n </DropdownMenuItem>\r\n );\r\n }\r\n\r\n // For standard label action, handle onClick at DropdownMenuItem level\r\n if (\"label\" in action) {\r\n return (\r\n <DropdownMenuItem\r\n key={action.id}\r\n onClick={(e) => action.onClick?.(row.original, e)}\r\n disabled={disabled}\r\n className={action.className}\r\n >\r\n {action.icon && <action.icon className=\"size-3.5\" />}\r\n {typeof action.label === \"function\"\r\n ? action.label(row.original)\r\n : action.label}\r\n </DropdownMenuItem>\r\n );\r\n }\r\n\r\n return null;\r\n })}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n },\r\n enableSorting: false,\r\n enableHiding: false,\r\n });\r\n }\r\n\r\n if (config.editing?.enabled && config.editing.mode === \"row\") {\r\n finalColumns.push({\r\n id: \"edit-actions\",\r\n header: t?.[\"edit\"] || \"Edit\",\r\n cell: ({ row }) => {\r\n const rowId = getRowId\r\n ? getRowId(row.original, row.index)\r\n : String(row.index);\r\n const isEditing = !!editingRowsRef.current[rowId];\r\n const isRowEditable =\r\n !config.editing?.isRowEditable ||\r\n config.editing.isRowEditable(row.original);\r\n\r\n if (!isRowEditable) return null;\r\n\r\n return isEditing ? (\r\n <div className=\"flex gap-1\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => saveEditingRow(rowId, row.original)}\r\n className=\"h-7 px-2\"\r\n aria-label={t?.[\"save\"]}\r\n >\r\n <Save className=\"size-3.5\" />\r\n </Button>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => cancelEditingRow(rowId, row.original)}\r\n className=\"h-7 px-2\"\r\n aria-label={t?.[\"cancel\"]}\r\n >\r\n <X className=\"size-3.5\" />\r\n </Button>\r\n </div>\r\n ) : (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => startEditingRow(rowId, row.original)}\r\n className=\"h-7 px-2\"\r\n aria-label={t?.[\"edit\"]}\r\n >\r\n <Pencil className=\"size-3.5\" />\r\n </Button>\r\n );\r\n },\r\n enableSorting: false,\r\n enableHiding: false,\r\n });\r\n }\r\n\r\n if (config.columnOrder && config.columnOrder.length > 0) {\r\n const orderedColumns: ColumnDef<TData>[] = [];\r\n const columnMap = new Map(finalColumns.map((col) => [col.id, col]));\r\n\r\n for (const colId of config.columnOrder) {\r\n const col = columnMap.get(String(colId));\r\n if (col) {\r\n orderedColumns.push(col);\r\n columnMap.delete(String(colId));\r\n }\r\n }\r\n orderedColumns.push(...Array.from(columnMap.values()));\r\n\r\n return orderedColumns;\r\n }\r\n\r\n if (\r\n !config.columnOrder &&\r\n config.columnVisibility?.mode === \"show\" &&\r\n config.columnVisibility.columns.length > 0\r\n ) {\r\n const orderedColumns: ColumnDef<TData>[] = [];\r\n const columnMap = new Map(finalColumns.map((col) => [col.id, col]));\r\n\r\n for (const colId of config.columnVisibility.columns) {\r\n const col = columnMap.get(String(colId));\r\n if (col) {\r\n orderedColumns.push(col);\r\n columnMap.delete(String(colId));\r\n }\r\n }\r\n\r\n orderedColumns.push(...Array.from(columnMap.values()));\r\n\r\n return orderedColumns;\r\n }\r\n\r\n return finalColumns;\r\n }, [\r\n schema,\r\n customColumns,\r\n enableRowSelection,\r\n enableColumnVisibility,\r\n config.expansion,\r\n config.rowActions,\r\n config.editing,\r\n config.columnOrder,\r\n config.columnVisibility,\r\n config.schemaColumns,\r\n config.cellClassName,\r\n config.dateOptions,\r\n config.customRenderers,\r\n configRef,\r\n editingRowsRef,\r\n updateCellValue,\r\n getRowId,\r\n t,\r\n startEditingRow,\r\n cancelEditingRow,\r\n saveEditingRow,\r\n ]);\r\n}\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/custom/master-data-grid/hooks/use-columns.tsx"],"sourcesContent":["import { cn } from \"@ayasofyazilim/ui/lib/utils\";\r\nimport { GenericObjectType } from \"@rjsf/utils\";\r\nimport type { ColumnDef } from \"@tanstack/react-table\";\r\nimport { MoreHorizontal, Pencil, Save, X } from \"lucide-react\";\r\nimport { useMemo, type RefObject } from \"react\";\r\nimport { Button } from \"../../../components/button\";\r\nimport { Checkbox } from \"../../../components/checkbox\";\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuTrigger,\r\n} from \"../../../components/dropdown-menu\";\r\nimport type {\r\n CellProps,\r\n ColumnConfig,\r\n ExpandableColumnMeta,\r\n JSONSchema,\r\n MasterDataGridConfig,\r\n MasterDataGridResources,\r\n} from \"../types\";\r\nimport {\r\n generateColumnsFromSchema,\r\n mergeColumns,\r\n} from \"../utils/column-generator\";\r\n\r\nexport interface UseColumnsProps<TData> {\r\n config: MasterDataGridConfig<TData>;\r\n configRef: RefObject<MasterDataGridConfig<TData>>;\r\n schema?: JSONSchema | GenericObjectType;\r\n customColumns?: ColumnConfig<TData>[];\r\n enableRowSelection: boolean;\r\n enableColumnVisibility: boolean;\r\n editingRowsRef: RefObject<Record<string, Record<string, unknown>>>;\r\n updateCellValue: (rowId: string, columnId: string, value: unknown) => void;\r\n getRowId?: (row: TData, index: number) => string;\r\n t?: MasterDataGridResources;\r\n startEditingRow: (rowId: string, row: TData) => void;\r\n cancelEditingRow: (rowId: string, row: TData) => void;\r\n saveEditingRow: (rowId: string, row: TData) => Promise<void>;\r\n}\r\n\r\nexport function useColumns<TData>({\r\n config,\r\n configRef,\r\n schema,\r\n customColumns,\r\n enableRowSelection,\r\n enableColumnVisibility,\r\n editingRowsRef,\r\n updateCellValue,\r\n getRowId,\r\n t,\r\n startEditingRow,\r\n cancelEditingRow,\r\n saveEditingRow,\r\n}: UseColumnsProps<TData>): ColumnDef<TData>[] {\r\n return useMemo<ColumnDef<TData>[]>(() => {\r\n const editingContext = config.editing?.enabled\r\n ? {\r\n get editingRows() {\r\n return editingRowsRef.current;\r\n },\r\n onCellUpdate: updateCellValue,\r\n getRowId: getRowId || ((row: TData, index: number) => String(index)),\r\n }\r\n : undefined;\r\n\r\n const generatedColumns = schema\r\n ? generateColumnsFromSchema<TData>(\r\n schema,\r\n configRef.current.localization,\r\n t,\r\n editingContext,\r\n configRef.current.cellClassName,\r\n configRef.current.dateOptions,\r\n configRef.current.customRenderers,\r\n configRef.current.editing?.errorDisplayMode,\r\n enableColumnVisibility,\r\n config.expansion?.expanderColumns,\r\n config.schemaColumns,\r\n )\r\n : [];\r\n\r\n const mergeContext = editingContext\r\n ? {\r\n get editingRows() {\r\n return editingRowsRef.current;\r\n },\r\n getRowId: editingContext.getRowId,\r\n }\r\n : undefined;\r\n\r\n const merged = mergeColumns<TData>(\r\n generatedColumns,\r\n customColumns,\r\n mergeContext,\r\n enableColumnVisibility,\r\n t,\r\n );\r\n\r\n const mergedWithExpansion = merged.map((col) => {\r\n const shouldExpandOnClick =\r\n (col.meta as ExpandableColumnMeta)?.isExpanderColumn ||\r\n customColumns?.find((c) => c.id === col.id)?.isExpanderColumn;\r\n\r\n if (!shouldExpandOnClick || !configRef.current.expansion?.enabled) {\r\n return col;\r\n }\r\n\r\n const originalCell = col.cell;\r\n return {\r\n ...col,\r\n cell: (props: CellProps<TData>) => {\r\n const content =\r\n typeof originalCell === \"function\"\r\n ? originalCell(props)\r\n : originalCell;\r\n\r\n return (\r\n <div\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n props.row.toggleExpanded();\r\n }}\r\n className=\"cursor-pointer hover:bg-muted/50 h-full flex items-center\"\r\n >\r\n {content}\r\n </div>\r\n );\r\n },\r\n };\r\n });\r\n\r\n const finalColumns: ColumnDef<TData>[] = [];\r\n\r\n if (enableRowSelection) {\r\n finalColumns.push({\r\n id: \"select\",\r\n header: ({ table }) => (\r\n <Checkbox\r\n checked={table.getIsAllPageRowsSelected()}\r\n onCheckedChange={(value) =>\r\n table.toggleAllPageRowsSelected(!!value)\r\n }\r\n aria-label={t?.[\"select_all\"]}\r\n />\r\n ),\r\n cell: ({ row }) => (\r\n <Checkbox\r\n checked={row.getIsSelected()}\r\n onCheckedChange={(value) => row.toggleSelected(!!value)}\r\n aria-label={t?.[\"select_row\"]}\r\n />\r\n ),\r\n enableSorting: false,\r\n enableHiding: false,\r\n });\r\n }\r\n\r\n finalColumns.push(...mergedWithExpansion);\r\n\r\n if (config.rowActions && config.rowActions.length > 0) {\r\n finalColumns.push({\r\n id: \"actions\",\r\n header: t?.[\"actions\"],\r\n cell: ({ row }) => {\r\n const rowActions = config.rowActions?.filter((action) => {\r\n if (typeof action.hidden === \"function\") {\r\n return !action.hidden(row.original);\r\n }\r\n return !action.hidden;\r\n });\r\n\r\n if (!rowActions || rowActions.length === 0) return null;\r\n\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon-xs\"\r\n className=\"w-full\"\r\n aria-label={t?.[\"open_menu\"]}\r\n >\r\n <MoreHorizontal />\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\">\r\n {rowActions.map((action) => {\r\n const disabled =\r\n typeof action.disabled === \"function\"\r\n ? action.disabled(row.original)\r\n : action.disabled;\r\n\r\n // For custom render, let the rendered content handle onClick\r\n if (\"render\" in action && action.render) {\r\n return (\r\n <DropdownMenuItem\r\n key={action.id}\r\n disabled={disabled}\r\n className={cn(\"w-full\", action.className)}\r\n onSelect={(e) => e.preventDefault()}\r\n asChild\r\n >\r\n {action.render(row.original)}\r\n </DropdownMenuItem>\r\n );\r\n }\r\n\r\n // For standard label action, handle onClick at DropdownMenuItem level\r\n if (\"label\" in action) {\r\n return (\r\n <DropdownMenuItem\r\n key={action.id}\r\n onClick={(e) => action.onClick?.(row.original, e)}\r\n disabled={disabled}\r\n className={action.className}\r\n >\r\n {action.icon && <action.icon className=\"size-3.5\" />}\r\n {typeof action.label === \"function\"\r\n ? action.label(row.original)\r\n : action.label}\r\n </DropdownMenuItem>\r\n );\r\n }\r\n\r\n return null;\r\n })}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n },\r\n enableSorting: false,\r\n enableHiding: false,\r\n });\r\n }\r\n\r\n if (config.editing?.enabled && config.editing.mode === \"row\") {\r\n finalColumns.push({\r\n id: \"edit-actions\",\r\n header: t?.[\"edit\"] || \"Edit\",\r\n cell: ({ row }) => {\r\n const rowId = getRowId\r\n ? getRowId(row.original, row.index)\r\n : String(row.index);\r\n const isEditing = !!editingRowsRef.current[rowId];\r\n const isRowEditable =\r\n !config.editing?.isRowEditable ||\r\n config.editing.isRowEditable(row.original);\r\n\r\n if (!isRowEditable) return null;\r\n\r\n return isEditing ? (\r\n <div className=\"flex gap-1\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => saveEditingRow(rowId, row.original)}\r\n className=\"h-7 px-2\"\r\n aria-label={t?.[\"save\"]}\r\n >\r\n <Save className=\"size-3.5\" />\r\n </Button>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => cancelEditingRow(rowId, row.original)}\r\n className=\"h-7 px-2\"\r\n aria-label={t?.[\"cancel\"]}\r\n >\r\n <X className=\"size-3.5\" />\r\n </Button>\r\n </div>\r\n ) : (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => startEditingRow(rowId, row.original)}\r\n className=\"h-7 px-2\"\r\n aria-label={t?.[\"edit\"]}\r\n >\r\n <Pencil className=\"size-3.5\" />\r\n </Button>\r\n );\r\n },\r\n enableSorting: false,\r\n enableHiding: false,\r\n });\r\n }\r\n\r\n if (config.columnOrder && config.columnOrder.length > 0) {\r\n const orderedColumns: ColumnDef<TData>[] = [];\r\n const columnMap = new Map(finalColumns.map((col) => [col.id, col]));\r\n\r\n for (const colId of config.columnOrder) {\r\n const col = columnMap.get(String(colId));\r\n if (col) {\r\n orderedColumns.push(col);\r\n columnMap.delete(String(colId));\r\n }\r\n }\r\n orderedColumns.push(...Array.from(columnMap.values()));\r\n\r\n return orderedColumns;\r\n }\r\n\r\n if (\r\n !config.columnOrder &&\r\n config.columnVisibility?.mode === \"show\" &&\r\n config.columnVisibility.columns.length > 0\r\n ) {\r\n const orderedColumns: ColumnDef<TData>[] = [];\r\n const columnMap = new Map(finalColumns.map((col) => [col.id, col]));\r\n\r\n for (const colId of config.columnVisibility.columns) {\r\n const col = columnMap.get(String(colId));\r\n if (col) {\r\n orderedColumns.push(col);\r\n columnMap.delete(String(colId));\r\n }\r\n }\r\n\r\n orderedColumns.push(...Array.from(columnMap.values()));\r\n\r\n return orderedColumns;\r\n }\r\n\r\n return finalColumns;\r\n }, [\r\n schema,\r\n customColumns,\r\n enableRowSelection,\r\n enableColumnVisibility,\r\n config.expansion,\r\n config.rowActions,\r\n config.editing,\r\n config.columnOrder,\r\n config.columnVisibility,\r\n config.schemaColumns,\r\n config.cellClassName,\r\n config.dateOptions,\r\n config.customRenderers,\r\n configRef,\r\n editingRowsRef,\r\n updateCellValue,\r\n getRowId,\r\n t,\r\n startEditingRow,\r\n cancelEditingRow,\r\n saveEditingRow,\r\n ]);\r\n}\r\n"],"mappings":"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","names":[]}
|
|
@@ -9,15 +9,15 @@ import {
|
|
|
9
9
|
XIcon,
|
|
10
10
|
WandSparkles
|
|
11
11
|
} from "lucide-react";
|
|
12
|
-
import { cn } from "@
|
|
13
|
-
import { Separator } from "@
|
|
14
|
-
import { Button } from "@
|
|
15
|
-
import { Badge } from "@
|
|
12
|
+
import { cn } from "@ayasofyazilim/ui/lib/utils";
|
|
13
|
+
import { Separator } from "@ayasofyazilim/ui/components/separator";
|
|
14
|
+
import { Button } from "@ayasofyazilim/ui/components/button";
|
|
15
|
+
import { Badge } from "@ayasofyazilim/ui/components/badge";
|
|
16
16
|
import {
|
|
17
17
|
Popover,
|
|
18
18
|
PopoverContent,
|
|
19
19
|
PopoverTrigger
|
|
20
|
-
} from "@
|
|
20
|
+
} from "@ayasofyazilim/ui/components/popover";
|
|
21
21
|
import {
|
|
22
22
|
Command,
|
|
23
23
|
CommandEmpty,
|
|
@@ -26,7 +26,7 @@ import {
|
|
|
26
26
|
CommandItem,
|
|
27
27
|
CommandList,
|
|
28
28
|
CommandSeparator
|
|
29
|
-
} from "@
|
|
29
|
+
} from "@ayasofyazilim/ui/components/command";
|
|
30
30
|
const multiSelectVariants = cva(
|
|
31
31
|
"m-1 transition ease-in-out delay-150 hover:-translate-y-1 hover:scale-110 duration-300",
|
|
32
32
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/custom/multi-select.tsx"],"sourcesContent":["\"use client\";\r\n\r\n// src/components/multi-select.tsx\r\nimport * as React from \"react\";\r\nimport { cva, type VariantProps } from \"class-variance-authority\";\r\nimport {\r\n CheckIcon,\r\n XCircle,\r\n ChevronDown,\r\n XIcon,\r\n WandSparkles,\r\n} from \"lucide-react\";\r\n\r\nimport { cn } from \"@repo/ayasofyazilim-ui/lib/utils\";\r\nimport { Separator } from \"@repo/ayasofyazilim-ui/components/separator\";\r\nimport { Button } from \"@repo/ayasofyazilim-ui/components/button\";\r\nimport { Badge } from \"@repo/ayasofyazilim-ui/components/badge\";\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from \"@repo/ayasofyazilim-ui/components/popover\";\r\nimport {\r\n Command,\r\n CommandEmpty,\r\n CommandGroup,\r\n CommandInput,\r\n CommandItem,\r\n CommandList,\r\n CommandSeparator,\r\n} from \"@repo/ayasofyazilim-ui/components/command\";\r\n\r\n/**\r\n * Variants for the multi-select component to handle different styles.\r\n * Uses class-variance-authority (cva) to define different styles based on \"variant\" prop.\r\n */\r\nconst multiSelectVariants = cva(\r\n \"m-1 transition ease-in-out delay-150 hover:-translate-y-1 hover:scale-110 duration-300\",\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n \"border-foreground/10 text-foreground bg-card hover:bg-card/80\",\r\n secondary:\r\n \"border-foreground/10 bg-secondary text-secondary-foreground hover:bg-secondary/80\",\r\n destructive:\r\n \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\r\n inverted: \"inverted\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n },\r\n }\r\n);\r\n\r\n/**\r\n * Props for MultiSelect component\r\n */\r\nexport interface MultiSelectProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n VariantProps<typeof multiSelectVariants> {\r\n /**\r\n * Animation duration in seconds for the visual effects (e.g., bouncing badges).\r\n * Optional, defaults to 0 (no animation).\r\n */\r\n animation?: number;\r\n\r\n /**\r\n * If true, renders the multi-select component as a child of another component.\r\n * Optional, defaults to false.\r\n */\r\n asChild?: boolean;\r\n\r\n /**\r\n * Additional class names to apply custom styles to the multi-select component.\r\n * Optional, can be used to add custom styles.\r\n */\r\n className?: string;\r\n\r\n /** The default selected values when the component mounts. */\r\n defaultValue?: string[];\r\n\r\n /**\r\n * Maximum number of items to display. Extra selected items will be summarized.\r\n * Optional, defaults to 3.\r\n */\r\n maxCount?: number;\r\n\r\n /**\r\n * The modality of the popover. When set to true, interaction with outside elements\r\n * will be disabled and only popover content will be visible to screen readers.\r\n * Optional, defaults to false.\r\n */\r\n modalPopover?: boolean;\r\n\r\n /**\r\n * Callback function triggered when the selected values change.\r\n * Receives an array of the new selected values.\r\n */\r\n onValueChange?: (value: string[]) => void;\r\n\r\n /**\r\n * An array of option objects to be displayed in the multi-select component.\r\n * Each option object has a label, value, and an optional icon.\r\n */\r\n options: {\r\n /** Optional icon component to display alongside the option. */\r\n icon?: React.ComponentType<{ className?: string }>;\r\n /** The text to display for the option. */\r\n label: string;\r\n /** The unique value associated with the option. */\r\n value: string;\r\n /** Optional badge component to display alongside the option. */\r\n children?: React.ReactNode;\r\n disabled?: boolean;\r\n }[];\r\n\r\n /**\r\n * Placeholder text to be displayed when no values are selected.\r\n * Optional, defaults to \"Select options\".\r\n */\r\n placeholder?: string;\r\n\r\n /**\r\n * selectAllLabel text to be displayed for select all option.\r\n * Optional, defaults to \"Select all\".\r\n */\r\n selectAllLabel?: string;\r\n\r\n /**\r\n * If true, the multi-select component will be disabled.\r\n * Optional, defaults to false.\r\n */\r\n disabled?: boolean;\r\n}\r\n\r\nexport const MultiSelect = React.forwardRef<\r\n HTMLButtonElement,\r\n MultiSelectProps\r\n>(\r\n (\r\n {\r\n options,\r\n onValueChange,\r\n variant,\r\n defaultValue = [],\r\n placeholder = \"Select options\",\r\n selectAllLabel = \"Select all\",\r\n animation = 0,\r\n maxCount = 3,\r\n modalPopover = false,\r\n className,\r\n disabled,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const [selectedValues, setSelectedValues] =\r\n React.useState<string[]>(defaultValue);\r\n const previousDefaultValue = React.useRef<string[]>(defaultValue);\r\n React.useEffect(() => {\r\n if (\r\n JSON.stringify(previousDefaultValue.current) !==\r\n JSON.stringify(defaultValue)\r\n ) {\r\n setSelectedValues(defaultValue);\r\n previousDefaultValue.current = defaultValue;\r\n }\r\n }, [defaultValue]);\r\n const [isPopoverOpen, setIsPopoverOpen] = React.useState(false);\r\n const [isAnimating, setIsAnimating] = React.useState(false);\r\n\r\n const handleInputKeyDown = (\r\n event: React.KeyboardEvent<HTMLInputElement>\r\n ) => {\r\n if (event.key === \"Enter\") {\r\n setIsPopoverOpen(true);\r\n } else if (event.key === \"Backspace\" && !event.currentTarget.value) {\r\n const newSelectedValues = [...selectedValues];\r\n newSelectedValues.pop();\r\n setSelectedValues(newSelectedValues);\r\n if (onValueChange) onValueChange(newSelectedValues);\r\n }\r\n };\r\n\r\n const toggleOption = (option: string) => {\r\n const newSelectedValues = selectedValues.includes(option)\r\n ? selectedValues.filter((value) => value !== option)\r\n : [...selectedValues, option];\r\n setSelectedValues(newSelectedValues);\r\n if (onValueChange) onValueChange(newSelectedValues);\r\n };\r\n\r\n const handleClear = () => {\r\n setSelectedValues(\r\n selectedValues.filter(\r\n (value) => !options.map((o) => !o.disabled && o.value).includes(value)\r\n )\r\n );\r\n if (onValueChange) onValueChange([]);\r\n };\r\n\r\n const handleTogglePopover = () => {\r\n setIsPopoverOpen((prev) => !prev);\r\n };\r\n\r\n const clearExtraOptions = () => {\r\n const newSelectedValues = selectedValues.slice(0, maxCount);\r\n setSelectedValues(newSelectedValues);\r\n if (onValueChange) onValueChange(newSelectedValues);\r\n };\r\n\r\n const toggleAll = () => {\r\n if (selectedValues.length === options.length) {\r\n handleClear();\r\n } else {\r\n const allValues = options.map((option) => option.value);\r\n setSelectedValues(allValues);\r\n if (onValueChange) onValueChange(allValues);\r\n }\r\n };\r\n\r\n return (\r\n <Popover\r\n open={isPopoverOpen}\r\n onOpenChange={setIsPopoverOpen}\r\n modal={modalPopover}\r\n >\r\n <PopoverTrigger asChild className=\"w-full\">\r\n <Button\r\n ref={ref}\r\n data-testid={props.id}\r\n type=\"button\"\r\n disabled={disabled}\r\n onClick={handleTogglePopover}\r\n className={cn(\r\n \"flex w-full p-1 rounded-md border min-h-9 h-auto items-center justify-between bg-inherit hover:bg-inherit\",\r\n className\r\n )}\r\n >\r\n {selectedValues.length > 0 ? (\r\n <div className=\"flex justify-between items-center w-full\">\r\n <div className=\"flex flex-wrap items-center\">\r\n {selectedValues.slice(0, maxCount).map((value) => {\r\n const option = options.find((o) => o.value === value);\r\n const IconComponent = option?.icon;\r\n return (\r\n <Badge\r\n key={value}\r\n className={cn(\r\n isAnimating ? \"animate-bounce\" : \"\",\r\n multiSelectVariants({ variant })\r\n )}\r\n style={{ animationDuration: `${animation}s` }}\r\n >\r\n {IconComponent && (\r\n <IconComponent className=\"h-4 w-4 mr-2\" />\r\n )}\r\n {option?.label}\r\n {!option?.disabled && (\r\n <XCircle\r\n className=\"ml-2 h-4 w-4 cursor-pointer\"\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n toggleOption(value);\r\n }}\r\n />\r\n )}\r\n </Badge>\r\n );\r\n })}\r\n {selectedValues.length > maxCount && (\r\n <Badge\r\n className={cn(\r\n \"bg-transparent text-foreground border-foreground/1 hover:bg-transparent\",\r\n isAnimating ? \"animate-bounce\" : \"\",\r\n multiSelectVariants({ variant })\r\n )}\r\n style={{ animationDuration: `${animation}s` }}\r\n >\r\n {`+ ${selectedValues.length - maxCount} more`}\r\n <XCircle\r\n className=\"ml-2 h-4 w-4 cursor-pointer\"\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n clearExtraOptions();\r\n }}\r\n />\r\n </Badge>\r\n )}\r\n </div>\r\n <div className=\"flex items-center justify-between\">\r\n {options.filter((x) => x.disabled).length !==\r\n options.length && (\r\n <XIcon\r\n className=\"h-4 mx-2 cursor-pointer text-muted-foreground\"\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n handleClear();\r\n }}\r\n />\r\n )}\r\n <Separator\r\n orientation=\"vertical\"\r\n className=\"flex min-h-6 h-full\"\r\n />\r\n <ChevronDown className=\"h-4 mx-2 cursor-pointer text-muted-foreground\" />\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"flex items-center justify-between w-full mx-auto\">\r\n <span className=\"text-sm text-black mx-3 font-normal\">\r\n {placeholder}\r\n </span>\r\n <ChevronDown className=\"h-4 cursor-pointer text-muted-foreground mx-2\" />\r\n </div>\r\n )}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n className=\"p-0\"\r\n onEscapeKeyDown={() => setIsPopoverOpen(false)}\r\n >\r\n <Command className=\"w-full\">\r\n <CommandInput\r\n data-testid={`${props.id}_search`}\r\n placeholder=\"Search...\"\r\n onKeyDown={handleInputKeyDown}\r\n />\r\n <CommandList>\r\n <CommandEmpty>No results found.</CommandEmpty>\r\n <CommandGroup>\r\n <CommandItem\r\n data-testid={`${props.id}_select_all`}\r\n key=\"all\"\r\n onSelect={toggleAll}\r\n className=\"cursor-pointer\"\r\n disabled={\r\n options.filter((x) => x.disabled).length === options.length\r\n }\r\n >\r\n <div\r\n className={cn(\r\n \"mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary\",\r\n selectedValues.length === options.length\r\n ? \"bg-primary text-primary-foreground\"\r\n : \"opacity-50 [&_svg]:invisible\"\r\n )}\r\n >\r\n <CheckIcon className=\"h-4 w-4\" />\r\n </div>\r\n <span>({selectAllLabel})</span>\r\n </CommandItem>\r\n {options.map((option) => {\r\n const isSelected = selectedValues.includes(option.value);\r\n return (\r\n <CommandItem\r\n data-testid={`${props.id}_${option.value}`}\r\n key={option.value}\r\n onSelect={() => toggleOption(option.value)}\r\n className=\"cursor-pointer\"\r\n disabled={option.disabled}\r\n >\r\n <div\r\n className={cn(\r\n \"mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary\",\r\n isSelected\r\n ? \"bg-primary text-primary-foreground\"\r\n : \"opacity-50 [&_svg]:invisible\"\r\n )}\r\n >\r\n <CheckIcon className=\"h-4 w-4\" />\r\n </div>\r\n {option.icon && (\r\n <option.icon className=\"mr-2 h-4 w-4 text-muted-foreground\" />\r\n )}\r\n <span>{option.label}</span>\r\n {option.children}\r\n </CommandItem>\r\n );\r\n })}\r\n </CommandGroup>\r\n <CommandSeparator />\r\n <CommandGroup>\r\n <div className=\"flex items-center justify-between\">\r\n {selectedValues.length > 0 && (\r\n <>\r\n <CommandItem\r\n data-testid={`${props.id}_clear`}\r\n onSelect={handleClear}\r\n className=\"flex-1 justify-center cursor-pointer\"\r\n disabled={\r\n options.filter((x) => x.disabled).length ===\r\n options.length\r\n }\r\n >\r\n Clear\r\n </CommandItem>\r\n <Separator\r\n orientation=\"vertical\"\r\n className=\"flex min-h-6 h-full\"\r\n />\r\n </>\r\n )}\r\n <CommandItem\r\n data-testid={`${props.id}_close`}\r\n onSelect={() => setIsPopoverOpen(false)}\r\n className=\"flex-1 justify-center cursor-pointer max-w-full\"\r\n >\r\n Close\r\n </CommandItem>\r\n </div>\r\n </CommandGroup>\r\n </CommandList>\r\n </Command>\r\n </PopoverContent>\r\n {animation > 0 && selectedValues.length > 0 && (\r\n <WandSparkles\r\n className={cn(\r\n \"cursor-pointer my-2 text-foreground bg-background w-3 h-3\",\r\n isAnimating ? \"\" : \"text-muted-foreground\"\r\n )}\r\n onClick={() => setIsAnimating(!isAnimating)}\r\n />\r\n )}\r\n </Popover>\r\n );\r\n }\r\n);\r\n\r\nMultiSelect.displayName = \"MultiSelect\";\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/custom/multi-select.tsx"],"sourcesContent":["\"use client\";\r\n\r\n// src/components/multi-select.tsx\r\nimport * as React from \"react\";\r\nimport { cva, type VariantProps } from \"class-variance-authority\";\r\nimport {\r\n CheckIcon,\r\n XCircle,\r\n ChevronDown,\r\n XIcon,\r\n WandSparkles,\r\n} from \"lucide-react\";\r\n\r\nimport { cn } from \"@ayasofyazilim/ui/lib/utils\";\r\nimport { Separator } from \"@ayasofyazilim/ui/components/separator\";\r\nimport { Button } from \"@ayasofyazilim/ui/components/button\";\r\nimport { Badge } from \"@ayasofyazilim/ui/components/badge\";\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from \"@ayasofyazilim/ui/components/popover\";\r\nimport {\r\n Command,\r\n CommandEmpty,\r\n CommandGroup,\r\n CommandInput,\r\n CommandItem,\r\n CommandList,\r\n CommandSeparator,\r\n} from \"@ayasofyazilim/ui/components/command\";\r\n\r\n/**\r\n * Variants for the multi-select component to handle different styles.\r\n * Uses class-variance-authority (cva) to define different styles based on \"variant\" prop.\r\n */\r\nconst multiSelectVariants = cva(\r\n \"m-1 transition ease-in-out delay-150 hover:-translate-y-1 hover:scale-110 duration-300\",\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n \"border-foreground/10 text-foreground bg-card hover:bg-card/80\",\r\n secondary:\r\n \"border-foreground/10 bg-secondary text-secondary-foreground hover:bg-secondary/80\",\r\n destructive:\r\n \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\r\n inverted: \"inverted\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n },\r\n },\r\n);\r\n\r\n/**\r\n * Props for MultiSelect component\r\n */\r\nexport interface MultiSelectProps\r\n extends\r\n React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n VariantProps<typeof multiSelectVariants> {\r\n /**\r\n * Animation duration in seconds for the visual effects (e.g., bouncing badges).\r\n * Optional, defaults to 0 (no animation).\r\n */\r\n animation?: number;\r\n\r\n /**\r\n * If true, renders the multi-select component as a child of another component.\r\n * Optional, defaults to false.\r\n */\r\n asChild?: boolean;\r\n\r\n /**\r\n * Additional class names to apply custom styles to the multi-select component.\r\n * Optional, can be used to add custom styles.\r\n */\r\n className?: string;\r\n\r\n /** The default selected values when the component mounts. */\r\n defaultValue?: string[];\r\n\r\n /**\r\n * Maximum number of items to display. Extra selected items will be summarized.\r\n * Optional, defaults to 3.\r\n */\r\n maxCount?: number;\r\n\r\n /**\r\n * The modality of the popover. When set to true, interaction with outside elements\r\n * will be disabled and only popover content will be visible to screen readers.\r\n * Optional, defaults to false.\r\n */\r\n modalPopover?: boolean;\r\n\r\n /**\r\n * Callback function triggered when the selected values change.\r\n * Receives an array of the new selected values.\r\n */\r\n onValueChange?: (value: string[]) => void;\r\n\r\n /**\r\n * An array of option objects to be displayed in the multi-select component.\r\n * Each option object has a label, value, and an optional icon.\r\n */\r\n options: {\r\n /** Optional icon component to display alongside the option. */\r\n icon?: React.ComponentType<{ className?: string }>;\r\n /** The text to display for the option. */\r\n label: string;\r\n /** The unique value associated with the option. */\r\n value: string;\r\n /** Optional badge component to display alongside the option. */\r\n children?: React.ReactNode;\r\n disabled?: boolean;\r\n }[];\r\n\r\n /**\r\n * Placeholder text to be displayed when no values are selected.\r\n * Optional, defaults to \"Select options\".\r\n */\r\n placeholder?: string;\r\n\r\n /**\r\n * selectAllLabel text to be displayed for select all option.\r\n * Optional, defaults to \"Select all\".\r\n */\r\n selectAllLabel?: string;\r\n\r\n /**\r\n * If true, the multi-select component will be disabled.\r\n * Optional, defaults to false.\r\n */\r\n disabled?: boolean;\r\n}\r\n\r\nexport const MultiSelect = React.forwardRef<\r\n HTMLButtonElement,\r\n MultiSelectProps\r\n>(\r\n (\r\n {\r\n options,\r\n onValueChange,\r\n variant,\r\n defaultValue = [],\r\n placeholder = \"Select options\",\r\n selectAllLabel = \"Select all\",\r\n animation = 0,\r\n maxCount = 3,\r\n modalPopover = false,\r\n className,\r\n disabled,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const [selectedValues, setSelectedValues] =\r\n React.useState<string[]>(defaultValue);\r\n const previousDefaultValue = React.useRef<string[]>(defaultValue);\r\n React.useEffect(() => {\r\n if (\r\n JSON.stringify(previousDefaultValue.current) !==\r\n JSON.stringify(defaultValue)\r\n ) {\r\n setSelectedValues(defaultValue);\r\n previousDefaultValue.current = defaultValue;\r\n }\r\n }, [defaultValue]);\r\n const [isPopoverOpen, setIsPopoverOpen] = React.useState(false);\r\n const [isAnimating, setIsAnimating] = React.useState(false);\r\n\r\n const handleInputKeyDown = (\r\n event: React.KeyboardEvent<HTMLInputElement>,\r\n ) => {\r\n if (event.key === \"Enter\") {\r\n setIsPopoverOpen(true);\r\n } else if (event.key === \"Backspace\" && !event.currentTarget.value) {\r\n const newSelectedValues = [...selectedValues];\r\n newSelectedValues.pop();\r\n setSelectedValues(newSelectedValues);\r\n if (onValueChange) onValueChange(newSelectedValues);\r\n }\r\n };\r\n\r\n const toggleOption = (option: string) => {\r\n const newSelectedValues = selectedValues.includes(option)\r\n ? selectedValues.filter((value) => value !== option)\r\n : [...selectedValues, option];\r\n setSelectedValues(newSelectedValues);\r\n if (onValueChange) onValueChange(newSelectedValues);\r\n };\r\n\r\n const handleClear = () => {\r\n setSelectedValues(\r\n selectedValues.filter(\r\n (value) =>\r\n !options.map((o) => !o.disabled && o.value).includes(value),\r\n ),\r\n );\r\n if (onValueChange) onValueChange([]);\r\n };\r\n\r\n const handleTogglePopover = () => {\r\n setIsPopoverOpen((prev) => !prev);\r\n };\r\n\r\n const clearExtraOptions = () => {\r\n const newSelectedValues = selectedValues.slice(0, maxCount);\r\n setSelectedValues(newSelectedValues);\r\n if (onValueChange) onValueChange(newSelectedValues);\r\n };\r\n\r\n const toggleAll = () => {\r\n if (selectedValues.length === options.length) {\r\n handleClear();\r\n } else {\r\n const allValues = options.map((option) => option.value);\r\n setSelectedValues(allValues);\r\n if (onValueChange) onValueChange(allValues);\r\n }\r\n };\r\n\r\n return (\r\n <Popover\r\n open={isPopoverOpen}\r\n onOpenChange={setIsPopoverOpen}\r\n modal={modalPopover}\r\n >\r\n <PopoverTrigger asChild className=\"w-full\">\r\n <Button\r\n ref={ref}\r\n data-testid={props.id}\r\n type=\"button\"\r\n disabled={disabled}\r\n onClick={handleTogglePopover}\r\n className={cn(\r\n \"flex w-full p-1 rounded-md border min-h-9 h-auto items-center justify-between bg-inherit hover:bg-inherit\",\r\n className,\r\n )}\r\n >\r\n {selectedValues.length > 0 ? (\r\n <div className=\"flex justify-between items-center w-full\">\r\n <div className=\"flex flex-wrap items-center\">\r\n {selectedValues.slice(0, maxCount).map((value) => {\r\n const option = options.find((o) => o.value === value);\r\n const IconComponent = option?.icon;\r\n return (\r\n <Badge\r\n key={value}\r\n className={cn(\r\n isAnimating ? \"animate-bounce\" : \"\",\r\n multiSelectVariants({ variant }),\r\n )}\r\n style={{ animationDuration: `${animation}s` }}\r\n >\r\n {IconComponent && (\r\n <IconComponent className=\"h-4 w-4 mr-2\" />\r\n )}\r\n {option?.label}\r\n {!option?.disabled && (\r\n <XCircle\r\n className=\"ml-2 h-4 w-4 cursor-pointer\"\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n toggleOption(value);\r\n }}\r\n />\r\n )}\r\n </Badge>\r\n );\r\n })}\r\n {selectedValues.length > maxCount && (\r\n <Badge\r\n className={cn(\r\n \"bg-transparent text-foreground border-foreground/1 hover:bg-transparent\",\r\n isAnimating ? \"animate-bounce\" : \"\",\r\n multiSelectVariants({ variant }),\r\n )}\r\n style={{ animationDuration: `${animation}s` }}\r\n >\r\n {`+ ${selectedValues.length - maxCount} more`}\r\n <XCircle\r\n className=\"ml-2 h-4 w-4 cursor-pointer\"\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n clearExtraOptions();\r\n }}\r\n />\r\n </Badge>\r\n )}\r\n </div>\r\n <div className=\"flex items-center justify-between\">\r\n {options.filter((x) => x.disabled).length !==\r\n options.length && (\r\n <XIcon\r\n className=\"h-4 mx-2 cursor-pointer text-muted-foreground\"\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n handleClear();\r\n }}\r\n />\r\n )}\r\n <Separator\r\n orientation=\"vertical\"\r\n className=\"flex min-h-6 h-full\"\r\n />\r\n <ChevronDown className=\"h-4 mx-2 cursor-pointer text-muted-foreground\" />\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"flex items-center justify-between w-full mx-auto\">\r\n <span className=\"text-sm text-black mx-3 font-normal\">\r\n {placeholder}\r\n </span>\r\n <ChevronDown className=\"h-4 cursor-pointer text-muted-foreground mx-2\" />\r\n </div>\r\n )}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n className=\"p-0\"\r\n onEscapeKeyDown={() => setIsPopoverOpen(false)}\r\n >\r\n <Command className=\"w-full\">\r\n <CommandInput\r\n data-testid={`${props.id}_search`}\r\n placeholder=\"Search...\"\r\n onKeyDown={handleInputKeyDown}\r\n />\r\n <CommandList>\r\n <CommandEmpty>No results found.</CommandEmpty>\r\n <CommandGroup>\r\n <CommandItem\r\n data-testid={`${props.id}_select_all`}\r\n key=\"all\"\r\n onSelect={toggleAll}\r\n className=\"cursor-pointer\"\r\n disabled={\r\n options.filter((x) => x.disabled).length === options.length\r\n }\r\n >\r\n <div\r\n className={cn(\r\n \"mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary\",\r\n selectedValues.length === options.length\r\n ? \"bg-primary text-primary-foreground\"\r\n : \"opacity-50 [&_svg]:invisible\",\r\n )}\r\n >\r\n <CheckIcon className=\"h-4 w-4\" />\r\n </div>\r\n <span>({selectAllLabel})</span>\r\n </CommandItem>\r\n {options.map((option) => {\r\n const isSelected = selectedValues.includes(option.value);\r\n return (\r\n <CommandItem\r\n data-testid={`${props.id}_${option.value}`}\r\n key={option.value}\r\n onSelect={() => toggleOption(option.value)}\r\n className=\"cursor-pointer\"\r\n disabled={option.disabled}\r\n >\r\n <div\r\n className={cn(\r\n \"mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary\",\r\n isSelected\r\n ? \"bg-primary text-primary-foreground\"\r\n : \"opacity-50 [&_svg]:invisible\",\r\n )}\r\n >\r\n <CheckIcon className=\"h-4 w-4\" />\r\n </div>\r\n {option.icon && (\r\n <option.icon className=\"mr-2 h-4 w-4 text-muted-foreground\" />\r\n )}\r\n <span>{option.label}</span>\r\n {option.children}\r\n </CommandItem>\r\n );\r\n })}\r\n </CommandGroup>\r\n <CommandSeparator />\r\n <CommandGroup>\r\n <div className=\"flex items-center justify-between\">\r\n {selectedValues.length > 0 && (\r\n <>\r\n <CommandItem\r\n data-testid={`${props.id}_clear`}\r\n onSelect={handleClear}\r\n className=\"flex-1 justify-center cursor-pointer\"\r\n disabled={\r\n options.filter((x) => x.disabled).length ===\r\n options.length\r\n }\r\n >\r\n Clear\r\n </CommandItem>\r\n <Separator\r\n orientation=\"vertical\"\r\n className=\"flex min-h-6 h-full\"\r\n />\r\n </>\r\n )}\r\n <CommandItem\r\n data-testid={`${props.id}_close`}\r\n onSelect={() => setIsPopoverOpen(false)}\r\n className=\"flex-1 justify-center cursor-pointer max-w-full\"\r\n >\r\n Close\r\n </CommandItem>\r\n </div>\r\n </CommandGroup>\r\n </CommandList>\r\n </Command>\r\n </PopoverContent>\r\n {animation > 0 && selectedValues.length > 0 && (\r\n <WandSparkles\r\n className={cn(\r\n \"cursor-pointer my-2 text-foreground bg-background w-3 h-3\",\r\n isAnimating ? \"\" : \"text-muted-foreground\",\r\n )}\r\n onClick={() => setIsAnimating(!isAnimating)}\r\n />\r\n )}\r\n </Popover>\r\n );\r\n },\r\n);\r\n\r\nMultiSelect.displayName = \"MultiSelect\";\r\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/custom/password-input.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { InputProps } from \"@repo/ayasofyazilim-ui/components/input\";\r\nimport { cn } from \"@repo/ayasofyazilim-ui/lib/utils\";\r\nimport { EyeIcon, EyeOffIcon, RotateCcwKey } from \"lucide-react\";\r\nimport {\r\n forwardRef,\r\n useCallback,\r\n useImperativeHandle,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport {\r\n InputGroup,\r\n InputGroupAddon,\r\n InputGroupButton,\r\n InputGroupInput,\r\n} from \"../components/input-group\";\r\n\r\ninterface PasswordInputProps extends InputProps {\r\n passwordLength?: number;\r\n showGenerator?: boolean;\r\n}\r\n\r\nconst PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\r\n (\r\n { className, showGenerator = false, passwordLength = 10, ...props },\r\n ref\r\n ) => {\r\n const [showPassword, setShowPassword] = useState(false);\r\n const internalRef = useRef<HTMLInputElement>(null);\r\n const { disabled } = props;\r\n\r\n useImperativeHandle(ref, () => internalRef.current!, []);\r\n\r\n // Memoize character sets to avoid recreation on every render\r\n const characterSets = useMemo(() => {\r\n const sets = {\r\n lowercase: \"abcdefghijklmnopqrstuvwxyz\",\r\n uppercase: \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\",\r\n numbers: \"0123456789\",\r\n symbols: \"!@#$%^&*()_+-=[]{}|;:,.<>?\",\r\n };\r\n\r\n return {\r\n ...sets,\r\n all: sets.lowercase + sets.uppercase + sets.numbers + sets.symbols,\r\n };\r\n }, []);\r\n // Memoize class names to prevent unnecessary re-renders\r\n const inputClassName = useMemo(\r\n () =>\r\n cn(\r\n \"hide-password-toggle\",\r\n showGenerator ? \"pr-20\" : \"pr-10\",\r\n className\r\n ),\r\n [showGenerator, className]\r\n );\r\n\r\n // Use crypto.getRandomValues for better randomness when available\r\n const getRandomInt = useCallback((max: number): number => {\r\n if (typeof window !== \"undefined\" && window.crypto?.getRandomValues) {\r\n const array = new Uint32Array(1);\r\n window.crypto.getRandomValues(array);\r\n return (array[0] ?? 0) % max;\r\n }\r\n return Math.floor(Math.random() * max);\r\n }, []);\r\n\r\n // Fisher-Yates shuffle algorithm for better randomization\r\n const shuffleArray = useCallback(\r\n (array: string[]): string[] => {\r\n const shuffled = [...array];\r\n for (let i = shuffled.length - 1; i > 0; i--) {\r\n const j = getRandomInt(i + 1);\r\n const elemI = shuffled[i];\r\n const elemJ = shuffled[j];\r\n if (elemI !== undefined && elemJ !== undefined) {\r\n [shuffled[i], shuffled[j]] = [elemJ, elemI];\r\n }\r\n }\r\n return shuffled;\r\n },\r\n [getRandomInt]\r\n );\r\n\r\n const generatePassword = useCallback(\r\n (length: number = passwordLength): string => {\r\n const { lowercase, uppercase, numbers, symbols, all } = characterSets;\r\n\r\n // Ensure minimum requirements\r\n const requiredChars = [\r\n lowercase[getRandomInt(lowercase.length)],\r\n uppercase[getRandomInt(uppercase.length)],\r\n numbers[getRandomInt(numbers.length)],\r\n symbols[getRandomInt(symbols.length)],\r\n ];\r\n\r\n // Fill remaining positions\r\n const remainingLength = Math.max(0, length - requiredChars.length);\r\n const additionalChars = Array.from(\r\n { length: remainingLength },\r\n () => all[getRandomInt(all.length)]\r\n );\r\n\r\n // Combine and shuffle\r\n const allChars = [...requiredChars, ...additionalChars] as string[];\r\n return shuffleArray(allChars).join(\"\");\r\n },\r\n [passwordLength, characterSets, getRandomInt, shuffleArray]\r\n );\r\n\r\n // Optimized event dispatching\r\n const dispatchInputEvents = useCallback(\r\n (input: HTMLInputElement, value: string) => {\r\n const _input = input;\r\n // Use React's internal event system when possible\r\n const descriptor = Object.getOwnPropertyDescriptor(\r\n HTMLInputElement.prototype,\r\n \"value\"\r\n );\r\n if (descriptor?.set) {\r\n descriptor.set.call(_input, value);\r\n } else {\r\n _input.value = value;\r\n }\r\n\r\n // Dispatch events in the correct order\r\n const inputEvent = new Event(\"input\", { bubbles: true });\r\n const changeEvent = new Event(\"change\", { bubbles: true });\r\n\r\n _input.dispatchEvent(inputEvent);\r\n _input.dispatchEvent(changeEvent);\r\n },\r\n []\r\n );\r\n\r\n const handleGeneratePassword = useCallback(() => {\r\n if (disabled || !internalRef.current) return;\r\n\r\n const newPassword = generatePassword(passwordLength);\r\n dispatchInputEvents(internalRef.current, newPassword);\r\n }, [disabled, generatePassword, passwordLength, dispatchInputEvents]);\r\n\r\n const togglePasswordVisibility = useCallback(() => {\r\n setShowPassword((prev) => !prev);\r\n }, []);\r\n\r\n return (\r\n <InputGroup>\r\n <InputGroupInput\r\n placeholder={props.placeholder}\r\n className={inputClassName}\r\n ref={internalRef}\r\n {...props}\r\n type={showPassword ? \"text\" : \"password\"}\r\n />\r\n <InputGroupAddon align=\"inline-end\">\r\n <InputGroupButton\r\n id=\"toggle-password-visibility-button\"\r\n variant=\"ghost\"\r\n aria-label={showPassword ? \"Hide password\" : \"Show password\"}\r\n size=\"icon-xs\"\r\n onClick={togglePasswordVisibility}\r\n disabled={disabled}\r\n >\r\n {showPassword ? <EyeOffIcon /> : <EyeIcon />}\r\n </InputGroupButton>\r\n </InputGroupAddon>\r\n {showGenerator && (\r\n <InputGroupAddon align=\"inline-start\">\r\n <InputGroupButton\r\n id=\"generate-password-button\"\r\n variant=\"ghost\"\r\n size=\"icon-xs\"\r\n onClick={handleGeneratePassword}\r\n disabled={disabled}\r\n >\r\n <RotateCcwKey />\r\n <span className=\"sr-only\">Generate password</span>\r\n </InputGroupButton>\r\n </InputGroupAddon>\r\n )}\r\n </InputGroup>\r\n );\r\n }\r\n);\r\n\r\nPasswordInput.displayName = \"PasswordInput\";\r\n\r\nexport { PasswordInput };\r\nexport type { PasswordInputProps };\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/custom/password-input.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { InputProps } from \"@ayasofyazilim/ui/components/input\";\r\nimport { cn } from \"@ayasofyazilim/ui/lib/utils\";\r\nimport { EyeIcon, EyeOffIcon, RotateCcwKey } from \"lucide-react\";\r\nimport {\r\n forwardRef,\r\n useCallback,\r\n useImperativeHandle,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport {\r\n InputGroup,\r\n InputGroupAddon,\r\n InputGroupButton,\r\n InputGroupInput,\r\n} from \"../components/input-group\";\r\n\r\ninterface PasswordInputProps extends InputProps {\r\n passwordLength?: number;\r\n showGenerator?: boolean;\r\n}\r\n\r\nconst PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\r\n (\r\n { className, showGenerator = false, passwordLength = 10, ...props },\r\n ref,\r\n ) => {\r\n const [showPassword, setShowPassword] = useState(false);\r\n const internalRef = useRef<HTMLInputElement>(null);\r\n const { disabled } = props;\r\n\r\n useImperativeHandle(ref, () => internalRef.current!, []);\r\n\r\n // Memoize character sets to avoid recreation on every render\r\n const characterSets = useMemo(() => {\r\n const sets = {\r\n lowercase: \"abcdefghijklmnopqrstuvwxyz\",\r\n uppercase: \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\",\r\n numbers: \"0123456789\",\r\n symbols: \"!@#$%^&*()_+-=[]{}|;:,.<>?\",\r\n };\r\n\r\n return {\r\n ...sets,\r\n all: sets.lowercase + sets.uppercase + sets.numbers + sets.symbols,\r\n };\r\n }, []);\r\n // Memoize class names to prevent unnecessary re-renders\r\n const inputClassName = useMemo(\r\n () =>\r\n cn(\r\n \"hide-password-toggle\",\r\n showGenerator ? \"pr-20\" : \"pr-10\",\r\n className,\r\n ),\r\n [showGenerator, className],\r\n );\r\n\r\n // Use crypto.getRandomValues for better randomness when available\r\n const getRandomInt = useCallback((max: number): number => {\r\n if (typeof window !== \"undefined\" && window.crypto?.getRandomValues) {\r\n const array = new Uint32Array(1);\r\n window.crypto.getRandomValues(array);\r\n return (array[0] ?? 0) % max;\r\n }\r\n return Math.floor(Math.random() * max);\r\n }, []);\r\n\r\n // Fisher-Yates shuffle algorithm for better randomization\r\n const shuffleArray = useCallback(\r\n (array: string[]): string[] => {\r\n const shuffled = [...array];\r\n for (let i = shuffled.length - 1; i > 0; i--) {\r\n const j = getRandomInt(i + 1);\r\n const elemI = shuffled[i];\r\n const elemJ = shuffled[j];\r\n if (elemI !== undefined && elemJ !== undefined) {\r\n [shuffled[i], shuffled[j]] = [elemJ, elemI];\r\n }\r\n }\r\n return shuffled;\r\n },\r\n [getRandomInt],\r\n );\r\n\r\n const generatePassword = useCallback(\r\n (length: number = passwordLength): string => {\r\n const { lowercase, uppercase, numbers, symbols, all } = characterSets;\r\n\r\n // Ensure minimum requirements\r\n const requiredChars = [\r\n lowercase[getRandomInt(lowercase.length)],\r\n uppercase[getRandomInt(uppercase.length)],\r\n numbers[getRandomInt(numbers.length)],\r\n symbols[getRandomInt(symbols.length)],\r\n ];\r\n\r\n // Fill remaining positions\r\n const remainingLength = Math.max(0, length - requiredChars.length);\r\n const additionalChars = Array.from(\r\n { length: remainingLength },\r\n () => all[getRandomInt(all.length)],\r\n );\r\n\r\n // Combine and shuffle\r\n const allChars = [...requiredChars, ...additionalChars] as string[];\r\n return shuffleArray(allChars).join(\"\");\r\n },\r\n [passwordLength, characterSets, getRandomInt, shuffleArray],\r\n );\r\n\r\n // Optimized event dispatching\r\n const dispatchInputEvents = useCallback(\r\n (input: HTMLInputElement, value: string) => {\r\n const _input = input;\r\n // Use React's internal event system when possible\r\n const descriptor = Object.getOwnPropertyDescriptor(\r\n HTMLInputElement.prototype,\r\n \"value\",\r\n );\r\n if (descriptor?.set) {\r\n descriptor.set.call(_input, value);\r\n } else {\r\n _input.value = value;\r\n }\r\n\r\n // Dispatch events in the correct order\r\n const inputEvent = new Event(\"input\", { bubbles: true });\r\n const changeEvent = new Event(\"change\", { bubbles: true });\r\n\r\n _input.dispatchEvent(inputEvent);\r\n _input.dispatchEvent(changeEvent);\r\n },\r\n [],\r\n );\r\n\r\n const handleGeneratePassword = useCallback(() => {\r\n if (disabled || !internalRef.current) return;\r\n\r\n const newPassword = generatePassword(passwordLength);\r\n dispatchInputEvents(internalRef.current, newPassword);\r\n }, [disabled, generatePassword, passwordLength, dispatchInputEvents]);\r\n\r\n const togglePasswordVisibility = useCallback(() => {\r\n setShowPassword((prev) => !prev);\r\n }, []);\r\n\r\n return (\r\n <InputGroup>\r\n <InputGroupInput\r\n placeholder={props.placeholder}\r\n className={inputClassName}\r\n ref={internalRef}\r\n {...props}\r\n type={showPassword ? \"text\" : \"password\"}\r\n />\r\n <InputGroupAddon align=\"inline-end\">\r\n <InputGroupButton\r\n id=\"toggle-password-visibility-button\"\r\n variant=\"ghost\"\r\n aria-label={showPassword ? \"Hide password\" : \"Show password\"}\r\n size=\"icon-xs\"\r\n onClick={togglePasswordVisibility}\r\n disabled={disabled}\r\n >\r\n {showPassword ? <EyeOffIcon /> : <EyeIcon />}\r\n </InputGroupButton>\r\n </InputGroupAddon>\r\n {showGenerator && (\r\n <InputGroupAddon align=\"inline-start\">\r\n <InputGroupButton\r\n id=\"generate-password-button\"\r\n variant=\"ghost\"\r\n size=\"icon-xs\"\r\n onClick={handleGeneratePassword}\r\n disabled={disabled}\r\n >\r\n <RotateCcwKey />\r\n <span className=\"sr-only\">Generate password</span>\r\n </InputGroupButton>\r\n </InputGroupAddon>\r\n )}\r\n </InputGroup>\r\n );\r\n },\r\n);\r\n\r\nPasswordInput.displayName = \"PasswordInput\";\r\n\r\nexport { PasswordInput };\r\nexport type { PasswordInputProps };\r\n"],"mappings":"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","names":[]}
|
|
@@ -7,8 +7,8 @@ import PhoneInputWithCountrySelect, {
|
|
|
7
7
|
parsePhoneNumber
|
|
8
8
|
} from "react-phone-number-input";
|
|
9
9
|
import flags from "react-phone-number-input/flags";
|
|
10
|
-
import { Input } from "@
|
|
11
|
-
import { cn } from "@
|
|
10
|
+
import { Input } from "@ayasofyazilim/ui/components/input";
|
|
11
|
+
import { cn } from "@ayasofyazilim/ui/lib/utils";
|
|
12
12
|
import {
|
|
13
13
|
Select,
|
|
14
14
|
SelectContent,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/custom/phone-input.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { ChevronDownIcon, PhoneIcon } from \"lucide-react\";\r\nimport React, { useState } from \"react\";\r\nimport PhoneInputWithCountrySelect, {\r\n Country,\r\n FlagProps,\r\n getCountryCallingCode,\r\n parsePhoneNumber,\r\n} from \"react-phone-number-input\";\r\nimport flags from \"react-phone-number-input/flags\";\r\n\r\nimport { Input } from \"@
|
|
1
|
+
{"version":3,"sources":["../../src/custom/phone-input.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { ChevronDownIcon, PhoneIcon } from \"lucide-react\";\r\nimport React, { useState } from \"react\";\r\nimport PhoneInputWithCountrySelect, {\r\n Country,\r\n FlagProps,\r\n getCountryCallingCode,\r\n parsePhoneNumber,\r\n} from \"react-phone-number-input\";\r\nimport flags from \"react-phone-number-input/flags\";\r\n\r\nimport { Input } from \"@ayasofyazilim/ui/components/input\";\r\nimport { cn } from \"@ayasofyazilim/ui/lib/utils\";\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from \"../components/select\";\r\n// import { FieldErrorTemplate } from \"./schema-form/fields\";\r\nexport type PhoneInputValues = {\r\n value: string | undefined;\r\n parsed: ReturnType<typeof parsePhoneNumber>;\r\n};\r\nexport type PhoneInputProps = {\r\n id: string;\r\n name?: string;\r\n placeholder?: string;\r\n defaultValue?: string | undefined;\r\n value?: string;\r\n onChange?: (values: PhoneInputValues) => void;\r\n disabled?: boolean;\r\n className?: string;\r\n required?: boolean;\r\n defaultCountry?: string;\r\n};\r\nexport function PhoneInput({\r\n id,\r\n name,\r\n placeholder,\r\n defaultValue,\r\n value: initialValue,\r\n onChange,\r\n disabled,\r\n required,\r\n className,\r\n defaultCountry = \"US\",\r\n}: PhoneInputProps) {\r\n const [value, setValue] = useState(initialValue || defaultValue || \"\");\r\n return (\r\n <>\r\n <PhoneInputWithCountrySelect\r\n className={cn(\"flex rounded-r-md shadow-xs\", className)}\r\n international\r\n flagComponent={FlagComponent}\r\n defaultCountry={defaultCountry as Country}\r\n countrySelectComponent={(props) => CountrySelect({ ...props, id })}\r\n inputComponent={_PhoneInput}\r\n id={id}\r\n required={required}\r\n data-testid={id}\r\n disabled={disabled}\r\n name={name}\r\n placeholder={placeholder}\r\n value={value}\r\n onChange={(newValue) => {\r\n setValue(newValue ?? \"\");\r\n if (onChange) {\r\n onChange({\r\n value: newValue ?? undefined,\r\n parsed: parsePhoneNumber(newValue || \"\"),\r\n });\r\n }\r\n }}\r\n />\r\n </>\r\n );\r\n}\r\n\r\n// Use forwardRef to support refs from react-phone-number-input\r\nconst _PhoneInput = React.forwardRef<\r\n HTMLInputElement,\r\n React.ComponentProps<\"input\">\r\n>(({ className, ...props }, ref) => (\r\n <Input\r\n data-testid={`${props.id}_input`}\r\n data-slot=\"phone-input\"\r\n className={cn(\r\n \"-ms-px rounded-s-none rounded-l-none! shadow-none focus-visible:z-10\",\r\n className,\r\n )}\r\n ref={ref}\r\n {...props}\r\n />\r\n));\r\n\r\n_PhoneInput.displayName = \"_PhoneInput\";\r\n\r\ntype CountrySelectProps = {\r\n id: string;\r\n disabled?: boolean;\r\n value: Country;\r\n onChange?: (value: Country) => void;\r\n options: { label: string; value: Country | undefined }[];\r\n};\r\n\r\nconst CountrySelect = ({\r\n id,\r\n disabled,\r\n value,\r\n onChange,\r\n options,\r\n}: CountrySelectProps) => {\r\n const handleSelect = (value: Country) => {\r\n if (!onChange) return;\r\n onChange(value);\r\n };\r\n return (\r\n <div className=\"border-input bg-background text-muted-foreground focus-within:border-ring focus-within:ring-ring/50 hover:bg-accent hover:text-foreground has-aria-invalid:border-destructive/60 has-aria-invalid:ring-destructive/20 dark:has-aria-invalid:ring-destructive/40 relative inline-flex items-center self-stretch rounded-s-md border py-2 ps-3 pe-2 transition-[color,box-shadow] outline-none focus-within:z-10 focus-within:ring-[3px] has-disabled:pointer-events-none has-disabled:opacity-50\">\r\n <div className=\"inline-flex items-center gap-1\" aria-hidden=\"true\">\r\n <FlagComponent country={value} countryName={value} aria-hidden=\"true\" />\r\n <span className=\"text-muted-foreground/80\">\r\n <ChevronDownIcon size={16} aria-hidden=\"true\" />\r\n </span>\r\n </div>\r\n <Select\r\n disabled={disabled}\r\n value={value}\r\n data-testid={`${id}_select`}\r\n onValueChange={handleSelect}\r\n aria-label=\"Select country\"\r\n >\r\n <SelectTrigger className=\"absolute inset-0 text-sm opacity-0\">\r\n <SelectValue placeholder=\"Select a country\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {options\r\n .filter((x) => x.value)\r\n .map((option, i) => {\r\n if (!option.value) return null;\r\n return (\r\n <SelectItem\r\n key={option.value}\r\n value={option.value}\r\n data-testid={`${id}_${option.value}`}\r\n >\r\n {option.label}\r\n {option.value && `+${getCountryCallingCode(option.value)}`}\r\n </SelectItem>\r\n );\r\n })}\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n );\r\n};\r\n\r\nconst FlagComponent = ({ country, countryName }: FlagProps) => {\r\n const Flag = flags[country];\r\n\r\n return (\r\n <span className=\"w-5 overflow-hidden rounded-sm\">\r\n {Flag ? (\r\n <Flag title={countryName} />\r\n ) : (\r\n <PhoneIcon size={16} aria-hidden=\"true\" />\r\n )}\r\n </span>\r\n );\r\n};\r\n"],"mappings":"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","names":["value"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Label } from "@
|
|
2
|
+
import { Label } from "@ayasofyazilim/ui/components/label";
|
|
3
3
|
import {
|
|
4
4
|
Tooltip,
|
|
5
5
|
TooltipContent,
|
|
6
6
|
TooltipProvider,
|
|
7
7
|
TooltipTrigger
|
|
8
|
-
} from "@
|
|
9
|
-
import { cn } from "@
|
|
8
|
+
} from "@ayasofyazilim/ui/components/tooltip";
|
|
9
|
+
import { cn } from "@ayasofyazilim/ui/lib/utils";
|
|
10
10
|
import { InfoIcon } from "lucide-react";
|
|
11
11
|
function FieldLabel({
|
|
12
12
|
id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/custom/schema-form/custom/label.tsx"],"sourcesContent":["import { Label } from \"@
|
|
1
|
+
{"version":3,"sources":["../../../../src/custom/schema-form/custom/label.tsx"],"sourcesContent":["import { Label } from \"@ayasofyazilim/ui/components/label\";\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipProvider,\r\n TooltipTrigger,\r\n} from \"@ayasofyazilim/ui/components/tooltip\";\r\nimport { cn } from \"@ayasofyazilim/ui/lib/utils\";\r\nimport { InfoIcon } from \"lucide-react\";\r\nimport { JSXElementConstructor, ReactElement } from \"react\";\r\n\r\nexport function FieldLabel({\r\n id,\r\n className,\r\n required,\r\n label,\r\n description,\r\n}: {\r\n label: string | undefined;\r\n id: string | undefined;\r\n className?: string;\r\n required?: boolean;\r\n description?:\r\n | ReactElement<unknown, string | JSXElementConstructor<any>>\r\n | string\r\n | undefined;\r\n}) {\r\n if (!label) return null;\r\n return (\r\n <Label\r\n data-testid={`${id}_label`}\r\n htmlFor={id}\r\n className={cn(\"flex items-center gap-0 text-nowrap\", className)}\r\n >\r\n {label}\r\n {required ? <span className=\"text-destructive\">*</span> : null}\r\n {description &&\r\n typeof description === \"string\" &&\r\n description.length > 0 ? (\r\n <TooltipProvider>\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <InfoIcon className=\"size-3.5 ml-1 text-muted-foreground cursor-help\" />\r\n </TooltipTrigger>\r\n <TooltipContent>{description}</TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n ) : (\r\n description\r\n )}\r\n </Label>\r\n );\r\n}\r\n"],"mappings":"AAmCkB,cAKR,YALQ;AAnClB,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,UAAU;AACnB,SAAS,gBAAgB;AAGlB,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASG;AACD,MAAI,CAAC,MAAO,QAAO;AACnB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAa,GAAG,EAAE;AAAA,MAClB,SAAS;AAAA,MACT,WAAW,GAAG,uCAAuC,SAAS;AAAA,MAE7D;AAAA;AAAA,QACA,WAAW,oBAAC,UAAK,WAAU,oBAAmB,eAAC,IAAU;AAAA,QACzD,eACD,OAAO,gBAAgB,YACvB,YAAY,SAAS,IACnB,oBAAC,mBACC,+BAAC,WACC;AAAA,8BAAC,kBAAe,SAAO,MACrB,8BAAC,YAAS,WAAU,mDAAkD,GACxE;AAAA,UACA,oBAAC,kBAAgB,uBAAY;AAAA,WAC/B,GACF,IAEA;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Input } from "@
|
|
3
|
-
import { cn } from "@
|
|
2
|
+
import { Input } from "@ayasofyazilim/ui/components/input";
|
|
3
|
+
import { cn } from "@ayasofyazilim/ui/lib/utils";
|
|
4
4
|
import {
|
|
5
5
|
ariaDescribedByIds,
|
|
6
6
|
examplesId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/custom/schema-form/fields/base-input-field.tsx"],"sourcesContent":["import { Input } from \"@
|
|
1
|
+
{"version":3,"sources":["../../../../src/custom/schema-form/fields/base-input-field.tsx"],"sourcesContent":["import { Input } from \"@ayasofyazilim/ui/components/input\";\r\nimport { cn } from \"@ayasofyazilim/ui/lib/utils\";\r\nimport {\r\n ariaDescribedByIds,\r\n BaseInputTemplateProps,\r\n examplesId,\r\n getInputProps,\r\n} from \"@rjsf/utils\";\r\nimport { ChangeEvent, FocusEvent } from \"react\";\r\n\r\nexport function BaseInputTemplate({\r\n id,\r\n htmlName,\r\n placeholder,\r\n required,\r\n readonly,\r\n disabled,\r\n type,\r\n value,\r\n onChange,\r\n onChangeOverride,\r\n onBlur,\r\n onFocus,\r\n autofocus,\r\n options,\r\n schema,\r\n rawErrors = [],\r\n children,\r\n extraProps,\r\n className,\r\n}: BaseInputTemplateProps) {\r\n const inputProps = {\r\n ...extraProps,\r\n ...getInputProps(schema, type, options),\r\n };\r\n const _onChange = ({ target: { value } }: ChangeEvent<HTMLInputElement>) =>\r\n onChange(value === \"\" ? options.emptyValue : value);\r\n const _onBlur = ({ target }: FocusEvent<HTMLInputElement>) =>\r\n onBlur(id, target && target.value);\r\n const _onFocus = ({ target }: FocusEvent<HTMLInputElement>) =>\r\n onFocus(id, target && target.value);\r\n\r\n return (\r\n <>\r\n <Input\r\n id={id}\r\n name={htmlName || id}\r\n type={type}\r\n placeholder={placeholder}\r\n autoFocus={autofocus}\r\n required={required}\r\n disabled={disabled}\r\n readOnly={readonly}\r\n className={cn(\r\n { \"border-destructive focus-visible:ring-0\": rawErrors.length > 0 },\r\n className,\r\n )}\r\n list={schema.examples ? examplesId(id) : undefined}\r\n {...inputProps}\r\n value={value || value === 0 ? value : \"\"}\r\n onChange={onChangeOverride || _onChange}\r\n onBlur={_onBlur}\r\n onFocus={_onFocus}\r\n aria-describedby={ariaDescribedByIds(id, !!schema.examples)}\r\n />\r\n {children}\r\n {Array.isArray(schema.examples) ? (\r\n <datalist id={examplesId(id)}>\r\n {(schema.examples as string[])\r\n .concat(\r\n schema.default && !schema.examples.includes(schema.default)\r\n ? ([schema.default] as string[])\r\n : [],\r\n )\r\n .map((example: any) => {\r\n return <option key={example} value={example} />;\r\n })}\r\n </datalist>\r\n ) : null}\r\n </>\r\n );\r\n}\r\n"],"mappings":"AA2CI,mBACE,KADF;AA3CJ,SAAS,aAAa;AACtB,SAAS,UAAU;AACnB;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AAGA,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,CAAC;AAAA,EACb;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,aAAa;AAAA,IACjB,GAAG;AAAA,IACH,GAAG,cAAc,QAAQ,MAAM,OAAO;AAAA,EACxC;AACA,QAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAAA,OAAM,EAAE,MACrC,SAASA,WAAU,KAAK,QAAQ,aAAaA,MAAK;AACpD,QAAM,UAAU,CAAC,EAAE,OAAO,MACxB,OAAO,IAAI,UAAU,OAAO,KAAK;AACnC,QAAM,WAAW,CAAC,EAAE,OAAO,MACzB,QAAQ,IAAI,UAAU,OAAO,KAAK;AAEpC,SACE,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAM,YAAY;AAAA,QAClB;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,WAAW;AAAA,UACT,EAAE,2CAA2C,UAAU,SAAS,EAAE;AAAA,UAClE;AAAA,QACF;AAAA,QACA,MAAM,OAAO,WAAW,WAAW,EAAE,IAAI;AAAA,QACxC,GAAG;AAAA,QACJ,OAAO,SAAS,UAAU,IAAI,QAAQ;AAAA,QACtC,UAAU,oBAAoB;AAAA,QAC9B,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,oBAAkB,mBAAmB,IAAI,CAAC,CAAC,OAAO,QAAQ;AAAA;AAAA,IAC5D;AAAA,IACC;AAAA,IACA,MAAM,QAAQ,OAAO,QAAQ,IAC5B,oBAAC,cAAS,IAAI,WAAW,EAAE,GACvB,iBAAO,SACN;AAAA,MACC,OAAO,WAAW,CAAC,OAAO,SAAS,SAAS,OAAO,OAAO,IACrD,CAAC,OAAO,OAAO,IAChB,CAAC;AAAA,IACP,EACC,IAAI,CAAC,YAAiB;AACrB,aAAO,oBAAC,YAAqB,OAAO,WAAhB,OAAyB;AAAA,IAC/C,CAAC,GACL,IACE;AAAA,KACN;AAEJ;","names":["value"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { TableCell } from "@
|
|
3
|
-
import { cn } from "@
|
|
2
|
+
import { TableCell } from "@ayasofyazilim/ui/components/table";
|
|
3
|
+
import { cn } from "@ayasofyazilim/ui/lib/utils";
|
|
4
4
|
import { FieldLabel } from "../custom";
|
|
5
5
|
const FieldTemplate = (props) => {
|
|
6
6
|
const {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/custom/schema-form/fields/field.tsx"],"sourcesContent":["import { TableCell } from \"@
|
|
1
|
+
{"version":3,"sources":["../../../../src/custom/schema-form/fields/field.tsx"],"sourcesContent":["import { TableCell } from \"@ayasofyazilim/ui/components/table\";\r\nimport { cn } from \"@ayasofyazilim/ui/lib/utils\";\r\nimport { FieldTemplateProps } from \"@rjsf/utils\";\r\nimport { FieldLabel } from \"../custom\";\r\n\r\nexport const FieldTemplate = (props: FieldTemplateProps) => {\r\n const {\r\n id,\r\n classNames,\r\n style,\r\n label,\r\n help,\r\n required,\r\n description,\r\n errors,\r\n children,\r\n displayLabel,\r\n hidden,\r\n schema,\r\n registry,\r\n } = props;\r\n\r\n const shouldRenderLabel = label && displayLabel && schema.type !== \"boolean\";\r\n if (hidden) return null;\r\n const isInArray = /root_\\w+_\\d+/.test(id);\r\n const { useTableForArrayFields } = registry.formContext;\r\n if (schema.type === \"object\" && isInArray && useTableForArrayFields)\r\n return children;\r\n if (isInArray && useTableForArrayFields)\r\n return (\r\n <TableCell\r\n className={cn(\r\n \"p-0\",\r\n \"*:data-wrapper:border-0 *:data-wrapper:shadow-none *:data-wrapper:rounded-none *:data-wrapper:justify-center\",\r\n \"**:[[role=combobox]]:border-0 **:[[role=combobox]]:shadow-none **:[[role=combobox]]:rounded-none\",\r\n \"**:data-[slot=input]:border-0 **:data-[slot=input]:shadow-none **:data-[slot=input]:rounded-none\",\r\n \"**:data-rac:border-0 **:data-rac:shadow-none **:data-rac:rounded-none\",\r\n \"*:data-[slot=drawer-trigger]:border-0\",\r\n )}\r\n >\r\n {children}\r\n </TableCell>\r\n );\r\n return (\r\n <div\r\n className={cn(\r\n \"flex flex-col gap-1.5 h-max\",\r\n props.schema.type === \"object\" && \"gap-3\",\r\n classNames,\r\n label,\r\n )}\r\n style={style}\r\n >\r\n {shouldRenderLabel && (\r\n <FieldLabel\r\n id={id}\r\n label={label}\r\n description={description}\r\n required={required}\r\n />\r\n )}\r\n {children}\r\n {errors}\r\n {help}\r\n </div>\r\n );\r\n};\r\n"],"mappings":"AA8BM,cAcF,YAdE;AA9BN,SAAS,iBAAiB;AAC1B,SAAS,UAAU;AAEnB,SAAS,kBAAkB;AAEpB,MAAM,gBAAgB,CAAC,UAA8B;AAC1D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,oBAAoB,SAAS,gBAAgB,OAAO,SAAS;AACnE,MAAI,OAAQ,QAAO;AACnB,QAAM,YAAY,eAAe,KAAK,EAAE;AACxC,QAAM,EAAE,uBAAuB,IAAI,SAAS;AAC5C,MAAI,OAAO,SAAS,YAAY,aAAa;AAC3C,WAAO;AACT,MAAI,aAAa;AACf,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QAEC;AAAA;AAAA,IACH;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,MAAM,OAAO,SAAS,YAAY;AAAA,QAClC;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,MAEC;AAAA,6BACC;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA;AAAA;AAAA,EACH;AAEJ;","names":[]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Button } from "@
|
|
3
|
-
import { ButtonGroup } from "@
|
|
2
|
+
import { Button } from "@ayasofyazilim/ui/components/button";
|
|
3
|
+
import { ButtonGroup } from "@ayasofyazilim/ui/components/button-group";
|
|
4
4
|
import {
|
|
5
5
|
Popover,
|
|
6
6
|
PopoverContent,
|
|
7
7
|
PopoverTrigger
|
|
8
|
-
} from "@
|
|
9
|
-
import { TableCell, TableRow } from "@
|
|
10
|
-
import { cn } from "@
|
|
8
|
+
} from "@ayasofyazilim/ui/components/popover";
|
|
9
|
+
import { TableCell, TableRow } from "@ayasofyazilim/ui/components/table";
|
|
10
|
+
import { cn } from "@ayasofyazilim/ui/lib/utils";
|
|
11
11
|
import {
|
|
12
12
|
ArrowDownIcon,
|
|
13
13
|
ArrowUpIcon,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/custom/schema-form/fields/table-array/array-field-item.tsx"],"sourcesContent":["import { Button } from \"@
|
|
1
|
+
{"version":3,"sources":["../../../../../src/custom/schema-form/fields/table-array/array-field-item.tsx"],"sourcesContent":["import { Button } from \"@ayasofyazilim/ui/components/button\";\r\nimport { ButtonGroup } from \"@ayasofyazilim/ui/components/button-group\";\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from \"@ayasofyazilim/ui/components/popover\";\r\nimport { TableCell, TableRow } from \"@ayasofyazilim/ui/components/table\";\r\nimport { cn } from \"@ayasofyazilim/ui/lib/utils\";\r\nimport {\r\n ArrayFieldItemTemplateProps,\r\n FormContextType,\r\n RJSFSchema,\r\n StrictRJSFSchema,\r\n} from \"@rjsf/utils\";\r\nimport {\r\n ArrowDownIcon,\r\n ArrowUpIcon,\r\n ClipboardCheck,\r\n MoreHorizontal,\r\n Trash2,\r\n} from \"lucide-react\";\r\n\r\nexport function ArrayFieldItemTemplate<\r\n T = any,\r\n S extends StrictRJSFSchema = RJSFSchema,\r\n F extends FormContextType = any,\r\n>(props: ArrayFieldItemTemplateProps<T, S, F>) {\r\n const { children, buttonsProps, hasToolbar } = props;\r\n const {\r\n hasCopy,\r\n hasMoveDown,\r\n hasMoveUp,\r\n hasRemove,\r\n onCopyItem,\r\n onMoveDownItem,\r\n onMoveUpItem,\r\n onRemoveItem,\r\n } = buttonsProps;\r\n const isMultipleToolbar = hasRemove && (hasCopy || hasMoveDown || hasMoveUp);\r\n return (\r\n <TableRow className={cn(\"divide-x\", props.className)} key={props.itemKey}>\r\n {children}\r\n <TableCell className=\"p-0\">\r\n {hasToolbar && hasRemove && !isMultipleToolbar && (\r\n <Button\r\n variant=\"ghost\"\r\n type=\"button\"\r\n onClick={buttonsProps.onRemoveItem}\r\n >\r\n <Trash2 className=\"size-4\" />\r\n </Button>\r\n )}\r\n {hasToolbar && isMultipleToolbar && (\r\n <Popover>\r\n <PopoverTrigger asChild>\r\n <Button variant=\"ghost\" type=\"button\" className=\"\">\r\n <MoreHorizontal className=\"size-4\" />\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent className=\"p-0 border-0 min-w-max\">\r\n <ButtonGroup>\r\n {hasCopy && (\r\n <Button variant=\"outline\" onClick={onCopyItem}>\r\n <ClipboardCheck className=\"size-4\" />\r\n </Button>\r\n )}\r\n {hasMoveUp && (\r\n <Button variant=\"outline\" onClick={onMoveUpItem}>\r\n <ArrowUpIcon className=\"size-4\" />\r\n </Button>\r\n )}\r\n {hasRemove && (\r\n <Button variant=\"outline\" onClick={onRemoveItem}>\r\n <Trash2 className=\"size-4\" />\r\n </Button>\r\n )}\r\n {hasMoveDown && (\r\n <Button variant=\"outline\" onClick={onMoveDownItem}>\r\n <ArrowDownIcon className=\"size-4\" />\r\n </Button>\r\n )}\r\n </ButtonGroup>\r\n </PopoverContent>\r\n </Popover>\r\n )}\r\n </TableCell>\r\n </TableRow>\r\n );\r\n}\r\n"],"mappings":"AAkDY,cAWE,YAXF;AAlDZ,SAAS,cAAc;AACvB,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,WAAW,gBAAgB;AACpC,SAAS,UAAU;AAOnB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,SAAS,uBAId,OAA6C;AAC7C,QAAM,EAAE,UAAU,cAAc,WAAW,IAAI;AAC/C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,oBAAoB,cAAc,WAAW,eAAe;AAClE,SACE,qBAAC,YAAS,WAAW,GAAG,YAAY,MAAM,SAAS,GAChD;AAAA;AAAA,IACD,qBAAC,aAAU,WAAU,OAClB;AAAA,oBAAc,aAAa,CAAC,qBAC3B;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,SAAS,aAAa;AAAA,UAEtB,8BAAC,UAAO,WAAU,UAAS;AAAA;AAAA,MAC7B;AAAA,MAED,cAAc,qBACb,qBAAC,WACC;AAAA,4BAAC,kBAAe,SAAO,MACrB,8BAAC,UAAO,SAAQ,SAAQ,MAAK,UAAS,WAAU,IAC9C,8BAAC,kBAAe,WAAU,UAAS,GACrC,GACF;AAAA,QACA,oBAAC,kBAAe,WAAU,0BACxB,+BAAC,eACE;AAAA,qBACC,oBAAC,UAAO,SAAQ,WAAU,SAAS,YACjC,8BAAC,kBAAe,WAAU,UAAS,GACrC;AAAA,UAED,aACC,oBAAC,UAAO,SAAQ,WAAU,SAAS,cACjC,8BAAC,eAAY,WAAU,UAAS,GAClC;AAAA,UAED,aACC,oBAAC,UAAO,SAAQ,WAAU,SAAS,cACjC,8BAAC,UAAO,WAAU,UAAS,GAC7B;AAAA,UAED,eACC,oBAAC,UAAO,SAAQ,WAAU,SAAS,gBACjC,8BAAC,iBAAc,WAAU,UAAS,GACpC;AAAA,WAEJ,GACF;AAAA,SACF;AAAA,OAEJ;AAAA,OA7CyD,MAAM,OA8CjE;AAEJ;","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Button } from "@
|
|
2
|
+
import { Button } from "@ayasofyazilim/ui/components/button";
|
|
3
3
|
import {
|
|
4
4
|
Table,
|
|
5
5
|
TableBody,
|
|
@@ -7,8 +7,8 @@ import {
|
|
|
7
7
|
TableHead,
|
|
8
8
|
TableHeader,
|
|
9
9
|
TableRow
|
|
10
|
-
} from "@
|
|
11
|
-
import { cn } from "@
|
|
10
|
+
} from "@ayasofyazilim/ui/components/table";
|
|
11
|
+
import { cn } from "@ayasofyazilim/ui/lib/utils";
|
|
12
12
|
import {
|
|
13
13
|
buttonId,
|
|
14
14
|
getTemplate,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/custom/schema-form/fields/table-array/array-field-template.tsx"],"sourcesContent":["import { Button } from \"@
|
|
1
|
+
{"version":3,"sources":["../../../../../src/custom/schema-form/fields/table-array/array-field-template.tsx"],"sourcesContent":["import { Button } from \"@ayasofyazilim/ui/components/button\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCaption,\r\n TableHead,\r\n TableHeader,\r\n TableRow,\r\n} from \"@ayasofyazilim/ui/components/table\";\r\nimport { cn } from \"@ayasofyazilim/ui/lib/utils\";\r\nimport {\r\n ArrayFieldTemplateProps,\r\n buttonId,\r\n getTemplate,\r\n getUiOptions,\r\n} from \"@rjsf/utils\";\r\nimport { PlusCircle } from \"lucide-react\";\r\n\r\nexport function ArrayFieldTemplate(props: ArrayFieldTemplateProps) {\r\n const {\r\n canAdd,\r\n disabled,\r\n fieldPathId,\r\n uiSchema,\r\n items,\r\n optionalDataControl,\r\n onAddClick,\r\n readonly,\r\n registry,\r\n required,\r\n schema,\r\n title,\r\n } = props;\r\n const uiOptions = getUiOptions(uiSchema);\r\n const ArrayFieldDescriptionTemplate = getTemplate(\r\n \"ArrayFieldDescriptionTemplate\",\r\n registry,\r\n uiOptions,\r\n );\r\n const ArrayFieldTitleTemplate = getTemplate(\r\n \"ArrayFieldTitleTemplate\",\r\n registry,\r\n uiOptions,\r\n );\r\n const showOptionalDataControlInTitle = !readonly && !disabled;\r\n\r\n return (\r\n <div className=\"border rounded-md overflow-hidden\">\r\n <Table key={`array-item-list-${fieldPathId.$id}`} className=\"caption-top\">\r\n {!showOptionalDataControlInTitle ? optionalDataControl : undefined}\r\n <TableCaption className=\"border-b mt-0 [&_h5]:font-medium [&_h5]:text-black **:data-[slot=separator]:hidden\">\r\n <ArrayFieldTitleTemplate\r\n fieldPathId={fieldPathId}\r\n title={uiOptions.title || title}\r\n schema={schema}\r\n uiSchema={uiSchema}\r\n required={required}\r\n registry={registry}\r\n optionalDataControl={\r\n showOptionalDataControlInTitle ? optionalDataControl : undefined\r\n }\r\n />\r\n <ArrayFieldDescriptionTemplate\r\n fieldPathId={fieldPathId}\r\n description={uiOptions.description || schema.description}\r\n schema={schema}\r\n uiSchema={uiSchema}\r\n registry={registry}\r\n />\r\n </TableCaption>\r\n <TableHeader>\r\n <TableRow className=\"divide-x\">\r\n {Object.keys(\r\n (schema?.items as { properties: Record<string, string> })\r\n ?.properties || {},\r\n ).map((item) => {\r\n const itemsUiSchema =\r\n typeof uiSchema?.items === \"function\"\r\n ? undefined\r\n : (uiSchema?.items as\r\n | Record<string, { \"ui:title\": string }>\r\n | undefined);\r\n const title =\r\n itemsUiSchema?.[item as string]?.[\"ui:title\"] || item;\r\n return (\r\n <TableHead\r\n key={item}\r\n className={cn(\"h-9\", !canAdd && \"nth-last-2:border-0!\")}\r\n >\r\n {title}\r\n </TableHead>\r\n );\r\n })}\r\n <TableHead className={cn(\"p-0 size-9\")}>\r\n {canAdd && (\r\n <Button\r\n id={buttonId(fieldPathId, \"add\")}\r\n onClick={onAddClick}\r\n disabled={disabled || readonly}\r\n className=\"rounded-none h-full\"\r\n variant=\"ghost\"\r\n >\r\n <PlusCircle className=\"size-4\" />\r\n </Button>\r\n )}\r\n </TableHead>\r\n </TableRow>\r\n </TableHeader>\r\n <TableBody className=\"[&_tr:last-child>td]:rounded-md\">\r\n {items}\r\n </TableBody>\r\n </Table>\r\n </div>\r\n );\r\n}\r\n"],"mappings":"AAkDQ,SACE,KADF;AAlDR,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,UAAU;AACnB;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB;AAEpB,SAAS,mBAAmB,OAAgC;AACjE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,YAAY,aAAa,QAAQ;AACvC,QAAM,gCAAgC;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,0BAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,iCAAiC,CAAC,YAAY,CAAC;AAErD,SACE,oBAAC,SAAI,WAAU,qCACb,+BAAC,SAAiD,WAAU,eACzD;AAAA,KAAC,iCAAiC,sBAAsB;AAAA,IACzD,qBAAC,gBAAa,WAAU,uFACtB;AAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,OAAO,UAAU,SAAS;AAAA,UAC1B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,qBACE,iCAAiC,sBAAsB;AAAA;AAAA,MAE3D;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,aAAa,UAAU,eAAe,OAAO;AAAA,UAC7C;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,OACF;AAAA,IACA,oBAAC,eACC,+BAAC,YAAS,WAAU,YACjB;AAAA,aAAO;AAAA,QACL,QAAQ,OACL,cAAc,CAAC;AAAA,MACrB,EAAE,IAAI,CAAC,SAAS;AACd,cAAM,gBACJ,OAAO,UAAU,UAAU,aACvB,SACC,UAAU;AAGjB,cAAMA,SACJ,gBAAgB,IAAc,IAAI,UAAU,KAAK;AACnD,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW,GAAG,OAAO,CAAC,UAAU,sBAAsB;AAAA,YAErD,UAAAA;AAAA;AAAA,UAHI;AAAA,QAIP;AAAA,MAEJ,CAAC;AAAA,MACD,oBAAC,aAAU,WAAW,GAAG,YAAY,GAClC,oBACC;AAAA,QAAC;AAAA;AAAA,UACC,IAAI,SAAS,aAAa,KAAK;AAAA,UAC/B,SAAS;AAAA,UACT,UAAU,YAAY;AAAA,UACtB,WAAU;AAAA,UACV,SAAQ;AAAA,UAER,8BAAC,cAAW,WAAU,UAAS;AAAA;AAAA,MACjC,GAEJ;AAAA,OACF,GACF;AAAA,IACA,oBAAC,aAAU,WAAU,mCAClB,iBACH;AAAA,OA9DU,mBAAmB,YAAY,GAAG,EA+D9C,GACF;AAEJ;","names":["title"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
|
-
import { lodash } from "@
|
|
3
|
+
import { lodash } from "@ayasofyazilim/ui/lib/utils";
|
|
4
4
|
import { Form } from "@rjsf/shadcn";
|
|
5
5
|
import { customizeValidator } from "@rjsf/validator-ajv8";
|
|
6
6
|
import { useCallback, useMemo } from "react";
|