Files
mtdb_movie/bootstrap/ssr/assets/admin-routes-06d8abf9.mjs.map
maher 703f50a09d
Some checks failed
Build / run (push) Has been cancelled
first commit
2025-10-29 11:42:25 +01:00

1 line
1.5 MiB
Executable File

{"version":3,"file":"admin-routes-06d8abf9.mjs","sources":["../../../common/resources/client/admin/admin-sidebar.tsx","../../../common/resources/client/ui/layout/dashboard-layout-context.ts","../../../common/resources/client/utils/hooks/use-block-body-overflow.ts","../../../common/resources/client/ui/layout/dashboard-layout.tsx","../../../common/resources/client/ui/layout/dashboard-content.tsx","../../../common/resources/client/ui/layout/dashboard-sidenav.tsx","../../../common/resources/client/icons/material/MenuOpen.tsx","../../../common/resources/client/ui/layout/dashboard-navbar.tsx","../../../common/resources/client/admin/use-admin-setup-alerts.ts","../../../common/resources/client/admin/admin-layout.tsx","../../../common/resources/client/datatable/filters/timestamp-filters.ts","../../../common/resources/client/admin/users/user-datatable-filters.ts","../../../common/resources/client/datatable/page/data-table-context.ts","../../../common/resources/client/datatable/data-table-pagination-footer.tsx","../../../common/resources/client/datatable/data-table-header.tsx","../../../common/resources/client/datatable/selected-state-datatable-header.tsx","../../../common/resources/client/datatable/data-table.tsx","../../../common/resources/client/datatable/page/data-table-page.tsx","../../../common/resources/client/datatable/requests/delete-selected-rows.ts","../../../common/resources/client/datatable/page/delete-selected-items-action.tsx","../../../common/resources/client/datatable/page/data-table-emty-state-message.tsx","../../../common/resources/client/admin/roles/team.svg","../../../common/resources/client/datatable/data-table-add-item-button.tsx","../../../common/resources/client/icons/material/FileDownload.tsx","../../../common/resources/client/datatable/requests/use-export-csv.ts","../../../common/resources/client/uploads/utils/download-file-from-url.ts","../../../common/resources/client/datatable/csv-export/csv-export-info-dialog.tsx","../../../common/resources/client/datatable/csv-export/data-table-export-csv-button.tsx","../../../common/resources/client/icons/material/PersonOff.tsx","../../../common/resources/client/admin/users/requests/use-ban-user.ts","../../../common/resources/client/ui/forms/input-field/date/date-picker/use-date-picker-state.ts","../../../common/resources/client/ui/forms/input-field/date/date-picker/date-picker.tsx","../../../common/resources/client/admin/users/ban-user-dialog.tsx","../../../common/resources/client/admin/users/requests/use-unban-user.ts","../../../common/resources/client/admin/users/requests/use-impersonate-user.ts","../../../common/resources/client/admin/users/user-datatable-columns.tsx","../../../common/resources/client/admin/users/user-datatable.tsx","../../../common/resources/client/utils/array/chunk-array.ts","../../../common/resources/client/admin/appearance/config/default-appearance-config.ts","../../../common/resources/client/admin/appearance/appearance-button.tsx","../../../common/resources/client/admin/appearance/sections/themes/color-icon.tsx","../../../common/resources/client/ui/color-picker/color-swatch.tsx","../../../common/resources/client/ui/color-picker/color-presets.ts","../../../common/resources/client/ui/color-picker/color-picker.tsx","../../../common/resources/client/ui/color-picker/color-picker-dialog.tsx","../../../resources/client/admin/appearance/sections/landing-page-section/landing-page-section-general.tsx","../../../common/resources/client/utils/string/uc-first.ts","../../../common/resources/client/auth/ui/permission-selector.tsx","../../../common/resources/client/admin/appearance/sections/menus/hooks/available-routes.ts","../../../common/resources/client/ui/icon-picker/icon-grid-style.ts","../../../common/resources/client/ui/icon-picker/icon-picker.tsx","../../../common/resources/client/ui/icon-picker/icon-picker-dialog.tsx","../../../common/resources/client/admin/menus/menu-item-form.tsx","../../../resources/client/admin/appearance/sections/landing-page-section/landing-page-section-action-buttons.tsx","../../../resources/client/admin/appearance/sections/landing-page-section/landing-page-section-primary-features.tsx","../../../resources/client/admin/appearance/sections/landing-page-section/landing-page-section-secondary-features.tsx","../../../resources/client/admin/appearance/app-appearance-config.tsx","../../../common/resources/client/admin/appearance/config/merged-appearance-config.ts","../../../common/resources/client/admin/appearance/appearance-store.ts","../../../common/resources/client/admin/appearance/requests/save-appearance-changes.ts","../../../common/resources/client/admin/appearance/requests/appearance-values.ts","../../../common/resources/client/admin/appearance/section-header.tsx","../../../common/resources/client/admin/appearance/appearance-layout.tsx","../../../common/resources/client/admin/appearance/sections/menus/menu-list.tsx","../../../common/resources/client/admin/appearance/sections/menus/add-menu-item-dialog.tsx","../../../common/resources/client/icons/material/DragIndicator.tsx","../../../common/resources/client/icons/material/Delete.tsx","../../../common/resources/client/admin/appearance/sections/menus/dropdown-menu.svg","../../../common/resources/client/admin/appearance/sections/menus/menu-editor.tsx","../../../common/resources/client/admin/appearance/sections/menus/menu-item-editor.tsx","../../../common/resources/client/admin/appearance/sections/general-section.tsx","../../../common/resources/client/utils/string/random-number.ts","../../../common/resources/client/admin/appearance/sections/themes/theme-list.tsx","../../../common/resources/client/ace-editor/ace-dialog.tsx","../../../common/resources/client/admin/appearance/sections/seo/use-seo-tags.ts","../../../common/resources/client/admin/appearance/sections/seo/use-update-seo-tags.ts","../../../common/resources/client/admin/appearance/sections/seo/seo-section.tsx","../../../common/resources/client/admin/appearance/sections/code/custom-code-section.tsx","../../../common/resources/client/admin/custom-pages/articles.svg","../../../common/resources/client/auth/user.ts","../../../common/resources/client/admin/custom-pages/custom-page-datatable-filters.tsx","../../../common/resources/client/admin/custom-pages/custom-page-datatable-columns.tsx","../../../common/resources/client/admin/custom-pages/custom-page-datable-page.tsx","../../../resources/client/admin/settings/app-settings-nav-config.ts","../../../common/resources/client/admin/settings/settings-nav-config.ts","../../../common/resources/client/admin/settings/settings-layout.tsx","../../../common/resources/client/admin/settings/requests/use-admin-settings.ts","../../../common/resources/client/admin/settings/generate-sitemap.ts","../../../common/resources/client/admin/settings/requests/update-admin-settings.ts","../../../common/resources/client/admin/settings/settings-panel.tsx","../../../common/resources/client/admin/settings/settings-separator.tsx","../../../common/resources/client/icons/material/Link.tsx","../../../common/resources/client/admin/settings/learn-more-link.tsx","../../../common/resources/client/admin/settings/pages/general-settings.tsx","../../../common/resources/client/ui/themes/utils/color-to-theme-value.ts","../../../common/resources/client/admin/appearance/sections/themes/theme-settings-dialog-trigger.tsx","../../../common/resources/client/icons/material/RestartAlt.tsx","../../../common/resources/client/admin/appearance/sections/themes/theme-more-options-button.tsx","../../../common/resources/client/admin/appearance/sections/themes/navbar-color-picker.tsx","../../../common/resources/client/ui/themes/utils/theme-value-to-hex.ts","../../../common/resources/client/admin/appearance/sections/themes/theme-editor.tsx","../../../common/resources/client/admin/settings/json-chip-field.tsx","../../../resources/client/admin/settings/video-settings.tsx","../../../common/resources/client/ui/tabs/tab-panels.tsx","../../../resources/client/admin/settings/content-settings/content-settings-general-panel.tsx","../../../common/resources/client/admin/settings/settings-error-group.tsx","../../../resources/client/admin/settings/content-settings/content-settings-automation-panel.tsx","../../../resources/client/admin/settings/content-settings/content-settings-title-page-panel.tsx","../../../resources/client/admin/settings/content-settings/content-settings.tsx","../../../common/resources/client/admin/settings/pages/search-settings/requests/use-search-models.ts","../../../common/resources/client/admin/settings/pages/search-settings/requests/use-import-search-models.ts","../../../common/resources/client/admin/settings/pages/search-settings/search-settings.tsx","../../../resources/client/admin/settings/app-settings-routes.tsx","../../../common/resources/client/admin/settings/pages/subscription-settings.tsx","../../../common/resources/client/admin/settings/pages/localization-settings.tsx","../../../common/resources/client/admin/settings/pages/authentication-settings.tsx","../../../common/resources/client/admin/settings/pages/uploading-settings/max-server-upload-size.ts","../../../common/resources/client/uploads/utils/space-units.ts","../../../common/resources/client/uploads/utils/convert-to-bytes.ts","../../../common/resources/client/ui/forms/input-field/file-size-field.tsx","../../../common/resources/client/admin/settings/pages/uploading-settings/use-upload-s3-cors.ts","../../../common/resources/client/admin/settings/pages/uploading-settings/dropbox-form/use-generate-dropbox-refresh-token.ts","../../../common/resources/client/admin/settings/pages/uploading-settings/dropbox-form/dropbox-form.tsx","../../../common/resources/client/admin/settings/pages/uploading-settings/uploading-settings.tsx","../../../common/resources/client/admin/settings/pages/mail-settings/mailgun-credentials.tsx","../../../common/resources/client/admin/settings/pages/mail-settings/smtp-credentials.tsx","../../../common/resources/client/admin/settings/pages/mail-settings/ses-credentials.tsx","../../../common/resources/client/admin/settings/pages/mail-settings/postmark-credentials.tsx","../../../common/resources/client/admin/settings/pages/mail-settings/gmail-icon.tsx","../../../common/resources/client/admin/settings/pages/mail-settings/connect-gmail-panel.tsx","../../../common/resources/client/admin/settings/pages/mail-settings/outgoing-mail-group.tsx","../../../common/resources/client/admin/settings/pages/mail-settings/outgoing-email-settings.tsx","../../../common/resources/client/admin/settings/pages/cache-settings/clear-cache.ts","../../../common/resources/client/admin/settings/pages/cache-settings/cache-settings.tsx","../../../common/resources/client/admin/settings/pages/logging-settings.tsx","../../../common/resources/client/admin/settings/pages/queue-settings.tsx","../../../common/resources/client/admin/settings/pages/recaptcha-settings.tsx","../../../common/resources/client/ui/forms/input-field/file-field.tsx","../../../common/resources/client/admin/settings/pages/reports-settings.tsx","../../../common/resources/client/admin/users/requests/update-user.ts","../../../common/resources/client/admin/users/crupdate-user-form.tsx","../../../common/resources/client/icons/material/Report.tsx","../../../common/resources/client/admin/users/update-user-page.tsx","../../../common/resources/client/admin/users/requests/create-user.ts","../../../common/resources/client/admin/users/create-user-page.tsx","../../../common/resources/client/icons/material/Translate.tsx","../../../common/resources/client/admin/translations/use-locale-with-lines.ts","../../../common/resources/client/admin/translations/update-localization.ts","../../../common/resources/client/admin/translations/update-localization-dialog.tsx","../../../common/resources/client/admin/translations/create-localization.ts","../../../common/resources/client/admin/translations/create-localization-dialog.tsx","../../../common/resources/client/admin/translations/around-the-world.svg","../../../common/resources/client/admin/translations/use-upload-translation-file.ts","../../../common/resources/client/admin/translations/localization-index.tsx","../../../common/resources/client/admin/translations/new-translation-dialog.tsx","../../../common/resources/client/admin/translations/translation-management-page.tsx","../../../common/resources/client/admin/ads/ads-page.tsx","../../../common/resources/client/admin/appearance/section-list.tsx","../../../common/resources/client/admin/roles/role-index-page-filters.ts","../../../common/resources/client/admin/roles/roles-index-page.tsx","../../../common/resources/client/admin/roles/requests/use-role.ts","../../../common/resources/client/admin/roles/requests/use-update-role.ts","../../../common/resources/client/admin/roles/crupdate-role-page/crupdate-role-settings-panel.tsx","../../../common/resources/client/users/select-user-dialog.tsx","../../../common/resources/client/admin/roles/requests/use-remove-users-from-role.ts","../../../common/resources/client/admin/roles/requests/use-add-users-to-role.ts","../../../common/resources/client/admin/roles/crupdate-role-page/edit-role-page-users-panel.tsx","../../../common/resources/client/admin/roles/crupdate-role-page/edit-role-page.tsx","../../../common/resources/client/admin/roles/requests/user-create-role.ts","../../../common/resources/client/admin/roles/crupdate-role-page/create-role-page.tsx","../../../common/resources/client/admin/tags/tag-index-page-filters.ts","../../../common/resources/client/admin/tags/software-engineer.svg","../../../common/resources/client/admin/tags/crupdate-tag-form.tsx","../../../common/resources/client/admin/tags/requests/use-create-new-tag.ts","../../../common/resources/client/admin/tags/create-tag-dialog.tsx","../../../common/resources/client/admin/tags/requests/use-update-tag.ts","../../../common/resources/client/admin/tags/update-tag-dialog.tsx","../../../common/resources/client/admin/tags/tag-index-page.tsx","../../../common/resources/client/uploads/formatted-bytes.tsx","../../../common/resources/client/icons/material/Visibility.tsx","../../../common/resources/client/admin/file-entry/upload.svg","../../../common/resources/client/uploads/hooks/file-entry-urls.ts","../../../common/resources/client/uploads/preview/file-preview-context.ts","../../../common/resources/client/uploads/preview/file-preview/default-file-preview.tsx","../../../common/resources/client/uploads/preview/file-preview/image-file-preview.tsx","../../../common/resources/client/uploads/preview/file-preview/text-file-preview.tsx","../../../common/resources/client/uploads/preview/file-preview/video-file-preview.tsx","../../../common/resources/client/uploads/preview/file-preview/audio-file-preview.tsx","../../../common/resources/client/uploads/preview/file-preview/pdf-file-preview.tsx","../../../common/resources/client/uploads/preview/file-preview/word-document-file-preview.tsx","../../../common/resources/client/uploads/preview/available-previews.ts","../../../common/resources/client/uploads/file-type-icon/icons/default-file-icon.tsx","../../../common/resources/client/uploads/file-type-icon/icons/audio-file-icon.tsx","../../../common/resources/client/uploads/file-type-icon/icons/video-file-icon.tsx","../../../common/resources/client/uploads/file-type-icon/icons/text-file-icon.tsx","../../../common/resources/client/uploads/file-type-icon/icons/pdf-file-icon.tsx","../../../common/resources/client/uploads/file-type-icon/icons/archive-file-icon.tsx","../../../common/resources/client/uploads/file-type-icon/icons/folder-file-icon.tsx","../../../common/resources/client/uploads/file-type-icon/icons/image-file-icon.tsx","../../../common/resources/client/uploads/file-type-icon/icons/power-point-file-icon.tsx","../../../common/resources/client/uploads/file-type-icon/icons/word-file-icon.tsx","../../../common/resources/client/uploads/file-type-icon/icons/spreadsheet-file-icon.tsx","../../../common/resources/client/uploads/file-type-icon/icons/shared-folder-file-icon.tsx","../../../common/resources/client/uploads/file-type-icon/file-type-icon.tsx","../../../common/resources/client/uploads/file-type-icon/file-thumbnail.tsx","../../../common/resources/client/uploads/preview/file-preview-container.tsx","../../../common/resources/client/uploads/preview/file-preview-dialog.tsx","../../../common/resources/client/admin/file-entry/file-entry-index-filters.ts","../../../common/resources/client/admin/file-entry/file-entry-index-page.tsx","../../../common/resources/client/admin/subscriptions/subscription-index-page-filters.ts","../../../common/resources/client/admin/subscriptions/subscriptions.svg","../../../common/resources/client/admin/subscriptions/requests/use-update-subscription.ts","../../../common/resources/client/admin/subscriptions/crupdate-subscription-form.tsx","../../../common/resources/client/admin/subscriptions/update-subscription-dialog.tsx","../../../common/resources/client/admin/subscriptions/requests/use-create-subscription.ts","../../../common/resources/client/admin/subscriptions/create-subscription-dialog.tsx","../../../common/resources/client/icons/material/Pause.tsx","../../../common/resources/client/icons/material/PlayArrow.tsx","../../../common/resources/client/admin/subscriptions/subscriptions-index-page.tsx","../../../common/resources/client/icons/material/Sync.tsx","../../../common/resources/client/admin/plans/requests/use-sync-products.ts","../../../common/resources/client/admin/plans/requests/use-delete-product.ts","../../../common/resources/client/admin/plans/plans-index-page-filters.ts","../../../common/resources/client/admin/plans/plans-index-page.tsx","../../../common/resources/client/admin/plans/requests/use-product.ts","../../../common/resources/client/admin/plans/crupdate-plan-page/billing-period-presets.ts","../../../common/resources/client/admin/plans/crupdate-plan-page/price-form.tsx","../../../common/resources/client/admin/plans/crupdate-plan-page/crupdate-plan-form.tsx","../../../common/resources/client/admin/plans/requests/use-update-product.ts","../../../common/resources/client/admin/plans/crupdate-plan-page/edit-plan-page.tsx","../../../common/resources/client/admin/plans/requests/use-create-product.ts","../../../common/resources/client/admin/plans/crupdate-plan-page/create-plan-page.tsx","../../../common/resources/client/admin/settings/pages/gdpr-settings.tsx","../../../common/resources/client/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger-icon.tsx","../../../common/resources/client/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger.tsx","../../../common/resources/client/icons/material/Home.tsx","../../../common/resources/client/admin/channels/channels-datatable-columns.tsx","../../../common/resources/client/admin/channels/requests/use-apply-channel-preset.ts","../../../common/resources/client/admin/channels/channels-docs-link.tsx","../../../common/resources/client/admin/channels/channels-datatable-page.tsx","../../../common/resources/client/admin/channels/requests/use-update-channel.ts","../../../common/resources/client/admin/channels/channel-editor/edit-channel-page-layout.tsx","../../../common/resources/client/icons/material/Description.tsx","../../../common/resources/client/ui/slug-editor.tsx","../../../common/resources/client/admin/channels/channel-editor/controls/channel-name-field.tsx","../../../common/resources/client/admin/channels/channel-editor/controls/content-type-field.tsx","../../../common/resources/client/admin/channels/channel-editor/controls/content-auto-update-field.tsx","../../../resources/client/admin/channels/channel-auto-update-field.tsx","../../../resources/client/titles/models/keyword.ts","../../../resources/client/admin/channels/channel-restriction-field.tsx","../../../common/resources/client/icons/material/Dashboard.tsx","../../../common/resources/client/admin/channels/channel-editor/controls/content-layout-fields.tsx","../../../common/resources/client/admin/channels/channel-editor/controls/channel-pagination-type-field.tsx","../../../common/resources/client/icons/material/Public.tsx","../../../resources/client/admin/channels/channel-seo-fields.tsx","../../../resources/client/admin/channels/edit-channel-page.tsx","../../../common/resources/client/admin/channels/requests/use-create-channel.ts","../../../common/resources/client/admin/channels/channel-editor/create-channel-page-layout.tsx","../../../resources/client/admin/channels/create-channel-page.tsx","../../../resources/client/admin/news/news-datatable-filters.ts","../../../resources/client/admin/news/online-articles.svg","../../../resources/client/admin/news/requests/use-delete-news-article.ts","../../../resources/client/admin/news/news-datatable-columns.tsx","../../../common/resources/client/icons/material/Publish.tsx","../../../resources/client/admin/news/requests/use-import-news-articles.ts","../../../resources/client/admin/news/news-datatable-page.tsx","../../../common/resources/client/comments/comments-datatable-page/delete-comments-button.tsx","../../../common/resources/client/comments/requests/use-update-comment.ts","../../../common/resources/client/comments/requests/use-restore-comments.ts","../../../common/resources/client/comments/comments-datatable-page/restore-comments-button.tsx","../../../common/resources/client/comments/comments-datatable-page/comment-datatable-item.tsx","../../../common/resources/client/comments/comments-datatable-page/public-discussion.svg","../../../common/resources/client/comments/comments-datatable-page/comments-datatable-filters.ts","../../../common/resources/client/comments/comments-datatable-page/comments-datatable-page.tsx","../../../resources/client/admin/reviews/reviews.svg","../../../resources/client/admin/reviews/delete-reviews-button.tsx","../../../resources/client/admin/reviews/requests/use-update-review.ts","../../../resources/client/admin/reviews/review-datatable-item.tsx","../../../resources/client/admin/reviews/reviews-datatable-filters.tsx","../../../resources/client/admin/reviews/reviews-datatable-page.tsx","../../../resources/client/admin/videos/video-files.svg","../../../common/resources/client/datatable/column-templates/boolean-indicator.tsx","../../../common/resources/client/icons/material/BarChart.tsx","../../../resources/client/admin/videos/videos-datatable-columns.tsx","../../../resources/client/admin/reviews/title-filter/title-filter-control.tsx","../../../resources/client/titles/requests/use-titles-autocomplete.ts","../../../resources/client/titles/title-select.tsx","../../../resources/client/admin/reviews/title-filter/title-filter-panel.tsx","../../../resources/client/admin/videos/videos-datatable-filters.tsx","../../../resources/client/admin/videos/videos-datatable-page.tsx","../../../resources/client/admin/videos/requests/use-create-video.ts","../../../common/resources/client/uploads/requests/use-file-entry-model.ts","../../../common/resources/client/ui/forms/input-field/file-entry-field.tsx","../../../resources/client/admin/videos/crupdate/crupdate-caption-dialog.tsx","../../../common/resources/client/icons/material/Subtitles.tsx","../../../resources/client/admin/videos/captions/captions-panel.tsx","../../../resources/client/admin/videos/crupdate/crupdate-video-form.tsx","../../../resources/client/admin/videos/crupdate/create-video-page.tsx","../../../resources/client/admin/videos/requests/use-update-video.ts","../../../resources/client/admin/videos/requests/use-video.ts","../../../resources/client/admin/videos/crupdate/edit-video-page.tsx","../../../resources/client/admin/titles/movie-night.svg","../../../resources/client/admin/titles/titles-datatable-columns.tsx","../../../resources/client/admin/titles/titles-datatable-filters.tsx","../../../resources/client/admin/titles/requests/use-import-single-from-tmdb.ts","../../../resources/client/admin/titles/import/import-single-from-tmdb-dialog.tsx","../../../resources/client/admin/titles/requests/use-import-multiple-from-tmdb.ts","../../../resources/client/admin/titles/import/import-multiple-from-tmdb-dialog.tsx","../../../resources/client/admin/titles/titles-datatable-page.tsx","../../../resources/client/admin/titles/title-editor/edit-title-page.tsx","../../../resources/client/episodes/requests/use-delete-episode.ts","../../../resources/client/admin/titles/title-editor/title-editor-layout.tsx","../../../resources/client/admin/titles/title-editor/seasons-editor/season-editor-layout.tsx","../../../resources/client/admin/titles/title-editor/title-editor-page-status.tsx","../../../resources/client/admin/titles/title-editor/seasons-editor/season-editor-episode-list.tsx","../../../resources/client/admin/titles/requests/use-delete-season.ts","../../../resources/client/admin/titles/requests/use-create-season.ts","../../../resources/client/admin/titles/title-editor/seasons-editor/title-seasons-editor.tsx","../../../resources/client/admin/titles/requests/use-create-title.ts","../../../resources/client/admin/titles/requests/use-update-title.ts","../../../common/resources/client/ui/forms/combobox/form-combobox.tsx","../../../resources/client/admin/titles/title-editor/title-primary-facts-form.tsx","../../../resources/client/admin/titles/title-editor/title-reviews-editor.tsx","../../../common/resources/client/icons/material/ZoomOutMap.tsx","../../../resources/client/admin/titles/requests/use-delete-image.ts","../../../resources/client/admin/titles/requests/use-upload-image.ts","../../../resources/client/admin/titles/title-editor/title-images-editor.tsx","../../../resources/client/admin/titles/title-editor/videos-editor/title-videos-sort-button.tsx","../../../resources/client/admin/videos/requests/use-delete-videos.ts","../../../resources/client/seasons/requests/use-season-episode-numbers.ts","../../../resources/client/admin/titles/title-editor/videos-editor/videos-editor-season-select.tsx","../../../resources/client/admin/titles/title-editor/videos-editor/title-videos-editor.tsx","../../../resources/client/episodes/requests/use-update-episode.ts","../../../resources/client/admin/titles/title-editor/episode-editor/episode-editor-layout.tsx","../../../resources/client/episodes/requests/use-create-episode.ts","../../../resources/client/admin/titles/title-editor/episode-editor/episode-primary-facts-form.tsx","../../../resources/client/admin/titles/requests/use-title-credits.ts","../../../resources/client/admin/titles/requests/use-sort-title-credits.ts","../../../resources/client/admin/titles/requests/use-update-title-credit.ts","../../../resources/client/admin/titles/requests/use-create-title-credit.ts","../../../resources/client/admin/titles/title-editor/credits-editor/add-credit-dialog.tsx","../../../resources/client/admin/titles/title-editor/credits-editor/edit-credit-dialog.tsx","../../../resources/client/admin/titles/requests/use-delete-title-credit.ts","../../../resources/client/admin/titles/title-editor/credits-editor/get-credits-editor-action-column.tsx","../../../common/resources/client/icons/material/RecentActors.tsx","../../../resources/client/admin/titles/title-editor/credits-editor/credits-table-query-indicator.tsx","../../../resources/client/admin/titles/title-editor/credits-editor/cast-editor-table.tsx","../../../resources/client/admin/titles/title-editor/credits-editor/title-credits-table-header.tsx","../../../resources/client/admin/titles/title-editor/episode-editor/episode-cast-editor.tsx","../../../resources/client/admin/titles/title-editor/credits-editor/title-cast-editor.tsx","../../../resources/client/admin/titles/title-editor/credits-editor/crew-editor-table.tsx","../../../resources/client/admin/titles/title-editor/credits-editor/title-crew-editor.tsx","../../../resources/client/admin/titles/title-editor/seasons-editor/season-cast-editor.tsx","../../../resources/client/admin/titles/title-editor/seasons-editor/season-crew-editor.tsx","../../../resources/client/admin/titles/title-editor/episode-editor/episode-crew-editor.tsx","../../../resources/client/admin/titles/requests/use-detach-title-tag.ts","../../../resources/client/admin/titles/requests/use-attach-title-tag.ts","../../../resources/client/admin/titles/title-editor/title-tags-editor/add-title-tag-dialog.tsx","../../../resources/client/admin/titles/title-editor/title-tags-editor/title-tags-editor.tsx","../../../resources/client/admin/titles/title-editor/title-comments-editor.tsx","../../../resources/client/admin/people/awards.svg","../../../resources/client/admin/people/people-datatable-columns.tsx","../../../resources/client/admin/people/people-datatable-filters.tsx","../../../resources/client/admin/people/people-datatable-page.tsx","../../../resources/client/admin/people/requests/use-create-person.ts","../../../resources/client/admin/people/crupdate/person-primary-facts-form.tsx","../../../resources/client/admin/people/crupdate/create-person-page.tsx","../../../resources/client/admin/people/requests/use-update-person.ts","../../../resources/client/admin/people/crupdate/update-person-page.tsx","../../../resources/client/admin/people/requests/use-delete-person-credit.ts","../../../resources/client/admin/people/crupdate/person-credits-editor.tsx","../../../common/resources/client/article-editor/article-editor-title.tsx","../../../common/resources/client/icons/material/Undo.tsx","../../../common/resources/client/icons/material/Redo.tsx","../../../common/resources/client/text-editor/menubar/history-buttons.tsx","../../../common/resources/client/icons/material/Code.tsx","../../../common/resources/client/text-editor/menubar/mode-button.tsx","../../../common/resources/client/text-editor/menubar/divider.tsx","../../../common/resources/client/icons/material/FormatBold.tsx","../../../common/resources/client/icons/material/FormatItalic.tsx","../../../common/resources/client/icons/material/FormatUnderlined.tsx","../../../common/resources/client/text-editor/menubar/font-style-buttons.tsx","../../../common/resources/client/icons/material/FormatListBulleted.tsx","../../../common/resources/client/icons/material/FormatListNumbered.tsx","../../../common/resources/client/text-editor/menubar/list-buttons.tsx","../../../common/resources/client/text-editor/insert-link-into-text-editor.ts","../../../common/resources/client/text-editor/menubar/link-button.tsx","../../../common/resources/client/text-editor/menubar/image-button.tsx","../../../common/resources/client/icons/material/FormatClear.tsx","../../../common/resources/client/text-editor/menubar/clear-format-button.tsx","../../../common/resources/client/icons/material/HorizontalRule.tsx","../../../common/resources/client/icons/material/PriorityHigh.tsx","../../../common/resources/client/icons/material/Note.tsx","../../../common/resources/client/icons/material/SmartDisplay.tsx","../../../common/resources/client/text-editor/menubar/insert-menu-trigger.tsx","../../../common/resources/client/ui/keyboard/keyboard.tsx","../../../common/resources/client/text-editor/menubar/format-menu-trigger.tsx","../../../common/resources/client/icons/material/FormatColorText.tsx","../../../common/resources/client/icons/material/FormatColorFill.tsx","../../../common/resources/client/text-editor/menubar/color-buttons.tsx","../../../common/resources/client/icons/material/FormatAlignLeft.tsx","../../../common/resources/client/icons/material/FormatAlignCenter.tsx","../../../common/resources/client/icons/material/FormatAlignRight.tsx","../../../common/resources/client/icons/material/FormatAlignJustify.tsx","../../../common/resources/client/text-editor/menubar/align-buttons.tsx","../../../common/resources/client/icons/material/FormatIndentDecrease.tsx","../../../common/resources/client/icons/material/FormatIndentIncrease.tsx","../../../common/resources/client/text-editor/menubar/indent-buttons.tsx","../../../common/resources/client/text-editor/menubar/code-block-menu-trigger.tsx","../../../common/resources/client/article-editor/article-body-editor-menubar.tsx","../../../common/resources/client/article-editor/article-editor-sticky-header.tsx","../../../resources/client/admin/news/requests/use-update-news-article.ts","../../../resources/client/admin/news/edit-news-article-page.tsx","../../../resources/client/admin/news/requests/use-create-news-article.ts","../../../resources/client/admin/news/create-news-article-page.tsx","../../../resources/client/admin/title-tags/title-tags-editor/requests/use-create-title-tag.ts","../../../resources/client/admin/title-tags/title-tags-editor/create-title-tag-dialog.tsx","../../../resources/client/admin/title-tags/title-tags-editor/requests/use-update-title-tag.ts","../../../resources/client/admin/title-tags/title-tags-editor/update-title-tag-dialog.tsx","../../../resources/client/admin/title-tags/title-tags-editor/title-tags-datatable-filters.ts","../../../resources/client/admin/title-tags/title-tags-editor/title-tags-datatable-page.tsx","../../../resources/client/admin/lists/lists-datatable-columns.tsx","../../../resources/client/admin/lists/lists-datatable-page.tsx","../../../common/resources/client/admin/analytics/report-date-selector.tsx","../../../common/resources/client/ui/buttons/button-group.tsx","../../../common/resources/client/icons/material/TrendingUp.tsx","../../../common/resources/client/icons/material/TrendingDown.tsx","../../../common/resources/client/charts/chart-layout.tsx","../../../common/resources/client/charts/chart-loading-indicator.tsx","../../../common/resources/client/charts/base-chart.tsx","../../../common/resources/client/charts/data/format-report-data.ts","../../../common/resources/client/charts/chart-colors.tsx","../../../common/resources/client/charts/line-chart.tsx","../../../common/resources/client/charts/polar-area-chart.tsx","../../../common/resources/client/charts/bar-chart.tsx","../../../common/resources/client/admin/analytics/geo-chart/use-google-geo-chart.ts","../../../common/resources/client/i18n/formatted-country-name.tsx","../../../common/resources/client/admin/analytics/geo-chart/geo-chart.tsx","../../../common/resources/client/admin/analytics/visitors-report-charts.tsx","../../../common/resources/client/icons/material/TrendingFlat.tsx","../../../common/resources/client/admin/analytics/admin-header-report.tsx","../../../common/resources/client/admin/analytics/use-admin-report.ts","../../../resources/client/admin/reports/mtdb-admin-report-page.tsx","../../../resources/client/admin/reports/insights/insights-report-row.tsx","../../../resources/client/admin/reports/requests/use-insights-report.ts","../../../resources/client/admin/reports/insights/insights-charts-context.ts","../../../resources/client/admin/reports/insights/insights-async-chart.tsx","../../../resources/client/admin/reports/insights/insights-plays-chart.tsx","../../../resources/client/admin/reports/insights/insights-devices-chart.tsx","../../../common/resources/client/icons/material/Info.tsx","../../../resources/client/admin/reports/top-models-chart-layout.tsx","../../../resources/client/admin/reports/insights/insights-series-chart.tsx","../../../resources/client/admin/reports/insights/insights-movies-chart.tsx","../../../resources/client/admin/reports/insights/insights-videos-chart.tsx","../../../resources/client/admin/reports/insights/insights-users-chart.tsx","../../../resources/client/admin/reports/insights/insights-locations-chart.tsx","../../../resources/client/admin/reports/insights/insights-platforms-chart.tsx","../../../resources/client/admin/reports/admin-insights-report.tsx","../../../resources/client/admin/reports/admin-visitors-report.tsx","../../../resources/client/admin/reports/model-insights-page-layout.tsx","../../../resources/client/admin/reports/insights/insights-seasons-chart.tsx","../../../resources/client/admin/reports/insights/insights-episodes-chart.tsx","../../../resources/client/admin/reports/pages/title-insights-page.tsx","../../../resources/client/admin/reports/pages/episode-insights-page.tsx","../../../resources/client/admin/reports/pages/season-insights-page.tsx","../../../resources/client/admin/reports/pages/video-insights-page.tsx","../../../resources/client/admin/app-admin-routes.tsx","../../../common/resources/client/admin/custom-pages/requests/use-update-custom-page.ts","../../../common/resources/client/admin/custom-pages/edit-custom-page.tsx","../../../common/resources/client/admin/custom-pages/requests/use-create-custom-page.ts","../../../common/resources/client/admin/custom-pages/create-custom-page.tsx","../../../common/resources/client/ui/font-selector/font.svg","../../../common/resources/client/ui/font-selector/font-selector-filters.tsx","../../../common/resources/client/i18n/use-filter.ts","../../../common/resources/client/ui/font-picker/browser-safe-fonts.ts","../../../common/resources/client/ui/font-selector/font-selector-state.ts","../../../common/resources/client/ui/font-selector/font-selector-pagination.tsx","../../../common/resources/client/ui/font-selector/font-selector.tsx","../../../common/resources/client/admin/appearance/sections/themes/theme-font-panel.tsx","../../../common/resources/client/admin/appearance/sections/themes/theme-radius-panel.tsx","../../../common/resources/client/admin/logging/logs-page.tsx","../../../common/resources/client/admin/logging/schedule/use-rerurun-scheduled-command.tsx","../../../common/resources/client/icons/material/EventRepeat.tsx","../../../common/resources/client/admin/logging/schedule/schedule-datatable-columns.tsx","../../../common/resources/client/admin/logging/schedule/timeline.svg","../../../common/resources/client/icons/material/Download.tsx","../../../common/resources/client/admin/logging/schedule/schedule-log-datatable.tsx","../../../common/resources/client/admin/logging/error/bug-fixing.svg","../../../common/resources/client/admin/logging/error/error-log-datatable-columns.tsx","../../../common/resources/client/admin/logging/error/error-log-entry-dialog.tsx","../../../common/resources/client/admin/logging/error/use-delete-error-log.ts","../../../common/resources/client/admin/logging/error/error-log-datatable.tsx","../../../common/resources/client/admin/logging/outgoing-email/opened.svg","../../../common/resources/client/admin/logging/outgoing-email/use-outgoing-email-log-item-with-mime.ts","../../../common/resources/client/admin/logging/outgoing-email/outgoing-email-log-entry-dialog.tsx","../../../common/resources/client/admin/logging/outgoing-email/outgoing-email-log-datatable-columns.tsx","../../../common/resources/client/admin/logging/outgoing-email/outgoing-email-log-datatable-filters.tsx","../../../common/resources/client/admin/logging/outgoing-email/outgoing-email-log-datatable.tsx","../../../common/resources/client/admin/admin-routes.tsx"],"sourcesContent":["import clsx from 'clsx';\nimport React from 'react';\nimport {CustomMenu} from '../menus/custom-menu';\nimport {Trans} from '../i18n/trans';\nimport {useSettings} from '../core/settings/use-settings';\n\ninterface Props {\n className?: string;\n isCompactMode?: boolean;\n}\nexport function AdminSidebar({className, isCompactMode}: Props) {\n const {version} = useSettings();\n return (\n <div\n className={clsx(\n className,\n 'relative flex flex-col gap-20 overflow-y-auto border-r bg-alt px-12 pb-16 pt-26 text-sm font-medium text-muted',\n )}\n >\n <CustomMenu\n matchDescendants={to => to === '/admin'}\n menu=\"admin-sidebar\"\n orientation=\"vertical\"\n onlyShowIcons={isCompactMode}\n itemClassName={({isActive}) =>\n clsx(\n 'block w-full rounded-button py-12 px-16',\n isActive\n ? 'bg-primary/6 text-primary font-semibold'\n : 'hover:bg-hover',\n )\n }\n gap=\"gap-8\"\n />\n {!isCompactMode && (\n <div className=\"mt-auto gap-14 px-16 text-xs\">\n <Trans message=\"Version: :number\" values={{number: version}} />\n </div>\n )}\n </div>\n );\n}\n","import {createContext} from 'react';\n\nexport type DashboardSidenavStatus = 'open' | 'closed' | 'compact';\n\nexport interface DashboardContextValue {\n leftSidenavStatus: DashboardSidenavStatus;\n setLeftSidenavStatus: (status: DashboardSidenavStatus) => void;\n rightSidenavStatus: DashboardSidenavStatus;\n setRightSidenavStatus: (status: DashboardSidenavStatus) => void;\n isMobileMode: boolean | null;\n leftSidenavCanBeCompact?: boolean;\n name: string;\n}\n\nexport const DashboardLayoutContext = createContext<DashboardContextValue>(\n null!\n);\n","import {useEffect} from 'react';\n\nexport function useBlockBodyOverflow(disable: boolean = false) {\n useEffect(() => {\n if (disable) {\n document.documentElement.classList.remove('no-page-overflow');\n } else {\n document.documentElement.classList.add('no-page-overflow');\n }\n return () => {\n document.documentElement.classList.remove('no-page-overflow');\n };\n }, [disable]);\n}\n","import {ComponentPropsWithoutRef, useCallback, useMemo} from 'react';\nimport {\n DashboardLayoutContext,\n DashboardSidenavStatus,\n} from './dashboard-layout-context';\nimport {Underlay} from '../overlays/underlay';\nimport {AnimatePresence} from 'framer-motion';\nimport {useControlledState} from '@react-stately/utils';\nimport {useMediaQuery} from '../../utils/hooks/use-media-query';\nimport {\n getFromLocalStorage,\n setInLocalStorage,\n} from '../../utils/hooks/local-storage';\nimport {useBlockBodyOverflow} from '../../utils/hooks/use-block-body-overflow';\nimport clsx from 'clsx';\n\ninterface DashboardLayoutProps extends ComponentPropsWithoutRef<'div'> {\n name: string;\n leftSidenavCanBeCompact?: boolean;\n leftSidenavStatus?: DashboardSidenavStatus;\n onLeftSidenavChange?: (status: DashboardSidenavStatus) => void;\n rightSidenavStatus?: DashboardSidenavStatus;\n initialRightSidenavStatus?: DashboardSidenavStatus;\n onRightSidenavChange?: (status: DashboardSidenavStatus) => void;\n height?: string;\n gridClassName?: string;\n blockBodyOverflow?: boolean;\n}\nexport function DashboardLayout({\n children,\n leftSidenavStatus: leftSidenav,\n onLeftSidenavChange,\n rightSidenavStatus: rightSidenav,\n initialRightSidenavStatus,\n onRightSidenavChange,\n name,\n leftSidenavCanBeCompact,\n height = 'h-screen',\n className,\n gridClassName = 'dashboard-grid',\n blockBodyOverflow = true,\n ...domProps\n}: DashboardLayoutProps) {\n useBlockBodyOverflow(!blockBodyOverflow);\n const isMobile = useMediaQuery('(max-width: 1024px)');\n\n const isCompactModeInitially = useMemo(() => {\n return !name ? false : getFromLocalStorage(`${name}.sidenav.compact`);\n }, [name]);\n const defaultLeftSidenavStatus = isCompactModeInitially ? 'compact' : 'open';\n const [leftSidenavStatus, setLeftSidenavStatus] = useControlledState(\n leftSidenav,\n isMobile ? 'closed' : defaultLeftSidenavStatus,\n onLeftSidenavChange,\n );\n\n const rightSidenavStatusDefault = useMemo(() => {\n if (isMobile) {\n return 'closed';\n }\n if (initialRightSidenavStatus != null) {\n return initialRightSidenavStatus;\n }\n const userSelected = getFromLocalStorage(\n `${name}.sidenav.right.position`,\n 'open',\n );\n if (userSelected != null) {\n return userSelected;\n }\n return initialRightSidenavStatus || 'closed';\n }, [isMobile, name, initialRightSidenavStatus]);\n const [rightSidenavStatus, _setRightSidenavStatus] = useControlledState(\n rightSidenav,\n rightSidenavStatusDefault,\n onRightSidenavChange,\n );\n const setRightSidenavStatus = useCallback(\n (status: DashboardSidenavStatus) => {\n _setRightSidenavStatus(status);\n setInLocalStorage(`${name}.sidenav.right.position`, status);\n },\n [_setRightSidenavStatus, name],\n );\n\n const shouldShowUnderlay =\n isMobile && (leftSidenavStatus === 'open' || rightSidenavStatus === 'open');\n\n return (\n <DashboardLayoutContext.Provider\n value={{\n leftSidenavStatus,\n setLeftSidenavStatus,\n rightSidenavStatus,\n setRightSidenavStatus,\n leftSidenavCanBeCompact,\n name,\n isMobileMode: isMobile,\n }}\n >\n <div\n {...domProps}\n className={clsx('relative isolate', gridClassName, className, height)}\n >\n {children}\n <AnimatePresence>\n {shouldShowUnderlay && (\n <Underlay\n position=\"fixed\"\n key=\"dashboard-underlay\"\n onClick={() => {\n setLeftSidenavStatus('closed');\n setRightSidenavStatus('closed');\n }}\n />\n )}\n </AnimatePresence>\n </div>\n </DashboardLayoutContext.Provider>\n );\n}\n","import {cloneElement, ReactElement} from 'react';\nimport clsx from 'clsx';\n\ninterface DashboardContentProps {\n children: ReactElement<{className: string}>;\n isScrollable?: boolean;\n}\nexport function DashboardContent({\n children,\n isScrollable = true,\n}: DashboardContentProps) {\n return cloneElement(children, {\n className: clsx(\n children.props.className,\n isScrollable && 'overflow-y-auto stable-scrollbar',\n 'dashboard-grid-content'\n ),\n });\n}\n","import clsx from 'clsx';\nimport {m} from 'framer-motion';\nimport {cloneElement, ReactElement, useContext} from 'react';\nimport {DashboardLayoutContext} from './dashboard-layout-context';\n\nexport interface DashboardSidenavChildrenProps {\n className?: string;\n isCompactMode?: boolean;\n}\n\nexport interface SidenavProps {\n className?: string;\n children: ReactElement<DashboardSidenavChildrenProps>;\n position?: 'left' | 'right';\n size?: 'sm' | 'md' | 'lg' | string;\n mode?: 'overlay';\n // absolute will place sidenav between navbar/footer, fixed will overlay it over nav/footer.\n overlayPosition?: 'absolute' | 'fixed';\n display?: 'flex' | 'block';\n overflow?: string;\n forceClosed?: boolean;\n}\nexport function DashboardSidenav({\n className,\n position,\n children,\n size = 'md',\n mode,\n overlayPosition = 'fixed',\n display = 'flex',\n overflow = 'overflow-hidden',\n forceClosed = false,\n}: SidenavProps) {\n const {\n isMobileMode,\n leftSidenavStatus,\n setLeftSidenavStatus,\n rightSidenavStatus,\n setRightSidenavStatus,\n } = useContext(DashboardLayoutContext);\n const status = position === 'left' ? leftSidenavStatus : rightSidenavStatus;\n const isOverlayMode = isMobileMode || mode === 'overlay';\n\n const variants = {\n open: {display, width: null as any},\n compact: {\n display,\n width: null as any,\n },\n closed: {\n width: 0,\n transitionEnd: {\n display: 'none',\n },\n },\n };\n\n const sizeClassName = getSize(status === 'compact' ? 'compact' : size);\n\n return (\n <m.div\n variants={variants}\n initial={false}\n animate={forceClosed ? 'closed' : status}\n transition={{type: 'tween', duration: 0.15}}\n onClick={e => {\n // close sidenav when user clicks a link or button on mobile\n const target = e.target as HTMLElement;\n if (isMobileMode && (target.closest('button') || target.closest('a'))) {\n setLeftSidenavStatus('closed');\n setRightSidenavStatus('closed');\n }\n }}\n className={clsx(\n className,\n position === 'left'\n ? 'dashboard-grid-sidenav-left'\n : 'dashboard-grid-sidenav-right',\n 'will-change-[width]',\n overflow,\n sizeClassName,\n isOverlayMode && `${overlayPosition} bottom-0 top-0 z-20 shadow-2xl`,\n isOverlayMode && position === 'left' && 'left-0',\n isOverlayMode && position === 'right' && 'right-0',\n )}\n >\n {cloneElement<DashboardSidenavChildrenProps>(children, {\n className: clsx(\n children.props.className,\n 'w-full h-full',\n status === 'compact' && 'compact-scrollbar',\n ),\n isCompactMode: status === 'compact',\n })}\n </m.div>\n );\n}\n\nfunction getSize(size: SidenavProps['size'] | 'compact'): string {\n switch (size) {\n case 'compact':\n return 'w-80';\n case 'sm':\n return 'w-224';\n case 'md':\n return 'w-240';\n case 'lg':\n return 'w-288';\n default:\n return size || '';\n }\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const MenuOpenIcon = createSvgIcon(\n <path d=\"M3 18h13v-2H3v2zm0-5h10v-2H3v2zm0-7v2h13V6H3zm18 9.59L17.42 12 21 8.41 19.59 7l-5 5 5 5L21 15.59z\" />\n, 'MenuOpenOutlined');\n","import {Navbar, NavbarProps} from '../navigation/navbar/navbar';\nimport {IconButton} from '../buttons/icon-button';\nimport React, {useContext} from 'react';\nimport clsx from 'clsx';\nimport {DashboardLayoutContext} from './dashboard-layout-context';\nimport {setInLocalStorage} from '../../utils/hooks/local-storage';\nimport {MenuOpenIcon} from '@common/icons/material/MenuOpen';\n\nexport interface DashboardNavbarProps\n extends Omit<NavbarProps, 'toggleButton'> {\n hideToggleButton?: boolean;\n}\nexport function DashboardNavbar({\n children,\n className,\n hideToggleButton,\n ...props\n}: DashboardNavbarProps) {\n const {\n isMobileMode,\n leftSidenavStatus,\n setLeftSidenavStatus,\n name,\n leftSidenavCanBeCompact,\n } = useContext(DashboardLayoutContext);\n\n const shouldToggleCompactMode = leftSidenavCanBeCompact && !isMobileMode;\n const shouldShowToggle =\n !hideToggleButton && (isMobileMode || leftSidenavCanBeCompact);\n\n const handleToggle = () => {\n setLeftSidenavStatus(leftSidenavStatus === 'open' ? 'closed' : 'open');\n };\n\n const handleCompactModeToggle = () => {\n const newStatus = leftSidenavStatus === 'compact' ? 'open' : 'compact';\n setInLocalStorage(`${name}.sidenav.compact`, newStatus === 'compact');\n setLeftSidenavStatus(newStatus);\n };\n\n return (\n <Navbar\n className={clsx('dashboard-grid-navbar', className)}\n border=\"border-b\"\n size=\"sm\"\n toggleButton={\n shouldShowToggle ? (\n <IconButton\n size=\"md\"\n onClick={() => {\n if (shouldToggleCompactMode) {\n handleCompactModeToggle();\n } else {\n handleToggle();\n }\n }}\n >\n <MenuOpenIcon />\n </IconButton>\n ) : undefined\n }\n {...props}\n >\n {children}\n </Navbar>\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\n\nexport interface AdminSetupAlert {\n title: string;\n description: string;\n}\n\ninterface Response extends BackendResponse {\n alerts: AdminSetupAlert[];\n}\n\nexport function useAdminSetupAlerts() {\n return useQuery({\n queryKey: ['admin-setup-alerts'],\n queryFn: () => fetchAlerts(),\n });\n}\n\nfunction fetchAlerts() {\n return apiClient\n .get<Response>(`admin/setup-alerts`)\n .then(response => response.data);\n}\n","import {Outlet} from 'react-router-dom';\nimport {AdminSidebar} from './admin-sidebar';\nimport {DashboardLayout} from '../ui/layout/dashboard-layout';\nimport {DashboardContent} from '../ui/layout/dashboard-content';\nimport {DashboardSidenav} from '../ui/layout/dashboard-sidenav';\nimport {DashboardNavbar} from '../ui/layout/dashboard-navbar';\nimport {\n AdminSetupAlert,\n useAdminSetupAlerts,\n} from '@common/admin/use-admin-setup-alerts';\nimport {SectionHelper} from '@common/ui/section-helper';\nimport {ErrorIcon} from '@common/icons/material/Error';\nimport {\n setInLocalStorage,\n useLocalStorage,\n} from '@common/utils/hooks/local-storage';\n\nexport function AdminLayout() {\n return (\n <DashboardLayout name=\"admin\" leftSidenavCanBeCompact>\n <DashboardNavbar size=\"sm\" menuPosition=\"admin-navbar\" />\n <DashboardSidenav position=\"left\" size=\"sm\">\n <AdminSidebar />\n </DashboardSidenav>\n <DashboardContent>\n <div className=\"bg dark:bg-alt\">\n <SetupAlertsList />\n <Outlet />\n </div>\n </DashboardContent>\n </DashboardLayout>\n );\n}\n\nfunction SetupAlertsList() {\n const {data} = useAdminSetupAlerts();\n const [dismissValue] = useLocalStorage<{\n timestamp: number;\n } | null>('admin-setup-alert-dismissed', null);\n\n // show alert if 1 day passed since last dismiss\n const shouldShowAlert =\n !dismissValue || Date.now() - dismissValue.timestamp > 86400000;\n\n if (!data?.alerts.length || !shouldShowAlert) {\n return null;\n }\n\n return (\n <div className=\"fixed left-0 right-0 top-24 z-10 mx-auto w-max overflow-hidden rounded-panel bg shadow-md\">\n <SetupAlert alert={data.alerts[0]} />\n </div>\n );\n}\n\ninterface SetupAlertProps {\n alert: AdminSetupAlert;\n}\nfunction SetupAlert({alert}: SetupAlertProps) {\n const description = (\n <div dangerouslySetInnerHTML={{__html: alert.description}}></div>\n );\n return (\n <SectionHelper\n leadingIcon={<ErrorIcon size=\"xs\" className=\"text-danger\" />}\n onClose={() => {\n setInLocalStorage('admin-setup-alert-dismissed', {\n timestamp: Date.now(),\n });\n }}\n key={alert.title}\n title={alert.title}\n description={description}\n color=\"neutral\"\n />\n );\n}\n","import {\n BackendFilter,\n DatePickerFilterControl,\n FilterControlType,\n FilterOperator,\n} from './backend-filter';\nimport {\n DateRangePreset,\n DateRangePresets,\n} from '../../ui/forms/input-field/date/date-range-picker/dialog/date-range-presets';\nimport {message} from '../../i18n/message';\nimport {dateRangeToAbsoluteRange} from '../../ui/forms/input-field/date/date-range-picker/form-date-range-picker';\nimport {PartialWithRequired} from '@common/utils/ts/partial-with-required';\n\nexport function timestampFilter(\n options: PartialWithRequired<\n BackendFilter<DatePickerFilterControl>,\n 'key' | 'label'\n >\n): BackendFilter<DatePickerFilterControl> {\n return {\n ...options,\n defaultOperator: FilterOperator.between,\n control: {\n type: FilterControlType.DateRangePicker,\n defaultValue:\n options.control?.defaultValue ||\n dateRangeToAbsoluteRange(\n (DateRangePresets[3] as Required<DateRangePreset>).getRangeValue()\n ),\n },\n };\n}\n\nexport function createdAtFilter(\n options: Partial<BackendFilter<DatePickerFilterControl>>\n): BackendFilter<DatePickerFilterControl> {\n return timestampFilter({\n key: 'created_at',\n label: message('Date created'),\n ...options,\n });\n}\n\nexport function updatedAtFilter(\n options: Partial<BackendFilter<DatePickerFilterControl>>\n): BackendFilter<DatePickerFilterControl> {\n return timestampFilter({\n key: 'updated_at',\n label: message('Last updated'),\n ...options,\n });\n}\n","import {\n BackendFilter,\n FilterControlType,\n FilterOperator,\n} from '../../datatable/filters/backend-filter';\nimport {\n createdAtFilter,\n updatedAtFilter,\n} from '../../datatable/filters/timestamp-filters';\nimport {message} from '../../i18n/message';\n\nexport const UserDatatableFilters: BackendFilter[] = [\n {\n key: 'email_verified_at',\n label: message('Email'),\n description: message('Email verification status'),\n defaultOperator: FilterOperator.ne,\n control: {\n type: FilterControlType.Select,\n defaultValue: '01',\n options: [\n {\n key: '01',\n label: message('is confirmed'),\n value: {value: null, operator: FilterOperator.ne},\n },\n {\n key: '02',\n label: message('is not confirmed'),\n value: {value: null, operator: FilterOperator.eq},\n },\n ],\n },\n },\n createdAtFilter({\n description: message('Date user registered or was created'),\n }),\n updatedAtFilter({\n description: message('Date user was last updated'),\n }),\n {\n key: 'subscriptions',\n label: message('Subscription'),\n description: message('Whether user is subscribed or not'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: '01',\n options: [\n {\n key: '01',\n label: message('is subscribed'),\n value: {value: '*', operator: FilterOperator.has},\n },\n {\n key: '02',\n label: message('is not subscribed'),\n value: {value: '*', operator: FilterOperator.doesntHave},\n },\n ],\n },\n },\n];\n","import React, {useContext} from 'react';\nimport {GetDatatableDataParams} from '../requests/paginated-resources';\nimport {UseQueryResult} from '@tanstack/react-query';\nimport {PaginatedBackendResponse} from '../../http/backend-response/pagination-response';\n\nexport interface DataTableContextValue<T = unknown, A = unknown> {\n selectedRows: (string | number)[];\n setSelectedRows: (keys: (string | number)[]) => void;\n endpoint: string;\n params: GetDatatableDataParams;\n setParams: (value: GetDatatableDataParams) => void;\n query: UseQueryResult<PaginatedBackendResponse<T> & A, unknown>;\n}\n\nexport const DataTableContext = React.createContext<DataTableContextValue>(\n null!,\n);\n\nexport function useDataTable<T = unknown, A = unknown>() {\n return useContext(DataTableContext) as DataTableContextValue<T, A>;\n}\n","import {UseQueryResult} from '@tanstack/react-query';\nimport {\n hasNextPage,\n LengthAwarePaginationResponse,\n PaginatedBackendResponse,\n} from '../http/backend-response/pagination-response';\nimport {useNumberFormatter} from '../i18n/use-number-formatter';\nimport {Select} from '../ui/forms/select/select';\nimport {Trans} from '../i18n/trans';\nimport {Item} from '../ui/forms/listbox/item';\nimport {IconButton} from '../ui/buttons/icon-button';\nimport {KeyboardArrowLeftIcon} from '../icons/material/KeyboardArrowLeft';\nimport {KeyboardArrowRightIcon} from '../icons/material/KeyboardArrowRight';\nimport React from 'react';\nimport {useIsMobileMediaQuery} from '../utils/hooks/is-mobile-media-query';\nimport clsx from 'clsx';\n\nconst defaultPerPage = 15;\nconst perPageOptions = [{key: 10}, {key: 15}, {key: 20}, {key: 50}, {key: 100}];\n\ntype DataTablePaginationFooterProps = {\n query: UseQueryResult<PaginatedBackendResponse<unknown>, unknown>;\n onPerPageChange?: (perPage: number) => void;\n onPageChange?: (page: number) => void;\n className?: string;\n};\nexport function DataTablePaginationFooter({\n query,\n onPerPageChange,\n onPageChange,\n className,\n}: DataTablePaginationFooterProps) {\n const isMobile = useIsMobileMediaQuery();\n const numberFormatter = useNumberFormatter();\n const pagination = query.data\n ?.pagination as LengthAwarePaginationResponse<any>;\n\n if (!pagination) return null;\n\n const perPageSelect = onPerPageChange ? (\n <Select\n minWidth=\"min-w-auto\"\n selectionMode=\"single\"\n disabled={query.isLoading}\n labelPosition=\"side\"\n size=\"xs\"\n label={<Trans message=\"Items per page\" />}\n selectedValue={pagination.per_page || defaultPerPage}\n onSelectionChange={value => onPerPageChange(value as number)}\n >\n {perPageOptions.map(option => (\n <Item key={option.key} value={option.key}>\n {option.key}\n </Item>\n ))}\n </Select>\n ) : null;\n\n return (\n <div\n className={clsx(\n 'flex h-54 select-none items-center justify-end gap-20 px-20',\n className,\n )}\n >\n {!isMobile && perPageSelect}\n {pagination.from && pagination.to && 'total' in pagination ? (\n <div className=\"text-sm\">\n <Trans\n message=\":from - :to of :total\"\n values={{\n from: pagination.from,\n to: pagination.to,\n total: numberFormatter.format(pagination.total),\n }}\n />\n </div>\n ) : null}\n <div className=\"text-muted\">\n <IconButton\n disabled={query.isFetching || pagination.current_page < 2}\n onClick={() => {\n onPageChange?.(pagination?.current_page - 1);\n }}\n >\n <KeyboardArrowLeftIcon />\n </IconButton>\n <IconButton\n disabled={query.isFetching || !hasNextPage(pagination)}\n onClick={() => {\n onPageChange?.(pagination?.current_page + 1);\n }}\n >\n <KeyboardArrowRightIcon />\n </IconButton>\n </div>\n </div>\n );\n}\n","import React, {ComponentPropsWithoutRef, ReactNode} from 'react';\nimport {BackendFilter} from './filters/backend-filter';\nimport {useTrans} from '../i18n/use-trans';\nimport {TextField} from '../ui/forms/input-field/text-field/text-field';\nimport {SearchIcon} from '../icons/material/Search';\nimport {AddFilterButton} from './filters/add-filter-button';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {message} from '@common/i18n/message';\n\ninterface Props {\n actions?: ReactNode;\n filters?: BackendFilter[];\n filtersLoading?: boolean;\n searchPlaceholder?: MessageDescriptor;\n searchValue?: string;\n onSearchChange: (value: string) => void;\n}\nexport function DataTableHeader({\n actions,\n filters,\n filtersLoading,\n searchPlaceholder = message('Type to search...'),\n searchValue = '',\n onSearchChange,\n}: Props) {\n const {trans} = useTrans();\n return (\n <HeaderLayout>\n <TextField\n size=\"sm\"\n className=\"mr-auto min-w-180 max-w-440 flex-auto\"\n inputWrapperClassName=\"mr-24 md:mr-0\"\n placeholder={trans(searchPlaceholder)}\n startAdornment={<SearchIcon size=\"sm\" />}\n value={searchValue}\n onChange={e => {\n onSearchChange(e.target.value);\n }}\n />\n {filters && (\n <AddFilterButton filters={filters} disabled={filtersLoading} />\n )}\n {actions}\n </HeaderLayout>\n );\n}\n\ninterface AnimatedHeaderProps extends ComponentPropsWithoutRef<'div'> {\n children: ReactNode;\n}\nexport function HeaderLayout({children, ...domProps}: AnimatedHeaderProps) {\n return (\n <div\n className=\"hidden-scrollbar relative mb-24 flex h-42 items-center gap-8 overflow-x-auto text-muted md:gap-12\"\n {...domProps}\n >\n {children}\n </div>\n );\n}\n","import {Trans} from '@common/i18n/trans';\nimport React, {ReactNode} from 'react';\nimport {HeaderLayout} from '@common/datatable/data-table-header';\n\ninterface Props {\n actions?: ReactNode;\n selectedItemsCount: number;\n}\nexport function SelectedStateDatatableHeader({\n actions,\n selectedItemsCount,\n}: Props) {\n return (\n <HeaderLayout data-testid=\"datatable-selected-header\">\n <div className=\"mr-auto\">\n <Trans\n message=\"[one 1 item|other :count items] selected\"\n values={{count: selectedItemsCount}}\n />\n </div>\n {actions}\n </HeaderLayout>\n );\n}\n","import React, {\n cloneElement,\n ComponentProps,\n ReactElement,\n ReactNode,\n useState,\n} from 'react';\nimport {TableDataItem} from '../ui/tables/types/table-data-item';\nimport {BackendFilter} from './filters/backend-filter';\nimport {MessageDescriptor} from '../i18n/message-descriptor';\nimport {ColumnConfig} from './column-config';\nimport {useTrans} from '../i18n/use-trans';\nimport {useBackendFilterUrlParams} from './filters/backend-filter-url-params';\nimport {\n GetDatatableDataParams,\n useDatatableData,\n} from './requests/paginated-resources';\nimport {DataTableContext} from './page/data-table-context';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {ProgressBar} from '../ui/progress/progress-bar';\nimport {Table, TableProps} from '../ui/tables/table';\nimport {DataTablePaginationFooter} from './data-table-pagination-footer';\nimport {DataTableHeader} from './data-table-header';\nimport {FilterList} from './filters/filter-list/filter-list';\nimport {SelectedStateDatatableHeader} from '@common/datatable/selected-state-datatable-header';\nimport clsx from 'clsx';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {BackendFiltersUrlKey} from '@common/datatable/filters/backend-filters-url-key';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {FilterListSkeleton} from '@common/datatable/filters/filter-list/filter-list-skeleton';\n\nexport interface DataTableProps<T extends TableDataItem> {\n filters?: BackendFilter[];\n filtersLoading?: boolean;\n columns: ColumnConfig<T>[];\n searchPlaceholder?: MessageDescriptor;\n queryParams?: Record<string, string | number | undefined | null>;\n endpoint: string;\n resourceName?: ReactNode;\n emptyStateMessage: ReactElement<{isFiltering: boolean}>;\n actions?: ReactNode;\n enableSelection?: boolean;\n selectionStyle?: TableProps<T>['selectionStyle'];\n selectedActions?: ReactNode;\n onRowAction?: TableProps<T>['onAction'];\n tableDomProps?: ComponentProps<'table'>;\n children?: ReactNode;\n collapseTableOnMobile?: boolean;\n cellHeight?: string;\n}\nexport function DataTable<T extends TableDataItem>({\n filters,\n filtersLoading,\n columns,\n searchPlaceholder,\n queryParams,\n endpoint,\n actions,\n selectedActions,\n emptyStateMessage,\n tableDomProps,\n onRowAction,\n enableSelection = true,\n selectionStyle = 'checkbox',\n children,\n cellHeight,\n collapseTableOnMobile = true,\n}: DataTableProps<T>) {\n const isMobile = useIsMobileMediaQuery();\n const {trans} = useTrans();\n const {encodedFilters} = useBackendFilterUrlParams(filters);\n const [params, setParams] = useState<GetDatatableDataParams>({perPage: 15});\n const [selectedRows, setSelectedRows] = useState<(string | number)[]>([]);\n const query = useDatatableData<T>(\n endpoint,\n {\n ...params,\n ...queryParams,\n [BackendFiltersUrlKey]: encodedFilters,\n },\n undefined,\n () => setSelectedRows([]),\n );\n\n const isFiltering = !!(params.query || params.filters || encodedFilters);\n const pagination = query.data?.pagination;\n\n return (\n <DataTableContext.Provider\n value={{\n selectedRows,\n setSelectedRows,\n endpoint,\n params,\n setParams,\n query,\n }}\n >\n {children}\n <AnimatePresence initial={false} mode=\"wait\">\n {selectedRows.length ? (\n <SelectedStateDatatableHeader\n selectedItemsCount={selectedRows.length}\n actions={selectedActions}\n key=\"selected\"\n />\n ) : (\n <DataTableHeader\n searchPlaceholder={searchPlaceholder}\n searchValue={params.query}\n onSearchChange={query => setParams({...params, query})}\n actions={actions}\n filters={filters}\n filtersLoading={filtersLoading}\n key=\"default\"\n />\n )}\n </AnimatePresence>\n\n {filters && (\n <div className=\"mb-14\">\n <AnimatePresence initial={false} mode=\"wait\">\n {filtersLoading && encodedFilters ? (\n <FilterListSkeleton />\n ) : (\n <m.div key=\"filter-list\" {...opacityAnimation}>\n <FilterList filters={filters} />\n </m.div>\n )}\n </AnimatePresence>\n </div>\n )}\n\n <div\n className={clsx(\n 'relative rounded-panel',\n (!isMobile || !collapseTableOnMobile) && 'border',\n )}\n >\n {query.isFetching && (\n <ProgressBar\n isIndeterminate\n className=\"absolute left-0 top-0 z-10 w-full\"\n aria-label={trans({message: 'Loading'})}\n size=\"xs\"\n />\n )}\n\n <div className=\"relative overflow-x-auto md:overflow-hidden\">\n <Table\n {...tableDomProps}\n columns={columns}\n data={pagination?.data || []}\n sortDescriptor={params}\n onSortChange={descriptor => {\n setParams({...params, ...descriptor});\n }}\n selectedRows={selectedRows}\n enableSelection={enableSelection}\n selectionStyle={selectionStyle}\n onSelectionChange={setSelectedRows}\n onAction={onRowAction}\n collapseOnMobile={collapseTableOnMobile}\n cellHeight={cellHeight}\n />\n </div>\n\n {(query.isFetched || query.isPlaceholderData) &&\n !pagination?.data.length ? (\n <div className=\"pt-50\">\n {cloneElement(emptyStateMessage, {\n isFiltering,\n })}\n </div>\n ) : undefined}\n\n <DataTablePaginationFooter\n query={query}\n onPageChange={page => setParams({...params, page})}\n onPerPageChange={perPage => setParams({...params, perPage})}\n />\n </div>\n </DataTableContext.Provider>\n );\n}\n","import React, {ReactElement, ReactNode, useId} from 'react';\nimport {TableDataItem} from '../../ui/tables/types/table-data-item';\nimport {DataTable, DataTableProps} from '../data-table';\nimport {TableProps} from '../../ui/tables/table';\nimport {StaticPageTitle} from '../../seo/static-page-title';\nimport {MessageDescriptor} from '../../i18n/message-descriptor';\nimport clsx from 'clsx';\n\ninterface Props<T extends TableDataItem> extends DataTableProps<T> {\n title?: ReactElement<MessageDescriptor>;\n headerContent?: ReactNode;\n headerItemsAlign?: string;\n enableSelection?: boolean;\n onRowAction?: TableProps<T>['onAction'];\n padding?: string;\n className?: string;\n}\nexport function DataTablePage<T extends TableDataItem>({\n title,\n headerContent,\n headerItemsAlign = 'items-end',\n className,\n padding,\n ...dataTableProps\n}: Props<T>) {\n const titleId = useId();\n\n return (\n <div className={clsx(padding ?? 'p-12 md:p-24', className)}>\n {title && (\n <div\n className={clsx(\n 'mb-16',\n headerContent && `flex ${headerItemsAlign} gap-4`,\n )}\n >\n <StaticPageTitle>{title}</StaticPageTitle>\n <h1 className=\"text-3xl font-light first:capitalize\" id={titleId}>\n {title}\n </h1>\n {headerContent}\n </div>\n )}\n\n <DataTable\n {...dataTableProps}\n tableDomProps={{\n 'aria-labelledby': title ? titleId : undefined,\n }}\n />\n </div>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {toast} from '../../ui/toast/toast';\nimport {DatatableDataQueryKey} from './paginated-resources';\nimport {useDataTable} from '../page/data-table-context';\nimport {message} from '../../i18n/message';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\nimport {Key} from 'react';\n\ninterface Response extends BackendResponse {\n //\n}\n\nexport function useDeleteSelectedRows() {\n const {endpoint, selectedRows, setSelectedRows} = useDataTable();\n return useMutation({\n mutationFn: () => deleteSelectedRows(endpoint, selectedRows),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey(endpoint),\n });\n toast(\n message('Deleted [one 1 record|other :count records]', {\n values: {count: selectedRows.length},\n }),\n );\n setSelectedRows([]);\n },\n onError: err =>\n showHttpErrorToast(err, message('Could not delete records')),\n });\n}\n\nfunction deleteSelectedRows(endpoint: string, ids: Key[]): Promise<Response> {\n return apiClient.delete(`${endpoint}/${ids.join(',')}`).then(r => r.data);\n}\n","import {Button} from '../../ui/buttons/button';\nimport {Trans} from '../../i18n/trans';\nimport {ConfirmationDialog} from '../../ui/overlays/dialog/confirmation-dialog';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport React from 'react';\nimport {useDeleteSelectedRows} from '../requests/delete-selected-rows';\nimport {useDataTable} from './data-table-context';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {errorStatusIs} from '@common/utils/http/error-status-is';\n\nexport function DeleteSelectedItemsAction() {\n return (\n <DialogTrigger type=\"modal\">\n <Button variant=\"flat\" color=\"danger\" className=\"ml-auto\">\n <Trans message=\"Delete\" />\n </Button>\n <DeleteItemsDialog />\n </DialogTrigger>\n );\n}\n\nfunction DeleteItemsDialog() {\n const deleteSelectedRows = useDeleteSelectedRows();\n const {selectedRows, setSelectedRows} = useDataTable();\n const {close} = useDialogContext();\n return (\n <ConfirmationDialog\n isLoading={deleteSelectedRows.isPending}\n title={\n <Trans\n message=\"Delete [one 1 item|other :count items]?\"\n values={{count: selectedRows.length}}\n />\n }\n body={\n <Trans message=\"This will permanently remove the items and cannot be undone.\" />\n }\n confirm={<Trans message=\"Delete\" />}\n isDanger\n onConfirm={() => {\n deleteSelectedRows.mutate(undefined, {\n onSuccess: () => close(),\n onError: err => {\n if (errorStatusIs(err, 422)) {\n setSelectedRows([]);\n close();\n }\n },\n });\n }}\n />\n );\n}\n","import React, {ReactNode} from 'react';\nimport {IllustratedMessage} from '../../ui/images/illustrated-message';\nimport {SvgImage} from '../../ui/images/svg-image/svg-image';\nimport {Trans} from '../../i18n/trans';\nimport {useIsMobileMediaQuery} from '../../utils/hooks/is-mobile-media-query';\n\nexport interface DataTableEmptyStateMessageProps {\n isFiltering?: boolean;\n title: ReactNode;\n filteringTitle?: ReactNode;\n image: string;\n size?: 'sm' | 'md';\n className?: string;\n}\nexport function DataTableEmptyStateMessage({\n isFiltering,\n title,\n filteringTitle,\n image,\n size,\n className,\n}: DataTableEmptyStateMessageProps) {\n const isMobile = useIsMobileMediaQuery();\n if (!size) {\n size = isMobile ? 'sm' : 'md';\n }\n\n // allow user to disable filtering message variation by not passing in \"filteringTitle\"\n return (\n <IllustratedMessage\n className={className}\n size={size}\n image={<SvgImage src={image} />}\n title={isFiltering && filteringTitle ? filteringTitle : title}\n description={\n isFiltering && filteringTitle ? (\n <Trans message=\"Try another search query or different filters\" />\n ) : undefined\n }\n />\n );\n}\n","export default \"__VITE_ASSET__d109d853__\"","import {AddIcon} from '../icons/material/Add';\nimport {Button} from '../ui/buttons/button';\nimport React, {ReactElement, ReactNode} from 'react';\nimport {useIsMobileMediaQuery} from '../utils/hooks/is-mobile-media-query';\nimport {IconButton} from '../ui/buttons/icon-button';\nimport {To} from 'react-router-dom';\nimport {ButtonBaseProps} from '../ui/buttons/button-base';\n\nexport interface DataTableAddItemButtonProps {\n children: ReactNode;\n to?: To;\n href?: string;\n download?: boolean | string;\n elementType?: ButtonBaseProps['elementType'];\n onClick?: ButtonBaseProps['onClick'];\n icon?: ReactElement;\n disabled?: boolean;\n}\nexport const DataTableAddItemButton = React.forwardRef<\n HTMLButtonElement,\n DataTableAddItemButtonProps\n>(\n (\n {children, to, elementType, onClick, href, download, icon, disabled},\n ref,\n ) => {\n const isMobile = useIsMobileMediaQuery();\n\n if (isMobile) {\n return (\n <IconButton\n ref={ref}\n variant=\"flat\"\n color=\"primary\"\n className=\"flex-shrink-0\"\n size=\"sm\"\n to={to}\n href={href}\n download={download}\n elementType={elementType}\n onClick={onClick}\n disabled={disabled}\n >\n {icon || <AddIcon />}\n </IconButton>\n );\n }\n\n return (\n <Button\n ref={ref}\n startIcon={icon || <AddIcon />}\n variant=\"flat\"\n color=\"primary\"\n size=\"sm\"\n to={to}\n href={href}\n download={download}\n elementType={elementType}\n onClick={onClick}\n disabled={disabled}\n >\n {children}\n </Button>\n );\n },\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FileDownloadIcon = createSvgIcon(\n <path d=\"M18 15v3H6v-3H4v3c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-3h-2zm-1-4-1.41-1.41L13 12.17V4h-2v8.17L8.41 9.59 7 11l5 5 5-5z\" />\n, 'FileDownloadOutlined');\n","import {apiClient} from '../../http/query-client';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n downloadPath?: string;\n result?: 'jobQueued';\n}\n\nexport type ExportCsvPayload = Record<string, string | number | undefined>;\n\nexport function useExportCsv(endpoint: string) {\n return useMutation({\n mutationFn: (payload?: ExportCsvPayload) => exportCsv(endpoint, payload),\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction exportCsv(\n endpoint: string,\n payload: ExportCsvPayload | undefined,\n): Promise<Response> {\n return apiClient.post(endpoint, payload).then(r => r.data);\n}\n","export function downloadFileFromUrl(url: string, name?: string) {\n const link = document.createElement('a');\n link.href = url;\n if (name) link.download = name;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\n","import {DialogBody} from '../../ui/overlays/dialog/dialog-body';\nimport {DialogFooter} from '../../ui/overlays/dialog/dialog-footer';\nimport {DialogHeader} from '../../ui/overlays/dialog/dialog-header';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {Dialog} from '../../ui/overlays/dialog/dialog';\nimport {Button} from '../../ui/buttons/button';\nimport {Trans} from '../../i18n/trans';\n\nexport function CsvExportInfoDialog() {\n const {close} = useDialogContext();\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Csv export\" />\n </DialogHeader>\n <DialogBody>\n <Trans\n message=\"Your request is being processed. We'll email you when the report is ready to download. In\n certain cases, it might take a little longer, depending on the number of items beings\n exported and the volume of activity.\"\n />\n </DialogBody>\n <DialogFooter>\n <Button variant=\"flat\" color=\"primary\" onClick={close}>\n <Trans message=\"Got it\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {IconButton} from '../../ui/buttons/icon-button';\nimport {FileDownloadIcon} from '../../icons/material/FileDownload';\nimport React, {Fragment, useState} from 'react';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {ExportCsvPayload, useExportCsv} from '../requests/use-export-csv';\nimport {downloadFileFromUrl} from '../../uploads/utils/download-file-from-url';\nimport {CsvExportInfoDialog} from './csv-export-info-dialog';\n\ninterface DataTableExportCsvButtonProps {\n endpoint: string;\n payload?: ExportCsvPayload;\n}\nexport function DataTableExportCsvButton({\n endpoint,\n payload,\n}: DataTableExportCsvButtonProps) {\n const [dialogIsOpen, setDialogIsOpen] = useState(false);\n const exportCsv = useExportCsv(endpoint);\n\n return (\n <Fragment>\n <IconButton\n variant=\"outline\"\n color=\"primary\"\n size=\"sm\"\n className=\"flex-shrink-0\"\n disabled={exportCsv.isPending}\n onClick={() => {\n exportCsv.mutate(payload, {\n onSuccess: response => {\n if (response.downloadPath) {\n downloadFileFromUrl(response.downloadPath);\n } else {\n setDialogIsOpen(true);\n }\n },\n });\n }}\n >\n <FileDownloadIcon />\n </IconButton>\n <DialogTrigger\n type=\"modal\"\n isOpen={dialogIsOpen}\n onOpenChange={setDialogIsOpen}\n >\n <CsvExportInfoDialog />\n </DialogTrigger>\n </Fragment>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PersonOffIcon = createSvgIcon(\n <path d=\"m20 17.17-3.37-3.38c.64.22 1.23.48 1.77.76.97.51 1.58 1.52 1.6 2.62zm1.19 4.02-1.41 1.41-2.61-2.6H4v-2.78c0-1.12.61-2.15 1.61-2.66 1.29-.66 2.87-1.22 4.67-1.45L1.39 4.22 2.8 2.81l18.39 18.38zM15.17 18l-3-3H12c-2.37 0-4.29.73-5.48 1.34-.32.16-.52.5-.52.88V18h9.17zM12 6c1.1 0 2 .9 2 2 0 .86-.54 1.59-1.3 1.87l1.48 1.48C15.28 10.64 16 9.4 16 8c0-2.21-1.79-4-4-4-1.4 0-2.64.72-3.35 1.82l1.48 1.48C10.41 6.54 11.14 6 12 6z\" />\n, 'PersonOffOutlined');\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {User} from '@common/auth/user';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {toast} from '@common/ui/toast/toast';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {message} from '@common/i18n/message';\n\ninterface Response extends BackendResponse {\n user: User;\n}\n\nexport interface BanUserPayload {\n ban_until?: string;\n permanent?: boolean;\n comment?: string;\n}\n\nexport function useBanUser(\n form: UseFormReturn<BanUserPayload>,\n userId: number,\n) {\n return useMutation({\n mutationFn: (payload: BanUserPayload) => banUser(userId, payload),\n onSuccess: async () => {\n toast(message('User suspended'));\n await queryClient.invalidateQueries({queryKey: ['users']});\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction banUser(userId: number, payload: BanUserPayload): Promise<Response> {\n return apiClient.post(`users/${userId}/ban`, payload).then(r => r.data);\n}\n","import {useControlledState} from '@react-stately/utils';\nimport {HTMLAttributes, useCallback, useState} from 'react';\nimport {\n CalendarDate,\n DateValue,\n isSameDay,\n toCalendarDate,\n toZoned,\n ZonedDateTime,\n} from '@internationalized/date';\nimport {useBaseDatePickerState} from '../use-base-date-picker-state';\nimport {useCurrentDateTime} from '@common/i18n/use-current-date-time';\n\nexport type Granularity = 'day' | 'minute';\n\nexport type DatePickerState = BaseDatePickerState;\n\nexport interface BaseDatePickerState<T = ZonedDateTime, P = boolean> {\n timezone: string;\n granularity: Granularity;\n selectedValue: T;\n setSelectedValue: (value: T) => void;\n calendarIsOpen: boolean;\n setCalendarIsOpen: (isOpen: boolean) => void;\n calendarDates: CalendarDate[];\n setCalendarDates: (dates: CalendarDate[]) => void;\n dayIsActive: (day: CalendarDate) => boolean;\n dayIsHighlighted: (day: CalendarDate) => boolean;\n dayIsRangeStart: (day: CalendarDate) => boolean;\n dayIsRangeEnd: (day: CalendarDate) => boolean;\n isPlaceholder: P;\n setIsPlaceholder: (value: P) => void;\n clear: () => void;\n min?: ZonedDateTime;\n max?: ZonedDateTime;\n closeDialogOnSelection: boolean;\n getCellProps: (\n date: CalendarDate,\n isSameMonth: boolean,\n ) => HTMLAttributes<HTMLElement>;\n}\n\nexport interface DatePickerValueProps<V, CV = V> {\n value?: V | null | '';\n defaultValue?: V | null;\n onChange?: (value: CV | null) => void;\n min?: DateValue;\n max?: DateValue;\n granularity?: Granularity;\n closeDialogOnSelection?: boolean;\n}\nexport function useDatePickerState(\n props: DatePickerValueProps<ZonedDateTime>,\n): BaseDatePickerState {\n const now = useCurrentDateTime();\n const [isPlaceholder, setIsPlaceholder] = useState(\n !props.value && !props.defaultValue,\n );\n\n // if user clears the date, we will want to still keep an\n // instance internally, but return null via \"onChange\" callback\n const setStateValue = props.onChange;\n const [internalValue, setInternalValue] = useControlledState(\n props.value || now,\n props.defaultValue || now,\n value => {\n setIsPlaceholder(false);\n setStateValue?.(value);\n },\n );\n\n const {\n min,\n max,\n granularity,\n timezone,\n calendarIsOpen,\n setCalendarIsOpen,\n closeDialogOnSelection,\n } = useBaseDatePickerState(internalValue, props);\n\n const clear = useCallback(() => {\n setIsPlaceholder(true);\n setInternalValue(now);\n setStateValue?.(null);\n setCalendarIsOpen(false);\n }, [now, setInternalValue, setStateValue, setCalendarIsOpen]);\n\n const [calendarDates, setCalendarDates] = useState<CalendarDate[]>(() => {\n return [toCalendarDate(internalValue)];\n });\n\n const setSelectedValue = useCallback(\n (newValue: DateValue) => {\n if (min && newValue.compare(min) < 0) {\n newValue = min;\n } else if (max && newValue.compare(max) > 0) {\n newValue = max;\n }\n\n // preserve time\n const value = internalValue\n ? internalValue.set(newValue)\n : toZoned(newValue, timezone);\n setInternalValue(value);\n setCalendarDates([toCalendarDate(value)]);\n setIsPlaceholder(false);\n },\n [setInternalValue, min, max, internalValue, timezone],\n );\n\n const dayIsActive = useCallback(\n (day: DateValue) => !isPlaceholder && isSameDay(internalValue, day),\n [internalValue, isPlaceholder],\n );\n\n const getCellProps = useCallback(\n (date: DateValue): HTMLAttributes<HTMLElement> => {\n return {\n onClick: () => {\n setSelectedValue?.(date);\n if (closeDialogOnSelection) {\n setCalendarIsOpen?.(false);\n }\n },\n };\n },\n [setSelectedValue, setCalendarIsOpen, closeDialogOnSelection],\n );\n\n return {\n selectedValue: internalValue,\n setSelectedValue: setInternalValue,\n calendarIsOpen,\n setCalendarIsOpen,\n dayIsActive,\n dayIsHighlighted: () => false,\n dayIsRangeStart: () => false,\n dayIsRangeEnd: () => false,\n getCellProps,\n calendarDates,\n setCalendarDates,\n isPlaceholder,\n clear,\n setIsPlaceholder,\n min,\n max,\n granularity,\n timezone,\n closeDialogOnSelection,\n };\n}\n","import React, {\n ComponentPropsWithoutRef,\n Fragment,\n MouseEvent,\n useRef,\n} from 'react';\nimport {parseAbsoluteToLocal, ZonedDateTime} from '@internationalized/date';\nimport {useController} from 'react-hook-form';\nimport {mergeProps} from '@react-aria/utils';\nimport {\n DatePickerValueProps,\n useDatePickerState,\n} from './use-date-picker-state';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {DateRangeIcon} from '@common/icons/material/DateRange';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {Calendar} from '../calendar/calendar';\nimport {\n DatePickerField,\n DatePickerFieldProps,\n} from '../date-range-picker/date-picker-field';\nimport {DateSegmentList} from '../segments/date-segment-list';\nimport {useDateFormatter} from '@common/i18n/use-date-formatter';\nimport {useTrans} from '@common/i18n/use-trans';\nimport clsx from 'clsx';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {Trans} from '@common/i18n/trans';\nimport {useCurrentDateTime} from '@common/i18n/use-current-date-time';\n\nexport interface DatePickerProps\n extends Omit<DatePickerFieldProps, 'children'>,\n DatePickerValueProps<ZonedDateTime> {}\nexport function DatePicker({showCalendarFooter, ...props}: DatePickerProps) {\n const state = useDatePickerState(props);\n const inputRef = useRef<HTMLDivElement>(null);\n const now = useCurrentDateTime();\n\n const footer = showCalendarFooter && (\n <DialogFooter\n padding=\"px-14 pb-14\"\n startAction={\n <Button\n disabled={state.isPlaceholder}\n variant=\"text\"\n color=\"primary\"\n onClick={() => {\n state.clear();\n }}\n >\n <Trans message=\"Clear\" />\n </Button>\n }\n >\n <Button\n variant=\"text\"\n color=\"primary\"\n onClick={() => {\n state.setSelectedValue(now);\n state.setCalendarIsOpen(false);\n }}\n >\n <Trans message=\"Today\" />\n </Button>\n </DialogFooter>\n );\n\n const dialog = (\n <DialogTrigger\n offset={8}\n placement=\"bottom-start\"\n isOpen={state.calendarIsOpen}\n onOpenChange={state.setCalendarIsOpen}\n type=\"popover\"\n triggerRef={inputRef}\n returnFocusToTrigger={false}\n moveFocusToDialog={false}\n >\n <Dialog size=\"auto\">\n <DialogBody\n className=\"flex items-start gap-40\"\n padding={showCalendarFooter ? 'px-24 pt-20 pb-10' : null}\n >\n <Calendar state={state} visibleMonths={1} />\n </DialogBody>\n {footer}\n </Dialog>\n </DialogTrigger>\n );\n\n const openOnClick: ComponentPropsWithoutRef<'div'> = {\n onClick: e => {\n e.stopPropagation();\n e.preventDefault();\n if (!isHourSegment(e)) {\n state.setCalendarIsOpen(true);\n } else {\n state.setCalendarIsOpen(false);\n }\n },\n };\n\n return (\n <Fragment>\n <DatePickerField\n ref={inputRef}\n wrapperProps={openOnClick}\n endAdornment={\n <DateRangeIcon className={clsx(props.disabled && 'text-disabled')} />\n }\n {...props}\n >\n <DateSegmentList\n segmentProps={openOnClick}\n state={state}\n value={state.selectedValue}\n onChange={state.setSelectedValue}\n isPlaceholder={state.isPlaceholder}\n />\n </DatePickerField>\n {dialog}\n </Fragment>\n );\n}\n\ninterface FormDatePickerProps extends DatePickerProps {\n name: string;\n}\nexport function FormDatePicker(props: FormDatePickerProps) {\n const {min, max} = props;\n const {trans} = useTrans();\n const {format} = useDateFormatter();\n const {\n field: {onChange, onBlur, value = null, ref},\n fieldState: {invalid, error},\n } = useController({\n name: props.name,\n rules: {\n validate: v => {\n if (!v) return;\n const date = parseAbsoluteToLocal(v);\n if (min && date.compare(min) < 0) {\n return trans({\n message: 'Enter a date after :date',\n values: {date: format(v)},\n });\n }\n if (max && date.compare(max) > 0) {\n return trans({\n message: 'Enter a date before :date',\n values: {date: format(v)},\n });\n }\n },\n },\n });\n\n const parsedValue: null | ZonedDateTime = value\n ? parseAbsoluteToLocal(value)\n : null;\n\n const formProps: Partial<DatePickerProps> = {\n onChange: e => {\n onChange(e ? e.toAbsoluteString() : e);\n },\n onBlur,\n value: parsedValue,\n invalid,\n errorMessage: error?.message,\n inputRef: ref,\n };\n\n return <DatePicker {...mergeProps(formProps, props)} />;\n}\n\nfunction isHourSegment(e: MouseEvent<HTMLDivElement>): boolean {\n return ['hour', 'minute', 'dayPeriod'].includes(\n (e.currentTarget as HTMLElement).ariaLabel || ''\n );\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Form} from '@common/ui/forms/form';\nimport {useForm} from 'react-hook-form';\nimport {\n BanUserPayload,\n useBanUser,\n} from '@common/admin/users/requests/use-ban-user';\nimport {FormDatePicker} from '@common/ui/forms/input-field/date/date-picker/date-picker';\nimport {User} from '@common/auth/user';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\n\ninterface Props {\n user: User;\n}\nexport function BanUserDialog({user}: Props) {\n const {trans} = useTrans();\n const {close, formId} = useDialogContext();\n const form = useForm<BanUserPayload>({\n defaultValues: {\n permanent: true,\n },\n });\n const isPermanent = form.watch('permanent');\n const banUser = useBanUser(form, user.id);\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Suspend “:name“\" values={{name: user.display_name}} />\n </DialogHeader>\n <DialogBody>\n <Form\n id={formId}\n form={form}\n onSubmit={values =>\n banUser.mutate(values, {onSuccess: () => close()})\n }\n >\n <FormDatePicker\n name=\"ban_until\"\n label={<Trans message=\"Suspend until\" />}\n disabled={isPermanent}\n />\n <FormSwitch name=\"permanent\" className=\"mt-12\">\n <Trans message=\"Permanent\" />\n </FormSwitch>\n <FormTextField\n className=\"mt-24\"\n name=\"comment\"\n inputElementType=\"textarea\"\n maxLength={250}\n label={<Trans message=\"Reason\" />}\n placeholder={trans(message('Optional'))}\n />\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button onClick={() => close()}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n form={formId}\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n disabled={banUser.isPending}\n >\n <Trans message=\"Suspend\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {toast} from '@common/ui/toast/toast';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {message} from '@common/i18n/message';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\nexport function useUnbanUser(userId: number) {\n return useMutation({\n mutationFn: () => unbanUser(userId),\n onSuccess: () => {\n toast(message('User unsuspended'));\n queryClient.invalidateQueries({queryKey: ['users']});\n },\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction unbanUser(userId: number): Promise<Response> {\n return apiClient.delete(`users/${userId}/unban`).then(r => r.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {toast} from '@common/ui/toast/toast';\nimport {apiClient} from '@common/http/query-client';\nimport {message} from '@common/i18n/message';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {User} from '@common/auth/user';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n user: User;\n}\n\ninterface Payload {\n userId: string | number;\n}\n\nexport function useImpersonateUser() {\n return useMutation({\n mutationFn: (payload: Payload) => impersonateUser(payload),\n onSuccess: async response => {\n toast(message(`Impersonating User \"${response.user.display_name}\"`));\n window.location.href = '/';\n },\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction impersonateUser(payload: Payload) {\n return apiClient\n .post<Response>(`admin/users/impersonate/${payload.userId}`, payload)\n .then(r => r.data);\n}\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {User} from '@common/auth/user';\nimport {Trans} from '@common/i18n/trans';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {CheckIcon} from '@common/icons/material/Check';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {ChipList} from '@common/ui/forms/input-field/chip-field/chip-list';\nimport {Chip} from '@common/ui/forms/input-field/chip-field/chip';\nimport {Link} from 'react-router-dom';\nimport clsx from 'clsx';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {PersonOffIcon} from '@common/icons/material/PersonOff';\nimport {BanUserDialog} from '@common/admin/users/ban-user-dialog';\nimport React from 'react';\nimport {useUnbanUser} from '@common/admin/users/requests/use-unban-user';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport {useImpersonateUser} from '@common/admin/users/requests/use-impersonate-user';\nimport {LoginIcon} from '@common/icons/material/Login';\n\nexport const userDatatableColumns: ColumnConfig<User>[] = [\n {\n key: 'name',\n allowsSorting: true,\n sortingKey: 'email',\n width: 'flex-3 min-w-200',\n visibleInMode: 'all',\n header: () => <Trans message=\"User\" />,\n body: user => (\n <NameWithAvatar\n image={user.avatar}\n label={user.display_name}\n description={user.email}\n />\n ),\n },\n {\n key: 'subscribed',\n header: () => <Trans message=\"Subscribed\" />,\n width: 'w-96',\n body: user =>\n user.subscriptions?.length ? (\n <CheckIcon className=\"text-positive icon-md\" />\n ) : (\n <CloseIcon className=\"text-danger icon-md\" />\n ),\n },\n {\n key: 'roles',\n header: () => <Trans message=\"Roles\" />,\n body: user => (\n <ChipList radius=\"rounded\" size=\"xs\">\n {user?.roles?.map(role => (\n <Chip key={role.id} selectable>\n <Link\n className={clsx('capitalize')}\n target=\"_blank\"\n to={`/admin/roles/${role.id}/edit`}\n >\n <Trans message={role.name} />\n </Link>\n </Chip>\n ))}\n </ChipList>\n ),\n },\n {\n key: 'firstName',\n allowsSorting: true,\n header: () => <Trans message=\"First name\" />,\n body: user => user.first_name,\n },\n {\n key: 'lastName',\n allowsSorting: true,\n header: () => <Trans message=\"Last name\" />,\n body: user => user.last_name,\n },\n {\n key: 'createdAt',\n allowsSorting: true,\n width: 'w-96',\n header: () => <Trans message=\"Created at\" />,\n body: user => (\n <time>\n <FormattedDate date={user.created_at} />\n </time>\n ),\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n width: 'w-128 flex-shrink-0',\n hideHeader: true,\n align: 'end',\n visibleInMode: 'all',\n body: user => (\n <div className=\"text-muted\">\n <Link to={`${user.id}/edit`}>\n <Tooltip label={<Trans message=\"Edit user\" />}>\n <IconButton size=\"md\">\n <EditIcon />\n </IconButton>\n </Tooltip>\n </Link>\n {user.banned_at ? (\n <UnbanButton user={user} />\n ) : (\n <DialogTrigger type=\"modal\">\n <Tooltip label={<Trans message=\"Suspend user\" />}>\n <IconButton size=\"md\">\n <PersonOffIcon />\n </IconButton>\n </Tooltip>\n <BanUserDialog user={user} />\n </DialogTrigger>\n )}\n <ImpersonateButton user={user} />\n </div>\n ),\n },\n];\n\ninterface UnbanButtonProps {\n user: User;\n}\nfunction UnbanButton({user}: UnbanButtonProps) {\n const unban = useUnbanUser(user.id);\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={confirmed => {\n if (confirmed) {\n unban.mutate();\n }\n }}\n >\n <Tooltip label={<Trans message=\"Remove suspension\" />}>\n <IconButton size=\"md\" color=\"danger\">\n <PersonOffIcon />\n </IconButton>\n </Tooltip>\n <ConfirmationDialog\n isDanger\n title={\n <Trans message=\"Suspend “:name“\" values={{name: user.display_name}} />\n }\n body={\n <Trans message=\"Are you sure you want to remove suspension from this user?\" />\n }\n confirm={<Trans message=\"Unsuspend\" />}\n />\n </DialogTrigger>\n );\n}\n\ninterface ImpersonateButtonProps {\n user: User;\n}\nfunction ImpersonateButton({user}: ImpersonateButtonProps) {\n const impersonate = useImpersonateUser();\n return (\n <DialogTrigger type=\"modal\">\n <Tooltip label={<Trans message=\"Login as user\" />}>\n <IconButton size=\"md\">\n <LoginIcon />\n </IconButton>\n </Tooltip>\n <ConfirmationDialog\n title={\n <Trans\n message=\"Login as “:name“\"\n values={{name: user.display_name}}\n />\n }\n isLoading={impersonate.isPending}\n body={<Trans message=\"Are you sure you want to login as this user?\" />}\n confirm={<Trans message=\"Login\" />}\n onConfirm={() => {\n impersonate.mutate({userId: user.id});\n }}\n />\n </DialogTrigger>\n );\n}\n","import React, {Fragment} from 'react';\nimport {Link} from 'react-router-dom';\nimport {UserDatatableFilters} from './user-datatable-filters';\nimport {DataTablePage} from '../../datatable/page/data-table-page';\nimport {Trans} from '../../i18n/trans';\nimport {DeleteSelectedItemsAction} from '../../datatable/page/delete-selected-items-action';\nimport {DataTableEmptyStateMessage} from '../../datatable/page/data-table-emty-state-message';\nimport teamSvg from '../roles/team.svg';\nimport {DataTableAddItemButton} from '../../datatable/data-table-add-item-button';\nimport {DataTableExportCsvButton} from '../../datatable/csv-export/data-table-export-csv-button';\nimport {useSettings} from '../../core/settings/use-settings';\nimport {userDatatableColumns} from '@common/admin/users/user-datatable-columns';\n\nexport function UserDatatable() {\n const {billing} = useSettings();\n\n const filteredColumns = !billing.enable\n ? userDatatableColumns.filter(c => c.key !== 'subscribed')\n : userDatatableColumns;\n\n return (\n <Fragment>\n <DataTablePage\n endpoint=\"users\"\n title={<Trans message=\"Users\" />}\n filters={UserDatatableFilters}\n columns={filteredColumns}\n actions={<Actions />}\n queryParams={{with: 'subscriptions,bans'}}\n selectedActions={<DeleteSelectedItemsAction />}\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={teamSvg}\n title={<Trans message=\"No users have been created yet\" />}\n filteringTitle={<Trans message=\"No matching users\" />}\n />\n }\n />\n </Fragment>\n );\n}\n\nfunction Actions() {\n return (\n <Fragment>\n <DataTableExportCsvButton endpoint=\"users/csv/export\" />\n <DataTableAddItemButton elementType={Link} to=\"new\">\n <Trans message=\"Add new user\" />\n </DataTableAddItemButton>\n </Fragment>\n );\n}\n","export function chunkArray<T>(array: T[], chunkSize: number): T[][] {\n return array.reduce<any>((resultArray, item, index) => {\n const chunkIndex = Math.floor(index / chunkSize);\n\n if (!resultArray[chunkIndex]) {\n resultArray[chunkIndex] = [];\n }\n\n resultArray[chunkIndex].push(item);\n\n return resultArray;\n }, []);\n}\n","import {\n IAppearanceConfig,\n MenuSectionConfig,\n} from '@common/admin/appearance/types/appearance-editor-config';\nimport {message} from '@common/i18n/message';\nimport {chunkArray} from '@common/utils/array/chunk-array';\nimport {AppearanceEditorBreadcrumbItem} from '@common/admin/appearance/types/appearance-editor-section';\n\nexport const DefaultAppearanceConfig: IAppearanceConfig = {\n preview: {\n defaultRoute: '/',\n navigationRoutes: [],\n },\n sections: {\n general: {\n label: message('General'),\n position: 1,\n buildBreadcrumb: () => [\n {\n label: message('General'),\n location: `general`,\n },\n ],\n },\n themes: {\n label: message('Themes'),\n position: 2,\n buildBreadcrumb: (pathname, formValue) => {\n const parts = pathname.split('/').filter(p => !!p);\n const [, , , themeIndex] = parts;\n const breadcrumb: AppearanceEditorBreadcrumbItem[] = [\n {\n label: message('Themes'),\n location: `themes`,\n },\n ];\n if (themeIndex != null) {\n breadcrumb.push({\n label: formValue.appearance.themes.all[+themeIndex]?.name,\n location: `themes/${themeIndex}`,\n });\n }\n if (parts.at(-1) === 'font') {\n breadcrumb.push({\n label: message('Font'),\n location: `themes/${themeIndex}/font`,\n });\n }\n if (parts.at(-1) === 'radius') {\n breadcrumb.push({\n label: message('Rounding'),\n location: `themes/${themeIndex}/radius`,\n });\n }\n return breadcrumb;\n },\n },\n menus: {\n label: message('Menus'),\n position: 3,\n buildBreadcrumb: (pathname, formValue) => {\n // /admin/appearance/menus/0/items/1\n const parts = pathname.split('/').filter(p => !!p);\n const [, , ...rest] = parts;\n // admin/appearance\n const breadcrumb: AppearanceEditorBreadcrumbItem[] = [\n {\n label: message('Menus'),\n location: 'menus',\n },\n ];\n // chunk every two items: [form group, item index]\n const chunked = chunkArray(rest, 2);\n chunked.forEach(([sectionName, sectionIndex], chunkIndex) => {\n // menu\n if (sectionName === 'menus' && sectionIndex != null) {\n breadcrumb.push({\n label: formValue.settings.menus[+sectionIndex]?.name,\n location: `menus/${sectionIndex}`,\n });\n // menu item\n } else if (sectionName === 'items' && sectionIndex != null) {\n const [, menuIndex] = chunked[chunkIndex - 1];\n breadcrumb.push({\n label:\n formValue.settings.menus[+menuIndex].items[+sectionIndex]\n ?.label,\n location: `menus/${menuIndex}/${sectionIndex}`,\n });\n }\n });\n return breadcrumb;\n },\n config: {\n availableRoutes: [\n '/',\n '/login',\n '/register',\n '/contact',\n '/pricing',\n '/account-settings',\n '/admin',\n '/admin/appearance',\n '/admin/settings',\n '/admin/plans',\n '/admin/subscriptions',\n '/admin/users',\n '/admin/roles',\n '/admin/pages',\n '/admin/tags',\n '/admin/files',\n '/admin/localizations',\n '/admin/ads',\n '/admin/settings/authentication',\n '/admin/settings/branding',\n '/admin/settings/cache',\n '/admin/settings/providers',\n '/api-docs',\n ],\n positions: [\n 'admin-navbar',\n 'admin-sidebar',\n 'custom-page-navbar',\n 'auth-page-footer',\n 'auth-dropdown',\n 'account-settings-page',\n 'billing-page',\n 'checkout-page-navbar',\n 'checkout-page-footer',\n 'pricing-table-page',\n 'contact-us-page',\n 'notifications-page',\n 'footer',\n 'footer-secondary',\n ],\n } as MenuSectionConfig,\n },\n 'custom-code': {\n label: message('Custom Code'),\n position: 4,\n buildBreadcrumb: () => [\n {\n label: message('Custom code'),\n location: `custom-code`,\n },\n ],\n },\n 'seo-settings': {\n label: message('SEO Settings'),\n position: 5,\n buildBreadcrumb: () => [\n {\n label: message('SEO'),\n location: `seo`,\n },\n ],\n },\n },\n};\n","import clsx from 'clsx';\nimport {forwardRef, ReactNode} from 'react';\nimport {KeyboardArrowRightIcon} from '../../icons/material/KeyboardArrowRight';\nimport {ButtonBase, ButtonBaseProps} from '../../ui/buttons/button-base';\n\ninterface Props extends ButtonBaseProps {\n startIcon?: ReactNode;\n description?: ReactNode;\n}\nexport const AppearanceButton = forwardRef<HTMLButtonElement, Props>(\n ({startIcon, children, className, description, ...other}, ref) => {\n return (\n <ButtonBase\n ref={ref}\n display=\"flex\"\n className={clsx(\n 'relative mb-10 h-54 w-full items-center gap-10 rounded-input border bg px-14 text-sm hover:bg-hover',\n className,\n )}\n variant={null}\n {...other}\n >\n {startIcon}\n <span className=\"block min-w-0\">\n <span className=\"block\">{children}</span>\n {description && (\n <span className=\"block overflow-hidden overflow-ellipsis whitespace-nowrap text-xs text-muted\">\n {description}\n </span>\n )}\n </span>\n <KeyboardArrowRightIcon\n aria-hidden\n className=\"ml-auto text-muted icon-sm\"\n />\n </ButtonBase>\n );\n },\n);\n","import {createSvgIcon} from '../../../../icons/create-svg-icon';\n\nexport const ColorIcon = createSvgIcon(\n <path\n stroke=\"#E0E0E0\"\n d=\"M24,44c-7.168,0-13-5.816-13-12.971C11,24,24,4,24,4s13,20,13,27.029C37,38.184,31.168,44,24,44z\"\n />\n);\n","import React from 'react';\nimport clsx from 'clsx';\nimport {ButtonBase} from '../buttons/button-base';\n\ntype Props = {\n onChange?: (e: string) => void;\n value?: string;\n colors: string[];\n};\nexport function ColorSwatch({onChange, value, colors}: Props) {\n const presetButtons = colors.map(color => {\n const isSelected = value === color;\n return (\n <ButtonBase\n key={color}\n onClick={() => {\n onChange?.(color);\n }}\n className={clsx(\n 'relative block flex-shrink-0 w-26 h-26 border rounded',\n isSelected && 'shadow-md'\n )}\n style={{backgroundColor: color}}\n >\n {isSelected && (\n <span className=\"absolute inset-0 m-auto rounded-full w-8 h-8 bg-white\" />\n )}\n </ButtonBase>\n );\n });\n\n return <div className=\"flex flex-wrap gap-6\">{presetButtons}</div>;\n}\n","import {message} from '@common/i18n/message';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\nexport const ColorPresets: {\n color: string;\n name: MessageDescriptor;\n foreground?: string;\n}[] = [\n {\n color: 'rgb(255, 255, 255)',\n name: message('White'),\n },\n {\n color: 'rgb(239,245,245)',\n name: message('Solitude'),\n },\n {\n color: 'rgb(245,213,174)',\n name: message('Wheat'),\n },\n {\n color: 'rgb(253,227,167)',\n name: message('Cape Honey'),\n },\n {\n color: 'rgb(242,222,186)',\n name: message('Milk punch'),\n },\n {\n color: 'rgb(97,118,75)',\n name: message('Dingy'),\n foreground: 'rgb(255, 255, 255)',\n },\n {\n color: 'rgb(4, 147, 114)',\n name: message('Aquamarine'),\n foreground: 'rgb(255, 255, 255)',\n },\n {\n color: 'rgb(222,245,229)',\n name: message('Cosmic Latte'),\n },\n {\n color: 'rgb(233,119,119)',\n name: message('Geraldine'),\n foreground: 'rgb(90,14,14)',\n },\n {\n color: 'rgb(247,164,164)',\n name: message('Sundown'),\n },\n {\n color: 'rgb(30,139,195)',\n name: message('Pelorous'),\n foreground: 'rgb(255, 255, 255)',\n },\n {\n color: 'rgb(142,68,173)',\n name: message('Deep Lilac'),\n foreground: 'rgb(255, 255, 255)',\n },\n {\n color: 'rgb(108,74,182)',\n name: message('Blue marguerite'),\n foreground: 'rgb(255, 255, 255)',\n },\n {\n color: 'rgb(139,126,116)',\n name: message('Americano'),\n foreground: 'rgb(255, 255, 255)',\n },\n {\n color: 'rgb(0,0,0)',\n name: message('Black'),\n foreground: 'rgb(255, 255, 255)',\n },\n {\n color: 'rgb(64,66,88)',\n name: message('Blue zodiac'),\n foreground: 'rgb(255, 255, 255)',\n },\n {\n color: 'rgb(101,100,124)',\n name: message('Comet'),\n foreground: 'rgb(255, 255, 255)',\n },\n];\n","import {HexColorInput, HexColorPicker} from 'react-colorful';\nimport React, {useState} from 'react';\nimport {parseColor} from '@react-stately/color';\nimport {ColorSwatch} from './color-swatch';\nimport {getInputFieldClassNames} from '../forms/input-field/get-input-field-class-names';\nimport {ColorPresets} from '@common/ui/color-picker/color-presets';\n\nconst DefaultPresets = ColorPresets.map(({color}) => color).slice(0, 14);\n\ntype Props = {\n defaultValue?: string;\n onChange?: (e: string) => void;\n colorPresets?: string[];\n showInput?: boolean;\n};\nexport function ColorPicker({\n defaultValue,\n onChange,\n colorPresets,\n showInput,\n}: Props) {\n const [color, setColor] = useState<string | undefined>(defaultValue);\n\n const presets: string[] = colorPresets || DefaultPresets;\n\n const style = getInputFieldClassNames({size: 'sm'});\n\n return (\n <div>\n <HexColorPicker\n className=\"!w-auto\"\n color={color}\n onChange={newColor => {\n onChange?.(newColor);\n setColor(newColor);\n }}\n />\n <div className=\"py-20 px-12\">\n {presets && (\n <ColorSwatch\n colors={presets}\n onChange={newColor => {\n if (newColor) {\n const hex = parseColor(newColor).toString('hex');\n onChange?.(hex);\n setColor(hex);\n }\n }}\n value={color}\n />\n )}\n {showInput && (\n <div className=\"pt-20\">\n <HexColorInput\n autoComplete=\"off\"\n role=\"textbox\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n required\n aria-label=\"Hex color\"\n prefixed\n className={style.input}\n color={color}\n onChange={newColor => {\n onChange?.(newColor);\n setColor(newColor);\n }}\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n","import {ColorPicker} from './color-picker';\nimport {DialogFooter} from '../overlays/dialog/dialog-footer';\nimport {Button} from '../buttons/button';\nimport {useDialogContext} from '../overlays/dialog/dialog-context';\nimport {Dialog} from '../overlays/dialog/dialog';\nimport {Trans} from '../../i18n/trans';\n\ninterface ColorPickerDialogProps {\n hideFooter?: boolean;\n showInput?: boolean;\n}\nexport function ColorPickerDialog({\n hideFooter = false,\n showInput = true,\n}: ColorPickerDialogProps) {\n const {close, value, setValue, initialValue} = useDialogContext<\n string | null\n >();\n // todo: remove this once pixie and bedrive are refactored to use dialogTrigger currentValue (use \"currentValue\" for defaultValue as well)\n //const initialValue = useRef(defaultValue);\n\n return (\n <Dialog size=\"2xs\">\n <ColorPicker\n showInput={showInput}\n defaultValue={initialValue ? initialValue : ''}\n onChange={newValue => setValue(newValue)}\n />\n {!hideFooter && (\n <DialogFooter dividerTop>\n <Button variant=\"text\" size=\"xs\" onClick={() => close()}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n variant=\"flat\"\n color=\"primary\"\n size=\"xs\"\n onClick={() => close(value)}\n >\n <Trans message=\"Apply\" />\n </Button>\n </DialogFooter>\n )}\n </Dialog>\n );\n}\n","import {useFormContext} from 'react-hook-form';\nimport {\n appearanceState,\n AppearanceValues,\n useAppearanceStore,\n} from '@common/admin/appearance/appearance-store';\nimport {Fragment, ReactNode} from 'react';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\nimport {FormSlider} from '@common/ui/forms/slider/slider';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {AppearanceButton} from '@common/admin/appearance/appearance-button';\nimport {ColorIcon} from '@common/admin/appearance/sections/themes/color-icon';\nimport {ColorPickerDialog} from '@common/ui/color-picker/color-picker-dialog';\nimport {Link} from 'react-router-dom';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {LandingPageContent} from '@app/landing-page/landing-page-content';\n\nexport function LandingPageSectionGeneral() {\n return (\n <Fragment>\n <HeaderSection />\n <div className=\"my-24 border-y py-24\">\n <AppearanceButton\n to=\"action-buttons\"\n elementType={Link}\n className=\"mb-20\"\n >\n <Trans message=\"Action buttons\" />\n </AppearanceButton>\n <AppearanceButton to=\"primary-features\" elementType={Link}>\n <Trans message=\"Primary features\" />\n </AppearanceButton>\n <AppearanceButton to=\"secondary-features\" elementType={Link}>\n <Trans message=\"Secondary features\" />\n </AppearanceButton>\n </div>\n <FooterSection />\n <PricingSection />\n </Fragment>\n );\n}\n\nfunction HeaderSection() {\n const defaultImage = useAppearanceStore(\n s => s.defaults?.settings.homepage?.appearance?.headerImage,\n );\n\n return (\n <Fragment>\n <FormTextField\n label={<Trans message=\"Header title\" />}\n className=\"mb-20\"\n name=\"settings.homepage.appearance.headerTitle\"\n onFocus={() => {\n appearanceState().preview.setHighlight('[data-testid=\"headerTitle\"]');\n }}\n />\n <FormTextField\n label={<Trans message=\"Header subtitle\" />}\n className=\"mb-30\"\n inputElementType=\"textarea\"\n rows={4}\n name=\"settings.homepage.appearance.headerSubtitle\"\n onFocus={() => {\n appearanceState().preview.setHighlight(\n '[data-testid=\"headerSubtitle\"]',\n );\n }}\n />\n <FormImageSelector\n name=\"settings.homepage.appearance.headerImage\"\n className=\"mb-30\"\n label={<Trans message=\"Header image\" />}\n defaultValue={defaultImage}\n diskPrefix=\"homepage\"\n />\n <FormSwitch\n className=\"mb-24\"\n name=\"settings.homepage.appearance.blurHeaderImage\"\n >\n <Trans message=\"Blur header image\" />\n </FormSwitch>\n <FormSlider\n name=\"settings.homepage.appearance.headerImageOpacity\"\n label={<Trans message=\"Header image opacity\" />}\n minValue={0}\n step={0.1}\n maxValue={1}\n formatOptions={{style: 'percent'}}\n />\n <div className=\"mb-20 text-xs text-muted\">\n <Trans message=\"In order for overlay colors to appear, header image opacity will need to be less then 100%\" />\n </div>\n <ColorPickerTrigger\n formKey=\"settings.homepage.appearance.headerOverlayColor1\"\n label={<Trans message=\"Header overlay color 1\" />}\n />\n <ColorPickerTrigger\n formKey=\"settings.homepage.appearance.headerOverlayColor2\"\n label={<Trans message=\"Header overlay color 2\" />}\n />\n </Fragment>\n );\n}\n\nfunction FooterSection() {\n const defaultImage = useAppearanceStore(\n s =>\n (s.defaults?.settings.homepage?.appearance as LandingPageContent)\n ?.footerImage,\n );\n return (\n <Fragment>\n <FormSwitch className=\"mb-24\" name=\"settings.homepage.trending\">\n <Trans message=\"Show trending titles\" />\n </FormSwitch>\n <FormTextField\n label={<Trans message=\"Footer title\" />}\n className=\"mb-20\"\n name=\"settings.homepage.appearance.footerTitle\"\n onFocus={() => {\n appearanceState().preview.setHighlight('[data-testid=\"footerTitle\"]');\n }}\n />\n <FormTextField\n label={<Trans message=\"Footer subtitle\" />}\n className=\"mb-20\"\n name=\"settings.homepage.appearance.footerSubtitle\"\n onFocus={() => {\n appearanceState().preview.setHighlight(\n '[data-testid=\"footerSubtitle\"]',\n );\n }}\n />\n <FormImageSelector\n name=\"settings.homepage.appearance.footerImage\"\n className=\"mb-30\"\n label={<Trans message=\"Footer background image\" />}\n defaultValue={defaultImage}\n diskPrefix=\"homepage\"\n />\n </Fragment>\n );\n}\n\nfunction PricingSection() {\n return (\n <div className=\"mt-24 border-t pt-24\">\n <FormTextField\n label={<Trans message=\"Pricing title\" />}\n className=\"mb-20\"\n name=\"settings.homepage.appearance.pricingTitle\"\n onFocus={() => {\n appearanceState().preview.setHighlight(\n '[data-testid=\"pricingTitle\"]',\n );\n }}\n />\n <FormTextField\n label={<Trans message=\"Pricing subtitle\" />}\n className=\"mb-20\"\n name=\"settings.homepage.appearance.pricingSubtitle\"\n onFocus={() => {\n appearanceState().preview.setHighlight(\n '[data-testid=\"pricingSubtitle\"]',\n );\n }}\n />\n <FormSwitch className=\"mb-24\" name=\"settings.homepage.pricing\">\n <Trans message=\"Show pricing table\" />\n </FormSwitch>\n </div>\n );\n}\n\ninterface ColorPickerTriggerProps {\n formKey: string;\n label: ReactNode;\n}\nfunction ColorPickerTrigger({label, formKey}: ColorPickerTriggerProps) {\n const key = formKey as 'settings.homepage.appearance.headerOverlayColor1';\n const {watch, setValue} = useFormContext<AppearanceValues>();\n\n const formValue = watch(key);\n\n const setColor = (value: string | null) => {\n setValue(formKey as any, value, {\n shouldDirty: true,\n });\n };\n\n return (\n <DialogTrigger\n value={formValue}\n onValueChange={newValue => setColor(newValue)}\n type=\"popover\"\n onClose={value => setColor(value)}\n >\n <AppearanceButton\n className=\"capitalize\"\n startIcon={\n <ColorIcon\n viewBox=\"0 0 48 48\"\n className=\"icon-lg\"\n style={{fill: formValue}}\n />\n }\n >\n {label}\n </AppearanceButton>\n <ColorPickerDialog />\n </DialogTrigger>\n );\n}\n","export function ucFirst<T extends string>(string: T): T {\n if (!string) return string;\n return (string.charAt(0).toUpperCase() + string.slice(1)) as T;\n}\n","import {useControlledState} from '@react-stately/utils';\nimport React, {Fragment, useState} from 'react';\nimport {useController} from 'react-hook-form';\nimport {mergeProps} from '@react-aria/utils';\nimport clsx from 'clsx';\nimport {produce} from 'immer';\nimport {Permission, PermissionRestriction} from '../permission';\nimport {useValueLists} from '../../http/value-lists';\nimport {ucFirst} from '../../utils/string/uc-first';\nimport {Accordion, AccordionItem} from '../../ui/accordion/accordion';\nimport {List, ListItem} from '../../ui/list/list';\nimport {Switch} from '../../ui/forms/toggle/switch';\nimport {TextField} from '../../ui/forms/input-field/text-field/text-field';\nimport {DoneAllIcon} from '../../icons/material/DoneAll';\nimport {Trans} from '../../i18n/trans';\n\ninterface PermissionSelectorProps {\n value?: Permission[];\n onChange?: (value: Permission[]) => void;\n valueListKey?: 'permissions' | 'workspacePermissions';\n}\nexport const PermissionSelector = React.forwardRef<\n HTMLDivElement,\n PermissionSelectorProps\n>(({valueListKey = 'permissions', ...props}, ref) => {\n const {data} = useValueLists([valueListKey]);\n const permissions = data?.permissions || data?.workspacePermissions;\n\n const [value, setValue] = useControlledState(props.value, [], props.onChange);\n const [showAdvanced, setShowAdvanced] = useState(false);\n\n if (!permissions) return null;\n\n const groupedPermissions = buildPermissionList(\n permissions,\n value,\n showAdvanced\n );\n\n const onRestrictionChange = (newPermission: Permission) => {\n const newValue = [...value];\n const index = newValue.findIndex(p => p.id === newPermission.id);\n if (index > -1) {\n newValue.splice(index, 1, newPermission);\n }\n setValue(newValue);\n };\n\n return (\n <Fragment>\n <Accordion variant=\"outline\" ref={ref}>\n {groupedPermissions.map(({groupName, items, anyChecked}) => (\n <AccordionItem\n label={<Trans message={prettyName(groupName)} />}\n key={groupName}\n startIcon={anyChecked ? <DoneAllIcon size=\"sm\" /> : undefined}\n >\n <List>\n {items.map(permission => {\n const index = value.findIndex(v => v.id === permission.id);\n const isChecked = index > -1;\n\n return (\n <div key={permission.id}>\n <ListItem\n onSelected={() => {\n if (isChecked) {\n const newValue = [...value];\n newValue.splice(index, 1);\n setValue(newValue);\n } else {\n setValue([...value, permission]);\n }\n }}\n endSection={\n <Switch\n tabIndex={-1}\n checked={isChecked}\n onChange={() => {}}\n />\n }\n description={<Trans message={permission.description} />}\n >\n <Trans\n message={permission.display_name || permission.name}\n />\n </ListItem>\n {isChecked && (\n <Restrictions\n permission={permission}\n onChange={onRestrictionChange}\n />\n )}\n </div>\n );\n })}\n </List>\n </AccordionItem>\n ))}\n </Accordion>\n <Switch\n className=\"mt-30\"\n checked={showAdvanced}\n onChange={e => {\n setShowAdvanced(e.target.checked);\n }}\n >\n <Trans message=\"Show advanced permissions\" />\n </Switch>\n </Fragment>\n );\n});\n\ninterface RestrictionsProps {\n permission: Permission;\n onChange?: (newPermission: Permission) => void;\n}\nfunction Restrictions({permission, onChange}: RestrictionsProps) {\n if (!permission?.restrictions?.length) return null;\n\n const setRestrictionValue = (\n name: string,\n value: PermissionRestriction['value']\n ) => {\n const nextState = produce(permission, draftState => {\n const restriction = draftState.restrictions.find(r => r.name === name);\n if (restriction) {\n restriction.value = value;\n }\n });\n onChange?.(nextState);\n };\n\n return (\n <div className=\"px-40 py-20\">\n {permission.restrictions.map((restriction, index) => {\n const isLast = index === permission.restrictions.length - 1;\n\n const name = <Trans message={prettyName(restriction.name)} />;\n const description = restriction.description ? (\n <Trans message={restriction.description} />\n ) : undefined;\n\n if (restriction.type === 'bool') {\n return (\n <Switch\n description={description}\n key={restriction.name}\n className={clsx(!isLast && 'mb-30')}\n checked={Boolean(restriction.value)}\n onChange={e => {\n setRestrictionValue(restriction.name, e.target.checked);\n }}\n >\n {name}\n </Switch>\n );\n }\n\n return (\n <TextField\n size=\"sm\"\n label={name}\n description={description}\n type=\"number\"\n key={restriction.name}\n className={clsx(!isLast && 'mb-30')}\n value={(restriction.value as string) || ''}\n onChange={e => {\n setRestrictionValue(\n restriction.name,\n e.target.value === '' ? undefined : parseInt(e.target.value)\n );\n }}\n />\n );\n })}\n </div>\n );\n}\n\nexport type FormChipFieldProps = PermissionSelectorProps & {\n name: string;\n};\nexport function FormPermissionSelector(props: FormChipFieldProps) {\n const {\n field: {onChange, value = [], ref},\n } = useController({\n name: props.name,\n });\n\n const formProps: Partial<PermissionSelectorProps> = {\n onChange,\n value,\n };\n\n return <PermissionSelector ref={ref} {...mergeProps(formProps, props)} />;\n}\n\nexport const prettyName = (name: string) => {\n return ucFirst(name.replace('_', ' '));\n};\n\ninterface PermissionGroup {\n groupName: string;\n anyChecked: boolean;\n items: Permission[];\n}\n\n// merge \"restrictions\" from selected value into all permissions to make\n// it easier to bind restriction values to form inputs\nexport function buildPermissionList(\n allPermissions: Permission[],\n selectedPermissions: Permission[],\n showAdvanced: boolean\n) {\n const groupedPermissions: PermissionGroup[] = [];\n\n allPermissions.forEach(permission => {\n const index = selectedPermissions.findIndex(p => p.id === permission.id);\n if (!showAdvanced && permission.advanced) return;\n\n let group: PermissionGroup | undefined = groupedPermissions.find(\n g => g.groupName === permission.group\n );\n if (!group) {\n group = {groupName: permission.group, anyChecked: false, items: []};\n groupedPermissions.push(group);\n }\n\n if (index > -1) {\n const mergedPermission = {\n ...permission,\n restrictions: mergeRestrictions(\n permission.restrictions,\n selectedPermissions[index].restrictions\n ),\n };\n group.anyChecked = true;\n group.items.push(mergedPermission);\n } else {\n group.items.push(permission);\n }\n });\n\n return groupedPermissions;\n}\n\nfunction mergeRestrictions(\n allRestrictions: PermissionRestriction[],\n selectedRestrictions: PermissionRestriction[]\n): PermissionRestriction[] {\n return allRestrictions?.map(restriction => {\n const selected = selectedRestrictions.find(\n r => r.name === restriction.name\n );\n if (selected) {\n return {...restriction, value: selected.value};\n } else {\n return restriction;\n }\n });\n}\n","import {MenuSectionConfig} from '../../../types/appearance-editor-config';\nimport {MenuItemConfig} from '../../../../../core/settings/settings';\nimport mergedAppearanceConfig from '../../../config/merged-appearance-config';\n\nexport function useAvailableRoutes(): Partial<MenuItemConfig>[] {\n const menuConfig = mergedAppearanceConfig.sections.menus.config;\n\n if (!menuConfig) return [];\n\n return (menuConfig as MenuSectionConfig).availableRoutes.map(route => {\n return {\n id: route,\n label: route,\n action: route,\n type: 'route',\n target: '_self',\n };\n });\n}\n","export const iconGridStyle = {\n grid: 'flex flex-wrap gap-24',\n button:\n 'flex flex-col items-center rounded hover:bg-hover h-90 aspect-square',\n};\n","import React, {Suspense} from 'react';\nimport {IconTree} from '../../icons/create-svg-icon';\nimport {iconGridStyle} from './icon-grid-style';\nimport {TextField} from '../forms/input-field/text-field/text-field';\nimport {Skeleton} from '../skeleton/skeleton';\nimport {useTrans} from '../../i18n/use-trans';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '../animation/opacity-animation';\n\nconst skeletons = [...Array(60).keys()];\n\nconst IconList = React.lazy(() => import('./icon-list'));\n\ninterface IconListProps {\n onIconSelected: (icon: IconTree[] | null) => void;\n}\nexport default function IconPicker({onIconSelected}: IconListProps) {\n const {trans} = useTrans();\n const [value, setValue] = React.useState('');\n\n return (\n <div className=\"py-4\">\n <TextField\n className=\"mb-20\"\n value={value}\n onChange={e => {\n setValue(e.target.value);\n }}\n placeholder={trans({message: 'Search icons...'})}\n />\n <AnimatePresence mode=\"wait\">\n <Suspense\n fallback={\n <m.div {...opacityAnimation} className={iconGridStyle.grid}>\n {skeletons.map((_, index) => (\n <div className={iconGridStyle.button} key={index}>\n <Skeleton variant=\"rect\" />\n </div>\n ))}\n </m.div>\n }\n >\n <m.div {...opacityAnimation} className={iconGridStyle.grid}>\n <IconList searchQuery={value} onIconSelected={onIconSelected} />\n </m.div>\n </Suspense>\n </AnimatePresence>\n </div>\n );\n}\n","import React from 'react';\nimport IconPicker from './icon-picker';\nimport {useDialogContext} from '../overlays/dialog/dialog-context';\nimport {Dialog} from '../overlays/dialog/dialog';\nimport {DialogHeader} from '../overlays/dialog/dialog-header';\nimport {DialogBody} from '../overlays/dialog/dialog-body';\nimport {Trans} from '../../i18n/trans';\n\nexport function IconPickerDialog() {\n return (\n <Dialog size=\"w-850\" className=\"min-h-dialog\">\n <DialogHeader>\n <Trans message=\"Select icon\" />\n </DialogHeader>\n <DialogBody>\n <IconPickerWrapper />\n </DialogBody>\n </Dialog>\n );\n}\n\nfunction IconPickerWrapper() {\n const {close} = useDialogContext();\n return (\n <IconPicker\n onIconSelected={value => {\n close(value);\n }}\n />\n );\n}\n","import {FormTextField} from '../../ui/forms/input-field/text-field/text-field';\nimport {Trans} from '../../i18n/trans';\nimport {useValueLists} from '../../http/value-lists';\nimport {useTrans} from '../../i18n/use-trans';\nimport {FormChipField} from '../../ui/forms/input-field/chip-field/form-chip-field';\nimport {Item} from '../../ui/forms/listbox/item';\nimport {Fragment, useEffect, useMemo} from 'react';\nimport {\n buildPermissionList,\n prettyName,\n} from '../../auth/ui/permission-selector';\nimport {Section} from '../../ui/forms/listbox/section';\nimport {useFormContext} from 'react-hook-form';\nimport {MenuItemConfig} from '../../core/settings/settings';\nimport {FormSelect, Option} from '../../ui/forms/select/select';\nimport {useAvailableRoutes} from '../appearance/sections/menus/hooks/available-routes';\nimport {ButtonBaseProps} from '../../ui/buttons/button-base';\nimport {createSvgIconFromTree, IconTree} from '../../icons/create-svg-icon';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {EditIcon} from '../../icons/material/Edit';\nimport {IconPickerDialog} from '../../ui/icon-picker/icon-picker-dialog';\nimport {message} from '../../i18n/message';\nimport {usePrevious} from '../../utils/hooks/use-previous';\n\ninterface NameProps {\n prefixName: (name: string) => string;\n}\n\ninterface MenuItemFormProps {\n formPathPrefix?: string;\n hideRoleAndPermissionFields?: boolean;\n}\nexport function MenuItemForm({\n formPathPrefix,\n hideRoleAndPermissionFields,\n}: MenuItemFormProps) {\n const {trans} = useTrans();\n const prefixName = (name: string): string => {\n return formPathPrefix ? `${formPathPrefix}.${name}` : name;\n };\n\n return (\n <Fragment>\n <FormTextField\n className=\"mb-20\"\n name={prefixName('label')}\n label={<Trans message=\"Label\" />}\n placeholder={trans(message('No label...'))}\n startAppend={<IconDialogTrigger prefixName={prefixName} />}\n />\n <DestinationSelector prefixName={prefixName} />\n {!hideRoleAndPermissionFields && (\n <Fragment>\n <RoleSelector prefixName={prefixName} />\n <PermissionSelector prefixName={prefixName} />\n </Fragment>\n )}\n <TargetSelect prefixName={prefixName} />\n </Fragment>\n );\n}\n\ninterface IconDialogTriggerProps extends ButtonBaseProps, NameProps {}\nfunction IconDialogTrigger({\n prefixName,\n ...buttonProps\n}: IconDialogTriggerProps) {\n const {watch, setValue} = useFormContext<MenuItemConfig>();\n const fieldName = prefixName('icon') as 'icon';\n const watchedItemIcon = watch(fieldName);\n const Icon = watchedItemIcon && createSvgIconFromTree(watchedItemIcon);\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={(iconTree?: IconTree[] | null) => {\n // null will be set explicitly if icon is cleared via icon picker\n if (iconTree || iconTree === null) {\n setValue(fieldName, iconTree, {\n shouldDirty: true,\n });\n }\n }}\n >\n <IconButton\n className=\"text-muted icon-sm\"\n variant=\"outline\"\n size=\"md\"\n {...buttonProps}\n >\n {Icon ? <Icon /> : <EditIcon />}\n </IconButton>\n <IconPickerDialog />\n </DialogTrigger>\n );\n}\n\nfunction DestinationSelector({prefixName}: NameProps) {\n const form = useFormContext<MenuItemConfig>();\n const currentType = form.watch(prefixName('type') as 'type');\n const previousType = usePrevious(currentType);\n const {data} = useValueLists(['menuItemCategories']);\n const categories = data?.menuItemCategories || [];\n const selectedCategory = categories.find(c => c.type === currentType);\n const {trans} = useTrans();\n const routeItems = useAvailableRoutes();\n\n // clear \"action\" field when \"type\" field changes\n useEffect(() => {\n if (previousType && previousType !== currentType) {\n form.setValue(prefixName('action') as 'action', '');\n }\n }, [currentType, previousType, form, prefixName]);\n\n return (\n <Fragment>\n <FormSelect\n className=\"mb-20\"\n name={prefixName('type')}\n selectionMode=\"single\"\n label={<Trans message=\"Type\" />}\n >\n <Option value=\"link\">\n <Trans message=\"Custom link\" />\n </Option>\n <Option value=\"route\">\n <Trans message=\"Site page\" />\n </Option>\n {categories.map(category => (\n <Option key={category.type} value={category.type}>\n {category.name}\n </Option>\n ))}\n </FormSelect>\n {currentType === 'link' && (\n <FormTextField\n className=\"mb-20\"\n required\n type=\"url\"\n name={prefixName('action')}\n placeholder={trans({message: 'Enter a url...'})}\n label={<Trans message=\"Url\" />}\n />\n )}\n {currentType === 'route' && (\n <FormSelect\n className=\"mb-20\"\n required\n items={routeItems}\n name={prefixName('action')}\n label={<Trans message=\"Page\" />}\n searchPlaceholder={trans(message('Search pages'))}\n showSearchField\n selectionMode=\"single\"\n >\n {item => (\n <Item value={item.id} key={item.id}>\n {item.label}\n </Item>\n )}\n </FormSelect>\n )}\n {selectedCategory && (\n <FormSelect\n className=\"mb-20\"\n required\n items={selectedCategory.items}\n name={prefixName('action')}\n showSearchField\n searchPlaceholder={trans(message('Search...'))}\n selectionMode=\"single\"\n label={<Trans message={selectedCategory.name} />}\n >\n {item => (\n <Item value={item.action}>\n <Trans message={item.label} />\n </Item>\n )}\n </FormSelect>\n )}\n </Fragment>\n );\n}\n\nfunction RoleSelector({prefixName}: NameProps) {\n const {data} = useValueLists(['roles', 'permissions']);\n const roles = data?.roles || [];\n const {trans} = useTrans();\n\n return (\n <FormChipField\n className=\"mb-20\"\n placeholder={trans({message: 'Add role...'})}\n label={<Trans message=\"Only show if user has role\" />}\n name={prefixName('roles')}\n chipSize=\"sm\"\n suggestions={roles}\n valueKey=\"id\"\n displayWith={c => roles.find(r => r.id === c.id)?.name}\n >\n {role => (\n <Item value={role.id} key={role.id} capitalizeFirst>\n <Trans message={role.name} />\n </Item>\n )}\n </FormChipField>\n );\n}\n\nfunction PermissionSelector({prefixName}: NameProps) {\n const {data} = useValueLists(['roles', 'permissions']);\n const {trans} = useTrans();\n\n const groupedPermissions = useMemo(() => {\n return buildPermissionList(data?.permissions || [], [], false);\n }, [data?.permissions]);\n\n return (\n <FormChipField\n label={<Trans message=\"Only show if user has permissions\" />}\n placeholder={trans({message: 'Add permission...'})}\n chipSize=\"sm\"\n suggestions={groupedPermissions}\n name={prefixName('permissions')}\n valueKey=\"name\"\n >\n {({groupName, items}) => (\n <Section label={prettyName(groupName)} key={groupName}>\n {items.map(permission => (\n <Item\n key={permission.name}\n value={permission.name}\n description={<Trans message={permission.description} />}\n >\n <Trans message={permission.display_name || permission.name} />\n </Item>\n ))}\n </Section>\n )}\n </FormChipField>\n );\n}\n\nfunction TargetSelect({prefixName}: NameProps) {\n return (\n <FormSelect\n className=\"mt-20\"\n selectionMode=\"single\"\n name={prefixName('target')}\n label={<Trans message=\"Open link in\" />}\n >\n <Option value=\"_self\">\n <Trans message=\"Same window\" />\n </Option>\n <Option value=\"_blank\">\n <Trans message=\"New window\" />\n </Option>\n </FormSelect>\n );\n}\n","import {MenuItemForm} from '@common/admin/menus/menu-item-form';\nimport {Accordion, AccordionItem} from '@common/ui/accordion/accordion';\nimport {Trans} from '@common/i18n/trans';\nimport {appearanceState} from '@common/admin/appearance/appearance-store';\nimport {useState} from 'react';\n\nexport function LandingPageSectionActionButtons() {\n const [expandedValues, setExpandedValues] = useState(['cta1']);\n return (\n <Accordion\n variant=\"outline\"\n expandedValues={expandedValues}\n onExpandedChange={values => {\n setExpandedValues(values as string[]);\n if (values.length) {\n appearanceState().preview.setHighlight(\n `[data-testid=\"${values[0]}\"]`\n );\n }\n }}\n >\n <AccordionItem value=\"cta1\" label={<Trans message=\"Header button 1\" />}>\n <MenuItemForm formPathPrefix=\"settings.homepage.appearance.actions.cta1\" />\n </AccordionItem>\n <AccordionItem value=\"ct2\" label={<Trans message=\"Header button 2\" />}>\n <MenuItemForm formPathPrefix=\"settings.homepage.appearance.actions.cta2\" />\n </AccordionItem>\n <AccordionItem value=\"cta3\" label={<Trans message=\"Footer button\" />}>\n <MenuItemForm formPathPrefix=\"settings.homepage.appearance.actions.cta3\" />\n </AccordionItem>\n </Accordion>\n );\n}\n","import {Accordion, AccordionItem} from '@common/ui/accordion/accordion';\nimport {Trans} from '@common/i18n/trans';\nimport {\n appearanceState,\n useAppearanceStore,\n} from '@common/admin/appearance/appearance-store';\nimport {useFieldArray} from 'react-hook-form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\nimport {Button} from '@common/ui/buttons/button';\nimport {AddIcon} from '@common/icons/material/Add';\nimport {useState} from 'react';\n\nexport function LandingPageSectionPrimaryFeatures() {\n const {fields, remove, append} = useFieldArray({\n name: 'settings.homepage.appearance.primaryFeatures',\n });\n const [expandedValues, setExpandedValues] = useState([0]);\n return (\n <div>\n <Accordion\n variant=\"outline\"\n expandedValues={expandedValues}\n onExpandedChange={values => {\n setExpandedValues(values as number[]);\n if (values.length) {\n appearanceState().preview.setHighlight(\n `[data-testid=\"primary-root-${values[0]}\"]`\n );\n }\n }}\n >\n {fields.map((field, index) => {\n return (\n <AccordionItem\n key={field.id}\n value={index}\n label={<Trans message={`Primary feature ${index + 1}`} />}\n >\n <FeatureForm index={index} />\n <div className=\"text-right\">\n <Button\n size=\"xs\"\n variant=\"outline\"\n color=\"danger\"\n onClick={() => {\n remove(index);\n }}\n >\n <Trans message=\"Remove\" />\n </Button>\n </div>\n </AccordionItem>\n );\n })}\n </Accordion>\n <div className=\"mt-20 text-right\">\n <Button\n size=\"xs\"\n variant=\"outline\"\n color=\"primary\"\n startIcon={<AddIcon />}\n onClick={() => {\n append({});\n setExpandedValues([fields.length]);\n }}\n >\n <Trans message=\"Add feature\" />\n </Button>\n </div>\n </div>\n );\n}\n\ninterface FeatureFormProps {\n index: number;\n}\nfunction FeatureForm({index}: FeatureFormProps) {\n const defaultImage = useAppearanceStore(\n s =>\n s.defaults?.settings.homepage?.appearance?.primaryFeatures?.[index]?.image\n );\n\n return (\n <>\n <FormImageSelector\n name={`settings.homepage.appearance.primaryFeatures.${index}.image`}\n className=\"mb-30\"\n label={<Trans message=\"Image\" />}\n defaultValue={defaultImage}\n diskPrefix=\"homepage\"\n />\n <FormTextField\n name={`settings.homepage.appearance.primaryFeatures.${index}.title`}\n label={<Trans message=\"Title\" />}\n className=\"mb-20\"\n onFocus={() => {\n appearanceState().preview.setHighlight(\n `[data-testid=\"primary-title-${index}\"]`\n );\n }}\n />\n <FormTextField\n name={`settings.homepage.appearance.primaryFeatures.${index}.subtitle`}\n label={<Trans message=\"Subtitle\" />}\n className=\"mb-20\"\n inputElementType=\"textarea\"\n rows={4}\n onFocus={() => {\n appearanceState().preview.setHighlight(\n `[data-testid=\"primary-subtitle-${index}\"]`\n );\n }}\n />\n </>\n );\n}\n","import {Accordion, AccordionItem} from '@common/ui/accordion/accordion';\nimport {Trans} from '@common/i18n/trans';\nimport {appearanceState} from '@common/admin/appearance/appearance-store';\nimport {useFieldArray} from 'react-hook-form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\nimport {Button} from '@common/ui/buttons/button';\nimport {AddIcon} from '@common/icons/material/Add';\nimport {useState} from 'react';\n\nexport function LandingPageSecondaryFeatures() {\n const {fields, remove, append} = useFieldArray({\n name: 'settings.homepage.appearance.secondaryFeatures',\n });\n const [expandedValues, setExpandedValues] = useState([0]);\n return (\n <div>\n <Accordion\n variant=\"outline\"\n expandedValues={expandedValues}\n onExpandedChange={values => {\n setExpandedValues(values as number[]);\n if (values.length) {\n appearanceState().preview.setHighlight(\n `[data-testid=\"secondary-root-${values[0]}\"]`\n );\n }\n }}\n >\n {fields.map((field, index) => {\n return (\n <AccordionItem\n key={field.id}\n value={index}\n label={<Trans message={`Secondary feature ${index + 1}`} />}\n >\n <FeatureForm index={index} />\n <div className=\"text-right\">\n <Button\n size=\"xs\"\n variant=\"outline\"\n color=\"danger\"\n onClick={() => {\n remove(index);\n }}\n >\n <Trans message=\"Remove\" />\n </Button>\n </div>\n </AccordionItem>\n );\n })}\n </Accordion>\n <div className=\"mt-20 text-right\">\n <Button\n size=\"xs\"\n variant=\"outline\"\n color=\"primary\"\n startIcon={<AddIcon />}\n onClick={() => {\n append({});\n setExpandedValues([fields.length]);\n }}\n >\n <Trans message=\"Add feature\" />\n </Button>\n </div>\n </div>\n );\n}\n\ninterface FeatureFormProps {\n index: number;\n}\nfunction FeatureForm({index}: FeatureFormProps) {\n return (\n <>\n <FormImageSelector\n name={`settings.homepage.appearance.secondaryFeatures.${index}.image`}\n className=\"mb-30\"\n label={<Trans message=\"Image\" />}\n defaultValue={getDefaultImage(index)}\n diskPrefix=\"homepage\"\n />\n <FormTextField\n name={`settings.homepage.appearance.secondaryFeatures.${index}.title`}\n label={<Trans message=\"Title\" />}\n className=\"mb-20\"\n onFocus={() => {\n appearanceState().preview.setHighlight(\n `[data-testid=\"secondary-title-${index}\"]`\n );\n }}\n />\n <FormTextField\n name={`settings.homepage.appearance.secondaryFeatures.${index}.subtitle`}\n label={<Trans message=\"Subtitle\" />}\n className=\"mb-20\"\n inputElementType=\"textarea\"\n rows={4}\n onFocus={() => {\n appearanceState().preview.setHighlight(\n `[data-testid=\"secondary-subtitle-${index}\"]`\n );\n }}\n />\n <FormTextField\n name={`settings.homepage.appearance.secondaryFeatures.${index}.description`}\n label={<Trans message=\"Description\" />}\n className=\"mb-20\"\n inputElementType=\"textarea\"\n rows={4}\n onFocus={() => {\n appearanceState().preview.setHighlight(\n `[data-testid=\"secondary-description-${index}\"]`\n );\n }}\n />\n </>\n );\n}\n\nfunction getDefaultImage(index: number): string | undefined {\n return appearanceState().defaults?.settings.homepage?.appearance\n .secondaryFeatures[index]?.image;\n}\n","import {\n IAppearanceConfig,\n MenuSectionConfig,\n SeoSettingsSectionConfig,\n} from '@common/admin/appearance/types/appearance-editor-config';\nimport {message} from '@common/i18n/message';\nimport {LandingPageSectionGeneral} from '@app/admin/appearance/sections/landing-page-section/landing-page-section-general';\nimport {LandingPageSectionActionButtons} from '@app/admin/appearance/sections/landing-page-section/landing-page-section-action-buttons';\nimport {LandingPageSectionPrimaryFeatures} from '@app/admin/appearance/sections/landing-page-section/landing-page-section-primary-features';\nimport {LandingPageSecondaryFeatures} from '@app/admin/appearance/sections/landing-page-section/landing-page-section-secondary-features';\nimport {AppearanceEditorBreadcrumbItem} from '@common/admin/appearance/types/appearance-editor-section';\n\nexport const AppAppearanceConfig: IAppearanceConfig = {\n preview: {\n defaultRoute: 'dashboard',\n navigationRoutes: ['dashboard'],\n },\n sections: {\n 'landing-page': {\n label: message('Landing Page'),\n position: 1,\n previewRoute: '/',\n routes: [\n {path: 'landing-page', element: <LandingPageSectionGeneral />},\n {\n path: 'landing-page/action-buttons',\n element: <LandingPageSectionActionButtons />,\n },\n {\n path: 'landing-page/primary-features',\n element: <LandingPageSectionPrimaryFeatures />,\n },\n {\n path: 'landing-page/secondary-features',\n element: <LandingPageSecondaryFeatures />,\n },\n ],\n buildBreadcrumb: pathname => {\n const parts = pathname.split('/').filter(p => !!p);\n const sectionName = parts.pop();\n // admin/appearance\n const breadcrumb: AppearanceEditorBreadcrumbItem[] = [\n {\n label: message('Landing page'),\n location: 'landing-page',\n },\n ];\n if (sectionName === 'action-buttons') {\n breadcrumb.push({\n label: message('Action buttons'),\n location: 'landing-page/action-buttons',\n });\n }\n\n if (sectionName === 'primary-features') {\n breadcrumb.push({\n label: message('Primary features'),\n location: 'landing-page/primary-features',\n });\n }\n\n if (sectionName === 'secondary-features') {\n breadcrumb.push({\n label: message('Secondary features'),\n location: 'landing-page/secondary-features',\n });\n }\n\n return breadcrumb;\n },\n },\n // missing label will get added by deepMerge from default config\n // @ts-ignore\n menus: {\n config: {\n positions: [\n 'sidebar-primary',\n 'sidebar-secondary',\n 'mobile-bottom',\n 'landing-page-navbar',\n 'landing-page-footer',\n ],\n availableRoutes: [\n '/lists',\n '/watchlist',\n '/admin/channels',\n '/admin/comments',\n ],\n } as MenuSectionConfig,\n },\n // @ts-ignore\n 'seo-settings': {\n config: {\n pages: [\n {\n key: 'title-page',\n label: message('Title page'),\n },\n {\n key: 'season-page',\n label: message('Season page'),\n },\n {\n key: 'episode-page',\n label: message('Episode page'),\n },\n {\n key: 'watch-page',\n label: message('Watch page'),\n },\n {\n key: 'person-page',\n label: message('Person page'),\n },\n {\n key: 'landing-page',\n label: message('Landing page'),\n },\n {\n key: 'news-article-page',\n label: message('News article page'),\n },\n {\n key: 'channel-page',\n label: message('Channel page'),\n },\n ],\n } as SeoSettingsSectionConfig,\n },\n },\n};\n","import deepMerge from 'deepmerge';\nimport {DefaultAppearanceConfig} from '@common/admin/appearance/config/default-appearance-config';\nimport {AppAppearanceConfig} from '@app/admin/appearance/app-appearance-config';\nimport {IAppearanceConfig} from '@common/admin/appearance/types/appearance-editor-config';\n\nconst mergedAppearanceConfig = deepMerge.all([\n DefaultAppearanceConfig,\n AppAppearanceConfig,\n]);\n\nexport default mergedAppearanceConfig as IAppearanceConfig;\n","import {create} from 'zustand';\nimport {subscribeWithSelector} from 'zustand/middleware';\nimport {immer} from 'zustand/middleware/immer';\nimport {Settings} from '../../core/settings/settings';\nimport type {IAppearanceConfig} from './types/appearance-editor-config';\nimport {AllCommands} from './commands/commands';\nimport mergedAppearanceConfig from './config/merged-appearance-config';\nimport {BootstrapData} from '../../core/bootstrap-data/bootstrap-data';\nimport {FontConfig} from '@common/http/value-lists';\n\nexport interface AppearanceValues {\n appearance: {\n env: {app_name: string; app_url: string};\n seo: {\n key: string;\n name: string;\n value: string;\n defaultValue: string;\n }[];\n themes: BootstrapData['themes'];\n custom_code: {\n css?: string;\n html?: string;\n };\n };\n settings: Settings;\n}\n\nexport interface AppearanceDefaults {\n appearance: {\n themes: {\n light: Record<string, string>;\n dark: Record<string, string>;\n };\n };\n settings: Settings;\n}\n\ninterface AppearanceStore {\n defaults: AppearanceDefaults | null;\n iframeWindow: Window | null;\n config: IAppearanceConfig | null;\n setDefaults: (value: AppearanceDefaults) => void;\n setIframeWindow: (value: Window) => void;\n preview: {\n navigate: (sectionName: string) => void;\n setValues: (settings: AppearanceValues) => void;\n setThemeFont: (font: FontConfig | null) => void;\n setThemeValue: (name: string, value: string) => void;\n setActiveTheme: (themeId: number | string) => void;\n setHighlight: (selector: string | null | undefined) => void;\n setCustomCode: (mode: 'css' | 'html', value?: string) => void;\n };\n}\n\nexport const useAppearanceStore = create<AppearanceStore>()(\n subscribeWithSelector(\n immer((set, get) => ({\n defaults: null,\n iframeWindow: null,\n config: mergedAppearanceConfig,\n setDefaults: value => {\n set(state => {\n state.defaults = {...value};\n });\n },\n setIframeWindow: value => {\n set(() => {\n return {iframeWindow: value};\n });\n },\n\n preview: {\n navigate: sectionName => {\n const section = get().config?.sections[sectionName];\n const route = section?.previewRoute || '/';\n const preview = get().iframeWindow;\n if (route) {\n postMessage(preview, {type: 'navigate', to: route});\n }\n },\n setValues: values => {\n const preview = get().iframeWindow;\n postMessage(preview, {type: 'setValues', values});\n },\n setThemeFont: font => {\n const preview = get().iframeWindow;\n postMessage(preview, {type: 'setThemeFont', value: font});\n },\n setThemeValue: (name, value) => {\n const preview = get().iframeWindow;\n postMessage(preview, {type: 'setThemeValue', name, value});\n },\n setActiveTheme: themeId => {\n const preview = get().iframeWindow;\n postMessage(preview, {type: 'setActiveTheme', themeId});\n },\n setCustomCode: (mode, value) => {\n const preview = get().iframeWindow;\n postMessage(preview, {type: 'setCustomCode', mode, value});\n },\n setHighlight: selector => {\n set(() => {\n let node: HTMLElement | null = null;\n const document = get().iframeWindow?.document;\n if (document && selector) {\n node = document.querySelector(selector);\n }\n if (node) {\n requestAnimationFrame(() => {\n if (!node) return;\n node.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n inline: 'center',\n });\n });\n }\n });\n },\n },\n })),\n ),\n);\n\nfunction postMessage(window: Window | null, command: AllCommands) {\n if (window) {\n window.postMessage({source: 'be-appearance-editor', ...command}, '*');\n }\n}\n\nexport function appearanceState() {\n return useAppearanceStore.getState();\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {AppearanceValues} from '@common/admin/appearance/appearance-store';\nimport {toast} from '@common/ui/toast/toast';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {message} from '@common/i18n/message';\n\ninterface Response extends BackendResponse {}\n\nexport function useSaveAppearanceChanges() {\n return useMutation({\n mutationFn: (values: Partial<AppearanceValues>) =>\n saveAppearanceChanges(values),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: ['admin/appearance/values'],\n });\n toast(message('Changes saved'));\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction saveAppearanceChanges(\n changes: Partial<AppearanceValues>,\n): Promise<Response> {\n return apiClient.post(`admin/appearance`, {changes}).then(r => r.data);\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient} from '@common/http/query-client';\nimport {AppearanceDefaults, AppearanceValues} from '../appearance-store';\n\nexport interface FetchAppearanceValuesResponse extends BackendResponse {\n values: AppearanceValues;\n defaults: AppearanceDefaults;\n}\n\nexport function useAppearanceValues() {\n return useQuery({\n queryKey: ['admin/appearance/values'],\n queryFn: () => fetchAppearanceValues(),\n staleTime: Infinity,\n });\n}\n\nfunction fetchAppearanceValues(): Promise<FetchAppearanceValuesResponse> {\n return apiClient\n .get('admin/appearance/values')\n .then(response => response.data);\n}\n","import {Link, useLocation} from 'react-router-dom';\nimport clsx from 'clsx';\nimport {Fragment, useEffect, useState} from 'react';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {KeyboardArrowLeftIcon} from '../../icons/material/KeyboardArrowLeft';\nimport {KeyboardArrowRightIcon} from '../../icons/material/KeyboardArrowRight';\nimport {Trans} from '../../i18n/trans';\nimport {MixedText} from '../../i18n/mixed-text';\nimport {useFormContext} from 'react-hook-form';\nimport {appearanceState, AppearanceValues} from './appearance-store';\nimport {AppearanceEditorBreadcrumbItem} from './types/appearance-editor-section';\nimport {message} from '../../i18n/message';\n\nexport function SectionHeader() {\n const {pathname} = useLocation();\n const {getValues} = useFormContext<AppearanceValues>();\n const [breadcrumb, setBreadcrumb] = useState<\n AppearanceEditorBreadcrumbItem[] | null\n >(null);\n\n useEffect(() => {\n const [, , sectionName] = pathname.split('/').filter(p => !!p);\n if (sectionName) {\n const section = appearanceState().config?.sections[sectionName];\n if (section) {\n setBreadcrumb([\n {\n label: message('Appearance'),\n location: '',\n },\n ...section.buildBreadcrumb(pathname, getValues()),\n ]);\n // bail, so breadcrumb is not cleared below\n return;\n }\n }\n setBreadcrumb(null);\n }, [pathname, getValues]);\n\n // not need to show section header if already at root\n if (!breadcrumb || breadcrumb.length < 2) {\n return null;\n }\n\n return (\n <div className=\"flex items-center border-b h-60 flex-shrink-0\">\n <IconButton\n iconSize=\"md\"\n radius=\"rounded-none\"\n className=\"text-muted h-full w-50 flex-shrink-0\"\n elementType={Link}\n to={`/admin/appearance/${breadcrumb[breadcrumb.length - 2].location}`}\n >\n <KeyboardArrowLeftIcon />\n </IconButton>\n <div className=\"border-l p-10 min-w-0\">\n <div className=\"text-xs text-muted\">\n <Trans message=\"Customizing\" />\n </div>\n <div className=\"flex items-center gap-4 text-sm mt-2\">\n {breadcrumb.map((item, index) => {\n const isLast = breadcrumb.length - 1 === index;\n const isFirst = index === 0;\n const label = <MixedText value={item.label} />;\n\n if (isFirst) {\n return null;\n }\n\n return (\n <Fragment key={index}>\n <div\n className={clsx(\n 'whitespace-nowrap overflow-hidden overflow-ellipsis min-w-0',\n isLast && 'text-primary',\n // don't overflow ellipses last item\n isLast ? 'flex-shrink-0' : 'flex-auto'\n )}\n >\n {label}\n </div>\n {!isLast && (\n <KeyboardArrowRightIcon className=\"icon-sm text-muted flex-shrink-0\" />\n )}\n </Fragment>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n","import {Link, Navigate, Outlet, useLocation} from 'react-router-dom';\nimport {useEffect, useRef} from 'react';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {CloseIcon} from '../../icons/material/Close';\nimport {Button} from '../../ui/buttons/button';\nimport {appearanceState, AppearanceValues} from './appearance-store';\nimport {useSaveAppearanceChanges} from './requests/save-appearance-changes';\nimport {useAppearanceValues} from './requests/appearance-values';\nimport {Trans} from '../../i18n/trans';\nimport {useForm, useFormContext} from 'react-hook-form';\nimport {Form} from '../../ui/forms/form';\nimport {ProgressCircle} from '../../ui/progress/progress-circle';\nimport {SectionHeader} from './section-header';\nimport {FileUploadProvider} from '../../uploads/uploader/file-upload-provider';\nimport {useAppearanceEditorMode} from './commands/use-appearance-editor-mode';\nimport {StaticPageTitle} from '../../seo/static-page-title';\nimport {useSettings} from '../../core/settings/use-settings';\n\nexport function AppearanceLayout() {\n const {isAppearanceEditorActive} = useAppearanceEditorMode();\n const {data} = useAppearanceValues();\n const {base_url} = useSettings();\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const {pathname} = useLocation();\n\n useEffect(() => {\n // only set defaults snapshot once on route init\n if (data?.defaults && !appearanceState().defaults) {\n appearanceState().setDefaults(data.defaults);\n }\n }, [data]);\n\n useEffect(() => {\n if (iframeRef.current) {\n appearanceState().setIframeWindow(iframeRef.current.contentWindow!);\n }\n }, []);\n\n useEffect(() => {\n const sectionName = pathname.split('/')[3];\n appearanceState().preview.navigate(sectionName);\n }, [pathname]);\n\n // make sure appearance editor iframe can't be nested\n if (isAppearanceEditorActive) {\n return <Navigate to=\"/admin\" />;\n }\n\n return (\n <div className=\"h-screen items-center md:flex\">\n <StaticPageTitle>\n <Trans message=\"Appearance\" />\n </StaticPageTitle>\n <Sidebar values={data?.values} />\n <div className=\"relative h-full flex-auto\">\n <iframe\n ref={iframeRef}\n className=\"h-full w-full max-md:hidden\"\n src={`${base_url}?appearanceEditor=true`}\n />\n </div>\n </div>\n );\n}\n\ninterface SidebarProps {\n values: AppearanceValues | undefined;\n}\nfunction Sidebar({values}: SidebarProps) {\n const spinner = (\n <div className=\"flex h-full flex-auto items-center justify-center\">\n <ProgressCircle isIndeterminate aria-label=\"Loading editor\" />\n </div>\n );\n\n return (\n <div className=\"relative z-10 h-full w-full border-r bg shadow-lg @container md:w-320\">\n {values ? <AppearanceForm defaultValues={values} /> : spinner}\n </div>\n );\n}\n\ninterface AppearanceFormProps {\n defaultValues: AppearanceValues;\n}\n\nfunction AppearanceForm({defaultValues}: AppearanceFormProps) {\n const form = useForm<AppearanceValues>({defaultValues});\n const {watch, reset} = form;\n const saveChanges = useSaveAppearanceChanges();\n\n useEffect(() => {\n const subscription = watch(value => {\n appearanceState().preview.setValues(value as AppearanceValues);\n });\n return () => subscription.unsubscribe();\n }, [watch]);\n\n return (\n <Form\n className=\"flex h-full flex-col\"\n form={form}\n onSubmit={values => {\n saveChanges.mutate(values, {\n onSuccess: () => reset(values),\n });\n }}\n >\n <Header isLoading={saveChanges.isPending} />\n <SectionHeader />\n <div className=\"flex-auto overflow-y-auto px-14 py-20\">\n <FileUploadProvider>\n <Outlet />\n </FileUploadProvider>\n </div>\n </Form>\n );\n}\n\ninterface HeaderProps {\n isLoading: boolean;\n}\nfunction Header({isLoading}: HeaderProps) {\n const {\n formState: {dirtyFields},\n } = useFormContext<AppearanceValues>();\n const isDirty = Object.keys(dirtyFields).length;\n return (\n <div className=\"flex h-50 flex-shrink-0 items-center border-b pr-10\">\n <IconButton\n border=\"border-r\"\n className=\"text-muted\"\n elementType={Link}\n to=\"..\"\n >\n <CloseIcon />\n </IconButton>\n <div className=\"pl-10\">\n <Trans message=\"Appearance editor\" />\n </div>\n <Button\n variant=\"flat\"\n color=\"primary\"\n className=\"ml-auto block\"\n disabled={!isDirty || isLoading}\n type=\"submit\"\n >\n {isDirty ? <Trans message=\"Save\" /> : <Trans message=\"Saved\" />}\n </Button>\n </div>\n );\n}\n","import {Link, useNavigate} from 'react-router-dom';\nimport {AppearanceValues} from '../../appearance-store';\nimport {Button} from '../../../../ui/buttons/button';\nimport {AddIcon} from '../../../../icons/material/Add';\nimport {Trans} from '../../../../i18n/trans';\nimport {useFieldArray} from 'react-hook-form';\nimport {AppearanceButton} from '../../appearance-button';\nimport {nanoid} from 'nanoid';\nimport {useTrans} from '../../../../i18n/use-trans';\nimport {message} from '../../../../i18n/message';\nimport {Fragment} from 'react';\n\nexport function MenuList() {\n const navigate = useNavigate();\n const {trans} = useTrans();\n const {fields, append} = useFieldArray<\n AppearanceValues,\n 'settings.menus',\n 'key'\n >({\n name: 'settings.menus',\n keyName: 'key',\n });\n\n return (\n <Fragment>\n <div>\n {fields.map((field, index) => (\n <AppearanceButton to={`${index}`} key={field.key} elementType={Link}>\n {field.name}\n </AppearanceButton>\n ))}\n </div>\n <div className=\"text-right\">\n <Button\n variant=\"outline\"\n color=\"primary\"\n startIcon={<AddIcon />}\n size=\"xs\"\n onClick={() => {\n const id = nanoid(10);\n append({\n name: trans(\n message('New menu :number', {\n values: {number: fields.length + 1},\n })\n ),\n id,\n positions: [],\n items: [],\n });\n navigate(`${fields.length}`);\n }}\n >\n <Trans message=\"Create menu\" />\n </Button>\n </div>\n </Fragment>\n );\n}\n","import {useForm} from 'react-hook-form';\nimport {Accordion, AccordionItem} from '@common/ui/accordion/accordion';\nimport {Form} from '@common/ui/forms/form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {MenuItemConfig} from '@common/core/settings/settings';\nimport {AddIcon} from '@common/icons/material/Add';\nimport {Button} from '@common/ui/buttons/button';\nimport {useAvailableRoutes} from '@common/admin/appearance/sections/menus/hooks/available-routes';\nimport {ucFirst} from '@common/utils/string/uc-first';\nimport {List, ListItem} from '@common/ui/list/list';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {Trans} from '@common/i18n/trans';\nimport {useValueLists} from '@common/http/value-lists';\nimport {ReactNode} from 'react';\nimport {nanoid} from 'nanoid';\n\ninterface AddMenuItemDialogProps {\n title?: ReactNode;\n}\nexport function AddMenuItemDialog({\n title = <Trans message=\"Add menu item\" />,\n}: AddMenuItemDialogProps) {\n const {data} = useValueLists(['menuItemCategories']);\n const categories = data?.menuItemCategories || [];\n const routeItems = useAvailableRoutes();\n\n return (\n <Dialog size=\"sm\">\n <DialogHeader>{title}</DialogHeader>\n <DialogBody>\n <Accordion variant=\"outline\">\n <AccordionItem\n label={<Trans message=\"Link\" />}\n bodyClassName=\"max-h-240 overflow-y-auto\"\n >\n <AddCustomLink />\n </AccordionItem>\n <AccordionItem\n label={<Trans message=\"Route\" />}\n bodyClassName=\"max-h-240 overflow-y-auto\"\n >\n <AddRoute items={routeItems} />\n </AccordionItem>\n {categories.map(category => (\n <AccordionItem\n key={category.name}\n label={<Trans message={category.name} />}\n >\n <AddRoute items={category.items} />\n </AccordionItem>\n ))}\n </Accordion>\n </DialogBody>\n </Dialog>\n );\n}\n\nfunction AddCustomLink() {\n const form = useForm<MenuItemConfig>({\n defaultValues: {\n id: nanoid(6),\n type: 'link',\n target: '_blank',\n },\n });\n const {close} = useDialogContext();\n\n return (\n <Form\n form={form}\n onSubmit={value => {\n close(value);\n }}\n >\n <FormTextField\n required\n name=\"label\"\n label={<Trans message=\"Label\" />}\n className=\"mb-20\"\n />\n <FormTextField\n required\n type=\"url\"\n name=\"action\"\n placeholder=\"https://\"\n label={<Trans message=\"Url\" />}\n className=\"mb-20\"\n />\n <div className=\"text-right\">\n <Button type=\"submit\" variant=\"flat\" color=\"primary\" size=\"xs\">\n <Trans message=\"Add to menu\" />\n </Button>\n </div>\n </Form>\n );\n}\n\ninterface AddRouteProps {\n items: Partial<MenuItemConfig>[];\n}\nfunction AddRoute({items}: AddRouteProps) {\n const {close} = useDialogContext();\n\n return (\n <List>\n {items.map(item => {\n return (\n <ListItem\n key={item.id}\n startIcon={<AddIcon size=\"sm\" />}\n onSelected={() => {\n if (item.label) {\n const last = item.label.split('/').pop();\n item.label = last ? ucFirst(last) : item.label;\n item.id = nanoid(6);\n }\n close(item);\n }}\n >\n {item.label}\n </ListItem>\n );\n })}\n </List>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const DragIndicatorIcon = createSvgIcon(\n <path d=\"M11 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />\n, 'DragIndicatorOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const DeleteIcon = createSvgIcon(\n <path d=\"M16 9v10H8V9h8m-1.5-6h-5l-1 1H5v2h14V4h-3.5l-1-1zM18 7H6v12c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7z\" />\n, 'DeleteOutlined');\n","export default \"__VITE_ASSET__abcb02f6__\"","import {\n FieldArrayWithId,\n useFieldArray,\n UseFieldArrayReturn,\n useFormContext,\n} from 'react-hook-form';\nimport {Fragment, useEffect, useMemo, useRef} from 'react';\nimport {Link, useNavigate, useParams} from 'react-router-dom';\nimport {MenuSectionConfig} from '../../types/appearance-editor-config';\nimport {MenuItemConfig} from '@common/core/settings/settings';\nimport {\n appearanceState,\n AppearanceValues,\n useAppearanceStore,\n} from '../../appearance-store';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Button} from '@common/ui/buttons/button';\nimport {AddMenuItemDialog} from '@common/admin/appearance/sections/menus/add-menu-item-dialog';\nimport {AppearanceButton} from '@common/admin/appearance/appearance-button';\nimport {AddIcon} from '@common/icons/material/Add';\nimport {DragIndicatorIcon} from '@common/icons/material/DragIndicator';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport {DeleteIcon} from '@common/icons/material/Delete';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Option} from '../../../../ui/forms/select/select';\nimport {Trans} from '@common/i18n/trans';\nimport dropdownMenu from './dropdown-menu.svg';\nimport {FormChipField} from '@common/ui/forms/input-field/chip-field/form-chip-field';\nimport {\n useSortable,\n UseSortableProps,\n} from '@common/ui/interactions/dnd/sortable/use-sortable';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {createSvgIconFromTree} from '@common/icons/create-svg-icon';\nimport {useSettings} from '@common/core/settings/use-settings';\n\nexport function MenuEditor() {\n const {menuIndex} = useParams();\n const navigate = useNavigate();\n\n const {getValues} = useFormContext<AppearanceValues>();\n const formPath = `settings.menus.${menuIndex!}` as 'settings.menus.0';\n const menu = getValues(formPath);\n\n useEffect(() => {\n // go to menu list, if menu can't be found\n if (!menu) {\n navigate('/admin/appearance/menus');\n } else {\n appearanceState().preview.setHighlight(`[data-menu-id=\"${menu.id}\"]`);\n }\n }, [navigate, menu]);\n\n if (!menu) {\n return null;\n }\n\n return <MenuEditorSection formPath={formPath} />;\n}\n\ninterface MenuEditorFormProps {\n formPath: 'settings.menus.0';\n}\nfunction MenuEditorSection({formPath}: MenuEditorFormProps) {\n const {\n site: {has_mobile_app},\n } = useSettings();\n const menuSectionConfig = useAppearanceStore(\n s => s.config?.sections.menus.config,\n ) as MenuSectionConfig;\n\n const menuPositions = useMemo(() => {\n const positions = [...menuSectionConfig?.positions];\n if (has_mobile_app) {\n positions.push('mobile-app-about');\n }\n return positions.map(position => ({\n key: position,\n name: position.replaceAll('-', ' '),\n }));\n }, [menuSectionConfig, has_mobile_app]);\n\n const fieldArray = useFieldArray<\n AppearanceValues,\n `settings.menus.0.items`,\n 'key'\n >({\n name: `${formPath}.items`,\n keyName: 'key',\n });\n\n return (\n <Fragment>\n <div className=\"mb-30 border-b pb-30\">\n <FormTextField\n name={`${formPath}.name`}\n label={<Trans message=\"Menu name\" />}\n className=\"mb-20\"\n autoFocus\n />\n <FormChipField\n chipSize=\"sm\"\n name={`${formPath}.positions`}\n valueKey=\"id\"\n label={<Trans message=\"Menu positions\" />}\n description={\n <Trans message=\"Where should this menu appear on the site\" />\n }\n >\n {menuPositions.map(item => (\n <Option key={item.key} value={item.key} capitalizeFirst>\n {item.name}\n </Option>\n ))}\n </FormChipField>\n </div>\n <MenuItemsManager fieldArray={fieldArray} />\n <div className=\"text-right\">\n <DeleteMenuTrigger />\n </div>\n </Fragment>\n );\n}\n\ninterface ItemListProps {\n fieldArray: UseFieldArrayReturn<\n AppearanceValues,\n 'settings.menus.0.items',\n 'key'\n >;\n}\nfunction MenuItemsManager({fieldArray: {append, fields, move}}: ItemListProps) {\n const navigate = useNavigate();\n\n return (\n <Fragment>\n <div className=\"flex flex-shrink-0 items-center justify-between gap-16\">\n <Trans message=\"Menu items\" />\n <DialogTrigger\n type=\"popover\"\n placement=\"right\"\n offset={20}\n onClose={(menuItemConfig?: MenuItemConfig) => {\n if (menuItemConfig) {\n append({...menuItemConfig});\n navigate(`items/${fields.length}`);\n }\n }}\n >\n <Button\n variant=\"outline\"\n color=\"primary\"\n size=\"xs\"\n startIcon={<AddIcon />}\n >\n <Trans message=\"Add\" />\n </Button>\n <AddMenuItemDialog />\n </DialogTrigger>\n </div>\n <div className=\"mt-20 flex-shrink-0\">\n {fields.map((item, index) => (\n <MenuListItem\n key={item.key}\n item={item}\n items={fields}\n index={index}\n onSortEnd={(oldIndex, newIndex) => {\n move(oldIndex, newIndex);\n }}\n />\n ))}\n {!fields.length ? (\n <IllustratedMessage\n size=\"xs\"\n className=\"my-40\"\n image={<SvgImage src={dropdownMenu} />}\n title={<Trans message=\"No menu items yet\" />}\n description={\n <Trans message=\"Click “add“ button to start adding links, pages, routes and other items to this menu. \" />\n }\n />\n ) : null}\n </div>\n </Fragment>\n );\n}\n\nfunction DeleteMenuTrigger() {\n const navigate = useNavigate();\n const {menuIndex} = useParams();\n const {fields, remove} = useFieldArray<\n AppearanceValues,\n 'settings.menus',\n 'key'\n >({\n name: 'settings.menus',\n keyName: 'key',\n });\n if (!menuIndex) return null;\n const menu = fields[+menuIndex];\n\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={isConfirmed => {\n if (isConfirmed) {\n const index = fields.findIndex(m => m.id === menu.id);\n remove(index);\n navigate('/admin/appearance/menus');\n }\n }}\n >\n <Button\n variant=\"outline\"\n color=\"danger\"\n size=\"xs\"\n startIcon={<DeleteIcon />}\n >\n <Trans message=\"Delete menu\" />\n </Button>\n <ConfirmationDialog\n isDanger\n title={<Trans message=\"Delete menu\" />}\n body={\n <Trans\n message=\"Are you sure you want to delete “:name“?\"\n values={{name: menu.name}}\n />\n }\n confirm={<Trans message=\"Delete\" />}\n />\n </DialogTrigger>\n );\n}\n\ninterface MenuListItemProps {\n item: MenuItemConfig;\n items: FieldArrayWithId[];\n index: number;\n onSortEnd: UseSortableProps['onSortEnd'];\n}\nfunction MenuListItem({item, items, index, onSortEnd}: MenuListItemProps) {\n const ref = useRef<HTMLButtonElement>(null);\n const {sortableProps, dragHandleRef} = useSortable({\n item,\n items,\n type: 'menuEditorSortable',\n ref,\n onSortEnd,\n strategy: 'liveSort',\n });\n\n const Icon = item.icon && createSvgIconFromTree(item.icon);\n const iconOnlyLabel = (\n <div className=\"flex items-center gap-4 text-xs text-muted\">\n {Icon && <Icon size=\"sm\" />}\n (<Trans message=\"No label...\" />)\n </div>\n );\n\n return (\n <Fragment>\n <AppearanceButton\n elementType={Link}\n to={`items/${index}`}\n ref={ref}\n {...sortableProps}\n >\n <div className=\"flex items-center gap-10\">\n <IconButton ref={dragHandleRef} size=\"sm\">\n <DragIndicatorIcon className=\"text-muted hover:cursor-move\" />\n </IconButton>\n <div>{item.label || iconOnlyLabel}</div>\n </div>\n </AppearanceButton>\n </Fragment>\n );\n}\n","import {useFieldArray, useFormContext} from 'react-hook-form';\nimport {Fragment, useEffect} from 'react';\nimport {appearanceState, AppearanceValues} from '../../appearance-store';\nimport {Button} from '@common/ui/buttons/button';\nimport {DeleteIcon} from '../../../../icons/material/Delete';\nimport {ConfirmationDialog} from '../../../../ui/overlays/dialog/confirmation-dialog';\nimport {DialogTrigger} from '../../../../ui/overlays/dialog/dialog-trigger';\nimport {Trans} from '../../../../i18n/trans';\nimport {useNavigate} from '../../../../utils/hooks/use-navigate';\nimport {MenuItemForm} from '../../../menus/menu-item-form';\nimport {useParams} from 'react-router-dom';\nimport {MenuItemConfig} from '../../../../core/settings/settings';\n\nexport function MenuItemEditor() {\n const {menuIndex, menuItemIndex} = useParams();\n const navigate = useNavigate();\n\n const {getValues} = useFormContext<AppearanceValues>();\n\n const formPath = `settings.menus.${menuIndex}.items.${menuItemIndex}`;\n const item = getValues(formPath as any);\n\n // go to menu editor, if menu item can't be found\n useEffect(() => {\n if (!item) {\n //navigate(`../`);\n } else {\n appearanceState().preview.setHighlight(\n `[data-menu-item-id=\"${item.id}\"]`\n );\n }\n }, [navigate, item]);\n\n // only render form when menu and item are available to avoid issues with hook form default values\n if (!item || menuItemIndex == null) {\n return null;\n }\n\n return <MenuItemEditorSection formPath={formPath} />;\n}\n\ninterface MenuItemEditorSectionProps {\n formPath: string;\n}\nfunction MenuItemEditorSection({formPath}: MenuItemEditorSectionProps) {\n return (\n <Fragment>\n <MenuItemForm formPathPrefix={formPath} />\n <div className=\"text-right mt-40\">\n <DeleteItemTrigger />\n </div>\n </Fragment>\n );\n}\n\nfunction DeleteItemTrigger() {\n const navigate = useNavigate();\n const {menuIndex, menuItemIndex} = useParams();\n const {fields, remove} = useFieldArray<AppearanceValues>({\n name: `settings.menus.${+menuIndex!}.items`,\n });\n\n if (!menuItemIndex) return null;\n\n const item = fields[+menuItemIndex] as MenuItemConfig;\n\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={isConfirmed => {\n if (isConfirmed) {\n if (menuItemIndex) {\n remove(+menuItemIndex);\n navigate(`/admin/appearance/menus/${menuIndex}`);\n }\n }\n }}\n >\n <Button\n variant=\"outline\"\n color=\"danger\"\n size=\"xs\"\n startIcon={<DeleteIcon />}\n >\n <Trans message=\"Delete this item\" />\n </Button>\n <ConfirmationDialog\n isDanger\n title={<Trans message=\"Delete menu item\" />}\n body={\n <Trans\n message=\"Are you sure you want to delete “:name“?\"\n values={{name: item.label}}\n />\n }\n confirm={<Trans message=\"Delete\" />}\n />\n </DialogTrigger>\n );\n}\n","import {appearanceState, useAppearanceStore} from '../appearance-store';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Fragment, ReactNode} from 'react';\nimport {Settings} from '../../../core/settings/settings';\n\nexport function GeneralSection() {\n return (\n <Fragment>\n <BrandingImageSelector\n label={<Trans message=\"Favicon\" />}\n description={\n <Trans message=\"This will generate different size favicons. Image should be at least 512x512 in size.\" />\n }\n type=\"favicon\"\n />\n <BrandingImageSelector\n label={<Trans message=\"Light logo\" />}\n description={<Trans message=\"Will be used on dark backgrounds.\" />}\n type=\"logo_light\"\n />\n <BrandingImageSelector\n label={<Trans message=\"Dark logo\" />}\n description={\n <Trans message=\"Will be used on light backgrounds. Will default to light logo if left empty.\" />\n }\n type=\"logo_dark\"\n />\n <BrandingImageSelector\n label={<Trans message=\"Mobile light logo\" />}\n description={\n <Trans message=\"Will be used on light backgrounds on mobile. Will default to desktop logo if left empty.\" />\n }\n type=\"logo_light_mobile\"\n />\n <BrandingImageSelector\n label={<Trans message=\"Mobile dark logo\" />}\n description={\n <Trans message=\"Will be used on dark backgrounds on mobile. Will default to desktop if left empty.\" />\n }\n type=\"logo_dark_mobile\"\n />\n <SiteNameTextField />\n <SiteDescriptionTextArea />\n </Fragment>\n );\n}\n\ninterface ImageSelectorProps {\n label: ReactNode;\n description: ReactNode;\n type: keyof Settings['branding'];\n}\nfunction BrandingImageSelector({label, description, type}: ImageSelectorProps) {\n const defaultValue = useAppearanceStore(\n s => s.defaults?.settings.branding[type]\n );\n return (\n <FormImageSelector\n name={`settings.branding.${type}`}\n className=\"border-b pb-30 mb-30\"\n label={label}\n description={description}\n diskPrefix=\"branding_media\"\n defaultValue={defaultValue}\n onChange={() => {\n appearanceState().preview.setHighlight('[data-logo=\"navbar\"]');\n }}\n />\n );\n}\nfunction SiteNameTextField() {\n return (\n <FormTextField\n name=\"appearance.env.app_name\"\n required\n className=\"mt-20\"\n label={<Trans message=\"Site name\" />}\n />\n );\n}\n\nfunction SiteDescriptionTextArea() {\n return (\n <FormTextField\n name=\"settings.branding.site_description\"\n className=\"mt-20\"\n inputElementType=\"textarea\"\n rows={4}\n label={<Trans message=\"Site description\" />}\n />\n );\n}\n","export function randomNumber(min: number = 1, max: number = 10000) {\n const randomBuffer = new Uint32Array(1);\n\n window.crypto.getRandomValues(randomBuffer);\n\n const number = randomBuffer[0] / (0xffffffff + 1);\n\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(number * (max - min + 1)) + min;\n}\n","import {NavLink, useNavigate} from 'react-router-dom';\nimport {Fragment, useEffect} from 'react';\nimport {appearanceState, AppearanceValues} from '../../appearance-store';\nimport {AppearanceButton} from '../../appearance-button';\nimport {Button} from '../../../../ui/buttons/button';\nimport {AddIcon} from '../../../../icons/material/Add';\nimport {randomNumber} from '../../../../utils/string/random-number';\nimport {Trans} from '../../../../i18n/trans';\nimport {useFieldArray} from 'react-hook-form';\nimport {useTrans} from '../../../../i18n/use-trans';\nimport {message} from '../../../../i18n/message';\nimport {useBootstrapData} from '../../../../core/bootstrap-data/bootstrap-data-context';\n\nexport function ThemeList() {\n const {trans} = useTrans();\n const navigate = useNavigate();\n const {\n data: {themes},\n } = useBootstrapData();\n const {fields, append} = useFieldArray<\n AppearanceValues,\n 'appearance.themes.all',\n 'key'\n >({\n name: 'appearance.themes.all',\n keyName: 'key',\n });\n\n useEffect(() => {\n if (themes.selectedThemeId) {\n appearanceState().preview.setActiveTheme(themes.selectedThemeId);\n }\n }, [themes.selectedThemeId]);\n\n return (\n <Fragment>\n <div className=\"mb-20\">\n <Button\n size=\"xs\"\n variant=\"outline\"\n color=\"primary\"\n startIcon={<AddIcon />}\n onClick={() => {\n const lightThemeColors =\n appearanceState().defaults?.appearance.themes.light!;\n append({\n id: randomNumber(),\n name: trans(message('New theme')),\n values: lightThemeColors,\n });\n navigate(`${fields.length + 1}`);\n }}\n >\n <Trans message=\"New theme\" />\n </Button>\n </div>\n {fields.map((field, index) => (\n <AppearanceButton key={field.key} to={`${index}`} elementType={NavLink}>\n {field.name}\n </AppearanceButton>\n ))}\n </Fragment>\n );\n}\n","import React, {MutableRefObject, ReactNode, Suspense, useState} from 'react';\nimport {Dialog} from '../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../ui/overlays/dialog/dialog-header';\nimport {Trans} from '../i18n/trans';\nimport {DialogBody} from '../ui/overlays/dialog/dialog-body';\nimport {ProgressCircle} from '../ui/progress/progress-circle';\nimport {useDialogContext} from '../ui/overlays/dialog/dialog-context';\nimport {DialogFooter} from '../ui/overlays/dialog/dialog-footer';\nimport {Button} from '../ui/buttons/button';\nimport type ReactAce from 'react-ace';\n\nconst AceEditor = React.lazy(() => import('./ace-editor'));\n\ninterface TextEditorSourcecodeDialogProps {\n defaultValue: string;\n mode?: 'css' | 'html' | 'php_laravel_blade';\n title: ReactNode;\n onSave?: (value?: string) => void;\n isSaving?: boolean;\n footerStartAction?: ReactNode;\n beautify?: boolean;\n editorRef?: MutableRefObject<ReactAce | null>;\n}\nexport function AceDialog({\n defaultValue,\n mode = 'html',\n title,\n onSave,\n isSaving,\n footerStartAction,\n beautify,\n editorRef,\n}: TextEditorSourcecodeDialogProps) {\n const [value, setValue] = useState(defaultValue);\n const [isValid, setIsValid] = useState<boolean>(true);\n\n return (\n <Dialog size=\"fullscreen\" className=\"h-full w-full\">\n <DialogHeader>{title}</DialogHeader>\n <DialogBody className=\"relative flex-auto\" padding=\"p-0\">\n <Suspense\n fallback={\n <div className=\"flex h-400 w-full items-center justify-center\">\n <ProgressCircle\n aria-label=\"Loading editor...\"\n isIndeterminate\n size=\"md\"\n />\n </div>\n }\n >\n <AceEditor\n beautify={beautify}\n mode={mode}\n onChange={newValue => setValue(newValue)}\n defaultValue={value || ''}\n onIsValidChange={setIsValid}\n editorRef={editorRef}\n />\n </Suspense>\n </DialogBody>\n <Footer\n disabled={!isValid || isSaving}\n value={value}\n onSave={onSave}\n startAction={footerStartAction}\n />\n </Dialog>\n );\n}\n\ninterface FooterProps {\n disabled: boolean | undefined;\n value?: string;\n onSave?: (value?: string) => void;\n startAction?: ReactNode;\n}\nfunction Footer({disabled, value, onSave, startAction}: FooterProps) {\n const {close} = useDialogContext();\n return (\n <DialogFooter dividerTop startAction={startAction}>\n <Button onClick={() => close()}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n disabled={disabled}\n variant=\"flat\"\n color=\"primary\"\n onClick={() => {\n if (onSave) {\n onSave(value);\n } else {\n close(value);\n }\n }}\n >\n <Trans message=\"Save\" />\n </Button>\n </DialogFooter>\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\n\nexport function useSeoTags(name: string | string[]) {\n return useQuery({\n queryKey: ['admin', 'seo-tags', name],\n queryFn: () => fetchTags(name),\n });\n}\n\nfunction fetchTags(name: string | string[]) {\n return apiClient\n .get<\n Record<\n string,\n {\n custom: string | null;\n original: string;\n }\n >\n >(`admin/appearance/seo-tags/${name}`)\n .then(response => response.data);\n}\n","import {useMutation, useQueryClient} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\n\ninterface Response extends BackendResponse {}\n\nexport function useUpdateSeoTags(name: string) {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (payload: {tags: string}) => updateTags(name, payload.tags),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: ['admin', 'seo-tags', name],\n });\n toast(message('Updated SEO tags'));\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction updateTags(name: string, tags: string): Promise<Response> {\n return apiClient\n .put(`admin/appearance/seo-tags/${name}`, {tags})\n .then(r => r.data);\n}\n","import {Fragment, useRef} from 'react';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {AppearanceButton} from '@common/admin/appearance/appearance-button';\nimport {AceDialog} from '@common/ace-editor/ace-dialog';\nimport mergedAppearanceConfig from '@common/admin/appearance/config/merged-appearance-config';\nimport {SeoSettingsSectionConfig} from '@common/admin/appearance/types/appearance-editor-config';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {useSeoTags} from '@common/admin/appearance/sections/seo/use-seo-tags';\nimport {useUpdateSeoTags} from '@common/admin/appearance/sections/seo/use-update-seo-tags';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {FullPageLoader} from '@common/ui/progress/full-page-loader';\nimport {Button} from '@common/ui/buttons/button';\nimport type ReactAce from 'react-ace';\n\nconst pages =\n (\n mergedAppearanceConfig.sections['seo-settings']\n .config as SeoSettingsSectionConfig\n )?.pages || [];\n\nconst names = pages.map(page => page.key);\n\nexport function SeoSection() {\n const {isLoading} = useSeoTags(names);\n\n if (isLoading) {\n return <FullPageLoader />;\n }\n\n return (\n <Fragment>\n {pages.map(page => (\n <TagEditorTrigger key={page.key} label={page.label} name={page.key} />\n ))}\n </Fragment>\n );\n}\n\ninterface TagEditorTriggerProps {\n label: MessageDescriptor;\n name: string;\n}\nfunction TagEditorTrigger({label, name}: TagEditorTriggerProps) {\n const {data, isLoading} = useSeoTags(names);\n\n return (\n <DialogTrigger type=\"modal\">\n <AppearanceButton disabled={isLoading}>\n <Trans {...label} />\n </AppearanceButton>\n {data ? <TagsEditorDialog name={name} value={data[name]} /> : null}\n </DialogTrigger>\n );\n}\n\ninterface TagsEditorDialogProps {\n name: string;\n value: {custom: string | null; original: string};\n}\nfunction TagsEditorDialog({name, value}: TagsEditorDialogProps) {\n const {close} = useDialogContext();\n const updateTags = useUpdateSeoTags(name);\n const editorRef = useRef<ReactAce | null>(null);\n\n const resetButton = (\n <Button\n variant=\"outline\"\n color=\"primary\"\n onClick={() => {\n if (editorRef.current) {\n editorRef.current.editor.setValue(value.original);\n }\n }}\n >\n <Trans message=\"Reset to original\" />\n </Button>\n );\n\n return (\n <AceDialog\n mode=\"php_laravel_blade\"\n title={<Trans message=\"Edit SEO meta tags\" />}\n footerStartAction={resetButton}\n editorRef={editorRef}\n defaultValue={value.custom || value.original}\n isSaving={updateTags.isPending}\n beautify={false}\n onSave={newValue => {\n if (newValue != null) {\n updateTags.mutate(\n {tags: newValue},\n {\n onSuccess: () => close(),\n },\n );\n }\n }}\n />\n );\n}\n","import {AppearanceButton} from '@common/admin/appearance/appearance-button';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Trans} from '@common/i18n/trans';\nimport {useFormContext} from 'react-hook-form';\nimport {\n appearanceState,\n AppearanceValues,\n} from '@common/admin/appearance/appearance-store';\nimport {AceDialog} from '@common/ace-editor/ace-dialog';\nimport {Fragment} from 'react';\n\nexport function CustomCodeSection() {\n return (\n <Fragment>\n <CustomCodeDialogTrigger mode=\"css\" />\n <CustomCodeDialogTrigger mode=\"html\" />\n </Fragment>\n );\n}\n\ninterface CustomCodeDialogTriggerProps {\n mode: 'html' | 'css';\n}\nfunction CustomCodeDialogTrigger({mode}: CustomCodeDialogTriggerProps) {\n const {getValues} = useFormContext<AppearanceValues>();\n const {setValue} = useFormContext<AppearanceValues>();\n\n const title =\n mode === 'html' ? (\n <Trans message=\"Custom HTML & JavaScript\" />\n ) : (\n <Trans message=\"Custom CSS\" />\n );\n\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={newValue => {\n if (newValue != null) {\n setValue(`appearance.custom_code.${mode}`, newValue, {\n shouldDirty: true,\n });\n appearanceState().preview.setCustomCode(mode, newValue);\n }\n }}\n >\n <AppearanceButton>{title}</AppearanceButton>\n <AceDialog\n title={title}\n defaultValue={getValues(`appearance.custom_code.${mode}`) || ''}\n mode={mode}\n />\n </DialogTrigger>\n );\n}\n","export default \"__VITE_ASSET__8acde003__\"","import {Permission} from './permission';\nimport {Subscription} from '../billing/subscription';\nimport {Role} from './role';\nimport {SocialProfile} from './social-profile';\nimport {AccessToken} from './access-token';\nimport type {ActiveSession} from '@common/auth/ui/account-settings/sessions-panel/requests/use-user-sessions';\n\nexport const USER_MODEL = 'user';\n\nexport interface User {\n id: number;\n display_name: string;\n username?: string;\n first_name?: string;\n last_name?: string;\n avatar?: string;\n email_verified_at: string;\n permissions?: Permission[];\n email: string;\n password: string;\n language: string;\n timezone: string;\n country: string;\n created_at: string;\n updated_at: string;\n subscriptions?: Omit<Subscription, 'user'>[];\n roles: Role[];\n social_profiles: SocialProfile[];\n tokens?: AccessToken[];\n has_password: boolean;\n available_space: number | null;\n unread_notifications_count?: number;\n card_last_four?: number;\n card_brand?: string;\n card_expires?: string;\n model_type: typeof USER_MODEL;\n banned_at?: string;\n followed_users?: Omit<User, 'followed_users' | 'followers'>[];\n followers_count?: number;\n followed_users_count?: number;\n followers?: Omit<User, 'followed_users' | 'followers'>[];\n last_login?: ActiveSession;\n bans?: {\n id: number;\n comment: string;\n expired_at?: string;\n }[];\n two_factor_confirmed_at?: string;\n two_factor_recovery_codes?: string[];\n}\n","import {\n BackendFilter,\n FilterControlType,\n FilterOperator,\n} from '../../datatable/filters/backend-filter';\nimport {message} from '../../i18n/message';\nimport {USER_MODEL} from '../../auth/user';\nimport {SiteConfigContextValue} from '@common/core/settings/site-config-context';\nimport {\n createdAtFilter,\n updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\n\nexport const CustomPageDatatableFilters = (\n config: SiteConfigContextValue\n): BackendFilter[] => {\n const dynamicFilters: BackendFilter[] =\n config.customPages.types.length > 1\n ? [\n {\n control: {\n type: FilterControlType.Select,\n defaultValue: 'default',\n options: config.customPages.types.map(type => ({\n value: type.type,\n label: type.label,\n key: type.type,\n })),\n },\n\n key: 'type',\n label: message('Type'),\n description: message('Type of the page'),\n defaultOperator: FilterOperator.eq,\n },\n ]\n : [];\n\n return [\n {\n key: 'user_id',\n label: message('User'),\n description: message('User page was created by'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.SelectModel,\n model: USER_MODEL,\n },\n },\n ...dynamicFilters,\n createdAtFilter({\n description: message('Date page was created'),\n }),\n updatedAtFilter({\n description: message('Date page was last updated'),\n }),\n ];\n};\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {CustomPage} from '@common/admin/custom-pages/custom-page';\nimport {Trans} from '@common/i18n/trans';\nimport {Link} from 'react-router-dom';\nimport {LinkStyle} from '@common/ui/buttons/external-link';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport React from 'react';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {EditIcon} from '@common/icons/material/Edit';\n\nexport const CustomPageDatatableColumns: ColumnConfig<CustomPage>[] = [\n {\n key: 'slug',\n allowsSorting: true,\n width: 'flex-2 min-w-200',\n visibleInMode: 'all',\n header: () => <Trans message=\"Slug\" />,\n body: page => (\n <Link target=\"_blank\" to={`/pages/${page.slug}`} className={LinkStyle}>\n {page.slug}\n </Link>\n ),\n },\n {\n key: 'user_id',\n allowsSorting: true,\n width: 'flex-2 min-w-140',\n header: () => <Trans message=\"Owner\" />,\n body: page =>\n page.user && (\n <NameWithAvatar\n image={page.user.avatar}\n label={page.user.display_name}\n description={page.user.email}\n />\n ),\n },\n {\n key: 'type',\n maxWidth: 'max-w-100',\n header: () => <Trans message=\"Type\" />,\n body: page => <Trans message={page.type} />,\n },\n {\n key: 'updated_at',\n allowsSorting: true,\n width: 'w-100',\n header: () => <Trans message=\"Last updated\" />,\n body: page => <FormattedDate date={page.updated_at} />,\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n align: 'end',\n width: 'w-84 flex-shrink-0',\n visibleInMode: 'all',\n body: page => (\n <IconButton\n size=\"md\"\n className=\"text-muted\"\n elementType={Link}\n to={`${page.id}/edit`}\n >\n <EditIcon />\n </IconButton>\n ),\n },\n];\n","import React, {useContext, useMemo} from 'react';\nimport {Link} from 'react-router-dom';\nimport {DataTablePage} from '../../datatable/page/data-table-page';\nimport {Trans} from '../../i18n/trans';\nimport {DataTableEmptyStateMessage} from '../../datatable/page/data-table-emty-state-message';\nimport articlesSvg from './articles.svg';\nimport {DataTableAddItemButton} from '../../datatable/data-table-add-item-button';\nimport {CustomPageDatatableFilters} from './custom-page-datatable-filters';\nimport {DeleteSelectedItemsAction} from '../../datatable/page/delete-selected-items-action';\nimport {CustomPageDatatableColumns} from '@common/admin/custom-pages/custom-page-datatable-columns';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\n\nexport function CustomPageDatablePage() {\n const config = useContext(SiteConfigContext);\n const filters = useMemo(() => {\n return CustomPageDatatableFilters(config);\n }, [config]);\n\n return (\n <DataTablePage\n endpoint=\"custom-pages\"\n title={<Trans message=\"Custom pages\" />}\n filters={filters}\n columns={CustomPageDatatableColumns}\n queryParams={{with: 'user'}}\n actions={<Actions />}\n selectedActions={<DeleteSelectedItemsAction />}\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={articlesSvg}\n title={<Trans message=\"No pages have been created yet\" />}\n filteringTitle={<Trans message=\"No matching pages\" />}\n />\n }\n />\n );\n}\n\nfunction Actions() {\n return (\n <DataTableAddItemButton elementType={Link} to=\"new\">\n <Trans message=\"New page\" />\n </DataTableAddItemButton>\n );\n}\n","import {SettingsNavItem} from '@common/admin/settings/settings-nav-config';\nimport {message} from '@common/i18n/message';\n\nexport const AppSettingsNavConfig: SettingsNavItem[] = [\n {label: message('Local search'), to: 'search'},\n {label: message('Content'), to: 'content'},\n {label: message('Videos'), to: 'videos'},\n];\n","import {AppSettingsNavConfig} from '@app/admin/settings/app-settings-nav-config';\nimport {message} from '../../i18n/message';\nimport {MessageDescriptor} from '../../i18n/message-descriptor';\nimport {To} from 'react-router-dom';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nexport interface SettingsNavItem {\n label: MessageDescriptor;\n to: To;\n}\n\nconst filteredSettingsNavConfig: (SettingsNavItem | false)[] = [\n {label: message('General'), to: 'general'},\n ...AppSettingsNavConfig,\n getBootstrapData().settings.billing.integrated && {\n label: message('Subscriptions'),\n to: 'subscriptions',\n },\n {label: message('Localization'), to: 'localization'},\n {\n label: message('Authentication'),\n to: 'authentication',\n },\n {label: message('Uploading'), to: 'uploading'},\n {label: message('Outgoing email'), to: 'outgoing-email'},\n {label: message('Cache'), to: 'cache'},\n {label: message('Analytics'), to: 'analytics'},\n {label: message('Logging'), to: 'logging'},\n {label: message('Queue'), to: 'queue'},\n {label: message('Recaptcha'), to: 'recaptcha'},\n {label: message('GDPR'), to: 'gdpr'},\n {\n label: message('Menus'),\n to: '/admin/appearance/menus',\n },\n {\n label: message('Seo'),\n to: '/admin/appearance/seo-settings',\n },\n {\n label: message('Themes'),\n to: '/admin/appearance/themes',\n },\n].filter(Boolean);\n\nexport const SettingsNavConfig = filteredSettingsNavConfig as SettingsNavItem[];\n","import clsx from 'clsx';\nimport {NavLink, Outlet, useLocation, useNavigate} from 'react-router-dom';\nimport {SettingsNavConfig} from './settings-nav-config';\nimport {useIsMobileMediaQuery} from '../../utils/hooks/is-mobile-media-query';\nimport {Option, Select} from '../../ui/forms/select/select';\nimport {Trans} from '../../i18n/trans';\nimport {StaticPageTitle} from '../../seo/static-page-title';\n\ninterface Props {\n className?: string;\n}\nexport function SettingsLayout({className}: Props) {\n const isMobile = useIsMobileMediaQuery();\n return (\n <div\n className={clsx(\n className,\n 'container mx-auto min-h-full items-start gap-30 p-24 md:flex',\n )}\n >\n <StaticPageTitle>\n <Trans message=\"Settings\" />\n </StaticPageTitle>\n {isMobile ? <MobileNav /> : <DesktopNav />}\n <div className=\"relative max-w-500 flex-auto md:px-30\">\n <Outlet />\n </div>\n </div>\n );\n}\n\nfunction MobileNav() {\n const {pathname} = useLocation();\n const navigate = useNavigate();\n const value = pathname.split('/').pop();\n\n return (\n <Select\n minWidth=\"min-w-none\"\n className=\"mb-24 w-full bg\"\n selectionMode=\"single\"\n selectedValue={value}\n onSelectionChange={newPage => {\n navigate(newPage as string);\n }}\n >\n {SettingsNavConfig.map(item => (\n <Option key={item.to as string} value={item.to}>\n <Trans {...item.label} />\n </Option>\n ))}\n </Select>\n );\n}\n\nfunction DesktopNav() {\n return (\n <div className=\"sticky top-24 w-240 flex-shrink-0\">\n {SettingsNavConfig.map(item => (\n <NavLink\n key={item.to as string}\n to={item.to}\n className={({isActive}) =>\n clsx(\n 'mb-8 block whitespace-nowrap rounded-button p-14 text-sm transition-bg-color',\n isActive\n ? 'bg-primary/6 font-semibold text-primary'\n : 'hover:bg-hover',\n )\n }\n >\n <Trans {...item.label} />\n </NavLink>\n ))}\n </div>\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {AdminSettings} from '../admin-settings';\nimport {apiClient} from '@common/http/query-client';\n\nexport interface FetchAdminSettingsResponse\n extends BackendResponse,\n AdminSettings {}\n\nexport function useAdminSettings() {\n return useQuery({\n queryKey: ['fetchAdminSettings'],\n queryFn: () => fetchAdminSettings(),\n // prevent automatic re-fetching so diffing with previous settings work properly\n staleTime: Infinity,\n });\n}\n\nfunction fetchAdminSettings(): Promise<FetchAdminSettingsResponse> {\n return apiClient.get('settings').then(response => response.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {toast} from '../../ui/toast/toast';\nimport {message} from '../../i18n/message';\nimport {apiClient} from '../../http/query-client';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\nfunction GenerateSitemap(): Promise<Response> {\n return apiClient.post('sitemap/generate').then(r => r.data);\n}\n\nexport function useGenerateSitemap() {\n return useMutation({\n mutationFn: () => GenerateSitemap(),\n onSuccess: () => {\n toast(message('Sitemap generated'));\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {diff} from 'deep-object-diff';\nimport dot from 'dot-object';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {toast} from '@common/ui/toast/toast';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {AdminSettings} from '@common/admin/settings/admin-settings';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {useAdminSettings} from '@common/admin/settings/requests/use-admin-settings';\nimport {message} from '@common/i18n/message';\n\ninterface Response extends BackendResponse {}\n\nexport interface AdminSettingsWithFiles {\n files?: Record<string, File>;\n client?: Partial<AdminSettings['client']>;\n server?: Partial<AdminSettings['server']>;\n}\n\nexport function useUpdateAdminSettings(\n form: UseFormReturn<AdminSettingsWithFiles>,\n) {\n const {data: original} = useAdminSettings();\n\n return useMutation({\n mutationFn: (props: AdminSettingsWithFiles) => {\n //need to convert these to json, otherwise only single key from object would be sent due to diffing\n if (props.client?.cookie_notice?.button) {\n props.client.cookie_notice.button = JSON.stringify(\n props.client.cookie_notice.button,\n ) as any;\n }\n if (props.client?.registration?.policies) {\n props.client.registration.policies = JSON.stringify(\n props.client.registration.policies,\n ) as any;\n }\n if ((props.client as any)?.artistPage?.tabs) {\n (props.client as any).artistPage.tabs = JSON.stringify(\n (props.client as any).artistPage.tabs,\n ) as any;\n }\n if ((props.client as any)?.title_page?.sections) {\n (props.client as any).title_page.sections = JSON.stringify(\n (props.client as any).title_page.sections,\n ) as any;\n }\n if ((props.client as any)?.incoming_email) {\n (props.client as any).incoming_email = JSON.stringify(\n (props.client as any).incoming_email,\n ) as any;\n }\n if ((props.client as any)?.publish?.default_credentials) {\n (props.client as any).publish.default_credentials = JSON.stringify(\n (props.client as any).publish.default_credentials,\n ) as any;\n }\n\n const client = props.client ? diff(original!.client, props.client) : null;\n const server = props.server ? diff(original!.server, props.server) : null;\n return updateAdminSettings({\n client,\n server,\n files: props.files,\n } as AdminSettings);\n },\n onSuccess: () => {\n toast(message('Settings updated'), {\n position: 'bottom-right',\n });\n queryClient.invalidateQueries({queryKey: ['fetchAdminSettings']});\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction updateAdminSettings({\n client,\n server,\n files,\n}: AdminSettingsWithFiles): Promise<Response> {\n const formData = new FormData();\n if (client) {\n formData.set('client', JSON.stringify(dot.dot(client)));\n }\n if (server) {\n formData.set('server', JSON.stringify(dot.dot(server)));\n }\n Object.entries(files || {}).forEach(([key, file]) => {\n formData.set(key, file);\n });\n return apiClient\n .post('settings', formData, {\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n })\n .then(r => r.data);\n}\n","import {FieldErrors, useForm} from 'react-hook-form';\nimport {Fragment, ReactNode} from 'react';\nimport {\n AdminSettingsWithFiles,\n useUpdateAdminSettings,\n} from './requests/update-admin-settings';\nimport {AdminSettings} from './admin-settings';\nimport {useAdminSettings} from './requests/use-admin-settings';\nimport {Form} from '../../ui/forms/form';\nimport {Button} from '../../ui/buttons/button';\nimport {ProgressCircle} from '../../ui/progress/progress-circle';\nimport {ProgressBar} from '../../ui/progress/progress-bar';\nimport {Trans} from '../../i18n/trans';\n\ninterface Props {\n title: ReactNode;\n description: ReactNode;\n children: ReactNode;\n transformValues?: (values: AdminSettingsWithFiles) => AdminSettingsWithFiles;\n}\nexport function SettingsPanel({\n title,\n description,\n children,\n transformValues,\n}: Props) {\n const {data} = useAdminSettings();\n\n return (\n <section>\n <div className=\"mb-40\">\n <h2 className=\"mb-4 text-xl\">{title}</h2>\n <div className=\"text-sm text-muted\">{description}</div>\n </div>\n {data ? (\n <FormWrapper defaultValues={data} transformValues={transformValues}>\n {children}\n </FormWrapper>\n ) : (\n <ProgressCircle isIndeterminate aria-label=\"Loading settings...\" />\n )}\n </section>\n );\n}\n\ninterface FormWrapperProps {\n children: ReactNode;\n defaultValues: AdminSettings;\n transformValues?: (values: AdminSettingsWithFiles) => AdminSettingsWithFiles;\n}\nfunction FormWrapper({\n children,\n defaultValues,\n transformValues,\n}: FormWrapperProps) {\n const form = useForm<AdminSettingsWithFiles>({defaultValues});\n const updateSettings = useUpdateAdminSettings(form);\n return (\n <Fragment>\n <Form\n form={form}\n onBeforeSubmit={() => {\n // clear group errors, because hook form won't automatically\n // clear errors that are not bound to a specific form field\n const errors = form.formState.errors as FieldErrors<object>;\n const keys = Object.keys(errors).filter(key => {\n return key.endsWith('_group');\n });\n form.clearErrors(keys as any);\n }}\n onSubmit={value => {\n value = transformValues ? transformValues(value) : value;\n updateSettings.mutate(value);\n }}\n >\n {children}\n <div className=\"mt-40\">\n <Button\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n disabled={updateSettings.isPending}\n >\n <Trans message=\"Update\" />\n </Button>\n </div>\n </Form>\n {updateSettings.isPending && (\n <ProgressBar\n size=\"xs\"\n className=\"absolute -bottom-14 left-30 w-full\"\n isIndeterminate\n aria-label=\"Saving settings...\"\n />\n )}\n </Fragment>\n );\n}\n","export function SettingsSeparator() {\n return <div className=\"h-1 bg-divider my-30\" />;\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const LinkIcon = createSvgIcon(\n <path d=\"M17 7h-4v2h4c1.65 0 3 1.35 3 3s-1.35 3-3 3h-4v2h4c2.76 0 5-2.24 5-5s-2.24-5-5-5zm-6 8H7c-1.65 0-3-1.35-3-3s1.35-3 3-3h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-2zm-3-4h8v2H8z\" />\n, 'LinkOutlined');\n","import clsx from 'clsx';\nimport {LinkIcon} from '../../icons/material/Link';\nimport {ExternalLink} from '../../ui/buttons/external-link';\nimport {Trans} from '../../i18n/trans';\nimport {useSettings} from '../../core/settings/use-settings';\n\ninterface LearnMoreLinkProps {\n link: string;\n className?: string;\n}\nexport function LearnMoreLink({link, className}: LearnMoreLinkProps) {\n const {site} = useSettings();\n if (site.hide_docs_button) {\n return null;\n }\n return (\n <div className={clsx('flex items-center gap-8', className)}>\n <LinkIcon size=\"sm\" />\n <ExternalLink href={link}>\n <Trans message=\"Learn more\" />\n </ExternalLink>\n </div>\n );\n}\n","import {useAdminSettings} from '../requests/use-admin-settings';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {FormSelect, Option} from '../../../ui/forms/select/select';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {Button} from '@common/ui/buttons/button';\nimport {useGenerateSitemap} from '../generate-sitemap';\nimport {ExternalLink} from '@common/ui/buttons/external-link';\nimport {SettingsPanel} from '../settings-panel';\nimport {SettingsSeparator} from '../settings-separator';\nimport {LearnMoreLink} from '../learn-more-link';\nimport {Trans} from '@common/i18n/trans';\nimport {Fragment, useContext} from 'react';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {useBootstrapData} from '@common/core/bootstrap-data/bootstrap-data-context';\nimport {useValueLists} from '@common/http/value-lists';\nimport {useFormContext} from 'react-hook-form';\nimport {AdminSettingsWithFiles} from '@common/admin/settings/requests/update-admin-settings';\n\nexport function GeneralSettings() {\n return (\n <SettingsPanel\n title={<Trans message=\"General\" />}\n description={\n <Trans message=\"Configure site url, homepage, theme and other general settings.\" />\n }\n >\n <SiteUrlSection />\n <SettingsSeparator />\n <HomepageSection />\n <SettingsSeparator />\n <ThemeSection />\n <SettingsSeparator />\n <SitemapSection />\n </SettingsPanel>\n );\n}\n\nfunction SiteUrlSection() {\n const {data} = useAdminSettings();\n\n if (!data) return null;\n\n let append = null;\n const server = data!.server;\n const isInvalid = server.newAppUrl && server.newAppUrl !== server.app_url;\n if (isInvalid) {\n append = (\n <div className=\"mt-20 text-sm text-danger\">\n <Trans\n values={{\n baseUrl: server.app_url,\n currentUrl: server.newAppUrl,\n b: chunks => <b>{chunks}</b>,\n }}\n message=\"Base site url is set as <b>:baseUrl</b> in configuration, but current url is <b>:currentUrl</b>. It is recommended to set the primary url you want to use in configuration file and then redirect all other url versions to this primary version via cpanel or .htaccess file.\"\n />\n </div>\n );\n }\n\n return (\n <Fragment>\n <FormTextField\n invalid={!!isInvalid}\n name=\"server.app_url\"\n label={<Trans message=\"Primary site url\" />}\n description={\n <LearnMoreLink link=\"https://support.vebto.com/hc/articles/35/primary-site-url\" />\n }\n />\n {append}\n </Fragment>\n );\n}\n\nfunction HomepageSection() {\n const {watch} = useFormContext<AdminSettingsWithFiles>();\n const {homepage} = useContext(SiteConfigContext);\n const {data} = useValueLists(['menuItemCategories']);\n const selectedType = watch('client.homepage.type');\n\n return (\n <div>\n <FormSelect\n name=\"client.homepage.type\"\n selectionMode=\"single\"\n label={<Trans message=\"Site home page\" />}\n description={\n <Trans message=\"Which page should be used as site homepage.\" />\n }\n >\n {homepage.options.map(option => (\n <Option key={option.value} value={option.value}>\n <Trans {...option.label} />\n </Option>\n ))}\n {data?.menuItemCategories?.map(category => (\n <Option key={category.type} value={category.type}>\n {category.name}\n </Option>\n ))}\n </FormSelect>\n {data?.menuItemCategories?.map(category => {\n return selectedType === category.type ? (\n <FormSelect\n className=\"mt-24\"\n name=\"client.homepage.value\"\n key={category.name}\n selectionMode=\"single\"\n label={\n <Trans message=\"Homepage :name\" values={{name: category.name}} />\n }\n >\n {category.items.map(item => (\n <Option key={item.label} value={item.model_id}>\n {item.label}\n </Option>\n ))}\n </FormSelect>\n ) : null;\n })}\n </div>\n );\n}\n\nfunction ThemeSection() {\n const {\n data: {themes},\n } = useBootstrapData();\n return (\n <Fragment>\n <FormSelect\n className=\"mb-20\"\n name=\"client.themes.default_id\"\n selectionMode=\"single\"\n label={<Trans message=\"Default site theme\" />}\n description={\n <Trans message=\"Which theme to use for users that have not chosen a theme manually.\" />\n }\n >\n <Option value={0}>\n <Trans message=\"System\" />\n </Option>\n {themes.all.map(theme => (\n <Option key={theme.id} value={theme.id}>\n {theme.name}\n </Option>\n ))}\n </FormSelect>\n <FormSwitch\n name=\"client.themes.user_change\"\n description={\n <Trans message=\"Allow users to manually change site theme.\" />\n }\n >\n <Trans message=\"Allow theme change\" />\n </FormSwitch>\n </Fragment>\n );\n}\n\nfunction SitemapSection() {\n const generateSitemap = useGenerateSitemap();\n const {base_url} = useSettings();\n\n const url = `${base_url}/storage/sitemaps/sitemap-index.xml`;\n const link = <ExternalLink href={url}>{url}</ExternalLink>;\n\n return (\n <>\n <Button\n variant=\"outline\"\n size=\"xs\"\n color=\"primary\"\n disabled={generateSitemap.isPending}\n onClick={() => {\n generateSitemap.mutate();\n }}\n >\n <Trans message=\"Generate sitemap\" />\n </Button>\n <div className=\"mt-14 text-sm text-muted\">\n <Trans\n message=\"Once generated, sitemap url will be: :url\"\n values={{\n url: link,\n }}\n />\n </div>\n </>\n );\n}\n","import {parseColor} from '@react-stately/color';\n\nexport function colorToThemeValue(color: string): string {\n return parseColor(color)\n .toString('rgb')\n .replace('rgb(', '')\n .replace(')', '')\n .replace(/, ?/g, ' ');\n}\n","import {useForm, useFormContext} from 'react-hook-form';\nimport {useEffect} from 'react';\nimport {TuneIcon} from '../../../../icons/material/Tune';\nimport {Button} from '../../../../ui/buttons/button';\nimport {CssTheme} from '../../../../ui/themes/css-theme';\nimport {FormTextField} from '../../../../ui/forms/input-field/text-field/text-field';\nimport {FormSwitch} from '../../../../ui/forms/toggle/switch';\nimport {AppearanceValues} from '../../appearance-store';\nimport {DialogTrigger} from '../../../../ui/overlays/dialog/dialog-trigger';\nimport {DialogFooter} from '../../../../ui/overlays/dialog/dialog-footer';\nimport {useDialogContext} from '../../../../ui/overlays/dialog/dialog-context';\nimport {Dialog} from '../../../../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../../../../ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '../../../../ui/overlays/dialog/dialog-body';\nimport {Trans} from '../../../../i18n/trans';\nimport {Form} from '../../../../ui/forms/form';\nimport {useParams} from 'react-router-dom';\n\nexport function ThemeSettingsDialogTrigger() {\n const {getValues, setValue} = useFormContext<AppearanceValues>();\n const {themeIndex} = useParams();\n const theme = getValues(`appearance.themes.all.${+themeIndex!}`);\n\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={(value?: CssTheme) => {\n if (!value) return;\n\n getValues('appearance.themes.all').forEach((currentTheme, index) => {\n // update changed theme\n if (currentTheme.id === value.id) {\n setValue(`appearance.themes.all.${index}`, value, {\n shouldDirty: true,\n });\n return;\n }\n\n // unset \"default_light\" and \"default_dark\" on other themes\n if (value.default_light) {\n setValue(\n `appearance.themes.all.${index}`,\n {...currentTheme, default_light: false},\n {shouldDirty: true}\n );\n return;\n }\n if (value.default_dark) {\n setValue(\n `appearance.themes.all.${index}`,\n {...currentTheme, default_dark: false},\n {shouldDirty: true}\n );\n return;\n }\n });\n }}\n >\n <Button\n size=\"xs\"\n variant=\"outline\"\n color=\"primary\"\n startIcon={<TuneIcon />}\n >\n <Trans message=\"Settings\" />\n </Button>\n <SettingsDialog theme={theme} />\n </DialogTrigger>\n );\n}\n\ninterface SettingsDialogProps {\n theme: CssTheme;\n}\nfunction SettingsDialog({theme}: SettingsDialogProps) {\n const form = useForm<CssTheme>({defaultValues: theme});\n const {close, formId} = useDialogContext();\n\n useEffect(() => {\n const subscription = form.watch((value, {name}) => {\n // theme can only be set as either light or dark default\n if (name === 'default_light' && value.default_light) {\n form.setValue('default_dark', false);\n }\n if (name === 'default_dark' && value.default_dark) {\n form.setValue('default_light', false);\n }\n });\n return () => subscription.unsubscribe();\n }, [form]);\n\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Update settings\" />\n </DialogHeader>\n <DialogBody>\n <Form\n form={form}\n id={formId}\n onSubmit={values => {\n close(values);\n }}\n >\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Name\" />}\n className=\"mb-30\"\n autoFocus\n />\n <FormSwitch\n name=\"is_dark\"\n className=\"mb-20 pb-20 border-b\"\n description={\n <Trans message=\"Whether this theme has light text on dark background.\" />\n }\n >\n <Trans message=\"Dark theme\" />\n </FormSwitch>\n <FormSwitch\n name=\"default_light\"\n className=\"mb-30\"\n description={\n <Trans message=\"When light mode is selected, this theme will be used.\" />\n }\n >\n <Trans message=\"Default for light mode\" />\n </FormSwitch>\n <FormSwitch\n name=\"default_dark\"\n description={\n <Trans message=\"When dark mode is selected, this theme will be used.\" />\n }\n >\n <Trans message=\"Default for dark mode\" />\n </FormSwitch>\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button\n onClick={() => {\n close();\n }}\n >\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n form={formId}\n disabled={!form.formState.isDirty}\n >\n <Trans message=\"Save\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const RestartAltIcon = createSvgIcon(\n <path d=\"M6 13c0-1.65.67-3.15 1.76-4.24L6.34 7.34C4.9 8.79 4 10.79 4 13c0 4.08 3.05 7.44 7 7.93v-2.02c-2.83-.48-5-2.94-5-5.91zm14 0c0-4.42-3.58-8-8-8-.06 0-.12.01-.18.01l1.09-1.09L11.5 2.5 8 6l3.5 3.5 1.41-1.41-1.08-1.08c.06 0 .12-.01.17-.01 3.31 0 6 2.69 6 6 0 2.97-2.17 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93z\" />\n, 'RestartAltOutlined');\n","import {Fragment, useState} from 'react';\nimport {DeleteIcon} from '../../../../icons/material/Delete';\nimport {ConfirmationDialog} from '../../../../ui/overlays/dialog/confirmation-dialog';\nimport {IconButton} from '../../../../ui/buttons/icon-button';\nimport {MoreVertIcon} from '../../../../icons/material/MoreVert';\nimport {RestartAltIcon} from '../../../../icons/material/RestartAlt';\nimport {appearanceState, AppearanceValues} from '../../appearance-store';\nimport {toast} from '../../../../ui/toast/toast';\nimport {\n Menu,\n MenuItem,\n MenuTrigger,\n} from '../../../../ui/navigation/menu/menu-trigger';\nimport {DialogTrigger} from '../../../../ui/overlays/dialog/dialog-trigger';\nimport {message} from '../../../../i18n/message';\nimport {Trans} from '../../../../i18n/trans';\nimport {useNavigate} from '../../../../utils/hooks/use-navigate';\nimport {useFieldArray, useFormContext} from 'react-hook-form';\nimport {useParams} from 'react-router-dom';\n\nexport function ThemeMoreOptionsButton() {\n const navigate = useNavigate();\n const {themeIndex} = useParams();\n const [confirmDialogOpen, setConfirmDialogOpen] = useState(false);\n const {setValue, getValues} = useFormContext<AppearanceValues>();\n const {fields, remove} = useFieldArray<AppearanceValues>({\n name: 'appearance.themes.all',\n });\n\n const deleteTheme = () => {\n if (fields.length <= 1) {\n toast.danger(message('At least one theme is required'));\n return;\n }\n if (themeIndex) {\n navigate('/admin/appearance/themes');\n remove(+themeIndex);\n setValue('appearance.themes.selectedThemeId', null);\n }\n };\n\n return (\n <Fragment>\n <MenuTrigger\n onItemSelected={key => {\n if (key === 'delete') {\n setConfirmDialogOpen(true);\n } else if (key === 'reset') {\n const path =\n `appearance.themes.all.${+themeIndex!}` as 'appearance.themes.all.0';\n const defaultColors = getValues(`${path}.is_dark`)\n ? appearanceState().defaults!.appearance.themes.dark\n : appearanceState().defaults!.appearance.themes.light;\n\n Object.entries(defaultColors).forEach(([colorName, themeValue]) => {\n appearanceState().preview.setThemeValue(colorName, themeValue);\n });\n appearanceState().preview.setThemeFont(null);\n\n setValue(`${path}.values`, defaultColors, {\n shouldDirty: true,\n });\n setValue(`${path}.font`, undefined, {\n shouldDirty: true,\n });\n }\n }}\n >\n <IconButton size=\"md\" className=\"text-muted\">\n <MoreVertIcon />\n </IconButton>\n <Menu>\n <MenuItem value=\"reset\" startIcon={<RestartAltIcon />}>\n <Trans message=\"Reset colors\" />\n </MenuItem>\n <MenuItem value=\"delete\" startIcon={<DeleteIcon />}>\n <Trans message=\"Delete\" />\n </MenuItem>\n </Menu>\n </MenuTrigger>\n <DialogTrigger\n type=\"modal\"\n isOpen={confirmDialogOpen}\n onClose={isConfirmed => {\n if (isConfirmed) {\n deleteTheme();\n }\n setConfirmDialogOpen(false);\n }}\n >\n <ConfirmationDialog\n isDanger\n title={<Trans message=\"Delete theme\" />}\n body={<Trans message=\"Are you sure you want to delete this theme?\" />}\n confirm={<Trans message=\"Delete\" />}\n />\n </DialogTrigger>\n </Fragment>\n );\n}\n","import {message} from '@common/i18n/message';\nimport {useParams} from 'react-router-dom';\nimport {useFormContext} from 'react-hook-form';\nimport {AppearanceValues} from '@common/admin/appearance/appearance-store';\nimport {Menu, MenuTrigger} from '@common/ui/navigation/menu/menu-trigger';\nimport {AppearanceButton} from '@common/admin/appearance/appearance-button';\nimport {ColorIcon} from '@common/admin/appearance/sections/themes/color-icon';\nimport clsx from 'clsx';\nimport {Trans} from '@common/i18n/trans';\nimport {Item} from '@common/ui/forms/listbox/item';\n\nconst navbarColorMap = [\n {\n label: message('Accent'),\n value: 'primary',\n bgColor: 'bg-primary',\n previewBgColor: 'text-primary',\n },\n {\n label: message('Background'),\n value: 'bg',\n bgColor: 'bg-background',\n previewBgColor: 'text-background',\n },\n {\n label: message('Background alt'),\n value: 'bg-alt',\n bgColor: 'bg-alt',\n previewBgColor: 'text-background-alt',\n },\n {\n label: message('Transparent'),\n value: 'transparent',\n bgColor: 'bg-transparent',\n previewBgColor: 'text-transparent',\n },\n];\n\nexport function NavbarColorPicker() {\n const {themeIndex} = useParams();\n const {watch, setValue} = useFormContext<AppearanceValues>();\n const key =\n `appearance.themes.all.${themeIndex!}.values.--be-navbar-color` as 'appearance.themes.all.1.values.--be-navbar-color';\n const selectedValue = watch(key);\n const previewColor = navbarColorMap.find(({value}) => value === selectedValue)\n ?.previewBgColor;\n return (\n <MenuTrigger\n placement=\"right\"\n selectionMode=\"single\"\n selectedValue={selectedValue}\n onSelectionChange={value => {\n setValue(key, value as string, {shouldDirty: true});\n }}\n >\n <AppearanceButton\n startIcon={\n <ColorIcon\n viewBox=\"0 0 48 48\"\n className={clsx('icon-lg', previewColor)}\n />\n }\n >\n <Trans message=\"Navbar\" />\n </AppearanceButton>\n <Menu>\n {navbarColorMap.map(({label, value, bgColor}) => (\n <Item\n key={value}\n value={value}\n startIcon={\n <div className={clsx('h-20 w-20 rounded border', bgColor)} />\n }\n >\n <Trans {...label} />\n </Item>\n ))}\n </Menu>\n </MenuTrigger>\n );\n}\n","import {parseColor} from '@react-stately/color';\n\nexport function themeValueToHex(value: string): string {\n try {\n return parseColor(`rgb(${value.split(' ').join(',')})`).toString('hex');\n } catch (e) {\n return value;\n }\n}\n","import {Link, useNavigate, useParams} from 'react-router-dom';\nimport {Fragment, ReactNode, useEffect, useState} from 'react';\nimport {\n appearanceState,\n AppearanceValues,\n} from '@common/admin/appearance/appearance-store';\nimport {AppearanceButton} from '@common/admin/appearance/appearance-button';\nimport {ColorIcon} from '@common/admin/appearance/sections/themes/color-icon';\nimport {CssTheme} from '@common/ui/themes/css-theme';\nimport {colorToThemeValue} from '@common/ui/themes/utils/color-to-theme-value';\nimport {ThemeSettingsDialogTrigger} from '@common/admin/appearance/sections/themes/theme-settings-dialog-trigger';\nimport {ThemeMoreOptionsButton} from '@common/admin/appearance/sections/themes/theme-more-options-button';\nimport {ColorPickerDialog} from '@common/ui/color-picker/color-picker-dialog';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {useFormContext} from 'react-hook-form';\nimport {Trans} from '@common/i18n/trans';\nimport {NavbarColorPicker} from '@common/admin/appearance/sections/themes/navbar-color-picker';\nimport {message} from '@common/i18n/message';\nimport {themeValueToHex} from '@common/ui/themes/utils/theme-value-to-hex';\n\nconst colorList = [\n {\n label: message('Background'),\n key: '--be-background',\n },\n {\n label: message('Background alt'),\n key: '--be-background-alt',\n },\n {\n label: message('Foreground'),\n key: '--be-foreground-base',\n },\n {\n label: message('Accent light'),\n key: '--be-primary-light',\n },\n {\n label: message('Accent'),\n key: '--be-primary',\n },\n {\n label: message('Accent dark'),\n key: '--be-primary-dark',\n },\n {\n label: message('Text on accent'),\n key: '--be-on-primary',\n },\n {\n label: message('Chip'),\n key: '--be-background-chip',\n },\n];\n\nexport function ThemeEditor() {\n const navigate = useNavigate();\n const {themeIndex} = useParams();\n const {getValues, watch} = useFormContext<AppearanceValues>();\n\n const theme = getValues(`appearance.themes.all.${+themeIndex!}`);\n const selectedFont = watch(\n `appearance.themes.all.${+themeIndex!}.font.family`,\n );\n\n // go to theme list, if theme can't be found\n useEffect(() => {\n if (!theme) {\n navigate('/admin/appearance/themes');\n }\n }, [navigate, theme]);\n\n // select theme in preview on initial render\n useEffect(() => {\n if (theme?.id) {\n appearanceState().preview.setActiveTheme(theme.id);\n }\n }, [theme?.id]);\n\n if (!theme) return null;\n\n return (\n <Fragment>\n <div className=\"mb-20 flex items-center justify-between gap-10\">\n <ThemeSettingsDialogTrigger />\n <ThemeMoreOptionsButton />\n </div>\n <div>\n <AppearanceButton\n elementType={Link}\n to=\"font\"\n description={selectedFont ? selectedFont : <Trans message=\"System\" />}\n >\n <Trans message=\"Font\" />\n </AppearanceButton>\n <AppearanceButton elementType={Link} to=\"radius\">\n <Trans message=\"Rounding\" />\n </AppearanceButton>\n <div className=\"mb-6 mt-22 text-sm font-semibold\">\n <Trans message=\"Colors\" />\n </div>\n <NavbarColorPicker />\n {colorList.map(color => (\n <ColorPickerTrigger\n key={color.key}\n colorName={color.key}\n label={<Trans {...color.label} />}\n initialThemeValue={theme.values[color.key]}\n theme={theme}\n />\n ))}\n </div>\n </Fragment>\n );\n}\n\ninterface ColorPickerTriggerProps {\n label: ReactNode;\n theme: CssTheme;\n colorName: string;\n initialThemeValue: string;\n}\nfunction ColorPickerTrigger({\n label,\n theme,\n colorName,\n initialThemeValue,\n}: ColorPickerTriggerProps) {\n const {setValue} = useFormContext<AppearanceValues>();\n const {themeIndex} = useParams();\n const [selectedThemeValue, setSelectedThemeValue] =\n useState<string>(initialThemeValue);\n\n // set color as css variable in preview and on button preview, but not in appearance values\n // this way color change can be canceled when color picker is closed and applied explicitly via apply button\n const selectThemeValue = (themeValue: string) => {\n setSelectedThemeValue(themeValue);\n appearanceState().preview.setThemeValue(colorName, themeValue);\n };\n\n useEffect(() => {\n // need to update the color here so changes via \"reset colors\" button are reflected\n setSelectedThemeValue(initialThemeValue);\n }, [initialThemeValue]);\n\n return (\n <DialogTrigger\n value={themeValueToHex(selectedThemeValue)}\n type=\"popover\"\n placement=\"right\"\n offset={10}\n onValueChange={newColor => {\n selectThemeValue(colorToThemeValue(newColor));\n }}\n onClose={(newColor, {valueChanged, initialValue}) => {\n if (newColor && valueChanged) {\n setValue(\n `appearance.themes.all.${+themeIndex!}.values.${colorName}`,\n colorToThemeValue(newColor),\n {shouldDirty: true},\n );\n setValue('appearance.themes.selectedThemeId', theme.id);\n } else {\n // reset to initial value, if apply button was not clicked\n selectThemeValue(initialValue);\n }\n }}\n >\n <AppearanceButton\n className=\"capitalize\"\n startIcon={\n <ColorIcon\n viewBox=\"0 0 48 48\"\n className=\"icon-lg\"\n style={{fill: `rgb(${selectedThemeValue})`}}\n />\n }\n >\n {label}\n </AppearanceButton>\n <ColorPickerDialog />\n </DialogTrigger>\n );\n}\n","import {useController} from 'react-hook-form';\nimport React, {useMemo} from 'react';\nimport {mergeProps} from '@react-aria/utils';\nimport {\n ChipField,\n ChipValue,\n} from '../../ui/forms/input-field/chip-field/chip-field';\nimport {FormChipFieldProps} from '../../ui/forms/input-field/chip-field/form-chip-field';\n\nexport function JsonChipField({children, ...props}: FormChipFieldProps<any>) {\n const {\n field: {onChange, onBlur, value = [], ref},\n fieldState: {invalid, error},\n } = useController({\n name: props.name,\n });\n\n const arrayValue = useMemo(() => {\n const mixedValue = value as string | string[];\n return typeof mixedValue === 'string' ? JSON.parse(mixedValue) : mixedValue;\n }, [value]);\n\n const formProps: Partial<FormChipFieldProps<ChipValue>> = {\n onChange: newValue => {\n const jsonValue = JSON.stringify(newValue.map(chip => chip.name));\n onChange(jsonValue);\n },\n onBlur,\n value: arrayValue,\n invalid,\n errorMessage: error?.message,\n };\n\n return <ChipField ref={ref} {...mergeProps(formProps, props)} />;\n}\n","import {Trans} from '@common/i18n/trans';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {SettingsPanel} from '@common/admin/settings/settings-panel';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {JsonChipField} from '@common/admin/settings/json-chip-field';\nimport {useTrans} from '@common/i18n/use-trans';\n\nexport function VideoSettings() {\n const {trans} = useTrans();\n return (\n <SettingsPanel\n title={<Trans message=\"Video and streaming\" />}\n description={\n <Trans message=\"Control how videos are played and displayed on the site.\" />\n }\n >\n <ShownVideoTypeSelect />\n <SortingMethodSelect />\n <FormSwitch\n className=\"mb-24\"\n name=\"client.streaming.prefer_full\"\n description={\n <Trans\n message={\n 'When user clicks on \"play\" buttons across the site play full movie or episode instead of trailers and clips.'\n }\n />\n }\n >\n <Trans message=\"Prefer full videos\" />\n </FormSwitch>\n <FormSwitch\n className=\"mb-24\"\n name=\"client.streaming.show_video_selector\"\n description={\n <Trans message=\"Show alternative videos on the watch page.\" />\n }\n >\n <Trans message=\"Alternative videos\" />\n </FormSwitch>\n <FormSwitch\n className=\"mb-24\"\n name=\"client.streaming.show_header_play\"\n description={\n <Trans message=\"Whether play button should be shown on main title header.\" />\n }\n >\n <Trans message=\"Header play button\" />\n </FormSwitch>\n <JsonChipField\n className=\"mb-24\"\n label={<Trans message=\"Possible video qualities\" />}\n name=\"client.streaming.qualities\"\n placeholder={trans({message: 'Add another...'})}\n />\n </SettingsPanel>\n );\n}\n\nfunction SortingMethodSelect() {\n return (\n <FormSelect\n className=\"mb-24\"\n name=\"client.streaming.default_sort\"\n label={<Trans message=\"Video sorting\" />}\n selectionMode=\"single\"\n description={\n <Trans message=\"When multiple videos are shown on the page, how should they be sorted by default.\" />\n }\n >\n <Item value=\"order:asc\">\n <Trans message=\"Manual (order assigned manually in admin area)\" />\n </Item>\n <Item value=\"created_at:desc\">\n <Trans message=\"Date added\" />\n </Item>\n <Item value=\"name:asc\">\n <Trans message=\"Name (a-z)\" />\n </Item>\n <Item value=\"Language:asc\">\n <Trans message=\"Language (a-z)\" />\n </Item>\n <Item value=\"reports:asc\">\n <Trans message=\"Reports (videos with less reports first)\" />\n </Item>\n <Item value=\"score:desc\">\n <Trans message=\"Score (most liked videos first)\" />\n </Item>\n </FormSelect>\n );\n}\n\nfunction ShownVideoTypeSelect() {\n return (\n <FormSelect\n className=\"mb-24\"\n name=\"client.streaming.video_panel_content\"\n label={<Trans message=\"Shown videos\" />}\n selectionMode=\"single\"\n description={\n <Trans message=\"What type of videos should be shown in title and episode pages (if there is more then one video attached).\" />\n }\n >\n <Item value=\"all\">\n <Trans message=\"All videos\" />\n </Item>\n <Item value=\"full\">\n <Trans message=\"Full movies and episodes\" />\n </Item>\n <Item value=\"short\">\n <Trans message=\"Short videos (everything except full movies & episodes)\" />\n </Item>\n <Item value=\"trailer\">\n <Trans message=\"Trailers\" />\n </Item>\n <Item value=\"clip\">\n <Trans message=\"Clips\" />\n </Item>\n </FormSelect>\n );\n}\n","import React, {\n Children,\n cloneElement,\n ComponentPropsWithoutRef,\n isValidElement,\n ReactElement,\n ReactNode,\n useContext,\n useRef,\n useState,\n} from 'react';\nimport clsx from 'clsx';\nimport {useLayoutEffect} from '@react-aria/utils';\nimport {getFocusableTreeWalker} from '@react-aria/focus';\nimport {TabContext} from './tabs-context';\n\nexport interface TabPanelsProps {\n children: ReactNode;\n className?: string;\n}\nexport function TabPanels({children, className}: TabPanelsProps) {\n const {selectedTab, isLazy} = useContext(TabContext);\n\n // filter out falsy values, in case of conditional rendering\n const panelArray = Children.toArray(children).filter(p => !!p);\n\n let rendered: ReactNode;\n if (isLazy) {\n const el = panelArray[selectedTab] as ReactElement;\n rendered = isValidElement(el)\n ? cloneElement<TabPanelProps>(panelArray[selectedTab] as ReactElement, {\n index: selectedTab,\n })\n : null;\n } else {\n rendered = panelArray.map((panel, index) => {\n if (isValidElement<TabPanelsProps>(panel)) {\n const isSelected = index === selectedTab;\n return cloneElement<TabPanelProps>(panel, {\n index,\n 'aria-hidden': !isSelected,\n className: !isSelected\n ? clsx(panel.props.className, 'hidden')\n : panel.props.className,\n });\n }\n return null;\n });\n }\n\n return <div className={className}>{rendered}</div>;\n}\n\ninterface TabPanelProps extends ComponentPropsWithoutRef<'div'> {\n className?: string;\n children: ReactNode;\n index?: number;\n}\nexport function TabPanel({\n className,\n children,\n index,\n ...domProps\n}: TabPanelProps) {\n const {id} = useContext(TabContext);\n\n const [tabIndex, setTabIndex] = useState<number | undefined>(0);\n const ref = useRef<HTMLDivElement>(null);\n\n // The tabpanel should have tabIndex=0 when there are no tabbable elements within it.\n // Otherwise, tabbing from the focused tab should go directly to the first tabbable element\n // within the tabpanel.\n useLayoutEffect(() => {\n if (ref?.current) {\n const update = () => {\n // Detect if there are any tabbable elements and update the tabIndex accordingly.\n const walker = getFocusableTreeWalker(ref.current!, {tabbable: true});\n setTabIndex(walker.nextNode() ? undefined : 0);\n };\n\n update();\n\n // Update when new elements are inserted, or the tabIndex/disabled attribute updates.\n const observer = new MutationObserver(update);\n observer.observe(ref.current, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeFilter: ['tabIndex', 'disabled'],\n });\n\n return () => {\n observer.disconnect();\n };\n }\n }, [ref]);\n\n return (\n <div\n tabIndex={tabIndex}\n ref={ref}\n id={`${id}-${index}-tabpanel`}\n aria-labelledby={`${id}-${index}-tab`}\n className={clsx(className, 'focus-visible:outline-primary-light')}\n role=\"tabpanel\"\n {...domProps}\n >\n {children}\n </div>\n );\n}\n","import {useFormContext} from 'react-hook-form';\nimport {AdminSettings} from '@common/admin/settings/admin-settings';\nimport {Fragment} from 'react';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {Trans} from '@common/i18n/trans';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\n\nexport function ContentSettingsGeneralPanel() {\n const {watch} = useFormContext<AdminSettings>();\n return (\n <Fragment>\n <SortingMethodSelect />\n <FormSwitch\n className=\"mb-24\"\n name=\"client.titles.enable_reviews\"\n description={\n <Trans\n message={\n 'Enable or disable all review functionality across the site.'\n }\n />\n }\n >\n <Trans message=\"Enable reviews\" />\n </FormSwitch>\n <FormSwitch\n className=\"mb-24\"\n name=\"client.titles.enable_comments\"\n description={\n <Trans\n message={\n 'Enable or disable all comment functionality across the site.'\n }\n />\n }\n >\n <Trans message=\"Enable comments\" />\n </FormSwitch>\n {watch('client.titles.enable_comments') && (\n <FormSwitch\n name=\"client.comments.per_video\"\n description={\n <Trans\n message={\n 'When enabled, individual videos will have their own separate comment section (if there are multiple videos), otherwise comments will be shared by all videos for the same title.'\n }\n />\n }\n >\n <Trans message=\"Per video comments\" />\n </FormSwitch>\n )}\n </Fragment>\n );\n}\n\nfunction SortingMethodSelect() {\n return (\n <FormSelect\n className=\"mb-24\"\n name=\"server.rating_column\"\n label={<Trans message=\"Rating used for sorting\" />}\n selectionMode=\"single\"\n description={\n <Trans\n message=\"When ordering titles by rating, should local user rating or TheMovieDB rating average be\n used.\"\n />\n }\n >\n <Item value=\"tmdb_vote_average\">\n <Trans message=\"TheMovieDB\" />\n </Item>\n <Item value=\"local_vote_average\">\n <Trans message=\"Local (Ratings and reviews from site users)\" />\n </Item>\n </FormSelect>\n );\n}\n","import {ReactNode, useEffect, useRef} from 'react';\nimport {useFormContext} from 'react-hook-form';\nimport clsx from 'clsx';\n\ninterface Props {\n children: (isInvalid: boolean) => ReactNode;\n name: string;\n separatorBottom?: boolean;\n separatorTop?: boolean;\n}\nexport function SettingsErrorGroup({\n children,\n name,\n separatorBottom = true,\n separatorTop = true,\n}: Props) {\n const {\n formState: {errors},\n } = useFormContext<Record<string, string>>();\n\n const ref = useRef<HTMLDivElement>(null);\n const error = errors[name];\n\n useEffect(() => {\n if (error) {\n ref.current?.scrollIntoView({behavior: 'smooth'});\n }\n }, [error]);\n\n return (\n <div\n className={clsx(\n separatorBottom && 'border-b mb-20 pb-20',\n separatorTop && 'border-t mt-20 pt-20',\n error && 'border-y-error'\n )}\n ref={ref}\n >\n {children(!!error)}\n {error && (\n <div\n className=\"text-danger text-sm mt-20\"\n dangerouslySetInnerHTML={{__html: error.message!}}\n />\n )}\n </div>\n );\n}\n","import {Fragment} from 'react';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {Trans} from '@common/i18n/trans';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {SettingsSeparator} from '@common/admin/settings/settings-separator';\nimport {useFormContext} from 'react-hook-form';\nimport {AdminSettings} from '@common/admin/settings/admin-settings';\nimport {SettingsErrorGroup} from '@common/admin/settings/settings-error-group';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {useValueLists} from '@common/http/value-lists';\n\nexport function ContentSettingsAutomationPanel() {\n const {watch} = useFormContext<AdminSettings>();\n return (\n <Fragment>\n <SearchMethodSelect />\n <FormSwitch\n className=\"mb-24\"\n name=\"client.content.title_provider\"\n value=\"tmdb\"\n description={\n <Trans message=\"This will automatically import, and periodically update, all metadata available on TheMovieDB about the title when user visits that title's page.\" />\n }\n >\n <Trans message=\"Title automation\" />\n </FormSwitch>\n <FormSwitch\n className=\"mb-24\"\n name=\"client.content.force_season_update\"\n value=\"tmdb\"\n description={\n <Trans message=\"When this is enabled, season episodes will be automatically updated, even if title automation is disabled.\" />\n }\n >\n <Trans message=\"Always update seasons\" />\n </FormSwitch>\n <SettingsSeparator />\n <FormSwitch\n className=\"mb-24\"\n name=\"client.content.people_provider\"\n value=\"tmdb\"\n description={\n <Trans message=\"This will automatically import, and periodically update, all metadata available on TheMovieDB about a person, when user visits that person's page.\" />\n }\n >\n <Trans message=\"People automation\" />\n </FormSwitch>\n {watch('client.content.people_provider') === 'tmdb' && (\n <FormSwitch\n className=\"mb-24\"\n name=\"client.content.automate_filmography\"\n description={\n <Trans message=\"Whether full filmograpy for a person should be imported from TheMovieDB when auto updating the person metadata.\" />\n }\n >\n <Trans message=\"Full filmography\" />\n </FormSwitch>\n )}\n <TmdbFields />\n </Fragment>\n );\n}\n\nfunction SearchMethodSelect() {\n return (\n <FormSelect\n className=\"mb-24\"\n name=\"client.content.search_provider\"\n selectionMode=\"single\"\n label={<Trans message=\"Search method\" />}\n description={\n <Trans message=\"Which method should be used for user facing search on the site.\" />\n }\n >\n <Item\n value=\"tmdb\"\n description={\n <Trans message=\"Search on the site will directly connect to, and search TheMovieDB. Any movie, series and artist available on TheMovieDB will be discoverable via search, without needing to import or create it first.\" />\n }\n >\n <Trans message=\"TheMovieDB\" />\n </Item>\n <Item\n value=\"local\"\n description={\n <Trans message=\"Will only search content that was created or imported from admin area. This can be further configured from 'Local search' settings page.\" />\n }\n >\n <Trans message=\"Local\" />\n </Item>\n <Item\n value=\"all\"\n description={\n <Trans message=\"Will combine search results from both 'Local' and 'TheMovieDB' methods. If there are identical matches, local results will be preferred.\" />\n }\n >\n <Trans message=\"Local and TheMovieDB\" />\n </Item>\n </FormSelect>\n );\n}\n\nfunction TmdbFields() {\n const {data} = useValueLists(['tmdbLanguages']);\n const {watch: w} = useFormContext<AdminSettings>();\n const shouldShow = [\n w('client.content.people_provider'),\n w('client.content.title_provider'),\n w('client.content.search_provider'),\n ].some(provider => `${provider}`.toLowerCase().includes('tmdb'));\n\n if (!shouldShow) {\n return null;\n }\n\n return (\n <SettingsErrorGroup name=\"tmdb_group\" separatorBottom={false}>\n {isInvalid => (\n <Fragment>\n <FormTextField\n invalid={isInvalid}\n name=\"server.tmdb_api_key\"\n label={<Trans message=\"TheMovieDB API Key\" />}\n className=\"mb-24\"\n required\n />\n <FormSelect\n className=\"mb-24\"\n selectionMode=\"single\"\n showSearchField\n invalid={isInvalid}\n name=\"client.tmdb.language\"\n label={<Trans message=\"TheMovieDB language\" />}\n description={\n <Trans message=\"In what language should content be fetched from TMDb. If translation is not available, data will be in original language for that movie or series.\" />\n }\n >\n {data?.tmdbLanguages.map(({code, name}) => (\n <Item value={code} key={code}>\n {name}\n </Item>\n ))}\n </FormSelect>\n <FormSwitch name=\"client.tmdb.includeAdult\">\n <Trans message=\"Import adult content\" />\n </FormSwitch>\n </Fragment>\n )}\n </SettingsErrorGroup>\n );\n}\n","import {Trans} from '@common/i18n/trans';\nimport React, {Fragment, ReactNode, useRef, useState} from 'react';\nimport {DragPreviewRenderer} from '@common/ui/interactions/dnd/use-draggable';\nimport {useFormContext} from 'react-hook-form';\nimport {AdminSettingsWithFiles} from '@common/admin/settings/requests/update-admin-settings';\nimport {moveItemInNewArray} from '@common/utils/array/move-item-in-new-array';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {DragHandleIcon} from '@common/icons/material/DragHandle';\nimport {Checkbox} from '@common/ui/forms/toggle/checkbox';\nimport {DragPreview} from '@common/ui/interactions/dnd/drag-preview';\nimport clsx from 'clsx';\nimport {TitlePageSections} from '@app/titles/pages/title-page/sections/title-page-sections';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {AdminSettings} from '@common/admin/settings/admin-settings';\nimport {useSortable} from '@common/ui/interactions/dnd/sortable/use-sortable';\n\ninterface SectionItem {\n name: (typeof TitlePageSections)[number];\n title: MessageDescriptor;\n}\n\nconst defaultItems: SectionItem[] = [\n {name: 'episodes', title: {message: 'Episode grid'}},\n {name: 'seasons', title: {message: 'Season grid'}},\n {name: 'videos', title: {message: 'Video grid'}},\n {name: 'images', title: {message: 'Image grid'}},\n {name: 'reviews', title: {message: 'Reviews'}},\n {name: 'cast', title: {message: 'Cast grid'}},\n {name: 'related', title: {message: 'Related titles'}},\n];\n\nexport function ContentSettingsTitlePagePanel() {\n const {getValues, setValue} = useFormContext<AdminSettings>();\n const getSavedValue = (): string[] => {\n return getValues('client.title_page.sections') || [];\n };\n\n const [items, setItems] = useState(() => {\n const savedValue = getSavedValue();\n const sortFn = (x: string) =>\n savedValue.includes(x) ? savedValue.indexOf(x) : savedValue.length;\n return [...defaultItems].sort((a, b) => sortFn(a.name) - sortFn(b.name));\n });\n\n return (\n <div>\n <div className=\"mb-14 text-sm\">\n <Trans message=\"Title page sections\" />\n <div className=\"text-xs text-muted\">\n <Trans message=\"Select which sections should appear on title page and in which order.\" />\n </div>\n </div>\n {items.map((section, index) => (\n <ListItemLayout\n items={items}\n isFirst={index === 0}\n key={section.name}\n section={section}\n title={<Trans {...section.title} />}\n onToggle={(section, checked) => {\n const savedValue = getSavedValue();\n const newValue = checked\n ? [...savedValue, section.name]\n : savedValue.filter(x => x !== section.name);\n setValue('client.title_page.sections', newValue as any);\n }}\n onSortEnd={(oldIndex, newIndex) => {\n const sortedItems = moveItemInNewArray(items, oldIndex, newIndex);\n setItems(sortedItems);\n const savedValue = getSavedValue();\n const newValue = sortedItems\n .filter(x => savedValue.includes(x.name))\n .map(x => x.name);\n setValue('client.title_page.sections', newValue);\n }}\n />\n ))}\n </div>\n );\n}\n\ninterface ListItemLayoutProps {\n isFirst: boolean;\n items: SectionItem[];\n section: SectionItem;\n title: ReactNode;\n onSortEnd: (oldIndex: number, newIndex: number) => void;\n onToggle: (section: SectionItem, checked: boolean) => void;\n}\nfunction ListItemLayout({\n isFirst,\n title,\n items,\n section,\n onSortEnd,\n onToggle,\n}: ListItemLayoutProps) {\n const ref = useRef<HTMLDivElement>(null);\n const previewRef = useRef<DragPreviewRenderer>(null);\n const {watch} = useFormContext<AdminSettingsWithFiles>();\n\n const savedValue = watch('client.title_page.sections') || [];\n const isChecked = savedValue.includes(section.name);\n\n const {sortableProps, dragHandleRef} = useSortable({\n ref,\n item: section,\n items,\n type: 'titlePageSections',\n preview: previewRef,\n strategy: 'line',\n onSortEnd,\n });\n\n return (\n <Fragment>\n <div\n className={clsx(\n 'flex w-full items-center gap-8 border-b py-6',\n isFirst && 'border-t border-t-transparent',\n )}\n ref={ref}\n {...sortableProps}\n >\n <IconButton ref={dragHandleRef}>\n <DragHandleIcon />\n </IconButton>\n <div className=\"flex-auto\">\n <div className=\"text-sm\">{title}</div>\n </div>\n <Checkbox\n checked={isChecked}\n onChange={() => {\n onToggle(section, !isChecked);\n }}\n />\n </div>\n <TabDragPreview title={title} ref={previewRef} />\n </Fragment>\n );\n}\n\ninterface DragPreviewProps {\n title: ReactNode;\n}\nconst TabDragPreview = React.forwardRef<DragPreviewRenderer, DragPreviewProps>(\n ({title}, ref) => {\n return (\n <DragPreview ref={ref}>\n {() => (\n <div className=\"rounded bg-chip p-8 text-sm shadow\">{title}</div>\n )}\n </DragPreview>\n );\n },\n);\n","import {Trans} from '@common/i18n/trans';\nimport {SettingsPanel} from '@common/admin/settings/settings-panel';\nimport {Tabs} from '@common/ui/tabs/tabs';\nimport {TabList} from '@common/ui/tabs/tab-list';\nimport {Tab} from '@common/ui/tabs/tab';\nimport {TabPanel, TabPanels} from '@common/ui/tabs/tab-panels';\nimport {ContentSettingsGeneralPanel} from '@app/admin/settings/content-settings/content-settings-general-panel';\nimport {ContentSettingsAutomationPanel} from '@app/admin/settings/content-settings/content-settings-automation-panel';\nimport {ContentSettingsTitlePagePanel} from '@app/admin/settings/content-settings/content-settings-title-page-panel';\n\nexport function ContentSettings() {\n return (\n <SettingsPanel\n title={<Trans message=\"Content\" />}\n description={\n <Trans message=\"Control how content is displayed across the site.\" />\n }\n >\n <Tabs>\n <TabList>\n <Tab width=\"min-w-132\">\n <Trans message=\"General\" />\n </Tab>\n <Tab width=\"min-w-132\">\n <Trans message=\"Automation\" />\n </Tab>\n <Tab width=\"min-w-132\">\n <Trans message=\"Title page\" />\n </Tab>\n </TabList>\n <TabPanels className=\"pt-24\">\n <TabPanel>\n <ContentSettingsGeneralPanel />\n </TabPanel>\n <TabPanel>\n <ContentSettingsAutomationPanel />\n </TabPanel>\n <TabPanel>\n <ContentSettingsTitlePagePanel />\n </TabPanel>\n </TabPanels>\n </Tabs>\n </SettingsPanel>\n );\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient} from '@common/http/query-client';\nimport {useQuery} from '@tanstack/react-query';\n\ninterface Response extends BackendResponse {\n models: {model: string; name: string}[];\n}\n\nexport function useSearchModels() {\n return useQuery({\n queryKey: ['search-models'],\n queryFn: () => fetchModels(),\n });\n}\n\nfunction fetchModels(): Promise<Response> {\n return apiClient.get('admin/search/models').then(response => response.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {toast} from '@common/ui/toast/toast';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Payload {\n model: string;\n driver: string;\n}\n\nexport function useImportSearchModels() {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (payload: Payload) => importModels(payload),\n onSuccess: () => {\n toast(trans(message('Imported search models')));\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction importModels(payload: Payload): Promise<Response> {\n return apiClient.post('admin/search/import', payload).then(r => r.data);\n}\n","import {FormSelect, Select} from '@common/ui/forms/select/select';\nimport {SettingsPanel} from '../../settings-panel';\nimport {Trans} from '@common/i18n/trans';\nimport {useFormContext} from 'react-hook-form';\nimport {AdminSettingsWithFiles} from '@common/admin/settings/requests/update-admin-settings';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {SectionHelper} from '@common/ui/section-helper';\nimport {SettingsErrorGroup} from '@common/admin/settings/settings-error-group';\nimport {Fragment, useState} from 'react';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {useSearchModels} from '@common/admin/settings/pages/search-settings/requests/use-search-models';\nimport {Button} from '@common/ui/buttons/button';\nimport {useImportSearchModels} from '@common/admin/settings/pages/search-settings/requests/use-import-search-models';\n\nexport function SearchSettings() {\n return (\n <SettingsPanel\n title={<Trans message=\"Search\" />}\n description={\n <Trans message=\"Configure search method used on the site as well as related 3rd party integrations.\" />\n }\n >\n <SearchMethodSelect />\n <ImportRecordsPanel />\n </SettingsPanel>\n );\n}\n\nfunction SearchMethodSelect() {\n const {watch} = useFormContext<AdminSettingsWithFiles>();\n const selectedMethod = watch('server.scout_driver');\n\n return (\n <SettingsErrorGroup name=\"search_group\" separatorBottom={false}>\n {isInvalid => (\n <Fragment>\n <FormSelect\n invalid={isInvalid}\n name=\"server.scout_driver\"\n selectionMode=\"single\"\n label={<Trans message=\"Search method\" />}\n description={\n <Trans message=\"Which method should be used for search related functionality across the site.\" />\n }\n >\n <Item value=\"mysql\">Mysql</Item>\n <Item value=\"meilisearch\">Meilisearch</Item>\n <Item value=\"tntsearch\">TNTSearch</Item>\n <Item value=\"Matchish\\ScoutElasticSearch\\Engines\\ElasticSearchEngine\">\n Elasticsearch\n </Item>\n <Item value=\"algolia\">Algolia</Item>\n </FormSelect>\n {selectedMethod === 'mysql' && <MysqlFields />}\n {selectedMethod === 'meilisearch' && <MeilisearchFields />}\n {selectedMethod === 'algolia' && <AlgoliaFields />}\n {selectedMethod ===\n 'Matchish\\\\ScoutElasticSearch\\\\Engines\\\\ElasticSearchEngine' && (\n <ElasticsearchField />\n )}\n </Fragment>\n )}\n </SettingsErrorGroup>\n );\n}\n\nfunction MysqlFields() {\n const {clearErrors} = useFormContext<AdminSettingsWithFiles>();\n return (\n <FormSelect\n className=\"mt-24\"\n name=\"server.scout_mysql_mode\"\n selectionMode=\"single\"\n label={<Trans message=\"MySQL mode\" />}\n onSelectionChange={() => {\n clearErrors();\n }}\n >\n <Item value=\"basic\">\n <Trans message=\"Basic\" />\n </Item>\n <Item value=\"extended\">\n <Trans message=\"Extended\" />\n </Item>\n <Item value=\"fulltext\">\n <Trans message=\"Fulltext\" />\n </Item>\n </FormSelect>\n );\n}\n\nfunction MeilisearchFields() {\n return (\n <SectionHelper\n className=\"mt-24\"\n color=\"warning\"\n title={<Trans message=\"Important!\" />}\n description={\n <Trans\n message=\"<a>Meilisearch</a> needs to be installed and running for this method to work.\"\n values={{\n a: parts => (\n <a\n href=\"https://www.meilisearch.com\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {parts}\n </a>\n ),\n }}\n />\n }\n />\n );\n}\n\nfunction ElasticsearchField() {\n return (\n <SectionHelper\n className=\"mt-24\"\n color=\"warning\"\n title={<Trans message=\"Important!\" />}\n description={\n <Trans\n message=\"<a>Elasticsearch</a> needs to be installed and running for this method to work.\"\n values={{\n a: parts => (\n <a href=\"https://www.elastic.co\" target=\"_blank\" rel=\"noreferrer\">\n {parts}\n </a>\n ),\n }}\n />\n }\n />\n );\n}\n\nfunction AlgoliaFields() {\n return (\n <Fragment>\n <FormTextField\n className=\"mt-24\"\n name=\"server.algolia_app_id\"\n label={<Trans message=\"Algolia app ID\" />}\n required\n />\n <FormTextField\n className=\"mt-24\"\n name=\"server.algolia_secret\"\n label={<Trans message=\"Algolia app secret\" />}\n required\n />\n </Fragment>\n );\n}\n\nfunction ImportRecordsPanel() {\n const {getValues} = useFormContext<AdminSettingsWithFiles>();\n const {data} = useSearchModels();\n const importModels = useImportSearchModels();\n const [selectedModel, setSelectedModel] = useState('*');\n return (\n <SectionHelper\n className=\"mt-34\"\n color=\"neutral\"\n title={<Trans message=\"Import records\" />}\n description={\n <span>\n <Trans message=\"Whenever a new search method is enabled, records that already exist in database need to be imported into the index. All records created after search method is enabled will be imported automatically.\" />\n <br />\n <br />\n <Trans message=\"Depending on number of records in database, importing could take some time. Don't close this window while it is in progress.\" />\n </span>\n }\n actions={\n <div className=\"mt-10 border-t pt-14\">\n <Select\n selectionMode=\"single\"\n label={<Trans message=\"What to import?\" />}\n selectedValue={selectedModel}\n onSelectionChange={newValue => {\n setSelectedModel(newValue as string);\n }}\n >\n <Item value=\"*\">\n <Trans message=\"Everything\" />\n </Item>\n {data?.models.map(item => (\n <Item value={item.model} key={item.model}>\n <Trans message={item.name} />\n </Item>\n ))}\n </Select>\n <Button\n variant=\"flat\"\n color=\"primary\"\n className=\"mb-8 mt-24\"\n disabled={importModels.isPending}\n onClick={() => {\n importModels.mutate({\n model: selectedModel,\n driver: getValues('server.scout_driver')!,\n });\n }}\n >\n <Trans message=\"Import now\" />\n </Button>\n </div>\n }\n />\n );\n}\n","import {RouteObject} from 'react-router-dom';\nimport {VideoSettings} from '@app/admin/settings/video-settings';\nimport {ContentSettings} from '@app/admin/settings/content-settings/content-settings';\nimport {SearchSettings} from '@common/admin/settings/pages/search-settings/search-settings';\n\nexport const AppSettingsRoutes: RouteObject[] = [\n {\n path: 'search',\n element: <SearchSettings />,\n },\n {\n path: 'videos',\n element: <VideoSettings />,\n },\n {\n path: 'content',\n element: <ContentSettings />,\n },\n];\n","import {useFormContext} from 'react-hook-form';\nimport {SettingsPanel} from '../settings-panel';\nimport {FormSwitch} from '../../../ui/forms/toggle/switch';\nimport {SettingsSeparator} from '../settings-separator';\nimport {LearnMoreLink} from '../learn-more-link';\nimport {AdminSettings} from '../admin-settings';\nimport {FormTextField} from '../../../ui/forms/input-field/text-field/text-field';\nimport {SettingsErrorGroup} from '../settings-error-group';\nimport {JsonChipField} from '../json-chip-field';\nimport {Tabs} from '../../../ui/tabs/tabs';\nimport {TabList} from '../../../ui/tabs/tab-list';\nimport {Tab} from '../../../ui/tabs/tab';\nimport {TabPanel, TabPanels} from '../../../ui/tabs/tab-panels';\nimport {Trans} from '../../../i18n/trans';\nimport {useTrans} from '../../../i18n/use-trans';\nimport {Fragment} from 'react';\n\nexport function SubscriptionSettings() {\n const {trans} = useTrans();\n return (\n <SettingsPanel\n title={<Trans message=\"Subscriptions\" />}\n description={\n <Trans message=\"Configure gateway integration, accepted cards, invoices and other related settings.\" />\n }\n >\n <Tabs>\n <TabList>\n <Tab>\n <Trans message=\"General\" />\n </Tab>\n <Tab>\n <Trans message=\"Invoices\" />\n </Tab>\n </TabList>\n <TabPanels className=\"pt-30\">\n <TabPanel>\n <FormSwitch\n name=\"client.billing.enable\"\n description={\n <Trans message=\"Enable or disable all subscription related functionality across the site.\" />\n }\n >\n <Trans message=\"Enable subscriptions\" />\n </FormSwitch>\n <SettingsSeparator />\n <PaypalSection />\n <StripeSection />\n <SettingsSeparator />\n <JsonChipField\n label={<Trans message=\"Accepted cards\" />}\n name=\"client.billing.accepted_cards\"\n placeholder={trans({message: 'Add new card...'})}\n />\n </TabPanel>\n <TabPanel>\n <FormTextField\n inputElementType=\"textarea\"\n rows={5}\n label={<Trans message=\"Invoice address\" />}\n name=\"client.billing.invoice.address\"\n className=\"mb-30\"\n />\n <FormTextField\n inputElementType=\"textarea\"\n rows={5}\n label={<Trans message=\"Invoice notes\" />}\n description={\n <Trans message=\"Default notes to show under `notes` section of user invoice. Optional.\" />\n }\n name=\"client.billing.invoice.notes\"\n />\n </TabPanel>\n </TabPanels>\n </Tabs>\n </SettingsPanel>\n );\n}\n\nfunction PaypalSection() {\n const {watch} = useFormContext<AdminSettings>();\n const paypalIsEnabled = watch('client.billing.paypal.enable');\n return (\n <div className=\"mb-30\">\n <FormSwitch\n name=\"client.billing.paypal.enable\"\n description={\n <div>\n <Trans message=\"Enable PayPal payment gateway integration.\" />\n <LearnMoreLink\n className=\"mt-6\"\n link=\"https://support.vebto.com/hc/articles/147/configuring-paypal\"\n />\n </div>\n }\n >\n <Trans message=\"PayPal gateway\" />\n </FormSwitch>\n {paypalIsEnabled ? (\n <SettingsErrorGroup name=\"paypal_group\">\n {isInvalid => (\n <Fragment>\n <FormTextField\n name=\"server.paypal_client_id\"\n label={<Trans message=\"PayPal Client ID\" />}\n required\n invalid={isInvalid}\n className=\"mb-20\"\n />\n <FormTextField\n name=\"server.paypal_secret\"\n label={<Trans message=\"PayPal Secret\" />}\n required\n invalid={isInvalid}\n className=\"mb-20\"\n />\n <FormTextField\n name=\"server.paypal_webhook_id\"\n label={<Trans message=\"PayPal Webhook ID\" />}\n required\n invalid={isInvalid}\n className=\"mb-20\"\n />\n <FormSwitch\n name=\"client.billing.paypal_test_mode\"\n invalid={isInvalid}\n description={\n <div>\n <Trans message=\"Allows testing PayPal payments with sandbox accounts.\" />\n </div>\n }\n >\n <Trans message=\"PayPal test mode\" />\n </FormSwitch>\n </Fragment>\n )}\n </SettingsErrorGroup>\n ) : null}\n </div>\n );\n}\n\nfunction StripeSection() {\n const {watch} = useFormContext<AdminSettings>();\n const stripeEnabled = watch('client.billing.stripe.enable');\n return (\n <Fragment>\n <FormSwitch\n name=\"client.billing.stripe.enable\"\n description={\n <div>\n <Trans message=\"Enable Stripe payment gateway integration.\" />\n <LearnMoreLink\n className=\"mt-6\"\n link=\"https://support.vebto.com/hc/articles/148/configuring-stripe\"\n />\n </div>\n }\n >\n <Trans message=\"Stripe gateway\" />\n </FormSwitch>\n {stripeEnabled ? (\n <SettingsErrorGroup name=\"stripe_group\" separatorBottom={false}>\n {isInvalid => (\n <Fragment>\n <FormTextField\n name=\"server.stripe_key\"\n label={<Trans message=\"Stripe publishable key\" />}\n required\n className=\"mb-20\"\n invalid={isInvalid}\n />\n <FormTextField\n name=\"server.stripe_secret\"\n label={<Trans message=\"Stripe secret key\" />}\n required\n className=\"mb-20\"\n invalid={isInvalid}\n />\n <FormTextField\n name=\"server.stripe_webhook_secret\"\n label={<Trans message=\"Stripe webhook signing secret\" />}\n className=\"mb-20\"\n invalid={isInvalid}\n />\n </Fragment>\n )}\n </SettingsErrorGroup>\n ) : null}\n </Fragment>\n );\n}\n","import {FormSelect, Option} from '../../../ui/forms/select/select';\nimport {SettingsPanel} from '../settings-panel';\nimport {useValueLists} from '../../../http/value-lists';\nimport {Section} from '../../../ui/forms/listbox/section';\nimport {FormRadio} from '../../../ui/forms/radio-group/radio';\nimport {FormRadioGroup} from '../../../ui/forms/radio-group/radio-group';\nimport {DateFormatPresets, FormattedDate} from '../../../i18n/formatted-date';\nimport {FormSwitch} from '../../../ui/forms/toggle/switch';\nimport {Trans} from '../../../i18n/trans';\nimport {useCurrentDateTime} from '../../../i18n/use-current-date-time';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\n\nexport function LocalizationSettings() {\n const {data} = useValueLists(['timezones', 'localizations']);\n const today = useCurrentDateTime();\n const {trans} = useTrans();\n return (\n <SettingsPanel\n title={<Trans message=\"Localization\" />}\n description={\n <Trans message=\"Configure global date, time and language settings.\" />\n }\n >\n <FormSelect\n className=\"mb-30\"\n required\n name=\"client.dates.default_timezone\"\n showSearchField\n selectionMode=\"single\"\n label={<Trans message=\"Default timezone\" />}\n searchPlaceholder={trans(message('Search timezones'))}\n description={\n <Trans message=\"Which timezone should be selected by default for new users and guests.\" />\n }\n >\n <Option key=\"auto\" value=\"auto\">\n <Trans message=\"Auto\" />\n </Option>\n {Object.entries(data?.timezones || {}).map(([groupName, timezones]) => (\n <Section key={groupName} label={groupName}>\n {timezones.map(timezone => (\n <Option key={timezone.value} value={timezone.value}>\n {timezone.text}\n </Option>\n ))}\n </Section>\n ))}\n </FormSelect>\n <FormSelect\n name=\"client.locale.default\"\n className=\"mb-30\"\n selectionMode=\"single\"\n label={<Trans message=\"Default language\" />}\n description={\n <Trans message=\"Which localization should be selected by default for new users and guests.\" />\n }\n >\n <Option key=\"auto\" value=\"auto\">\n <Trans message=\"Auto\" />\n </Option>\n {(data?.localizations || []).map(locale => (\n <Option key={locale.language} value={locale.language} capitalizeFirst>\n {locale.name}\n </Option>\n ))}\n </FormSelect>\n <FormRadioGroup\n required\n className=\"mb-30\"\n size=\"sm\"\n name=\"client.dates.format\"\n orientation=\"vertical\"\n label={<Trans message=\"Date verbosity\" />}\n description={\n <Trans message=\"Default verbosity for all dates displayed across the site. Month/day order and separators will be adjusted automatically, based on user's locale.\" />\n }\n >\n <FormRadio key=\"auto\" value=\"auto\">\n <Trans message=\"Auto\" />\n </FormRadio>\n {Object.entries(DateFormatPresets).map(([format, options]) => (\n <FormRadio key={format} value={format}>\n <FormattedDate date={today} options={options} />\n </FormRadio>\n ))}\n </FormRadioGroup>\n <FormSwitch\n name=\"client.i18n.enable\"\n description={\n <Trans message=\"If disabled, site will always be shown in default language and user will not be able to change their locale.\" />\n }\n >\n <Trans message=\"Enable translations\" />\n </FormSwitch>\n </SettingsPanel>\n );\n}\n","import {useFormContext} from 'react-hook-form';\nimport {SettingsPanel} from '@common/admin/settings/settings-panel';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {AdminSettings} from '@common/admin/settings/admin-settings';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {SettingsErrorGroup} from '@common/admin/settings/settings-error-group';\nimport {Trans} from '@common/i18n/trans';\nimport {Fragment} from 'react';\nimport {Link} from 'react-router-dom';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {SettingsSeparator} from '@common/admin/settings/settings-separator';\nimport {Button} from '@common/ui/buttons/button';\n\nexport function AuthenticationSettings() {\n return (\n <SettingsPanel\n title={<Trans message=\"Authentication\" />}\n description={\n <Trans message=\"Configure registration, social login and related 3rd party integrations.\" />\n }\n >\n <EmailConfirmationSection />\n <FormSwitch\n className=\"mb-24\"\n name=\"client.registration.disable\"\n description={\n <Trans message=\"All registration related functionality (including social login) will be disabled.\" />\n }\n >\n <Trans message=\"Disable registration\" />\n </FormSwitch>\n <FormSwitch\n className=\"mb-24\"\n name=\"client.single_device_login\"\n description={\n <Trans message=\"Only allow one device to be logged into user account at the same time.\" />\n }\n >\n <Trans message=\"Single device login\" />\n </FormSwitch>\n <FormSwitch\n name=\"client.social.compact_buttons\"\n description={\n <Trans message=\"Use compact design for social login buttons.\" />\n }\n >\n <Trans message=\"Compact buttons\" />\n </FormSwitch>\n <EnvatoSection />\n <GoogleSection />\n <FacebookSection />\n <TwitterSection />\n <SettingsSeparator />\n <FormTextField\n inputElementType=\"textarea\"\n rows={3}\n className=\"mt-24\"\n name=\"client.auth.domain_blacklist\"\n label={<Trans message=\"Domain blacklist\" />}\n description={\n <Trans message=\"Comma separated list of domains. Users will not be able to register or login using any email adress from specified domains.\" />\n }\n />\n </SettingsPanel>\n );\n}\n\nexport function MailNotSetupWarning() {\n const {watch} = useFormContext<AdminSettings>();\n const mailSetup = watch('server.mail_setup');\n if (mailSetup) return null;\n\n return (\n <p className=\"mt-10 rounded-panel border p-10 text-sm text-danger\">\n <Trans\n message=\"Outgoing mail method needs to be setup before enabling this setting. <a>Fix now</a>\"\n values={{\n a: text => (\n <Button\n elementType={Link}\n variant=\"outline\"\n size=\"xs\"\n display=\"flex\"\n className=\"mt-10 max-w-max\"\n to=\"/admin/settings/outgoing-email\"\n >\n {text}\n </Button>\n ),\n }}\n />\n </p>\n );\n}\n\nfunction EmailConfirmationSection() {\n return (\n <FormSwitch\n className=\"mb-30\"\n name=\"client.require_email_confirmation\"\n description={\n <Fragment>\n <Trans message=\"Require newly registered users to validate their email address before being able to login.\" />\n <MailNotSetupWarning />\n </Fragment>\n }\n >\n <Trans message=\"Require email confirmation\" />\n </FormSwitch>\n );\n}\n\nfunction EnvatoSection() {\n const {watch} = useFormContext<AdminSettings>();\n const settings = useSettings();\n const envatoLoginEnabled = watch('client.social.envato.enable');\n\n if (!(settings as any).envato?.enable) return null;\n\n return (\n <SettingsErrorGroup separatorBottom={false} name=\"envato_group\">\n {isInvalid => (\n <>\n <FormSwitch\n invalid={isInvalid}\n name=\"client.social.envato.enable\"\n description={\n <Trans message=\"Enable logging into the site via envato.\" />\n }\n >\n <Trans message=\"Envato login\" />\n </FormSwitch>\n {!!envatoLoginEnabled && (\n <>\n <FormTextField\n invalid={isInvalid}\n className=\"mt-30\"\n name=\"server.envato_id\"\n label={<Trans message=\"Envato ID\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mt-30\"\n name=\"server.envato_secret\"\n label={<Trans message=\"Envato secret\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mt-30\"\n name=\"server.envato_personal_token\"\n label={<Trans message=\"Envato personal token\" />}\n required\n />\n </>\n )}\n </>\n )}\n </SettingsErrorGroup>\n );\n}\n\nfunction GoogleSection() {\n const {watch} = useFormContext<AdminSettings>();\n const googleLoginEnabled = watch('client.social.google.enable');\n\n return (\n <SettingsErrorGroup name=\"google_group\">\n {isInvalid => (\n <>\n <FormSwitch\n invalid={isInvalid}\n name=\"client.social.google.enable\"\n description={\n <Trans message=\"Enable logging into the site via google.\" />\n }\n >\n <Trans message=\"Google login\" />\n </FormSwitch>\n {!!googleLoginEnabled && (\n <>\n <FormTextField\n invalid={isInvalid}\n className=\"mt-30\"\n name=\"server.google_id\"\n label={<Trans message=\"Google client ID\" />}\n required\n />\n <FormTextField\n className=\"mt-30\"\n name=\"server.google_secret\"\n label={<Trans message=\"Google client secret\" />}\n required\n />\n </>\n )}\n </>\n )}\n </SettingsErrorGroup>\n );\n}\n\nfunction FacebookSection() {\n const {watch} = useFormContext<AdminSettings>();\n const facebookLoginEnabled = watch('client.social.facebook.enable');\n\n return (\n <SettingsErrorGroup name=\"facebook_group\" separatorTop={false}>\n {isInvalid => (\n <>\n <FormSwitch\n invalid={isInvalid}\n name=\"client.social.facebook.enable\"\n description={\n <Trans message=\"Enable logging into the site via facebook.\" />\n }\n >\n <Trans message=\"Facebook login\" />\n </FormSwitch>\n {!!facebookLoginEnabled && (\n <>\n <FormTextField\n invalid={isInvalid}\n className=\"mt-30\"\n name=\"server.facebook_id\"\n label={<Trans message=\"Facebook app ID\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mt-30\"\n name=\"server.facebook_secret\"\n label={<Trans message=\"Facebook app secret\" />}\n required\n />\n </>\n )}\n </>\n )}\n </SettingsErrorGroup>\n );\n}\n\nfunction TwitterSection() {\n const {watch} = useFormContext<AdminSettings>();\n const twitterLoginEnabled = watch('client.social.twitter.enable');\n\n return (\n <SettingsErrorGroup\n name=\"twitter_group\"\n separatorTop={false}\n separatorBottom={false}\n >\n {isInvalid => (\n <>\n <FormSwitch\n invalid={isInvalid}\n name=\"client.social.twitter.enable\"\n description={\n <Trans message=\"Enable logging into the site via twitter.\" />\n }\n >\n <Trans message=\"Twitter login\" />\n </FormSwitch>\n {!!twitterLoginEnabled && (\n <>\n <FormTextField\n invalid={isInvalid}\n className=\"mt-30\"\n name=\"server.twitter_id\"\n label={<Trans message=\"Twitter ID\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mt-30\"\n name=\"server.twitter_secret\"\n label={<Trans message=\"Twitter secret\" />}\n required\n />\n </>\n )}\n </>\n )}\n </SettingsErrorGroup>\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient} from '@common/http/query-client';\n\nexport interface FetchMaxServerUploadSizeResponse extends BackendResponse {\n maxSize: string;\n}\n\nfunction fetchMaxServerUploadSize(): Promise<FetchMaxServerUploadSizeResponse> {\n return apiClient\n .get('uploads/server-max-file-size')\n .then(response => response.data);\n}\n\nexport function useMaxServerUploadSize() {\n return useQuery({\n queryKey: ['MaxServerUploadSize'],\n queryFn: () => fetchMaxServerUploadSize(),\n });\n}\n","export const spaceUnits = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];\n","export type SpaceUnit = 'KB' | 'MB' | 'GB' | 'TB' | 'PB';\n\nexport function convertToBytes(value: number, unit: SpaceUnit): number {\n if (value == null) return 0;\n switch (unit) {\n case 'KB':\n return value * 1024;\n case 'MB':\n return value * 1024 ** 2;\n case 'GB':\n return value * 1024 ** 3;\n case 'TB':\n return value * 1024 ** 4;\n case 'PB':\n return value * 1024 ** 5;\n default:\n return value;\n }\n}\n","import {useController} from 'react-hook-form';\nimport {mergeProps} from '@react-aria/utils';\nimport React, {useEffect, useState} from 'react';\nimport memoize from 'nano-memoize';\nimport {\n FormTextFieldProps,\n TextField,\n TextFieldProps,\n} from './text-field/text-field';\nimport {prettyBytes} from '../../../uploads/utils/pretty-bytes';\nimport {Option, Select} from '../select/select';\nimport {spaceUnits} from '../../../uploads/utils/space-units';\nimport {\n convertToBytes,\n SpaceUnit,\n} from '../../../uploads/utils/convert-to-bytes';\n\n// 99TB\nconst MaxValue = 108851651149824;\n\nexport const FormFileSizeField = React.forwardRef<\n HTMLDivElement,\n FormTextFieldProps\n>(({name, ...props}, ref) => {\n const {\n field: {\n onChange: setByteValue,\n onBlur,\n value: byteValue = '',\n ref: inputRef,\n },\n fieldState: {invalid, error},\n } = useController({\n name,\n });\n\n const [liveValue, setLiveValue] = useState<number | string>('');\n const [unit, setUnit] = useState<SpaceUnit | string>('MB');\n\n useEffect(() => {\n if (byteValue == null || byteValue === '') {\n setLiveValue('');\n return;\n }\n const {amount, unit: newUnit} = fromBytes({\n bytes: Math.min(byteValue, MaxValue),\n });\n setUnit(newUnit || 'MB');\n setLiveValue(Number.isNaN(amount) ? '' : amount);\n }, [byteValue, unit]);\n\n const formProps: TextFieldProps = {\n onChange: e => {\n const value = parseInt(e.target.value);\n if (Number.isNaN(value)) {\n setByteValue(value);\n } else {\n const newBytes = convertToBytes(\n parseInt(e.target.value),\n unit as SpaceUnit\n );\n setByteValue(newBytes);\n }\n },\n onBlur,\n value: liveValue,\n invalid,\n errorMessage: error?.message,\n inputRef,\n };\n\n const unitSelect = (\n <Select\n minWidth=\"min-w-80\"\n selectionMode=\"single\"\n selectedValue={unit}\n disabled={!byteValue}\n onSelectionChange={newUnit => {\n const newBytes = convertToBytes(\n (liveValue || 0) as number,\n newUnit as SpaceUnit\n );\n setByteValue(newBytes);\n }}\n >\n {spaceUnits.slice(0, 5).map(u => (\n <Option value={u} key={u}>\n {u === 'B' ? 'Bytes' : u}\n </Option>\n ))}\n </Select>\n );\n\n return (\n <TextField\n {...mergeProps(formProps, props)}\n type=\"number\"\n ref={ref}\n endAppend={unitSelect}\n />\n );\n});\n\nconst fromBytes = memoize(\n ({bytes}: {bytes: number}): {amount: number | string; unit: SpaceUnit} => {\n const pretty = prettyBytes(bytes);\n if (!pretty) return {amount: '', unit: 'MB'};\n let amount = parseInt(pretty.split(' ')[0]);\n // get rid of any punctuation\n amount = Math.round(amount);\n return {amount, unit: pretty.split(' ')[1] as SpaceUnit};\n }\n);\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '../../../../http/query-client';\nimport {useTrans} from '../../../../i18n/use-trans';\nimport {BackendResponse} from '../../../../http/backend-response/backend-response';\nimport {showHttpErrorToast} from '../../../../utils/http/show-http-error-toast';\nimport {message} from '../../../../i18n/message';\nimport {toast} from '../../../../ui/toast/toast';\n\ninterface Response extends BackendResponse {}\n\nexport function useUploadS3Cors() {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: () => uploadCors(),\n onSuccess: () => {\n toast(trans(message('CORS file updated')));\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction uploadCors(): Promise<Response> {\n return apiClient.post('s3/cors/upload').then(r => r.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '../../../../../http/query-client';\nimport {BackendResponse} from '../../../../../http/backend-response/backend-response';\nimport {showHttpErrorToast} from '../../../../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n refreshToken: string;\n}\n\ninterface Payload {\n app_key: string;\n app_secret: string;\n access_code: string;\n}\n\nexport function useGenerateDropboxRefreshToken() {\n return useMutation({\n mutationFn: (props: Payload) => generateToken(props),\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction generateToken(payload: Payload): Promise<Response> {\n return apiClient\n .post('settings/uploading/dropbox-refresh-token', payload)\n .then(r => r.data);\n}\n","import {Fragment} from 'react';\nimport {FormTextField} from '../../../../../ui/forms/input-field/text-field/text-field';\nimport {Trans} from '../../../../../i18n/trans';\nimport {CredentialFormProps} from '../uploading-settings';\nimport {Button} from '../../../../../ui/buttons/button';\nimport {Dialog} from '../../../../../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../../../../../ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '../../../../../ui/overlays/dialog/dialog-body';\nimport {useForm, useFormContext} from 'react-hook-form';\nimport {Form} from '../../../../../ui/forms/form';\nimport {DialogTrigger} from '../../../../../ui/overlays/dialog/dialog-trigger';\nimport {AdminSettings} from '../../../admin-settings';\nimport {DialogFooter} from '../../../../../ui/overlays/dialog/dialog-footer';\nimport {useDialogContext} from '../../../../../ui/overlays/dialog/dialog-context';\nimport {useGenerateDropboxRefreshToken} from './use-generate-dropbox-refresh-token';\n\nexport function DropboxForm({isInvalid}: CredentialFormProps) {\n const {watch, setValue} = useFormContext<AdminSettings>();\n const appKey = watch('server.storage_dropbox_app_key');\n const appSecret = watch('server.storage_dropbox_app_secret');\n\n return (\n <Fragment>\n <FormTextField\n invalid={isInvalid}\n className=\"mb-20\"\n name=\"server.storage_dropbox_app_key\"\n label={<Trans message=\"Dropbox application key\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-20\"\n name=\"server.storage_dropbox_app_secret\"\n label={<Trans message=\"Dropbox application secret\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-20\"\n name=\"server.storage_dropbox_refresh_token\"\n label={<Trans message=\"Dropbox refresh token\" />}\n required\n />\n <DialogTrigger\n type=\"modal\"\n onClose={refreshToken => {\n if (refreshToken) {\n setValue('server.storage_dropbox_refresh_token', refreshToken);\n }\n }}\n >\n <Button\n variant=\"outline\"\n color=\"primary\"\n size=\"xs\"\n disabled={!appKey || !appSecret}\n >\n <Trans message=\"Get dropbox refresh token\" />\n </Button>\n <DropboxRefreshTokenDialog appKey={appKey!} appSecret={appSecret!} />\n </DialogTrigger>\n </Fragment>\n );\n}\n\ninterface DropboxRefreshTokenDialogProps {\n appKey: string;\n appSecret: string;\n}\nfunction DropboxRefreshTokenDialog({\n appKey,\n appSecret,\n}: DropboxRefreshTokenDialogProps) {\n const form = useForm<{accessCode: string}>();\n const {formId, close} = useDialogContext();\n const generateRefreshToken = useGenerateDropboxRefreshToken();\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Connected dropbox account\" />\n </DialogHeader>\n <DialogBody>\n <Form\n id={formId}\n form={form}\n onSubmit={data => {\n generateRefreshToken.mutate(\n {\n app_key: appKey,\n app_secret: appSecret,\n access_code: data.accessCode,\n },\n {\n onSuccess: response => {\n close(response.refreshToken);\n },\n },\n );\n }}\n >\n <div className=\"mb-20 pb-20 border-b\">\n <div className=\"text-muted text-sm mb-10\">\n <Trans message=\"Click the 'get access code' button to get dropbox access code, then paste it into the field below.\" />\n </div>\n <Button\n variant=\"outline\"\n color=\"primary\"\n size=\"xs\"\n elementType=\"a\"\n target=\"_blank\"\n href={`https://www.dropbox.com/oauth2/authorize?client_id=${appKey}&token_access_type=offline&response_type=code`}\n >\n <Trans message=\"Get access code\" />\n </Button>\n </div>\n <FormTextField\n name=\"accessCode\"\n label={<Trans message=\"Dropbox access code\" />}\n required\n />\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button\n onClick={() => {\n close();\n }}\n >\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n variant=\"flat\"\n color=\"primary\"\n form={formId}\n type=\"submit\"\n disabled={!appKey || !appSecret || generateRefreshToken.isPending}\n >\n <Trans message=\"Connect\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {useFormContext} from 'react-hook-form';\nimport {SettingsPanel} from '../../settings-panel';\nimport {FormSelect, Option} from '../../../../ui/forms/select/select';\nimport {AdminSettings} from '../../admin-settings';\nimport {SettingsErrorGroup} from '../../settings-error-group';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {FormRadioGroup} from '@common/ui/forms/radio-group/radio-group';\nimport {FormRadio} from '@common/ui/forms/radio-group/radio';\nimport {SectionHelper} from '@common/ui/section-helper';\nimport {useMaxServerUploadSize} from './max-server-upload-size';\nimport {SettingsSeparator} from '../../settings-separator';\nimport {JsonChipField} from '../../json-chip-field';\nimport {FormFileSizeField} from '@common/ui/forms/input-field/file-size-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Fragment} from 'react';\nimport {useUploadS3Cors} from './use-upload-s3-cors';\nimport {Button} from '@common/ui/buttons/button';\nimport {DropboxForm} from './dropbox-form/dropbox-form';\nimport {useAdminSettings} from '../../requests/use-admin-settings';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\n\nexport function UploadingSettings() {\n const {trans} = useTrans();\n return (\n <SettingsPanel\n title={<Trans message=\"Uploading\" />}\n description={\n <Trans message=\"Configure size and type of files that users are able to upload. This will affect all uploads across the site.\" />\n }\n >\n <PrivateUploadSection />\n <PublicUploadSection />\n <CredentialsSection />\n <SettingsErrorGroup name=\"static_delivery_group\">\n {isInvalid => (\n <FormRadioGroup\n invalid={isInvalid}\n size=\"sm\"\n name=\"server.static_file_delivery\"\n orientation=\"vertical\"\n label={<Trans message=\"File delivery optimization\" />}\n description={\n <Trans message=\"Both X-Sendfile and X-Accel need to be enabled on the server first. When enabled, it will reduce server memory and CPU usage when previewing or downloading files, especially for large files.\" />\n }\n >\n <FormRadio value=\"\">\n <Trans message=\"None\" />\n </FormRadio>\n <FormRadio value=\"xsendfile\">\n <Trans message=\"X-Sendfile (Apache)\" />\n </FormRadio>\n <FormRadio value=\"xaccel\">\n <Trans message=\"X-Accel (Nginx)\" />\n </FormRadio>\n </FormRadioGroup>\n )}\n </SettingsErrorGroup>\n <FormFileSizeField\n className=\"mb-30\"\n name=\"client.uploads.chunk_size\"\n min={1}\n label={<Trans message=\"Chunk size\" />}\n placeholder=\"Infinity\"\n description={\n <Trans message=\"Size (in bytes) for each file chunk. It should only be changed if there is a maximum upload size on your server or proxy (for example cloudflare). If chunk size is larger then limit on the server, uploads will fail.\" />\n }\n />\n <MaxUploadSizeSection />\n <SettingsSeparator />\n <FormFileSizeField\n min={1}\n name=\"client.uploads.max_size\"\n className=\"mb-30\"\n label={<Trans message=\"Maximum file size\" />}\n description={\n <Trans message=\"Maximum size (in bytes) for a single file user can upload.\" />\n }\n />\n <FormFileSizeField\n min={1}\n name=\"client.uploads.available_space\"\n className=\"mb-30\"\n label={<Trans message=\"Available space\" />}\n description={\n <Trans message=\"Disk space (in bytes) each user uploads are allowed to take up. This can be overridden per user.\" />\n }\n />\n <JsonChipField\n name=\"client.uploads.allowed_extensions\"\n className=\"mb-30\"\n label={<Trans message=\"Allowed extensions\" />}\n placeholder={trans(message('Add extension...'))}\n description={\n <Trans message=\"List of allowed file types (jpg, mp3, pdf etc.). Leave empty to allow all file types.\" />\n }\n />\n <JsonChipField\n name=\"client.uploads.blocked_extensions\"\n label={<Trans message=\"Blocked extensions\" />}\n placeholder={trans(message('Add extension...'))}\n description={\n <Trans message=\"Prevent uploading of these file types, even if they are allowed above.\" />\n }\n />\n </SettingsPanel>\n );\n}\n\nfunction MaxUploadSizeSection() {\n const {data} = useMaxServerUploadSize();\n return (\n <SectionHelper\n color=\"warning\"\n description={\n <Trans\n message=\"Maximum upload size on your server currently is set to <b>:size</b>\"\n values={{size: data?.maxSize, b: chunks => <b>{chunks}</b>}}\n />\n }\n />\n );\n}\n\nfunction PrivateUploadSection() {\n const {watch, clearErrors} = useFormContext<AdminSettings>();\n const isEnabled = watch('server.uploads_disk_driver');\n\n if (!isEnabled) return null;\n\n return (\n <FormSelect\n className=\"mb-30\"\n selectionMode=\"single\"\n name=\"server.uploads_disk_driver\"\n label={<Trans message=\"User Uploads Storage Method\" />}\n description={\n <Trans message=\"Where should user private file uploads be stored.\" />\n }\n onSelectionChange={() => {\n clearErrors();\n }}\n >\n <Option value=\"local\">\n <Trans message=\"Local Disk (Default)\" />\n </Option>\n <Option value=\"ftp\">FTP</Option>\n <Option value=\"digitalocean_s3\">DigitalOcean Spaces</Option>\n <Option value=\"backblaze_s3\">Backblaze</Option>\n <Option value=\"s3\">Amazon S3 (Or compatible service)</Option>\n <Option value=\"dropbox\">Dropbox</Option>\n <Option value=\"rackspace\">Rackspace</Option>\n </FormSelect>\n );\n}\n\nfunction PublicUploadSection() {\n const {watch, clearErrors} = useFormContext<AdminSettings>();\n const isEnabled = watch('server.public_disk_driver');\n\n if (!isEnabled) return null;\n\n return (\n <FormSelect\n label={<Trans message=\"Public Uploads Storage Method\" />}\n selectionMode=\"single\"\n name=\"server.public_disk_driver\"\n description={\n <Trans message=\"Where should user public uploads (like avatars) be stored.\" />\n }\n onSelectionChange={() => {\n clearErrors();\n }}\n >\n <Option value=\"local\">\n <Trans message=\"Local Disk (Default)\" />\n </Option>\n <Option value=\"s3\">Amazon S3</Option>\n <Option value=\"ftp\">FTP</Option>\n <Option value=\"digitalocean_s3\">DigitalOcean Spaces</Option>\n <Option value=\"backblaze_s3\">Backblaze</Option>\n </FormSelect>\n );\n}\n\nfunction CredentialsSection() {\n const {watch} = useFormContext<AdminSettings>();\n const drives = [\n watch('server.uploads_disk_driver'),\n watch('server.public_disk_driver'),\n ];\n\n if (drives[0] === 'local' && drives[1] === 'local') {\n return null;\n }\n\n return (\n <SettingsErrorGroup separatorBottom={false} name=\"storage_group\">\n {isInvalid => {\n if (drives.includes('s3')) {\n return <S3Form isInvalid={isInvalid} />;\n }\n if (drives.includes('ftp')) {\n return <FtpForm isInvalid={isInvalid} />;\n }\n if (drives.includes('dropbox')) {\n return <DropboxForm isInvalid={isInvalid} />;\n }\n if (drives.includes('digitalocean_s3')) {\n return <DigitalOceanForm isInvalid={isInvalid} />;\n }\n if (drives.includes('backblaze_s3')) {\n return <BackblazeForm isInvalid={isInvalid} />;\n }\n }}\n </SettingsErrorGroup>\n );\n}\n\nexport interface CredentialFormProps {\n isInvalid: boolean;\n}\nfunction S3Form({isInvalid}: CredentialFormProps) {\n return (\n <Fragment>\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.storage_s3_key\"\n label={<Trans message=\"Amazon S3 key\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.storage_s3_secret\"\n label={<Trans message=\"Amazon S3 secret\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.storage_s3_region\"\n label={<Trans message=\"Amazon S3 region\" />}\n pattern=\"[a-z1-9\\-]+\"\n placeholder=\"us-east-1\"\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.storage_s3_bucket\"\n label={<Trans message=\"Amazon S3 bucket\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n name=\"server.storage_s3_endpoint\"\n label={<Trans message=\"Amazon S3 endpoint\" />}\n description={\n <Trans message=\"Only change endpoint if you are using another S3 compatible storage service.\" />\n }\n />\n <S3DirectUploadField invalid={isInvalid} />\n </Fragment>\n );\n}\n\nfunction DigitalOceanForm({isInvalid}: CredentialFormProps) {\n return (\n <Fragment>\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.storage_digitalocean_key\"\n label={<Trans message=\"DigitalOcean key\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.storage_digitalocean_secret\"\n label={<Trans message=\"DigitalOcean secret\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.storage_digitalocean_region\"\n label={<Trans message=\"DigitalOcean region\" />}\n pattern=\"[a-z0-9\\-]+\"\n placeholder=\"us-east-1\"\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.storage_digitalocean_bucket\"\n label={<Trans message=\"DigitalOcean bucket\" />}\n required\n />\n <S3DirectUploadField invalid={isInvalid} />\n </Fragment>\n );\n}\n\nfunction BackblazeForm({isInvalid}: CredentialFormProps) {\n return (\n <Fragment>\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.storage_backblaze_key\"\n label={<Trans message=\"Backblaze KeyID\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.storage_backblaze_secret\"\n label={<Trans message=\"Backblaze applicationKey\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.storage_backblaze_region\"\n label={<Trans message=\"Backblaze Region\" />}\n pattern=\"[a-z0-9\\-]+\"\n placeholder=\"us-west-002\"\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.storage_backblaze_bucket\"\n label={<Trans message=\"Backblaze bucket name\" />}\n required\n />\n <S3DirectUploadField invalid={isInvalid} />\n </Fragment>\n );\n}\n\ninterface S3DirectUploadFieldProps {\n invalid: boolean;\n}\nfunction S3DirectUploadField({invalid}: S3DirectUploadFieldProps) {\n const uploadCors = useUploadS3Cors();\n const {data: defaultSettings} = useAdminSettings();\n\n const s3DriverEnabled =\n defaultSettings?.server.uploads_disk_driver?.endsWith('s3') ||\n defaultSettings?.server.public_disk_driver?.endsWith('s3');\n\n return (\n <Fragment>\n <FormSwitch\n className=\"mt-30\"\n invalid={invalid}\n name=\"client.uploads.s3_direct_upload\"\n description={\n <div>\n <p>\n <Trans message=\"Upload files directly from the browser to s3 without going through the server. It will save on server bandwidth and should result in faster upload times. This should be enabled, unless storage provider does not support multipart uploads.\" />\n </p>\n <p className=\"mt-10\">\n <Trans message=\"If s3 provider is not configured to allow uploads from browser, this can be done automatically via CORS button below, when valid credentials are saved.\" />\n </p>\n </div>\n }\n >\n <Trans message=\"Direct upload\" />\n </FormSwitch>\n <Button\n variant=\"flat\"\n color=\"primary\"\n size=\"xs\"\n className=\"mt-20\"\n onClick={() => {\n uploadCors.mutate();\n }}\n disabled={!s3DriverEnabled || uploadCors.isPending}\n >\n <Trans message=\"Configure CORS\" />\n </Button>\n </Fragment>\n );\n}\n\nfunction FtpForm({isInvalid}: CredentialFormProps) {\n return (\n <>\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.storage_ftp_host\"\n label={<Trans message=\"FTP hostname\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.storage_ftp_username\"\n label={<Trans message=\"FTP username\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.storage_ftp_password\"\n label={<Trans message=\"FTP password\" />}\n type=\"password\"\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.storage_ftp_root\"\n label={<Trans message=\"FTP directory\" />}\n placeholder=\"/\"\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.storage_ftp_port\"\n label={<Trans message=\"FTP port\" />}\n type=\"number\"\n min={0}\n placeholder=\"21\"\n />\n <FormSwitch\n invalid={isInvalid}\n name=\"server.storage_ftp_passive\"\n className=\"mb-30\"\n >\n <Trans message=\"Passive\" />\n </FormSwitch>\n <FormSwitch invalid={isInvalid} name=\"server.storage_ftp_ssl\">\n <Trans message=\"SSL\" />\n </FormSwitch>\n </>\n );\n}\n","import {Fragment} from 'react';\nimport {FormTextField} from '../../../../ui/forms/input-field/text-field/text-field';\nimport {Trans} from '../../../../i18n/trans';\n\nexport interface MailgunCredentialsProps {\n isInvalid: boolean;\n}\nexport function MailgunCredentials({isInvalid}: MailgunCredentialsProps) {\n return (\n <Fragment>\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.mailgun_domain\"\n label={<Trans message=\"Mailgun domain\" />}\n description={\n <Trans message=\"Usually the domain of your site (site.com)\" />\n }\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.mailgun_secret\"\n label={<Trans message=\"Mailgun API key\" />}\n description={<Trans message=\"Should start with `key-`\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n name=\"server.mailgun_endpoint\"\n label={<Trans message=\"Mailgun endpoint\" />}\n description={\n <Trans message=\"Can be left empty, if your mailgun account is in the US region.\" />\n }\n placeholder=\"api.eu.mailgun.net\"\n />\n </Fragment>\n );\n}\n","import {FormTextField} from '../../../../ui/forms/input-field/text-field/text-field';\nimport {Trans} from '../../../../i18n/trans';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\n\nexport interface SmtpCredentialsProps {\n isInvalid: boolean;\n}\nexport function SmtpCredentials({isInvalid}: SmtpCredentialsProps) {\n return (\n <>\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.mail_host\"\n label={<Trans message=\"SMTP host\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.mail_username\"\n label={<Trans message=\"SMTP username\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n type=\"password\"\n name=\"server.mail_password\"\n label={<Trans message=\"SMTP password\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n type=\"number\"\n name=\"server.mail_port\"\n label={<Trans message=\"SMTP port\" />}\n />\n <FormSelect\n selectionMode=\"single\"\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.mail_encryption\"\n label={<Trans message=\"SMTP encryption\" />}\n >\n <Item value=\"\">\n <Trans message=\"None\" />\n </Item>\n <Item value=\"tls\">\n <Trans message=\"TLS\" />\n </Item>\n </FormSelect>\n </>\n );\n}\n","import {FormTextField} from '../../../../ui/forms/input-field/text-field/text-field';\nimport {Trans} from '../../../../i18n/trans';\nimport {Fragment} from 'react';\n\nexport interface SesCredentialsProps {\n isInvalid: boolean;\n}\nexport function SesCredentials({isInvalid}: SesCredentialsProps) {\n return (\n <Fragment>\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.ses_key\"\n label={<Trans message=\"SES key\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.ses_secret\"\n label={<Trans message=\"SES secret\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n name=\"server.ses_region\"\n label={<Trans message=\"SES region\" />}\n placeholder=\"us-east-1\"\n required\n />\n </Fragment>\n );\n}\n","import {FormTextField} from '../../../../ui/forms/input-field/text-field/text-field';\nimport {Trans} from '../../../../i18n/trans';\n\nexport interface PostmarkCredentialsProps {\n isInvalid: boolean;\n}\nexport function PostmarkCredentials({isInvalid}: PostmarkCredentialsProps) {\n return (\n <FormTextField\n invalid={isInvalid}\n name=\"server.postmark_token\"\n label={<Trans message=\"Postmark token\" />}\n required\n />\n );\n}\n","import {createSvgIcon} from '../../../../icons/create-svg-icon';\n\nexport const GmailIcon = createSvgIcon(\n [\n <path\n key=\"0\"\n fill=\"#4caf50\"\n d=\"M45,16.2l-5,2.75l-5,4.75L35,40h7c1.657,0,3-1.343,3-3V16.2z\"\n />,\n <path\n key=\"1\"\n fill=\"#1e88e5\"\n d=\"M3,16.2l3.614,1.71L13,23.7V40H6c-1.657,0-3-1.343-3-3V16.2z\"\n />,\n <polygon\n key=\"2\"\n fill=\"#e53935\"\n points=\"35,11.2 24,19.45 13,11.2 12,17 13,23.7 24,31.95 35,23.7 36,17\"\n />,\n <path\n key=\"3\"\n fill=\"#c62828\"\n d=\"M3,12.298V16.2l10,7.5V11.2L9.876,8.859C9.132,8.301,8.228,8,7.298,8h0C4.924,8,3,9.924,3,12.298z\"\n />,\n <path\n key=\"4\"\n fill=\"#fbc02d\"\n d=\"M45,12.298V16.2l-10,7.5V11.2l3.124-2.341C38.868,8.301,39.772,8,40.702,8h0 C43.076,8,45,9.924,45,12.298z\"\n />,\n ],\n 'Gmail',\n '0 0 48 48'\n);\n","import {useFormContext} from 'react-hook-form';\nimport {AdminSettings} from '../../admin-settings';\nimport {useSocialLogin} from '../../../../auth/requests/use-social-login';\nimport {toast} from '../../../../ui/toast/toast';\nimport {message} from '../../../../i18n/message';\nimport {Button} from '../../../../ui/buttons/button';\nimport {GmailIcon} from './gmail-icon';\nimport {Trans} from '../../../../i18n/trans';\nimport {Fragment} from 'react';\n\nexport function ConnectGmailPanel() {\n const {watch, setValue} = useFormContext<AdminSettings>();\n const {connectSocial} = useSocialLogin();\n const connectedEmail = watch('server.connectedGmailAccount');\n\n const handleGmailConnect = async () => {\n const e = await connectSocial('secure/settings/mail/gmail/connect');\n if (e?.status === 'SUCCESS') {\n const email = (e.callbackData as any).profile.email;\n setValue('server.connectedGmailAccount', email);\n toast(message('Connected gmail account: :email', {values: {email}}));\n }\n };\n\n const connectButton = (\n <Button\n variant=\"outline\"\n color=\"primary\"\n startIcon={<GmailIcon />}\n onClick={() => {\n handleGmailConnect();\n }}\n >\n <Trans message=\"Connect gmail account\" />\n </Button>\n );\n\n const reconnectPanel = (\n <div className=\"flex items-center gap-14 rounded border bg-alt px-14 py-6 text-sm\">\n <GmailIcon size=\"lg\" />\n {connectedEmail}\n <Button\n variant=\"text\"\n color=\"primary\"\n className=\"ml-auto\"\n onClick={() => {\n handleGmailConnect();\n }}\n >\n <Trans message=\"Reconnect\" />\n </Button>\n </div>\n );\n\n return (\n <Fragment>\n <div className=\"mb-6 text-sm\">\n <Trans message=\"Gmail account\" />\n </div>\n {connectedEmail ? reconnectPanel : connectButton}\n </Fragment>\n );\n}\n","import {useFormContext} from 'react-hook-form';\nimport {AdminSettings} from '../../admin-settings';\nimport {ComponentType, Fragment} from 'react';\nimport {MailgunCredentials} from './mailgun-credentials';\nimport {SmtpCredentials} from './smtp-credentials';\nimport {SesCredentials} from './ses-credentials';\nimport {PostmarkCredentials} from './postmark-credentials';\nimport {ConnectGmailPanel} from './connect-gmail-panel';\nimport {SettingsErrorGroup} from '../../settings-error-group';\nimport {FormSelect, Option} from '../../../../ui/forms/select/select';\nimport {Trans} from '../../../../i18n/trans';\nimport {LearnMoreLink} from '../../learn-more-link';\n\nexport function OutgoingMailGroup() {\n const {watch, clearErrors} = useFormContext<AdminSettings>();\n\n const selectedDriver = watch('server.mail_driver');\n const credentialForms: ComponentType<{isInvalid: boolean}>[] = [];\n\n if (selectedDriver === 'mailgun') {\n credentialForms.push(MailgunCredentials);\n }\n if (selectedDriver === 'smtp') {\n credentialForms.push(SmtpCredentials);\n }\n if (selectedDriver === 'ses') {\n credentialForms.push(SesCredentials);\n }\n if (selectedDriver === 'postmark') {\n credentialForms.push(PostmarkCredentials);\n }\n if (selectedDriver === 'gmailApi') {\n credentialForms.push(ConnectGmailPanel);\n }\n\n return (\n <SettingsErrorGroup\n separatorTop={false}\n separatorBottom={false}\n name=\"mail_group\"\n >\n {isInvalid => (\n <Fragment>\n <FormSelect\n onSelectionChange={() => {\n clearErrors();\n }}\n invalid={isInvalid}\n selectionMode=\"single\"\n name=\"server.mail_driver\"\n label={<Trans message=\"Outgoing mail method\" />}\n description={\n <div>\n <Trans message=\"Which method should be used for sending outgoing application emails (like registration confirmation)\" />\n <LearnMoreLink\n className=\"mt-8\"\n link=\"https://support.vebto.com/hc/articles/42/44/155/incoming-emails\"\n />\n </div>\n }\n >\n <Option value=\"mailgun\">Mailgun</Option>\n <Option value=\"gmailApi\">Gmail Api</Option>\n <Option value=\"smtp\">SMTP</Option>\n <Option value=\"postmark\">Postmark</Option>\n <Option value=\"ses\">Ses (Amazon Simple Email Service)</Option>\n <Option value=\"sendmail\">SendMail</Option>\n <Option value=\"log\">Log (Email will be saved to error log)</Option>\n </FormSelect>\n {credentialForms.length ? (\n <div className=\"mt-30\">\n {credentialForms.map((CredentialsForm, index) => (\n <CredentialsForm key={index} isInvalid={isInvalid} />\n ))}\n </div>\n ) : null}\n </Fragment>\n )}\n </SettingsErrorGroup>\n );\n}\n","import {SettingsPanel} from '../../settings-panel';\nimport {FormTextField} from '../../../../ui/forms/input-field/text-field/text-field';\nimport {ExternalLink} from '../../../../ui/buttons/external-link';\nimport {SectionHelper} from '../../../../ui/section-helper';\nimport {SettingsSeparator} from '../../settings-separator';\nimport {Trans} from '../../../../i18n/trans';\nimport {OutgoingMailGroup} from './outgoing-mail-group';\nimport {useSettings} from '../../../../core/settings/use-settings';\n\nexport function OutgoingEmailSettings() {\n return (\n <SettingsPanel\n title={<Trans message=\"Outgoing email settings\" />}\n description={\n <Trans message=\"Change outgoing email handlers, email credentials and other related settings.\" />\n }\n >\n <FormTextField\n id=\"outgoing-emails\"\n className=\"mb-30\"\n type=\"email\"\n name=\"server.mail_from_address\"\n label={<Trans message=\"From address\" />}\n description={\n <Trans message=\"All outgoing application emails will be sent from this email address.\" />\n }\n required\n />\n <ContactAddressSection />\n <FormTextField\n className=\"mb-30\"\n name=\"server.mail_from_name\"\n label={<Trans message=\"From name\" />}\n description={\n <Trans message=\"All outgoing application emails will be sent using this name.\" />\n }\n required\n />\n <SectionHelper\n color=\"warning\"\n description={\n <Trans message=\"Your selected mail method must be authorized to send emails using this address and name.\" />\n }\n />\n <SettingsSeparator />\n <OutgoingMailGroup />\n </SettingsPanel>\n );\n}\n\nfunction ContactAddressSection() {\n const {base_url} = useSettings();\n const contactPageUrl = `${base_url}/contact`;\n const link = (\n <ExternalLink href={contactPageUrl}>{contactPageUrl}</ExternalLink>\n );\n return (\n <FormTextField\n className=\"mb-30\"\n type=\"email\"\n name=\"client.mail.contact_page_address\"\n label={<Trans message=\"Contact page address\" />}\n description={\n <Trans\n values={{\n contactPageUrl: link,\n }}\n message=\"Where emails from :contactPageUrl page should be sent to.\"\n />\n }\n />\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {toast} from '../../../../ui/toast/toast';\nimport {BackendResponse} from '../../../../http/backend-response/backend-response';\nimport {message} from '../../../../i18n/message';\nimport {apiClient} from '../../../../http/query-client';\nimport {showHttpErrorToast} from '../../../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\nfunction clearCache(): Promise<Response> {\n return apiClient.post('cache/flush').then(r => r.data);\n}\n\nexport function useClearCache() {\n return useMutation({\n mutationFn: () => clearCache(),\n onSuccess: () => {\n toast(message('Cache cleared'));\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n","import {useFormContext} from 'react-hook-form';\nimport {ComponentType} from 'react';\nimport {SettingsPanel} from '../../settings-panel';\nimport {FormSelect, Option} from '../../../../ui/forms/select/select';\nimport {SettingsErrorGroup} from '../../settings-error-group';\nimport {FormTextField} from '../../../../ui/forms/input-field/text-field/text-field';\nimport {AdminSettings} from '../../admin-settings';\nimport {useClearCache} from './clear-cache';\nimport {Button} from '../../../../ui/buttons/button';\nimport {SectionHelper} from '../../../../ui/section-helper';\nimport {Trans} from '../../../../i18n/trans';\n\nexport function CacheSettings() {\n const clearCache = useClearCache();\n return (\n <SettingsPanel\n title={<Trans message=\"Cache settings\" />}\n description={\n <Trans message=\"Select cache provider and manually clear cache.\" />\n }\n >\n <CacheSelect />\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"xs\"\n color=\"primary\"\n disabled={clearCache.isPending}\n onClick={() => {\n clearCache.mutate();\n }}\n >\n <Trans message=\"Clear cache\" />\n </Button>\n <SectionHelper\n color=\"warning\"\n className=\"mt-30\"\n description={\n <Trans\n message={\n '\"File\" is the best option for most cases and should not be changed, unless you are familiar with another cache method and have it set up on the server already.'\n }\n />\n }\n />\n </SettingsPanel>\n );\n}\n\nfunction CacheSelect() {\n const {watch, clearErrors} = useFormContext<AdminSettings>();\n const cacheDriver = watch('server.cache_driver');\n\n let CredentialSection: ComponentType<CredentialProps> | null = null;\n if (cacheDriver === 'memcached') {\n CredentialSection = MemcachedCredentials;\n }\n\n return (\n <SettingsErrorGroup separatorTop={false} name=\"cache_group\">\n {isInvalid => {\n return (\n <>\n <FormSelect\n invalid={isInvalid}\n onSelectionChange={() => {\n clearErrors();\n }}\n selectionMode=\"single\"\n name=\"server.cache_driver\"\n label={<Trans message=\"Cache method\" />}\n description={\n <Trans message=\"Which method should be used for storing and retrieving cached items.\" />\n }\n >\n <Option value=\"file\">\n <Trans message=\"File (Default)\" />\n </Option>\n <Option value=\"array\">\n <Trans message=\"None\" />\n </Option>\n <Option value=\"apc\">APC</Option>\n <Option value=\"memcached\">Memcached</Option>\n <Option value=\"redis\">Redis</Option>\n </FormSelect>\n {CredentialSection && (\n <div className=\"mt-30\">\n <CredentialSection isInvalid={isInvalid} />\n </div>\n )}\n </>\n );\n }}\n </SettingsErrorGroup>\n );\n}\n\ninterface CredentialProps {\n isInvalid: boolean;\n}\nfunction MemcachedCredentials({isInvalid}: CredentialProps) {\n return (\n <>\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.memcached_host\"\n label={<Trans message=\"Memcached host\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n type=\"number\"\n name=\"server.memcached_port\"\n label={<Trans message=\"Memcached port\" />}\n required\n />\n </>\n );\n}\n","import {useFormContext} from 'react-hook-form';\nimport {SettingsPanel} from '@common/admin/settings/settings-panel';\nimport {SettingsErrorGroup} from '@common/admin/settings/settings-error-group';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {SectionHelper} from '@common/ui/section-helper';\nimport {ExternalLink} from '@common/ui/buttons/external-link';\nimport {Trans} from '@common/i18n/trans';\n\nexport function LoggingSettings() {\n return (\n <SettingsPanel\n title={<Trans message=\"Error logging\" />}\n description={\n <Trans message=\"Configure site error logging and related 3rd party integrations.\" />\n }\n >\n <SentrySection />\n <SectionHelper\n className=\"mt-30\"\n color=\"positive\"\n description={\n <Trans\n values={{\n a: parts => (\n <ExternalLink href=\"https://sentry.io\">{parts}</ExternalLink>\n ),\n }}\n message=\"<a>Sentry</a> integration provides real-time error tracking and helps identify and fix issues when site is in production.\"\n />\n }\n />\n </SettingsPanel>\n );\n}\n\nfunction SentrySection() {\n const {clearErrors} = useFormContext();\n return (\n <SettingsErrorGroup\n separatorTop={false}\n separatorBottom={false}\n name=\"logging_group\"\n >\n {isInvalid => {\n return (\n <FormTextField\n onChange={() => {\n clearErrors();\n }}\n invalid={isInvalid}\n name=\"server.sentry_dsn\"\n type=\"url\"\n minLength={30}\n label={<Trans message=\"Sentry DSN\" />}\n />\n );\n }}\n </SettingsErrorGroup>\n );\n}\n","import {useFormContext} from 'react-hook-form';\nimport {ComponentType} from 'react';\nimport {SettingsPanel} from '../settings-panel';\nimport {SettingsErrorGroup} from '../settings-error-group';\nimport {SectionHelper} from '../../../ui/section-helper';\nimport {AdminSettings} from '../admin-settings';\nimport {FormSelect, Option} from '../../../ui/forms/select/select';\nimport {FormTextField} from '../../../ui/forms/input-field/text-field/text-field';\nimport {Trans} from '../../../i18n/trans';\n\nexport function QueueSettings() {\n return (\n <SettingsPanel\n title={<Trans message=\"Queue\" />}\n description={\n <Trans message=\"Select active queue method and enter related 3rd party API keys.\" />\n }\n >\n <SectionHelper\n color=\"positive\"\n className=\"mb-30\"\n description={\n <Trans message=\"Queues allow to defer time consuming tasks, such as sending an email, until a later time. Deferring these tasks can speed up web requests to the application.\" />\n }\n />\n <SectionHelper\n color=\"warning\"\n className=\"mb-30\"\n description={\n <Trans message=\"All methods except sync require additional setup, which should be performed before changing the queue method. Consult documentation for more information.\" />\n }\n />\n <DriverSection />\n </SettingsPanel>\n );\n}\n\nfunction DriverSection() {\n const {watch, clearErrors} = useFormContext<AdminSettings>();\n const queueDriver = watch('server.queue_driver');\n\n let CredentialSection: ComponentType<CredentialProps> | null = null;\n if (queueDriver === 'sqs') {\n CredentialSection = SqsCredentials;\n }\n return (\n <SettingsErrorGroup\n separatorTop={false}\n separatorBottom={false}\n name=\"queue_group\"\n >\n {isInvalid => {\n return (\n <>\n <FormSelect\n invalid={isInvalid}\n onSelectionChange={() => {\n clearErrors();\n }}\n selectionMode=\"single\"\n name=\"server.queue_driver\"\n label={<Trans message=\"Queue method\" />}\n required\n >\n <Option value=\"sync\">\n <Trans message=\"Sync (Default)\" />\n </Option>\n <Option value=\"beanstalkd\">Beanstalkd</Option>\n <Option value=\"database\">\n <Trans message=\"Database\" />\n </Option>\n <Option value=\"sqs\">\n <Trans message=\"SQS (Amazon simple queue service)\" />\n </Option>\n <Option value=\"redis\">Redis</Option>\n </FormSelect>\n {CredentialSection && (\n <div className=\"mt-30\">\n <CredentialSection isInvalid={isInvalid} />\n </div>\n )}\n </>\n );\n }}\n </SettingsErrorGroup>\n );\n}\n\ninterface CredentialProps {\n isInvalid: boolean;\n}\nfunction SqsCredentials({isInvalid}: CredentialProps) {\n return (\n <>\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.sqs_queue_key\"\n label={<Trans message=\"SQS queue key\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.sqs_queue_secret\"\n label={<Trans message=\"SQS queue secret\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.sqs_queue_prefix\"\n label={<Trans message=\"SQS queue prefix\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.sqs_queue_name\"\n label={<Trans message=\"SQS queue name\" />}\n required\n />\n <FormTextField\n invalid={isInvalid}\n className=\"mb-30\"\n name=\"server.sqs_queue_region\"\n label={<Trans message=\"SQS queue region\" />}\n required\n />\n </>\n );\n}\n","import {useFormContext} from 'react-hook-form';\nimport {useContext} from 'react';\nimport {SettingsPanel} from '../settings-panel';\nimport {SettingsErrorGroup} from '../settings-error-group';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\nimport {Trans} from '@common/i18n/trans';\n\nexport function RecaptchaSettings() {\n const {settings} = useContext(SiteConfigContext);\n return (\n <SettingsPanel\n title={<Trans message=\"Recaptcha\" />}\n description={\n <Trans message=\"Configure google recaptcha integration and credentials.\" />\n }\n >\n {settings?.showRecaptchaLinkSwitch && (\n <FormSwitch\n className=\"mb-30\"\n name=\"client.recaptcha.enable.link_creation\"\n description={\n <Trans message=\"Enable recaptcha integration when creating links from homepage or user dashboard.\" />\n }\n >\n <Trans message=\"Link creation\" />\n </FormSwitch>\n )}\n <FormSwitch\n className=\"mb-30\"\n name=\"client.recaptcha.enable.contact\"\n description={\n <Trans\n message={'Enable recaptcha integration for \"contact us\" page.'}\n />\n }\n >\n <Trans message=\"Contact page\" />\n </FormSwitch>\n <FormSwitch\n className=\"mb-30\"\n name=\"client.recaptcha.enable.register\"\n description={\n <Trans message=\"Enable recaptcha integration for registration page.\" />\n }\n >\n <Trans message=\"Registration page\" />\n </FormSwitch>\n <RecaptchaSection />\n </SettingsPanel>\n );\n}\n\nfunction RecaptchaSection() {\n const {clearErrors} = useFormContext();\n return (\n <SettingsErrorGroup\n separatorTop={false}\n separatorBottom={false}\n name=\"recaptcha_group\"\n >\n {isInvalid => {\n return (\n <>\n <FormTextField\n className=\"mb-30\"\n onChange={() => {\n clearErrors();\n }}\n invalid={isInvalid}\n name=\"client.recaptcha.site_key\"\n label={<Trans message=\"Recaptcha v3 site key\" />}\n />\n <FormTextField\n onChange={() => {\n clearErrors();\n }}\n invalid={isInvalid}\n name=\"client.recaptcha.secret_key\"\n label={<Trans message=\"Recaptcha v3 secret key\" />}\n />\n </>\n );\n }}\n </SettingsErrorGroup>\n );\n}\n","import React, {ChangeEventHandler} from 'react';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {useController} from 'react-hook-form';\nimport clsx from 'clsx';\nimport {BaseFieldProps} from './base-field-props';\nimport {useField} from './use-field';\nimport {getInputFieldClassNames} from './get-input-field-class-names';\nimport {Field} from './field';\nimport {TextFieldProps} from './text-field/text-field';\n\nexport interface FileFieldProps\n extends Omit<BaseFieldProps, 'type'> {\n onChange?: ChangeEventHandler<'input'>;\n accept?: string;\n}\nexport const FileField = React.forwardRef<HTMLInputElement, FileFieldProps>(\n (props, ref) => {\n const inputRef = useObjectRef(ref);\n\n const {fieldProps, inputProps} = useField({...props, focusRef: inputRef});\n\n const inputFieldClassNames = getInputFieldClassNames(props);\n\n return (\n <Field ref={ref} fieldClassNames={inputFieldClassNames} {...fieldProps}>\n <input\n type=\"file\"\n ref={inputRef}\n {...inputProps as any}\n className={clsx(\n inputFieldClassNames.input,\n 'py-8',\n 'file:bg-primary file:text-on-primary file:border-none file:rounded file:text-sm file:font-semibold file:px-10 file:h-24 file:mr-10'\n )}\n />\n </Field>\n );\n }\n);\n\nexport interface FormFileFieldProps extends FileFieldProps {\n name: string;\n}\nexport function FormFileField({name, ...props}: FormFileFieldProps) {\n const {\n field: {onChange, onBlur, ref},\n fieldState: {invalid, error},\n } = useController({\n name,\n });\n\n const [value, setValue] = React.useState('');\n\n const formProps: TextFieldProps = {\n onChange: e => {\n onChange(e.target.files?.[0]);\n setValue(e.target.value);\n },\n onBlur,\n value,\n invalid,\n errorMessage: error?.message,\n };\n\n return <FileField ref={ref} {...mergeProps(formProps, props)} />;\n}\n","import {useFormContext} from 'react-hook-form';\nimport {SettingsPanel} from '../settings-panel';\nimport {SettingsErrorGroup} from '../settings-error-group';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {FormFileField} from '@common/ui/forms/input-field/file-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Fragment} from 'react';\n\nexport function ReportsSettings() {\n return (\n <SettingsPanel\n title={<Trans message=\"Analytics\" />}\n description={\n <Trans message=\"Configure google analytics integration and credentials.\" />\n }\n >\n <AnalyticsSection />\n </SettingsPanel>\n );\n}\n\nfunction AnalyticsSection() {\n const {clearErrors} = useFormContext();\n return (\n <SettingsErrorGroup\n separatorTop={false}\n separatorBottom={false}\n name=\"analytics_group\"\n >\n {isInvalid => (\n <Fragment>\n <FormFileField\n className=\"mb-30\"\n onChange={() => {\n clearErrors();\n }}\n invalid={isInvalid}\n name=\"files.certificate\"\n accept=\".json\"\n label={<Trans message=\"Google service account key file (.json)\" />}\n />\n <FormTextField\n className=\"mb-30\"\n onChange={() => {\n clearErrors();\n }}\n invalid={isInvalid}\n name=\"server.analytics_property_id\"\n type=\"number\"\n label={<Trans message=\"Google analytics property ID\" />}\n />\n <FormTextField\n className=\"mb-30\"\n onChange={() => {\n clearErrors();\n }}\n invalid={isInvalid}\n name=\"client.analytics.tracking_code\"\n placeholder=\"G-******\"\n min=\"1\"\n max=\"20\"\n description={\n <Trans message=\"Google analytics measurement ID only, not the whole javascript snippet.\" />\n }\n label={<Trans message=\"Google tag manager measurement ID\" />}\n />\n <FormTextField\n name=\"client.analytics.gchart_api_key\"\n label={<Trans message=\"Google maps javascript API key\" />}\n description={\n <Trans message=\"Only required in order to show world geochart on integrated analytics pages.\" />\n }\n />\n </Fragment>\n )}\n </SettingsErrorGroup>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {User} from '@common/auth/user';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {toast} from '@common/ui/toast/toast';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {message} from '@common/i18n/message';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\n\ninterface Response extends BackendResponse {\n user: User;\n}\n\nexport interface UpdateUserPayload\n extends Omit<Partial<User>, 'email_verified_at'> {\n email_verified_at?: boolean;\n id: number;\n}\n\nexport function useUpdateUser(form: UseFormReturn<UpdateUserPayload>) {\n const navigate = useNavigate();\n return useMutation({\n mutationFn: (props: UpdateUserPayload) => updateUser(props),\n onSuccess: (response, props) => {\n toast(message('User updated'));\n queryClient.invalidateQueries({queryKey: ['users']});\n navigate('/admin/users');\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction updateUser({id, ...other}: UpdateUserPayload): Promise<Response> {\n if (other.roles) {\n other.roles = other.roles.map(r => r.id) as any;\n }\n return apiClient.put(`users/${id}`, other).then(r => r.data);\n}\n","import {FieldValues, SubmitHandler, UseFormReturn} from 'react-hook-form';\nimport clsx from 'clsx';\nimport {ReactNode} from 'react';\nimport {Link} from 'react-router-dom';\nimport {useValueLists} from '../../http/value-lists';\nimport {FormTextField} from '../../ui/forms/input-field/text-field/text-field';\nimport {FormSwitch} from '../../ui/forms/toggle/switch';\nimport {FormFileSizeField} from '../../ui/forms/input-field/file-size-field';\nimport {LinkStyle} from '../../ui/buttons/external-link';\nimport {FormPermissionSelector} from '../../auth/ui/permission-selector';\nimport {Trans} from '../../i18n/trans';\nimport {FormChipField} from '../../ui/forms/input-field/chip-field/form-chip-field';\nimport {Item} from '../../ui/forms/listbox/item';\nimport {CrupdateResourceLayout} from '../crupdate-resource-layout';\nimport {useSettings} from '../../core/settings/use-settings';\n\ninterface Props<T extends FieldValues> {\n onSubmit: SubmitHandler<T>;\n form: UseFormReturn<T>;\n title: ReactNode;\n subTitle?: ReactNode;\n isLoading: boolean;\n avatarManager: ReactNode;\n resendEmailButton?: ReactNode;\n children?: ReactNode;\n}\nexport function CrupdateUserForm<T extends FieldValues>({\n onSubmit,\n form,\n title,\n subTitle,\n isLoading,\n avatarManager,\n resendEmailButton,\n children,\n}: Props<T>) {\n const {require_email_confirmation} = useSettings();\n const {data: valueLists} = useValueLists(['roles', 'permissions']);\n\n return (\n <CrupdateResourceLayout\n onSubmit={onSubmit}\n form={form}\n title={title}\n subTitle={subTitle}\n isLoading={isLoading}\n >\n <div className=\"mb-40 flex items-start gap-40 md:gap-80\">\n {avatarManager}\n <div className=\"flex-auto\">\n {children}\n <FormTextField\n className=\"mb-30\"\n name=\"first_name\"\n label={<Trans message=\"First name\" />}\n />\n <FormTextField\n name=\"last_name\"\n label={<Trans message=\"Last name\" />}\n />\n </div>\n </div>\n\n <div className=\"mb-30 border-b border-t pb-30 pt-30\">\n <FormSwitch\n className={clsx(resendEmailButton && 'mb-30')}\n disabled={!require_email_confirmation}\n name=\"email_verified_at\"\n description={\n <Trans message=\"Whether email address has been confirmed. User will not be able to login until address is confirmed, unless confirmation is disabled from settings page.\" />\n }\n >\n <Trans message=\"Email confirmed\" />\n </FormSwitch>\n {resendEmailButton}\n </div>\n <FormFileSizeField\n className=\"mb-30\"\n name=\"available_space\"\n label={<Trans message=\"Allowed storage space\" />}\n description={\n <Trans\n values={{\n a: parts => (\n <Link\n className={LinkStyle}\n target=\"_blank\"\n to=\"/admin/settings/uploading\"\n >\n {parts}\n </Link>\n ),\n }}\n message=\"Total storage space all user uploads are allowed to take up. If left empty, this value will be inherited from any roles or subscriptions user has, or from 'Available space' setting in <a>Uploading</a> settings page.\"\n />\n }\n />\n <FormChipField\n className=\"mb-30\"\n name=\"roles\"\n label={<Trans message=\"Roles\" />}\n suggestions={valueLists?.roles}\n >\n {chip => (\n <Item key={chip.id} value={chip.id}>\n {chip.name}\n </Item>\n )}\n </FormChipField>\n <div className=\"mt-30 border-t pt-30\">\n <div className=\"mb-10 text-sm\">\n <Trans message=\"Permissions\" />\n </div>\n <FormPermissionSelector name=\"permissions\" />\n </div>\n </CrupdateResourceLayout>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ReportIcon = createSvgIcon(\n [<path d=\"M15.73 3H8.27L3 8.27v7.46L8.27 21h7.46L21 15.73V8.27L15.73 3zM19 14.9 14.9 19H9.1L5 14.9V9.1L9.1 5h5.8L19 9.1v5.8z\" key=\"0\" />,<circle cx=\"12\" cy=\"16\" r=\"1\" key=\"1\" />,<path d=\"M11 7h2v7h-2z\" key=\"2\" />,]\n, 'ReportOutlined');\n","import {useForm} from 'react-hook-form';\nimport {useParams} from 'react-router-dom';\nimport React, {useEffect} from 'react';\nimport {useUser} from '../../auth/ui/use-user';\nimport {UpdateUserPayload, useUpdateUser} from './requests/update-user';\nimport {Button} from '../../ui/buttons/button';\nimport {useResendVerificationEmail} from '../../auth/requests/use-resend-verification-email';\nimport {useUploadAvatar} from '../../auth/ui/account-settings/avatar/upload-avatar';\nimport {useRemoveAvatar} from '../../auth/ui/account-settings/avatar/remove-avatar';\nimport {CrupdateUserForm} from './crupdate-user-form';\nimport {User} from '../../auth/user';\nimport {Trans} from '../../i18n/trans';\nimport {FullPageLoader} from '../../ui/progress/full-page-loader';\nimport {useSettings} from '../../core/settings/use-settings';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\nimport {queryClient} from '@common/http/query-client';\nimport {ReportIcon} from '@common/icons/material/Report';\n\nexport function UpdateUserPage() {\n const form = useForm<UpdateUserPayload>();\n const {require_email_confirmation} = useSettings();\n const {userId} = useParams();\n const updateUser = useUpdateUser(form);\n const resendConfirmationEmail = useResendVerificationEmail();\n const {data, isLoading} = useUser(userId!, {\n with: ['subscriptions', 'roles', 'permissions', 'bans'],\n });\n const banReason = data?.user.bans?.[0]?.comment;\n\n useEffect(() => {\n if (data?.user && !form.getValues().id) {\n form.reset({\n first_name: data.user.first_name,\n last_name: data.user.last_name,\n roles: data.user.roles,\n permissions: data.user.permissions,\n id: data.user.id,\n email_verified_at: Boolean(data.user.email_verified_at),\n available_space: data.user.available_space,\n avatar: data.user.avatar,\n });\n }\n }, [data?.user, form]);\n\n if (isLoading) {\n return <FullPageLoader />;\n }\n\n const resendEmailButton = (\n <Button\n size=\"xs\"\n variant=\"outline\"\n color=\"primary\"\n disabled={\n !require_email_confirmation ||\n resendConfirmationEmail.isPending ||\n data?.user?.email_verified_at != null\n }\n onClick={() => {\n resendConfirmationEmail.mutate({email: data!.user.email});\n }}\n >\n <Trans message=\"Resend email\" />\n </Button>\n );\n\n return (\n <CrupdateUserForm\n onSubmit={newValues => {\n updateUser.mutate(newValues);\n }}\n form={form}\n title={\n <Trans values={{email: data?.user.email}} message=\"Edit “:email“\" />\n }\n subTitle={\n banReason && (\n <div className=\"flex items-center gap-4 text-sm text-danger\">\n <ReportIcon />\n <div>\n <Trans\n message=\"Suspended: :reason\"\n values={{reason: banReason}}\n />\n </div>\n </div>\n )\n }\n isLoading={updateUser.isPending}\n avatarManager={\n <AvatarSection\n user={data!.user}\n onChange={() => {\n queryClient.invalidateQueries({queryKey: ['users']});\n }}\n />\n }\n resendEmailButton={resendEmailButton}\n >\n <FormTextField\n className=\"mb-30\"\n name=\"password\"\n type=\"password\"\n label={<Trans message=\"New password\" />}\n />\n </CrupdateUserForm>\n );\n}\n\ninterface AvatarSectionProps {\n user: User;\n onChange: () => void;\n}\nfunction AvatarSection({user, onChange}: AvatarSectionProps) {\n const uploadAvatar = useUploadAvatar({user});\n const removeAvatar = useRemoveAvatar({user});\n return (\n <FileUploadProvider>\n <FormImageSelector\n name=\"avatar\"\n diskPrefix=\"avatars\"\n variant=\"avatar\"\n stretchPreview\n label={<Trans message=\"Profile image\" />}\n previewSize=\"w-90 h-90\"\n showRemoveButton\n onChange={url => {\n if (url) {\n uploadAvatar.mutate({url});\n } else {\n removeAvatar.mutate();\n }\n onChange();\n }}\n />\n </FileUploadProvider>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {User} from '../../../auth/user';\nimport {BackendResponse} from '../../../http/backend-response/backend-response';\nimport {toast} from '../../../ui/toast/toast';\nimport {apiClient, queryClient} from '../../../http/query-client';\nimport {DatatableDataQueryKey} from '../../../datatable/requests/paginated-resources';\nimport {onFormQueryError} from '../../../errors/on-form-query-error';\nimport {message} from '../../../i18n/message';\nimport {useNavigate} from '../../../utils/hooks/use-navigate';\n\ninterface Response extends BackendResponse {\n user: User;\n}\n\nexport interface CreateUserPayload\n extends Omit<Partial<User>, 'email_verified_at'> {\n email_verified_at?: boolean;\n}\n\nexport function useCreateUser(form: UseFormReturn<CreateUserPayload>) {\n const navigate = useNavigate();\n return useMutation({\n mutationFn: (props: CreateUserPayload) => createUser(props),\n onSuccess: () => {\n toast(message('User created'));\n queryClient.invalidateQueries({queryKey: DatatableDataQueryKey('users')});\n navigate('/admin/users');\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction createUser(payload: CreateUserPayload): Promise<Response> {\n if (payload.roles) {\n payload.roles = payload.roles.map(r => r.id) as any;\n }\n return apiClient.post('users', payload).then(r => r.data);\n}\n","import {useForm} from 'react-hook-form';\nimport React from 'react';\nimport {FormTextField} from '../../ui/forms/input-field/text-field/text-field';\nimport {CreateUserPayload, useCreateUser} from './requests/create-user';\nimport {CrupdateUserForm} from './crupdate-user-form';\nimport {FileUploadProvider} from '../../uploads/uploader/file-upload-provider';\nimport {Trans} from '../../i18n/trans';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\n\nexport function CreateUserPage() {\n const form = useForm<CreateUserPayload>();\n const createUser = useCreateUser(form);\n\n const avatarManager = (\n <FileUploadProvider>\n <FormImageSelector\n name=\"avatar\"\n diskPrefix=\"avatars\"\n variant=\"avatar\"\n stretchPreview\n label={<Trans message=\"Profile image\" />}\n previewSize=\"w-90 h-90\"\n showRemoveButton\n />\n </FileUploadProvider>\n );\n\n return (\n <CrupdateUserForm\n onSubmit={newValues => {\n createUser.mutate(newValues);\n }}\n form={form}\n title={<Trans message=\"Add new user\" />}\n isLoading={createUser.isPending}\n avatarManager={avatarManager}\n >\n <FormTextField\n className=\"mb-30\"\n name=\"email\"\n type=\"email\"\n label={<Trans message=\"Email\" />}\n />\n <FormTextField\n className=\"mb-30\"\n name=\"password\"\n type=\"password\"\n label={<Trans message=\"Password\" />}\n />\n </CrupdateUserForm>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TranslateIcon = createSvgIcon(\n <path d=\"m12.87 15.07-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7 1.62-4.33L19.12 17h-3.24z\" />\n, 'TranslateOutlined');\n","import {useQuery} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {Localization} from '../../i18n/localization';\nimport {apiClient} from '../../http/query-client';\n\nexport interface FetchLocaleWithLinesResponse extends BackendResponse {\n localization: Localization;\n}\n\nexport const getLocalWithLinesQueryKey = (localeId?: number | string) => {\n const key: (string | number)[] = ['getLocaleWithLines'];\n if (localeId != null) {\n key.push(localeId);\n }\n return key;\n};\n\nexport function useLocaleWithLines(localeId: number | string) {\n return useQuery({\n queryKey: getLocalWithLinesQueryKey(localeId),\n queryFn: () => fetchLocaleWithLines(localeId),\n staleTime: Infinity,\n });\n}\n\nfunction fetchLocaleWithLines(\n localeId: number | string,\n): Promise<FetchLocaleWithLinesResponse> {\n return apiClient\n .get(`localizations/${localeId}`)\n .then(response => response.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {toast} from '../../ui/toast/toast';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {message} from '../../i18n/message';\nimport {DatatableDataQueryKey} from '../../datatable/requests/paginated-resources';\nimport {Localization} from '../../i18n/localization';\nimport {onFormQueryError} from '../../errors/on-form-query-error';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\nimport {getLocalWithLinesQueryKey} from './use-locale-with-lines';\n\ninterface Response extends BackendResponse {\n localization: Localization;\n}\n\nfunction UpdateLocalization({\n id,\n ...other\n}: Partial<Localization>): Promise<Response> {\n return apiClient.put(`localizations/${id}`, other).then(r => r.data);\n}\n\nexport function useUpdateLocalization(\n form?: UseFormReturn<Partial<Localization>>,\n) {\n return useMutation({\n mutationFn: (props: Partial<Localization>) => UpdateLocalization(props),\n onSuccess: () => {\n toast(message('Localization updated'));\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('localizations'),\n });\n queryClient.invalidateQueries({queryKey: getLocalWithLinesQueryKey()});\n },\n onError: r => (form ? onFormQueryError(r, form) : showHttpErrorToast(r)),\n });\n}\n","import {useForm} from 'react-hook-form';\nimport {Dialog} from '../../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../../ui/overlays/dialog/dialog-header';\nimport {Trans} from '../../i18n/trans';\nimport {DialogBody} from '../../ui/overlays/dialog/dialog-body';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {Form} from '../../ui/forms/form';\nimport {Localization} from '../../i18n/localization';\nimport {FormTextField} from '../../ui/forms/input-field/text-field/text-field';\nimport {useValueLists} from '../../http/value-lists';\nimport {FormSelect, Option} from '../../ui/forms/select/select';\nimport {DialogFooter} from '../../ui/overlays/dialog/dialog-footer';\nimport {Button} from '../../ui/buttons/button';\nimport {useUpdateLocalization} from './update-localization';\nimport {message} from '@common/i18n/message';\nimport {useTrans} from '@common/i18n/use-trans';\n\ninterface UpdateLocalizationDialogProps {\n localization: Localization;\n}\nexport function UpdateLocalizationDialog({\n localization,\n}: UpdateLocalizationDialogProps) {\n const {trans} = useTrans();\n const {formId, close} = useDialogContext();\n const form = useForm<Partial<Localization>>({\n defaultValues: {\n id: localization.id,\n name: localization.name,\n language: localization.language,\n },\n });\n\n const {data} = useValueLists(['languages']);\n const languages = data?.languages || [];\n\n const updateLocalization = useUpdateLocalization(form);\n\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Update localization\" />\n </DialogHeader>\n <DialogBody>\n <Form\n form={form}\n id={formId}\n onSubmit={values => {\n updateLocalization.mutate(values, {onSuccess: close});\n }}\n >\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Name\" />}\n className=\"mb-30\"\n required\n />\n <FormSelect\n required\n name=\"language\"\n label={<Trans message=\"Language\" />}\n selectionMode=\"single\"\n showSearchField\n searchPlaceholder={trans(message('Search languages'))}\n >\n {languages.map(language => (\n <Option value={language.code} key={language.code}>\n {language.name}\n </Option>\n ))}\n </FormSelect>\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button onClick={close}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n form={formId}\n disabled={updateLocalization.isPending}\n >\n <Trans message=\"Save\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {useMutation, useQueryClient} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {toast} from '../../ui/toast/toast';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {apiClient} from '../../http/query-client';\nimport {message} from '../../i18n/message';\nimport {DatatableDataQueryKey} from '../../datatable/requests/paginated-resources';\nimport {onFormQueryError} from '../../errors/on-form-query-error';\nimport {Localization} from '../../i18n/localization';\n\ninterface Response extends BackendResponse {\n localization: Localization;\n}\n\nexport interface CreateLocalizationPayload {\n name: string;\n language: string;\n}\n\nfunction createLocalization(\n payload: CreateLocalizationPayload,\n): Promise<Response> {\n return apiClient.post(`localizations`, payload).then(r => r.data);\n}\n\nexport function useCreateLocalization(\n form: UseFormReturn<CreateLocalizationPayload>,\n) {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (props: CreateLocalizationPayload) => createLocalization(props),\n onSuccess: () => {\n toast(message('Localization created'));\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('localizations'),\n });\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n","import {useForm} from 'react-hook-form';\nimport {Dialog} from '../../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../../ui/overlays/dialog/dialog-header';\nimport {Trans} from '../../i18n/trans';\nimport {DialogBody} from '../../ui/overlays/dialog/dialog-body';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {Form} from '../../ui/forms/form';\nimport {FormTextField} from '../../ui/forms/input-field/text-field/text-field';\nimport {useValueLists} from '../../http/value-lists';\nimport {FormSelect, Option} from '../../ui/forms/select/select';\nimport {DialogFooter} from '../../ui/overlays/dialog/dialog-footer';\nimport {Button} from '../../ui/buttons/button';\nimport {\n CreateLocalizationPayload,\n useCreateLocalization,\n} from './create-localization';\nimport {message} from '@common/i18n/message';\nimport {useTrans} from '@common/i18n/use-trans';\n\nexport function CreateLocationDialog() {\n const {trans} = useTrans();\n const {formId, close} = useDialogContext();\n const form = useForm<CreateLocalizationPayload>({\n defaultValues: {\n language: 'en',\n },\n });\n\n const {data} = useValueLists(['languages']);\n const languages = data?.languages || [];\n\n const createLocalization = useCreateLocalization(form);\n\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Create localization\" />\n </DialogHeader>\n <DialogBody>\n <Form\n form={form}\n id={formId}\n onSubmit={values => {\n createLocalization.mutate(values, {onSuccess: close});\n }}\n >\n <FormTextField\n autoFocus\n name=\"name\"\n label={<Trans message=\"Name\" />}\n className=\"mb-30\"\n required\n />\n <FormSelect\n required\n name=\"language\"\n label={<Trans message=\"Language\" />}\n selectionMode=\"single\"\n showSearchField\n searchPlaceholder={trans(message('Search languages'))}\n >\n {languages.map(language => (\n <Option value={language.code} key={language.code}>\n {language.name}\n </Option>\n ))}\n </FormSelect>\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button onClick={close}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n form={formId}\n disabled={createLocalization.isPending}\n >\n <Trans message=\"Save\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","export default \"__VITE_ASSET__5bb85b7d__\"","import {useMutation} from '@tanstack/react-query';\nimport {toast} from '../../ui/toast/toast';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {message} from '../../i18n/message';\nimport {DatatableDataQueryKey} from '../../datatable/requests/paginated-resources';\nimport {Localization} from '../../i18n/localization';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\nimport {getLocalWithLinesQueryKey} from './use-locale-with-lines';\nimport {UploadedFile} from '@common/uploads/uploaded-file';\n\ninterface Response extends BackendResponse {\n localization: Localization;\n}\n\ninterface Payload {\n file: UploadedFile;\n localeId: string | number;\n}\n\nexport function useUploadTranslationFile() {\n return useMutation({\n mutationFn: (payload: Payload) => uploadFile(payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('localizations'),\n });\n await queryClient.invalidateQueries({\n queryKey: getLocalWithLinesQueryKey(),\n });\n toast(message('Translation file uploaded'));\n },\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction uploadFile({localeId, file}: Payload): Promise<Response> {\n const data = new FormData();\n data.append('file', file.native);\n return apiClient\n .post(`localizations/${localeId}/upload`, data)\n .then(r => r.data);\n}\n","import React, {Fragment} from 'react';\nimport {Link} from 'react-router-dom';\nimport {DataTablePage} from '../../datatable/page/data-table-page';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {FormattedDate} from '../../i18n/formatted-date';\nimport {ColumnConfig} from '../../datatable/column-config';\nimport {Trans} from '../../i18n/trans';\nimport {Localization} from '../../i18n/localization';\nimport {TranslateIcon} from '../../icons/material/Translate';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {UpdateLocalizationDialog} from './update-localization-dialog';\nimport {Tooltip} from '../../ui/tooltip/tooltip';\nimport {CreateLocationDialog} from './create-localization-dialog';\nimport {DataTableEmptyStateMessage} from '../../datatable/page/data-table-emty-state-message';\nimport aroundTheWorldSvg from './around-the-world.svg';\nimport {DataTableAddItemButton} from '../../datatable/data-table-add-item-button';\nimport {DeleteSelectedItemsAction} from '../../datatable/page/delete-selected-items-action';\nimport {\n Menu,\n MenuItem,\n MenuTrigger,\n} from '@common/ui/navigation/menu/menu-trigger';\nimport {openDialog} from '@common/ui/overlays/store/dialog-store';\nimport {downloadFileFromUrl} from '@common/uploads/utils/download-file-from-url';\nimport {MoreVertIcon} from '@common/icons/material/MoreVert';\nimport {UploadInputType} from '@common/uploads/types/upload-input-config';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {useUploadTranslationFile} from '@common/admin/translations/use-upload-translation-file';\nimport {openUploadWindow} from '@common/uploads/utils/open-upload-window';\n\nconst columnConfig: ColumnConfig<Localization>[] = [\n {\n key: 'name',\n allowsSorting: true,\n sortingKey: 'name',\n visibleInMode: 'all',\n width: 'flex-3 min-w-200',\n header: () => <Trans message=\"Name\" />,\n body: locale => locale.name,\n },\n {\n key: 'language',\n allowsSorting: true,\n sortingKey: 'language',\n header: () => <Trans message=\"Language code\" />,\n body: locale => locale.language,\n },\n {\n key: 'updatedAt',\n allowsSorting: true,\n width: 'w-100',\n header: () => <Trans message=\"Last updated\" />,\n body: locale => <FormattedDate date={locale.updated_at} />,\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n align: 'end',\n width: 'w-84 flex-shrink-0',\n visibleInMode: 'all',\n body: locale => {\n return (\n <div className=\"text-muted\">\n <Tooltip label={<Trans message=\"Translate\" />}>\n <IconButton\n size=\"md\"\n elementType={Link}\n to={`${locale.id}/translate`}\n >\n <TranslateIcon />\n </IconButton>\n </Tooltip>\n\n <FileUploadProvider>\n <RowActionsMenuTrigger locale={locale} />\n </FileUploadProvider>\n </div>\n );\n },\n },\n];\n\nexport function LocalizationIndex() {\n return (\n <DataTablePage\n endpoint=\"localizations\"\n title={<Trans message=\"Localizations\" />}\n columns={columnConfig}\n actions={<Actions />}\n selectedActions={<DeleteSelectedItemsAction />}\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={aroundTheWorldSvg}\n title={<Trans message=\"No localizations have been created yet\" />}\n filteringTitle={<Trans message=\"No matching localizations\" />}\n />\n }\n />\n );\n}\n\nfunction Actions() {\n return (\n <Fragment>\n <DialogTrigger type=\"modal\">\n <DataTableAddItemButton>\n <Trans message=\"Add new localization\" />\n </DataTableAddItemButton>\n <CreateLocationDialog />\n </DialogTrigger>\n </Fragment>\n );\n}\n\ninterface RowActionsMenuTriggerProps {\n locale: Localization;\n}\nfunction RowActionsMenuTrigger({locale}: RowActionsMenuTriggerProps) {\n const uploadFile = useUploadTranslationFile();\n return (\n <MenuTrigger>\n <IconButton disabled={uploadFile.isPending}>\n <MoreVertIcon />\n </IconButton>\n <Menu>\n <MenuItem\n value=\"translate\"\n elementType={Link}\n to={`${locale.id}/translate`}\n >\n <Trans message=\"Translate\" />\n </MenuItem>\n <MenuItem\n value=\"rename\"\n onSelected={() =>\n openDialog(UpdateLocalizationDialog, {localization: locale})\n }\n >\n <Trans message=\"Rename\" />\n </MenuItem>\n <MenuItem\n value=\"download\"\n onSelected={() =>\n downloadFileFromUrl(`api/v1/localizations/${locale.id}/download`)\n }\n >\n <Trans message=\"Download\" />\n </MenuItem>\n <MenuItem\n value=\"upload\"\n onSelected={async () => {\n const files = await openUploadWindow({\n types: [UploadInputType.json],\n });\n if (files.length == 1) {\n uploadFile.mutate({localeId: locale.id, file: files[0]});\n }\n }}\n >\n <Trans message=\"Upload\" />\n </MenuItem>\n </Menu>\n </MenuTrigger>\n );\n}\n","import {useForm} from 'react-hook-form';\nimport {Dialog} from '../../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../../ui/overlays/dialog/dialog-header';\nimport {Trans} from '../../i18n/trans';\nimport {DialogBody} from '../../ui/overlays/dialog/dialog-body';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {Form} from '../../ui/forms/form';\nimport {FormTextField} from '../../ui/forms/input-field/text-field/text-field';\nimport {DialogFooter} from '../../ui/overlays/dialog/dialog-footer';\nimport {Button} from '../../ui/buttons/button';\nimport {SectionHelper} from '../../ui/section-helper';\n\ninterface FormValue {\n key: string;\n value: string;\n}\n\nexport function NewTranslationDialog() {\n const {formId, close} = useDialogContext();\n const form = useForm<FormValue>();\n\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Add translation\" />\n </DialogHeader>\n <DialogBody>\n <Form\n form={form}\n id={formId}\n onSubmit={values => {\n close(values);\n }}\n >\n <SectionHelper\n className=\"mb-30\"\n title={\n <Trans message=\"Add a new translation, if it does not exist already.\" />\n }\n description={\n <Trans message=\"This should only need to be done for things like custom menu items.\" />\n }\n />\n <FormTextField\n inputElementType=\"textarea\"\n rows={2}\n autoFocus\n name=\"key\"\n label={<Trans message=\"Translation key\" />}\n className=\"mb-30\"\n required\n />\n <FormTextField\n inputElementType=\"textarea\"\n rows={2}\n name=\"value\"\n label={<Trans message=\"Translation value\" />}\n required\n />\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button onClick={close}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button variant=\"flat\" color=\"primary\" type=\"submit\" form={formId}>\n <Trans message=\"Add\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import React, {useMemo, useRef, useState} from 'react';\nimport {useParams} from 'react-router-dom';\nimport {useLocaleWithLines} from './use-locale-with-lines';\nimport {Trans} from '../../i18n/trans';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {Button} from '../../ui/buttons/button';\nimport {Breadcrumb} from '../../ui/breadcrumbs/breadcrumb';\nimport {BreadcrumbItem} from '../../ui/breadcrumbs/breadcrumb-item';\nimport {TextField} from '../../ui/forms/input-field/text-field/text-field';\nimport {useTrans} from '../../i18n/use-trans';\nimport {SearchIcon} from '../../icons/material/Search';\nimport {CloseIcon} from '../../icons/material/Close';\nimport {AddIcon} from '../../icons/material/Add';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {NewTranslationDialog} from './new-translation-dialog';\nimport {useUpdateLocalization} from './update-localization';\nimport {Localization} from '../../i18n/localization';\nimport {FullPageLoader} from '../../ui/progress/full-page-loader';\nimport {useIsMobileMediaQuery} from '../../utils/hooks/is-mobile-media-query';\nimport {useVirtualizer} from '@tanstack/react-virtual';\nimport {useNavigate} from '../../utils/hooks/use-navigate';\nimport {useUploadTranslationFile} from '@common/admin/translations/use-upload-translation-file';\nimport {\n Menu,\n MenuItem,\n MenuTrigger,\n} from '@common/ui/navigation/menu/menu-trigger';\nimport {MoreVertIcon} from '@common/icons/material/MoreVert';\nimport {downloadFileFromUrl} from '@common/uploads/utils/download-file-from-url';\nimport {openUploadWindow} from '@common/uploads/utils/open-upload-window';\nimport {UploadInputType} from '@common/uploads/types/upload-input-config';\n\ntype Lines = Record<string, string>;\n\nexport function TranslationManagementPage() {\n const {localeId} = useParams();\n\n const {data, isLoading} = useLocaleWithLines(localeId!);\n const localization = data?.localization;\n\n if (isLoading || !localization) {\n return <FullPageLoader />;\n }\n\n return <Form localization={localization} />;\n}\n\ninterface FormProps {\n localization: Localization;\n}\nfunction Form({localization}: FormProps) {\n const [lines, setLines] = useState<Lines>(localization.lines || {});\n\n const navigate = useNavigate();\n const updateLocalization = useUpdateLocalization();\n const [searchQuery, setSearchQuery] = useState<string>('');\n\n return (\n <form\n className=\"flex h-full flex-col p-14 md:p-24\"\n onSubmit={e => {\n e.preventDefault();\n updateLocalization.mutate(\n {id: localization.id, lines},\n {\n onSuccess: () => {\n navigate('/admin/localizations');\n },\n },\n );\n }}\n >\n <Header\n localization={localization}\n setLines={setLines}\n lines={lines}\n searchQuery={searchQuery}\n setSearchQuery={setSearchQuery}\n isLoading={updateLocalization.isPending}\n />\n <LinesList lines={lines} setLines={setLines} searchQuery={searchQuery} />\n </form>\n );\n}\n\ninterface HeaderProps {\n localization: Localization;\n lines: Lines;\n setLines: (lines: Lines) => void;\n searchQuery: string;\n setSearchQuery: (value: string) => void;\n isLoading: boolean;\n}\nfunction Header({\n localization,\n searchQuery,\n setSearchQuery,\n isLoading,\n lines,\n setLines,\n}: HeaderProps) {\n const navigate = useNavigate();\n const isMobile = useIsMobileMediaQuery();\n const {trans} = useTrans();\n\n return (\n <div className=\"flex-shrink-0\">\n <Breadcrumb size=\"lg\" className=\"mb-16\">\n <BreadcrumbItem\n onSelected={() => {\n navigate('/admin/localizations');\n }}\n >\n <Trans message=\"Localizations\" />\n </BreadcrumbItem>\n <BreadcrumbItem>\n <Trans\n message=\":locale translations\"\n values={{locale: localization.name}}\n />\n </BreadcrumbItem>\n </Breadcrumb>\n <div className=\"mb-24 flex items-center gap-32 md:gap-12\">\n <div className=\"max-w-440 flex-auto\">\n <TextField\n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n startAdornment={<SearchIcon />}\n placeholder={trans({message: 'Type to search...'})}\n />\n </div>\n <DialogTrigger\n type=\"modal\"\n onClose={newTranslation => {\n if (newTranslation) {\n const newLines = {...lines};\n newLines[newTranslation.key] = newTranslation.value;\n setLines(newLines);\n }\n }}\n >\n {!isMobile && (\n <Button\n className=\"ml-auto\"\n variant=\"outline\"\n color=\"primary\"\n startIcon={<AddIcon />}\n >\n <Trans message=\"Add new\" />\n </Button>\n )}\n <NewTranslationDialog />\n </DialogTrigger>\n <ActionsMenuTrigger locale={localization} />\n <Button\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n disabled={isLoading}\n >\n {isMobile ? (\n <Trans message=\"Save\" />\n ) : (\n <Trans message=\"Save translations\" />\n )}\n </Button>\n </div>\n </div>\n );\n}\n\ninterface LinesListProps {\n searchQuery?: string;\n lines: Lines;\n setLines: (lines: Lines) => void;\n}\nfunction LinesList({searchQuery, lines, setLines}: LinesListProps) {\n const filteredLines = useMemo(() => {\n return Object.entries(lines).filter(([id, translation]) => {\n const lowerCaseQuery = searchQuery?.toLowerCase();\n return (\n !lowerCaseQuery ||\n id?.toLowerCase().includes(lowerCaseQuery) ||\n translation?.toLowerCase().includes(lowerCaseQuery)\n );\n });\n }, [lines, searchQuery]);\n\n const ref = useRef<HTMLDivElement>(null);\n const rowVirtualizer = useVirtualizer({\n count: filteredLines.length,\n getScrollElement: () => ref.current,\n estimateSize: () => 123,\n });\n\n return (\n <div className=\"flex-auto overflow-y-auto\" ref={ref}>\n <div\n className=\"relative w-full\"\n style={{\n height: `${rowVirtualizer.getTotalSize()}px`,\n }}\n >\n {rowVirtualizer.getVirtualItems().map(virtualItem => {\n const [id, translation] = filteredLines[virtualItem.index];\n return (\n <div\n key={id}\n className=\"absolute left-0 top-0 w-full\"\n style={{\n height: `${virtualItem.size}px`,\n transform: `translateY(${virtualItem.start}px)`,\n }}\n >\n <div className=\"mb-10 rounded border md:mr-10\">\n <div className=\"flex items-center justify-between gap-24 border-b px-10 py-2\">\n <label\n className=\"flex-auto text-xs font-semibold\"\n htmlFor={id}\n >\n {id}\n </label>\n <IconButton\n size=\"xs\"\n className=\"text-muted\"\n onClick={() => {\n const newLines = {...lines};\n delete newLines[id];\n setLines(newLines);\n }}\n >\n <CloseIcon />\n </IconButton>\n </div>\n <div>\n <textarea\n id={id}\n name={id}\n defaultValue={translation}\n className=\"block w-full resize-none rounded bg-inherit p-10 text-sm outline-none focus-visible:ring-2\"\n rows={2}\n onChange={e => {\n const newLines = {...lines};\n newLines[id] = e.target.value;\n setLines(newLines);\n }}\n />\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface ActionsMenuTriggerProps {\n locale: Localization;\n}\nfunction ActionsMenuTrigger({locale}: ActionsMenuTriggerProps) {\n const uploadFile = useUploadTranslationFile();\n return (\n <MenuTrigger>\n <IconButton\n variant=\"outline\"\n size=\"sm\"\n color=\"primary\"\n disabled={uploadFile.isPending}\n >\n <MoreVertIcon />\n </IconButton>\n <Menu>\n <MenuItem\n value=\"download\"\n onSelected={() =>\n downloadFileFromUrl(`api/v1/localizations/${locale.id}/download`)\n }\n >\n <Trans message=\"Download\" />\n </MenuItem>\n <MenuItem\n value=\"upload\"\n onSelected={async () => {\n const files = await openUploadWindow({\n types: [UploadInputType.json],\n });\n if (files.length == 1) {\n uploadFile.mutate({localeId: locale.id, file: files[0]});\n }\n }}\n >\n <Trans message=\"Upload\" />\n </MenuItem>\n </Menu>\n </MenuTrigger>\n );\n}\n","import {useContext} from 'react';\nimport {\n AdConfig,\n SiteConfigContext,\n} from '../../core/settings/site-config-context';\nimport {Form} from '../../ui/forms/form';\nimport {useForm} from 'react-hook-form';\nimport {FormTextField} from '../../ui/forms/input-field/text-field/text-field';\nimport {Trans} from '../../i18n/trans';\nimport {Button} from '../../ui/buttons/button';\nimport {FormSwitch} from '../../ui/forms/toggle/switch';\nimport {useAdminSettings} from '../settings/requests/use-admin-settings';\nimport {ProgressCircle} from '../../ui/progress/progress-circle';\nimport {Settings} from '../../core/settings/settings';\nimport {\n AdminSettingsWithFiles,\n useUpdateAdminSettings,\n} from '../settings/requests/update-admin-settings';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {ImageZoomDialog} from '../../ui/overlays/dialog/image-zoom-dialog';\nimport {StaticPageTitle} from '../../seo/static-page-title';\n\nexport function AdsPage() {\n const query = useAdminSettings();\n\n return (\n <div className=\"container mx-auto p-12 md:p-24\">\n <StaticPageTitle>\n <Trans message=\"Ads\" />\n </StaticPageTitle>\n <h1 className=\"mb-20 text-2xl font-light md:mb-40 md:text-3xl\">\n <Trans message=\"Predefined Ad slots\" />\n </h1>\n {query.isLoading ? (\n <ProgressCircle isIndeterminate />\n ) : (\n <AdsForm defaultValues={query.data?.client.ads || {}} />\n )}\n </div>\n );\n}\n\ninterface AdsFormProps {\n defaultValues: Settings['ads'];\n}\nfunction AdsForm({defaultValues}: AdsFormProps) {\n const {\n admin: {ads},\n } = useContext(SiteConfigContext);\n\n const form = useForm<AdminSettingsWithFiles>({\n defaultValues: {client: {ads: defaultValues}},\n });\n const updateSettings = useUpdateAdminSettings(form);\n\n return (\n <Form\n form={form}\n onSubmit={value => {\n updateSettings.mutate(value);\n }}\n >\n {ads.map(ad => {\n return <AdSection key={ad.slot} adConfig={ad} />;\n })}\n <FormSwitch\n name=\"client.ads.disable\"\n className=\"mb-30\"\n description={\n <Trans message=\"Disable all add related functionality across the site.\" />\n }\n >\n <Trans message=\"Disable ads\" />\n </FormSwitch>\n <Button\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n disabled={updateSettings.isPending}\n >\n <Trans message=\"Save\" />\n </Button>\n </Form>\n );\n}\n\ninterface AdSectionProps {\n adConfig: AdConfig;\n}\nfunction AdSection({adConfig}: AdSectionProps) {\n return (\n <div className=\"flex items-center gap-24\">\n <FormTextField\n className=\"mb-30 flex-auto\"\n name={`client.${adConfig.slot}`}\n inputElementType=\"textarea\"\n rows={8}\n label={<Trans {...adConfig.description} />}\n />\n <DialogTrigger type=\"modal\">\n <button\n type=\"button\"\n className=\"cursor-zoom-in overflow-hidden rounded outline-none transition hover:scale-105 focus-visible:ring max-md:hidden\"\n >\n <img\n src={adConfig.image}\n className=\"h-[186px] w-auto border\"\n alt=\"Ad slot example\"\n />\n </button>\n <ImageZoomDialog image={adConfig.image} />\n </DialogTrigger>\n </div>\n );\n}\n","import {NavLink} from 'react-router-dom';\nimport {AppearanceButton} from './appearance-button';\nimport {useAppearanceStore} from './appearance-store';\nimport {Trans} from '../../i18n/trans';\nimport {Fragment, useMemo} from 'react';\n\nexport function SectionList() {\n const sections = useAppearanceStore(s => s.config?.sections);\n const sortedSection = useMemo(() => {\n if (!sections) return [];\n return Object.entries(sections || [])\n .map(([key, value]) => {\n return {\n ...value,\n key,\n };\n })\n .sort((a, b) => (a?.position || 1) - (b?.position || 1));\n }, [sections]);\n\n return (\n <Fragment>\n {sortedSection.map(section => {\n return (\n <AppearanceButton\n key={section.key}\n to={section.key}\n elementType={NavLink}\n >\n <Trans {...section.label} />\n </AppearanceButton>\n );\n })}\n </Fragment>\n );\n}\n","import {\n BackendFilter,\n FilterControlType,\n FilterOperator,\n} from '../../datatable/filters/backend-filter';\nimport {message} from '../../i18n/message';\nimport {\n createdAtFilter,\n updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\n\nexport const RoleIndexPageFilters: BackendFilter[] = [\n {\n key: 'type',\n label: message('Type'),\n description: message('Type of the role'),\n defaultOperator: FilterOperator.ne,\n control: {\n type: FilterControlType.Select,\n defaultValue: '01',\n options: [\n {\n key: '01',\n label: message('Sitewide'),\n value: 'sitewide',\n },\n {\n key: '02',\n label: message('Workspace'),\n value: 'workspace',\n },\n ],\n },\n },\n createdAtFilter({\n description: message('Date role was created'),\n }),\n updatedAtFilter({\n description: message('Date role was last updated'),\n }),\n];\n","import React, {Fragment} from 'react';\nimport {Link} from 'react-router-dom';\nimport {DataTablePage} from '../../datatable/page/data-table-page';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {EditIcon} from '../../icons/material/Edit';\nimport {FormattedDate} from '../../i18n/formatted-date';\nimport {ColumnConfig} from '../../datatable/column-config';\nimport {Trans} from '../../i18n/trans';\nimport {Role} from '../../auth/role';\nimport teamSvg from './team.svg';\nimport {DeleteSelectedItemsAction} from '../../datatable/page/delete-selected-items-action';\nimport {DataTableEmptyStateMessage} from '../../datatable/page/data-table-emty-state-message';\nimport {RoleIndexPageFilters} from './role-index-page-filters';\nimport {DataTableExportCsvButton} from '../../datatable/csv-export/data-table-export-csv-button';\nimport {DataTableAddItemButton} from '../../datatable/data-table-add-item-button';\n\nconst columnConfig: ColumnConfig<Role>[] = [\n {\n key: 'name',\n allowsSorting: true,\n visibleInMode: 'all',\n header: () => <Trans message=\"Role\" />,\n body: role => (\n <div>\n <div>\n <Trans message={role.name} />\n </div>\n <div className=\"text-muted text-xs overflow-x-hidden overflow-ellipsis\">\n {role.description ? <Trans message={role.description} /> : undefined}\n </div>\n </div>\n ),\n },\n {\n key: 'type',\n maxWidth: 'max-w-100',\n allowsSorting: true,\n header: () => <Trans message=\"Type\" />,\n body: role => <Trans message={role.type} />,\n },\n {\n key: 'updated_at',\n maxWidth: 'max-w-100',\n allowsSorting: true,\n header: () => <Trans message=\"Last updated\" />,\n body: role => <FormattedDate date={role.updated_at} />,\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n visibleInMode: 'all',\n align: 'end',\n width: 'w-42 flex-shrink-0',\n body: role => {\n return (\n <Link to={`${role.id}/edit`}>\n <IconButton size=\"md\" className=\"text-muted\">\n <EditIcon />\n </IconButton>\n </Link>\n );\n },\n },\n];\n\nexport function RolesIndexPage() {\n return (\n <DataTablePage\n endpoint=\"roles\"\n title={<Trans message=\"Roles\" />}\n columns={columnConfig}\n filters={RoleIndexPageFilters}\n actions={<Actions />}\n selectedActions={<DeleteSelectedItemsAction />}\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={teamSvg}\n title={<Trans message=\"No roles have been created yet\" />}\n filteringTitle={<Trans message=\"No matching roles\" />}\n />\n }\n />\n );\n}\n\nfunction Actions() {\n return (\n <Fragment>\n <DataTableExportCsvButton endpoint=\"roles/csv/export\" />\n <DataTableAddItemButton elementType={Link} to=\"new\">\n <Trans message=\"Add new role\" />\n </DataTableAddItemButton>\n </Fragment>\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient} from '@common/http/query-client';\nimport {Role} from '@common/auth/role';\nimport {useParams} from 'react-router-dom';\n\nconst Endpoint = (id: number | string) => `roles/${id}`;\n\nexport interface FetchRoleResponse extends BackendResponse {\n role: Role;\n}\n\nexport function useRole() {\n const {roleId} = useParams();\n return useQuery({\n queryKey: [Endpoint(roleId!)],\n queryFn: () => fetchRole(roleId!),\n });\n}\n\nfunction fetchRole(roleId: number | string): Promise<FetchRoleResponse> {\n return apiClient.get(Endpoint(roleId)).then(response => response.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '../../../http/query-client';\nimport {BackendResponse} from '../../../http/backend-response/backend-response';\nimport {toast} from '../../../ui/toast/toast';\nimport {Role} from '../../../auth/role';\nimport {useTrans} from '../../../i18n/use-trans';\nimport {message} from '../../../i18n/message';\nimport {DatatableDataQueryKey} from '../../../datatable/requests/paginated-resources';\nimport {showHttpErrorToast} from '../../../utils/http/show-http-error-toast';\nimport {useNavigate} from '../../../utils/hooks/use-navigate';\n\ninterface Response extends BackendResponse {\n role: Role;\n}\n\ninterface Payload extends Partial<Role> {\n id: number;\n}\n\nconst Endpoint = (id: number) => `roles/${id}`;\n\nexport function useUpdateRole() {\n const {trans} = useTrans();\n const navigate = useNavigate();\n return useMutation({\n mutationFn: (payload: Payload) => updateRole(payload),\n onSuccess: response => {\n toast(trans(message('Role updated')));\n queryClient.invalidateQueries({queryKey: [Endpoint(response.role.id)]});\n queryClient.invalidateQueries({queryKey: DatatableDataQueryKey('roles')});\n navigate('/admin/roles');\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction updateRole({id, ...payload}: Payload): Promise<Response> {\n return apiClient.put(Endpoint(id), payload).then(r => r.data);\n}\n","import {Role} from '../../../auth/role';\nimport {useTrans} from '../../../i18n/use-trans';\nimport {useFormContext} from 'react-hook-form';\nimport {FormTextField} from '../../../ui/forms/input-field/text-field/text-field';\nimport {Trans} from '../../../i18n/trans';\nimport {message} from '../../../i18n/message';\nimport {FormSelect} from '../../../ui/forms/select/select';\nimport {Item} from '../../../ui/forms/listbox/item';\nimport {FormSwitch} from '../../../ui/forms/toggle/switch';\nimport {FormPermissionSelector} from '../../../auth/ui/permission-selector';\nimport {useSettings} from '../../../core/settings/use-settings';\nimport {Button} from '@common/ui/buttons/button';\n\ninterface CrupdateRolePageSettingsPanelProps {\n isInternal?: boolean;\n}\nexport function CrupdateRolePageSettingsPanel({\n isInternal = false,\n}: CrupdateRolePageSettingsPanelProps) {\n const {trans} = useTrans();\n const {workspaces} = useSettings();\n const {watch, setValue} = useFormContext<Role>();\n const watchedType = watch('type');\n\n return (\n <>\n <FormTextField\n label={<Trans message=\"Name\" />}\n name=\"name\"\n className=\"mb-20\"\n required\n />\n <FormTextField\n label={<Trans message=\"Description\" />}\n name=\"description\"\n inputElementType=\"textarea\"\n placeholder={trans(message('Role description...'))}\n rows={4}\n className=\"mb-20\"\n />\n {workspaces.integrated && (\n <FormSelect\n label={<Trans message=\"Type\" />}\n name=\"type\"\n selectionMode=\"single\"\n className=\"mb-20\"\n description={\n <Trans message=\"Whether this role will be assigned to users globally on the site or only within workspaces.\" />\n }\n >\n <Item value=\"sitewide\">\n <Trans message=\"Sitewide\" />\n </Item>\n <Item value=\"workspace\">\n <Trans message=\"Workspace\" />\n </Item>\n </FormSelect>\n )}\n {!isInternal && (\n <>\n <FormSwitch\n name=\"default\"\n className=\"mb-20\"\n description={\n <Trans message=\"Assign this role to new users automatically.\" />\n }\n >\n <Trans message=\"Default\" />\n </FormSwitch>\n {watchedType === 'sitewide' && (\n <FormSwitch\n name=\"guests\"\n description={\n <Trans message=\"Assign this role to guests (not logged in users).\" />\n }\n >\n <Trans message=\"Guests\" />\n </FormSwitch>\n )}\n </>\n )}\n <div className=\"mb-14 mt-30 flex items-end justify-between gap-12\">\n <h2 className=\"text-lg leading-tight\">\n <Trans message=\"Permissions\" />\n </h2>\n <Button\n variant=\"outline\"\n size=\"xs\"\n onClick={() => setValue('permissions', [])}\n >\n <Trans message=\"Remove all\" />\n </Button>\n </div>\n <FormPermissionSelector\n name=\"permissions\"\n valueListKey={\n watchedType === 'sitewide' ? 'permissions' : 'workspacePermissions'\n }\n />\n </>\n );\n}\n","import {Dialog} from '../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../ui/overlays/dialog/dialog-header';\nimport {Trans} from '../i18n/trans';\nimport {DialogBody} from '../ui/overlays/dialog/dialog-body';\nimport {TextField} from '../ui/forms/input-field/text-field/text-field';\nimport {SearchIcon} from '../icons/material/Search';\nimport {useState} from 'react';\nimport {useTrans} from '../i18n/use-trans';\nimport {message} from '../i18n/message';\nimport {Avatar} from '../ui/images/avatar';\nimport {NormalizedModel} from '../datatable/filters/normalized-model';\nimport {IllustratedMessage} from '../ui/images/illustrated-message';\nimport {SvgImage} from '../ui/images/svg-image/svg-image';\nimport teamSvg from '../admin/roles/team.svg';\nimport {useDialogContext} from '../ui/overlays/dialog/dialog-context';\nimport {useNormalizedModels} from './queries/use-normalized-models';\n\ninterface SelectUserDialogProps {\n onUserSelected: (user: NormalizedModel) => void;\n}\n\nexport function SelectUserDialog({onUserSelected}: SelectUserDialogProps) {\n const {close} = useDialogContext();\n const [searchTerm, setSearchTerm] = useState<string>('');\n const {trans} = useTrans();\n const query = useNormalizedModels('normalized-models/user', {\n query: searchTerm,\n perPage: 14,\n });\n const users = query.data?.results || [];\n\n const emptyStateMessage = (\n <IllustratedMessage\n className=\"pt-20\"\n size=\"sm\"\n title={<Trans message=\"No matching users\" />}\n description={<Trans message=\"Try another search query\" />}\n image={<SvgImage src={teamSvg} />}\n />\n );\n\n const selectUser = (user: NormalizedModel) => {\n close();\n onUserSelected(user);\n };\n\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Select a user\" />\n </DialogHeader>\n <DialogBody>\n <TextField\n autoFocus\n className=\"mb-20\"\n startAdornment={<SearchIcon />}\n placeholder={trans(message('Search for user by name or email'))}\n value={searchTerm}\n onChange={e => {\n setSearchTerm(e.target.value);\n }}\n />\n {!query.isLoading && !users.length && emptyStateMessage}\n <div className=\"grid grid-cols-2 gap-x-10\">\n {users.map(user => (\n <UserListItem\n key={user.id}\n user={user}\n onUserSelected={selectUser}\n />\n ))}\n </div>\n </DialogBody>\n </Dialog>\n );\n}\n\ninterface UserListItemProps {\n user: NormalizedModel;\n onUserSelected: (user: NormalizedModel) => void;\n}\nfunction UserListItem({user, onUserSelected}: UserListItemProps) {\n return (\n <div\n key={user.id}\n className=\"flex items-center gap-10 rounded p-10 outline-none ring-offset-4 hover:bg-hover focus-visible:ring\"\n role=\"button\"\n tabIndex={0}\n onClick={() => {\n onUserSelected(user);\n }}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onUserSelected(user);\n }\n }}\n >\n <Avatar src={user.image} />\n <div className=\"overflow-hidden\">\n <div className=\"overflow-hidden text-ellipsis\">{user.name}</div>\n <div className=\"overflow-hidden text-ellipsis text-muted\">\n {user.description}\n </div>\n </div>\n </div>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '../../../http/query-client';\nimport {BackendResponse} from '../../../http/backend-response/backend-response';\nimport {toast} from '../../../ui/toast/toast';\nimport {message} from '../../../i18n/message';\nimport {Role} from '../../../auth/role';\nimport {showHttpErrorToast} from '../../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n userIds: number[];\n}\n\nexport function useRemoveUsersFromRole(role: Role) {\n return useMutation({\n mutationFn: ({userIds}: Payload) =>\n removeUsersFromRole({userIds, roleId: role.id}),\n onSuccess: (response, payload) => {\n toast(\n message('Removed [one 1 user|other :count users] from “{role}“', {\n values: {count: payload.userIds.length, role: role.name},\n }),\n );\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction removeUsersFromRole({\n roleId,\n userIds,\n}: Payload & {roleId: number}): Promise<Response> {\n return apiClient\n .post(`roles/${roleId}/remove-users`, {userIds})\n .then(r => r.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '../../../http/query-client';\nimport {BackendResponse} from '../../../http/backend-response/backend-response';\nimport {toast} from '../../../ui/toast/toast';\nimport {message} from '../../../i18n/message';\nimport {Role} from '../../../auth/role';\nimport {showHttpErrorToast} from '../../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n userIds: number[];\n}\n\nexport function useAddUsersToRole(role: Role) {\n return useMutation({\n mutationFn: ({userIds}: Payload) =>\n addUsersToRole({userIds, roleId: role.id}),\n onSuccess: (response, payload) => {\n toast(\n message('Assigned [one 1 user|other :count users] to {role}', {\n values: {count: payload.userIds.length, role: role.name},\n }),\n );\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction addUsersToRole({\n roleId,\n userIds,\n}: Payload & {roleId: number}): Promise<Response> {\n return apiClient\n .post(`roles/${roleId}/add-users`, {userIds})\n .then(r => r.data);\n}\n","import {Role} from '../../../auth/role';\nimport {ColumnConfig} from '../../../datatable/column-config';\nimport {User} from '../../../auth/user';\nimport {Trans} from '../../../i18n/trans';\nimport {NameWithAvatar} from '../../../datatable/column-templates/name-with-avatar';\nimport {FormattedDate} from '../../../i18n/formatted-date';\nimport React from 'react';\nimport teamSvg from '../team.svg';\nimport {DialogTrigger} from '../../../ui/overlays/dialog/dialog-trigger';\nimport {Button} from '../../../ui/buttons/button';\nimport {SelectUserDialog} from '../../../users/select-user-dialog';\nimport {queryClient} from '../../../http/query-client';\nimport {DatatableDataQueryKey} from '../../../datatable/requests/paginated-resources';\nimport {DataTableEmptyStateMessage} from '../../../datatable/page/data-table-emty-state-message';\nimport {useDataTable} from '../../../datatable/page/data-table-context';\nimport {ConfirmationDialog} from '../../../ui/overlays/dialog/confirmation-dialog';\nimport {useRemoveUsersFromRole} from '../requests/use-remove-users-from-role';\nimport {useAddUsersToRole} from '../requests/use-add-users-to-role';\nimport {DataTable} from '../../../datatable/data-table';\nimport {useIsMobileMediaQuery} from '../../../utils/hooks/is-mobile-media-query';\n\nconst userColumn: ColumnConfig<User> = {\n key: 'name',\n allowsSorting: true,\n sortingKey: 'email',\n header: () => <Trans message=\"User\" />,\n body: user => (\n <NameWithAvatar\n image={user.avatar}\n label={user.display_name}\n description={user.email}\n />\n ),\n width: 'col-w-3',\n};\n\nconst desktopColumns: ColumnConfig<User>[] = [\n userColumn,\n {\n key: 'first_name',\n allowsSorting: true,\n header: () => <Trans message=\"First name\" />,\n body: user => user.first_name,\n },\n {\n key: 'last_name',\n allowsSorting: true,\n header: () => <Trans message=\"Last name\" />,\n body: user => user.last_name,\n },\n {\n key: 'created_at',\n allowsSorting: true,\n header: () => <Trans message=\"Assigned at\" />,\n body: user => <FormattedDate date={user.created_at} />,\n },\n];\n\nconst mobileColumns: ColumnConfig<User>[] = [userColumn];\n\ninterface CrupdateRolePageUsersPanelProps {\n role: Role;\n}\nexport function EditRolePageUsersPanel({\n role,\n}: CrupdateRolePageUsersPanelProps) {\n const isMobile = useIsMobileMediaQuery();\n\n if (role.guests || role.type === 'workspace') {\n return (\n <div className=\"pt-30 pb-10\">\n <DataTableEmptyStateMessage\n image={teamSvg}\n title={<Trans message=\"Users can't be assigned to this role\" />}\n />\n </div>\n );\n }\n\n return (\n <DataTable\n endpoint=\"users\"\n columns={isMobile ? mobileColumns : desktopColumns}\n queryParams={{roleId: `${role.id}`}}\n actions={<AssignUserAction role={role} />}\n selectedActions={<RemoveUsersAction role={role} />}\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={teamSvg}\n title={\n <Trans message=\"No users have been assigned to this role yet\" />\n }\n filteringTitle={<Trans message=\"No matching users\" />}\n />\n }\n />\n );\n}\n\ninterface AssignUserActionProps {\n role: Role;\n}\nfunction AssignUserAction({role}: AssignUserActionProps) {\n const addUsers = useAddUsersToRole(role);\n return (\n <DialogTrigger type=\"modal\">\n <Button variant=\"flat\" color=\"primary\" disabled={addUsers.isPending}>\n <Trans message=\"Assign user\" />\n </Button>\n <SelectUserDialog\n onUserSelected={user => {\n addUsers.mutate(\n {userIds: [user.id as number]},\n {\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('users', {\n roleId: `${role.id}`,\n }),\n });\n },\n },\n );\n }}\n />\n </DialogTrigger>\n );\n}\n\ntype RemoveUsersActionProps = {\n role: Role;\n};\nexport function RemoveUsersAction({role}: RemoveUsersActionProps) {\n const removeUsers = useRemoveUsersFromRole(role);\n const {selectedRows} = useDataTable();\n\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={isConfirmed => {\n if (isConfirmed) {\n removeUsers.mutate(\n {userIds: selectedRows as number[]},\n {\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('users', {\n roleId: `${role.id}`,\n }),\n });\n },\n },\n );\n }\n }}\n >\n <Button variant=\"flat\" color=\"danger\" disabled={removeUsers.isPending}>\n <Trans message=\"Remove users\" />\n </Button>\n <ConfirmationDialog\n title={\n <Trans\n message=\"Remove [one 1 user|other :count users] from “:name“ role?\"\n values={{count: selectedRows.length, name: role.name}}\n />\n }\n body={<Trans message=\"This will permanently remove the users.\" />}\n confirm={<Trans message=\"Remove\" />}\n isDanger\n />\n </DialogTrigger>\n );\n}\n","import {useRole} from '../requests/use-role';\nimport {FullPageLoader} from '../../../ui/progress/full-page-loader';\nimport {Role} from '../../../auth/role';\nimport {Trans} from '../../../i18n/trans';\nimport {useForm} from 'react-hook-form';\nimport {Tabs} from '../../../ui/tabs/tabs';\nimport {Tab} from '../../../ui/tabs/tab';\nimport {TabList} from '../../../ui/tabs/tab-list';\nimport {TabPanel, TabPanels} from '../../../ui/tabs/tab-panels';\nimport {useUpdateRole} from '../requests/use-update-role';\nimport {CrupdateResourceLayout} from '../../crupdate-resource-layout';\nimport {CrupdateRolePageSettingsPanel} from './crupdate-role-settings-panel';\nimport {EditRolePageUsersPanel} from './edit-role-page-users-panel';\n\nexport function EditRolePage() {\n const query = useRole();\n\n if (query.status !== 'success') {\n return <FullPageLoader />;\n }\n\n return <PageContent role={query.data.role} />;\n}\n\ninterface PageContentProps {\n role: Role;\n}\nfunction PageContent({role}: PageContentProps) {\n const form = useForm<Role>({defaultValues: role});\n const updateRole = useUpdateRole();\n\n return (\n <CrupdateResourceLayout\n form={form}\n onSubmit={values => {\n updateRole.mutate(values);\n }}\n title={<Trans message=\"Edit “:name“ role\" values={{name: role.name}} />}\n isLoading={updateRole.isPending}\n >\n <Tabs isLazy>\n <TabList>\n <Tab>\n <Trans message=\"Settings\" />\n </Tab>\n <Tab>\n <Trans message=\"Users\" />\n </Tab>\n </TabList>\n <TabPanels className=\"pt-20\">\n <TabPanel>\n <CrupdateRolePageSettingsPanel isInternal={role.internal} />\n </TabPanel>\n <TabPanel>\n <EditRolePageUsersPanel role={role} />\n </TabPanel>\n </TabPanels>\n </Tabs>\n </CrupdateResourceLayout>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '../../../http/query-client';\nimport {BackendResponse} from '../../../http/backend-response/backend-response';\nimport {toast} from '../../../ui/toast/toast';\nimport {Role} from '../../../auth/role';\nimport {useTrans} from '../../../i18n/use-trans';\nimport {message} from '../../../i18n/message';\nimport {DatatableDataQueryKey} from '../../../datatable/requests/paginated-resources';\nimport {onFormQueryError} from '../../../errors/on-form-query-error';\nimport {UseFormReturn} from 'react-hook-form';\n\ninterface Response extends BackendResponse {\n role: Role;\n}\n\nexport interface CreateRolePayload extends Partial<Role> {}\n\nconst Endpoint = 'roles';\n\nexport function useCreateRole(form: UseFormReturn<CreateRolePayload>) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (payload: CreateRolePayload) => createRole(payload),\n onSuccess: () => {\n toast(trans(message('Created new role')));\n queryClient.invalidateQueries({queryKey: DatatableDataQueryKey('roles')});\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction createRole({id, ...payload}: CreateRolePayload): Promise<Response> {\n return apiClient.post(Endpoint, payload).then(r => r.data);\n}\n","import {useForm} from 'react-hook-form';\nimport {CrupdateResourceLayout} from '../../crupdate-resource-layout';\nimport {Trans} from '../../../i18n/trans';\nimport {CrupdateRolePageSettingsPanel} from './crupdate-role-settings-panel';\nimport {CreateRolePayload, useCreateRole} from '../requests/user-create-role';\nimport {useNavigate} from '../../../utils/hooks/use-navigate';\n\nexport function CreateRolePage() {\n const form = useForm<CreateRolePayload>({defaultValues: {type: 'sitewide'}});\n const createRole = useCreateRole(form);\n const navigate = useNavigate();\n\n return (\n <CrupdateResourceLayout\n form={form}\n onSubmit={values => {\n createRole.mutate(values, {\n onSuccess: response => {\n navigate(`/admin/roles/${response.role.id}/edit`);\n },\n });\n }}\n title={<Trans message=\"Add new role\" />}\n isLoading={createRole.isPending}\n >\n <CrupdateRolePageSettingsPanel />\n </CrupdateResourceLayout>\n );\n}\n","import {\n BackendFilter,\n FilterControlType,\n FilterOperator,\n} from '../../datatable/filters/backend-filter';\nimport {message} from '../../i18n/message';\nimport {TagType} from '../../core/settings/site-config-context';\nimport {\n createdAtFilter,\n updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\n\nexport const TagIndexPageFilters = (types: TagType[]): BackendFilter[] => {\n return [\n {\n key: 'type',\n label: message('Type'),\n description: message('Type of the tag'),\n defaultOperator: FilterOperator.ne,\n control: {\n type: FilterControlType.Select,\n defaultValue: types[0].name,\n options: types.map(type => ({\n key: type.name,\n label: message(type.name),\n value: type.name,\n })),\n },\n },\n createdAtFilter({\n description: message('Date tag was created'),\n }),\n updatedAtFilter({\n description: message('Date tag was last updated'),\n }),\n ];\n};\n","export default \"__VITE_ASSET__8de61ea9__\"","import {Tag} from '../../tags/tag';\nimport {UseFormReturn} from 'react-hook-form';\nimport {Form} from '../../ui/forms/form';\nimport {FormTextField} from '../../ui/forms/input-field/text-field/text-field';\nimport {FormSelect} from '../../ui/forms/select/select';\nimport {Trans} from '../../i18n/trans';\nimport {Item} from '../../ui/forms/listbox/item';\nimport {useContext} from 'react';\nimport {SiteConfigContext} from '../../core/settings/site-config-context';\n\ninterface CrupdateTagFormProps {\n onSubmit: (values: Partial<Tag>) => void;\n formId: string;\n form: UseFormReturn<Partial<Tag>>;\n}\nexport function CrupdateTagForm({\n form,\n onSubmit,\n formId,\n}: CrupdateTagFormProps) {\n const {\n tags: {types},\n } = useContext(SiteConfigContext);\n const watchedType = form.watch('type');\n const isSystem = !!types.find(t => t.name === watchedType && t.system);\n\n return (\n <Form id={formId} form={form} onSubmit={onSubmit}>\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Name\" />}\n description={<Trans message=\"Unique tag identifier.\" />}\n className=\"mb-20\"\n required\n autoFocus\n />\n <FormTextField\n name=\"display_name\"\n label={<Trans message=\"Display name\" />}\n description={<Trans message=\"User friendly tag name.\" />}\n className=\"mb-20\"\n />\n <FormSelect\n label={<Trans message=\"Type\" />}\n name=\"type\"\n selectionMode=\"single\"\n disabled={isSystem}\n >\n {types\n .filter(t => !t.system)\n .map(type => (\n <Item key={type.name} value={type.name}>\n <Trans message={type.name} />\n </Item>\n ))}\n </FormSelect>\n </Form>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {Tag} from '@common/tags/tag';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {UseFormReturn} from 'react-hook-form';\nimport {slugifyString} from '@common/utils/string/slugify-string';\n\ninterface Response extends BackendResponse {\n tag: Tag;\n}\n\ninterface Payload extends Partial<Tag> {}\n\nexport function useCreateNewTag(form: UseFormReturn<Payload>) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (props: Payload) => createNewTag(props),\n onSuccess: () => {\n toast(trans(message('Tag created')));\n queryClient.invalidateQueries({queryKey: DatatableDataQueryKey('tags')});\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction createNewTag(payload: Payload): Promise<Response> {\n payload.name = slugifyString(payload.name!);\n return apiClient.post('tags', payload).then(r => r.data);\n}\n","import {Dialog} from '../../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../../ui/overlays/dialog/dialog-header';\nimport {Trans} from '../../i18n/trans';\nimport {DialogBody} from '../../ui/overlays/dialog/dialog-body';\nimport {CrupdateTagForm} from './crupdate-tag-form';\nimport {DialogFooter} from '../../ui/overlays/dialog/dialog-footer';\nimport {Button} from '../../ui/buttons/button';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {useCreateNewTag} from './requests/use-create-new-tag';\nimport {useContext} from 'react';\nimport {SiteConfigContext} from '../../core/settings/site-config-context';\nimport {useForm} from 'react-hook-form';\nimport {Tag} from '../../tags/tag';\n\nexport function CreateTagDialog() {\n const {close, formId} = useDialogContext();\n const {\n tags: {types},\n } = useContext(SiteConfigContext);\n const form = useForm<Partial<Tag>>({\n defaultValues: {\n type: types[0].name,\n },\n });\n const createNewTag = useCreateNewTag(form);\n\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Add new tag\" />\n </DialogHeader>\n <DialogBody>\n <CrupdateTagForm\n formId={formId}\n form={form}\n onSubmit={values => {\n createNewTag.mutate(values, {\n onSuccess: () => {\n close();\n },\n });\n }}\n />\n </DialogBody>\n <DialogFooter>\n <Button\n onClick={() => {\n close();\n }}\n >\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n form={formId}\n disabled={createNewTag.isPending}\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n >\n <Trans message=\"Save\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {Tag} from '@common/tags/tag';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {UseFormReturn} from 'react-hook-form';\nimport {slugifyString} from '@common/utils/string/slugify-string';\n\ninterface Response extends BackendResponse {\n tag: Tag;\n}\n\nexport interface UpdateTagPayload extends Partial<Tag> {\n id: number;\n}\n\nexport function useUpdateTag(form: UseFormReturn<UpdateTagPayload>) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (props: UpdateTagPayload) => updateTag(props),\n onSuccess: () => {\n toast(trans(message('Tag updated')));\n queryClient.invalidateQueries({queryKey: DatatableDataQueryKey('tags')});\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction updateTag({id, ...payload}: UpdateTagPayload): Promise<Response> {\n if (payload.name) {\n payload.name = slugifyString(payload.name!);\n }\n return apiClient.put(`tags/${id}`, payload).then(r => r.data);\n}\n","import {Dialog} from '../../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../../ui/overlays/dialog/dialog-header';\nimport {Trans} from '../../i18n/trans';\nimport {DialogBody} from '../../ui/overlays/dialog/dialog-body';\nimport {CrupdateTagForm} from './crupdate-tag-form';\nimport {DialogFooter} from '../../ui/overlays/dialog/dialog-footer';\nimport {Button} from '../../ui/buttons/button';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {useForm} from 'react-hook-form';\nimport {Tag} from '../../tags/tag';\nimport {UpdateTagPayload, useUpdateTag} from './requests/use-update-tag';\n\ninterface UpdateTagDialogProps {\n tag: Tag;\n}\nexport function UpdateTagDialog({tag}: UpdateTagDialogProps) {\n const {close, formId} = useDialogContext();\n const form = useForm<UpdateTagPayload>({\n defaultValues: {\n id: tag.id,\n name: tag.name,\n display_name: tag.display_name,\n type: tag.type,\n },\n });\n const updateTag = useUpdateTag(form);\n\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Update “:name“ tag\" values={{name: tag.name}} />\n </DialogHeader>\n <DialogBody>\n <CrupdateTagForm\n formId={formId}\n form={form as any}\n onSubmit={values => {\n updateTag.mutate(values as UpdateTagPayload, {\n onSuccess: () => {\n close();\n },\n });\n }}\n />\n </DialogBody>\n <DialogFooter>\n <Button\n onClick={() => {\n close();\n }}\n >\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n form={formId}\n disabled={updateTag.isPending}\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n >\n <Trans message=\"Save\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import React, {useContext, useMemo} from 'react';\nimport {DataTablePage} from '../../datatable/page/data-table-page';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {EditIcon} from '../../icons/material/Edit';\nimport {FormattedDate} from '../../i18n/formatted-date';\nimport {ColumnConfig} from '../../datatable/column-config';\nimport {Trans} from '../../i18n/trans';\nimport {DeleteSelectedItemsAction} from '../../datatable/page/delete-selected-items-action';\nimport {DataTableEmptyStateMessage} from '../../datatable/page/data-table-emty-state-message';\nimport {Tag} from '../../tags/tag';\nimport {SiteConfigContext} from '../../core/settings/site-config-context';\nimport {TagIndexPageFilters} from './tag-index-page-filters';\nimport softwareEngineerSvg from './software-engineer.svg';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {CreateTagDialog} from './create-tag-dialog';\nimport {UpdateTagDialog} from './update-tag-dialog';\nimport {DataTableAddItemButton} from '../../datatable/data-table-add-item-button';\n\nconst columnConfig: ColumnConfig<Tag>[] = [\n {\n key: 'name',\n allowsSorting: true,\n visibleInMode: 'all',\n width: 'flex-3 min-w-200',\n header: () => <Trans message=\"Name\" />,\n body: tag => tag.name,\n },\n {\n key: 'type',\n allowsSorting: true,\n header: () => <Trans message=\"Type\" />,\n body: tag => tag.type,\n },\n {\n key: 'display_name',\n allowsSorting: true,\n header: () => <Trans message=\"Display name\" />,\n body: tag => tag.display_name,\n },\n {\n key: 'updated_at',\n allowsSorting: true,\n width: 'w-100',\n header: () => <Trans message=\"Last updated\" />,\n body: tag => <FormattedDate date={tag.updated_at} />,\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n align: 'end',\n width: 'w-42 flex-shrink-0',\n visibleInMode: 'all',\n body: tag => {\n return (\n <DialogTrigger type=\"modal\">\n <IconButton size=\"md\" className=\"text-muted\">\n <EditIcon />\n </IconButton>\n <UpdateTagDialog tag={tag} />\n </DialogTrigger>\n );\n },\n },\n];\n\nexport function TagIndexPage() {\n const {tags} = useContext(SiteConfigContext);\n const filters = useMemo(() => {\n return TagIndexPageFilters(tags.types);\n }, [tags.types]);\n\n return (\n <DataTablePage\n endpoint=\"tags\"\n title={<Trans message=\"Tags\" />}\n columns={columnConfig}\n filters={filters}\n actions={<Actions />}\n selectedActions={<DeleteSelectedItemsAction />}\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={softwareEngineerSvg}\n title={<Trans message=\"No tags have been created yet\" />}\n filteringTitle={<Trans message=\"No matching tags\" />}\n />\n }\n />\n );\n}\n\nfunction Actions() {\n return (\n <>\n <DialogTrigger type=\"modal\">\n <DataTableAddItemButton>\n <Trans message=\"Add new tag\" />\n </DataTableAddItemButton>\n <CreateTagDialog />\n </DialogTrigger>\n </>\n );\n}\n","import {Fragment, memo} from 'react';\nimport {prettyBytes} from './utils/pretty-bytes';\n\ninterface FormattedBytesProps {\n bytes?: number;\n}\nexport const FormattedBytes = memo(({bytes}: FormattedBytesProps) => {\n return <Fragment>{prettyBytes(bytes)}</Fragment>;\n});\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const VisibilityIcon = createSvgIcon(\n <path d=\"M12 6c3.79 0 7.17 2.13 8.82 5.5C19.17 14.87 15.79 17 12 17s-7.17-2.13-8.82-5.5C4.83 8.13 8.21 6 12 6m0-2C7 4 2.73 7.11 1 11.5 2.73 15.89 7 19 12 19s9.27-3.11 11-7.5C21.27 7.11 17 4 12 4zm0 5c1.38 0 2.5 1.12 2.5 2.5S13.38 14 12 14s-2.5-1.12-2.5-2.5S10.62 9 12 9m0-2c-2.48 0-4.5 2.02-4.5 4.5S9.52 16 12 16s4.5-2.02 4.5-4.5S14.48 7 12 7z\" />\n, 'VisibilityOutlined');\n","export default \"__VITE_ASSET__31048831__\"","import React, {useContext, useMemo} from 'react';\nimport {FileEntry} from '../file-entry';\nimport {useSettings} from '../../core/settings/use-settings';\nimport {isAbsoluteUrl} from '@common/utils/urls/is-absolute-url';\n\nexport const FileEntryUrlsContext = React.createContext<\n Record<string, string | number | null | undefined>\n>(null!);\n\nexport function useFileEntryUrls(\n entry?: FileEntry,\n options?: {thumbnail?: boolean; downloadHashes?: string[]},\n): {previewUrl?: string; downloadUrl?: string} {\n const {base_url} = useSettings();\n const urlSearchParams = useContext(FileEntryUrlsContext);\n\n return useMemo(() => {\n if (!entry) {\n return {};\n }\n\n let previewUrl: string | undefined;\n if (entry.url) {\n previewUrl = isAbsoluteUrl(entry.url)\n ? entry.url\n : `${base_url}/${entry.url}`;\n }\n\n const urls = {\n previewUrl,\n downloadUrl: `${base_url}/api/v1/file-entries/download/${\n options?.downloadHashes || entry.hash\n }`,\n };\n\n if (urlSearchParams) {\n // preview url\n if (urls.previewUrl) {\n urls.previewUrl = addParams(\n urls.previewUrl,\n {...urlSearchParams, thumbnail: options?.thumbnail ? 'true' : ''},\n base_url,\n );\n }\n\n // download url\n urls.downloadUrl = addParams(urls.downloadUrl, urlSearchParams, base_url);\n }\n\n return urls;\n }, [\n base_url,\n entry,\n options?.downloadHashes,\n options?.thumbnail,\n urlSearchParams,\n ]);\n}\n\nfunction addParams(urlString: string, params: object, baseUrl: string): string {\n const url = new URL(urlString, baseUrl);\n Object.entries(params).forEach(([key, value]) => {\n url.searchParams.append(key, value as string);\n });\n return url.toString();\n}\n","import React from 'react';\nimport {FileEntry} from '../file-entry';\n\nexport interface FilePreviewContextValue {\n entries: FileEntry[];\n activeIndex: number;\n}\n\nexport const FilePreviewContext = React.createContext<FilePreviewContextValue>(\n null!\n);\n","import {ReactNode, useContext} from 'react';\nimport clsx from 'clsx';\nimport {Button} from '../../../ui/buttons/button';\nimport {downloadFileFromUrl} from '../../utils/download-file-from-url';\nimport {FilePreviewContext} from '../file-preview-context';\nimport {Trans} from '../../../i18n/trans';\nimport {FilePreviewProps} from './file-preview-props';\nimport {useFileEntryUrls} from '../../hooks/file-entry-urls';\n\ninterface Props extends FilePreviewProps {\n message?: ReactNode;\n}\nexport function DefaultFilePreview({message, className, allowDownload}: Props) {\n const {entries, activeIndex} = useContext(FilePreviewContext);\n const activeEntry = entries[activeIndex];\n const content = message || <Trans message=\"No file preview available\" />;\n const {downloadUrl} = useFileEntryUrls(activeEntry);\n return (\n <div\n className={clsx(\n className,\n 'shadow bg-paper max-w-400 w-[calc(100%-40px)] text-center p-40 rounded'\n )}\n >\n <div className=\"text-lg\">{content}</div>\n {allowDownload && (\n <div className=\"block mt-20 text-center\">\n <Button\n variant=\"flat\"\n color=\"primary\"\n onClick={() => {\n if (downloadUrl) {\n downloadFileFromUrl(downloadUrl);\n }\n }}\n >\n <Trans message=\"Download\" />\n </Button>\n </div>\n )}\n </div>\n );\n}\n","import clsx from 'clsx';\nimport {useFileEntryUrls} from '../../hooks/file-entry-urls';\nimport {useTrans} from '../../../i18n/use-trans';\nimport {FilePreviewProps} from './file-preview-props';\nimport {DefaultFilePreview} from './default-file-preview';\n\nexport function ImageFilePreview(props: FilePreviewProps) {\n const {entry, className} = props;\n const {trans} = useTrans();\n const {previewUrl} = useFileEntryUrls(entry);\n\n if (!previewUrl) {\n return <DefaultFilePreview {...props} />;\n }\n\n return (\n <img\n className={clsx(className, 'shadow')}\n src={previewUrl}\n alt={trans({\n message: 'Preview for :name',\n values: {name: entry.name},\n })}\n />\n );\n}\n","import {useEffect, useState} from 'react';\nimport clsx from 'clsx';\nimport {FilePreviewProps} from './file-preview-props';\nimport {DefaultFilePreview} from './default-file-preview';\nimport {ProgressCircle} from '@common/ui/progress/progress-circle';\nimport {useFileEntryUrls} from '@common/uploads/hooks/file-entry-urls';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {Trans} from '@common/i18n/trans';\nimport {apiClient} from '@common/http/query-client';\n\nconst FIVE_MB = 5242880;\n\nexport function TextFilePreview(props: FilePreviewProps) {\n const {entry, className} = props;\n const {trans} = useTrans();\n const [tooLarge, setTooLarge] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [isFailed, setIsFailed] = useState(false);\n const [contents, setContents] = useState<string | null>(null);\n const {previewUrl} = useFileEntryUrls(entry);\n\n useEffect(() => {\n if (!entry) return;\n if (!previewUrl) {\n setIsFailed(true);\n } else if (entry.file_size! >= FIVE_MB) {\n setTooLarge(true);\n setIsLoading(false);\n } else {\n getFileContents(previewUrl)\n .then(response => {\n setContents(response.data);\n })\n .catch(() => {\n setIsFailed(true);\n })\n .finally(() => {\n setIsLoading(false);\n });\n }\n }, [entry, previewUrl]);\n\n if (isLoading) {\n return (\n <ProgressCircle\n isIndeterminate\n aria-label={trans({message: 'Loading file contents'})}\n />\n );\n }\n\n if (tooLarge) {\n return (\n <DefaultFilePreview\n {...props}\n message={<Trans message=\"This file is too large to preview.\" />}\n />\n );\n }\n\n if (isFailed) {\n return (\n <DefaultFilePreview\n {...props}\n message={<Trans message=\"There was an issue previewing this file\" />}\n />\n );\n }\n\n return (\n <pre\n className={clsx(\n 'rounded bg-paper p-20 text-sm whitespace-pre-wrap break-words h-full overflow-y-auto w-full',\n className\n )}\n >\n <div className=\"container mx-auto\">{`${contents}`}</div>\n </pre>\n );\n}\n\nfunction getFileContents(src: string) {\n return apiClient.get(src, {\n responseType: 'text',\n // required for s3 presigned url to work\n withCredentials: false,\n headers: {\n Accept: 'text/plain',\n },\n });\n}\n","import {useEffect, useRef, useState} from 'react';\nimport {FilePreviewProps} from './file-preview-props';\nimport {DefaultFilePreview} from './default-file-preview';\nimport {useFileEntryUrls} from '../../hooks/file-entry-urls';\n\nexport function VideoFilePreview(props: FilePreviewProps) {\n const {entry, className} = props;\n const {previewUrl} = useFileEntryUrls(entry);\n const ref = useRef<HTMLVideoElement>(null);\n const [mediaInvalid, setMediaInvalid] = useState(false);\n\n useEffect(() => {\n setMediaInvalid(!ref.current?.canPlayType(entry.mime));\n }, [entry]);\n\n if (mediaInvalid || !previewUrl) {\n return <DefaultFilePreview {...props} />;\n }\n\n return (\n <video\n className={className}\n ref={ref}\n controls\n controlsList=\"nodownload noremoteplayback\"\n playsInline\n autoPlay\n >\n <source\n src={previewUrl}\n type={entry.mime}\n onError={() => {\n setMediaInvalid(true);\n }}\n />\n </video>\n );\n}\n","import {FilePreviewProps} from './file-preview-props';\nimport {DefaultFilePreview} from './default-file-preview';\nimport {useFileEntryUrls} from '../../hooks/file-entry-urls';\nimport {useEffect, useRef, useState} from 'react';\n\nexport function AudioFilePreview(props: FilePreviewProps) {\n const {entry, className} = props;\n const {previewUrl} = useFileEntryUrls(entry);\n const ref = useRef<HTMLAudioElement>(null);\n const [mediaInvalid, setMediaInvalid] = useState(false);\n\n useEffect(() => {\n setMediaInvalid(!ref.current?.canPlayType(entry.mime));\n }, [entry]);\n\n if (mediaInvalid || !previewUrl) {\n return <DefaultFilePreview {...props} />;\n }\n\n return (\n <audio\n className={className}\n ref={ref}\n controls\n controlsList=\"nodownload noremoteplayback\"\n autoPlay\n >\n <source\n src={previewUrl}\n type={entry.mime}\n onError={() => {\n setMediaInvalid(true);\n }}\n />\n </audio>\n );\n}\n","import clsx from 'clsx';\nimport {FilePreviewProps} from './file-preview-props';\nimport {useFileEntryUrls} from '../../hooks/file-entry-urls';\nimport {useTrans} from '../../../i18n/use-trans';\nimport {DefaultFilePreview} from './default-file-preview';\n\nexport function PdfFilePreview(props: FilePreviewProps) {\n const {entry, className} = props;\n const {trans} = useTrans();\n const {previewUrl} = useFileEntryUrls(entry);\n\n if (!previewUrl) {\n return <DefaultFilePreview {...props} />;\n }\n\n return (\n <iframe\n title={trans({\n message: 'Preview for :name',\n values: {name: entry.name},\n })}\n className={clsx(className, 'w-full h-full')}\n src={`${previewUrl}#toolbar=0`}\n />\n );\n}\n","import clsx from 'clsx';\nimport {useEffect, useRef, useState} from 'react';\nimport {FilePreviewProps} from './file-preview-props';\nimport {DefaultFilePreview} from './default-file-preview';\nimport {ProgressCircle} from '../../../ui/progress/progress-circle';\nimport {FileEntry} from '../../file-entry';\nimport {useFileEntryUrls} from '../../hooks/file-entry-urls';\nimport {useTrans} from '../../../i18n/use-trans';\nimport {apiClient} from '../../../http/query-client';\n\nexport function WordDocumentFilePreview(props: FilePreviewProps) {\n const {entry, className} = props;\n const {trans} = useTrans();\n const ref = useRef<HTMLIFrameElement>(null);\n const [showDefault, setShowDefault] = useState(false);\n const timeoutId = useRef<any>();\n const [isLoading, setIsLoading] = useState(false);\n const {previewUrl} = useFileEntryUrls(entry);\n\n useEffect(() => {\n // Google Docs viewer only supports files up to 25MB\n if (!previewUrl) {\n setShowDefault(true);\n } else if (entry.file_size && entry.file_size > 25000000) {\n setShowDefault(true);\n } else if (ref.current) {\n ref.current.onload = () => {\n clearTimeout(timeoutId.current);\n setIsLoading(false);\n };\n\n buildPreviewUrl(previewUrl, entry).then(url => {\n if (ref.current) {\n ref.current.src = url;\n }\n });\n\n // if preview iframe is not loaded\n // after 5 seconds, bail and show default preview\n timeoutId.current = setTimeout(() => {\n setShowDefault(true);\n }, 5000);\n }\n }, [entry, previewUrl]);\n\n if (showDefault) {\n return <DefaultFilePreview {...props} />;\n }\n\n return (\n <div className={clsx(className, 'w-full h-full')}>\n {isLoading && <ProgressCircle />}\n <iframe\n ref={ref}\n title={trans({\n message: 'Preview for :name',\n values: {name: entry.name},\n })}\n className={clsx('w-full h-full', isLoading && 'hidden')}\n />\n </div>\n );\n}\n\nasync function buildPreviewUrl(\n urlString: string,\n entry: FileEntry\n): Promise<string> {\n const url = new URL(urlString);\n // if we're not trying to preview shareable link we will need to generate\n // preview token, otherwise it won't be publicly accessible\n if (!url.searchParams.has('shareable_link')) {\n const {data} = await apiClient.post(\n `file-entries/${entry.id}/add-preview-token`\n );\n url.searchParams.append('preview_token', data.preview_token);\n }\n\n return buildOfficeLivePreviewUrl(url);\n}\n\nfunction buildOfficeLivePreviewUrl(url: URL) {\n // https://docs.google.com/gview?embedded=true&url=\n return `https://view.officeapps.live.com/op/embed.aspx?src=${encodeURIComponent(\n url.toString()\n )}`;\n}\n","import {ImageFilePreview} from './file-preview/image-file-preview';\nimport {FileEntry} from '../file-entry';\nimport {DefaultFilePreview} from './file-preview/default-file-preview';\nimport {TextFilePreview} from './file-preview/text-file-preview';\nimport {VideoFilePreview} from './file-preview/video-file-preview';\nimport {AudioFilePreview} from './file-preview/audio-file-preview';\nimport {PdfFilePreview} from './file-preview/pdf-file-preview';\nimport {WordDocumentFilePreview} from './file-preview/word-document-file-preview';\n\nexport const AvailablePreviews = {\n text: TextFilePreview,\n video: VideoFilePreview,\n audio: AudioFilePreview,\n image: ImageFilePreview,\n pdf: PdfFilePreview,\n spreadsheet: WordDocumentFilePreview,\n powerPoint: WordDocumentFilePreview,\n word: WordDocumentFilePreview,\n 'text/rtf': DefaultFilePreview,\n} as const;\n\nexport function getPreviewForEntry(entry: FileEntry) {\n const mime = entry?.mime as keyof typeof AvailablePreviews;\n const type = entry?.type as keyof typeof AvailablePreviews;\n return (\n AvailablePreviews[mime] || AvailablePreviews[type] || DefaultFilePreview\n );\n}\n","import {createSvgIcon} from '../../../icons/create-svg-icon';\n\nexport const DefaultFileIcon = createSvgIcon(\n <g>\n <path d=\"M 23.65625 4 C 22.320313 4 21.066406 4.519531 20.121094 5.464844 L 11.464844 14.121094 C 10.519531 15.066406 10 16.320313 10 17.65625 L 10 57 C 10 58.652344 11.347656 60 13 60 L 53 60 C 54.652344 60 56 58.652344 56 57 L 56 7 C 56 5.347656 54.652344 4 53 4 Z M 24 6 L 53 6 C 53.550781 6 54 6.449219 54 7 L 54 57 C 54 57.550781 53.550781 58 53 58 L 13 58 C 12.449219 58 12 57.550781 12 57 L 12 18 L 21 18 C 22.652344 18 24 16.652344 24 15 Z M 22 6.5 L 22 15 C 22 15.550781 21.550781 16 21 16 L 12.5 16 C 12.605469 15.835938 12.734375 15.679688 12.878906 15.535156 L 21.535156 6.878906 C 21.679688 6.738281 21.835938 6.613281 22 6.5 Z M 21 22 C 20.449219 22 20 22.449219 20 23 C 20 23.550781 20.449219 24 21 24 L 37 24 C 37.550781 24 38 23.550781 38 23 C 38 22.449219 37.550781 22 37 22 Z M 41 22 C 40.449219 22 40 22.449219 40 23 C 40 23.550781 40.449219 24 41 24 L 45 24 C 45.550781 24 46 23.550781 46 23 C 46 22.449219 45.550781 22 45 22 Z M 21 26 C 20.449219 26 20 26.449219 20 27 C 20 27.550781 20.449219 28 21 28 L 41 28 C 41.550781 28 42 27.550781 42 27 C 42 26.449219 41.550781 26 41 26 Z M 21 32 C 20.449219 32 20 32.449219 20 33 C 20 33.550781 20.449219 34 21 34 L 43 34 C 43.550781 34 44 33.550781 44 33 C 44 32.449219 43.550781 32 43 32 Z M 21 36 C 20.449219 36 20 36.449219 20 37 C 20 37.550781 20.449219 38 21 38 L 33 38 C 33.550781 38 34 37.550781 34 37 C 34 36.449219 33.550781 36 33 36 Z M 15 50 C 14.449219 50 14 50.449219 14 51 L 14 53 C 14 53.550781 14.449219 54 15 54 C 15.550781 54 16 53.550781 16 53 L 16 51 C 16 50.449219 15.550781 50 15 50 Z M 20 50 C 19.449219 50 19 50.449219 19 51 L 19 53 C 19 53.550781 19.449219 54 20 54 C 20.550781 54 21 53.550781 21 53 L 21 51 C 21 50.449219 20.550781 50 20 50 Z M 25 50 C 24.449219 50 24 50.449219 24 51 L 24 53 C 24 53.550781 24.449219 54 25 54 C 25.550781 54 26 53.550781 26 53 L 26 51 C 26 50.449219 25.550781 50 25 50 Z M 30 50 C 29.449219 50 29 50.449219 29 51 L 29 53 C 29 53.550781 29.449219 54 30 54 C 30.550781 54 31 53.550781 31 53 L 31 51 C 31 50.449219 30.550781 50 30 50 Z M 35 50 C 34.449219 50 34 50.449219 34 51 L 34 53 C 34 53.550781 34.449219 54 35 54 C 35.550781 54 36 53.550781 36 53 L 36 51 C 36 50.449219 35.550781 50 35 50 Z M 40 50 C 39.449219 50 39 50.449219 39 51 L 39 53 C 39 53.550781 39.449219 54 40 54 C 40.550781 54 41 53.550781 41 53 L 41 51 C 41 50.449219 40.550781 50 40 50 Z M 45 50 C 44.449219 50 44 50.449219 44 51 L 44 53 C 44 53.550781 44.449219 54 45 54 C 45.550781 54 46 53.550781 46 53 L 46 51 C 46 50.449219 45.550781 50 45 50 Z M 50 50 C 49.449219 50 49 50.449219 49 51 L 49 53 C 49 53.550781 49.449219 54 50 54 C 50.550781 54 51 53.550781 51 53 L 51 51 C 51 50.449219 50.550781 50 50 50 Z \" />\n </g>\n);\n","import {createSvgIcon} from '../../../icons/create-svg-icon';\n\nexport const AudioFileIcon = createSvgIcon(\n <g>\n <path d=\"M 21.65625 4 C 20.320313 4 19.0625 4.519531 18.121094 5.464844 L 9.464844 14.121094 C 8.519531 15.066406 8 16.320313 8 17.65625 L 8 57 C 8 58.652344 9.347656 60 11 60 L 51 60 C 52.652344 60 54 58.652344 54 57 L 54 7 C 54 5.347656 52.652344 4 51 4 Z M 22 6 L 51 6 C 51.550781 6 52 6.449219 52 7 L 52 57 C 52 57.550781 51.550781 58 51 58 L 11 58 C 10.449219 58 10 57.550781 10 57 L 10 18 L 19 18 C 20.652344 18 22 16.652344 22 15 Z M 20 6.5 L 20 15 C 20 15.550781 19.550781 16 19 16 L 10.5 16 C 10.609375 15.835938 10.734375 15.679688 10.878906 15.535156 L 19.535156 6.878906 C 19.679688 6.734375 19.835938 6.609375 20 6.5 Z M 42.78125 18.023438 L 24.78125 22.023438 C 24.328125 22.125 24 22.53125 24 23 L 24 37 C 20.691406 37 18 39.242188 18 42 C 18 44.757813 20.691406 47 24 47 C 27.308594 47 30 44.757813 30 42 L 30 29.910156 L 38 28.136719 L 38 33 C 34.691406 33 32 35.242188 32 38 C 32 40.757813 34.691406 43 38 43 C 41.308594 43 44 40.757813 44 38 L 44 19 C 44 18.695313 43.863281 18.410156 43.625 18.21875 C 43.390625 18.03125 43.082031 17.960938 42.78125 18.023438 Z M 42 20.246094 L 42 38 C 42 39.652344 40.207031 41 38 41 C 35.792969 41 34 39.652344 34 38 C 34 36.347656 35.792969 35 38 35 C 38.28125 35 38.5625 35.023438 38.839844 35.066406 C 39.128906 35.117188 39.421875 35.03125 39.648438 34.84375 C 39.871094 34.652344 40 34.375 40 34.078125 L 40 26.890625 C 40 26.585938 39.863281 26.300781 39.625 26.109375 C 39.390625 25.921875 39.078125 25.847656 38.78125 25.910156 L 28.78125 28.136719 C 28.328125 28.238281 28 28.644531 28 29.109375 L 28 42 C 28 43.652344 26.207031 45 24 45 C 21.792969 45 20 43.652344 20 42 C 20 40.347656 21.792969 39 24 39 C 24.28125 39 24.5625 39.023438 24.839844 39.066406 C 25.128906 39.117188 25.425781 39.03125 25.648438 38.84375 C 25.871094 38.652344 26 38.375 26 38.078125 L 26 23.800781 Z M 13 52 C 12.449219 52 12 52.445313 12 53 L 12 55 C 12 55.554688 12.449219 56 13 56 C 13.550781 56 14 55.554688 14 55 L 14 53 C 14 52.445313 13.550781 52 13 52 Z M 18 52 C 17.449219 52 17 52.445313 17 53 L 17 55 C 17 55.554688 17.449219 56 18 56 C 18.550781 56 19 55.554688 19 55 L 19 53 C 19 52.445313 18.550781 52 18 52 Z M 23 52 C 22.449219 52 22 52.445313 22 53 L 22 55 C 22 55.554688 22.449219 56 23 56 C 23.550781 56 24 55.554688 24 55 L 24 53 C 24 52.445313 23.550781 52 23 52 Z M 28 52 C 27.449219 52 27 52.445313 27 53 L 27 55 C 27 55.554688 27.449219 56 28 56 C 28.550781 56 29 55.554688 29 55 L 29 53 C 29 52.445313 28.550781 52 28 52 Z M 33 52 C 32.449219 52 32 52.445313 32 53 L 32 55 C 32 55.554688 32.449219 56 33 56 C 33.550781 56 34 55.554688 34 55 L 34 53 C 34 52.445313 33.550781 52 33 52 Z M 38 52 C 37.449219 52 37 52.445313 37 53 L 37 55 C 37 55.554688 37.449219 56 38 56 C 38.550781 56 39 55.554688 39 55 L 39 53 C 39 52.445313 38.550781 52 38 52 Z M 43 52 C 42.449219 52 42 52.445313 42 53 L 42 55 C 42 55.554688 42.449219 56 43 56 C 43.550781 56 44 55.554688 44 55 L 44 53 C 44 52.445313 43.550781 52 43 52 Z M 48 52 C 47.449219 52 47 52.445313 47 53 L 47 55 C 47 55.554688 47.449219 56 48 56 C 48.550781 56 49 55.554688 49 55 L 49 53 C 49 52.445313 48.550781 52 48 52 Z \" />\n </g>\n);\n","import {createSvgIcon} from '../../../icons/create-svg-icon';\n\nexport const VideoFileIcon = createSvgIcon(\n <g>\n <path d=\"M 23.65625 4 C 22.320313 4 21.0625 4.519531 20.121094 5.464844 L 11.464844 14.121094 C 10.519531 15.066406 10 16.320313 10 17.65625 L 10 57 C 10 58.652344 11.347656 60 13 60 L 53 60 C 54.652344 60 56 58.652344 56 57 L 56 7 C 56 5.347656 54.652344 4 53 4 Z M 24 6 L 53 6 C 53.550781 6 54 6.449219 54 7 L 54 57 C 54 57.550781 53.550781 58 53 58 L 13 58 C 12.449219 58 12 57.550781 12 57 L 12 18 L 21 18 C 22.652344 18 24 16.652344 24 15 Z M 22 6.5 L 22 15 C 22 15.550781 21.550781 16 21 16 L 12.5 16 C 12.613281 15.835938 12.738281 15.675781 12.878906 15.535156 L 21.535156 6.878906 C 21.679688 6.734375 21.835938 6.609375 22 6.5 Z M 28.023438 21.816406 C 27.671875 21.808594 27.316406 21.890625 26.996094 22.0625 C 26.355469 22.417969 25.964844 23.085938 25.964844 23.816406 L 25.964844 42.183594 C 25.964844 42.910156 26.355469 43.582031 26.996094 43.933594 C 27.296875 44.097656 27.632813 44.183594 27.964844 44.183594 C 28.335938 44.183594 28.707031 44.078125 29.03125 43.871094 L 43.53125 34.6875 C 44.113281 34.320313 44.464844 33.6875 44.464844 33 C 44.464844 32.308594 44.113281 31.679688 43.53125 31.3125 L 29.03125 22.125 C 28.722656 21.933594 28.375 21.828125 28.023438 21.816406 Z M 27.964844 23.816406 L 42.464844 33 L 27.964844 42.1875 Z M 15 52 C 14.449219 52 14 52.449219 14 53 L 14 55 C 14 55.550781 14.449219 56 15 56 C 15.550781 56 16 55.550781 16 55 L 16 53 C 16 52.449219 15.550781 52 15 52 Z M 20 52 C 19.449219 52 19 52.449219 19 53 L 19 55 C 19 55.550781 19.449219 56 20 56 C 20.550781 56 21 55.550781 21 55 L 21 53 C 21 52.449219 20.550781 52 20 52 Z M 25 52 C 24.449219 52 24 52.449219 24 53 L 24 55 C 24 55.550781 24.449219 56 25 56 C 25.550781 56 26 55.550781 26 55 L 26 53 C 26 52.449219 25.550781 52 25 52 Z M 30 52 C 29.449219 52 29 52.449219 29 53 L 29 55 C 29 55.550781 29.449219 56 30 56 C 30.550781 56 31 55.550781 31 55 L 31 53 C 31 52.449219 30.550781 52 30 52 Z M 35 52 C 34.449219 52 34 52.449219 34 53 L 34 55 C 34 55.550781 34.449219 56 35 56 C 35.550781 56 36 55.550781 36 55 L 36 53 C 36 52.449219 35.550781 52 35 52 Z M 40 52 C 39.449219 52 39 52.449219 39 53 L 39 55 C 39 55.550781 39.449219 56 40 56 C 40.550781 56 41 55.550781 41 55 L 41 53 C 41 52.449219 40.550781 52 40 52 Z M 45 52 C 44.449219 52 44 52.449219 44 53 L 44 55 C 44 55.550781 44.449219 56 45 56 C 45.550781 56 46 55.550781 46 55 L 46 53 C 46 52.449219 45.550781 52 45 52 Z M 50 52 C 49.449219 52 49 52.449219 49 53 L 49 55 C 49 55.550781 49.449219 56 50 56 C 50.550781 56 51 55.550781 51 55 L 51 53 C 51 52.449219 50.550781 52 50 52 Z \" />\n </g>\n);\n","import {createSvgIcon} from '../../../icons/create-svg-icon';\n\nexport const TextFileIcon = createSvgIcon(\n <g>\n <path d=\"M 17.660156 4 C 16.320313 4 15.058594 4.519531 14.121094 5.460938 L 5.460938 14.121094 C 4.519531 15.070313 4 16.320313 4 17.660156 L 4 57 C 4 58.648438 5.351563 60 7 60 L 47 60 C 48.648438 60 50 58.648438 50 57 L 50 46 L 58 46 C 59.101563 46 60 45.101563 60 44 L 60 24 C 60 22.898438 59.101563 22 58 22 L 50 22 L 50 7 C 50 5.351563 48.648438 4 47 4 Z M 18 6 L 47 6 C 47.550781 6 48 6.449219 48 7 L 48 22 L 16 22 C 14.898438 22 14 22.898438 14 24 L 14 44 C 14 45.101563 14.898438 46 16 46 L 48 46 L 48 57 C 48 57.550781 47.550781 58 47 58 L 7 58 C 6.449219 58 6 57.550781 6 57 L 6 18 L 15 18 C 16.652344 18 18 16.652344 18 15 Z M 16 6.5 L 16 15 C 16 15.550781 15.550781 16 15 16 L 6.5 16 C 6.613281 15.835938 6.738281 15.679688 6.882813 15.539063 L 15.539063 6.882813 C 15.679688 6.738281 15.835938 6.609375 16 6.5 Z M 16 24 L 58 24 L 58 44 L 16 44 Z M 24 28 C 23.449219 28 23 28.445313 23 29 C 23 29.554688 23.449219 30 24 30 L 26 30 L 26 39 C 26 39.554688 26.449219 40 27 40 C 27.550781 40 28 39.554688 28 39 L 28 30 L 30 30 C 30.550781 30 31 29.554688 31 29 C 31 28.445313 30.550781 28 30 28 Z M 44 28 C 43.449219 28 43 28.445313 43 29 C 43 29.554688 43.449219 30 44 30 L 46 30 L 46 39 C 46 39.554688 46.449219 40 47 40 C 47.550781 40 48 39.554688 48 39 L 48 30 L 50 30 C 50.550781 30 51 29.554688 51 29 C 51 28.445313 50.550781 28 50 28 Z M 33.859375 28.011719 C 33.730469 28.027344 33.601563 28.070313 33.484375 28.140625 C 33.011719 28.425781 32.859375 29.039063 33.140625 29.515625 L 35.832031 34 L 33.140625 38.484375 C 32.859375 38.957031 33.011719 39.574219 33.484375 39.859375 C 33.644531 39.953125 33.824219 40 34 40 C 34.339844 40 34.671875 39.828125 34.859375 39.515625 L 37 35.941406 L 39.140625 39.515625 C 39.328125 39.828125 39.660156 40 40 40 C 40.175781 40 40.355469 39.953125 40.515625 39.859375 C 40.988281 39.574219 41.140625 38.957031 40.859375 38.484375 L 38.167969 34 L 40.859375 29.515625 C 41.140625 29.042969 40.988281 28.425781 40.515625 28.140625 C 40.042969 27.859375 39.425781 28.011719 39.140625 28.484375 L 37 32.058594 L 34.859375 28.484375 C 34.644531 28.128906 34.246094 27.957031 33.859375 28.011719 Z M 9 52 C 8.449219 52 8 52.445313 8 53 L 8 55 C 8 55.554688 8.449219 56 9 56 C 9.550781 56 10 55.554688 10 55 L 10 53 C 10 52.445313 9.550781 52 9 52 Z M 14 52 C 13.449219 52 13 52.445313 13 53 L 13 55 C 13 55.554688 13.449219 56 14 56 C 14.550781 56 15 55.554688 15 55 L 15 53 C 15 52.445313 14.550781 52 14 52 Z M 19 52 C 18.449219 52 18 52.445313 18 53 L 18 55 C 18 55.554688 18.449219 56 19 56 C 19.550781 56 20 55.554688 20 55 L 20 53 C 20 52.445313 19.550781 52 19 52 Z M 24 52 C 23.449219 52 23 52.445313 23 53 L 23 55 C 23 55.554688 23.449219 56 24 56 C 24.550781 56 25 55.554688 25 55 L 25 53 C 25 52.445313 24.550781 52 24 52 Z M 29 52 C 28.449219 52 28 52.445313 28 53 L 28 55 C 28 55.554688 28.449219 56 29 56 C 29.550781 56 30 55.554688 30 55 L 30 53 C 30 52.445313 29.550781 52 29 52 Z M 34 52 C 33.449219 52 33 52.445313 33 53 L 33 55 C 33 55.554688 33.449219 56 34 56 C 34.550781 56 35 55.554688 35 55 L 35 53 C 35 52.445313 34.550781 52 34 52 Z M 39 52 C 38.449219 52 38 52.445313 38 53 L 38 55 C 38 55.554688 38.449219 56 39 56 C 39.550781 56 40 55.554688 40 55 L 40 53 C 40 52.445313 39.550781 52 39 52 Z M 44 52 C 43.449219 52 43 52.445313 43 53 L 43 55 C 43 55.554688 43.449219 56 44 56 C 44.550781 56 45 55.554688 45 55 L 45 53 C 45 52.445313 44.550781 52 44 52 Z \" />\n </g>\n);\n","import {createSvgIcon} from '../../../icons/create-svg-icon';\n\nexport const PdfFileIcon = createSvgIcon(\n <g>\n <path d=\"M 17.65625 4 C 16.320313 4 15.066406 4.519531 14.121094 5.464844 L 5.464844 14.121094 C 4.519531 15.066406 4 16.320313 4 17.65625 L 4 57 C 4 58.652344 5.347656 60 7 60 L 47 60 C 48.652344 60 50 58.652344 50 57 L 50 46 L 58 46 C 59.101563 46 60 45.101563 60 44 L 60 24 C 60 22.898438 59.101563 22 58 22 L 50 22 L 50 7 C 50 5.347656 48.652344 4 47 4 Z M 18 6 L 47 6 C 47.550781 6 48 6.449219 48 7 L 48 22 L 16 22 C 14.898438 22 14 22.898438 14 24 L 14 44 C 14 45.101563 14.898438 46 16 46 L 48 46 L 48 57 C 48 57.550781 47.550781 58 47 58 L 7 58 C 6.449219 58 6 57.550781 6 57 L 6 18 L 15 18 C 16.652344 18 18 16.652344 18 15 Z M 16 6.5 L 16 15 C 16 15.550781 15.550781 16 15 16 L 6.5 16 C 6.609375 15.835938 6.734375 15.679688 6.878906 15.535156 L 15.535156 6.878906 C 15.679688 6.734375 15.835938 6.609375 16 6.5 Z M 16 24 L 58 24 L 58 44 L 16 44 Z M 25 28 C 24.445313 28 24 28.449219 24 29 L 24 39 C 24 39.550781 24.445313 40 25 40 C 25.554688 40 26 39.550781 26 39 L 26 36 L 29 36 C 30.652344 36 32 34.652344 32 33 L 32 31 C 32 29.347656 30.652344 28 29 28 Z M 35 28 C 34.445313 28 34 28.449219 34 29 L 34 39 C 34 39.550781 34.445313 40 35 40 L 38 40 C 40.207031 40 42 38.207031 42 36 L 42 32 C 42 29.792969 40.207031 28 38 28 Z M 45 28 C 44.445313 28 44 28.449219 44 29 L 44 39 C 44 39.550781 44.445313 40 45 40 C 45.554688 40 46 39.550781 46 39 L 46 36 L 49 36 C 49.554688 36 50 35.550781 50 35 C 50 34.449219 49.554688 34 49 34 L 46 34 L 46 30 L 50 30 C 50.554688 30 51 29.550781 51 29 C 51 28.449219 50.554688 28 50 28 Z M 26 30 L 29 30 C 29.550781 30 30 30.449219 30 31 L 30 33 C 30 33.550781 29.550781 34 29 34 L 26 34 Z M 36 30 L 38 30 C 39.101563 30 40 30.898438 40 32 L 40 36 C 40 37.101563 39.101563 38 38 38 L 36 38 Z M 9 52 C 8.445313 52 8 52.449219 8 53 L 8 55 C 8 55.550781 8.445313 56 9 56 C 9.554688 56 10 55.550781 10 55 L 10 53 C 10 52.449219 9.554688 52 9 52 Z M 14 52 C 13.445313 52 13 52.449219 13 53 L 13 55 C 13 55.550781 13.445313 56 14 56 C 14.554688 56 15 55.550781 15 55 L 15 53 C 15 52.449219 14.554688 52 14 52 Z M 19 52 C 18.445313 52 18 52.449219 18 53 L 18 55 C 18 55.550781 18.445313 56 19 56 C 19.554688 56 20 55.550781 20 55 L 20 53 C 20 52.449219 19.554688 52 19 52 Z M 24 52 C 23.445313 52 23 52.449219 23 53 L 23 55 C 23 55.550781 23.445313 56 24 56 C 24.554688 56 25 55.550781 25 55 L 25 53 C 25 52.449219 24.554688 52 24 52 Z M 29 52 C 28.445313 52 28 52.449219 28 53 L 28 55 C 28 55.550781 28.445313 56 29 56 C 29.554688 56 30 55.550781 30 55 L 30 53 C 30 52.449219 29.554688 52 29 52 Z M 34 52 C 33.445313 52 33 52.449219 33 53 L 33 55 C 33 55.550781 33.445313 56 34 56 C 34.554688 56 35 55.550781 35 55 L 35 53 C 35 52.449219 34.554688 52 34 52 Z M 39 52 C 38.445313 52 38 52.449219 38 53 L 38 55 C 38 55.550781 38.445313 56 39 56 C 39.554688 56 40 55.550781 40 55 L 40 53 C 40 52.449219 39.554688 52 39 52 Z M 44 52 C 43.445313 52 43 52.449219 43 53 L 43 55 C 43 55.550781 43.445313 56 44 56 C 44.554688 56 45 55.550781 45 55 L 45 53 C 45 52.449219 44.554688 52 44 52 Z \" />\n </g>\n);\n","import {createSvgIcon} from '../../../icons/create-svg-icon';\n\nexport const ArchiveFileIcon = createSvgIcon(\n <g>\n <path d=\"M 21.65625 4 C 20.320313 4 19.066406 4.519531 18.121094 5.464844 L 9.464844 14.121094 C 8.519531 15.066406 8 16.320313 8 17.65625 L 8 57 C 8 58.652344 9.347656 60 11 60 L 51 60 C 52.652344 60 54 58.652344 54 57 L 54 7 C 54 5.347656 52.652344 4 51 4 Z M 22 6 L 36 6 L 36 27.59375 C 35.144531 27.222656 34.210938 27 33.226563 27 L 32.773438 27 C 31.789063 27 30.859375 27.222656 30 27.59375 L 30 9 C 30 8.449219 29.554688 8 29 8 C 28.449219 8 28 8.449219 28 9 L 28 28.902344 C 27.015625 29.824219 26.277344 31.023438 25.953125 32.425781 L 24.875 37.097656 C 24.597656 38.292969 24.878906 39.53125 25.640625 40.488281 C 26.40625 41.449219 27.546875 42 28.769531 42 L 37.230469 42 C 38.457031 42 39.59375 41.449219 40.359375 40.488281 C 41.121094 39.53125 41.402344 38.292969 41.125 37.097656 L 40.046875 32.425781 C 39.726563 31.023438 38.984375 29.824219 38 28.902344 L 38 6 L 51 6 C 51.550781 6 52 6.449219 52 7 L 52 57 C 52 57.550781 51.550781 58 51 58 L 11 58 C 10.449219 58 10 57.550781 10 57 L 10 18 L 19 18 C 20.652344 18 22 16.652344 22 15 Z M 20 6.5 L 20 15 C 20 15.550781 19.550781 16 19 16 L 10.5 16 C 10.609375 15.835938 10.734375 15.679688 10.878906 15.535156 L 19.535156 6.878906 C 19.679688 6.738281 19.835938 6.609375 20 6.5 Z M 32 8 C 31.449219 8 31 8.445313 31 9 C 31 9.554688 31.449219 10 32 10 L 34 10 C 34.550781 10 35 9.554688 35 9 C 35 8.445313 34.550781 8 34 8 Z M 32 13 C 31.449219 13 31 13.445313 31 14 C 31 14.554688 31.449219 15 32 15 L 34 15 C 34.550781 15 35 14.554688 35 14 C 35 13.445313 34.550781 13 34 13 Z M 32 18 C 31.449219 18 31 18.445313 31 19 C 31 19.554688 31.449219 20 32 20 L 34 20 C 34.550781 20 35 19.554688 35 19 C 35 18.445313 34.550781 18 34 18 Z M 32 23 C 31.449219 23 31 23.445313 31 24 C 31 24.554688 31.449219 25 32 25 L 34 25 C 34.550781 25 35 24.554688 35 24 C 35 23.445313 34.550781 23 34 23 Z M 32.773438 29 L 33.226563 29 C 35.570313 29 37.574219 30.59375 38.097656 32.875 L 39.175781 37.550781 C 39.316406 38.148438 39.175781 38.765625 38.796875 39.246094 C 38.414063 39.722656 37.839844 40 37.230469 40 L 28.769531 40 C 28.160156 40 27.589844 39.722656 27.207031 39.246094 C 26.824219 38.765625 26.683594 38.148438 26.824219 37.550781 L 27.902344 32.875 C 28.429688 30.59375 30.429688 29 32.773438 29 Z M 31 34 C 30.449219 34 30 34.445313 30 35 C 30 35.554688 30.449219 36 31 36 L 35 36 C 35.550781 36 36 35.554688 36 35 C 36 34.445313 35.550781 34 35 34 Z M 13 52 C 12.449219 52 12 52.445313 12 53 C 12 53.554688 12.449219 54 13 54 L 17 54 C 17.550781 54 18 53.554688 18 53 C 18 52.445313 17.550781 52 17 52 Z M 21 52 C 20.449219 52 20 52.445313 20 53 C 20 53.554688 20.449219 54 21 54 L 49 54 C 49.550781 54 50 53.554688 50 53 C 50 52.445313 49.550781 52 49 52 Z \" />\n </g>\n);\n","import {createSvgIcon} from '../../../icons/create-svg-icon';\n\nexport const FolderFileIcon = createSvgIcon(\n <g>\n <path d=\"M 5 10 C 3.300781 10 2 11.300781 2 13 L 2 52 C 2 54.199219 3.800781 56 6 56 L 60 56 C 62.199219 56 64 54.199219 64 52 L 64 23 C 64 21.300781 62.699219 20 61 20 L 58 20 L 58 19 C 58 17.300781 56.699219 16 55 16 L 29.699219 16 C 28.898438 16 28.199219 15.699219 27.597656 15.097656 L 23.902344 11.402344 C 23 10.5 21.699219 10 20.402344 10 Z M 5 12 L 20.402344 12 C 21.199219 12 21.898438 12.300781 22.5 12.902344 L 26.199219 16.597656 C 27.097656 17.5 28.398438 18 29.699219 18 L 55 18 C 55.601563 18 56 18.398438 56 19 L 56 52 C 56 52.601563 56.199219 53.300781 56.597656 54 L 6 54 C 4.898438 54 4 53.101563 4 52 L 4 46 L 45 46 C 45.601563 46 46 45.601563 46 45 C 46 44.398438 45.601563 44 45 44 L 4 44 L 4 13 C 4 12.398438 4.398438 12 5 12 Z M 58 22 L 61 22 C 61.601563 22 62 22.398438 62 23 L 62 52 C 62 53.101563 61.101563 54 60 54 C 58.800781 54 58 52.601563 58 52 Z M 11 24 C 10.398438 24 10 24.398438 10 25 C 10 25.601563 10.398438 26 11 26 L 21 26 C 21.601563 26 22 25.601563 22 25 C 22 24.398438 21.601563 24 21 24 Z M 25 24 C 24.398438 24 24 24.398438 24 25 C 24 25.601563 24.398438 26 25 26 L 31 26 C 31.601563 26 32 25.601563 32 25 C 32 24.398438 31.601563 24 31 24 Z M 11 28 C 10.398438 28 10 28.398438 10 29 C 10 29.601563 10.398438 30 11 30 L 15 30 C 15.601563 30 16 29.601563 16 29 C 16 28.398438 15.601563 28 15 28 Z M 19 28 C 18.398438 28 18 28.398438 18 29 C 18 29.601563 18.398438 30 19 30 L 26 30 C 26.601563 30 27 29.601563 27 29 C 27 28.398438 26.601563 28 26 28 Z M 49 44 C 48.398438 44 48 44.398438 48 45 C 48 45.601563 48.398438 46 49 46 L 53 46 C 53.601563 46 54 45.601563 54 45 C 54 44.398438 53.601563 44 53 44 Z M 7 48 C 6.398438 48 6 48.398438 6 49 L 6 51 C 6 51.601563 6.398438 52 7 52 C 7.601563 52 8 51.601563 8 51 L 8 49 C 8 48.398438 7.601563 48 7 48 Z M 12 48 C 11.398438 48 11 48.398438 11 49 L 11 51 C 11 51.601563 11.398438 52 12 52 C 12.601563 52 13 51.601563 13 51 L 13 49 C 13 48.398438 12.601563 48 12 48 Z M 17 48 C 16.398438 48 16 48.398438 16 49 L 16 51 C 16 51.601563 16.398438 52 17 52 C 17.601563 52 18 51.601563 18 51 L 18 49 C 18 48.398438 17.601563 48 17 48 Z M 22 48 C 21.398438 48 21 48.398438 21 49 L 21 51 C 21 51.601563 21.398438 52 22 52 C 22.601563 52 23 51.601563 23 51 L 23 49 C 23 48.398438 22.601563 48 22 48 Z M 27 48 C 26.398438 48 26 48.398438 26 49 L 26 51 C 26 51.601563 26.398438 52 27 52 C 27.601563 52 28 51.601563 28 51 L 28 49 C 28 48.398438 27.601563 48 27 48 Z M 32 48 C 31.398438 48 31 48.398438 31 49 L 31 51 C 31 51.601563 31.398438 52 32 52 C 32.601563 52 33 51.601563 33 51 L 33 49 C 33 48.398438 32.601563 48 32 48 Z M 37 48 C 36.398438 48 36 48.398438 36 49 L 36 51 C 36 51.601563 36.398438 52 37 52 C 37.601563 52 38 51.601563 38 51 L 38 49 C 38 48.398438 37.601563 48 37 48 Z M 42 48 C 41.398438 48 41 48.398438 41 49 L 41 51 C 41 51.601563 41.398438 52 42 52 C 42.601563 52 43 51.601563 43 51 L 43 49 C 43 48.398438 42.601563 48 42 48 Z M 47 48 C 46.398438 48 46 48.398438 46 49 L 46 51 C 46 51.601563 46.398438 52 47 52 C 47.601563 52 48 51.601563 48 51 L 48 49 C 48 48.398438 47.601563 48 47 48 Z M 52 48 C 51.398438 48 51 48.398438 51 49 L 51 51 C 51 51.601563 51.398438 52 52 52 C 52.601563 52 53 51.601563 53 51 L 53 49 C 53 48.398438 52.601563 48 52 48 Z \" />\n </g>\n);\n","import {createSvgIcon} from '../../../icons/create-svg-icon';\n\nexport const ImageFileIcon = createSvgIcon(\n <g>\n <path d=\"M 21.65625 4 C 20.320313 4 19.066406 4.519531 18.121094 5.464844 L 9.464844 14.121094 C 8.519531 15.066406 8 16.320313 8 17.65625 L 8 57 C 8 58.652344 9.347656 60 11 60 L 51 60 C 52.652344 60 54 58.652344 54 57 L 54 7 C 54 5.347656 52.652344 4 51 4 Z M 22 6 L 51 6 C 51.550781 6 52 6.449219 52 7 L 52 57 C 52 57.550781 51.550781 58 51 58 L 11 58 C 10.449219 58 10 57.550781 10 57 L 10 18 L 19 18 C 20.652344 18 22 16.652344 22 15 Z M 20 6.5 L 20 15 C 20 15.550781 19.550781 16 19 16 L 10.5 16 C 10.605469 15.835938 10.734375 15.679688 10.878906 15.535156 L 19.535156 6.878906 C 19.679688 6.738281 19.835938 6.613281 20 6.5 Z M 20 24 C 17.792969 24 16 25.792969 16 28 C 16 30.207031 17.792969 32 20 32 C 22.207031 32 24 30.207031 24 28 C 24 25.792969 22.207031 24 20 24 Z M 20 25.75 C 21.242188 25.75 22.25 26.757813 22.25 28 C 22.25 29.242188 21.242188 30.25 20 30.25 C 18.757813 30.25 17.75 29.242188 17.75 28 C 17.75 26.757813 18.757813 25.75 20 25.75 Z M 37 30.414063 C 36.488281 30.414063 35.976563 30.609375 35.585938 31 L 29 37.585938 L 26.414063 35 C 25.632813 34.21875 24.363281 34.21875 23.585938 35 L 14.585938 44 L 13.042969 44 C 12.417969 44 12 44.398438 12 45 C 12 45.601563 12.523438 46 13.042969 46 L 48.980469 46 C 49.5 46 50.023438 45.601563 50.023438 45 C 50.023438 44.398438 49.5 44 48.980469 44 L 25.414063 44 L 37 32.414063 L 45.292969 40.707031 C 45.683594 41.097656 46.316406 41.097656 46.707031 40.707031 C 47.097656 40.316406 47.097656 39.683594 46.707031 39.292969 L 38.414063 31 C 38.023438 30.609375 37.511719 30.414063 37 30.414063 Z M 25 36.414063 L 27.585938 39 L 22.585938 44 L 17.414063 44 Z M 13 52 C 12.449219 52 12 52.449219 12 53 L 12 55 C 12 55.550781 12.449219 56 13 56 C 13.550781 56 14 55.550781 14 55 L 14 53 C 14 52.449219 13.550781 52 13 52 Z M 18 52 C 17.449219 52 17 52.449219 17 53 L 17 55 C 17 55.550781 17.449219 56 18 56 C 18.550781 56 19 55.550781 19 55 L 19 53 C 19 52.449219 18.550781 52 18 52 Z M 23 52 C 22.449219 52 22 52.449219 22 53 L 22 55 C 22 55.550781 22.449219 56 23 56 C 23.550781 56 24 55.550781 24 55 L 24 53 C 24 52.449219 23.550781 52 23 52 Z M 28 52 C 27.449219 52 27 52.449219 27 53 L 27 55 C 27 55.550781 27.449219 56 28 56 C 28.550781 56 29 55.550781 29 55 L 29 53 C 29 52.449219 28.550781 52 28 52 Z M 33 52 C 32.449219 52 32 52.449219 32 53 L 32 55 C 32 55.550781 32.449219 56 33 56 C 33.550781 56 34 55.550781 34 55 L 34 53 C 34 52.449219 33.550781 52 33 52 Z M 38 52 C 37.449219 52 37 52.449219 37 53 L 37 55 C 37 55.550781 37.449219 56 38 56 C 38.550781 56 39 55.550781 39 55 L 39 53 C 39 52.449219 38.550781 52 38 52 Z M 43 52 C 42.449219 52 42 52.449219 42 53 L 42 55 C 42 55.550781 42.449219 56 43 56 C 43.550781 56 44 55.550781 44 55 L 44 53 C 44 52.449219 43.550781 52 43 52 Z M 48 52 C 47.449219 52 47 52.449219 47 53 L 47 55 C 47 55.550781 47.449219 56 48 56 C 48.550781 56 49 55.550781 49 55 L 49 53 C 49 52.449219 48.550781 52 48 52 Z \" />\n </g>\n);\n","import {createSvgIcon} from '../../../icons/create-svg-icon';\n\nexport const PowerPointFileIcon = createSvgIcon(\n <g>\n <path d=\"M 35.136719 2.386719 C 34.917969 2.378906 34.699219 2.390625 34.480469 2.429688 L 5.304688 7.578125 C 3.390625 7.917969 2 9.574219 2 11.515625 L 2 50.484375 C 2 52.429688 3.390625 54.085938 5.304688 54.421875 L 34.480469 59.570313 C 34.652344 59.601563 34.828125 59.613281 35 59.613281 C 35.703125 59.613281 36.382813 59.371094 36.925781 58.914063 C 37.609375 58.34375 38 57.503906 38 56.613281 L 38 52 L 57 52 C 58.652344 52 60 50.652344 60 49 L 60 13 C 60 11.347656 58.652344 10 57 10 L 38 10 L 38 5.382813 C 38 4.496094 37.609375 3.65625 36.925781 3.085938 C 36.417969 2.65625 35.789063 2.414063 35.136719 2.386719 Z M 35.105469 4.390625 C 35.359375 4.414063 35.542969 4.535156 35.640625 4.617188 C 35.777344 4.730469 36 4.980469 36 5.382813 L 36 56.613281 C 36 57.019531 35.777344 57.269531 35.640625 57.382813 C 35.507813 57.496094 35.226563 57.667969 34.828125 57.601563 L 5.652344 52.453125 C 4.695313 52.285156 4 51.457031 4 50.484375 L 4 11.515625 C 4 10.542969 4.695313 9.714844 5.652344 9.546875 L 34.824219 4.398438 C 34.925781 4.382813 35.019531 4.378906 35.105469 4.390625 Z M 38 12 L 57 12 C 57.550781 12 58 12.449219 58 13 L 58 49 C 58 49.550781 57.550781 50 57 50 L 38 50 L 38 45.949219 L 52.949219 45.949219 C 53.5 45.949219 53.949219 45.554688 53.949219 45 C 53.949219 44.445313 53.5 44 52.949219 44 L 50 44 L 50 41 C 50 40.445313 49.550781 40 49 40 L 46 40 L 46 37 C 46 36.445313 45.550781 36 45 36 L 41 36 C 40.449219 36 40 36.445313 40 37 L 40 39 L 38 39 L 38 32.46875 C 39.46875 33.449219 41.203125 34 43 34 C 47.960938 34 52 29.964844 52 25 C 52 20.035156 47.960938 16 43 16 C 41.1875 16 39.464844 16.535156 38 17.519531 Z M 42 18.078125 L 42 24.832031 C 42 25.027344 42.070313 25.203125 42.171875 25.359375 C 42.21875 25.492188 42.289063 25.617188 42.394531 25.726563 L 47.234375 30.5625 C 46.054688 31.460938 44.589844 32 43 32 C 41.113281 32 39.316406 31.230469 38 29.886719 L 38 20.105469 C 39.089844 18.992188 40.484375 18.292969 42 18.078125 Z M 44 18.078125 C 47.386719 18.566406 50 21.480469 50 25 C 50 26.546875 49.488281 27.976563 48.636719 29.136719 L 44 24.5 Z M 15 20 C 14.449219 20 14 20.445313 14 21 L 14 41 C 14 41.554688 14.449219 42 15 42 C 15.550781 42 16 41.554688 16 41 L 16 34 L 21 34 C 23.757813 34 26 31.757813 26 29 L 26 25 C 26 22.242188 23.757813 20 21 20 Z M 16 22 L 21 22 C 22.652344 22 24 23.347656 24 25 L 24 29 C 24 30.652344 22.652344 32 21 32 L 16 32 Z M 42 38 L 44 38 L 44 44 L 42 44 Z M 38 41 L 40 41 L 40 44 L 38 44 Z M 46 42 L 48 42 L 48 44 L 46 44 Z \" />\n </g>\n);\n","import {createSvgIcon} from '../../../icons/create-svg-icon';\n\nexport const WordFileIcon = createSvgIcon(\n <g>\n <path d=\"M 21.65625 4 C 20.320313 4 19.0625 4.519531 18.121094 5.464844 L 9.464844 14.121094 C 8.519531 15.066406 8 16.320313 8 17.65625 L 8 57 C 8 58.652344 9.347656 60 11 60 L 51 60 C 52.652344 60 54 58.652344 54 57 L 54 7 C 54 5.347656 52.652344 4 51 4 Z M 22 6 L 51 6 C 51.550781 6 52 6.449219 52 7 L 52 57 C 52 57.550781 51.550781 58 51 58 L 11 58 C 10.449219 58 10 57.550781 10 57 L 10 18 L 19 18 C 20.652344 18 22 16.652344 22 15 Z M 20 6.5 L 20 15 C 20 15.550781 19.550781 16 19 16 L 10.5 16 C 10.613281 15.832031 10.738281 15.675781 10.878906 15.535156 L 19.535156 6.878906 C 19.679688 6.734375 19.835938 6.609375 20 6.5 Z M 21.140625 23.011719 C 21.015625 22.992188 20.878906 22.996094 20.746094 23.03125 C 20.210938 23.175781 19.894531 23.722656 20.03125 24.253906 L 25.03125 43.253906 C 25.148438 43.691406 25.539063 43.996094 25.984375 44 L 26 44 C 26.441406 44 26.832031 43.710938 26.957031 43.28125 L 31 29.546875 L 35.042969 43.28125 C 35.167969 43.707031 35.558594 44 36 44 L 36.015625 44 C 36.460938 43.992188 36.851563 43.6875 36.96875 43.253906 L 41.96875 24.253906 C 42.105469 23.722656 41.789063 23.175781 41.253906 23.03125 C 40.71875 22.890625 40.171875 23.210938 40.03125 23.746094 L 35.945313 39.273438 L 31.957031 25.71875 C 31.832031 25.292969 31.445313 25 31 25 C 30.554688 25 30.167969 25.292969 30.042969 25.71875 L 26.054688 39.277344 L 21.96875 23.746094 C 21.863281 23.347656 21.527344 23.066406 21.140625 23.011719 Z M 13 52 C 12.449219 52 12 52.445313 12 53 L 12 55 C 12 55.554688 12.449219 56 13 56 C 13.550781 56 14 55.554688 14 55 L 14 53 C 14 52.445313 13.550781 52 13 52 Z M 18 52 C 17.449219 52 17 52.445313 17 53 L 17 55 C 17 55.554688 17.449219 56 18 56 C 18.550781 56 19 55.554688 19 55 L 19 53 C 19 52.445313 18.550781 52 18 52 Z M 23 52 C 22.449219 52 22 52.445313 22 53 L 22 55 C 22 55.554688 22.449219 56 23 56 C 23.550781 56 24 55.554688 24 55 L 24 53 C 24 52.445313 23.550781 52 23 52 Z M 28 52 C 27.449219 52 27 52.445313 27 53 L 27 55 C 27 55.554688 27.449219 56 28 56 C 28.550781 56 29 55.554688 29 55 L 29 53 C 29 52.445313 28.550781 52 28 52 Z M 33 52 C 32.449219 52 32 52.445313 32 53 L 32 55 C 32 55.554688 32.449219 56 33 56 C 33.550781 56 34 55.554688 34 55 L 34 53 C 34 52.445313 33.550781 52 33 52 Z M 38 52 C 37.449219 52 37 52.445313 37 53 L 37 55 C 37 55.554688 37.449219 56 38 56 C 38.550781 56 39 55.554688 39 55 L 39 53 C 39 52.445313 38.550781 52 38 52 Z M 43 52 C 42.449219 52 42 52.445313 42 53 L 42 55 C 42 55.554688 42.449219 56 43 56 C 43.550781 56 44 55.554688 44 55 L 44 53 C 44 52.445313 43.550781 52 43 52 Z M 48 52 C 47.449219 52 47 52.445313 47 53 L 47 55 C 47 55.554688 47.449219 56 48 56 C 48.550781 56 49 55.554688 49 55 L 49 53 C 49 52.445313 48.550781 52 48 52 Z \" />\n </g>\n);\n","import {createSvgIcon} from '../../../icons/create-svg-icon';\n\nexport const SpreadsheetFileIcon = createSvgIcon(\n <g>\n <path d=\"M 35.136719 2.386719 C 34.917969 2.378906 34.699219 2.390625 34.480469 2.429688 L 5.304688 7.578125 C 3.390625 7.917969 2 9.574219 2 11.515625 L 2 50.484375 C 2 52.429688 3.390625 54.085938 5.304688 54.421875 L 34.480469 59.570313 C 34.652344 59.601563 34.828125 59.613281 35 59.613281 C 35.703125 59.613281 36.382813 59.371094 36.925781 58.914063 C 37.609375 58.34375 38 57.503906 38 56.613281 L 38 52 L 57 52 C 58.652344 52 60 50.652344 60 49 L 60 13 C 60 11.347656 58.652344 10 57 10 L 38 10 L 38 5.382813 C 38 4.496094 37.609375 3.65625 36.925781 3.085938 C 36.417969 2.65625 35.789063 2.414063 35.136719 2.386719 Z M 35.105469 4.390625 C 35.359375 4.414063 35.542969 4.535156 35.640625 4.617188 C 35.777344 4.730469 36 4.980469 36 5.382813 L 36 56.613281 C 36 57.019531 35.777344 57.269531 35.640625 57.382813 C 35.507813 57.496094 35.226563 57.671875 34.828125 57.601563 L 5.652344 52.453125 C 4.695313 52.285156 4 51.457031 4 50.484375 L 4 11.515625 C 4 10.542969 4.695313 9.714844 5.652344 9.546875 L 34.824219 4.398438 C 34.925781 4.382813 35.019531 4.378906 35.105469 4.390625 Z M 38 12 L 57 12 C 57.550781 12 58 12.449219 58 13 L 58 49 C 58 49.550781 57.550781 50 57 50 L 38 50 L 38 44 L 41 44 C 41.550781 44 42 43.554688 42 43 C 42 42.445313 41.550781 42 41 42 L 38 42 L 38 38 L 41 38 C 41.550781 38 42 37.554688 42 37 C 42 36.445313 41.550781 36 41 36 L 38 36 L 38 32 L 41 32 C 41.550781 32 42 31.554688 42 31 C 42 30.445313 41.550781 30 41 30 L 38 30 L 38 26 L 41 26 C 41.550781 26 42 25.554688 42 25 C 42 24.445313 41.550781 24 41 24 L 38 24 L 38 20 L 41 20 C 41.550781 20 42 19.554688 42 19 C 42 18.445313 41.550781 18 41 18 L 38 18 Z M 45 18 C 44.449219 18 44 18.445313 44 19 C 44 19.554688 44.449219 20 45 20 L 51 20 C 51.550781 20 52 19.554688 52 19 C 52 18.445313 51.550781 18 51 18 Z M 12.824219 20.015625 C 12.695313 20.039063 12.570313 20.085938 12.453125 20.160156 C 11.992188 20.460938 11.859375 21.082031 12.160156 21.546875 L 18.308594 31 L 12.160156 40.453125 C 11.859375 40.917969 11.992188 41.539063 12.453125 41.839844 C 12.625 41.949219 12.8125 42 13 42 C 13.324219 42 13.648438 41.839844 13.839844 41.546875 L 19.5 32.835938 L 25.160156 41.546875 C 25.351563 41.839844 25.675781 42 26 42 C 26.1875 42 26.375 41.949219 26.546875 41.839844 C 27.007813 41.539063 27.140625 40.917969 26.839844 40.453125 L 20.691406 31 L 26.839844 21.546875 C 27.140625 21.082031 27.007813 20.460938 26.546875 20.160156 C 26.082031 19.859375 25.460938 19.992188 25.160156 20.453125 L 19.5 29.164063 L 13.839844 20.453125 C 13.613281 20.105469 13.207031 19.945313 12.824219 20.015625 Z M 45 24 C 44.449219 24 44 24.445313 44 25 C 44 25.554688 44.449219 26 45 26 L 51 26 C 51.550781 26 52 25.554688 52 25 C 52 24.445313 51.550781 24 51 24 Z M 45 30 C 44.449219 30 44 30.445313 44 31 C 44 31.554688 44.449219 32 45 32 L 51 32 C 51.550781 32 52 31.554688 52 31 C 52 30.445313 51.550781 30 51 30 Z M 45 36 C 44.449219 36 44 36.445313 44 37 C 44 37.554688 44.449219 38 45 38 L 51 38 C 51.550781 38 52 37.554688 52 37 C 52 36.445313 51.550781 36 51 36 Z M 45 42 C 44.449219 42 44 42.445313 44 43 C 44 43.554688 44.449219 44 45 44 L 51 44 C 51.550781 44 52 43.554688 52 43 C 52 42.445313 51.550781 42 51 42 Z \" />\n </g>\n);\n","import {createSvgIcon} from '../../../icons/create-svg-icon';\n\nexport const SharedFolderFileIcon = createSvgIcon(\n <g>\n <path d=\"M 3 8 C 1.347656 8 0 9.347656 0 11 L 0 52 C 0 54.207031 1.792969 56 4 56 L 58 56 C 60.207031 56 62 54.207031 62 52 L 62 21 C 62 19.347656 60.652344 18 59 18 L 56 18 L 56 17 C 56 15.347656 54.652344 14 53 14 L 27.707031 14 C 26.910156 14 26.164063 13.691406 25.597656 13.132813 L 21.875 9.445313 C 20.929688 8.515625 19.679688 8 18.355469 8 Z M 3 10 L 18.355469 10 C 19.152344 10 19.898438 10.308594 20.464844 10.867188 L 24.1875 14.554688 C 25.132813 15.484375 26.382813 16 27.707031 16 L 53 16 C 53.550781 16 54 16.449219 54 17 L 54 52 C 54 52.617188 54.222656 53.339844 54.632813 54 L 4 54 C 2.898438 54 2 53.101563 2 52 L 2 46 L 43 46 C 43.550781 46 44 45.550781 44 45 C 44 44.449219 43.550781 44 43 44 L 2 44 L 2 11 C 2 10.449219 2.449219 10 3 10 Z M 56 20 L 59 20 C 59.550781 20 60 20.449219 60 21 L 60 52 C 60 53.101563 59.101563 54 58 54 C 56.753906 54 56 52.609375 56 52 Z M 27 22 C 24.242188 22 22 24.242188 22 27 L 22 29 C 22 29.992188 22.300781 30.914063 22.800781 31.691406 C 20.058594 32.886719 17.882813 35.527344 17.28125 38.765625 C 17.179688 39.3125 17.539063 39.832031 18.082031 39.933594 C 18.625 40.035156 19.148438 39.675781 19.25 39.132813 C 19.785156 36.242188 21.863281 33.949219 24.371094 33.234375 C 25.136719 33.710938 26.03125 34 27 34 C 27.96875 34 28.863281 33.710938 29.628906 33.234375 C 32.136719 33.949219 34.214844 36.246094 34.75 39.136719 C 34.839844 39.617188 35.261719 39.953125 35.734375 39.953125 C 35.796875 39.953125 35.855469 39.949219 35.917969 39.9375 C 36.460938 39.835938 36.820313 39.3125 36.71875 38.769531 C 36.117188 35.53125 33.941406 32.886719 31.199219 31.691406 C 31.699219 30.914063 32 29.992188 32 29 L 32 27 C 32 24.242188 29.757813 22 27 22 Z M 27 24 C 28.652344 24 30 25.347656 30 27 L 30 29 C 30 30.652344 28.652344 32 27 32 C 25.347656 32 24 30.652344 24 29 L 24 27 C 24 25.347656 25.347656 24 27 24 Z M 47 44 C 46.449219 44 46 44.449219 46 45 C 46 45.550781 46.449219 46 47 46 L 51 46 C 51.550781 46 52 45.550781 52 45 C 52 44.449219 51.550781 44 51 44 Z M 5 48 C 4.449219 48 4 48.449219 4 49 L 4 51 C 4 51.550781 4.449219 52 5 52 C 5.550781 52 6 51.550781 6 51 L 6 49 C 6 48.449219 5.550781 48 5 48 Z M 10 48 C 9.449219 48 9 48.449219 9 49 L 9 51 C 9 51.550781 9.449219 52 10 52 C 10.550781 52 11 51.550781 11 51 L 11 49 C 11 48.449219 10.550781 48 10 48 Z M 15 48 C 14.449219 48 14 48.449219 14 49 L 14 51 C 14 51.550781 14.449219 52 15 52 C 15.550781 52 16 51.550781 16 51 L 16 49 C 16 48.449219 15.550781 48 15 48 Z M 20 48 C 19.449219 48 19 48.449219 19 49 L 19 51 C 19 51.550781 19.449219 52 20 52 C 20.550781 52 21 51.550781 21 51 L 21 49 C 21 48.449219 20.550781 48 20 48 Z M 25 48 C 24.449219 48 24 48.449219 24 49 L 24 51 C 24 51.550781 24.449219 52 25 52 C 25.550781 52 26 51.550781 26 51 L 26 49 C 26 48.449219 25.550781 48 25 48 Z M 30 48 C 29.449219 48 29 48.449219 29 49 L 29 51 C 29 51.550781 29.449219 52 30 52 C 30.550781 52 31 51.550781 31 51 L 31 49 C 31 48.449219 30.550781 48 30 48 Z M 35 48 C 34.449219 48 34 48.449219 34 49 L 34 51 C 34 51.550781 34.449219 52 35 52 C 35.550781 52 36 51.550781 36 51 L 36 49 C 36 48.449219 35.550781 48 35 48 Z M 40 48 C 39.449219 48 39 48.449219 39 49 L 39 51 C 39 51.550781 39.449219 52 40 52 C 40.550781 52 41 51.550781 41 51 L 41 49 C 41 48.449219 40.550781 48 40 48 Z M 45 48 C 44.449219 48 44 48.449219 44 49 L 44 51 C 44 51.550781 44.449219 52 45 52 C 45.550781 52 46 51.550781 46 51 L 46 49 C 46 48.449219 45.550781 48 45 48 Z M 50 48 C 49.449219 48 49 48.449219 49 49 L 49 51 C 49 51.550781 49.449219 52 50 52 C 50.550781 52 51 51.550781 51 51 L 51 49 C 51 48.449219 50.550781 48 50 48 Z \" />\n </g>\n);\n","import clsx from 'clsx';\nimport {DefaultFileIcon} from './icons/default-file-icon';\nimport {AudioFileIcon} from './icons/audio-file-icon';\nimport {VideoFileIcon} from './icons/video-file-icon';\nimport {TextFileIcon} from './icons/text-file-icon';\nimport {PdfFileIcon} from './icons/pdf-file-icon';\nimport {ArchiveFileIcon} from './icons/archive-file-icon';\nimport {FolderFileIcon} from './icons/folder-file-icon';\nimport {ImageFileIcon} from './icons/image-file-icon';\nimport {PowerPointFileIcon} from './icons/power-point-file-icon';\nimport {WordFileIcon} from './icons/word-file-icon';\nimport {SpreadsheetFileIcon} from './icons/spreadsheet-file-icon';\nimport {SharedFolderFileIcon} from './icons/shared-folder-file-icon';\nimport {IconSize} from '@common/icons/svg-icon';\n\ninterface Props {\n type?: string;\n mime?: string | null;\n className?: string;\n size?: IconSize;\n}\nexport function FileTypeIcon({type, mime, className, size}: Props) {\n if (!type && mime) {\n type = mime.split('/')[0];\n }\n // @ts-ignore\n const Icon = FileTypeIcons[type] || FileTypeIcons.default;\n return (\n <Icon\n size={size}\n className={clsx(className, `${type}-file-color`)}\n viewBox=\"0 0 64 64\"\n />\n );\n}\n\nconst FileTypeIcons = {\n default: DefaultFileIcon,\n audio: AudioFileIcon,\n video: VideoFileIcon,\n text: TextFileIcon,\n pdf: PdfFileIcon,\n archive: ArchiveFileIcon,\n folder: FolderFileIcon,\n sharedFolder: SharedFolderFileIcon,\n image: ImageFileIcon,\n powerPoint: PowerPointFileIcon,\n word: WordFileIcon,\n spreadsheet: SpreadsheetFileIcon,\n};\n","import clsx from 'clsx';\nimport {FileTypeIcon} from './file-type-icon';\nimport {useFileEntryUrls} from '../hooks/file-entry-urls';\nimport {useTrans} from '../../i18n/use-trans';\nimport {FileEntry} from '../file-entry';\n\nconst TwoMB = 2 * 1024 * 1024;\n\ninterface Props {\n file: FileEntry;\n className?: string;\n iconClassName?: string;\n showImage?: boolean;\n}\nexport function FileThumbnail({\n file,\n className,\n iconClassName,\n showImage = true,\n}: Props) {\n const {trans} = useTrans();\n const {previewUrl} = useFileEntryUrls(file, {thumbnail: true});\n\n // don't show images for files larger than 2MB, if thumbnail was not generated to avoid ui lag\n if (file.file_size && file.file_size > TwoMB && !file.thumbnail) {\n showImage = false;\n }\n\n if (showImage && file.type === 'image' && previewUrl) {\n const alt = trans({\n message: ':fileName thumbnail',\n values: {fileName: file.name},\n });\n return (\n <img\n className={clsx(className, 'object-cover')}\n src={previewUrl}\n alt={alt}\n draggable={false}\n />\n );\n }\n return <FileTypeIcon className={iconClassName} type={file.type} />;\n}\n","import {AnimatePresence, m} from 'framer-motion';\nimport {Fragment, ReactNode, useContext, useMemo} from 'react';\nimport clsx from 'clsx';\nimport {getPreviewForEntry} from './available-previews';\nimport {FileEntry} from '../file-entry';\nimport {FilePreviewContext} from './file-preview-context';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {ChevronLeftIcon} from '../../icons/material/ChevronLeft';\nimport {ChevronRightIcon} from '../../icons/material/ChevronRight';\nimport {FileDownloadIcon} from '../../icons/material/FileDownload';\nimport {downloadFileFromUrl} from '../utils/download-file-from-url';\nimport {useFileEntryUrls} from '../hooks/file-entry-urls';\nimport {Trans} from '../../i18n/trans';\nimport {Button} from '../../ui/buttons/button';\nimport {CloseIcon} from '../../icons/material/Close';\nimport {FileThumbnail} from '../file-type-icon/file-thumbnail';\nimport {useMediaQuery} from '../../utils/hooks/use-media-query';\nimport {KeyboardArrowLeftIcon} from '../../icons/material/KeyboardArrowLeft';\nimport {KeyboardArrowRightIcon} from '../../icons/material/KeyboardArrowRight';\nimport {useControlledState} from '@react-stately/utils';\nimport {opacityAnimation} from '../../ui/animation/opacity-animation';\n\nexport interface FilePreviewContainerProps {\n entries: FileEntry[];\n activeIndex?: number;\n defaultActiveIndex?: number;\n onActiveIndexChange?: (index: number) => void;\n onClose?: () => void;\n showHeader?: boolean;\n headerActionsLeft?: ReactNode;\n className?: string;\n allowDownload?: boolean;\n}\nexport function FilePreviewContainer({\n entries,\n onClose,\n showHeader = true,\n className,\n headerActionsLeft,\n allowDownload = true,\n ...props\n}: FilePreviewContainerProps) {\n const isMobile = useMediaQuery('(max-width: 1024px)');\n\n const [activeIndex, setActiveIndex] = useControlledState(\n props.activeIndex,\n props.defaultActiveIndex || 0,\n props.onActiveIndexChange\n );\n\n const activeEntry = entries[activeIndex];\n const contextValue = useMemo(() => {\n return {entries, activeIndex};\n }, [entries, activeIndex]);\n const Preview = getPreviewForEntry(activeEntry);\n\n if (!activeEntry) {\n onClose?.();\n return null;\n }\n\n const canOpenNext = entries.length - 1 > activeIndex;\n const openNext = () => {\n setActiveIndex(activeIndex + 1);\n };\n const canOpenPrevious = activeIndex > 0;\n const openPrevious = () => {\n setActiveIndex(activeIndex - 1);\n };\n\n return (\n <FilePreviewContext.Provider value={contextValue}>\n {showHeader && (\n <Header\n actionsLeft={headerActionsLeft}\n isMobile={isMobile}\n onClose={onClose}\n onNext={canOpenNext ? openNext : undefined}\n onPrevious={canOpenPrevious ? openPrevious : undefined}\n allowDownload={allowDownload}\n />\n )}\n <div className={clsx('overflow-hidden relative flex-auto', className)}>\n {isMobile && (\n <IconButton\n size=\"lg\"\n className=\"text-muted absolute left-0 top-1/2 transform -translate-y-1/2 z-10\"\n disabled={!canOpenPrevious}\n onClick={openPrevious}\n >\n <KeyboardArrowLeftIcon />\n </IconButton>\n )}\n <AnimatePresence initial={false}>\n <m.div\n className=\"absolute inset-0 flex items-center justify-center\"\n key={activeEntry.id}\n {...opacityAnimation}\n >\n <Preview\n className=\"max-h-[calc(100%-30px)]\"\n entry={activeEntry}\n allowDownload={allowDownload}\n />\n </m.div>\n </AnimatePresence>\n {isMobile && (\n <IconButton\n size=\"lg\"\n className=\"text-muted absolute right-0 top-1/2 transform -translate-y-1/2 z-10\"\n disabled={!canOpenNext}\n onClick={openNext}\n >\n <KeyboardArrowRightIcon />\n </IconButton>\n )}\n </div>\n </FilePreviewContext.Provider>\n );\n}\n\ninterface HeaderProps {\n onNext?: () => void;\n onPrevious?: () => void;\n onClose?: () => void;\n isMobile: boolean | null;\n actionsLeft?: ReactNode;\n allowDownload?: boolean;\n}\nfunction Header({\n onNext,\n onPrevious,\n onClose,\n isMobile,\n actionsLeft,\n allowDownload,\n}: HeaderProps) {\n const {entries, activeIndex} = useContext(FilePreviewContext);\n const activeEntry = entries[activeIndex];\n const {downloadUrl} = useFileEntryUrls(activeEntry);\n\n const desktopDownloadButton = (\n <Button\n startIcon={<FileDownloadIcon />}\n variant=\"text\"\n onClick={() => {\n if (downloadUrl) {\n downloadFileFromUrl(downloadUrl);\n }\n }}\n >\n <Trans message=\"Download\" />\n </Button>\n );\n\n const mobileDownloadButton = (\n <IconButton\n onClick={() => {\n if (downloadUrl) {\n downloadFileFromUrl(downloadUrl);\n }\n }}\n >\n <FileDownloadIcon />\n </IconButton>\n );\n\n const downloadButton = isMobile\n ? mobileDownloadButton\n : desktopDownloadButton;\n\n return (\n <div className=\"flex items-center justify-between gap-20 bg-paper border-b flex-shrink-0 text-sm min-h-50 px-10 text-muted\">\n <div className=\"flex items-center gap-4 w-1/3 justify-start\">\n {actionsLeft}\n {allowDownload ? downloadButton : undefined}\n </div>\n <div className=\"flex items-center gap-10 w-1/3 justify-center flex-nowrap text-main\">\n <FileThumbnail\n file={activeEntry}\n iconClassName=\"w-16 h-16\"\n showImage={false}\n />\n <div className=\"whitespace-nowrap overflow-hidden overflow-ellipsis\">\n {activeEntry.name}\n </div>\n </div>\n <div className=\"w-1/3 flex items-center gap-10 justify-end whitespace-nowrap\">\n {!isMobile && (\n <Fragment>\n <IconButton disabled={!onPrevious} onClick={onPrevious}>\n <ChevronLeftIcon />\n </IconButton>\n <div>{activeIndex + 1}</div>\n <div>/</div>\n <div>{entries.length}</div>\n <IconButton disabled={!onNext} onClick={onNext}>\n <ChevronRightIcon />\n </IconButton>\n <div className=\"bg-divider w-1 h-24 mx-20\" />\n </Fragment>\n )}\n <IconButton radius=\"rounded-none\" onClick={onClose}>\n <CloseIcon />\n </IconButton>\n </div>\n </div>\n );\n}\n","import {\n FilePreviewContainer,\n FilePreviewContainerProps,\n} from './file-preview-container';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {Dialog} from '../../ui/overlays/dialog/dialog';\n\ninterface Props extends Omit<FilePreviewContainerProps, 'onClose'> {}\nexport function FilePreviewDialog(props: Props) {\n return (\n <Dialog\n size=\"fullscreenTakeover\"\n background=\"bg-alt\"\n className=\"flex flex-col\"\n >\n <Content {...props} />\n </Dialog>\n );\n}\n\nfunction Content(props: Props) {\n const {close} = useDialogContext();\n return <FilePreviewContainer onClose={close} {...props} />;\n}\n","import {\n BackendFilter,\n FilterControlType,\n FilterOperator,\n FilterSelectControl,\n} from '../../datatable/filters/backend-filter';\nimport {message} from '../../i18n/message';\nimport {USER_MODEL} from '../../auth/user';\nimport {\n createdAtFilter,\n updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\n\nexport const FILE_ENTRY_TYPE_FILTER: BackendFilter<FilterSelectControl> = {\n key: 'type',\n label: message('Type'),\n description: message('Type of the file'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: '05',\n options: [\n {key: '02', label: message('Text'), value: 'text'},\n {\n key: '03',\n label: message('Audio'),\n value: 'audio',\n },\n {\n key: '04',\n label: message('Video'),\n value: 'video',\n },\n {\n key: '05',\n label: message('Image'),\n value: 'image',\n },\n {key: '06', label: message('PDF'), value: 'pdf'},\n {\n key: '07',\n label: message('Spreadsheet'),\n value: 'spreadsheet',\n },\n {\n key: '08',\n label: message('Word Document'),\n value: 'word',\n },\n {\n key: '09',\n label: message('Photoshop'),\n value: 'photoshop',\n },\n {\n key: '10',\n label: message('Archive'),\n value: 'archive',\n },\n {\n key: '11',\n label: message('Folder'),\n value: 'folder',\n },\n ],\n },\n};\n\nexport const FILE_ENTRY_INDEX_FILTERS: BackendFilter[] = [\n FILE_ENTRY_TYPE_FILTER,\n {\n key: 'public',\n label: message('Visibility'),\n description: message('Whether file is publicly accessible'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: '01',\n options: [\n {key: '01', label: message('Private'), value: false},\n {key: '02', label: message('Public'), value: true},\n ],\n },\n },\n createdAtFilter({\n description: message('Date file was uploaded'),\n }),\n updatedAtFilter({\n description: message('Date file was last changed'),\n }),\n {\n key: 'owner_id',\n label: message('Uploader'),\n description: message('User that this file was uploaded by'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.SelectModel,\n model: USER_MODEL,\n },\n },\n];\n","import React, {Fragment} from 'react';\nimport {DataTablePage} from '../../datatable/page/data-table-page';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {FormattedDate} from '../../i18n/formatted-date';\nimport {ColumnConfig} from '../../datatable/column-config';\nimport {Trans} from '../../i18n/trans';\nimport {DeleteSelectedItemsAction} from '../../datatable/page/delete-selected-items-action';\nimport {DataTableEmptyStateMessage} from '../../datatable/page/data-table-emty-state-message';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {FileEntry} from '../../uploads/file-entry';\nimport {NameWithAvatar} from '../../datatable/column-templates/name-with-avatar';\nimport {User} from '../../auth/user';\nimport {CheckIcon} from '../../icons/material/Check';\nimport {CloseIcon} from '../../icons/material/Close';\nimport {FormattedBytes} from '../../uploads/formatted-bytes';\nimport {VisibilityIcon} from '../../icons/material/Visibility';\nimport uploadSvg from './upload.svg';\nimport {FilePreviewDialog} from '../../uploads/preview/file-preview-dialog';\nimport {FILE_ENTRY_INDEX_FILTERS} from './file-entry-index-filters';\nimport {FileTypeIcon} from '../../uploads/file-type-icon/file-type-icon';\n\nconst columnConfig: ColumnConfig<FileEntry>[] = [\n {\n key: 'name',\n allowsSorting: true,\n visibleInMode: 'all',\n width: 'flex-3 min-w-200',\n header: () => <Trans message=\"Name\" />,\n body: entry => (\n <Fragment>\n <div className=\"overflow-x-hidden overflow-ellipsis\">{entry.name}</div>\n <div className=\"text-muted text-xs overflow-x-hidden overflow-ellipsis\">\n {entry.file_name}\n </div>\n </Fragment>\n ),\n },\n {\n key: 'owner_id',\n allowsSorting: true,\n width: 'flex-3 min-w-200',\n header: () => <Trans message=\"Uploader\" />,\n body: entry => {\n const user = entry.users?.[0] as User;\n if (!user) return null;\n return (\n <NameWithAvatar\n image={user.avatar}\n label={user.display_name}\n description={user.email}\n />\n );\n },\n },\n {\n key: 'type',\n width: 'w-100 flex-shrink-0',\n allowsSorting: true,\n header: () => <Trans message=\"Type\" />,\n body: entry => (\n <div className=\"flex items-center gap-12\">\n <FileTypeIcon type={entry.type} className=\"w-24 h-24 overflow-hidden\" />\n <div className=\"capitalize\">{entry.type}</div>\n </div>\n ),\n },\n {\n key: 'public',\n allowsSorting: true,\n width: 'w-60 flex-shrink-0',\n header: () => <Trans message=\"Public\" />,\n body: entry =>\n entry.public ? (\n <CheckIcon className=\"icon-md text-positive\" />\n ) : (\n <CloseIcon className=\"icon-md text-danger\" />\n ),\n },\n {\n key: 'file_size',\n allowsSorting: true,\n maxWidth: 'max-w-100',\n header: () => <Trans message=\"File size\" />,\n body: entry => <FormattedBytes bytes={entry.file_size} />,\n },\n {\n key: 'updated_at',\n allowsSorting: true,\n width: 'w-100',\n header: () => <Trans message=\"Last updated\" />,\n body: entry => <FormattedDate date={entry.updated_at} />,\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n align: 'end',\n width: 'w-42 flex-shrink-0',\n visibleInMode: 'all',\n body: entry => {\n return (\n <DialogTrigger type=\"modal\">\n <IconButton size=\"md\" className=\"text-muted\">\n <VisibilityIcon />\n </IconButton>\n <FilePreviewDialog entries={[entry]} />\n </DialogTrigger>\n );\n },\n },\n];\n\nexport function FileEntryIndexPage() {\n return (\n <DataTablePage\n endpoint=\"file-entries\"\n title={<Trans message=\"Uploaded files and folders\" />}\n columns={columnConfig}\n filters={FILE_ENTRY_INDEX_FILTERS}\n selectedActions={<DeleteSelectedItemsAction />}\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={uploadSvg}\n title={<Trans message=\"Nothing has been uploaded yet\" />}\n filteringTitle={<Trans message=\"No matching files or folders\" />}\n />\n }\n />\n );\n}\n","import {\n BackendFilter,\n FilterControlType,\n FilterOperator,\n} from '../../datatable/filters/backend-filter';\nimport {message} from '../../i18n/message';\nimport {\n createdAtFilter,\n timestampFilter,\n updatedAtFilter,\n} from '../../datatable/filters/timestamp-filters';\n\nexport const SubscriptionIndexPageFilters: BackendFilter[] = [\n {\n key: 'ends_at',\n label: message('Status'),\n description: message('Whether subscription is active or cancelled'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: 'active',\n options: [\n {\n key: 'active',\n label: message('Active'),\n value: {value: null, operator: FilterOperator.eq},\n },\n {\n key: 'cancelled',\n label: message('Cancelled'),\n value: {value: null, operator: FilterOperator.ne},\n },\n ],\n },\n },\n {\n control: {\n type: FilterControlType.Select,\n defaultValue: 'stripe',\n options: [\n {\n key: 'stripe',\n label: message('Stripe'),\n value: 'stripe',\n },\n {\n key: 'paypal',\n label: message('PayPal'),\n value: 'paypal',\n },\n {\n key: 'none',\n label: message('None'),\n value: 'none',\n },\n ],\n },\n key: 'gateway_name',\n label: message('Gateway'),\n description: message(\n 'With which payment provider was subscription created'\n ),\n defaultOperator: FilterOperator.eq,\n },\n timestampFilter({\n key: 'renews_at',\n label: message('Renew date'),\n description: message('Date subscription will renew'),\n }),\n createdAtFilter({\n description: message('Date subscription was created'),\n }),\n updatedAtFilter({\n description: message('Date subscription was last updated'),\n }),\n];\n","export default \"__VITE_ASSET__2e46d67b__\"","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '../../../http/query-client';\nimport {useTrans} from '../../../i18n/use-trans';\nimport {BackendResponse} from '../../../http/backend-response/backend-response';\nimport {toast} from '../../../ui/toast/toast';\nimport {message} from '../../../i18n/message';\nimport {DatatableDataQueryKey} from '../../../datatable/requests/paginated-resources';\nimport {onFormQueryError} from '../../../errors/on-form-query-error';\nimport {UseFormReturn} from 'react-hook-form';\nimport {Subscription} from '../../../billing/subscription';\n\ninterface Response extends BackendResponse {\n subscription: Subscription;\n}\n\nexport interface UpdateSubscriptionPayload extends Partial<Subscription> {\n id: number;\n}\n\nexport function useUpdateSubscription(\n form: UseFormReturn<UpdateSubscriptionPayload>,\n) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (props: UpdateSubscriptionPayload) => updateSubscription(props),\n onSuccess: () => {\n toast(trans(message('Subscription updated')));\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('billing/subscriptions'),\n });\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction updateSubscription({\n id,\n ...payload\n}: UpdateSubscriptionPayload): Promise<Response> {\n return apiClient\n .put(`billing/subscriptions/${id}`, payload)\n .then(r => r.data);\n}\n","import {UseFormReturn} from 'react-hook-form';\nimport {Form} from '../../ui/forms/form';\nimport {FormTextField} from '../../ui/forms/input-field/text-field/text-field';\nimport {FormSelect} from '../../ui/forms/select/select';\nimport {Trans} from '../../i18n/trans';\nimport {Item} from '../../ui/forms/listbox/item';\nimport {Subscription} from '../../billing/subscription';\nimport {FormDatePicker} from '../../ui/forms/input-field/date/date-picker/date-picker';\nimport {useProducts} from '../../billing/pricing-table/use-products';\nimport {FormattedPrice} from '../../i18n/formatted-price';\nimport {FormNormalizedModelField} from '../../ui/forms/normalized-model-field';\n\ninterface CrupdateSubscriptionForm {\n onSubmit: (values: Partial<Subscription>) => void;\n formId: string;\n form: UseFormReturn<Partial<Subscription>>;\n}\nexport function CrupdateSubscriptionForm({\n form,\n onSubmit,\n formId,\n}: CrupdateSubscriptionForm) {\n const query = useProducts();\n // @ts-ignore\n const watchedProductId = form.watch('product_id');\n const selectedProduct = query.data?.products.find(\n p => p.id === watchedProductId,\n );\n\n return (\n <Form id={formId} form={form} onSubmit={onSubmit}>\n <FormNormalizedModelField\n name=\"user_id\"\n className=\"mb-20\"\n endpoint=\"normalized-models/user\"\n label={<Trans message=\"User\" />}\n />\n <FormSelect\n name=\"product_id\"\n selectionMode=\"single\"\n className=\"mb-20\"\n label={<Trans message=\"Plan\" />}\n >\n {query.data?.products\n .filter(p => !p.free)\n .map(product => (\n <Item key={product.id} value={product.id}>\n <Trans message={product.name} />\n </Item>\n ))}\n </FormSelect>\n {!selectedProduct?.free && (\n <FormSelect\n name=\"price_id\"\n selectionMode=\"single\"\n className=\"mb-20\"\n label={<Trans message=\"Price\" />}\n >\n {selectedProduct?.prices.map(price => (\n <Item key={price.id} value={price.id}>\n <FormattedPrice price={price} />\n </Item>\n ))}\n </FormSelect>\n )}\n <FormTextField\n inputElementType=\"textarea\"\n rows={3}\n name=\"description\"\n label={<Trans message=\"Description\" />}\n className=\"mb-20\"\n />\n <FormDatePicker\n className=\"mb-20\"\n name=\"renews_at\"\n granularity=\"day\"\n label={<Trans message=\"Renews at\" />}\n description={\n <Trans message=\"This will only change local records. User will continue to be billed on their original cycle on the payment gateway.\" />\n }\n />\n <FormDatePicker\n className=\"mb-20\"\n name=\"ends_at\"\n granularity=\"day\"\n label={<Trans message=\"Ends at\" />}\n description={\n <Trans message=\"This will only change local records. User will continue to be billed on their original cycle on the payment gateway.\" />\n }\n />\n </Form>\n );\n}\n","import {Dialog} from '../../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../../ui/overlays/dialog/dialog-header';\nimport {Trans} from '../../i18n/trans';\nimport {DialogBody} from '../../ui/overlays/dialog/dialog-body';\nimport {DialogFooter} from '../../ui/overlays/dialog/dialog-footer';\nimport {Button} from '../../ui/buttons/button';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {useForm} from 'react-hook-form';\nimport {Subscription} from '../../billing/subscription';\nimport {\n UpdateSubscriptionPayload,\n useUpdateSubscription,\n} from './requests/use-update-subscription';\nimport {CrupdateSubscriptionForm} from './crupdate-subscription-form';\n\ninterface UpdateSubscriptionDialogProps {\n subscription: Subscription;\n}\nexport function UpdateSubscriptionDialog({\n subscription,\n}: UpdateSubscriptionDialogProps) {\n const {close, formId} = useDialogContext();\n const form = useForm<UpdateSubscriptionPayload>({\n defaultValues: {\n id: subscription.id,\n product_id: subscription.product_id,\n price_id: subscription.price_id,\n description: subscription.description,\n renews_at: subscription.renews_at,\n ends_at: subscription.ends_at,\n user_id: subscription.user_id,\n },\n });\n const updateSubscription = useUpdateSubscription(form);\n\n return (\n <Dialog size=\"md\">\n <DialogHeader>\n <Trans message=\"Update subscription\" />\n </DialogHeader>\n <DialogBody>\n <CrupdateSubscriptionForm\n formId={formId}\n form={form as any}\n onSubmit={values => {\n updateSubscription.mutate(values as UpdateSubscriptionPayload, {\n onSuccess: () => {\n close();\n },\n });\n }}\n />\n </DialogBody>\n <DialogFooter>\n <Button\n onClick={() => {\n close();\n }}\n >\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n form={formId}\n disabled={updateSubscription.isPending}\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n >\n <Trans message=\"Save\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '../../../http/query-client';\nimport {useTrans} from '../../../i18n/use-trans';\nimport {BackendResponse} from '../../../http/backend-response/backend-response';\nimport {toast} from '../../../ui/toast/toast';\nimport {message} from '../../../i18n/message';\nimport {Tag} from '../../../tags/tag';\nimport {DatatableDataQueryKey} from '../../../datatable/requests/paginated-resources';\nimport {onFormQueryError} from '../../../errors/on-form-query-error';\nimport {UseFormReturn} from 'react-hook-form';\nimport {Subscription} from '../../../billing/subscription';\n\nconst endpoint = 'billing/subscriptions';\n\ninterface Response extends BackendResponse {\n tag: Tag;\n}\n\ninterface Payload extends Partial<Subscription> {}\n\nexport function useCreateSubscription(form: UseFormReturn<Payload>) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (props: Payload) => createNewSubscription(props),\n onSuccess: () => {\n toast(trans(message('Subscription created')));\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey(endpoint),\n });\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction createNewSubscription(payload: Payload): Promise<Response> {\n return apiClient.post(endpoint, payload).then(r => r.data);\n}\n","import {Dialog} from '../../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../../ui/overlays/dialog/dialog-header';\nimport {Trans} from '../../i18n/trans';\nimport {DialogBody} from '../../ui/overlays/dialog/dialog-body';\nimport {DialogFooter} from '../../ui/overlays/dialog/dialog-footer';\nimport {Button} from '../../ui/buttons/button';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {useForm} from 'react-hook-form';\nimport {useCreateSubscription} from './requests/use-create-subscription';\nimport {Subscription} from '../../billing/subscription';\nimport {CrupdateSubscriptionForm} from './crupdate-subscription-form';\n\nexport function CreateSubscriptionDialog() {\n const {close, formId} = useDialogContext();\n const form = useForm<Partial<Subscription>>({});\n const createSubscription = useCreateSubscription(form);\n\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Add new subscription\" />\n </DialogHeader>\n <DialogBody>\n <CrupdateSubscriptionForm\n formId={formId}\n form={form}\n onSubmit={values => {\n createSubscription.mutate(values, {\n onSuccess: () => {\n close();\n },\n });\n }}\n />\n </DialogBody>\n <DialogFooter>\n <Button\n onClick={() => {\n close();\n }}\n >\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n form={formId}\n disabled={createSubscription.isPending}\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n >\n <Trans message=\"Save\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PauseIcon = createSvgIcon(\n <path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\" />\n, 'PauseOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PlayArrowIcon = createSvgIcon(\n <path d=\"M10 8.64 15.27 12 10 15.36V8.64M8 5v14l11-7L8 5z\" />\n, 'PlayArrowOutlined');\n","import React, {Fragment} from 'react';\nimport {DataTablePage} from '../../datatable/page/data-table-page';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {EditIcon} from '../../icons/material/Edit';\nimport {ColumnConfig} from '../../datatable/column-config';\nimport {Trans} from '../../i18n/trans';\nimport {DeleteSelectedItemsAction} from '../../datatable/page/delete-selected-items-action';\nimport {DataTableEmptyStateMessage} from '../../datatable/page/data-table-emty-state-message';\nimport {SubscriptionIndexPageFilters} from './subscription-index-page-filters';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {DataTableAddItemButton} from '../../datatable/data-table-add-item-button';\nimport subscriptionsSvg from './subscriptions.svg';\nimport {NameWithAvatar} from '../../datatable/column-templates/name-with-avatar';\nimport {Subscription} from '../../billing/subscription';\nimport {CloseIcon} from '../../icons/material/Close';\nimport {FormattedDate} from '../../i18n/formatted-date';\nimport {UpdateSubscriptionDialog} from './update-subscription-dialog';\nimport {CreateSubscriptionDialog} from './create-subscription-dialog';\nimport {useCancelSubscription} from '../../billing/billing-page/requests/use-cancel-subscription';\nimport {PauseIcon} from '../../icons/material/Pause';\nimport {queryClient} from '../../http/query-client';\nimport {DatatableDataQueryKey} from '../../datatable/requests/paginated-resources';\nimport {Tooltip} from '../../ui/tooltip/tooltip';\nimport {useResumeSubscription} from '../../billing/billing-page/requests/use-resume-subscription';\nimport {PlayArrowIcon} from '../../icons/material/PlayArrow';\nimport {ConfirmationDialog} from '../../ui/overlays/dialog/confirmation-dialog';\nimport {Chip} from '../../ui/forms/input-field/chip-field/chip';\n\nconst endpoint = 'billing/subscriptions';\n\nconst columnConfig: ColumnConfig<Subscription>[] = [\n {\n key: 'user_id',\n allowsSorting: true,\n width: 'flex-3 min-w-200',\n visibleInMode: 'all',\n header: () => <Trans message=\"Customer\" />,\n body: subscription =>\n subscription.user && (\n <NameWithAvatar\n image={subscription.user.avatar}\n label={subscription.user.display_name}\n description={subscription.user.email}\n />\n ),\n },\n {\n key: 'status',\n width: 'w-100 flex-shrink-0',\n header: () => <Trans message=\"Status\" />,\n body: subscription => (\n <Chip\n size=\"xs\"\n color={subscription.valid ? 'positive' : undefined}\n radius=\"rounded\"\n className=\"w-max\"\n >\n {subscription.gateway_status}\n </Chip>\n ),\n },\n {\n key: 'product_id',\n allowsSorting: true,\n header: () => <Trans message=\"Plan\" />,\n body: subscription => subscription.product?.name,\n },\n {\n key: 'gateway_name',\n allowsSorting: true,\n header: () => <Trans message=\"Gateway\" />,\n body: subscription => (\n <span className=\"capitalize\">{subscription.gateway_name}</span>\n ),\n },\n {\n key: 'renews_at',\n allowsSorting: true,\n header: () => <Trans message=\"Renews at\" />,\n body: subscription => <FormattedDate date={subscription.renews_at} />,\n },\n {\n key: 'ends_at',\n allowsSorting: true,\n header: () => <Trans message=\"Ends at\" />,\n body: subscription => <FormattedDate date={subscription.ends_at} />,\n },\n {\n key: 'created_at',\n allowsSorting: true,\n header: () => <Trans message=\"Created at\" />,\n body: subscription => <FormattedDate date={subscription.created_at} />,\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n align: 'end',\n visibleInMode: 'all',\n width: 'w-[168px] flex-shrink-0',\n body: subscription => {\n return <SubscriptionActions subscription={subscription} />;\n },\n },\n];\n\nexport function SubscriptionsIndexPage() {\n return (\n <DataTablePage\n endpoint={endpoint}\n title={<Trans message=\"Subscriptions\" />}\n columns={columnConfig}\n filters={SubscriptionIndexPageFilters}\n actions={<PageActions />}\n enableSelection={false}\n selectedActions={<DeleteSelectedItemsAction />}\n queryParams={{with: 'product'}}\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={subscriptionsSvg}\n title={<Trans message=\"No subscriptions have been created yet\" />}\n filteringTitle={<Trans message=\"No matching subscriptions\" />}\n />\n }\n />\n );\n}\n\nfunction PageActions() {\n return (\n <>\n <DialogTrigger type=\"modal\">\n <DataTableAddItemButton>\n <Trans message=\"Add new subscription\" />\n </DataTableAddItemButton>\n <CreateSubscriptionDialog />\n </DialogTrigger>\n </>\n );\n}\n\ninterface SubscriptionActionsProps {\n subscription: Subscription;\n}\nfunction SubscriptionActions({subscription}: SubscriptionActionsProps) {\n return (\n <Fragment>\n <DialogTrigger type=\"modal\">\n <IconButton size=\"md\" className=\"text-muted\">\n <EditIcon />\n </IconButton>\n <UpdateSubscriptionDialog subscription={subscription} />\n </DialogTrigger>\n {subscription.cancelled && subscription.on_grace_period ? (\n <ResumeSubscriptionButton subscription={subscription} />\n ) : null}\n {subscription.active ? (\n <SuspendSubscriptionButton subscription={subscription} />\n ) : null}\n <CancelSubscriptionButton subscription={subscription} />\n </Fragment>\n );\n}\n\nfunction SuspendSubscriptionButton({subscription}: SubscriptionActionsProps) {\n const cancelSubscription = useCancelSubscription();\n\n const handleSuspendSubscription = () => {\n cancelSubscription.mutate(\n {subscriptionId: subscription.id},\n {\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey(endpoint),\n });\n },\n },\n );\n };\n\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={confirmed => {\n if (confirmed) {\n handleSuspendSubscription();\n }\n }}\n >\n <Tooltip label={<Trans message=\"Cancel subscription\" />}>\n <IconButton\n size=\"md\"\n className=\"text-muted\"\n disabled={cancelSubscription.isPending}\n >\n <PauseIcon />\n </IconButton>\n </Tooltip>\n <ConfirmationDialog\n title={<Trans message=\"Cancel subscription\" />}\n body={\n <div>\n <Trans message=\"Are you sure you want to cancel this subscription?\" />\n <div className=\"mt-10 text-sm font-semibold\">\n <Trans message=\"This will put user on grace period until their next scheduled renewal date. Subscription can be renewed until that date by user or from admin area.\" />\n </div>\n </div>\n }\n confirm={<Trans message=\"Confirm\" />}\n />\n </DialogTrigger>\n );\n}\n\nfunction ResumeSubscriptionButton({subscription}: SubscriptionActionsProps) {\n const resumeSubscription = useResumeSubscription();\n const handleResumeSubscription = () => {\n resumeSubscription.mutate(\n {subscriptionId: subscription.id},\n {\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey(endpoint),\n });\n },\n },\n );\n };\n\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={confirmed => {\n if (confirmed) {\n handleResumeSubscription();\n }\n }}\n >\n <Tooltip label={<Trans message=\"Renew subscription\" />}>\n <IconButton\n size=\"md\"\n className=\"text-muted\"\n onClick={handleResumeSubscription}\n disabled={resumeSubscription.isPending}\n >\n <PlayArrowIcon />\n </IconButton>\n </Tooltip>\n <ConfirmationDialog\n title={<Trans message=\"Resume subscription\" />}\n body={\n <div>\n <Trans message=\"Are you sure you want to resume this subscription?\" />\n <div className=\"mt-10 text-sm font-semibold\">\n <Trans message=\"This will put user on their original plan and billing cycle.\" />\n </div>\n </div>\n }\n confirm={<Trans message=\"Confirm\" />}\n />\n </DialogTrigger>\n );\n}\n\nfunction CancelSubscriptionButton({subscription}: SubscriptionActionsProps) {\n const cancelSubscription = useCancelSubscription();\n\n const handleDeleteSubscription = () => {\n cancelSubscription.mutate(\n {subscriptionId: subscription.id, delete: true},\n {\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey(endpoint),\n });\n },\n },\n );\n };\n\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={confirmed => {\n if (confirmed) {\n handleDeleteSubscription();\n }\n }}\n >\n <Tooltip label={<Trans message=\"Delete subscription\" />}>\n <IconButton\n size=\"md\"\n className=\"text-muted\"\n disabled={cancelSubscription.isPending}\n >\n <CloseIcon />\n </IconButton>\n </Tooltip>\n <ConfirmationDialog\n isDanger\n title={<Trans message=\"Delete subscription\" />}\n body={\n <div>\n <Trans message=\"Are you sure you want to delete this subscription?\" />\n <div className=\"mt-10 text-sm font-semibold\">\n <Trans message=\"This will permanently delete the subscription and immediately cancel it on billing gateway. Subscription will not be renewable anymore.\" />\n </div>\n </div>\n }\n confirm={<Trans message=\"Confirm\" />}\n />\n </DialogTrigger>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const SyncIcon = createSvgIcon(\n <path d=\"M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z\" />\n, 'SyncOutlined');\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '../../../http/query-client';\nimport {useTrans} from '../../../i18n/use-trans';\nimport {BackendResponse} from '../../../http/backend-response/backend-response';\nimport {toast} from '../../../ui/toast/toast';\nimport {message} from '../../../i18n/message';\nimport {showHttpErrorToast} from '../../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\nexport function useSyncProducts() {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: () => syncPlans(),\n onSuccess: () => {\n toast(trans(message('Plans synced')));\n },\n onError: err => showHttpErrorToast(err, message('Could not sync plans')),\n });\n}\n\nfunction syncPlans(): Promise<Response> {\n return apiClient.post('billing/products/sync').then(r => r.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '../../../http/query-client';\nimport {BackendResponse} from '../../../http/backend-response/backend-response';\nimport {toast} from '../../../ui/toast/toast';\nimport {useTrans} from '../../../i18n/use-trans';\nimport {message} from '../../../i18n/message';\nimport {DatatableDataQueryKey} from '../../../datatable/requests/paginated-resources';\nimport {showHttpErrorToast} from '../../../utils/http/show-http-error-toast';\n\nconst endpoint = (id: number) => `billing/products/${id}`;\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n productId: number;\n}\n\nexport function useDeleteProduct() {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (payload: Payload) => updateProduct(payload),\n onSuccess: () => {\n toast(trans(message('Plan deleted')));\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('billing/products'),\n });\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction updateProduct({productId}: Payload): Promise<Response> {\n return apiClient.delete(endpoint(productId)).then(r => r.data);\n}\n","import {\n BackendFilter,\n FilterControlType,\n FilterOperator,\n} from '../../datatable/filters/backend-filter';\nimport {message} from '../../i18n/message';\nimport {\n createdAtFilter,\n updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\n\nexport const PlansIndexPageFilters: BackendFilter[] = [\n {\n key: 'subscriptions',\n label: message('Subscriptions'),\n description: message('Whether plan has any active subscriptions'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: '01',\n options: [\n {\n key: '01',\n label: message('Has active subscriptions'),\n value: {value: '*', operator: FilterOperator.has},\n },\n {\n key: '02',\n label: message('Does not have active subscriptions'),\n value: {value: '*', operator: FilterOperator.doesntHave},\n },\n ],\n },\n },\n createdAtFilter({\n description: message('Date plan was created'),\n }),\n updatedAtFilter({\n description: message('Date plan was last updated'),\n }),\n];\n","import React, {Fragment} from 'react';\nimport {DataTablePage} from '../../datatable/page/data-table-page';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {EditIcon} from '../../icons/material/Edit';\nimport {FormattedDate} from '../../i18n/formatted-date';\nimport {ColumnConfig} from '../../datatable/column-config';\nimport {Trans} from '../../i18n/trans';\nimport {DataTableEmptyStateMessage} from '../../datatable/page/data-table-emty-state-message';\nimport softwareEngineerSvg from './../tags/software-engineer.svg';\nimport {DataTableAddItemButton} from '../../datatable/data-table-add-item-button';\nimport {Product} from '../../billing/product';\nimport {NameWithAvatar} from '../../datatable/column-templates/name-with-avatar';\nimport {Link} from 'react-router-dom';\nimport {FormattedPrice} from '../../i18n/formatted-price';\nimport {SyncIcon} from '../../icons/material/Sync';\nimport {useSyncProducts} from './requests/use-sync-products';\nimport {Tooltip} from '../../ui/tooltip/tooltip';\nimport {useDeleteProduct} from './requests/use-delete-product';\nimport {DeleteIcon} from '../../icons/material/Delete';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {ConfirmationDialog} from '../../ui/overlays/dialog/confirmation-dialog';\nimport {useNavigate} from '../../utils/hooks/use-navigate';\nimport {PlansIndexPageFilters} from './plans-index-page-filters';\n\nconst columnConfig: ColumnConfig<Product>[] = [\n {\n key: 'name',\n allowsSorting: true,\n visibleInMode: 'all',\n header: () => <Trans message=\"Name\" />,\n body: product => {\n const price = product.prices[0];\n return (\n <NameWithAvatar\n label={product.name}\n description={\n product.free ? (\n <Trans message=\"Free\" />\n ) : (\n <FormattedPrice price={price} />\n )\n }\n />\n );\n },\n },\n {\n key: 'created_at',\n allowsSorting: true,\n maxWidth: 'max-w-100',\n header: () => <Trans message=\"Created\" />,\n body: product => <FormattedDate date={product.created_at} />,\n },\n {\n key: 'updated_at',\n allowsSorting: true,\n maxWidth: 'max-w-100',\n header: () => <Trans message=\"Last updated\" />,\n body: product => <FormattedDate date={product.updated_at} />,\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n visibleInMode: 'all',\n hideHeader: true,\n align: 'end',\n maxWidth: 'max-w-84',\n body: product => {\n return (\n <Fragment>\n <IconButton\n size=\"md\"\n className=\"text-muted\"\n elementType={Link}\n to={`/admin/plans/${product.id}/edit`}\n >\n <EditIcon />\n </IconButton>\n <DeleteProductButton product={product} />\n </Fragment>\n );\n },\n },\n];\n\nexport function PlansIndexPage() {\n const navigate = useNavigate();\n return (\n <DataTablePage\n endpoint=\"billing/products\"\n title={<Trans message=\"Subscription plans\" />}\n columns={columnConfig}\n actions={<Actions />}\n enableSelection={false}\n filters={PlansIndexPageFilters}\n onRowAction={item => {\n navigate(`/admin/plans/${item.id}/edit`);\n }}\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={softwareEngineerSvg}\n title={<Trans message=\"No plans have been created yet\" />}\n filteringTitle={<Trans message=\"No matching plans\" />}\n />\n }\n />\n );\n}\n\ninterface DeleteProductButtonProps {\n product: Product;\n}\nfunction DeleteProductButton({product}: DeleteProductButtonProps) {\n const deleteProduct = useDeleteProduct();\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={confirmed => {\n if (confirmed) {\n deleteProduct.mutate({productId: product.id});\n }\n }}\n >\n <Tooltip label={<Trans message=\"Delete plan\" />}>\n <IconButton\n size=\"md\"\n className=\"text-muted\"\n disabled={deleteProduct.isPending}\n >\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n <ConfirmationDialog\n title={<Trans message=\"Delete plan\" />}\n body={<Trans message=\"Are you sure you want to delete this plan?\" />}\n confirm={<Trans message=\"Delete\" />}\n />\n </DialogTrigger>\n );\n}\n\nfunction Actions() {\n const syncPlans = useSyncProducts();\n return (\n <Fragment>\n <Tooltip label={<Trans message=\"Sync plans with Stripe & PayPal\" />}>\n <IconButton\n color=\"primary\"\n variant=\"outline\"\n size=\"sm\"\n disabled={syncPlans.isPending}\n onClick={() => {\n syncPlans.mutate();\n }}\n >\n <SyncIcon />\n </IconButton>\n </Tooltip>\n <DataTableAddItemButton elementType={Link} to=\"/admin/plans/new\">\n <Trans message=\"Add new plan\" />\n </DataTableAddItemButton>\n </Fragment>\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient} from '@common/http/query-client';\nimport {useParams} from 'react-router-dom';\nimport {Product} from '@common/billing/product';\n\nconst Endpoint = (id: number | string) => `billing/products/${id}`;\n\nexport interface FetchRoleResponse extends BackendResponse {\n product: Product;\n}\n\nexport function useProduct() {\n const {productId} = useParams();\n return useQuery({\n queryKey: [Endpoint(productId!)],\n queryFn: () => fetchProduct(productId!),\n });\n}\n\nfunction fetchProduct(productId: number | string): Promise<FetchRoleResponse> {\n return apiClient.get(Endpoint(productId)).then(response => response.data);\n}\n","import {message} from '../../../i18n/message';\n\nexport const BillingPeriodPresets = [\n {\n key: 'day1',\n label: message('Daily'),\n interval: 'day',\n interval_count: 1,\n },\n {\n key: 'week1',\n label: message('Weekly'),\n interval: 'week',\n interval_count: 1,\n },\n {\n key: 'month1',\n label: message('Monthly'),\n interval: 'month',\n interval_count: 1,\n },\n {\n key: 'month3',\n label: message('Every 3 months'),\n interval: 'month',\n interval_count: 3,\n },\n {\n key: 'month6',\n label: message('Every 6 months'),\n interval: 'month',\n interval_count: 6,\n },\n {\n key: 'year1',\n label: message('Yearly'),\n interval: 'year',\n interval_count: 1,\n },\n {\n key: 'custom',\n label: message('Custom'),\n interval: null,\n interval_count: null,\n },\n];\n","import {useFormContext} from 'react-hook-form';\nimport {Product} from '@common/billing/product';\nimport React, {Fragment, useMemo, useState} from 'react';\nimport {useValueLists} from '@common/http/value-lists';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {FormSelect, Select} from '@common/ui/forms/select/select';\nimport {Price} from '@common/billing/price';\nimport {BillingPeriodPresets} from '@common/admin/plans/crupdate-plan-page/billing-period-presets';\nimport {Button} from '@common/ui/buttons/button';\nimport {message} from '@common/i18n/message';\nimport {useTrans} from '@common/i18n/use-trans';\n\ninterface PriceFormProps {\n index: number;\n onRemovePrice: () => void;\n}\nexport function PriceForm({index, onRemovePrice}: PriceFormProps) {\n const {trans} = useTrans();\n const query = useValueLists(['currencies']);\n const currencies = useMemo(() => {\n return query.data?.currencies ? Object.values(query.data.currencies) : [];\n }, [query.data]);\n const {watch, getValues} = useFormContext<Product>();\n const isNewProduct = !watch('id');\n const isNewPrice = watch(`prices.${index}.id`) == null;\n const subscriberCount = watch(`prices.${index}.subscriptions_count`) || 0;\n\n // select billing period preset based on price \"interval\" and \"interval_count\"\n const [billingPeriodPreset, setBillingPeriodPreset] = useState(() => {\n const interval = getValues(`prices.${index}.interval`);\n const intervalCount = getValues(`prices.${index}.interval_count`);\n const preset = BillingPeriodPresets.find(\n p => p.key === `${interval}${intervalCount}`\n );\n return preset ? preset.key : 'custom';\n });\n\n const allowPriceChanges = isNewProduct || isNewPrice || !subscriberCount;\n\n return (\n <Fragment>\n {!allowPriceChanges && (\n <p className=\"text-muted text-sm max-w-500 mb-20\">\n <Trans\n message=\"This price can't modified or deleted, because it has [one 1 subscriber|other :count subscribers]. You can instead add a new price.\"\n values={{count: subscriberCount}}\n />\n </p>\n )}\n\n <FormTextField\n required\n disabled={!allowPriceChanges}\n label={<Trans message=\"Amount\" />}\n type=\"number\"\n min={0.1}\n step={0.01}\n name={`prices.${index}.amount`}\n className=\"mb-20\"\n />\n <FormSelect\n required\n disabled={!allowPriceChanges}\n label={<Trans message=\"Currency\" />}\n name={`prices.${index}.currency`}\n items={currencies}\n showSearchField\n searchPlaceholder={trans(message('Search currencies'))}\n selectionMode=\"single\"\n className=\"mb-20\"\n >\n {item => (\n <Item\n value={item.code}\n key={item.code}\n >{`${item.code}: ${item.name}`}</Item>\n )}\n </FormSelect>\n <BillingPeriodSelect\n disabled={!allowPriceChanges}\n index={index}\n value={billingPeriodPreset}\n onValueChange={setBillingPeriodPreset}\n />\n {billingPeriodPreset === 'custom' && (\n <CustomBillingPeriodField disabled={!allowPriceChanges} index={index} />\n )}\n <div className=\"text-right\">\n <Button\n size=\"xs\"\n variant=\"outline\"\n color=\"danger\"\n disabled={!allowPriceChanges}\n onClick={() => {\n onRemovePrice();\n }}\n >\n <Trans message=\"Delete price\" />\n </Button>\n </div>\n </Fragment>\n );\n}\n\ninterface BillingPeriodSelectProps {\n index: number;\n value: string;\n onValueChange: (value: string) => void;\n disabled: boolean;\n}\nfunction BillingPeriodSelect({\n index,\n value,\n onValueChange,\n disabled,\n}: BillingPeriodSelectProps) {\n const {setValue: setFormValue} = useFormContext<Product>();\n\n return (\n <Select\n label={<Trans message=\"Billing period\" />}\n disabled={disabled}\n className=\"mb-20\"\n selectionMode=\"single\"\n selectedValue={value}\n onSelectionChange={value => {\n onValueChange(value as string);\n if (value === 'custom') {\n } else {\n const preset = BillingPeriodPresets.find(p => p.key === value);\n if (preset) {\n setFormValue(\n `prices.${index}.interval`,\n preset.interval as Price['interval']\n );\n setFormValue(\n `prices.${index}.interval_count`,\n preset.interval_count as number\n );\n }\n }\n }}\n >\n {BillingPeriodPresets.map(preset => (\n <Item key={preset.key} value={preset.key}>\n <Trans {...preset.label} />\n </Item>\n ))}\n </Select>\n );\n}\n\ninterface CustomBillingPeriodFieldProps {\n index: number;\n disabled: boolean;\n}\nfunction CustomBillingPeriodField({\n index,\n disabled,\n}: CustomBillingPeriodFieldProps) {\n const {watch} = useFormContext<Product>();\n const interval = watch(`prices.${index}.interval`);\n let maxIntervalCount: number;\n\n if (interval === 'day') {\n maxIntervalCount = 365;\n } else if (interval === 'week') {\n maxIntervalCount = 52;\n } else {\n maxIntervalCount = 12;\n }\n\n return (\n <div className=\"flex border rounded w-min\">\n <div className=\"px-18 flex items-center text-sm\">\n <Trans message=\"Every\" />\n </div>\n <FormTextField\n inputShadow=\"shadow-none\"\n inputBorder=\"border-none\"\n className=\"border-l border-r w-80\"\n name={`prices.${index}.interval_count`}\n type=\"number\"\n min={1}\n max={maxIntervalCount}\n disabled={disabled}\n required\n />\n <FormSelect\n inputShadow=\"shadow-none\"\n inputBorder=\"border-none\"\n name={`prices.${index}.interval`}\n selectionMode=\"single\"\n disabled={disabled}\n >\n <Item value=\"day\">\n <Trans message=\"Days\" />\n </Item>\n <Item value=\"week\">\n <Trans message=\"Weeks\" />\n </Item>\n <Item value=\"month\">\n <Trans message=\"Months\" />\n </Item>\n </FormSelect>\n </div>\n );\n}\n","import {FormTextField} from '../../../ui/forms/input-field/text-field/text-field';\nimport {Trans} from '../../../i18n/trans';\nimport React, {Fragment, ReactNode} from 'react';\nimport {useFieldArray, useFormContext} from 'react-hook-form';\nimport {Accordion, AccordionItem} from '../../../ui/accordion/accordion';\nimport {FormattedPrice} from '../../../i18n/formatted-price';\nimport {FormPermissionSelector} from '../../../auth/ui/permission-selector';\nimport {PriceForm} from './price-form';\nimport {Button} from '../../../ui/buttons/button';\nimport {AddIcon} from '../../../icons/material/Add';\nimport {IconButton} from '../../../ui/buttons/icon-button';\nimport {CloseIcon} from '../../../icons/material/Close';\nimport {CreateProductPayload} from '../requests/use-create-product';\nimport {FormSwitch} from '../../../ui/forms/toggle/switch';\nimport {FormSelect} from '../../../ui/forms/select/select';\nimport {Item} from '../../../ui/forms/listbox/item';\nimport {FormFileSizeField} from '../../../ui/forms/input-field/file-size-field';\nimport {Link} from 'react-router-dom';\nimport {LinkStyle} from '../../../ui/buttons/external-link';\n\nexport function CrupdatePlanForm() {\n return (\n <Fragment>\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Name\" />}\n className=\"mb-20\"\n required\n autoFocus\n />\n <FormTextField\n name=\"description\"\n label={<Trans message=\"Description\" />}\n className=\"mb-20\"\n inputElementType=\"textarea\"\n rows={4}\n />\n <FormSelect\n name=\"position\"\n selectionMode=\"single\"\n label={<Trans message=\"Position in pricing table\" />}\n className=\"mb-20\"\n >\n <Item value={0}>\n <Trans message=\"First\" />\n </Item>\n <Item value={1}>\n <Trans message=\"Second\" />\n </Item>\n <Item value={2}>\n <Trans message=\"Third\" />\n </Item>\n <Item value={3}>\n <Trans message=\"Fourth\" />\n </Item>\n <Item value={4}>\n <Trans message=\"Fifth\" />\n </Item>\n </FormSelect>\n <FormFileSizeField\n className=\"mb-30\"\n name=\"available_space\"\n label={<Trans message=\"Allowed storage space\" />}\n description={\n <Trans\n values={{\n a: parts => (\n <Link\n className={LinkStyle}\n target=\"_blank\"\n to=\"/admin/settings/uploading\"\n >\n {parts}\n </Link>\n ),\n }}\n message=\"Total storage space all user uploads are allowed to take up.\"\n />\n }\n />\n <FormSwitch\n name=\"recommended\"\n className=\"mb-20\"\n description={\n <Trans message=\"Plan will be displayed more prominently on pricing page.\" />\n }\n >\n <Trans message=\"Recommend\" />\n </FormSwitch>\n <FormSwitch\n name=\"hidden\"\n className=\"mb-20\"\n description={\n <Trans message=\"Plan will not be shown on pricing or upgrade pages.\" />\n }\n >\n <Trans message=\"Hidden\" />\n </FormSwitch>\n <FormSwitch\n name=\"free\"\n className=\"mb-20\"\n description={\n <Trans message=\"Will be assigned to all users, if they are not subscribed already.\" />\n }\n >\n <Trans message=\"Free\" />\n </FormSwitch>\n <Header>\n <Trans message=\"Feature list\" />\n </Header>\n <FeatureListForm />\n <PricingListForm />\n <Header>\n <Trans message=\"Permissions\" />\n </Header>\n <FormPermissionSelector name=\"permissions\" />\n </Fragment>\n );\n}\n\ninterface HeaderProps {\n children: ReactNode;\n}\nfunction Header({children}: HeaderProps) {\n return <h2 className=\"mt-40 mb-20 text-base font-semibold\">{children}</h2>;\n}\n\nfunction FeatureListForm() {\n const {fields, append, remove} = useFieldArray<CreateProductPayload>({\n name: 'feature_list',\n });\n return (\n <div>\n {fields.map((field, index) => {\n return (\n <div key={field.id} className=\"flex gap-10 mb-10\">\n <FormTextField\n name={`feature_list.${index}.value`}\n size=\"sm\"\n className=\"flex-auto\"\n />\n <IconButton\n size=\"sm\"\n color=\"primary\"\n className=\"flex-shrink-0\"\n onClick={() => {\n remove(index);\n }}\n >\n <CloseIcon />\n </IconButton>\n </div>\n );\n })}\n <Button\n variant=\"text\"\n color=\"primary\"\n startIcon={<AddIcon />}\n size=\"xs\"\n onClick={() => {\n append({value: ''});\n }}\n >\n <Trans message=\"Add another line\" />\n </Button>\n </div>\n );\n}\n\nfunction PricingListForm() {\n const {\n watch,\n formState: {errors},\n } = useFormContext<CreateProductPayload>();\n const {fields, append, remove} = useFieldArray<\n CreateProductPayload,\n 'prices',\n 'key'\n >({\n name: 'prices',\n keyName: 'key',\n });\n\n // if plan is marked as free, hide pricing form\n if (watch('free')) {\n return null;\n }\n\n return (\n <Fragment>\n <Header>\n <Trans message=\"Pricing\" />\n </Header>\n {errors.prices?.message && (\n <div className=\"text-sm text-danger mb-20\">{errors.prices.message}</div>\n )}\n <Accordion variant=\"outline\" className=\"mb-10\">\n {fields.map((field, index) => (\n <AccordionItem\n label={<FormattedPrice price={field} />}\n key={field.key}\n >\n <PriceForm\n index={index}\n onRemovePrice={() => {\n remove(index);\n }}\n />\n </AccordionItem>\n ))}\n </Accordion>\n <Button\n variant=\"text\"\n color=\"primary\"\n startIcon={<AddIcon />}\n size=\"xs\"\n onClick={() => {\n append({\n currency: 'USD',\n amount: 1,\n interval_count: 1,\n interval: 'month',\n });\n }}\n >\n <Trans message=\"Add another price\" />\n </Button>\n </Fragment>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '../../../http/query-client';\nimport {BackendResponse} from '../../../http/backend-response/backend-response';\nimport {toast} from '../../../ui/toast/toast';\nimport {useTrans} from '../../../i18n/use-trans';\nimport {message} from '../../../i18n/message';\nimport {DatatableDataQueryKey} from '../../../datatable/requests/paginated-resources';\nimport {Product} from '../../../billing/product';\nimport {useNavigate} from '../../../utils/hooks/use-navigate';\nimport {CreateProductPayload} from './use-create-product';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '../../../errors/on-form-query-error';\n\ninterface Response extends BackendResponse {\n product: Product;\n}\n\nexport interface UpdateProductPayload extends CreateProductPayload {\n id: number;\n}\n\nconst Endpoint = (id: number) => `billing/products/${id}`;\n\nexport function useUpdateProduct(form: UseFormReturn<UpdateProductPayload>) {\n const {trans} = useTrans();\n const navigate = useNavigate();\n return useMutation({\n mutationFn: (payload: UpdateProductPayload) => updateProduct(payload),\n onSuccess: response => {\n toast(trans(message('Plan updated')));\n queryClient.invalidateQueries({\n queryKey: [Endpoint(response.product.id)],\n });\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('billing/products'),\n });\n navigate('/admin/plans');\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction updateProduct({\n id,\n ...payload\n}: UpdateProductPayload): Promise<Response> {\n const backendPayload = {\n ...payload,\n feature_list: payload.feature_list.map(feature => feature.value),\n };\n return apiClient.put(Endpoint(id), backendPayload).then(r => r.data);\n}\n","import {FullPageLoader} from '../../../ui/progress/full-page-loader';\nimport {Trans} from '../../../i18n/trans';\nimport {useForm} from 'react-hook-form';\nimport {CrupdateResourceLayout} from '../../crupdate-resource-layout';\nimport {useProduct} from '../requests/use-product';\nimport {Product} from '../../../billing/product';\nimport {CrupdatePlanForm} from './crupdate-plan-form';\nimport {\n UpdateProductPayload,\n useUpdateProduct,\n} from '../requests/use-update-product';\n\nexport function EditPlanPage() {\n const query = useProduct();\n\n if (query.status !== 'success') {\n return <FullPageLoader />;\n }\n\n return <PageContent product={query.data.product} />;\n}\n\ninterface PageContentProps {\n product: Product;\n}\nfunction PageContent({product}: PageContentProps) {\n const form = useForm<UpdateProductPayload>({\n defaultValues: {\n ...product,\n feature_list: product.feature_list.map(f => ({value: f})),\n },\n });\n const updateProduct = useUpdateProduct(form);\n\n return (\n <CrupdateResourceLayout\n form={form}\n onSubmit={values => {\n updateProduct.mutate(values);\n }}\n title={\n <Trans message=\"Edit “:name“ plan\" values={{name: product.name}} />\n }\n isLoading={updateProduct.isPending}\n >\n <CrupdatePlanForm />\n </CrupdateResourceLayout>\n );\n}\n","import {Product} from '../../../billing/product';\nimport {useTrans} from '../../../i18n/use-trans';\nimport {useNavigate} from '../../../utils/hooks/use-navigate';\nimport {useMutation} from '@tanstack/react-query';\nimport {toast} from '../../../ui/toast/toast';\nimport {message} from '../../../i18n/message';\nimport {apiClient, queryClient} from '../../../http/query-client';\nimport {DatatableDataQueryKey} from '../../../datatable/requests/paginated-resources';\nimport {Price} from '../../../billing/price';\nimport {onFormQueryError} from '../../../errors/on-form-query-error';\nimport {UseFormReturn} from 'react-hook-form';\n\nconst endpoint = 'billing/products';\n\nexport interface CreateProductPayload\n extends Omit<Partial<Product>, 'feature_list' | 'prices'> {\n feature_list: {value: string}[];\n prices: Omit<Price, 'id'>[];\n}\n\nexport function useCreateProduct(form: UseFormReturn<CreateProductPayload>) {\n const {trans} = useTrans();\n const navigate = useNavigate();\n return useMutation({\n mutationFn: (payload: CreateProductPayload) => createProduct(payload),\n onSuccess: () => {\n toast(trans(message('Plan created')));\n queryClient.invalidateQueries({queryKey: [endpoint]});\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('billing/products'),\n });\n navigate('/admin/plans');\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction createProduct(payload: CreateProductPayload): Promise<Response> {\n const backendPayload = {\n ...payload,\n feature_list: payload.feature_list.map(feature => feature.value),\n };\n return apiClient.post(endpoint, backendPayload).then(r => r.data);\n}\n","import {useForm} from 'react-hook-form';\nimport {CrupdateResourceLayout} from '../../crupdate-resource-layout';\nimport {Trans} from '../../../i18n/trans';\nimport {CrupdatePlanForm} from './crupdate-plan-form';\nimport {\n CreateProductPayload,\n useCreateProduct,\n} from '../requests/use-create-product';\n\nexport function CreatePlanPage() {\n const form = useForm<CreateProductPayload>({\n defaultValues: {\n free: false,\n recommended: false,\n },\n });\n const createProduct = useCreateProduct(form);\n\n return (\n <CrupdateResourceLayout\n form={form}\n onSubmit={values => {\n createProduct.mutate(values);\n }}\n title={<Trans message=\"Create new plan\" />}\n isLoading={createProduct.isPending}\n >\n <CrupdatePlanForm />\n </CrupdateResourceLayout>\n );\n}\n","import {SettingsPanel} from '../settings-panel';\nimport {SettingsSeparator} from '../settings-separator';\nimport {Trans} from '../../../i18n/trans';\nimport {FormSwitch} from '../../../ui/forms/toggle/switch';\nimport {useFieldArray, useFormContext} from 'react-hook-form';\nimport {AdminSettings} from '../admin-settings';\nimport React, {Fragment} from 'react';\nimport {FormSelect} from '../../../ui/forms/select/select';\nimport {Item} from '../../../ui/forms/listbox/item';\nimport {MenuItemForm} from '../../menus/menu-item-form';\nimport {Button} from '../../../ui/buttons/button';\nimport {AddIcon} from '../../../icons/material/Add';\nimport {DialogTrigger} from '../../../ui/overlays/dialog/dialog-trigger';\nimport {AddMenuItemDialog} from '../../appearance/sections/menus/add-menu-item-dialog';\nimport {Accordion, AccordionItem} from '../../../ui/accordion/accordion';\nimport {IconButton} from '../../../ui/buttons/icon-button';\nimport {CloseIcon} from '../../../icons/material/Close';\n\nexport function GdprSettings() {\n return (\n <SettingsPanel\n title={<Trans message=\"GDPR\" />}\n description={\n <Trans message=\"Configure settings related to EU General Data Protection Regulation.\" />\n }\n >\n <CookieNoticeSection />\n <SettingsSeparator />\n <RegistrationPoliciesSection />\n </SettingsPanel>\n );\n}\n\nfunction CookieNoticeSection() {\n const {watch} = useFormContext<AdminSettings>();\n const noticeEnabled = watch('client.cookie_notice.enable');\n\n return (\n <div>\n <FormSwitch\n name=\"client.cookie_notice.enable\"\n className=\"mb-20\"\n description={\n <Trans message=\"Whether cookie notice should be shown automatically to users from EU until it is accepted.\" />\n }\n >\n <Trans message=\"Enable cookie notice\" />\n </FormSwitch>\n {noticeEnabled && (\n <Fragment>\n <div className=\"mb-20 border-b pb-6\">\n <div className=\"mb-20 border-b pb-10 text-sm font-medium\">\n <Trans message=\"Information button\" />\n </div>\n <MenuItemForm\n hideRoleAndPermissionFields\n formPathPrefix=\"client.cookie_notice.button\"\n />\n </div>\n <FormSelect\n name=\"client.cookie_notice.position\"\n selectionMode=\"single\"\n label={<Trans message=\"Cookie notice position\" />}\n className=\"mb-20\"\n >\n <Item value=\"top\">\n <Trans message=\"Top\" />\n </Item>\n <Item value=\"bottom\">\n <Trans message=\"Bottom\" />\n </Item>\n </FormSelect>\n </Fragment>\n )}\n </div>\n );\n}\n\nfunction RegistrationPoliciesSection() {\n const {fields, append, remove} = useFieldArray<\n AdminSettings,\n 'client.registration.policies'\n >({\n name: 'client.registration.policies',\n });\n\n return (\n <Fragment>\n <div className=\"mb-6 text-sm\">\n <Trans message=\"Registration policies\" />\n </div>\n <div className=\"text-xs text-muted\">\n <Trans message=\"Create policies that will be shown on registration page. User will be required to accept them by toggling a checkbox.\" />\n </div>\n <Accordion className=\"mt-16\" variant=\"outline\">\n {fields.map((field, index) => (\n <AccordionItem\n key={field.id}\n label={field.label}\n chevronPosition=\"left\"\n endAppend={\n <IconButton\n variant=\"text\"\n color=\"danger\"\n size=\"sm\"\n onClick={() => {\n remove(index);\n }}\n >\n <CloseIcon />\n </IconButton>\n }\n >\n <MenuItemForm\n hideRoleAndPermissionFields\n formPathPrefix={`client.register_policies.${index}`}\n />\n </AccordionItem>\n ))}\n </Accordion>\n <DialogTrigger\n type=\"modal\"\n onClose={value => {\n if (value) {\n append(value);\n }\n }}\n >\n <Button\n className=\"mt-12\"\n variant=\"link\"\n color=\"primary\"\n startIcon={<AddIcon />}\n size=\"xs\"\n >\n <Trans message=\"Add another policy\" />\n </Button>\n <AddMenuItemDialog title={<Trans message=\"Add policy\" />} />\n </DialogTrigger>\n </Fragment>\n );\n}\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const InfoDialogTriggerIcon = createSvgIcon(\n <path d=\"M9 8a1 1 0 0 0-1-1H5.5a1 1 0 1 0 0 2H7v4a1 1 0 0 0 2 0zM4 0h8a4 4 0 0 1 4 4v8a4 4 0 0 1-4 4H4a4 4 0 0 1-4-4V4a4 4 0 0 1 4-4zm4 5.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z\" />,\n 'InfoDialogTrigger'\n);\n","import {IconButton} from '@common/ui/buttons/icon-button';\nimport {InfoDialogTriggerIcon} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger-icon';\nimport {Dialog, DialogSize} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport React, {ReactNode} from 'react';\nimport clsx from 'clsx';\n\ninterface Props {\n title?: ReactNode;\n body: ReactNode;\n dialogSize?: DialogSize;\n className?: string;\n}\nexport function InfoDialogTrigger({\n title,\n body,\n dialogSize = 'sm',\n className,\n}: Props) {\n return (\n <DialogTrigger type=\"popover\" triggerOnHover>\n <IconButton\n className={clsx('ml-4 text-muted opacity-70', className)}\n iconSize=\"xs\"\n size=\"2xs\"\n >\n <InfoDialogTriggerIcon viewBox=\"0 0 16 16\" />\n </IconButton>\n <Dialog size={dialogSize}>\n {title && (\n <DialogHeader padding=\"px-18 pt-12\" size=\"md\" hideDismissButton>\n {title}\n </DialogHeader>\n )}\n <DialogBody>{body}</DialogBody>\n </Dialog>\n </DialogTrigger>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const HomeIcon = createSvgIcon(\n <path d=\"m12 5.69 5 4.5V18h-2v-6H9v6H7v-7.81l5-4.5M12 3 2 12h3v8h6v-6h2v6h6v-8h3L12 3z\" />\n, 'HomeOutlined');\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Link} from 'react-router-dom';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport React from 'react';\nimport {Channel} from '@common/channels/channel';\nimport {Chip} from '@common/ui/forms/input-field/chip-field/chip';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {HomeIcon} from '@common/icons/material/Home';\n\nexport const ChannelsDatatableColumns: ColumnConfig<Channel>[] = [\n {\n key: 'name',\n allowsSorting: true,\n width: 'flex-3',\n visibleInMode: 'all',\n header: () => <Trans message=\"Name\" />,\n body: channel => {\n return (\n <div>\n <div className=\"overflow-hidden overflow-ellipsis whitespace-nowrap font-medium\">\n <ChannelName channel={channel} />\n </div>\n {channel.config.adminDescription && (\n <p className=\"max-w-680 whitespace-normal text-xs text-muted\">\n {channel.config.adminDescription}\n </p>\n )}\n </div>\n );\n },\n },\n {\n key: 'content',\n allowsSorting: false,\n header: () => <Trans message=\"Content\" />,\n body: channel => <ContentType channel={channel} />,\n },\n {\n key: 'content_type',\n allowsSorting: false,\n header: () => <Trans message=\"Content type\" />,\n body: channel => (\n <span className=\"capitalize\">\n {channel.config.contentModel ? (\n <Trans message={channel.config.contentModel} />\n ) : undefined}\n </span>\n ),\n },\n {\n key: 'internal',\n allowsSorting: true,\n maxWidth: 'max-w-100',\n hideHeader: true,\n header: () => <Trans message=\"Internal\" />,\n body: channel => <InternalColumn channel={channel} />,\n },\n {\n key: 'updated_at',\n allowsSorting: true,\n maxWidth: 'max-w-100',\n header: () => <Trans message=\"Last updated\" />,\n body: channel =>\n channel.updated_at ? <FormattedDate date={channel.updated_at} /> : '',\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n visibleInMode: 'all',\n align: 'end',\n width: 'w-42 flex-shrink-0',\n body: channel => (\n <Link to={`${channel.id}/edit`} className=\"text-muted\">\n <IconButton size=\"md\">\n <EditIcon />\n </IconButton>\n </Link>\n ),\n },\n];\n\ninterface ContentTypeProps {\n channel: Channel;\n}\nfunction ContentType({channel}: ContentTypeProps) {\n switch (channel.config.contentType) {\n case 'listAll':\n return <Trans message=\"List all\" />;\n case 'manual':\n return <Trans message=\"Managed manually\" />;\n case 'autoUpdate':\n return <Trans message=\"Updated automatically\" />;\n }\n}\n\ninterface ChannelNameProps {\n channel: Channel;\n}\nfunction ChannelName({channel}: ChannelNameProps) {\n // link will not work without specific genre name in channel url\n if (\n channel.config.restriction &&\n channel.config.restrictionModelId === 'urlParam'\n ) {\n return channel.name;\n }\n return (\n <a\n className=\"outline-none hover:underline focus-visible:underline\"\n href={`channel/${channel.slug}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {channel.name}\n </a>\n );\n}\n\nfunction InternalColumn({channel}: ChannelNameProps) {\n const {homepage} = useSettings();\n const internalLabel = channel.internal ? (\n <Tooltip\n label={\n <Trans message=\"This channel is required for some site functionality to work properly and can't be deleted.\" />\n }\n >\n <div>\n <Chip className=\"w-max\" size=\"xs\" radius=\"rounded-panel\">\n <Trans message=\"Internal\" />\n </Chip>\n </div>\n </Tooltip>\n ) : (\n ''\n );\n\n const isHomepage =\n homepage?.type === 'channels' && `${homepage.value}` === `${channel.id}`;\n\n return (\n <div className=\"flex items-center gap-6\">\n {internalLabel}\n {isHomepage ? <HomeIcon className=\"text-muted\" size=\"sm\" /> : null}\n </div>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n preset: string;\n}\n\nexport function useApplyChannelPreset() {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (payload: Payload) => resetChannels(payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('channel'),\n });\n toast(trans(message('Channel preset applied')));\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction resetChannels(payload: Payload) {\n return apiClient\n .post<Response>('channel/apply-preset', payload)\n .then(r => r.data);\n}\n","import {LearnMoreLink} from '@common/admin/settings/learn-more-link';\nimport {useContext} from 'react';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\n\ninterface Props {\n className?: string;\n hash?: string;\n}\nexport function ChannelsDocsLink({className, hash}: Props) {\n const {admin} = useContext(SiteConfigContext);\n if (!admin?.channelsDocsLink) return null;\n const link = hash\n ? `${admin.channelsDocsLink}#${hash}`\n : admin.channelsDocsLink;\n return <LearnMoreLink link={link} className={className} />;\n}\n","import React, {Fragment} from 'react';\nimport {Trans} from '@common/i18n/trans';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport playlist from './playlist.svg';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\nimport {Link} from 'react-router-dom';\nimport {ChannelsDatatableColumns} from '@common/admin/channels/channels-datatable-columns';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport {useApplyChannelPreset} from '@common/admin/channels/requests/use-apply-channel-preset';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {DeleteSelectedItemsAction} from '@common/datatable/page/delete-selected-items-action';\nimport {useDataTable} from '@common/datatable/page/data-table-context';\nimport {Channel} from '@common/channels/channel';\nimport {Menu, MenuTrigger} from '@common/ui/navigation/menu/menu-trigger';\nimport {Button} from '@common/ui/buttons/button';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {KeyboardArrowDownIcon} from '@common/icons/material/KeyboardArrowDown';\nimport {openDialog} from '@common/ui/overlays/store/dialog-store';\nimport {ChannelsDocsLink} from '@common/admin/channels/channels-docs-link';\n\ninterface ChannelPresetConfig {\n preset: string;\n name: string;\n description: string;\n}\n\nexport function ChannelsDatatablePage() {\n return (\n <DataTablePage\n endpoint=\"channel\"\n title={<Trans message=\"Channels\" />}\n headerContent={<InfoTrigger />}\n headerItemsAlign=\"items-center\"\n queryParams={{type: 'channel'}}\n columns={ChannelsDatatableColumns}\n actions={<Actions />}\n selectedActions={<DeleteSelectedItemsAction />}\n cellHeight=\"h-52\"\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={playlist}\n title={<Trans message=\"No channels have been created yet\" />}\n filteringTitle={<Trans message=\"No matching channels\" />}\n />\n }\n />\n );\n}\n\nfunction InfoTrigger() {\n return (\n <InfoDialogTrigger\n body={\n <Fragment>\n <Trans message=\"Channels are used to create pages that show various content on the site.\" />\n <ChannelsDocsLink className=\"mt-14\" />\n </Fragment>\n }\n />\n );\n}\n\nfunction Actions() {\n const {query} = useDataTable<Channel, {presets: ChannelPresetConfig[]}>();\n return (\n <Fragment>\n <MenuTrigger\n onItemSelected={preset => openDialog(ApplyPresetDialog, {preset})}\n >\n <Button\n variant=\"outline\"\n color=\"primary\"\n size=\"sm\"\n endIcon={<KeyboardArrowDownIcon />}\n disabled={!query.data?.presets.length}\n >\n <Trans message=\"Apply preset\" />\n </Button>\n <Menu>\n {query.data?.presets.map(preset => (\n <Item\n key={preset.preset}\n value={preset.preset}\n description={<Trans message={preset.description} />}\n >\n <Trans message={preset.name} />\n </Item>\n ))}\n </Menu>\n </MenuTrigger>\n <DataTableAddItemButton elementType={Link} to=\"new\">\n <Trans message=\"Add new channel\" />\n </DataTableAddItemButton>\n </Fragment>\n );\n}\n\ninterface ApplyPresetDialogProps {\n preset: string;\n}\nfunction ApplyPresetDialog({preset}: ApplyPresetDialogProps) {\n const {close} = useDialogContext();\n const resetChannels = useApplyChannelPreset();\n return (\n <ConfirmationDialog\n isLoading={resetChannels.isPending}\n onConfirm={() => {\n resetChannels.mutate({preset}, {onSuccess: () => close()});\n }}\n isDanger\n title={<Trans message=\"Apply preset\" />}\n body={\n <Trans message=\"Are you sure you want to apply this channel preset? This will delete all current channels and leave only channels from the selected preset.\" />\n }\n confirm={<Trans message=\"Apply\" />}\n />\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {UseFormReturn} from 'react-hook-form';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {Channel} from '@common/channels/channel';\nimport {CreateChannelPayload} from '@common/admin/channels/requests/use-create-channel';\n\ninterface Response extends BackendResponse {\n channel: Channel;\n}\n\nexport interface UpdateChannelPayload extends CreateChannelPayload {\n id: number;\n}\n\nconst Endpoint = (id: number) => `channel/${id}`;\n\nexport function useUpdateChannel(form: UseFormReturn<UpdateChannelPayload>) {\n const {trans} = useTrans();\n const navigate = useNavigate();\n return useMutation({\n mutationFn: (payload: UpdateChannelPayload) => updateChannel(payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('channel'),\n });\n toast(trans(message('Channel updated')));\n navigate('/admin/channels');\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction updateChannel({\n id,\n ...payload\n}: UpdateChannelPayload): Promise<Response> {\n return apiClient.put(Endpoint(id), payload).then(r => r.data);\n}\n","import {useForm} from 'react-hook-form';\nimport React, {ReactNode} from 'react';\nimport {CrupdateResourceLayout} from '@common/admin/crupdate-resource-layout';\nimport {Trans} from '@common/i18n/trans';\nimport {PageStatus} from '@common/http/page-status';\nimport {useChannel} from '@common/channels/requests/use-channel';\nimport {Channel} from '@common/channels/channel';\nimport {\n UpdateChannelPayload,\n useUpdateChannel,\n} from '@common/admin/channels/requests/use-update-channel';\n\ninterface Props {\n children: ReactNode;\n}\nexport function EditChannelPageLayout({children}: Props) {\n const query = useChannel(undefined, 'editChannelPage');\n if (query.data) {\n return <PageContent channel={query.data.channel}>{children}</PageContent>;\n }\n return <PageStatus query={query} loaderIsScreen={false} />;\n}\n\ninterface PageContentProps {\n channel: Channel;\n children: ReactNode;\n}\nfunction PageContent({channel, children}: PageContentProps) {\n const form = useForm<UpdateChannelPayload>({\n // @ts-ignore\n defaultValues: {\n ...channel,\n },\n });\n const updateChannel = useUpdateChannel(form);\n\n return (\n <CrupdateResourceLayout\n form={form}\n onSubmit={values => {\n updateChannel.mutate(values);\n }}\n title={\n <Trans message=\"Edit “:name“ channel\" values={{name: channel.name}} />\n }\n isLoading={updateChannel.isPending}\n >\n {children}\n </CrupdateResourceLayout>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const DescriptionIcon = createSvgIcon(\n <path d=\"M8 16h8v2H8zm0-4h8v2H8zm6-10H6c-1.1 0-2 .9-2 2v16c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm4 18H6V4h7v5h5v11z\" />\n, 'DescriptionOutlined');\n","import React, {Fragment, useEffect, useState} from 'react';\nimport clsx from 'clsx';\nimport {RefCallBack} from 'react-hook-form';\nimport {Button} from './buttons/button';\nimport {LinkIcon} from '../icons/material/Link';\nimport {TextField} from './forms/input-field/text-field/text-field';\nimport {Trans} from '../i18n/trans';\nimport {useSettings} from '../core/settings/use-settings';\nimport {slugifyString} from '@common/utils/string/slugify-string';\n\nexport interface SlugEditorProps {\n prefix?: string;\n suffix?: string;\n host?: string;\n value?: string | null;\n placeholder?: string;\n onChange?: (value: string) => void;\n className?: string;\n inputRef?: RefCallBack;\n onInputBlur?: () => void;\n showLinkIcon?: boolean;\n pattern?: string;\n minLength?: number;\n maxLength?: number;\n hideButton?: boolean;\n}\nexport function SlugEditor({\n host,\n value: initialValue = '',\n placeholder,\n onChange,\n className,\n inputRef,\n onInputBlur,\n showLinkIcon = true,\n pattern,\n minLength,\n maxLength,\n hideButton,\n ...props\n}: SlugEditorProps) {\n const {base_url} = useSettings();\n const prefix = props.prefix ? `/${props.prefix}` : '';\n const suffix = props.suffix ? `/${props.suffix}` : '';\n const [isEditing, setIsEditing] = useState(false);\n const [value, setValue] = useState(initialValue);\n host = host || base_url;\n\n useEffect(() => {\n setValue(initialValue);\n }, [initialValue]);\n\n const handleSubmit = () => {\n if (!isEditing) {\n setIsEditing(true);\n } else {\n setIsEditing(false);\n if (value) {\n onChange?.(value);\n }\n }\n };\n\n let preview: string = '';\n if (value) {\n preview = value;\n } else if (placeholder) {\n preview = slugifyString(placeholder);\n }\n\n return (\n // can't use <form/> here as component might be used inside another form\n <div className={clsx('flex items-center', className)}>\n {showLinkIcon && <LinkIcon className=\"icon-md text-muted\" />}\n <div className=\"text-primary ml-6 mr-14\">\n {host}\n {prefix}\n {!isEditing && preview && (\n <Fragment>\n <span>/</span>\n <span className=\"font-medium\">{preview}</span>\n </Fragment>\n )}\n {!isEditing ? suffix : null}\n </div>\n {isEditing && (\n <TextField\n pattern={pattern}\n minLength={minLength}\n maxLength={maxLength}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleSubmit();\n }\n }}\n ref={inputRef}\n aria-label=\"slug\"\n autoFocus\n className=\"mr-14\"\n size=\"2xs\"\n value={value as string}\n onBlur={onInputBlur}\n onChange={e => {\n setValue(e.target.value);\n }}\n />\n )}\n {!hideButton && (\n <Button\n type=\"button\"\n color=\"chip\"\n variant=\"outline\"\n size=\"2xs\"\n onClick={() => {\n handleSubmit();\n }}\n >\n {isEditing ? <Trans message=\"Save\" /> : <Trans message=\"Edit\" />}\n </Button>\n )}\n </div>\n );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport React, {Fragment} from 'react';\nimport {useFormContext} from 'react-hook-form';\nimport {UpdateChannelPayload} from '@common/admin/channels/requests/use-update-channel';\nimport {SlugEditor} from '@common/ui/slug-editor';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport clsx from 'clsx';\n\ninterface Props {\n className?: string;\n autoFocus?: boolean;\n}\nexport function ChannelNameField({className, autoFocus}: Props) {\n return (\n <Fragment>\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Title\" />}\n required\n autoFocus={autoFocus}\n className={clsx('mb-10', className)}\n />\n <FormSlugField />\n </Fragment>\n );\n}\n\nfunction FormSlugField() {\n const {watch, setValue} = useFormContext<UpdateChannelPayload>();\n const value = watch('slug');\n const name = watch('name');\n const disableSlugEditing = watch('config.lockSlug');\n const restriction = watch('config.restriction');\n const restrictionId = watch('config.restrictionModelId');\n const {trans} = useTrans();\n return (\n <SlugEditor\n hideButton={disableSlugEditing}\n placeholder={name}\n suffix={\n restriction && restrictionId === 'urlParam'\n ? trans(message(':restriction_name', {values: {restriction}}))\n : undefined\n }\n className=\"text-sm\"\n pattern=\"[A-Za-z0-9_-]+\"\n minLength={3}\n maxLength={20}\n value={value}\n onChange={newSlug => {\n setValue('slug', newSlug);\n }}\n />\n );\n}\n","import {useFormContext} from 'react-hook-form';\nimport {FormSelect, Option} from '@common/ui/forms/select/select';\nimport {Trans} from '@common/i18n/trans';\nimport {UpdateChannelPayload} from '@common/admin/channels/requests/use-update-channel';\nimport {ChannelContentConfig} from '@common/admin/channels/channel-editor/channel-content-config';\n\ninterface Props {\n config: ChannelContentConfig;\n className?: string;\n}\nexport function ContentTypeField({config, className}: Props) {\n const {setValue} = useFormContext<UpdateChannelPayload>();\n return (\n <FormSelect\n className={className}\n selectionMode=\"single\"\n name=\"config.contentType\"\n label={<Trans message=\"Content\" />}\n onSelectionChange={newValue => {\n // if content type is \"auto update\" select first model that\n // can be auto updated, otherwise select first available model\n let model = Object.entries(config.models)[0];\n if (newValue === 'autoUpdate') {\n const newModel = Object.entries(config.models).find(\n ([, modelConfig]) => modelConfig.autoUpdateMethods?.length,\n );\n if (newModel) {\n model = newModel;\n }\n }\n const [modelName, modelConfig] = model;\n\n setValue('config.contentModel', modelName);\n setValue('config.restrictionModelId', undefined);\n setValue(\n 'config.autoUpdateMethod',\n newValue === 'autoUpdate' ? modelConfig.autoUpdateMethods?.[0] : '',\n );\n setValue('config.contentOrder', modelConfig.sortMethods[0]);\n (setValue as any)('config.restriction', null);\n }}\n >\n <Option value=\"listAll\">\n <Trans message=\"List all content of specified type\" />\n </Option>\n <Option value=\"manual\">\n <Trans message=\"Manage content manually\" />\n </Option>\n <Option value=\"autoUpdate\">\n <Trans message=\"Automatically update content with specified method\" />\n </Option>\n </FormSelect>\n );\n}\n","import {useFormContext} from 'react-hook-form';\nimport {FormSelect, Option} from '@common/ui/forms/select/select';\nimport {Trans} from '@common/i18n/trans';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\nimport {Fragment, ReactNode} from 'react';\nimport {UpdateChannelPayload} from '@common/admin/channels/requests/use-update-channel';\nimport {ChannelContentConfig} from '@common/admin/channels/channel-editor/channel-content-config';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport clsx from 'clsx';\nimport {ChannelsDocsLink} from '@common/admin/channels/channels-docs-link';\n\ninterface Props {\n children?: ReactNode;\n config: ChannelContentConfig;\n className?: string;\n}\nexport function ContentAutoUpdateField({children, config, className}: Props) {\n const {watch, setValue} = useFormContext<UpdateChannelPayload>();\n const modelConfig = config.models[watch('config.contentModel')];\n const selectedMethodConfig =\n config.autoUpdateMethods[watch('config.autoUpdateMethod')!];\n\n if (\n watch('config.contentType') !== 'autoUpdate' ||\n !modelConfig.autoUpdateMethods?.length\n ) {\n return null;\n }\n\n return (\n <div className={clsx('items-end gap-14 md:flex', className)}>\n <FormSelect\n required\n className=\"flex-auto\"\n selectionMode=\"single\"\n name=\"config.autoUpdateMethod\"\n onSelectionChange={value => {\n if (config.autoUpdateMethods[value].provider) {\n setValue(\n 'config.autoUpdateProvider',\n config.autoUpdateMethods[value].provider,\n );\n }\n }}\n label={\n <Fragment>\n <Trans message=\"Auto update method\" />\n <InfoDialogTrigger\n body={\n <Fragment>\n <div className=\"mb-20\">\n <Trans message=\"This option will automatically update channel content every 24 hours using the specified method.\" />\n </div>\n <ChannelsDocsLink hash=\"automatically-update-content-with-specified-method\" />\n </Fragment>\n }\n />\n </Fragment>\n }\n >\n {modelConfig.autoUpdateMethods.map(method => (\n <Option value={method} key={method}>\n <Trans {...config.autoUpdateMethods[method].label} />\n </Option>\n ))}\n </FormSelect>\n {selectedMethodConfig?.value ? (\n <FormTextField\n name=\"config.autoUpdateValue\"\n required\n className=\"flex-auto\"\n label={<Trans {...selectedMethodConfig?.value.label} />}\n type={selectedMethodConfig?.value.inputType}\n />\n ) : null}\n {children}\n </div>\n );\n}\n","import {useSettings} from '@common/core/settings/use-settings';\nimport {useFormContext} from 'react-hook-form';\nimport {UpdateChannelPayload} from '@common/admin/channels/requests/use-update-channel';\nimport {channelContentConfig} from '@app/admin/channels/channel-content-config';\nimport {ContentAutoUpdateField} from '@common/admin/channels/channel-editor/controls/content-auto-update-field';\nimport {FormSelect, Option} from '@common/ui/forms/select/select';\nimport {Trans} from '@common/i18n/trans';\nimport React from 'react';\n\ninterface Props {\n className?: string;\n}\nexport function ChannelAutoUpdateField({className}: Props) {\n const {tmdb_is_setup} = useSettings();\n const {watch} = useFormContext<UpdateChannelPayload>();\n const methodConfig =\n channelContentConfig.autoUpdateMethods[watch('config.autoUpdateMethod')!];\n return (\n <ContentAutoUpdateField config={channelContentConfig} className={className}>\n {!methodConfig?.provider && tmdb_is_setup && (\n <FormSelect\n selectionMode=\"single\"\n className=\"mt-24 flex-auto md:mt-0\"\n name=\"config.autoUpdateProvider\"\n label={<Trans message=\"Fetch content from\" />}\n required\n >\n <Option value=\"tmdb\">\n <Trans message=\"TheMovieDB\" />\n </Option>\n <Option value=\"local\">\n <Trans message=\"Local database\" />\n </Option>\n </FormSelect>\n )}\n </ContentAutoUpdateField>\n );\n}\n","export const KEYWORD_MODEL = 'keyword';\n\nexport interface Keyword {\n id: number;\n name: string;\n display_name: string;\n updated_at: string;\n created_at: string;\n model_type: typeof KEYWORD_MODEL;\n}\n","import {Trans} from '@common/i18n/trans';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport React, {Fragment, useState} from 'react';\nimport {GENRE_MODEL} from '@app/titles/models/genre';\nimport {KEYWORD_MODEL} from '@app/titles/models/keyword';\nimport {PRODUCTION_COUNTRY_MODEL} from '@app/titles/models/production-country';\nimport {useValueLists} from '@common/http/value-lists';\nimport {message} from '@common/i18n/message';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {useFormContext} from 'react-hook-form';\nimport {UpdateChannelPayload} from '@common/admin/channels/requests/use-update-channel';\nimport {MOVIE_MODEL, SERIES_MODEL, TITLE_MODEL} from '@app/titles/models/title';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\nimport clsx from 'clsx';\nimport {ChannelsDocsLink} from '@common/admin/channels/channels-docs-link';\n\nconst supportedModels = [TITLE_MODEL, MOVIE_MODEL, SERIES_MODEL];\n\nconst restrictions = {\n [GENRE_MODEL]: message('Genre'),\n [KEYWORD_MODEL]: message('Keyword'),\n [PRODUCTION_COUNTRY_MODEL]: message('Production country'),\n};\n\ninterface Props {\n className?: string;\n}\nexport function ChannelRestrictionField({className}: Props) {\n const {setValue} = useFormContext<UpdateChannelPayload>();\n const {watch} = useFormContext<UpdateChannelPayload>();\n\n if (!supportedModels.includes(watch('config.contentModel'))) {\n return null;\n }\n\n return (\n <div className={clsx('items-end gap-14 md:flex', className)}>\n <FormSelect\n className=\"w-full flex-auto\"\n name=\"config.restriction\"\n selectionMode=\"single\"\n label={\n <Fragment>\n <Trans message=\"Filter titles by\" />\n <InfoTrigger />\n </Fragment>\n }\n onSelectionChange={() => {\n setValue('config.restrictionModelId', 'urlParam');\n }}\n >\n <Item value={null}>\n <Trans message=\"Don't filter titles\" />\n </Item>\n {Object.entries(restrictions).map(([value, label]) => (\n <Item key={value} value={value}>\n <Trans {...label} />\n </Item>\n ))}\n </FormSelect>\n <RestrictionModelField />\n </div>\n );\n}\n\nfunction RestrictionModelField() {\n const {trans} = useTrans();\n const [searchValue, setSearchValue] = useState('');\n const {watch} = useFormContext<UpdateChannelPayload>();\n const {data} = useValueLists(['genres', 'productionCountries'], {\n type: watch('config.autoUpdateProvider'),\n });\n\n const selectedRestriction = watch(\n 'config.restriction',\n ) as keyof typeof restrictions;\n const selectedKeywordId = watch('config.restrictionModelId');\n const keywordQuery = useValueLists(['keywords'], {\n searchQuery: searchValue,\n selectedValue: selectedKeywordId,\n type: watch('config.autoUpdateProvider'),\n });\n\n if (!selectedRestriction) return null;\n\n const options = {\n [GENRE_MODEL]: data?.genres,\n [KEYWORD_MODEL]: keywordQuery.data?.keywords,\n [PRODUCTION_COUNTRY_MODEL]: data?.productionCountries,\n };\n const restrictionLabel = restrictions[selectedRestriction];\n\n // allow setting keyword to custom value, because there are too many keywords\n // to put into autocomplete, ideally it would use async search from backend though\n\n return (\n <FormSelect\n className=\"w-full flex-auto\"\n name=\"config.restrictionModelId\"\n selectionMode=\"single\"\n showSearchField\n searchPlaceholder={trans(message('Search...'))}\n isAsync={selectedRestriction === KEYWORD_MODEL}\n isLoading={\n selectedRestriction === KEYWORD_MODEL && keywordQuery.isLoading\n }\n inputValue={searchValue}\n onInputValueChange={setSearchValue}\n label={\n <Trans\n message=\":restriction name\"\n values={{restriction: trans(restrictionLabel)}}\n />\n }\n >\n <Item value=\"urlParam\">\n <Trans message=\"Dynamic (from url)\" />\n </Item>\n {options[selectedRestriction]?.map(option => (\n <Item key={option.value} value={option.value}>\n <Trans message={option.name} />\n </Item>\n ))}\n </FormSelect>\n );\n}\n\nfunction InfoTrigger() {\n return (\n <InfoDialogTrigger\n body={\n <Fragment>\n <Trans message=\"Allows specifying additional condition channel content should be filtered on. \" />\n <ChannelsDocsLink className=\"mt-20\" hash=\"filter-titles-by\" />\n </Fragment>\n }\n />\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const DashboardIcon = createSvgIcon(\n <path d=\"M19 5v2h-4V5h4M9 5v6H5V5h4m10 8v6h-4v-6h4M9 17v2H5v-2h4M21 3h-8v6h8V3zM11 3H3v10h8V3zm10 8h-8v10h8V11zm-10 4H3v6h8v-6z\" />\n, 'DashboardOutlined');\n","import {useFormContext} from 'react-hook-form';\nimport {FormSelect, Option} from '@common/ui/forms/select/select';\nimport {Trans} from '@common/i18n/trans';\nimport {UpdateChannelPayload} from '@common/admin/channels/requests/use-update-channel';\nimport {ReactNode} from 'react';\nimport {ChannelContentConfig} from '@common/admin/channels/channel-editor/channel-content-config';\nimport clsx from 'clsx';\n\ninterface Props {\n config: ChannelContentConfig;\n className?: string;\n}\nexport function ContentLayoutFields({config, className}: Props) {\n return (\n <div className={clsx('items-end gap-14 md:flex', className)}>\n <LayoutField\n config={config}\n name=\"config.layout\"\n label={<Trans message=\"Layout\" />}\n />\n <LayoutField\n config={config}\n name=\"config.nestedLayout\"\n label={<Trans message=\"Layout when nested\" />}\n />\n </div>\n );\n}\n\ninterface LayoutFieldProps extends Props {\n name: string;\n label: ReactNode;\n}\nfunction LayoutField({config, name, label}: LayoutFieldProps) {\n const {watch} = useFormContext<UpdateChannelPayload>();\n const contentModel = watch('config.contentModel');\n const modelConfig = config.models[contentModel];\n\n if (!modelConfig.layoutMethods?.length) {\n return null;\n }\n\n return (\n <FormSelect\n className=\"w-full flex-auto\"\n selectionMode=\"single\"\n name={name}\n label={label}\n >\n {modelConfig.layoutMethods.map(method => {\n const label = config.layoutMethods[method].label;\n return (\n <Option key={method} value={method}>\n <Trans {...label} />\n </Option>\n );\n })}\n </FormSelect>\n );\n}\n","import {FormSelect, Option} from '@common/ui/forms/select/select';\nimport {Trans} from '@common/i18n/trans';\nimport {ChannelContentConfig} from '@common/admin/channels/channel-editor/channel-content-config';\n\ninterface Props {\n config: ChannelContentConfig;\n className?: string;\n}\nexport function ChannelPaginationTypeField({className}: Props) {\n return (\n <FormSelect\n className={className}\n selectionMode=\"single\"\n name=\"config.paginationType\"\n label={<Trans message=\"Pagination type\" />}\n >\n <Option value=\"infiniteScroll\">\n <Trans message=\"Infinite scroll\" />\n </Option>\n <Option value=\"lengthAware\">\n <Trans message=\"List of page buttons\" />\n </Option>\n <Option value=\"simple\">\n <Trans message=\"Next/previous page buttons only\" />\n </Option>\n </FormSelect>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PublicIcon = createSvgIcon(\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM4 12c0-.61.08-1.21.21-1.78L8.99 15v1c0 1.1.9 2 2 2v1.93C7.06 19.43 4 16.07 4 12zm13.89 5.4c-.26-.81-1-1.4-1.9-1.4h-1v-3c0-.55-.45-1-1-1h-6v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41C17.92 5.77 20 8.65 20 12c0 2.08-.81 3.98-2.11 5.4z\" />\n, 'PublicOutlined');\n","import React, {Fragment} from 'react';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\n\nexport function ChannelSeoFields() {\n const {trans} = useTrans();\n return (\n <Fragment>\n <FormTextField\n name=\"config.seoTitle\"\n label={<Trans message=\"SEO title\" />}\n className=\"mb-24\"\n placeholder={trans(message('Optional'))}\n />\n <FormTextField\n name=\"config.seoDescription\"\n label={<Trans message=\"SEO description\" />}\n inputElementType=\"textarea\"\n rows={6}\n placeholder={trans(message('Optional'))}\n />\n </Fragment>\n );\n}\n","import {EditChannelPageLayout} from '@common/admin/channels/channel-editor/edit-channel-page-layout';\nimport React, {Fragment} from 'react';\nimport {Accordion, AccordionItem} from '@common/ui/accordion/accordion';\nimport {Trans} from '@common/i18n/trans';\nimport {DescriptionIcon} from '@common/icons/material/Description';\nimport {ChannelNameField} from '@common/admin/channels/channel-editor/controls/channel-name-field';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\nimport {SettingsIcon} from '@common/icons/material/Settings';\nimport {ContentTypeField} from '@common/admin/channels/channel-editor/controls/content-type-field';\nimport {channelContentConfig} from '@app/admin/channels/channel-content-config';\nimport {ChannelAutoUpdateField} from '@app/admin/channels/channel-auto-update-field';\nimport {ContentModelField} from '@common/admin/channels/channel-editor/controls/content-model-field';\nimport {ChannelRestrictionField} from '@app/admin/channels/channel-restriction-field';\nimport {ContentOrderField} from '@common/admin/channels/channel-editor/controls/content-order-field';\nimport {DashboardIcon} from '@common/icons/material/Dashboard';\nimport {ContentLayoutFields} from '@common/admin/channels/channel-editor/controls/content-layout-fields';\nimport {ChannelPaginationTypeField} from '@common/admin/channels/channel-editor/controls/channel-pagination-type-field';\nimport {PublicIcon} from '@common/icons/material/Public';\nimport {ChannelSeoFields} from '@app/admin/channels/channel-seo-fields';\nimport {ChannelContentEditor} from '@common/admin/channels/channel-editor/channel-content-editor';\nimport {\n ChannelContentSearchField,\n ChannelContentSearchFieldProps,\n} from '@common/admin/channels/channel-editor/channel-content-search-field';\nimport {ChannelContentItemImage} from '@app/admin/channels/channel-content-item-image';\n\nexport function EditChannelPage() {\n return (\n <EditChannelPageLayout>\n <Fragment>\n <Accordion variant=\"outline\">\n <AccordionItem\n label={<Trans message=\"Title & description\" />}\n startIcon={<DescriptionIcon />}\n >\n <ChannelNameField />\n <FormSwitch\n className=\"mt-24\"\n name=\"config.hideTitle\"\n description={\n <Trans message=\"Whether title should be shown when displaying this channel on the site.\" />\n }\n >\n <Trans message=\"Hide title\" />\n </FormSwitch>\n <FormTextField\n name=\"description\"\n label={<Trans message=\"Description\" />}\n inputElementType=\"textarea\"\n rows={1}\n className=\"mt-24\"\n />\n <FormTextField\n name=\"config.adminDescription\"\n label={\n <Fragment>\n <Trans message=\"Internal description\" />\n <InfoDialogTrigger\n body={\n <Trans message=\"This describes the purpose of the channel and is only visible in admin area.\" />\n }\n />\n </Fragment>\n }\n inputElementType=\"textarea\"\n rows={1}\n className=\"mt-24\"\n />\n </AccordionItem>\n <AccordionItem\n label={<Trans message=\"Content settings\" />}\n startIcon={<SettingsIcon />}\n >\n <ContentTypeField config={channelContentConfig} className=\"mb-24\" />\n <ChannelAutoUpdateField className=\"mb-24\" />\n <ContentModelField\n config={channelContentConfig}\n className=\"mb-24\"\n />\n <ChannelRestrictionField className=\"mb-24\" />\n <ContentOrderField config={channelContentConfig} />\n </AccordionItem>\n <AccordionItem\n label={<Trans message=\"Layout\" />}\n startIcon={<DashboardIcon />}\n >\n <ContentLayoutFields\n config={channelContentConfig}\n className=\"mb-24\"\n />\n <ChannelPaginationTypeField config={channelContentConfig} />\n </AccordionItem>\n <AccordionItem\n label={<Trans message=\"SEO\" />}\n startIcon={<PublicIcon />}\n >\n <ChannelSeoFields />\n </AccordionItem>\n </Accordion>\n <ChannelContentEditor searchField={<SearchField />} />\n </Fragment>\n </EditChannelPageLayout>\n );\n}\n\nfunction SearchField(props: ChannelContentSearchFieldProps) {\n return (\n <ChannelContentSearchField\n {...props}\n imgRenderer={item => <ChannelContentItemImage item={item} />}\n />\n );\n}\n","import {useMutation, useQueryClient} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {apiClient} from '@common/http/query-client';\nimport {toast} from '@common/ui/toast/toast';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {message} from '@common/i18n/message';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {PaginationResponse} from '@common/http/backend-response/pagination-response';\nimport {NormalizedModel} from '@common/datatable/filters/normalized-model';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {Channel} from '@common/channels/channel';\n\nconst endpoint = 'channel';\n\ninterface Response extends BackendResponse {\n channel: Channel;\n}\n\nexport interface CreateChannelPayload\n extends Omit<Channel, 'content' | 'items'> {\n content: PaginationResponse<NormalizedModel>;\n}\n\nexport function useCreateChannel(form: UseFormReturn<CreateChannelPayload>) {\n const {trans} = useTrans();\n const navigate = useNavigate();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (payload: CreateChannelPayload) => createChannel(payload),\n onSuccess: async response => {\n await queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey(endpoint),\n });\n toast(trans(message('Channel created')));\n navigate(`/admin/channels/${response.channel.id}/edit`, {\n replace: true,\n });\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction createChannel(payload: CreateChannelPayload) {\n return apiClient.post<Response>(endpoint, payload).then(r => r.data);\n}\n","import {useForm} from 'react-hook-form';\nimport React, {ReactNode} from 'react';\nimport {CrupdateResourceLayout} from '@common/admin/crupdate-resource-layout';\nimport {Trans} from '@common/i18n/trans';\nimport {EMPTY_PAGINATION_RESPONSE} from '@common/http/backend-response/pagination-response';\nimport {UpdateChannelPayload} from '@common/admin/channels/requests/use-update-channel';\nimport {useCreateChannel} from '@common/admin/channels/requests/use-create-channel';\n\ninterface Props {\n defaultValues?: Partial<UpdateChannelPayload['config']>;\n children: ReactNode;\n}\nexport function CreateChannelPageLayout({defaultValues, children}: Props) {\n const form = useForm<UpdateChannelPayload>({\n defaultValues: {\n content: EMPTY_PAGINATION_RESPONSE.pagination,\n config: {\n contentType: 'listAll',\n contentOrder: 'created_at:desc',\n nestedLayout: 'carousel',\n ...defaultValues,\n },\n },\n });\n const createChannel = useCreateChannel(form);\n\n return (\n <CrupdateResourceLayout\n form={form}\n onSubmit={values => {\n createChannel.mutate(values);\n }}\n title={<Trans message=\"Add new channel\" />}\n isLoading={createChannel.isPending}\n >\n {children}\n </CrupdateResourceLayout>\n );\n}\n","import React, {ReactElement} from 'react';\nimport {CreateChannelPageLayout} from '@common/admin/channels/channel-editor/create-channel-page-layout';\nimport {MOVIE_MODEL} from '@app/titles/models/title';\nimport {Trans} from '@common/i18n/trans';\nimport {ChannelNameField} from '@common/admin/channels/channel-editor/controls/channel-name-field';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {ContentTypeField} from '@common/admin/channels/channel-editor/controls/content-type-field';\nimport {channelContentConfig} from '@app/admin/channels/channel-content-config';\nimport {ContentModelField} from '@common/admin/channels/channel-editor/controls/content-model-field';\nimport {ChannelRestrictionField} from '@app/admin/channels/channel-restriction-field';\nimport {ContentOrderField} from '@common/admin/channels/channel-editor/controls/content-order-field';\nimport {ContentLayoutFields} from '@common/admin/channels/channel-editor/controls/content-layout-fields';\nimport {ChannelPaginationTypeField} from '@common/admin/channels/channel-editor/controls/channel-pagination-type-field';\nimport {ChannelAutoUpdateField} from '@app/admin/channels/channel-auto-update-field';\nimport {ChannelSeoFields} from '@app/admin/channels/channel-seo-fields';\nimport clsx from 'clsx';\nimport {Tabs} from '@common/ui/tabs/tabs';\nimport {TabList} from '@common/ui/tabs/tab-list';\nimport {Tab} from '@common/ui/tabs/tab';\nimport {TabPanel, TabPanels} from '@common/ui/tabs/tab-panels';\n\nexport function CreateChannelPage() {\n return (\n <CreateChannelPageLayout\n defaultValues={{\n contentModel: MOVIE_MODEL,\n autoUpdateProvider: 'local',\n layout: 'grid',\n nestedLayout: 'carousel',\n paginationType: 'infiniteScroll',\n }}\n >\n <Tabs>\n <TabList>\n <Tab>\n <Trans message=\"Settings\" />\n </Tab>\n <Tab>\n <Trans message=\"SEO\" />\n </Tab>\n </TabList>\n <TabPanels className=\"pt-24\">\n <TabPanel>\n <ChannelNameField />\n <FormSwitch\n className=\"mt-24\"\n name=\"config.hideTitle\"\n description={\n <Trans message=\"Whether title should be shown when displaying this channel on the site.\" />\n }\n >\n <Trans message=\"Hide title\" />\n </FormSwitch>\n <FormTextField\n name=\"description\"\n label={<Trans message=\"Description\" />}\n inputElementType=\"textarea\"\n rows={2}\n className=\"my-24\"\n />\n <ContentTypeField config={channelContentConfig} className=\"mb-24\" />\n <ChannelAutoUpdateField className=\"mb-24\" />\n <ContentModelField\n config={channelContentConfig}\n className=\"mb-24\"\n />\n <ChannelRestrictionField className=\"mb-24\" />\n <ContentOrderField config={channelContentConfig} />\n <ContentLayoutFields\n config={channelContentConfig}\n className=\"my-24\"\n />\n <ChannelPaginationTypeField\n config={channelContentConfig}\n className=\"mb-24\"\n />\n </TabPanel>\n <TabPanel>\n <ChannelSeoFields />\n </TabPanel>\n </TabPanels>\n </Tabs>\n </CreateChannelPageLayout>\n );\n}\n\ninterface TitleProps {\n children: ReactElement;\n className?: string;\n}\nfunction Title({children, className}: TitleProps) {\n return (\n <h2 className={clsx('mb-20 mt-20 border-t pt-20 text-2xl', className)}>\n {children}\n </h2>\n );\n}\n","import {BackendFilter} from '@common/datatable/filters/backend-filter';\nimport {message} from '@common/i18n/message';\nimport {\n createdAtFilter,\n updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\n\nexport const NewsDatatableFilters: BackendFilter[] = [\n createdAtFilter({\n description: message('Date article was created'),\n }),\n updatedAtFilter({\n description: message('Date article was last updated'),\n }),\n];\n","export default \"__VITE_ASSET__421a551f__\"","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n articleId: number;\n}\n\nexport function useDeleteNewsArticle() {\n return useMutation({\n mutationFn: (payload: Payload) => deleteArticle(payload),\n onError: err => showHttpErrorToast(err),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('news'),\n });\n toast(message('Article deleted'));\n },\n });\n}\n\nfunction deleteArticle(payload: Payload): Promise<Response> {\n return apiClient.delete(`news/${payload.articleId}`).then(r => r.data);\n}\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {NewsArticle} from '@app/titles/models/news-article';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Link} from 'react-router-dom';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {useContext} from 'react';\nimport {TableContext} from '@common/ui/tables/table-context';\nimport clsx from 'clsx';\nimport {useDeleteNewsArticle} from '@app/admin/news/requests/use-delete-news-article';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {DeleteIcon} from '@common/icons/material/Delete';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {NewsArticleLink} from '@app/news/news-article-link';\nimport {NewsArticleImage} from '@app/news/news-article-image';\n\nexport const newsDatatableColumns: ColumnConfig<NewsArticle>[] = [\n {\n key: 'name',\n width: 'flex-3 min-w-200',\n visibleInMode: 'all',\n header: () => <Trans message=\"Title\" />,\n body: article => <ArticleColumn article={article} />,\n },\n {\n key: 'updatedAt',\n allowsSorting: true,\n width: 'w-96',\n header: () => <Trans message=\"Last updated\" />,\n body: article => (\n <time>\n <FormattedDate date={article.updated_at} />\n </time>\n ),\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n width: 'w-84 flex-shrink-0',\n hideHeader: true,\n align: 'end',\n visibleInMode: 'all',\n body: article => (\n <div className=\"text-muted\">\n <Link to={`${article.id}/edit`}>\n <Tooltip label={<Trans message=\"Edit article\" />}>\n <IconButton size=\"md\">\n <EditIcon />\n </IconButton>\n </Tooltip>\n </Link>\n <DialogTrigger type=\"modal\">\n <Tooltip label={<Trans message=\"Delete article\" />}>\n <IconButton>\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n <DeleteArticleDialog article={article} />\n </DialogTrigger>\n </div>\n ),\n },\n];\n\ninterface ArticleColumnProps {\n article: NewsArticle;\n}\nfunction ArticleColumn({article}: ArticleColumnProps) {\n const {isCollapsedMode} = useContext(TableContext);\n return (\n <div className=\"flex gap-14\">\n <NewsArticleImage article={article} size=\"w-52 h-52\" lazy={false} />\n <div className=\"min-w-0\">\n <div\n className={clsx(\n isCollapsedMode\n ? 'whitespace-normal'\n : 'font-medium whitespace-nowrap overflow-hidden overflow-ellipsis',\n )}\n >\n <NewsArticleLink article={article} target=\"_blank\" />\n </div>\n {!isCollapsedMode && (\n <p className=\"text-muted mt-4 text-xs max-w-680 whitespace-normal\">\n {article.body}\n </p>\n )}\n </div>\n </div>\n );\n}\n\ninterface DeleteArticleDialogProps {\n article: NewsArticle;\n}\nexport function DeleteArticleDialog({article}: DeleteArticleDialogProps) {\n const deleteArticle = useDeleteNewsArticle();\n const {close} = useDialogContext();\n return (\n <ConfirmationDialog\n isDanger\n isLoading={deleteArticle.isPending}\n title={<Trans message=\"Delete article\" />}\n body={<Trans message=\"Are you sure you want to delete this article?\" />}\n confirm={<Trans message=\"Delete\" />}\n onConfirm={() => {\n deleteArticle.mutate(\n {articleId: article.id},\n {onSuccess: () => close()},\n );\n }}\n />\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PublishIcon = createSvgIcon(\n <path d=\"M5 4h14v2H5zm0 10h4v6h6v-6h4l-7-7-7 7zm8-2v6h-2v-6H9.83L12 9.83 14.17 12H13z\" />\n, 'PublishOutlined');\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {toast} from '@common/ui/toast/toast';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {message} from '@common/i18n/message';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\nexport function useImportNewsArticles() {\n return useMutation({\n mutationFn: () => importArticles(),\n onSuccess: async () => {\n await queryClient.invalidateQueries({queryKey: ['news']});\n toast(message('Imported news articles'));\n },\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction importArticles(): Promise<Response> {\n return apiClient.post(`news/import-from-remote-provider`).then(r => r.data);\n}\n","import {Fragment} from 'react';\nimport {Trans} from '@common/i18n/trans';\nimport {Link} from 'react-router-dom';\nimport {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {NewsDatatableFilters} from '@app/admin/news/news-datatable-filters';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport {DeleteSelectedItemsAction} from '@common/datatable/page/delete-selected-items-action';\nimport onlineArticlesImg from '@app/admin/news/online-articles.svg';\nimport {newsDatatableColumns} from '@app/admin/news/news-datatable-columns';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {PublishIcon} from '@common/icons/material/Publish';\nimport {useImportNewsArticles} from '@app/admin/news/requests/use-import-news-articles';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\n\nexport function NewsDatatablePage() {\n return (\n <DataTablePage\n endpoint=\"news\"\n title={<Trans message=\"News articles\" />}\n filters={NewsDatatableFilters}\n columns={newsDatatableColumns}\n queryParams={{\n stripHtml: 'true',\n truncateBody: 200,\n }}\n actions={<Actions />}\n selectedActions={<DeleteSelectedItemsAction />}\n enableSelection={false}\n cellHeight=\"h-80\"\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={onlineArticlesImg}\n title={<Trans message=\"No articles have been created yet\" />}\n filteringTitle={<Trans message=\"No matching articles\" />}\n />\n }\n />\n );\n}\n\nfunction Actions() {\n const importArticles = useImportNewsArticles();\n return (\n <Fragment>\n <Tooltip label={<Trans message=\"Import news articles\" />}>\n <IconButton\n variant=\"outline\"\n color=\"primary\"\n size=\"sm\"\n onClick={() => importArticles.mutate()}\n disabled={importArticles.isPending}\n >\n <PublishIcon />\n </IconButton>\n </Tooltip>\n <DataTableAddItemButton elementType={Link} to=\"add\">\n <Trans message=\"Add news article\" />\n </DataTableAddItemButton>\n </Fragment>\n );\n}\n","import {useDeleteComments} from '@common/comments/requests/use-delete-comments';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {queryClient} from '@common/http/query-client';\nimport {Button} from '@common/ui/buttons/button';\nimport {Trans} from '@common/i18n/trans';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport React from 'react';\nimport {ButtonVariant} from '@common/ui/buttons/get-shared-button-style';\nimport {ButtonSize} from '@common/ui/buttons/button-size';\n\ninterface DeleteCommentsButtonProps {\n commentIds: number[];\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\nexport function DeleteCommentsButton({\n commentIds,\n variant = 'outline',\n size = 'xs',\n}: DeleteCommentsButtonProps) {\n const deleteComments = useDeleteComments();\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={isConfirmed => {\n if (isConfirmed) {\n deleteComments.mutate(\n {commentIds},\n {\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: ['comment']});\n },\n },\n );\n }\n }}\n >\n <Button\n variant={variant}\n size={size}\n color=\"danger\"\n className=\"mr-10\"\n disabled={deleteComments.isPending}\n >\n <Trans message=\"Delete\" />\n </Button>\n <ConfirmationDialog\n isDanger\n title={\n <Trans\n message=\"Delete [one comment|other :count comments]\"\n values={{count: commentIds.length}}\n />\n }\n body={\n commentIds.length > 1 ? (\n <Trans message=\"Are you sure you want to delete selected comments?\" />\n ) : (\n <Trans message=\"Are you sure you want to delete this comment?\" />\n )\n }\n confirm={<Trans message=\"Delete\" />}\n />\n </DialogTrigger>\n );\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n //\n}\n\ninterface Payload {\n commentId: number;\n content: string;\n}\n\nexport function useUpdateComment() {\n return useMutation({\n mutationFn: (props: Payload) => updateComment(props),\n onSuccess: () => {\n toast(message('Comment updated'));\n queryClient.invalidateQueries({queryKey: ['comment']});\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction updateComment({commentId, content}: Payload): Promise<Response> {\n return apiClient.put(`comment/${commentId}`, {content}).then(r => r.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '../../http/query-client';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {toast} from '../../ui/toast/toast';\nimport {message} from '../../i18n/message';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n //\n}\n\ninterface Payload {\n commentIds: number[];\n}\n\nexport function useRestoreComments() {\n return useMutation({\n mutationFn: (payload: Payload) => restoreComment(payload),\n onSuccess: (response, payload) => {\n toast(\n message('Restored [one 1 comment|other :count comments]', {\n values: {count: payload.commentIds.length},\n }),\n );\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction restoreComment({commentIds}: Payload): Promise<Response> {\n return apiClient.post('comment/restore', {commentIds}).then(r => r.data);\n}\n","import {queryClient} from '@common/http/query-client';\nimport {Button} from '@common/ui/buttons/button';\nimport {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {ButtonVariant} from '@common/ui/buttons/get-shared-button-style';\nimport {ButtonSize} from '@common/ui/buttons/button-size';\nimport {useRestoreComments} from '@common/comments/requests/use-restore-comments';\n\ninterface Props {\n commentIds: number[];\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\nexport function RestoreCommentsButton({\n commentIds,\n variant = 'outline',\n size = 'xs',\n}: Props) {\n const restoreComments = useRestoreComments();\n return (\n <Button\n variant={variant}\n size={size}\n className=\"mr-10\"\n disabled={restoreComments.isPending}\n color=\"primary\"\n onClick={() => {\n restoreComments.mutate(\n {commentIds},\n {\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: ['comment']});\n },\n },\n );\n }}\n >\n <Trans message=\"Restore\" />\n </Button>\n );\n}\n","import {User} from '@common/auth/user';\nimport {Comment} from '@common/comments/comment';\nimport React, {Fragment, useContext, useState} from 'react';\nimport {Checkbox} from '@common/ui/forms/toggle/checkbox';\nimport {UserAvatar} from '@common/ui/images/user-avatar';\nimport {FormattedRelativeTime} from '@common/i18n/formatted-relative-time';\nimport {queryClient} from '@common/http/query-client';\nimport {DeleteCommentsButton} from '@common/comments/comments-datatable-page/delete-comments-button';\nimport {Button} from '@common/ui/buttons/button';\nimport {Trans} from '@common/i18n/trans';\nimport {useUpdateComment} from '@common/comments/requests/use-update-comment';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\nimport {Link} from 'react-router-dom';\nimport {LinkStyle} from '@common/ui/buttons/external-link';\nimport clsx from 'clsx';\nimport {RestoreCommentsButton} from '@common/comments/comments-datatable-page/restore-comments-button';\nimport {NormalizedModel} from '@common/datatable/filters/normalized-model';\n\ninterface Props {\n comment: Comment;\n isSelected: boolean;\n onToggle: () => void;\n}\nexport function CommentDatatableItem({comment, isSelected, onToggle}: Props) {\n const [isEditing, setIsEditing] = useState(false);\n return (\n <div className={clsx('p-14 border-b', comment.deleted && 'bg-danger/6')}>\n {comment.commentable && (\n <CommentableHeader\n isSelected={isSelected}\n onToggle={onToggle}\n commentable={comment.commentable}\n />\n )}\n <div className=\"flex items-start gap-10 pt-14 md:pl-20\">\n <UserAvatar className=\"flex-shrink-0\" user={comment.user} size=\"md\" />\n <div className=\"flex-auto\">\n <CommentHeader comment={comment} />\n {isEditing ? (\n <EditCommentForm\n comment={comment}\n onClose={isSaved => {\n setIsEditing(false);\n if (isSaved) {\n queryClient.invalidateQueries({queryKey: ['comment']});\n }\n }}\n />\n ) : (\n <Fragment>\n <div className=\"text-sm my-14\">{comment.content}</div>\n <div className=\"flex items-center gap-24 justify-between\">\n <div>\n {comment.deleted ? (\n <RestoreCommentsButton commentIds={[comment.id]} />\n ) : (\n <DeleteCommentsButton commentIds={[comment.id]} />\n )}\n <Button\n variant=\"outline\"\n size=\"xs\"\n onClick={() => {\n setIsEditing(true);\n }}\n >\n <Trans message=\"Edit\" />\n </Button>\n </div>\n <div className=\"text-xs text-danger\">\n <Trans\n message=\"Reported [one 1 time|other :count times]\"\n values={{count: comment.reports_count}}\n />\n </div>\n </div>\n </Fragment>\n )}\n </div>\n </div>\n </div>\n );\n}\n\ninterface CommentableHeaderProps {\n isSelected: boolean;\n onToggle: Props['onToggle'];\n commentable: NormalizedModel;\n}\nfunction CommentableHeader({\n isSelected,\n onToggle,\n commentable,\n}: CommentableHeaderProps) {\n return (\n <div className=\"flex items-center\">\n <div className=\"mr-14\">\n <Checkbox checked={isSelected} onChange={() => onToggle()} />\n </div>\n {commentable.image && (\n <img\n className=\"w-20 h-20 rounded overflow-hidden object-cover mr-6\"\n src={commentable.image}\n alt=\"\"\n />\n )}\n <div className=\"text-sm mr-4\">{commentable.name}</div>\n <div className=\"text-muted text-xs\">({commentable.model_type})</div>\n </div>\n );\n}\n\ninterface CommentHeaderProps {\n comment: Comment;\n}\nfunction CommentHeader({comment}: CommentHeaderProps) {\n return (\n <div className=\"flex items-center gap-4 text-sm\">\n <div>\n {comment.user && (\n <UserDisplayName user={comment.user} show=\"display_name\" />\n )}\n </div>\n <div>&bull;</div>\n <time>\n <FormattedRelativeTime date={comment.created_at} />\n </time>\n {comment.user && (\n <div className=\"ml-auto hidden md:block\">\n {<UserDisplayName user={comment.user} show=\"email\" />}\n </div>\n )}\n </div>\n );\n}\n\ninterface EditCommentFormProps {\n comment: Comment;\n onClose: (saved: boolean) => void;\n}\nfunction EditCommentForm({comment, onClose}: EditCommentFormProps) {\n const [content, setContent] = useState(comment.content);\n const updateComment = useUpdateComment();\n return (\n <form\n onSubmit={e => {\n e.preventDefault();\n updateComment.mutate(\n {commentId: comment.id, content},\n {onSuccess: () => onClose(true)},\n );\n }}\n >\n <TextField\n autoFocus\n inputElementType=\"textarea\"\n className=\"my-14\"\n rows={2}\n value={content}\n onChange={e => setContent(e.target.value)}\n />\n <Button\n size=\"xs\"\n variant=\"outline\"\n color=\"primary\"\n type=\"submit\"\n className=\"mr-6\"\n disabled={updateComment.isPending}\n >\n <Trans message=\"Save edit\" />\n </Button>\n <Button\n size=\"xs\"\n variant=\"outline\"\n className=\"mr-6\"\n onClick={e => onClose(false)}\n disabled={updateComment.isPending}\n >\n <Trans message=\"Cancel\" />\n </Button>\n </form>\n );\n}\n\ninterface UserDisplayNameProps {\n user: User;\n show: 'display_name' | 'email';\n}\nfunction UserDisplayName({user, show}: UserDisplayNameProps) {\n const {auth} = useContext(SiteConfigContext);\n if (auth.getUserProfileLink) {\n return (\n <Link\n to={auth.getUserProfileLink(user)}\n className={LinkStyle}\n target=\"_blank\"\n >\n {user[show]}\n </Link>\n );\n }\n return <div className=\"text-muted\">{user[show]}</div>;\n}\n","export default \"__VITE_ASSET__a97a5552__\"","import {\n BackendFilter,\n FilterControlType,\n FilterOperator,\n} from '@common/datatable/filters/backend-filter';\nimport {message} from '@common/i18n/message';\nimport {USER_MODEL} from '@common/auth/user';\nimport {\n createdAtFilter,\n updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\n\nexport const CommentsDatatableFilters: BackendFilter[] = [\n {\n key: 'deleted',\n label: message('Status'),\n description: message('Whether comment is active or deleted'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: '01',\n options: [\n {\n key: '01',\n label: message('Active'),\n value: false,\n },\n {\n key: '02',\n label: message('Deleted'),\n value: true,\n },\n ],\n },\n },\n {\n key: 'reports',\n label: message('Reported'),\n description: message('Show only reported comments'),\n defaultOperator: FilterOperator.has,\n control: {\n type: FilterControlType.BooleanToggle,\n defaultValue: '*',\n },\n },\n {\n key: 'user_id',\n label: message('User'),\n description: message('User comment was created by'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.SelectModel,\n model: USER_MODEL,\n },\n },\n createdAtFilter({\n description: message('Date comment was created'),\n }),\n updatedAtFilter({\n description: message('Date comment was last updated'),\n }),\n];\n","import React, {useCallback, useMemo, useState} from 'react';\nimport {Trans} from '@common/i18n/trans';\nimport clsx from 'clsx';\nimport {StaticPageTitle} from '@common/seo/static-page-title';\nimport {DataTableHeader} from '@common/datatable/data-table-header';\nimport {useBackendFilterUrlParams} from '@common/datatable/filters/backend-filter-url-params';\nimport {\n GetDatatableDataParams,\n useDatatableData,\n} from '@common/datatable/requests/paginated-resources';\nimport {Comment} from '@common/comments/comment';\nimport {FilterList} from '@common/datatable/filters/filter-list/filter-list';\nimport {SelectedStateDatatableHeader} from '@common/datatable/selected-state-datatable-header';\nimport {AnimatePresence} from 'framer-motion';\nimport {DeleteCommentsButton} from '@common/comments/comments-datatable-page/delete-comments-button';\nimport {CommentDatatableItem} from '@common/comments/comments-datatable-page/comment-datatable-item';\nimport {DataTablePaginationFooter} from '@common/datatable/data-table-pagination-footer';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport publicDiscussionsImage from './public-discussion.svg';\nimport {FullPageLoader} from '@common/ui/progress/full-page-loader';\nimport {Commentable} from '@common/comments/commentable';\nimport {CommentsDatatableFilters} from '@common/comments/comments-datatable-page/comments-datatable-filters';\n\ninterface Props {\n hideTitle?: boolean;\n commentable?: Commentable;\n}\nexport function CommentsDatatablePage({hideTitle, commentable}: Props) {\n const filters = useMemo(() => {\n return CommentsDatatableFilters.filter(\n f => f.key !== 'commentable_id' || !commentable,\n );\n }, [commentable]);\n const {encodedFilters} = useBackendFilterUrlParams(filters);\n const [params, setParams] = useState<GetDatatableDataParams>({perPage: 15});\n const [selectedComments, setSelectedComments] = useState<number[]>([]);\n const query = useDatatableData<Comment>(\n 'comment',\n {\n ...params,\n with: 'commentable',\n withCount: 'reports',\n filters: encodedFilters,\n commentable_type: commentable?.model_type,\n commentable_id: commentable?.id,\n },\n undefined,\n () => {\n setSelectedComments([]);\n },\n );\n\n const toggleComment = useCallback(\n (id: number) => {\n const newValues = [...selectedComments];\n if (!newValues.includes(id)) {\n newValues.push(id);\n } else {\n const index = newValues.indexOf(id);\n newValues.splice(index, 1);\n }\n setSelectedComments(newValues);\n },\n [selectedComments, setSelectedComments],\n );\n\n const isFiltering = !!(params.query || params.filters || encodedFilters);\n const pagination = query.data?.pagination;\n\n return (\n <div className={clsx(!hideTitle && 'p-12 md:p-24')}>\n <div className={clsx('mb-16')}>\n <StaticPageTitle>\n <Trans message=\"Comments\" />\n </StaticPageTitle>\n {!hideTitle && (\n <h1 className=\"text-3xl font-light\">\n <Trans message=\"Comments\" />\n </h1>\n )}\n </div>\n <div>\n <AnimatePresence initial={false} mode=\"wait\">\n {selectedComments.length ? (\n <SelectedStateDatatableHeader\n selectedItemsCount={selectedComments.length}\n actions={\n <DeleteCommentsButton\n size=\"sm\"\n variant=\"flat\"\n commentIds={selectedComments}\n />\n }\n key=\"selected\"\n />\n ) : (\n <DataTableHeader\n filters={filters}\n searchValue={params.query}\n onSearchChange={query => setParams({...params, query})}\n key=\"default\"\n />\n )}\n </AnimatePresence>\n <FilterList className=\"mb-14\" filters={filters} />\n\n {query.isLoading ? (\n <FullPageLoader className=\"min-h-200\" />\n ) : (\n <div className=\"rounded border-x border-t\">\n {pagination?.data.map(comment => (\n <CommentDatatableItem\n key={comment.id}\n comment={comment}\n isSelected={selectedComments.includes(comment.id)}\n onToggle={() => toggleComment(comment.id)}\n />\n ))}\n </div>\n )}\n\n {(query.isFetched || query.isPlaceholderData) &&\n !pagination?.data.length ? (\n <DataTableEmptyStateMessage\n className=\"pt-50\"\n isFiltering={isFiltering}\n image={publicDiscussionsImage}\n title={<Trans message=\"No comments have been created yet\" />}\n filteringTitle={<Trans message=\"No matching comments\" />}\n />\n ) : undefined}\n\n <DataTablePaginationFooter\n className=\"mt-10\"\n query={query}\n onPageChange={page => setParams({...params, page})}\n onPerPageChange={perPage => setParams({...params, perPage})}\n />\n </div>\n </div>\n );\n}\n","export default \"__VITE_ASSET__5161f729__\"","import {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Button} from '@common/ui/buttons/button';\nimport {Trans} from '@common/i18n/trans';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport React from 'react';\nimport {ButtonVariant} from '@common/ui/buttons/get-shared-button-style';\nimport {ButtonSize} from '@common/ui/buttons/button-size';\nimport {useDeleteReviews} from '@app/reviews/requests/use-delete-reviews';\n\ninterface Props {\n reviewIds: number[];\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\nexport function DeleteReviewsButton({\n reviewIds,\n variant = 'outline',\n size = 'xs',\n}: Props) {\n const deleteReviews = useDeleteReviews();\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={isConfirmed => {\n if (isConfirmed) {\n deleteReviews.mutate({reviewIds});\n }\n }}\n >\n <Button\n variant={variant}\n size={size}\n color=\"danger\"\n className=\"mr-10\"\n disabled={deleteReviews.isPending}\n >\n <Trans message=\"Delete\" />\n </Button>\n <ConfirmationDialog\n isDanger\n title={\n <Trans\n message=\"Delete [one review|other :count reviews]\"\n values={{count: reviewIds.length}}\n />\n }\n body={\n reviewIds.length > 1 ? (\n <Trans message=\"Are you sure you want to delete selected reviews?\" />\n ) : (\n <Trans message=\"Are you sure you want to delete this review?\" />\n )\n }\n confirm={<Trans message=\"Delete\" />}\n />\n </DialogTrigger>\n );\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {Review} from '@app/titles/models/review';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {CreateReviewPayload} from '@app/reviews/requests/use-create-review';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\n\ninterface Response extends BackendResponse {\n review: Review;\n}\n\nexport function useUpdateReview(\n review: Review,\n form?: UseFormReturn<CreateReviewPayload>,\n) {\n return useMutation({\n mutationFn: (payload: CreateReviewPayload) => updateReview(review, payload),\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: ['reviews']});\n toast(message('Review updated'));\n },\n onError: r => (form ? onFormQueryError(r, form) : showHttpErrorToast(r)),\n });\n}\n\nfunction updateReview(\n review: Review,\n payload: CreateReviewPayload,\n): Promise<Response> {\n return apiClient\n .put(`reviews/${review.id}`, {\n score: payload.score,\n title: payload.title,\n body: payload.body,\n })\n .then(r => r.data);\n}\n","import {User} from '@common/auth/user';\nimport React, {Fragment, useContext, useState} from 'react';\nimport {Checkbox} from '@common/ui/forms/toggle/checkbox';\nimport {UserAvatar} from '@common/ui/images/user-avatar';\nimport {FormattedRelativeTime} from '@common/i18n/formatted-relative-time';\nimport {queryClient} from '@common/http/query-client';\nimport {Button} from '@common/ui/buttons/button';\nimport {Trans} from '@common/i18n/trans';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\nimport {Link} from 'react-router-dom';\nimport {LinkStyle} from '@common/ui/buttons/external-link';\nimport {NormalizedModel} from '@common/datatable/filters/normalized-model';\nimport {Review} from '@app/titles/models/review';\nimport {TitleRating} from '@app/reviews/title-rating';\nimport {useUpdateReview} from '@app/admin/reviews/requests/use-update-review';\nimport {useForm} from 'react-hook-form';\nimport {CreateReviewPayload} from '@app/reviews/requests/use-create-review';\nimport {Form} from '@common/ui/forms/form';\nimport {StarSelector} from '@app/reviews/review-list/star-selector';\nimport {DeleteReviewsButton} from '@app/admin/reviews/delete-reviews-button';\nimport {BulletSeparatedItems} from '@app/titles/bullet-separated-items';\n\ninterface Props {\n review: Review;\n isSelected: boolean;\n onToggle: () => void;\n}\nexport function ReviewDatatableItem({review, isSelected, onToggle}: Props) {\n const [isEditing, setIsEditing] = useState(false);\n\n const helpfulCount = review.helpful_count || 1;\n const totalFeedbackCount =\n review.helpful_count + review.not_helpful_count || 1;\n\n return (\n <div className=\"border-b p-14\">\n {review.reviewable && (\n <ReviewableHeader\n isSelected={isSelected}\n onToggle={onToggle}\n reviewable={review.reviewable}\n />\n )}\n <div className=\"flex items-start gap-10 pt-14 md:pl-20\">\n <UserAvatar className=\"flex-shrink-0\" user={review.user} size=\"md\" />\n <div className=\"min-w-0 flex-auto overflow-hidden\">\n <ReviewHeader review={review} />\n {isEditing ? (\n <EditReviewForm\n review={review}\n onClose={isSaved => {\n setIsEditing(false);\n if (isSaved) {\n queryClient.invalidateQueries({queryKey: ['comment']});\n }\n }}\n />\n ) : (\n <Fragment>\n <div className=\"my-14\">\n <TitleRating className=\"mb-8\" score={review.score} />\n {review.title && (\n <div className=\"mb-8 text-base font-medium\">\n {review.title}\n </div>\n )}\n <div className=\"whitespace-break-spaces text-sm\">\n {review.body}\n </div>\n <div className=\"mt-8 text-xs text-muted\">\n <BulletSeparatedItems>\n <Trans\n message=\":helpfulCount out of :total people found this helpful\"\n values={{helpfulCount, total: totalFeedbackCount}}\n />\n {review.reports_count ? (\n <Trans\n message=\":count reports\"\n values={{count: review.reports_count || 0}}\n />\n ) : null}\n </BulletSeparatedItems>\n </div>\n </div>\n <div>\n <DeleteReviewsButton reviewIds={[review.id]} />\n <Button\n variant=\"outline\"\n size=\"xs\"\n onClick={() => setIsEditing(true)}\n >\n <Trans message=\"Edit\" />\n </Button>\n </div>\n </Fragment>\n )}\n </div>\n </div>\n </div>\n );\n}\n\ninterface ReviewableHeaderProps {\n isSelected: boolean;\n onToggle: Props['onToggle'];\n reviewable: NormalizedModel;\n}\nfunction ReviewableHeader({\n isSelected,\n onToggle,\n reviewable,\n}: ReviewableHeaderProps) {\n return (\n <div className=\"flex items-center\">\n <div className=\"mr-14\">\n <Checkbox checked={isSelected} onChange={() => onToggle()} />\n </div>\n {reviewable.image && (\n <img\n className=\"mr-6 h-20 w-20 overflow-hidden rounded object-cover\"\n src={reviewable.image}\n alt=\"\"\n />\n )}\n <div className=\"mr-4 text-sm\">{reviewable.name}</div>\n <div className=\"text-xs text-muted\">({reviewable.model_type})</div>\n </div>\n );\n}\n\ninterface CommentHeaderProps {\n review: Review;\n}\nfunction ReviewHeader({review}: CommentHeaderProps) {\n return (\n <div className=\"flex items-center gap-4 text-sm\">\n <div>\n {review.user && (\n <UserDisplayName user={review.user} show=\"display_name\" />\n )}\n </div>\n <div>&bull;</div>\n <time>\n <FormattedRelativeTime date={review.created_at} />\n </time>\n {review.user && (\n <div className=\"ml-auto hidden md:block\">\n {<UserDisplayName user={review.user} show=\"email\" />}\n </div>\n )}\n </div>\n );\n}\n\ninterface EditReviewFormProps {\n review: Review;\n onClose: (saved: boolean) => void;\n}\nfunction EditReviewForm({review, onClose}: EditReviewFormProps) {\n const [content, setContent] = useState(review.body);\n const updateReview = useUpdateReview(review);\n const form = useForm<CreateReviewPayload>({\n defaultValues: {\n score: review.score,\n title: review.title,\n body: review.body,\n },\n });\n return (\n <Form\n className=\"mt-24\"\n form={form}\n onSubmit={newValues => {\n updateReview.mutate(newValues, {onSuccess: () => onClose(true)});\n }}\n >\n <StarSelector\n className=\"-ml-8 mb-12\"\n count={10}\n value={form.watch('score')}\n onValueChange={newScore => {\n form.setValue('score', newScore);\n }}\n />\n <FormTextField\n name=\"title\"\n className=\"mb-24\"\n label={<Trans message=\"Title\" />}\n labelSuffix={<Trans message=\"10 character minimum\" />}\n autoFocus\n minLength={10}\n required\n />\n <FormTextField\n className=\"mb-24\"\n name=\"body\"\n label={<Trans message=\"Review\" />}\n labelSuffix={<Trans message=\"100 character minimum\" />}\n inputElementType=\"textarea\"\n rows={5}\n minLength={100}\n required\n />\n <Button\n size=\"xs\"\n variant=\"outline\"\n color=\"primary\"\n type=\"submit\"\n className=\"mr-6\"\n disabled={updateReview.isPending}\n >\n <Trans message=\"Save\" />\n </Button>\n <Button\n size=\"xs\"\n variant=\"outline\"\n className=\"mr-6\"\n onClick={e => onClose(false)}\n disabled={updateReview.isPending}\n >\n <Trans message=\"Cancel\" />\n </Button>\n </Form>\n );\n}\n\ninterface UserDisplayNameProps {\n user: User;\n show: 'display_name' | 'email';\n}\nfunction UserDisplayName({user, show}: UserDisplayNameProps) {\n const {auth} = useContext(SiteConfigContext);\n if (auth.getUserProfileLink) {\n return (\n <Link\n to={auth.getUserProfileLink(user)}\n className={LinkStyle}\n target=\"_blank\"\n >\n {user[show]}\n </Link>\n );\n }\n return <div className=\"text-muted\">{user[show]}</div>;\n}\n","import {\n ALL_PRIMITIVE_OPERATORS,\n BackendFilter,\n FilterControlType,\n FilterOperator,\n} from '@common/datatable/filters/backend-filter';\nimport {message} from '@common/i18n/message';\nimport {USER_MODEL} from '@common/auth/user';\nimport {\n createdAtFilter,\n updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\nimport {TITLE_MODEL} from '@app/titles/models/title';\n\nexport const ReviewsDatatableFilters: BackendFilter[] = [\n {\n key: 'user_id',\n label: message('User'),\n description: message('User review was created by'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.SelectModel,\n model: USER_MODEL,\n },\n },\n {\n key: 'reviewable_id',\n label: message('Title'),\n description: message('Movie or series review was created for'),\n defaultOperator: FilterOperator.eq,\n extraFilters: [\n {\n key: 'reviewable_type',\n operator: FilterOperator.eq,\n value: 'App\\\\Title',\n },\n ],\n control: {\n type: FilterControlType.SelectModel,\n model: TITLE_MODEL,\n },\n },\n {\n key: 'score',\n label: message('Score'),\n description: message('Review score'),\n defaultOperator: FilterOperator.gte,\n operators: ALL_PRIMITIVE_OPERATORS,\n control: {\n type: FilterControlType.Input,\n inputType: 'number',\n minValue: 1,\n maxValue: 10,\n defaultValue: 7,\n },\n },\n {\n key: 'helpful_count',\n label: message('Helpful count'),\n description: message('How many users found this review helpful'),\n defaultOperator: FilterOperator.gte,\n operators: ALL_PRIMITIVE_OPERATORS,\n control: {\n type: FilterControlType.Input,\n inputType: 'number',\n minValue: 1,\n defaultValue: 10,\n },\n },\n {\n key: 'not_helpful_count',\n label: message('Not helpful count'),\n description: message('How many users found this review not helpful'),\n defaultOperator: FilterOperator.gte,\n operators: ALL_PRIMITIVE_OPERATORS,\n control: {\n type: FilterControlType.Input,\n inputType: 'number',\n minValue: 1,\n defaultValue: 10,\n },\n },\n createdAtFilter({\n description: message('Date review was created'),\n }),\n updatedAtFilter({\n description: message('Date review was last updated'),\n }),\n];\n","import React, { useCallback, useMemo, useState } from \"react\";\nimport { Trans } from \"@common/i18n/trans\";\nimport clsx from \"clsx\";\nimport { StaticPageTitle } from \"@common/seo/static-page-title\";\nimport { DataTableHeader } from \"@common/datatable/data-table-header\";\nimport {\n useBackendFilterUrlParams\n} from \"@common/datatable/filters/backend-filter-url-params\";\nimport {\n GetDatatableDataParams,\n useDatatableData\n} from \"@common/datatable/requests/paginated-resources\";\nimport { FilterList } from \"@common/datatable/filters/filter-list/filter-list\";\nimport {\n SelectedStateDatatableHeader\n} from \"@common/datatable/selected-state-datatable-header\";\nimport { AnimatePresence } from \"framer-motion\";\nimport {\n DataTablePaginationFooter\n} from \"@common/datatable/data-table-pagination-footer\";\nimport {\n DataTableEmptyStateMessage\n} from \"@common/datatable/page/data-table-emty-state-message\";\nimport reviewsImage from \"./reviews.svg\";\nimport { FullPageLoader } from \"@common/ui/progress/full-page-loader\";\nimport { Review } from \"@app/titles/models/review\";\nimport { DeleteReviewsButton } from \"@app/admin/reviews/delete-reviews-button\";\nimport { ReviewDatatableItem } from \"@app/admin/reviews/review-datatable-item\";\nimport {\n ReviewsDatatableFilters\n} from \"@app/admin/reviews/reviews-datatable-filters\";\nimport {\n ReviewListSortButton\n} from \"@app/reviews/review-list/review-list-sort-button\";\nimport { Reviewable } from \"@app/reviews/reviewable\";\n\ninterface Props {\n hideTitle?: boolean;\n reviewable?: Reviewable;\n}\nexport function ReviewsDatatablePage({hideTitle, reviewable}: Props) {\n const filters = useMemo(() => {\n return ReviewsDatatableFilters.filter(\n f => f.key !== 'reviewable_id' || !reviewable,\n );\n }, [reviewable]);\n const {encodedFilters} = useBackendFilterUrlParams(filters);\n const [params, setParams] = useState<GetDatatableDataParams>({perPage: 15});\n const [selectedReviews, setSelectedReviews] = useState<number[]>([]);\n const [sort, setSort] = useState<string>('created_at:desc');\n const [orderBy, orderDir] = sort.split(':');\n\n const query = useDatatableData<Review>('reviews', {\n ...params,\n orderBy,\n orderDir: orderDir as 'asc' | 'desc',\n with: 'reviewable,user',\n filters: encodedFilters,\n reviewable_type: reviewable?.model_type,\n reviewable_id: reviewable?.id,\n }, undefined, () => {\n setSelectedReviews([]);\n });\n\n const toggleReview = useCallback(\n (id: number) => {\n const newValues = [...selectedReviews];\n if (!newValues.includes(id)) {\n newValues.push(id);\n } else {\n const index = newValues.indexOf(id);\n newValues.splice(index, 1);\n }\n setSelectedReviews(newValues);\n },\n [selectedReviews, setSelectedReviews],\n );\n\n const isFiltering = !!(params.query || params.filters || encodedFilters);\n const pagination = query.data?.pagination;\n\n return (\n <div className={clsx(!hideTitle && 'p-12 md:p-24')}>\n <div className={clsx('mb-16')}>\n <StaticPageTitle>\n <Trans message=\"Reviews\" />\n </StaticPageTitle>\n {!hideTitle && (\n <h1 className=\"text-3xl font-light\">\n <Trans message=\"Reviews\" />\n </h1>\n )}\n </div>\n <div>\n <AnimatePresence initial={false} mode=\"wait\">\n {selectedReviews.length ? (\n <SelectedStateDatatableHeader\n selectedItemsCount={selectedReviews.length}\n actions={\n <DeleteReviewsButton\n size=\"sm\"\n variant=\"flat\"\n reviewIds={selectedReviews}\n />\n }\n key=\"selected\"\n />\n ) : (\n <DataTableHeader\n key=\"default\"\n filters={filters}\n searchValue={params.query}\n onSearchChange={query => setParams({...params, query})}\n actions={\n <ReviewListSortButton\n value={sort}\n onValueChange={newSort => setSort(newSort)}\n color=\"primary\"\n showReportsItem\n />\n }\n />\n )}\n </AnimatePresence>\n <FilterList className=\"mb-14\" filters={filters} />\n\n {query.isLoading ? (\n <FullPageLoader className=\"min-h-200\" />\n ) : (\n <div className=\"border-x border-t rounded\">\n {pagination?.data.map(review => (\n <ReviewDatatableItem\n key={review.id}\n review={review}\n isSelected={selectedReviews.includes(review.id)}\n onToggle={() => toggleReview(review.id)}\n />\n ))}\n </div>\n )}\n\n {(query.isFetched || query.isPlaceholderData) &&\n !pagination?.data.length ? (\n <DataTableEmptyStateMessage\n className=\"pt-50\"\n isFiltering={isFiltering}\n image={reviewsImage}\n title={<Trans message=\"No reviews have been created yet\" />}\n filteringTitle={<Trans message=\"No matching reviews\" />}\n />\n ) : undefined}\n\n <DataTablePaginationFooter\n className=\"mt-10\"\n query={query}\n onPageChange={page => setParams({...params, page})}\n onPerPageChange={perPage => setParams({...params, perPage})}\n />\n </div>\n </div>\n );\n}\n","export default \"__VITE_ASSET__abdf0323__\"","import {CheckIcon} from '@common/icons/material/Check';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport React from 'react';\n\ninterface BooleanIndicatorProps {\n value: boolean;\n}\nexport function BooleanIndicator({value}: BooleanIndicatorProps) {\n if (value) {\n return <CheckIcon className=\"icon-md text-positive\" />;\n }\n return <CloseIcon className=\"icon-md text-danger\" />;\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const BarChartIcon = createSvgIcon(\n <path d=\"M5 9.2h3V19H5V9.2zM10.6 5h2.8v14h-2.8V5zm5.6 8H19v6h-2.8v-6z\" />\n, 'BarChartOutlined');\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Link} from 'react-router-dom';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport React, {Fragment} from 'react';\nimport {Video} from '@app/titles/models/video';\nimport {BooleanIndicator} from '@common/datatable/column-templates/boolean-indicator';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {BarChartIcon} from '@common/icons/material/BarChart';\nimport {CompactSeasonEpisode} from '@app/episodes/compact-season-episode';\nimport {getWatchLink} from '@app/videos/watch-page/get-watch-link';\n\nexport const VideosDatatableColumns: ColumnConfig<Video>[] = [\n {\n key: 'name',\n allowsSorting: true,\n width: 'flex-3',\n visibleInMode: 'all',\n header: () => <Trans message=\"Video\" />,\n body: video => (\n <div className=\"flex items-center gap-12\">\n {video.title ? (\n <TitlePoster\n title={video.title}\n srcSize=\"sm\"\n size=\"w-32\"\n aspect=\"aspect-square\"\n />\n ) : null}\n <div className=\"overflow-hidden min-w-0\">\n <div className=\"overflow-hidden overflow-ellipsis\">\n <Link\n to={getWatchLink(video)}\n target=\"_blank\"\n className=\"hover:underline\"\n >\n {video.title?.name}\n {video.season_num | video.episode_num ? (\n <span>\n {' '}\n (\n <CompactSeasonEpisode\n seasonNum={video.season_num}\n episodeNum={video.episode_num}\n />\n )\n </span>\n ) : null}\n </Link>\n </div>\n <div className=\"text-muted text-xs overflow-hidden overflow-ellipsis\">\n {video.name}\n </div>\n </div>\n </div>\n ),\n },\n {\n key: 'type',\n allowsSorting: true,\n header: () => <Trans message=\"Type\" />,\n body: video => <span className=\"capitalize\">{video.type}</span>,\n },\n {\n key: 'category',\n allowsSorting: true,\n header: () => <Trans message=\"Category\" />,\n body: video => <span className=\"capitalize\">{video.category}</span>,\n },\n {\n key: 'approved',\n allowsSorting: true,\n header: () => <Trans message=\"Approved\" />,\n body: video => <BooleanIndicator value={video.approved} />,\n width: 'w-80 flex-shrink-0',\n },\n {\n key: 'plays_count',\n allowsSorting: true,\n header: () => <Trans message=\"Plays\" />,\n body: video =>\n video.plays_count ? <FormattedNumber value={video.plays_count} /> : null,\n width: 'w-80 flex-shrink-0',\n },\n {\n key: 'reports_count',\n allowsSorting: true,\n header: () => <Trans message=\"Reports\" />,\n body: video =>\n video.reports_count ? (\n <FormattedNumber value={video.reports_count} />\n ) : null,\n width: 'w-80 flex-shrink-0',\n },\n {\n key: 'updated_at',\n allowsSorting: true,\n maxWidth: 'max-w-100',\n header: () => <Trans message=\"Last updated\" />,\n body: video =>\n video.updated_at ? <FormattedDate date={video.updated_at} /> : '',\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n visibleInMode: 'all',\n align: 'end',\n width: 'w-84 flex-shrink-0',\n body: video => (\n <Fragment>\n <IconButton\n size=\"md\"\n className=\"text-muted\"\n elementType={Link}\n to={`${video.id}/insights`}\n >\n <BarChartIcon />\n </IconButton>\n <Link to={`${video.id}/edit`} className=\"text-muted\">\n <IconButton size=\"md\">\n <EditIcon />\n </IconButton>\n </Link>\n </Fragment>\n ),\n },\n];\n","import {CustomFilterControl} from '@common/datatable/filters/backend-filter';\nimport {Fragment} from 'react';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {Avatar} from '@common/ui/images/avatar';\nimport {FilterListItemDialogTrigger} from '@common/datatable/filters/filter-list/filter-list-item-dialog-trigger';\nimport {FilterListControlProps} from '@common/datatable/filters/filter-list/filter-list-control';\nimport {useNormalizedModel} from '@common/users/queries/use-normalized-model';\n\nexport function TitleFilterControl(\n props: FilterListControlProps<number, CustomFilterControl>,\n) {\n const {value, filter} = props;\n const {isLoading, data} = useNormalizedModel(\n `normalized-models/title/${value}`,\n );\n\n const skeleton = (\n <Fragment>\n <Skeleton variant=\"avatar\" size=\"w-18 h-18 mr-6\" />\n <Skeleton variant=\"rect\" size=\"w-50\" />\n </Fragment>\n );\n const modelPreview = (\n <Fragment>\n <Avatar size=\"xs\" src={data?.model.image} className=\"mr-6\" />\n {data?.model.name}\n </Fragment>\n );\n\n const label = isLoading || !data ? skeleton : modelPreview;\n\n const Panel = filter.control.panel;\n return (\n <FilterListItemDialogTrigger\n {...props}\n label={label}\n panel={<Panel filter={filter} />}\n />\n );\n}\n","import {keepPreviousData, useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {NormalizedModel} from '@common/datatable/filters/normalized-model';\n\ninterface AutocompleteTitle extends NormalizedModel {\n seasons_count: number;\n episode_numbers: number[];\n}\n\ninterface Response extends BackendResponse {\n titles: AutocompleteTitle[];\n}\n\ninterface Params {\n searchQuery: string;\n selectedTitleId?: number | string;\n seasonNumber?: number | string;\n}\n\nexport function useTitlesAutocomplete(params: Params) {\n return useQuery({\n queryKey: ['titles', 'autocomplete', params],\n queryFn: () => autocompleteTitles(params),\n placeholderData: keepPreviousData,\n });\n}\n\nfunction autocompleteTitles(params: Params) {\n return apiClient\n .get<Response>(`titles/autocomplete`, {params})\n .then(response => response.data);\n}\n","import {useTrans} from '@common/i18n/use-trans';\nimport {useFormContext} from 'react-hook-form';\nimport React, {useState} from 'react';\nimport {useTitlesAutocomplete} from '@app/titles/requests/use-titles-autocomplete';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {Trans} from '@common/i18n/trans';\nimport {message} from '@common/i18n/message';\nimport {Option} from '@common/ui/forms/combobox/combobox';\nimport {Avatar} from '@common/ui/images/avatar';\n\ninterface Props {\n name: string;\n seasonName?: string;\n episodeName?: string;\n disableTitleField?: boolean;\n className?: string;\n}\nexport function TitleSelect({\n name,\n seasonName,\n episodeName,\n disableTitleField,\n className,\n}: Props) {\n const {trans} = useTrans();\n const form = useFormContext();\n const selectedTitleId = form.watch(name);\n const [searchQuery, setSearchQuery] = useState('');\n\n const selectedSeason = seasonName ? form.watch(seasonName) : undefined;\n const query = useTitlesAutocomplete({\n searchQuery,\n selectedTitleId,\n seasonNumber: selectedSeason,\n });\n const isLoading = query.isLoading || query.isPlaceholderData;\n\n const selectedTitle = query.data?.titles.find(t => t.id === selectedTitleId);\n const seasonCount = selectedTitle?.seasons_count || 0;\n const episodeNumbers = selectedTitle?.episode_numbers || [];\n\n return (\n <div className={className}>\n <FormSelect\n selectionMode=\"single\"\n name={name}\n label={<Trans message=\"Title\" />}\n placeholder={trans(message('Select a title'))}\n showSearchField\n searchPlaceholder={trans(message('Search titles'))}\n inputValue={searchQuery}\n onInputValueChange={setSearchQuery}\n isAsync\n isLoading={isLoading}\n required\n disabled={disableTitleField}\n >\n {query.data?.titles.map(title => (\n <Option\n key={title.id}\n value={title.id}\n description={title.description}\n startIcon={<Avatar src={title.image} />}\n >\n {title.name}\n </Option>\n ))}\n </FormSelect>\n {seasonCount > 0 && seasonName && (\n <FormSelect\n className=\"mt-12\"\n name={seasonName}\n placeholder={trans(message('Select a season (optional)'))}\n selectionMode=\"single\"\n label={<Trans message=\"Season\" />}\n >\n <Option\n key=\"none\"\n value=\"\"\n onSelected={() => form.resetField(seasonName)}\n >\n <Trans message=\"None\" />\n </Option>\n {[...new Array(seasonCount).keys()].map(i => {\n const number = i + 1;\n return (\n <Option key={number} value={number}>\n <Trans message=\"Season :number\" values={{number}} />\n </Option>\n );\n })}\n </FormSelect>\n )}\n {!!episodeNumbers.length && episodeName && (\n <FormSelect\n className=\"mt-12\"\n name={episodeName}\n placeholder={trans(message('Select an episode (optional)'))}\n selectionMode=\"single\"\n label={<Trans message=\"Episode\" />}\n >\n <Option\n key=\"none\"\n value=\"\"\n onSelected={() => form.resetField(episodeName)}\n >\n <Trans message=\"None\" />\n </Option>\n {episodeNumbers.map(number => (\n <Option key={number} value={number}>\n <Trans message=\"Episode :number\" values={{number}} />\n </Option>\n ))}\n </FormSelect>\n )}\n </div>\n );\n}\n","import {\n BackendFilter,\n CustomFilterControl,\n} from '@common/datatable/filters/backend-filter';\nimport React from 'react';\nimport {TitleSelect} from '@app/titles/title-select';\n\ninterface Props {\n filter: BackendFilter<CustomFilterControl>;\n}\nexport function TitleFilterPanel({filter}: Props) {\n return (\n <TitleSelect\n name={`${filter.key}.value`}\n seasonName={`${filter.key}.season`}\n episodeName={`${filter.key}.episode`}\n />\n );\n}\n","import {\n BackendFilter,\n FilterControlType,\n FilterOperator,\n} from '@common/datatable/filters/backend-filter';\nimport {message} from '@common/i18n/message';\nimport {USER_MODEL} from '@common/auth/user';\nimport {\n createdAtFilter,\n updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\nimport {TitleFilterControl} from '@app/admin/reviews/title-filter/title-filter-control';\nimport {TitleFilterPanel} from '@app/admin/reviews/title-filter/title-filter-panel';\n\nexport const VideosDatatableFilters: BackendFilter[] = [\n {\n key: 'user_id',\n label: message('User'),\n description: message('User video was created by'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.SelectModel,\n model: USER_MODEL,\n },\n },\n {\n key: 'title_id',\n label: message('Title'),\n description: message('Movie or series video was created for'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Custom,\n panel: TitleFilterPanel,\n listItem: TitleFilterControl,\n },\n },\n {\n key: 'approved',\n label: message('Status'),\n description: message('Whether video is approved or not'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: false,\n options: [\n {label: message('Approved'), key: 'approved', value: true},\n {label: message('Not approved'), key: 'not_approved', value: false},\n ],\n },\n },\n {\n key: 'origin',\n label: message('Origin'),\n description: message('Whether video origin is local or external'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: 'local',\n options: [\n {label: message('Local'), key: 'local', value: 'local'},\n {\n label: message('External'),\n key: 'external',\n value: {operator: FilterOperator.ne, value: 'local'},\n },\n ],\n },\n },\n {\n key: 'type',\n label: message('Type'),\n description: message('Type of the video'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: 'embed',\n options: [\n {label: message('Embed'), key: 'embed', value: 'embed'},\n {label: message('Direct Video'), key: 'video', value: 'video'},\n {label: message('Stream'), key: 'stream', value: 'stream'},\n {label: message('Remote Link'), key: 'remote', value: 'remote'},\n ],\n },\n },\n {\n key: 'quality',\n label: message('Quality'),\n description: message('Quality of video'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: 'hd',\n options: [\n {label: message('HD'), key: 'hd', value: 'hd'},\n {label: message('SD'), key: 'sd', value: 'sd'},\n {label: message('Stream'), key: 'stream', value: 'stream'},\n {label: message('Remote Link'), key: 'remote', value: 'remote'},\n ],\n },\n },\n {\n key: 'category',\n label: message('Category'),\n description: message('Video category'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: 'trailer',\n options: [\n {label: message('Trailer'), key: 'trailer', value: 'trailer'},\n {label: message('Full Movie or episode'), key: 'full', value: 'full'},\n {label: message('Clip'), key: 'clip', value: 'clip'},\n {label: message('Teaser'), key: 'teaser', value: 'teaser'},\n {label: message('Featurette'), key: 'featurette', value: 'featurette'},\n {\n label: message('Behind the scenes'),\n key: 'behind_the_scenes',\n value: 'behind the scenes',\n },\n ],\n },\n },\n createdAtFilter({\n description: message('Date video was created'),\n }),\n updatedAtFilter({\n description: message('Date video was last updated'),\n }),\n];\n","import React from 'react';\nimport {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {Trans} from '@common/i18n/trans';\nimport {DeleteSelectedItemsAction} from '@common/datatable/page/delete-selected-items-action';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport videoFilesImage from './video-files.svg';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {Link} from 'react-router-dom';\nimport {VideosDatatableColumns} from '@app/admin/videos/videos-datatable-columns';\nimport {VideosDatatableFilters} from '@app/admin/videos/videos-datatable-filters';\n\nexport function VideosDatatablePage() {\n return (\n <DataTablePage\n endpoint=\"videos\"\n queryParams={{\n withCount: 'plays,reports',\n with: 'episode',\n }}\n title={<Trans message=\"Videos\" />}\n columns={VideosDatatableColumns}\n filters={VideosDatatableFilters}\n actions={<Actions />}\n selectedActions={<DeleteSelectedItemsAction />}\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={videoFilesImage}\n title={<Trans message=\"No videos have been created yet\" />}\n filteringTitle={<Trans message=\"No matching videos\" />}\n />\n }\n />\n );\n}\n\nfunction Actions() {\n return (\n <DataTableAddItemButton elementType={Link} to=\"new\">\n <Trans message=\"Add video\" />\n </DataTableAddItemButton>\n );\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {Video, VideoCaption} from '@app/titles/models/video';\n\ninterface Response extends BackendResponse {\n video: Video;\n}\n\nexport interface CreateVideoPayload {\n name: string;\n title_id: number;\n season_num?: number;\n episode_num?: number;\n thumbnail?: string;\n type: Video['type'];\n src: string;\n quality: Video['quality'];\n language: string;\n category: Video['category'];\n captions?: VideoCaption[];\n}\n\nexport function useCreateVideo(form: UseFormReturn<CreateVideoPayload>) {\n return useMutation({\n mutationFn: (payload: CreateVideoPayload) => createVideo(payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({queryKey: ['video']});\n },\n onError: r => (form ? onFormQueryError(r, form) : showHttpErrorToast(r)),\n });\n}\n\nfunction createVideo(payload: CreateVideoPayload): Promise<Response> {\n return apiClient.post(`videos`, payload).then(r => r.data);\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {FileEntry} from '@common/uploads/file-entry';\n\ninterface Response extends BackendResponse {\n fileEntry: FileEntry;\n}\n\ninterface Options {\n enabled?: boolean;\n}\n\nexport function useFileEntryModel(\n entryIdOrUrl: number | string | undefined,\n options: Options = {enabled: true},\n) {\n const entryId = extractEntryId(entryIdOrUrl);\n return useQuery({\n queryKey: ['file-entries', `${entryId}`],\n queryFn: () => fetchFileEntry(entryId!),\n enabled: !!entryId && options.enabled,\n });\n}\n\nfunction fetchFileEntry(entryId: number | string) {\n return apiClient\n .get<Response>(`file-entries/${entryId}/model`)\n .then(response => response.data);\n}\n\nfunction extractEntryId(entryIdOrUrl: number | string | undefined) {\n if (!entryIdOrUrl) {\n return undefined;\n }\n const parsedId = parseInt(entryIdOrUrl as string);\n if (!isNaN(parsedId)) {\n return parsedId;\n }\n return `${entryIdOrUrl}`.split('/').pop();\n}\n","import React, {\n cloneElement,\n ComponentPropsWithRef,\n ReactElement,\n ReactNode,\n useCallback,\n useId,\n useRef,\n} from 'react';\nimport clsx from 'clsx';\nimport {mergeProps} from '@react-aria/utils';\nimport {toast} from '@common/ui/toast/toast';\nimport {Field} from '@common/ui/forms/input-field/field';\nimport {\n getInputFieldClassNames,\n InputFieldStyle,\n} from '@common/ui/forms/input-field/get-input-field-class-names';\nimport {FileEntry} from '@common/uploads/file-entry';\nimport {useAutoFocus} from '@common/ui/focus/use-auto-focus';\nimport {UploadStrategyConfig} from '@common/uploads/uploader/strategy/upload-strategy';\nimport {useActiveUpload} from '@common/uploads/uploader/use-active-upload';\nimport {Disk} from '@common/uploads/types/backend-metadata';\nimport {Button} from '@common/ui/buttons/button';\nimport {Trans} from '@common/i18n/trans';\nimport {ProgressBar} from '@common/ui/progress/progress-bar';\nimport {Input} from '@common/ui/forms/input-field/input';\nimport {useController} from 'react-hook-form';\nimport {useFileEntryModel} from '@common/uploads/requests/use-file-entry-model';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {validateUpload} from '@common/uploads/uploader/validate-upload';\nimport {UploadedFile} from '@common/uploads/uploaded-file';\n\ninterface Props {\n className?: string;\n label?: ReactNode;\n description?: ReactNode;\n invalid?: boolean;\n errorMessage?: ReactNode;\n required?: boolean;\n disabled?: boolean;\n value?: string;\n onChange?: (newValue: string) => void;\n allowedFileTypes?: string[];\n maxFileSize?: number;\n diskPrefix: string;\n disk?: Disk;\n showRemoveButton?: boolean;\n autoFocus?: boolean;\n}\nexport function FileEntryField({\n className,\n label,\n description,\n value,\n onChange,\n diskPrefix,\n disk = Disk.uploads,\n showRemoveButton,\n invalid,\n errorMessage,\n required,\n autoFocus,\n disabled,\n allowedFileTypes,\n maxFileSize,\n}: Props) {\n const {\n uploadFile,\n entry,\n uploadStatus,\n deleteEntry,\n isDeletingEntry,\n percentage,\n } = useActiveUpload();\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n useAutoFocus({autoFocus}, inputRef);\n const {data} = useFileEntryModel(value, {enabled: !entry && !!value});\n\n const fieldId = useId();\n const labelId = label ? `${fieldId}-label` : undefined;\n const descriptionId = description ? `${fieldId}-description` : undefined;\n\n const currentValue = value || entry?.url;\n const currentEntry = entry || data?.fileEntry;\n\n const uploadOptions: UploadStrategyConfig = {\n showToastOnRestrictionFail: true,\n restrictions: {\n allowedFileTypes,\n maxFileSize,\n },\n metadata: {\n diskPrefix,\n disk,\n },\n onSuccess: (entry: FileEntry) => onChange?.(entry.url),\n onError: message => {\n if (message) {\n toast.danger(message);\n }\n },\n };\n\n const inputFieldClassNames = getInputFieldClassNames({\n description,\n descriptionPosition: 'top',\n invalid,\n disabled: disabled || uploadStatus === 'inProgress',\n });\n\n const removeButton = showRemoveButton ? (\n <Button\n variant=\"link\"\n color=\"danger\"\n size=\"xs\"\n disabled={isDeletingEntry || !currentValue || disabled}\n onClick={() => {\n deleteEntry({\n onSuccess: () => onChange?.(''),\n });\n }}\n >\n <Trans message=\"Remove file\" />\n </Button>\n ) : null;\n\n const handleUpload = useCallback(() => {\n inputRef.current?.click();\n }, []);\n\n return (\n <div className={clsx('text-sm', className)}>\n {label && (\n <div className=\"flex items-center justify-between gap-24\">\n <div id={labelId} className={inputFieldClassNames.label}>\n {label}\n </div>\n {removeButton}\n </div>\n )}\n {description && (\n <div className={inputFieldClassNames.description}>{description}</div>\n )}\n <div aria-labelledby={labelId} aria-describedby={descriptionId}>\n <Field\n fieldClassNames={inputFieldClassNames}\n errorMessage={errorMessage}\n invalid={invalid}\n >\n <FileInputField\n inputFieldClassNames={inputFieldClassNames}\n currentValue={currentValue}\n currentEntry={currentEntry}\n handleUpload={handleUpload}\n >\n <input\n ref={inputRef}\n aria-labelledby={labelId}\n aria-describedby={descriptionId}\n // if file is already uploaded (from form or via props) set\n // required to false, otherwise farm validation will always fail\n required={currentValue ? false : required}\n accept={allowedFileTypes?.join(',')}\n type=\"file\"\n disabled={uploadStatus === 'inProgress'}\n className=\"sr-only\"\n onChange={e => {\n if (e.target.files?.length) {\n // \"uploadFile\" will validate, but need to validate here as well\n // because there's no easy way to listen for errors using \"uploadFile\"\n const errorMessage = validateUpload(\n new UploadedFile(e.target.files[0]),\n uploadOptions.restrictions\n );\n if (errorMessage && inputRef.current) {\n inputRef.current.value = '';\n toast.danger(errorMessage);\n } else {\n uploadFile(e.target.files[0], uploadOptions);\n }\n }\n }}\n />\n </FileInputField>\n {uploadStatus === 'inProgress' && (\n <ProgressBar\n className=\"absolute left-0 right-0 top-0\"\n size=\"xs\"\n value={percentage}\n />\n )}\n </Field>\n </div>\n </div>\n );\n}\n\ninterface FileInputFieldProps {\n children: ReactElement<ComponentPropsWithRef<'input'>>;\n inputFieldClassNames: InputFieldStyle;\n currentValue?: string;\n currentEntry?: FileEntry;\n handleUpload: () => void;\n}\nfunction FileInputField({\n children,\n inputFieldClassNames,\n currentValue,\n currentEntry,\n handleUpload,\n}: FileInputFieldProps) {\n const buttonRef = useRef<HTMLButtonElement>(null);\n if (currentValue) {\n return (\n <Field\n wrapperProps={{\n onClick: () => {\n buttonRef.current?.focus();\n buttonRef.current?.click();\n },\n }}\n fieldClassNames={inputFieldClassNames}\n >\n <Input className={clsx(inputFieldClassNames.input, 'gap-10')}>\n <button\n ref={buttonRef}\n type=\"button\"\n className=\"flex-shrink-0 rounded bg-primary px-10 py-2 text-sm font-semibold text-on-primary outline-none\"\n onClick={() => handleUpload()}\n >\n <Trans message=\"Replace file\" />\n </button>\n <AnimatePresence initial={false} mode=\"wait\">\n <div className=\"min-w-0 overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {currentEntry ? (\n <m.div key=\"file-entry-name\" {...opacityAnimation}>\n {currentEntry.name}\n </m.div>\n ) : (\n <m.div key=\"skeleton\" {...opacityAnimation}>\n <Skeleton className=\"min-w-144\" />\n </m.div>\n )}\n </div>\n </AnimatePresence>\n {children}\n </Input>\n </Field>\n );\n }\n\n return cloneElement(children, {\n className: clsx(\n inputFieldClassNames.input,\n 'py-8',\n 'file:bg-primary file:text-on-primary file:border-none file:rounded file:text-sm file:font-semibold file:px-10 file:h-24 file:mr-10'\n ),\n });\n}\n\ninterface FormFileEntryFieldProps extends Props {\n name: string;\n}\nexport function FormFileEntryField(props: FormFileEntryFieldProps) {\n const {\n field: {onChange, value = null},\n fieldState: {error},\n } = useController({\n name: props.name,\n });\n\n const formProps: Partial<Props> = {\n onChange,\n value,\n invalid: error != null,\n errorMessage: error ? <Trans message=\"Please select a file.\" /> : null,\n };\n\n return <FileEntryField {...mergeProps(formProps, props)} />;\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {useForm} from 'react-hook-form';\nimport {Form} from '@common/ui/forms/form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {useValueLists} from '@common/http/value-lists';\nimport {FormSelect, Option} from '@common/ui/forms/select/select';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {VideoCaption} from '@app/titles/models/video';\nimport {FormFileEntryField} from '@common/ui/forms/input-field/file-entry-field';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {Disk} from '@common/uploads/types/backend-metadata';\n\ninterface Props {\n caption?: VideoCaption;\n}\nexport function CrupdateCaptionDialog({caption}: Props) {\n const {close, formId} = useDialogContext();\n const form = useForm({\n defaultValues: {\n language: 'en',\n ...caption,\n },\n });\n return (\n <Dialog>\n <DialogHeader>\n {caption ? (\n <Trans message=\"Update caption\" />\n ) : (\n <Trans message=\"Add caption\" />\n )}\n </DialogHeader>\n <DialogBody>\n <Form id={formId} form={form} onSubmit={newValues => close(newValues)}>\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Name\" />}\n className=\"mb-24\"\n required\n autoFocus\n />\n <LanguageSelect />\n <FileUploadProvider>\n <FormFileEntryField\n required={!caption}\n name=\"url\"\n diskPrefix=\"captions\"\n disk={Disk.public}\n allowedFileTypes={['.vtt']}\n maxFileSize={1024 * 1024}\n label={<Trans message=\"Caption file\" />}\n onChange={() => {\n form.clearErrors();\n }}\n />\n </FileUploadProvider>\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button onClick={() => close()}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button form={formId} variant=\"flat\" color=\"primary\" type=\"submit\">\n {caption ? <Trans message=\"Update\" /> : <Trans message=\"Add\" />}\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n\nfunction LanguageSelect() {\n const {trans} = useTrans();\n const {data} = useValueLists(['languages']);\n return (\n <FormSelect\n name=\"language\"\n selectionMode=\"single\"\n showSearchField\n searchPlaceholder={trans(message('Search languages'))}\n label={<Trans message=\"Language\" />}\n className=\"mb-24\"\n >\n {data?.languages?.map(language => (\n <Option value={language.code} key={language.code} capitalizeFirst>\n <Trans message={language.name} />\n </Option>\n ))}\n </FormSelect>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const SubtitlesIcon = createSvgIcon(\n <path d=\"M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 14H4V6h16v12zM6 10h2v2H6zm0 4h8v2H6zm10 0h2v2h-2zm-6-4h8v2h-8z\" />\n, 'SubtitlesOutlined');\n","import {useFieldArray, useFormContext} from 'react-hook-form';\nimport {CreateVideoPayload} from '@app/admin/videos/requests/use-create-video';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Button} from '@common/ui/buttons/button';\nimport {AddIcon} from '@common/icons/material/Add';\nimport {CrupdateCaptionDialog} from '@app/admin/videos/crupdate/crupdate-caption-dialog';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {SubtitlesIcon} from '@common/icons/material/Subtitles';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {DragHandleIcon} from '@common/icons/material/DragHandle';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport React, {useRef} from 'react';\nimport {useIsTouchDevice} from '@common/utils/hooks/is-touch-device';\nimport {DragPreviewRenderer} from '@common/ui/interactions/dnd/use-draggable';\nimport {DragPreview} from '@common/ui/interactions/dnd/drag-preview';\nimport {Video, VideoCaption} from '@app/titles/models/video';\nimport {SettingsIcon} from '@common/icons/material/Settings';\nimport {useSortable} from '@common/ui/interactions/dnd/sortable/use-sortable';\n\nexport function CaptionsPanel() {\n const {watch} = useFormContext<CreateVideoPayload>();\n const {fields, append, remove, swap, update} = useFieldArray<\n CreateVideoPayload,\n 'captions',\n 'key'\n >({\n name: 'captions',\n keyName: 'key',\n });\n const sourceType = watch('type');\n const supportsCaptions = sourceType === 'video';\n\n return (\n <div className=\"mt-24\">\n <div className=\"flex items-center justify-between gap-24\">\n <div className=\"text-xl font-medium\">\n <Trans message=\"Captions\" />\n </div>\n <DialogTrigger\n type=\"modal\"\n onClose={values => {\n if (values) {\n append(values);\n }\n }}\n >\n <Button\n variant=\"outline\"\n startIcon={<AddIcon />}\n size=\"xs\"\n disabled={!supportsCaptions}\n >\n <Trans message=\"Add caption\" />\n </Button>\n <CrupdateCaptionDialog />\n </DialogTrigger>\n </div>\n <div className=\"mt-24\">\n {!supportsCaptions || !fields?.length ? (\n <IllustratedMessage\n size=\"sm\"\n image={<SubtitlesIcon />}\n imageHeight=\"h-24\"\n imageMargin=\"mb-12\"\n title={<NoCaptionsMessage sourceType={sourceType} />}\n />\n ) : null}\n {supportsCaptions &&\n fields.map((caption, index) => (\n <CaptionItem\n key={caption.key}\n caption={caption}\n captions={fields}\n onSort={(oldIndex, newIndex) => swap(oldIndex, newIndex)}\n onRemove={() => remove(index)}\n onUpdate={values => update(index, values)}\n />\n ))}\n </div>\n </div>\n );\n}\n\ninterface CaptionItemProps {\n caption: VideoCaption;\n captions: VideoCaption[];\n onSort: (oldIndex: number, newIndex: number) => void;\n onRemove: () => void;\n onUpdate: (caption: VideoCaption) => void;\n}\nfunction CaptionItem({\n caption,\n captions,\n onSort,\n onRemove,\n onUpdate,\n}: CaptionItemProps) {\n const domRef = useRef<HTMLDivElement>(null);\n const previewRef = useRef<DragPreviewRenderer>(null);\n const isTouchDevice = useIsTouchDevice();\n\n const {sortableProps, dragHandleRef} = useSortable({\n ref: domRef,\n disabled: isTouchDevice ?? false,\n item: caption,\n items: captions,\n type: 'captionItem',\n preview: previewRef,\n strategy: 'line',\n onSortEnd: (oldIndex, newIndex) => onSort(oldIndex, newIndex),\n });\n\n return (\n <div\n className=\"mb-6 flex items-center border-b border-t border-transparent\"\n ref={domRef}\n {...sortableProps}\n >\n <IconButton ref={dragHandleRef} aria-label=\"Sort captions\">\n <DragHandleIcon />\n </IconButton>\n <div className=\"ml-12 capitalize\">{caption.name}</div>\n <div className=\"ml-auto mr-12 rounded border px-8 py-4 text-xs uppercase\">\n {caption.language}\n </div>\n <DialogTrigger\n type=\"modal\"\n onClose={values => {\n if (values) {\n onUpdate(values);\n }\n }}\n >\n <Tooltip label={<Trans message=\"Edit\" />}>\n <IconButton onClick={() => onRemove()} className=\"text-muted\">\n <SettingsIcon />\n </IconButton>\n </Tooltip>\n <CrupdateCaptionDialog caption={caption} />\n </DialogTrigger>\n <Tooltip label={<Trans message=\"Remove\" />}>\n <IconButton onClick={() => onRemove()} className=\"text-danger\">\n <CloseIcon />\n </IconButton>\n </Tooltip>\n <CaptionItemDragPreview caption={caption} ref={previewRef} />\n </div>\n );\n}\n\ninterface CaptionItemDragPreviewProps {\n caption: VideoCaption;\n}\nconst CaptionItemDragPreview = React.forwardRef<\n DragPreviewRenderer,\n CaptionItemDragPreviewProps\n>(({caption}, ref) => {\n return (\n <DragPreview ref={ref}>\n {() => (\n <div className=\"rounded bg-background p-8 text-base shadow\">\n {caption.name}\n </div>\n )}\n </DragPreview>\n );\n});\n\ninterface NoCaptionsMessageProps {\n sourceType: Video['type'];\n}\nfunction NoCaptionsMessage({sourceType}: NoCaptionsMessageProps) {\n switch (sourceType) {\n case 'video':\n return <Trans message=\"No captions have been added to this video yet.\" />;\n case 'stream':\n return (\n <Trans message=\"Captions (if available) are embedded within the stream itself.\" />\n );\n default:\n return <Trans message=\"This source type does not support captions.\" />;\n }\n}\n","import React, {useState} from 'react';\nimport {useFormContext, UseFormReturn} from 'react-hook-form';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {TitleSelect} from '@app/titles/title-select';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\nimport {FormSelect, Option} from '@common/ui/forms/select/select';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {useValueLists} from '@common/http/value-lists';\nimport {message} from '@common/i18n/message';\nimport {CreateVideoPayload} from '@app/admin/videos/requests/use-create-video';\nimport {InfoDialogTriggerIcon} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger-icon';\nimport {Video} from '@app/titles/models/video';\nimport {VideoPlayerSkeleton} from '@app/videos/video-player-skeleton';\nimport {SiteVideoPlayer} from '@app/videos/site-video-player';\nimport {CaptionsPanel} from '@app/admin/videos/captions/captions-panel';\nimport {FormFileEntryField} from '@common/ui/forms/input-field/file-entry-field';\nimport {RadioGroup} from '@common/ui/forms/radio-group/radio-group';\nimport {Radio} from '@common/ui/forms/radio-group/radio';\nimport {Disk} from '@common/uploads/types/backend-metadata';\n\ninterface Props {\n form: UseFormReturn<CreateVideoPayload>;\n video?: Video;\n}\nexport function CrupdateVideoForm({form, video}: Props) {\n return (\n <div className=\"flex items-start gap-54\">\n <div className=\"flex-auto\">\n <VideoPreview video={video} />\n <ReloadMessage form={form} />\n <CaptionsPanel />\n </div>\n <div className=\"w-440 flex-shrink-0\">\n <VideoForm />\n </div>\n </div>\n );\n}\n\nfunction ReloadMessage({form}: Props) {\n const dirty = form.formState.dirtyFields;\n if (!dirty.src && !dirty.thumbnail) return null;\n\n return (\n <div className=\"mt-12 flex items-center gap-6 text-sm text-muted\">\n <InfoDialogTriggerIcon\n size=\"xs\"\n className=\"text-muted\"\n viewBox=\"0 0 16 16\"\n />\n <Trans message=\"Save your changes to reload video preview.\" />\n </div>\n );\n}\n\ninterface VideoPreviewProps {\n video?: Video;\n}\nfunction VideoPreview({video}: VideoPreviewProps) {\n if (!video || !video.src) {\n return <VideoPlayerSkeleton animate={false} />;\n }\n // timestamp will force reload of player when video is updated\n return (\n <SiteVideoPlayer\n video={video}\n mediaItemId={`${video.id}-${video.updated_at}`}\n />\n );\n}\n\nfunction VideoForm() {\n return (\n <FileUploadProvider>\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Name\" />}\n className=\"mb-24\"\n required\n />\n <TitleSelect\n name=\"title_id\"\n seasonName=\"season_num\"\n episodeName=\"episode_num\"\n className=\"mb-24\"\n />\n <FormImageSelector\n name=\"thumbnail\"\n label={<Trans message=\"Thumbnail\" />}\n diskPrefix=\"video-thumbnails\"\n className=\"mb-24\"\n />\n <SourceTypeSelect />\n <SourceField />\n <QualitySelect />\n <LanguageSelect />\n <ContentTypeSelect />\n </FileUploadProvider>\n );\n}\n\nfunction SourceTypeSelect() {\n const {setValue} = useFormContext<CreateVideoPayload>();\n return (\n <FormSelect\n name=\"type\"\n selectionMode=\"single\"\n label={<Trans message=\"Source type\" />}\n className=\"mb-24\"\n onSelectionChange={() => setValue('src', '')}\n >\n <Option\n value=\"embed\"\n description={\n <Trans message=\"Embed video hosted on another site. Youtube, vimeo etc.\" />\n }\n >\n <Trans message=\"Embed\" />\n </Option>\n <Option\n value=\"video\"\n description={\n <Trans message=\"Upload a video file or enter a url to direct video (.mp4, .webm, .avi, .mov etc.) hosted online.\" />\n }\n >\n <Trans message=\"Direct\" />\n </Option>\n <Option\n value=\"stream\"\n description={<Trans message=\"Enter a url to HLS or DASH stream.\" />}\n >\n <Trans message=\"Adaptive stream\" />\n </Option>\n <Option\n value=\"external\"\n description={\n <Trans message=\"Enter any url. User will be redirected to this url after clicking the video.\" />\n }\n >\n <Trans message=\"Basic url\" />\n </Option>\n </FormSelect>\n );\n}\n\nfunction SourceField() {\n const {watch} = useFormContext<CreateVideoPayload>();\n const isEmbed = watch('type') === 'embed';\n const isUrl = watch('type') === 'external';\n const canUpload = watch('type') === 'video';\n const {trans} = useTrans();\n\n if (canUpload) {\n return <DirectSourceField />;\n }\n\n return (\n <FormTextField\n required\n name=\"src\"\n label={<Trans message=\"Source\" />}\n className=\"mb-24\"\n type={isUrl ? 'url' : undefined}\n placeholder={\n isEmbed\n ? trans(message('Full embed code snippet or just src url'))\n : undefined\n }\n inputElementType={isEmbed ? 'textarea' : 'input'}\n rows={4}\n />\n );\n}\n\nfunction DirectSourceField() {\n const form = useFormContext<CreateVideoPayload>();\n const [type, setType] = useState<'url' | 'file'>(() => {\n const src = form.getValues('src');\n return src.includes('api/v1/file-entries') ||\n src.includes('storage/title-videos')\n ? 'file'\n : 'url';\n });\n return (\n <div className=\"mb-24\">\n <RadioGroup size=\"sm\" className=\"mb-8\" name=\"direct-type\">\n <Radio\n value=\"url\"\n checked={type === 'url'}\n onChange={e => setType(e.target.value as any)}\n >\n <Trans message=\"Url\" />\n </Radio>\n <Radio\n value=\"file\"\n checked={type === 'file'}\n onChange={e => setType(e.target.value as any)}\n >\n <Trans message=\"File\" />\n </Radio>\n </RadioGroup>\n {type === 'file' ? (\n <FormFileEntryField\n required\n name=\"src\"\n disk={Disk.public}\n diskPrefix=\"title-videos\"\n label={<Trans message=\"Source\" />}\n />\n ) : (\n <FormTextField\n name=\"src\"\n label={<Trans message=\"source\" />}\n inputElementType=\"textarea\"\n rows={2}\n required\n type=\"url\"\n />\n )}\n </div>\n );\n}\n\nfunction QualitySelect() {\n const {streaming} = useSettings();\n const qualities = streaming?.qualities || [];\n return (\n <FormSelect\n name=\"quality\"\n selectionMode=\"single\"\n label={<Trans message=\"Quality\" />}\n className=\"mb-24\"\n >\n {qualities.map((quality: string) => (\n <Option value={quality.toLowerCase()} key={quality} capitalizeFirst>\n <Trans message={quality} />\n </Option>\n ))}\n </FormSelect>\n );\n}\n\nfunction LanguageSelect() {\n const {trans} = useTrans();\n const query = useValueLists(['languages']);\n return (\n <FormSelect\n name=\"language\"\n selectionMode=\"single\"\n showSearchField\n searchPlaceholder={trans(message('Search languages'))}\n label={<Trans message=\"Language\" />}\n className=\"mb-24\"\n >\n {query.data?.languages?.map(language => (\n <Option value={language.code} key={language.code} capitalizeFirst>\n <Trans message={language.name} />\n </Option>\n ))}\n </FormSelect>\n );\n}\n\nfunction ContentTypeSelect() {\n return (\n <FormSelect\n name=\"category\"\n selectionMode=\"single\"\n label={<Trans message=\"Content type\" />}\n className=\"mb-24\"\n >\n <Option value=\"trailer\">\n <Trans message=\"Trailer\" />\n </Option>\n <Option value=\"clip\">\n <Trans message=\"Clip\" />\n </Option>\n <Option value=\"featurette\">\n <Trans message=\"Featurette\" />\n </Option>\n <Option value=\"teaser\">\n <Trans message=\"Teaser\" />\n </Option>\n <Option value=\"full\">\n <Trans message=\"Full Movie or Episode\" />\n </Option>\n </FormSelect>\n );\n}\n","import {useForm} from 'react-hook-form';\nimport {Trans} from '@common/i18n/trans';\nimport React, {ReactNode} from 'react';\nimport {message} from '@common/i18n/message';\nimport {CrupdateResourceLayout} from '@common/admin/crupdate-resource-layout';\nimport {\n CreateVideoPayload,\n useCreateVideo,\n} from '@app/admin/videos/requests/use-create-video';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {toast} from '@common/ui/toast/toast';\nimport {CrupdateVideoForm} from '@app/admin/videos/crupdate/crupdate-video-form';\nimport {Link, useParams} from 'react-router-dom';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {ArrowBackIcon} from '@common/icons/material/ArrowBack';\n\ninterface Props {\n children?: ReactNode;\n}\nexport function CreateVideoPage({children}: Props) {\n const {titleId, season, episode} = useParams();\n const navigate = useNavigate();\n const form = useForm<CreateVideoPayload>({\n defaultValues: {\n quality: 'regular',\n language: 'en',\n category: 'trailer',\n type: 'embed',\n title_id: titleId ? Number(titleId) : undefined,\n season_num: season ? Number(season) : undefined,\n episode_num: episode ? Number(episode) : undefined,\n },\n });\n const createVideo = useCreateVideo(form);\n\n return (\n <CrupdateResourceLayout\n onSubmit={values => {\n createVideo.mutate(values, {\n onSuccess: response => {\n toast(message('Video created'));\n if (titleId) {\n navigate(`../`, {\n relative: 'path',\n });\n } else {\n navigate(`../${response.video.id}/edit`, {\n relative: 'path',\n });\n }\n },\n });\n }}\n backButton={\n titleId ? (\n <IconButton\n className=\"text-muted\"\n elementType={Link}\n to=\"../\"\n relative=\"path\"\n >\n <ArrowBackIcon />\n </IconButton>\n ) : undefined\n }\n form={form}\n title={<Trans message=\"New video\" />}\n isLoading={createVideo.isPending}\n disableSaveWhenNotDirty\n >\n {children}\n <CrupdateVideoForm form={form} />\n </CrupdateResourceLayout>\n );\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {Video} from '@app/titles/models/video';\nimport {CreateVideoPayload} from '@app/admin/videos/requests/use-create-video';\nimport {useParams} from 'react-router-dom';\n\ninterface Response extends BackendResponse {\n video: Video;\n}\n\nexport function useUpdateVideo(form: UseFormReturn<CreateVideoPayload>) {\n const {videoId} = useParams();\n return useMutation({\n mutationFn: (payload: CreateVideoPayload) => updateVideo(videoId!, payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({queryKey: ['video']});\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction updateVideo(\n videoId: string | number,\n payload: CreateVideoPayload,\n): Promise<Response> {\n return apiClient.put(`videos/${videoId}`, payload).then(r => r.data);\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {Video} from '@app/titles/models/video';\nimport {useParams} from 'react-router-dom';\n\ninterface Response extends BackendResponse {\n video: Video;\n}\n\nexport function useVideo() {\n const {videoId} = useParams();\n return useQuery({\n queryKey: ['video', `${videoId}`],\n queryFn: () => fetchVideo(videoId!),\n });\n}\n\nfunction fetchVideo(videoId: number | string) {\n return apiClient\n .get<Response>(`videos/${videoId}`)\n .then(response => response.data);\n}\n","import {useForm} from 'react-hook-form';\nimport {Trans} from '@common/i18n/trans';\nimport React, {useEffect} from 'react';\nimport {message} from '@common/i18n/message';\nimport {CrupdateResourceLayout} from '@common/admin/crupdate-resource-layout';\nimport {CreateVideoPayload} from '@app/admin/videos/requests/use-create-video';\nimport {toast} from '@common/ui/toast/toast';\nimport {CrupdateVideoForm} from '@app/admin/videos/crupdate/crupdate-video-form';\nimport {useUpdateVideo} from '@app/admin/videos/requests/use-update-video';\nimport {useVideo} from '@app/admin/videos/requests/use-video';\nimport {FullPageLoader} from '@common/ui/progress/full-page-loader';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {OpenInNewIcon} from '@common/icons/material/OpenInNew';\nimport {getWatchLink} from '@app/videos/watch-page/get-watch-link';\nimport {Link, useParams} from 'react-router-dom';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {ArrowBackIcon} from '@common/icons/material/ArrowBack';\n\nexport function EditVideoPage() {\n const {titleId} = useParams();\n const navigate = useNavigate();\n const form = useForm<CreateVideoPayload>();\n const query = useVideo();\n const video = query.data?.video;\n const updateVideo = useUpdateVideo(form);\n const link = video ? getWatchLink(video) : video;\n\n useEffect(() => {\n if (video && !form.getValues().name) {\n form.reset({\n name: video.name,\n title_id: video.title_id,\n season_num: video.season_num,\n episode_num: video.episode_num,\n thumbnail: video.thumbnail,\n type: video.type,\n src: video.src,\n quality: video.quality,\n language: video.language,\n category: video.category,\n captions:\n video.captions?.map(caption => ({\n id: caption.id,\n name: caption.name,\n url: caption.url,\n language: caption.language,\n })) || [],\n });\n }\n }, [video, form]);\n\n return (\n <CrupdateResourceLayout\n onSubmit={values => {\n updateVideo.mutate(values, {\n onSuccess: () => {\n form.reset(values);\n toast(message('Video updated'));\n if (titleId) {\n navigate(`../../`, {\n relative: 'path',\n });\n }\n },\n });\n }}\n backButton={\n titleId ? (\n <IconButton\n className=\"text-muted\"\n elementType={Link}\n to=\"../../\"\n relative=\"path\"\n >\n <ArrowBackIcon />\n </IconButton>\n ) : undefined\n }\n form={form}\n title={\n video ? (\n <Trans values={{name: video.name}} message=\"Edit “:name“\" />\n ) : (\n <Trans message=\"Edit video\" />\n )\n }\n actions={\n link ? (\n <IconButton size=\"sm\" elementType={Link} to={link} target=\"_blank\">\n <OpenInNewIcon />\n </IconButton>\n ) : null\n }\n isLoading={query.isLoading || updateVideo.isPending}\n disableSaveWhenNotDirty\n >\n {query.isLoading ? (\n <FullPageLoader />\n ) : (\n <CrupdateVideoForm form={form} video={video} />\n )}\n </CrupdateResourceLayout>\n );\n}\n","export default \"__VITE_ASSET__acea33bd__\"","import {ColumnConfig} from '@common/datatable/column-config';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Link} from 'react-router-dom';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport React, {Fragment} from 'react';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {Title} from '@app/titles/models/title';\nimport {TitleRating} from '@app/reviews/title-rating';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {TitleLink} from '@app/titles/title-link';\nimport {BarChartIcon} from '@common/icons/material/BarChart';\n\nexport const TitlesDatatableColumns: ColumnConfig<Title>[] = [\n {\n key: 'name',\n allowsSorting: true,\n width: 'flex-3',\n visibleInMode: 'all',\n header: () => <Trans message=\"Title\" />,\n body: title => (\n <div className=\"flex items-center gap-12\">\n <TitlePoster\n title={title}\n srcSize=\"sm\"\n size=\"w-32\"\n aspect=\"aspect-square\"\n />\n <div className=\"overflow-hidden min-w-0\">\n <div className=\"overflow-hidden overflow-ellipsis\">\n <TitleLink title={title} target=\"_blank\" />\n </div>\n <div className=\"text-muted text-xs overflow-hidden overflow-ellipsis\">\n {title.is_series ? (\n <Trans message=\"Series\" />\n ) : (\n <Trans message=\"Movie\" />\n )}\n </div>\n </div>\n </div>\n ),\n },\n {\n key: 'release_date',\n allowsSorting: true,\n header: () => <Trans message=\"Release date\" />,\n body: title => <FormattedDate date={title.release_date} />,\n },\n {\n key: 'rating',\n allowsSorting: true,\n header: () => <Trans message=\"Rating\" />,\n body: title => <TitleRating score={title.rating} />,\n width: 'w-124 flex-shrink-0',\n },\n {\n key: 'views',\n allowsSorting: true,\n header: () => <Trans message=\"Page views\" />,\n body: title => <FormattedNumber value={title.views} />,\n width: 'w-124 flex-shrink-0',\n },\n {\n key: 'popularity',\n allowsSorting: true,\n header: () => <Trans message=\"Popularity\" />,\n body: title =>\n title.popularity ? <FormattedNumber value={title.popularity} /> : null,\n width: 'w-124 flex-shrink-0',\n },\n {\n key: 'updated_at',\n allowsSorting: true,\n width: 'w-124 flex-shrink-0',\n header: () => <Trans message=\"Last updated\" />,\n body: title =>\n title.updated_at ? <FormattedDate date={title.updated_at} /> : '',\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n visibleInMode: 'all',\n align: 'end',\n width: 'w-84 flex-shrink-0',\n body: title => (\n <Fragment>\n <IconButton\n size=\"md\"\n className=\"text-muted\"\n elementType={Link}\n to={`${title.id}/insights`}\n >\n <BarChartIcon />\n </IconButton>\n <Link to={`${title.id}/edit/primary-facts`} className=\"text-muted\">\n <Tooltip label={<Trans message=\"Edit\" />}>\n <IconButton size=\"md\">\n <EditIcon />\n </IconButton>\n </Tooltip>\n </Link>\n </Fragment>\n ),\n },\n];\n","import {\n ALL_PRIMITIVE_OPERATORS,\n BackendFilter,\n FilterControlType,\n FilterOperator,\n} from '@common/datatable/filters/backend-filter';\nimport {message} from '@common/i18n/message';\nimport {\n createdAtFilter,\n updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\n\nexport const TitlesDatatableFilters: BackendFilter[] = [\n {\n key: 'is_series',\n label: message('Type'),\n description: message('Whether title is a movie or a TV series'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: '02',\n options: [\n {\n key: '01',\n label: message('Both'),\n value: false,\n },\n {\n key: '02',\n label: message('Movie'),\n value: false,\n },\n {\n key: '03',\n label: message('TV series'),\n value: true,\n },\n ],\n },\n },\n {\n key: 'views',\n label: message('Page views'),\n description: message('Number of unique page views'),\n defaultOperator: FilterOperator.lte,\n operators: ALL_PRIMITIVE_OPERATORS,\n control: {\n type: FilterControlType.Input,\n inputType: 'number',\n minValue: 1,\n defaultValue: 100,\n },\n },\n {\n key: 'poster',\n label: message('No poster'),\n description: message('Whether title has a poster'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.BooleanToggle,\n defaultValue: null,\n },\n },\n createdAtFilter({\n description: message('Date title was created'),\n }),\n updatedAtFilter({\n description: message('Date title was last updated'),\n }),\n];\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {Title} from '@app/titles/models/title';\nimport {Person} from '@app/titles/models/person';\n\ninterface Response extends BackendResponse {\n mediaItem: Title | Person;\n}\n\nexport interface ImportMediaItemPayload {\n tmdb_id: string;\n media_type: 'movie' | 'series' | 'person';\n}\n\nexport function useImportSingleFromTmdb() {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (props: ImportMediaItemPayload) => importMediaItem(props),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('titles'),\n });\n toast(trans(message('Item imported')));\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction importMediaItem(payload: ImportMediaItemPayload): Promise<Response> {\n return apiClient.post('media/import', payload).then(r => r.data);\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {useForm} from 'react-hook-form';\nimport {Form} from '@common/ui/forms/form';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {\n ImportMediaItemPayload,\n useImportSingleFromTmdb,\n} from '@app/admin/titles/requests/use-import-single-from-tmdb';\nimport {FormSelect, Option} from '@common/ui/forms/select/select';\nimport {TITLE_MODEL} from '@app/titles/models/title';\nimport {PERSON_MODEL} from '@app/titles/models/person';\n\ninterface ImportFromTmdbDialogProps {\n modelType: typeof TITLE_MODEL | typeof PERSON_MODEL;\n}\nexport function ImportSingleFromTmdbDialog({\n modelType,\n}: ImportFromTmdbDialogProps) {\n const form = useForm<ImportMediaItemPayload>({\n defaultValues: {\n media_type: modelType === TITLE_MODEL ? 'movie' : 'person',\n },\n });\n const {formId, close} = useDialogContext();\n const importItem = useImportSingleFromTmdb();\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Import from TheMovieDB\" />\n </DialogHeader>\n <DialogBody>\n <Form\n id={formId}\n form={form}\n onSubmit={values => {\n importItem.mutate(values, {\n onSuccess: response => {\n close(response.mediaItem);\n },\n });\n }}\n >\n {modelType === TITLE_MODEL && (\n <FormSelect\n name=\"media_type\"\n label={<Trans message=\"Type\" />}\n className=\"mb-24\"\n selectionMode=\"single\"\n >\n <Option value=\"movie\">\n <Trans message=\"Movie\" />\n </Option>\n <Option value=\"series\">\n <Trans message=\"Series\" />\n </Option>\n </FormSelect>\n )}\n <FormTextField\n autoFocus\n required\n name=\"tmdb_id\"\n min={1}\n type=\"number\"\n label={<Trans message=\"TheMovieDB ID\" />}\n />\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button onClick={() => close()}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n form={formId}\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n disabled={importItem.isPending}\n >\n <Trans message=\"Import\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {useTrans} from '@common/i18n/use-trans';\nimport {ChipValue} from '@common/ui/forms/input-field/chip-field/chip-field';\nimport {useCallback, useRef, useState} from 'react';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {Title} from '@app/titles/models/title';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\n\ninterface Response extends BackendResponse {\n titles: Title[];\n total_pages: number;\n}\n\nexport interface ImportMultipleFromTmdbFormValue {\n type: 'movie' | 'series';\n country?: string;\n language?: string;\n min_rating?: string;\n max_rating?: string;\n genres?: ChipValue[];\n keywords?: ChipValue[];\n release_date?: {\n start?: string;\n end?: string;\n };\n pages_to_import?: number;\n start_from_page?: number;\n current_page?: number;\n}\n\ninterface Payload\n extends Omit<\n ImportMultipleFromTmdbFormValue,\n 'genres' | 'keywords' | 'release_date'\n > {\n genres?: string;\n keywords?: string;\n start_date?: string;\n end_date?: string;\n}\n\nexport interface ImportMultipleProgressData {\n totalItems: number;\n currentItem: number;\n progress: number;\n titleList: string[];\n}\n\ninterface MutateOptions {\n onSuccess?: () => void;\n onProgress?: (data: ImportMultipleProgressData) => void;\n}\n\nexport function useImportMultipleFromTmdb() {\n const {trans} = useTrans();\n const titlesList = useRef<string[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const controller = useRef(new AbortController());\n\n const cancel = useCallback(() => {\n controller.current.abort('canceled');\n }, []);\n\n const handler = useCallback(\n async (v: ImportMultipleFromTmdbFormValue, options: MutateOptions) => {\n let stopped = false;\n let error = false;\n let pagesToImport = v.pages_to_import ? +v.pages_to_import : 1;\n const startFromPage = v.start_from_page ? +v.start_from_page : 1;\n\n if (pagesToImport + startFromPage > 500) {\n pagesToImport = 500 - startFromPage;\n }\n\n const stopImporting = () => {\n setIsLoading(false);\n titlesList.current = [];\n controller.current = new AbortController();\n stopped = true;\n };\n\n let currentPage = startFromPage;\n setIsLoading(true);\n\n controller.current.signal.addEventListener('abort', () =>\n stopImporting(),\n );\n\n let index = 0;\n while (index <= pagesToImport && !stopped) {\n // open progress bar instantly, instead of waiting for first response to come back\n if (index === 0) {\n options.onProgress?.({\n totalItems: pagesToImport * 20,\n currentItem: 0,\n progress: 0,\n titleList: [],\n });\n }\n\n index++;\n currentPage++;\n\n try {\n const response = await apiClient\n .post<Response>(\n 'tmdb/import',\n formValueToPayload({...v, current_page: currentPage}),\n {\n signal: controller.current.signal,\n },\n )\n .then(r => r.data);\n\n if (response.total_pages < pagesToImport) {\n pagesToImport = response.total_pages;\n }\n\n // limit array to 1000 items\n if (titlesList.current.length > 1000) {\n titlesList.current = titlesList.current.slice(0, 1000);\n }\n\n titlesList.current.unshift(...response.titles.map(t => t.name));\n\n const totalItems = pagesToImport * 20;\n const currentItem = (index - 1) * 20;\n\n options.onProgress?.({\n totalItems: totalItems,\n currentItem: currentItem,\n progress: Math.round((currentItem / totalItems) * 100),\n titleList: titlesList.current,\n });\n } catch (e) {\n stopImporting();\n error = true;\n if ((e as any).message !== 'canceled') {\n console.error(e);\n showHttpErrorToast(e);\n }\n }\n }\n\n if (!error) {\n await queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('titles'),\n });\n toast(trans(message('Titles imported')));\n setIsLoading(false);\n options.onSuccess?.();\n }\n },\n [trans],\n );\n\n return {\n mutate: handler,\n cancel,\n isLoading,\n };\n}\n\nfunction formValueToPayload(values: ImportMultipleFromTmdbFormValue): Payload {\n const payload: Payload = {\n type: values.type,\n pages_to_import: values.pages_to_import,\n start_from_page: values.start_from_page,\n current_page: values.current_page,\n };\n\n if (values.country) {\n payload.country = values.country;\n }\n\n if (values.language) {\n payload.language = values.language;\n }\n\n if (values.min_rating) {\n payload.min_rating = values.min_rating;\n }\n\n if (values.max_rating) {\n payload.max_rating = values.max_rating;\n }\n\n if (values.genres) {\n payload.genres = values.genres.map(genre => genre.id).join(',');\n }\n if (values.keywords) {\n payload.keywords = values.keywords.map(keyword => keyword.id).join(',');\n }\n if (values.release_date) {\n payload.start_date = values.release_date.start;\n payload.end_date = values.release_date.start;\n }\n\n return payload;\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {useForm} from 'react-hook-form';\nimport {Form} from '@common/ui/forms/form';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {FormChipField} from '@common/ui/forms/input-field/chip-field/form-chip-field';\nimport {useValueLists} from '@common/http/value-lists';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {FormDateRangePicker} from '@common/ui/forms/input-field/date/date-range-picker/form-date-range-picker';\nimport {FormSelect, Option} from '@common/ui/forms/select/select';\nimport {InfoDialogTriggerIcon} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger-icon';\nimport React, {Fragment, useState} from 'react';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {\n ImportMultipleFromTmdbFormValue,\n ImportMultipleProgressData,\n useImportMultipleFromTmdb,\n} from '@app/admin/titles/requests/use-import-multiple-from-tmdb';\nimport {ProgressBar} from '@common/ui/progress/progress-bar';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\n\nexport function ImportMultipleFromTmdbDialog() {\n const form = useForm<ImportMultipleFromTmdbFormValue>({\n defaultValues: {\n type: 'movie',\n start_from_page: 1,\n pages_to_import: 10,\n },\n });\n const {formId, close} = useDialogContext();\n const importTitles = useImportMultipleFromTmdb();\n const [activePanel, setActivePanel] = useState<'form' | 'progress'>('form');\n const [progressData, setProgressData] =\n useState<ImportMultipleProgressData>();\n\n return (\n <Dialog size=\"lg\">\n <DialogHeader>\n <Trans message=\"Import from TheMovieDB\" />\n </DialogHeader>\n <DialogBody>\n <Form\n id={formId}\n form={form}\n onSubmit={values => {\n importTitles.mutate(values, {\n onProgress: data => {\n setActivePanel('progress');\n setProgressData(data);\n },\n });\n }}\n >\n {progressData ? <ProgressPanel data={progressData} /> : <FormPanel />}\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button\n onClick={() => {\n if (progressData) {\n importTitles.cancel();\n setProgressData(undefined);\n setActivePanel('form');\n } else {\n close();\n }\n }}\n >\n {importTitles.isLoading || activePanel === 'form' ? (\n <Trans message=\"Cancel\" />\n ) : (\n <Trans message=\"Back\" />\n )}\n </Button>\n <Button\n form={formId}\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n disabled={importTitles.isLoading || activePanel === 'progress'}\n >\n <Trans message=\"Import\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n\nfunction FormPanel() {\n return (\n <Fragment>\n <p className=\"mb-24 flex items-center gap-8 text-muted\">\n <InfoDialogTriggerIcon size=\"xs\" viewBox=\"0 0 16 16\" />\n <Trans message=\"All filters below are optional and can be left empty.\" />\n </p>\n <FormSelect\n name=\"type\"\n label={<Trans message=\"Type\" />}\n className=\"mb-24\"\n selectionMode=\"single\"\n >\n <Option value=\"movie\">\n <Trans message=\"Movie\" />\n </Option>\n <Option value=\"series\">\n <Trans message=\"Series\" />\n </Option>\n </FormSelect>\n <PaginationFields />\n <GenreChipField />\n <KeywordChipField />\n <LanguageSelect />\n <CountrySelect />\n <RatingFields />\n <FormDateRangePicker\n name=\"release_date\"\n granularity=\"day\"\n label={<Trans message=\"Release date\" />}\n description={\n <Trans message=\"Only import titles released between specified dates.\" />\n }\n />\n </Fragment>\n );\n}\n\ninterface ProgressPanelProps {\n data: ImportMultipleProgressData;\n}\nfunction ProgressPanel({data}: ProgressPanelProps) {\n return (\n <div>\n <ProgressBar\n value={data.progress}\n label={\n <Trans\n message=\"Imported :number titles of :total\"\n values={{number: data.currentItem, total: data.totalItems}}\n />\n }\n />\n <div className=\"compact-scrollbar mt-24 h-400 overflow-auto text-xs\">\n {data.titleList.map((title, index) => (\n <div key={index}>{title}</div>\n ))}\n {!data.titleList.length ? (\n <Fragment>\n {[...new Array(20).keys()].map(index => (\n <Skeleton className=\"mb-2 max-w-200\" key={index} />\n ))}\n </Fragment>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction PaginationFields() {\n return (\n <div className=\"mb-24\">\n <div className=\"flex items-center gap-24\">\n <FormTextField\n className=\"flex-1\"\n name=\"start_from_page\"\n label={<Trans message=\"Starting page\" />}\n type=\"number\"\n min={1}\n max={500}\n />\n <FormTextField\n className=\"flex-1\"\n name=\"pages_to_import\"\n label={<Trans message=\"How many pages to import\" />}\n type=\"number\"\n min={1}\n max={500}\n />\n </div>\n <p className=\"pt-10 text-xs text-muted\">\n <Trans message=\"20 titles per page are imported. \" />\n </p>\n </div>\n );\n}\n\nfunction GenreChipField() {\n const {data} = useFilterValueLists();\n const genres = data?.genres.map(genre => ({\n id: genre.value,\n name: genre.name,\n }));\n return (\n <FormChipField\n className=\"mb-24\"\n name=\"genres\"\n label={<Trans message=\"Genres\" />}\n suggestions={genres}\n allowCustomValue={false}\n description={\n <Trans message=\"Only import titles belonging to specified genres.\" />\n }\n >\n {genre => (\n <Item value={genre.id}>\n <Trans message={genre.name} />\n </Item>\n )}\n </FormChipField>\n );\n}\n\nfunction KeywordChipField() {\n const {data} = useFilterValueLists();\n const keywords = data?.keywords.map(keyword => ({\n id: keyword.value,\n name: keyword.name,\n }));\n return (\n <FormChipField\n name=\"keywords\"\n className=\"mb-24\"\n label={<Trans message=\"Keywords\" />}\n suggestions={keywords}\n allowCustomValue={false}\n description={\n <Trans message=\"Only import titles that have specied keywords attached.\" />\n }\n >\n {keyword => (\n <Item value={keyword.id}>\n <Trans message={keyword.name} />\n </Item>\n )}\n </FormChipField>\n );\n}\n\nfunction LanguageSelect() {\n const {data} = useFilterValueLists();\n return (\n <FormSelect\n name=\"language\"\n className=\"mb-24\"\n label={<Trans message=\"Language\" />}\n items={data?.languages}\n selectionMode=\"single\"\n description={\n <Trans message=\"Only import titles with specied primary spoken language.\" />\n }\n >\n {language => (\n <Item value={language.code}>\n <Trans message={language.name} />\n </Item>\n )}\n </FormSelect>\n );\n}\n\nfunction CountrySelect() {\n const {data} = useFilterValueLists();\n return (\n <FormSelect\n name=\"country\"\n className=\"mb-24\"\n label={<Trans message=\"Country\" />}\n items={data?.countries}\n selectionMode=\"single\"\n description={\n <Trans message=\"Only import titles with specied origin country.\" />\n }\n >\n {country => (\n <Item value={country.code}>\n <Trans message={country.name} />\n </Item>\n )}\n </FormSelect>\n );\n}\n\nfunction RatingFields() {\n return (\n <div className=\"mb-24 flex items-center gap-24\">\n <FormTextField\n className=\"flex-1\"\n name=\"min_rating\"\n label={<Trans message=\"Minimum rating\" />}\n type=\"number\"\n min={1}\n max={10}\n />\n <FormTextField\n className=\"flex-1\"\n name=\"max_rating\"\n label={<Trans message=\"Maximum rating\" />}\n type=\"number\"\n min={1}\n max={10}\n />\n </div>\n );\n}\n\nfunction useFilterValueLists() {\n return useValueLists(['genres', 'keywords', 'languages', 'countries'], {\n type: 'tmdb',\n });\n}\n","import React, {Fragment, useMemo} from 'react';\nimport {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {Trans} from '@common/i18n/trans';\nimport {DeleteSelectedItemsAction} from '@common/datatable/page/delete-selected-items-action';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport movieNightImage from './movie-night.svg';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {Link} from 'react-router-dom';\nimport {TitlesDatatableColumns} from '@app/admin/titles/titles-datatable-columns';\nimport {useTitleIndexFilters} from '@app/titles/use-title-index-filters';\nimport {TitlesDatatableFilters} from '@app/admin/titles/titles-datatable-filters';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {PublishIcon} from '@common/icons/material/Publish';\nimport {ImportSingleFromTmdbDialog} from '@app/admin/titles/import/import-single-from-tmdb-dialog';\nimport {TITLE_MODEL} from '@app/titles/models/title';\nimport {\n Menu,\n MenuItem,\n MenuTrigger,\n} from '@common/ui/navigation/menu/menu-trigger';\nimport {openDialog} from '@common/ui/overlays/store/dialog-store';\nimport {ImportMultipleFromTmdbDialog} from '@app/admin/titles/import/import-multiple-from-tmdb-dialog';\n\nexport function TitlesDatatablePage() {\n const {filters, filtersLoading} = useTitleIndexFilters();\n\n const mergedFilters = useMemo(() => {\n return [...filters, ...TitlesDatatableFilters];\n }, [filters]);\n\n return (\n <DataTablePage\n endpoint=\"titles\"\n title={<Trans message=\"Titles\" />}\n columns={TitlesDatatableColumns}\n filters={mergedFilters}\n filtersLoading={filtersLoading}\n actions={<Actions />}\n selectedActions={<DeleteSelectedItemsAction />}\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={movieNightImage}\n title={<Trans message=\"No titles have been created yet\" />}\n filteringTitle={<Trans message=\"No matching titles\" />}\n />\n }\n />\n );\n}\n\nfunction Actions() {\n const {tmdb_is_setup} = useSettings();\n\n return (\n <Fragment>\n {tmdb_is_setup && <ImportButton />}\n <DataTableAddItemButton elementType={Link} to=\"new\">\n <Trans message=\"Add title\" />\n </DataTableAddItemButton>\n </Fragment>\n );\n}\n\nfunction ImportButton() {\n const navigate = useNavigate();\n return (\n <MenuTrigger>\n <Tooltip label={<Trans message=\"Import from TheMovieDB\" />}>\n <IconButton\n variant=\"outline\"\n color=\"primary\"\n className=\"flex-shrink-0\"\n size=\"sm\"\n >\n <PublishIcon />\n </IconButton>\n </Tooltip>\n <Menu>\n <MenuItem\n value=\"single\"\n onSelected={async () => {\n const title = await openDialog(ImportSingleFromTmdbDialog, {\n modelType: TITLE_MODEL,\n });\n if (title) {\n navigate(`/admin/titles/${title.id}/edit/primary-facts`);\n }\n }}\n >\n <Trans message=\"Import single title by ID\" />\n </MenuItem>\n <MenuItem\n value=\"multiple\"\n onSelected={() => {\n openDialog(ImportMultipleFromTmdbDialog);\n }}\n >\n <Trans message=\"Import multiple titles\" />\n </MenuItem>\n </Menu>\n </MenuTrigger>\n );\n}\n","import React from 'react';\nimport {FullPageLoader} from '@common/ui/progress/full-page-loader';\nimport {Outlet} from 'react-router-dom';\nimport {useTitle} from '@app/titles/requests/use-title';\n\nexport function EditTitlePage() {\n const query = useTitle('editTitlePage');\n\n if (!query.data) {\n return <FullPageLoader />;\n }\n\n return <Outlet context={query.data.title} />;\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {Episode} from '@app/titles/models/episode';\nimport {seasonQueryKey} from '@app/seasons/requests/use-season';\n\ninterface Response extends BackendResponse {}\n\nexport function useDeleteEpisode(episode: Episode) {\n return useMutation({\n mutationFn: () => deleteEpisode(episode.id),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: seasonQueryKey(episode.title_id, episode.season_number),\n });\n toast(message('Episode deleted'));\n },\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction deleteEpisode(seasonId: number | string): Promise<Response> {\n return apiClient.delete(`episodes/${seasonId}`).then(r => r.data);\n}\n","import {\n Link,\n NavLink,\n useLocation,\n useNavigate,\n useOutletContext,\n useParams,\n} from 'react-router-dom';\nimport clsx from 'clsx';\nimport {Trans} from '@common/i18n/trans';\nimport {message} from '@common/i18n/message';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {StaticPageTitle} from '@common/seo/static-page-title';\nimport {Option, Select} from '@common/ui/forms/select/select';\nimport React, {Fragment, ReactNode, useRef} from 'react';\nimport {useStickySentinel} from '@common/utils/hooks/sticky-sentinel';\nimport {getTitleLink} from '@app/titles/title-link';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {OpenInNewIcon} from '@common/icons/material/OpenInNew';\nimport {Title} from '@app/titles/models/title';\nimport {useScrollToTop} from '@common/ui/navigation/use-scroll-to-top';\nimport {InfoDialogTriggerIcon} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger-icon';\n\nconst allMenuItems = [\n {to: 'primary-facts', label: message('Primary Facts')},\n {to: 'seasons', label: message('Seasons'), hideIfMovie: true},\n {to: 'images', label: message('Images')},\n {to: 'videos', label: message('Videos')},\n {to: 'cast', label: message('Cast')},\n {to: 'crew', label: message('Crew')},\n {to: 'genres', label: message('Genres')},\n {to: 'keywords', label: message('Keywords')},\n {to: 'countries', label: message('Countries')},\n {to: 'reviews', label: message('Reviews')},\n {to: 'comments', label: message('Comments')},\n];\nfunction useFilteredMenuItems() {\n const title = useOutletContext<Title>();\n const isMovie = !title?.is_series;\n\n return allMenuItems.filter(item => !isMovie || !item.hideIfMovie);\n}\n\ninterface Props {\n children: ReactNode;\n actions?: ReactNode;\n}\nexport function TitleEditorLayout({children, actions}: Props) {\n const isMobile = useIsMobileMediaQuery();\n const {isSticky, sentinelRef} = useStickySentinel();\n const title = useOutletContext<Title>();\n const {season, episode} = useParams();\n const link = title ? getTitleLink(title, {season, episode}) : null;\n const ref = useRef<HTMLDivElement>(null);\n\n const heading = title ? (\n <Trans values={{name: title.name}} message=\"Edit “:name“\" />\n ) : (\n <Trans message=\"New title\" />\n );\n\n useScrollToTop(ref);\n\n return (\n <Fragment>\n <StaticPageTitle>\n <Trans message=\"Edit title\" />\n </StaticPageTitle>\n <div ref={sentinelRef} />\n <div\n ref={ref}\n className={clsx(\n 'sticky top-0 my-12 md:my-24 z-10 transition-shadow',\n isSticky && 'bg-paper shadow'\n )}\n >\n <div\n className={clsx(\n 'flex items-center md:items-start gap-24 py-14 container mx-auto px-24'\n )}\n >\n <h1 className=\"text-xl md:text-3xl whitespace-nowrap overflow-hidden overflow-ellipsis md:mr-64\">\n {heading}\n </h1>\n <div className=\"mr-auto\"></div>\n {link ? (\n <IconButton size=\"sm\" elementType={Link} to={link} target=\"_blank\">\n <OpenInNewIcon />\n </IconButton>\n ) : null}\n {actions}\n </div>\n </div>\n <div className=\"container md:flex gap-30 items-stretch mx-auto px-24 pb-24\">\n {isMobile ? <MobileNav /> : <DesktopNav />}\n <div className=\"md:pl-30 flex-auto relative\">{children}</div>\n </div>\n </Fragment>\n );\n}\n\nfunction MobileNav() {\n const {titleId} = useParams();\n const {pathname} = useLocation();\n const navigate = useNavigate();\n const value = titleId ? pathname.split('/').pop() : 'primary-facts';\n const menuItems = useFilteredMenuItems();\n\n return (\n <Select\n disabled={!titleId}\n minWidth=\"min-w-none\"\n className=\"w-full bg-paper mb-24\"\n selectionMode=\"single\"\n selectedValue={value}\n onSelectionChange={newPage => {\n if (titleId) {\n navigate(itemLink(titleId, newPage as string));\n }\n }}\n >\n {menuItems.map(item => (\n <Option key={item.to} value={item.to}>\n <Trans {...item.label} />\n </Option>\n ))}\n </Select>\n );\n}\n\nfunction DesktopNav() {\n const {titleId} = useParams();\n const menuItems = useFilteredMenuItems();\n return (\n <div className=\"w-240 sticky top-24 flex-shrink-0\">\n {menuItems.map(item => {\n const link = titleId ? itemLink(titleId, item.to) : '';\n return (\n <NavLink\n key={item.to}\n to={link}\n aria-disabled={!titleId}\n className={({isActive}) =>\n clsx(\n 'block p-14 whitespace-nowrap mb-8 rounded border-l-4 text-sm transition-bg-color',\n !link && 'pointer-events-none text-muted',\n (isActive && link) || (item.to === 'primary-facts' && !link)\n ? 'bg-primary/selected border-l-primary font-medium'\n : 'border-l-transparent hover:bg-hover'\n )\n }\n >\n <Trans {...item.label} />\n </NavLink>\n );\n })}\n {!titleId ? (\n <div className=\"flex items-center gap-8 text-muted text-xs mt-24\">\n <InfoDialogTriggerIcon viewBox=\"0 0 16 16\" size=\"xs\" />\n <Trans message=\"Create title to enable menu items.\" />\n </div>\n ) : null}\n </div>\n );\n}\n\nconst itemLink = (titleId: string | number, to: string) =>\n `/admin/titles/${titleId}/edit/${to}`;\n","import React, {ReactNode} from 'react';\nimport {Trans} from '@common/i18n/trans';\nimport {Link, useLocation, useParams} from 'react-router-dom';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {ArrowBackIcon} from '@common/icons/material/ArrowBack';\nimport {TitleEditorLayout} from '@app/admin/titles/title-editor/title-editor-layout';\nimport {TabList} from '@common/ui/tabs/tab-list';\nimport {Tab} from '@common/ui/tabs/tab';\nimport {Tabs} from '@common/ui/tabs/tabs';\nimport {message} from '@common/i18n/message';\n\nconst PageTabs = [\n {uri: 'episodes', label: message('Episodes')},\n {uri: 'cast', label: message('Regular cast')},\n {uri: 'crew', label: message('Regular crew')},\n];\n\ninterface Props {\n children: ReactNode;\n}\nexport function SeasonEditorLayout({children}: Props) {\n const {season: seasonNumber} = useParams();\n\n const {pathname} = useLocation();\n const tabName = pathname.split('/').pop();\n\n // only \"episodes\" tab will be enabled when creating new episode\n const selectedTab = seasonNumber\n ? PageTabs.findIndex(tab => tab.uri === tabName)\n : 0;\n\n return (\n <TitleEditorLayout>\n <div className=\"flex items-center gap-12 mb-4\">\n <IconButton\n elementType={Link}\n to=\"../../\"\n relative=\"path\"\n className=\"text-muted\"\n >\n <ArrowBackIcon />\n </IconButton>\n <h2 className=\"text-base\">\n <Trans message=\"Season :number\" values={{number: seasonNumber}} />\n </h2>\n </div>\n <Tabs selectedTab={selectedTab}>\n <TabList>\n {PageTabs.map(tab => (\n <Tab\n isDisabled={!seasonNumber && tab.uri !== PageTabs[0].uri}\n key={tab.uri}\n width=\"min-w-132\"\n elementType={Link}\n to={`../${tab.uri}`}\n relative=\"path\"\n replace\n >\n <Trans {...tab.label} />\n </Tab>\n ))}\n </TabList>\n <div className=\"pt-24 min-h-512\">{children}</div>\n </Tabs>\n </TitleEditorLayout>\n );\n}\n","import {PageErrorMessage} from '@common/errors/page-error-message';\nimport React from 'react';\nimport {UseQueryResult} from '@tanstack/react-query';\nimport {ProgressCircle} from '@common/ui/progress/progress-circle';\n\ninterface Props {\n query: UseQueryResult;\n}\nexport function TitleEditorPageStatus({query}: Props) {\n if (query.isLoading) {\n return (\n <div className=\"h-full min-h-120 flex items-center justify-center\">\n <ProgressCircle isIndeterminate aria-label=\"Loading page...\" />\n </div>\n );\n }\n\n return <PageErrorMessage />;\n}\n","import {GetSeasonResponse, useSeason} from '@app/seasons/requests/use-season';\nimport React, {Fragment} from 'react';\nimport {Trans} from '@common/i18n/trans';\nimport {Link} from 'react-router-dom';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {Button} from '@common/ui/buttons/button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {DeleteIcon} from '@common/icons/material/Delete';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport {useDeleteEpisode} from '@app/episodes/requests/use-delete-episode';\nimport {Episode} from '@app/titles/models/episode';\nimport {EpisodeListItem} from '@app/seasons/episode-list-item';\nimport {AddIcon} from '@common/icons/material/Add';\nimport {SeasonEditorLayout} from '@app/admin/titles/title-editor/seasons-editor/season-editor-layout';\nimport {useSeasonEpisodes} from '@app/titles/requests/use-season-episodes';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport {TitleEditorPageStatus} from '@app/admin/titles/title-editor/title-editor-page-status';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {TvIcon} from '@common/icons/material/Tv';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\n\nexport function SeasonEditorEpisodeList() {\n return (\n <SeasonEditorLayout>\n <div className=\"mb-16\">\n <Button\n variant=\"outline\"\n color=\"primary\"\n startIcon={<AddIcon />}\n size=\"xs\"\n elementType={Link}\n to=\"new\"\n >\n <Trans message=\"Add episode\" />\n </Button>\n </div>\n <Content />\n </SeasonEditorLayout>\n );\n}\n\nfunction Content() {\n const query = useSeason('editSeasonPage');\n if (query.data) {\n return query.data.episodes?.data.length ? (\n <LazyEpisodeList data={query.data} />\n ) : (\n <NoEpisodesMessage />\n );\n } else {\n return <TitleEditorPageStatus query={query} />;\n }\n}\n\nfunction NoEpisodesMessage() {\n return (\n <IllustratedMessage\n className=\"mt-40\"\n imageMargin=\"mb-8\"\n image={\n <div className=\"text-muted\">\n <TvIcon size=\"xl\" />\n </div>\n }\n imageHeight=\"h-auto\"\n title={<Trans message=\"No episodes have been added yet\" />}\n />\n );\n}\n\ninterface LazyEpisodeListProps {\n data: GetSeasonResponse;\n}\nfunction LazyEpisodeList({data}: LazyEpisodeListProps) {\n const query = useSeasonEpisodes(data.episodes);\n return (\n <Fragment>\n {query.items.map(episode => (\n <EpisodeListItem\n key={episode.id}\n episode={episode}\n title={data.title}\n className=\"mb-24\"\n >\n <div className=\"mt-12 flex items-center gap-12\">\n <Button\n variant=\"outline\"\n size=\"xs\"\n startIcon={<EditIcon />}\n elementType={Link}\n to={`${episode.episode_number}/primary-facts`}\n >\n <Trans message=\"Edit\" />\n </Button>\n <DialogTrigger type=\"modal\">\n <IconButton size=\"xs\" variant=\"outline\">\n <DeleteIcon />\n </IconButton>\n <DeleteEpisodeDialog episode={episode} />\n </DialogTrigger>\n </div>\n </EpisodeListItem>\n ))}\n <InfiniteScrollSentinel query={query} />\n </Fragment>\n );\n}\n\ninterface DeleteEpisodeDialogProps {\n episode: Episode;\n}\nfunction DeleteEpisodeDialog({episode}: DeleteEpisodeDialogProps) {\n const deleteEpisode = useDeleteEpisode(episode);\n const {close} = useDialogContext();\n return (\n <ConfirmationDialog\n isLoading={deleteEpisode.isPending}\n isDanger\n title={<Trans message=\"Delete episode\" />}\n body={<Trans message=\"Are you sure you want to delete this episode?\" />}\n confirm={<Trans message=\"Delete\" />}\n onConfirm={() => {\n deleteEpisode.mutate(undefined, {onSuccess: () => close()});\n }}\n />\n );\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {titleSeasonsQueryKey} from '@app/titles/requests/use-title-seasons';\nimport {Title} from '@app/titles/models/title';\n\ninterface Response extends BackendResponse {}\n\nexport function useDeleteSeason(title: Title, seasonId: number | string) {\n return useMutation({\n mutationFn: () => deleteSeason(seasonId),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: titleSeasonsQueryKey(title.id),\n });\n toast(message('Season deleted'));\n },\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction deleteSeason(seasonId: number | string): Promise<Response> {\n return apiClient.delete(`seasons/${seasonId}`).then(r => r.data);\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {titleSeasonsQueryKey} from '@app/titles/requests/use-title-seasons';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {Season} from '@app/titles/models/season';\n\ninterface Response extends BackendResponse {\n season: Season;\n}\n\nexport function useCreateSeason(titleId: number) {\n return useMutation({\n mutationFn: () => createSeason(titleId),\n onSuccess: async response => {\n await queryClient.invalidateQueries({\n queryKey: titleSeasonsQueryKey(response.season.title_id),\n });\n toast(\n message('Season :number created', {\n values: {number: response.season.number},\n }),\n );\n },\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction createSeason(titleId: number): Promise<Response> {\n return apiClient.post(`titles/${titleId}/seasons`).then(r => r.data);\n}\n","import {Title} from '@app/titles/models/title';\nimport {Season} from '@app/titles/models/season';\nimport {Trans} from '@common/i18n/trans';\nimport {Link, useOutletContext} from 'react-router-dom';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {DeleteIcon} from '@common/icons/material/Delete';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport React, {Fragment} from 'react';\nimport {useDeleteSeason} from '@app/admin/titles/requests/use-delete-season';\nimport {useTitleSeasons} from '@app/titles/requests/use-title-seasons';\nimport {TitleEditorLayout} from '@app/admin/titles/title-editor/title-editor-layout';\nimport {TitleEditorPageStatus} from '@app/admin/titles/title-editor/title-editor-page-status';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {SeasonPoster} from '@app/seasons/season-poster';\nimport {SeasonLink} from '@app/seasons/season-link';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Button} from '@common/ui/buttons/button';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {TvIcon} from '@common/icons/material/Tv';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport {AddIcon} from '@common/icons/material/Add';\nimport {useCreateSeason} from '@app/admin/titles/requests/use-create-season';\n\nexport function TitleSeasonsEditor() {\n const title = useOutletContext<Title>();\n const createSeason = useCreateSeason(title.id);\n const query = useTitleSeasons(title.id, undefined, {\n perPage: 15,\n });\n\n let content;\n if (query.data) {\n content = query.items.length ? (\n <Fragment>\n <div className=\"mt-24 grid grid-cols-2 gap-24 md:grid-cols-5\">\n {query.items.map(season => (\n <div key={season.id}>\n <SeasonPoster\n title={title}\n season={season}\n srcSize=\"md\"\n className=\"aspect-poster flex-shrink-0\"\n />\n <div className=\"mt-8\">\n <div className=\"flex items-center justify-between gap-14\">\n <SeasonLink title={title} seasonNumber={season.number} />\n <div className=\"text-xs text-muted\">\n <FormattedDate\n date={season.release_date}\n options={{year: 'numeric'}}\n />\n </div>\n </div>\n <div className=\"mt-2 text-sm\">\n {\n <Trans\n message=\":count episodes\"\n values={{count: season.episodes_count}}\n />\n }\n </div>\n <div className=\"mt-14 flex items-center justify-between gap-14\">\n <Button\n variant=\"outline\"\n size=\"xs\"\n startIcon={<EditIcon />}\n elementType={Link}\n to={`${season.number}/episodes`}\n >\n <Trans message=\"Edit\" />\n </Button>\n <DeleteButton title={title} season={season} />\n </div>\n </div>\n </div>\n ))}\n </div>\n <InfiniteScrollSentinel query={query} />\n </Fragment>\n ) : (\n <NoSeasonsMessage />\n );\n } else {\n content = <TitleEditorPageStatus query={query} />;\n }\n\n return (\n <TitleEditorLayout>\n <Button\n variant=\"outline\"\n color=\"primary\"\n startIcon={<AddIcon />}\n disabled={createSeason.isPending}\n onClick={() => createSeason.mutate()}\n >\n <Trans message=\"Add season\" />\n </Button>\n {content}\n </TitleEditorLayout>\n );\n}\n\nfunction NoSeasonsMessage() {\n return (\n <IllustratedMessage\n className=\"mt-40\"\n imageMargin=\"mb-8\"\n image={\n <div className=\"text-muted\">\n <TvIcon size=\"xl\" />\n </div>\n }\n imageHeight=\"h-auto\"\n title={<Trans message=\"No seasons have been added yet\" />}\n />\n );\n}\n\ninterface DeleteButtonProps {\n title: Title;\n season: Season;\n}\nfunction DeleteButton({title, season}: DeleteButtonProps) {\n const deleteSeason = useDeleteSeason(title, season.id);\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={confirmed => {\n if (confirmed) {\n deleteSeason.mutate();\n }\n }}\n >\n <IconButton size=\"xs\" variant=\"outline\">\n <DeleteIcon />\n </IconButton>\n <ConfirmationDialog\n isDanger\n title={<Trans message=\"Delete season\" />}\n body={<Trans message=\"Are you sure you want to delete this season?\" />}\n confirm={<Trans message=\"Delete\" />}\n />\n </DialogTrigger>\n );\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {Title} from '@app/titles/models/title';\nimport {CreateVideoPayload} from '@app/admin/videos/requests/use-create-video';\n\ninterface Response extends BackendResponse {\n title: Title;\n}\n\nexport interface CreateTitlePayload {\n name: string;\n original_title: string;\n is_series: boolean;\n poster: string;\n backdrop: string;\n release_date: string;\n tagline: string;\n description: string;\n runtime: number;\n certification: string;\n budget: number;\n revenue: number;\n language: string;\n popularity: number;\n images: {url: string}[];\n videos: CreateVideoPayload[];\n}\n\nexport function useCreateTitle(form: UseFormReturn<CreateTitlePayload>) {\n return useMutation({\n mutationFn: (payload: CreateTitlePayload) => createTitle(payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({queryKey: ['titles']});\n },\n onError: r => (form ? onFormQueryError(r, form) : showHttpErrorToast(r)),\n });\n}\n\nfunction createTitle(payload: CreateTitlePayload): Promise<Response> {\n return apiClient.post(`titles`, payload).then(r => r.data);\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {useParams} from 'react-router-dom';\nimport {Title} from '@app/titles/models/title';\nimport {CreateTitlePayload} from '@app/admin/titles/requests/use-create-title';\n\ninterface Response extends BackendResponse {\n title: Title;\n}\n\nexport function useUpdateTitle(form: UseFormReturn<CreateTitlePayload>) {\n const {titleId} = useParams();\n return useMutation({\n mutationFn: (payload: CreateTitlePayload) => updateTitle(titleId!, payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({queryKey: ['titles']});\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction updateTitle(\n titleId: string,\n payload: CreateTitlePayload,\n): Promise<Response> {\n return apiClient.put(`titles/${titleId}`, payload).then(r => r.data);\n}\n","import {useController} from 'react-hook-form';\nimport {mergeProps} from '@react-aria/utils';\nimport React from 'react';\nimport {ComboBox, ComboboxProps} from './combobox';\n\ntype Props<T extends object> = ComboboxProps<T> & {\n name: string;\n selectionMode?: 'single';\n};\nexport function FormComboBox<T extends object>({children, ...props}: Props<T>) {\n const {\n field: {onChange, onBlur, value = '', ref},\n fieldState: {invalid, error},\n } = useController({\n name: props.name,\n });\n\n const formProps: Partial<ComboboxProps<T>> = {\n onSelectionChange: onChange,\n onBlur,\n selectedValue: value,\n defaultInputValue: value,\n invalid,\n errorMessage: error?.message,\n };\n\n return (\n <ComboBox ref={ref} {...mergeProps(formProps, props)}>\n {children}\n </ComboBox>\n );\n}\n","import {FormImageSelector} from '@common/ui/images/image-selector';\nimport {Trans} from '@common/i18n/trans';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {FormDatePicker} from '@common/ui/forms/input-field/date/date-picker/date-picker';\nimport {FormSelect, Option} from '@common/ui/forms/select/select';\nimport {useValueLists} from '@common/http/value-lists';\nimport {useForm} from 'react-hook-form';\nimport {\n CreateTitlePayload,\n useCreateTitle,\n} from '@app/admin/titles/requests/use-create-title';\nimport {Title} from '@app/titles/models/title';\nimport {Form} from '@common/ui/forms/form';\nimport {useUpdateTitle} from '@app/admin/titles/requests/use-update-title';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {useOutletContext} from 'react-router-dom';\nimport React, {Fragment} from 'react';\nimport {TitleEditorLayout} from '@app/admin/titles/title-editor/title-editor-layout';\nimport {Button} from '@common/ui/buttons/button';\nimport {useCurrentDateTime} from '@common/i18n/use-current-date-time';\nimport {FormComboBox} from '@common/ui/forms/combobox/form-combobox';\n\nexport function TitlePrimaryFactsForm() {\n const title = useOutletContext<Title>();\n\n return (\n <FileUploadProvider>\n {title ? <EditTitleForm title={title} /> : <CreateTitleForm />}\n </FileUploadProvider>\n );\n}\n\nfunction CreateTitleForm() {\n const now = useCurrentDateTime();\n const navigate = useNavigate();\n const form = useForm<CreateTitlePayload>({\n defaultValues: {\n release_date: now.toAbsoluteString(),\n certification: 'pg',\n language: 'en',\n },\n });\n const createTitle = useCreateTitle(form);\n const isDirty = Object.keys(form.formState.dirtyFields).length > 0;\n\n return (\n <Form\n form={form}\n onSubmit={values => {\n createTitle.mutate(values, {\n onSuccess: response => {\n toast(message('Title created'));\n navigate(`../${response.title.id}/edit`, {\n relative: 'path',\n replace: true,\n });\n },\n });\n }}\n >\n <TitleEditorLayout\n actions={\n <Button\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n disabled={createTitle.isPending || !isDirty}\n >\n <Trans message=\"Create\" />\n </Button>\n }\n >\n <FormFields />\n </TitleEditorLayout>\n </Form>\n );\n}\n\ninterface EditTitleFormProps {\n title: Title;\n}\nfunction EditTitleForm({title}: EditTitleFormProps) {\n const navigate = useNavigate();\n const form = useForm<CreateTitlePayload>({\n defaultValues: {\n name: title.name,\n is_series: title.is_series,\n original_title: title.original_title,\n poster: title.poster,\n backdrop: title.backdrop,\n release_date: title.release_date,\n tagline: title.tagline,\n description: title.description,\n runtime: title.runtime,\n certification: title.certification,\n budget: title.budget,\n revenue: title.revenue,\n language: title.language,\n popularity: title.popularity,\n },\n });\n const updateTitle = useUpdateTitle(form);\n\n return (\n <Form\n form={form}\n onSubmit={values => {\n updateTitle.mutate(values, {\n onSuccess: () => {\n toast(message('Title updated'));\n navigate('../../../', {relative: 'path', replace: true});\n },\n });\n }}\n >\n <TitleEditorLayout\n actions={\n <Button\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n disabled={updateTitle.isPending || !form.formState.isDirty}\n >\n <Trans message=\"Save\" />\n </Button>\n }\n >\n <FormFields />\n </TitleEditorLayout>\n </Form>\n );\n}\n\nfunction FormFields() {\n return (\n <Fragment>\n <div className=\"gap-24 md:flex\">\n <FormImageSelector\n variant=\"square\"\n previewSize=\"w-204 aspect-poster\"\n name=\"poster\"\n diskPrefix=\"title-posters\"\n label={<Trans message=\"Poster\" />}\n showRemoveButton\n />\n <div className=\"flex-auto max-md:mt-24\">\n <FormImageSelector\n name=\"backdrop\"\n variant=\"square\"\n diskPrefix=\"title-backdrops\"\n label={<Trans message=\"Backdrop\" />}\n stretchPreview\n previewSize=\"min-h-124\"\n className=\"mb-24\"\n />\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Title\" />}\n className=\"mb-24\"\n required\n />\n <FormTextField\n name=\"original_title\"\n label={<Trans message=\"Original title\" />}\n className=\"mb-24\"\n />\n <FormSwitch name=\"is_series\" className=\"mb-24\">\n <Trans message=\"Series\" />\n </FormSwitch>\n </div>\n </div>\n <FormDatePicker\n name=\"release_date\"\n label={<Trans message=\"Release date\" />}\n className=\"mb-24\"\n granularity=\"day\"\n />\n <FormTextField\n name=\"tagline\"\n label={<Trans message=\"Tagline\" />}\n className=\"mb-24\"\n />\n <FormTextField\n name=\"description\"\n label={<Trans message=\"Overview\" />}\n inputElementType=\"textarea\"\n rows={4}\n className=\"mb-24\"\n />\n <div className=\"mb-24 items-center gap-24 md:flex\">\n <FormTextField\n name=\"runtime\"\n label={<Trans message=\"Runtime\" />}\n type=\"number\"\n min={1}\n className=\"flex-1 max-md:mb-24\"\n />\n <CertificationCombobox />\n </div>\n <div className=\"mb-24 items-center gap-24 md:flex\">\n <FormTextField\n name=\"budget\"\n label={<Trans message=\"Budget (US dollars)\" />}\n type=\"number\"\n min={1}\n className=\"flex-1 max-md:mb-24\"\n />\n <FormTextField\n name=\"revenue\"\n label={<Trans message=\"Revenue (US dollars)\" />}\n type=\"number\"\n min={1}\n className=\"flex-1 max-md:mb-24\"\n />\n </div>\n <div className=\"mb-24 items-center gap-24 md:flex\">\n <FormTextField\n name=\"popularity\"\n label={<Trans message=\"Popularity\" />}\n type=\"number\"\n min={1}\n className=\"flex-1 max-md:mb-24\"\n />\n <LanguageSelect />\n </div>\n </Fragment>\n );\n}\n\nfunction CertificationCombobox() {\n const {data} = useValueLists(['titleFilterAgeRatings']);\n return (\n <FormComboBox\n name=\"certification\"\n selectionMode=\"single\"\n label={<Trans message=\"Certification\" />}\n className=\"flex-1\"\n allowCustomValue\n >\n {data?.titleFilterAgeRatings.map(({name, value}) => (\n <Option key={value} value={value}>\n <Trans message={name} />\n </Option>\n ))}\n </FormComboBox>\n );\n}\n\nfunction LanguageSelect() {\n const {data} = useValueLists(['tmdbLanguages']);\n return (\n <FormSelect\n name=\"language\"\n selectionMode=\"single\"\n label={<Trans message=\"Language\" />}\n showSearchField\n searchPlaceholder=\"Search languages\"\n className=\"flex-1\"\n >\n {data?.tmdbLanguages.map(language => (\n <Option key={language.code} value={language.code}>\n <Trans message={language.name} />\n </Option>\n ))}\n </FormSelect>\n );\n}\n","import {ReviewsDatatablePage} from '@app/admin/reviews/reviews-datatable-page';\nimport {useOutletContext} from 'react-router-dom';\nimport {Title} from '@app/titles/models/title';\nimport {TitleEditorLayout} from '@app/admin/titles/title-editor/title-editor-layout';\n\nexport function TitleReviewsEditor() {\n const title = useOutletContext<Title>();\n return (\n <TitleEditorLayout>\n <ReviewsDatatablePage hideTitle reviewable={title} />\n </TitleEditorLayout>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ZoomOutMapIcon = createSvgIcon(\n <path d=\"m15 3 2.3 2.3-2.89 2.87 1.42 1.42L18.7 6.7 21 9V3h-6zM3 9l2.3-2.3 2.87 2.89 1.42-1.42L6.7 5.3 9 3H3v6zm6 12-2.3-2.3 2.89-2.87-1.42-1.42L5.3 17.3 3 15v6h6zm12-6-2.3 2.3-2.87-2.89-1.42 1.42 2.89 2.87L15 21h6v-6z\" />\n, 'ZoomOutMapOutlined');\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {useParams} from 'react-router-dom';\n\ninterface Response extends BackendResponse {}\n\nexport function useDeleteImage(imageId: number | string) {\n const {titleId} = useParams();\n return useMutation({\n mutationFn: () => deleteImage(imageId),\n onSuccess: async () => {\n await queryClient.invalidateQueries({queryKey: ['titles', `${titleId}`]});\n toast(message('Image deleted'));\n },\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction deleteImage(imageId: number | string): Promise<Response> {\n return apiClient.delete(`images/${imageId}`).then(r => r.data);\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {TitleImage} from '@app/titles/models/title-image';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {useParams} from 'react-router-dom';\n\ninterface Response extends BackendResponse {\n image: TitleImage;\n}\n\ninterface Payload {\n titleId: number | string;\n file: File;\n}\n\nexport function useUploadImage() {\n const {titleId} = useParams();\n return useMutation({\n mutationFn: (payload: Payload) => uploadImage(payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({queryKey: ['titles', `${titleId}`]});\n toast(message('Image uploaded'));\n },\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction uploadImage(payload: Payload): Promise<Response> {\n const formData = new FormData();\n formData.append('titleId', payload.titleId.toString());\n formData.append('file', payload.file);\n return apiClient.post(`images`, formData).then(r => r.data);\n}\n","import {TitleBackdrop} from '@app/titles/title-poster/title-backdrop';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {ImageZoomDialog} from '@common/ui/overlays/dialog/image-zoom-dialog';\nimport {Button} from '@common/ui/buttons/button';\nimport {Trans} from '@common/i18n/trans';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {ZoomOutMapIcon} from '@common/icons/material/ZoomOutMap';\nimport {useDeleteImage} from '@app/admin/titles/requests/use-delete-image';\nimport {UploadInputType} from '@common/uploads/types/upload-input-config';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {openUploadWindow} from '@common/uploads/utils/open-upload-window';\nimport {useUploadImage} from '@app/admin/titles/requests/use-upload-image';\nimport {useOutletContext, useParams} from 'react-router-dom';\nimport {AddIcon} from '@common/icons/material/Add';\nimport {validateUpload} from '@common/uploads/uploader/validate-upload';\nimport {toast} from '@common/ui/toast/toast';\nimport {TitleEditorLayout} from '@app/admin/titles/title-editor/title-editor-layout';\nimport {Title} from '@app/titles/models/title';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport React from 'react';\nimport {ImageIcon} from '@common/icons/material/Image';\n\nexport function TitleImagesEditor() {\n const title = useOutletContext<Title>();\n return (\n <TitleEditorLayout>\n <FileUploadProvider>\n <UploadButton />\n </FileUploadProvider>\n <div className=\"mt-24 grid grid-cols-2 gap-24 md:grid-cols-3\">\n {title.images.map((image, index) => (\n <div key={image.id}>\n <TitleBackdrop src={image.url} srcSize=\"md\" className=\"rounded\" />\n <div className=\"mt-6 flex items-center justify-between gap-14\">\n <DeleteButton imageId={image.id} />\n <DialogTrigger type=\"modal\">\n <IconButton variant=\"outline\" size=\"xs\">\n <ZoomOutMapIcon />\n </IconButton>\n <ImageZoomDialog\n images={title.images.map(img => img.url)}\n defaultActiveIndex={index}\n />\n </DialogTrigger>\n </div>\n </div>\n ))}\n </div>\n {!title.images.length && <NoImagesMessage />}\n </TitleEditorLayout>\n );\n}\n\nfunction NoImagesMessage() {\n return (\n <IllustratedMessage\n className=\"mt-40\"\n imageMargin=\"mb-8\"\n image={\n <div className=\"text-muted\">\n <ImageIcon size=\"xl\" />\n </div>\n }\n imageHeight=\"h-auto\"\n title={<Trans message=\"No images have been added yet\" />}\n />\n );\n}\n\nconst MAX_IMAGE_SIZE = 5000000;\nfunction UploadButton() {\n const {titleId} = useParams();\n const uploadImage = useUploadImage();\n\n const selectAndUploadFile = async () => {\n const files = await openUploadWindow({\n types: [UploadInputType.image],\n });\n const errorMessage = validateUpload(files[0], {\n maxFileSize: MAX_IMAGE_SIZE,\n });\n if (errorMessage) {\n toast.danger(errorMessage);\n return;\n }\n\n uploadImage.mutate({\n file: files[0].native,\n titleId: titleId!,\n });\n };\n\n return (\n <Button\n variant=\"outline\"\n color=\"primary\"\n startIcon={<AddIcon />}\n disabled={uploadImage.isPending}\n onClick={() => selectAndUploadFile()}\n >\n <Trans message=\"Upload image\" />\n </Button>\n );\n}\n\ninterface ImageItemProps {\n imageId: number;\n}\nfunction DeleteButton({imageId}: ImageItemProps) {\n const deleteImage = useDeleteImage(imageId);\n return (\n <Button\n variant=\"outline\"\n size=\"xs\"\n disabled={deleteImage.isPending}\n onClick={() => deleteImage.mutate()}\n >\n <Trans message=\"Delete\" />\n </Button>\n );\n}\n","import {message} from '@common/i18n/message';\nimport {\n Menu,\n MenuItem,\n MenuTrigger,\n} from '@common/ui/navigation/menu/menu-trigger';\nimport {Button, ButtonProps} from '@common/ui/buttons/button';\nimport {SortIcon} from '@common/icons/material/Sort';\nimport {Trans} from '@common/i18n/trans';\n\nconst SortOptions = [\n {\n value: 'created_at:desc',\n label: message('Newest'),\n },\n {\n value: 'created_at:asc',\n label: message('Oldest'),\n },\n {\n value: 'upvotes:desc',\n label: message('Most upvotes'),\n },\n {\n value: 'reports_count:desc',\n label: message('Most reported'),\n },\n {\n value: 'season_num:desc',\n label: message('Seasons'),\n },\n {\n value: 'order:asc',\n label: message('Curated'),\n },\n];\n\ninterface Props {\n value: string;\n onValueChange: (newValue: string) => void;\n color?: ButtonProps['color'];\n}\nexport function TitleVideosSortButton({value, onValueChange, color}: Props) {\n let selectedOption = SortOptions.find(option => option.value === value);\n if (!selectedOption) {\n selectedOption = SortOptions[0];\n }\n\n return (\n <MenuTrigger\n selectedValue={value}\n onSelectionChange={newValue => onValueChange(newValue as string)}\n selectionMode=\"single\"\n >\n <Button variant=\"outline\" startIcon={<SortIcon />} color={color}>\n <Trans {...selectedOption.label} />\n </Button>\n <Menu>\n {SortOptions.map(option => (\n <MenuItem value={option.value} key={option.value}>\n <Trans {...option.label} />\n </MenuItem>\n ))}\n </Menu>\n </MenuTrigger>\n );\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n //\n}\n\ninterface Payload {\n videoIds: number[];\n}\n\nexport function useDeleteVideos() {\n return useMutation({\n mutationFn: (payload: Payload) => deleteVideos(payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({queryKey: ['video']});\n },\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction deleteVideos({videoIds}: Payload): Promise<Response> {\n return apiClient.delete(`videos/${videoIds.join(',')}`).then(r => r.data);\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {useParams} from 'react-router-dom';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\n\ninterface Response extends BackendResponse {\n episodeNumbers: number[];\n}\n\nexport function useSeasonEpisodeNumbers() {\n const {titleId, season} = useParams();\n return useQuery({\n queryKey: [\n 'titles',\n `${titleId}`,\n 'seasons',\n `${season}`,\n 'episodeNumbers',\n ],\n queryFn: () => fetchEpisodeNumbers(titleId!, season!),\n });\n}\n\nfunction fetchEpisodeNumbers(\n titleId: number | string,\n seasonNumber: number | string,\n) {\n return apiClient\n .get<Response>(`titles/${titleId}/seasons/${seasonNumber}/episode-numbers`)\n .then(response => response.data);\n}\n","import {Select} from '@common/ui/forms/select/select';\nimport {message} from '@common/i18n/message';\nimport {Trans} from '@common/i18n/trans';\nimport {Option} from '@common/ui/forms/combobox/combobox';\nimport React from 'react';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {useParams} from 'react-router-dom';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {Title} from '@app/titles/models/title';\nimport {useSeasonEpisodeNumbers} from '@app/seasons/requests/use-season-episode-numbers';\n\ninterface Props {\n title: Title;\n}\nexport function VideosEditorSeasonSelect({title}: Props) {\n const navigate = useNavigate();\n const {trans} = useTrans();\n const params = useParams();\n const season = params.season ? Number(params.season) : '';\n const episode = params.episode ? Number(params.episode) : '';\n\n const handleNavigate = (season?: number, episode?: number) => {\n let uri = `/admin/titles/${title.id}/edit/videos`;\n if (season) {\n uri += `/seasons/${season}`;\n }\n if (episode) {\n uri += `/episodes/${episode}`;\n }\n navigate(uri);\n };\n\n if (!title.seasons_count) {\n return null;\n }\n\n return (\n <div className=\"flex items-center gap-12\">\n <Select\n className=\"flex-1\"\n selectedValue={season}\n onSelectionChange={newSeason => {\n handleNavigate(newSeason as number);\n }}\n placeholder={trans(message('Season'))}\n selectionMode=\"single\"\n size=\"sm\"\n >\n <Option key=\"none\" value=\"\">\n <Trans message=\"All seasons\" />\n </Option>\n {[...new Array(title.seasons_count).keys()].map(i => {\n const number = i + 1;\n return (\n <Option key={number} value={number}>\n <Trans message=\"Season :number\" values={{number}} />\n </Option>\n );\n })}\n </Select>\n {season && (\n <EpisodeSelect\n value={episode}\n onChange={newEpisode => {\n handleNavigate(season, newEpisode as number);\n }}\n />\n )}\n </div>\n );\n}\n\ninterface EpisodeSelectProps {\n value: string | number;\n onChange: (value: string | number) => void;\n}\nfunction EpisodeSelect({value, onChange}: EpisodeSelectProps) {\n const {trans} = useTrans();\n const {data} = useSeasonEpisodeNumbers();\n return (\n <Select\n placeholder={trans(message('Episode'))}\n selectionMode=\"single\"\n className=\"flex-1\"\n size=\"sm\"\n selectedValue={value}\n onSelectionChange={onChange}\n >\n <Option key=\"none\" value=\"\">\n <Trans message=\"All episodes\" />\n </Option>\n {data?.episodeNumbers.map(number => {\n return (\n <Option key={number} value={number}>\n <Trans message=\"Episode :number\" values={{number}} />\n </Option>\n );\n })}\n </Select>\n );\n}\n","import {Link, useOutletContext, useParams} from 'react-router-dom';\nimport {VideoThumbnail} from '@app/videos/video-thumbnail';\nimport {PlayCircleIcon} from '@common/icons/material/PlayCircle';\nimport {Video} from '@app/titles/models/video';\nimport {getWatchLink} from '@app/videos/watch-page/get-watch-link';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Button} from '@common/ui/buttons/button';\nimport {Trans} from '@common/i18n/trans';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {useInfiniteData} from '@common/ui/infinite-scroll/use-infinite-data';\nimport {AddIcon} from '@common/icons/material/Add';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport {AddFilterButton} from '@common/datatable/filters/add-filter-button';\nimport {TuneIcon} from '@common/icons/material/Tune';\nimport React, {Fragment, useMemo} from 'react';\nimport {useBackendFilterUrlParams} from '@common/datatable/filters/backend-filter-url-params';\nimport {CompactSeasonEpisode} from '@app/episodes/compact-season-episode';\nimport {FilterList} from '@common/datatable/filters/filter-list/filter-list';\nimport {TitleVideosSortButton} from '@app/admin/titles/title-editor/videos-editor/title-videos-sort-button';\nimport {DeleteIcon} from '@common/icons/material/Delete';\nimport {VideoGridItemBottomGradient} from '@app/titles/video-grid';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport {useDeleteVideos} from '@app/admin/videos/requests/use-delete-videos';\nimport {VideosEditorSeasonSelect} from '@app/admin/titles/title-editor/videos-editor/videos-editor-season-select';\nimport {VideosDatatableFilters} from '@app/admin/videos/videos-datatable-filters';\nimport {TitleEditorLayout} from '@app/admin/titles/title-editor/title-editor-layout';\nimport {Title} from '@app/titles/models/title';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {MediaPlayIcon} from '@common/icons/media/media-play';\nimport {TitleEditorPageStatus} from '@app/admin/titles/title-editor/title-editor-page-status';\n\nexport function TitleVideosEditor() {\n const filters = useMemo(\n () => VideosDatatableFilters.filter(f => f.key !== 'title_id'),\n [],\n );\n const {encodedFilters} = useBackendFilterUrlParams(filters);\n const {season, episode} = useParams();\n const title = useOutletContext<Title>();\n const query = useInfiniteData<Video>({\n queryKey: ['video', 'edit-title-page'],\n endpoint: 'videos',\n defaultOrderBy: 'created_at',\n defaultOrderDir: 'desc',\n queryParams: {\n perPage: 20,\n filters: encodedFilters,\n title_id: title.id,\n season: season ?? null,\n episode: episode ?? null,\n },\n });\n\n let content;\n\n if (query.data) {\n content = query.items.length ? (\n <Fragment>\n <div className=\"grid grid-cols-1 gap-24 md:grid-cols-2 lg:grid-cols-3\">\n {query.items.map(video => (\n <VideoItem key={video.id} video={video} />\n ))}\n </div>\n <InfiniteScrollSentinel query={query} />\n </Fragment>\n ) : (\n <NoVideosMessage isFiltering={encodedFilters != null} />\n );\n } else {\n content = <TitleEditorPageStatus query={query} />;\n }\n\n return (\n <TitleEditorLayout>\n <div className=\"mb-24 flex flex-wrap items-center gap-12\">\n <Button\n variant=\"outline\"\n color=\"primary\"\n startIcon={<AddIcon />}\n elementType={Link}\n to=\"new\"\n className=\"mr-auto\"\n >\n <Trans message=\"Add video\" />\n </Button>\n <VideosEditorSeasonSelect title={title} />\n <TitleVideosSortButton\n value={`${query.sortDescriptor.orderBy}:${query.sortDescriptor.orderDir}`}\n onValueChange={value => {\n const [orderBy, orderDir] = value.split(':');\n query.setSortDescriptor({orderBy, orderDir: orderDir as any});\n }}\n />\n <AddFilterButton\n icon={<TuneIcon />}\n color={null}\n variant=\"outline\"\n filters={filters}\n />\n </div>\n <FilterList className=\"mb-24\" filters={filters} />\n {content}\n </TitleEditorLayout>\n );\n}\n\ninterface NoVideosMessageProps {\n isFiltering: boolean;\n}\nfunction NoVideosMessage({isFiltering}: NoVideosMessageProps) {\n return (\n <IllustratedMessage\n className=\"mt-40\"\n imageMargin=\"mb-8\"\n image={\n <div className=\"text-muted\">\n <MediaPlayIcon size=\"xl\" />\n </div>\n }\n imageHeight=\"h-auto\"\n title={\n isFiltering ? (\n <Trans message=\"No matching videos\" />\n ) : (\n <Trans message=\"No videos have been added yet\" />\n )\n }\n />\n );\n}\n\ninterface VideoItemProps {\n video: Video;\n}\nfunction VideoItem({video}: VideoItemProps) {\n const link = getWatchLink(video);\n return (\n <div className=\"\">\n <Link to={link} className=\"relative isolate block\" target=\"_blank\">\n <VideoThumbnail video={video} title={video.title} srcSize=\"lg\" />\n <VideoGridItemBottomGradient />\n <span className=\"absolute bottom-0 left-0 z-30 flex items-center gap-x-6 p-10 text-white\">\n <PlayCircleIcon />\n <span className=\"capitalize\">{video.category}</span>\n </span>\n </Link>\n <div>\n <div className=\"mb-4 mt-12 flex items-center gap-24\">\n <Link to={link} className=\"block font-semibold hover:underline\">\n {video.name}\n </Link>\n {video.reports_count ? (\n <div className=\"ml-auto flex-shrink-0 whitespace-nowrap text-sm text-muted\">\n <Trans\n message=\":count reports\"\n values={{count: video.reports_count}}\n />\n </div>\n ) : null}\n </div>\n <div className=\"flex items-center justify-between gap-14 text-sm text-muted\">\n {(video.season_num != null || video.episode_num != null) && (\n <CompactSeasonEpisode\n seasonNum={video.season_num}\n episodeNum={video.episode_num}\n />\n )}\n <FormattedDate date={video.created_at} />\n </div>\n <div className=\"mt-14 flex items-center gap-24\">\n <Button\n variant=\"outline\"\n size=\"xs\"\n startIcon={<EditIcon />}\n elementType={Link}\n to={`edit/${video.id}`}\n >\n <Trans message=\"Edit\" />\n </Button>\n <DeleteButton video={video} />\n </div>\n </div>\n </div>\n );\n}\n\ninterface DeleteButtonProps {\n video: Video;\n}\nfunction DeleteButton({video}: DeleteButtonProps) {\n const deleteVideos = useDeleteVideos();\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={confirmed => {\n if (confirmed) {\n deleteVideos.mutate({videoIds: [video.id]});\n }\n }}\n >\n <Button\n className=\"ml-auto\"\n variant=\"outline\"\n size=\"xs\"\n startIcon={<DeleteIcon />}\n disabled={deleteVideos.isPending}\n >\n <Trans message=\"Delete\" />\n </Button>\n <ConfirmationDialog\n isDanger\n title={<Trans message=\"Delete video\" />}\n body={<Trans message=\"Are you sure you want to delete this video?\" />}\n confirm={<Trans message=\"Delete\" />}\n />\n </DialogTrigger>\n );\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {seasonQueryKey} from '@app/seasons/requests/use-season';\nimport {CreateEpisodePayload} from '@app/episodes/requests/use-create-episode';\nimport {Episode} from '@app/titles/models/episode';\n\ninterface Response extends BackendResponse {\n episode: Episode;\n}\n\nexport function useUpdateEpisode(\n titleId: number | string,\n season: number | string,\n episode: number | string,\n form: UseFormReturn<CreateEpisodePayload>,\n) {\n return useMutation({\n mutationFn: (payload: CreateEpisodePayload) =>\n updateEpisode(titleId, season, episode, payload),\n onSuccess: async ({episode}) => {\n await queryClient.invalidateQueries({\n queryKey: seasonQueryKey(episode.title_id, episode.season_number),\n });\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction updateEpisode(\n titleId: number | string,\n season: number | string,\n episode: number | string,\n payload: CreateEpisodePayload,\n): Promise<Response> {\n return apiClient\n .put(`titles/${titleId}/seasons/${season}/episodes/${episode}`, payload)\n .then(r => r.data);\n}\n","import {Trans} from '@common/i18n/trans';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport React, {ReactNode} from 'react';\nimport {Breadcrumb} from '@common/ui/breadcrumbs/breadcrumb';\nimport {BreadcrumbItem} from '@common/ui/breadcrumbs/breadcrumb-item';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {Tabs} from '@common/ui/tabs/tabs';\nimport {TabList} from '@common/ui/tabs/tab-list';\nimport {Tab} from '@common/ui/tabs/tab';\nimport {TitleEditorLayout} from '@app/admin/titles/title-editor/title-editor-layout';\nimport {Link, useLocation, useParams} from 'react-router-dom';\nimport {message} from '@common/i18n/message';\n\nconst PageTabs = [\n {uri: 'primary-facts', label: message('Primary facts')},\n {uri: 'cast', label: message('Cast')},\n {uri: 'crew', label: message('Crew')},\n];\n\ninterface Props {\n children: ReactNode;\n actions?: ReactNode;\n}\nexport function EpisodeEditorLayout({children, actions}: Props) {\n const {episode, season} = useParams();\n const navigate = useNavigate();\n\n const {pathname} = useLocation();\n const tabName = pathname.split('/').pop();\n\n // only \"primary facts\" tab will be enabled when creating new episode\n const selectedTab = episode\n ? PageTabs.findIndex(tab => tab.uri === tabName)\n : 0;\n\n return (\n <TitleEditorLayout actions={actions}>\n <Breadcrumb className=\"mb-24\">\n <BreadcrumbItem\n onSelected={() => navigate('../..', {relative: 'path'})}\n >\n <Trans message=\"Season :number\" values={{number: season}} />\n </BreadcrumbItem>\n <BreadcrumbItem>\n {episode ? (\n <Trans message=\"Episode :number\" values={{number: episode}} />\n ) : (\n <Trans message=\"New episode\" />\n )}\n </BreadcrumbItem>\n </Breadcrumb>\n <FileUploadProvider>\n <Tabs selectedTab={selectedTab}>\n <TabList>\n {PageTabs.map(tab => (\n <Tab\n isDisabled={!episode && tab.uri !== 'primary-facts'}\n key={tab.uri}\n width=\"min-w-132\"\n elementType={Link}\n to={`../${tab.uri}`}\n relative=\"path\"\n replace\n >\n <Trans {...tab.label} />\n </Tab>\n ))}\n </TabList>\n <div className=\"pt-24\">{children}</div>\n </Tabs>\n </FileUploadProvider>\n </TitleEditorLayout>\n );\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {seasonQueryKey} from '@app/seasons/requests/use-season';\nimport {Episode} from '@app/titles/models/episode';\n\ninterface Response extends BackendResponse {\n episode: Episode;\n}\n\nexport interface CreateEpisodePayload {\n name: string;\n description: string;\n release_date: string;\n runtime: number;\n popularity: number;\n poster: string;\n}\n\nexport function useCreateEpisode(\n form: UseFormReturn<CreateEpisodePayload>,\n titleId: number,\n season: number | string,\n) {\n return useMutation({\n mutationFn: (payload: CreateEpisodePayload) =>\n createEpisode(titleId, season, payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: seasonQueryKey(titleId, season),\n });\n },\n onError: r => (form ? onFormQueryError(r, form) : showHttpErrorToast(r)),\n });\n}\n\nfunction createEpisode(\n titleId: number,\n season: number | string,\n payload: CreateEpisodePayload,\n): Promise<Response> {\n return apiClient\n .post(`titles/${titleId}/seasons/${season}/episodes`, payload)\n .then(r => r.data);\n}\n","import {FormImageSelector} from '@common/ui/images/image-selector';\nimport {Trans} from '@common/i18n/trans';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {FormDatePicker} from '@common/ui/forms/input-field/date/date-picker/date-picker';\nimport React, {Fragment} from 'react';\nimport {useForm} from 'react-hook-form';\nimport {useOutletContext, useParams} from 'react-router-dom';\nimport {Form} from '@common/ui/forms/form';\nimport {useUpdateEpisode} from '@app/episodes/requests/use-update-episode';\nimport {EpisodeEditorLayout} from '@app/admin/titles/title-editor/episode-editor/episode-editor-layout';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {\n CreateEpisodePayload,\n useCreateEpisode,\n} from '@app/episodes/requests/use-create-episode';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {Button} from '@common/ui/buttons/button';\nimport {useCurrentDateTime} from '@common/i18n/use-current-date-time';\nimport {Title} from '@app/titles/models/title';\nimport {\n GetEpisodeResponse,\n useEpisode,\n} from '@app/episodes/requests/use-episode';\nimport {TitleEditorPageStatus} from '@app/admin/titles/title-editor/title-editor-page-status';\n\nexport function EpisodePrimaryFactsForm() {\n const {episode: episodeNumber} = useParams();\n if (episodeNumber) {\n return <UpdateEpisodePanel />;\n } else {\n return <NewEpisodeForm />;\n }\n}\n\nfunction NewEpisodeForm() {\n const title = useOutletContext<Title>();\n const {season} = useParams();\n const navigate = useNavigate();\n const now = useCurrentDateTime();\n const form = useForm<CreateEpisodePayload>({\n defaultValues: {\n release_date: now.toAbsoluteString(),\n },\n });\n const createEpisode = useCreateEpisode(form, title.id, season!);\n const isDirty = Object.keys(form.formState.dirtyFields).length > 0;\n\n return (\n <Form\n form={form}\n onSubmit={values => {\n createEpisode.mutate(values, {\n onSuccess: response => {\n toast(message('Episode created'));\n navigate(`../${response.episode.episode_number}`, {\n relative: 'path',\n });\n },\n });\n }}\n >\n <EpisodeEditorLayout\n actions={\n <Button\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n disabled={createEpisode.isPending || !isDirty}\n >\n <Trans message=\"Save\" />\n </Button>\n }\n >\n <FormFields />\n </EpisodeEditorLayout>\n </Form>\n );\n}\n\nfunction UpdateEpisodePanel() {\n const query = useEpisode('episode');\n return query.data ? (\n <UpdateEpisodeForm episode={query.data.episode} />\n ) : (\n <EpisodeEditorLayout\n actions={\n <Button variant=\"flat\" color=\"primary\" type=\"submit\" disabled>\n <Trans message=\"Save\" />\n </Button>\n }\n >\n <TitleEditorPageStatus query={query} />\n </EpisodeEditorLayout>\n );\n}\n\ninterface UpdateEpisodeFormProps {\n episode: GetEpisodeResponse['episode'];\n}\nfunction UpdateEpisodeForm({episode}: UpdateEpisodeFormProps) {\n const title = useOutletContext<Title>();\n const navigate = useNavigate();\n const form = useForm<CreateEpisodePayload>({\n defaultValues: {\n name: episode.name,\n description: episode.description,\n release_date: episode.release_date,\n runtime: episode.runtime,\n popularity: episode.popularity,\n poster: episode.poster,\n },\n });\n\n const updateEpisode = useUpdateEpisode(\n title.id,\n episode.season_number,\n episode.episode_number,\n form,\n );\n\n return (\n <Form\n form={form}\n onSubmit={values => {\n updateEpisode.mutate(values, {\n onSuccess: () => {\n toast(message('Episode updated'));\n navigate('../../../', {relative: 'path'});\n },\n });\n }}\n >\n <EpisodeEditorLayout\n actions={\n <Button\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n disabled={updateEpisode.isPending || !form.formState.isDirty}\n >\n <Trans message=\"Save\" />\n </Button>\n }\n >\n <FormFields />\n </EpisodeEditorLayout>\n </Form>\n );\n}\n\nfunction FormFields() {\n return (\n <Fragment>\n <div className=\"gap-24 md:flex\">\n <FormImageSelector\n variant=\"square\"\n previewSize=\"w-204 aspect-poster\"\n name=\"poster\"\n diskPrefix=\"episode-posters\"\n label={<Trans message=\"Poster\" />}\n stretchPreview\n />\n <div className=\"mb-24 flex-auto max-md:mt-24\">\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Title\" />}\n className=\"mb-24\"\n required\n />\n <FormDatePicker\n name=\"release_date\"\n label={<Trans message=\"Release date\" />}\n className=\"mb-24\"\n granularity=\"day\"\n />\n <FormTextField\n name=\"runtime\"\n label={<Trans message=\"Runtime\" />}\n type=\"number\"\n min={1}\n className=\"mb-24\"\n />\n <FormTextField\n name=\"popularity\"\n label={<Trans message=\"Popularity\" />}\n type=\"number\"\n min={1}\n />\n </div>\n </div>\n <FormTextField\n name=\"description\"\n label={<Trans message=\"Overview\" />}\n inputElementType=\"textarea\"\n rows={6}\n className=\"mb-24\"\n />\n </Fragment>\n );\n}\n","import {useInfiniteData} from '@common/ui/infinite-scroll/use-infinite-data';\nimport {TitleCredit} from '@app/titles/models/title';\nimport {useParams} from 'react-router-dom';\n\nexport const titleCreditsQueryKey = (\n titleId: number | string,\n season?: number | string,\n episode?: number | string,\n params?: any\n) => {\n const key = ['titles', `${titleId}`, 'credits'];\n if (season) {\n key.push('season', `${season}`);\n }\n if (episode) {\n key.push('episode', `${episode}`);\n }\n if (params) {\n key.push(params);\n }\n return key;\n};\n\ninterface Params {\n department?: string;\n crewOnly?: string;\n}\n\nexport function useTitleCredits(params: Params = {}) {\n const {titleId, season, episode} = useParams();\n return useInfiniteData<TitleCredit>({\n endpoint: `titles/${titleId}/credits`,\n queryKey: titleCreditsQueryKey(titleId!, season, episode, params),\n queryParams: {\n ...params,\n perPage: 30,\n season: season || '',\n episode: episode || '',\n },\n });\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {useParams} from 'react-router-dom';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {titleCreditsQueryKey} from '@app/admin/titles/requests/use-title-credits';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n //\n}\n\ninterface Payload {\n ids: number[];\n}\n\nexport function useSortTitleCredits() {\n const {titleId} = useParams();\n return useMutation({\n mutationFn: (payload: Payload) => sortCredits(payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: titleCreditsQueryKey(titleId!),\n });\n toast(message('Credit added'));\n },\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction sortCredits(payload: Payload): Promise<Response> {\n return apiClient.post(`titles/credits/reorder`, payload).then(r => r.data);\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {useParams} from 'react-router-dom';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {titleCreditsQueryKey} from '@app/admin/titles/requests/use-title-credits';\nimport {CreateTitleCreditPayload} from '@app/admin/titles/requests/use-create-title-credit';\n\ninterface Response extends BackendResponse {\n //\n}\n\nexport interface UpdateTitleCreditPayload\n extends Omit<CreateTitleCreditPayload, 'person_id'> {}\n\nexport function useUpdateTitleCredit(\n form: UseFormReturn<UpdateTitleCreditPayload>,\n creditId: number,\n) {\n const {titleId, season, episode} = useParams();\n return useMutation({\n mutationFn: (payload: UpdateTitleCreditPayload) =>\n updateTitle(titleId!, season, episode, creditId, payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: titleCreditsQueryKey(titleId!),\n });\n toast(message('Credit updated'));\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction updateTitle(\n titleId: string,\n season: string | undefined,\n episode: string | undefined,\n creditId: number,\n payload: UpdateTitleCreditPayload,\n): Promise<Response> {\n payload = {\n ...payload,\n season,\n episode,\n };\n return apiClient\n .put(`titles/${titleId}/credits/${creditId}`, payload)\n .then(r => r.data);\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {useParams} from 'react-router-dom';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {titleCreditsQueryKey} from '@app/admin/titles/requests/use-title-credits';\n\ninterface Response extends BackendResponse {\n //\n}\n\nexport interface CreateTitleCreditPayload {\n person_id: number;\n character: string;\n department: string;\n job: string;\n season?: number | string;\n episode?: number | string;\n}\n\nexport function useCreateTitleCredit(\n form: UseFormReturn<CreateTitleCreditPayload>,\n) {\n const {titleId, season, episode} = useParams();\n return useMutation({\n mutationFn: (payload: CreateTitleCreditPayload) =>\n createCredit(titleId!, season, episode, payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: titleCreditsQueryKey(titleId!),\n });\n toast(message('Credit added'));\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction createCredit(\n titleId: number | string,\n season: number | string | undefined,\n episode: number | string | undefined,\n payload: CreateTitleCreditPayload,\n): Promise<Response> {\n payload = {\n ...payload,\n season,\n episode,\n };\n return apiClient.post(`titles/${titleId}/credits`, payload).then(r => r.data);\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Form} from '@common/ui/forms/form';\nimport {useForm, useFormContext} from 'react-hook-form';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {\n CreateTitleCreditPayload,\n useCreateTitleCredit,\n} from '@app/admin/titles/requests/use-create-title-credit';\nimport {FormNormalizedModelField} from '@common/ui/forms/normalized-model-field';\nimport {useValueLists} from '@common/http/value-lists';\nimport {UpdateTitleCreditPayload} from '@app/admin/titles/requests/use-update-title-credit';\nimport {Fragment, useMemo} from 'react';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport clsx from 'clsx';\n\ninterface Props {\n isCrew: boolean;\n}\nexport function AddCreditDialog({isCrew}: Props) {\n const {formId, close} = useDialogContext();\n const form = useForm<CreateTitleCreditPayload>({\n defaultValues: {\n department: !isCrew ? 'actors' : undefined,\n job: !isCrew ? 'actor' : undefined,\n },\n });\n const createCredit = useCreateTitleCredit(form);\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Create credit\" />\n </DialogHeader>\n <DialogBody>\n <Form\n id={formId}\n form={form}\n onSubmit={values => {\n createCredit.mutate(values, {onSuccess: () => close()});\n }}\n >\n <FormNormalizedModelField\n endpoint=\"normalized-models/person\"\n name=\"person_id\"\n label={<Trans message=\"Person\" />}\n className=\"mb-24\"\n autoFocus\n />\n <SharedCreditDialogFields isCrew={isCrew} />\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button onClick={() => close()}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n form={formId}\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n disabled={createCredit.isPending}\n >\n <Trans message=\"Create\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n\ninterface SharedCreditDialogFieldsProps {\n isCrew: boolean;\n}\nexport function SharedCreditDialogFields({\n isCrew,\n}: SharedCreditDialogFieldsProps) {\n return (\n <Fragment>\n <FormTextField\n name=\"character\"\n label={<Trans message=\"Character\" />}\n required={!isCrew}\n className={clsx('mb-24', isCrew && 'hidden')}\n />\n <CrewFields isCrew={isCrew} />\n </Fragment>\n );\n}\n\ninterface CrewFieldsProps {\n isCrew: boolean;\n}\nfunction CrewFields({isCrew}: CrewFieldsProps) {\n const {data} = useValueLists(['tmdbDepartments']);\n const {watch} = useFormContext<UpdateTitleCreditPayload>();\n const selectedDepartment = watch('department');\n const {jobs, departments} = useMemo(() => {\n const departments =\n data?.tmdbDepartments.map(d => ({\n department: d.department.toLowerCase(),\n jobs: d.jobs,\n })) || [];\n const department = departments.find(\n d => d.department === selectedDepartment,\n );\n const jobs = department?.jobs.map(job => ({job: job.toLowerCase()})) || [];\n return {\n jobs,\n departments,\n };\n }, [data, selectedDepartment]);\n\n return (\n <Fragment>\n <FormSelect\n name=\"department\"\n label={<Trans message=\"Department\" />}\n required\n disabled={!isCrew}\n items={departments}\n className=\"mb-24\"\n selectionMode=\"single\"\n showSearchField\n >\n {item => (\n <Item value={item.department}>\n <Trans message={item.department} />\n </Item>\n )}\n </FormSelect>\n <FormSelect\n name=\"job\"\n label={<Trans message=\"Job\" />}\n required\n disabled={!isCrew}\n items={jobs}\n selectionMode=\"single\"\n showSearchField\n >\n {item => (\n <Item value={item.job} key={item.job}>\n <Trans message={item.job} />\n </Item>\n )}\n </FormSelect>\n </Fragment>\n );\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Form} from '@common/ui/forms/form';\nimport {useForm} from 'react-hook-form';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {TitleCredit} from '@app/titles/models/title';\nimport {\n UpdateTitleCreditPayload,\n useUpdateTitleCredit,\n} from '@app/admin/titles/requests/use-update-title-credit';\nimport {SharedCreditDialogFields} from '@app/admin/titles/title-editor/credits-editor/add-credit-dialog';\n\ninterface Props {\n credit: TitleCredit;\n}\nexport function EditCreditDialog({credit}: Props) {\n const {formId, close} = useDialogContext();\n const isCrew = credit.pivot.department !== 'actors';\n const form = useForm<UpdateTitleCreditPayload>({\n defaultValues: {\n character: credit.pivot.character,\n department: credit.pivot.department,\n job: credit.pivot.job,\n },\n });\n const updateCredit = useUpdateTitleCredit(form, credit.pivot.id);\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Edit credit\" />\n </DialogHeader>\n <DialogBody>\n <Form\n id={formId}\n form={form}\n onSubmit={values => {\n updateCredit.mutate(values, {onSuccess: () => close()});\n }}\n >\n <TextField\n value={credit.name}\n label={<Trans message=\"Person\" />}\n required\n readOnly\n disabled\n className=\"mb-24\"\n />\n <SharedCreditDialogFields isCrew={isCrew} />\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button onClick={() => close()}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n form={formId}\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n disabled={updateCredit.isPending}\n >\n <Trans message=\"Save\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {useParams} from 'react-router-dom';\nimport {titleCreditsQueryKey} from '@app/admin/titles/requests/use-title-credits';\n\ninterface Response extends BackendResponse {}\n\nexport function useDeleteTitleCredit(creditId: number) {\n const {titleId, season, episode} = useParams();\n return useMutation({\n mutationFn: () => deleteCredit(titleId!, season, episode, creditId),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: titleCreditsQueryKey(titleId!),\n });\n toast(message('Credit deleted'));\n },\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction deleteCredit(\n titleId: number | string,\n season: string | undefined,\n episode: string | undefined,\n creditId: number | string,\n): Promise<Response> {\n return apiClient\n .delete(`titles/${titleId}/credits/${creditId}`, {\n params: {season, episode},\n })\n .then(r => r.data);\n}\n","import {Trans} from '@common/i18n/trans';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {EditCreditDialog} from '@app/admin/titles/title-editor/credits-editor/edit-credit-dialog';\nimport React from 'react';\nimport {ColumnConfig} from '@common/datatable/column-config';\nimport {TitleCredit} from '@app/titles/models/title';\nimport {useDeleteTitleCredit} from '@app/admin/titles/requests/use-delete-title-credit';\nimport {DeleteIcon} from '@common/icons/material/Delete';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\n\nexport const getCreditsEditorActionColumn = (): ColumnConfig<TitleCredit> => {\n return {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n align: 'end',\n width: 'w-84 flex-shrink-0',\n visibleInMode: 'all',\n body: item => (\n <div className=\"text-muted\">\n <DialogTrigger type=\"modal\">\n <IconButton>\n <EditIcon />\n </IconButton>\n <EditCreditDialog credit={item} />\n </DialogTrigger>\n <DeleteButton creditId={item.pivot.id} />\n </div>\n ),\n };\n};\n\ninterface DeleteButtonProps {\n creditId: number;\n}\nfunction DeleteButton({creditId}: DeleteButtonProps) {\n const deleteCredit = useDeleteTitleCredit(creditId);\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={confirmed => {\n if (confirmed) {\n deleteCredit.mutate();\n }\n }}\n >\n <IconButton>\n <DeleteIcon />\n </IconButton>\n <ConfirmationDialog\n isDanger\n title={<Trans message=\"Delete credit\" />}\n body={<Trans message=\"Are you sure you want to delete this credit?\" />}\n confirm={<Trans message=\"Delete\" />}\n />\n </DialogTrigger>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const RecentActorsIcon = createSvgIcon(\n [<path d=\"M21 5h2v14h-2zm-4 0h2v14h-2zm-3 0H2c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h12c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1zm-1 12H3V7h10v10z\" key=\"0\" />,<circle cx=\"8\" cy=\"9.94\" r=\"1.95\" key=\"1\" />,<path d=\"M11.89 15.35c0-1.3-2.59-1.95-3.89-1.95s-3.89.65-3.89 1.95V16h7.78v-.65z\" key=\"2\" />,]\n, 'RecentActorsOutlined');\n","import {UseInfiniteDataResult} from '@common/ui/infinite-scroll/use-infinite-data';\nimport {TitleCredit} from '@app/titles/models/title';\nimport React from 'react';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {RecentActorsIcon} from '@common/icons/material/RecentActors';\nimport {Trans} from '@common/i18n/trans';\nimport {TitleEditorPageStatus} from '@app/admin/titles/title-editor/title-editor-page-status';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\n\ninterface Props {\n query: UseInfiniteDataResult<TitleCredit>;\n}\nexport function CreditsTableQueryIndicator({query}: Props) {\n if (query.data && !query.items.length) {\n return <NoCreditsMessage />;\n }\n\n if (!query.data) {\n return <TitleEditorPageStatus query={query} />;\n }\n\n return <InfiniteScrollSentinel query={query} />;\n}\n\nfunction NoCreditsMessage() {\n return (\n <IllustratedMessage\n className=\"mt-40\"\n imageMargin=\"mb-8\"\n image={\n <div className=\"text-muted\">\n <RecentActorsIcon size=\"xl\" />\n </div>\n }\n imageHeight=\"h-auto\"\n title={<Trans message=\"No credits have been added yet\" />}\n />\n );\n}\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {TitleCredit} from '@app/titles/models/title';\nimport {Trans} from '@common/i18n/trans';\nimport {DragHandleIcon} from '@common/icons/material/DragHandle';\nimport {PersonPoster} from '@app/people/person-poster/person-poster';\nimport React, {Fragment, useContext, useRef} from 'react';\nimport {Table} from '@common/ui/tables/table';\nimport {RowElementProps} from '@common/ui/tables/table-row';\nimport {NormalizedModel} from '@common/datatable/filters/normalized-model';\nimport {useIsTouchDevice} from '@common/utils/hooks/is-touch-device';\nimport {TableContext} from '@common/ui/tables/table-context';\nimport {DragPreviewRenderer} from '@common/ui/interactions/dnd/use-draggable';\nimport {mergeProps} from '@react-aria/utils';\nimport {DragPreview} from '@common/ui/interactions/dnd/drag-preview';\nimport {useSortTitleCredits} from '@app/admin/titles/requests/use-sort-title-credits';\nimport {moveItemInNewArray} from '@common/utils/array/move-item-in-new-array';\nimport {getCreditsEditorActionColumn} from '@app/admin/titles/title-editor/credits-editor/get-credits-editor-action-column';\nimport {UseInfiniteDataResult} from '@common/ui/infinite-scroll/use-infinite-data';\nimport {CreditsTableQueryIndicator} from '@app/admin/titles/title-editor/credits-editor/credits-table-query-indicator';\nimport {useSortable} from '@common/ui/interactions/dnd/sortable/use-sortable';\n\nconst columnConfig: ColumnConfig<TitleCredit>[] = [\n {\n key: 'dragHandle',\n width: 'w-42 flex-shrink-0',\n header: () => <Trans message=\"Drag handle\" />,\n hideHeader: true,\n body: () => (\n <DragHandleIcon className=\"cursor-pointer text-muted hover:text\" />\n ),\n },\n {\n key: 'name',\n header: () => <Trans message=\"Person\" />,\n visibleInMode: 'all',\n body: credit => (\n <div className=\"flex items-center gap-12\">\n <PersonPoster rounded person={credit} size=\"w-44\" />\n <div className=\"min-w-0 overflow-hidden\">{credit.name}</div>\n </div>\n ),\n },\n {\n key: 'character',\n header: () => <Trans message=\"Character\" />,\n body: credit => credit.pivot.character,\n },\n getCreditsEditorActionColumn(),\n];\n\ninterface Props {\n query: UseInfiniteDataResult<TitleCredit>;\n}\nexport function CastEditorTable({query}: Props) {\n return (\n <Fragment>\n <Table\n enableSelection={false}\n columns={columnConfig}\n data={query.items}\n renderRowAs={CreditsTableRow}\n cellHeight=\"h-54\"\n />\n <CreditsTableQueryIndicator query={query} />\n </Fragment>\n );\n}\n\nfunction CreditsTableRow({\n item,\n children,\n className,\n ...domProps\n}: RowElementProps<TitleCredit>) {\n const isTouchDevice = useIsTouchDevice();\n const context = useContext(TableContext);\n const domRef = useRef<HTMLTableRowElement>(null);\n const previewRef = useRef<DragPreviewRenderer>(null);\n const credits = context.data as TitleCredit[];\n\n const sortCredits = useSortTitleCredits();\n\n const {sortableProps} = useSortable({\n ref: domRef,\n disabled: isTouchDevice ?? false,\n item,\n items: credits,\n type: 'cast-editor-item',\n preview: previewRef,\n strategy: 'line',\n onSortEnd: (oldIndex, newIndex) => {\n const ids = credits.map(item => item.pivot.id);\n const sortedIds = moveItemInNewArray(ids, oldIndex, newIndex);\n sortCredits.mutate({ids: sortedIds});\n },\n });\n\n return (\n <div\n className={className}\n ref={domRef}\n {...mergeProps(sortableProps, domProps)}\n >\n {children}\n {!item.isPlaceholder && <RowDragPreview item={item} ref={previewRef} />}\n </div>\n );\n}\n\ninterface RowDragPreviewProps {\n item: NormalizedModel;\n}\nconst RowDragPreview = React.forwardRef<\n DragPreviewRenderer,\n RowDragPreviewProps\n>(({item}, ref) => {\n return (\n <DragPreview ref={ref}>\n {() => (\n <div className=\"rounded bg-chip p-8 text-sm shadow\">{item.name}</div>\n )}\n </DragPreview>\n );\n});\n","import {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Button} from '@common/ui/buttons/button';\nimport {AddIcon} from '@common/icons/material/Add';\nimport {Trans} from '@common/i18n/trans';\nimport {AddCreditDialog} from '@app/admin/titles/title-editor/credits-editor/add-credit-dialog';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {UseInfiniteDataResult} from '@common/ui/infinite-scroll/use-infinite-data';\nimport {TitleCredit} from '@app/titles/models/title';\nimport {SearchIcon} from '@common/icons/material/Search';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\n\ninterface Props {\n query: UseInfiniteDataResult<TitleCredit>;\n isCrew: boolean;\n}\nexport function TitleCreditsTableHeader({query, isCrew}: Props) {\n const {trans} = useTrans();\n return (\n <div className=\"flex items-center gap-24 justify-between mb-14\">\n <DialogTrigger type=\"modal\">\n <Button variant=\"outline\" color=\"primary\" startIcon={<AddIcon />}>\n <Trans message=\"Add credit\" />\n </Button>\n <AddCreditDialog isCrew={isCrew} />\n </DialogTrigger>\n <TextField\n size=\"sm\"\n value={query.searchQuery}\n onChange={e => query.setSearchQuery(e.target.value)}\n placeholder={trans(message('Search'))}\n startAdornment={<SearchIcon />}\n />\n </div>\n );\n}\n","import React from 'react';\nimport {EpisodeEditorLayout} from '@app/admin/titles/title-editor/episode-editor/episode-editor-layout';\nimport {CastEditorTable} from '@app/admin/titles/title-editor/credits-editor/cast-editor-table';\nimport {useTitleCredits} from '@app/admin/titles/requests/use-title-credits';\nimport {TitleCreditsTableHeader} from '@app/admin/titles/title-editor/credits-editor/title-credits-table-header';\n\nexport function EpisodeCastEditor() {\n const query = useTitleCredits({\n department: 'actors',\n });\n\n return (\n <EpisodeEditorLayout>\n <TitleCreditsTableHeader query={query} isCrew={false} />\n <CastEditorTable query={query} />\n </EpisodeEditorLayout>\n );\n}\n","import {CastEditorTable} from '@app/admin/titles/title-editor/credits-editor/cast-editor-table';\nimport {TitleEditorLayout} from '@app/admin/titles/title-editor/title-editor-layout';\nimport {useTitleCredits} from '@app/admin/titles/requests/use-title-credits';\nimport {TitleCreditsTableHeader} from '@app/admin/titles/title-editor/credits-editor/title-credits-table-header';\n\nexport function TitleCastEditor() {\n const query = useTitleCredits({\n department: 'actors',\n });\n\n return (\n <TitleEditorLayout>\n <TitleCreditsTableHeader query={query} isCrew={false} />\n <CastEditorTable query={query} />\n </TitleEditorLayout>\n );\n}\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {TitleCredit} from '@app/titles/models/title';\nimport {Trans} from '@common/i18n/trans';\nimport {PersonPoster} from '@app/people/person-poster/person-poster';\nimport React, {Fragment, useContext} from 'react';\nimport {Table, TableBodyProps} from '@common/ui/tables/table';\nimport {TableRow} from '@common/ui/tables/table-row';\nimport {TableContext} from '@common/ui/tables/table-context';\nimport {getCreditsEditorActionColumn} from '@app/admin/titles/title-editor/credits-editor/get-credits-editor-action-column';\nimport {UseInfiniteDataResult} from '@common/ui/infinite-scroll/use-infinite-data';\nimport {CreditsTableQueryIndicator} from '@app/admin/titles/title-editor/credits-editor/credits-table-query-indicator';\n\nconst columnConfig: ColumnConfig<TitleCredit>[] = [\n {\n key: 'name',\n header: () => <Trans message=\"Person\" />,\n visibleInMode: 'all',\n body: credit => (\n <div className=\"flex items-center gap-12\">\n <PersonPoster rounded person={credit} size=\"w-44\" />\n <div className=\"overflow-hidden min-w-0\">{credit.name}</div>\n </div>\n ),\n },\n {\n key: 'department',\n header: () => <Trans message=\"Department\" />,\n body: credit => credit.pivot.department,\n },\n {\n key: 'job',\n header: () => <Trans message=\"Job\" />,\n body: credit => credit.pivot.job,\n },\n getCreditsEditorActionColumn(),\n];\n\ninterface Props {\n query: UseInfiniteDataResult<TitleCredit>;\n}\nexport function CrewEditorTable({query}: Props) {\n return (\n <Fragment>\n <Table\n enableSelection={false}\n columns={columnConfig}\n data={query.items}\n cellHeight=\"h-54\"\n tableBody={<CreditsTableBody />}\n />\n <CreditsTableQueryIndicator query={query} />\n </Fragment>\n );\n}\n\nfunction CreditsTableBody({renderRowAs}: TableBodyProps) {\n const {data} = useContext(TableContext);\n return (\n <Fragment>\n {data.map((item, rowIndex) => (\n <TableRow\n item={item}\n index={rowIndex}\n // use pivot id for key because some person might\n // appear multiple times with different department\n key={(item as TitleCredit).pivot.id}\n renderAs={renderRowAs}\n />\n ))}\n </Fragment>\n );\n}\n","import {TitleEditorLayout} from '@app/admin/titles/title-editor/title-editor-layout';\nimport {useTitleCredits} from '@app/admin/titles/requests/use-title-credits';\nimport {CrewEditorTable} from '@app/admin/titles/title-editor/credits-editor/crew-editor-table';\nimport {TitleCreditsTableHeader} from '@app/admin/titles/title-editor/credits-editor/title-credits-table-header';\n\nexport function TitleCrewEditor() {\n const query = useTitleCredits({\n crewOnly: 'true',\n });\n return (\n <TitleEditorLayout>\n <TitleCreditsTableHeader query={query} isCrew />\n <CrewEditorTable query={query} />\n </TitleEditorLayout>\n );\n}\n","import {CastEditorTable} from '@app/admin/titles/title-editor/credits-editor/cast-editor-table';\nimport {useTitleCredits} from '@app/admin/titles/requests/use-title-credits';\nimport {SeasonEditorLayout} from '@app/admin/titles/title-editor/seasons-editor/season-editor-layout';\nimport {TitleCreditsTableHeader} from '@app/admin/titles/title-editor/credits-editor/title-credits-table-header';\n\nexport function SeasonCastEditor() {\n const query = useTitleCredits({\n department: 'actors',\n });\n return (\n <SeasonEditorLayout>\n <TitleCreditsTableHeader query={query} isCrew={false} />\n <CastEditorTable query={query} />\n </SeasonEditorLayout>\n );\n}\n","import {useTitleCredits} from '@app/admin/titles/requests/use-title-credits';\nimport {SeasonEditorLayout} from '@app/admin/titles/title-editor/seasons-editor/season-editor-layout';\nimport {TitleCreditsTableHeader} from '@app/admin/titles/title-editor/credits-editor/title-credits-table-header';\nimport {CrewEditorTable} from '@app/admin/titles/title-editor/credits-editor/crew-editor-table';\n\nexport function SeasonCrewEditor() {\n const query = useTitleCredits({\n crewOnly: 'true',\n });\n return (\n <SeasonEditorLayout>\n <TitleCreditsTableHeader query={query} isCrew />\n <CrewEditorTable query={query} />\n </SeasonEditorLayout>\n );\n}\n","import React from 'react';\nimport {EpisodeEditorLayout} from '@app/admin/titles/title-editor/episode-editor/episode-editor-layout';\nimport {useTitleCredits} from '@app/admin/titles/requests/use-title-credits';\nimport {TitleCreditsTableHeader} from '@app/admin/titles/title-editor/credits-editor/title-credits-table-header';\nimport {CrewEditorTable} from '@app/admin/titles/title-editor/credits-editor/crew-editor-table';\n\nexport function EpisodeCrewEditor() {\n const query = useTitleCredits({\n crewOnly: 'true',\n });\n\n return (\n <EpisodeEditorLayout>\n <TitleCreditsTableHeader query={query} isCrew />\n <CrewEditorTable query={query} />\n </EpisodeEditorLayout>\n );\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {useParams} from 'react-router-dom';\nimport {Keyword} from '@app/titles/models/keyword';\nimport {Genre} from '@app/titles/models/genre';\nimport {ProductionCountry} from '@app/titles/models/production-country';\n\ninterface Response extends BackendResponse {}\n\nexport type TitleTag = Keyword | Genre | ProductionCountry;\n\nexport function useDetachTitleTag(tag: TitleTag) {\n const {titleId} = useParams();\n return useMutation({\n mutationFn: () => detachTag(titleId!, tag),\n onSuccess: async () => {\n await queryClient.invalidateQueries({queryKey: ['titles', `${titleId}`]});\n toast(message('Tag detached'));\n },\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction detachTag(titleId: number | string, tag: TitleTag): Promise<Response> {\n return apiClient\n .delete(`titles/${titleId}/tags/${tag.model_type}/${tag.id}`)\n .then(r => r.data);\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {useParams} from 'react-router-dom';\nimport {TitleTag} from '@app/admin/titles/requests/use-detach-title-tag';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\n\ninterface Response extends BackendResponse {}\n\nexport interface AttachTitleTagPayload {\n tag_name: string;\n}\n\nexport function useAttachTitleTag(\n form: UseFormReturn<AttachTitleTagPayload>,\n tagType: TitleTag['model_type'],\n) {\n const {titleId} = useParams();\n return useMutation({\n mutationFn: (payload: AttachTitleTagPayload) =>\n attachTag(titleId!, tagType, payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: ['titles', `${titleId}`],\n });\n toast(message('Tag attached'));\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction attachTag(\n titleId: number | string,\n tagType: TitleTag['model_type'],\n payload: AttachTitleTagPayload,\n): Promise<Response> {\n return apiClient\n .post(`titles/${titleId}/tags/${tagType}`, payload)\n .then(r => r.data);\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Form} from '@common/ui/forms/form';\nimport {useForm} from 'react-hook-form';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {TitleTag} from '@app/admin/titles/requests/use-detach-title-tag';\nimport React, {useState} from 'react';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {FormComboBox} from '@common/ui/forms/combobox/form-combobox';\nimport {useNormalizedModels} from '@common/users/queries/use-normalized-models';\nimport {\n AttachTitleTagPayload,\n useAttachTitleTag,\n} from '@app/admin/titles/requests/use-attach-title-tag';\n\ninterface Props {\n type: TitleTag['model_type'];\n}\nexport function AddTitleTagDialog({type}: Props) {\n const {formId, close} = useDialogContext();\n const form = useForm<AttachTitleTagPayload>();\n const attachTag = useAttachTitleTag(form, type);\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Add :name\" values={{name: type.replace('_', ' ')}} />\n </DialogHeader>\n <DialogBody>\n <Form\n id={formId}\n form={form}\n onSubmit={values => {\n attachTag.mutate(values, {onSuccess: () => close()});\n }}\n >\n <NameField type={type} />\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button onClick={() => close()}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n form={formId}\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n disabled={attachTag.isPending}\n >\n <Trans message=\"Add\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n\ninterface NameFieldProps {\n type: TitleTag['model_type'];\n}\nfunction NameField({type}: NameFieldProps) {\n const [query, setQuery] = useState('');\n const {isFetching, data} = useNormalizedModels(`normalized-models/${type}`, {\n query,\n });\n return (\n <FormComboBox\n isAsync\n name=\"tag_name\"\n isLoading={isFetching}\n inputValue={query}\n onInputValueChange={setQuery}\n items={data?.results}\n allowCustomValue\n autoFocus\n >\n {item => (\n <Item key={item.id} value={item.name} textLabel={item.name}>\n <Trans message={item.description || item.name} />\n </Item>\n )}\n </FormComboBox>\n );\n}\n","import {TitleEditorLayout} from '@app/admin/titles/title-editor/title-editor-layout';\nimport {ColumnConfig} from '@common/datatable/column-config';\nimport {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport {useOutletContext} from 'react-router-dom';\nimport {Title} from '@app/titles/models/title';\nimport {Table} from '@common/ui/tables/table';\nimport {\n TitleTag,\n useDetachTitleTag,\n} from '@app/admin/titles/requests/use-detach-title-tag';\nimport {Button} from '@common/ui/buttons/button';\nimport {AddIcon} from '@common/icons/material/Add';\nimport {AddTitleTagDialog} from '@app/admin/titles/title-editor/title-tags-editor/add-title-tag-dialog';\nimport {GENRE_MODEL} from '@app/titles/models/genre';\nimport {KEYWORD_MODEL} from '@app/titles/models/keyword';\nimport {PRODUCTION_COUNTRY_MODEL} from '@app/titles/models/production-country';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {CloseIcon} from '@common/icons/material/Close';\n\nconst columnConfig: ColumnConfig<TitleTag>[] = [\n {\n key: 'name',\n header: () => <Trans message=\"ID\" />,\n visibleInMode: 'all',\n body: tag => <span>{tag.name}</span>,\n },\n {\n key: 'display_name',\n header: () => <Trans message=\"Display name\" />,\n body: tag => <span>{tag.display_name}</span>,\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n align: 'end',\n width: 'w-42 flex-shrink-0',\n visibleInMode: 'all',\n body: tag => (\n <DialogTrigger type=\"modal\">\n <IconButton className=\"text-muted\">\n <CloseIcon />\n </IconButton>\n <DetachTagDialog tag={tag} />\n </DialogTrigger>\n ),\n },\n];\n\ninterface Props {\n type: TitleTag['model_type'];\n}\nexport function TitleTagsEditor({type}: Props) {\n const data = useTableData({type});\n return (\n <TitleEditorLayout>\n <div className=\"mb-14\">\n <DialogTrigger type=\"modal\">\n <Button variant=\"outline\" color=\"primary\" startIcon={<AddIcon />}>\n <Trans\n message=\"Add :name\"\n values={{name: type.replace('_', ' ')}}\n />\n </Button>\n <AddTitleTagDialog type={type} />\n </DialogTrigger>\n </div>\n <Table\n enableSelection={false}\n columns={columnConfig}\n data={data as any}\n />\n </TitleEditorLayout>\n );\n}\n\nfunction useTableData({type}: Props) {\n const title = useOutletContext<Title>();\n switch (type) {\n case GENRE_MODEL:\n return title.genres;\n case KEYWORD_MODEL:\n return title.keywords;\n case PRODUCTION_COUNTRY_MODEL:\n return title.production_countries;\n }\n}\n\ninterface DetachTagDialogProps {\n tag: TitleTag;\n}\nfunction DetachTagDialog({tag}: DetachTagDialogProps) {\n const {close} = useDialogContext();\n const detachTag = useDetachTitleTag(tag);\n const modelName = tag.model_type.replace('_', ' ');\n return (\n <ConfirmationDialog\n isLoading={detachTag.isPending}\n isDanger\n title={<Trans message=\"Detach :name\" values={{name: modelName}} />}\n body={\n <Trans\n message=\"Are you sure you want to detach this :name?\"\n values={{name: modelName}}\n />\n }\n confirm={<Trans message=\"Detach\" />}\n onConfirm={() => {\n detachTag.mutate(undefined, {\n onSuccess: () => close(),\n });\n }}\n />\n );\n}\n","import {useOutletContext} from 'react-router-dom';\nimport {Title} from '@app/titles/models/title';\nimport {TitleEditorLayout} from '@app/admin/titles/title-editor/title-editor-layout';\nimport {CommentsDatatablePage} from '@common/comments/comments-datatable-page/comments-datatable-page';\n\nexport function TitleCommentsEditor() {\n const title = useOutletContext<Title>();\n return (\n <TitleEditorLayout>\n <CommentsDatatablePage hideTitle commentable={title} />\n </TitleEditorLayout>\n );\n}\n","export default \"__VITE_ASSET__c6019212__\"","import {ColumnConfig} from '@common/datatable/column-config';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Link} from 'react-router-dom';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport React from 'react';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {PersonPoster} from '@app/people/person-poster/person-poster';\nimport {Person} from '@app/titles/models/person';\nimport {PersonLink} from '@app/people/person-link';\nimport {KnownForCompact} from '@app/people/known-for-compact';\n\nexport const PeopleDatatableColumns: ColumnConfig<Person>[] = [\n {\n key: 'name',\n allowsSorting: true,\n width: 'flex-3',\n visibleInMode: 'all',\n header: () => <Trans message=\"Person\" />,\n body: person => (\n <div className=\"flex items-center gap-12\">\n <PersonPoster person={person} srcSize=\"sm\" size=\"w-32\" rounded />\n <div className=\"overflow-hidden min-w-0\">\n <div className=\"overflow-hidden overflow-ellipsis\">\n <PersonLink person={person} target=\"_blank\" />\n </div>\n <div className=\"text-muted text-xs overflow-hidden overflow-ellipsis\">\n <KnownForCompact\n person={person}\n linkTarget=\"_blank\"\n linkColor=\"inherit\"\n />\n </div>\n </div>\n </div>\n ),\n },\n {\n key: 'birth_date',\n allowsSorting: true,\n header: () => <Trans message=\"Birth date\" />,\n body: person => <FormattedDate date={person.birth_date} />,\n },\n {\n key: 'views',\n allowsSorting: true,\n header: () => <Trans message=\"Page views\" />,\n body: person =>\n person.views ? <FormattedNumber value={person.views} /> : null,\n width: 'w-124 flex-shrink-0',\n },\n {\n key: 'popularity',\n allowsSorting: true,\n header: () => <Trans message=\"Popularity\" />,\n body: person =>\n person.popularity ? <FormattedNumber value={person.popularity} /> : null,\n width: 'w-124 flex-shrink-0',\n },\n {\n key: 'updated_at',\n allowsSorting: true,\n width: 'w-124 flex-shrink-0',\n header: () => <Trans message=\"Last updated\" />,\n body: person =>\n person.updated_at ? <FormattedDate date={person.updated_at} /> : '',\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n visibleInMode: 'all',\n align: 'end',\n width: 'w-42 flex-shrink-0',\n body: video => (\n <Link to={`${video.id}/edit/primary-facts`} className=\"text-muted\">\n <Tooltip label={<Trans message=\"Edit\" />}>\n <IconButton size=\"md\">\n <EditIcon />\n </IconButton>\n </Tooltip>\n </Link>\n ),\n },\n];\n","import {\n ALL_PRIMITIVE_OPERATORS,\n BackendFilter,\n FilterControlType,\n FilterOperator,\n} from '@common/datatable/filters/backend-filter';\nimport {message} from '@common/i18n/message';\nimport {\n createdAtFilter,\n timestampFilter,\n updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\n\nexport const PeopleDatatableFilters: BackendFilter[] = [\n {\n key: 'known_for',\n label: message('Known for'),\n description: message('What role is person known for'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: 'acting',\n options: [\n {\n label: message('Acting'),\n key: 'acting',\n value: 'acting',\n },\n {\n label: message('Directing'),\n key: 'directing',\n value: 'directing',\n },\n {\n label: message('Production'),\n key: 'production',\n value: 'production',\n },\n {label: message('Writing'), key: 'writing', value: 'writing'},\n {label: message('Crew'), key: 'crew', value: 'crew'},\n {label: message('Art'), key: 'art', value: 'art'},\n {\n label: message('Costume & Make-Up'),\n key: 'Costume & Make-Up',\n value: 'Costume & Make-Up',\n },\n {label: message('Camera'), key: 'camera', value: 'camera'},\n {label: message('Editing'), key: 'editing', value: 'editing'},\n {\n label: message('Visual Effects'),\n key: 'visual effects',\n value: 'visual effects',\n },\n {label: message('Sound'), key: 'sound', value: 'sound'},\n {label: message('Lighting'), key: 'lighting', value: 'lighting'},\n {label: message('Creator'), key: 'creator', value: 'creator'},\n ],\n },\n },\n {\n key: 'gender',\n label: message('Gender'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: 'male',\n options: [\n {\n label: message('Male'),\n key: 'male',\n value: 'male',\n },\n {\n label: message('Female'),\n key: 'female',\n value: 'female',\n },\n ],\n },\n },\n {\n key: 'poster',\n label: message('No poster'),\n description: message('Whether person has a poster'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.BooleanToggle,\n defaultValue: null,\n },\n },\n {\n key: 'views',\n label: message('Page views'),\n description: message('Number of unique page views'),\n defaultOperator: FilterOperator.lte,\n operators: ALL_PRIMITIVE_OPERATORS,\n control: {\n type: FilterControlType.Input,\n inputType: 'number',\n minValue: 1,\n defaultValue: 100,\n },\n },\n timestampFilter({\n key: 'birth_date',\n label: message('Birth date'),\n description: message('Date person was born'),\n }),\n timestampFilter({\n key: 'death_date',\n label: message('Death date'),\n description: message('Date person died'),\n }),\n createdAtFilter({\n description: message('Date person was created'),\n }),\n updatedAtFilter({\n description: message('Date person was last updated'),\n }),\n];\n","import React, {Fragment} from 'react';\nimport {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {Trans} from '@common/i18n/trans';\nimport {DeleteSelectedItemsAction} from '@common/datatable/page/delete-selected-items-action';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport awardsImage from './awards.svg';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {Link} from 'react-router-dom';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {PublishIcon} from '@common/icons/material/Publish';\nimport {ImportSingleFromTmdbDialog} from '@app/admin/titles/import/import-single-from-tmdb-dialog';\nimport {PeopleDatatableColumns} from '@app/admin/people/people-datatable-columns';\nimport {PeopleDatatableFilters} from '@app/admin/people/people-datatable-filters';\nimport {PERSON_MODEL} from '@app/titles/models/person';\n\nexport function PeopleDatatablePage() {\n return (\n <DataTablePage\n endpoint=\"people\"\n title={<Trans message=\"People\" />}\n columns={PeopleDatatableColumns}\n filters={PeopleDatatableFilters}\n actions={<Actions />}\n selectedActions={<DeleteSelectedItemsAction />}\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={awardsImage}\n title={<Trans message=\"No people have been created yet\" />}\n filteringTitle={<Trans message=\"No matching people\" />}\n />\n }\n />\n );\n}\n\nfunction Actions() {\n const {tmdb_is_setup} = useSettings();\n const navigate = useNavigate();\n return (\n <Fragment>\n {tmdb_is_setup && (\n <DialogTrigger\n type=\"modal\"\n onClose={item => {\n if (item) {\n navigate(`/admin/people/${item.id}/edit/primary-facts`);\n }\n }}\n >\n <Tooltip label={<Trans message=\"Import using TheMovieDB ID\" />}>\n <IconButton\n variant=\"outline\"\n color=\"primary\"\n className=\"flex-shrink-0\"\n size=\"sm\"\n >\n <PublishIcon />\n </IconButton>\n </Tooltip>\n <ImportSingleFromTmdbDialog modelType={PERSON_MODEL} />\n </DialogTrigger>\n )}\n <DataTableAddItemButton elementType={Link} to=\"new\">\n <Trans message=\"Add person\" />\n </DataTableAddItemButton>\n </Fragment>\n );\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {Person} from '@app/titles/models/person';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\n\ninterface Response extends BackendResponse {\n person: Person;\n}\n\nexport interface CreatePersonPayload {\n name: string;\n known_for: string;\n poster: string;\n birth_date: string;\n death_date: string;\n birth_place: string;\n description: string;\n gender: string;\n popularity: number;\n}\n\nexport function useCreatePerson(form: UseFormReturn<CreatePersonPayload>) {\n return useMutation({\n mutationFn: (payload: CreatePersonPayload) => createPerson(payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({queryKey: ['people']});\n toast(message('Person created'));\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction createPerson(payload: CreatePersonPayload): Promise<Response> {\n return apiClient.post(`people`, payload).then(r => r.data);\n}\n","import React, {Fragment, useMemo} from 'react';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\nimport {Trans} from '@common/i18n/trans';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {FormDatePicker} from '@common/ui/forms/input-field/date/date-picker/date-picker';\nimport {FormSelect, Option} from '@common/ui/forms/select/select';\nimport {useValueLists} from '@common/http/value-lists';\nimport {Item} from '@common/ui/forms/listbox/item';\n\nexport function PersonPrimaryFactsForm() {\n return (\n <Fragment>\n <div className=\"mb-24 gap-24 md:flex\">\n <FormImageSelector\n variant=\"square\"\n previewSize=\"w-204 aspect-poster\"\n name=\"poster\"\n diskPrefix=\"person-posters\"\n label={<Trans message=\"Poster\" />}\n showRemoveButton\n />\n <div className=\"flex-auto max-md:mt-24\">\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Name\" />}\n className=\"mb-24\"\n required\n />\n <KnownForField />\n <FormDatePicker\n name=\"birth_date\"\n label={<Trans message=\"Birth date\" />}\n className=\"mb-24\"\n granularity=\"day\"\n />\n <FormDatePicker\n name=\"death_date\"\n label={<Trans message=\"Death date\" />}\n granularity=\"day\"\n />\n </div>\n </div>\n <FormTextField\n name=\"description\"\n label={<Trans message=\"Biography\" />}\n inputElementType=\"textarea\"\n rows={4}\n className=\"mb-24\"\n />\n <div className=\"mb-24 items-center gap-24 md:flex\">\n <FormTextField\n name=\"birth_place\"\n label={<Trans message=\"Birth place\" />}\n className=\"flex-1 max-md:mb-24\"\n />\n </div>\n <div className=\"mb-24 items-center gap-24 md:flex\">\n <FormSelect\n name=\"gender\"\n label={<Trans message=\"Gender\" />}\n className=\"flex-1 max-md:mb-24\"\n selectionMode=\"single\"\n >\n <Option value=\"male\">\n <Trans message=\"Male\" />\n </Option>\n <Option value=\"female\">\n <Trans message=\"Female\" />\n </Option>\n </FormSelect>\n </div>\n <div className=\"mb-24 items-center gap-24 md:flex\">\n <FormTextField\n name=\"popularity\"\n label={<Trans message=\"Popularity\" />}\n type=\"number\"\n min={1}\n className=\"flex-1 max-md:mb-24\"\n />\n </div>\n </Fragment>\n );\n}\n\nfunction KnownForField() {\n const {data} = useValueLists(['tmdbDepartments']);\n const departments = useMemo(() => {\n return data?.tmdbDepartments.map(item => {\n if (item.department === 'Actors') {\n return {department: 'Acting'};\n }\n return {department: item.department};\n });\n }, [data]);\n\n return (\n <FormSelect\n name=\"known_for\"\n label={<Trans message=\"Known for\" />}\n required\n items={departments}\n className=\"mb-24\"\n selectionMode=\"single\"\n showSearchField\n >\n {item => (\n <Item value={item.department}>\n <Trans message={item.department} />\n </Item>\n )}\n </FormSelect>\n );\n}\n","import {useForm} from 'react-hook-form';\nimport {\n CreatePersonPayload,\n useCreatePerson,\n} from '@app/admin/people/requests/use-create-person';\nimport {CrupdateResourceLayout} from '@common/admin/crupdate-resource-layout';\nimport {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {PersonPrimaryFactsForm} from '@app/admin/people/crupdate/person-primary-facts-form';\n\nexport function CreatePersonPage() {\n const navigate = useNavigate();\n const form = useForm<CreatePersonPayload>({\n defaultValues: {\n gender: 'female',\n known_for: 'Acting',\n popularity: 3,\n },\n });\n const createPerson = useCreatePerson(form);\n return (\n <CrupdateResourceLayout\n onSubmit={values =>\n createPerson.mutate(values, {\n onSuccess: response => {\n navigate(`../${response.person.id}/edit`, {\n relative: 'path',\n replace: true,\n });\n },\n })\n }\n form={form}\n title={<Trans message=\"New person\" />}\n isLoading={createPerson.isPending}\n disableSaveWhenNotDirty\n >\n <FileUploadProvider>\n <PersonPrimaryFactsForm />\n </FileUploadProvider>\n </CrupdateResourceLayout>\n );\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {Person} from '@app/titles/models/person';\nimport {CreatePersonPayload} from '@app/admin/people/requests/use-create-person';\nimport {useParams} from 'react-router-dom';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\n\ninterface Response extends BackendResponse {\n person: Person;\n}\n\nexport function useUpdatePerson(form: UseFormReturn<CreatePersonPayload>) {\n const {personId} = useParams();\n return useMutation({\n mutationFn: (payload: CreatePersonPayload) =>\n updatePerson(payload, personId!),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: ['people', `${personId}`],\n });\n toast(message('Person updated'));\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction updatePerson(\n payload: CreatePersonPayload,\n personId: string,\n): Promise<Response> {\n return apiClient.put(`people/${personId}`, payload).then(r => r.data);\n}\n","import {useForm} from 'react-hook-form';\nimport {CreatePersonPayload} from '@app/admin/people/requests/use-create-person';\nimport {CrupdateResourceLayout} from '@common/admin/crupdate-resource-layout';\nimport {Trans} from '@common/i18n/trans';\nimport React, {Fragment} from 'react';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {useUpdatePerson} from '@app/admin/people/requests/use-update-person';\nimport {GetPersonResponse, usePerson} from '@app/people/requests/use-person';\nimport {PageMetaTags} from '@common/http/page-meta-tags';\nimport {PageStatus} from '@common/http/page-status';\nimport {Tabs} from '@common/ui/tabs/tabs';\nimport {TabList} from '@common/ui/tabs/tab-list';\nimport {Tab} from '@common/ui/tabs/tab';\nimport {Link, Outlet, useLocation} from 'react-router-dom';\n\nexport function UpdatePersonPage() {\n const query = usePerson('editPersonPage');\n\n return query.data ? (\n <Fragment>\n <PageMetaTags query={query} />\n <PageContent data={query.data} />\n </Fragment>\n ) : (\n <div className=\"relative h-full w-full\">\n <PageStatus query={query} loaderClassName=\"absolute inset-0 m-auto\" />\n </div>\n );\n}\n\ninterface PageContentProps {\n data: GetPersonResponse;\n}\nfunction PageContent({data}: PageContentProps) {\n const {person} = data;\n const navigate = useNavigate();\n const form = useForm<CreatePersonPayload>({\n defaultValues: {\n name: person.name,\n known_for: person.known_for,\n poster: person.poster,\n birth_date: person.birth_date,\n death_date: person.death_date,\n birth_place: person.birth_place,\n description: person.description,\n gender: person.gender,\n popularity: person.popularity,\n },\n });\n const updatePersonPage = useUpdatePerson(form);\n\n const {pathname} = useLocation();\n const tabName = pathname.split('/').pop();\n const selectedTab = tabName === 'credits' ? 1 : 0;\n\n return (\n <CrupdateResourceLayout\n onSubmit={values =>\n updatePersonPage.mutate(values, {\n onSuccess: () => {\n navigate('../../../', {relative: 'path', replace: true});\n },\n })\n }\n form={form}\n title={<Trans values={{name: person.name}} message=\"Edit “:name“\" />}\n isLoading={updatePersonPage.isPending}\n disableSaveWhenNotDirty\n >\n <Tabs selectedTab={selectedTab}>\n <TabList>\n <Tab\n elementType={Link}\n to={`../primary-facts`}\n relative=\"path\"\n replace\n >\n <Trans message=\"Primary facts\" />\n </Tab>\n <Tab elementType={Link} to={`../credits`} relative=\"path\" replace>\n <Trans message=\"Credits\" />\n </Tab>\n </TabList>\n <div className=\"min-h-512 pt-24\">\n <FileUploadProvider>\n <Outlet context={data} />\n </FileUploadProvider>\n </div>\n </Tabs>\n </CrupdateResourceLayout>\n );\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {titleCreditsQueryKey} from '@app/admin/titles/requests/use-title-credits';\nimport {PersonCredit} from '@app/titles/models/title';\nimport {useParams} from 'react-router-dom';\n\ninterface Response extends BackendResponse {}\n\nexport function useDeletePersonCredit(credit: PersonCredit) {\n const {personId} = useParams();\n return useMutation({\n mutationFn: () =>\n deleteCredit(credit.id, undefined, undefined, credit.pivot.id),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: titleCreditsQueryKey(credit.id),\n });\n await queryClient.invalidateQueries({\n queryKey: ['people', `${personId}`],\n });\n toast(message('Credit deleted'));\n },\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction deleteCredit(\n titleId: number | string,\n season: string | undefined,\n episode: string | undefined,\n creditId: number | string,\n): Promise<Response> {\n return apiClient\n .delete(`titles/${titleId}/credits/${creditId}`, {\n params: {season, episode},\n })\n .then(r => r.data);\n}\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {PersonCredit, TitleCredit} from '@app/titles/models/title';\nimport {Trans} from '@common/i18n/trans';\nimport React, {Fragment, useContext, useMemo} from 'react';\nimport {Table, TableBodyProps} from '@common/ui/tables/table';\nimport {TableRow} from '@common/ui/tables/table-row';\nimport {TableContext} from '@common/ui/tables/table-context';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {DeleteIcon} from '@common/icons/material/Delete';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport {useOutletContext} from 'react-router-dom';\nimport {GetPersonResponse} from '@app/people/requests/use-person';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {RecentActorsIcon} from '@common/icons/material/RecentActors';\nimport {TitleLink} from '@app/titles/title-link';\nimport {useDeletePersonCredit} from '@app/admin/people/requests/use-delete-person-credit';\n\nconst columnConfig: ColumnConfig<PersonCredit>[] = [\n {\n key: 'name',\n header: () => <Trans message=\"Credit\" />,\n visibleInMode: 'all',\n width: 'flex-3',\n body: credit => (\n <div className=\"flex items-center gap-12\">\n <TitlePoster title={credit} srcSize=\"sm\" size=\"w-32\" />\n <div className=\"overflow-hidden min-w-0\">\n <div className=\"overflow-hidden overflow-ellipsis\">\n <TitleLink title={credit} target=\"_blank\" />\n </div>\n <div className=\"text-muted text-xs overflow-hidden overflow-ellipsis\">\n {credit.is_series ? (\n <Trans message=\"Series\" />\n ) : (\n <Trans message=\"Movie\" />\n )}\n </div>\n </div>\n </div>\n ),\n },\n {\n key: 'year',\n header: () => <Trans message=\"Year\" />,\n body: credit => credit.year,\n },\n {\n key: 'character',\n header: () => <Trans message=\"Character\" />,\n body: credit => (credit.pivot.character ? credit.pivot.character : '-'),\n },\n {\n key: 'department',\n header: () => <Trans message=\"Department\" />,\n body: credit => (\n <span className=\"capitalize\">{credit.pivot.department}</span>\n ),\n },\n {\n key: 'job',\n header: () => <Trans message=\"Job\" />,\n body: credit => <span className=\"capitalize\">{credit.pivot.job}</span>,\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n align: 'end',\n width: 'w-42 flex-shrink-0',\n visibleInMode: 'all',\n body: item => (\n <div className=\"text-muted\">\n <DeleteButton credit={item} />\n </div>\n ),\n },\n];\n\nexport function PersonCreditsEditor() {\n const data = useOutletContext<GetPersonResponse>();\n const credits = useMemo(() => {\n return Object.values(data.credits)\n .flat()\n .filter(credit => credit.pivot != null);\n }, [data.credits]);\n return (\n <Fragment>\n <Table\n enableSelection={false}\n columns={columnConfig}\n data={credits}\n cellHeight=\"h-54\"\n tableBody={<CreditsTableBody />}\n />\n {!credits.length && <NoCreditsMessage />}\n </Fragment>\n );\n}\n\nfunction CreditsTableBody({renderRowAs}: TableBodyProps) {\n const {data} = useContext(TableContext);\n return (\n <Fragment>\n {data.map((item, rowIndex) => (\n <TableRow\n item={item}\n index={rowIndex}\n // use pivot id for key because some person might\n // appear multiple times with different department\n key={(item as TitleCredit).pivot.id}\n renderAs={renderRowAs}\n />\n ))}\n </Fragment>\n );\n}\n\nfunction NoCreditsMessage() {\n return (\n <IllustratedMessage\n className=\"mt-40\"\n imageMargin=\"mb-8\"\n image={\n <div className=\"text-muted\">\n <RecentActorsIcon size=\"xl\" />\n </div>\n }\n imageHeight=\"h-auto\"\n title={<Trans message=\"No credits have been added yet\" />}\n />\n );\n}\n\ninterface DeleteButtonProps {\n credit: PersonCredit;\n}\nfunction DeleteButton({credit}: DeleteButtonProps) {\n const deleteCredit = useDeletePersonCredit(credit);\n return (\n <DialogTrigger type=\"modal\">\n <IconButton>\n <DeleteIcon />\n </IconButton>\n <ConfirmationDialog\n isDanger\n title={<Trans message=\"Delete credit\" />}\n body={<Trans message=\"Are you sure you want to delete this credit?\" />}\n confirm={<Trans message=\"Delete\" />}\n isLoading={deleteCredit.isPending}\n onConfirm={() => deleteCredit.mutate()}\n />\n </DialogTrigger>\n );\n}\n","import React, {useState} from 'react';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {useFormContext} from 'react-hook-form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport clsx from 'clsx';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {CreateCustomPagePayload} from '@common/admin/custom-pages/requests/use-create-custom-page';\n\nexport function ArticleEditorTitle() {\n const [editingTitle, setEditingTitle] = useState(false);\n const {trans} = useTrans();\n const form = useFormContext<CreateCustomPagePayload>();\n const watchedTitle = form.watch('title');\n\n const titlePlaceholder = trans({message: 'Title'});\n\n if (editingTitle) {\n return (\n <FormTextField\n placeholder={titlePlaceholder}\n autoFocus\n className=\"mb-30\"\n onBlur={() => {\n setEditingTitle(false);\n }}\n name=\"title\"\n required\n />\n );\n }\n return (\n <h1\n tabIndex={0}\n onClick={() => {\n setEditingTitle(true);\n }}\n onFocus={() => {\n setEditingTitle(true);\n }}\n className={clsx(\n 'hover:bg-primary/focus rounded cursor-pointer',\n !watchedTitle && 'text-muted'\n )}\n >\n {watchedTitle || titlePlaceholder}\n <EditIcon className=\"icon-sm mx-8 mt-8 align-top text-muted\" />\n </h1>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const UndoIcon = createSvgIcon(\n <path d=\"M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z\" />\n, 'UndoOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const RedoIcon = createSvgIcon(\n <path d=\"M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z\" />\n, 'RedoOutlined');\n","import React from 'react';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {UndoIcon} from '../../icons/material/Undo';\nimport {RedoIcon} from '../../icons/material/Redo';\nimport {MenubarButtonProps} from './menubar-button-props';\n\nexport function HistoryButtons({editor}: MenubarButtonProps) {\n return (\n <span>\n <IconButton\n size=\"md\"\n disabled={!editor.can().undo()}\n onClick={() => {\n editor.commands.focus();\n editor.commands.undo();\n }}\n >\n <UndoIcon />\n </IconButton>\n <IconButton\n size=\"md\"\n disabled={!editor.can().redo()}\n onClick={() => {\n editor.commands.focus();\n editor.commands.redo();\n }}\n >\n <RedoIcon />\n </IconButton>\n </span>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const CodeIcon = createSvgIcon(\n <path d=\"M9.4 16.6 4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0 4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z\" />\n, 'CodeOutlined');\n","import {Button} from '../../ui/buttons/button';\nimport {CodeIcon} from '../../icons/material/Code';\nimport {Trans} from '../../i18n/trans';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {AceDialog} from '../../ace-editor/ace-dialog';\nimport {Editor} from '@tiptap/react';\nimport React from 'react';\n\ninterface ModeButtonProps {\n editor: Editor;\n}\nexport function ModeButton({editor}: ModeButtonProps) {\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={newValue => {\n if (newValue != null) {\n editor?.commands.setContent(newValue);\n }\n }}\n >\n <Button variant=\"text\" startIcon={<CodeIcon />}>\n <Trans message=\"Source\" />\n </Button>\n <AceDialog\n title={<Trans message=\"Source code\" />}\n defaultValue={editor.getHTML()}\n />\n </DialogTrigger>\n );\n}\n","export function Divider() {\n return <div className=\"self-stretch mx-4 w-1 bg-divider flex-shrink-0\" />;\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatBoldIcon = createSvgIcon(\n <path d=\"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\" />\n, 'FormatBoldOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatItalicIcon = createSvgIcon(\n <path d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4h-8z\" />\n, 'FormatItalicOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatUnderlinedIcon = createSvgIcon(\n <path d=\"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\" />\n, 'FormatUnderlinedOutlined');\n","import React from 'react';\nimport clsx from 'clsx';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {FormatBoldIcon} from '../../icons/material/FormatBold';\nimport {FormatItalicIcon} from '../../icons/material/FormatItalic';\nimport {FormatUnderlinedIcon} from '../../icons/material/FormatUnderlined';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\n\nexport function FontStyleButtons({editor, size}: MenubarButtonProps) {\n return (\n <span className={clsx('flex-shrink-0 whitespace-nowrap')}>\n <Tooltip label={<Trans message=\"Bold\" />}>\n <IconButton\n size={size}\n color={editor.isActive('bold') ? 'primary' : null}\n onClick={() => {\n editor.commands.focus();\n editor.commands.toggleBold();\n }}\n >\n <FormatBoldIcon />\n </IconButton>\n </Tooltip>\n <Tooltip label={<Trans message=\"Italic\" />}>\n <IconButton\n size={size}\n color={editor.isActive('italic') ? 'primary' : null}\n onClick={() => {\n editor.commands.focus();\n editor.commands.toggleItalic();\n }}\n >\n <FormatItalicIcon />\n </IconButton>\n </Tooltip>\n <Tooltip label={<Trans message=\"Underline\" />}>\n <IconButton\n size={size}\n color={editor.isActive('underline') ? 'primary' : null}\n onClick={() => {\n editor.commands.focus();\n editor.commands.toggleUnderline();\n }}\n >\n <FormatUnderlinedIcon />\n </IconButton>\n </Tooltip>\n </span>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatListBulletedIcon = createSvgIcon(\n <path d=\"M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z\" />\n, 'FormatListBulletedOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatListNumberedIcon = createSvgIcon(\n <path d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\" />\n, 'FormatListNumberedOutlined');\n","import React from 'react';\nimport clsx from 'clsx';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {FormatListBulletedIcon} from '../../icons/material/FormatListBulleted';\nimport {FormatListNumberedIcon} from '../../icons/material/FormatListNumbered';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\n\nexport function ListButtons({editor, size}: MenubarButtonProps) {\n const bulletActive = editor.isActive('bulletList');\n const orderedActive = editor.isActive('orderedList');\n return (\n <span className={clsx('flex-shrink-0', 'whitespace-nowrap')}>\n <Tooltip label={<Trans message=\"Bulleted list\" />}>\n <IconButton\n size={size}\n color={bulletActive ? 'primary' : null}\n onClick={() => {\n editor.commands.focus();\n editor.commands.toggleBulletList();\n }}\n >\n <FormatListBulletedIcon />\n </IconButton>\n </Tooltip>\n <Tooltip label={<Trans message=\"Numbered list\" />}>\n <IconButton\n size={size}\n color={orderedActive ? 'primary' : null}\n onClick={() => {\n editor.commands.focus();\n editor.commands.toggleOrderedList();\n }}\n >\n <FormatListNumberedIcon />\n </IconButton>\n </Tooltip>\n </span>\n );\n}\n","import {Editor} from '@tiptap/react';\n\ninterface Props {\n href: string;\n target?: string;\n text?: string;\n}\n\nexport function insertLinkIntoTextEditor(\n editor: Editor,\n {text, target, href}: Props\n) {\n // no selection, insert new link with specified text\n if (editor.state.selection.empty && text) {\n editor.commands.insertContent(\n `<a href=\"${href}\" target=\"${target}\">${text}</a>`\n );\n } else if (!editor.state.selection.empty) {\n // no href provided, remove link from selection\n if (!href) {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n } else {\n // add link to selection\n editor\n .chain()\n .focus()\n .extendMarkRange('link')\n .setLink({href: href, target})\n .run();\n }\n }\n}\n","import {useForm} from 'react-hook-form';\nimport React from 'react';\nimport clsx from 'clsx';\nimport {Form} from '../../ui/forms/form';\nimport {FormTextField} from '../../ui/forms/input-field/text-field/text-field';\nimport {DialogFooter} from '../../ui/overlays/dialog/dialog-footer';\nimport {Button} from '../../ui/buttons/button';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {LinkIcon} from '../../icons/material/Link';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {FormSelect, Option} from '../../ui/forms/select/select';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {Dialog} from '../../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../../ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '../../ui/overlays/dialog/dialog-body';\nimport {Trans} from '../../i18n/trans';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {insertLinkIntoTextEditor} from '@common/text-editor/insert-link-into-text-editor';\n\ninterface FormValue {\n href: string;\n target?: string;\n text?: string;\n}\n\nexport function LinkButton({editor, size}: MenubarButtonProps) {\n return (\n <DialogTrigger type=\"modal\">\n <Tooltip label={<Trans message=\"Insert link\" />}>\n <IconButton size={size} className={clsx('flex-shrink-0')}>\n <LinkIcon />\n </IconButton>\n </Tooltip>\n <LinkDialog editor={editor} />\n </DialogTrigger>\n );\n}\n\nfunction LinkDialog({editor}: MenubarButtonProps) {\n const previousUrl = editor.getAttributes('link').href;\n const previousText = editor.state.doc.textBetween(\n editor.state.selection.from,\n editor.state.selection.to,\n '',\n );\n\n const form = useForm<FormValue>({\n defaultValues: {href: previousUrl, text: previousText, target: '_blank'},\n });\n const {formId, close} = useDialogContext();\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Insert link\" />\n </DialogHeader>\n <DialogBody>\n <Form\n form={form}\n id={formId}\n onSubmit={value => {\n insertLinkIntoTextEditor(editor, value);\n close();\n }}\n >\n <FormTextField\n name=\"href\"\n label={<Trans message=\"URL\" />}\n autoFocus\n type=\"url\"\n className=\"mb-20\"\n />\n <FormTextField\n name=\"text\"\n label={<Trans message=\"Text to display\" />}\n className=\"mb-20\"\n />\n <FormSelect\n selectionMode=\"single\"\n name=\"target\"\n label={<Trans message=\"Open link in...\" />}\n >\n <Option value=\"_self\">\n <Trans message=\"Current window\" />\n </Option>\n <Option value=\"_blank\">\n <Trans message=\"New window\" />\n </Option>\n </FormSelect>\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button onClick={close} variant=\"text\">\n <Trans message=\"Cancel\" />\n </Button>\n <Button type=\"submit\" form={formId} variant=\"flat\" color=\"primary\">\n <Trans message=\"Save\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import React from 'react';\nimport clsx from 'clsx';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {ImageIcon} from '../../icons/material/Image';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {useActiveUpload} from '../../uploads/uploader/use-active-upload';\nimport {UploadInputType} from '../../uploads/types/upload-input-config';\nimport {Disk} from '../../uploads/types/backend-metadata';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\n\nconst TwoMB = 2097152;\n\ninterface Props extends MenubarButtonProps {\n diskPrefix?: string;\n}\n\nexport function ImageButton({editor, size, diskPrefix = 'page_media'}: Props) {\n const {selectAndUploadFile} = useActiveUpload();\n\n const handleUpload = () => {\n selectAndUploadFile({\n showToastOnRestrictionFail: true,\n restrictions: {\n allowedFileTypes: [UploadInputType.image],\n maxFileSize: TwoMB,\n },\n metadata: {\n diskPrefix: diskPrefix,\n disk: Disk.public,\n },\n onSuccess: entry => {\n editor.commands.focus();\n editor.commands.setImage({\n src: entry.url,\n });\n },\n });\n };\n\n return (\n <Tooltip label={<Trans message=\"Insert image\" />}>\n <IconButton\n size={size}\n onClick={handleUpload}\n className={clsx('flex-shrink-0')}\n >\n <ImageIcon />\n </IconButton>\n </Tooltip>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatClearIcon = createSvgIcon(\n <path d=\"M20 8V5H6.39l3 3h1.83l-.55 1.28 2.09 2.1L14.21 8zM3.41 4.86 2 6.27l6.97 6.97L6.5 19h3l1.57-3.66L16.73 21l1.41-1.41z\" />\n, 'FormatClearOutlined');\n","import React from 'react';\nimport clsx from 'clsx';\nimport {FormatClearIcon} from '../../icons/material/FormatClear';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\n\nexport function ClearFormatButton({editor, size}: MenubarButtonProps) {\n return (\n <Tooltip label={<Trans message=\"Clear formatting\" />}>\n <IconButton\n className={clsx('flex-shrink-0')}\n size={size}\n onClick={() => {\n editor.chain().focus().clearNodes().unsetAllMarks().run();\n }}\n >\n <FormatClearIcon />\n </IconButton>\n </Tooltip>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const HorizontalRuleIcon = createSvgIcon(\n <path fillRule=\"evenodd\" d=\"M4 11h16v2H4z\" />\n, 'HorizontalRuleOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PriorityHighIcon = createSvgIcon(\n [<circle cx=\"12\" cy=\"19\" r=\"2\" key=\"0\" />,<path d=\"M10 3h4v12h-4z\" key=\"1\" />,]\n, 'PriorityHighOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const NoteIcon = createSvgIcon(\n <path d=\"M16 4H4c-1.1 0-2 .9-2 2v12.01c0 1.1.9 1.99 2 1.99h16c1.1 0 2-.9 2-2v-8l-6-6zM4 18.01V6h11v5h5v7.01H4z\" />\n, 'NoteOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const SmartDisplayIcon = createSvgIcon(\n [<path d=\"M9.5 7.5v9l7-4.5z\" key=\"0\" />,<path d=\"M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 14.01H4V5.99h16v12.02z\" key=\"1\" />,]\n, 'SmartDisplayOutlined');\n","import React, {useState} from 'react';\nimport {useForm} from 'react-hook-form';\nimport clsx from 'clsx';\nimport {HorizontalRuleIcon} from '../../icons/material/HorizontalRule';\nimport {PriorityHighIcon} from '../../icons/material/PriorityHigh';\nimport {WarningIcon} from '../../icons/material/Warning';\nimport {NoteIcon} from '../../icons/material/Note';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {MoreVertIcon} from '../../icons/material/MoreVert';\nimport {SmartDisplayIcon} from '../../icons/material/SmartDisplay';\nimport {Form} from '../../ui/forms/form';\nimport {FormTextField} from '../../ui/forms/input-field/text-field/text-field';\nimport {DialogFooter} from '../../ui/overlays/dialog/dialog-footer';\nimport {Button} from '../../ui/buttons/button';\nimport {\n Menu,\n MenuItem,\n MenuTrigger,\n} from '../../ui/navigation/menu/menu-trigger';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {Dialog} from '../../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../../ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '../../ui/overlays/dialog/dialog-body';\nimport {Trans} from '../../i18n/trans';\n\nexport function InsertMenuTrigger({editor, size}: MenubarButtonProps) {\n const [dialog, setDialog] = useState<'embed' | false>(false);\n return (\n <>\n <MenuTrigger\n onItemSelected={key => {\n if (key === 'hr') {\n editor.commands.focus();\n editor.commands.setHorizontalRule();\n } else if (key === 'embed') {\n setDialog('embed');\n } else {\n editor.commands.focus();\n editor.commands.addInfo({type: key as any});\n }\n }}\n >\n <IconButton\n variant=\"text\"\n size={size}\n className={clsx('flex-shrink-0')}\n >\n <MoreVertIcon />\n </IconButton>\n <Menu>\n <MenuItem value=\"hr\" startIcon={<HorizontalRuleIcon />}>\n <Trans message=\"Horizontal rule\" />\n </MenuItem>\n <MenuItem value=\"embed\" startIcon={<SmartDisplayIcon />}>\n <Trans message=\"Embed\" />\n </MenuItem>\n <MenuItem value=\"important\" startIcon={<PriorityHighIcon />}>\n <Trans message=\"Important\" />\n </MenuItem>\n <MenuItem value=\"warning\" startIcon={<WarningIcon />}>\n <Trans message=\"Warning\" />\n </MenuItem>\n <MenuItem value=\"success\" startIcon={<NoteIcon />}>\n <Trans message=\"Note\" />\n </MenuItem>\n </Menu>\n </MenuTrigger>\n <DialogTrigger\n type=\"modal\"\n isOpen={!!dialog}\n onClose={() => {\n setDialog(false);\n }}\n >\n <EmbedDialog editor={editor} />\n </DialogTrigger>\n </>\n );\n}\n\nfunction EmbedDialog({editor}: MenubarButtonProps) {\n const previousSrc = editor.getAttributes('embed').src;\n const form = useForm<{src: string}>({\n defaultValues: {src: previousSrc},\n });\n const {formId, close} = useDialogContext();\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Insert link\" />\n </DialogHeader>\n <DialogBody>\n <Form\n form={form}\n id={formId}\n onSubmit={value => {\n editor.commands.setEmbed(value);\n close();\n }}\n >\n <FormTextField\n name=\"src\"\n label={<Trans message=\"Embed URL\" />}\n autoFocus\n type=\"url\"\n required\n />\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button onClick={close} variant=\"text\">\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n type=\"submit\"\n form={formId}\n disabled={!form.formState.isValid}\n variant=\"flat\"\n color=\"primary\"\n >\n <Trans message=\"Add\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {ReactNode} from 'react';\nimport {isMac} from '@react-aria/utils';\n\ninterface Props {\n children: ReactNode;\n modifier?: boolean;\n separator?: string;\n}\nexport function Keyboard({children, modifier, separator = '+'}: Props) {\n const modKey = isMac() ? (\n <span className=\"text-base align-middle\">⌘</span>\n ) : (\n 'Ctrl'\n );\n return (\n <kbd className=\"text-xs text-muted\">\n {modifier && (\n <>\n {modKey}\n {separator}\n </>\n )}\n {children}\n </kbd>\n );\n}\n","import React from 'react';\nimport clsx from 'clsx';\nimport {Button} from '../../ui/buttons/button';\nimport {KeyboardArrowDownIcon} from '../../icons/material/KeyboardArrowDown';\nimport {Keyboard} from '../../ui/keyboard/keyboard';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {\n Menu,\n MenuItem,\n MenuTrigger,\n} from '../../ui/navigation/menu/menu-trigger';\nimport {Trans} from '../../i18n/trans';\n\ntype Level = 1 | 2 | 3 | 4;\n\nexport function FormatMenuTrigger({editor, size}: MenubarButtonProps) {\n return (\n <MenuTrigger\n floatingMinWidth=\"w-256\"\n onItemSelected={key => {\n editor.commands.focus();\n if (typeof key === 'string' && key.startsWith('h')) {\n editor.commands.toggleHeading({\n level: parseInt(key.replace('h', '')) as Level,\n });\n } else if (key === 'code') {\n editor.commands.toggleCode();\n } else if (key === 'strike') {\n editor.commands.toggleStrike();\n } else if (key === 'super') {\n editor.commands.toggleSuperscript();\n } else if (key === 'sub') {\n editor.commands.toggleSubscript();\n } else if (key === 'blockquote') {\n editor.commands.toggleBlockquote();\n } else if (key === 'paragraph') {\n editor.commands.setParagraph();\n }\n }}\n >\n <Button\n className={clsx('flex-shrink-0')}\n variant=\"text\"\n size={size}\n endIcon={<KeyboardArrowDownIcon />}\n >\n <Trans message=\"Format\" />\n </Button>\n <Menu>\n <MenuItem value=\"h1\" endSection={<Keyboard modifier>Alt+1</Keyboard>}>\n <Trans message=\"Heading :number\" values={{number: 1}} />\n </MenuItem>\n <MenuItem value=\"h2\" endSection={<Keyboard modifier>Alt+2</Keyboard>}>\n <Trans message=\"Heading :number\" values={{number: 2}} />\n </MenuItem>\n <MenuItem value=\"h3\" endSection={<Keyboard modifier>Alt+3</Keyboard>}>\n <Trans message=\"Heading :number\" values={{number: 3}} />\n </MenuItem>\n <MenuItem value=\"h4\" endSection={<Keyboard modifier>Alt+4</Keyboard>}>\n <Trans message=\"Heading :number\" values={{number: 4}} />\n </MenuItem>\n <MenuItem value=\"code\" endSection={<Keyboard modifier>E</Keyboard>}>\n <Trans message=\"Code\" />\n </MenuItem>\n <MenuItem\n value=\"strike\"\n endSection={<Keyboard modifier>Shift+X</Keyboard>}\n >\n <Trans message=\"Strikethrough\" />\n </MenuItem>\n <MenuItem\n value=\"super\"\n endSection={\n <Keyboard modifier separator=\" \">\n .\n </Keyboard>\n }\n >\n <Trans message=\"Superscript\" />\n </MenuItem>\n <MenuItem\n value=\"sub\"\n endSection={\n <Keyboard modifier separator=\" \">\n ,\n </Keyboard>\n }\n >\n <Trans message=\"Subscript\" />\n </MenuItem>\n <MenuItem\n value=\"blockquote\"\n endSection={<Keyboard modifier>Shift+B</Keyboard>}\n >\n <Trans message=\"Blockquote\" />\n </MenuItem>\n <MenuItem\n value=\"paragraph\"\n endSection={<Keyboard modifier>Alt+0</Keyboard>}\n >\n <Trans message=\"Paragraph\" />\n </MenuItem>\n </Menu>\n </MenuTrigger>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatColorTextIcon = createSvgIcon(\n <path d=\"M2 20h20v4H2v-4zm3.49-3h2.42l1.27-3.58h5.65L16.09 17h2.42L13.25 3h-2.5L5.49 17zm4.42-5.61 2.03-5.79h.12l2.03 5.79H9.91z\" />\n, 'FormatColorTextOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatColorFillIcon = createSvgIcon(\n <path d=\"M16.56 8.94 7.62 0 6.21 1.41l2.38 2.38-5.15 5.15c-.59.59-.59 1.54 0 2.12l5.5 5.5c.29.29.68.44 1.06.44s.77-.15 1.06-.44l5.5-5.5c.59-.58.59-1.53 0-2.12zM5.21 10 10 5.21 14.79 10H5.21zM19 11.5s-2 2.17-2 3.5c0 1.1.9 2 2 2s2-.9 2-2c0-1.33-2-3.5-2-3.5zM2 20h20v4H2v-4z\" />\n, 'FormatColorFillOutlined');\n","import React, {Fragment, useState} from 'react';\nimport clsx from 'clsx';\nimport {FormatColorTextIcon} from '../../icons/material/FormatColorText';\nimport {ColorPickerDialog} from '../../ui/color-picker/color-picker-dialog';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {FormatColorFillIcon} from '../../icons/material/FormatColorFill';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\n\nexport function ColorButtons({editor, size}: MenubarButtonProps) {\n const [dialog, setDialog] = useState<'text' | 'bg' | false>(false);\n const textActive = editor.getAttributes('textStyle').color;\n const backgroundActive = editor.getAttributes('textStyle').backgroundColor;\n return (\n <Fragment>\n <span className={clsx('flex-shrink-0 whitespace-nowrap')}>\n <IconButton\n size={size}\n color={textActive ? 'primary' : null}\n onClick={() => {\n setDialog('text');\n }}\n >\n <FormatColorTextIcon />\n </IconButton>\n <IconButton\n size={size}\n color={backgroundActive ? 'primary' : null}\n onClick={() => {\n setDialog('bg');\n }}\n >\n <FormatColorFillIcon />\n </IconButton>\n </span>\n <DialogTrigger\n defaultValue={dialog === 'text' ? '#000000' : '#FFFFFF'}\n type=\"modal\"\n isOpen={!!dialog}\n onClose={newValue => {\n if (newValue) {\n if (dialog === 'text') {\n editor.commands.setColor(newValue);\n } else {\n editor.commands.setBackgroundColor(newValue);\n }\n }\n setDialog(false);\n }}\n >\n <ColorPickerDialog />\n </DialogTrigger>\n </Fragment>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatAlignLeftIcon = createSvgIcon(\n <path d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\" />\n, 'FormatAlignLeftOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatAlignCenterIcon = createSvgIcon(\n <path d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\" />\n, 'FormatAlignCenterOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatAlignRightIcon = createSvgIcon(\n <path d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\" />\n, 'FormatAlignRightOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatAlignJustifyIcon = createSvgIcon(\n <path d=\"M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zm0-6v2h18V3H3z\" />\n, 'FormatAlignJustifyOutlined');\n","import clsx from 'clsx';\nimport {ComponentType} from 'react';\nimport {FormatAlignLeftIcon} from '../../icons/material/FormatAlignLeft';\nimport {FormatAlignCenterIcon} from '../../icons/material/FormatAlignCenter';\nimport {FormatAlignRightIcon} from '../../icons/material/FormatAlignRight';\nimport {FormatAlignJustifyIcon} from '../../icons/material/FormatAlignJustify';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {\n Menu,\n MenuItem,\n MenuTrigger,\n} from '../../ui/navigation/menu/menu-trigger';\nimport {Trans} from '../../i18n/trans';\nimport {message} from '../../i18n/message';\n\nconst iconMap = {\n left: {\n icon: FormatAlignLeftIcon,\n label: message('Align left'),\n },\n center: {\n icon: FormatAlignCenterIcon,\n label: message('Align center'),\n },\n right: {\n icon: FormatAlignRightIcon,\n label: message('Align right'),\n },\n justify: {\n icon: FormatAlignJustifyIcon,\n label: message('Justify'),\n },\n};\n\nexport function AlignButtons({editor, size}: MenubarButtonProps) {\n const activeKey = (Object.keys(iconMap).find(key => {\n return editor.isActive({textAlign: key});\n }) || 'left') as keyof typeof iconMap;\n const ActiveIcon: ComponentType = activeKey\n ? iconMap[activeKey].icon\n : iconMap.left.icon;\n\n return (\n <MenuTrigger\n floatingWidth=\"auto\"\n selectionMode=\"single\"\n selectedValue={activeKey}\n onSelectionChange={key => {\n editor.commands.focus();\n editor.commands.setTextAlign(key as string);\n }}\n >\n <IconButton\n size={size}\n color={activeKey ? 'primary' : null}\n className={clsx('flex-shrink-0')}\n >\n <ActiveIcon />\n </IconButton>\n <Menu>\n {Object.entries(iconMap).map(([name, config]) => {\n const Icon = config.icon;\n return (\n <MenuItem\n key={name}\n value={name}\n startIcon={<Icon size=\"md\" />}\n capitalizeFirst\n >\n <Trans message={config.label.message} />\n </MenuItem>\n );\n })}\n </Menu>\n </MenuTrigger>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatIndentDecreaseIcon = createSvgIcon(\n <path d=\"M11 17h10v-2H11v2zm-8-5 4 4V8l-4 4zm0 9h18v-2H3v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\" />\n, 'FormatIndentDecreaseOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatIndentIncreaseIcon = createSvgIcon(\n <path d=\"M3 21h18v-2H3v2zM3 8v8l4-4-4-4zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\" />\n, 'FormatIndentIncreaseOutlined');\n","import React from 'react';\nimport clsx from 'clsx';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {FormatIndentDecreaseIcon} from '../../icons/material/FormatIndentDecrease';\nimport {FormatIndentIncreaseIcon} from '../../icons/material/FormatIndentIncrease';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\n\nexport function IndentButtons({editor, size}: MenubarButtonProps) {\n return (\n <span className={clsx('flex-shrink-0', 'whitespace-nowrap')}>\n <Tooltip label={<Trans message=\"Decrease indent\" />}>\n <IconButton\n size={size}\n onClick={() => {\n editor.commands.focus();\n editor.commands.outdent();\n }}\n >\n <FormatIndentDecreaseIcon />\n </IconButton>\n </Tooltip>\n <Tooltip label={<Trans message=\"Increase indent\" />}>\n <IconButton\n size={size}\n onClick={() => {\n editor.commands.focus();\n editor.commands.indent();\n }}\n >\n <FormatIndentIncreaseIcon />\n </IconButton>\n </Tooltip>\n </span>\n );\n}\n","import React from 'react';\nimport clsx from 'clsx';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {CodeIcon} from '../../icons/material/Code';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {\n Menu,\n MenuItem,\n MenuTrigger,\n} from '../../ui/navigation/menu/menu-trigger';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\n\nexport function CodeBlockMenuTrigger({editor, size}: MenubarButtonProps) {\n const language = editor.getAttributes('codeBlock').language || '';\n return (\n <MenuTrigger\n selectionMode=\"single\"\n selectedValue={language}\n onSelectionChange={key => {\n editor.commands.toggleCodeBlock({language: key as string});\n }}\n >\n <Tooltip label={<Trans message=\"Codeblock\" />}>\n <IconButton\n className={clsx('flex-shrink-0')}\n size={size}\n color={language ? 'primary' : null}\n >\n <CodeIcon />\n </IconButton>\n </Tooltip>\n <Menu>\n <MenuItem value=\"html\">HTML</MenuItem>\n <MenuItem value=\"javascript\">JavaScript</MenuItem>\n <MenuItem value=\"css\">CSS</MenuItem>\n <MenuItem value=\"php\">PHP</MenuItem>\n <MenuItem value=\"shell\">Shell</MenuItem>\n <MenuItem value=\"bash\">Bash</MenuItem>\n <MenuItem value=\"ruby\">Ruby</MenuItem>\n <MenuItem value=\"python\">Python</MenuItem>\n <MenuItem value=\"java\">Java</MenuItem>\n <MenuItem value=\"c++\">C++</MenuItem>\n </Menu>\n </MenuTrigger>\n );\n}\n","import React, {Fragment, useState} from 'react';\nimport clsx from 'clsx';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {Divider} from '@common/text-editor/menubar/divider';\nimport {FontStyleButtons} from '@common/text-editor/menubar/font-style-buttons';\nimport {ListButtons} from '@common/text-editor/menubar/list-buttons';\nimport {LinkButton} from '@common/text-editor/menubar/link-button';\nimport {ImageButton} from '@common/text-editor/menubar/image-button';\nimport {ClearFormatButton} from '@common/text-editor/menubar/clear-format-button';\nimport {InsertMenuTrigger} from '@common/text-editor/menubar/insert-menu-trigger';\nimport {FormatMenuTrigger} from '@common/text-editor/menubar/format-menu-trigger';\nimport {ColorButtons} from '@common/text-editor/menubar/color-buttons';\nimport {AlignButtons} from '@common/text-editor/menubar/align-buttons';\nimport {IndentButtons} from '@common/text-editor/menubar/indent-buttons';\nimport {CodeBlockMenuTrigger} from '@common/text-editor/menubar/code-block-menu-trigger';\nimport {MenubarButtonProps} from '@common/text-editor/menubar/menubar-button-props';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {UnfoldMoreIcon} from '@common/icons/material/UnfoldMore';\nimport {UnfoldLessIcon} from '@common/icons/material/UnfoldLess';\n\nconst MenubarRowClassName =\n 'flex items-center px-4 h-42 text-muted border-b overflow-hidden';\n\ninterface Props extends MenubarButtonProps {\n justify?: string;\n hideInsertButton?: boolean;\n imageDiskPrefix?: string;\n}\nexport function ArticleBodyEditorMenubar({\n editor,\n size = 'md',\n justify = 'justify-center',\n hideInsertButton = false,\n imageDiskPrefix,\n}: Props) {\n const isMobile = useIsMobileMediaQuery();\n const [extendedVisible, setExtendedVisible] = useState(false);\n return (\n <div className={clsx(extendedVisible ? 'h-84' : 'h-42')}>\n <div className={clsx(MenubarRowClassName, justify, 'relative z-20')}>\n <FormatMenuTrigger editor={editor} size={size} />\n <Divider />\n <FontStyleButtons editor={editor} size={size} />\n <Divider />\n <AlignButtons editor={editor} size={size} />\n <IndentButtons editor={editor} size={size} />\n <Divider />\n {isMobile ? (\n <IconButton\n className=\"flex-shrink-0\"\n color={extendedVisible ? 'primary' : null}\n size={size}\n onClick={() => {\n setExtendedVisible(!extendedVisible);\n }}\n >\n {extendedVisible ? <UnfoldLessIcon /> : <UnfoldMoreIcon />}\n </IconButton>\n ) : (\n <ExtendedButtons\n editor={editor}\n size={size}\n hideInsertButton={hideInsertButton}\n imageDiskPrefix={imageDiskPrefix}\n />\n )}\n </div>\n <AnimatePresence>\n {extendedVisible && (\n <m.div\n className={clsx(\n MenubarRowClassName,\n justify,\n 'absolute flex h-full w-full',\n )}\n initial={{y: '-100%'}}\n animate={{y: 0}}\n exit={{y: '-100%'}}\n >\n <ExtendedButtons\n editor={editor}\n size={size}\n imageDiskPrefix={imageDiskPrefix}\n />\n </m.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n\nfunction ExtendedButtons({\n editor,\n size = 'md',\n hideInsertButton,\n imageDiskPrefix,\n}: Props) {\n return (\n <Fragment>\n <ListButtons editor={editor} size={size} />\n <Divider />\n <LinkButton editor={editor} size={size} />\n <ImageButton editor={editor} size={size} diskPrefix={imageDiskPrefix} />\n {!hideInsertButton && <InsertMenuTrigger editor={editor} size={size} />}\n <Divider />\n <ColorButtons editor={editor} size={size} />\n <Divider />\n <CodeBlockMenuTrigger editor={editor} size={size} />\n <ClearFormatButton editor={editor} size={size} />\n </Fragment>\n );\n}\n","import {SlugEditor, SlugEditorProps} from '@common/ui/slug-editor';\nimport {useController, useFormContext} from 'react-hook-form';\nimport React, {Fragment, ReactNode, useEffect, useRef} from 'react';\nimport clsx from 'clsx';\nimport {useStickySentinel} from '@common/utils/hooks/sticky-sentinel';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {Button} from '@common/ui/buttons/button';\nimport {Link} from 'react-router-dom';\nimport {ArrowBackIcon} from '@common/icons/material/ArrowBack';\nimport {Trans} from '@common/i18n/trans';\nimport {HistoryButtons} from '@common/text-editor/menubar/history-buttons';\nimport {ModeButton} from '@common/text-editor/menubar/mode-button';\nimport {ArticleBodyEditorMenubar} from './article-body-editor-menubar';\nimport {Editor} from '@tiptap/react';\nimport {CreateCustomPagePayload} from '@common/admin/custom-pages/requests/use-create-custom-page';\n\ninterface StickyHeaderProps {\n editor: Editor;\n allowSlugEditing?: boolean;\n onSave?: (editorContent: string) => void;\n saveButton?: ReactNode;\n backLink: string;\n isLoading?: boolean;\n slugPrefix?: string;\n imageDiskPrefix?: string;\n}\nexport function ArticleEditorStickyHeader({\n editor,\n allowSlugEditing = true,\n onSave,\n saveButton,\n isLoading = false,\n backLink,\n slugPrefix = 'pages',\n imageDiskPrefix,\n}: StickyHeaderProps) {\n const {isSticky, sentinelRef} = useStickySentinel();\n const isMobile = useIsMobileMediaQuery();\n\n return (\n <Fragment>\n <div ref={sentinelRef} />\n <div className={clsx('sticky top-0 z-10 mb-20 bg', isSticky && 'shadow')}>\n <div className=\"flex items-center justify-between gap-20 border-b px-20 py-10 text-muted sm:justify-start\">\n {!isMobile && (\n <Fragment>\n <Button\n variant=\"text\"\n size=\"sm\"\n elementType={Link}\n to={backLink}\n relative=\"path\"\n startIcon={<ArrowBackIcon />}\n >\n <Trans message=\"Back\" />\n </Button>\n <div className=\"mr-auto\">\n {allowSlugEditing && (\n <FormSlugEditor\n name=\"slug\"\n showLinkIcon={false}\n prefix={slugPrefix}\n />\n )}\n </div>\n </Fragment>\n )}\n {editor && <HistoryButtons editor={editor} />}\n {!isMobile && <ModeButton editor={editor} />}\n {onSave && (\n <SaveButton\n onSave={() => {\n onSave(editor.getHTML());\n }}\n isLoading={isLoading}\n />\n )}\n {saveButton}\n </div>\n <ArticleBodyEditorMenubar\n editor={editor}\n size=\"sm\"\n imageDiskPrefix={imageDiskPrefix}\n />\n </div>\n </Fragment>\n );\n}\n\ninterface SaveButtonProps {\n onSave: () => void;\n isLoading: boolean;\n}\nfunction SaveButton({onSave, isLoading}: SaveButtonProps) {\n const form = useFormContext();\n const title = form.watch('title');\n\n return (\n <Button\n variant=\"flat\"\n size=\"sm\"\n color=\"primary\"\n className=\"min-w-90\"\n disabled={isLoading || !title}\n onClick={() => onSave()}\n >\n <Trans message=\"Save\" />\n </Button>\n );\n}\n\ninterface FormSlugEditorProps extends SlugEditorProps {\n name: string;\n}\nfunction FormSlugEditor({name, ...other}: FormSlugEditorProps) {\n const {\n field: {onChange, onBlur, value = '', ref},\n } = useController({\n name,\n });\n const manuallyChanged = useRef(false);\n\n const {watch, setValue} = useFormContext<CreateCustomPagePayload>();\n\n useEffect(() => {\n const subscription = watch((formVal, {name: fieldName}) => {\n // if user has not changed slug manually, set it based on page title field changes\n if (fieldName === 'title' && !manuallyChanged.current) {\n setValue('slug', formVal.title);\n }\n });\n return () => subscription.unsubscribe();\n }, [watch, setValue]);\n\n return (\n <SlugEditor\n className={clsx(!value && 'invisible')}\n onChange={e => {\n manuallyChanged.current = true;\n onChange(e);\n }}\n onInputBlur={onBlur}\n value={value}\n inputRef={ref}\n {...other}\n />\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {NewsArticle} from '@app/titles/models/news-article';\nimport {CreateNewsArticlePayload} from '@app/admin/news/requests/use-create-news-article';\nimport {useParams} from 'react-router-dom';\n\ninterface Response extends BackendResponse {\n article: NewsArticle;\n}\n\nexport function useUpdateNewsArticle() {\n const {articleId} = useParams();\n return useMutation({\n mutationFn: (payload: CreateNewsArticlePayload) =>\n updateArticle(articleId!, payload),\n onError: err => showHttpErrorToast(err),\n onSuccess: async () => {\n await queryClient.invalidateQueries({queryKey: ['news']});\n toast(message('Article updated'));\n },\n });\n}\n\nfunction updateArticle(\n articleId: string,\n payload: CreateNewsArticlePayload,\n): Promise<Response> {\n return apiClient.put(`news/${articleId}`, payload).then(r => r.data);\n}\n","import React, {Fragment, Suspense} from 'react';\nimport {PageMetaTags} from '@common/http/page-meta-tags';\nimport {PageStatus} from '@common/http/page-status';\nimport {FormProvider, useForm} from 'react-hook-form';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {ArticleEditorTitle} from '@common/article-editor/article-editor-title';\nimport {ArticleEditorStickyHeader} from '@common/article-editor/article-editor-sticky-header';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {FullPageLoader} from '@common/ui/progress/full-page-loader';\nimport {useNewsArticle} from '@app/admin/news/requests/use-news-article';\nimport {NewsArticle} from '@app/titles/models/news-article';\nimport {useUpdateNewsArticle} from '@app/admin/news/requests/use-update-news-article';\nimport {CreateNewsArticlePayload} from '@app/admin/news/requests/use-create-news-article';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\n\nconst ArticleBodyEditor = React.lazy(\n () => import('@common/article-editor/article-body-editor'),\n);\n\nexport function EditNewsArticlePage() {\n const query = useNewsArticle('newsArticlePage');\n\n return query.data ? (\n <Fragment>\n <PageMetaTags query={query} />\n <PageContent article={query.data.article} />\n </Fragment>\n ) : (\n <div className=\"relative h-full w-full\">\n <PageStatus query={query} />\n </div>\n );\n}\n\ninterface PageContentProps {\n article: NewsArticle;\n}\nfunction PageContent({article}: PageContentProps) {\n const navigate = useNavigate();\n const updateArticle = useUpdateNewsArticle();\n const form = useForm<CreateNewsArticlePayload>({\n defaultValues: {\n title: article.title,\n slug: article.slug,\n body: article.body,\n image: article.image,\n },\n });\n\n const handleSave = (editorContent: string) => {\n updateArticle.mutate(\n {\n ...form.getValues(),\n body: editorContent,\n },\n {\n onSuccess: () => navigate('../..', {relative: 'path'}),\n },\n );\n };\n\n return (\n <Suspense fallback={<FullPageLoader />}>\n <ArticleBodyEditor initialContent={article.body}>\n {(content, editor) => (\n <FileUploadProvider>\n <FormProvider {...form}>\n <ArticleEditorStickyHeader\n editor={editor}\n backLink=\"../..\"\n slugPrefix=\"news\"\n isLoading={updateArticle.isPending}\n onSave={handleSave}\n />\n <div className=\"mx-20\">\n <FormImageSelector\n className=\"mx-auto mb-32 max-w-[655px]\"\n showEditButtonOnHover\n variant=\"square\"\n name=\"image\"\n diskPrefix=\"news_images\"\n />\n <div className=\"prose mx-auto flex-auto dark:prose-invert\">\n <ArticleEditorTitle />\n {content}\n </div>\n </div>\n </FormProvider>\n </FileUploadProvider>\n )}\n </ArticleBodyEditor>\n </Suspense>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {NewsArticle} from '@app/titles/models/news-article';\n\ninterface Response extends BackendResponse {\n article: NewsArticle;\n}\n\nexport interface CreateNewsArticlePayload {\n title?: string;\n body?: string;\n slug?: string;\n image?: string;\n}\n\nexport function useCreatNewsArticle() {\n return useMutation({\n mutationFn: (payload: CreateNewsArticlePayload) => createArticle(payload),\n onError: err => showHttpErrorToast(err),\n onSuccess: async () => {\n await queryClient.invalidateQueries({queryKey: ['news']});\n toast(message('Article created'));\n },\n });\n}\n\nfunction createArticle(payload: CreateNewsArticlePayload): Promise<Response> {\n return apiClient.post(`news`, payload).then(r => r.data);\n}\n","import React, {Suspense} from 'react';\nimport {FormProvider, useForm} from 'react-hook-form';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {ArticleEditorTitle} from '@common/article-editor/article-editor-title';\nimport {ArticleEditorStickyHeader} from '@common/article-editor/article-editor-sticky-header';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {FullPageLoader} from '@common/ui/progress/full-page-loader';\nimport {\n CreateNewsArticlePayload,\n useCreatNewsArticle,\n} from '@app/admin/news/requests/use-create-news-article';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\n\nconst ArticleBodyEditor = React.lazy(\n () => import('@common/article-editor/article-body-editor'),\n);\n\nexport function CreateNewsArticlePage() {\n const navigate = useNavigate();\n const createArticle = useCreatNewsArticle();\n const form = useForm<CreateNewsArticlePayload>({});\n\n const handleSave = (editorContent: string) => {\n createArticle.mutate(\n {\n ...form.getValues(),\n body: editorContent,\n },\n {\n onSuccess: () => navigate('..', {relative: 'path'}),\n },\n );\n };\n\n return (\n <Suspense fallback={<FullPageLoader />}>\n <ArticleBodyEditor>\n {(content, editor) => (\n <FileUploadProvider>\n <FormProvider {...form}>\n <ArticleEditorStickyHeader\n editor={editor}\n backLink=\"..\"\n isLoading={createArticle.isPending}\n onSave={handleSave}\n />\n <div className=\"mx-20\">\n <FormImageSelector\n className=\"mx-auto mb-32 max-w-[655px]\"\n showEditButtonOnHover\n variant=\"square\"\n name=\"image\"\n diskPrefix=\"news_images\"\n />\n <div className=\"prose mx-auto flex-auto dark:prose-invert\">\n <ArticleEditorTitle />\n {content}\n </div>\n </div>\n </FormProvider>\n </FileUploadProvider>\n )}\n </ArticleBodyEditor>\n </Suspense>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {UseFormReturn} from 'react-hook-form';\nimport {TitleTag} from '@app/admin/titles/requests/use-detach-title-tag';\n\ninterface Response extends BackendResponse {\n tag: TitleTag;\n}\n\nexport interface CreateTitleTagPayload {\n name: string;\n display_name: string;\n}\n\nexport function useCreateTitleTag(\n form: UseFormReturn<CreateTitleTagPayload>,\n type: TitleTag['model_type'],\n) {\n return useMutation({\n mutationFn: (props: CreateTitleTagPayload) => createNewTag(props, type),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('title-tags'),\n });\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction createNewTag(\n payload: CreateTitleTagPayload,\n type: TitleTag['model_type'],\n): Promise<Response> {\n return apiClient.post(`title-tags/${type}`, payload).then(r => r.data);\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Form} from '@common/ui/forms/form';\nimport {useForm} from 'react-hook-form';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {TitleTag} from '@app/admin/titles/requests/use-detach-title-tag';\nimport React from 'react';\nimport {\n CreateTitleTagPayload,\n useCreateTitleTag,\n} from '@app/admin/title-tags/title-tags-editor/requests/use-create-title-tag';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\n\ninterface Props {\n type: TitleTag['model_type'];\n}\nexport function CreateTitleTagDialog({type}: Props) {\n const displayName = type.replace('_', ' ');\n const {formId, close} = useDialogContext();\n const form = useForm<CreateTitleTagPayload>();\n const addTag = useCreateTitleTag(form, type);\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Add :name\" values={{name: displayName}} />\n </DialogHeader>\n <DialogBody>\n <Form\n id={formId}\n form={form}\n onSubmit={async values => {\n await addTag.mutate(values, {\n onSuccess: () => {\n toast(message(':name created', {values: {name: displayName}}));\n close();\n },\n });\n }}\n >\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Name\" />}\n description={\n <Trans\n message=\"Unique :name identifier.\"\n values={{name: displayName}}\n />\n }\n className=\"mb-20\"\n required\n autoFocus\n />\n <FormTextField\n name=\"display_name\"\n label={<Trans message=\"Display name\" />}\n description={\n <Trans\n message=\"User friendly :name name.\"\n values={{name: displayName}}\n />\n }\n className=\"mb-20\"\n />\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button onClick={() => close()}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n form={formId}\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n disabled={addTag.isPending}\n >\n <Trans message=\"Create\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {UseFormReturn} from 'react-hook-form';\nimport {TitleTag} from '@app/admin/titles/requests/use-detach-title-tag';\nimport {CreateTitleTagPayload} from '@app/admin/title-tags/title-tags-editor/requests/use-create-title-tag';\n\ninterface Response extends BackendResponse {\n tag: TitleTag;\n}\n\nexport function useUpdateTitleTag(\n form: UseFormReturn<CreateTitleTagPayload>,\n tag: TitleTag,\n) {\n return useMutation({\n mutationFn: (payload: CreateTitleTagPayload) => updateTag(payload, tag),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('title-tags'),\n });\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction updateTag(\n payload: CreateTitleTagPayload,\n tag: TitleTag,\n): Promise<Response> {\n return apiClient\n .put(`title-tags/${tag.model_type}/${tag.id}`, payload)\n .then(r => r.data);\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Form} from '@common/ui/forms/form';\nimport {useForm} from 'react-hook-form';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {TitleTag} from '@app/admin/titles/requests/use-detach-title-tag';\nimport React from 'react';\nimport {CreateTitleTagPayload} from '@app/admin/title-tags/title-tags-editor/requests/use-create-title-tag';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {useUpdateTitleTag} from '@app/admin/title-tags/title-tags-editor/requests/use-update-title-tag';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\n\ninterface Props {\n tag: TitleTag;\n}\nexport function UpdateTitleTagDialog({tag}: Props) {\n const displayName = tag.model_type.replace('_', ' ');\n const {formId, close} = useDialogContext();\n const form = useForm<CreateTitleTagPayload>({\n defaultValues: {\n name: tag.name,\n display_name: tag.display_name,\n },\n });\n const updateTag = useUpdateTitleTag(form, tag);\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Add :name\" values={{name: displayName}} />\n </DialogHeader>\n <DialogBody>\n <Form\n id={formId}\n form={form}\n onSubmit={async values => {\n updateTag.mutate(values, {\n onSuccess: () => {\n toast(message(':name updated', {values: {name: displayName}}));\n close();\n },\n });\n }}\n >\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Name\" />}\n description={\n <Trans\n message=\"Unique :name identifier.\"\n values={{name: displayName}}\n />\n }\n className=\"mb-20\"\n required\n autoFocus\n />\n <FormTextField\n name=\"display_name\"\n label={<Trans message=\"Display name\" />}\n description={\n <Trans\n message=\"User friendly :name name.\"\n values={{name: displayName}}\n />\n }\n className=\"mb-20\"\n />\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button onClick={() => close()}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n form={formId}\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n disabled={updateTag.isPending}\n >\n <Trans message=\"Save\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {BackendFilter} from '@common/datatable/filters/backend-filter';\nimport {\n createdAtFilter,\n updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\nimport {message} from '@common/i18n/message';\n\nexport const TitleTagsDatatableFilters: BackendFilter[] = [\n createdAtFilter({\n description: message('Date item was created'),\n }),\n updatedAtFilter({\n description: message('Date item was last updated'),\n }),\n];\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {Trans} from '@common/i18n/trans';\nimport React, {Fragment} from 'react';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {TitleTag} from '@app/admin/titles/requests/use-detach-title-tag';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {DeleteSelectedItemsAction} from '@common/datatable/page/delete-selected-items-action';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport softwareEngineerSvg from '@common/admin/tags/software-engineer.svg';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {CreateTitleTagDialog} from '@app/admin/title-tags/title-tags-editor/create-title-tag-dialog';\nimport {UpdateTitleTagDialog} from '@app/admin/title-tags/title-tags-editor/update-title-tag-dialog';\nimport {TitleTagsDatatableFilters} from '@app/admin/title-tags/title-tags-editor/title-tags-datatable-filters';\n\nconst columnConfig: ColumnConfig<TitleTag>[] = [\n {\n key: 'name',\n allowsSorting: true,\n visibleInMode: 'all',\n width: 'flex-3 min-w-200',\n header: () => <Trans message=\"Name\" />,\n body: tag => tag.name,\n },\n {\n key: 'display_name',\n allowsSorting: true,\n header: () => <Trans message=\"Display name\" />,\n body: tag => tag.display_name,\n },\n {\n key: 'updated_at',\n allowsSorting: true,\n width: 'w-100',\n header: () => <Trans message=\"Last updated\" />,\n body: tag => <FormattedDate date={tag.updated_at} />,\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n align: 'end',\n width: 'w-42 flex-shrink-0',\n visibleInMode: 'all',\n body: tag => (\n <DialogTrigger type=\"modal\">\n <IconButton size=\"md\" className=\"text-muted\">\n <EditIcon />\n </IconButton>\n <UpdateTitleTagDialog tag={tag} />\n </DialogTrigger>\n ),\n },\n];\n\ninterface Props {\n type: TitleTag['model_type'];\n}\nexport function TitleTagsDatatablePage({type}: Props) {\n const displayType = `${type.replace('_', ' ')}s`;\n return (\n <DataTablePage\n endpoint={`title-tags/${type}`}\n title={<Trans message={displayType} />}\n columns={columnConfig}\n filters={TitleTagsDatatableFilters}\n actions={<Actions type={type} />}\n selectedActions={<DeleteSelectedItemsAction />}\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={softwareEngineerSvg}\n title={\n <Trans\n message=\"No :name have been created yet\"\n values={{name: displayType}}\n />\n }\n filteringTitle={\n <Trans message=\"No matching :name\" values={{name: displayType}} />\n }\n />\n }\n />\n );\n}\n\ninterface ActionsProps {\n type: TitleTag['model_type'];\n}\nfunction Actions({type}: ActionsProps) {\n return (\n <Fragment>\n <DialogTrigger type=\"modal\">\n <DataTableAddItemButton>\n <Trans\n message=\"Add new :name\"\n values={{name: type.replace('_', ' ')}}\n />\n </DataTableAddItemButton>\n <CreateTitleTagDialog type={type} />\n </DialogTrigger>\n </Fragment>\n );\n}\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Link} from 'react-router-dom';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport React from 'react';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {CheckIcon} from '@common/icons/material/Check';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {Channel} from '@common/channels/channel';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\n\nexport const ListsDatatableColumns: ColumnConfig<Channel>[] = [\n {\n key: 'name',\n allowsSorting: true,\n width: 'flex-3',\n visibleInMode: 'all',\n header: () => <Trans message=\"Name\" />,\n body: list => {\n return (\n <a\n className=\"outline-none hover:underline focus-visible:underline\"\n href={`lists/${list.id}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {list.name}\n </a>\n );\n },\n },\n {\n key: 'user_id',\n allowsSorting: true,\n width: 'flex-2 min-w-140',\n header: () => <Trans message=\"Owner\" />,\n body: list =>\n list.user && (\n <NameWithAvatar\n image={list.user.avatar}\n label={list.user.display_name}\n description={list.user.email}\n />\n ),\n },\n {\n key: 'items_count',\n width: 'w-96',\n header: () => <Trans message=\"Items\" />,\n body: list =>\n list.items_count && <FormattedNumber value={list.items_count} />,\n },\n {\n key: 'public',\n header: () => <Trans message=\"Public\" />,\n width: 'w-96',\n body: list =>\n list.public ? (\n <CheckIcon className=\"text-positive\" />\n ) : (\n <CloseIcon className=\"text-danger\" />\n ),\n },\n {\n key: 'content_type',\n allowsSorting: false,\n header: () => <Trans message=\"Content type\" />,\n body: list => (\n <span className=\"capitalize\">\n {list.config.contentModel ? (\n <Trans message={list.config.contentModel} />\n ) : undefined}\n </span>\n ),\n },\n {\n key: 'layout',\n allowsSorting: false,\n header: () => <Trans message=\"Layout\" />,\n body: list => (\n <span className=\"capitalize\">\n {list.config.layout ? (\n <Trans message={list.config.layout} />\n ) : undefined}\n </span>\n ),\n },\n {\n key: 'updated_at',\n allowsSorting: true,\n maxWidth: 'max-w-100',\n header: () => <Trans message=\"Last updated\" />,\n body: list =>\n list.updated_at ? <FormattedDate date={list.updated_at} /> : '',\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n visibleInMode: 'all',\n align: 'end',\n width: 'w-42 flex-shrink-0',\n body: list => (\n <Link to={`${list.id}/edit`} className=\"text-muted\">\n <IconButton size=\"md\">\n <EditIcon />\n </IconButton>\n </Link>\n ),\n },\n];\n","import React from 'react';\nimport {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {Trans} from '@common/i18n/trans';\nimport {DeleteSelectedItemsAction} from '@common/datatable/page/delete-selected-items-action';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport todoImage from './todo.svg';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {Link} from 'react-router-dom';\nimport {ListsDatatableColumns} from '@app/admin/lists/lists-datatable-columns';\n\nexport function ListsDatatablePage() {\n return (\n <DataTablePage\n endpoint=\"lists\"\n title={<Trans message=\"User lists\" />}\n columns={ListsDatatableColumns}\n actions={<Actions />}\n selectedActions={<DeleteSelectedItemsAction />}\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={todoImage}\n title={<Trans message=\"No lists have been created yet\" />}\n filteringTitle={<Trans message=\"No matching lists\" />}\n />\n }\n />\n );\n}\n\nfunction Actions() {\n return (\n <DataTableAddItemButton elementType={Link} to=\"new\">\n <Trans message=\"Add new list\" />\n </DataTableAddItemButton>\n );\n}\n","import {useDateRangePickerState} from '@common/ui/forms/input-field/date/date-range-picker/use-date-range-picker-state';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Button} from '@common/ui/buttons/button';\nimport {DateRangeIcon} from '@common/icons/material/DateRange';\nimport {FormattedDateTimeRange} from '@common/i18n/formatted-date-time-range';\nimport {DateRangeDialog} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-dialog';\nimport React from 'react';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {DateFormatPresets} from '@common/i18n/formatted-date';\nimport {DateRangeComparePresets} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-compare-presets';\nimport {Granularity} from '@common/ui/forms/input-field/date/date-picker/use-date-picker-state';\n\nconst monthDayFormat: Intl.DateTimeFormatOptions = {\n month: 'short',\n day: '2-digit',\n};\n\ninterface ReportDataSelectorProps {\n value: DateRangeValue;\n disabled?: boolean;\n onChange: (value: DateRangeValue) => void;\n compactOnMobile?: boolean;\n enableCompare?: boolean;\n granularity?: Granularity;\n}\nexport function ReportDateSelector({\n value,\n onChange,\n disabled,\n compactOnMobile = true,\n enableCompare = false,\n granularity = 'minute',\n}: ReportDataSelectorProps) {\n const isMobile = useIsMobileMediaQuery();\n return (\n <DialogTrigger\n type=\"popover\"\n onClose={value => {\n if (value) {\n onChange(value);\n }\n }}\n >\n <Button\n variant=\"outline\"\n color=\"chip\"\n endIcon={<DateRangeIcon />}\n disabled={disabled}\n >\n <FormattedDateTimeRange\n start={value.start}\n end={value.end}\n options={\n isMobile && compactOnMobile\n ? monthDayFormat\n : DateFormatPresets.short\n }\n />\n </Button>\n <DateSelectorDialog\n value={value}\n enableCompare={enableCompare}\n granularity={granularity}\n />\n </DialogTrigger>\n );\n}\n\ninterface DateSelectorDialogProps {\n value: DateRangeValue;\n enableCompare: boolean;\n granularity: Granularity;\n}\nfunction DateSelectorDialog({\n value,\n enableCompare,\n granularity,\n}: DateSelectorDialogProps) {\n const isMobile = useIsMobileMediaQuery();\n const state = useDateRangePickerState({\n granularity,\n defaultValue: {\n start: value.start,\n end: value.end,\n preset: value.preset,\n },\n closeDialogOnSelection: false,\n });\n const compareHasInitialValue = !!value.compareStart && !!value.compareEnd;\n const compareState = useDateRangePickerState({\n granularity,\n defaultValue: compareHasInitialValue\n ? {\n start: value.compareStart,\n end: value.compareEnd,\n preset: value.comparePreset,\n }\n : DateRangeComparePresets[0].getRangeValue(state.selectedValue),\n });\n return (\n <DateRangeDialog\n state={state}\n compareState={enableCompare ? compareState : undefined}\n compareVisibleDefault={compareHasInitialValue}\n showInlineDatePickerField={!isMobile}\n />\n );\n}\n","import React from 'react';\nimport clsx from 'clsx';\nimport {ButtonColor, ButtonVariant} from './get-shared-button-style';\nimport {ButtonProps} from './button';\nimport {ButtonSize} from './button-size';\n\nexport interface ButtonGroupProps {\n children: React.ReactNode[];\n color?: ButtonColor;\n variant?: ButtonVariant;\n size?: ButtonSize;\n radius?: string;\n className?: string;\n value?: any;\n onChange?: (newValue: any) => void;\n multiple?: boolean;\n disabled?: boolean;\n}\nexport function ButtonGroup({\n children,\n color,\n variant,\n radius = 'rounded-button',\n size,\n className,\n value,\n onChange,\n multiple,\n disabled,\n}: ButtonGroupProps) {\n const isActive = (childValue: any): boolean => {\n // assume that button group is not used as a toggle group, if there is no value given\n if (value === undefined) return false;\n if (multiple) {\n return (value as any[]).includes(childValue);\n }\n return childValue === value;\n };\n\n const toggleMultipleValue = (childValue: any) => {\n const newValue = [...value];\n const childIndex = value.indexOf(childValue);\n if (childIndex > -1) {\n newValue.splice(childIndex, 1);\n } else {\n newValue.push(childValue);\n }\n return newValue;\n };\n\n const buttons = React.Children.map(children, (button, i) => {\n if (React.isValidElement(button)) {\n const active = isActive(button.props.value);\n const adjustedColor = active ? 'primary' : color;\n return React.cloneElement<ButtonProps>(button as any, {\n color: active ? 'primary' : color,\n variant,\n size,\n radius: null,\n disabled: button.props.disabled || disabled,\n ...button.props,\n onClick: e => {\n if (button.props.onClick) {\n button.props.onClick(e);\n }\n if (!onChange) return;\n if (multiple) {\n onChange?.(toggleMultipleValue(button.props.value));\n } else {\n onChange?.(button.props.value);\n }\n },\n className: clsx(\n button.props.className,\n // borders are hidden via negative margin, make sure both are visible for active item\n active ? 'z-20' : 'z-10',\n getStyle(i, children, radius, adjustedColor),\n ),\n });\n }\n });\n return (\n <div className={clsx(radius, 'isolate inline-flex', className)}>\n {buttons}\n </div>\n );\n}\n\nfunction getStyle(\n i: number,\n children: ButtonGroupProps['children'],\n radius: ButtonGroupProps['radius'],\n color?: ButtonColor,\n): string {\n // first\n if (i === 0) {\n return clsx(\n radius,\n 'rounded-tr-none rounded-br-none',\n !color && 'border-r-transparent disabled:border-r-transparent',\n );\n }\n // last\n if (i === children.length - 1) {\n return clsx(radius, 'rounded-tl-none rounded-bl-none -ml-1');\n }\n return clsx(\n 'rounded-none -ml-1',\n !color && 'border-r-transparent disabled:border-r-transparent',\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TrendingUpIcon = createSvgIcon(\n <path d=\"m16 6 2.29 2.29-4.88 4.88-4-4L2 16.59 3.41 18l6-6 4 4 6.3-6.29L22 12V6h-6z\" />\n, 'TrendingUpOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TrendingDownIcon = createSvgIcon(\n <path d=\"m16 18 2.29-2.29-4.88-4.88-4 4L2 7.41 3.41 6l6 6 4-4 6.3 6.29L22 12v6h-6z\" />\n, 'TrendingDownOutlined');\n","import {ReactNode, Ref} from 'react';\nimport clsx from 'clsx';\n\nexport interface ChartLayoutProps {\n title: ReactNode;\n description?: ReactNode;\n className?: string;\n children: ReactNode;\n contentIsFlex?: boolean;\n contentClassName?: string;\n minHeight?: string;\n contentRef?: Ref<HTMLDivElement>;\n isLoading?: boolean;\n}\nexport function ChartLayout(props: ChartLayoutProps) {\n const {\n title,\n description,\n children,\n className,\n contentIsFlex = true,\n contentClassName,\n contentRef,\n minHeight = 'min-h-440',\n } = props;\n\n return (\n <div\n className={clsx(\n 'rounded-panel flex h-full flex-auto flex-col border bg',\n minHeight,\n className,\n )}\n >\n <div className=\"flex flex-shrink-0 items-center justify-between p-14 text-xs\">\n <div className=\"text-sm font-semibold\">{title}</div>\n {description && <div className=\"text-muted\">{description}</div>}\n </div>\n <div\n ref={contentRef}\n className={clsx(\n 'relative p-14',\n contentIsFlex && 'flex flex-auto items-center justify-center',\n contentClassName,\n )}\n >\n {children}\n </div>\n </div>\n );\n}\n","import {ProgressCircle} from '@common/ui/progress/progress-circle';\nimport {Trans} from '@common/i18n/trans';\n\nexport function ChartLoadingIndicator() {\n return (\n <div className=\"flex items-center gap-10 text-sm absolute mx-auto\">\n <ProgressCircle isIndeterminate size=\"sm\" />\n <Trans message=\"Chart loading\" />\n </div>\n );\n}\n","import type {ChartData, ChartOptions, ChartType} from 'chart.js';\nimport {lazy, Suspense} from 'react';\nimport {ChartLayout, ChartLayoutProps} from './chart-layout';\nimport {ChartLoadingIndicator} from '@common/charts/chart-loading-indicator';\n\nconst LazyChart = lazy(() => import('./lazy-chart'));\n\nexport interface BaseChartProps<Type extends ChartType = ChartType>\n extends Omit<ChartLayoutProps, 'children'> {\n type: Type;\n data: ChartData<Type, unknown>;\n options?: ChartOptions<Type>;\n hideLegend?: boolean;\n}\nexport function BaseChart<Type extends ChartType = ChartType>(\n props: BaseChartProps<Type>\n) {\n const {title, description, className, contentRef, isLoading} = props;\n\n return (\n <ChartLayout\n title={title}\n description={description}\n className={className}\n contentRef={contentRef}\n >\n <Suspense fallback={<ChartLoadingIndicator />}>\n <LazyChart {...props} />\n {isLoading && <ChartLoadingIndicator />}\n </Suspense>\n </ChartLayout>\n );\n}\n","import {DateFormatter, parseAbsoluteToLocal} from '@internationalized/date';\nimport memoize from 'nano-memoize';\nimport {ChartType} from 'chart.js';\nimport {\n FormattedDatasetItem,\n FormattedReportData,\n} from './formatted-dataset-item';\nimport {\n DatasetItem,\n RangedDatasetGranularity,\n ReportMetric,\n} from '../../admin/analytics/report-metric';\nimport {shallowEqual} from '../../utils/shallow-equal';\n\ninterface Options {\n localeCode: string;\n shareFirstDatasetLabels?: boolean;\n}\n\ntype FormattedDatasetLabels = Omit<FormattedDatasetItem, 'value'>;\n\nexport function formatReportData(\n report: ReportMetric<DatasetItem> | undefined,\n {localeCode = 'en', shareFirstDatasetLabels = true}: Options,\n): FormattedReportData {\n if (!report) return {datasets: []};\n\n const firstDatasetLabels: FormattedDatasetLabels[] = [];\n\n return {\n ...report,\n datasets: report.datasets.map((dataset, datasetIndex) => {\n const data = dataset.data.map((datasetItem, itemIndex) => {\n let label: FormattedDatasetLabels;\n // when there are multiple datasets, we'll need to use labels from the first dataset, so charts are\n // overlapped over one another, otherwise they will be side by side, if labels in all datasets are not identical.\n if (datasetIndex === 0 || !shareFirstDatasetLabels) {\n label = generateDatasetLabels(\n datasetItem,\n report.granularity,\n localeCode,\n );\n firstDatasetLabels[itemIndex] = label;\n } else {\n label = firstDatasetLabels[itemIndex];\n }\n return {\n ...label,\n value: datasetItem.value,\n };\n });\n\n return {...dataset, data};\n }),\n };\n}\n\nfunction generateDatasetLabels<T extends ChartType = ChartType>(\n datum: DatasetItem,\n granularity: RangedDatasetGranularity | undefined,\n locale: string,\n): FormattedDatasetLabels {\n if (datum.label) {\n return {label: datum.label};\n }\n\n if (!datum.date) {\n return {label: ''};\n }\n\n return generateTimeLabels(datum, granularity, locale);\n}\n\nfunction generateTimeLabels(\n {date: isoDate, endDate: isoEndDate}: DatasetItem,\n granularity: RangedDatasetGranularity | undefined = 'day',\n locale: string,\n): Omit<FormattedDatasetItem, 'value'> {\n const date = parseAbsoluteToLocal(isoDate!).toDate();\n const endDate = isoEndDate ? parseAbsoluteToLocal(isoEndDate).toDate() : null;\n\n switch (granularity) {\n case 'minute':\n return {\n label: getFormatter(locale, {\n second: '2-digit',\n }).format(date),\n tooltipTitle: getFormatter(locale, {\n day: '2-digit',\n hour: 'numeric',\n minute: 'numeric',\n second: '2-digit',\n }).format(date),\n };\n case 'hour':\n return {\n label: getFormatter(locale, {\n hour: 'numeric',\n minute: 'numeric',\n }).format(date),\n tooltipTitle: getFormatter(locale, {\n month: 'short',\n day: '2-digit',\n hour: 'numeric',\n minute: 'numeric',\n }).format(date),\n };\n case 'day':\n return {\n label: getFormatter(locale, {\n day: '2-digit',\n weekday: 'short',\n }).format(date),\n tooltipTitle: getFormatter(locale, {\n day: '2-digit',\n weekday: 'short',\n month: 'short',\n }).format(date),\n };\n case 'week':\n return {\n label: getFormatter(locale, {\n month: 'short',\n day: '2-digit',\n }).format(date),\n tooltipTitle: getFormatter(locale, {\n day: '2-digit',\n month: 'long',\n year: 'numeric',\n }).formatRange(date, endDate as Date),\n };\n case 'month':\n return {\n label: getFormatter(locale, {\n month: 'short',\n year: 'numeric',\n }).format(date),\n tooltipTitle: getFormatter(locale, {\n month: 'long',\n year: 'numeric',\n }).format(date),\n };\n case 'year':\n return {\n label: getFormatter(locale, {\n year: 'numeric',\n }).format(date),\n tooltipTitle: getFormatter(locale, {\n year: 'numeric',\n }).format(date),\n };\n }\n}\n\nconst getFormatter = memoize(\n (locale, options: Intl.DateTimeFormatOptions) => {\n return new DateFormatter(locale, options);\n },\n {\n equals: (a, b) => {\n return shallowEqual(a, b);\n },\n callTimeout: undefined as any,\n },\n);\n","import {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nconst primaryColor = getBootstrapData().themes.all[0].values['--be-primary'];\nexport const ChartColors = [\n [\n `rgb(${primaryColor.replaceAll(' ', ',')})`,\n `rgba(${primaryColor.replaceAll(' ', ',')},0.2)`,\n ],\n ['rgb(255,112,67)', 'rgb(255,112,67,0.2)'],\n ['rgb(255,167,38)', 'rgb(255,167,38,0.2)'],\n ['rgb(141,110,99)', 'rgb(141,110,99,0.2)'],\n ['rgb(102,187,106)', 'rgba(102,187,106,0.2)'],\n ['rgb(92,107,192)', 'rgb(92,107,192,0.2)'],\n];\n","import {BaseChart, BaseChartProps} from './base-chart';\nimport {DatasetItem, ReportMetric} from '../admin/analytics/report-metric';\nimport {useMemo} from 'react';\nimport {formatReportData} from './data/format-report-data';\nimport {useSelectedLocale} from '../i18n/selected-locale';\nimport {ChartData, ChartOptions} from 'chart.js';\nimport {ChartColors} from './chart-colors';\nimport {FormattedDatasetItem} from './data/formatted-dataset-item';\nimport clsx from 'clsx';\n\nconst LineChartOptions: ChartOptions<'line'> = {\n parsing: {\n xAxisKey: 'label',\n yAxisKey: 'value',\n },\n datasets: {\n line: {\n fill: 'origin',\n tension: 0.1,\n pointBorderWidth: 4,\n pointHitRadius: 10,\n },\n },\n plugins: {\n tooltip: {\n intersect: false,\n mode: 'index',\n },\n },\n};\n\ninterface LineChartProps extends Omit<BaseChartProps<'line'>, 'type' | 'data'> {\n data?: ReportMetric<DatasetItem>;\n}\nexport function LineChart({data, className, ...props}: LineChartProps) {\n const {localeCode} = useSelectedLocale();\n const formattedData: ChartData<'line', FormattedDatasetItem[]> =\n useMemo(() => {\n const formattedData = formatReportData(data, {localeCode});\n formattedData.datasets = formattedData.datasets.map((dataset, i) => ({\n ...dataset,\n backgroundColor: ChartColors[i][1],\n borderColor: ChartColors[i][0],\n pointBackgroundColor: ChartColors[i][0],\n }));\n return formattedData;\n }, [data, localeCode]);\n\n return (\n <BaseChart\n {...props}\n className={clsx(className, 'min-w-500')}\n data={formattedData}\n type=\"line\"\n options={LineChartOptions}\n />\n );\n}\n","import {BaseChart, BaseChartProps} from './base-chart';\nimport {ChartData, ChartOptions} from 'chart.js';\nimport {ChartColors} from './chart-colors';\nimport {useSelectedLocale} from '../i18n/selected-locale';\nimport {useMemo} from 'react';\nimport {formatReportData} from './data/format-report-data';\nimport {DatasetItem, ReportMetric} from '../admin/analytics/report-metric';\nimport {FormattedDatasetItem} from './data/formatted-dataset-item';\nimport clsx from 'clsx';\n\nconst PolarAreaChartOptions: ChartOptions<'polarArea'> = {\n parsing: {\n key: 'value',\n },\n plugins: {\n tooltip: {\n intersect: true,\n },\n },\n};\n\ninterface PolarAreaChartProps\n extends Omit<BaseChartProps<'polarArea'>, 'type' | 'data'> {\n data?: ReportMetric<DatasetItem>;\n}\nexport function PolarAreaChart({\n data,\n className,\n ...props\n}: PolarAreaChartProps) {\n const {localeCode} = useSelectedLocale();\n const formattedData: ChartData<'polarArea', FormattedDatasetItem[]> =\n useMemo(() => {\n const formattedData = formatReportData(data, {localeCode});\n formattedData.labels = formattedData.datasets[0]?.data.map(d => d.label);\n formattedData.datasets = formattedData.datasets.map((dataset, i) => ({\n ...dataset,\n backgroundColor: ChartColors.map(c => c[1]),\n borderColor: ChartColors.map(c => c[0]),\n borderWidth: 2,\n }));\n return formattedData;\n }, [data, localeCode]);\n\n return (\n <BaseChart\n type=\"polarArea\"\n data={formattedData}\n options={PolarAreaChartOptions}\n className={clsx(className, 'min-w-500')}\n {...props}\n />\n );\n}\n","import {BaseChart, BaseChartProps} from './base-chart';\nimport {ChartData, ChartOptions} from 'chart.js';\nimport {ChartColors} from './chart-colors';\nimport {useSelectedLocale} from '../i18n/selected-locale';\nimport {FormattedDatasetItem} from './data/formatted-dataset-item';\nimport {useMemo} from 'react';\nimport {formatReportData} from './data/format-report-data';\nimport {DatasetItem, ReportMetric} from '../admin/analytics/report-metric';\nimport clsx from 'clsx';\n\ninterface BarChartProps extends Omit<BaseChartProps<'bar'>, 'type' | 'data'> {\n direction?: 'horizontal' | 'vertical';\n individualBarColors?: boolean;\n data?: ReportMetric<DatasetItem>;\n}\nexport function BarChart({\n data,\n direction = 'vertical',\n individualBarColors = false,\n className,\n ...props\n}: BarChartProps) {\n const {localeCode} = useSelectedLocale();\n const formattedData: ChartData<'bar', FormattedDatasetItem[]> =\n useMemo(() => {\n const formattedData = formatReportData(data, {localeCode});\n formattedData.datasets = formattedData.datasets.map((dataset, i) => ({\n ...dataset,\n backgroundColor: individualBarColors\n ? ChartColors.map(c => c[1])\n : ChartColors[i][1],\n borderColor: individualBarColors\n ? ChartColors.map(c => c[0])\n : ChartColors[i][0],\n borderWidth: 2,\n }));\n return formattedData;\n }, [data, localeCode, individualBarColors]);\n\n const isHorizontal = direction === 'horizontal';\n const options: ChartOptions<'bar'> = useMemo(() => {\n return {\n indexAxis: isHorizontal ? 'y' : 'x',\n parsing: {\n xAxisKey: isHorizontal ? 'value' : 'label',\n yAxisKey: isHorizontal ? 'label' : 'value',\n },\n };\n }, [isHorizontal]);\n\n return (\n <BaseChart\n type=\"bar\"\n className={clsx(className, 'min-w-500')}\n data={formattedData}\n options={options}\n {...props}\n />\n );\n}\n","import lazyLoader from '../../../utils/http/lazy-loader';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {RefObject, useCallback, useEffect, useRef} from 'react';\nimport {useThemeSelector} from '@common/ui/themes/theme-selector-context';\nimport {themeValueToHex} from '@common/ui/themes/utils/theme-value-to-hex';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {LocationDatasetItem} from '@common/admin/analytics/report-metric';\n\nconst loaderUrl = 'https://www.gstatic.com/charts/loader.js';\n\ninterface UseGoogleGeoChartProps {\n placeholderRef: RefObject<HTMLDivElement>;\n data: LocationDatasetItem[];\n onCountrySelected?: (countryCode: string) => void;\n country?: string;\n}\nexport function useGoogleGeoChart({\n placeholderRef,\n data,\n country,\n onCountrySelected,\n}: UseGoogleGeoChartProps) {\n const {trans} = useTrans();\n const {analytics} = useSettings();\n const apiKey = analytics?.gchart_api_key;\n const {selectedTheme} = useThemeSelector();\n const geoChartRef = useRef<google.visualization.GeoChart>();\n // only allow selecting countries, not cities\n const regionInteractivity = !!onCountrySelected && !country;\n const drawGoogleChart = useCallback(() => {\n if (typeof google === 'undefined') return;\n\n const seedData = data.map(location => [location.label, location.value]);\n seedData.unshift([\n country ? trans(message('City')) : trans(message('Country')),\n trans(message('Clicks')),\n ]);\n\n const backgroundColor = `${themeValueToHex(\n selectedTheme.values['--be-paper'],\n )}`;\n const chartColor = `${themeValueToHex(\n selectedTheme.values['--be-primary'],\n )}`;\n\n const options: google.visualization.GeoChartOptions = {\n colorAxis: {colors: [chartColor]},\n backgroundColor,\n region: country ? country.toUpperCase() : undefined,\n resolution: country ? 'provinces' : 'countries',\n displayMode: country ? 'markers' : 'regions',\n enableRegionInteractivity: regionInteractivity,\n };\n\n if (\n !geoChartRef.current &&\n placeholderRef.current &&\n google?.visualization?.GeoChart\n ) {\n geoChartRef.current = new google.visualization.GeoChart(\n placeholderRef.current,\n );\n }\n geoChartRef.current?.draw(\n google.visualization.arrayToDataTable(seedData),\n options,\n );\n }, [\n selectedTheme,\n data,\n placeholderRef,\n trans,\n country,\n regionInteractivity,\n ]);\n\n const initGoogleGeoChart = useCallback(async () => {\n if (lazyLoader.isLoadingOrLoaded(loaderUrl)) return;\n await lazyLoader.loadAsset(loaderUrl, {type: 'js', id: 'google-charts-js'});\n await google.charts.load('current', {\n packages: ['geochart'],\n mapsApiKey: apiKey,\n });\n drawGoogleChart();\n }, [apiKey, drawGoogleChart]);\n\n useEffect(() => {\n if (geoChartRef.current && onCountrySelected) {\n google.visualization.events.addListener(\n geoChartRef.current,\n 'regionClick',\n (a: {region: string}) => onCountrySelected?.(a.region),\n );\n }\n\n return () => {\n if (geoChartRef.current) {\n google.visualization.events.removeAllListeners(geoChartRef.current);\n }\n };\n // this will correctly run when geochart instance is set on ref\n }, [onCountrySelected, geoChartRef.current]);\n\n // on component load: load chart library then draw, otherwise just draw\n useEffect(() => {\n initGoogleGeoChart();\n }, [initGoogleGeoChart]);\n\n // redraw chart if data or theme changes\n useEffect(() => {\n drawGoogleChart();\n }, [selectedTheme, drawGoogleChart, data]);\n\n return {drawGoogleChart};\n}\n","import {useSelectedLocale} from '@common/i18n/selected-locale';\nimport {Fragment, memo} from 'react';\n\ninterface Props {\n code: string;\n}\nexport const FormattedCountryName = memo(({code: countryCode}: Props) => {\n const {localeCode} = useSelectedLocale();\n const regionNames = new Intl.DisplayNames([localeCode], {type: 'region'});\n let formattedName: string | undefined;\n\n try {\n formattedName = regionNames.of(countryCode.toUpperCase());\n } catch (e) {}\n\n return <Fragment>{formattedName}</Fragment>;\n});\n","import {\n LocationDatasetItem,\n ReportMetric,\n} from '@common/admin/analytics/report-metric';\nimport React, {useMemo, useRef} from 'react';\nimport {useGoogleGeoChart} from './use-google-geo-chart';\nimport {ChartLayout, ChartLayoutProps} from '@common/charts/chart-layout';\nimport {Trans} from '@common/i18n/trans';\nimport {ChartLoadingIndicator} from '@common/charts/chart-loading-indicator';\nimport {Button} from '@common/ui/buttons/button';\nimport {ArrowBackIcon} from '@common/icons/material/ArrowBack';\nimport clsx from 'clsx';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\nimport {FormattedCountryName} from '@common/i18n/formatted-country-name';\n\ninterface GeoChartData extends Partial<ChartLayoutProps> {\n data?: ReportMetric<LocationDatasetItem>;\n onCountrySelected?: (countryCode: string | undefined) => void;\n country?: string;\n}\nexport function GeoChart({\n data: metricData,\n isLoading,\n onCountrySelected,\n country,\n ...layoutProps\n}: GeoChartData) {\n const placeholderRef = useRef<HTMLDivElement>(null);\n const regionInteractivity = !!onCountrySelected;\n\n // memo data to avoid redrawing chart on rerender\n const initialData = metricData?.datasets[0].data;\n const data = useMemo(() => {\n return initialData || [];\n }, [initialData]);\n useGoogleGeoChart({placeholderRef, data, country, onCountrySelected});\n\n return (\n <ChartLayout\n {...layoutProps}\n className=\"min-w-500\"\n title={\n <div className=\"flex items-center\">\n <Trans message=\"Top Locations\" />\n {country ? (\n <span className=\"pl-4\">\n ({<FormattedCountryName code={country} />})\n </span>\n ) : null}\n {regionInteractivity && <InfoTrigger />}\n </div>\n }\n contentIsFlex={isLoading}\n >\n {isLoading && <ChartLoadingIndicator />}\n <div className=\"flex gap-24\">\n <div\n ref={placeholderRef}\n className=\"flex-auto w-[480px] min-h-[340px]\"\n />\n <div className=\"w-[170px]\">\n <div className=\"text-sm max-h-[340px] w-full flex-initial overflow-y-auto\">\n {data.map(location => (\n <div\n key={location.label}\n className={clsx(\n 'flex items-center gap-4 mb-4',\n regionInteractivity && 'cursor-pointer hover:underline'\n )}\n role={regionInteractivity ? 'button' : undefined}\n onClick={() => {\n onCountrySelected?.(location.code);\n }}\n >\n <div className=\"max-w-110 whitespace-nowrap overflow-hidden overflow-ellipsis\">\n {location.label}\n </div>\n <div>({location.percentage})%</div>\n </div>\n ))}\n </div>\n {country && (\n <Button\n variant=\"outline\"\n size=\"xs\"\n className=\"mt-14\"\n startIcon={<ArrowBackIcon />}\n onClick={() => {\n onCountrySelected?.(undefined);\n }}\n >\n <Trans message=\"Back to countries\" />\n </Button>\n )}\n </div>\n </div>\n </ChartLayout>\n );\n}\n\nfunction InfoTrigger() {\n return (\n <InfoDialogTrigger\n title={<Trans message=\"Zooming in\" />}\n body={\n <Trans message=\"Click on a country inside the map or country list to zoom in and see city data for that country.\" />\n }\n />\n );\n}\n","import React, {Fragment} from 'react';\nimport {LineChart} from '@common/charts/line-chart';\nimport {Trans} from '@common/i18n/trans';\nimport {PolarAreaChart} from '@common/charts/polar-area-chart';\nimport {BarChart} from '@common/charts/bar-chart';\nimport {VisitorsReportData} from '@common/admin/analytics/visitors-report-data';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {GeoChart} from '@common/admin/analytics/geo-chart/geo-chart';\n\nexport const AdminReportPageColGap = 'gap-12 md:gap-16 mb-12 md:mb-16';\nconst rowClassName = `flex flex-col md:flex-row md:items-center overflow-x-auto ${AdminReportPageColGap}`;\n\ninterface AdminReportChartsProps {\n report?: VisitorsReportData;\n isLoading: boolean;\n}\nexport function VisitorsReportCharts({\n report,\n isLoading,\n}: AdminReportChartsProps) {\n const totalViews = report?.pageViews.total;\n return (\n <Fragment>\n <div className={rowClassName}>\n <LineChart\n isLoading={isLoading}\n className=\"flex-auto\"\n data={report?.pageViews}\n title={<Trans message=\"Pageviews\" />}\n description={\n totalViews ? (\n <Trans\n message=\":count total views\"\n values={{count: <FormattedNumber value={totalViews} />}}\n />\n ) : null\n }\n />\n <PolarAreaChart\n isLoading={isLoading}\n data={report?.devices}\n title={<Trans message=\"Top devices\" />}\n />\n </div>\n <div className={rowClassName}>\n <BarChart\n isLoading={isLoading}\n data={report?.browsers}\n className=\"flex-auto md:w-1/3\"\n direction=\"horizontal\"\n individualBarColors\n hideLegend\n title={<Trans message=\"Top browsers\" />}\n />\n <GeoChart\n isLoading={isLoading}\n className=\"flex-auto\"\n data={report?.locations}\n title={<Trans message=\"Top locations\" />}\n />\n </div>\n </Fragment>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TrendingFlatIcon = createSvgIcon(\n <path d=\"m22 12-4-4v3H3v2h15v3l4-4z\" />\n, 'TrendingFlatOutlined');\n","import {HeaderDatum} from '@common/admin/analytics/use-admin-report';\nimport React, {\n cloneElement,\n Fragment,\n isValidElement,\n ReactElement,\n} from 'react';\nimport {TrendingUpIcon} from '@common/icons/material/TrendingUp';\nimport {TrendingDownIcon} from '@common/icons/material/TrendingDown';\nimport {createSvgIconFromTree} from '@common/icons/create-svg-icon';\nimport {AdminReportPageColGap} from '@common/admin/analytics/visitors-report-charts';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {FormattedBytes} from '@common/uploads/formatted-bytes';\nimport {TrendingFlatIcon} from '@common/icons/material/TrendingFlat';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\n\ninterface AdminHeaderReportProps {\n report?: HeaderDatum[];\n isLoading?: boolean;\n}\nexport function AdminHeaderReport({report, isLoading}: AdminHeaderReportProps) {\n return (\n <div\n className={`flex h-[97px] flex-shrink-0 items-center overflow-x-auto ${AdminReportPageColGap}`}\n >\n {report?.map(datum => (\n <ReportItem key={datum.name} datum={datum} isLoading={isLoading} />\n ))}\n </div>\n );\n}\n\ninterface ValueMetricItemProps {\n datum: HeaderDatum;\n isLoading?: boolean;\n}\nfunction ReportItem({datum, isLoading = false}: ValueMetricItemProps) {\n let icon;\n if (isValidElement(datum.icon)) {\n icon = cloneElement(datum.icon, {size: 'lg'});\n } else {\n const IconEl = createSvgIconFromTree(datum.icon);\n icon = <IconEl size=\"lg\" />;\n }\n\n return (\n <div\n key={datum.name}\n className=\"rounded-panel flex h-full flex-auto items-center gap-18 whitespace-nowrap border p-20\"\n >\n <div className=\"flex-shrink-0 rounded-lg bg-primary-light/20 p-10 text-primary\">\n {icon}\n </div>\n <div className=\"flex-auto\">\n <div className=\"flex items-center justify-between gap-20\">\n <div className=\"text-lg font-bold text-main\">\n <AnimatePresence initial={false} mode=\"wait\">\n {isLoading ? (\n <m.div key=\"skeleton\" {...opacityAnimation}>\n <Skeleton className=\"min-w-24\" />\n </m.div>\n ) : (\n <m.div key=\"value\" {...opacityAnimation}>\n <FormattedValue datum={datum} />\n </m.div>\n )}\n </AnimatePresence>\n </div>\n </div>\n <div className=\"flex items-center justify-between gap-20\">\n <h2 className=\"text-sm text-muted\">{datum.name}</h2>\n {(datum.percentageChange != null || datum.previousValue != null) && (\n <div className=\"flex items-center gap-10\">\n <TrendingIndicator datum={datum} />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\ninterface FormattedValueProps {\n datum: HeaderDatum;\n}\nfunction FormattedValue({datum}: FormattedValueProps) {\n switch (datum.type) {\n case 'fileSize':\n return <FormattedBytes bytes={datum.currentValue} />;\n case 'percentage':\n return (\n <FormattedNumber\n value={datum.currentValue}\n style=\"percent\"\n maximumFractionDigits={1}\n />\n );\n default:\n return <FormattedNumber value={datum.currentValue} />;\n }\n}\n\ninterface TrendingIndicatorProps {\n datum: HeaderDatum;\n}\nfunction TrendingIndicator({datum}: TrendingIndicatorProps) {\n const percentage = calculatePercentage(datum);\n let icon: ReactElement;\n if (percentage > 0) {\n icon = <TrendingUpIcon size=\"md\" className=\"text-positive\" />;\n } else if (percentage === 0) {\n icon = <TrendingFlatIcon className=\"text-muted\" />;\n } else {\n icon = <TrendingDownIcon className=\"text-danger\" />;\n }\n\n return (\n <Fragment>\n {icon}\n <div className=\"text-sm font-semibold text-muted\">{percentage}%</div>\n </Fragment>\n );\n}\n\nfunction calculatePercentage({\n percentageChange,\n previousValue,\n currentValue,\n}: HeaderDatum) {\n if (\n percentageChange != null ||\n previousValue == null ||\n currentValue == null\n ) {\n return percentageChange ?? 0;\n }\n\n if (previousValue === 0) {\n return 100;\n }\n\n return Math.round(((currentValue - previousValue) / previousValue) * 100);\n}\n","import {keepPreviousData, useQuery} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {apiClient} from '../../http/query-client';\nimport {VisitorsReportData} from './visitors-report-data';\nimport {IconTree} from '../../icons/create-svg-icon';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {ReactElement} from 'react';\nimport {SvgIconProps} from '@common/icons/svg-icon';\n\nconst Endpoint = 'admin/reports';\n\nexport interface HeaderDatum {\n icon: IconTree[] | ReactElement<SvgIconProps>;\n name: string;\n type?: 'number' | 'fileSize' | 'percentage';\n currentValue: number;\n previousValue?: number;\n percentageChange?: number;\n}\n\ninterface FetchAnalyticsReportResponse extends BackendResponse {\n visitorsReport: VisitorsReportData;\n headerReport: HeaderDatum[];\n}\n\ninterface Payload {\n types?: ('visitors' | 'header')[];\n dateRange?: DateRangeValue;\n}\nexport function useAdminReport(payload: Payload = {}) {\n return useQuery({\n queryKey: [Endpoint, payload],\n queryFn: () => fetchAnalyticsReport(payload),\n placeholderData: keepPreviousData,\n });\n}\n\nfunction fetchAnalyticsReport({\n types,\n dateRange,\n}: Payload): Promise<FetchAnalyticsReportResponse> {\n const params: Record<string, any> = {};\n if (types) {\n params.types = types.join(',');\n }\n if (dateRange) {\n params.startDate = dateRange.start.toAbsoluteString();\n params.endDate = dateRange.end.toAbsoluteString();\n params.timezone = dateRange.start.timeZone;\n }\n return apiClient.get(Endpoint, {params}).then(response => response.data);\n}\n","import {Trans} from '@common/i18n/trans';\nimport {Link, Outlet, useParams} from 'react-router-dom';\nimport React, {useState} from 'react';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {DateRangePresets} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-presets';\nimport {ReportDateSelector} from '@common/admin/analytics/report-date-selector';\nimport {Button} from '@common/ui/buttons/button';\nimport {ButtonGroup} from '@common/ui/buttons/button-group';\nimport {AdminHeaderReport} from '@common/admin/analytics/admin-header-report';\nimport {useAdminReport} from '@common/admin/analytics/use-admin-report';\nimport {StaticPageTitle} from '@common/seo/static-page-title';\n\nexport interface AdminReportOutletContext {\n dateRange: DateRangeValue;\n setDateRange: (dateRange: DateRangeValue) => void;\n}\n\nexport function MtdbAdminReportPage() {\n const [dateRange, setDateRange] = useState<DateRangeValue>(() => {\n // This week\n return DateRangePresets[2].getRangeValue();\n });\n const params = useParams();\n const channel = params['*'] || 'plays';\n\n const title =\n channel === 'visitors' ? (\n <Trans message=\"Visitors report\" />\n ) : (\n <Trans message=\"Plays report\" />\n );\n\n return (\n <div className=\"min-h-full overflow-x-hidden p-12 md:p-24\">\n <div className=\"mb-24 items-center justify-between gap-24 md:flex\">\n <StaticPageTitle>{title}</StaticPageTitle>\n <h1 className=\"mb-24 text-3xl font-light md:mb-0\">{title}</h1>\n <div className=\"flex flex-shrink-0 items-center justify-between gap-10 md:gap-24\">\n <ButtonGroup variant=\"outline\" value={channel}>\n <Button value=\"plays\" elementType={Link} to=\"plays\">\n <Trans message=\"Plays\" />\n </Button>\n <Button value=\"visitors\" elementType={Link} to=\"visitors\">\n <Trans message=\"Visitors\" />\n </Button>\n </ButtonGroup>\n <ReportDateSelector value={dateRange} onChange={setDateRange} />\n </div>\n </div>\n <Header dateRange={dateRange} />\n <Outlet context={{dateRange, setDateRange}} />\n </div>\n );\n}\n\ninterface HeaderProps {\n dateRange: DateRangeValue;\n}\nfunction Header({dateRange}: HeaderProps) {\n const {data} = useAdminReport({types: ['header'], dateRange});\n return <AdminHeaderReport report={data?.headerReport} />;\n}\n","import {ReactNode} from 'react';\n\ninterface Props {\n children: ReactNode;\n}\nexport function InsightsReportRow({children}: Props) {\n return (\n <div className=\"mb-12 flex flex-col gap-12 overflow-x-auto md:mb-18 md:gap-18 lg:flex-row lg:items-center\">\n {children}\n </div>\n );\n}\n","import {keepPreviousData, useQuery} from '@tanstack/react-query';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {apiClient} from '@common/http/query-client';\nimport {\n DatasetItem,\n LocationDatasetItem,\n ReportMetric,\n} from '@common/admin/analytics/report-metric';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {User} from '@common/auth/user';\nimport {Title} from '@app/titles/models/title';\nimport {Video} from '@app/titles/models/video';\nimport {Episode} from '@app/titles/models/episode';\nimport {Season} from '@app/titles/models/season';\n\nconst endpoint = 'reports/insights';\n\nexport interface TopModelDatasetItem extends DatasetItem {\n model: Title | Season | Episode | Video | User;\n}\n\nexport interface FetchInsightsReportResponse extends BackendResponse {\n report: {\n totalClicks: number;\n plays: ReportMetric;\n browsers: ReportMetric;\n locations: ReportMetric<LocationDatasetItem>;\n devices: ReportMetric;\n platforms: ReportMetric;\n movies: ReportMetric<TopModelDatasetItem>;\n series: ReportMetric<TopModelDatasetItem>;\n titles: ReportMetric<TopModelDatasetItem>;\n videos: ReportMetric<TopModelDatasetItem>;\n users: ReportMetric<TopModelDatasetItem>;\n seasons: ReportMetric<TopModelDatasetItem>;\n episodes: ReportMetric<TopModelDatasetItem>;\n };\n}\n\nexport type InsightsReportMetric =\n | 'plays'\n | 'devices'\n | 'browsers'\n | 'platforms'\n | 'locations'\n | 'movies'\n | 'series'\n | 'titles'\n | 'seasons'\n | 'episodes'\n | 'users'\n | 'videos';\n\ninterface Payload {\n dateRange: DateRangeValue;\n model?: string;\n metrics?: InsightsReportMetric[];\n}\n\ninterface Options {\n isEnabled: boolean;\n}\n\nexport function useInsightsReport(payload: Payload, options: Options) {\n return useQuery({\n queryKey: [endpoint, payload],\n queryFn: () => fetchReport(endpoint, payload),\n placeholderData: keepPreviousData,\n enabled: options.isEnabled,\n staleTime: Infinity,\n });\n}\n\nfunction fetchReport<\n T extends FetchInsightsReportResponse = FetchInsightsReportResponse,\n>(endpoint: string, payload: Payload): Promise<T> {\n const params: Record<string, any> = {\n model: payload.model,\n metrics: payload.metrics?.join(','),\n };\n params.startDate = payload.dateRange.start.toAbsoluteString();\n params.endDate = payload.dateRange.end.toAbsoluteString();\n params.timezone = payload.dateRange.start.timeZone;\n\n return apiClient.get(endpoint, {params}).then(response => response.data);\n}\n","import React, {useContext} from 'react';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\n\nexport interface InsightsChartsContextValue {\n dateRange: DateRangeValue;\n model: string;\n}\n\nexport const InsightsChartsContext =\n React.createContext<InsightsChartsContextValue>(null!);\n\nexport function useInsightsChartContext() {\n return useContext(InsightsChartsContext);\n}\n","import {cloneElement, ReactElement, useCallback, useRef, useState} from 'react';\nimport {BaseChartProps} from '@common/charts/base-chart';\nimport {UseQueryResult} from '@tanstack/react-query';\nimport {\n FetchInsightsReportResponse,\n InsightsReportMetric,\n useInsightsReport,\n} from '@app/admin/reports/requests/use-insights-report';\nimport {useInsightsChartContext} from '@app/admin/reports/insights/insights-charts-context';\n\ninterface Props {\n children:\n | ReactElement<BaseChartProps>\n | ((\n query: UseQueryResult<FetchInsightsReportResponse>\n ) => ReactElement<BaseChartProps>);\n metric: InsightsReportMetric;\n}\nexport function InsightsAsyncChart({children, metric}: Props) {\n const [isEnabled, setIsEnabled] = useState(false);\n const {dateRange, model} = useInsightsChartContext();\n const query = useInsightsReport(\n {metrics: [metric], model, dateRange},\n {isEnabled}\n );\n const chart = typeof children === 'function' ? children(query) : children;\n const observerRef = useRef<IntersectionObserver>();\n\n const contentRef = useCallback((el: HTMLDivElement | null) => {\n if (el) {\n const observer = new IntersectionObserver(\n ([e]) => {\n if (e.isIntersecting) {\n setIsEnabled(true);\n observerRef.current?.disconnect();\n observerRef.current = undefined;\n }\n },\n {threshold: 0.1} // if only header is visible, don't load\n );\n observerRef.current = observer;\n observer.observe(el);\n } else if (observerRef.current) {\n observerRef.current?.disconnect();\n }\n }, []);\n\n return cloneElement<BaseChartProps>(chart, {\n data: query.data?.report?.[metric],\n isLoading: query.isLoading,\n contentRef,\n });\n}\n","import {LineChart} from '@common/charts/line-chart';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport React from 'react';\nimport {InsightsAsyncChart} from '@app/admin/reports/insights/insights-async-chart';\n\nexport function InsightsPlaysChart() {\n return (\n <InsightsAsyncChart metric=\"plays\">\n {({data}) => (\n <LineChart\n className=\"flex-auto\"\n title={<Trans message=\"Plays\" />}\n hideLegend\n description={\n <Trans\n message=\":count total plays\"\n values={{\n count: (\n <FormattedNumber value={data?.report.plays.total || 0} />\n ),\n }}\n />\n }\n />\n )}\n </InsightsAsyncChart>\n );\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {InsightsAsyncChart} from '@app/admin/reports/insights/insights-async-chart';\nimport {PolarAreaChart} from '@common/charts/polar-area-chart';\n\nexport function InsightsDevicesChart() {\n return (\n <InsightsAsyncChart metric=\"devices\">\n <PolarAreaChart title={<Trans message=\"Top devices\" />} />\n </InsightsAsyncChart>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const InfoIcon = createSvgIcon(\n <path d=\"M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\" />\n, 'InfoOutlined');\n","import {Trans} from '@common/i18n/trans';\nimport {ChartLayout, ChartLayoutProps} from '@common/charts/chart-layout';\nimport React, {Fragment, ReactElement} from 'react';\nimport {ReportMetric} from '@common/admin/analytics/report-metric';\nimport {ChartLoadingIndicator} from '@common/charts/chart-loading-indicator';\nimport {TopModelDatasetItem} from '@app/admin/reports/requests/use-insights-report';\nimport {InfoIcon} from '@common/icons/material/Info';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {Link} from 'react-router-dom';\nimport {UserAvatar} from '@common/ui/images/user-avatar';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {TitleLink} from '@app/titles/title-link';\nimport {UserProfileLink} from '@common/users/user-profile-link';\nimport {MediaPlayIcon} from '@common/icons/media/media-play';\nimport {getWatchLink} from '@app/videos/watch-page/get-watch-link';\nimport {SeasonPoster} from '@app/seasons/season-poster';\nimport {SeasonLink} from '@app/seasons/season-link';\nimport {EpisodePoster} from '@app/episodes/episode-poster/episode-poster';\nimport {EpisodeLink} from '@app/episodes/episode-link';\nimport clsx from 'clsx';\n\ninterface Props extends Partial<ChartLayoutProps> {\n data?: ReportMetric<TopModelDatasetItem>;\n title: ReactElement;\n}\nexport function TopModelsChartLayout({data, isLoading, ...layoutProps}: Props) {\n const dataItems = data?.datasets[0].data || [];\n\n return (\n <ChartLayout\n {...layoutProps}\n className=\"w-1/2 min-w-500 md:min-w-0\"\n contentIsFlex={isLoading}\n contentClassName=\"max-h-[370px] overflow-y-auto compact-scrollbar\"\n >\n {isLoading && <ChartLoadingIndicator />}\n {dataItems.map(item => (\n <div\n key={item.model.id}\n className=\"mb-20 flex items-center justify-between gap-24 text-sm\"\n >\n <div className=\"flex items-center gap-8\">\n <Image\n model={item.model}\n size=\"w-42 h-42\"\n className=\"flex-shrink-0 rounded\"\n />\n <div>\n <div className=\"text-sm\">\n <Name model={item.model} />\n </div>\n <div className=\"text-xs text-muted\">\n <Description model={item.model} />\n </div>\n </div>\n </div>\n <div className=\"flex flex-shrink-0 items-center gap-4\">\n <MediaPlayIcon className=\"text-muted\" size=\"sm\" />\n <Trans\n message=\":count plays\"\n values={{count: <FormattedNumber value={item.value} />}}\n />\n </div>\n </div>\n ))}\n {!isLoading && !dataItems.length ? (\n <div className=\"flex items-center gap-8 text-muted\">\n <InfoIcon size=\"sm\" />\n <Trans message=\"No plays in selected timeframe.\" />\n </div>\n ) : null}\n </ChartLayout>\n );\n}\n\ninterface ImageProps {\n model: TopModelDatasetItem['model'];\n size: string;\n className: string;\n}\nfunction Image({model, size, className}: ImageProps) {\n const link = `/admin/${model.model_type}s/${model.id}`;\n\n switch (model.model_type) {\n case 'title':\n return (\n <TitlePoster\n title={model}\n size={size}\n srcSize=\"sm\"\n className={className}\n link={`/admin/titles/${model.id}/insights`}\n />\n );\n case 'season':\n return (\n <SeasonPoster\n season={model}\n title={model.title!}\n size={size}\n srcSize=\"sm\"\n className={className}\n link={`/admin/titles/${model.title_id}/insights/seasons/${model.number}`}\n />\n );\n case 'episode':\n return (\n <EpisodePoster\n episode={model}\n title={model.title!}\n size={size}\n srcSize=\"sm\"\n className={className}\n link={`/admin/titles/${model.title_id}/insights/seasons/${model.season_number}/episodes/${model.episode_number}`}\n />\n );\n case 'video':\n return model.thumbnail ? (\n <Link to={link} className={clsx(size, className)}>\n <img src={model.thumbnail} className=\"h-full w-full\" alt=\"\" />\n </Link>\n ) : (\n <TitlePoster\n title={model.title!}\n size={size}\n srcSize=\"sm\"\n className={className}\n link={`/admin/videos/${model.id}/insights`}\n />\n );\n case 'user':\n // there's no separate insights page for user\n return <UserAvatar user={model} size={size} className={className} />;\n }\n}\n\ninterface NameProps {\n model: TopModelDatasetItem['model'];\n}\nfunction Name({model}: NameProps) {\n switch (model.model_type) {\n case 'title':\n return <TitleLink title={model} target=\"_blank\" />;\n case 'season':\n return (\n <SeasonLink\n title={model.title!}\n seasonNumber={model.number}\n target=\"_blank\"\n />\n );\n case 'episode':\n return (\n <EpisodeLink\n title={model.title!}\n episode={model}\n seasonNumber={model.season_number}\n target=\"_blank\"\n />\n );\n case 'video':\n return (\n <Link\n to={getWatchLink(model)}\n className=\"hover:underline\"\n target=\"_blank\"\n >\n {model.name}\n </Link>\n );\n case 'user':\n return model.id ? (\n <UserProfileLink user={model} target=\"_blank\" />\n ) : (\n <Fragment>{model.display_name}</Fragment>\n );\n }\n}\n\ninterface DescriptionProps {\n model: TopModelDatasetItem['model'];\n}\nfunction Description({model}: DescriptionProps) {\n switch (model.model_type) {\n case 'title':\n return <span>{model.year}</span>;\n case 'season':\n return <TitleLink title={model.title!} target=\"_blank\" />;\n case 'episode':\n return <TitleLink title={model.title!} target=\"_blank\" />;\n case 'user':\n return null;\n case 'video':\n return <TitleLink title={model.title!} target=\"_blank\" />;\n }\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {InsightsAsyncChart} from '@app/admin/reports/insights/insights-async-chart';\nimport {TopModelsChartLayout} from '@app/admin/reports/top-models-chart-layout';\n\nexport function InsightsSeriesChart() {\n return (\n <InsightsAsyncChart metric=\"series\">\n <TopModelsChartLayout title={<Trans message=\"Most played series\" />} />\n </InsightsAsyncChart>\n );\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {InsightsAsyncChart} from '@app/admin/reports/insights/insights-async-chart';\nimport {TopModelsChartLayout} from '@app/admin/reports/top-models-chart-layout';\n\nexport function InsightsMoviesChart() {\n return (\n <InsightsAsyncChart metric=\"movies\">\n <TopModelsChartLayout title={<Trans message=\"Most played movies\" />} />\n </InsightsAsyncChart>\n );\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {InsightsAsyncChart} from '@app/admin/reports/insights/insights-async-chart';\nimport {TopModelsChartLayout} from '@app/admin/reports/top-models-chart-layout';\n\nexport function InsightsVideosChart() {\n return (\n <InsightsAsyncChart metric=\"videos\">\n <TopModelsChartLayout title={<Trans message=\"Most played videos\" />} />\n </InsightsAsyncChart>\n );\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {InsightsAsyncChart} from '@app/admin/reports/insights/insights-async-chart';\nimport {TopModelsChartLayout} from '@app/admin/reports/top-models-chart-layout';\n\nexport function InsightsUsersChart() {\n return (\n <InsightsAsyncChart metric=\"users\">\n <TopModelsChartLayout title={<Trans message=\"Top users\" />} />\n </InsightsAsyncChart>\n );\n}\n","import React from 'react';\nimport {InsightsAsyncChart} from '@app/admin/reports/insights/insights-async-chart';\nimport {GeoChart} from '@common/admin/analytics/geo-chart/geo-chart';\n\nexport function InsightsLocationsChart() {\n return (\n <InsightsAsyncChart metric=\"locations\">\n <GeoChart className=\"flex-auto w-1/2 lg:max-w-[740px]\" />\n </InsightsAsyncChart>\n );\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {InsightsAsyncChart} from '@app/admin/reports/insights/insights-async-chart';\nimport {PolarAreaChart} from '@common/charts/polar-area-chart';\n\nexport function InsightsPlatformsChart() {\n return (\n <InsightsAsyncChart metric=\"platforms\">\n <PolarAreaChart\n className=\"max-w-500\"\n title={<Trans message=\"Top platforms\" />}\n />\n </InsightsAsyncChart>\n );\n}\n","import React from 'react';\nimport {useOutletContext} from 'react-router-dom';\nimport {AdminReportOutletContext} from '@app/admin/reports/mtdb-admin-report-page';\nimport {InsightsReportRow} from '@app/admin/reports/insights/insights-report-row';\nimport {InsightsPlaysChart} from '@app/admin/reports/insights/insights-plays-chart';\nimport {InsightsDevicesChart} from '@app/admin/reports/insights/insights-devices-chart';\nimport {InsightsSeriesChart} from '@app/admin/reports/insights/insights-series-chart';\nimport {InsightsMoviesChart} from '@app/admin/reports/insights/insights-movies-chart';\nimport {InsightsVideosChart} from '@app/admin/reports/insights/insights-videos-chart';\nimport {InsightsUsersChart} from '@app/admin/reports/insights/insights-users-chart';\nimport {InsightsLocationsChart} from '@app/admin/reports/insights/insights-locations-chart';\nimport {InsightsPlatformsChart} from '@app/admin/reports/insights/insights-platforms-chart';\nimport {InsightsChartsContext} from '@app/admin/reports/insights/insights-charts-context';\n\nexport function AdminInsightsReport() {\n const {dateRange} = useOutletContext<AdminReportOutletContext>();\n const model = 'video_play=0';\n\n return (\n <InsightsChartsContext.Provider value={{dateRange, model}}>\n <InsightsReportRow>\n <InsightsPlaysChart />\n <InsightsDevicesChart />\n </InsightsReportRow>\n <InsightsReportRow>\n <InsightsSeriesChart />\n <InsightsMoviesChart />\n </InsightsReportRow>\n <InsightsReportRow>\n <InsightsVideosChart />\n <InsightsUsersChart />\n </InsightsReportRow>\n <InsightsReportRow>\n <InsightsLocationsChart />\n <InsightsPlatformsChart />\n </InsightsReportRow>\n </InsightsChartsContext.Provider>\n );\n}\n","import React from 'react';\nimport {useOutletContext} from 'react-router-dom';\nimport {VisitorsReportCharts} from '@common/admin/analytics/visitors-report-charts';\nimport {useAdminReport} from '@common/admin/analytics/use-admin-report';\nimport {AdminReportOutletContext} from '@app/admin/reports/mtdb-admin-report-page';\n\nexport function AdminVisitorsReport() {\n const {dateRange} = useOutletContext<AdminReportOutletContext>();\n const {data, isLoading, isPlaceholderData} = useAdminReport({\n types: ['visitors'],\n dateRange: dateRange,\n });\n return (\n <VisitorsReportCharts\n isLoading={isLoading || isPlaceholderData}\n report={data?.visitorsReport}\n />\n );\n}\n","import React, {\n cloneElement,\n Fragment,\n ReactElement,\n ReactNode,\n useState,\n} from 'react';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {DateRangePresets} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-presets';\nimport {ReportDateSelector} from '@common/admin/analytics/report-date-selector';\nimport {Trans} from '@common/i18n/trans';\nimport {InsightsChartsContext} from '@app/admin/reports/insights/insights-charts-context';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {ArrowBackIcon} from '@common/icons/material/ArrowBack';\nimport {Link} from 'react-router-dom';\nimport {StaticPageTitle} from '@common/seo/static-page-title';\n\ninterface Props {\n children: ReactNode;\n reportModel: string;\n name: string;\n backLink?: string;\n title?: ReactElement;\n}\nexport function ModelInsightsPageLayout({\n children,\n reportModel,\n title,\n name,\n backLink,\n}: Props) {\n const [dateRange, setDateRange] = useState<DateRangeValue>(() => {\n // This week\n return DateRangePresets[2].getRangeValue();\n });\n return (\n <Fragment>\n <StaticPageTitle>\n <Trans message=\":name insights\" values={{name}} />\n </StaticPageTitle>\n <div className=\"h-full flex flex-col\">\n <div className=\"flex-auto bg-cover relative\">\n <div className=\"min-h-full p-12 md:p-24 overflow-x-hidden max-w-[1600px] mx-auto flex flex-col\">\n <div className=\"flex-auto\">\n <div className=\"md:flex items-center gap-12 h-48 mt-14 mb-38\">\n <IconButton\n elementType={Link}\n to={backLink || '../../'}\n relative=\"path\"\n className=\"text-muted\"\n >\n <ArrowBackIcon />\n </IconButton>\n {title}\n <div className=\"ml-auto flex-shrink-0 flex items-center justify-between gap-10 md:gap-24\">\n <ReportDateSelector\n value={dateRange}\n onChange={setDateRange}\n />\n </div>\n </div>\n <InsightsChartsContext.Provider\n value={{dateRange, model: reportModel}}\n >\n {children}\n </InsightsChartsContext.Provider>\n </div>\n </div>\n </div>\n </div>\n </Fragment>\n );\n}\n\ninterface ModelInsightsPageTitleProps {\n image: ReactElement<{size: string; className: string}>;\n name: ReactElement;\n description?: ReactElement;\n}\nexport function ModelInsightsPageTitle({\n image,\n name,\n description,\n}: ModelInsightsPageTitleProps) {\n return (\n <div className=\"flex items-center gap-10\">\n {cloneElement(image, {size: 'w-48 h-48', className: 'rounded'})}\n <div>\n <h1 className=\"text-base whitespace-nowrap overflow-hidden overflow-ellipsis\">\n “{name}“ <Trans message=\"insights\" />\n </h1>\n {description && <div className=\"text-muted text-sm\">{description}</div>}\n </div>\n </div>\n );\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {InsightsAsyncChart} from '@app/admin/reports/insights/insights-async-chart';\nimport {TopModelsChartLayout} from '@app/admin/reports/top-models-chart-layout';\n\nexport function InsightsSeasonsChart() {\n return (\n <InsightsAsyncChart metric=\"seasons\">\n <TopModelsChartLayout title={<Trans message=\"Most played seasons\" />} />\n </InsightsAsyncChart>\n );\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {InsightsAsyncChart} from '@app/admin/reports/insights/insights-async-chart';\nimport {TopModelsChartLayout} from '@app/admin/reports/top-models-chart-layout';\n\nexport function InsightsEpisodesChart() {\n return (\n <InsightsAsyncChart metric=\"episodes\">\n <TopModelsChartLayout title={<Trans message=\"Most played episodes\" />} />\n </InsightsAsyncChart>\n );\n}\n","import React from 'react';\nimport {useTitle} from '@app/titles/requests/use-title';\nimport {PageStatus} from '@common/http/page-status';\nimport {\n ModelInsightsPageLayout,\n ModelInsightsPageTitle,\n} from '@app/admin/reports/model-insights-page-layout';\nimport {useParams} from 'react-router-dom';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {TitleLink} from '@app/titles/title-link';\nimport {InsightsReportRow} from '@app/admin/reports/insights/insights-report-row';\nimport {InsightsPlaysChart} from '@app/admin/reports/insights/insights-plays-chart';\nimport {InsightsDevicesChart} from '@app/admin/reports/insights/insights-devices-chart';\nimport {InsightsLocationsChart} from '@app/admin/reports/insights/insights-locations-chart';\nimport {InsightsPlatformsChart} from '@app/admin/reports/insights/insights-platforms-chart';\nimport {InsightsSeasonsChart} from '@app/admin/reports/insights/insights-seasons-chart';\nimport {InsightsEpisodesChart} from '@app/admin/reports/insights/insights-episodes-chart';\n\nexport function TitleInsightsPage() {\n const {titleId} = useParams();\n const query = useTitle('title');\n\n return query.data ? (\n <ModelInsightsPageLayout\n reportModel={`title=${titleId}`}\n name={query.data.title.name}\n title={\n <ModelInsightsPageTitle\n image={<TitlePoster title={query.data.title} srcSize=\"sm\" />}\n name={<TitleLink title={query.data.title} />}\n description={<span>{query.data.title.year}</span>}\n />\n }\n >\n <InsightsReportRow>\n <InsightsPlaysChart />\n <InsightsDevicesChart />\n </InsightsReportRow>\n <InsightsReportRow>\n <InsightsSeasonsChart />\n <InsightsEpisodesChart />\n </InsightsReportRow>\n <InsightsReportRow>\n <InsightsLocationsChart />\n <InsightsPlatformsChart />\n </InsightsReportRow>\n </ModelInsightsPageLayout>\n ) : (\n <PageStatus query={query} loaderClassName=\"absolute inset-0 m-auto\" />\n );\n}\n","import React from 'react';\nimport {PageStatus} from '@common/http/page-status';\nimport {\n ModelInsightsPageLayout,\n ModelInsightsPageTitle,\n} from '@app/admin/reports/model-insights-page-layout';\nimport {TitleLinkWithEpisodeNumber} from '@app/titles/title-link';\nimport {InsightsReportRow} from '@app/admin/reports/insights/insights-report-row';\nimport {InsightsPlaysChart} from '@app/admin/reports/insights/insights-plays-chart';\nimport {InsightsDevicesChart} from '@app/admin/reports/insights/insights-devices-chart';\nimport {InsightsLocationsChart} from '@app/admin/reports/insights/insights-locations-chart';\nimport {InsightsPlatformsChart} from '@app/admin/reports/insights/insights-platforms-chart';\nimport {useEpisode} from '@app/episodes/requests/use-episode';\nimport {EpisodePoster} from '@app/episodes/episode-poster/episode-poster';\nimport {EpisodeLink} from '@app/episodes/episode-link';\n\nexport function EpisodeInsightsPage() {\n const query = useEpisode('episode');\n\n return query.data ? (\n <ModelInsightsPageLayout\n reportModel={`episode=${query.data.episode.id}`}\n name={query.data.episode.name}\n backLink=\"../../../../\"\n title={\n <ModelInsightsPageTitle\n image={\n <EpisodePoster\n episode={query.data.episode}\n title={query.data.title}\n srcSize=\"sm\"\n />\n }\n name={\n <EpisodeLink\n episode={query.data.episode}\n title={query.data.title}\n seasonNumber={query.data.episode.season_number}\n />\n }\n description={\n <TitleLinkWithEpisodeNumber\n episode={query.data.episode}\n title={query.data.title}\n />\n }\n />\n }\n >\n <InsightsReportRow>\n <InsightsPlaysChart />\n <InsightsDevicesChart />\n </InsightsReportRow>\n <InsightsReportRow>\n <InsightsLocationsChart />\n <InsightsPlatformsChart />\n </InsightsReportRow>\n </ModelInsightsPageLayout>\n ) : (\n <PageStatus query={query} loaderClassName=\"absolute inset-0 m-auto\" />\n );\n}\n","import React from 'react';\nimport {PageStatus} from '@common/http/page-status';\nimport {\n ModelInsightsPageLayout,\n ModelInsightsPageTitle,\n} from '@app/admin/reports/model-insights-page-layout';\nimport {TitleLink} from '@app/titles/title-link';\nimport {InsightsReportRow} from '@app/admin/reports/insights/insights-report-row';\nimport {InsightsPlaysChart} from '@app/admin/reports/insights/insights-plays-chart';\nimport {InsightsDevicesChart} from '@app/admin/reports/insights/insights-devices-chart';\nimport {InsightsLocationsChart} from '@app/admin/reports/insights/insights-locations-chart';\nimport {InsightsPlatformsChart} from '@app/admin/reports/insights/insights-platforms-chart';\nimport {useSeason} from '@app/seasons/requests/use-season';\nimport {SeasonPoster} from '@app/seasons/season-poster';\nimport {SeasonLink} from '@app/seasons/season-link';\n\nexport function SeasonInsightsPage() {\n const query = useSeason('season');\n\n return query.data ? (\n <ModelInsightsPageLayout\n reportModel={`season=${query.data.season.id}`}\n name={`Season ${query.data.season.number}`}\n title={\n <ModelInsightsPageTitle\n image={\n <SeasonPoster\n season={query.data.season}\n title={query.data.title}\n srcSize=\"sm\"\n />\n }\n name={\n <SeasonLink\n seasonNumber={query.data.season.number}\n title={query.data.title}\n />\n }\n description={<TitleLink title={query.data.title} />}\n />\n }\n >\n <InsightsReportRow>\n <InsightsPlaysChart />\n <InsightsDevicesChart />\n </InsightsReportRow>\n <InsightsReportRow>\n <InsightsLocationsChart />\n <InsightsPlatformsChart />\n </InsightsReportRow>\n </ModelInsightsPageLayout>\n ) : (\n <PageStatus query={query} loaderClassName=\"absolute inset-0 m-auto\" />\n );\n}\n","import React from 'react';\nimport {PageStatus} from '@common/http/page-status';\nimport {\n ModelInsightsPageLayout,\n ModelInsightsPageTitle,\n} from '@app/admin/reports/model-insights-page-layout';\nimport {TitleLink} from '@app/titles/title-link';\nimport {InsightsReportRow} from '@app/admin/reports/insights/insights-report-row';\nimport {InsightsPlaysChart} from '@app/admin/reports/insights/insights-plays-chart';\nimport {InsightsDevicesChart} from '@app/admin/reports/insights/insights-devices-chart';\nimport {InsightsLocationsChart} from '@app/admin/reports/insights/insights-locations-chart';\nimport {InsightsPlatformsChart} from '@app/admin/reports/insights/insights-platforms-chart';\nimport {useVideo} from '@app/admin/videos/requests/use-video';\nimport {Link} from 'react-router-dom';\nimport {getWatchLink} from '@app/videos/watch-page/get-watch-link';\nimport {VideoThumbnail} from '@app/videos/video-thumbnail';\n\nexport function VideoInsightsPage() {\n const query = useVideo();\n const video = query.data?.video;\n\n return video ? (\n <ModelInsightsPageLayout\n reportModel={`video=${video.id}`}\n name={video.name}\n title={\n <ModelInsightsPageTitle\n image={<VideoThumbnail video={video} srcSize=\"sm\" />}\n name={\n <Link\n to={getWatchLink(video)}\n className=\"hover:underline\"\n target=\"_blank\"\n >\n {video.name}\n </Link>\n }\n description={<TitleLink title={video.title!} />}\n />\n }\n >\n <InsightsReportRow>\n <InsightsPlaysChart />\n <InsightsDevicesChart />\n </InsightsReportRow>\n <InsightsReportRow>\n <InsightsLocationsChart />\n <InsightsPlatformsChart />\n </InsightsReportRow>\n </ModelInsightsPageLayout>\n ) : (\n <PageStatus query={query} loaderClassName=\"absolute inset-0 m-auto\" />\n );\n}\n","import {Navigate, RouteObject} from 'react-router-dom';\nimport React from 'react';\nimport {ChannelsDatatablePage} from '@common/admin/channels/channels-datatable-page';\nimport {EditChannelPage} from '@app/admin/channels/edit-channel-page';\nimport {CreateChannelPage} from '@app/admin/channels/create-channel-page';\nimport {NewsDatatablePage} from '@app/admin/news/news-datatable-page';\nimport {CommentsDatatablePage} from '@common/comments/comments-datatable-page/comments-datatable-page';\nimport {ReviewsDatatablePage} from '@app/admin/reviews/reviews-datatable-page';\nimport {VideosDatatablePage} from '@app/admin/videos/videos-datatable-page';\nimport {CreateVideoPage} from '@app/admin/videos/crupdate/create-video-page';\nimport {EditVideoPage} from '@app/admin/videos/crupdate/edit-video-page';\nimport {TitlesDatatablePage} from '@app/admin/titles/titles-datatable-page';\nimport {EditTitlePage} from '@app/admin/titles/title-editor/edit-title-page';\nimport {SeasonEditorEpisodeList} from '@app/admin/titles/title-editor/seasons-editor/season-editor-episode-list';\nimport {TitleSeasonsEditor} from '@app/admin/titles/title-editor/seasons-editor/title-seasons-editor';\nimport {TitlePrimaryFactsForm} from '@app/admin/titles/title-editor/title-primary-facts-form';\nimport {TitleReviewsEditor} from '@app/admin/titles/title-editor/title-reviews-editor';\nimport {TitleImagesEditor} from '@app/admin/titles/title-editor/title-images-editor';\nimport {TitleVideosEditor} from '@app/admin/titles/title-editor/videos-editor/title-videos-editor';\nimport {EpisodePrimaryFactsForm} from '@app/admin/titles/title-editor/episode-editor/episode-primary-facts-form';\nimport {EpisodeCastEditor} from '@app/admin/titles/title-editor/episode-editor/episode-cast-editor';\nimport {TitleCastEditor} from '@app/admin/titles/title-editor/credits-editor/title-cast-editor';\nimport {TitleCrewEditor} from '@app/admin/titles/title-editor/credits-editor/title-crew-editor';\nimport {SeasonCastEditor} from '@app/admin/titles/title-editor/seasons-editor/season-cast-editor';\nimport {SeasonCrewEditor} from '@app/admin/titles/title-editor/seasons-editor/season-crew-editor';\nimport {EpisodeCrewEditor} from '@app/admin/titles/title-editor/episode-editor/episode-crew-editor';\nimport {TitleTagsEditor} from '@app/admin/titles/title-editor/title-tags-editor/title-tags-editor';\nimport {GENRE_MODEL} from '@app/titles/models/genre';\nimport {KEYWORD_MODEL} from '@app/titles/models/keyword';\nimport {PRODUCTION_COUNTRY_MODEL} from '@app/titles/models/production-country';\nimport {TitleCommentsEditor} from '@app/admin/titles/title-editor/title-comments-editor';\nimport {PeopleDatatablePage} from '@app/admin/people/people-datatable-page';\nimport {CreatePersonPage} from '@app/admin/people/crupdate/create-person-page';\nimport {UpdatePersonPage} from '@app/admin/people/crupdate/update-person-page';\nimport {PersonPrimaryFactsForm} from '@app/admin/people/crupdate/person-primary-facts-form';\nimport {PersonCreditsEditor} from '@app/admin/people/crupdate/person-credits-editor';\nimport {AuthRoute} from '@common/auth/guards/auth-route';\nimport {EditNewsArticlePage} from '@app/admin/news/edit-news-article-page';\nimport {CreateNewsArticlePage} from '@app/admin/news/create-news-article-page';\nimport {TitleTagsDatatablePage} from '@app/admin/title-tags/title-tags-editor/title-tags-datatable-page';\nimport {ListsDatatablePage} from '@app/admin/lists/lists-datatable-page';\nimport {CreateUserListPage} from '@app/user-lists/pages/create-user-list-page';\nimport {EditUserListPage} from '@app/user-lists/pages/edit-user-list-page';\nimport {MtdbAdminReportPage} from '@app/admin/reports/mtdb-admin-report-page';\nimport {AdminInsightsReport} from '@app/admin/reports/admin-insights-report';\nimport {AdminVisitorsReport} from '@app/admin/reports/admin-visitors-report';\nimport {TitleInsightsPage} from '@app/admin/reports/pages/title-insights-page';\nimport {EpisodeInsightsPage} from '@app/admin/reports/pages/episode-insights-page';\nimport {SeasonInsightsPage} from '@app/admin/reports/pages/season-insights-page';\nimport {VideoInsightsPage} from '@app/admin/reports/pages/video-insights-page';\n\nexport const AppAdminRoutes: RouteObject[] = [\n // Reports\n {\n path: '/',\n element: <MtdbAdminReportPage />,\n children: [\n {index: true, element: <AdminInsightsReport />},\n {path: 'plays', element: <AdminInsightsReport />},\n {path: 'visitors', element: <AdminVisitorsReport />},\n ],\n },\n // Channels\n {\n path: 'channels',\n element: <ChannelsDatatablePage />,\n },\n {\n path: 'channels/new',\n element: <CreateChannelPage />,\n },\n {\n path: 'channels/:slugOrId/edit',\n element: <EditChannelPage />,\n },\n\n // User lists\n {\n path: 'lists',\n element: <ListsDatatablePage />,\n },\n {\n path: 'lists/new',\n element: <CreateUserListPage />,\n },\n {\n path: 'lists/:slugOrId/edit',\n element: <EditUserListPage />,\n },\n\n // People\n {\n path: 'people',\n element: <PeopleDatatablePage />,\n },\n {\n path: 'people/new',\n element: <CreatePersonPage />,\n },\n {\n path: 'people/:personId/edit',\n element: <UpdatePersonPage />,\n children: [\n {\n index: true,\n element: <Navigate to=\"primary-facts\" replace />,\n },\n {\n path: 'primary-facts',\n element: <PersonPrimaryFactsForm />,\n },\n {\n path: 'credits',\n element: <PersonCreditsEditor />,\n },\n ],\n },\n\n // Titles\n {\n path: 'titles',\n element: <TitlesDatatablePage />,\n },\n {\n path: 'titles/new',\n element: <TitlePrimaryFactsForm />,\n },\n {\n path: 'videos/:videoId/insights',\n element: <VideoInsightsPage />,\n },\n {\n path: 'titles/:titleId/insights',\n element: <TitleInsightsPage />,\n },\n {\n path: 'titles/:titleId/insights/seasons/:season',\n element: <SeasonInsightsPage />,\n },\n {\n path: 'titles/:titleId/insights/seasons/:season/episodes/:episode',\n element: <EpisodeInsightsPage />,\n },\n {\n path: 'titles/:titleId/edit',\n element: <Navigate to=\"primary-facts\" replace={true} />,\n },\n {\n path: 'titles/:titleId/edit',\n element: <EditTitlePage />,\n children: [\n {\n index: true,\n element: <TitlePrimaryFactsForm />,\n },\n {\n path: 'primary-facts',\n element: <TitlePrimaryFactsForm />,\n },\n {\n path: 'reviews',\n element: <TitleReviewsEditor />,\n },\n {\n path: 'comments',\n element: <TitleCommentsEditor />,\n },\n {\n path: 'images',\n element: <TitleImagesEditor />,\n },\n {\n path: 'genres',\n element: <TitleTagsEditor type={GENRE_MODEL} />,\n },\n {\n path: 'keywords',\n element: <TitleTagsEditor type={KEYWORD_MODEL} />,\n },\n {\n path: 'countries',\n element: <TitleTagsEditor type={PRODUCTION_COUNTRY_MODEL} />,\n },\n {\n path: 'cast',\n element: <TitleCastEditor />,\n },\n {\n path: 'crew',\n element: <TitleCrewEditor />,\n },\n {\n path: 'videos',\n element: <TitleVideosEditor />,\n },\n {\n path: 'videos/seasons/:season',\n element: <TitleVideosEditor />,\n },\n {\n path: 'videos/seasons/:season/episodes/:episode',\n element: <TitleVideosEditor />,\n },\n\n // SEASONS\n {\n path: 'seasons',\n element: <TitleSeasonsEditor />,\n },\n {\n path: 'seasons/:season',\n children: [\n {\n index: true,\n element: <Navigate to=\"episodes\" replace />,\n },\n {\n path: 'Episodes',\n element: <SeasonEditorEpisodeList />,\n },\n {\n path: 'cast',\n element: <SeasonCastEditor />,\n },\n {\n path: 'crew',\n element: <SeasonCrewEditor />,\n },\n ],\n },\n\n // EPISODES\n {\n path: 'seasons/:season/episodes/new',\n element: <EpisodePrimaryFactsForm />,\n },\n {\n path: 'seasons/:season/episodes/:episode',\n children: [\n {\n index: true,\n element: <Navigate to=\"primary-facts\" replace />,\n },\n {\n path: 'primary-facts',\n element: <EpisodePrimaryFactsForm />,\n },\n {\n path: 'cast',\n element: <EpisodeCastEditor />,\n },\n {\n path: 'crew',\n element: <EpisodeCrewEditor />,\n },\n ],\n },\n ],\n },\n\n // Video editor with no season or episode selected\n {\n path: 'titles/:titleId/edit/videos/new',\n element: <CreateVideoPage />,\n },\n\n {\n path: 'titles/:titleId/edit/videos/edit/:videoId',\n element: <EditVideoPage />,\n },\n\n // Video editor with season selected\n {\n path: 'titles/:titleId/edit/videos/seasons/:season/new',\n element: <CreateVideoPage />,\n },\n {\n path: 'titles/:titleId/edit/videos/seasons/:season/edit/:videoId',\n element: <EditVideoPage />,\n },\n\n // Video editor with season and episode selected\n {\n path: 'titles/:titleId/edit/videos/seasons/:season/episodes/:episode/new',\n element: <CreateVideoPage />,\n },\n {\n path: 'titles/:titleId/edit/videos/seasons/:season/episodes/:episode/edit/:videoId',\n element: <EditVideoPage />,\n },\n\n // News articles\n {\n path: 'news',\n element: <NewsDatatablePage />,\n },\n {\n path: 'news/add',\n element: (\n <AuthRoute permission=\"news.update\">\n <CreateNewsArticlePage />\n </AuthRoute>\n ),\n },\n {\n path: 'news/:articleId/edit',\n element: (\n <AuthRoute permission=\"news.update\">\n <EditNewsArticlePage />\n </AuthRoute>\n ),\n },\n\n // Comments\n {\n path: 'comments',\n element: <CommentsDatatablePage />,\n },\n\n // Reviews\n {\n path: 'reviews',\n element: <ReviewsDatatablePage />,\n },\n\n // Videos\n {\n path: 'videos',\n element: <VideosDatatablePage />,\n },\n {\n path: 'videos/new',\n element: <CreateVideoPage />,\n },\n {\n path: 'videos/:videoId/edit',\n element: <EditVideoPage />,\n },\n\n // Title tags\n {\n path: 'keywords',\n element: <TitleTagsDatatablePage type={KEYWORD_MODEL} />,\n },\n {\n path: 'genres',\n element: <TitleTagsDatatablePage type={GENRE_MODEL} />,\n },\n];\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {CustomPage} from '../custom-page';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {useParams} from 'react-router-dom';\nimport {CreateCustomPagePayload} from '@common/admin/custom-pages/requests/use-create-custom-page';\n\ninterface Response extends BackendResponse {\n page: CustomPage;\n}\n\nexport function useUpdateCustomPage(endpoint?: string) {\n const {pageId} = useParams();\n const finalEndpoint = `${endpoint || 'custom-pages'}/${pageId}`;\n return useMutation({\n mutationFn: (payload: CreateCustomPagePayload) =>\n updatePage(payload, finalEndpoint),\n onError: err => showHttpErrorToast(err),\n onSuccess: async () => {\n await queryClient.invalidateQueries({queryKey: ['custom-pages']});\n await queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey(finalEndpoint),\n });\n toast(message('Page updated'));\n },\n });\n}\n\nfunction updatePage(\n payload: CreateCustomPagePayload,\n endpoint: string,\n): Promise<Response> {\n return apiClient.put(`${endpoint}`, payload).then(r => r.data);\n}\n","import {useCustomPage} from '@common/custom-page/use-custom-page';\nimport React, {Fragment, Suspense} from 'react';\nimport {PageMetaTags} from '@common/http/page-meta-tags';\nimport {PageStatus} from '@common/http/page-status';\nimport {CustomPage} from '@common/admin/custom-pages/custom-page';\nimport {FormProvider, useForm} from 'react-hook-form';\nimport {useUpdateCustomPage} from '@common/admin/custom-pages/requests/use-update-custom-page';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {ArticleEditorTitle} from '@common/article-editor/article-editor-title';\nimport {ArticleEditorStickyHeader} from '@common/article-editor/article-editor-sticky-header';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {CreateCustomPagePayload} from '@common/admin/custom-pages/requests/use-create-custom-page';\nimport {FullPageLoader} from '@common/ui/progress/full-page-loader';\n\nconst ArticleBodyEditor = React.lazy(\n () => import('@common/article-editor/article-body-editor'),\n);\n\nexport function EditCustomPage() {\n const query = useCustomPage();\n\n return query.data ? (\n <Fragment>\n <PageMetaTags query={query} />\n <PageContent page={query.data.page} />\n </Fragment>\n ) : (\n <div className=\"relative w-full h-full\">\n <PageStatus query={query} />\n </div>\n );\n}\n\ninterface PageContentProps {\n page: CustomPage;\n}\nfunction PageContent({page}: PageContentProps) {\n const navigate = useNavigate();\n const crupdatePage = useUpdateCustomPage();\n const form = useForm<CreateCustomPagePayload>({\n defaultValues: {\n title: page.title,\n slug: page.slug,\n body: page.body,\n },\n });\n\n const handleSave = (editorContent: string) => {\n crupdatePage.mutate(\n {\n ...form.getValues(),\n body: editorContent,\n },\n {\n onSuccess: () => navigate('../..', {relative: 'path'}),\n },\n );\n };\n\n return (\n <Suspense fallback={<FullPageLoader />}>\n <ArticleBodyEditor initialContent={page.body}>\n {(content, editor) => (\n <FileUploadProvider>\n <FormProvider {...form}>\n <ArticleEditorStickyHeader\n editor={editor}\n backLink=\"../..\"\n isLoading={crupdatePage.isPending}\n onSave={handleSave}\n />\n <div className=\"mx-20\">\n <div className=\"prose dark:prose-invert mx-auto flex-auto\">\n <ArticleEditorTitle />\n {content}\n </div>\n </div>\n </FormProvider>\n </FileUploadProvider>\n )}\n </ArticleBodyEditor>\n </Suspense>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {CustomPage} from '../custom-page';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\n\ninterface Response extends BackendResponse {\n page: CustomPage;\n}\n\nexport interface CreateCustomPagePayload {\n title?: string;\n body?: string;\n slug?: string;\n hide_nav?: boolean;\n}\n\nexport function useCreateCustomPage(endpoint?: string) {\n const finalEndpoint = endpoint || 'custom-pages';\n return useMutation({\n mutationFn: (payload: CreateCustomPagePayload) =>\n createPage(payload, finalEndpoint),\n onError: err => showHttpErrorToast(err),\n onSuccess: async () => {\n await queryClient.invalidateQueries({queryKey: ['custom-pages']});\n await queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey(finalEndpoint),\n });\n toast(message('Page created'));\n },\n });\n}\n\nfunction createPage(\n payload: CreateCustomPagePayload,\n endpoint: string,\n): Promise<Response> {\n return apiClient.post(`${endpoint}`, payload).then(r => r.data);\n}\n","import React, {Suspense} from 'react';\nimport {FormProvider, useForm} from 'react-hook-form';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {ArticleEditorTitle} from '@common/article-editor/article-editor-title';\nimport {ArticleEditorStickyHeader} from '@common/article-editor/article-editor-sticky-header';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {\n CreateCustomPagePayload,\n useCreateCustomPage,\n} from '@common/admin/custom-pages/requests/use-create-custom-page';\nimport {FullPageLoader} from '@common/ui/progress/full-page-loader';\n\nconst ArticleBodyEditor = React.lazy(\n () => import('@common/article-editor/article-body-editor'),\n);\n\nexport function CreateCustomPage() {\n const navigate = useNavigate();\n const createPage = useCreateCustomPage();\n const form = useForm<CreateCustomPagePayload>();\n\n const handleSave = (editorContent: string) => {\n createPage.mutate(\n {\n ...form.getValues(),\n body: editorContent,\n },\n {\n onSuccess: () => navigate('../', {relative: 'path'}),\n },\n );\n };\n\n return (\n <Suspense fallback={<FullPageLoader />}>\n <ArticleBodyEditor>\n {(content, editor) => (\n <FileUploadProvider>\n <FormProvider {...form}>\n <ArticleEditorStickyHeader\n editor={editor}\n isLoading={createPage.isPending}\n onSave={handleSave}\n backLink=\"../\"\n />\n <div className=\"mx-20\">\n <div className=\"prose dark:prose-invert mx-auto flex-auto\">\n <ArticleEditorTitle />\n {content}\n </div>\n </div>\n </FormProvider>\n </FileUploadProvider>\n )}\n </ArticleBodyEditor>\n </Suspense>\n );\n}\n","export default \"__VITE_ASSET__03cbd387__\"","import {useTrans} from '@common/i18n/use-trans';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {SearchIcon} from '@common/icons/material/Search';\nimport {message} from '@common/i18n/message';\nimport {Select} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {FontSelectorState} from '@common/ui/font-selector/font-selector-state';\n\nexport interface FontSelectorFilterValue {\n query: string;\n category: string;\n}\n\ninterface FiltersHeaderProps {\n state: FontSelectorState;\n}\nexport function FontSelectorFilters({\n state: {filters, setFilters},\n}: FiltersHeaderProps) {\n const {trans} = useTrans();\n return (\n <div className=\"mb-24 items-center gap-24 @xs:flex\">\n <TextField\n className=\"mb-12 flex-auto @xs:mb-0\"\n value={filters.query}\n onChange={e => {\n setFilters({\n ...filters,\n query: e.target.value,\n });\n }}\n startAdornment={<SearchIcon />}\n placeholder={trans(message('Search fonts'))}\n />\n <Select\n className=\"flex-auto\"\n selectionMode=\"single\"\n selectedValue={filters.category}\n onSelectionChange={value => {\n setFilters({\n ...filters,\n category: value as string,\n });\n }}\n >\n <Item value=\"\">\n <Trans message=\"All categories\" />\n </Item>\n <Item value=\"serif\">\n <Trans message=\"Serif\" />\n </Item>\n <Item value=\"sans-serif\">\n <Trans message=\"Sans serif\" />\n </Item>\n <Item value=\"display\">\n <Trans message=\"Display\" />\n </Item>\n <Item value=\"handwriting\">\n <Trans message=\"Handwriting\" />\n </Item>\n <Item value=\"monospace\">\n <Trans message=\"Monospace\" />\n </Item>\n </Select>\n </div>\n );\n}\n","import {useCollator} from './use-collator';\n\ninterface Filter {\n /** Returns whether a string starts with a given substring. */\n startsWith(string: string, substring: string): boolean;\n /** Returns whether a string ends with a given substring. */\n endsWith(string: string, substring: string): boolean;\n /** Returns whether a string contains a given substring. */\n contains(string: string, substring: string): boolean;\n}\n\nexport function useFilter(options?: Intl.CollatorOptions): Filter {\n const collator = useCollator({\n usage: 'search',\n ...options,\n });\n\n return {\n startsWith(string, substring) {\n if (substring.length === 0) {\n return true;\n }\n\n string = string.normalize('NFC');\n substring = substring.normalize('NFC');\n return (\n collator.compare(string.slice(0, substring.length), substring) === 0\n );\n },\n endsWith(string, substring) {\n if (substring.length === 0) {\n return true;\n }\n\n string = string.normalize('NFC');\n substring = substring.normalize('NFC');\n return collator.compare(string.slice(-substring.length), substring) === 0;\n },\n contains(string, substring) {\n if (substring.length === 0) {\n return true;\n }\n\n string = string.normalize('NFC');\n substring = substring.normalize('NFC');\n\n let scan = 0;\n const sliceLen = substring.length;\n for (; scan + sliceLen <= string.length; scan++) {\n const slice = string.slice(scan, scan + sliceLen);\n if (collator.compare(substring, slice) === 0) {\n return true;\n }\n }\n\n return false;\n },\n };\n}\n","import {FontConfig} from '@common/http/value-lists';\nimport {message} from '@common/i18n/message';\n\nexport const BrowserSafeFonts: FontConfig[] = [\n {\n label: message('System'),\n family:\n 'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"',\n category: 'sans-serif',\n },\n {family: 'Impact, Charcoal, sans-serif', category: 'sans-serif'},\n {family: 'Arial, Helvetica Neue, Helvetica, sans-serif', category: 'serif'},\n {family: '\"Comic Sans MS\", cursive, sans-serif', category: 'Handwriting'},\n {family: 'Century Gothic, sans-serif', category: 'sans-serif'},\n {family: '\"Courier New\", Courier, monospace', category: 'monospace'},\n {\n family: '\"Lucida Sans Unicode\", \"Lucida Grande\", sans-serif',\n category: 'sans-serif',\n },\n {family: '\"Times New Roman\", Times, serif', category: 'serif'},\n {family: '\"Lucida Console\", Monaco, monospace', category: 'monospace'},\n {family: '\"Andele Mono\", monospace, sans-serif', category: 'sans-serif'},\n {family: 'Verdana, Geneva, sans-serif', category: 'sans-serif'},\n {\n family: '\"Helvetica Neue\", Helvetica, Arial, sans-serif',\n category: 'sans-serif',\n },\n];\n","import {useCallback, useEffect, useMemo, useState} from 'react';\nimport {FontSelectorFilterValue} from '@common/ui/font-selector/font-selector-filters';\nimport {FontConfig, useValueLists} from '@common/http/value-lists';\nimport {useFilter} from '@common/i18n/use-filter';\nimport {BrowserSafeFonts} from '@common/ui/font-picker/browser-safe-fonts';\nimport {chunkArray} from '@common/utils/array/chunk-array';\nimport {loadFonts} from '@common/ui/font-picker/load-fonts';\n\nexport interface FontSelectorState extends UseFontSelectorProps {\n fonts: FontConfig[];\n filteredFonts: FontConfig[];\n pages: FontConfig[][];\n isLoading: boolean;\n filters: FontSelectorFilterValue;\n setFilters: (filters: FontSelectorFilterValue) => void;\n currentPage: number;\n setCurrentPage: (page: number) => void;\n}\n\nexport interface UseFontSelectorProps {\n value?: FontConfig;\n onChange: (value: FontConfig) => void;\n}\nexport function useFontSelectorState({\n value,\n onChange,\n}: UseFontSelectorProps): FontSelectorState {\n const {data, isLoading} = useValueLists(['googleFonts']);\n const [currentPage, setCurrentPage] = useState(0);\n\n const [filters, setFilterState] = useState<FontSelectorFilterValue>({\n query: '',\n category: value?.category ?? '',\n });\n const {contains} = useFilter({\n sensitivity: 'base',\n });\n\n const setFilters = useCallback((filters: FontSelectorFilterValue) => {\n setFilterState(filters);\n // reset to first page when searching or changing category\n setCurrentPage(0);\n }, []);\n\n const allFonts = useMemo(() => {\n return BrowserSafeFonts.concat(data?.googleFonts ?? []);\n }, [data?.googleFonts]);\n\n const filteredFonts = useMemo(() => {\n return allFonts.filter(font => {\n return (\n contains(font.family, filters.query) &&\n (!filters.category ||\n font.category?.toLowerCase() === filters.category.toLowerCase())\n );\n });\n }, [allFonts, filters, contains]);\n\n const pages = useMemo(() => {\n return chunkArray(filteredFonts, 20);\n }, [filteredFonts]);\n const fonts = pages[currentPage];\n\n useEffect(() => {\n const id = 'font-selector';\n if (fonts?.length) {\n loadFonts(fonts, {id});\n }\n }, [fonts, currentPage]);\n\n return {\n fonts: fonts || [],\n currentPage,\n filteredFonts: filteredFonts || [],\n setCurrentPage,\n isLoading,\n filters,\n setFilters,\n value,\n onChange,\n pages,\n };\n}\n","import {Trans} from '@common/i18n/trans';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {KeyboardArrowLeftIcon} from '@common/icons/material/KeyboardArrowLeft';\nimport {KeyboardArrowRightIcon} from '@common/icons/material/KeyboardArrowRight';\nimport React from 'react';\nimport {FontSelectorState} from '@common/ui/font-selector/font-selector-state';\n\ninterface FontSelectorPaginationProps {\n state: FontSelectorState;\n}\nexport function FontSelectorPagination({\n state: {currentPage = 0, setCurrentPage, filteredFonts, pages},\n}: FontSelectorPaginationProps) {\n const total = filteredFonts?.length || 0;\n\n return (\n <div className=\"flex items-center justify-end gap-24 text-sm mt-30 pt-14 border-t\">\n {total > 0 && (\n <div>\n <Trans\n message=\":from - :to of :total\"\n values={{\n from: currentPage * 20 + 1,\n to: Math.min((currentPage + 1) * 20, total),\n total,\n }}\n />\n </div>\n )}\n <div className=\"text-muted\">\n <IconButton\n disabled={currentPage < 1}\n onClick={() => {\n setCurrentPage(Math.max(0, currentPage - 1));\n }}\n >\n <KeyboardArrowLeftIcon />\n </IconButton>\n <IconButton\n disabled={currentPage >= pages.length - 1}\n onClick={() => {\n setCurrentPage(currentPage + 1);\n }}\n >\n <KeyboardArrowRightIcon />\n </IconButton>\n </div>\n </div>\n );\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\nimport clsx from 'clsx';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport fontImage from './font.svg';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport {FontSelectorFilters} from '@common/ui/font-selector/font-selector-filters';\nimport {\n FontSelectorState,\n UseFontSelectorProps,\n useFontSelectorState,\n} from '@common/ui/font-selector/font-selector-state';\nimport {FontSelectorPagination} from '@common/ui/font-selector/font-selector-pagination';\nimport {FontConfig} from '@common/http/value-lists';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\n\ninterface FontSelectorProps extends UseFontSelectorProps {\n className?: string;\n}\nexport function FontSelector(props: FontSelectorProps) {\n const state = useFontSelectorState(props);\n return (\n <div className={props.className}>\n <FontSelectorFilters state={state} />\n <AnimatePresence initial={false} mode=\"wait\">\n <FontList state={state} />\n </AnimatePresence>\n <FontSelectorPagination state={state} />\n </div>\n );\n}\n\ninterface FontListProps {\n state: FontSelectorState;\n}\nfunction FontList({state}: FontListProps) {\n const {isLoading, fonts} = state;\n\n const gridClassName =\n 'grid gap-24 grid-cols-[repeat(auto-fill,minmax(90px,1fr))] items-start';\n\n if (isLoading) {\n return <FontListSkeleton className={gridClassName} />;\n }\n\n if (!fonts?.length) {\n return (\n <IllustratedMessage\n className=\"mt-60\"\n size=\"sm\"\n image={<SvgImage src={fontImage} />}\n title={<Trans message=\"No matching fonts\" />}\n description={\n <Trans message=\"Try another search query or different category\" />\n }\n />\n );\n }\n\n return (\n <m.div key=\"font-list\" {...opacityAnimation} className={gridClassName}>\n {fonts?.map(font => (\n <FontButton key={font.family} font={font} state={state} />\n ))}\n </m.div>\n );\n}\n\ninterface FontButtonProps {\n font: FontConfig;\n state: FontSelectorState;\n}\nfunction FontButton({font, state: {value, onChange}}: FontButtonProps) {\n const isActive = value?.family === font.family;\n const displayName = font.family.split(',')[0].replace(/\"/g, '');\n\n return (\n <ButtonBase\n key={font.family}\n display=\"block\"\n onClick={() => {\n onChange(font);\n }}\n >\n <span\n className={clsx(\n 'flex aspect-square items-center justify-center rounded-panel border text-4xl transition-bg-color hover:bg-hover md:text-5xl',\n isActive && 'ring-2 ring-primary ring-offset-2',\n )}\n >\n <span style={{fontFamily: font.family}}>Aa</span>\n </span>\n <span\n className={clsx(\n 'mt-6 block overflow-hidden overflow-ellipsis whitespace-nowrap text-sm',\n isActive && 'text-primary',\n )}\n >\n {font.label ? <Trans {...font.label} /> : displayName}\n </span>\n </ButtonBase>\n );\n}\n\ninterface FontListSkeletonProps {\n className: string;\n}\nfunction FontListSkeleton({className}: FontListSkeletonProps) {\n const items = Array.from(Array(20).keys());\n return (\n <m.div key=\"font-list-skeleton\" {...opacityAnimation} className={className}>\n {items.map(index => (\n <div key={index}>\n <div className=\"aspect-square\">\n <Skeleton display=\"block\" variant=\"rect\" />\n </div>\n <Skeleton className=\"mt-6 text-sm\" />\n </div>\n ))}\n </m.div>\n );\n}\n","import {FontSelector} from '@common/ui/font-selector/font-selector';\nimport {useFormContext} from 'react-hook-form';\nimport {\n appearanceState,\n AppearanceValues,\n} from '@common/admin/appearance/appearance-store';\nimport {useParams} from 'react-router-dom';\n\ntype Font = 'appearance.themes.all.1.font';\n\nexport function ThemeFontPanel() {\n const {setValue, watch} = useFormContext<AppearanceValues>();\n const {themeIndex} = useParams();\n const key = `appearance.themes.all.${themeIndex}.font` as Font;\n return (\n <FontSelector\n value={watch(key)}\n onChange={font => {\n setValue(key, font, {shouldDirty: true});\n appearanceState().preview.setThemeFont(font);\n }}\n />\n );\n}\n","import {Trans} from '@common/i18n/trans';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\nimport {ReactNode} from 'react';\nimport clsx from 'clsx';\nimport {useFormContext} from 'react-hook-form';\nimport {AppearanceValues} from '@common/admin/appearance/appearance-store';\nimport {message} from '@common/i18n/message';\nimport {useParams} from 'react-router-dom';\n\nconst radiusMap = {\n 'rounded-none': {\n label: message('Square'),\n value: '0px',\n },\n rounded: {\n label: message('Small'),\n value: '0.25rem',\n },\n 'rounded-md': {\n label: message('Medium'),\n value: '0.375rem',\n },\n 'rounded-lg': {\n label: message('Large'),\n value: '0.5rem',\n },\n 'rounded-xl': {\n label: message('Larger'),\n value: '0.75rem',\n },\n 'rounded-full': {\n label: message('Pill'),\n value: '9999px',\n },\n};\n\nexport function ThemeRadiusPanel() {\n return (\n <div className=\"space-y-24\">\n <RadiusSelector\n label={<Trans message=\"Button rounding\" />}\n name=\"button-radius\"\n />\n <RadiusSelector\n label={<Trans message=\"Input rounding\" />}\n name=\"input-radius\"\n />\n <RadiusSelector\n label={<Trans message=\"Panel rounding\" />}\n name=\"panel-radius\"\n hidePill\n />\n </div>\n );\n}\n\ninterface RadiusSelectorProps {\n label: ReactNode;\n name: string;\n hidePill?: boolean;\n}\nfunction RadiusSelector({label, name, hidePill}: RadiusSelectorProps) {\n const {themeIndex} = useParams();\n const {watch, setValue} = useFormContext<AppearanceValues>();\n const formKey =\n `appearance.themes.all.${themeIndex}.values.--be-${name}` as 'appearance.themes.all.1.values.--be-button-radius';\n const currentValue = watch(formKey);\n return (\n <div>\n <div className=\"mb-10 text-sm font-semibold\">{label}</div>\n <div className=\"grid grid-cols-3 gap-10 text-sm\">\n {Object.entries(radiusMap)\n .filter(([key]) => !hidePill || !key.includes('full'))\n .map(([key, {label, value}]) => (\n <PreviewButton\n key={key}\n radius={key}\n isActive={value === currentValue}\n onClick={() => {\n setValue(formKey, value, {shouldDirty: true});\n }}\n >\n <Trans {...label} />\n </PreviewButton>\n ))}\n </div>\n </div>\n );\n}\n\ninterface PreviewButtonProps {\n radius: string;\n children: ReactNode;\n isActive: boolean;\n onClick: () => void;\n}\nfunction PreviewButton({\n radius,\n children,\n isActive,\n onClick,\n}: PreviewButtonProps) {\n return (\n <ButtonBase\n display=\"block\"\n className={clsx(\n 'h-36 border-2 hover:bg-hover',\n radius,\n isActive && 'border-primary',\n )}\n onClick={onClick}\n >\n {children}\n </ButtonBase>\n );\n}\n","import {Tabs} from '@common/ui/tabs/tabs';\nimport {Tab} from '@common/ui/tabs/tab';\nimport {Trans} from '@common/i18n/trans';\nimport {TabList} from '@common/ui/tabs/tab-list';\nimport {Link, Outlet, useLocation} from 'react-router-dom';\n\nconst tabs = ['schedule', 'error', 'outgoing-email'];\n\nexport function LogsPage() {\n const {pathname} = useLocation();\n const activeTab = pathname.split('/').pop() as string;\n const activeIndex = tabs.includes(activeTab) ? tabs.indexOf(activeTab) : 0;\n return (\n <Tabs className=\"p-12 md:p-24\" selectedTab={activeIndex}>\n <TabList>\n <Tab elementType={Link} to=\"/admin/logs/schedule\" replace>\n <Trans message=\"Schedule\" />\n </Tab>\n <Tab elementType={Link} to=\"/admin/logs/error\" replace>\n <Trans message=\"Error\" />\n </Tab>\n <Tab elementType={Link} to=\"/admin/logs/outgoing-email\" replace>\n <Trans message=\"Email\" />\n </Tab>\n </TabList>\n <Outlet />\n </Tabs>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {message} from '@common/i18n/message';\nimport {toast} from '@common/ui/toast/toast';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n id: number;\n}\n\nexport function useRerunScheduledCommand() {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (payload: Payload) => rerunCommand(payload),\n onSuccess: async (response, props) => {\n await queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('logs/schedule'),\n });\n toast.positive(trans(message('Command reran')));\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction rerunCommand({id}: Payload): Promise<Response> {\n return apiClient.post(`logs/schedule/rerun/${id}`).then(r => r.data);\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const EventRepeatIcon = createSvgIcon(\n <path d=\"M21 12V6c0-1.1-.9-2-2-2h-1V2h-2v2H8V2H6v2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h7v-2H5V10h14v2h2zm-2-4H5V6h14v2zm-3.36 12c.43 1.45 1.77 2.5 3.36 2.5 1.93 0 3.5-1.57 3.5-3.5s-1.57-3.5-3.5-3.5c-.95 0-1.82.38-2.45 1H18V18h-4v-4h1.5v1.43c.9-.88 2.14-1.43 3.5-1.43 2.76 0 5 2.24 5 5s-2.24 5-5 5c-2.42 0-4.44-1.72-4.9-4h1.54z\" />\n, 'EventRepeatOutlined');\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {Trans} from '@common/i18n/trans';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {BooleanIndicator} from '@common/datatable/column-templates/boolean-indicator';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport React from 'react';\nimport {ScheduleLogItem} from '@common/admin/logging/schedule/schedule-log-item';\nimport {useRerunScheduledCommand} from '@common/admin/logging/schedule/use-rerurun-scheduled-command';\nimport {EventRepeatIcon} from '@common/icons/material/EventRepeat';\nimport {FormattedRelativeTime} from '@common/i18n/formatted-relative-time';\n\nexport const ScheduleDatatableColumns: ColumnConfig<ScheduleLogItem>[] = [\n {\n key: 'command',\n allowsSorting: true,\n visibleInMode: 'all',\n width: 'flex-3 min-w-200',\n header: () => <Trans message=\"Name\" />,\n body: item => (\n <NameWithAvatar label={item.command} description={item.output} />\n ),\n },\n {\n key: 'ran_at',\n allowsSorting: true,\n header: () => <Trans message=\"Ran at\" />,\n body: item => <FormattedRelativeTime date={item.ran_at} />,\n },\n {\n key: 'duration',\n allowsSorting: true,\n header: () => <Trans message=\"Duration\" />,\n body: item => `${item.duration}ms`,\n },\n {\n key: 'exit_code',\n allowsSorting: true,\n header: () => <Trans message=\"Completed\" />,\n body: item => <BooleanIndicator value={item.exit_code === 0} />,\n },\n {\n key: 'count_in_last_hour',\n allowsSorting: true,\n header: () => <Trans message=\"Runs recently\" />,\n body: item => <FormattedNumber value={item.count_in_last_hour} />,\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n align: 'end',\n width: 'w-42 flex-shrink-0',\n visibleInMode: 'all',\n body: item => <RerunButton item={item} />,\n },\n];\n\ninterface RerunButtonProps {\n item: ScheduleLogItem;\n}\nfunction RerunButton({item}: RerunButtonProps) {\n const rerunCommand = useRerunScheduledCommand();\n return (\n <Tooltip label={<Trans message=\"Rerun now\" />}>\n <IconButton\n size=\"md\"\n className=\"text-muted\"\n disabled={rerunCommand.isPending}\n onClick={() => {\n rerunCommand.mutate({id: item.id});\n }}\n >\n <EventRepeatIcon />\n </IconButton>\n </Tooltip>\n );\n}\n","export default \"__VITE_ASSET__8c0e1462__\"","import {createSvgIcon} from '../create-svg-icon';\n\nexport const DownloadIcon = createSvgIcon(\n <path d=\"M19 9h-4V3H9v6H5l7 7 7-7zm-8 2V5h2v6h1.17L12 13.17 9.83 11H11zm-6 7h14v2H5z\" />\n, 'DownloadOutlined');\n","import {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {Trans} from '@common/i18n/trans';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport React from 'react';\nimport {ScheduleDatatableColumns} from '@common/admin/logging/schedule/schedule-datatable-columns';\nimport timelineImage from '@common/admin/logging/schedule/timeline.svg';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {DownloadIcon} from '@common/icons/material/Download';\n\nexport function ScheduleLogDatatable() {\n return (\n <DataTablePage\n padding=\"pt-12 md:pt-24\"\n endpoint=\"logs/schedule\"\n title={<Trans message=\"CRON schedule log\" />}\n columns={ScheduleDatatableColumns}\n actions={<Actions />}\n enableSelection={false}\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={timelineImage}\n title={<Trans message=\"No scheduled commands have ran yet\" />}\n filteringTitle={<Trans message=\"No matching scheduled commands\" />}\n />\n }\n />\n );\n}\n\nfunction Actions() {\n return (\n <DataTableAddItemButton\n elementType=\"a\"\n href=\"api/v1/logs/schedule/download\"\n download\n icon={<DownloadIcon />}\n >\n <Trans message=\"Download log\" />\n </DataTableAddItemButton>\n );\n}\n","export default \"__VITE_ASSET__5350d2f0__\"","import {ColumnConfig} from '@common/datatable/column-config';\nimport {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {ErrorLogItem} from '@common/admin/logging/error/error-log-item';\nimport {InfoIcon} from '@common/icons/material/Info';\nimport {ErrorIcon} from '@common/icons/material/Error';\nimport clsx from 'clsx';\nimport {FormattedRelativeTime} from '@common/i18n/formatted-relative-time';\n\nexport const ErrorLogDatatableColumns: ColumnConfig<ErrorLogItem>[] = [\n {\n key: 'message',\n visibleInMode: 'all',\n width: 'flex-3 min-w-200',\n header: () => <Trans message=\"Message\" />,\n body: item => item.message,\n },\n {\n key: 'datetime',\n header: () => <Trans message=\"Date\" />,\n body: item => <FormattedRelativeTime date={item.datetime} />,\n },\n {\n key: 'severity',\n header: () => <Trans message=\"Severity\" />,\n body: item => {\n return (\n <span\n className={clsx(\n 'flex items-center gap-6 text-xs capitalize',\n item.level === 'error' ? 'text-danger' : 'text-primary',\n )}\n >\n {item.level === 'error' ? (\n <ErrorIcon size=\"sm\" />\n ) : (\n <InfoIcon size=\"sm\" />\n )}\n {item.level}\n </span>\n );\n },\n },\n];\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {ErrorLogItem} from '@common/admin/logging/error/error-log-item';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {Button} from '@common/ui/buttons/button';\n\ninterface Props {\n error: ErrorLogItem;\n}\nexport function ErrorLogEntryDialog({error}: Props) {\n return (\n <Dialog size=\"fullscreen\">\n <DialogHeader\n showDivider\n padding=\"px-24 py-10\"\n actions={\n <Button\n variant=\"outline\"\n size=\"xs\"\n onClick={() => downloadLogItem(error)}\n >\n <Trans message=\"Download\" />\n </Button>\n }\n >\n <Trans message=\"Error details\" />\n </DialogHeader>\n <DialogBody>\n <pre className=\"whitespace-pre-wrap break-words text-xs leading-5\">\n {error.exception}\n </pre>\n </DialogBody>\n </Dialog>\n );\n}\n\nfunction downloadLogItem(item: ErrorLogItem) {\n const el = document.createElement('a');\n el.setAttribute(\n 'href',\n 'data:text/plain;charset=utf-8,' + encodeURIComponent(item.exception),\n );\n el.setAttribute('download', `error-${item.id}.log`);\n\n el.style.display = 'none';\n document.body.appendChild(el);\n el.click();\n document.body.removeChild(el);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {toast} from '@common/ui/toast/toast';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Payload {\n identifier: string;\n}\n\nexport function useDeleteErrorLog() {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (payload: Payload) => deleteLogFile(payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('logs/error'),\n });\n toast(trans(message('Log file deleted')));\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction deleteLogFile({identifier}: Payload) {\n return apiClient.delete(`logs/error/${identifier}`).then(r => r.data);\n}\n","import {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {Trans} from '@common/i18n/trans';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport React, {Fragment, useEffect, useRef, useState} from 'react';\nimport bugFixingImage from '@common/admin/logging/error/bug-fixing.svg';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {DownloadIcon} from '@common/icons/material/Download';\nimport {ErrorLogDatatableColumns} from '@common/admin/logging/error/error-log-datatable-columns';\nimport {closeDialog, openDialog} from '@common/ui/overlays/store/dialog-store';\nimport {ErrorLogEntryDialog} from '@common/admin/logging/error/error-log-entry-dialog';\nimport {useDataTable} from '@common/datatable/page/data-table-context';\nimport {Select} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {ErrorLogItem} from '@common/admin/logging/error/error-log-item';\nimport {Button} from '@common/ui/buttons/button';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport {useDeleteErrorLog} from '@common/admin/logging/error/use-delete-error-log';\nimport {FormattedBytes} from '@common/uploads/formatted-bytes';\n\ninterface ErrorLogFile {\n name: string;\n identifier: string;\n size: number;\n}\n\nexport function ErrorLogDatatable() {\n return (\n <DataTablePage\n padding=\"pt-12 md:pt-24\"\n endpoint=\"logs/error\"\n title={<Trans message=\"Error log\" />}\n onRowAction={item => {\n openDialog(ErrorLogEntryDialog, {error: item});\n }}\n columns={ErrorLogDatatableColumns}\n actions={<Actions />}\n enableSelection={false}\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={bugFixingImage}\n title={<Trans message=\"No errors have been logged yet\" />}\n filteringTitle={<Trans message=\"No matching error log entries\" />}\n />\n }\n />\n );\n}\n\nfunction Actions() {\n const {query, setParams} = useDataTable<\n ErrorLogItem,\n {files: ErrorLogFile[]; selectedFile?: string}\n >();\n\n const setOnce = useRef(false);\n const [selectedFile, setSelectedFile] = useState<string | null>(null);\n\n // set initial selected file once files are loaded\n useEffect(() => {\n if (query.data?.files?.length && !setOnce.current) {\n setOnce.current = true;\n const firstFile = query.data.files[0].identifier;\n setSelectedFile(query.data.files[0].identifier);\n // prevent unnecessary http call\n if (firstFile !== query.data.selectedFile) {\n setParams({file: query.data.files[0].identifier});\n }\n }\n }, [query.data, setParams, setOnce]);\n\n return (\n <Fragment>\n <FileSelector\n files={query.data?.files ?? null}\n selectedFile={selectedFile}\n onSelected={file => {\n setSelectedFile(file.identifier);\n setParams({file: file.identifier});\n }}\n />\n <Button\n variant=\"outline\"\n color=\"danger\"\n disabled={!selectedFile}\n onClick={() =>\n openDialog(ConfirmDeleteDialog, {identifier: selectedFile})\n }\n >\n <Trans message=\"Delete\" />\n </Button>\n {selectedFile && (\n <DataTableAddItemButton\n elementType=\"a\"\n download={\n query.data?.files.find(f => f.identifier === selectedFile)?.name\n }\n href={`api/v1/logs/error/${selectedFile}/download`}\n icon={<DownloadIcon />}\n >\n <Trans message=\"Download log\" />\n </DataTableAddItemButton>\n )}\n </Fragment>\n );\n}\n\ninterface FileSelectorProps {\n files: ErrorLogFile[] | null;\n selectedFile: string | null;\n onSelected: (file: ErrorLogFile) => void;\n}\nfunction FileSelector({files, selectedFile, onSelected}: FileSelectorProps) {\n // files have not loaded yet, show skeleton\n if (!files) {\n return <Skeleton variant=\"rect\" className=\"max-w-[210px]\" />;\n }\n\n // no error logs yet, hide select completely\n if (!files.length) {\n return null;\n }\n\n return (\n <Select\n selectionMode=\"single\"\n selectedValue={selectedFile}\n size=\"sm\"\n minWidth=\"min-w-[210px]\"\n >\n {files?.map(file => (\n <Item\n key={file.identifier}\n value={file.identifier}\n onSelected={() => onSelected(file)}\n >\n {file.name} (<FormattedBytes bytes={file.size} />)\n </Item>\n ))}\n </Select>\n );\n}\n\ninterface ConfirmDeleteDialogProps {\n identifier: string;\n}\nfunction ConfirmDeleteDialog({identifier}: ConfirmDeleteDialogProps) {\n const deleteLog = useDeleteErrorLog();\n return (\n <ConfirmationDialog\n title={<Trans message=\"Delete log file\" />}\n body={<Trans message=\"Are you sure you want to delete this log file?\" />}\n confirm={<Trans message=\"Delete\" />}\n onConfirm={() =>\n deleteLog.mutate({identifier}, {onSuccess: () => closeDialog()})\n }\n isLoading={deleteLog.isPending}\n isDanger\n />\n );\n}\n","export default \"__VITE_ASSET__a71f56b4__\"","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {OutgoingEmailLogItem} from '@common/admin/logging/outgoing-email/outgoing-email-log-item';\n\ninterface Response extends BackendResponse {\n logItem: OutgoingEmailLogItem;\n}\n\nexport function useOutgoingEmailLogItemWithMime(id: number) {\n return useQuery({\n queryKey: ['logs/outgoing-email', id],\n queryFn: () => fetchLogItem(id),\n });\n}\n\nfunction fetchLogItem(id: number) {\n return apiClient.get<Response>(`logs/outgoing-email/${id}`).then(r => r.data);\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {Button} from '@common/ui/buttons/button';\nimport {useOutgoingEmailLogItemWithMime} from '@common/admin/logging/outgoing-email/use-outgoing-email-log-item-with-mime';\nimport {ProgressCircle} from '@common/ui/progress/progress-circle';\nimport {downloadFileFromUrl} from '@common/uploads/utils/download-file-from-url';\nimport {useSettings} from '@common/core/settings/use-settings';\n\ninterface Props {\n logItemId: number;\n}\nexport function OutgoingEmailLogEntryDialog({logItemId}: Props) {\n const {data} = useOutgoingEmailLogItemWithMime(logItemId);\n const {base_url} = useSettings();\n return (\n <Dialog size=\"fullscreen\">\n <DialogHeader\n showDivider\n padding=\"px-24 py-10\"\n actions={\n <Button\n variant=\"outline\"\n size=\"xs\"\n disabled={!data}\n type=\"button\"\n onClick={\n data\n ? () =>\n downloadFileFromUrl(\n `${base_url}/api/v1/logs/outgoing-email/${logItemId}/download`,\n )\n : undefined\n }\n >\n <Trans message=\"Download\" />\n </Button>\n }\n >\n <Trans message=\"Email preview\" />\n </DialogHeader>\n <DialogBody>\n {data ? (\n <iframe\n srcDoc={data.logItem.parsed_message!.body.html}\n className=\"h-max w-full border-none\"\n onLoad={e => {\n const iframe = e.target as HTMLIFrameElement;\n iframe.style.height =\n iframe.contentWindow!.document.body.scrollHeight + 'px';\n }}\n />\n ) : (\n <div className=\"flex min-h-200 items-center justify-center\">\n <ProgressCircle isIndeterminate />\n </div>\n )}\n </DialogBody>\n </Dialog>\n );\n}\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {Trans} from '@common/i18n/trans';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport React, {ReactNode} from 'react';\nimport {useRerunScheduledCommand} from '@common/admin/logging/schedule/use-rerurun-scheduled-command';\nimport {OutgoingEmailLogItem} from '@common/admin/logging/outgoing-email/outgoing-email-log-item';\nimport {FormattedRelativeTime} from '@common/i18n/formatted-relative-time';\nimport {Chip, ChipProps} from '@common/ui/forms/input-field/chip-field/chip';\nimport {VisibilityIcon} from '@common/icons/material/Visibility';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {OutgoingEmailLogEntryDialog} from '@common/admin/logging/outgoing-email/outgoing-email-log-entry-dialog';\n\nexport const OutgoingEmailLogDatatableColumns: ColumnConfig<OutgoingEmailLogItem>[] =\n [\n {\n key: 'message_id',\n allowsSorting: true,\n visibleInMode: 'all',\n width: 'flex-3 min-w-200',\n header: () => <Trans message=\"Subject\" />,\n body: item => (\n <NameWithAvatar label={item.subject} description={item.message_id} />\n ),\n },\n {\n key: 'status',\n allowsSorting: true,\n header: () => <Trans message=\"Status\" />,\n body: item => {\n switch (item.status) {\n case 'sent':\n return (\n <StatusChip color=\"positive\">\n <Trans message=\"Sent\" />\n </StatusChip>\n );\n case 'not-sent':\n return (\n <StatusChip color={undefined}>\n <Trans message=\"Not sent\" />\n </StatusChip>\n );\n case 'error':\n return (\n <StatusChip color=\"danger\">\n <Trans message=\"Error\" />\n </StatusChip>\n );\n }\n },\n },\n {\n key: 'from',\n allowsSorting: true,\n header: () => <Trans message=\"From\" />,\n body: item => item.from,\n },\n {\n key: 'to',\n allowsSorting: true,\n header: () => <Trans message=\"To\" />,\n body: item => item.to,\n },\n {\n key: 'created_at',\n allowsSorting: true,\n header: () => <Trans message=\"Date\" />,\n body: item => <FormattedRelativeTime date={item.created_at} />,\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n align: 'end',\n width: 'w-42 flex-shrink-0',\n visibleInMode: 'all',\n body: item => <PreviewEmailButton item={item} />,\n },\n ];\n\ninterface PreviewButtonProps {\n item: OutgoingEmailLogItem;\n}\nfunction PreviewEmailButton({item}: PreviewButtonProps) {\n const rerunCommand = useRerunScheduledCommand();\n return (\n <DialogTrigger type=\"modal\">\n <Tooltip label={<Trans message=\"Preview\" />}>\n <IconButton\n size=\"md\"\n className=\"text-muted\"\n disabled={rerunCommand.isPending}\n onClick={() => {\n rerunCommand.mutate({id: item.id});\n }}\n >\n <VisibilityIcon />\n </IconButton>\n </Tooltip>\n <OutgoingEmailLogEntryDialog logItemId={item.id} />\n </DialogTrigger>\n );\n}\n\ninterface StatusChipProps {\n color: ChipProps['color'];\n children: ReactNode;\n}\nfunction StatusChip({color, children}: StatusChipProps) {\n return (\n <Chip color={color} size=\"xs\" className=\"w-max min-w-50 text-center\">\n {children}\n </Chip>\n );\n}\n","import {\n BackendFilter,\n FilterControlType,\n FilterOperator,\n} from '@common/datatable/filters/backend-filter';\nimport {message} from '@common/i18n/message';\nimport {createdAtFilter} from '@common/datatable/filters/timestamp-filters';\n\nexport const OutgoingEmailLogDatatableFilters: BackendFilter[] = [\n {\n key: 'status',\n label: message('Status'),\n description: message('Status of the outgoing email'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: '01',\n options: [\n {\n key: '01',\n label: message('Not sent'),\n value: 'no-sent',\n },\n {\n key: '02',\n label: message('Sent'),\n value: 'sent',\n },\n {\n key: '03',\n label: message('Error'),\n value: 'error',\n },\n ],\n },\n },\n createdAtFilter({\n description: message('Date email send was attempted'),\n }),\n];\n","import {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {Trans} from '@common/i18n/trans';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport React from 'react';\nimport openedImage from '@common/admin/logging/outgoing-email/opened.svg';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {DownloadIcon} from '@common/icons/material/Download';\nimport {OutgoingEmailLogDatatableColumns} from '@common/admin/logging/outgoing-email/outgoing-email-log-datatable-columns';\nimport {OutgoingEmailLogDatatableFilters} from '@common/admin/logging/outgoing-email/outgoing-email-log-datatable-filters';\n\nexport function OutgoingEmailLogDatatable() {\n return (\n <DataTablePage\n padding=\"pt-12 md:pt-24\"\n endpoint=\"logs/outgoing-email\"\n title={<Trans message=\"Outgoing email\" />}\n columns={OutgoingEmailLogDatatableColumns}\n filters={OutgoingEmailLogDatatableFilters}\n actions={<Actions />}\n enableSelection={false}\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={openedImage}\n title={<Trans message=\"No outgoing emails have been logged yet\" />}\n filteringTitle={<Trans message=\"No matching emails\" />}\n />\n }\n />\n );\n}\n\nfunction Actions() {\n return (\n <DataTableAddItemButton\n elementType=\"a\"\n href=\"api/v1/logs/outgoing-email/download\"\n download\n icon={<DownloadIcon />}\n >\n <Trans message=\"Download log\" />\n </DataTableAddItemButton>\n );\n}\n","import {Navigate, RouteObject, useRoutes} from 'react-router-dom';\nimport {AdminLayout} from './admin-layout';\nimport {UserDatatable} from './users/user-datatable';\nimport {AppearanceLayout} from './appearance/appearance-layout';\nimport {MenuList} from './appearance/sections/menus/menu-list';\nimport {MenuEditor} from './appearance/sections/menus/menu-editor';\nimport {MenuItemEditor} from './appearance/sections/menus/menu-item-editor';\nimport {GeneralSection} from './appearance/sections/general-section';\nimport {ThemeList} from './appearance/sections/themes/theme-list';\nimport {SeoSection} from './appearance/sections/seo/seo-section';\nimport {CustomCodeSection} from './appearance/sections/code/custom-code-section';\nimport {CustomPageDatablePage} from './custom-pages/custom-page-datable-page';\nimport {SettingsLayout} from './settings/settings-layout';\nimport {GeneralSettings} from './settings/pages/general-settings';\nimport {ThemeEditor} from './appearance/sections/themes/theme-editor';\nimport {AppSettingsRoutes} from '@app/admin/settings/app-settings-routes';\nimport {SubscriptionSettings} from './settings/pages/subscription-settings';\nimport {LocalizationSettings} from './settings/pages/localization-settings';\nimport {AuthenticationSettings} from './settings/pages/authentication-settings';\nimport {UploadingSettings} from './settings/pages/uploading-settings/uploading-settings';\nimport {OutgoingEmailSettings} from './settings/pages/mail-settings/outgoing-email-settings';\nimport {CacheSettings} from './settings/pages/cache-settings/cache-settings';\nimport {LoggingSettings} from './settings/pages/logging-settings';\nimport {QueueSettings} from './settings/pages/queue-settings';\nimport {RecaptchaSettings} from './settings/pages/recaptcha-settings';\nimport {ReportsSettings} from './settings/pages/reports-settings';\nimport {UpdateUserPage} from './users/update-user-page';\nimport {CreateUserPage} from './users/create-user-page';\nimport {LocalizationIndex} from './translations/localization-index';\nimport {TranslationManagementPage} from './translations/translation-management-page';\nimport {AdsPage} from './ads/ads-page';\nimport React from 'react';\nimport {FullPageLoader} from '../ui/progress/full-page-loader';\nimport {SectionList} from './appearance/section-list';\nimport {RolesIndexPage} from './roles/roles-index-page';\nimport {EditRolePage} from './roles/crupdate-role-page/edit-role-page';\nimport {CreateRolePage} from './roles/crupdate-role-page/create-role-page';\nimport {TagIndexPage} from './tags/tag-index-page';\nimport {FileEntryIndexPage} from './file-entry/file-entry-index-page';\nimport {SubscriptionsIndexPage} from './subscriptions/subscriptions-index-page';\nimport {PlansIndexPage} from './plans/plans-index-page';\nimport {EditPlanPage} from './plans/crupdate-plan-page/edit-plan-page';\nimport {CreatePlanPage} from './plans/crupdate-plan-page/create-plan-page';\nimport {GdprSettings} from './settings/pages/gdpr-settings';\nimport {AuthRoute} from '../auth/guards/auth-route';\nimport {NotFoundPage} from '../ui/not-found-page/not-found-page';\nimport {AppAppearanceConfig} from '@app/admin/appearance/app-appearance-config';\nimport {AppAdminRoutes} from '@app/admin/app-admin-routes';\nimport {EditCustomPage} from '@common/admin/custom-pages/edit-custom-page';\nimport {CreateCustomPage} from '@common/admin/custom-pages/create-custom-page';\nimport {ThemeFontPanel} from '@common/admin/appearance/sections/themes/theme-font-panel';\nimport {ThemeRadiusPanel} from '@common/admin/appearance/sections/themes/theme-radius-panel';\nimport {LogsPage} from '@common/admin/logging/logs-page';\nimport {ScheduleLogDatatable} from '@common/admin/logging/schedule/schedule-log-datatable';\nimport {ErrorLogDatatable} from '@common/admin/logging/error/error-log-datatable';\nimport {OutgoingEmailLogDatatable} from '@common/admin/logging/outgoing-email/outgoing-email-log-datatable';\n\nconst ReportsPage = React.lazy(() => import('./analytics/admin-report-page'));\n\nconst AdminRouteConfig: RouteObject[] = [\n {\n path: 'appearance',\n element: (\n <AuthRoute permission=\"appearance.update\">\n <AppearanceLayout />\n </AuthRoute>\n ),\n children: [\n {index: true, element: <SectionList />},\n {path: 'general', element: <GeneralSection />},\n {path: 'seo-settings', element: <SeoSection />},\n {path: 'custom-code', element: <CustomCodeSection />},\n {path: 'themes', element: <ThemeList />},\n {path: 'themes/:themeIndex', element: <ThemeEditor />},\n {path: 'themes/:themeIndex/font', element: <ThemeFontPanel />},\n {path: 'themes/:themeIndex/radius', element: <ThemeRadiusPanel />},\n {path: 'menus', element: <MenuList />},\n {path: 'menus/:menuIndex', element: <MenuEditor />},\n {\n path: 'menus/:menuIndex/items/:menuItemIndex',\n element: <MenuItemEditor />,\n },\n ...Object.values(AppAppearanceConfig.sections).flatMap(\n s => s.routes || [],\n ),\n ],\n },\n\n {\n path: '/',\n element: <AdminLayout />,\n children: [\n ...AppAdminRoutes,\n // REPORT PAGE\n {\n path: '/',\n element: (\n <React.Suspense fallback={<FullPageLoader screen />}>\n <ReportsPage />\n </React.Suspense>\n ),\n },\n // USERS\n {\n path: 'users',\n element: (\n <AuthRoute permission=\"users.update\">\n <UserDatatable />\n </AuthRoute>\n ),\n },\n {\n path: 'users/new',\n element: (\n <AuthRoute permission=\"users.update\">\n <CreateUserPage />\n </AuthRoute>\n ),\n },\n {\n path: 'users/:userId/edit',\n element: (\n <AuthRoute permission=\"users.update\">\n <UpdateUserPage />\n </AuthRoute>\n ),\n },\n // ROLES\n {\n path: 'roles',\n element: (\n <AuthRoute permission=\"roles.update\">\n <RolesIndexPage />\n </AuthRoute>\n ),\n },\n {\n path: 'roles/new',\n element: (\n <AuthRoute permission=\"roles.update\">\n <CreateRolePage />\n </AuthRoute>\n ),\n },\n {\n path: 'roles/:roleId/edit',\n element: (\n <AuthRoute permission=\"roles.update\">\n <EditRolePage />\n </AuthRoute>\n ),\n },\n // SUBSCRIPTIONS and PLANS\n {\n path: 'subscriptions',\n element: (\n <AuthRoute permission=\"subscriptions.update\">\n <SubscriptionsIndexPage />\n </AuthRoute>\n ),\n },\n {\n path: 'plans',\n element: (\n <AuthRoute permission=\"plans.update\">\n <PlansIndexPage />\n </AuthRoute>\n ),\n },\n {\n path: 'plans/new',\n element: (\n <AuthRoute permission=\"plans.update\">\n <CreatePlanPage />\n </AuthRoute>\n ),\n },\n {\n path: 'plans/:productId/edit',\n element: (\n <AuthRoute permission=\"plans.update\">\n <EditPlanPage />\n </AuthRoute>\n ),\n },\n // CUSTOM PAGES\n {\n path: 'custom-pages',\n element: (\n <AuthRoute permission=\"custom_pages.update\">\n <CustomPageDatablePage />\n </AuthRoute>\n ),\n },\n {\n path: 'custom-pages/new',\n element: (\n <AuthRoute permission=\"custom_pages.update\">\n <CreateCustomPage />\n </AuthRoute>\n ),\n },\n {\n path: 'custom-pages/:pageId/edit',\n element: (\n <AuthRoute permission=\"custom_pages.update\">\n <EditCustomPage />\n </AuthRoute>\n ),\n },\n // TAGS\n {\n path: 'tags',\n element: (\n <AuthRoute permission=\"tags.update\">\n <TagIndexPage />\n </AuthRoute>\n ),\n },\n // LOCALIZATIONS\n {\n path: 'localizations',\n element: (\n <AuthRoute permission=\"localizations.update\">\n <LocalizationIndex />\n </AuthRoute>\n ),\n },\n {\n path: 'localizations/:localeId/translate',\n element: <TranslationManagementPage />,\n },\n // FILE ENTRIES\n {\n path: 'files',\n element: (\n <AuthRoute permission=\"files.update\">\n <FileEntryIndexPage />\n </AuthRoute>\n ),\n },\n // ADS\n {\n path: 'ads',\n element: (\n <AuthRoute permission=\"settings.update\">\n <AdsPage />\n </AuthRoute>\n ),\n },\n // SETTINGS\n {\n path: 'settings',\n element: (\n <AuthRoute permission=\"settings.update\">\n <SettingsLayout />\n </AuthRoute>\n ),\n children: [\n {index: true, element: <Navigate to=\"general\" replace />},\n {path: 'general', element: <GeneralSettings />},\n {path: 'subscriptions', element: <SubscriptionSettings />},\n {path: 'localization', element: <LocalizationSettings />},\n {path: 'authentication', element: <AuthenticationSettings />},\n {path: 'uploading', element: <UploadingSettings />},\n {path: 'outgoing-email', element: <OutgoingEmailSettings />},\n {path: 'cache', element: <CacheSettings />},\n {path: 'analytics', element: <ReportsSettings />},\n {path: 'logging', element: <LoggingSettings />},\n {path: 'queue', element: <QueueSettings />},\n {path: 'recaptcha', element: <RecaptchaSettings />},\n {path: 'gdpr', element: <GdprSettings />},\n ...AppSettingsRoutes,\n ],\n },\n // LOGS\n {\n path: 'logs',\n element: (\n <AuthRoute permission=\"logs.view\">\n <LogsPage />\n </AuthRoute>\n ),\n children: [\n {index: true, element: <ScheduleLogDatatable />},\n {path: 'schedule', element: <ScheduleLogDatatable />},\n {path: 'error', element: <ErrorLogDatatable />},\n {path: 'outgoing-email', element: <OutgoingEmailLogDatatable />},\n ],\n },\n ],\n },\n {path: '*', element: <NotFoundPage />},\n];\n\nexport default function AdminRoutes() {\n return useRoutes(AdminRouteConfig);\n}\n"],"names":["_a","Select","endpoint","query","deleteSelectedRows","exportCsv","banUser","Form","Actions","ColorPickerTrigger","PermissionSelector","Option","FeatureForm","Fragment","document","window","Header","m","useNavigate","queryClient","updateTags","MobileNav","DesktopNav","MenuItem","SortingMethodSelect","SearchMethodSelect","section","importModels","uploadCors","clearCache","updateUser","createUser","createLocalization","columnConfig","uploadFile","Endpoint","PageContent","updateRole","createRole","createNewTag","updateTag","message","TwoMB","Content","updateSubscription","updateProduct","syncPlans","value","createProduct","InfoTrigger","resetChannels","updateChannel","modelConfig","label","createChannel","deleteArticle","importArticles","UserDisplayName","updateComment","updateReview","entry","errorMessage","LanguageSelect","createVideo","updateVideo","PageTabs","deleteEpisode","createSeason","DeleteButton","deleteSeason","updateTitle","ComboBox","createTitle","FormFields","uploadImage","deleteImage","season","episode","deleteVideos","createEpisode","updateEpisode","createCredit","departments","jobs","deleteCredit","NoCreditsMessage","sortCredits","item","CreditsTableBody","attachTag","detachTag","createPerson","ArticleBodyEditor","updateArticle","createArticle","formattedData","createPage","filters","pages","rerunCommand","_b"],"mappings":"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"}