@fernir2/saas-kit-cli 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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,44 +0,0 @@
|
|
|
1
|
-
import { useMemo, useCallback, useState } from "react";
|
|
2
|
-
import { cn } from "@fd-toolbox/lib/utils";
|
|
3
|
-
import { FdCard as Card } from "@fd-component-toolbox/card/FdCard";
|
|
4
|
-
import { cardListLayouts } from "@fd-toolbox/constants/card-list-configs";
|
|
5
|
-
import { useAsyncEffect } from "@fd-toolbox/hooks/use-async-effect";
|
|
6
|
-
import { getResourceUrl } from "@meta/services/meta-navigations";
|
|
7
|
-
import { routes } from "@fd-toolbox/routing/routes";
|
|
8
|
-
import { silentChangeUrl } from "@fd-toolbox/routing/routers";
|
|
9
|
-
import { handleDialogResponse, initCard } from "@meta/card-list/card/FdCard.funcs";
|
|
10
|
-
import { FdCardImage } from "@meta/card-list/card/image-block/FdCardImage";
|
|
11
|
-
import { FdCardContentBlock } from "@meta/card-list/card/content-block/FdCardContentBlock";
|
|
12
|
-
import { FdCardActionBlock } from "@meta/card-list/card/action-block/FdCardActionBlock";
|
|
13
|
-
export function FdCard({ cardConfig, uiResourceMeta, resource, itemDeleted, onRefreshResources, displayMode, }) {
|
|
14
|
-
const [item, setItem] = useState();
|
|
15
|
-
const [imageUrl, setImageUrl] = useState();
|
|
16
|
-
const [shouldShowEditButton, setShouldShowEditButton] = useState(false);
|
|
17
|
-
const [shouldShowViewButton, setShouldShowViewButton] = useState(false);
|
|
18
|
-
const [shouldShowDeleteButton, setShouldShowDeleteButton] = useState(false);
|
|
19
|
-
const resourceName = uiResourceMeta.resourceMeta.resourceName;
|
|
20
|
-
const isHorizontal = useMemo(() => cardConfig.layout === cardListLayouts.horizontal, [cardConfig.layout]);
|
|
21
|
-
const isVertical = useMemo(() => cardConfig.layout === cardListLayouts.vertical, [cardConfig.layout]);
|
|
22
|
-
useAsyncEffect(async () => {
|
|
23
|
-
await initCard(uiResourceMeta, resource, setItem, setImageUrl, setShouldShowEditButton, setShouldShowViewButton, setShouldShowDeleteButton);
|
|
24
|
-
}, [uiResourceMeta, resource]);
|
|
25
|
-
const onDialogResponse = useCallback((isYes) => {
|
|
26
|
-
handleDialogResponse(isYes, resource, uiResourceMeta, resourceName, itemDeleted);
|
|
27
|
-
}, [itemDeleted, resourceName, uiResourceMeta, resource]);
|
|
28
|
-
const onViewClick = useCallback(() => {
|
|
29
|
-
if (item) {
|
|
30
|
-
const url = getResourceUrl(routes.view, resourceName, item.id);
|
|
31
|
-
silentChangeUrl(url);
|
|
32
|
-
}
|
|
33
|
-
}, [item, resourceName]);
|
|
34
|
-
return (<Card className={cn("relative flex rounded-sm shadow-sm", {
|
|
35
|
-
"flex-row": isHorizontal,
|
|
36
|
-
"w-64 flex-col": isVertical,
|
|
37
|
-
})}>
|
|
38
|
-
<FdCardImage imageUrl={imageUrl} isHorizontal={isHorizontal} isVertical={isVertical}/>
|
|
39
|
-
|
|
40
|
-
{item && <FdCardContentBlock uiResourceMeta={uiResourceMeta} item={item} resource={resource}/>}
|
|
41
|
-
|
|
42
|
-
{item && (<FdCardActionBlock resourceId={resource.id} uiResourceMeta={uiResourceMeta} shouldShowEditButton={shouldShowEditButton} shouldShowViewButton={shouldShowViewButton} shouldShowDeleteButton={shouldShowDeleteButton} onDialogResponse={onDialogResponse} onRefreshResources={onRefreshResources} onViewClick={onViewClick} actionType={displayMode}/>)}
|
|
43
|
-
</Card>);
|
|
44
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { useCallback, useState } from "react";
|
|
2
|
-
import { FdDropdownMenu, FdDropdownMenuContent, FdDropdownMenuTrigger, } from "@fd-component-toolbox/dropdown-menu/FdDropdownMenu";
|
|
3
|
-
import { FdButton } from "@fd-component-toolbox/button/FdButton";
|
|
4
|
-
import { FdIcon, iconNames } from "@fd-component-toolbox/icon/FdIcon";
|
|
5
|
-
import { FdViewSheet } from "@meta/view/FdViewSheet";
|
|
6
|
-
import { YesOrNoDialog } from "@fd-component-toolbox/dialog/YesOrNoDialog";
|
|
7
|
-
import { messages } from "@fd-toolbox-core/constants/messages-constants";
|
|
8
|
-
import { tableActionTypes } from "@fd-toolbox/enums/enums";
|
|
9
|
-
import { tabsNames } from "@meta/view/view-constants";
|
|
10
|
-
import { resourceEditModes } from "@fd-toolbox/constants/resource-list-configs-enums";
|
|
11
|
-
/**
|
|
12
|
-
* Card action block displays a dropdown menu with available actions such as view, edit, and delete.
|
|
13
|
-
*
|
|
14
|
-
* @param props - {@link FdCardActionBlockProps}
|
|
15
|
-
*/
|
|
16
|
-
export function FdCardActionBlock({ resourceId, uiResourceMeta, actionType, onDialogResponse, shouldShowDeleteButton, shouldShowEditButton, shouldShowViewButton, onRefreshResources, onViewClick, }) {
|
|
17
|
-
const [dropdownOpen, setDropdownOpen] = useState(false);
|
|
18
|
-
const resourceName = uiResourceMeta.resourceMeta.resourceName;
|
|
19
|
-
const onDropdownOpenChange = useCallback((open) => {
|
|
20
|
-
setDropdownOpen(open);
|
|
21
|
-
}, []);
|
|
22
|
-
return (<div className="absolute right-2 top-2">
|
|
23
|
-
{actionType === tableActionTypes.minimal &&
|
|
24
|
-
(shouldShowEditButton ?? shouldShowViewButton ?? shouldShowDeleteButton) && (<FdDropdownMenu open={dropdownOpen} onOpenChange={onDropdownOpenChange}>
|
|
25
|
-
<FdDropdownMenuTrigger asChild>
|
|
26
|
-
<FdButton size="icon" variant="ghost" className="size-5 p-1">
|
|
27
|
-
<FdIcon name={iconNames.dotsVerticalIcon}/>
|
|
28
|
-
</FdButton>
|
|
29
|
-
</FdDropdownMenuTrigger>
|
|
30
|
-
<FdDropdownMenuContent align="end" className="top-2 z-50 mt-2 box-border min-w-20 rounded-md border bg-background">
|
|
31
|
-
{shouldShowViewButton && (<div className="flex select-none items-center rounded-sm text-sm outline-none transition-colors hover:bg-accent focus:bg-accent">
|
|
32
|
-
<FdViewSheet id={resourceId} resourceName={resourceName} onRefreshResources={onRefreshResources} onEditClick={onViewClick} onCloseClick={setDropdownOpen} editMode={resourceEditModes.simple}>
|
|
33
|
-
<div className="flex cursor-pointer items-center gap-2 px-1.5 py-1 text-muted-foreground">
|
|
34
|
-
<FdIcon name={iconNames.visibility}/>
|
|
35
|
-
<p>View</p>
|
|
36
|
-
</div>
|
|
37
|
-
</FdViewSheet>
|
|
38
|
-
</div>)}
|
|
39
|
-
{shouldShowDeleteButton && (<div className="flex select-none items-center rounded-sm text-sm outline-none transition-colors hover:bg-accent focus:bg-accent">
|
|
40
|
-
<YesOrNoDialog title={messages.deleteConfirmation} onResponse={onDialogResponse} onCloseClick={setDropdownOpen} trigger={<div className="flex cursor-pointer items-center gap-2 px-1.5 py-1 text-muted-foreground">
|
|
41
|
-
<FdIcon name={iconNames.trash}/>
|
|
42
|
-
<p>Delete</p>
|
|
43
|
-
</div>}/>
|
|
44
|
-
</div>)}
|
|
45
|
-
</FdDropdownMenuContent>
|
|
46
|
-
</FdDropdownMenu>)}
|
|
47
|
-
|
|
48
|
-
{actionType === tableActionTypes.default && shouldShowDeleteButton && (<FdDropdownMenu open={dropdownOpen} onOpenChange={onDropdownOpenChange}>
|
|
49
|
-
<FdDropdownMenuTrigger asChild>
|
|
50
|
-
<FdButton size="icon" variant="ghost" className="size-5 p-1">
|
|
51
|
-
<FdIcon name={iconNames.dotsVerticalIcon}/>
|
|
52
|
-
</FdButton>
|
|
53
|
-
</FdDropdownMenuTrigger>
|
|
54
|
-
<FdDropdownMenuContent align="end" className="top-2 z-50 mt-2 box-border min-w-20 rounded-md border bg-background">
|
|
55
|
-
<div className="flex select-none items-center rounded-sm text-sm outline-none transition-colors hover:bg-accent focus:bg-accent">
|
|
56
|
-
<FdViewSheet id={resourceId} resourceName={resourceName} onRefreshResources={onRefreshResources} onEditClick={onViewClick} defaultTab={tabsNames.comments} editMode={resourceEditModes.default}>
|
|
57
|
-
<div className="flex cursor-pointer items-center gap-2 px-1.5 py-1 text-muted-foreground">
|
|
58
|
-
<p>Comments</p>
|
|
59
|
-
</div>
|
|
60
|
-
</FdViewSheet>
|
|
61
|
-
</div>
|
|
62
|
-
{shouldShowDeleteButton && (<div className="flex select-none items-center rounded-sm text-sm outline-none transition-colors hover:bg-accent focus:bg-accent">
|
|
63
|
-
<YesOrNoDialog title={messages.deleteConfirmation} onResponse={onDialogResponse} onCloseClick={setDropdownOpen} trigger={<div className="flex cursor-pointer items-center gap-2 px-1.5 py-1 text-muted-foreground">
|
|
64
|
-
<p>Delete</p>
|
|
65
|
-
</div>}/>
|
|
66
|
-
</div>)}
|
|
67
|
-
</FdDropdownMenuContent>
|
|
68
|
-
</FdDropdownMenu>)}
|
|
69
|
-
</div>);
|
|
70
|
-
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { useCallback } from "react";
|
|
2
|
-
import { FdFrameworkImage } from "@fd-component-toolbox/client/framework";
|
|
3
|
-
import { FdCardFooter } from "@fd-component-toolbox/card/FdCard";
|
|
4
|
-
import { getBackgroundColorClassName, getRelatedResourceImageUrl, isColorful, isDescriptionProperty, isExpandProperty, onViewClick, prepareDisplayableProperties, } from "@meta/card-list/card/content-block/FdCardContentBlock.funcs";
|
|
5
|
-
import { FdFadeOutText } from "@fd-component-toolbox/fade-out-text/FdFadeOutText";
|
|
6
|
-
import { isEmail, isUrl } from "@meta/core/property-types";
|
|
7
|
-
import FdLink from "@fd-component-toolbox/link/FdLink";
|
|
8
|
-
import { getAbsoluteUrl, getMailToUrl } from "@fd-toolbox/routing/routers";
|
|
9
|
-
import { FdBadge } from "@fd-component-toolbox/badge/FdBadge";
|
|
10
|
-
import { FdViewSheet } from "@meta/view/FdViewSheet";
|
|
11
|
-
import { FdAvatar, FdAvatarFallback, FdAvatarImage } from "@fd-component-toolbox/avatar/FdAvatar";
|
|
12
|
-
import { getOptionalPropertyValue } from "@fd-toolbox/objects/property-value";
|
|
13
|
-
export function FdCardContentBlock({ uiResourceMeta, item, resource }) {
|
|
14
|
-
const resourceName = uiResourceMeta.resourceMeta.resourceName;
|
|
15
|
-
const prepareDisplayablePropertiesCallback = useCallback(() => prepareDisplayableProperties(uiResourceMeta.properties, item, resource.id, uiResourceMeta.resourceMeta.properties), [item, uiResourceMeta.properties, uiResourceMeta.resourceMeta, resource]);
|
|
16
|
-
const renderPropertyValue = (property) => {
|
|
17
|
-
const relationName = property.propertyMeta.relation?.relatedResourceName;
|
|
18
|
-
const relationId = getOptionalPropertyValue(resource, property.name);
|
|
19
|
-
const imageUrl = getRelatedResourceImageUrl(resource, property.propertyMeta);
|
|
20
|
-
if (isEmail(property.propertyMeta.type, property.propertyMeta.typeFormat)) {
|
|
21
|
-
return (<FdLink className="cursor-pointer text-fd-accent hover:cursor-pointer" href={getMailToUrl(property.value)} openInNewTab>
|
|
22
|
-
{property.value}
|
|
23
|
-
</FdLink>);
|
|
24
|
-
}
|
|
25
|
-
if (isColorful(property.propertyMeta, property.uiPropertyMeta)) {
|
|
26
|
-
return (<FdBadge className={`rounded-md px-1 py-px font-normal ${getBackgroundColorClassName(property.name, resource)}`}>
|
|
27
|
-
{property.value}
|
|
28
|
-
</FdBadge>);
|
|
29
|
-
}
|
|
30
|
-
if (isUrl(property.propertyMeta.type, property.propertyMeta.typeFormat)) {
|
|
31
|
-
return (<FdLink className="cursor-pointer text-fd-accent hover:cursor-pointer" href={getAbsoluteUrl(property.value)} openInNewTab>
|
|
32
|
-
{property.value}
|
|
33
|
-
</FdLink>);
|
|
34
|
-
}
|
|
35
|
-
if (isDescriptionProperty(uiResourceMeta.resourceMeta, property.name)) {
|
|
36
|
-
return (<div className="cursor-pointer text-fd-accent hover:cursor-pointer">
|
|
37
|
-
<FdViewSheet id={resource.id} resourceName={resourceName} onEditClick={() => onViewClick(resourceName, item.id)}>
|
|
38
|
-
<p>{property.value}</p>
|
|
39
|
-
</FdViewSheet>
|
|
40
|
-
</div>);
|
|
41
|
-
}
|
|
42
|
-
if (isExpandProperty(property.propertyMeta, relationName, relationId)) {
|
|
43
|
-
return (<div className="flex cursor-pointer items-center text-fd-accent hover:cursor-pointer">
|
|
44
|
-
{imageUrl && (<FdAvatar className="mr-2 size-5">
|
|
45
|
-
<FdAvatarImage />
|
|
46
|
-
<FdAvatarFallback>
|
|
47
|
-
<FdFrameworkImage className="object-fill" src={imageUrl} alt="Resource image" width={40} height={40}/>
|
|
48
|
-
</FdAvatarFallback>
|
|
49
|
-
</FdAvatar>)}
|
|
50
|
-
|
|
51
|
-
<FdViewSheet id={relationId} resourceName={relationName} onEditClick={() => onViewClick(relationName, relationId)}>
|
|
52
|
-
<p>{property.value}</p>
|
|
53
|
-
</FdViewSheet>
|
|
54
|
-
</div>);
|
|
55
|
-
}
|
|
56
|
-
return <p>{property.value}</p>;
|
|
57
|
-
};
|
|
58
|
-
return (<FdCardFooter className="relative w-full flex-col items-start p-2 text-sm">
|
|
59
|
-
{prepareDisplayablePropertiesCallback().map((property) => (<div key={property.key} className="flex w-full flex-row gap-2 text-xs text-subtle-500 lg:text-sm">
|
|
60
|
-
<p>{property.displayName}:</p>
|
|
61
|
-
<FdFadeOutText>{renderPropertyValue(property)}</FdFadeOutText>
|
|
62
|
-
</div>))}
|
|
63
|
-
</FdCardFooter>);
|
|
64
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { FdFrameworkImage } from "@fd-component-toolbox/client/framework";
|
|
2
|
-
import { cn } from "@fd-toolbox/lib/utils";
|
|
3
|
-
export function FdCardImage({ imageUrl, isHorizontal, isVertical }) {
|
|
4
|
-
return (<div className="relative size-64 min-w-64">
|
|
5
|
-
<FdFrameworkImage src={imageUrl ?? "/images/no-image.png"} alt="image" priority layout="fill" className={cn("object-cover object-center", {
|
|
6
|
-
"rounded-s-sm": isHorizontal,
|
|
7
|
-
"rounded-t-sm": isVertical,
|
|
8
|
-
})}/>
|
|
9
|
-
</div>);
|
|
10
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { usePathname, useRouter, useSearchParams } from "next/navigation.js";
|
|
2
|
-
import { useIsClient } from "@fd-toolbox/hooks/use-is-client";
|
|
3
|
-
import { createError } from "@fd-toolbox/errors/errors";
|
|
4
|
-
const ssrRouterError = "Router method {0} is not implemented on the server.";
|
|
5
|
-
const emptyRouter = {
|
|
6
|
-
push: () => {
|
|
7
|
-
throw createError(ssrRouterError.replace("{0}", "push"));
|
|
8
|
-
},
|
|
9
|
-
replace: () => {
|
|
10
|
-
throw createError(ssrRouterError.replace("{0}", "replace"));
|
|
11
|
-
},
|
|
12
|
-
refresh: () => {
|
|
13
|
-
throw createError(ssrRouterError.replace("{0}", "refresh"));
|
|
14
|
-
},
|
|
15
|
-
back: () => {
|
|
16
|
-
throw createError(ssrRouterError.replace("{0}", "back"));
|
|
17
|
-
},
|
|
18
|
-
forward: () => {
|
|
19
|
-
throw createError(ssrRouterError.replace("{0}", "forward"));
|
|
20
|
-
},
|
|
21
|
-
prefetch: async () => {
|
|
22
|
-
throw createError(ssrRouterError.replace("{0}", "prefetch"));
|
|
23
|
-
},
|
|
24
|
-
};
|
|
25
|
-
export function useFdRouter() {
|
|
26
|
-
const router = useRouter();
|
|
27
|
-
const isClient = useIsClient();
|
|
28
|
-
return isClient ? router : emptyRouter;
|
|
29
|
-
}
|
|
30
|
-
export function useFdPathname() {
|
|
31
|
-
const pathname = usePathname();
|
|
32
|
-
const isClient = useIsClient();
|
|
33
|
-
return isClient ? pathname : "";
|
|
34
|
-
}
|
|
35
|
-
export function useFdSearchParams() {
|
|
36
|
-
const searchParams = useSearchParams();
|
|
37
|
-
const isClient = useIsClient();
|
|
38
|
-
return isClient ? searchParams : new URLSearchParams();
|
|
39
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { FdFrameworkImage } from "@fd-component-toolbox/client/framework";
|
|
2
|
-
const userImageUrlConstant = "/images/profile.png";
|
|
3
|
-
/**
|
|
4
|
-
* Comment component displaying user details and comment body.
|
|
5
|
-
*
|
|
6
|
-
* @param props - {@link FdCommentProps}
|
|
7
|
-
*/
|
|
8
|
-
export function FdComment({ body, userImageUrl, userName }) {
|
|
9
|
-
return (<div className="flex gap-4">
|
|
10
|
-
<FdFrameworkImage src={userImageUrl ?? userImageUrlConstant} alt="User image" className="size-8 rounded-full bg-muted" width={32} height={32}/>
|
|
11
|
-
<div className="flex w-fit flex-col gap-1 rounded-md bg-muted px-3 py-2">
|
|
12
|
-
<div className="text-sm font-semibold text-muted-foreground">{userName}</div>
|
|
13
|
-
<div>{body}</div>
|
|
14
|
-
</div>
|
|
15
|
-
</div>);
|
|
16
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
2
|
-
import { getUserDisplayText, initCommentList } from "@meta/comment/FdCommentList.funcs";
|
|
3
|
-
import { FdComment } from "@meta/comment/FdComment";
|
|
4
|
-
import { useAsyncEffect } from "@fd-toolbox/hooks/use-async-effect";
|
|
5
|
-
/**
|
|
6
|
-
* Displays a list of comments for a specific resource.
|
|
7
|
-
*
|
|
8
|
-
* @param props - {@link FdCommentListProps}
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```tsx
|
|
12
|
-
* <FdCommentList
|
|
13
|
-
* resourceName={resourceNames.student}
|
|
14
|
-
* resourceId="123e4567-e89b-12d3-a456-426614174000"
|
|
15
|
-
* resources={studentComments}
|
|
16
|
-
* />
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
19
|
-
export function FdCommentList({ resources, uiResourceMeta, resourceName: resourceMetaId, resourceId, }) {
|
|
20
|
-
const [comments, setComments] = useState(resources);
|
|
21
|
-
const [uiResourceMetaState, setUiResourceMetaState] = useState(uiResourceMeta);
|
|
22
|
-
useAsyncEffect(async () => {
|
|
23
|
-
await initCommentList(setComments, setUiResourceMetaState, uiResourceMetaState, resourceId, resources, resourceMetaId);
|
|
24
|
-
});
|
|
25
|
-
return (<div className="flex w-full flex-col gap-4">
|
|
26
|
-
{comments?.map((comment) => {
|
|
27
|
-
const user = comment.user;
|
|
28
|
-
const userName = getUserDisplayText(user?.firstName, user?.lastName);
|
|
29
|
-
return (<FdComment key={comment.id} body={comment.body} userName={userName} userImageUrl={user?.imageUrl}/>);
|
|
30
|
-
})}
|
|
31
|
-
</div>);
|
|
32
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { FdFrameworkImage } from "@fd-component-toolbox/client/framework";
|
|
3
|
-
import { useCallback, useEffect, useRef, useState } from "react";
|
|
4
|
-
import { imageNotFoundUrl } from "@fd-toolbox/constants/public-files";
|
|
5
|
-
import { FdEditImageActionMenu } from "@meta/components/edit-image/FdEditImageActionMenu";
|
|
6
|
-
import { getEditResourceEditImageId, handleDeleteImage, onEditImageUploadChange, } from "@meta/components/edit-image/FdEditImage.funcs";
|
|
7
|
-
/**
|
|
8
|
-
* Image editor component with upload, change and delete functionality
|
|
9
|
-
*
|
|
10
|
-
* @param props - {@link FdEditImageProps}
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```tsx
|
|
14
|
-
* <FdEditImage
|
|
15
|
-
* form={...}
|
|
16
|
-
* parentContextName="user-profile"
|
|
17
|
-
* initialImageUrl="/images/avatar.jpg"
|
|
18
|
-
* onChange={...}
|
|
19
|
-
* />
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
export function FdEditImage({ form, parentContextName, initialImageUrl, onChange }) {
|
|
23
|
-
const [imageUrl, setImageUrl] = useState();
|
|
24
|
-
const ref = useRef(null);
|
|
25
|
-
useEffect(() => setImageUrl(initialImageUrl), [form, setImageUrl, initialImageUrl]);
|
|
26
|
-
const onFileUploaded = useCallback(async (e) => {
|
|
27
|
-
onEditImageUploadChange(form, setImageUrl, onChange, e.target.files?.[0]);
|
|
28
|
-
}, [form, onChange]);
|
|
29
|
-
const onChangeImage = useCallback(() => {
|
|
30
|
-
if (ref.current) {
|
|
31
|
-
ref.current.click();
|
|
32
|
-
}
|
|
33
|
-
}, [ref]);
|
|
34
|
-
const onDeleteImage = useCallback(() => {
|
|
35
|
-
handleDeleteImage(form, setImageUrl);
|
|
36
|
-
}, [form]);
|
|
37
|
-
return (<div className="group relative m-1 size-16 overflow-visible rounded-full">
|
|
38
|
-
<input ref={ref} type="file" className="hidden" onChange={onFileUploaded}/>
|
|
39
|
-
<FdFrameworkImage id={getEditResourceEditImageId(parentContextName)} src={imageUrl ?? imageNotFoundUrl} alt="Resource Image" width="64" height="64" className="size-16 rounded-full object-cover object-center transition-all hover:blur-xs"/>
|
|
40
|
-
<FdEditImageActionMenu imageUrl={imageUrl} onChange={onChangeImage} onDelete={onDeleteImage}/>
|
|
41
|
-
</div>);
|
|
42
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { FdIcon, iconNames } from "@fd-component-toolbox/icon/FdIcon";
|
|
2
|
-
import { FdButton } from "@fd-component-toolbox/button/FdButton";
|
|
3
|
-
import { tooltipAligns, tooltipAlignsStrings } from "@fd-component-toolbox/tooltip/FdTooltip";
|
|
4
|
-
import { Spinner } from "@fd-component-toolbox/spinner/Spinner";
|
|
5
|
-
const buttonLabels = {
|
|
6
|
-
upload: "Upload",
|
|
7
|
-
edit: "Edit",
|
|
8
|
-
delete: "Delete",
|
|
9
|
-
};
|
|
10
|
-
export function FdEditImageActionMenu({ onChange, onDelete, imageUrl, isLoading, }) {
|
|
11
|
-
return (<div className="absolute left-1/2 top-1/2 hidden -translate-x-1/2 -translate-y-1/2 gap-2 group-hover:flex">
|
|
12
|
-
{isLoading ? (<Spinner />) : (<FdEditImageActionMenuContent onChange={onChange} onDelete={onDelete} imageUrl={imageUrl}/>)}
|
|
13
|
-
</div>);
|
|
14
|
-
}
|
|
15
|
-
function FdEditImageActionMenuContent({ onChange, onDelete, imageUrl }) {
|
|
16
|
-
if (imageUrl) {
|
|
17
|
-
return (<>
|
|
18
|
-
<FdButton variant="icon" onClick={onChange} className="flex size-3 items-center justify-center rounded-sm bg-muted-foreground/45 p-2.5" tooltipText={buttonLabels.edit} tooltipClassName="mt-2" tooltipAlign={tooltipAlignsStrings[tooltipAligns.start]}>
|
|
19
|
-
<FdIcon color="text-fd-tertiary-50" className="absolute" name={iconNames.edit}/>
|
|
20
|
-
</FdButton>
|
|
21
|
-
<FdButton variant="icon" onClick={onDelete} className="flex size-3 items-center justify-center rounded-sm bg-muted-foreground/45 p-2.5" tooltipClassName="mt-2" tooltipText={buttonLabels.delete}>
|
|
22
|
-
<FdIcon className="absolute" name={iconNames.trash} color="text-fd-tertiary-50"/>
|
|
23
|
-
</FdButton>
|
|
24
|
-
</>);
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
<FdButton onClick={onChange} variant="icon" className="flex size-6 items-center justify-center rounded-full bg-muted-foreground/45" tooltipText={buttonLabels.upload} tooltipClassName="mt-2">
|
|
28
|
-
<FdIcon color="text-fd-tertiary-50" className="absolute" name={iconNames.upload}/>
|
|
29
|
-
</FdButton>;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { FdButton } from "@fd-component-toolbox/button/FdButton";
|
|
2
|
-
import { FdIcon, iconNames, iconSizes } from "@fd-component-toolbox/icon/FdIcon";
|
|
3
|
-
import { useCallback, useRef } from "react";
|
|
4
|
-
import { FdTooltip, FdTooltipContent, FdTooltipProvider, FdTooltipTrigger, } from "@fd-component-toolbox/tooltip/FdTooltip";
|
|
5
|
-
const imageConst = {
|
|
6
|
-
change: "Change",
|
|
7
|
-
upload: "Upload",
|
|
8
|
-
};
|
|
9
|
-
export function FdEditImageDropdownMenu({ id, onEdit, onDelete, imageUrl }) {
|
|
10
|
-
const ref = useRef(null);
|
|
11
|
-
const onFileUploaded = useCallback((e) => {
|
|
12
|
-
if (e.target.files) {
|
|
13
|
-
onEdit?.(e.target.files[0]);
|
|
14
|
-
e.target.value = "";
|
|
15
|
-
}
|
|
16
|
-
}, [onEdit]);
|
|
17
|
-
return (<FdTooltipProvider>
|
|
18
|
-
<div className="relative flex size-full items-center justify-center rounded-full opacity-0 transition-all duration-300 hover:bg-fd-accent hover:opacity-60 [&>svg]:size-5">
|
|
19
|
-
<FdTooltip>
|
|
20
|
-
<FdTooltipTrigger asChild>
|
|
21
|
-
<FdButton variant="icon" className="p-1" onClick={() => ref.current?.click()}>
|
|
22
|
-
<FdIcon size={iconSizes.medium} name={iconNames.edit} color="fd-secondary hover:block"/>
|
|
23
|
-
</FdButton>
|
|
24
|
-
</FdTooltipTrigger>
|
|
25
|
-
<FdTooltipContent side="bottom" className="mt-4">
|
|
26
|
-
{imageUrl ? imageConst.change : imageConst.upload}
|
|
27
|
-
</FdTooltipContent>
|
|
28
|
-
</FdTooltip>
|
|
29
|
-
{imageUrl && (<FdTooltip>
|
|
30
|
-
<FdTooltipTrigger asChild>
|
|
31
|
-
<FdButton variant="icon" className="p-1" onClick={onDelete}>
|
|
32
|
-
<FdIcon size={iconSizes.medium} name={iconNames.eraser} color="fd-secondary hover:block"/>
|
|
33
|
-
</FdButton>
|
|
34
|
-
</FdTooltipTrigger>
|
|
35
|
-
<FdTooltipContent side="bottom" className="mt-4">
|
|
36
|
-
Delete
|
|
37
|
-
</FdTooltipContent>
|
|
38
|
-
</FdTooltip>)}
|
|
39
|
-
</div>
|
|
40
|
-
<input ref={ref} type="file" className="hidden" onChange={onFileUploaded} id={id}/>
|
|
41
|
-
</FdTooltipProvider>);
|
|
42
|
-
}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { FdFrameworkImage } from "@fd-component-toolbox/client/framework";
|
|
3
|
-
import { useCallback, useRef, useState } from "react";
|
|
4
|
-
import { supportedImageTypes, supportedVideoTypes, supportedImageExtensions, supportedVideoExtensions, } from "@fd-toolbox/constants/file-loader-data-types";
|
|
5
|
-
import { FdIcon, iconNames, iconSizes } from "@fd-component-toolbox/icon/FdIcon";
|
|
6
|
-
import { handleFileDelete, onFileUploadHandler, onInitUpload, } from "@meta/components/file-upload/FileUpload.funcs";
|
|
7
|
-
import { FdFormMessage } from "@fd-component-toolbox/form/FdForm";
|
|
8
|
-
import FdLabelAnimation from "@fd-component-toolbox/animation/FdLabelAnimation";
|
|
9
|
-
import { useAsyncEffect } from "@fd-toolbox/hooks/use-async-effect";
|
|
10
|
-
import { cn } from "@fd-toolbox/lib/utils";
|
|
11
|
-
import { FdButton } from "@fd-component-toolbox/button/FdButton";
|
|
12
|
-
import { PreviewMedia } from "@meta/components/file-upload/PreviewMedia";
|
|
13
|
-
/**
|
|
14
|
-
* A component for uploading one or more files with a preview.
|
|
15
|
-
*
|
|
16
|
-
* This component supports drag-and-drop, file selection from the local system,
|
|
17
|
-
* and displays previews for uploaded images and videos. It also includes
|
|
18
|
-
* functionality to delete uploaded files and view them in full-screen.
|
|
19
|
-
*
|
|
20
|
-
* @param props - {@link FileUploadProps}
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* ```tsx
|
|
24
|
-
* const form = useForm();
|
|
25
|
-
*
|
|
26
|
-
* <FileUpload
|
|
27
|
-
* label="Profile Picture"
|
|
28
|
-
* form={form}
|
|
29
|
-
* required={true}
|
|
30
|
-
* allowMultiple={false}
|
|
31
|
-
* />
|
|
32
|
-
* ```
|
|
33
|
-
*/
|
|
34
|
-
export function FileUpload({ allowMultiple, value, required, label, form, formValue, isNew, relatedResourceId, propertyMeta, }) {
|
|
35
|
-
const [files, setFiles] = useState([]);
|
|
36
|
-
const [error, setError] = useState(undefined);
|
|
37
|
-
const [imageValue, setImageValue] = useState(value ?? "");
|
|
38
|
-
const [fullscreenFile, setFullscreenFile] = useState(null);
|
|
39
|
-
const fileInputRef = useRef(null);
|
|
40
|
-
const isMoreFilesAllowed = allowMultiple ?? (!allowMultiple && files.length === 0);
|
|
41
|
-
const hasFile = imageValue !== "" || files.length > 0;
|
|
42
|
-
const acceptedFileFormats = [
|
|
43
|
-
...supportedImageTypes,
|
|
44
|
-
...supportedVideoTypes,
|
|
45
|
-
...supportedImageExtensions,
|
|
46
|
-
...supportedVideoExtensions,
|
|
47
|
-
].join(",");
|
|
48
|
-
useAsyncEffect(async () => {
|
|
49
|
-
if (formValue) {
|
|
50
|
-
onInitUpload(setFiles, formValue);
|
|
51
|
-
}
|
|
52
|
-
}, [formValue]);
|
|
53
|
-
const onFileUpload = useCallback((event) => {
|
|
54
|
-
onFileUploadHandler(isMoreFilesAllowed, setFiles, setError, fileInputRef?.current ?? undefined, event.target?.files ?? undefined, propertyMeta, relatedResourceId, form?.getValues, form?.setValue, isNew);
|
|
55
|
-
}, [
|
|
56
|
-
isMoreFilesAllowed,
|
|
57
|
-
setFiles,
|
|
58
|
-
setError,
|
|
59
|
-
fileInputRef,
|
|
60
|
-
propertyMeta,
|
|
61
|
-
relatedResourceId,
|
|
62
|
-
form?.getValues,
|
|
63
|
-
form?.setValue,
|
|
64
|
-
isNew,
|
|
65
|
-
]);
|
|
66
|
-
const onDelete = useCallback(async (index) => {
|
|
67
|
-
handleFileDelete(index, files, setFiles, setImageValue);
|
|
68
|
-
}, [files, setFiles, setImageValue]);
|
|
69
|
-
return (<>
|
|
70
|
-
<div className="relative mt-1 flex w-full select-none flex-wrap items-center gap-4">
|
|
71
|
-
<FdLabelAnimation label={required ? `${label ?? ""} *` : (label ?? "")} className={cn("absolute left-1.5 -translate-y-5 scale-75", (required && !hasFile) ?? (error && "text-destructive"))}/>
|
|
72
|
-
<input type="file" ref={fileInputRef} multiple={allowMultiple} accept={acceptedFileFormats} id="uploadFileInput" className="hidden" onChange={onFileUpload} required={required}/>
|
|
73
|
-
|
|
74
|
-
{isMoreFilesAllowed && (<FdButton variant="icon" className="size-fit p-0">
|
|
75
|
-
<label htmlFor="uploadFileInput" className="cursor-pointer">
|
|
76
|
-
<div className="flex size-20 items-center justify-center gap-1 rounded-md border border-border bg-transparent hover:bg-muted">
|
|
77
|
-
<FdIcon name={iconNames.upload} color="text-fd-accent"/>
|
|
78
|
-
<span className="text-xs font-medium text-muted-foreground">Upload</span>
|
|
79
|
-
</div>
|
|
80
|
-
</label>
|
|
81
|
-
</FdButton>)}
|
|
82
|
-
|
|
83
|
-
{files.map((file, index) => (<div key={file.url} className="group relative flex size-20 items-center justify-center rounded-md border border-border p-1.5 hover:border-transparent">
|
|
84
|
-
<FdFrameworkImage src={file.preview ?? file.url} alt={`Uploaded file ${index}`} width={128} height={128} className="size-full rounded-md object-cover transition-all group-hover:blur-xs"/>
|
|
85
|
-
|
|
86
|
-
<div className="absolute inset-0 flex items-center justify-center gap-2 opacity-0 transition-opacity group-hover:opacity-100">
|
|
87
|
-
<FdButton variant="icon" className="inset-0 size-full w-fit rounded-md p-0 opacity-0 transition-opacity group-hover:opacity-100" onClick={() => onDelete(index)}>
|
|
88
|
-
<FdIcon name={iconNames.trash} size={iconSizes.extralarge} className="relative z-10 text-fd-tertiary-50 drop-shadow-md"/>
|
|
89
|
-
<div className="absolute inset-0 size-full rounded-md bg-muted-foreground/45"/>
|
|
90
|
-
</FdButton>
|
|
91
|
-
<div className="flex cursor-pointer items-center justify-center rounded-md" onClick={() => setFullscreenFile(file)}>
|
|
92
|
-
<div className="inset-0 rounded-sm bg-muted-foreground/45"/>
|
|
93
|
-
<FdIcon name={file.preview ? iconNames.playIcon : iconNames.image} size={iconSizes.medium} className="relative z-10 text-fd-tertiary-50 drop-shadow-md"/>
|
|
94
|
-
</div>
|
|
95
|
-
</div>
|
|
96
|
-
</div>))}
|
|
97
|
-
</div>
|
|
98
|
-
{required && !hasFile && (<div className="mt-3">
|
|
99
|
-
<FdFormMessage className="-mt-6 text-destructive">{label} is required</FdFormMessage>
|
|
100
|
-
</div>)}
|
|
101
|
-
{fullscreenFile && <PreviewMedia file={fullscreenFile} onClose={() => setFullscreenFile(null)}/>}
|
|
102
|
-
</>);
|
|
103
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { FdFrameworkImage } from "@fd-component-toolbox/client/framework";
|
|
3
|
-
import { FdButton } from "@fd-component-toolbox/button/FdButton";
|
|
4
|
-
import { FdIcon, iconNames } from "@fd-component-toolbox/icon/FdIcon";
|
|
5
|
-
/**
|
|
6
|
-
* A modal component for displaying a full-screen preview of an image or video file.
|
|
7
|
-
*
|
|
8
|
-
* This component overlays the current view to show a larger version of the media.
|
|
9
|
-
* It includes a close button and can render either an `<img />` or a `<video />` element
|
|
10
|
-
* based on the file type.
|
|
11
|
-
*
|
|
12
|
-
* @param props - {@link PreviewMediaProps}
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```tsx
|
|
16
|
-
* const [fullscreenFile, setFullscreenFile] = useState<FileData | null>(null);
|
|
17
|
-
*
|
|
18
|
-
* // ... inside your component
|
|
19
|
-
* {fullscreenFile && (
|
|
20
|
-
* <PreviewMedia
|
|
21
|
-
* file={fullscreenFile}
|
|
22
|
-
* onClose={() => setFullscreenFile(null)}
|
|
23
|
-
* />
|
|
24
|
-
* )}
|
|
25
|
-
* ```
|
|
26
|
-
*/
|
|
27
|
-
export function PreviewMedia({ file, onClose }) {
|
|
28
|
-
return (<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/75">
|
|
29
|
-
<div className="relative max-w-4xl">
|
|
30
|
-
<FdButton onClick={onClose} className="absolute right-4 top-4 z-10">
|
|
31
|
-
<FdIcon name={iconNames.cross2}/>
|
|
32
|
-
</FdButton>
|
|
33
|
-
{file.preview ? (<video src={file.url} controls autoPlay playsInline className="pointer-events-auto max-h-screen max-w-full rounded-lg"/>) : (<FdFrameworkImage src={file.url} alt="Full-screen preview" width={800} height={600} className="rounded-lg"/>)}
|
|
34
|
-
</div>
|
|
35
|
-
</div>);
|
|
36
|
-
}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { cn } from "@fd-toolbox/lib/utils";
|
|
2
|
-
import { fdMultiListTypes, } from "@meta/components/multi-list/multi-list-types";
|
|
3
|
-
import { tableDisplayModes } from "@fd-toolbox/enums/enums";
|
|
4
|
-
import { getItemsListConfig, getMultiListConfig } from "@meta/components/multi-list/FdMultiList.funcs";
|
|
5
|
-
import { useCallback, useMemo, useState } from "react";
|
|
6
|
-
import { ResourceList } from "@meta/resource-list/ResourceList";
|
|
7
|
-
import { useAsyncEffect } from "@fd-toolbox/hooks/use-async-effect";
|
|
8
|
-
import { fetchUiResourceMeta } from "@meta/ui-meta-providers";
|
|
9
|
-
import { resourceNames } from "@fd-toolbox/resources/resource-names";
|
|
10
|
-
import { FdCommentList } from "@meta/comment/FdCommentList";
|
|
11
|
-
import FdMultiListEditResource from "@meta/components/multi-list/FdMultiListEditResource";
|
|
12
|
-
import { ManyToOneTableHeaderCellTemplate } from "@meta/view/view-resource/templates/ManyToOneTableHeaderCellTemplate";
|
|
13
|
-
/**
|
|
14
|
-
* Component for displaying multiple related resource lists with support for different display modes
|
|
15
|
-
*
|
|
16
|
-
* @param FdMultiListProps {@link FdMultiListProps}
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```tsx
|
|
20
|
-
* function MyComponent() {
|
|
21
|
-
* const [multiListItems, setMultiListItems] = useState([]);
|
|
22
|
-
*
|
|
23
|
-
* return (
|
|
24
|
-
* <FdMultiList
|
|
25
|
-
* multiListItems={multiListItems}
|
|
26
|
-
* tableConfig={{excludeColumns: [], customActions: [], editMode: 0}}
|
|
27
|
-
* type={0}
|
|
28
|
-
* />
|
|
29
|
-
* );
|
|
30
|
-
* }
|
|
31
|
-
* ```
|
|
32
|
-
*/
|
|
33
|
-
export function FdMultiList({ multiListItems, className, type, onCustomAction, onMultiListResourceRelationChange, tableConfig: tableConfigProp, commentList, onSavingStarting, onSavingEnding, }) {
|
|
34
|
-
const config = useMemo(() => getMultiListConfig(multiListItems, tableConfigProp), [multiListItems, tableConfigProp]);
|
|
35
|
-
const [uiResourceMeta, setUiResourceMeta] = useState();
|
|
36
|
-
useAsyncEffect(async () => {
|
|
37
|
-
setUiResourceMeta(await fetchUiResourceMeta(resourceNames.comment));
|
|
38
|
-
}, []);
|
|
39
|
-
const getResourceListConfig = useCallback((multiListItem) => {
|
|
40
|
-
return getItemsListConfig(config, multiListItem, RenderManyToOneHeaderCell, onCustomAction, onMultiListResourceRelationChange);
|
|
41
|
-
}, [config, onCustomAction, onMultiListResourceRelationChange]);
|
|
42
|
-
const resourceListConfigs = useMemo(() => {
|
|
43
|
-
return config.items.map(getResourceListConfig);
|
|
44
|
-
}, [config, getResourceListConfig]);
|
|
45
|
-
return (<div className={cn("flex flex-col gap-6 pb-5 lg:pb-0", className)}>
|
|
46
|
-
{type === fdMultiListTypes.resource &&
|
|
47
|
-
config.items.map((multiListItem, index) => (<div key={`${multiListItem.resourceId}_${multiListItem.relatedResourceElementId}_${index}`} id={multiListItem.relatedResourceElementId} className="flex flex-col">
|
|
48
|
-
<ResourceList resourceListConfig={resourceListConfigs[index]} resourceName={multiListItem.resourceName} showFilters={false} filters={multiListItem.filters} displayMode={tableDisplayModes.minimal} isTableRequired={false} pluralName={multiListItem.name}/>
|
|
49
|
-
</div>))}
|
|
50
|
-
{type === fdMultiListTypes.editResource &&
|
|
51
|
-
config.items?.map((multiListItem) => (<FdMultiListEditResource key={`${multiListItem.resourceId}_${multiListItem.relatedResourceElementId}`} multiListItem={multiListItem} onSavingStarting={onSavingStarting} onSavingEnding={onSavingEnding}/>))}
|
|
52
|
-
{commentList && commentList.length > 0 && uiResourceMeta && (<>
|
|
53
|
-
<h1 className="py-3 text-sm font-semibold text-muted-foreground">
|
|
54
|
-
{uiResourceMeta.resourceMeta.display.pluralName}
|
|
55
|
-
</h1>
|
|
56
|
-
<div className="w-full px-0 lg:px-4">
|
|
57
|
-
<FdCommentList resources={commentList} resourceId={uiResourceMeta.resourceMeta.id} resourceName={resourceNames.comment}/>
|
|
58
|
-
</div>
|
|
59
|
-
</>)}
|
|
60
|
-
</div>);
|
|
61
|
-
}
|
|
62
|
-
export default FdMultiList;
|
|
63
|
-
function RenderManyToOneHeaderCell(props, multiListItem, onMultiListResourceRelationChange) {
|
|
64
|
-
return (<ManyToOneTableHeaderCellTemplate parentResourcePropertyMeta={multiListItem.parentResourcePropertyMeta} resourceId={multiListItem.resourceId} multiListItem={multiListItem} onViewMultiListRelationChange={onMultiListResourceRelationChange} onCustomAction={props.onCustomAction}/>);
|
|
65
|
-
}
|