@fernir2/saas-kit-cli 0.1.4 → 0.1.6
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 +211 -7
- package/cli/.gitlab-ci.yml +0 -14
- package/cli/.husky/commit-msg +0 -1
- package/cli/.husky/pre-commit +0 -1
- package/cli/README.md +0 -101
- package/cli/bin/index.ts +0 -358
- package/cli/drizzle.config.ts +0 -12
- package/cli/global-setup.ts +0 -25
- package/cli/npm-commands/gen-meta/index.ts +0 -3
- package/cli/npm-commands/gen-schema/index.ts +0 -5
- package/cli/npm-commands/migrate-db/index.ts +0 -5
- package/cli/npm-commands/migrate-db/migrate-db.ts +0 -15
- package/cli/npm-commands/seed-db/index.ts +0 -5
- package/cli/npm-commands/seed-db/seed-db.ts +0 -15
- package/cli/playwright.config.ts +0 -34
- package/cli/postcss.config.mjs +0 -9
- package/cli/server.ts +0 -41
- package/cli/src/app/api/v1/[resourceName]/[id]/route.ts/route.ts +0 -11
- package/cli/src/app/api/v1/[resourceName]/route.ts/route.ts +0 -14
- package/cli/src/app/api/v1/[resourceName]/upsert/route.ts/route.ts +0 -3
- package/cli/src/app/api/v1/log/route.ts/route.ts +0 -7
- package/cli/src/app/api/v1/otheruser/[id]/route.ts/route.ts +0 -14
- package/cli/src/app/api/v1/otheruser/route.ts/route.ts +0 -7
- package/cli/src/app/api/v1/password/forgotpassword/route.ts/route.ts +0 -3
- package/cli/src/app/api/v1/password/resetpassword/route.ts/route.ts +0 -3
- package/cli/src/app/api/v1/payment/method/route.ts/route.ts +0 -4
- package/cli/src/app/api/v1/payment/route.ts/route.ts +0 -3
- package/cli/src/app/api/v1/payment/verify-fail/route.ts/route.ts +0 -3
- package/cli/src/app/api/v1/payment/verify-success/route.ts/route.ts +0 -3
- package/cli/src/app/api/v1/preload/route.ts/route.ts +0 -3
- package/cli/src/app/api/v1/searchable-resources/route.ts/route.ts +0 -11
- package/cli/src/app/api/v1/searchresult/route.ts/route.ts +0 -35
- package/cli/src/app/api/v1/sign-in/route.ts/route.ts +0 -3
- package/cli/src/app/api/v1/sign-out/route.ts/route.ts +0 -3
- package/cli/src/app/api/v1/sign-up/route.ts/route.ts +0 -3
- package/cli/src/app/api/v1/subscription/cancel/route.ts/route.ts +0 -3
- package/cli/src/app/api/v1/subscription/create/route.ts/route.ts +0 -3
- package/cli/src/app/api/v1/subscription/update/route.ts/route.ts +0 -3
- package/cli/src/app/api/v1/uimeta/route.ts/route.ts +0 -3
- package/cli/src/app/api/v1/uimetas/route.ts/route.ts +0 -3
- package/cli/src/app/api/v1/userpermission/route.ts/route.ts +0 -3
- package/cli/src/app/api/v1/visible-workspace/route.ts/route.ts +0 -5
- package/cli/src/app/api/v1/workspace/change/route.ts/route.ts +0 -5
- package/cli/src/app/favicon.ico +0 -0
- package/cli/src/app/layout.tsx +0 -42
- package/cli/src/app/page.tsx +0 -9
- package/cli/tailwind.config.ts +0 -13
- package/packages/base-repo/tools/git/commit-msg-script.ts +0 -42
- package/packages/base-repo/tools/git/pre-commit-script.ts +0 -431
- package/packages/level2/client/components/error-fallback/FdErrorFallback.jsx +0 -14
- package/packages/level2/client/components/feed/FdFeed.funcs.jsx +0 -65
- package/packages/level2/client/components/feed/FdFeed.jsx +0 -34
- package/packages/level2/client/components/feed/FdFeedActions.jsx +0 -15
- package/packages/level2/client/components/feed/FdFeedComments.jsx +0 -6
- package/packages/level2/client/components/feed/FdFeedEntry.jsx +0 -36
- package/packages/level2/client/components/feed/FdFeedHeader.jsx +0 -23
- package/packages/level2/client/components/feed/FdFeedReactionsSummary.jsx +0 -16
- package/packages/level2/client/components/providers/FdProviders.jsx +0 -28
- package/packages/level2/client/components/subscription-plan/FdSubscriptionPlan.jsx +0 -163
- package/packages/level2/client/components/wizard/FdWizard.jsx +0 -45
- package/packages/level2/client/components/wizard/FdWizardStepper.jsx +0 -55
- package/packages/level2/client/pages/dashboard-page/DashbordPage.jsx +0 -46
- package/packages/level2/client/pages/dynamic-layout-page/DynamicLayoutPage.jsx +0 -22
- package/packages/level2/client/pages/edit-password-page/EditPasswordPage.jsx +0 -8
- package/packages/level2/client/pages/edit-user-by-id-page/EditUserByIdPage.jsx +0 -14
- package/packages/level2/client/pages/edit-user-page/EditUserPage.jsx +0 -6
- package/packages/level2/client/pages/feed-page/FeedPage.jsx +0 -8
- package/packages/level2/client/pages/file-upload-page/FileUploadPage.jsx +0 -7
- package/packages/level2/client/pages/forgot-password-page/ForgotPasswordPage.jsx +0 -8
- package/packages/level2/client/pages/leads-viw-page/LeadsViewPage.jsx +0 -6
- package/packages/level2/client/pages/microsoft-page/MicrosoftPage.jsx +0 -16
- package/packages/level2/client/pages/payment-plan-page/PaymentPlanPage.jsx +0 -18
- package/packages/level2/client/pages/preload-page/PreloadPage.jsx +0 -25
- package/packages/level2/client/pages/reset-password-page/ResetPasswordPage.jsx +0 -8
- package/packages/level2/client/pages/screenshot-page/TestScreenshotPage.jsx +0 -23
- package/packages/level2/client/pages/sign-in-page/SignInPage.jsx +0 -24
- package/packages/level2/client/pages/sign-up-page/SignUpPage.jsx +0 -9
- package/packages/level2/client/pages/status-board-page/StatusBoardPage.jsx +0 -6
- package/packages/level2/client/pages/test-layout/TestLayout.jsx +0 -11
- package/packages/level2/client/pages/test-page/TestPage.jsx +0 -12
- package/packages/level2/client/pages/user-list-page/UserListPage.jsx +0 -4
- package/packages/level2/client/pages/view-page/ViewPage.jsx +0 -21
- package/packages/level2/client/payments/change-payment-method-field/ChangePaymentMethodField.jsx +0 -48
- package/packages/level2/client/payments/checkout-form/CheckoutForm.jsx +0 -95
- package/packages/level2/client/payments/checkout-form/CheckoutFormSubmit.jsx +0 -11
- package/packages/level2/client/payments/checkout-form/checkout-form-fields.jsx +0 -68
- package/packages/level2/client/website-scan/FdWebsiteScanResult.funcs.jsx +0 -12
- package/packages/level2/client/website-scan/FdWebsiteScanResult.jsx +0 -33
- package/packages/level2/client/website-scan/website-scan-data.jsx +0 -28
- package/packages/level2/client/website-scan/website-scan-icons/FacebookIcon.jsx +0 -6
- package/packages/level2/client/website-scan/website-scan-icons/FacebookPixelIcon.jsx +0 -49
- package/packages/level2/client/website-scan/website-scan-icons/GoogleAnalyticsIcon.jsx +0 -7
- package/packages/level2/client/website-scan/website-scan-icons/InstagramIcon.jsx +0 -32
- package/packages/level2/client/website-scan/website-scan-icons/LinkedinIcon.jsx +0 -6
- package/packages/level2/client/website-scan/website-scan-icons/OtherPlatformIcon.jsx +0 -110
- package/packages/level2/client/website-scan/website-scan-icons/ShopifyIcon.jsx +0 -46
- package/packages/level2/client/website-scan/website-scan-icons/SquarespaceIcon.jsx +0 -57
- package/packages/level2/client/website-scan/website-scan-icons/TiktokIcon.jsx +0 -15
- package/packages/level2/client/website-scan/website-scan-icons/WixIcon.jsx +0 -62
- package/packages/level2/client/website-scan/website-scan-icons/WordpressIcon.jsx +0 -53
- package/packages/level2/client/website-scan/website-scan-icons/XIcon.jsx +0 -6
- package/packages/level2/fd-app-toolbox/edit-other-user/EditOtherUser.jsx +0 -7
- package/packages/level2/fd-app-toolbox/edit-password-form/EditPasswordForm.jsx +0 -68
- package/packages/level2/fd-app-toolbox/edit-user-form/EditUserForm.jsx +0 -122
- package/packages/level2/fd-app-toolbox/edit-user-sheet/EditUserSheet.jsx +0 -35
- package/packages/level2/fd-app-toolbox/forgot-password-form/ForgotPasswordForm.jsx +0 -87
- package/packages/level2/fd-app-toolbox/layout/client-layout/ClientLayout.jsx +0 -19
- package/packages/level2/fd-app-toolbox/layout/client-root/ClientRoot.jsx +0 -32
- package/packages/level2/fd-app-toolbox/layout/hamburger-menu/FdHamburgerMenu.jsx +0 -47
- package/packages/level2/fd-app-toolbox/layout/navbar/FdNarrowNavbar.jsx +0 -40
- package/packages/level2/fd-app-toolbox/layout/sidebar/FdSidebar.jsx +0 -48
- package/packages/level2/fd-app-toolbox/layout/sidebar/sidebar-dropdown-menu/FdDropdownMenuItemTitle.jsx +0 -12
- package/packages/level2/fd-app-toolbox/layout/sidebar/sidebar-dropdown-menu/FdSidebarDropdownMenu.jsx +0 -81
- package/packages/level2/fd-app-toolbox/layout/sidebar/sidebar-resources-provider.jsx +0 -30
- package/packages/level2/fd-app-toolbox/layout/toolbar/FdToolbar.jsx +0 -89
- package/packages/level2/fd-app-toolbox/layout/toolbar/FdTopNav.jsx +0 -42
- package/packages/level2/fd-app-toolbox/layout/toolbar/title-provider/ToolbarTitleProvider.jsx +0 -10
- package/packages/level2/fd-app-toolbox/login-form/LoginForm.jsx +0 -165
- package/packages/level2/fd-app-toolbox/menu/notifications-menu/FdNotificationMenu.jsx +0 -43
- package/packages/level2/fd-app-toolbox/menu/notifications-menu/notification-list/FdNotificationList.jsx +0 -53
- package/packages/level2/fd-app-toolbox/menu/top-menu/FdTopMenu.jsx +0 -28
- package/packages/level2/fd-app-toolbox/menu/top-menu/top-menu-group/FdTopMenuGroup.jsx +0 -35
- package/packages/level2/fd-app-toolbox/menu/top-menu/top-menu-item/FdTopMenuItem.jsx +0 -47
- package/packages/level2/fd-app-toolbox/menu/user-dropdown-menu/FdUserDropdownMenu.jsx +0 -122
- package/packages/level2/fd-app-toolbox/menu/user-dropdown-menu/user-dropdown-menu-item/FdUserDropdownMenuItem.jsx +0 -56
- package/packages/level2/fd-app-toolbox/menu/visible-workspace-picker/FdVisibleWorkspacePicker.jsx +0 -36
- package/packages/level2/fd-app-toolbox/menu/workspace-picker/FdWorkspacePicker.jsx +0 -47
- package/packages/level2/fd-app-toolbox/providers/ThemeProvider/ThemeProvider.jsx +0 -27
- package/packages/level2/fd-app-toolbox/providers/auth-provider/AuthProvider.jsx +0 -38
- package/packages/level2/fd-app-toolbox/providers/sidebar-provider/FdSidebarContext.jsx +0 -17
- package/packages/level2/fd-app-toolbox/register-form/RegisterForm.jsx +0 -119
- package/packages/level2/fd-app-toolbox/report/FdChart.jsx +0 -120
- package/packages/level2/fd-app-toolbox/report/ReportChart.jsx +0 -29
- package/packages/level2/fd-app-toolbox/reset-password-form/ResetPasswordForm.jsx +0 -81
- package/packages/level2/fd-app-toolbox/search/FdSearch.jsx +0 -56
- package/packages/level2/fd-app-toolbox/search/search-dialog/FdSearchDialog.jsx +0 -72
- package/packages/level2/fd-app-toolbox/search/search-dialog-provider.jsx +0 -16
- package/packages/level2/fd-app-toolbox/search/search-input/FdSearchInput.jsx +0 -49
- package/packages/level2/fd-app-toolbox/search/search-resource-results/FdSearchResourcesResults.jsx +0 -36
- package/packages/level2/fd-app-toolbox/search/search-result/FdSearchResult.jsx +0 -46
- package/packages/level2/fd-app-toolbox/search/search-searchable-resource-results/FdSearchSearchableResourceResult.jsx +0 -43
- package/packages/level2/fd-app-toolbox/search/search-searchable-resource-results/FdSearchSearchableResourceResults.jsx +0 -22
- package/packages/level2/fd-app-toolbox/server/layout/private-layout/PrivateLayout.jsx +0 -32
- package/packages/level2/fd-app-toolbox/status-board/FdStatusBoard.jsx +0 -49
- package/packages/level2/fd-app-toolbox/status-board/status-board-item/FdStatusBoardItem.jsx +0 -17
- package/packages/level2/fd-app-toolbox/status-board/status-board-status/FdStatusBoardStatus.jsx +0 -27
- package/packages/level2/fd-app-toolbox/user-list/UserList.jsx +0 -58
- package/packages/level2/fd-component-toolbox/animation/FdLabelAnimation.jsx +0 -55
- package/packages/level2/fd-component-toolbox/avatar/FdAvatar.jsx +0 -50
- package/packages/level2/fd-component-toolbox/back-button/FdBackButton.jsx +0 -21
- package/packages/level2/fd-component-toolbox/badge/FdBadge.jsx +0 -19
- package/packages/level2/fd-component-toolbox/badge-toggle-list/FdBadgeToggleList.jsx +0 -47
- package/packages/level2/fd-component-toolbox/button/FdButton.jsx +0 -64
- package/packages/level2/fd-component-toolbox/calendar/FdCalendar.jsx +0 -68
- package/packages/level2/fd-component-toolbox/card/FdCard.jsx +0 -56
- package/packages/level2/fd-component-toolbox/card/FdCardBigDigits.jsx +0 -25
- package/packages/level2/fd-component-toolbox/chart/FdChart.jsx +0 -269
- package/packages/level2/fd-component-toolbox/checkbox/FdCheckbox.jsx +0 -39
- package/packages/level2/fd-component-toolbox/command/FdCommand.jsx +0 -123
- package/packages/level2/fd-component-toolbox/datepicker/FdDatePicker.jsx +0 -155
- package/packages/level2/fd-component-toolbox/dialog/FdDialog.jsx +0 -106
- package/packages/level2/fd-component-toolbox/dialog/YesOrNoDialog.jsx +0 -57
- package/packages/level2/fd-component-toolbox/drag-and-drop/FdDragDropContext.jsx +0 -19
- package/packages/level2/fd-component-toolbox/drag-and-drop/FdDraggable.jsx +0 -27
- package/packages/level2/fd-component-toolbox/drag-and-drop/FdDroppable.jsx +0 -22
- package/packages/level2/fd-component-toolbox/dropdown-menu/FdDropdownMenu.jsx +0 -198
- package/packages/level2/fd-component-toolbox/dynamic-layout/FdDynamicComponent.jsx +0 -27
- package/packages/level2/fd-component-toolbox/dynamic-layout/FdDynamicLayoutDragAndDrop.jsx +0 -78
- package/packages/level2/fd-component-toolbox/fade-out-text/FdFadeOutText.jsx +0 -52
- package/packages/level2/fd-component-toolbox/form/FdForm.jsx +0 -146
- package/packages/level2/fd-component-toolbox/icon/FdIcon.jsx +0 -192
- package/packages/level2/fd-component-toolbox/icon/custom-icons/FdFilterIcon.jsx +0 -11
- package/packages/level2/fd-component-toolbox/image/FdImage.jsx +0 -15
- package/packages/level2/fd-component-toolbox/input/FdInput.jsx +0 -94
- package/packages/level2/fd-component-toolbox/label/FdLabel.jsx +0 -19
- package/packages/level2/fd-component-toolbox/link/FdLink.jsx +0 -23
- package/packages/level2/fd-component-toolbox/list/FdList.jsx +0 -20
- package/packages/level2/fd-component-toolbox/list/list-item/FdListItem.jsx +0 -46
- package/packages/level2/fd-component-toolbox/loading/FdLoadingIndicator.jsx +0 -7
- package/packages/level2/fd-component-toolbox/logos/FacebookLogo.jsx +0 -11
- package/packages/level2/fd-component-toolbox/logos/GoogleLogo.jsx +0 -12
- package/packages/level2/fd-component-toolbox/logos/MicrosoftLogo.jsx +0 -11
- package/packages/level2/fd-component-toolbox/markdown/FdMarkdown.jsx +0 -105
- package/packages/level2/fd-component-toolbox/markdown/markdown-parser.jsx +0 -72
- package/packages/level2/fd-component-toolbox/multiselect/FdMultiselect.jsx +0 -240
- package/packages/level2/fd-component-toolbox/navigation/FdNavigation.jsx +0 -43
- package/packages/level2/fd-component-toolbox/navigation/navigation-item/FdNavigationItem.jsx +0 -23
- package/packages/level2/fd-component-toolbox/radio-group/FdRadioGroup.jsx +0 -46
- package/packages/level2/fd-component-toolbox/rich-text/FdRichText.jsx +0 -58
- package/packages/level2/fd-component-toolbox/save-status/FdSaveStatus.jsx +0 -40
- package/packages/level2/fd-component-toolbox/select/FdSelect.jsx +0 -173
- package/packages/level2/fd-component-toolbox/separator/FdSeparator.jsx +0 -19
- package/packages/level2/fd-component-toolbox/sheet/FdSheet.jsx +0 -121
- package/packages/level2/fd-component-toolbox/slide-toggle/FdSlideToggle.jsx +0 -57
- package/packages/level2/fd-component-toolbox/spinner/Spinner.jsx +0 -36
- package/packages/level2/fd-component-toolbox/subheading/FdSubHeading.jsx +0 -12
- package/packages/level2/fd-component-toolbox/switch/FdSwitch.jsx +0 -55
- package/packages/level2/fd-component-toolbox/tabs/FdTabs.jsx +0 -53
- package/packages/level2/fd-component-toolbox/textarea/FdTextArea.jsx +0 -42
- package/packages/level2/fd-component-toolbox/toaster/FdToaster.jsx +0 -20
- package/packages/level2/fd-component-toolbox/tooltip/FdTooltip.jsx +0 -80
- package/packages/level2/meta/browsers/base-multi-browser/FdBaseMultiBrowser.jsx +0 -72
- package/packages/level2/meta/browsers/base-multi-browser/base-multi-browser-dialog/FdBaseMultiBrowserDialog.jsx +0 -159
- package/packages/level2/meta/browsers/browser/FdBrowser.jsx +0 -58
- package/packages/level2/meta/browsers/browser/browser-dialog/FdBrowserDialog.jsx +0 -89
- package/packages/level2/meta/browsers/many-to-many-browser/FdManyToManyBrowser.jsx +0 -33
- package/packages/level2/meta/browsers/multi-browser/FdMultiBrowser.jsx +0 -32
- package/packages/level2/meta/card-list/FdCardList.jsx +0 -40
- package/packages/level2/meta/card-list/card/FdCard.jsx +0 -44
- package/packages/level2/meta/card-list/card/action-block/FdCardActionBlock.jsx +0 -70
- package/packages/level2/meta/card-list/card/content-block/FdCardContentBlock.jsx +0 -64
- package/packages/level2/meta/card-list/card/image-block/FdCardImage.jsx +0 -10
- package/packages/level2/meta/client/framework/hooks.jsx +0 -39
- package/packages/level2/meta/comment/FdComment.jsx +0 -16
- package/packages/level2/meta/comment/FdCommentList.jsx +0 -32
- package/packages/level2/meta/components/edit-image/FdEditImage.jsx +0 -42
- package/packages/level2/meta/components/edit-image/FdEditImageActionMenu.jsx +0 -31
- package/packages/level2/meta/components/edit-image/FdEditImageDropdownMenu.jsx +0 -42
- package/packages/level2/meta/components/file-upload/FileUpload.jsx +0 -103
- package/packages/level2/meta/components/file-upload/PreviewMedia.jsx +0 -36
- package/packages/level2/meta/components/multi-list/FdMultiList.jsx +0 -65
- package/packages/level2/meta/components/multi-list/FdMultiListEditResource.jsx +0 -31
- package/packages/level2/meta/edit-resource/FdEditResource.jsx +0 -135
- package/packages/level2/meta/edit-resource/FdEditResourceFormBody.jsx +0 -8
- package/packages/level2/meta/edit-resource/FdEditResourceHeader.jsx +0 -43
- package/packages/level2/meta/edit-resource/FdEditResourceSheet.jsx +0 -70
- package/packages/level2/meta/edit-resource/SaveCompleteProvider.jsx +0 -16
- package/packages/level2/meta/edit-resource/edit-link/FdEditLink.jsx +0 -48
- package/packages/level2/meta/edit-resource/edit-link/FdEditLinkResource.jsx +0 -18
- package/packages/level2/meta/edit-resource/edit-resource-dialog/FdEditResourceDialog.jsx +0 -34
- package/packages/level2/meta/edit-resource/edit-resource-property-block/FdEditResourceBlobField.jsx +0 -15
- package/packages/level2/meta/edit-resource/edit-resource-property-block/FdEditResourceEnumField.jsx +0 -35
- package/packages/level2/meta/edit-resource/edit-resource-property-block/FdEditResourceFlagsEnumField.jsx +0 -23
- package/packages/level2/meta/edit-resource/edit-resource-property-block/FdEditResourceImageField.jsx +0 -7
- package/packages/level2/meta/edit-resource/edit-resource-property-block/FdEditResourcePropertyBlock.jsx +0 -38
- package/packages/level2/meta/edit-resource/edit-resource-property-block/FdEditResourceRichTextField.jsx +0 -16
- package/packages/level2/meta/edit-resource/edit-resource-property-block/edit-resource-fields.jsx +0 -53
- package/packages/level2/meta/edit-resource/edit-resource-property-field/FdEditResourcePropertyField.jsx +0 -105
- package/packages/level2/meta/filtering/filter/FdEnumFlagFilter.jsx +0 -40
- package/packages/level2/meta/filtering/filter/FdFilter.jsx +0 -123
- package/packages/level2/meta/filtering/filter/filters/BooleanFilter.jsx +0 -25
- package/packages/level2/meta/filtering/filter/filters/DateFilter.jsx +0 -10
- package/packages/level2/meta/filtering/filter/filters/EnumFilter.jsx +0 -44
- package/packages/level2/meta/filtering/filter/filters/GuidFilter.jsx +0 -28
- package/packages/level2/meta/filtering/filter/filters/IntegerFilter.jsx +0 -28
- package/packages/level2/meta/filtering/filter/filters/TextFilter.jsx +0 -11
- package/packages/level2/meta/filtering/resource-filter-list/FdResourceFilterList.jsx +0 -120
- package/packages/level2/meta/filtering/resource-filter-list/resource-list-dropdown-menu/ResourceListDropdownMenu.funcs.jsx +0 -4
- package/packages/level2/meta/filtering/resource-filter-list/resource-list-dropdown-menu/ResourceListDropdownMenu.jsx +0 -43
- package/packages/level2/meta/providers/global-provider/FdGlobalContext.jsx +0 -17
- package/packages/level2/meta/resource-list/ResourceList.jsx +0 -63
- package/packages/level2/meta/resource-list/resource-add-button.jsx +0 -11
- package/packages/level2/meta/resource-list/resource-list-card/FdResourceListCard.jsx +0 -7
- package/packages/level2/meta/resource-list/resource-list-filter/FdResourceListFilter.jsx +0 -11
- package/packages/level2/meta/resource-list/resource-table-list/FdResourceTableList.jsx +0 -14
- package/packages/level2/meta/table/FdTable.jsx +0 -147
- package/packages/level2/meta/table/body/FdTableBody.jsx +0 -9
- package/packages/level2/meta/table/body-cell/FdActionBodyCell.jsx +0 -145
- package/packages/level2/meta/table/body-cell/FdBlobBodyCell.jsx +0 -27
- package/packages/level2/meta/table/body-cell/FdBodyCell.jsx +0 -133
- package/packages/level2/meta/table/body-cell/FdBodyCellValue.jsx +0 -59
- package/packages/level2/meta/table/body-cell/FdBodyExpandCell.jsx +0 -6
- package/packages/level2/meta/table/body-cell/FdBodyExpandPropertyCell.jsx +0 -22
- package/packages/level2/meta/table/body-cell/FdCustomActionLink.jsx +0 -16
- package/packages/level2/meta/table/body-cell/FdMultiselectCellTemplate.jsx +0 -39
- package/packages/level2/meta/table/body-cell/FdViewCell.jsx +0 -12
- package/packages/level2/meta/table/body-row/FdTableBodyRow.jsx +0 -49
- package/packages/level2/meta/table/header/FdTableHeader.jsx +0 -54
- package/packages/level2/meta/table/header-cell/FdResizable.jsx +0 -18
- package/packages/level2/meta/table/header-cell/FdResizableEdgeHandle.jsx +0 -4
- package/packages/level2/meta/table/header-cell/FdTableHeaderActionCell.jsx +0 -49
- package/packages/level2/meta/table/header-cell/FdTableHeaderCell.jsx +0 -89
- package/packages/level2/meta/table/header-cell/FdTableHeaderCellActionButton.jsx +0 -23
- package/packages/level2/meta/table/pager/FdPager.jsx +0 -72
- package/packages/level2/meta/table/table-custom-action/TableCustomAction.jsx +0 -26
- package/packages/level2/meta/view/FdView.jsx +0 -31
- package/packages/level2/meta/view/FdViewSheet.jsx +0 -103
- package/packages/level2/meta/view/view-resource/FdViewResource.jsx +0 -108
- package/packages/level2/meta/view/view-resource/templates/ManyToOneTableHeaderCellTemplate.jsx +0 -13
- package/src/app/error.jsx +0 -5
- package/src/app/global-error.jsx +0 -5
- package/src/app/loading.jsx +0 -11
- package/src/hd/footer/HdFooter.jsx +0 -27
- package/src/hd/footer/hd-footer-item/HdFooterItem.jsx +0 -14
- package/src/lm/ai-scan/AiScanAction.jsx +0 -21
- package/src/lm/ai-scan/cell-templates/AiScanWebsiteResultCellTemplate.jsx +0 -31
- package/src/lm/components/LmCardReport.jsx +0 -12
- package/src/lm/configs/lm-list-configs.jsx +0 -72
- package/src/lm/google-place/action-dropdown/GooglePlaceActionDropdown.jsx +0 -42
- package/src/lm/google-place/actions/GooglePlaceSaveToGroupAction.jsx +0 -22
- package/src/lm/google-place/cell-templates/GooglePlaceBusinessInfoCellTemplate.jsx +0 -59
- package/src/lm/google-place/cell-templates/GooglePlaceEmailsCellTemplate.jsx +0 -34
- package/src/lm/google-place/cell-templates/GooglePlaceScanAction.jsx +0 -15
- package/src/lm/lead/action-dropdown/LeadActionDropdown.jsx +0 -39
- package/src/lm/lead/actions/move-to-group-action/LeadMoveToGroupAction.jsx +0 -28
- package/src/lm/lead/cell-templates/LeadBusinessInfoCellTemplate.jsx +0 -64
- package/src/lm/lead/cell-templates/LeadScanAction.jsx +0 -15
- package/src/lm/lead/lead-google-place/LeadGooglePlaceIndicator.jsx +0 -8
- package/src/lm/lead/lead-google-place/LeadGooglePlaceIndicators.jsx +0 -17
- package/src/lm/lead/lead-google-place/LeadGooglePlaceInfo.jsx +0 -15
- package/src/lm/lead/view/LeadsView.jsx +0 -8
- package/src/lm/pages/HomePage.jsx +0 -53
- package/types-output/tsconfig.tsbuildinfo +0 -1
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import React, { useEffect, useMemo, useState, useCallback } from "react";
|
|
2
|
-
import { cn } from "@fd-toolbox/lib/utils";
|
|
3
|
-
import FdLabelAnimation from "@fd-component-toolbox/animation/FdLabelAnimation";
|
|
4
|
-
import { useHover } from "@fd-toolbox/hooks/use-hover";
|
|
5
|
-
import { onIncomingValueChange, onTextAreaBlur, onTextAreaValueChange, } from "@fd-component-toolbox/textarea/FdTextArea.funcs";
|
|
6
|
-
/**
|
|
7
|
-
* Textarea component with animated label
|
|
8
|
-
*
|
|
9
|
-
* @param FdTextareaProps {@link FdTextareaProps}
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```tsx
|
|
13
|
-
* function MyComponent() {
|
|
14
|
-
* const [text, setText] = useState('');
|
|
15
|
-
*
|
|
16
|
-
* return (
|
|
17
|
-
* <FdTextarea label="Description" value={text} onChange={setText} placeholder="Enter description"/>
|
|
18
|
-
* );
|
|
19
|
-
* }
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
export function FdTextarea({ placeholder, onChange, label, value, onBlur, skipAnimationOnce, className, ref, ...props }) {
|
|
23
|
-
const isError = props["aria-invalid"] && props["aria-invalid"] !== "false";
|
|
24
|
-
const [isInputHovered, hoverHandlers] = useHover();
|
|
25
|
-
const [isInFocus, setIsInFocus] = useState(false);
|
|
26
|
-
const [textareaValue, setTextareaValue] = useState("");
|
|
27
|
-
useEffect(() => {
|
|
28
|
-
onIncomingValueChange(value, setTextareaValue);
|
|
29
|
-
}, [value]);
|
|
30
|
-
const onTextAreaValueChangeCallback = useCallback((e) => {
|
|
31
|
-
onTextAreaValueChange(e, setTextareaValue, onChange);
|
|
32
|
-
}, [onChange]);
|
|
33
|
-
const onTextAreaBlurCallback = useCallback((e) => {
|
|
34
|
-
onTextAreaBlur(e, setIsInFocus, onBlur);
|
|
35
|
-
}, [onBlur]);
|
|
36
|
-
const shouldLabelAnimate = useMemo(() => !!value || !!placeholder || isInFocus, [value, placeholder, isInFocus]);
|
|
37
|
-
return (<div className="relative">
|
|
38
|
-
<textarea ref={ref} onChange={onTextAreaValueChangeCallback} value={textareaValue} className={cn("flex h-20 w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm placeholder:text-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50", isError && "border-destructive focus-visible:outline-none", className)} placeholder={placeholder} onFocus={() => setIsInFocus(true)} onBlur={onTextAreaBlurCallback} {...props} {...hoverHandlers}/>
|
|
39
|
-
<FdLabelAnimation className="max-w-full" label={label} shouldAnimate={shouldLabelAnimate} isParentHovered={isInputHovered} isErrorStyle={isError} skipAnimationOnce={skipAnimationOnce}/>
|
|
40
|
-
</div>);
|
|
41
|
-
}
|
|
42
|
-
FdTextarea.displayName = "FdTextarea";
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { Toaster } from "sonner";
|
|
3
|
-
import { getFdToasterId } from "@fd-component-toolbox/toaster/FdToaster.funcs";
|
|
4
|
-
/**
|
|
5
|
-
* Toast notification component for displaying messages
|
|
6
|
-
*
|
|
7
|
-
* Based on {@link https://ui.shadcn.com/docs/components/sonner Sonner}
|
|
8
|
-
*/
|
|
9
|
-
function FdToaster({ ...props }) {
|
|
10
|
-
return (<Toaster id={getFdToasterId()} richColors closeButton position="bottom-right" expand={false} className="toaster group" toastOptions={{
|
|
11
|
-
classNames: {
|
|
12
|
-
toast: "group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground " +
|
|
13
|
-
"group-[.toaster]:shadow-lg",
|
|
14
|
-
description: "group-[.toast]:text-muted-foreground",
|
|
15
|
-
actionButton: "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
|
|
16
|
-
cancelButton: "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground",
|
|
17
|
-
},
|
|
18
|
-
}} {...props}/>);
|
|
19
|
-
}
|
|
20
|
-
export { FdToaster };
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import * as React from "react";
|
|
3
|
-
import * as TooltipPrimitive from "@radix-ui/react-tooltip";
|
|
4
|
-
import { cn } from "@fd-toolbox/lib/utils";
|
|
5
|
-
/**
|
|
6
|
-
* Tooltip provider for managing tooltip context
|
|
7
|
-
*
|
|
8
|
-
* Based on {@link https://ui.shadcn.com/docs/components/tooltip Tooltip.Provider}
|
|
9
|
-
*/
|
|
10
|
-
function FdTooltipProvider({ delayDuration, skipDelayDuration, ...props }) {
|
|
11
|
-
return (<TooltipPrimitive.Provider delayDuration={delayDuration ?? 350} skipDelayDuration={skipDelayDuration ?? 0} {...props}/>);
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Root component for creating a tooltip
|
|
15
|
-
*
|
|
16
|
-
* Based on {@link https://ui.shadcn.com/docs/components/tooltip Tooltip}
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```tsx
|
|
20
|
-
* <FdTooltip delayDuration={100}>
|
|
21
|
-
* ...
|
|
22
|
-
* </FdTooltip>
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
const FdTooltip = TooltipPrimitive.Root;
|
|
26
|
-
/**
|
|
27
|
-
* Trigger element for showing tooltip
|
|
28
|
-
*
|
|
29
|
-
* Based on {@link https://ui.shadcn.com/docs/components/tooltip Tooltip.Trigger}
|
|
30
|
-
*
|
|
31
|
-
* @example
|
|
32
|
-
* ```tsx
|
|
33
|
-
* function MyComponent({ shouldHideTooltip }) {
|
|
34
|
-
* return (
|
|
35
|
-
* <FdTooltipTrigger disabled={shouldHideTooltip} onClick={...}>
|
|
36
|
-
* ...
|
|
37
|
-
* </FdTooltipTrigger>
|
|
38
|
-
* );
|
|
39
|
-
* }
|
|
40
|
-
* ```
|
|
41
|
-
*/
|
|
42
|
-
const FdTooltipTrigger = TooltipPrimitive.Trigger;
|
|
43
|
-
/**
|
|
44
|
-
* Content container for tooltip text
|
|
45
|
-
*
|
|
46
|
-
* Based on {@link https://ui.shadcn.com/docs/components/tooltip Tooltip.Content}
|
|
47
|
-
*
|
|
48
|
-
* ```tsx
|
|
49
|
-
* <FdTooltipContent align="start" side="right" sideOffset={17}>
|
|
50
|
-
* ...
|
|
51
|
-
* </FdTooltipContent>
|
|
52
|
-
* ```
|
|
53
|
-
*/
|
|
54
|
-
export const tooltipContentSides = {
|
|
55
|
-
bottom: 0,
|
|
56
|
-
top: 1,
|
|
57
|
-
left: 2,
|
|
58
|
-
right: 3,
|
|
59
|
-
};
|
|
60
|
-
export const tooltipContentSidesStrings = {
|
|
61
|
-
[tooltipContentSides.bottom]: "bottom",
|
|
62
|
-
[tooltipContentSides.top]: "top",
|
|
63
|
-
[tooltipContentSides.left]: "left",
|
|
64
|
-
[tooltipContentSides.right]: "right",
|
|
65
|
-
};
|
|
66
|
-
export const tooltipAligns = {
|
|
67
|
-
start: 0,
|
|
68
|
-
center: 1,
|
|
69
|
-
end: 2,
|
|
70
|
-
};
|
|
71
|
-
export const tooltipAlignsStrings = {
|
|
72
|
-
[tooltipAligns.start]: "start",
|
|
73
|
-
[tooltipAligns.center]: "center",
|
|
74
|
-
[tooltipAligns.end]: "end",
|
|
75
|
-
};
|
|
76
|
-
function FdTooltipContent({ className, ref, ...props }) {
|
|
77
|
-
return (<TooltipPrimitive.Content ref={ref} className={cn("z-50 overflow-hidden rounded-md bg-fd-tertiary-900 px-3 py-1.5 text-xs text-primary-foreground shadow-md shadow-fd-tertiary-600", "animate-in fade-in-0 zoom-in-95", "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95", "data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2", "data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", "transition-all duration-200 ease-in-out", "dark:bg-primary dark:shadow-none", className)} {...props}/>);
|
|
78
|
-
}
|
|
79
|
-
FdTooltipContent.displayName = TooltipPrimitive.Content.displayName;
|
|
80
|
-
export { FdTooltip, FdTooltipTrigger, FdTooltipContent, FdTooltipProvider };
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { useCallback, useEffect, useState, useRef, useMemo, useImperativeHandle, } from "react";
|
|
3
|
-
import { cn } from "@fd-toolbox/lib/utils";
|
|
4
|
-
import { onMultiBrowserFilterReset, setMultiBrowserSelectionState, } from "@meta/browsers/base-multi-browser/FdBaseMultiBrowser.funcs";
|
|
5
|
-
import { FdInput } from "@fd-component-toolbox/input/FdInput";
|
|
6
|
-
import { FdButton } from "@fd-component-toolbox/button/FdButton";
|
|
7
|
-
import { FdIcon, iconNames } from "@fd-component-toolbox/icon/FdIcon";
|
|
8
|
-
import { FdFormControl, FdFormField, FdFormItem, FdFormMessage } from "@fd-component-toolbox/form/FdForm";
|
|
9
|
-
import { FdBaseMultiBrowserDialog } from "@meta/browsers/base-multi-browser/base-multi-browser-dialog/FdBaseMultiBrowserDialog";
|
|
10
|
-
import { multiBrowserDialogMaxWidth } from "@fd-component-toolbox/dialog/dialog-constants";
|
|
11
|
-
import { getRequiredLabel } from "@meta/edit-resource/edit-resource-property-block/FdEditResourcePropertyBlock.funcs";
|
|
12
|
-
import { browserTypes, browserTypeToSuffix } from "@meta/browsers/browser-type";
|
|
13
|
-
import { elements } from "@fd-toolbox/constants/elements";
|
|
14
|
-
export function FdBaseMultiBrowser({ required, propertyMeta, form, relatedResourceId, selectedResources, onCloseDialog, onDescriptionChange, parentContextName: parentContextNameProp, short, disabled, readOnly, relatedResourcePropertyMeta, onSetRelatedResourcePropertyMeta, propertyResourceMeta, onChange, setSelectedResources, setSelectedResourceIds, skipAnimationOnce, variant, relatedUiResourceMeta, children: icons, ref, }) {
|
|
15
|
-
const [selectedValues, setSelectedValues] = useState("");
|
|
16
|
-
const [isHovered, setIsHovered] = useState(false);
|
|
17
|
-
const parentContextName = parentContextNameProp ?? "";
|
|
18
|
-
const browser = parentContextName.includes(elements.multiBrowser.FdManyToManyBrowser)
|
|
19
|
-
? browserTypeToSuffix[browserTypes.manyToManyBrowser]
|
|
20
|
-
: browserTypeToSuffix[browserTypes.multiBrowser];
|
|
21
|
-
const inputId = `${parentContextName}${propertyMeta.name}${browser}`;
|
|
22
|
-
const iconId = `${parentContextName}${propertyMeta.name}${elements.browser.browserIcon}`;
|
|
23
|
-
const dialogRef = useRef(null);
|
|
24
|
-
const buttonRef = useRef(null);
|
|
25
|
-
const data = useMemo(() => ({
|
|
26
|
-
maxWidth: multiBrowserDialogMaxWidth,
|
|
27
|
-
relatedResourcePropertyMeta: onSetRelatedResourcePropertyMeta
|
|
28
|
-
? relatedResourcePropertyMeta
|
|
29
|
-
: propertyMeta,
|
|
30
|
-
selectedResources,
|
|
31
|
-
relatedResourceId,
|
|
32
|
-
}), [
|
|
33
|
-
onSetRelatedResourcePropertyMeta,
|
|
34
|
-
relatedResourcePropertyMeta,
|
|
35
|
-
propertyMeta,
|
|
36
|
-
selectedResources,
|
|
37
|
-
relatedResourceId,
|
|
38
|
-
]);
|
|
39
|
-
useEffect(() => {
|
|
40
|
-
setMultiBrowserSelectionState(selectedResources, setSelectedValues, setIsHovered, propertyResourceMeta);
|
|
41
|
-
}, [selectedResources, propertyResourceMeta]);
|
|
42
|
-
const onFilterReset = useCallback(() => onMultiBrowserFilterReset(onChange, setSelectedResources, setSelectedResourceIds, dialogRef.current?.resetDialog), [onChange, setSelectedResourceIds, setSelectedResources, dialogRef]);
|
|
43
|
-
const onMouseEnter = useCallback(() => setIsHovered(true), []);
|
|
44
|
-
const onMouseLeave = useCallback(() => setIsHovered(false), []);
|
|
45
|
-
const onInputClick = useCallback(() => buttonRef.current?.click(), []);
|
|
46
|
-
useImperativeHandle(ref, () => ({
|
|
47
|
-
open: () => {
|
|
48
|
-
onInputClick();
|
|
49
|
-
},
|
|
50
|
-
}), [onInputClick]);
|
|
51
|
-
return (<div className={cn("relative h-8", short ? "max-w-48" : "w-full")} onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}>
|
|
52
|
-
{form && (<FdFormField control={form.control} name={propertyMeta.name} defaultValue={""} render={({ field }) => (<FdFormItem>
|
|
53
|
-
<FdFormControl>
|
|
54
|
-
<FdInput inputId={inputId} showClearIcon={!(disabled ?? readOnly)} placeholder={variant === "float" ? "" : propertyMeta.displayName} required={required} onChangeCapture={onDescriptionChange} label={getRequiredLabel(required, propertyMeta.displayName)} disabled={disabled} readOnly={true} id={field.name} onBlur={field.onBlur} onChange={field.onChange} ref={field.ref} value={selectedValues} onClear={onFilterReset} skipAnimationOnce={skipAnimationOnce} variant={variant} className="cursor-pointer placeholder:truncate" onClick={onInputClick} isDisableFocus={true}>
|
|
55
|
-
<div className="flex items-center gap-1">
|
|
56
|
-
{icons}
|
|
57
|
-
<FdBaseMultiBrowserDialog ref={dialogRef} disabled={disabled ?? readOnly} onTriggerClick={onSetRelatedResourcePropertyMeta} trigger={<FdButton ref={buttonRef} size="icon" variant="icon" className={cn("w-5 focus:outline-none focus-visible:ring-0", disabled || readOnly ? "cursor-not-allowed" : "")}>
|
|
58
|
-
<FdIcon id={iconId} name="magnifyingGlass"/>
|
|
59
|
-
</FdButton>} data={data} onCloseDialog={onCloseDialog} relatedUiResourceMeta={relatedUiResourceMeta}/>
|
|
60
|
-
</div>
|
|
61
|
-
</FdInput>
|
|
62
|
-
</FdFormControl>
|
|
63
|
-
<FdFormMessage />
|
|
64
|
-
</FdFormItem>)}/>)}
|
|
65
|
-
|
|
66
|
-
{!form && selectedValues && isHovered && !disabled && (<div className="absolute right-3.5 top-1/2 flex h-4 -translate-x-1/2 -translate-y-1/2 items-center">
|
|
67
|
-
<FdButton variant="icon" size="icon" onClick={onFilterReset} className="size-6">
|
|
68
|
-
<FdIcon name={iconNames.cross2} className="bg-background"/>
|
|
69
|
-
</FdButton>
|
|
70
|
-
</div>)}
|
|
71
|
-
</div>);
|
|
72
|
-
}
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
import React, { useCallback, useContext, useRef, useState, useImperativeHandle } from "react";
|
|
2
|
-
import { FdDialog, FdDialogClose, FdDialogContent, FdDialogDescription, FdDialogTitle, FdDialogTrigger, } from "@fd-component-toolbox/dialog/FdDialog";
|
|
3
|
-
import { FdButton } from "@fd-component-toolbox/button/FdButton";
|
|
4
|
-
import { FdIcon, iconNames } from "@fd-component-toolbox/icon/FdIcon";
|
|
5
|
-
import { addPaging } from "@fd-toolbox/odata/odataconfig";
|
|
6
|
-
import { rowHighlightBehaviors } from "@fd-toolbox/enums/enums";
|
|
7
|
-
import { useAsyncEffect } from "@fd-toolbox/hooks/use-async-effect";
|
|
8
|
-
import { resourceEditModes } from "@fd-toolbox/constants/resource-list-configs-enums";
|
|
9
|
-
import { elements } from "@fd-toolbox/constants/elements";
|
|
10
|
-
import { FdResourceFilterList, } from "@meta/filtering/resource-filter-list/FdResourceFilterList";
|
|
11
|
-
import { FdTable } from "@meta/table/FdTable";
|
|
12
|
-
import { initBaseMultiBrowserDialog, onBrowserTablePaging, refreshRightResources, moveResourcesFromLeftTable, moveAllResourcesFromLeftTable, moveMultipleResources, moveSingleResource, moveResourcesFromRightTable, moveAllResourcesFromRightTable, onMultiBrowserDialogOpenChange, } from "@meta/browsers/base-multi-browser/base-multi-browser-dialog/FdBaseMultiBrowserDialog.funcs";
|
|
13
|
-
import { goBack } from "@fd-toolbox/routing/routers";
|
|
14
|
-
import { oDataDefaultTop } from "@fd-toolbox/odata/odata-constants";
|
|
15
|
-
const InstanceNumberContext = React.createContext(0);
|
|
16
|
-
const tableConfig = {
|
|
17
|
-
hideDeleteButton: true,
|
|
18
|
-
maxNumberOfColumns: 4,
|
|
19
|
-
editMode: resourceEditModes.default,
|
|
20
|
-
multiSelect: true,
|
|
21
|
-
isBrowser: true,
|
|
22
|
-
};
|
|
23
|
-
export function FdBaseMultiBrowserDialog({ data, trigger, onCloseDialog: closeDialog, disabled, onTriggerClick, relatedUiResourceMeta, ref, }) {
|
|
24
|
-
const instanceNumber = useContext(InstanceNumberContext);
|
|
25
|
-
const leftTable = useRef(null);
|
|
26
|
-
const rightTable = useRef(null);
|
|
27
|
-
const [leftResources, setLeftResources] = useState([]);
|
|
28
|
-
const [rightResources, setRightResources] = useState([]);
|
|
29
|
-
const [browserDialogTitle, setBrowserDialogTitle] = useState("");
|
|
30
|
-
const [resourceMeta, setResourceMeta] = useState();
|
|
31
|
-
const [uiResourceMeta, setUiResourceMeta] = useState();
|
|
32
|
-
const [dialogOpened, setDialogOpened] = useState(false);
|
|
33
|
-
const [leftPageSize, setLeftPageSize] = useState(oDataDefaultTop);
|
|
34
|
-
const [rightPageSize, setRightPageSize] = useState(oDataDefaultTop);
|
|
35
|
-
const [leftODataConfig, setLeftODataConfig] = useState(addPaging({}, leftPageSize));
|
|
36
|
-
const [rightODataConfig, setRightODataConfig] = useState(addPaging({}, rightPageSize));
|
|
37
|
-
const [isComponentRefSet, setIsComponentRefSet] = useState(false);
|
|
38
|
-
const [isRightResourcesLoading, setIsRightResourcesLoading] = useState(true);
|
|
39
|
-
const resourceFilterListComponentRef = useRef(null);
|
|
40
|
-
useAsyncEffect(async () => {
|
|
41
|
-
if (data.relatedResourcePropertyMeta)
|
|
42
|
-
await initBaseMultiBrowserDialog(data, setBrowserDialogTitle, setLeftResources, setResourceMeta, setUiResourceMeta, relatedUiResourceMeta);
|
|
43
|
-
}, [data.selectedResources.length, data.relatedResourcePropertyMeta]);
|
|
44
|
-
const areResourcesSet = useCallback(() => {
|
|
45
|
-
return !!(data && (rightResources || leftResources));
|
|
46
|
-
}, [data, rightResources, leftResources]);
|
|
47
|
-
const onPagingRightTable = useCallback(async (fdTablePaging) => {
|
|
48
|
-
await onBrowserTablePaging(rightODataConfig, setRightODataConfig, setRightPageSize, fdTablePaging, resourceMeta, refreshRightResources, data, leftResources, setRightResources, resourceFilterListComponentRef.current ?? undefined);
|
|
49
|
-
}, [data, rightODataConfig, resourceMeta, leftResources, setRightResources, setRightPageSize]);
|
|
50
|
-
const onPagingLeftTable = useCallback(async (fdTablePaging) => {
|
|
51
|
-
await onBrowserTablePaging(leftODataConfig, setLeftODataConfig, setLeftPageSize, fdTablePaging, resourceMeta);
|
|
52
|
-
}, [leftODataConfig, resourceMeta, setLeftPageSize]);
|
|
53
|
-
const onRefreshRightTable = useCallback(async () => {
|
|
54
|
-
await refreshRightResources(data, leftResources, setRightResources, rightODataConfig, resourceMeta, setIsRightResourcesLoading, resourceFilterListComponentRef.current ?? undefined);
|
|
55
|
-
}, [data, leftResources, rightODataConfig, resourceMeta]);
|
|
56
|
-
useAsyncEffect(async () => {
|
|
57
|
-
if (resourceMeta?.properties && isComponentRefSet)
|
|
58
|
-
await onRefreshRightTable();
|
|
59
|
-
}, [resourceMeta, isComponentRefSet, onRefreshRightTable]);
|
|
60
|
-
const onMoveResourcesFromLeftToRight = useCallback(() => {
|
|
61
|
-
if (leftTable.current)
|
|
62
|
-
moveResourcesFromLeftTable(leftResources, setLeftResources, rightResources, setRightResources, leftTable.current.getSelectedRows(), data);
|
|
63
|
-
}, [data, leftResources, leftTable, rightResources]);
|
|
64
|
-
const onMoveAllResourcesFromLeftToRight = useCallback(() => {
|
|
65
|
-
moveAllResourcesFromLeftTable(leftResources, setLeftResources, rightResources, setRightResources);
|
|
66
|
-
}, [leftResources, rightResources]);
|
|
67
|
-
const onResourceClick = useCallback((resource) => {
|
|
68
|
-
if (leftTable?.current && rightTable.current) {
|
|
69
|
-
const selectedLeftResources = leftTable.current.getSelectedRows().map((row) => row.item);
|
|
70
|
-
const selectedRightResources = rightTable.current.getSelectedRows().map((row) => row.item);
|
|
71
|
-
if (selectedLeftResources.length > 1 || selectedRightResources.length > 1) {
|
|
72
|
-
moveMultipleResources(selectedLeftResources, selectedRightResources, leftResources, setLeftResources, rightResources, setRightResources);
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
moveSingleResource(resource, leftResources, setLeftResources, rightResources, setRightResources);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}, [leftResources, rightResources, setLeftResources, setRightResources, leftTable, rightTable]);
|
|
79
|
-
const onMoveResourcesFromRightToLeft = useCallback(() => {
|
|
80
|
-
if (rightTable.current)
|
|
81
|
-
moveResourcesFromRightTable(leftResources, setLeftResources, rightResources, setRightResources, rightTable.current.getSelectedRows());
|
|
82
|
-
}, [leftResources, rightResources, rightTable]);
|
|
83
|
-
const onMoveAllResourcesFromRightToLeft = useCallback(() => {
|
|
84
|
-
moveAllResourcesFromRightTable(leftResources, setLeftResources, rightResources, setRightResources);
|
|
85
|
-
}, [leftResources, rightResources]);
|
|
86
|
-
const onCloseDialog = useCallback(() => closeDialog(leftResources), [closeDialog, leftResources]);
|
|
87
|
-
const onCloseDialogWithoutSelected = useCallback(() => closeDialog([]), [closeDialog]);
|
|
88
|
-
useImperativeHandle(ref, () => ({
|
|
89
|
-
resetDialog() {
|
|
90
|
-
onMoveAllResourcesFromLeftToRight();
|
|
91
|
-
},
|
|
92
|
-
}), [onMoveAllResourcesFromLeftToRight]);
|
|
93
|
-
const setRef = useCallback((component) => {
|
|
94
|
-
if (component) {
|
|
95
|
-
resourceFilterListComponentRef.current = component;
|
|
96
|
-
setIsComponentRefSet(true);
|
|
97
|
-
}
|
|
98
|
-
}, []);
|
|
99
|
-
const onOpenChangeCallback = useCallback((value) => {
|
|
100
|
-
onMultiBrowserDialogOpenChange(value, leftResources, closeDialog, setDialogOpened);
|
|
101
|
-
}, [setDialogOpened, leftResources, closeDialog]);
|
|
102
|
-
const onSortCallback = useCallback(async (tableSort) => {
|
|
103
|
-
await refreshRightResources(data, leftResources, setRightResources, rightODataConfig, resourceMeta, setIsRightResourcesLoading, resourceFilterListComponentRef.current ?? undefined, tableSort);
|
|
104
|
-
}, [resourceMeta, data, leftResources, rightODataConfig, resourceFilterListComponentRef]);
|
|
105
|
-
return (<InstanceNumberContext.Provider value={instanceNumber + 1}>
|
|
106
|
-
<FdDialog open={!disabled && dialogOpened} onOpenChange={onOpenChangeCallback} modal>
|
|
107
|
-
<FdDialogTrigger onClick={onTriggerClick} className="w-full focus:outline-none focus-visible:ring-0" asChild>
|
|
108
|
-
{trigger}
|
|
109
|
-
</FdDialogTrigger>
|
|
110
|
-
<FdDialogContent className="min-w-full gap-4 overflow-auto rounded-none sm:min-w-[92%] sm:rounded lg:min-w-[87%]">
|
|
111
|
-
<FdDialogTitle className="flex w-full flex-col items-start justify-between pl-1">
|
|
112
|
-
{browserDialogTitle}
|
|
113
|
-
</FdDialogTitle>
|
|
114
|
-
<FdDialogDescription className="sr-only"></FdDialogDescription>
|
|
115
|
-
<div>
|
|
116
|
-
<FdResourceFilterList ref={setRef} uiResourceMeta={uiResourceMeta} stateKey={`${FdResourceFilterList.displayName}_${resourceMeta?.id}_multiBrowser_${instanceNumber}`} onFilterChange={onRefreshRightTable} showRefreshButton={true} showResetButton={false}/>
|
|
117
|
-
</div>
|
|
118
|
-
{areResourcesSet() && (<div className="grid max-h-[27rem] w-full grid-cols-[1fr_auto_1fr] items-stretch justify-between overflow-x-auto">
|
|
119
|
-
<div className="overflow-auto">
|
|
120
|
-
<FdTable id={elements.multiBrowser.leftTable + instanceNumber} uiResourceMeta={uiResourceMeta} onPaging={onPagingLeftTable} tableConfig={tableConfig} items={leftResources} pageSize={leftPageSize} ref={leftTable} className="h-96" onRowClick={onResourceClick} externalSorting={false} readonly={true} rowHighlightBehaviour={rowHighlightBehaviors.pointer}/>
|
|
121
|
-
</div>
|
|
122
|
-
<div className="mx-7 flex flex-col justify-center gap-2">
|
|
123
|
-
<FdButton id={elements.multiBrowser.moveResourcesToRightTable + instanceNumber} onClick={onMoveAllResourcesFromLeftToRight} variant="ghost" size="icon">
|
|
124
|
-
<FdIcon name={iconNames.doubleArrowRight}/>
|
|
125
|
-
</FdButton>
|
|
126
|
-
<FdButton id={elements.multiBrowser.moveResourcesToRightTable + instanceNumber} onClick={onMoveResourcesFromLeftToRight} variant="ghost" size="icon">
|
|
127
|
-
<FdIcon name={iconNames.arrowRight}/>
|
|
128
|
-
</FdButton>
|
|
129
|
-
<FdButton id={elements.multiBrowser.moveResourcesToLeftTable + instanceNumber} onClick={onMoveResourcesFromRightToLeft} variant="ghost" size="icon">
|
|
130
|
-
<FdIcon name={iconNames.arrowLeft} onClick={goBack}/>
|
|
131
|
-
</FdButton>
|
|
132
|
-
<FdButton id={elements.multiBrowser.moveResourcesToLeftTable + instanceNumber} onClick={onMoveAllResourcesFromRightToLeft} variant="ghost" size="icon">
|
|
133
|
-
<FdIcon name={iconNames.doubleArrowLeft}/>
|
|
134
|
-
</FdButton>
|
|
135
|
-
</div>
|
|
136
|
-
<div className="overflow-auto">
|
|
137
|
-
<FdTable id={elements.multiBrowser.rightTable + instanceNumber} uiResourceMeta={uiResourceMeta} onPaging={onPagingRightTable} items={rightResources} pageSize={rightPageSize} tableConfig={tableConfig} ref={rightTable} className="h-96" onRowClick={onResourceClick} externalSorting={true} readonly={true} rowHighlightBehaviour={rowHighlightBehaviors.pointer} isLoading={isRightResourcesLoading} sort={onSortCallback}/>
|
|
138
|
-
</div>
|
|
139
|
-
</div>)}
|
|
140
|
-
<div className="flex items-end justify-end space-x-2">
|
|
141
|
-
<FdDialogClose asChild>
|
|
142
|
-
<FdButton id={elements.browser.okBrowserButton + instanceNumber} onClick={onCloseDialog}>
|
|
143
|
-
Ok
|
|
144
|
-
</FdButton>
|
|
145
|
-
</FdDialogClose>
|
|
146
|
-
<FdButton id={`clearBrowserButton${instanceNumber}`} onClick={onMoveAllResourcesFromLeftToRight} variant="outline">
|
|
147
|
-
Clear
|
|
148
|
-
</FdButton>
|
|
149
|
-
<FdDialogClose asChild>
|
|
150
|
-
<FdButton id={`cancelBrowserButton${instanceNumber}`} onClick={onCloseDialogWithoutSelected} variant="outline">
|
|
151
|
-
Cancel
|
|
152
|
-
</FdButton>
|
|
153
|
-
</FdDialogClose>
|
|
154
|
-
</div>
|
|
155
|
-
</FdDialogContent>
|
|
156
|
-
</FdDialog>
|
|
157
|
-
</InstanceNumberContext.Provider>);
|
|
158
|
-
}
|
|
159
|
-
FdBaseMultiBrowserDialog.displayName = "FdBaseMultiBrowserDialog";
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { useState, useCallback, useRef } from "react";
|
|
3
|
-
import { FdInput } from "@fd-component-toolbox/input/FdInput";
|
|
4
|
-
import { FdFormControl, FdFormField, FdFormItem } from "@fd-component-toolbox/form/FdForm";
|
|
5
|
-
import { cn } from "@fd-toolbox/lib/utils";
|
|
6
|
-
import { FdButton } from "@fd-component-toolbox/button/FdButton";
|
|
7
|
-
import { FdIcon, iconNames, iconSizes } from "@fd-component-toolbox/icon/FdIcon";
|
|
8
|
-
import { useAsyncEffect } from "@fd-toolbox/hooks/use-async-effect";
|
|
9
|
-
import { getRequiredLabel } from "@meta/edit-resource/edit-resource-property-block/FdEditResourcePropertyBlock.funcs";
|
|
10
|
-
import { browserTypeToSuffix, browserTypes } from "@meta/browsers/browser-type";
|
|
11
|
-
import { FdBrowserDialog } from "@meta/browsers/browser/browser-dialog/FdBrowserDialog";
|
|
12
|
-
import { getBrowserEmptyShortResourceDescriptor, onUpdateBrowserInput, setBrowserDescription, handleLoadRelatedResourceDescription, } from "@meta/browsers/browser/FdBrowser.funcs";
|
|
13
|
-
import { elements } from "@fd-toolbox/constants/elements";
|
|
14
|
-
/**
|
|
15
|
-
* Browser component for single resource selection with integrated search dialog.
|
|
16
|
-
* Used for many-to-one relationships.
|
|
17
|
-
* @see {@link FdBrowserProps} for component props
|
|
18
|
-
*/
|
|
19
|
-
export function FdBrowser({ required, propertyMeta, onChange, excludeResourceIds, short, disabled, readOnly, parentContextName: parentContextNameProp, relatedResourceId, form, children: icons, }) {
|
|
20
|
-
const [shortResourceDescriptor, setShortResourceDescriptor] = useState(getBrowserEmptyShortResourceDescriptor());
|
|
21
|
-
const [description, setDescription] = useState("");
|
|
22
|
-
const [isValid, setIsValid] = useState(true);
|
|
23
|
-
const [loadComplete, setLoadComplete] = useState(false);
|
|
24
|
-
useAsyncEffect(async () => {
|
|
25
|
-
setIsValid(!!form?.watch(propertyMeta.name));
|
|
26
|
-
}, [description]);
|
|
27
|
-
const parentContextName = parentContextNameProp ?? "";
|
|
28
|
-
const contextName = `${parentContextName}${elements.browser.FdBrowser}${propertyMeta.name}`;
|
|
29
|
-
const inputId = `${contextName}${browserTypeToSuffix[browserTypes.browser]}`;
|
|
30
|
-
const iconId = `${contextName}${elements.browser.browserIcon}`;
|
|
31
|
-
const buttonRef = useRef(null);
|
|
32
|
-
useAsyncEffect(async () => {
|
|
33
|
-
handleLoadRelatedResourceDescription(propertyMeta, setDescription, setLoadComplete, form, relatedResourceId);
|
|
34
|
-
}, [relatedResourceId, form]);
|
|
35
|
-
const onInputModelChange = useCallback((v) => {
|
|
36
|
-
onUpdateBrowserInput(v, setShortResourceDescriptor, setDescription, onChange);
|
|
37
|
-
}, [onChange]);
|
|
38
|
-
const onCloseEditProperty = useCallback((data) => {
|
|
39
|
-
if (data) {
|
|
40
|
-
setShortResourceDescriptor(data);
|
|
41
|
-
setBrowserDescription(data, setDescription);
|
|
42
|
-
onChange?.(data.id);
|
|
43
|
-
}
|
|
44
|
-
}, [onChange]);
|
|
45
|
-
const onInputClick = useCallback(() => buttonRef.current?.click(), []);
|
|
46
|
-
return (<FdFormField control={form?.control} name={propertyMeta.name} render={({ field, fieldState }) => (<FdFormItem className={cn("relative", short ? "max-w-48" : "w-full")}>
|
|
47
|
-
<FdFormControl>
|
|
48
|
-
<FdInput {...field} value={description} inputId={inputId} showClearIcon={!(disabled ?? readOnly)} label={getRequiredLabel(propertyMeta.required, propertyMeta.displayName)} readOnly={readOnly} required={required} disabled={disabled} aria-invalid={fieldState.invalid && !isValid} onChange={onInputModelChange} skipAnimationOnce={!loadComplete} onClick={onInputClick} isDisableFocus={true} className="cursor-pointer">
|
|
49
|
-
<div className="flex items-center gap-1">
|
|
50
|
-
{icons}
|
|
51
|
-
<FdBrowserDialog propertyMeta={propertyMeta} currentResourceId={shortResourceDescriptor.id ?? relatedResourceId} excludeResourceIds={excludeResourceIds} closeDialog={onCloseEditProperty} trigger={<FdButton ref={buttonRef} size="icon" variant="icon" className={cn("w-4", disabled || readOnly ? "cursor-not-allowed" : "")}>
|
|
52
|
-
<FdIcon id={iconId} name={iconNames.magnifyingGlass} size={iconSizes.small}/>
|
|
53
|
-
</FdButton>} setDescription={setDescription} disabled={disabled ?? readOnly}/>
|
|
54
|
-
</div>
|
|
55
|
-
</FdInput>
|
|
56
|
-
</FdFormControl>
|
|
57
|
-
</FdFormItem>)}/>);
|
|
58
|
-
}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { useCallback, useRef, useState } from "react";
|
|
2
|
-
import { FdButton } from "@fd-component-toolbox/button/FdButton";
|
|
3
|
-
import { onInitBrowserDialog, refreshBrowserDialogResources, onBrowserDialogPaging as onPagingFunc, onItemSelected as onItemSelectedFunc, setBrowserDialogResourceDescription, } from "@meta/browsers/browser/browser-dialog/FdBrowserDialog.funcs";
|
|
4
|
-
import { FdDialog, FdDialogClose, FdDialogContent, FdDialogFooter, FdDialogHeader, FdDialogTitle, FdDialogTrigger, } from "@fd-component-toolbox/dialog/FdDialog";
|
|
5
|
-
import { getBrowserEmptyShortResourceDescriptor } from "@meta/browsers/browser/FdBrowser.funcs";
|
|
6
|
-
import { useAsyncEffect } from "@fd-toolbox/hooks/use-async-effect";
|
|
7
|
-
import { rowHighlightBehaviors } from "@fd-toolbox/enums/enums";
|
|
8
|
-
import { elements } from "@fd-toolbox/constants/elements";
|
|
9
|
-
import { FdResourceFilterList, } from "@meta/filtering/resource-filter-list/FdResourceFilterList";
|
|
10
|
-
import { FdTable } from "@meta/table/FdTable";
|
|
11
|
-
import { FdBrowser } from "@meta/browsers/browser/FdBrowser";
|
|
12
|
-
export function FdBrowserDialog({ propertyMeta, currentResourceId, closeDialog, trigger, setDescription, excludeResourceIds, disabled, }) {
|
|
13
|
-
const contextName = `${FdBrowser.name}${propertyMeta.name}${FdBrowserDialog.name}`;
|
|
14
|
-
const [resources, setResources] = useState([]);
|
|
15
|
-
const [uiResourceMeta, setUiResourceMeta] = useState();
|
|
16
|
-
const [oDataConfig, setODataConfig] = useState({});
|
|
17
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
18
|
-
const tableConfig = { isBrowser: true };
|
|
19
|
-
const resourceFilterListRef = useRef(null);
|
|
20
|
-
const getFilters = useCallback(() => {
|
|
21
|
-
if (resourceFilterListRef.current) {
|
|
22
|
-
return resourceFilterListRef.current.getFilters();
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
return {};
|
|
26
|
-
}
|
|
27
|
-
}, [resourceFilterListRef]);
|
|
28
|
-
useAsyncEffect(async () => {
|
|
29
|
-
await onInitBrowserDialog(setUiResourceMeta, propertyMeta, setResources, setODataConfig, oDataConfig, getFilters, excludeResourceIds);
|
|
30
|
-
}, []);
|
|
31
|
-
useAsyncEffect(async () => {
|
|
32
|
-
await setBrowserDialogResourceDescription(resources, currentResourceId, uiResourceMeta?.resourceMeta, setDescription);
|
|
33
|
-
}, [resources, currentResourceId, setDescription, uiResourceMeta?.resourceMeta]);
|
|
34
|
-
const onRefreshResources = useCallback(() => {
|
|
35
|
-
refreshBrowserDialogResources(setResources, setODataConfig, oDataConfig, getFilters, uiResourceMeta.resourceMeta, excludeResourceIds);
|
|
36
|
-
}, [excludeResourceIds, getFilters, oDataConfig, uiResourceMeta]);
|
|
37
|
-
const onCancel = useCallback(() => {
|
|
38
|
-
closeDialog?.(undefined);
|
|
39
|
-
}, [closeDialog]);
|
|
40
|
-
const onClear = useCallback(() => {
|
|
41
|
-
closeDialog?.(getBrowserEmptyShortResourceDescriptor());
|
|
42
|
-
}, [closeDialog]);
|
|
43
|
-
const onPaging = useCallback((paging) => {
|
|
44
|
-
onPagingFunc(paging, setResources, setODataConfig, oDataConfig, getFilters, uiResourceMeta.resourceMeta, excludeResourceIds);
|
|
45
|
-
}, [setResources, setODataConfig, oDataConfig, getFilters, uiResourceMeta, excludeResourceIds]);
|
|
46
|
-
const onItemSelected = useCallback((item) => {
|
|
47
|
-
if (uiResourceMeta?.resourceMeta && closeDialog) {
|
|
48
|
-
onItemSelectedFunc(item, uiResourceMeta.resourceMeta, closeDialog);
|
|
49
|
-
setIsOpen(false);
|
|
50
|
-
}
|
|
51
|
-
}, [uiResourceMeta?.resourceMeta, closeDialog]);
|
|
52
|
-
const onOpenChange = useCallback((open) => {
|
|
53
|
-
setIsOpen(open);
|
|
54
|
-
if (!open) {
|
|
55
|
-
closeDialog?.(undefined);
|
|
56
|
-
}
|
|
57
|
-
}, [closeDialog]);
|
|
58
|
-
return (<FdDialog open={isOpen && !disabled} onOpenChange={onOpenChange}>
|
|
59
|
-
<FdDialogTrigger asChild className="w-full">
|
|
60
|
-
{trigger}
|
|
61
|
-
</FdDialogTrigger>
|
|
62
|
-
<FdDialogContent className="box-border flex max-h-[90vh] w-full max-w-sm flex-col sm:max-w-lg md:max-w-3xl lg:max-w-4xl">
|
|
63
|
-
<FdDialogTitle className="absolute -m-px size-px overflow-hidden whitespace-nowrap border-0 p-0">
|
|
64
|
-
{propertyMeta.displayName}
|
|
65
|
-
</FdDialogTitle>
|
|
66
|
-
<FdDialogHeader>
|
|
67
|
-
<h1 className="text-lg font-bold">{propertyMeta.displayName}</h1>
|
|
68
|
-
</FdDialogHeader>
|
|
69
|
-
{uiResourceMeta?.resourceMeta && (<div className="flex flex-row items-center justify-start gap-1">
|
|
70
|
-
<FdResourceFilterList ref={resourceFilterListRef} uiResourceMeta={uiResourceMeta} stateKey={`${FdResourceFilterList.displayName}_${uiResourceMeta.resourceMeta.id}_browser`} onFilterChange={onRefreshResources} parentContextName={contextName} showRefreshButton={true} showResetButton={false} onRefreshResources={onRefreshResources}/>
|
|
71
|
-
</div>)}
|
|
72
|
-
{propertyMeta && resources && (<div className="flex size-full overflow-auto">
|
|
73
|
-
<FdTable id={elements.table.tableElementId + elements.browserDialog.browserDialogElementId} items={resources} uiResourceMeta={uiResourceMeta} onPaging={onPaging} tableConfig={tableConfig} externalSorting={false} onRowClick={onItemSelected} rowHighlightBehaviour={rowHighlightBehaviors.pointer} pageSize={6} adaptiveWidth={true} onRefreshItems={onRefreshResources}/>
|
|
74
|
-
</div>)}
|
|
75
|
-
<FdDialogFooter>
|
|
76
|
-
{propertyMeta?.required && (<FdDialogClose asChild>
|
|
77
|
-
<FdButton onClick={onCancel} className="ml-4 min-w-20" variant="outline">
|
|
78
|
-
Cancel
|
|
79
|
-
</FdButton>
|
|
80
|
-
</FdDialogClose>)}
|
|
81
|
-
<FdDialogClose asChild>
|
|
82
|
-
<FdButton onClick={onClear} className="ml-4 min-w-20" variant="outline">
|
|
83
|
-
Clear
|
|
84
|
-
</FdButton>
|
|
85
|
-
</FdDialogClose>
|
|
86
|
-
</FdDialogFooter>
|
|
87
|
-
</FdDialogContent>
|
|
88
|
-
</FdDialog>);
|
|
89
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import React, { useCallback, useState } from "react";
|
|
3
|
-
import { closeDialog, onMultiBrowserInputUpdate, } from "@meta/browsers/base-multi-browser/FdBaseMultiBrowser.funcs";
|
|
4
|
-
import { getManyToManyBrowserRelatedResourcePropertyMeta, writeValue, } from "@meta/browsers/many-to-many-browser/FdManyToManyBrowser.funcs";
|
|
5
|
-
import { useAsyncEffect } from "@fd-toolbox/hooks/use-async-effect";
|
|
6
|
-
import { FdBaseMultiBrowser } from "@meta/browsers/base-multi-browser/FdBaseMultiBrowser";
|
|
7
|
-
import { elements } from "@fd-toolbox/constants/elements";
|
|
8
|
-
/**
|
|
9
|
-
* Many-to-many browser component for multiple resource selection with integrated search dialog.
|
|
10
|
-
* Used for many-to-many relationships.
|
|
11
|
-
* @see {@link FdManyToManyBrowserProps} for component props
|
|
12
|
-
*/
|
|
13
|
-
export function FdManyToManyBrowser({ required, propertyMeta, form, onChange, parentContextName: parentContextNameProp, short, disabled, readOnly, relatedResourceId, children: icons, }) {
|
|
14
|
-
const [propertyResourceMeta, setPropertyResourceMeta] = useState();
|
|
15
|
-
const [selectedResources, setSelectedResources] = useState([]);
|
|
16
|
-
const [relatedResourcePropertyMeta, setRelatedResourcePropertyMeta] = useState();
|
|
17
|
-
const [loadComplete, setLoadComplete] = useState(false);
|
|
18
|
-
const parentContextName = parentContextNameProp ?? "";
|
|
19
|
-
const contextName = `${parentContextName}${elements.multiBrowser.FdManyToManyBrowser}`;
|
|
20
|
-
useAsyncEffect(async () => {
|
|
21
|
-
await writeValue(propertyMeta, setSelectedResources, setPropertyResourceMeta, setLoadComplete, setRelatedResourcePropertyMeta, propertyResourceMeta, relatedResourceId, form?.setValue);
|
|
22
|
-
}, [propertyMeta.name]);
|
|
23
|
-
const onCloseDialog = useCallback((resources) => {
|
|
24
|
-
closeDialog(resources, setSelectedResources, propertyMeta, setPropertyResourceMeta, propertyResourceMeta, onChange);
|
|
25
|
-
}, [onChange, propertyMeta, propertyResourceMeta]);
|
|
26
|
-
const onInputModelChange = useCallback((e) => onMultiBrowserInputUpdate(e.target.value, setSelectedResources, propertyResourceMeta, onChange), [onChange, propertyResourceMeta]);
|
|
27
|
-
const onSetRelatedResourcePropertyMeta = useCallback(async () => {
|
|
28
|
-
setRelatedResourcePropertyMeta(await getManyToManyBrowserRelatedResourcePropertyMeta(propertyMeta));
|
|
29
|
-
}, [propertyMeta]);
|
|
30
|
-
return (<FdBaseMultiBrowser parentContextName={contextName} required={required} propertyMeta={propertyMeta} form={form} relatedResourceId={relatedResourceId} selectedResources={selectedResources} onCloseDialog={onCloseDialog} onDescriptionChange={onInputModelChange} short={short} disabled={disabled} readOnly={readOnly} relatedResourcePropertyMeta={relatedResourcePropertyMeta} setSelectedResources={setSelectedResources} onSetRelatedResourcePropertyMeta={onSetRelatedResourcePropertyMeta} propertyResourceMeta={propertyResourceMeta} skipAnimationOnce={!loadComplete}>
|
|
31
|
-
{icons}
|
|
32
|
-
</FdBaseMultiBrowser>);
|
|
33
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import React, { useCallback, useState } from "react";
|
|
3
|
-
import { handleInputModelChange, onInitMultiBrowser, } from "@meta/browsers/multi-browser/FdMultiBrowser.funcs";
|
|
4
|
-
import { FdBaseMultiBrowser } from "@meta/browsers/base-multi-browser/FdBaseMultiBrowser";
|
|
5
|
-
import { closeDialog } from "@meta/browsers/base-multi-browser/FdBaseMultiBrowser.funcs";
|
|
6
|
-
import { useAsyncEffect } from "@fd-toolbox/hooks/use-async-effect";
|
|
7
|
-
import { elements } from "@fd-toolbox/constants/elements";
|
|
8
|
-
/**
|
|
9
|
-
* Multi-browser component for multiple resource selection with integrated search dialog.
|
|
10
|
-
* Used for one-to-many relationships.
|
|
11
|
-
* @see {@link FdMultiBrowserProps} for component props
|
|
12
|
-
*/
|
|
13
|
-
export function FdMultiBrowser({ required, propertyMeta, form, onChange, onClose, parentContextName: parentContextNameProp, short, disabled, readOnly, getSelectedResourcesFromApi, relatedResourceId, selectedResourceIds, setSelectedResourceIds, variant, relatedUiResourceMeta, children: icons, ref, }) {
|
|
14
|
-
const [propertyResourceMeta, setPropertyResourceMeta] = useState(relatedUiResourceMeta?.resourceMeta);
|
|
15
|
-
const [selectedResources, setSelectedResources] = useState([]);
|
|
16
|
-
const [loadComplete, setLoadComplete] = useState(false);
|
|
17
|
-
const parentContextName = parentContextNameProp ?? "";
|
|
18
|
-
const contextName = `${parentContextName}${elements.multiBrowser.FdMultiBrowser}`;
|
|
19
|
-
useAsyncEffect(async () => {
|
|
20
|
-
await onInitMultiBrowser(propertyMeta, setSelectedResources, setPropertyResourceMeta, setLoadComplete, getSelectedResourcesFromApi, propertyResourceMeta, selectedResourceIds, relatedResourceId, setSelectedResourceIds, form?.setValue);
|
|
21
|
-
}, [selectedResourceIds?.join(), relatedResourceId]);
|
|
22
|
-
const onCloseDialog = useCallback((resources) => {
|
|
23
|
-
if (propertyResourceMeta)
|
|
24
|
-
closeDialog(resources, setSelectedResources, propertyMeta, setPropertyResourceMeta, propertyResourceMeta, onChange, onClose);
|
|
25
|
-
}, [onChange, propertyMeta, propertyResourceMeta, onClose]);
|
|
26
|
-
const onInputModelChange = useCallback((e) => {
|
|
27
|
-
handleInputModelChange(e, setSelectedResources, onChange, propertyResourceMeta);
|
|
28
|
-
}, [onChange, propertyResourceMeta]);
|
|
29
|
-
return (<FdBaseMultiBrowser parentContextName={contextName} required={required ?? false} propertyMeta={propertyMeta} form={form} relatedResourceId={relatedResourceId} selectedResources={selectedResources} onCloseDialog={onCloseDialog} onDescriptionChange={onInputModelChange} short={short} disabled={disabled} readOnly={readOnly} propertyResourceMeta={propertyResourceMeta} onChange={onChange} setSelectedResources={setSelectedResources} setSelectedResourceIds={setSelectedResourceIds} skipAnimationOnce={!loadComplete} variant={variant ?? "float"} relatedUiResourceMeta={relatedUiResourceMeta} ref={ref}>
|
|
30
|
-
{icons}
|
|
31
|
-
</FdBaseMultiBrowser>);
|
|
32
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { useMemo } from "react";
|
|
2
|
-
import { cn } from "@fd-toolbox/lib/utils";
|
|
3
|
-
import { cardListLayouts } from "@fd-toolbox/constants/card-list-configs";
|
|
4
|
-
import { getCardConfig } from "@meta/card-list/config/card-config";
|
|
5
|
-
import { FdCard } from "@meta/card-list/card/FdCard";
|
|
6
|
-
import { tableDisplayModes } from "@fd-toolbox/enums/enums";
|
|
7
|
-
import { resourceEditModes } from "@fd-toolbox/constants/resource-list-configs-enums";
|
|
8
|
-
import { ResourceAddButton } from "@meta/resource-list/resource-add-button";
|
|
9
|
-
/**
|
|
10
|
-
* This component renders in a card-based interface with support for different
|
|
11
|
-
* layouts and includes an add button for creating new resources.
|
|
12
|
-
*
|
|
13
|
-
* @param props - {@link FdCardListProps}
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* ```tsx
|
|
17
|
-
* <FdCardList
|
|
18
|
-
* onRefreshResources={onRefreshResources}
|
|
19
|
-
* uiResourceMeta={uiResourceMeta}
|
|
20
|
-
* resources={resourcesState}
|
|
21
|
-
* displayMode={tableDisplayModes.default}
|
|
22
|
-
* />
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
export function FdCardList({ onRefreshResources, config, uiResourceMeta, resources, itemDeleted, displayMode, }) {
|
|
26
|
-
const cardConfig = config ?? getCardConfig();
|
|
27
|
-
const layoutClasses = useMemo(() => cn("flex w-full gap-2 p-2", {
|
|
28
|
-
"flex-col": cardConfig.layout === cardListLayouts.horizontal,
|
|
29
|
-
"flex-wrap": cardConfig.layout === cardListLayouts.vertical,
|
|
30
|
-
}), [cardConfig.layout]);
|
|
31
|
-
return (<div className={layoutClasses}>
|
|
32
|
-
{uiResourceMeta && (<div className="pl-2">
|
|
33
|
-
<ResourceAddButton resourceName={uiResourceMeta.resourceMeta.resourceName} onRefreshResources={onRefreshResources} editMode={resourceEditModes.simple}/>
|
|
34
|
-
</div>)}
|
|
35
|
-
{resources &&
|
|
36
|
-
resources?.length > 0 &&
|
|
37
|
-
uiResourceMeta &&
|
|
38
|
-
resources.map((resource) => (<FdCard key={resource.id} resource={resource} uiResourceMeta={uiResourceMeta} cardConfig={cardConfig} itemDeleted={itemDeleted} onRefreshResources={onRefreshResources} displayMode={displayMode ?? tableDisplayModes.default}/>))}
|
|
39
|
-
</div>);
|
|
40
|
-
}
|