@goplusvn/core 0.1.0 → 0.1.2
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/package.json +31 -175
- package/src/assets/erp_wallpaper.png +0 -0
- package/src/assets/goeat_logo.png +0 -0
- package/src/audit/audit-manager.ts +139 -0
- package/src/audit/index.ts +11 -0
- package/src/audit/memory-audit-logger.ts +86 -0
- package/src/audit/types.ts +50 -0
- package/src/auth/auth-service.ts +97 -0
- package/src/auth/index.ts +266 -0
- package/src/code-generation/index.ts +69 -0
- package/src/configs/auth-routes.ts +17 -0
- package/src/configs/crud.ts +136 -0
- package/src/configs/data/navigations.ts +781 -0
- package/src/configs/data/oauth-links.ts +10 -0
- package/src/configs/entities/material-categories.config.ts +125 -0
- package/src/configs/i18n.ts +12 -0
- package/src/configs/index.ts +26 -0
- package/src/configs/status.ts +25 -0
- package/src/configs/themes.ts +100 -0
- package/src/crud/components/crud-bulk-actions.tsx +91 -0
- package/src/crud/components/crud-card-view.tsx +241 -0
- package/src/crud/components/crud-context.tsx +122 -0
- package/src/crud/components/crud-delete-dialog.tsx +145 -0
- package/src/crud/components/crud-dialog.tsx +406 -0
- package/src/crud/components/crud-empty-state.tsx +104 -0
- package/src/crud/components/crud-export-button.tsx +170 -0
- package/src/crud/components/crud-field-renderer.tsx +653 -0
- package/src/crud/components/crud-filter-chips.tsx +102 -0
- package/src/crud/components/crud-filters/checkbox-filter.tsx +97 -0
- package/src/crud/components/crud-filters/datetime-filter.tsx +83 -0
- package/src/crud/components/crud-filters/filter-builder.tsx +66 -0
- package/src/crud/components/crud-filters/index.tsx +76 -0
- package/src/crud/components/crud-filters/radio-filter.tsx +86 -0
- package/src/crud/components/crud-filters/select-filter.tsx +141 -0
- package/src/crud/components/crud-filters/text-filter.tsx +86 -0
- package/src/crud/components/crud-form.tsx +642 -0
- package/src/crud/components/crud-import-dialog.tsx +440 -0
- package/src/crud/components/crud-infinite-scroll.tsx +116 -0
- package/src/crud/components/crud-page.tsx +1017 -0
- package/src/crud/components/crud-provider.tsx +277 -0
- package/src/crud/components/crud-row-actions.tsx +189 -0
- package/src/crud/components/crud-search.tsx +82 -0
- package/src/crud/components/crud-sheet.tsx +336 -0
- package/src/crud/components/crud-table-skeleton.tsx +26 -0
- package/src/crud/components/crud-table-toolbar.tsx +91 -0
- package/src/crud/components/crud-table.tsx +352 -0
- package/src/crud/components/crud-virtual-table.tsx +55 -0
- package/src/crud/components/index.tsx +20 -0
- package/src/crud/crud-filters/checkbox-filter.tsx +87 -0
- package/src/crud/crud-filters/datetime-filter.tsx +82 -0
- package/src/crud/crud-filters/filter-builder.tsx +64 -0
- package/src/crud/crud-filters/index.tsx +78 -0
- package/src/crud/crud-filters/radio-filter.tsx +79 -0
- package/src/crud/crud-filters/select-filter.tsx +148 -0
- package/src/crud/crud-filters/text-filter.tsx +81 -0
- package/src/crud/index.ts +43 -0
- package/src/crud/lib/crud-service.test.ts +334 -0
- package/src/crud/lib/crud-service.ts +358 -0
- package/src/crud/lib/crud-utils.test.ts +354 -0
- package/src/crud/lib/crud-utils.ts +299 -0
- package/src/crud/lib/crud-validator.ts +247 -0
- package/src/crud/lib/data-loader.ts +234 -0
- package/src/crud/lib/field-calculator.ts +241 -0
- package/src/crud/lib/field-formatter.ts +240 -0
- package/src/crud/lib/import-export-service.test.ts +290 -0
- package/src/crud/lib/import-export-service.ts +352 -0
- package/src/crud/lib/import-server-utils.ts +109 -0
- package/src/crud/lib/lazy-loader.ts +241 -0
- package/src/crud/lib/parse-filters.ts +85 -0
- package/src/crud/lib/permissions.ts +52 -0
- package/src/crud/lib/serialize-config.ts +60 -0
- package/src/crud/lib/stream-loader.ts +145 -0
- package/src/crud/lib/translate-config.ts +335 -0
- package/src/crud/lib/types.ts +11 -0
- package/src/crud/pages/entity-crud-page.tsx +144 -0
- package/src/crud/server.ts +8 -0
- package/src/home/constants.tsx +142 -0
- package/src/home/feature-showcase.tsx +171 -0
- package/src/home/home-page.tsx +191 -0
- package/src/home/hooks/index.ts +1 -0
- package/src/home/hooks/useWidgetPreferences.ts +167 -0
- package/src/home/index.ts +33 -0
- package/src/home/quick-access-dialog.tsx +271 -0
- package/src/home/quick-access-menu.tsx +267 -0
- package/src/home/types.ts +140 -0
- package/src/home/welcome-card.tsx +92 -0
- package/src/home/widget-container.tsx +258 -0
- package/src/home/widgets/base-widget.tsx +200 -0
- package/src/home/widgets/customers-widget.tsx +74 -0
- package/src/home/widgets/index.ts +6 -0
- package/src/home/widgets/orders-widget.tsx +87 -0
- package/src/home/widgets/revenue-widget.tsx +71 -0
- package/src/home/widgets/stock-widget.tsx +109 -0
- package/src/hooks/index.tsx +598 -0
- package/src/hooks/use-tenant.test.tsx +30 -0
- package/src/hooks/use-tenant.ts +5 -0
- package/src/index.ts +17 -0
- package/src/infrastructure/__tests__/architecture-verification.spec.ts +103 -0
- package/src/infrastructure/api-service.ts +317 -0
- package/src/infrastructure/cache/cache-manager.ts +107 -0
- package/src/infrastructure/cache/cache.ts +120 -0
- package/src/infrastructure/cache/index.ts +8 -0
- package/src/infrastructure/cache/types.ts +48 -0
- package/src/infrastructure/cron/cron-manager.ts +239 -0
- package/src/infrastructure/cron/index.ts +6 -0
- package/src/infrastructure/cron/types.ts +41 -0
- package/src/infrastructure/event-bus/event-bus.ts +145 -0
- package/src/infrastructure/event-bus/index.ts +2 -0
- package/src/infrastructure/event-bus/types.ts +22 -0
- package/src/infrastructure/index.ts +32 -0
- package/src/infrastructure/lock/decorators.ts +67 -0
- package/src/infrastructure/lock/index.ts +2 -0
- package/src/infrastructure/lock/lock-manager.ts +33 -0
- package/src/infrastructure/logger/index.ts +2 -0
- package/src/infrastructure/logger/logger.ts +96 -0
- package/src/infrastructure/logger/types.ts +25 -0
- package/src/layout/index.tsx +185 -0
- package/src/navigation/index.ts +91 -0
- package/src/notification/index.ts +14 -0
- package/src/notification/notification-service.ts +120 -0
- package/src/notification/storage/in-memory.ts +56 -0
- package/src/notification/storage/index.ts +1 -0
- package/src/notification/types.ts +51 -0
- package/src/organization/branch-service.ts +299 -0
- package/src/organization/branches.config.ts +154 -0
- package/src/organization/index.ts +5 -0
- package/src/plugin/apps-registry.ts +97 -0
- package/src/plugin/index.ts +5 -0
- package/src/plugin/types.ts +41 -0
- package/src/providers/index.tsx +109 -0
- package/src/providers/tenant-provider.tsx +45 -0
- package/src/rbac/components/roles/role-card.tsx +158 -0
- package/src/rbac/components/roles/role-stats-cards.tsx +29 -0
- package/src/rbac/components/roles/role-toolbar.tsx +123 -0
- package/src/rbac/hooks/use-role-operations.ts +159 -0
- package/src/rbac/hooks/use-roles-data.ts +59 -0
- package/src/rbac/index.ts +297 -0
- package/src/rbac/lib/permission-helpers.ts +63 -0
- package/src/rbac/pages/action-list-page.tsx +25 -0
- package/src/rbac/pages/resource-list-page.tsx +25 -0
- package/src/rbac/pages/role-list-page.tsx +378 -0
- package/src/rbac/permission-service.ts +140 -0
- package/src/rbac/permissions.ts +135 -0
- package/src/rbac/resource-service.ts +115 -0
- package/src/rbac/resource-validator.ts +119 -0
- package/src/rbac/role-service.ts +165 -0
- package/src/rbac/server.ts +16 -0
- package/src/rbac/types.ts +38 -0
- package/src/schemas/action.schema.ts +66 -0
- package/src/schemas/branch.schema.ts +52 -0
- package/src/schemas/coming-soon-schema.ts +9 -0
- package/src/schemas/company.schema.ts +44 -0
- package/src/schemas/forgot-passward-schema.ts +9 -0
- package/src/schemas/index.ts +30 -0
- package/src/schemas/material-category.schema.ts +43 -0
- package/src/schemas/material-pricing.schema.ts +74 -0
- package/src/schemas/material.schema.ts +76 -0
- package/src/schemas/materials.ts +52 -0
- package/src/schemas/new-passward-schema.ts +15 -0
- package/src/schemas/partner-company.schema.ts +149 -0
- package/src/schemas/register-schema.ts +36 -0
- package/src/schemas/resource.schema.ts +133 -0
- package/src/schemas/role.schema.ts +11 -0
- package/src/schemas/sign-in-schema.ts +24 -0
- package/src/schemas/supplier-pricing.schema.ts +15 -0
- package/src/schemas/supplier.schema.ts +120 -0
- package/src/schemas/system-category-group.schema.ts +67 -0
- package/src/schemas/system-category.schema.ts +77 -0
- package/src/schemas/system-config.schema.ts +118 -0
- package/src/schemas/uom.schema.ts +75 -0
- package/src/schemas/user-supplier.schema.ts +179 -0
- package/src/schemas/user.schema.ts +18 -0
- package/src/schemas/verify-email-schema.ts +9 -0
- package/src/schemas/warehouse.schema.ts +49 -0
- package/src/system/components/categories/category-list.tsx +529 -0
- package/src/system/components/categories/category-manager.tsx +89 -0
- package/src/system/components/categories/group-sidebar.tsx +308 -0
- package/src/system/components/settings/setting-dialogs.tsx +197 -0
- package/src/system/components/settings/setting-field.tsx +291 -0
- package/src/system/components/settings/setting-form-dialog.tsx +308 -0
- package/src/system/components/settings/settings-groups.ts +80 -0
- package/src/system/components/settings/settings-search.tsx +71 -0
- package/src/system/components/settings/settings-section.tsx +74 -0
- package/src/system/components/settings/settings-sidebar.tsx +81 -0
- package/src/system/constants.ts +3 -0
- package/src/system/index.ts +150 -0
- package/src/system/job-manager.ts +176 -0
- package/src/system/pages/components/categories/category-list.tsx +537 -0
- package/src/system/pages/components/categories/category-manager.tsx +90 -0
- package/src/system/pages/components/categories/group-sidebar.tsx +311 -0
- package/src/system/pages/components/settings/sales-rules-settings.tsx +222 -0
- package/src/system/pages/components/settings/setting-dialogs.tsx +197 -0
- package/src/system/pages/components/settings/setting-field.tsx +292 -0
- package/src/system/pages/components/settings/setting-form-dialog.tsx +308 -0
- package/src/system/pages/components/settings/settings-groups.ts +87 -0
- package/src/system/pages/components/settings/settings-page.tsx +372 -0
- package/src/system/pages/components/settings/settings-search.tsx +71 -0
- package/src/system/pages/components/settings/settings-section.tsx +74 -0
- package/src/system/pages/components/settings/settings-sidebar.tsx +81 -0
- package/src/system/pages/components/settings/system-settings.tsx +244 -0
- package/src/system/pages/system-category-page.tsx +15 -0
- package/src/system/pages/system-settings-page.tsx +380 -0
- package/src/system/schemas/system-category-group.schema.ts +46 -0
- package/src/system/schemas/system-category.schema.ts +56 -0
- package/src/system/services/settings-service.ts +127 -0
- package/src/system/services/system-category-service.ts +63 -0
- package/src/system/types.ts +45 -0
- package/src/types/index.ts +703 -0
- package/src/ui/auth/auth-layout.tsx +135 -0
- package/src/ui/auth/forgot-password-form.tsx +98 -0
- package/src/ui/auth/index.tsx +7 -0
- package/src/ui/auth/new-password-form.tsx +107 -0
- package/src/ui/auth/oauth-links.tsx +30 -0
- package/src/ui/auth/register-form.tsx +202 -0
- package/src/ui/auth/sign-in-form.tsx +238 -0
- package/src/ui/auth/verify-email-form.tsx +104 -0
- package/src/ui/crud/index.tsx +10 -0
- package/src/ui/data-display/accordion.tsx +65 -0
- package/src/ui/data-display/aspect-ratio.tsx +11 -0
- package/src/ui/data-display/avatar.tsx +163 -0
- package/src/ui/data-display/bento-grid.tsx +77 -0
- package/src/ui/data-display/carousel.tsx +249 -0
- package/src/ui/data-display/chart.tsx +363 -0
- package/src/ui/data-display/code-block-highlight.tsx +54 -0
- package/src/ui/data-display/collapsible.tsx +42 -0
- package/src/ui/data-display/compact-stat-bar.tsx +149 -0
- package/src/ui/data-display/data-table/data-table-context.tsx +255 -0
- package/src/ui/data-display/data-table/data-table-empty-state.tsx +133 -0
- package/src/ui/data-display/data-table/data-table-skeleton.tsx +145 -0
- package/src/ui/data-display/data-table/data-table-toolbar.tsx +353 -0
- package/src/ui/data-display/data-table/data-table.tsx +597 -0
- package/src/ui/data-display/data-table/index.ts +44 -0
- package/src/ui/data-display/data-table-column-header.tsx +75 -0
- package/src/ui/data-display/data-table-pagination.tsx +130 -0
- package/src/ui/data-display/data-table-view-options.tsx +59 -0
- package/src/ui/data-display/formatted-number-input.tsx +210 -0
- package/src/ui/data-display/highlight.tsx +20 -0
- package/src/ui/data-display/hover-card.tsx +48 -0
- package/src/ui/data-display/index.tsx +50 -0
- package/src/ui/data-display/iphone-15-pro.tsx +114 -0
- package/src/ui/data-display/kanban/index.ts +4 -0
- package/src/ui/data-display/kanban/kanban-board.tsx +192 -0
- package/src/ui/data-display/kanban/kanban-column.tsx +74 -0
- package/src/ui/data-display/kanban/kanban-item.tsx +50 -0
- package/src/ui/data-display/kanban/kanban-types.ts +21 -0
- package/src/ui/data-display/kpi-card.tsx +68 -0
- package/src/ui/data-display/media-grid.tsx +110 -0
- package/src/ui/data-display/safari.tsx +175 -0
- package/src/ui/data-display/show-more-text.tsx +55 -0
- package/src/ui/data-display/tabs.tsx +68 -0
- package/src/ui/data-display/timeline.tsx +256 -0
- package/src/ui/feedback/alert.tsx +60 -0
- package/src/ui/feedback/context-menu.tsx +245 -0
- package/src/ui/feedback/drawer.tsx +132 -0
- package/src/ui/feedback/error-dialog.tsx +273 -0
- package/src/ui/feedback/index.tsx +183 -0
- package/src/ui/feedback/progress.tsx +32 -0
- package/src/ui/feedback/sheet.tsx +148 -0
- package/src/ui/feedback/sonner.tsx +36 -0
- package/src/ui/forms/command.tsx +157 -0
- package/src/ui/forms/date-picker.tsx +73 -0
- package/src/ui/forms/date-range-picker.tsx +76 -0
- package/src/ui/forms/date-time-picker.tsx +109 -0
- package/src/ui/forms/editor/editor-menu-bar.tsx +394 -0
- package/src/ui/forms/editor/index.tsx +130 -0
- package/src/ui/forms/editor/multi-select-example.tsx +1234 -0
- package/src/ui/forms/emoji-picker.tsx +109 -0
- package/src/ui/forms/file-dropzone.tsx +169 -0
- package/src/ui/forms/file-thumbnail.tsx +29 -0
- package/src/ui/forms/index.tsx +201 -0
- package/src/ui/forms/input-file.tsx +99 -0
- package/src/ui/forms/input-group.tsx +46 -0
- package/src/ui/forms/input-otp.tsx +81 -0
- package/src/ui/forms/input-phone.tsx +172 -0
- package/src/ui/forms/input-spin.tsx +116 -0
- package/src/ui/forms/input-tags.tsx +219 -0
- package/src/ui/forms/input-time.tsx +42 -0
- package/src/ui/forms/multi-select.tsx +629 -0
- package/src/ui/forms/multiple-date-picker.tsx +74 -0
- package/src/ui/forms/radio-group.tsx +42 -0
- package/src/ui/forms/rating.tsx +158 -0
- package/src/ui/forms/time-picker.tsx +57 -0
- package/src/ui/index.tsx +17 -0
- package/src/ui/layout/animated-list.tsx +77 -0
- package/src/ui/layout/animated-sidebar.tsx +294 -0
- package/src/ui/layout/command-menu.tsx +355 -0
- package/src/ui/layout/customizer.tsx +324 -0
- package/src/ui/layout/footer.tsx +43 -0
- package/src/ui/layout/full-screen-toggle.tsx +52 -0
- package/src/ui/layout/header-breadcrumb.tsx +77 -0
- package/src/ui/layout/horizontal-layout-header.tsx +83 -0
- package/src/ui/layout/horizontal-layout.tsx +50 -0
- package/src/ui/layout/index.tsx +25 -0
- package/src/ui/layout/language-dropdown.tsx +103 -0
- package/src/ui/layout/logo.tsx +63 -0
- package/src/ui/layout/main-layout.tsx +57 -0
- package/src/ui/layout/mode-dropdown.tsx +58 -0
- package/src/ui/layout/notification-dropdown.tsx +127 -0
- package/src/ui/layout/page-tabs.tsx +306 -0
- package/src/ui/layout/route-cache.tsx +214 -0
- package/src/ui/layout/sidebar-group-icon-menu.tsx +195 -0
- package/src/ui/layout/sidebar.tsx +279 -0
- package/src/ui/layout/tab-content-cache.tsx +201 -0
- package/src/ui/layout/tab-navigation-provider.tsx +536 -0
- package/src/ui/layout/toggle-mobile-sidebar.tsx +33 -0
- package/src/ui/layout/top-bar-header-menubar.tsx +412 -0
- package/src/ui/layout/user-dropdown.tsx +188 -0
- package/src/ui/layout/vertical-layout-header.tsx +65 -0
- package/src/ui/layout/vertical-layout.tsx +47 -0
- package/src/ui/management/audit-log-page.tsx +209 -0
- package/src/ui/management/cache-management.tsx +349 -0
- package/src/ui/management/index.ts +3 -0
- package/src/ui/management/job-management.tsx +308 -0
- package/src/ui/pages/not-found.tsx +30 -0
- package/src/ui/primitives/badge.tsx +66 -0
- package/src/ui/primitives/breadcrumb.tsx +103 -0
- package/src/ui/primitives/button.tsx +129 -0
- package/src/ui/primitives/calendar.tsx +74 -0
- package/src/ui/primitives/card.tsx +86 -0
- package/src/ui/primitives/checkbox.tsx +31 -0
- package/src/ui/primitives/client.ts +30 -0
- package/src/ui/primitives/combobox.tsx +290 -0
- package/src/ui/primitives/dialog.tsx +121 -0
- package/src/ui/primitives/dropdown-menu.tsx +239 -0
- package/src/ui/primitives/dynamic-icon.tsx +24 -0
- package/src/ui/primitives/index.tsx +134 -0
- package/src/ui/primitives/input-number.tsx +131 -0
- package/src/ui/primitives/input.tsx +22 -0
- package/src/ui/primitives/keyboard.tsx +23 -0
- package/src/ui/primitives/label.tsx +24 -0
- package/src/ui/primitives/menubar.tsx +262 -0
- package/src/ui/primitives/navigation-menu.tsx +157 -0
- package/src/ui/primitives/pagination.tsx +118 -0
- package/src/ui/primitives/popover.tsx +56 -0
- package/src/ui/primitives/prefetch-link.tsx +60 -0
- package/src/ui/primitives/resizable.tsx +59 -0
- package/src/ui/primitives/scroll-area.tsx +63 -0
- package/src/ui/primitives/select.tsx +172 -0
- package/src/ui/primitives/separator.tsx +51 -0
- package/src/ui/primitives/sidebar.tsx +844 -0
- package/src/ui/primitives/slider.tsx +27 -0
- package/src/ui/primitives/status-badge.tsx +47 -0
- package/src/ui/primitives/sticky-layout.tsx +50 -0
- package/src/ui/primitives/switch.tsx +29 -0
- package/src/ui/primitives/table.tsx +116 -0
- package/src/ui/primitives/tabs.tsx +55 -0
- package/src/ui/primitives/toggle-group.tsx +70 -0
- package/src/ui/primitives/toggle.tsx +47 -0
- package/src/ui/primitives/tooltip.tsx +59 -0
- package/src/user/components/dangerous-zone.tsx +34 -0
- package/src/user/components/delete-account-form.tsx +40 -0
- package/src/user/components/index.ts +4 -0
- package/src/user/components/profile-info-form.tsx +390 -0
- package/src/user/components/profile-info.tsx +32 -0
- package/src/user/components/unified-profile-dialog.tsx +1019 -0
- package/src/user/components/user-stats.tsx +27 -0
- package/src/user/components/user-toolbar.tsx +137 -0
- package/src/user/components/users-card-view.tsx +253 -0
- package/src/user/index.ts +11 -0
- package/src/user/pages/user-list-page.tsx +234 -0
- package/src/user/pages/users-client-page.tsx +385 -0
- package/src/user/profile-page.tsx +19 -0
- package/src/user/schemas.ts +68 -0
- package/src/user/types.ts +34 -0
- package/src/user/user-service.ts +538 -0
- package/src/utils/index.ts +906 -0
- package/src/workflow/activity-timeline.tsx +412 -0
- package/src/workflow/approval-workflow.tsx +31 -0
- package/src/workflow/index.ts +2 -0
- package/dist/audit/index.d.mts +0 -115
- package/dist/audit/index.d.ts +0 -115
- package/dist/audit/index.js +0 -204
- package/dist/audit/index.js.map +0 -1
- package/dist/audit/index.mjs +0 -200
- package/dist/audit/index.mjs.map +0 -1
- package/dist/auth/index.d.mts +0 -86
- package/dist/auth/index.d.ts +0 -86
- package/dist/auth/index.js +0 -210
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/index.mjs +0 -198
- package/dist/auth/index.mjs.map +0 -1
- package/dist/button-1dWvP9Ib.d.mts +0 -30
- package/dist/button-1dWvP9Ib.d.ts +0 -30
- package/dist/calendar-2QzdEo1z.d.mts +0 -20
- package/dist/calendar-2QzdEo1z.d.ts +0 -20
- package/dist/code-generation/index.d.mts +0 -30
- package/dist/code-generation/index.d.ts +0 -30
- package/dist/code-generation/index.js +0 -31
- package/dist/code-generation/index.js.map +0 -1
- package/dist/code-generation/index.mjs +0 -28
- package/dist/code-generation/index.mjs.map +0 -1
- package/dist/configs/index.d.mts +0 -175
- package/dist/configs/index.d.ts +0 -175
- package/dist/configs/index.js +0 -254
- package/dist/configs/index.js.map +0 -1
- package/dist/configs/index.mjs +0 -233
- package/dist/configs/index.mjs.map +0 -1
- package/dist/crud/index.d.mts +0 -646
- package/dist/crud/index.d.ts +0 -646
- package/dist/crud/index.js +0 -11772
- package/dist/crud/index.js.map +0 -1
- package/dist/crud/index.mjs +0 -11665
- package/dist/crud/index.mjs.map +0 -1
- package/dist/crud/server.d.mts +0 -20
- package/dist/crud/server.d.ts +0 -20
- package/dist/crud/server.js +0 -123
- package/dist/crud/server.js.map +0 -1
- package/dist/crud/server.mjs +0 -120
- package/dist/crud/server.mjs.map +0 -1
- package/dist/data-table-skeleton-12NA8Mjx.d.mts +0 -39
- package/dist/data-table-skeleton-12NA8Mjx.d.ts +0 -39
- package/dist/dialog-bKfjZMTd.d.mts +0 -22
- package/dist/dialog-bKfjZMTd.d.ts +0 -22
- package/dist/dynamic-icon-DrGIiu2N.d.mts +0 -10
- package/dist/dynamic-icon-DrGIiu2N.d.ts +0 -10
- package/dist/home/index.d.mts +0 -269
- package/dist/home/index.d.ts +0 -269
- package/dist/home/index.js +0 -1678
- package/dist/home/index.js.map +0 -1
- package/dist/home/index.mjs +0 -1635
- package/dist/home/index.mjs.map +0 -1
- package/dist/hooks/index.d.mts +0 -7
- package/dist/hooks/index.d.ts +0 -7
- package/dist/hooks/index.js +0 -8316
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/index.mjs +0 -8255
- package/dist/hooks/index.mjs.map +0 -1
- package/dist/index-50hpiPrV.d.ts +0 -116
- package/dist/index-B9zQVEVi.d.mts +0 -116
- package/dist/index.d.mts +0 -5
- package/dist/index.d.ts +0 -5
- package/dist/index.js +0 -123
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -118
- package/dist/index.mjs.map +0 -1
- package/dist/infrastructure/index.d.mts +0 -423
- package/dist/infrastructure/index.d.ts +0 -423
- package/dist/infrastructure/index.js +0 -633
- package/dist/infrastructure/index.js.map +0 -1
- package/dist/infrastructure/index.mjs +0 -619
- package/dist/infrastructure/index.mjs.map +0 -1
- package/dist/label-DWTEkNPo.d.ts +0 -226
- package/dist/label-LPpdcoBx.d.mts +0 -226
- package/dist/layout/index.d.mts +0 -48
- package/dist/layout/index.d.ts +0 -48
- package/dist/layout/index.js +0 -117
- package/dist/layout/index.js.map +0 -1
- package/dist/layout/index.mjs +0 -90
- package/dist/layout/index.mjs.map +0 -1
- package/dist/navigation/index.d.mts +0 -16
- package/dist/navigation/index.d.ts +0 -16
- package/dist/navigation/index.js +0 -53
- package/dist/navigation/index.js.map +0 -1
- package/dist/navigation/index.mjs +0 -50
- package/dist/navigation/index.mjs.map +0 -1
- package/dist/notification/index.d.mts +0 -105
- package/dist/notification/index.d.ts +0 -105
- package/dist/notification/index.js +0 -278
- package/dist/notification/index.js.map +0 -1
- package/dist/notification/index.mjs +0 -274
- package/dist/notification/index.mjs.map +0 -1
- package/dist/organization/index.d.mts +0 -99
- package/dist/organization/index.d.ts +0 -99
- package/dist/organization/index.js +0 -360
- package/dist/organization/index.js.map +0 -1
- package/dist/organization/index.mjs +0 -352
- package/dist/organization/index.mjs.map +0 -1
- package/dist/plugin/index.d.mts +0 -83
- package/dist/plugin/index.d.ts +0 -83
- package/dist/plugin/index.js +0 -86
- package/dist/plugin/index.js.map +0 -1
- package/dist/plugin/index.mjs +0 -84
- package/dist/plugin/index.mjs.map +0 -1
- package/dist/providers/index.d.mts +0 -25
- package/dist/providers/index.d.ts +0 -25
- package/dist/providers/index.js +0 -84
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/index.mjs +0 -77
- package/dist/providers/index.mjs.map +0 -1
- package/dist/rbac/index.d.mts +0 -226
- package/dist/rbac/index.d.ts +0 -226
- package/dist/rbac/index.js +0 -4784
- package/dist/rbac/index.js.map +0 -1
- package/dist/rbac/index.mjs +0 -4722
- package/dist/rbac/index.mjs.map +0 -1
- package/dist/rbac/permissions.d.mts +0 -26
- package/dist/rbac/permissions.d.ts +0 -26
- package/dist/rbac/permissions.js +0 -94
- package/dist/rbac/permissions.js.map +0 -1
- package/dist/rbac/permissions.mjs +0 -90
- package/dist/rbac/permissions.mjs.map +0 -1
- package/dist/rbac/server.d.mts +0 -1
- package/dist/rbac/server.d.ts +0 -1
- package/dist/rbac/server.js +0 -128
- package/dist/rbac/server.js.map +0 -1
- package/dist/rbac/server.mjs +0 -124
- package/dist/rbac/server.mjs.map +0 -1
- package/dist/schemas/index.d.mts +0 -1257
- package/dist/schemas/index.d.ts +0 -1257
- package/dist/schemas/index.js +0 -572
- package/dist/schemas/index.js.map +0 -1
- package/dist/schemas/index.mjs +0 -523
- package/dist/schemas/index.mjs.map +0 -1
- package/dist/server-QuYCTa89.d.mts +0 -83
- package/dist/server-QuYCTa89.d.ts +0 -83
- package/dist/sonner-C74GlRDQ.d.mts +0 -71
- package/dist/sonner-C74GlRDQ.d.ts +0 -71
- package/dist/status-BOXZgIqX.d.mts +0 -12
- package/dist/status-BOXZgIqX.d.ts +0 -12
- package/dist/system/index.d.mts +0 -77
- package/dist/system/index.d.ts +0 -77
- package/dist/system/index.js +0 -102
- package/dist/system/index.js.map +0 -1
- package/dist/system/index.mjs +0 -100
- package/dist/system/index.mjs.map +0 -1
- package/dist/tabs-C6FfBwPY.d.mts +0 -18
- package/dist/tabs-C6FfBwPY.d.ts +0 -18
- package/dist/tenant-provider-B8eC_Wpb.d.mts +0 -27
- package/dist/tenant-provider-B8eC_Wpb.d.ts +0 -27
- package/dist/types/index.d.mts +0 -469
- package/dist/types/index.d.ts +0 -469
- package/dist/types/index.js +0 -25
- package/dist/types/index.js.map +0 -1
- package/dist/types/index.mjs +0 -21
- package/dist/types/index.mjs.map +0 -1
- package/dist/ui/auth.d.mts +0 -39
- package/dist/ui/auth.d.ts +0 -39
- package/dist/ui/auth.js +0 -4941
- package/dist/ui/auth.js.map +0 -1
- package/dist/ui/auth.mjs +0 -4896
- package/dist/ui/auth.mjs.map +0 -1
- package/dist/ui/crud.d.mts +0 -2
- package/dist/ui/crud.d.ts +0 -2
- package/dist/ui/crud.js +0 -4
- package/dist/ui/crud.js.map +0 -1
- package/dist/ui/crud.mjs +0 -3
- package/dist/ui/crud.mjs.map +0 -1
- package/dist/ui/data-display.d.mts +0 -596
- package/dist/ui/data-display.d.ts +0 -596
- package/dist/ui/data-display.js +0 -5307
- package/dist/ui/data-display.js.map +0 -1
- package/dist/ui/data-display.mjs +0 -5212
- package/dist/ui/data-display.mjs.map +0 -1
- package/dist/ui/feedback.d.mts +0 -55
- package/dist/ui/feedback.d.ts +0 -55
- package/dist/ui/feedback.js +0 -2608
- package/dist/ui/feedback.js.map +0 -1
- package/dist/ui/feedback.mjs +0 -2526
- package/dist/ui/feedback.mjs.map +0 -1
- package/dist/ui/forms.d.mts +0 -309
- package/dist/ui/forms.d.ts +0 -309
- package/dist/ui/forms.js +0 -4656
- package/dist/ui/forms.js.map +0 -1
- package/dist/ui/forms.mjs +0 -4571
- package/dist/ui/forms.mjs.map +0 -1
- package/dist/ui/index.d.mts +0 -331
- package/dist/ui/index.d.ts +0 -331
- package/dist/ui/index.js +0 -16953
- package/dist/ui/index.js.map +0 -1
- package/dist/ui/index.mjs +0 -16598
- package/dist/ui/index.mjs.map +0 -1
- package/dist/ui/primitives/client.d.mts +0 -61
- package/dist/ui/primitives/client.d.ts +0 -61
- package/dist/ui/primitives/client.js +0 -3408
- package/dist/ui/primitives/client.js.map +0 -1
- package/dist/ui/primitives/client.mjs +0 -3256
- package/dist/ui/primitives/client.mjs.map +0 -1
- package/dist/ui/primitives.d.mts +0 -113
- package/dist/ui/primitives.d.ts +0 -113
- package/dist/ui/primitives.js +0 -3356
- package/dist/ui/primitives.js.map +0 -1
- package/dist/ui/primitives.mjs +0 -3227
- package/dist/ui/primitives.mjs.map +0 -1
- package/dist/user/index.d.mts +0 -228
- package/dist/user/index.d.ts +0 -228
- package/dist/user/index.js +0 -4306
- package/dist/user/index.js.map +0 -1
- package/dist/user/index.mjs +0 -4260
- package/dist/user/index.mjs.map +0 -1
- package/dist/utils/index.d.mts +0 -205
- package/dist/utils/index.d.ts +0 -205
- package/dist/utils/index.js +0 -574
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/index.mjs +0 -514
- package/dist/utils/index.mjs.map +0 -1
- package/dist/workflow/index.d.mts +0 -40
- package/dist/workflow/index.d.ts +0 -40
- package/dist/workflow/index.js +0 -3710
- package/dist/workflow/index.js.map +0 -1
- package/dist/workflow/index.mjs +0 -3677
- package/dist/workflow/index.mjs.map +0 -1
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
export interface ResourcePrismaClient {
|
|
2
|
+
resource: any;
|
|
3
|
+
action: any;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Get resources data with pagination and filtering
|
|
8
|
+
* Shared function for both API route and Server Component
|
|
9
|
+
*
|
|
10
|
+
* @param db - The tenant-specific Prisma Client instance
|
|
11
|
+
* @param params - Filter and pagination parameters
|
|
12
|
+
*/
|
|
13
|
+
export async function getResourcesData(
|
|
14
|
+
db: ResourcePrismaClient,
|
|
15
|
+
params: any = {},
|
|
16
|
+
) {
|
|
17
|
+
const { page = 1, pageSize = 10, search, status, group, type } = params;
|
|
18
|
+
|
|
19
|
+
const where: any = {
|
|
20
|
+
AND: [
|
|
21
|
+
search
|
|
22
|
+
? {
|
|
23
|
+
OR: [
|
|
24
|
+
{ code: { contains: search, mode: "insensitive" } },
|
|
25
|
+
{ name: { contains: search, mode: "insensitive" } },
|
|
26
|
+
{ description: { contains: search, mode: "insensitive" } },
|
|
27
|
+
{ path: { contains: search, mode: "insensitive" } },
|
|
28
|
+
],
|
|
29
|
+
}
|
|
30
|
+
: {},
|
|
31
|
+
status && status !== "all"
|
|
32
|
+
? { status: { equals: status, mode: "insensitive" } }
|
|
33
|
+
: {},
|
|
34
|
+
group && group !== "all" ? { group } : {},
|
|
35
|
+
type && type !== "all" ? { type } : {},
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const [total, items] = await Promise.all([
|
|
40
|
+
db.resource.count({ where }),
|
|
41
|
+
db.resource.findMany({
|
|
42
|
+
where,
|
|
43
|
+
orderBy: [{ order: "asc" }, { updatedAt: "desc" }],
|
|
44
|
+
skip: (page - 1) * pageSize,
|
|
45
|
+
take: pageSize,
|
|
46
|
+
}),
|
|
47
|
+
]);
|
|
48
|
+
|
|
49
|
+
// Transform Prisma items to Resource type format
|
|
50
|
+
const transformedItems = items.map((item: any) => ({
|
|
51
|
+
id: item.id,
|
|
52
|
+
code: item.code,
|
|
53
|
+
name: item.name,
|
|
54
|
+
group: item.group || undefined,
|
|
55
|
+
description: item.description || undefined,
|
|
56
|
+
status: item.status,
|
|
57
|
+
parentCode: item.parentCode || undefined,
|
|
58
|
+
order: item.order || undefined,
|
|
59
|
+
type: item.type || undefined,
|
|
60
|
+
icon: item.icon || undefined,
|
|
61
|
+
path: item.path || undefined,
|
|
62
|
+
config: item.config || undefined,
|
|
63
|
+
createdAt: item.createdAt.toISOString(),
|
|
64
|
+
updatedAt: item.updatedAt.toISOString(),
|
|
65
|
+
}));
|
|
66
|
+
|
|
67
|
+
return { total, page, pageSize, items: transformedItems };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Get all active resources for permission matrix
|
|
72
|
+
* Used in role management to build dynamic permission matrix
|
|
73
|
+
*/
|
|
74
|
+
export async function getResourcesForPermissionMatrix(
|
|
75
|
+
db: ResourcePrismaClient,
|
|
76
|
+
) {
|
|
77
|
+
return await db.resource.findMany({
|
|
78
|
+
where: {
|
|
79
|
+
status: "active",
|
|
80
|
+
},
|
|
81
|
+
orderBy: [{ group: "asc" }, { order: "asc" }, { name: "asc" }],
|
|
82
|
+
select: {
|
|
83
|
+
id: true,
|
|
84
|
+
code: true,
|
|
85
|
+
name: true,
|
|
86
|
+
group: true,
|
|
87
|
+
description: true,
|
|
88
|
+
icon: true,
|
|
89
|
+
order: true,
|
|
90
|
+
config: true,
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Get all active actions for permission matrix
|
|
97
|
+
* Used in role management to build dynamic permission matrix
|
|
98
|
+
*/
|
|
99
|
+
export async function getActionsForPermissionMatrix(db: ResourcePrismaClient) {
|
|
100
|
+
return await db.action.findMany({
|
|
101
|
+
where: {
|
|
102
|
+
status: "active",
|
|
103
|
+
},
|
|
104
|
+
orderBy: {
|
|
105
|
+
code: "asc",
|
|
106
|
+
},
|
|
107
|
+
select: {
|
|
108
|
+
id: true,
|
|
109
|
+
code: true,
|
|
110
|
+
name: true,
|
|
111
|
+
description: true,
|
|
112
|
+
isDefault: true,
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource Validator
|
|
3
|
+
* Validates resource codes against DB with caching
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { cacheManager } from "../infrastructure/cache/cache-manager";
|
|
7
|
+
|
|
8
|
+
// Cache for valid resource codes (loaded from DB)
|
|
9
|
+
const resourceCache = cacheManager.create({
|
|
10
|
+
name: "resource-codes",
|
|
11
|
+
ttl: 3600, // 1 hour - resource codes rarely change
|
|
12
|
+
max: 1000,
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
// Type for Prisma client with Resource model
|
|
16
|
+
interface ResourcePrismaClient {
|
|
17
|
+
resource: {
|
|
18
|
+
findUnique: (args: { where: { code: string } }) => Promise<{ code: string } | null>;
|
|
19
|
+
findMany: (args?: { select?: { code: boolean } }) => Promise<{ code: string }[]>;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Check if a resource code exists.
|
|
25
|
+
* Checks cache first, then DB if not found.
|
|
26
|
+
*
|
|
27
|
+
* @param db - Prisma client
|
|
28
|
+
* @param resourceCode - Resource code to validate
|
|
29
|
+
* @returns true if valid, false otherwise
|
|
30
|
+
*/
|
|
31
|
+
export async function isValidResourceCode(
|
|
32
|
+
db: ResourcePrismaClient,
|
|
33
|
+
resourceCode: string
|
|
34
|
+
): Promise<boolean> {
|
|
35
|
+
// Check cache first
|
|
36
|
+
const cacheKey = `valid:${resourceCode}`;
|
|
37
|
+
const cached = await resourceCache.get<boolean>(cacheKey);
|
|
38
|
+
|
|
39
|
+
if (cached !== undefined) {
|
|
40
|
+
return cached;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Not in cache, check DB
|
|
44
|
+
const resource = await db.resource.findUnique({
|
|
45
|
+
where: { code: resourceCode },
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
const isValid = resource !== null;
|
|
49
|
+
|
|
50
|
+
// Cache result
|
|
51
|
+
await resourceCache.set(cacheKey, isValid);
|
|
52
|
+
|
|
53
|
+
return isValid;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Get the correct resource code for permission checking.
|
|
58
|
+
* Priority: config.permissionResource > config.name > entity param
|
|
59
|
+
*
|
|
60
|
+
* @param config - Entity config (may be partial)
|
|
61
|
+
* @param entityParam - Entity param from URL
|
|
62
|
+
* @returns Resource code to use for permission check
|
|
63
|
+
*/
|
|
64
|
+
export function getPermissionResourceCode(
|
|
65
|
+
config: { permissionResource?: string; name?: string } | null | undefined,
|
|
66
|
+
entityParam: string
|
|
67
|
+
): string {
|
|
68
|
+
if (config?.permissionResource) {
|
|
69
|
+
return config.permissionResource;
|
|
70
|
+
}
|
|
71
|
+
if (config?.name) {
|
|
72
|
+
return config.name;
|
|
73
|
+
}
|
|
74
|
+
return entityParam;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Validate and get resource code for permission checking.
|
|
79
|
+
* Combines getPermissionResourceCode with DB validation.
|
|
80
|
+
*
|
|
81
|
+
* @param db - Prisma client
|
|
82
|
+
* @param config - Entity config
|
|
83
|
+
* @param entityParam - Entity param from URL
|
|
84
|
+
* @returns Object with resourceCode and isValid flag
|
|
85
|
+
*/
|
|
86
|
+
export async function validatePermissionResource(
|
|
87
|
+
db: ResourcePrismaClient,
|
|
88
|
+
config: { permissionResource?: string; name?: string } | null | undefined,
|
|
89
|
+
entityParam: string
|
|
90
|
+
): Promise<{ resourceCode: string; isValid: boolean }> {
|
|
91
|
+
const resourceCode = getPermissionResourceCode(config, entityParam);
|
|
92
|
+
const isValid = await isValidResourceCode(db, resourceCode);
|
|
93
|
+
|
|
94
|
+
return { resourceCode, isValid };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Preload all resource codes into cache.
|
|
99
|
+
* Call this on app startup for better performance.
|
|
100
|
+
*
|
|
101
|
+
* @param db - Prisma client
|
|
102
|
+
*/
|
|
103
|
+
export async function preloadResourceCodes(db: ResourcePrismaClient): Promise<void> {
|
|
104
|
+
const resources = await db.resource.findMany({
|
|
105
|
+
select: { code: true },
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
for (const resource of resources) {
|
|
109
|
+
await resourceCache.set(`valid:${resource.code}`, true);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Clear resource cache.
|
|
115
|
+
* Call when resources are added/removed.
|
|
116
|
+
*/
|
|
117
|
+
export async function clearResourceCache(): Promise<void> {
|
|
118
|
+
await resourceCache.reset();
|
|
119
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// Note: We use Prisma types for input construction, but we don't import the client instance.
|
|
2
|
+
// If Prisma types are not available in core (since core doesn't have prisma schema),
|
|
3
|
+
// we might need to define loose types or rely on the injected client's type inference if strict mode allows.
|
|
4
|
+
// However, since we want to be Type-safe, we assume the host app uses standard Prisma conventions.
|
|
5
|
+
// For core, we can define the expected structure of the Include/Where types if needed,
|
|
6
|
+
// or simply use 'any' for the complex Prisma types if we want to avoid strict coupling to a specific schema version.
|
|
7
|
+
// To be safe and generic in 'core', we will define the input params using standard TypeScript types
|
|
8
|
+
// and the db client interface locally.
|
|
9
|
+
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Types
|
|
12
|
+
// ============================================================================
|
|
13
|
+
|
|
14
|
+
export type RoleFilters = {
|
|
15
|
+
page?: number;
|
|
16
|
+
pageSize?: number;
|
|
17
|
+
search?: string;
|
|
18
|
+
status?: string;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export type RoleData = {
|
|
22
|
+
id: string;
|
|
23
|
+
name: string;
|
|
24
|
+
code: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
status: string;
|
|
27
|
+
permissions: string[];
|
|
28
|
+
usersCount: number;
|
|
29
|
+
users: {
|
|
30
|
+
id: string;
|
|
31
|
+
name: string | null;
|
|
32
|
+
email: string | null;
|
|
33
|
+
image: string | null;
|
|
34
|
+
isActive: boolean;
|
|
35
|
+
}[];
|
|
36
|
+
createdAt: string;
|
|
37
|
+
updatedAt: string;
|
|
38
|
+
createdBy?: string;
|
|
39
|
+
updatedBy?: string;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// Interface for the DB client injected into the service
|
|
43
|
+
// We define the shape of the Prisma Client we expect
|
|
44
|
+
export interface RolePrismaClient {
|
|
45
|
+
role: {
|
|
46
|
+
count: (args: { where: any }) => Promise<number>;
|
|
47
|
+
findMany: (args: {
|
|
48
|
+
where: any;
|
|
49
|
+
orderBy: any;
|
|
50
|
+
skip: number;
|
|
51
|
+
take: number;
|
|
52
|
+
include: any;
|
|
53
|
+
}) => Promise<any[]>;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// ============================================================================
|
|
58
|
+
// Service Logic
|
|
59
|
+
// ============================================================================
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Get roles data with pagination and filtering
|
|
63
|
+
* Generic core implementation using injected DB client
|
|
64
|
+
*
|
|
65
|
+
* @param db - The tenant-specific Prisma Client instance
|
|
66
|
+
* @param params - Filter and pagination parameters
|
|
67
|
+
*/
|
|
68
|
+
export async function getRolesData(
|
|
69
|
+
db: RolePrismaClient,
|
|
70
|
+
params: RoleFilters = {},
|
|
71
|
+
): Promise<{
|
|
72
|
+
total: number;
|
|
73
|
+
page: number;
|
|
74
|
+
pageSize: number;
|
|
75
|
+
items: RoleData[];
|
|
76
|
+
}> {
|
|
77
|
+
const { page = 1, pageSize = 10, search, status } = params;
|
|
78
|
+
|
|
79
|
+
const whereConditions: any[] = [];
|
|
80
|
+
|
|
81
|
+
if (search) {
|
|
82
|
+
whereConditions.push({
|
|
83
|
+
OR: [
|
|
84
|
+
{ name: { contains: search, mode: "insensitive" } },
|
|
85
|
+
{ code: { contains: search, mode: "insensitive" } },
|
|
86
|
+
{ description: { contains: search, mode: "insensitive" } },
|
|
87
|
+
],
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (status && status !== "all") {
|
|
92
|
+
whereConditions.push({ status });
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const where: any = whereConditions.length > 0 ? { AND: whereConditions } : {};
|
|
96
|
+
|
|
97
|
+
const [total, items] = await Promise.all([
|
|
98
|
+
db.role.count({ where }),
|
|
99
|
+
db.role.findMany({
|
|
100
|
+
where,
|
|
101
|
+
orderBy: { createdAt: "desc" },
|
|
102
|
+
skip: (page - 1) * pageSize,
|
|
103
|
+
take: pageSize,
|
|
104
|
+
include: {
|
|
105
|
+
userRoles: {
|
|
106
|
+
include: {
|
|
107
|
+
user: {
|
|
108
|
+
select: {
|
|
109
|
+
id: true,
|
|
110
|
+
name: true,
|
|
111
|
+
email: true,
|
|
112
|
+
image: true,
|
|
113
|
+
isActive: true,
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
rolePermissions: {
|
|
119
|
+
include: {
|
|
120
|
+
resource: {
|
|
121
|
+
select: {
|
|
122
|
+
code: true,
|
|
123
|
+
name: true,
|
|
124
|
+
icon: true,
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
action: {
|
|
128
|
+
select: {
|
|
129
|
+
code: true,
|
|
130
|
+
name: true,
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
}),
|
|
137
|
+
]);
|
|
138
|
+
|
|
139
|
+
// Transform raw DB items to RoleData type
|
|
140
|
+
const transformedItems = items.map((role: any) => ({
|
|
141
|
+
id: role.id,
|
|
142
|
+
name: role.name,
|
|
143
|
+
code: role.code,
|
|
144
|
+
description: role.description || undefined,
|
|
145
|
+
status: role.status,
|
|
146
|
+
// Transform rolePermissions to array of "action:resource" strings
|
|
147
|
+
permissions: role.rolePermissions.map(
|
|
148
|
+
(rp: any) => `${rp.actionCode}:${rp.resourceCode}`,
|
|
149
|
+
),
|
|
150
|
+
usersCount: role.userRoles.length,
|
|
151
|
+
users: role.userRoles.map((ur: any) => ({
|
|
152
|
+
id: ur.user.id,
|
|
153
|
+
name: ur.user.name,
|
|
154
|
+
email: ur.user.email,
|
|
155
|
+
image: ur.user.image,
|
|
156
|
+
isActive: ur.user.isActive,
|
|
157
|
+
})),
|
|
158
|
+
createdAt: role.createdAt.toISOString(),
|
|
159
|
+
updatedAt: role.updatedAt.toISOString(),
|
|
160
|
+
createdBy: role.createdBy || undefined,
|
|
161
|
+
updatedBy: role.updatedBy || undefined,
|
|
162
|
+
}));
|
|
163
|
+
|
|
164
|
+
return { total, page, pageSize, items: transformedItems };
|
|
165
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// @goerp/core/rbac/server
|
|
2
|
+
// Server-only RBAC data functions - no client/UI imports
|
|
3
|
+
// Use this in Server Components and API routes to avoid bundling client code
|
|
4
|
+
|
|
5
|
+
export {
|
|
6
|
+
getRolesData,
|
|
7
|
+
type RoleFilters,
|
|
8
|
+
type RoleData,
|
|
9
|
+
type RolePrismaClient,
|
|
10
|
+
} from "./role-service";
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
getResourcesForPermissionMatrix,
|
|
14
|
+
getActionsForPermissionMatrix,
|
|
15
|
+
type ResourcePrismaClient,
|
|
16
|
+
} from "./resource-service";
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export type User = {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string | null;
|
|
4
|
+
email: string | null;
|
|
5
|
+
image: string | null;
|
|
6
|
+
isActive: boolean;
|
|
7
|
+
jobTitle?: string;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export type Role = {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
code: string;
|
|
14
|
+
description?: string | null | undefined;
|
|
15
|
+
status: string;
|
|
16
|
+
permissions: string[];
|
|
17
|
+
usersCount: number;
|
|
18
|
+
users: User[];
|
|
19
|
+
createdAt: string;
|
|
20
|
+
updatedAt: string;
|
|
21
|
+
createdBy?: string | null | undefined;
|
|
22
|
+
updatedBy?: string | null | undefined;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export type Permission = {
|
|
26
|
+
id: string;
|
|
27
|
+
action: string;
|
|
28
|
+
resource: string;
|
|
29
|
+
description: string;
|
|
30
|
+
status: string;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export type RolesResponse = {
|
|
34
|
+
total: number;
|
|
35
|
+
page: number;
|
|
36
|
+
pageSize: number;
|
|
37
|
+
items: Role[];
|
|
38
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import { STATUS_ACTIVE, STATUS_INACTIVE, STATUS_VALUES } from "../configs";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Action Validation Schema
|
|
7
|
+
*
|
|
8
|
+
* Rules:
|
|
9
|
+
* - code: Required, max 50 chars
|
|
10
|
+
* - name: Required, max 200 chars
|
|
11
|
+
* - description: Optional, max 1000 chars
|
|
12
|
+
* - status: Enum (active/inactive)
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export const actionSchema = z.object({
|
|
16
|
+
code: z
|
|
17
|
+
.string()
|
|
18
|
+
.min(1, "Mã hành động là bắt buộc")
|
|
19
|
+
.max(50, "Mã hành động tối đa 50 ký tự")
|
|
20
|
+
.trim(),
|
|
21
|
+
|
|
22
|
+
name: z
|
|
23
|
+
.string()
|
|
24
|
+
.min(1, "Tên hành động là bắt buộc")
|
|
25
|
+
.max(200, "Tên hành động tối đa 200 ký tự")
|
|
26
|
+
.trim(),
|
|
27
|
+
|
|
28
|
+
description: z
|
|
29
|
+
.string()
|
|
30
|
+
.max(1000, "Mô tả tối đa 1000 ký tự")
|
|
31
|
+
.optional()
|
|
32
|
+
.or(z.literal(""))
|
|
33
|
+
.transform((val) => val || ""),
|
|
34
|
+
|
|
35
|
+
isDefault: z.boolean().default(false),
|
|
36
|
+
|
|
37
|
+
status: z.preprocess((val) => {
|
|
38
|
+
// Hỗ trợ boolean từ switch field (true -> active, false -> inactive)
|
|
39
|
+
if (typeof val === "boolean") {
|
|
40
|
+
return val ? STATUS_ACTIVE : STATUS_INACTIVE;
|
|
41
|
+
}
|
|
42
|
+
// Hỗ trợ cả Active/Inactive cũ và chuyển về lowercase
|
|
43
|
+
if (val === "Active" || val === "Inactive") {
|
|
44
|
+
return val === "Active" ? STATUS_ACTIVE : STATUS_INACTIVE;
|
|
45
|
+
}
|
|
46
|
+
return val;
|
|
47
|
+
}, z.enum(STATUS_VALUES).default(STATUS_ACTIVE)),
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Type inference from schema
|
|
52
|
+
*/
|
|
53
|
+
export type ActionInput = z.infer<typeof actionSchema>;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Partial schema for updates (all fields optional)
|
|
57
|
+
*/
|
|
58
|
+
export const actionUpdateSchema = actionSchema.partial();
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Schema for bulk operations
|
|
62
|
+
*/
|
|
63
|
+
export const actionBulkSchema = z.object({
|
|
64
|
+
ids: z.array(z.string()).min(1, "Phải chọn ít nhất 1 hành động"),
|
|
65
|
+
action: z.enum(["delete", "activate", "deactivate"]),
|
|
66
|
+
});
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Branch Validation Schema
|
|
5
|
+
*
|
|
6
|
+
* Validates branch form submissions on both client & server.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export const branchSchema = z.object({
|
|
10
|
+
companyId: z.string().min(1, "Công ty là bắt buộc"),
|
|
11
|
+
|
|
12
|
+
code: z
|
|
13
|
+
.string()
|
|
14
|
+
.min(1, "Mã chi nhánh là bắt buộc")
|
|
15
|
+
.max(50, "Mã chi nhánh tối đa 50 ký tự")
|
|
16
|
+
.trim(),
|
|
17
|
+
|
|
18
|
+
name: z
|
|
19
|
+
.string()
|
|
20
|
+
.min(1, "Tên chi nhánh là bắt buộc")
|
|
21
|
+
.max(255, "Tên chi nhánh tối đa 255 ký tự")
|
|
22
|
+
.trim(),
|
|
23
|
+
|
|
24
|
+
address: z
|
|
25
|
+
.string()
|
|
26
|
+
.max(500, "Địa chỉ tối đa 500 ký tự")
|
|
27
|
+
.trim()
|
|
28
|
+
.optional()
|
|
29
|
+
.nullable(),
|
|
30
|
+
|
|
31
|
+
phone: z
|
|
32
|
+
.string()
|
|
33
|
+
.max(20, "Số điện thoại tối đa 20 ký tự")
|
|
34
|
+
.trim()
|
|
35
|
+
.optional()
|
|
36
|
+
.nullable(),
|
|
37
|
+
|
|
38
|
+
email: z
|
|
39
|
+
.string()
|
|
40
|
+
.max(255, "Email tối đa 255 ký tự")
|
|
41
|
+
.email("Email không hợp lệ")
|
|
42
|
+
.trim()
|
|
43
|
+
.optional()
|
|
44
|
+
.nullable()
|
|
45
|
+
.or(z.literal("")),
|
|
46
|
+
|
|
47
|
+
status: z.enum(["active", "inactive"]).default("active"),
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
export type BranchInput = z.infer<typeof branchSchema>;
|
|
51
|
+
|
|
52
|
+
export const branchUpdateSchema = branchSchema.partial();
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Company Validation Schema
|
|
5
|
+
*
|
|
6
|
+
* Validates company form submissions on both client & server.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export const companySchema = z.object({
|
|
10
|
+
name: z
|
|
11
|
+
.string()
|
|
12
|
+
.min(1, "Tên công ty là bắt buộc")
|
|
13
|
+
.max(255, "Tên công ty tối đa 255 ký tự")
|
|
14
|
+
.trim(),
|
|
15
|
+
|
|
16
|
+
taxCode: z
|
|
17
|
+
.string()
|
|
18
|
+
.min(1, "Mã số thuế là bắt buộc")
|
|
19
|
+
.max(50, "Mã số thuế tối đa 50 ký tự")
|
|
20
|
+
.trim(),
|
|
21
|
+
|
|
22
|
+
address: z
|
|
23
|
+
.string()
|
|
24
|
+
.min(1, "Địa chỉ là bắt buộc")
|
|
25
|
+
.max(500, "Địa chỉ tối đa 500 ký tự")
|
|
26
|
+
.trim(),
|
|
27
|
+
|
|
28
|
+
phone: z
|
|
29
|
+
.string()
|
|
30
|
+
.min(1, "Số điện thoại là bắt buộc")
|
|
31
|
+
.max(20, "Số điện thoại tối đa 20 ký tự")
|
|
32
|
+
.trim(),
|
|
33
|
+
|
|
34
|
+
email: z
|
|
35
|
+
.string()
|
|
36
|
+
.min(1, "Email là bắt buộc")
|
|
37
|
+
.max(255, "Email tối đa 255 ký tự")
|
|
38
|
+
.email("Email không hợp lệ")
|
|
39
|
+
.trim(),
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
export type CompanyInput = z.infer<typeof companySchema>;
|
|
43
|
+
|
|
44
|
+
export const companyUpdateSchema = companySchema.partial();
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central export for all validation schemas
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* import { supplierSchema, materialSchema } from '@/lib/schemas'
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export * from "./supplier.schema";
|
|
9
|
+
export * from "./material.schema";
|
|
10
|
+
export * from "./material-category.schema";
|
|
11
|
+
export * from "./uom.schema";
|
|
12
|
+
export * from "./warehouse.schema";
|
|
13
|
+
export * from "./partner-company.schema";
|
|
14
|
+
export * from "./system-category-group.schema";
|
|
15
|
+
export * from "./system-category.schema";
|
|
16
|
+
export * from "./action.schema";
|
|
17
|
+
export * from "./resource.schema";
|
|
18
|
+
export * from "./material-pricing.schema";
|
|
19
|
+
export * from "./user.schema";
|
|
20
|
+
export * from "./role.schema";
|
|
21
|
+
export * from "./user-supplier.schema";
|
|
22
|
+
export * from "./system-config.schema";
|
|
23
|
+
export * from "./company.schema";
|
|
24
|
+
export * from "./branch.schema";
|
|
25
|
+
export * from "./register-schema";
|
|
26
|
+
export * from "./sign-in-schema";
|
|
27
|
+
export * from "./forgot-passward-schema";
|
|
28
|
+
export * from "./new-passward-schema";
|
|
29
|
+
export * from "./verify-email-schema";
|
|
30
|
+
export * from "./coming-soon-schema";
|