JFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr{ gilour
{"version":3,"file":"dashboard-routes-d9f67ead.mjs","sources":["../../../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/datatable/filters/backend-filter.ts","../../../common/resources/client/utils/date/start-of-day.ts","../../../common/resources/client/utils/date/end-of-day.ts","../../../common/resources/client/i18n/get-user-timezone.ts","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/dialog/date-range-presets.ts","../../../common/resources/client/icons/material/DateRange.tsx","../../../common/resources/client/ui/forms/input-field/input.tsx","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/date-picker-field.tsx","../../../common/resources/client/ui/forms/input-field/date/utils.ts","../../../common/resources/client/ui/forms/input-field/date/use-base-date-picker-state.ts","../../../common/resources/client/i18n/use-current-date-time.ts","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/use-date-range-picker-state.ts","../../../common/resources/client/icons/material/ArrowRightAlt.tsx","../../../common/resources/client/ui/forms/input-field/date/segments/utils/adjust-segment.ts","../../../common/resources/client/ui/forms/input-field/date/segments/utils/set-segment.ts","../../../common/resources/client/ui/forms/input-field/date/segments/utils/page-step.ts","../../../common/resources/client/ui/forms/input-field/date/segments/editable-date-segment.tsx","../../../common/resources/client/ui/forms/input-field/date/segments/literal-segment.tsx","../../../common/resources/client/ui/forms/input-field/date/segments/utils/get-segment-limits.ts","../../../common/resources/client/ui/forms/input-field/date/segments/date-segment-list.tsx","../../../common/resources/client/icons/material/KeyboardArrowLeft.tsx","../../../common/resources/client/icons/material/KeyboardArrowRight.tsx","../../../common/resources/client/ui/forms/input-field/date/calendar/calendar-cell.tsx","../../../common/resources/client/ui/forms/input-field/date/calendar/calendar-month.tsx","../../../common/resources/client/ui/forms/input-field/date/calendar/calendar.tsx","../../../common/resources/client/i18n/formatted-date-time-range.tsx","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/dialog/date-range-preset-list.tsx","../../../common/resources/client/utils/hooks/is-tablet-media-query.ts","../../../common/resources/client/ui/forms/toggle/switch.tsx","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/dialog/date-range-compare-presets.ts","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/dialog/date-range-compare-preset-list.tsx","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/dialog/date-range-dialog.tsx","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/date-range-picker.tsx","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/form-date-range-picker.tsx","../../../common/resources/client/datatable/filters/timestamp-filters.ts","../../../common/resources/client/datatable/filters/backend-filters-url-key.ts","../../../common/resources/client/datatable/filters/utils/decode-backend-filters.ts","../../../common/resources/client/datatable/filters/utils/encode-backend-filters.ts","../../../common/resources/client/datatable/filters/backend-filter-url-params.ts","../../../common/resources/client/datatable/requests/paginated-resources.ts","../../../common/resources/client/datatable/page/data-table-context.ts","../../../common/resources/client/utils/keybinds/is-ctrl-key-pressed.ts","../../../common/resources/client/ui/tables/navigate-grid.ts","../../../common/resources/client/ui/tables/table-context.ts","../../../common/resources/client/ui/tables/style/use-table-cell-style.ts","../../../common/resources/client/ui/tables/table-cell.tsx","../../../common/resources/client/ui/interactions/use-pointer-events.ts","../../../common/resources/client/utils/keybinds/is-ctrl-or-shift-pressed.ts","../../../common/resources/client/ui/tables/style/use-table-row-style.ts","../../../common/resources/client/ui/tables/table-row.tsx","../../../common/resources/client/ui/tables/checkbox-column-config.tsx","../../../common/resources/client/icons/material/ArrowDownward.tsx","../../../common/resources/client/ui/tables/header-cell.tsx","../../../common/resources/client/ui/tables/table-header-row.tsx","../../../common/resources/client/ui/tables/table.tsx","../../../common/resources/client/datatable/data-table-pagination-footer.tsx","../../../common/resources/client/icons/material/FilterAlt.tsx","../../../common/resources/client/ui/accordion/accordtion-animation.ts","../../../common/resources/client/ui/accordion/accordion.tsx","../../../common/resources/client/datatable/filters/panels/select-filter-panel.tsx","../../../common/resources/client/datatable/filters/panels/date-range-filter-panel.tsx","../../../common/resources/client/ui/images/avatar.tsx","../../../common/resources/client/users/queries/use-normalized-models.ts","../../../common/resources/client/users/queries/use-normalized-model.ts","../../../common/resources/client/ui/forms/normalized-model-field.tsx","../../../common/resources/client/datatable/filters/panels/normalized-model-filter-panel.tsx","../../../common/resources/client/datatable/filters/filter-operator-names.ts","../../../common/resources/client/datatable/filters/panels/input-filter-panel.tsx","../../../common/resources/client/datatable/filters/panels/boolean-filter-panel.tsx","../../../common/resources/client/ui/forms/input-field/chip-field/chip-list.tsx","../../../common/resources/client/ui/forms/input-field/chip-field/string-to-chip-value.ts","../../../common/resources/client/ui/forms/input-field/chip-field/chip-field.tsx","../../../common/resources/client/ui/forms/input-field/chip-field/form-chip-field.tsx","../../../common/resources/client/datatable/filters/panels/chip-field-filter-panel.tsx","../../../common/resources/client/datatable/filters/add-filter-dialog.tsx","../../../common/resources/client/datatable/filters/add-filter-button.tsx","../../../common/resources/client/datatable/data-table-header.tsx","../../../common/resources/client/datatable/filters/filter-list/filter-list-trigger-button.tsx","../../../common/resources/client/datatable/filters/filter-list/filter-list-item-dialog-trigger.tsx","../../../common/resources/client/datatable/filters/filter-list/filter-list-control.tsx","../../../common/resources/client/datatable/filters/filter-list/filter-list.tsx","../../../common/resources/client/datatable/selected-state-datatable-header.tsx","../../../common/resources/client/datatable/filters/filter-list/filter-list-skeleton.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/icons/material/Add.tsx","../../../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/datatable/column-templates/name-with-avatar.tsx","../../../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/utils/array/chunk-array.ts","../../../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","../../../common/resources/client/icons/material/DragIndicator.tsx","../../../common/resources/client/icons/material/Delete.tsx","../../../common/resources/client/ui/interactions/dnd/drag-state.ts","../../../common/resources/client/ui/interactions/interactable-event.ts","../../../common/resources/client/ui/interactions/active-interaction.ts","../../../common/resources/client/ui/interactions/utils/dom-rect-to-obj.ts","../../../common/resources/client/ui/interactions/dnd/update-rects.ts","../../../common/resources/client/ui/interactions/dnd/use-draggable.ts","../../../common/resources/client/ui/interactions/dnd/read-files-from-data-transfer.ts","../../../common/resources/client/utils/array/async-iterable-to-array.ts","../../../common/resources/client/ui/interactions/dnd/use-droppable.ts","../../../common/resources/client/utils/array/move-item-in-array.ts","../../../common/resources/client/utils/array/move-item-in-new-array.ts","../../../common/resources/client/ui/interactions/dnd/use-sortable.ts","../../../common/resources/client/ace-editor/ace-dialog.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/ui/themes/utils/theme-value-to-hex.ts","../../../common/resources/client/icons/material/Tune.tsx","../../../common/resources/client/icons/material/MoreVert.tsx","../../../common/resources/client/ui/tabs/tabs-context.tsx","../../../common/resources/client/ui/tabs/tabs.tsx","../../../common/resources/client/ui/tabs/tab-line.tsx","../../../common/resources/client/ui/tabs/tab-list.tsx","../../../common/resources/client/ui/tabs/tab.tsx","../../../common/resources/client/ui/tabs/tab-panels.tsx","../../../common/resources/client/ui/section-helper.tsx","../../../common/resources/client/utils/hooks/sticky-sentinel.ts","../../../common/resources/client/utils/string/slugify-string.ts","../../../common/resources/client/icons/material/UnfoldMore.tsx","../../../common/resources/client/workspace/requests/create-workspace.ts","../../../common/resources/client/workspace/new-workspace-dialog.tsx","../../../common/resources/client/workspace/requests/workspace-with-members.ts","../../../common/resources/client/icons/material/Group.tsx","../../../common/resources/client/workspace/requests/invite-members.ts","../../../common/resources/client/workspace/requests/resend-invite.ts","../../../common/resources/client/utils/string/is-email.ts","../../../common/resources/client/workspace/requests/change-role.ts","../../../common/resources/client/workspace/requests/remove-member.ts","../../../common/resources/client/workspace/leave-workspace-confirmation.tsx","../../../common/resources/client/workspace/workspace-members-dialog.tsx","../../../common/resources/client/icons/material/PersonAdd.tsx","../../../common/resources/client/workspace/requests/update-workspace.ts","../../../common/resources/client/workspace/rename-workspace-dialog.tsx","../../../common/resources/client/workspace/requests/delete-workspace.ts","../../../common/resources/client/workspace/workspace-selector.tsx","../../../resources/client/dashboard/layout/sidenav/use-link-summary.ts","../../../common/resources/client/ui/progress/meter.tsx","../../../common/resources/client/icons/material/Info.tsx","../../../resources/client/dashboard/layout/sidenav/resource-usage-list.tsx","../../../resources/client/dashboard/layout/sidenav/usage-details-trigger.tsx","../../../resources/client/dashboard/layout/sidenav/usage-meter.tsx","../../../resources/client/dashboard/layout/sidenav/upgrade-button.tsx","../../../resources/client/dashboard/layout/sidenav/belink-dashboard-sidenav.tsx","../../../resources/client/dashboard/layout/belink-dasbboard-layout.tsx","../../../common/resources/client/admin/analytics/report-date-selector.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","../../../resources/client/dashboard/reports/referrer-chart.tsx","../../../common/resources/client/admin/analytics/geo-chart/use-google-geo-chart.ts","../../../common/resources/client/icons/material/ArrowBack.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/i18n/formatted-country-name.tsx","../../../common/resources/client/admin/analytics/geo-chart/geo-chart.tsx","../../../common/resources/client/charts/bar-chart.tsx","../../../resources/client/dashboard/reports/clicks/use-clicks-report.ts","../../../resources/client/dashboard/reports/clicks/clicks-report-charts.tsx","../../../resources/client/dashboard/reports/clicks/clicks-report-page-layout.tsx","../../../resources/client/dashboard/all-clicks-report-page.tsx","../../../resources/client/dashboard/links/links-datatable-page/links-datatable-filters.ts","../../../resources/client/dashboard/links/requests/use-link-form-value-lists.ts","../../../resources/client/dashboard/links/forms/link-type-field.tsx","../../../resources/client/dashboard/upgrade/upgrade.svg","../../../resources/client/dashboard/upgrade/upgrade-dialog.tsx","../../../resources/client/dashboard/upgrade/feature-locked-dialog.tsx","../../../resources/client/dashboard/upgrade/no-permission-button.tsx","../../../resources/client/dashboard/links/forms/link-form-section.tsx","../../../resources/client/dashboard/upgrade/use-link-feature-status.ts","../../../resources/client/dashboard/links/forms/link-restriction-fields.tsx","../../../common/resources/client/icons/material/SwapVert.tsx","../../../resources/client/dashboard/links/forms/link-retargeting-fields.tsx","../../../common/resources/client/icons/material/Public.tsx","../../../resources/client/dashboard/links/forms/link-seo-fields.tsx","../../../common/resources/client/icons/material/AccountTree.tsx","../../../resources/client/dashboard/links/forms/link-utm-fields.tsx","../../../common/resources/client/custom-domains/use-default-custom-domain-host.ts","../../../resources/client/dashboard/links/forms/link-domain-select.tsx","../../../resources/client/dashboard/links/forms/link-settings-form.tsx","../../../common/resources/client/ui/slug-editor.tsx","../../../resources/client/dashboard/links/forms/alias-field.tsx","../../../resources/client/dashboard/links/forms/crupdate-link-form.tsx","../../../resources/client/dashboard/links/utils/build-linkeable-default-form-values.ts","../../../resources/client/dashboard/links/utils/build-linkeable-payload.ts","../../../resources/client/dashboard/links/requests/build-link-payload.ts","../../../resources/client/dashboard/links/requests/use-create-link.ts","../../../resources/client/dashboard/links/dialogs/create-link-dialog.tsx","../../../resources/client/dashboard/links/requests/use-update-link.ts","../../../resources/client/dashboard/links/dialogs/update-link-dialog.tsx","../../../resources/client/dashboard/links/link-image.tsx","../../../resources/client/dashboard/upgrade/over-quota-dialog.tsx","../../../resources/client/dashboard/upgrade/permission-aware-button.tsx","../../../common/resources/client/icons/material/BarChart.tsx","../../../resources/client/dashboard/links/links-datatable-page/links-datatable-columns.tsx","../../../common/resources/client/icons/material/AddLink.tsx","../../../common/resources/client/datatable/csv-export/export-csv-icon.tsx","../../../resources/client/dashboard/links/requests/use-create-multiple-links.ts","../../../resources/client/dashboard/links/dialogs/create-multiple-links-dialog.tsx","../../../resources/client/dashboard/links/links-datatable-page/links-datatable-page.tsx","../../../common/resources/client/icons/material/MoveDown.tsx","../../../resources/client/dashboard/link-groups/link-group-links-datatable-page/requests/use-move-links-to-group.ts","../../../resources/client/dashboard/link-groups/link-group-links-datatable-page/move-links-to-group-dialog.tsx","../../../resources/client/dashboard/link-groups/link-group-links-datatable-page/link-group-links-datatable-page.tsx","../../../common/resources/client/icons/material/ListAlt.tsx","../../../resources/client/dashboard/link-groups/link-groups-datatable-page/crupdate/crupdate-link-group-form.tsx","../../../resources/client/dashboard/link-groups/link-groups-datatable-page/requests/use-update-link-group.ts","../../../resources/client/dashboard/link-groups/link-groups-datatable-page/crupdate/update-link-group-dialog.tsx","../../../resources/client/dashboard/link-groups/link-groups-datatable-page/link-groups-datatable-columns.tsx","../../../resources/client/dashboard/link-groups/link-groups-datatable-page/link-groups-datatable-filters.ts","../../../resources/client/dashboard/link-groups/link-groups-datatable-page/requests/use-create-link-group.ts","../../../resources/client/dashboard/link-groups/link-groups-datatable-page/crupdate/create-link-group-dialog.tsx","../../../resources/client/dashboard/link-groups/link-groups-datatable-page/link-groups-datatable-page.tsx","../../../resources/client/dashboard/link-groups/link-group-links-datatable-page/requests/use-link-group.ts","../../../resources/client/dashboard/link-groups/link-group-clicks-report-page.tsx","../../../resources/client/dashboard/layout/sidenav/use-link.ts","../../../resources/client/dashboard/links/link-clicks-report-page.tsx","../../../common/resources/client/custom-domains/datatable/world.svg","../../../common/resources/client/custom-domains/datatable/domains-empty-state-message.tsx","../../../common/resources/client/datatable/column-templates/boolean-indicator.tsx","../../../common/resources/client/custom-domains/datatable/requests/use-delete-domain.ts","../../../common/resources/client/custom-domains/datatable/delete-domain-button.tsx","../../../common/resources/client/custom-domains/datatable/domains-datatable-columns.tsx","../../../common/resources/client/custom-domains/datatable/domains-datatable-filters.ts","../../../common/resources/client/custom-domains/datatable/connect-domain-dialog/is-subdomain.ts","../../../common/resources/client/custom-domains/datatable/connect-domain-dialog/domain-progress-indicator.tsx","../../../common/resources/client/custom-domains/datatable/connect-domain-dialog/info-step.tsx","../../../common/resources/client/custom-domains/datatable/connect-domain-dialog/host-step.tsx","../../../common/resources/client/custom-domains/datatable/connect-domain-dialog/connect-domain-step.tsx","../../../common/resources/client/custom-domains/datatable/requests/use-validate-domain-dns.ts","../../../common/resources/client/custom-domains/datatable/connect-domain-dialog/validation-failed-step.tsx","../../../common/resources/client/custom-domains/datatable/requests/use-authorize-domain-connect.ts","../../../common/resources/client/custom-domains/datatable/requests/use-connect-domain.ts","../../../common/resources/client/custom-domains/datatable/connect-domain-dialog/use-connect-domain-stepper.ts","../../../common/resources/client/custom-domains/datatable/connect-domain-dialog/finalize-step.tsx","../../../common/resources/client/custom-domains/datatable/connect-domain-dialog/connect-domain-dialog.tsx","../../../resources/client/dashboard/custom-domains/domains-datatable-page.tsx","../../../resources/client/dashboard/tracking-pixels/supported-tracking-pixels.ts","../../../common/resources/client/icons/material/HelpOutline.tsx","../../../resources/client/dashboard/tracking-pixels/crupdate-dialog/crupdate-pixel-form.tsx","../../../resources/client/dashboard/tracking-pixels/requests/use-update-pixel.ts","../../../resources/client/dashboard/tracking-pixels/crupdate-dialog/update-pixel-dialog.tsx","../../../resources/client/dashboard/tracking-pixels/tracking-pixels-datatable-columns.tsx","../../../resources/client/dashboard/tracking-pixels/location-tracking.svg","../../../resources/client/dashboard/tracking-pixels/tracking-pixels-datatable-filters.ts","../../../resources/client/dashboard/tracking-pixels/requests/use-create-pixel.ts","../../../resources/client/dashboard/tracking-pixels/crupdate-dialog/create-pixel-dialog.tsx","../../../resources/client/dashboard/tracking-pixels/tracking-pixels-datatable-page.tsx","../../../resources/client/dashboard/link-pages/requests/use-update-link-page-options.ts","../../../resources/client/dashboard/link-pages/link-page-options-trigger.tsx","../../../resources/client/dashboard/link-pages/link-pages-datatable-columns.tsx","../../../resources/client/dashboard/link-pages/link-pages-datatable-page.tsx","../../../resources/client/dashboard/link-overlays/preferences-popup.svg","../../../resources/client/dashboard/link-overlays/link-overlays-datatable-columns.tsx","../../../resources/client/dashboard/link-overlays/crupdate/link-overlay-constants.ts","../../../resources/client/dashboard/link-overlays/link-overlays-datatable-filters.ts","../../../resources/client/dashboard/link-overlays/link-overlays-datatable-page.tsx","../../../resources/client/dashboard/link-overlays/requests/use-create-link-overlay.ts","../../../resources/client/dashboard/link-overlays/crupdate/overlay-website-background.tsx","../../../resources/client/dashboard/link-overlays/crupdate/crupdate-link-overlay-form.tsx","../../../resources/client/dashboard/link-overlays/crupdate/create-link-overlay-page.tsx","../../../resources/client/dashboard/link-overlays/requests/use-link-overlay.ts","../../../resources/client/dashboard/link-overlays/requests/use-update-link-overlay.ts","../../../resources/client/dashboard/link-overlays/crupdate/update-link-overlay-page.tsx","../../../resources/client/dashboard/biolink/biolinks-datatable-page/marketing.svg","../../../resources/client/dashboard/biolink/biolinks-datatable-page/biolinks-datatable-columns.tsx","../../../resources/client/dashboard/biolink/biolinks-datatable-page/biolinks-datatable-filters.ts","../../../resources/client/dashboard/biolink/biolinks-datatable-page/requests/use-create-biolink.ts","../../../resources/client/dashboard/biolink/biolinks-datatable-page/crupdate/create-biolink-dialog.tsx","../../../resources/client/dashboard/biolink/biolinks-datatable-page/biolinks-datatable-page.tsx","../../../resources/client/dashboard/biolink/biolinks-datatable-page/requests/use-biolink.ts","../../../resources/client/dashboard/biolink/biolink-clicks-report-page.tsx","../../../common/resources/client/icons/material/Widgets.tsx","../../../common/resources/client/icons/material/Animation.tsx","../../../common/resources/client/icons/material/Shortcut.tsx","../../../common/resources/client/icons/material/MoreTime.tsx","../../../resources/client/dashboard/biolink/biolink-editor/biolink-editor-store.ts","../../../resources/client/dashboard/biolink/biolink-editor/requests/use-editor-biolink.ts","../../../resources/client/dashboard/biolink/biolink-editor/requests/use-update-biolink-content-item.ts","../../../resources/client/dashboard/biolink/biolink-editor/content/link-content-item/link-schedule-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/link-content-item/leap-link-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/link-content-item/link-thumbnail-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/link-content-item/link-animation-list.ts","../../../resources/client/dashboard/biolink/biolink-editor/content/link-content-item/link-animation-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/requests/use-detach-biolink-content-item.ts","../../../resources/client/dashboard/biolink/biolink-editor/content/detach-content-item-button.tsx","../../../resources/client/dashboard/biolink/biolink-editor/requests/use-sort-biolink-content.ts","../../../resources/client/dashboard/biolink/biolink-editor/content/biolink-content-item-layout.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/link-content-item/link-content-item.tsx","../../../resources/client/dashboard/biolink/biolink-editor/requests/use-update-biolink.ts","../../../resources/client/dashboard/biolink/biolink-editor/biolink-settings-form.tsx","../../../resources/client/dashboard/biolink/biolink-editor/requests/use-crupdate-biolink-widget.ts","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/image-widget/image-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/widget-images/image.png","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/widget-images/text.png","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/widget-images/socials.png","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/widget-images/youtube.png","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/widget-images/soundcloud.png","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/widget-images/vimeo.jpeg","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/widget-images/spotify.png","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/widget-images/twitch.svg","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/widget-images/tiktok.png","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/youtube-widget/youtube-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/text-widget/text-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/socials-widget/socials-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/twitch-widget/twitch-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/soundcloud-widget/soundcloud-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/vimeo-widget/vimeo-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/tiktok-widget/tiktok-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-list.ts","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/select-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/new-widget-dialog-container.tsx","../../../common/resources/client/icons/material/ArrowUpward.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-content-item.tsx","../../../resources/client/dashboard/biolink/biolink-editor/live-preview.tsx","../../../common/resources/client/icons/material/FormatColorFill.tsx","../../../common/resources/client/icons/material/Gradient.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector-button.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/color-backgrounds.ts","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/color-background-tab.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/gradient-backgrounds.ts","../../../common/resources/client/icons/material/ArrowForward.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/gradient-background-tab.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Angled-Focus.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Circular-Focus.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Farseeing-Eyeball.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Canyon-Funnel.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Looney-Loops.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Hurricane-Aperture.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Icy-Explosion.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Protruding-Squares.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Alternating-Triangles.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Monstera-Patch.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Confetti-Doodles.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Threads-Ahead.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Launch-Day.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Sprinkle.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Circuit-Board.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/nuclear-focalpoint.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Snow.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/image-backgrounds.ts","../../../common/resources/client/icons/material/Upload.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/image-background-tab/background-position-selector.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/image-background-tab/image-background-tab.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/header-classnames.ts","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/button-style-selector.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","../../../resources/client/dashboard/biolink/biolink-editor/requests/use-save-biolink-appearance.ts","../../../resources/client/dashboard/biolink/biolink-editor/appearance/color-input.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/biolink-appearance-editor.tsx","../../../resources/client/dashboard/biolink/biolink-editor/biolink-editor-page.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/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/icons/material/UnfoldLess.tsx","../../../common/resources/client/article-editor/article-body-editor-menubar.tsx","../../../common/resources/client/article-editor/article-editor-sticky-header.tsx","../../../resources/client/dashboard/link-pages/requests/use-create-link-page.ts","../../../resources/client/dashboard/link-pages/create-link-page.tsx","../../../resources/client/dashboard/link-pages/requests/use-link-page.ts","../../../resources/client/dashboard/link-pages/requests/use-update-link-page.ts","../../../resources/client/dashboard/link-pages/edit-link-page.tsx","../../../resources/client/dashboard/dashboard-routes.tsx"],"sourcesContent":["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 {ComponentType} from 'react';\nimport {MessageDescriptor} from '../../i18n/message-descriptor';\nimport {NormalizedModel} from '@common/datatable/filters/normalized-model';\nimport {ChipValue} from '@common/ui/forms/input-field/chip-field/chip-field';\nimport {AbsoluteDateRange} from '@common/ui/forms/input-field/date/date-range-picker/form-date-range-picker';\nimport {DateValue} from '@internationalized/date';\nimport {FilterListControlProps} from '@common/datatable/filters/filter-list/filter-list-control';\n\nexport interface FilterSelectControl {\n type: FilterControlType.Select;\n options: {label: MessageDescriptor; key: string | number; value: any}[];\n defaultValue?: string | number | boolean;\n placeholder?: MessageDescriptor;\n searchPlaceholder?: MessageDescriptor;\n showSearchField?: boolean;\n}\n\nexport interface FilterNumberInputControl {\n type: FilterControlType.Input;\n placeholder?: MessageDescriptor;\n inputType: 'number';\n minValue?: number;\n maxValue?: number;\n defaultValue: number;\n}\n\nexport interface FilterTextInputControl {\n type: FilterControlType.Input;\n placeholder?: MessageDescriptor;\n inputType: 'string';\n minLength?: number;\n maxLength?: number;\n defaultValue: string;\n}\n\nexport interface FilterSelectModelControl {\n type: FilterControlType.SelectModel;\n model: string;\n defaultValue?: NormalizedModel;\n}\n\nexport interface FilterChipFieldControl {\n type: FilterControlType.ChipField;\n options: FilterSelectControl['options'];\n placeholder?: MessageDescriptor;\n defaultValue: ChipValue[];\n}\n\nexport interface FilterBooleanToggleControl {\n type: FilterControlType.BooleanToggle;\n // value can be something other than boolean, toggling will either send that value or nothing\n defaultValue: string | number | boolean | null;\n}\n\nexport interface DatePickerFilterControl {\n type: FilterControlType.DateRangePicker;\n defaultValue: AbsoluteDateRange;\n min?: DateValue;\n max?: DateValue;\n}\n\nexport interface CustomFilterControl {\n type: FilterControlType.Custom;\n panel: ComponentType<{filter: BackendFilter<CustomFilterControl>}>;\n listItem: ComponentType<FilterListControlProps<number, CustomFilterControl>>;\n defaultValue?: any;\n}\n\nexport type FilterControl =\n | FilterSelectControl\n | FilterNumberInputControl\n | FilterTextInputControl\n | FilterSelectModelControl\n | FilterChipFieldControl\n | DatePickerFilterControl\n | FilterBooleanToggleControl\n | CustomFilterControl;\n\nexport interface BackendFilter<T = FilterControl> {\n key: string;\n label: MessageDescriptor;\n description?: MessageDescriptor;\n control: T;\n defaultOperator: FilterOperator;\n operators?: FilterOperator[];\n extraFilters?: {key: string; operator: FilterOperator; value: any}[];\n}\n\nexport enum FilterControlType {\n Select = 'select',\n DateRangePicker = 'dateRangePicker',\n SelectModel = 'selectModel',\n Input = 'input',\n BooleanToggle = 'booleanToggle',\n ChipField = 'chipField',\n Custom = 'custom',\n}\n\nexport enum FilterOperator {\n eq = '=',\n ne = '!=',\n gt = '>',\n gte = '>=',\n lt = '<',\n lte = '<=',\n has = 'has',\n hasAll = 'hasAll',\n doesntHave = 'doesntHave',\n between = 'between',\n}\n\nexport const ALL_PRIMITIVE_OPERATORS = [\n FilterOperator.eq,\n FilterOperator.ne,\n FilterOperator.gt,\n FilterOperator.gte,\n FilterOperator.lt,\n FilterOperator.lte,\n];\n","import {ZonedDateTime} from '@internationalized/date';\n\nexport function startOfDay(date: ZonedDateTime): ZonedDateTime {\n return date.set({hour: 0, minute: 0, second: 0, millisecond: 0});\n}\n","import {ZonedDateTime} from '@internationalized/date';\n\nexport function endOfDay(date: ZonedDateTime): ZonedDateTime {\n return date.set({\n hour: 24 - 1,\n minute: 60 - 1,\n second: 60 - 1,\n millisecond: 1000 - 1,\n });\n}\n","import {getBootstrapData} from '../core/bootstrap-data/use-backend-bootstrap-data';\nimport {getLocalTimeZone} from '@internationalized/date';\n\nexport function getUserTimezone(): string {\n const defaultTimezone = getBootstrapData()?.settings.dates.default_timezone;\n const preferredTimezone =\n getBootstrapData()?.user?.timezone || defaultTimezone || 'auto';\n\n if (!preferredTimezone || preferredTimezone === 'auto') {\n return getLocalTimeZone();\n }\n return preferredTimezone;\n}\n","import {DateRangeValue} from '../date-range-value';\nimport {message} from '@common/i18n/message';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {\n endOfMonth,\n endOfWeek,\n endOfYear,\n now,\n startOfMonth,\n startOfWeek,\n startOfYear,\n} from '@internationalized/date';\nimport {startOfDay} from '@common/utils/date/start-of-day';\nimport {endOfDay} from '@common/utils/date/end-of-day';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\nimport {getUserTimezone} from '@common/i18n/get-user-timezone';\n\nconst Now = startOfDay(now(getUserTimezone()));\nconst locale = getBootstrapData()?.i18n?.language || 'en';\n\nexport interface DateRangePreset {\n key: number;\n label: MessageDescriptor;\n getRangeValue: () => DateRangeValue;\n}\n\nexport const DateRangePresets: DateRangePreset[] = [\n {\n key: 0,\n label: message('Today'),\n getRangeValue: () => ({\n preset: 0,\n start: Now,\n end: endOfDay(Now),\n }),\n },\n {\n key: 1,\n label: message('Yesterday'),\n getRangeValue: () => ({\n preset: 1,\n start: Now.subtract({days: 1}),\n end: endOfDay(Now).subtract({days: 1}),\n }),\n },\n {\n key: 2,\n label: message('This week'),\n getRangeValue: () => ({\n preset: 2,\n start: startOfWeek(Now, locale),\n end: endOfWeek(endOfDay(Now), locale),\n }),\n },\n {\n key: 3,\n label: message('Last week'),\n getRangeValue: () => {\n const start = startOfWeek(Now, locale).subtract({days: 7});\n return {\n preset: 3,\n start,\n end: start.add({days: 6}),\n };\n },\n },\n {\n key: 4,\n label: message('Last 7 days'),\n getRangeValue: () => ({\n preset: 4,\n start: Now.subtract({days: 7}),\n end: endOfDay(Now),\n }),\n },\n {\n key: 6,\n label: message('Last 30 days'),\n getRangeValue: () => ({\n preset: 6,\n start: Now.subtract({days: 30}),\n end: endOfDay(Now),\n }),\n },\n {\n key: 7,\n label: message('Last 3 months'),\n getRangeValue: () => ({\n preset: 7,\n start: Now.subtract({months: 3}),\n end: endOfDay(Now),\n }),\n },\n {\n key: 8,\n label: message('Last 12 months'),\n getRangeValue: () => ({\n preset: 8,\n start: Now.subtract({months: 12}),\n end: endOfDay(Now),\n }),\n },\n {\n key: 9,\n label: message('This month'),\n getRangeValue: () => ({\n preset: 9,\n start: startOfMonth(Now),\n end: endOfMonth(endOfDay(Now)),\n }),\n },\n {\n key: 10,\n label: message('This year'),\n getRangeValue: () => ({\n preset: 10,\n start: startOfYear(Now),\n end: endOfYear(endOfDay(Now)),\n }),\n },\n {\n key: 11,\n label: message('Last year'),\n getRangeValue: () => ({\n preset: 11,\n start: startOfYear(Now).subtract({years: 1}),\n end: endOfYear(endOfDay(Now)).subtract({years: 1}),\n }),\n },\n];\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const DateRangeIcon = createSvgIcon(\n <path d=\"M7 11h2v2H7v-2zm14-5v14c0 1.1-.9 2-2 2H5c-1.11 0-2-.9-2-2l.01-14c0-1.1.88-2 1.99-2h1V2h2v2h8V2h2v2h1c1.1 0 2 .9 2 2zM5 8h14V6H5v2zm14 12V10H5v10h14zm-4-7h2v-2h-2v2zm-4 0h2v-2h-2v2z\" />\n, 'DateRangeOutlined');\n","import {FocusScope} from '@react-aria/focus';\nimport React, {ComponentPropsWithoutRef, CSSProperties, ReactNode} from 'react';\nimport clsx from 'clsx';\n\ninterface InputProps {\n className?: string;\n children: ReactNode;\n autoFocus?: boolean;\n disabled?: boolean;\n style?: CSSProperties;\n inputProps?: ComponentPropsWithoutRef<'div'>;\n wrapperProps?: ComponentPropsWithoutRef<'div'>;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n}\n\nexport const Input = React.forwardRef<HTMLDivElement, InputProps>(\n (props, ref) => {\n const {\n children,\n inputProps,\n wrapperProps,\n className,\n autoFocus,\n style,\n onClick,\n } = props;\n\n return (\n <div {...wrapperProps} onClick={onClick}>\n <div\n {...inputProps}\n role=\"group\"\n className={clsx(\n className,\n 'flex items-center focus-within:ring focus-within:ring-primary/focus focus-within:border-primary/60'\n )}\n ref={ref}\n style={style}\n >\n <FocusScope autoFocus={autoFocus}>{children}</FocusScope>\n </div>\n </div>\n );\n }\n);\n","import React, {ComponentPropsWithoutRef, FocusEventHandler, Ref} from 'react';\nimport clsx from 'clsx';\nimport {createFocusManager} from '@react-aria/focus';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {getInputFieldClassNames} from '../../get-input-field-class-names';\nimport {Field, FieldProps} from '../../field';\nimport {Input} from '../../input';\nimport {useField} from '../../use-field';\n\nexport interface DatePickerFieldProps\n extends Omit<FieldProps, 'fieldClassNames'> {\n inputRef?: Ref<HTMLDivElement>;\n onBlur?: FocusEventHandler;\n showCalendarFooter?: boolean;\n}\nexport const DatePickerField = React.forwardRef<\n HTMLDivElement,\n DatePickerFieldProps\n>(({inputRef, wrapperProps, children, onBlur, ...other}, ref) => {\n const fieldClassNames = getInputFieldClassNames(other);\n const objRef = useObjectRef(ref);\n\n const {fieldProps, inputProps} = useField({\n ...other,\n focusRef: objRef,\n labelElementType: 'span',\n });\n\n fieldClassNames.wrapper = clsx(\n fieldClassNames.wrapper,\n other.disabled && 'pointer-events-none',\n );\n\n return (\n <Field\n wrapperProps={mergeProps<ComponentPropsWithoutRef<'div'>[]>(\n wrapperProps!,\n {\n onBlur: e => {\n if (!objRef.current.contains(e.relatedTarget)) {\n onBlur?.(e);\n }\n },\n onClick: () => {\n // focus first segment when clicking on label or somewhere else in the field, but no directly on segment\n const focusManager = createFocusManager(objRef);\n focusManager?.focusFirst();\n },\n },\n )}\n fieldClassNames={fieldClassNames}\n ref={objRef}\n {...fieldProps}\n >\n <Input\n inputProps={inputProps}\n className={clsx(fieldClassNames.input, 'gap-10')}\n ref={inputRef}\n >\n {children}\n </Input>\n </Field>\n );\n});\n","import {CalendarDate, DateValue} from '@internationalized/date';\n\nexport function getDefaultGranularity(date: DateValue) {\n if (date instanceof CalendarDate) {\n return 'day';\n }\n return 'minute';\n}\n\nexport function dateIsInvalid(\n date: CalendarDate,\n min?: DateValue,\n max?: DateValue\n) {\n return (\n (min != null && date.compare(min) < 0) ||\n (max != null && date.compare(max) > 0)\n );\n}\n","import {useState} from 'react';\nimport {DateValue, toZoned, ZonedDateTime} from '@internationalized/date';\nimport {getDefaultGranularity} from './utils';\nimport type {DatePickerValueProps} from './date-picker/use-date-picker-state';\nimport {DateRangeValue} from './date-range-picker/date-range-value';\nimport {useUserTimezone} from '@common/i18n/use-user-timezone';\n\nexport function useBaseDatePickerState(\n selectedDate: DateValue,\n props:\n | DatePickerValueProps<ZonedDateTime>\n | DatePickerValueProps<Partial<DateRangeValue>, DateRangeValue>\n) {\n const timezone = useUserTimezone();\n const [calendarIsOpen, setCalendarIsOpen] = useState(false);\n const closeDialogOnSelection = props.closeDialogOnSelection ?? true;\n\n const granularity = props.granularity || getDefaultGranularity(selectedDate);\n const min = props.min ? toZoned(props.min, timezone) : undefined;\n const max = props.max ? toZoned(props.max, timezone) : undefined;\n\n return {\n timezone,\n granularity,\n min,\n max,\n calendarIsOpen,\n setCalendarIsOpen,\n closeDialogOnSelection,\n };\n}\n","import {useMemo} from 'react';\nimport {now} from '@internationalized/date';\nimport {useUserTimezone} from './use-user-timezone';\n\nexport function useCurrentDateTime() {\n const timezone = useUserTimezone();\n return useMemo(() => {\n return now(timezone);\n }, [timezone]);\n}\n","import {useControlledState} from '@react-stately/utils';\nimport {HTMLAttributes, useCallback, useState} from 'react';\nimport {\n CalendarDate,\n DateValue,\n endOfMonth,\n isSameDay,\n isSameMonth,\n maxDate,\n minDate,\n startOfMonth,\n toCalendarDate,\n toZoned,\n ZonedDateTime,\n} from '@internationalized/date';\nimport {\n BaseDatePickerState,\n DatePickerValueProps,\n} from '../date-picker/use-date-picker-state';\nimport {DateRangeValue} from './date-range-value';\nimport {useBaseDatePickerState} from '../use-base-date-picker-state';\nimport {startOfDay} from '@common/utils/date/start-of-day';\nimport {endOfDay} from '@common/utils/date/end-of-day';\nimport {useCurrentDateTime} from '@common/i18n/use-current-date-time';\n\nexport interface IsPlaceholderValue {\n start: boolean;\n end: boolean;\n}\n\nexport type DateRangePickerState = BaseDatePickerState<\n DateRangeValue,\n IsPlaceholderValue\n>;\n\nexport function useDateRangePickerState(\n props: DatePickerValueProps<Partial<DateRangeValue>, DateRangeValue>,\n): DateRangePickerState {\n const now = useCurrentDateTime();\n const [isPlaceholder, setIsPlaceholder] = useState<IsPlaceholderValue>({\n start: (!props.value || !props.value.start) && !props.defaultValue?.start,\n end: (!props.value || !props.value.end) && !props.defaultValue?.end,\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 ? completeRange(props.value, now) : undefined,\n !props.value ? completeRange(props.defaultValue, now) : undefined,\n value => {\n setIsPlaceholder({start: false, end: 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.start, props);\n\n const clear = useCallback(() => {\n setIsPlaceholder({start: true, end: true});\n setInternalValue(completeRange(null, now));\n setStateValue?.(null);\n setCalendarIsOpen(false);\n }, [now, setInternalValue, setStateValue, setCalendarIsOpen]);\n\n const [anchorDate, setAnchorDate] = useState<CalendarDate | null>(null);\n const [isHighlighting, setIsHighlighting] = useState(false);\n const [highlightedRange, setHighlightedRange] =\n useState<DateRangeValue>(internalValue);\n const [calendarDates, setCalendarDates] = useState<CalendarDate[]>(() => {\n return rangeToCalendarDates(internalValue, max);\n });\n\n const constrainRange = useCallback(\n (range: DateRangeValue): DateRangeValue => {\n let start = range.start;\n let end = range.end;\n\n // make sure start date is after min date and before max date/range end\n if (min) {\n start = maxDate(start, min);\n }\n const startMax = max ? minDate(max, end) : end;\n start = minDate(start, startMax);\n\n // make sure end date is after min date/range start and before max date\n const endMin = min ? maxDate(min, start) : start;\n end = maxDate(end, endMin);\n\n if (max) {\n end = minDate(end, max);\n }\n\n return {start: toZoned(start, timezone), end: toZoned(end, timezone)};\n },\n [min, max, timezone],\n );\n\n const setSelectedValue = useCallback(\n (newRange: DateRangeValue) => {\n const value = {\n ...constrainRange(newRange),\n preset: newRange.preset,\n };\n setInternalValue(value);\n setHighlightedRange(value);\n setCalendarDates(rangeToCalendarDates(value, max));\n setIsPlaceholder({start: false, end: false});\n },\n [setInternalValue, constrainRange, max],\n );\n\n const dayIsActive = useCallback(\n (day: CalendarDate) => {\n return (\n (!isPlaceholder.start && isSameDay(day, highlightedRange.start)) ||\n (!isPlaceholder.end && isSameDay(day, highlightedRange.end))\n );\n },\n [highlightedRange, isPlaceholder],\n );\n\n const dayIsHighlighted = useCallback(\n (day: CalendarDate) => {\n return (\n (isHighlighting || (!isPlaceholder.start && !isPlaceholder.end)) &&\n day.compare(highlightedRange.start) >= 0 &&\n day.compare(highlightedRange.end) <= 0\n );\n },\n [highlightedRange, isPlaceholder, isHighlighting],\n );\n\n const dayIsRangeStart = useCallback(\n (day: CalendarDate) => isSameDay(day, highlightedRange.start),\n [highlightedRange],\n );\n\n const dayIsRangeEnd = useCallback(\n (day: CalendarDate) => isSameDay(day, highlightedRange.end),\n [highlightedRange],\n );\n\n const getCellProps = useCallback(\n (date: CalendarDate, isSameMonth: boolean): HTMLAttributes<HTMLElement> => {\n return {\n onPointerEnter: () => {\n if (isHighlighting && isSameMonth) {\n setHighlightedRange(\n makeRange({start: anchorDate!, end: date, timezone}),\n );\n }\n },\n onClick: () => {\n if (!isHighlighting) {\n setIsHighlighting(true);\n setAnchorDate(date);\n setHighlightedRange(makeRange({start: date, end: date, timezone}));\n } else {\n const finalRange = makeRange({\n start: anchorDate!,\n end: date,\n timezone,\n });\n // cast to start and end of day after making range, because \"makeRange\"\n // will flip start and end dates, if they are out of order\n finalRange.start = startOfDay(finalRange.start);\n finalRange.end = endOfDay(finalRange.end);\n setIsHighlighting(false);\n setAnchorDate(null);\n setSelectedValue?.(finalRange);\n if (closeDialogOnSelection) {\n setCalendarIsOpen?.(false);\n }\n }\n },\n };\n },\n [\n anchorDate,\n isHighlighting,\n setSelectedValue,\n setCalendarIsOpen,\n closeDialogOnSelection,\n timezone,\n ],\n );\n\n return {\n selectedValue: internalValue,\n setSelectedValue,\n calendarIsOpen,\n setCalendarIsOpen,\n dayIsActive,\n dayIsHighlighted,\n dayIsRangeStart,\n dayIsRangeEnd,\n getCellProps,\n calendarDates,\n setIsPlaceholder,\n isPlaceholder,\n clear,\n setCalendarDates,\n min,\n max,\n granularity,\n timezone,\n closeDialogOnSelection,\n };\n}\n\nfunction rangeToCalendarDates(\n range: DateRangeValue,\n max?: DateValue,\n): CalendarDate[] {\n let start = toCalendarDate(startOfMonth(range.start));\n let end = toCalendarDate(endOfMonth(range.end));\n\n // make sure we don't show the same month twice\n if (isSameMonth(start, end)) {\n end = endOfMonth(end.add({months: 1}));\n }\n\n // if next month is disabled, show previous instead\n if (max && end.compare(max) > 0) {\n end = start;\n start = startOfMonth(start.subtract({months: 1}));\n }\n return [start, end];\n}\n\ninterface MakeRangeProps {\n start: DateValue;\n end: DateValue;\n timezone: string;\n}\nfunction makeRange(props: MakeRangeProps): DateRangeValue {\n const start = toZoned(props.start, props.timezone);\n const end = toZoned(props.end, props.timezone);\n if (start.compare(end) > 0) {\n return {start: end, end: start};\n }\n return {start, end};\n}\n\nfunction completeRange(\n range: Partial<DateRangeValue> | null | undefined,\n now: ZonedDateTime,\n): DateRangeValue {\n if (range?.start && range?.end) {\n return range as DateRangeValue;\n } else if (!range?.start && range?.end) {\n range.start = range.end.subtract({months: 1});\n return range as DateRangeValue;\n } else if (!range?.end && range?.start) {\n range.end = range.start.add({months: 1});\n return range as DateRangeValue;\n }\n return {start: now, end: now.add({months: 1})};\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ArrowRightAltIcon = createSvgIcon(\n <path d=\"M16.01 11H4v2h12.01v3L20 12l-3.99-4v3z\" />\n, 'ArrowRightAltOutlined');\n","import {ZonedDateTime} from '@internationalized/date';\n\nexport function adjustSegment(\n value: ZonedDateTime,\n part: string,\n amount: number,\n options: Intl.ResolvedDateTimeFormatOptions\n) {\n switch (part) {\n case 'era':\n case 'year':\n case 'month':\n case 'day':\n return value.cycle(part, amount, {round: part === 'year'});\n }\n\n if ('hour' in value) {\n switch (part) {\n case 'dayPeriod': {\n const hours = value.hour;\n const isPM = hours >= 12;\n return value.set({hour: isPM ? hours - 12 : hours + 12});\n }\n case 'hour':\n case 'minute':\n case 'second':\n return value.cycle(part, amount, {\n round: part !== 'hour',\n hourCycle: options.hour12 ? 12 : 24,\n });\n }\n }\n\n return value;\n}\n","import {ZonedDateTime} from '@internationalized/date';\n\nexport function setSegment(\n value: ZonedDateTime,\n part: string,\n segmentValue: number,\n options: Intl.ResolvedDateTimeFormatOptions\n) {\n switch (part) {\n case 'day':\n case 'month':\n case 'year':\n return value.set({[part]: segmentValue});\n }\n\n if ('hour' in value) {\n switch (part) {\n case 'dayPeriod': {\n const hours = value.hour;\n const wasPM = hours >= 12;\n const isPM = segmentValue >= 12;\n if (isPM === wasPM) {\n return value;\n }\n return value.set({hour: wasPM ? hours - 12 : hours + 12});\n }\n case 'hour':\n // In 12 hour time, ensure that AM/PM does not change\n if (options.hour12) {\n const hours = value.hour;\n const wasPM = hours >= 12;\n if (!wasPM && segmentValue === 12) {\n segmentValue = 0;\n }\n if (wasPM && segmentValue < 12) {\n segmentValue += 12;\n }\n }\n // fallthrough\n case 'minute':\n case 'second':\n return value.set({[part]: segmentValue});\n }\n }\n\n return value;\n}\n","export const PAGE_STEP = {\n year: 5,\n month: 2,\n day: 7,\n hour: 2,\n minute: 15,\n second: 15,\n dayPeriod: 1,\n};\n","import {useFocusManager} from '@react-aria/focus';\nimport React, {\n ComponentPropsWithoutRef,\n HTMLAttributes,\n KeyboardEventHandler,\n useMemo,\n useRef,\n} from 'react';\nimport {NumberParser} from '@internationalized/number';\nimport {mergeProps} from '@react-aria/utils';\nimport {today, ZonedDateTime} from '@internationalized/date';\nimport {useSelectedLocale} from '@common/i18n/selected-locale';\nimport {useDateFormatter} from '@common/i18n/use-date-formatter';\nimport {DatePickerState} from '../date-picker/use-date-picker-state';\nimport {adjustSegment} from './utils/adjust-segment';\nimport {setSegment} from './utils/set-segment';\nimport {PAGE_STEP} from './utils/page-step';\nimport {DateRangePickerState} from '../date-range-picker/use-date-range-picker-state';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\n\nexport interface EditableSegment {\n type: 'day' | 'dayPeriod' | 'hour' | 'minute' | 'month' | 'second' | 'year';\n text: string;\n value: number;\n minValue: number;\n maxValue: number;\n minLength: number;\n}\n\ninterface DatePickerSegmentProps {\n segment: EditableSegment;\n domProps?: ComponentPropsWithoutRef<'div'>;\n state: DatePickerState | DateRangePickerState;\n value: ZonedDateTime;\n onChange: (newValue: ZonedDateTime) => void;\n isPlaceholder?: boolean;\n}\nexport function EditableDateSegment({\n segment,\n domProps,\n value,\n onChange,\n isPlaceholder,\n state: {timezone, calendarIsOpen, setCalendarIsOpen},\n}: DatePickerSegmentProps) {\n const isMobile = useIsMobileMediaQuery();\n const enteredKeys = useRef('');\n const {localeCode} = useSelectedLocale();\n const focusManager = useFocusManager();\n const formatter = useDateFormatter({timeZone: timezone});\n const parser = useMemo(\n () => new NumberParser(localeCode, {maximumFractionDigits: 0}),\n [localeCode],\n );\n\n const setSegmentValue = (newValue: number) => {\n onChange(\n setSegment(value, segment.type, newValue, formatter.resolvedOptions()),\n );\n };\n\n const adjustSegmentValue = (amount: number) => {\n onChange(\n adjustSegment(value, segment.type, amount, formatter.resolvedOptions()),\n );\n };\n\n const backspace = () => {\n if (parser.isValidPartialNumber(segment.text)) {\n const newValue = segment.text.slice(0, -1);\n const parsed = parser.parse(newValue);\n if (newValue.length === 0 || parsed === 0) {\n const now = today(timezone);\n if (segment.type in now) {\n // @ts-ignore\n setSegmentValue(now[segment.type]);\n }\n } else {\n setSegmentValue(parsed);\n }\n enteredKeys.current = newValue;\n } else if (segment.type === 'dayPeriod') {\n adjustSegmentValue(-1);\n }\n };\n\n const onKeyDown: KeyboardEventHandler = e => {\n if (e.ctrlKey || e.metaKey || e.shiftKey || e.altKey) {\n return;\n }\n\n // Navigation between date segments and deletion\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault();\n e.stopPropagation();\n focusManager?.focusPrevious();\n break;\n case 'ArrowRight':\n e.preventDefault();\n e.stopPropagation();\n focusManager?.focusNext();\n break;\n case 'Enter':\n (e.target as HTMLElement).closest('form')?.requestSubmit();\n setCalendarIsOpen(!calendarIsOpen);\n break;\n case 'Tab':\n break;\n case 'Backspace':\n case 'Delete': {\n e.preventDefault();\n e.stopPropagation();\n backspace();\n break;\n }\n\n // Spinbutton incrementing/decrementing\n case 'ArrowUp':\n e.preventDefault();\n enteredKeys.current = '';\n adjustSegmentValue(1);\n break;\n case 'ArrowDown':\n e.preventDefault();\n enteredKeys.current = '';\n adjustSegmentValue(-1);\n break;\n case 'PageUp':\n e.preventDefault();\n enteredKeys.current = '';\n adjustSegmentValue(PAGE_STEP[segment.type] || 1);\n break;\n case 'PageDown':\n e.preventDefault();\n enteredKeys.current = '';\n adjustSegmentValue(-(PAGE_STEP[segment.type] || 1));\n break;\n case 'Home':\n e.preventDefault();\n enteredKeys.current = '';\n setSegmentValue(segment.maxValue);\n break;\n case 'End':\n e.preventDefault();\n enteredKeys.current = '';\n setSegmentValue(segment.minValue);\n break;\n }\n\n onInput(e.key);\n };\n\n const amPmFormatter = useDateFormatter({hour: 'numeric', hour12: true});\n const am = useMemo(() => {\n const amDate = new Date();\n amDate.setHours(0);\n return amPmFormatter\n .formatToParts(amDate)\n .find(part => part.type === 'dayPeriod')!.value;\n }, [amPmFormatter]);\n const pm = useMemo(() => {\n const pmDate = new Date();\n pmDate.setHours(12);\n return amPmFormatter\n .formatToParts(pmDate)\n .find(part => part.type === 'dayPeriod')!.value;\n }, [amPmFormatter]);\n\n // Update date values on user keyboard input\n const onInput = (key: string) => {\n const newValue = enteredKeys.current + key;\n\n switch (segment.type) {\n case 'dayPeriod':\n if (am.toLowerCase().startsWith(key)) {\n setSegmentValue(0);\n } else if (pm.toLowerCase().startsWith(key)) {\n setSegmentValue(12);\n } else {\n break;\n }\n focusManager?.focusNext();\n break;\n case 'day':\n case 'hour':\n case 'minute':\n case 'second':\n case 'month':\n case 'year': {\n if (!parser.isValidPartialNumber(newValue)) {\n return;\n }\n\n let numberValue = parser.parse(newValue);\n let segmentValue = numberValue;\n let allowsZero = segment.minValue === 0;\n if (segment.type === 'hour' && formatter.resolvedOptions().hour12) {\n switch (formatter.resolvedOptions().hourCycle) {\n case 'h11':\n if (numberValue > 11) {\n segmentValue = parser.parse(key);\n }\n break;\n case 'h12':\n allowsZero = false;\n if (numberValue > 12) {\n segmentValue = parser.parse(key);\n }\n break;\n }\n\n if (segment.value >= 12 && numberValue > 1) {\n numberValue += 12;\n }\n } else if (numberValue > segment.maxValue) {\n segmentValue = parser.parse(key);\n }\n\n if (Number.isNaN(numberValue)) {\n return;\n }\n\n const shouldSetValue = segmentValue !== 0 || allowsZero;\n if (shouldSetValue) {\n setSegmentValue(segmentValue);\n }\n\n if (\n Number(`${numberValue}0`) > segment.maxValue ||\n newValue.length >= String(segment.maxValue).length\n ) {\n enteredKeys.current = '';\n if (shouldSetValue) {\n focusManager?.focusNext();\n }\n } else {\n enteredKeys.current = newValue;\n }\n break;\n }\n }\n };\n\n const spinButtonProps: HTMLAttributes<HTMLDivElement> = isMobile\n ? {}\n : {\n 'aria-label': segment.type,\n 'aria-valuetext': isPlaceholder ? undefined : `${segment.value}`,\n 'aria-valuemin': segment.minValue,\n 'aria-valuemax': segment.maxValue,\n 'aria-valuenow': isPlaceholder ? undefined : segment.value,\n tabIndex: 0,\n onKeyDown,\n };\n\n return (\n <div\n {...mergeProps(domProps!, {\n ...spinButtonProps,\n onFocus: e => {\n enteredKeys.current = '';\n e.target.scrollIntoView({block: 'nearest'});\n },\n onClick: e => {\n e.preventDefault();\n e.stopPropagation();\n },\n } as HTMLAttributes<HTMLDivElement>)}\n className=\"box-content cursor-default select-none whitespace-nowrap rounded p-2 text-center tabular-nums caret-transparent outline-none focus:bg-primary focus:text-on-primary\"\n >\n {segment.text.padStart(segment.minLength, '0')}\n </div>\n );\n}\n","import {useFocusManager} from '@react-aria/focus';\nimport {ComponentPropsWithoutRef} from 'react';\n\nexport interface LiteralSegment {\n type: 'literal';\n minLength: 1;\n text: string;\n}\n\ninterface LiteralSegmentProps extends ComponentPropsWithoutRef<'div'> {\n segment: LiteralSegment;\n domProps?: ComponentPropsWithoutRef<'div'>;\n}\nexport function LiteralDateSegment({segment, domProps}: LiteralSegmentProps) {\n const focusManager = useFocusManager();\n return (\n <div\n {...domProps}\n onPointerDown={e => {\n if (e.pointerType === 'mouse') {\n e.preventDefault();\n const res = focusManager?.focusNext({from: e.target as HTMLElement});\n if (!res) {\n focusManager?.focusPrevious({from: e.target as HTMLElement});\n }\n }\n }}\n aria-hidden\n className=\"min-w-4 cursor-default select-none\"\n >\n {segment.text}\n </div>\n );\n}\n","import {\n DateValue,\n getMinimumDayInMonth,\n getMinimumMonthInYear,\n} from '@internationalized/date';\n\nexport function getSegmentLimits(\n date: DateValue,\n type: string,\n options: Intl.ResolvedDateTimeFormatOptions\n) {\n switch (type) {\n case 'year':\n return {\n value: date.year,\n placeholder: 'yyyy',\n minValue: 1,\n maxValue: date.calendar.getYearsInEra(date),\n };\n case 'month':\n return {\n value: date.month,\n placeholder: 'mm',\n minValue: getMinimumMonthInYear(date),\n maxValue: date.calendar.getMonthsInYear(date),\n };\n case 'day':\n return {\n value: date.day,\n minValue: getMinimumDayInMonth(date),\n maxValue: date.calendar.getDaysInMonth(date),\n placeholder: 'dd',\n };\n }\n\n if ('hour' in date) {\n switch (type) {\n case 'dayPeriod':\n return {\n value: date.hour >= 12 ? 12 : 0,\n minValue: 0,\n maxValue: 12,\n placeholder: '--',\n };\n case 'hour':\n if (options.hour12) {\n const isPM = date.hour >= 12;\n return {\n value: date.hour,\n minValue: isPM ? 12 : 0,\n maxValue: isPM ? 23 : 11,\n placeholder: '--',\n };\n }\n\n return {\n value: date.hour,\n minValue: 0,\n maxValue: 23,\n placeholder: '--',\n };\n case 'minute':\n return {\n value: date.minute,\n minValue: 0,\n maxValue: 59,\n placeholder: '--',\n };\n }\n }\n\n return {};\n}\n","import React, {ComponentPropsWithoutRef, useMemo} from 'react';\nimport {ZonedDateTime} from '@internationalized/date';\nimport {EditableDateSegment, EditableSegment} from './editable-date-segment';\nimport {LiteralDateSegment, LiteralSegment} from './literal-segment';\nimport {useDateFormatter} from '@common/i18n/use-date-formatter';\nimport {DatePickerState} from '../date-picker/use-date-picker-state';\nimport {getSegmentLimits} from './utils/get-segment-limits';\nimport {DateRangePickerState} from '../date-range-picker/use-date-range-picker-state';\n\ninterface DateSegmentListProps {\n segmentProps?: ComponentPropsWithoutRef<'div'>;\n state: DatePickerState | DateRangePickerState;\n value: ZonedDateTime;\n onChange: (newValue: ZonedDateTime) => void;\n isPlaceholder?: boolean;\n}\nexport function DateSegmentList({\n segmentProps,\n state,\n value,\n onChange,\n isPlaceholder,\n}: DateSegmentListProps) {\n const {granularity} = state;\n const options = useMemo(() => {\n const memoOptions: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'numeric',\n day: 'numeric',\n };\n if (granularity === 'minute') {\n memoOptions.hour = 'numeric';\n memoOptions.minute = 'numeric';\n }\n return memoOptions;\n }, [granularity]);\n\n const formatter = useDateFormatter(options);\n\n const dateValue = useMemo(() => value.toDate(), [value]);\n const segments = useMemo(() => {\n return formatter.formatToParts(dateValue).map(segment => {\n const limits = getSegmentLimits(\n value,\n segment.type,\n formatter.resolvedOptions(),\n );\n const textValue =\n isPlaceholder && segment.type !== 'literal'\n ? limits.placeholder\n : segment.value;\n return {\n type: segment.type,\n text: segment.value === ', ' ? ' ' : textValue,\n ...limits,\n minLength:\n segment.type !== 'literal' ? String(limits.maxValue).length : 1,\n } as LiteralSegment | EditableSegment;\n });\n }, [dateValue, formatter, isPlaceholder, value]);\n\n return (\n <div className=\"flex items-center\">\n {segments.map((segment, index) => {\n if (segment.type === 'literal') {\n return (\n <LiteralDateSegment\n domProps={segmentProps}\n key={index}\n segment={segment}\n />\n );\n }\n return (\n <EditableDateSegment\n isPlaceholder={isPlaceholder}\n domProps={segmentProps}\n state={state}\n value={value}\n onChange={onChange}\n segment={segment}\n key={index}\n />\n );\n })}\n </div>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const KeyboardArrowLeftIcon = createSvgIcon(\n <path d=\"M15.41 16.59 10.83 12l4.58-4.59L14 6l-6 6 6 6 1.41-1.41z\" />\n, 'KeyboardArrowLeftOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const KeyboardArrowRightIcon = createSvgIcon(\n <path d=\"M8.59 16.59 13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z\" />\n, 'KeyboardArrowRightOutlined');\n","import React from 'react';\nimport clsx from 'clsx';\nimport {\n CalendarDate,\n DateValue,\n getDayOfWeek,\n isSameMonth,\n isToday,\n} from '@internationalized/date';\nimport {useSelectedLocale} from '../../../../../i18n/selected-locale';\nimport {DatePickerState} from '../date-picker/use-date-picker-state';\nimport {dateIsInvalid} from '../utils';\nimport {DateRangePickerState} from '../date-range-picker/use-date-range-picker-state';\n\ninterface CalendarCellProps {\n date: CalendarDate;\n currentMonth: DateValue;\n state: DatePickerState | DateRangePickerState;\n}\nexport function CalendarCell({\n date,\n currentMonth,\n state: {\n dayIsActive,\n dayIsHighlighted,\n dayIsRangeStart,\n dayIsRangeEnd,\n getCellProps,\n timezone,\n min,\n max,\n },\n}: CalendarCellProps) {\n const {localeCode} = useSelectedLocale();\n const dayOfWeek = getDayOfWeek(date, localeCode);\n const isActive = dayIsActive(date);\n const isHighlighted = dayIsHighlighted(date);\n const isRangeStart = dayIsRangeStart(date);\n const isRangeEnd = dayIsRangeEnd(date);\n const dayIsToday = isToday(date, timezone);\n const sameMonth = isSameMonth(date, currentMonth);\n const isDisabled = dateIsInvalid(date, min, max);\n\n return (\n <div\n role=\"button\"\n aria-disabled={isDisabled}\n className={clsx(\n 'w-40 h-40 text-sm relative isolate flex-shrink-0',\n isDisabled && 'text-disabled pointer-events-none',\n !sameMonth && 'invisible pointer-events-none'\n )}\n {...getCellProps(date, sameMonth)}\n >\n <span\n className={clsx(\n 'absolute inset-0 flex items-center justify-center rounded-full w-full h-full select-none z-10 cursor-pointer',\n !isActive && !dayIsToday && 'hover:bg-hover',\n isActive && 'bg-primary text-on-primary font-semibold',\n dayIsToday && !isActive && 'bg-chip'\n )}\n >\n {date.day}\n </span>\n {isHighlighted && sameMonth && (\n <span\n className={clsx(\n 'absolute w-full h-full inset-0 bg-primary/focus',\n (isRangeStart || dayOfWeek === 0 || date.day === 1) &&\n 'rounded-l-full',\n (isRangeEnd ||\n dayOfWeek === 6 ||\n date.day ===\n currentMonth.calendar.getDaysInMonth(currentMonth)) &&\n 'rounded-r-full'\n )}\n />\n )}\n </div>\n );\n}\n","import React from 'react';\nimport clsx from 'clsx';\nimport {m} from 'framer-motion';\nimport {\n CalendarDate,\n endOfMonth,\n getWeeksInMonth,\n startOfMonth,\n startOfWeek,\n} from '@internationalized/date';\nimport {KeyboardArrowLeftIcon} from '../../../../../icons/material/KeyboardArrowLeft';\nimport {IconButton} from '../../../../buttons/icon-button';\nimport {KeyboardArrowRightIcon} from '../../../../../icons/material/KeyboardArrowRight';\nimport {CalendarCell} from './calendar-cell';\nimport {DatePickerState} from '../date-picker/use-date-picker-state';\nimport {useDateFormatter} from '../../../../../i18n/use-date-formatter';\nimport {useSelectedLocale} from '../../../../../i18n/selected-locale';\nimport {dateIsInvalid} from '../utils';\nimport {DateRangePickerState} from '../date-range-picker/use-date-range-picker-state';\n\nexport interface CalendarMonthProps {\n state: DatePickerState | DateRangePickerState;\n startDate: CalendarDate;\n isFirst: boolean;\n isLast: boolean;\n}\nexport function CalendarMonth({\n startDate,\n state,\n isFirst,\n isLast,\n}: CalendarMonthProps) {\n const {localeCode} = useSelectedLocale();\n const weeksInMonth = getWeeksInMonth(startDate, localeCode);\n const monthStart = startOfWeek(startDate, localeCode);\n\n return (\n <div className=\"w-280 flex-shrink-0\">\n <CalendarMonthHeader\n isFirst={isFirst}\n isLast={isLast}\n state={state}\n currentMonth={startDate}\n />\n <div className=\"block\" role=\"grid\">\n <WeekdayHeader state={state} startDate={startDate} />\n {[...new Array(weeksInMonth).keys()].map(weekIndex => (\n <m.div className=\"flex mb-6\" key={weekIndex}>\n {[...new Array(7).keys()].map(dayIndex => (\n <CalendarCell\n key={dayIndex}\n date={monthStart.add({weeks: weekIndex, days: dayIndex})}\n currentMonth={startDate}\n state={state}\n />\n ))}\n </m.div>\n ))}\n </div>\n </div>\n );\n}\n\ninterface CalendarMonthHeaderProps {\n state: DatePickerState | DateRangePickerState;\n currentMonth: CalendarDate;\n isFirst: boolean;\n isLast: boolean;\n}\nfunction CalendarMonthHeader({\n currentMonth,\n isFirst,\n isLast,\n state: {calendarDates, setCalendarDates, timezone, min, max},\n}: CalendarMonthHeaderProps) {\n const shiftCalendars = (direction: 'forward' | 'backward') => {\n const count = calendarDates.length;\n let newDates: CalendarDate[];\n if (direction === 'forward') {\n newDates = calendarDates.map(date =>\n endOfMonth(date.add({months: count}))\n );\n } else {\n newDates = calendarDates.map(date =>\n endOfMonth(date.subtract({months: count}))\n );\n }\n setCalendarDates(newDates);\n };\n\n const monthFormatter = useDateFormatter({\n month: 'long',\n year: 'numeric',\n era: currentMonth.calendar.identifier !== 'gregory' ? 'long' : undefined,\n calendar: currentMonth.calendar.identifier,\n });\n\n const isBackwardDisabled = dateIsInvalid(\n currentMonth.subtract({days: 1}),\n min,\n max\n );\n const isForwardDisabled = dateIsInvalid(\n startOfMonth(currentMonth.add({months: 1})),\n min,\n max\n );\n\n return (\n <div className=\"flex items-center justify-between gap-10\">\n <IconButton\n size=\"md\"\n className={clsx('text-muted', !isFirst && 'invisible')}\n disabled={!isFirst || isBackwardDisabled}\n aria-hidden={!isFirst}\n onClick={() => {\n shiftCalendars('backward');\n }}\n >\n <KeyboardArrowLeftIcon />\n </IconButton>\n <div className=\"text-sm font-semibold select-none\">\n {monthFormatter.format(currentMonth.toDate(timezone))}\n </div>\n <IconButton\n size=\"md\"\n className={clsx('text-muted', !isLast && 'invisible')}\n disabled={!isLast || isForwardDisabled}\n aria-hidden={!isLast}\n onClick={() => {\n shiftCalendars('forward');\n }}\n >\n <KeyboardArrowRightIcon />\n </IconButton>\n </div>\n );\n}\n\ninterface WeekdayHeaderProps {\n state: DatePickerState | DateRangePickerState;\n startDate: CalendarDate;\n}\nfunction WeekdayHeader({state: {timezone}, startDate}: WeekdayHeaderProps) {\n const {localeCode} = useSelectedLocale();\n const dayFormatter = useDateFormatter({weekday: 'short'});\n\n const monthStart = startOfWeek(startDate, localeCode);\n\n return (\n <div className=\"flex\">\n {[...new Array(7).keys()].map(index => {\n const date = monthStart.add({days: index});\n const dateDay = date.toDate(timezone);\n const weekday = dayFormatter.format(dateDay);\n return (\n <div\n className=\"w-40 h-40 text-sm font-semibold relative flex-shrink-0\"\n key={index}\n >\n <div className=\"absolute flex items-center justify-center w-full h-full select-none\">\n {weekday}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import React, {Fragment} from 'react';\nimport {startOfMonth, toCalendarDate} from '@internationalized/date';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {CalendarMonth} from './calendar-month';\nimport {DatePickerState} from '../date-picker/use-date-picker-state';\nimport {DateRangePickerState} from '../date-range-picker/use-date-range-picker-state';\n\ninterface CalendarProps {\n state: DatePickerState | DateRangePickerState;\n visibleMonths?: 1 | 2;\n}\nexport function Calendar({state, visibleMonths = 1}: CalendarProps) {\n const isMobile = useIsMobileMediaQuery();\n\n if (isMobile) {\n visibleMonths = 1;\n }\n\n return (\n <Fragment>\n {[...new Array(visibleMonths).keys()].map(index => {\n const startDate = toCalendarDate(\n startOfMonth(state.calendarDates[index])\n );\n const isFirst = index === 0;\n const isLast = index === visibleMonths - 1;\n return (\n <CalendarMonth\n key={index}\n state={state}\n startDate={startDate}\n isFirst={isFirst}\n isLast={isLast}\n />\n );\n })}\n </Fragment>\n );\n}\n","import {DateValue, parseAbsolute} from '@internationalized/date';\nimport {Fragment, memo} from 'react';\nimport {useDateFormatter} from './use-date-formatter';\nimport {useSettings} from '../core/settings/use-settings';\nimport {shallowEqual} from '../utils/shallow-equal';\nimport {useUserTimezone} from './use-user-timezone';\nimport {DateFormatPresets} from '@common/i18n/formatted-date';\n\ninterface FormattedDateTimeRangeProps {\n start?: string | DateValue | Date;\n end?: string | DateValue | Date;\n options?: Intl.DateTimeFormatOptions;\n preset?: keyof typeof DateFormatPresets;\n}\nexport const FormattedDateTimeRange = memo(\n ({start, end, options, preset}: FormattedDateTimeRangeProps) => {\n const {dates} = useSettings();\n const timezone = useUserTimezone();\n const formatter = useDateFormatter(\n options ||\n (DateFormatPresets as Record<string, Intl.DateTimeFormatOptions>)[\n preset || dates?.format\n ]\n );\n\n if (!start || !end) {\n return null;\n }\n\n let value: string;\n\n try {\n value = formatter.formatRange(\n castToDate(start, timezone),\n castToDate(end, timezone)\n );\n } catch (e) {\n value = '';\n }\n\n return <Fragment>{value}</Fragment>;\n },\n shallowEqual\n);\n\nfunction castToDate(date: string | DateValue | Date, timezone: string): Date {\n if (typeof date === 'string') {\n return parseAbsolute(date, timezone).toDate();\n }\n if ('toDate' in date) {\n return date.toDate(timezone);\n }\n return date;\n}\n","import {List, ListItem} from '@common/ui/list/list';\nimport {DateRangePresets} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-presets';\nimport {Trans} from '@common/i18n/trans';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\n\ninterface DateRangePresetList {\n onPresetSelected: (value: DateRangeValue) => void;\n selectedValue?: DateRangeValue | null;\n}\nexport function DatePresetList({\n onPresetSelected,\n selectedValue,\n}: DateRangePresetList) {\n return (\n <List>\n {DateRangePresets.map(preset => (\n <ListItem\n borderRadius=\"rounded-none\"\n capitalizeFirst\n key={preset.key}\n isSelected={selectedValue?.preset === preset.key}\n onSelected={() => {\n const newValue = preset.getRangeValue();\n onPresetSelected(newValue);\n }}\n >\n <Trans {...preset.label} />\n </ListItem>\n ))}\n </List>\n );\n}\n","import {useMediaQuery, UseMediaQueryOptions} from './use-media-query';\n\nexport function useIsTabletMediaQuery(options?: UseMediaQueryOptions) {\n return useMediaQuery('(max-width: 1024px)', options);\n}\n","import React, {ComponentPropsWithoutRef, ReactNode, useId} from 'react';\nimport clsx from 'clsx';\nimport {useController} from 'react-hook-form';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {InputSize} from '../input-field/input-size';\nimport {getInputFieldClassNames} from '../input-field/get-input-field-class-names';\nimport {AutoFocusProps, useAutoFocus} from '../../focus/use-auto-focus';\n\ninterface SwitchProps\n extends AutoFocusProps,\n Omit<ComponentPropsWithoutRef<'input'>, 'size'> {\n size?: InputSize;\n className?: string;\n description?: ReactNode;\n invalid?: boolean;\n errorMessage?: string;\n}\nexport const Switch = React.forwardRef<HTMLInputElement, SwitchProps>(\n (props, ref) => {\n const {\n children,\n size = 'sm',\n description,\n className,\n invalid,\n autoFocus,\n errorMessage,\n ...domProps\n } = props;\n\n const inputRef = useObjectRef(ref);\n useAutoFocus({autoFocus}, inputRef);\n\n const style = getSizeClassName(size);\n const fieldClassNames = getInputFieldClassNames(props);\n\n const descriptionId = useId();\n\n return (\n <div className={clsx(className, 'isolate')}>\n <label className=\"flex items-center select-none\">\n <input\n {...domProps}\n type=\"checkbox\"\n role=\"switch\"\n aria-invalid={invalid || undefined}\n aria-describedby={description ? descriptionId : undefined}\n ref={inputRef}\n aria-checked={domProps.checked}\n className={clsx(\n style,\n !invalid &&\n 'checked:bg-primary dark:checked:bg-primary-dark checked:border-primary dark:checked:border-primary-dark',\n invalid && 'checked:bg-danger checked:border-danger',\n 'outline-none cursor-pointer bg-chip border-chip border checked:bg-primary checked:border-primary p-0 overflow-hidden relative rounded-3xl appearance-none transition-colors flex-shrink-0 flex items-center outline-none',\n 'before:z-10 before:border before:rounded-3xl before:block before:bg-white before:transition-transform before:translate-x-2',\n 'checked:before:border-white',\n 'focus-visible:ring',\n props.disabled && 'opacity-80 cursor-not-allowed'\n )}\n />\n {children && (\n <span\n className={clsx(\n fieldClassNames.size.font,\n 'ml-12',\n invalid && 'text-danger',\n props.disabled && 'text-disabled'\n )}\n >\n {children}\n </span>\n )}\n </label>\n {description && !errorMessage && (\n <div id={descriptionId} className={fieldClassNames.description}>\n {description}\n </div>\n )}\n {errorMessage && (\n <div id={descriptionId} className={fieldClassNames.error}>\n {errorMessage}\n </div>\n )}\n </div>\n );\n }\n);\n\ninterface FormSwitchProps extends SwitchProps {\n name: string;\n}\nexport function FormSwitch(props: FormSwitchProps) {\n const {\n field: {onChange, onBlur, value = false, ref},\n fieldState: {invalid, error},\n } = useController({\n name: props.name,\n });\n\n const formProps: Partial<SwitchProps> = {\n onChange: e => {\n if (e.target.value && e.target.value !== 'on') {\n onChange(e.target.checked ? e.target.value : false);\n } else {\n onChange(e);\n }\n },\n onBlur,\n checked: !!value,\n invalid,\n errorMessage: error?.message,\n name: props.name,\n };\n\n return <Switch ref={ref} {...mergeProps(props, formProps)} />;\n}\n\nfunction getSizeClassName(size: InputSize): string {\n switch (size) {\n case 'xl':\n return 'w-68 h-36 before:w-28 before:h-28 checked:before:translate-x-36';\n case 'lg':\n return 'w-56 h-30 before:w-22 before:h-22 checked:before:translate-x-30';\n case 'md':\n return 'w-46 h-24 before:w-18 before:h-18 checked:before:translate-x-24';\n case 'xs':\n return 'w-30 h-16 before:w-12 before:h-12 checked:before:translate-x-16';\n default:\n return 'w-38 h-20 before:w-14 before:h-14 checked:before:translate-x-20';\n }\n}\n","import {message} from '@common/i18n/message';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\nexport interface DateRangeComparePreset {\n key: number;\n label: MessageDescriptor;\n getRangeValue: (range: DateRangeValue) => DateRangeValue;\n}\n\nexport const DateRangeComparePresets: DateRangeComparePreset[] = [\n {\n key: 0,\n label: message('Preceding period'),\n getRangeValue: (range: DateRangeValue) => {\n const startDate = range.start;\n const endDate = range.end;\n\n const diffInMilliseconds =\n endDate.toDate().getTime() - startDate.toDate().getTime();\n const diffInMinutes = diffInMilliseconds / (1000 * 60);\n const newStart = startDate.subtract({minutes: diffInMinutes});\n return {\n preset: 0,\n start: newStart,\n end: startDate,\n };\n },\n },\n {\n key: 1,\n label: message('Same period last year'),\n getRangeValue: (range: DateRangeValue) => {\n return {\n start: range.start.subtract({years: 1}),\n end: range.end.subtract({years: 1}),\n preset: 1,\n };\n },\n },\n {\n key: 2,\n label: message('Custom'),\n getRangeValue: (range: DateRangeValue) => {\n return {\n start: range.start.subtract({weeks: 1}),\n end: range.end.subtract({weeks: 1}),\n preset: 2,\n };\n },\n },\n];\n","import {List, ListItem} from '@common/ui/list/list';\nimport {Trans} from '@common/i18n/trans';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {DateRangeComparePresets} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-compare-presets';\n\ninterface DateRangePresetList {\n originalRangeValue: DateRangeValue;\n onPresetSelected: (value: DateRangeValue) => void;\n selectedValue?: DateRangeValue | null;\n}\nexport function DateRangeComparePresetList({\n originalRangeValue,\n onPresetSelected,\n selectedValue,\n}: DateRangePresetList) {\n return (\n <List>\n {DateRangeComparePresets.map(preset => (\n <ListItem\n borderRadius=\"rounded-none\"\n capitalizeFirst\n key={preset.key}\n isSelected={selectedValue?.preset === preset.key}\n onSelected={() => {\n const newValue = preset.getRangeValue(originalRangeValue);\n onPresetSelected(newValue);\n }}\n >\n <Trans {...preset.label} />\n </ListItem>\n ))}\n </List>\n );\n}\n","import React, {Fragment, ReactNode, useRef, useState} from 'react';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {DatePickerField} from '../date-picker-field';\nimport {DateRangePickerState} from '../use-date-range-picker-state';\nimport {Calendar} from '../../calendar/calendar';\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 {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {ArrowRightAltIcon} from '@common/icons/material/ArrowRightAlt';\nimport {DateSegmentList} from '../../segments/date-segment-list';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedDateTimeRange} from '@common/i18n/formatted-date-time-range';\nimport {DatePresetList} from './date-range-preset-list';\nimport {useIsTabletMediaQuery} from '@common/utils/hooks/is-tablet-media-query';\nimport {Switch} from '@common/ui/forms/toggle/switch';\nimport {DateRangeComparePresetList} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-compare-preset-list';\n\ninterface DateRangeDialogProps {\n state: DateRangePickerState;\n compareState?: DateRangePickerState;\n compareVisibleDefault?: boolean;\n showInlineDatePickerField?: boolean;\n}\nexport function DateRangeDialog({\n state,\n compareState,\n showInlineDatePickerField = false,\n compareVisibleDefault = false,\n}: DateRangeDialogProps) {\n const isTablet = useIsTabletMediaQuery();\n const {close} = useDialogContext();\n const initialStateRef = useRef<DateRangePickerState>(state);\n const hasPlaceholder = state.isPlaceholder.start || state.isPlaceholder.end;\n const [compareVisible, setCompareVisible] = useState(compareVisibleDefault);\n\n const footer = (\n <DialogFooter\n dividerTop\n startAction={\n !hasPlaceholder && !isTablet ? (\n <div className=\"text-xs\">\n <FormattedDateTimeRange\n start={state.selectedValue.start.toDate()}\n end={state.selectedValue.end.toDate()}\n options={{dateStyle: 'medium'}}\n />\n </div>\n ) : undefined\n }\n >\n <Button\n variant=\"text\"\n size=\"xs\"\n onClick={() => {\n state.setSelectedValue(initialStateRef.current.selectedValue);\n state.setIsPlaceholder(initialStateRef.current.isPlaceholder);\n close();\n }}\n >\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n variant=\"flat\"\n color=\"primary\"\n size=\"xs\"\n onClick={() => {\n const value = state.selectedValue;\n if (compareState && compareVisible) {\n value.compareStart = compareState.selectedValue.start;\n value.compareEnd = compareState.selectedValue.end;\n }\n close(value);\n }}\n >\n <Trans message=\"Select\" />\n </Button>\n </DialogFooter>\n );\n\n return (\n <Dialog size=\"auto\">\n <DialogBody className=\"flex\" padding=\"p-0\">\n {!isTablet && (\n <div className=\"min-w-192 py-14\">\n <DatePresetList\n selectedValue={state.selectedValue}\n onPresetSelected={preset => {\n state.setSelectedValue(preset);\n if (state.closeDialogOnSelection) {\n close(preset);\n }\n }}\n />\n {!!compareState && (\n <Fragment>\n <Switch\n className=\"mx-20 mb-10 mt-14\"\n checked={compareVisible}\n onChange={e => setCompareVisible(e.target.checked)}\n >\n <Trans message=\"Compare\" />\n </Switch>\n {compareVisible && (\n <DateRangeComparePresetList\n originalRangeValue={state.selectedValue}\n selectedValue={compareState.selectedValue}\n onPresetSelected={preset => {\n compareState.setSelectedValue(preset);\n }}\n />\n )}\n </Fragment>\n )}\n </div>\n )}\n <AnimatePresence initial={false}>\n <Calendars\n state={state}\n compareState={compareState}\n showInlineDatePickerField={showInlineDatePickerField}\n compareVisible={compareVisible}\n />\n </AnimatePresence>\n </DialogBody>\n {!state.closeDialogOnSelection && footer}\n </Dialog>\n );\n}\n\ninterface CustomRangePanelProps {\n state: DateRangePickerState;\n compareState?: DateRangePickerState;\n showInlineDatePickerField?: boolean;\n compareVisible: boolean;\n}\nfunction Calendars({\n state,\n compareState,\n showInlineDatePickerField,\n compareVisible,\n}: CustomRangePanelProps) {\n return (\n <m.div\n initial={{width: 0, overflow: 'hidden'}}\n animate={{width: 'auto'}}\n exit={{width: 0, overflow: 'hidden'}}\n transition={{type: 'tween', duration: 0.125}}\n className=\"border-l px-20 pb-20 pt-10\"\n >\n {showInlineDatePickerField && (\n <div>\n <InlineDatePickerField state={state} />\n {!!compareState && compareVisible && (\n <InlineDatePickerField\n state={compareState}\n label={<Trans message=\"Compare\" />}\n />\n )}\n </div>\n )}\n <div className=\"flex items-start gap-36\">\n <Calendar state={state} visibleMonths={2} />\n </div>\n </m.div>\n );\n}\n\ninterface InlineDatePickerFieldProps {\n state: DateRangePickerState;\n label?: ReactNode;\n}\nfunction InlineDatePickerField({state, label}: InlineDatePickerFieldProps) {\n const {selectedValue, setSelectedValue} = state;\n return (\n <DatePickerField className=\"mb-20 mt-10\" label={label}>\n <DateSegmentList\n state={state}\n value={selectedValue.start}\n onChange={newValue => {\n setSelectedValue({...selectedValue, start: newValue});\n }}\n />\n <ArrowRightAltIcon className=\"block flex-shrink-0 text-muted\" size=\"md\" />\n <DateSegmentList\n state={state}\n value={selectedValue.end}\n onChange={newValue => {\n setSelectedValue({...selectedValue, end: newValue});\n }}\n />\n </DatePickerField>\n );\n}\n","import React, {\n ComponentPropsWithoutRef,\n Fragment,\n MouseEvent,\n useRef,\n} from 'react';\nimport {DateRangeIcon} from '../../../../../icons/material/DateRange';\nimport {DialogTrigger} from '../../../../overlays/dialog/dialog-trigger';\nimport {DatePickerField, DatePickerFieldProps} from './date-picker-field';\nimport {useDateRangePickerState} from './use-date-range-picker-state';\nimport {ArrowRightAltIcon} from '../../../../../icons/material/ArrowRightAlt';\nimport {DatePickerValueProps} from '../date-picker/use-date-picker-state';\nimport {DateRangeValue} from './date-range-value';\nimport {DateSegmentList} from '../segments/date-segment-list';\nimport {DateRangeDialog} from './dialog/date-range-dialog';\nimport {useIsMobileMediaQuery} from '../../../../../utils/hooks/is-mobile-media-query';\n\nexport interface DateRangePickerProps\n extends DatePickerValueProps<Partial<DateRangeValue>>,\n Omit<DatePickerFieldProps, 'children'> {}\nexport function DateRangePicker(props: DateRangePickerProps) {\n const {granularity, closeDialogOnSelection, ...fieldProps} = props;\n const state = useDateRangePickerState(props);\n const inputRef = useRef<HTMLDivElement>(null);\n const isMobile = useIsMobileMediaQuery();\n const hideCalendarIcon = isMobile && granularity !== 'day';\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 <DateRangeDialog state={state} />\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 const value = state.selectedValue;\n const onChange = state.setSelectedValue;\n\n return (\n <Fragment>\n <DatePickerField\n ref={inputRef}\n wrapperProps={openOnClick}\n endAdornment={!hideCalendarIcon ? <DateRangeIcon /> : undefined}\n {...fieldProps}\n >\n <DateSegmentList\n isPlaceholder={state.isPlaceholder?.start}\n state={state}\n segmentProps={openOnClick}\n value={value.start}\n onChange={newValue => {\n onChange({start: newValue, end: value.end});\n }}\n />\n <ArrowRightAltIcon\n className=\"block flex-shrink-0 text-muted\"\n size=\"md\"\n />\n <DateSegmentList\n isPlaceholder={state.isPlaceholder?.end}\n state={state}\n segmentProps={openOnClick}\n value={value.end}\n onChange={newValue => {\n onChange({start: value.start, end: newValue});\n }}\n />\n </DatePickerField>\n {dialog}\n </Fragment>\n );\n}\n\nfunction isHourSegment(e: MouseEvent<HTMLDivElement>): boolean {\n return ['hour', 'minute', 'dayPeriod'].includes(\n (e.currentTarget as HTMLElement).ariaLabel || ''\n );\n}\n","import {parseAbsoluteToLocal, ZonedDateTime} from '@internationalized/date';\nimport {DateRangeValue} from './date-range-value';\nimport {useController} from 'react-hook-form';\nimport {mergeProps} from '@react-aria/utils';\nimport React from 'react';\nimport {DateRangePicker, DateRangePickerProps} from './date-range-picker';\n\nexport interface AbsoluteDateRange {\n start?: string;\n end?: string;\n preset?: number;\n}\n\ninterface FormDateRange {\n start?: string | ZonedDateTime;\n end?: string | ZonedDateTime;\n preset?: number;\n}\n\nexport interface FormDateRangePickerProps extends DateRangePickerProps {\n name: string;\n}\nexport function FormDateRangePicker(props: FormDateRangePickerProps) {\n const {\n field: {onChange, onBlur, value, ref},\n fieldState: {invalid, error},\n } = useController({\n name: props.name,\n });\n\n const formProps: Partial<DateRangePickerProps> = {\n onChange: e => {\n onChange(e ? dateRangeToAbsoluteRange(e) : null);\n },\n onBlur,\n value: absoluteRangeToDateRange(value),\n invalid,\n errorMessage: error?.message,\n inputRef: ref,\n };\n\n return <DateRangePicker {...mergeProps(formProps, props)} />;\n}\n\nexport function absoluteRangeToDateRange(props: FormDateRange | null) {\n const {start, end, preset} = props || {};\n const dateRange: Partial<DateRangeValue> = {preset};\n try {\n if (start) {\n dateRange.start =\n typeof start === 'string' ? parseAbsoluteToLocal(start) : start;\n }\n if (end) {\n dateRange.end = typeof end === 'string' ? parseAbsoluteToLocal(end) : end;\n }\n } catch (e) {\n // ignore\n }\n return dateRange;\n}\n\nexport function dateRangeToAbsoluteRange({\n start,\n end,\n preset,\n}: Partial<DateRangeValue> = {}): AbsoluteDateRange {\n const absoluteRange: AbsoluteDateRange = {\n preset,\n };\n if (start) {\n absoluteRange.start = start.toAbsoluteString();\n }\n if (end) {\n absoluteRange.end = end.toAbsoluteString();\n }\n return absoluteRange;\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","export const BackendFiltersUrlKey = 'filters';\n","import {FilterListValue} from './encode-backend-filters';\n\nexport function decodeBackendFilters(\n encodedFilters: string | null\n): FilterListValue[] {\n if (!encodedFilters) return [];\n let filtersFromQuery: FilterListValue[] = [];\n try {\n filtersFromQuery = JSON.parse(atob(decodeURIComponent(encodedFilters)));\n filtersFromQuery.map(filterValue => {\n // set value key as value so selects work properly\n if (filterValue.valueKey != null) {\n filterValue.value = filterValue.valueKey;\n }\n return filterValue;\n });\n } catch (e) {\n //\n }\n return filtersFromQuery;\n}\n","import {Key} from 'react';\nimport {BackendFilter} from '../backend-filter';\n\nexport interface FilterListValue {\n key: Key;\n value: BackendFilter['control']['defaultValue'];\n operator?: BackendFilter['defaultOperator'];\n valueKey?: Key;\n isInactive?: boolean;\n extraFilters?: {key: string; operator: string; value: any}[];\n}\n\nexport function encodeBackendFilters(\n filterValues: FilterListValue[] | null,\n filters?: BackendFilter[]\n): string {\n if (!filterValues) return '';\n\n // prepare values for backend\n filterValues = !filters\n ? filterValues\n : filterValues\n .filter(item => item.value !== '')\n .map(item => transformValue(item, filters));\n\n // remove all placeholder filters\n filterValues = filterValues.filter(fm => !fm.isInactive);\n\n if (!filterValues.length) {\n return '';\n }\n\n return encodeURIComponent(btoa(JSON.stringify(filterValues)));\n}\n\nfunction transformValue(\n filterValue: FilterListValue,\n filters: BackendFilter[]\n) {\n const filterConfig = filters.find(f => f.key === filterValue.key);\n // select components will use a key always, because we can't use objects as\n // value. Map over select options and replace key with actual value\n if (filterConfig?.control.type === 'select') {\n const option = (filterConfig.control.options || []).find(\n o => o.key === filterValue.value\n );\n // if it's language or country select, there might not be an option\n if (option) {\n return {...filterValue, value: option.value, valueKey: option.key};\n }\n }\n\n if (filterConfig?.extraFilters?.length) {\n filterValue['extraFilters'] = filterConfig.extraFilters;\n }\n\n return filterValue;\n}\n","import {useNavigate, useSearchParams} from 'react-router-dom';\nimport {Key, useCallback, useMemo} from 'react';\nimport {BackendFilter} from './backend-filter';\nimport {BackendFiltersUrlKey} from './backend-filters-url-key';\nimport {decodeBackendFilters} from './utils/decode-backend-filters';\nimport {\n encodeBackendFilters,\n FilterListValue,\n} from './utils/encode-backend-filters';\n\nexport function useBackendFilterUrlParams(\n filters?: BackendFilter[],\n pinnedFilters?: string[]\n) {\n const [searchParams] = useSearchParams();\n const navigate = useNavigate();\n\n const encodedFilters = searchParams.get(BackendFiltersUrlKey);\n\n const decodedFilters: FilterListValue[] = useMemo(() => {\n if (!filters) return [];\n const decoded = decodeBackendFilters(encodedFilters);\n\n // if filter is pinned, and it is not applied yet, add a placeholder\n (pinnedFilters || []).forEach(key => {\n if (!decoded.find(f => f.key === key)) {\n const config = filters.find(f => f.key === key)!;\n decoded.push({\n key,\n value: config.control.defaultValue,\n operator: config.defaultOperator,\n isInactive: true,\n });\n }\n });\n\n // preserve original filter order from configuration\n decoded.sort(\n (a, b) =>\n filters.findIndex(f => f.key === a.key) -\n filters.findIndex(f => f.key === b.key)\n );\n\n return decoded;\n }, [encodedFilters, pinnedFilters, filters]);\n\n const getDecodedWithoutKeys = useCallback(\n (values: (FilterListValue | Key)[]) => {\n const newFilters = [...decodedFilters];\n values.forEach(value => {\n const key = typeof value === 'object' ? value.key : value;\n const index = newFilters.findIndex(f => f.key === key);\n if (index > -1) {\n newFilters.splice(index, 1);\n }\n });\n return newFilters;\n },\n [decodedFilters]\n );\n\n const replaceAll = useCallback(\n (filterValues: FilterListValue[]) => {\n const encodedFilters = encodeBackendFilters(filterValues, filters);\n if (encodedFilters) {\n searchParams.set(BackendFiltersUrlKey, encodedFilters);\n } else {\n searchParams.delete(BackendFiltersUrlKey);\n }\n navigate({search: `?${searchParams}`}, {replace: true});\n },\n [filters, navigate, searchParams]\n );\n\n const add = useCallback(\n (filterValues: FilterListValue[]) => {\n const existing = getDecodedWithoutKeys(filterValues);\n const decodedFilters = [...existing, ...filterValues];\n replaceAll(decodedFilters);\n },\n [getDecodedWithoutKeys, replaceAll]\n );\n\n const remove = useCallback(\n (key: Key) => replaceAll(getDecodedWithoutKeys([key])),\n [getDecodedWithoutKeys, replaceAll]\n );\n\n return {\n add,\n remove,\n replaceAll,\n decodedFilters,\n encodedFilters,\n };\n}\n","import {\n keepPreviousData,\n useQuery,\n UseQueryOptions,\n} from '@tanstack/react-query';\nimport {PaginatedBackendResponse} from '../../http/backend-response/pagination-response';\nimport {apiClient} from '../../http/query-client';\n\nexport interface GetDatatableDataParams {\n orderBy?: string;\n orderDir?: 'asc' | 'desc';\n filters?: string | null;\n query?: string;\n with?: string;\n perPage?: number | string | null;\n page?: number | string;\n [key: string]: string | number | boolean | undefined | null;\n}\n\nexport const DatatableDataQueryKey = (\n endpoint: string,\n params?: GetDatatableDataParams | Record<string, string | number | boolean>,\n) => {\n // split endpoint by slash, so we can clear cache from the root later,\n // for example, 'link-group' will clear 'link-group/1/links' endpoint\n const key: (string | GetDatatableDataParams)[] = endpoint.split('/');\n if (params) {\n key.push(params);\n }\n return key;\n};\n\nexport function useDatatableData<T = object>(\n endpoint: string,\n params: GetDatatableDataParams,\n options?: Omit<\n UseQueryOptions<\n PaginatedBackendResponse<T>,\n unknown,\n PaginatedBackendResponse<T>,\n any[]\n >,\n 'queryKey' | 'queryFn'\n >,\n onLoad?: (data: PaginatedBackendResponse<T>) => void,\n) {\n return useQuery({\n queryKey: DatatableDataQueryKey(endpoint, params),\n queryFn: ({signal}) => paginate<T>(endpoint, params, onLoad, signal),\n placeholderData: keepPreviousData,\n ...options,\n });\n}\n\nasync function paginate<T>(\n endpoint: string,\n params: GetDatatableDataParams,\n onLoad?: (data: PaginatedBackendResponse<T>) => void,\n signal?: AbortSignal,\n): Promise<PaginatedBackendResponse<T>> {\n if (params.query) {\n await new Promise(resolve => setTimeout(resolve, 300));\n }\n const response = await apiClient\n .get(endpoint, {params, signal: params.query ? signal : undefined})\n .then(response => response.data);\n onLoad?.(response);\n return response;\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 {\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<unknown>, unknown>;\n}\n\nexport const DataTableContext = React.createContext<DataTableContextValue>(\n null!\n);\n\nexport function useDataTable() {\n return useContext(DataTableContext);\n}\n","import {isMac} from '@react-aria/utils';\n\ninterface Event {\n altKey: boolean;\n ctrlKey: boolean;\n metaKey: boolean;\n}\n\nexport function isCtrlKeyPressed(e: Event) {\n if (isMac()) {\n return e.metaKey;\n }\n\n return e.ctrlKey;\n}\n","import React, {KeyboardEventHandler} from 'react';\nimport {getFocusableTreeWalker} from '@react-aria/focus';\nimport {focusWithoutScrolling} from '@react-aria/utils';\nimport {isCtrlKeyPressed} from '../../utils/keybinds/is-ctrl-key-pressed';\n\ninterface Props {\n cellCount: number;\n rowCount: number;\n}\nexport function useGridNavigation(props: Props) {\n const {cellCount, rowCount} = props;\n const onKeyDown: KeyboardEventHandler<HTMLElement> = e => {\n switch (e.key) {\n case 'ArrowLeft':\n focusSiblingCell(e, {cell: {op: 'decrement'}}, props);\n break;\n case 'ArrowRight':\n focusSiblingCell(e, {cell: {op: 'increment'}}, props);\n break;\n case 'ArrowUp':\n focusSiblingCell(e, {row: {op: 'decrement'}}, props);\n break;\n case 'ArrowDown':\n focusSiblingCell(e, {row: {op: 'increment'}}, props);\n break;\n case 'PageUp':\n focusSiblingCell(e, {row: {op: 'decrement', count: 5}}, props);\n break;\n case 'PageDown':\n focusSiblingCell(e, {row: {op: 'increment', count: 5}}, props);\n break;\n case 'Tab':\n focusFirstElementAfterGrid(e);\n break;\n case 'Home':\n if (isCtrlKeyPressed(e)) {\n // move to first cell in first row\n focusSiblingCell(\n e,\n {\n row: {op: 'decrement', count: rowCount},\n cell: {op: 'decrement', count: cellCount},\n },\n props\n );\n } else {\n // move to first cell in current row\n focusSiblingCell(\n e,\n {cell: {op: 'decrement', count: cellCount}},\n props\n );\n }\n break;\n case 'End':\n if (isCtrlKeyPressed(e)) {\n // move to last cell in last row\n focusSiblingCell(\n e,\n {\n row: {op: 'increment', count: rowCount},\n cell: {op: 'increment', count: cellCount},\n },\n props\n );\n } else {\n // move to last cell in current row\n focusSiblingCell(\n e,\n {cell: {op: 'increment', count: cellCount}},\n props\n );\n }\n break;\n }\n };\n\n return {onKeyDown};\n}\n\ninterface Operations {\n cell?: {\n op: 'increment' | 'decrement';\n count?: number;\n };\n row?: {\n op: 'increment' | 'decrement';\n count?: number;\n };\n}\nfunction focusSiblingCell(\n e: React.KeyboardEvent,\n operations: Operations,\n {cellCount, rowCount}: Props\n) {\n if (document.activeElement?.tagName === 'input') return;\n e.preventDefault();\n const grid = e.currentTarget as HTMLElement;\n\n // focused element might be inside the cell and not the cell itself\n const currentCell = (e.target as HTMLElement).closest('[aria-colindex]');\n if (!currentCell || !grid) return;\n\n const row = currentCell.closest('[aria-rowindex]');\n if (!row) return;\n\n // grab row and cell index from aria attributes\n let rowIndex = parseInt(row.getAttribute('aria-rowindex') as string);\n let cellIndex = parseInt(currentCell.getAttribute('aria-colindex') as string);\n if (Number.isNaN(rowIndex) || Number.isNaN(cellIndex)) return;\n\n // adjust row index for next cell selector\n const rowOpCount = operations.row?.count ?? 1;\n if (operations.row?.op === 'increment') {\n rowIndex = Math.min(rowCount, rowIndex + rowOpCount);\n } else if (operations.row?.op === 'decrement') {\n rowIndex = Math.max(1, rowIndex - rowOpCount);\n }\n\n // adjust cell index for next cell selector\n const cellOpCount = operations.cell?.count ?? 1;\n if (operations.cell?.op === 'increment') {\n cellIndex = Math.min(cellCount, cellIndex + cellOpCount);\n } else if (operations.cell?.op === 'decrement') {\n cellIndex = Math.max(1, cellIndex - cellOpCount);\n }\n\n // find the next cell that should be focused\n const nextCell = grid.querySelector(\n `[aria-rowindex=\"${rowIndex}\"] [aria-colindex=\"${cellIndex}\"]`\n ) as HTMLElement | undefined;\n if (!nextCell) return;\n\n // find any focusable elements inside the cell\n const walker = getFocusableTreeWalker(nextCell);\n const nextFocusableElement = (walker.nextNode() || nextCell) as HTMLElement;\n\n // adjust tab index on current and next cells and focus either next cell or first focusable element inside that cell\n currentCell.setAttribute('tabindex', '-1');\n nextFocusableElement.setAttribute('tabindex', '0');\n nextFocusableElement.focus();\n}\n\n// grid is treated as a single tab stop, focus first element after grid, instead of moving focus withing grid on tab press\nfunction focusFirstElementAfterGrid(e: React.KeyboardEvent) {\n const grid = e.currentTarget as HTMLElement;\n if (e.shiftKey) {\n grid.focus();\n } else {\n const walker = getFocusableTreeWalker(grid, {tabbable: true});\n let next: HTMLElement;\n let last: HTMLElement;\n do {\n last = walker.lastChild() as HTMLElement;\n if (last) {\n next = last;\n }\n } while (last);\n\n // @ts-ignore\n if (next && !next.contains(document.activeElement)) {\n focusWithoutScrolling(next);\n }\n }\n}\n","import {createContext} from 'react';\nimport type {SortDescriptor} from './types/sort-descriptor';\nimport type {TableProps} from './table';\nimport type {ColumnConfig} from '../../datatable/column-config';\nimport type {TableDataItem} from './types/table-data-item';\n\nexport type TableSelectionStyle = 'checkbox' | 'highlight';\n\nexport interface TableContextValue<T extends TableDataItem = TableDataItem> {\n isCollapsedMode: boolean;\n selectedRows: (string | number)[];\n onSelectionChange: (keys: (string | number)[]) => void;\n sortDescriptor?: SortDescriptor;\n onSortChange?: (descriptor: SortDescriptor) => any;\n enableSelection?: boolean;\n enableSorting?: boolean;\n selectionStyle: TableSelectionStyle;\n data: T[];\n meta?: any;\n columns: ColumnConfig<T>[];\n toggleRow: (item: T) => void;\n selectRow: (item: T | null, merge?: boolean) => void;\n hideBorder: boolean;\n hideHeaderRow: boolean;\n collapseOnMobile: boolean;\n onAction: TableProps<T>['onAction'];\n selectRowOnContextMenu: TableProps<T>['selectRowOnContextMenu'];\n cellHeight: string | undefined;\n headerCellHeight: string | undefined;\n}\nexport const TableContext = createContext<TableContextValue>(null!);\n","import clsx from 'clsx';\nimport {useContext} from 'react';\nimport {TableContext} from '@common/ui/tables/table-context';\n\ninterface Props {\n index: number;\n isHeader: boolean;\n}\nexport function useTableCellStyle({index, isHeader}: Props) {\n const {\n columns,\n cellHeight = 'h-46',\n headerCellHeight = 'h-46',\n } = useContext(TableContext);\n const column = columns[index];\n\n const userPadding = column?.padding;\n\n let justify = 'justify-start';\n if (column?.align === 'center') {\n justify = 'justify-center';\n } else if (column?.align === 'end') {\n justify = 'justify-end';\n }\n\n return clsx(\n 'flex items-center overflow-hidden whitespace-nowrap overflow-ellipsis outline-none focus-visible:outline focus-visible:outline-offset-2',\n isHeader ? headerCellHeight : cellHeight,\n column?.width ?? 'flex-1',\n column?.maxWidth,\n column?.minWidth,\n justify,\n userPadding,\n column?.className\n );\n}\n","import {useContext, useMemo} from 'react';\nimport {TableContext} from './table-context';\nimport {TableDataItem} from './types/table-data-item';\nimport {RowContext} from '@common/datatable/column-config';\nimport {useTableCellStyle} from '@common/ui/tables/style/use-table-cell-style';\n\ninterface TableCellProps {\n rowIsHovered: boolean;\n rowIndex: number;\n index: number;\n item: TableDataItem;\n id?: string;\n}\nexport function TableCell({\n rowIndex,\n rowIsHovered,\n index,\n item,\n id,\n}: TableCellProps) {\n const {columns} = useContext(TableContext);\n const column = columns[index];\n\n const rowContext: RowContext = useMemo(() => {\n return {\n index: rowIndex,\n isHovered: rowIsHovered,\n isPlaceholder: item.isPlaceholder,\n };\n }, [rowIndex, rowIsHovered, item.isPlaceholder]);\n\n const style = useTableCellStyle({\n index: index,\n isHeader: false,\n });\n\n return (\n <div\n tabIndex={-1}\n role=\"gridcell\"\n aria-colindex={index + 1}\n id={id}\n className={style}\n >\n <div className=\"overflow-x-hidden overflow-ellipsis min-w-0 w-full\">\n {column.body(item, rowContext)}\n </div>\n </div>\n );\n}\n","import React, {HTMLAttributes, useRef} from 'react';\nimport {createEventHandler} from '../../utils/dom/create-event-handler';\nimport {useGlobalListeners} from '@react-aria/utils';\n\ninterface PointerState {\n lastPosition: {x: number; y: number};\n id?: number;\n started: boolean;\n el?: HTMLElement;\n originalTouchAction?: string;\n originalUserSelect?: string;\n longPressTimer?: any;\n longPressTriggered?: boolean;\n}\n\ninterface UsePointerEventsReturn {\n domProps: HTMLAttributes<HTMLElement>;\n}\n\nexport interface UsePointerEventsProps {\n onMoveStart?: (e: PointerEvent, el: HTMLElement) => false | void;\n onMove?: (e: PointerEvent, deltaX: number, deltaY: number) => void;\n onMoveEnd?: (e: PointerEvent) => void;\n onPointerDown?: (e: React.PointerEvent) => void | false;\n onPointerUp?: (e: PointerEvent, el: HTMLElement) => void;\n onPress?: (e: PointerEvent, el: HTMLElement) => void;\n onLongPress?: (e: PointerEvent | React.PointerEvent, el: HTMLElement) => void;\n preventDefault?: boolean;\n stopPropagation?: boolean;\n minimumMovement?: number;\n}\nexport function usePointerEvents({\n onMoveStart,\n onMove,\n onMoveEnd,\n minimumMovement = 0,\n preventDefault,\n stopPropagation = true,\n onPress,\n onLongPress,\n ...props\n}: UsePointerEventsProps): UsePointerEventsReturn {\n const stateRef = useRef<PointerState>({\n lastPosition: {x: 0, y: 0},\n started: false,\n longPressTriggered: false,\n });\n const state = stateRef.current;\n\n const {addGlobalListener, removeGlobalListener} = useGlobalListeners();\n\n const start = (e: PointerEvent) => {\n if (!state.el) return;\n const result = onMoveStart?.(e, state.el);\n\n // allow user to cancel interaction\n if (result === false) return;\n\n state.originalTouchAction = state.el.style.touchAction;\n state.el.style.touchAction = 'none';\n state.originalUserSelect = document.documentElement.style.userSelect;\n document.documentElement.style.userSelect = 'none';\n state.started = true;\n };\n\n const onPointerDown = (e: React.PointerEvent) => {\n if (e.button === 0 && state.id == null) {\n state.started = false;\n\n const result = props.onPointerDown?.(e);\n if (result === false) return;\n\n if (stopPropagation) {\n e.stopPropagation();\n }\n if (preventDefault) {\n e.preventDefault();\n }\n state.id = e.pointerId;\n state.el = e.currentTarget as HTMLElement;\n state.lastPosition = {x: e.clientX, y: e.clientY};\n\n // use global listeners, so we don't have to capture pointer,\n // which would prevent click events on child nodes\n\n if (onLongPress) {\n state.longPressTimer = setTimeout(() => {\n onLongPress(e, state.el!);\n state.longPressTriggered = true;\n }, 400);\n }\n\n if (onMoveStart || onMove) {\n addGlobalListener(window, 'pointermove', onPointerMove, false);\n }\n addGlobalListener(window, 'pointerup', onPointerUp, false);\n addGlobalListener(window, 'pointercancel', onPointerUp, false);\n }\n };\n\n const onPointerMove = (e: PointerEvent) => {\n if (e.pointerId === state.id) {\n const deltaX = e.clientX - state.lastPosition.x;\n const deltaY = e.clientY - state.lastPosition.y;\n\n if (\n (Math.abs(deltaX) >= minimumMovement ||\n Math.abs(deltaY) >= minimumMovement) &&\n !state.started\n ) {\n start(e);\n }\n\n if (state.started) {\n onMove?.(e, deltaX, deltaY);\n state.lastPosition = {x: e.clientX, y: e.clientY};\n }\n }\n };\n\n const onPointerUp = (e: PointerEvent) => {\n if (e.pointerId === state.id) {\n // cancel long press timer, if exists\n if (state.longPressTimer) {\n clearTimeout(state.longPressTimer);\n }\n\n const longPressTriggered = state.longPressTriggered;\n state.longPressTriggered = false;\n\n // only call onMoveEnd if we actually started moving\n if (state.started) {\n onMoveEnd?.(e);\n }\n\n if (state.el) {\n // handle press only if event was not cancelled (via touch scroll on mobile for example)\n if (e.type !== 'pointercancel') {\n props.onPointerUp?.(e, state.el);\n\n // only call onPress if pointer did not leave onPointerDown element\n if (e.target && state.el.contains(e.target as HTMLElement)) {\n // trigger either onPress or onLongPress\n if (longPressTriggered) {\n onLongPress?.(e, state.el);\n } else {\n onPress?.(e, state.el);\n }\n }\n }\n\n document.documentElement.style.userSelect =\n state.originalUserSelect || '';\n state.el.style.touchAction = state.originalTouchAction || '';\n }\n state.id = undefined;\n state.started = false;\n removeGlobalListener(window, 'pointermove', onPointerMove, false);\n removeGlobalListener(window, 'pointerup', onPointerUp, false);\n removeGlobalListener(window, 'pointercancel', onPointerUp, false);\n }\n };\n\n return {\n domProps: {\n onPointerDown: createEventHandler(onPointerDown),\n },\n };\n}\n","import {isCtrlKeyPressed} from './is-ctrl-key-pressed';\n\ninterface Event {\n altKey: boolean;\n ctrlKey: boolean;\n metaKey: boolean;\n shiftKey: boolean;\n}\n\nexport function isCtrlOrShiftPressed(e: Event) {\n return e.shiftKey || isCtrlKeyPressed(e);\n}\n","import clsx from 'clsx';\nimport {useContext} from 'react';\nimport {TableContext} from '@common/ui/tables/table-context';\nimport {useIsDarkMode} from '@common/ui/themes/use-is-dark-mode';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\n\ninterface Props {\n index: number;\n isSelected: boolean;\n isHeader?: boolean;\n}\nexport function useTableRowStyle({index, isSelected, isHeader}: Props) {\n const isDarkMode = useIsDarkMode();\n const isMobile = useIsMobileMediaQuery();\n const {hideBorder, enableSelection, collapseOnMobile, onAction} =\n useContext(TableContext);\n const isFirst = index === 0;\n return clsx(\n 'flex gap-x-16 break-inside-avoid outline-none border border-transparent',\n onAction && 'cursor-pointer',\n isMobile && collapseOnMobile && hideBorder\n ? 'mb-8 pl-8 pr-0 rounded'\n : 'px-16',\n !hideBorder && 'border-b-divider',\n !hideBorder && isFirst && 'border-t-divider',\n isSelected &&\n !isDarkMode &&\n 'bg-primary/selected hover:bg-primary/focus focus-visible:bg-primary/focus',\n isSelected &&\n isDarkMode &&\n 'bg-selected hover:bg-focus focus-visible:bg-focus',\n !isSelected &&\n !isHeader &&\n (enableSelection || onAction) &&\n 'focus-visible:bg-focus hover:bg-hover'\n );\n}\n","import React, {\n ComponentPropsWithoutRef,\n JSXElementConstructor,\n KeyboardEventHandler,\n MouseEventHandler,\n useContext,\n useRef,\n useState,\n} from 'react';\nimport {TableContext} from './table-context';\nimport {TableCell} from './table-cell';\nimport {TableDataItem} from './types/table-data-item';\nimport {createEventHandler} from '../../utils/dom/create-event-handler';\nimport {usePointerEvents} from '../interactions/use-pointer-events';\nimport {isCtrlOrShiftPressed} from '../../utils/keybinds/is-ctrl-or-shift-pressed';\nimport {useTableRowStyle} from '@common/ui/tables/style/use-table-row-style';\nimport clsx from 'clsx';\n\nconst interactableElements = ['button', 'a', 'input', 'select', 'textarea'];\n\nexport interface RowElementProps<T = TableDataItem>\n extends ComponentPropsWithoutRef<'tr'> {\n item: T & {isPlaceholder?: boolean};\n}\n\ninterface TableRowProps {\n item: TableDataItem;\n index: number;\n renderAs?: JSXElementConstructor<RowElementProps>;\n className?: string;\n style?: React.CSSProperties;\n}\nexport function TableRow({\n item,\n index,\n renderAs,\n className,\n style,\n}: TableRowProps) {\n const {\n selectedRows,\n columns,\n toggleRow,\n selectRow,\n onAction,\n selectRowOnContextMenu,\n enableSelection,\n selectionStyle,\n hideHeaderRow,\n } = useContext(TableContext);\n\n const isTouchDevice = useRef(false);\n const isSelected = selectedRows.includes(item.id);\n const [isHovered, setIsHovered] = useState(false);\n\n const clickedOnInteractable = (e: React.MouseEvent | PointerEvent) => {\n return (e.target as HTMLElement).closest(interactableElements.join(','));\n };\n\n const doubleClickHandler: MouseEventHandler<HTMLDivElement> = e => {\n if (\n selectionStyle === 'highlight' &&\n onAction &&\n !isTouchDevice.current &&\n !clickedOnInteractable(e)\n ) {\n e.preventDefault();\n e.stopPropagation();\n onAction(item, index);\n }\n };\n\n const anyRowsSelected = !!selectedRows.length;\n\n const handleRowTap = (e: PointerEvent) => {\n if (clickedOnInteractable(e)) return;\n if (selectionStyle === 'checkbox') {\n if (enableSelection && (anyRowsSelected || !onAction)) {\n toggleRow(item);\n } else if (onAction) {\n onAction(item, index);\n }\n } else if (selectionStyle === 'highlight') {\n if (isTouchDevice.current) {\n if (enableSelection && anyRowsSelected) {\n toggleRow(item);\n } else {\n onAction?.(item, index);\n }\n } else if (enableSelection) {\n selectRow(item, isCtrlOrShiftPressed(e));\n }\n }\n };\n\n const {domProps} = usePointerEvents({\n onPointerDown: e => {\n isTouchDevice.current = e.pointerType === 'touch';\n },\n onPress: handleRowTap,\n onLongPress: enableSelection\n ? () => {\n if (isTouchDevice.current) {\n toggleRow(item);\n }\n }\n : undefined,\n });\n\n const keyboardHandler: KeyboardEventHandler = e => {\n if (enableSelection && e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n if (selectionStyle === 'checkbox') {\n toggleRow(item);\n } else {\n selectRow(item);\n }\n } else if (e.key === 'Enter' && !selectedRows.length && onAction) {\n e.preventDefault();\n e.stopPropagation();\n onAction(item, index);\n }\n };\n\n const contextMenuHandler: MouseEventHandler = e => {\n if (selectRowOnContextMenu && enableSelection) {\n if (!selectedRows.includes(item.id)) {\n selectRow(item);\n }\n }\n // prevent context menu on mobile\n if (isTouchDevice.current) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n const styleClassName = useTableRowStyle({index, isSelected});\n\n const RowElement = renderAs || 'div';\n return (\n <RowElement\n role=\"row\"\n aria-rowindex={index + 1 + (hideHeaderRow ? 0 : 1)}\n aria-selected={isSelected}\n tabIndex={-1}\n className={clsx(className, styleClassName)}\n item={RowElement === 'div' ? (undefined as any) : item}\n onDoubleClick={createEventHandler(doubleClickHandler)}\n onKeyDown={createEventHandler(keyboardHandler)}\n onContextMenu={createEventHandler(contextMenuHandler)}\n onPointerEnter={createEventHandler(() => setIsHovered(true))}\n onPointerLeave={createEventHandler(() => setIsHovered(false))}\n style={style}\n {...domProps}\n >\n {columns.map((column, cellIndex) => (\n <TableCell\n rowIndex={index}\n rowIsHovered={isHovered}\n index={cellIndex}\n item={item}\n key={`${item.id}-${column.key}`}\n />\n ))}\n </RowElement>\n );\n}\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {TableDataItem} from '@common/ui/tables/types/table-data-item';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport React, {useContext} from 'react';\nimport {Checkbox} from '@common/ui/forms/toggle/checkbox';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {TableContext} from '@common/ui/tables/table-context';\n\nexport const CheckboxColumnConfig: ColumnConfig<TableDataItem> = {\n key: 'checkbox',\n header: () => <SelectAllCheckbox />,\n align: 'center',\n width: 'w-24 flex-shrink-0',\n body: (item, row) => {\n if (row.isPlaceholder) {\n return <Skeleton size=\"w-24 h-24\" variant=\"rect\" />;\n }\n return <SelectRowCheckbox item={item} />;\n },\n};\n\ninterface SelectRowCheckboxProps {\n item: TableDataItem;\n}\nfunction SelectRowCheckbox({item}: SelectRowCheckboxProps) {\n const {selectedRows, toggleRow} = useContext(TableContext);\n return (\n <Checkbox\n checked={selectedRows.includes(item.id)}\n onChange={() => toggleRow(item)}\n />\n );\n}\n\nfunction SelectAllCheckbox() {\n const {trans} = useTrans();\n\n const {data, selectedRows, onSelectionChange} = useContext(TableContext);\n const allRowsSelected = !!data.length && data.length === selectedRows.length;\n const someRowsSelected = !allRowsSelected && !!selectedRows.length;\n\n return (\n <Checkbox\n aria-label={trans({message: 'Select all'})}\n isIndeterminate={someRowsSelected}\n checked={allRowsSelected}\n onChange={() => {\n if (allRowsSelected) {\n onSelectionChange([]);\n } else {\n onSelectionChange(data.map(d => d.id));\n }\n }}\n />\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ArrowDownwardIcon = createSvgIcon(\n <path d=\"m20 12-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z\" />\n, 'ArrowDownwardOutlined');\n","import {useContext, useState} from 'react';\nimport clsx from 'clsx';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {TableContext} from './table-context';\nimport {SortDescriptor} from './types/sort-descriptor';\nimport {ArrowDownwardIcon} from '../../icons/material/ArrowDownward';\nimport {useTableCellStyle} from '@common/ui/tables/style/use-table-cell-style';\n\ninterface HeaderCellProps {\n index: number;\n}\nexport function HeaderCell({index}: HeaderCellProps) {\n const {columns, sortDescriptor, onSortChange, enableSorting} =\n useContext(TableContext);\n const column = columns[index];\n\n const style = useTableCellStyle({\n index: index,\n isHeader: true,\n });\n\n const [isHovered, setIsHovered] = useState(false);\n\n const sortingKey = column.sortingKey || column.key;\n const allowSorting = column.allowsSorting && enableSorting;\n const {orderBy, orderDir} = sortDescriptor || {};\n\n const sortActive = allowSorting && orderBy === sortingKey;\n\n let ariaSort: 'ascending' | 'descending' | 'none' | undefined;\n if (sortActive && orderDir === 'asc') {\n ariaSort = 'ascending';\n } else if (sortActive && orderDir === 'desc') {\n ariaSort = 'descending';\n } else if (allowSorting) {\n ariaSort = 'none';\n }\n\n const toggleSorting = () => {\n if (!allowSorting) return;\n\n let newSort: SortDescriptor;\n\n // if this col was sorted desc, go to asc\n if (sortActive && orderDir === 'desc') {\n newSort = {orderDir: 'asc', orderBy: sortingKey};\n\n // if this col was sorted asc, clear sort\n } else if (sortActive && orderDir === 'asc') {\n newSort = {orderBy: undefined, orderDir: undefined};\n\n // if sort was on another col, or no sort was applied yet, start from desc\n } else {\n newSort = {orderDir: 'desc', orderBy: sortingKey};\n }\n\n onSortChange?.(newSort);\n };\n\n const sortVisible = sortActive || isHovered;\n const sortVariants = {\n visible: {opacity: 1, y: 0},\n hidden: {opacity: 0, y: '-25%'},\n };\n\n return (\n <div\n role=\"columnheader\"\n tabIndex={-1}\n aria-colindex={index + 1}\n aria-sort={ariaSort}\n className={clsx(\n style,\n 'text-muted font-medium text-xs',\n allowSorting && 'cursor-pointer'\n )}\n onMouseEnter={() => {\n setIsHovered(true);\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n }}\n onKeyDown={e => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n toggleSorting();\n }\n }}\n onClick={toggleSorting}\n >\n {column.hideHeader ? (\n <div className=\"sr-only\">{column.header()}</div>\n ) : (\n column.header()\n )}\n <AnimatePresence>\n {allowSorting && (\n <m.span\n variants={sortVariants}\n animate={sortVisible ? 'visible' : 'hidden'}\n initial={false}\n transition={{type: 'tween'}}\n key=\"sort-icon\"\n className=\"inline-block ml-6 -mt-2\"\n data-testid=\"table-sort-button\"\n aria-hidden={!sortVisible}\n >\n <ArrowDownwardIcon\n size=\"xs\"\n className={clsx(\n 'text-muted',\n orderDir === 'asc' &&\n orderBy === sortingKey &&\n 'rotate-180 transition-transform'\n )}\n />\n </m.span>\n )}\n </AnimatePresence>\n </div>\n );\n}\n","import {HeaderCell} from '@common/ui/tables/header-cell';\nimport React, {useContext} from 'react';\nimport {TableContext} from '@common/ui/tables/table-context';\n\nexport function TableHeaderRow() {\n const {columns} = useContext(TableContext);\n return (\n <div\n role=\"row\"\n aria-rowindex={1}\n tabIndex={-1}\n className=\"flex gap-x-16 px-16\"\n >\n {columns.map((column, columnIndex) => (\n <HeaderCell index={columnIndex} key={column.key} />\n ))}\n </div>\n );\n}\n","import React, {\n cloneElement,\n ComponentPropsWithoutRef,\n Fragment,\n JSXElementConstructor,\n MutableRefObject,\n ReactElement,\n useCallback,\n useContext,\n useMemo,\n} from 'react';\nimport {useControlledState} from '@react-stately/utils';\nimport {SortDescriptor} from './types/sort-descriptor';\nimport {useGridNavigation} from './navigate-grid';\nimport {RowElementProps, TableRow} from './table-row';\nimport {\n TableContext,\n TableContextValue,\n TableSelectionStyle,\n} from './table-context';\nimport {ColumnConfig} from '../../datatable/column-config';\nimport {TableDataItem} from './types/table-data-item';\nimport clsx from 'clsx';\nimport {useInteractOutside} from '@react-aria/interactions';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {isCtrlKeyPressed} from '@common/utils/keybinds/is-ctrl-key-pressed';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {CheckboxColumnConfig} from '@common/ui/tables/checkbox-column-config';\nimport {TableHeaderRow} from '@common/ui/tables/table-header-row';\n\nexport interface TableProps<T extends TableDataItem>\n extends ComponentPropsWithoutRef<'table'> {\n className?: string;\n columns: ColumnConfig<T>[];\n hideHeaderRow?: boolean;\n data: T[];\n meta?: any;\n tableRef?: MutableRefObject<HTMLTableElement>;\n selectedRows?: (number | string)[];\n defaultSelectedRows?: (number | string)[];\n onSelectionChange?: (keys: (number | string)[]) => void;\n sortDescriptor?: SortDescriptor;\n onSortChange?: (descriptor: SortDescriptor) => any;\n enableSorting?: boolean;\n onDelete?: (items: T[]) => void;\n enableSelection?: boolean;\n selectionStyle?: TableSelectionStyle;\n ariaLabelledBy?: string;\n onAction?: (item: T, index: number) => void;\n selectRowOnContextMenu?: boolean;\n renderRowAs?: JSXElementConstructor<RowElementProps<T>>;\n tableBody?: ReactElement<TableBodyProps>;\n hideBorder?: boolean;\n closeOnInteractOutside?: boolean;\n collapseOnMobile?: boolean;\n cellHeight?: string;\n headerCellHeight?: string;\n}\nexport function Table<T extends TableDataItem>({\n className,\n columns: userColumns,\n collapseOnMobile = true,\n hideHeaderRow = false,\n hideBorder = false,\n data,\n selectedRows: propsSelectedRows,\n defaultSelectedRows: propsDefaultSelectedRows,\n onSelectionChange: propsOnSelectionChange,\n sortDescriptor: propsSortDescriptor,\n onSortChange: propsOnSortChange,\n enableSorting = true,\n onDelete,\n enableSelection = true,\n selectionStyle = 'checkbox',\n ariaLabelledBy,\n selectRowOnContextMenu,\n onAction,\n renderRowAs,\n tableBody,\n meta,\n tableRef: propsTableRef,\n closeOnInteractOutside = false,\n cellHeight,\n headerCellHeight,\n ...domProps\n}: TableProps<T>) {\n const isMobile = useIsMobileMediaQuery();\n const isCollapsedMode = !!isMobile && collapseOnMobile;\n if (isCollapsedMode) {\n hideHeaderRow = true;\n hideBorder = true;\n }\n\n const [selectedRows, onSelectionChange] = useControlledState(\n propsSelectedRows,\n propsDefaultSelectedRows || [],\n propsOnSelectionChange,\n );\n\n const [sortDescriptor, onSortChange] = useControlledState(\n propsSortDescriptor,\n undefined,\n propsOnSortChange,\n );\n\n const toggleRow = useCallback(\n (item: TableDataItem) => {\n const newValues = [...selectedRows];\n if (!newValues.includes(item.id)) {\n newValues.push(item.id);\n } else {\n const index = newValues.indexOf(item.id);\n newValues.splice(index, 1);\n }\n onSelectionChange(newValues);\n },\n [selectedRows, onSelectionChange],\n );\n\n const selectRow = useCallback(\n // allow deselecting all rows by passing in null\n (item: TableDataItem | null, merge?: boolean) => {\n let newValues: (string | number)[] = [];\n if (item) {\n newValues = merge\n ? [...selectedRows?.filter(id => id !== item.id), item.id]\n : [item.id];\n }\n onSelectionChange(newValues);\n },\n [selectedRows, onSelectionChange],\n );\n\n // add checkbox columns to config, if selection is enabled\n const columns = useMemo(() => {\n const filteredColumns = userColumns.filter(c => {\n const visibleInMode = c.visibleInMode || 'regular';\n if (visibleInMode === 'all') {\n return true;\n }\n if (visibleInMode === 'compact' && isCollapsedMode) {\n return true;\n }\n if (visibleInMode === 'regular' && !isCollapsedMode) {\n return true;\n }\n });\n const showCheckboxCell =\n enableSelection && selectionStyle !== 'highlight' && !isMobile;\n if (showCheckboxCell) {\n filteredColumns.unshift(CheckboxColumnConfig);\n }\n return filteredColumns;\n }, [isMobile, userColumns, enableSelection, selectionStyle, isCollapsedMode]);\n\n const contextValue: TableContextValue<T> = {\n isCollapsedMode,\n cellHeight,\n headerCellHeight,\n hideBorder,\n hideHeaderRow,\n selectedRows,\n onSelectionChange,\n enableSorting,\n enableSelection,\n selectionStyle,\n data,\n columns,\n sortDescriptor,\n onSortChange,\n toggleRow,\n selectRow,\n onAction,\n selectRowOnContextMenu,\n meta,\n collapseOnMobile,\n };\n\n const navProps = useGridNavigation({\n cellCount: enableSelection ? columns.length + 1 : columns.length,\n rowCount: data.length + 1,\n });\n\n const tableBodyProps: TableBodyProps = {\n renderRowAs: renderRowAs as any,\n };\n\n if (!tableBody) {\n tableBody = <BasicTableBody {...tableBodyProps} />;\n } else {\n tableBody = cloneElement(tableBody, tableBodyProps);\n }\n\n // deselect rows when clicking outside the table\n const tableRef = useObjectRef(propsTableRef);\n useInteractOutside({\n ref: tableRef,\n onInteractOutside: e => {\n if (\n closeOnInteractOutside &&\n enableSelection &&\n selectedRows?.length &&\n // don't deselect if clicking on a dialog (for example is table row has a context menu)\n !(e.target as HTMLElement).closest('[role=\"dialog\"]')\n ) {\n onSelectionChange([]);\n }\n },\n });\n\n return (\n <TableContext.Provider value={contextValue as any}>\n <div\n {...mergeProps(domProps, navProps, {\n onKeyDown: (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n if (selectedRows?.length) {\n onSelectionChange([]);\n }\n } else if (e.key === 'Delete') {\n e.preventDefault();\n e.stopPropagation();\n if (selectedRows?.length) {\n onDelete?.(\n data.filter(item => selectedRows?.includes(item.id)),\n );\n }\n } else if (isCtrlKeyPressed(e) && e.key === 'a') {\n e.preventDefault();\n e.stopPropagation();\n if (enableSelection) {\n onSelectionChange(data.map(item => item.id));\n }\n }\n },\n })}\n role=\"grid\"\n tabIndex={0}\n aria-rowcount={data.length + 1}\n aria-colcount={columns.length + 1}\n ref={tableRef}\n aria-multiselectable={enableSelection ? true : undefined}\n aria-labelledby={ariaLabelledBy}\n className={clsx(\n className,\n 'isolate select-none text-sm outline-none focus-visible:ring-2',\n )}\n >\n {!hideHeaderRow && <TableHeaderRow />}\n {tableBody}\n </div>\n </TableContext.Provider>\n );\n}\n\nexport interface TableBodyProps {\n renderRowAs?: TableProps<TableDataItem>['renderRowAs'];\n}\nfunction BasicTableBody({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 key={item.id}\n renderAs={renderRowAs}\n />\n ))}\n </Fragment>\n );\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 )}\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 {createSvgIcon} from '../create-svg-icon';\n\nexport const FilterAltIcon = createSvgIcon(\n <path d=\"M7 6h10l-5.01 6.3L7 6zm-2.75-.39C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39c.51-.66.04-1.61-.79-1.61H5.04c-.83 0-1.3.95-.79 1.61z\" />\n, 'FilterAltOutlined');\n","export const AccordionAnimation = {\n variants: {\n open: {\n height: 'auto',\n visibility: 'visible',\n transitionEnd: {\n overflow: 'auto',\n },\n },\n closed: {\n height: 0,\n overflow: 'hidden',\n transitionEnd: {\n visibility: 'hidden',\n },\n },\n },\n transition: {type: 'tween', duration: 0.2},\n} as const;\n","import React, {\n cloneElement,\n isValidElement,\n Key,\n ReactElement,\n ReactNode,\n useId,\n useRef,\n} from 'react';\nimport clsx from 'clsx';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {useControlledState} from '@react-stately/utils';\nimport {FocusScope, useFocusManager} from '@react-aria/focus';\nimport {AccordionAnimation} from '@common/ui/accordion/accordtion-animation';\nimport {ArrowDropDownIcon} from '@common/icons/material/ArrowDropDown';\n\ntype Props = {\n variant?: 'outline' | 'default' | 'minimal';\n children?: ReactNode;\n mode?: 'single' | 'multiple';\n expandedValues?: Key[];\n defaultExpandedValues?: Key[];\n onExpandedChange?: (key: Key[]) => void;\n className?: string;\n isLazy?: boolean;\n};\nexport const Accordion = React.forwardRef<HTMLDivElement, Props>(\n (\n {\n variant = 'default',\n mode = 'single',\n children,\n className,\n isLazy,\n ...other\n },\n ref,\n ) => {\n const [expandedValues, setExpandedValues] = useControlledState(\n other.expandedValues,\n other.defaultExpandedValues || [],\n other.onExpandedChange,\n );\n\n const itemsCount = React.Children.count(children);\n\n return (\n <div\n className={clsx(variant === 'outline' && 'space-y-10', className)}\n ref={ref}\n role=\"presentation\"\n >\n <AnimatePresence>\n <FocusScope>\n {React.Children.map(children, (child, index) => {\n if (!isValidElement<ClonedItemProps>(child)) return null;\n return cloneElement<ClonedItemProps>(child, {\n key: child.key || index,\n value: child.props.value || index,\n isFirst: index === 0,\n isLast: index === itemsCount - 1,\n mode,\n variant,\n expandedValues,\n setExpandedValues,\n isLazy,\n });\n })}\n </FocusScope>\n </AnimatePresence>\n </div>\n );\n },\n);\n\ninterface AccordionItemProps {\n children: ReactNode;\n disabled?: boolean;\n label: ReactNode;\n description?: ReactNode;\n value?: Key;\n isFirst?: boolean;\n isLast?: boolean;\n bodyClassName?: string;\n labelClassName?: string;\n buttonPadding?: string;\n chevronPosition?: 'left' | 'right';\n startIcon?: ReactElement;\n endAppend?: ReactElement;\n}\ninterface ClonedItemProps extends AccordionItemProps {\n variant?: 'outline' | 'default' | 'minimal';\n expandedValues: Key[];\n setExpandedValues: (keys: Key[]) => void;\n mode: 'single' | 'multiple';\n value: Key;\n isLazy?: boolean;\n}\nexport function AccordionItem({\n children,\n label,\n disabled,\n bodyClassName,\n labelClassName,\n buttonPadding = 'py-10 pl-14 pr-10',\n startIcon,\n description,\n endAppend,\n chevronPosition = 'right',\n isFirst,\n isLast,\n ...other\n}: AccordionItemProps) {\n const {expandedValues, setExpandedValues, variant, value, mode, isLazy} =\n other as ClonedItemProps;\n const ref = useRef<HTMLButtonElement>(null);\n const isExpanded = !disabled && expandedValues.includes(value);\n const wasExpandedOnce = useRef(false);\n if (isExpanded) {\n wasExpandedOnce.current = true;\n }\n const focusManager = useFocusManager();\n const id = useId();\n const buttonId = `${id}-button`;\n const panelId = `${id}-panel`;\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n switch (e.key) {\n case 'ArrowDown':\n focusManager?.focusNext();\n break;\n case 'ArrowUp':\n focusManager?.focusPrevious();\n break;\n case 'Home':\n focusManager?.focusFirst();\n break;\n case 'End':\n focusManager?.focusLast();\n break;\n }\n };\n\n const toggle = () => {\n const i = expandedValues.indexOf(value);\n if (i > -1) {\n const newKeys = [...expandedValues];\n newKeys.splice(i, 1);\n setExpandedValues(newKeys);\n } else if (mode === 'single') {\n setExpandedValues([value]);\n } else {\n setExpandedValues([...expandedValues, value]);\n }\n };\n\n const chevron = (\n <div className={clsx(variant === 'minimal' && '')}>\n <ArrowDropDownIcon\n aria-hidden=\"true\"\n size=\"md\"\n className={clsx(\n disabled ? 'text-disabled' : 'text-muted',\n isExpanded && 'rotate-180 transition-transform',\n )}\n />\n </div>\n );\n\n return (\n <div\n className={clsx(\n variant === 'default' && 'border-b',\n variant === 'outline' && 'rounded-panel border',\n disabled && 'text-disabled',\n )}\n >\n <h3\n className={clsx(\n 'flex w-full items-center justify-between text-sm',\n disabled && 'pointer-events-none',\n isFirst && variant === 'default' && 'border-t',\n isExpanded && variant !== 'minimal'\n ? 'border-b'\n : 'border-b border-b-transparent',\n variant === 'outline'\n ? isExpanded\n ? 'rounded-panel-t'\n : 'rounded-panel'\n : undefined,\n )}\n >\n <button\n disabled={disabled}\n aria-expanded={isExpanded}\n id={buttonId}\n aria-controls={panelId}\n type=\"button\"\n ref={ref}\n onKeyDown={onKeyDown}\n onClick={() => {\n if (!disabled) {\n toggle();\n }\n }}\n className={clsx(\n 'flex flex-auto items-center gap-10 text-left outline-none hover:bg-hover focus-visible:bg-primary/focus',\n buttonPadding,\n )}\n >\n {chevronPosition === 'left' && chevron}\n {startIcon &&\n cloneElement(startIcon, {\n size: 'md',\n className: clsx(\n startIcon.props.className,\n disabled ? 'text-disabled' : 'text-muted',\n ),\n })}\n <div className=\"flex-auto overflow-hidden overflow-ellipsis\">\n <div className={labelClassName} data-testid=\"accordion-label\">\n {label}\n </div>\n {description && (\n <div className=\"text-xs text-muted\">{description}</div>\n )}\n </div>\n {chevronPosition === 'right' && chevron}\n </button>\n {endAppend && (\n <div className=\"flex-shrink-0 px-4 text-sm text-muted\">\n {endAppend}\n </div>\n )}\n </h3>\n <m.div\n aria-labelledby={id}\n role=\"region\"\n variants={AccordionAnimation.variants}\n transition={AccordionAnimation.transition}\n initial={false}\n animate={isExpanded ? 'open' : 'closed'}\n >\n <div className={clsx('p-16', bodyClassName)}>\n {!isLazy || wasExpandedOnce ? children : null}\n </div>\n </m.div>\n </div>\n );\n}\n","import {FormSelect} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {Trans} from '@common/i18n/trans';\nimport {FilterPanelProps} from '@common/datatable/filters/panels/filter-panel-props';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {FilterSelectControl} from '@common/datatable/filters/backend-filter';\n\nexport function SelectFilterPanel({\n filter,\n}: FilterPanelProps<FilterSelectControl>) {\n const {trans} = useTrans();\n\n return (\n <FormSelect\n size=\"sm\"\n name={`${filter.key}.value`}\n selectionMode=\"single\"\n showSearchField={filter.control.showSearchField}\n placeholder={\n filter.control.placeholder\n ? trans(filter.control.placeholder)\n : undefined\n }\n searchPlaceholder={\n filter.control.searchPlaceholder\n ? trans(filter.control.searchPlaceholder)\n : undefined\n }\n >\n {filter.control.options.map(option => (\n <Item key={option.key} value={option.key}>\n <Trans {...option.label} />\n </Item>\n ))}\n </FormSelect>\n );\n}\n","import {FormDateRangePicker} from '@common/ui/forms/input-field/date/date-range-picker/form-date-range-picker';\nimport {FilterPanelProps} from '@common/datatable/filters/panels/filter-panel-props';\nimport {DatePickerFilterControl} from '@common/datatable/filters/backend-filter';\n\nexport function DateRangeFilterPanel({\n filter,\n}: FilterPanelProps<DatePickerFilterControl>) {\n return (\n <FormDateRangePicker\n min={filter.control.min}\n max={filter.control.max}\n size=\"sm\"\n name={`${filter.key}.value`}\n granularity=\"day\"\n closeDialogOnSelection={true}\n />\n );\n}\n","import clsx from 'clsx';\nimport React, {\n ComponentProps,\n ComponentPropsWithoutRef,\n forwardRef,\n} from 'react';\nimport {Link} from 'react-router-dom';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {AvatarPlaceholderIcon} from '@common/auth/ui/account-settings/avatar/avatar-placeholder-icon';\n\ntype Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | string;\n\nexport interface AvatarProps extends ComponentPropsWithoutRef<any> {\n className?: string;\n src?: string;\n label?: string;\n circle?: boolean;\n size?: Size;\n link?: string;\n fallback?: 'initials' | 'generic';\n lazy?: boolean;\n}\nexport const Avatar = forwardRef<HTMLImageElement, AvatarProps>(\n (\n {\n className,\n circle,\n size = 'md',\n src,\n link,\n label,\n fallback = 'generic',\n lazy = true,\n ...domProps\n },\n ref,\n ) => {\n let renderedAvatar = src ? (\n <img\n ref={ref}\n src={src}\n alt={label}\n loading={lazy ? 'lazy' : undefined}\n className=\"block h-full w-full object-cover\"\n />\n ) : (\n <div className=\"h-full w-full bg-alt dark:bg-chip\">\n <AvatarPlaceholderIcon\n viewBox=\"0 0 48 48\"\n className=\"h-full w-full text-muted\"\n />\n </div>\n );\n\n if (label) {\n renderedAvatar = <Tooltip label={label}>{renderedAvatar}</Tooltip>;\n }\n\n const wrapperProps: ComponentProps<any> = {\n ...domProps,\n className: clsx(\n className,\n 'relative block overflow-hidden select-none flex-shrink-0',\n getSizeClassName(size),\n circle ? 'rounded-full' : 'rounded',\n ),\n };\n\n return link ? (\n <Link {...wrapperProps} to={link}>\n {renderedAvatar}\n </Link>\n ) : (\n <div {...wrapperProps}>{renderedAvatar}</div>\n );\n },\n);\n\nfunction getSizeClassName(size: Size) {\n switch (size) {\n case 'xs':\n return 'w-18 h-18';\n case 'sm':\n return 'w-24 h-24';\n case 'md':\n return 'w-32 h-32';\n case 'lg':\n return 'w-40 h-40';\n case 'xl':\n return 'w-60 h-60';\n // allow overriding with custom classNames\n default:\n return size;\n }\n}\n","import {\n keepPreviousData,\n useQuery,\n UseQueryOptions,\n} from '@tanstack/react-query';\nimport {NormalizedModel} from '../../datatable/filters/normalized-model';\nimport {apiClient} from '../../http/query-client';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\n\ninterface Response extends BackendResponse {\n results: NormalizedModel[];\n}\n\ninterface Params {\n query?: string;\n perPage?: number;\n with?: string;\n}\n\nexport function useNormalizedModels(\n endpoint: string,\n queryParams: Params,\n queryOptions?: Omit<\n UseQueryOptions<Response, unknown, Response, [string, Params]>,\n 'queryKey' | 'queryFn'\n > | null,\n) {\n return useQuery({\n queryKey: [endpoint, queryParams],\n queryFn: () => fetchModels(endpoint, queryParams),\n placeholderData: keepPreviousData,\n ...queryOptions,\n });\n}\n\nasync function fetchModels(endpoint: string, params: Params) {\n return apiClient.get<Response>(endpoint, {params}).then(r => r.data);\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {NormalizedModel} from '../../datatable/filters/normalized-model';\nimport {apiClient} from '../../http/query-client';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\n\ninterface Response extends BackendResponse {\n model: NormalizedModel;\n}\n\nexport function useNormalizedModel(\n endpoint: string,\n queryParams?: Record<string, string>,\n queryOptions?: {enabled?: boolean},\n) {\n return useQuery({\n queryKey: [endpoint, queryParams],\n queryFn: () => fetchModel(endpoint, queryParams),\n ...queryOptions,\n });\n}\n\nasync function fetchModel(\n endpoint: string,\n params?: Record<string, string>,\n): Promise<Response> {\n return apiClient.get(endpoint, {params}).then(r => r.data);\n}\n","import React, {ReactNode, useRef, useState} from 'react';\nimport {useTrans} from '../../i18n/use-trans';\nimport {Trans} from '../../i18n/trans';\nimport {Avatar} from '../images/avatar';\nimport {Tooltip} from '../tooltip/tooltip';\nimport {IconButton} from '../buttons/icon-button';\nimport {EditIcon} from '../../icons/material/Edit';\nimport {message} from '../../i18n/message';\nimport {Item} from './listbox/item';\nimport {useController, useFormContext} from 'react-hook-form';\nimport {useControlledState} from '@react-stately/utils';\nimport {getInputFieldClassNames} from './input-field/get-input-field-class-names';\nimport clsx from 'clsx';\nimport {Skeleton} from '../skeleton/skeleton';\nimport {useNormalizedModels} from '../../users/queries/use-normalized-models';\nimport {useNormalizedModel} from '../../users/queries/use-normalized-model';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '../animation/opacity-animation';\nimport {Select} from '@common/ui/forms/select/select';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {BaseFieldProps} from '@common/ui/forms/input-field/base-field-props';\n\ninterface NormalizedModelFieldProps {\n label?: ReactNode;\n className?: string;\n background?: BaseFieldProps['background'];\n value?: string | number;\n placeholder?: MessageDescriptor;\n searchPlaceholder?: MessageDescriptor;\n defaultValue?: string | number;\n onChange?: (value: string | number) => void;\n invalid?: boolean;\n errorMessage?: string;\n description?: ReactNode;\n autoFocus?: boolean;\n queryParams?: Record<string, string>;\n endpoint: string;\n disabled?: boolean;\n required?: boolean;\n}\nexport function NormalizedModelField({\n label,\n className,\n background,\n value,\n defaultValue = '',\n placeholder = message('Select item...'),\n searchPlaceholder = message('Find an item...'),\n onChange,\n description,\n errorMessage,\n invalid,\n autoFocus,\n queryParams,\n endpoint,\n disabled,\n required,\n}: NormalizedModelFieldProps) {\n const inputRef = useRef<HTMLButtonElement>(null);\n const [inputValue, setInputValue] = useState('');\n const [selectedValue, setSelectedValue] = useControlledState(\n value,\n defaultValue,\n onChange,\n );\n const query = useNormalizedModels(endpoint, {\n query: inputValue,\n ...queryParams,\n });\n const {trans} = useTrans();\n\n const fieldClassNames = getInputFieldClassNames({size: 'md'});\n\n if (selectedValue) {\n return (\n <div className={className}>\n <div className={fieldClassNames.label}>{label}</div>\n <div\n className={clsx(\n 'rounded-input border p-8',\n background,\n invalid && 'border-danger',\n )}\n >\n <AnimatePresence initial={false} mode=\"wait\">\n <SelectedModelPreview\n disabled={disabled}\n endpoint={endpoint}\n modelId={selectedValue}\n queryParams={queryParams}\n onEditClick={() => {\n setSelectedValue('');\n setInputValue('');\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n inputRef.current?.click();\n });\n }}\n />\n </AnimatePresence>\n </div>\n {description && !errorMessage && (\n <div className={fieldClassNames.description}>{description}</div>\n )}\n {errorMessage && (\n <div className={fieldClassNames.error}>{errorMessage}</div>\n )}\n </div>\n );\n }\n\n return (\n <Select\n className={className}\n showSearchField\n invalid={invalid}\n errorMessage={errorMessage}\n description={description}\n color=\"white\"\n isAsync\n background={background}\n placeholder={trans(placeholder)}\n searchPlaceholder={trans(searchPlaceholder)}\n label={label}\n isLoading={query.isFetching}\n items={query.data?.results}\n inputValue={inputValue}\n onInputValueChange={setInputValue}\n selectionMode=\"single\"\n selectedValue={selectedValue}\n onSelectionChange={setSelectedValue}\n ref={inputRef}\n autoFocus={autoFocus}\n disabled={disabled}\n required={required}\n >\n {model => (\n <Item\n value={model.id}\n key={model.id}\n description={model.description}\n startIcon={<Avatar src={model.image} />}\n >\n {model.name}\n </Item>\n )}\n </Select>\n );\n}\n\ninterface SelectedModelPreviewProps {\n modelId: string | number;\n selectedValue?: number | string;\n onEditClick?: () => void;\n endpoint?: string;\n disabled?: boolean;\n queryParams?: NormalizedModelFieldProps['queryParams'];\n}\nfunction SelectedModelPreview({\n modelId,\n onEditClick,\n endpoint,\n disabled,\n queryParams,\n}: SelectedModelPreviewProps) {\n const {data, isLoading} = useNormalizedModel(\n `${endpoint}/${modelId}`,\n queryParams,\n );\n\n if (isLoading || !data?.model) {\n return <LoadingSkeleton key=\"skeleton\" />;\n }\n\n return (\n <m.div\n className={clsx(\n 'flex items-center gap-10',\n disabled && 'pointer-events-none cursor-not-allowed text-disabled',\n )}\n key=\"preview\"\n {...opacityAnimation}\n >\n {data.model.image && <Avatar src={data.model.image} />}\n <div>\n <div className=\"text-sm leading-4\">{data.model.name}</div>\n <div className=\"text-xs text-muted\">{data.model.description}</div>\n </div>\n <Tooltip label={<Trans message=\"Change item\" />}>\n <IconButton\n className=\"ml-auto text-muted\"\n size=\"sm\"\n onClick={onEditClick}\n disabled={disabled}\n >\n <EditIcon />\n </IconButton>\n </Tooltip>\n </m.div>\n );\n}\n\nfunction LoadingSkeleton() {\n return (\n <m.div className=\"flex items-center gap-10\" {...opacityAnimation}>\n <Skeleton variant=\"rect\" size=\"w-32 h-32\" />\n <div className=\"max-h-[36px] flex-auto\">\n <Skeleton className=\"text-xs\" />\n <Skeleton className=\"max-h-8 text-xs\" />\n </div>\n <Skeleton variant=\"icon\" size=\"w-24 h-24\" />\n </m.div>\n );\n}\n\ninterface FormNormalizedModelFieldProps extends NormalizedModelFieldProps {\n name: string;\n}\nexport function FormNormalizedModelField({\n name,\n ...fieldProps\n}: FormNormalizedModelFieldProps) {\n const {clearErrors} = useFormContext();\n const {\n field: {onChange, value = ''},\n fieldState: {invalid, error},\n } = useController({\n name,\n });\n\n return (\n <NormalizedModelField\n value={value}\n onChange={value => {\n onChange(value);\n clearErrors(name);\n }}\n invalid={invalid}\n errorMessage={error?.message}\n {...fieldProps}\n />\n );\n}\n","import {FilterPanelProps} from './filter-panel-props';\nimport {FormNormalizedModelField} from '@common/ui/forms/normalized-model-field';\nimport {FilterSelectModelControl} from '@common/datatable/filters/backend-filter';\n\nexport function NormalizedModelFilterPanel({\n filter,\n}: FilterPanelProps<FilterSelectModelControl>) {\n return (\n <FormNormalizedModelField\n name={`${filter.key}.value`}\n endpoint={`normalized-models/${filter.control.model}`}\n />\n );\n}\n","import {FilterOperator} from './backend-filter';\nimport {message} from '../../i18n/message';\nimport {MessageDescriptor} from '../../i18n/message-descriptor';\n\nexport const FilterOperatorNames: {[op in FilterOperator]: MessageDescriptor} =\n {\n '=': message('is'),\n '!=': message('is not'),\n '>': message('is greater than'),\n '>=': message('is greater than or equal to'),\n '<': message('is less than'),\n '<=': message('is less than or equal to'),\n has: message('Include'),\n doesntHave: message('Do not include'),\n between: message('Is between'),\n hasAll: message('Include all'),\n };\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {FilterOperatorNames} from '@common/datatable/filters/filter-operator-names';\nimport {Fragment} from 'react';\nimport {FilterPanelProps} from '@common/datatable/filters/panels/filter-panel-props';\nimport {\n FilterNumberInputControl,\n FilterTextInputControl,\n} from '@common/datatable/filters/backend-filter';\n\nexport function InputFilterPanel({\n filter,\n}: FilterPanelProps<FilterTextInputControl | FilterNumberInputControl>) {\n const control = filter.control;\n return (\n <Fragment>\n <FormSelect\n selectionMode=\"single\"\n name={`${filter.key}.operator`}\n className=\"mb-14\"\n size=\"sm\"\n required\n >\n {filter.operators?.map(operator => (\n <Item key={operator} value={operator}>\n {<Trans {...FilterOperatorNames[operator]} />}\n </Item>\n ))}\n </FormSelect>\n <FormTextField\n size=\"sm\"\n name={`${filter.key}.value`}\n type={filter.control.inputType}\n min={'minValue' in control ? control.minValue : undefined}\n max={'maxValue' in control ? control.maxValue : undefined}\n minLength={'minLength' in control ? control.minLength : undefined}\n maxLength={'maxLength' in control ? control.maxLength : undefined}\n required\n />\n </Fragment>\n );\n}\n","import {FilterPanelProps} from './filter-panel-props';\nimport {FilterBooleanToggleControl} from '@common/datatable/filters/backend-filter';\n\nexport function BooleanFilterPanel({\n filter,\n}: FilterPanelProps<FilterBooleanToggleControl>) {\n // Toggling accordion in the dialog will already apply boolean filter, no need for any extra fields here\n return null;\n}\n","import React, {\n Children,\n cloneElement,\n isValidElement,\n ReactElement,\n} from 'react';\nimport clsx from 'clsx';\nimport type {ChipProps} from './chip';\n\nexport interface ChipListProps {\n className?: string;\n children?: ReactElement | ReactElement[];\n size?: ChipProps['size'];\n radius?: ChipProps['radius'];\n color?: ChipProps['color'];\n selectable?: ChipProps['selectable'];\n wrap?: boolean;\n}\nexport function ChipList({\n className,\n children,\n size,\n color,\n radius,\n selectable,\n wrap = true,\n}: ChipListProps) {\n return (\n <div\n className={clsx(\n 'flex items-center gap-8',\n wrap && 'flex-wrap',\n className,\n )}\n >\n {Children.map(children, chip => {\n if (isValidElement<ChipProps>(chip)) {\n return cloneElement<ChipProps>(chip, {\n size,\n color,\n selectable,\n radius,\n });\n }\n })}\n </div>\n );\n}\n","import {ChipValue} from './chip-field';\n\nexport function stringToChipValue(value: string | number): ChipValue {\n // add both name and description so \"validateWith\" works properly in chip field, if it depends on description\n return {id: value, name: `${value}`, description: `${value}`};\n}\n","import React, {\n HTMLAttributes,\n Key,\n ReactElement,\n ReactNode,\n Ref,\n RefObject,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {useFocusManager} from '@react-aria/focus';\nimport clsx from 'clsx';\nimport {mergeProps, useLayoutEffect, useObjectRef} from '@react-aria/utils';\nimport {useControlledState} from '@react-stately/utils';\nimport {ChipList} from './chip-list';\nimport {Field} from '../field';\nimport {Input} from '../input';\nimport {Chip, ChipProps} from './chip';\nimport {NormalizedModel} from '@common/datatable/filters/normalized-model';\nimport {getInputFieldClassNames} from '../get-input-field-class-names';\nimport {ProgressCircle} from '../../../progress/progress-circle';\nimport {useField} from '../use-field';\nimport {Avatar} from '../../../images/avatar';\nimport {Listbox} from '../../listbox/listbox';\nimport {useListbox} from '../../listbox/use-listbox';\nimport {BaseFieldPropsWithDom} from '../base-field-props';\nimport {useListboxKeyboardNavigation} from '../../listbox/use-listbox-keyboard-navigation';\nimport {createEventHandler} from '@common/utils/dom/create-event-handler';\nimport {ListBoxChildren, ListboxProps} from '../../listbox/types';\nimport {stringToChipValue} from './string-to-chip-value';\nimport {Popover} from '../../../overlays/popover';\nimport {KeyboardArrowDownIcon} from '@common/icons/material/KeyboardArrowDown';\n\nexport interface ChipValue extends Omit<NormalizedModel, 'model_type'> {\n invalid?: boolean;\n errorMessage?: string;\n}\n\nexport type ChipFieldProps<T> = Omit<\n ListboxProps,\n 'selectionMode' | 'displayWith'\n> &\n Omit<\n BaseFieldPropsWithDom<HTMLInputElement>,\n 'value' | 'onChange' | 'defaultValue'\n > & {\n value?: (ChipValue | string)[];\n defaultValue?: (ChipValue | string)[];\n displayWith?: (value: ChipValue) => ReactNode;\n validateWith?: (value: ChipValue) => ChipValue;\n allowCustomValue?: boolean;\n showDropdownArrow?: boolean;\n onChange?: (value: ChipValue[]) => void;\n suggestions?: T[];\n children?: ListBoxChildren<T>['children'];\n placeholder?: string;\n chipSize?: ChipProps['size'];\n openMenuOnFocus?: boolean;\n valueKey?: 'id' | 'name';\n onChipClick?: (value: ChipValue) => void;\n };\n\nfunction ChipFieldInner<T>(\n props: ChipFieldProps<T>,\n ref: Ref<HTMLInputElement>,\n) {\n const fieldRef = useRef<HTMLDivElement>(null);\n const inputRef = useObjectRef(ref);\n const {\n displayWith = v => v.name,\n validateWith,\n children,\n suggestions,\n isLoading,\n inputValue,\n onInputValueChange,\n onItemSelected,\n placeholder,\n onOpenChange,\n chipSize = 'sm',\n openMenuOnFocus = true,\n showEmptyMessage,\n value: propsValue,\n defaultValue,\n onChange: propsOnChange,\n valueKey,\n isAsync,\n allowCustomValue = true,\n showDropdownArrow,\n onChipClick,\n ...inputFieldProps\n } = props;\n const fieldClassNames = getInputFieldClassNames({\n ...props,\n flexibleHeight: true,\n });\n\n const [value, onChange] = useChipFieldValueState(props);\n\n const [listboxIsOpen, setListboxIsOpen] = useState(false);\n\n const loadingIndicator = (\n <ProgressCircle isIndeterminate size=\"sm\" aria-label=\"loading...\" />\n );\n\n const dropdownArrow = showDropdownArrow ? <KeyboardArrowDownIcon /> : null;\n\n const {fieldProps, inputProps} = useField({\n ...inputFieldProps,\n focusRef: inputRef,\n endAdornment: isLoading && listboxIsOpen ? loadingIndicator : dropdownArrow,\n });\n\n return (\n <Field fieldClassNames={fieldClassNames} {...fieldProps}>\n <Input\n ref={fieldRef}\n className={clsx('flex flex-wrap items-center', fieldClassNames.input)}\n onClick={() => {\n // refocus input when clicking outside it, but while still inside chip field\n inputRef.current?.focus();\n }}\n >\n <ListWrapper\n displayChipUsing={displayWith}\n onChipClick={onChipClick}\n items={value}\n setItems={onChange}\n chipSize={chipSize}\n />\n <ChipInput\n showEmptyMessage={showEmptyMessage}\n inputProps={inputProps}\n inputValue={inputValue}\n onInputValueChange={onInputValueChange}\n fieldRef={fieldRef}\n inputRef={inputRef}\n chips={value}\n setChips={onChange}\n validateWith={validateWith}\n isLoading={isLoading}\n suggestions={suggestions}\n placeholder={placeholder}\n openMenuOnFocus={openMenuOnFocus}\n listboxIsOpen={listboxIsOpen}\n setListboxIsOpen={setListboxIsOpen}\n allowCustomValue={allowCustomValue}\n >\n {children}\n </ChipInput>\n </Input>\n </Field>\n );\n}\n\ninterface ListWrapperProps {\n items: ChipValue[];\n setItems: (items: ChipValue[]) => void;\n displayChipUsing: (value: ChipValue) => ReactNode;\n chipSize?: ChipProps['size'];\n onChipClick?: (value: ChipValue) => void;\n}\nfunction ListWrapper({\n items,\n setItems,\n displayChipUsing,\n chipSize,\n onChipClick,\n}: ListWrapperProps) {\n const manager = useFocusManager();\n const removeItem = useCallback(\n (key: Key) => {\n const i = items.findIndex(cr => cr.id === key);\n const newItems = [...items];\n if (i > -1) {\n newItems.splice(i, 1);\n setItems(newItems);\n }\n return newItems;\n },\n [items, setItems],\n );\n\n return (\n <ChipList\n className=\"my-8 max-w-full flex-shrink-0 flex-wrap\"\n size={chipSize}\n selectable\n >\n {items.map(item => (\n <Chip\n key={item.id}\n errorMessage={item.errorMessage}\n adornment={item.image ? <Avatar circle src={item.image} /> : null}\n onClick={() => onChipClick?.(item)}\n onRemove={() => {\n const newItems = removeItem(item.id);\n if (newItems.length) {\n // focus previous chip\n manager?.focusPrevious({tabbable: true});\n } else {\n // focus input\n manager?.focusLast();\n }\n }}\n >\n {displayChipUsing(item)}\n </Chip>\n ))}\n </ChipList>\n );\n}\n\ninterface ChipInputProps<T> {\n showEmptyMessage?: boolean;\n inputProps: ReturnType<typeof useField>['inputProps'];\n inputValue?: string;\n onInputValueChange?: (value: string) => void;\n fieldRef: RefObject<HTMLDivElement>;\n inputRef: RefObject<HTMLInputElement>;\n chips: ChipValue[];\n setChips: (items: ChipValue[]) => void;\n validateWith?: (value: ChipValue) => ChipValue;\n isLoading?: boolean;\n suggestions?: T[];\n placeholder?: string;\n openMenuOnFocus?: boolean;\n listboxIsOpen: boolean;\n setListboxIsOpen: (value: boolean) => void;\n allowCustomValue: boolean;\n children: ListBoxChildren<T>['children'];\n}\nfunction ChipInput<T>(props: ChipInputProps<T>) {\n const {\n inputRef,\n fieldRef,\n validateWith,\n setChips,\n chips,\n suggestions,\n inputProps,\n placeholder,\n openMenuOnFocus,\n listboxIsOpen,\n setListboxIsOpen,\n allowCustomValue,\n isLoading,\n } = props;\n const inputClassName = 'outline-none text-sm mx-8 my-4 h-30 flex-auto';\n const manager = useFocusManager();\n\n const addItems = useCallback(\n (items?: ChipValue[]) => {\n items = (items || []).filter(item => {\n const invalid = !item || !item.id || !item.name;\n const alreadyExists = chips.findIndex(cr => cr.id === item?.id) > -1;\n return !alreadyExists && !invalid;\n });\n if (!items.length) return;\n\n if (validateWith) {\n items = items.map(item => validateWith(item));\n }\n setChips([...chips, ...items]);\n },\n [chips, setChips, validateWith],\n );\n\n const listbox = useListbox<T>({\n ...props,\n clearInputOnItemSelection: true,\n isOpen: listboxIsOpen,\n onOpenChange: setListboxIsOpen,\n items: suggestions,\n selectionMode: 'none',\n role: 'listbox',\n virtualFocus: true,\n onItemSelected: value => {\n handleItemSelection(value as string);\n },\n });\n\n const {\n state: {\n activeIndex,\n setActiveIndex,\n isOpen,\n setIsOpen,\n inputValue,\n setInputValue,\n },\n refs,\n listboxId,\n collection,\n onInputChange,\n } = listbox;\n\n const handleItemSelection = (textValue: string) => {\n const option =\n collection.size && activeIndex != null\n ? [...collection.values()][activeIndex]\n : null;\n if (option?.item) {\n addItems([option.item]);\n } else if (allowCustomValue) {\n addItems([stringToChipValue(option ? option.value : textValue)]);\n }\n\n setInputValue('');\n setActiveIndex(null);\n setIsOpen(false);\n };\n\n // position dropdown relative to whole chip field, not the input\n useLayoutEffect(() => {\n if (fieldRef.current && refs.reference.current !== fieldRef.current) {\n listbox.reference(fieldRef.current);\n }\n }, [fieldRef, listbox, refs]);\n\n const {handleTriggerKeyDown, handleListboxKeyboardNavigation} =\n useListboxKeyboardNavigation(listbox);\n\n const handleFocusAndClick = createEventHandler(() => {\n if (openMenuOnFocus && !isOpen) {\n setIsOpen(true);\n }\n });\n\n return (\n <Listbox\n listbox={listbox}\n mobileOverlay={Popover}\n isLoading={isLoading}\n onPointerDown={e => {\n // prevent focus from leaving input when scrolling listbox via mouse\n e.preventDefault();\n }}\n >\n <input\n type=\"text\"\n className={clsx(inputClassName, 'bg-transparent')}\n placeholder={placeholder}\n {...mergeProps(inputProps, {\n ref: inputRef,\n value: inputValue,\n onChange: onInputChange,\n onPaste: e => {\n const paste = e.clipboardData.getData('text');\n const emails = paste.match(\n /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\\.[a-zA-Z0-9._-]+)/gi,\n );\n if (emails) {\n e.preventDefault();\n const selection = window.getSelection();\n if (selection?.rangeCount) {\n selection.deleteFromDocument();\n addItems(emails.map(email => stringToChipValue(email)));\n }\n }\n },\n 'aria-autocomplete': 'list',\n 'aria-controls': isOpen ? listboxId : undefined,\n autoComplete: 'off',\n autoCorrect: 'off',\n spellCheck: 'false',\n onKeyDown: e => {\n const input = e.target as HTMLInputElement;\n\n if (e.key === 'Enter') {\n // prevent form submitting\n e.preventDefault();\n // add chip from selected listbox option or current input text value\n handleItemSelection(input.value);\n return;\n }\n\n // on escape, clear input and close dropdown\n if (e.key === 'Escape' && isOpen) {\n setIsOpen(false);\n setInputValue('');\n }\n\n // move focus to input when focus is on first item and prevent arrow up from cycling listbox\n if (\n e.key === 'ArrowUp' &&\n isOpen &&\n (activeIndex === 0 || activeIndex == null)\n ) {\n setActiveIndex(null);\n return;\n }\n\n // block left and right arrows from navigating in input, if focus is on listbox\n if (\n activeIndex != null &&\n (e.key === 'ArrowLeft' || e.key === 'ArrowRight')\n ) {\n e.preventDefault();\n return;\n }\n\n // move focus on the last chip, if focus is at the start of input\n if (\n (e.key === 'ArrowLeft' ||\n e.key === 'Backspace' ||\n e.key === 'Delete') &&\n input.selectionStart === 0 &&\n activeIndex == null &&\n chips.length\n ) {\n manager?.focusPrevious({tabbable: true});\n return;\n }\n\n // fallthrough to listbox navigation handlers for arrow keys\n const handled = handleTriggerKeyDown(e);\n if (!handled) {\n handleListboxKeyboardNavigation(e);\n }\n },\n onFocus: handleFocusAndClick,\n onClick: handleFocusAndClick,\n } as HTMLAttributes<HTMLInputElement>)}\n />\n </Listbox>\n );\n}\n\nfunction useChipFieldValueState({\n onChange,\n value,\n defaultValue,\n valueKey,\n}: ChipFieldProps<any>) {\n // convert value from string[] to ChipValue[], if needed\n const propsValue = useMemo(() => {\n return mixedValueToChipValue(value);\n }, [value]);\n\n // convert defaultValue from string[] to ChipValue[], if needed\n const propsDefaultValue = useMemo(() => {\n return mixedValueToChipValue(defaultValue);\n }, [defaultValue]);\n\n // emit string[] or ChipValue[] on change, based on \"valueKey\" prop\n const handleChange = useCallback(\n (value: ChipValue[]) => {\n const newValue = valueKey ? value.map(v => v[valueKey]) : value;\n onChange?.(newValue as any);\n },\n [onChange, valueKey],\n );\n\n return useControlledState<ChipValue[]>(\n !propsValue ? undefined : propsValue,\n propsDefaultValue || [],\n handleChange,\n );\n}\n\nfunction mixedValueToChipValue(\n value?: (string | number | ChipValue)[] | null,\n): ChipValue[] | undefined {\n if (value == null) {\n return undefined;\n }\n\n return value.map(v => {\n return typeof v !== 'object' ? stringToChipValue(v as string) : v;\n });\n}\n\nexport const ChipField = React.forwardRef(ChipFieldInner) as <T>(\n props: ChipFieldProps<T> & {ref?: Ref<HTMLInputElement>},\n) => ReactElement;\n","import {useController} from 'react-hook-form';\nimport {mergeProps} from '@react-aria/utils';\nimport React from 'react';\nimport {ChipField, ChipFieldProps} from './chip-field';\n\nexport type FormChipFieldProps<T> = ChipFieldProps<T> & {\n name: string;\n};\n\nexport function FormChipField<T>({children, ...props}: FormChipFieldProps<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<ChipFieldProps<T>> = {\n onChange,\n onBlur,\n value,\n invalid,\n errorMessage: error?.message,\n };\n\n return (\n <ChipField ref={ref} {...mergeProps(formProps, props)}>\n {children}\n </ChipField>\n );\n}\n","import {Item} from '@common/ui/forms/listbox/item';\nimport {FilterPanelProps} from '@common/datatable/filters/panels/filter-panel-props';\nimport {FormChipField} from '@common/ui/forms/input-field/chip-field/form-chip-field';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {FilterChipFieldControl} from '@common/datatable/filters/backend-filter';\nimport {Trans} from '@common/i18n/trans';\n\nexport function ChipFieldFilterPanel({\n filter,\n}: FilterPanelProps<FilterChipFieldControl>) {\n const {trans} = useTrans();\n return (\n <FormChipField\n size=\"sm\"\n name={`${filter.key}.value`}\n valueKey=\"id\"\n allowCustomValue={false}\n showDropdownArrow\n placeholder={\n filter.control.placeholder\n ? trans(filter.control.placeholder)\n : undefined\n }\n displayWith={chip =>\n filter.control.options.find(o => o.key === chip.id)?.label.message\n }\n suggestions={filter.control.options.map(o => ({\n id: o.key,\n name: o.label.message,\n }))}\n >\n {chip => (\n <Item key={chip.id} value={chip.id}>\n {<Trans message={chip.name} />}\n </Item>\n )}\n </FormChipField>\n );\n}\n","import {Dialog} from '../../ui/overlays/dialog/dialog';\nimport {\n BackendFilter,\n CustomFilterControl,\n DatePickerFilterControl,\n FilterBooleanToggleControl,\n FilterChipFieldControl,\n FilterControlType,\n FilterOperator,\n FilterSelectControl,\n FilterSelectModelControl,\n FilterTextInputControl,\n} from './backend-filter';\nimport {Trans} from '../../i18n/trans';\nimport {Key, useState} from 'react';\nimport {DialogHeader} from '../../ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '../../ui/overlays/dialog/dialog-body';\nimport {useBackendFilterUrlParams} from './backend-filter-url-params';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {Accordion, AccordionItem} from '../../ui/accordion/accordion';\nimport {Button} from '../../ui/buttons/button';\nimport {useForm} from 'react-hook-form';\nimport {Form} from '../../ui/forms/form';\nimport {Checkbox} from '../../ui/forms/toggle/checkbox';\nimport {SelectFilterPanel} from './panels/select-filter-panel';\nimport {DateRangeFilterPanel} from './panels/date-range-filter-panel';\nimport {NormalizedModelFilterPanel} from './panels/normalized-model-filter-panel';\nimport {InputFilterPanel} from './panels/input-filter-panel';\nimport {BooleanFilterPanel} from './panels/boolean-filter-panel';\nimport clsx from 'clsx';\nimport {ChipFieldFilterPanel} from '@common/datatable/filters/panels/chip-field-filter-panel';\n\nexport interface FilterItemFormValue<T = any> {\n value: T;\n operator?: FilterOperator;\n}\n\ninterface AddFilterDialogProps {\n filters: BackendFilter[];\n}\nexport function AddFilterDialog({filters}: AddFilterDialogProps) {\n const {decodedFilters} = useBackendFilterUrlParams(filters);\n const {formId} = useDialogContext();\n\n // expand currently active filters\n const [expandedFilters, setExpandedFilters] = useState<Key[]>(() => {\n return decodedFilters.map(f => f.key);\n });\n\n const clearButton = (\n <Button\n size=\"xs\"\n variant=\"outline\"\n className=\"mr-auto\"\n onClick={() => {\n setExpandedFilters([]);\n }}\n >\n <Trans message=\"Clear\" />\n </Button>\n );\n\n const applyButton = (\n <Button\n size=\"xs\"\n variant=\"flat\"\n color=\"primary\"\n className=\"ml-auto\"\n type=\"submit\"\n form={formId}\n >\n <Trans message=\"Apply\" />\n </Button>\n );\n\n return (\n <Dialog className=\"min-w-[300px]\" maxWidth=\"max-w-400\" size=\"auto\">\n <DialogHeader\n padding=\"px-14 py-10\"\n leftAdornment={clearButton}\n rightAdornment={applyButton}\n >\n <Trans message=\"Filter\" />\n </DialogHeader>\n <DialogBody padding=\"p-0\">\n <FilterList\n filters={filters}\n expandedFilters={expandedFilters}\n setExpandedFilters={setExpandedFilters}\n />\n </DialogBody>\n </Dialog>\n );\n}\n\ninterface FilterListProps {\n filters: BackendFilter[];\n expandedFilters: Key[];\n setExpandedFilters: (value: Key[]) => void;\n}\nfunction FilterList({\n filters,\n expandedFilters,\n setExpandedFilters,\n}: FilterListProps) {\n const {decodedFilters, replaceAll} = useBackendFilterUrlParams(filters);\n\n // either get value and operator from url params if filter is active, or get defaults from filter config\n const defaultValues: Record<string, FilterItemFormValue> = {};\n filters.forEach(filter => {\n const appliedFilter = decodedFilters.find(f => f.key === filter.key);\n defaultValues[filter.key] =\n appliedFilter?.value !== undefined\n ? // there might be some extra keys set on filter besides\n // \"value\" and \"operator\", so add the whole object to form\n appliedFilter\n : {\n value: filter.control.defaultValue,\n operator: filter.defaultOperator,\n };\n });\n const form = useForm<Record<string, FilterItemFormValue>>({defaultValues});\n const {formId, close} = useDialogContext();\n\n return (\n <Form\n form={form}\n id={formId}\n onSubmit={formValue => {\n const filterValue = Object.entries(formValue)\n // remove undefined and non-expanded filters, so \"clear\" button will correctly remove active filters\n .filter(\n ([key, fieldValue]) =>\n expandedFilters.includes(key) && fieldValue !== undefined\n )\n .map(([key, fieldValue]) => ({\n key,\n ...fieldValue, // value and operator from form\n }));\n\n replaceAll(filterValue);\n close();\n }}\n >\n <Accordion\n mode=\"multiple\"\n expandedValues={expandedFilters}\n onExpandedChange={setExpandedFilters}\n >\n {filters.map(filter => (\n <AccordionItem\n startIcon={\n <Checkbox checked={expandedFilters.includes(filter.key)} />\n }\n key={filter.key}\n value={filter.key}\n label={<Trans {...filter.label} />}\n bodyClassName=\"max-h-288 overflow-y-auto compact-scrollbar\"\n >\n {filter.description && (\n <div\n className={clsx(\n 'text-xs text-muted',\n // boolean filter will have nothing in the panel, no need to add margin\n filter.control.type !== FilterControlType.BooleanToggle &&\n 'mb-14'\n )}\n >\n <Trans {...filter.description} />\n </div>\n )}\n <AddFilterDialogPanel filter={filter} />\n </AccordionItem>\n ))}\n </Accordion>\n </Form>\n );\n}\n\ninterface ActiveFilterPanelProps {\n filter: BackendFilter;\n}\nexport function AddFilterDialogPanel({filter}: ActiveFilterPanelProps) {\n switch (filter.control.type) {\n case FilterControlType.Select:\n return (\n <SelectFilterPanel\n filter={filter as BackendFilter<FilterSelectControl>}\n />\n );\n case FilterControlType.ChipField:\n return (\n <ChipFieldFilterPanel\n filter={filter as BackendFilter<FilterChipFieldControl>}\n />\n );\n case FilterControlType.DateRangePicker:\n return (\n <DateRangeFilterPanel\n filter={filter as BackendFilter<DatePickerFilterControl>}\n />\n );\n case FilterControlType.SelectModel:\n return (\n <NormalizedModelFilterPanel\n filter={filter as BackendFilter<FilterSelectModelControl>}\n />\n );\n case FilterControlType.Input:\n return (\n <InputFilterPanel\n filter={filter as BackendFilter<FilterTextInputControl>}\n />\n );\n case FilterControlType.BooleanToggle:\n return (\n <BooleanFilterPanel\n filter={filter as BackendFilter<FilterBooleanToggleControl>}\n />\n );\n case 'custom':\n const CustomComponent = filter.control.panel;\n return (\n <CustomComponent\n filter={filter as BackendFilter<CustomFilterControl>}\n />\n );\n default:\n return null;\n }\n}\n","import {Button, ButtonProps} from '../../ui/buttons/button';\nimport {BackendFilter} from './backend-filter';\nimport {FilterAltIcon} from '../../icons/material/FilterAlt';\nimport {Trans} from '../../i18n/trans';\nimport {useIsMobileMediaQuery} from '../../utils/hooks/is-mobile-media-query';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {AddFilterDialog} from './add-filter-dialog';\nimport {ReactElement} from 'react';\n\ninterface AddFilterButtonProps {\n filters: BackendFilter[];\n icon?: ReactElement;\n color?: ButtonProps['color'];\n variant?: ButtonProps['variant'];\n disabled?: boolean;\n size?: ButtonProps['size'];\n className?: string;\n}\nexport function AddFilterButton({\n filters,\n icon = <FilterAltIcon />,\n color = 'primary',\n variant = 'outline',\n size = 'sm',\n disabled,\n className,\n}: AddFilterButtonProps) {\n const isMobile = useIsMobileMediaQuery();\n\n const desktopButton = (\n <Button\n variant={variant}\n color={color}\n startIcon={icon}\n disabled={disabled}\n size={size}\n className={className}\n >\n <Trans message=\"Filter\" />\n </Button>\n );\n\n const mobileButton = (\n <IconButton\n color={color}\n size=\"sm\"\n variant={variant}\n disabled={disabled}\n className={className}\n >\n {icon}\n </IconButton>\n );\n\n return (\n <DialogTrigger type=\"popover\">\n {isMobile ? mobileButton : desktopButton}\n <AddFilterDialog filters={filters} />\n </DialogTrigger>\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 inputTestId=\"datatable-search\"\n className=\"flex-auto max-w-440 mr-auto\"\n inputWrapperClassName=\"mr-24 md:mr-0\"\n placeholder={trans(searchPlaceholder)}\n startAdornment={<SearchIcon />}\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=\"mb-24 flex items-center gap-8 md:gap-12 text-muted relative h-42\"\n {...domProps}\n >\n {children}\n </div>\n );\n}\n","import {BackendFilter, FilterControlType} from '../backend-filter';\nimport {ComponentPropsWithRef, forwardRef, ReactNode} from 'react';\nimport {Button} from '@common/ui/buttons/button';\nimport {KeyboardArrowDownIcon} from '@common/icons/material/KeyboardArrowDown';\nimport {Trans} from '@common/i18n/trans';\nimport clsx from 'clsx';\n\ninterface TriggerButtonProps\n extends Omit<ComponentPropsWithRef<'button'>, 'color'> {\n isInactive?: boolean;\n filter: BackendFilter;\n children?: ReactNode;\n}\nexport const FilterListTriggerButton = forwardRef<\n HTMLButtonElement,\n TriggerButtonProps\n>((props, ref) => {\n // pass through all props from menu trigger and dialog trigger to button\n const {isInactive, filter, ...domProps} = props;\n\n if (isInactive) {\n return <InactiveFilterButton filter={filter} {...domProps} ref={ref} />;\n }\n\n return <ActiveFilterButton filter={filter} {...domProps} ref={ref} />;\n});\n\ninterface InactiveFilterButtonProps\n extends Omit<ComponentPropsWithRef<'button'>, 'color'> {\n filter: BackendFilter;\n}\nexport const InactiveFilterButton = forwardRef<\n HTMLButtonElement,\n InactiveFilterButtonProps\n>(({filter, ...domProps}, ref) => {\n return (\n <Button\n variant=\"outline\"\n size=\"xs\"\n color=\"paper\"\n radius=\"rounded-md\"\n border=\"border\"\n ref={ref}\n endIcon={<KeyboardArrowDownIcon />}\n {...domProps}\n >\n <Trans {...filter.label} />\n </Button>\n );\n});\n\nexport const ActiveFilterButton = forwardRef<\n HTMLButtonElement,\n InactiveFilterButtonProps\n>(({filter, children, ...domProps}, ref) => {\n const isBoolean = filter.control.type === FilterControlType.BooleanToggle;\n return (\n <Button\n variant=\"outline\"\n size=\"xs\"\n color=\"primary\"\n radius=\"rounded-r-md\"\n border=\"border-y border-r\"\n endIcon={!isBoolean && <KeyboardArrowDownIcon />}\n ref={ref}\n {...domProps}\n >\n <span\n className={clsx(\n !isBoolean && 'border-r border-r-primary-light mr-8 pr-8'\n )}\n >\n <Trans {...filter.label} />\n </span>\n {children}\n </Button>\n );\n});\n","import {DialogTrigger} from '../../../ui/overlays/dialog/dialog-trigger';\nimport {FilterListTriggerButton} from './filter-list-trigger-button';\nimport {ReactNode} from 'react';\nimport {useForm} from 'react-hook-form';\nimport {FilterItemFormValue} from '../add-filter-dialog';\nimport {useDialogContext} from '../../../ui/overlays/dialog/dialog-context';\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 {Form} from '../../../ui/forms/form';\nimport {DialogFooter} from '../../../ui/overlays/dialog/dialog-footer';\nimport {Button} from '../../../ui/buttons/button';\nimport {FilterListControlProps} from './filter-list-control';\n\ninterface FilterListItemDialogTriggerProps extends FilterListControlProps<any> {\n label: ReactNode;\n panel: ReactNode;\n}\nexport function FilterListItemDialogTrigger(\n props: FilterListItemDialogTriggerProps\n) {\n const {onValueChange, isInactive, filter, label} = props;\n return (\n <DialogTrigger\n offset={10}\n type=\"popover\"\n onClose={(value?: FilterItemFormValue) => {\n if (value !== undefined) {\n onValueChange(value);\n }\n }}\n >\n <FilterListTriggerButton isInactive={isInactive} filter={filter}>\n {label}\n </FilterListTriggerButton>\n <FilterListControlDialog {...props} />\n </DialogTrigger>\n );\n}\n\nexport function FilterListControlDialog({\n filter,\n panel,\n value,\n operator,\n}: FilterListItemDialogTriggerProps) {\n const form = useForm<Record<string, FilterItemFormValue>>({\n defaultValues: {\n [filter.key]: {value, operator},\n },\n });\n const {close, formId} = useDialogContext();\n return (\n <Dialog size=\"xs\">\n <DialogHeader>\n <Trans {...filter.label} />\n </DialogHeader>\n <DialogBody padding=\"px-14 pt-14 pb-4 max-h-288\">\n <Form\n form={form}\n id={formId}\n onSubmit={formValue => {\n close(formValue[filter.key]);\n }}\n >\n {filter.description && (\n <div className=\"text-muted text-xs mb-14\">\n <Trans {...filter.description} />\n </div>\n )}\n {panel}\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button\n form={formId}\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n size=\"xs\"\n >\n <Trans message=\"Apply\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {\n BackendFilter,\n CustomFilterControl,\n DatePickerFilterControl,\n FilterBooleanToggleControl,\n FilterChipFieldControl,\n FilterControl,\n FilterControlType,\n FilterNumberInputControl,\n FilterOperator,\n FilterSelectControl,\n FilterSelectModelControl,\n FilterTextInputControl,\n} from '../backend-filter';\nimport {FilterListTriggerButton} from './filter-list-trigger-button';\nimport {Trans} from '@common/i18n/trans';\nimport {SelectFilterPanel} from '../panels/select-filter-panel';\nimport {FilterListItemDialogTrigger} from './filter-list-item-dialog-trigger';\nimport {Avatar} from '@common/ui/images/avatar';\nimport {NormalizedModelFilterPanel} from '../panels/normalized-model-filter-panel';\nimport {DateRangeFilterPanel} from '../panels/date-range-filter-panel';\nimport {Fragment, Key, ReactNode} from 'react';\nimport {DateRangePresets} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-presets';\nimport {FormattedDateTimeRange} from '@common/i18n/formatted-date-time-range';\nimport {AbsoluteDateRange} from '@common/ui/forms/input-field/date/date-range-picker/form-date-range-picker';\nimport {InputFilterPanel} from '../panels/input-filter-panel';\nimport {FilterOperatorNames} from '../filter-operator-names';\nimport {FilterItemFormValue} from '../add-filter-dialog';\nimport {useNormalizedModel} from '@common/users/queries/use-normalized-model';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {ChipFieldFilterPanel} from '@common/datatable/filters/panels/chip-field-filter-panel';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\n\nexport interface FilterListControlProps<T = unknown, E = FilterControl> {\n filter: BackendFilter<E>;\n onValueChange: (value: FilterItemFormValue<T>) => void;\n value: T;\n operator?: FilterOperator;\n isInactive?: boolean;\n}\nexport function FilterListControl(props: FilterListControlProps<any, any>) {\n switch (props.filter.control.type) {\n case FilterControlType.DateRangePicker:\n return <DatePickerControl {...props} />;\n case FilterControlType.BooleanToggle:\n return <BooleanToggleControl {...props} />;\n case FilterControlType.Select:\n return <SelectControl {...props} />;\n case FilterControlType.ChipField:\n return <ChipFieldControl {...props} />;\n case FilterControlType.Input:\n return <InputControl {...props} />;\n case FilterControlType.SelectModel:\n return <SelectModelControl {...props} />;\n case FilterControlType.Custom:\n const Control = (props.filter.control as CustomFilterControl).listItem;\n return <Control {...props} />;\n default:\n return null;\n }\n}\n\nfunction DatePickerControl(\n props: FilterListControlProps<\n Required<AbsoluteDateRange>,\n DatePickerFilterControl\n >,\n) {\n const {value, filter} = props;\n\n let valueLabel: ReactNode;\n if (value.preset !== undefined) {\n valueLabel = <Trans {...DateRangePresets[value.preset].label} />;\n } else {\n valueLabel = (\n <FormattedDateTimeRange\n start={new Date(value.start)}\n end={new Date(value.end)}\n options={{dateStyle: 'medium'}}\n />\n );\n }\n\n return (\n <FilterListItemDialogTrigger\n {...props}\n label={valueLabel}\n panel={<DateRangeFilterPanel filter={filter} />}\n />\n );\n}\n\nfunction BooleanToggleControl({\n filter,\n isInactive,\n onValueChange,\n}: FilterListControlProps<\n FilterBooleanToggleControl['defaultValue'],\n FilterBooleanToggleControl\n>) {\n // todo: toggle control on or off here\n return (\n <FilterListTriggerButton\n onClick={() => {\n onValueChange({value: filter.control.defaultValue});\n }}\n filter={filter}\n isInactive={isInactive}\n />\n );\n}\n\nfunction SelectControl(\n props: FilterListControlProps<Key, FilterSelectControl>,\n) {\n const {filter, value} = props;\n const option = filter.control.options.find(o => o.key === value);\n return (\n <FilterListItemDialogTrigger\n {...props}\n label={option ? <Trans {...option.label} /> : null}\n panel={<SelectFilterPanel filter={filter} />}\n />\n );\n}\n\nfunction ChipFieldControl(\n props: FilterListControlProps<string[], FilterChipFieldControl>,\n) {\n return (\n <FilterListItemDialogTrigger\n {...props}\n label={<MultipleValues {...props} />}\n panel={<ChipFieldFilterPanel filter={props.filter} />}\n />\n );\n}\n\nfunction MultipleValues(\n props: FilterListControlProps<string[], FilterChipFieldControl>,\n) {\n const {trans} = useTrans();\n const {filter, value} = props;\n const options = value.map(v => filter.control.options.find(o => o.key === v));\n const maxShownCount = 3;\n const notShownCount = value.length - maxShownCount;\n\n // translate names, add commas and limit to 3\n const names = (\n <Fragment>\n {options\n .filter(Boolean)\n .slice(0, maxShownCount)\n .map((o, i) => {\n let name = '';\n if (i !== 0) {\n name += ', ';\n }\n name += trans(o!.label);\n return name;\n })}\n </Fragment>\n );\n\n // indicate that there are some names not shown\n return notShownCount > 0 ? (\n <Trans\n message=\":names + :count more\"\n values={{names: names, count: notShownCount}}\n />\n ) : (\n names\n );\n}\n\nfunction InputControl(\n props: FilterListControlProps<\n string,\n FilterTextInputControl | FilterNumberInputControl\n >,\n) {\n const {filter, value, operator} = props;\n\n const operatorLabel = operator ? (\n <Trans {...FilterOperatorNames[operator]} />\n ) : null;\n\n const formattedValue =\n filter.control.inputType === 'number' ? (\n <FormattedNumber value={value as any} />\n ) : (\n value\n );\n\n return (\n <FilterListItemDialogTrigger\n {...props}\n label={\n <Fragment>\n {operatorLabel} {formattedValue}\n </Fragment>\n }\n panel={<InputFilterPanel filter={filter} />}\n />\n );\n}\n\nfunction SelectModelControl(\n props: FilterListControlProps<string, FilterSelectModelControl>,\n) {\n const {value, filter} = props;\n const {isLoading, data} = useNormalizedModel(\n `normalized-models/${filter.control.model}/${value}`,\n undefined,\n {enabled: !!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 return (\n <FilterListItemDialogTrigger\n {...props}\n label={label}\n panel={<NormalizedModelFilterPanel filter={filter} />}\n />\n );\n}\n","import clsx from 'clsx';\nimport {BackendFilter} from '../backend-filter';\nimport {useBackendFilterUrlParams} from '../backend-filter-url-params';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {FilterListControl} from './filter-list-control';\nimport {FilterItemFormValue} from '../add-filter-dialog';\n\ninterface FilterListProps {\n filters: BackendFilter[];\n // these filters will always be shown, even if value is not yet selected for filter\n pinnedFilters?: string[];\n className?: string;\n}\nexport function FilterList({\n filters,\n pinnedFilters,\n className,\n}: FilterListProps) {\n const {decodedFilters, remove, replaceAll} = useBackendFilterUrlParams(\n filters,\n pinnedFilters\n );\n\n if (!decodedFilters.length) return null;\n\n return (\n <div className={clsx('flex items-center gap-6 overflow-x-auto', className)}>\n {decodedFilters.map((field, index) => {\n const filter = filters.find(f => f.key === field.key);\n\n if (!filter) return null;\n\n const handleValueChange = (payload: FilterItemFormValue) => {\n const newFilters = [...decodedFilters];\n newFilters.splice(index, 1, {\n key: filter.key,\n value: payload.value,\n isInactive: false,\n operator: payload.operator || filter.defaultOperator,\n });\n replaceAll(newFilters);\n };\n\n return (\n <div key={field.key}>\n {!field.isInactive && (\n <IconButton\n variant=\"outline\"\n color=\"primary\"\n size=\"xs\"\n radius=\"rounded-l-md\"\n onClick={() => {\n remove(field.key);\n }}\n >\n <CloseIcon />\n </IconButton>\n )}\n <FilterListControl\n filter={filter}\n isInactive={field.isInactive}\n value={field.valueKey != null ? field.valueKey : field.value}\n operator={field.operator}\n onValueChange={handleValueChange}\n />\n </div>\n );\n })}\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 {m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport React from 'react';\n\nexport function FilterListSkeleton() {\n return (\n <m.div\n className=\"flex items-center gap-6 h-30\"\n key=\"filter-list-skeleton\"\n {...opacityAnimation}\n >\n <Skeleton variant=\"rect\" size=\"h-full w-144\" radius=\"rounded-md\" />\n <Skeleton variant=\"rect\" size=\"h-full w-112\" radius=\"rounded-md\" />\n <Skeleton variant=\"rect\" size=\"h-full w-172\" radius=\"rounded-md\" />\n </m.div>\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 className?: string;\n}\nexport function DataTablePage<T extends TableDataItem>({\n title,\n headerContent,\n headerItemsAlign = 'items-end',\n className,\n ...dataTableProps\n}: Props<T>) {\n const titleId = useId();\n\n return (\n <div className={clsx('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';\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} = 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, {onSuccess: () => close()});\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","import {createSvgIcon} from '../create-svg-icon';\n\nexport const AddIcon = createSvgIcon(\n <path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />\n, 'AddOutlined');\n","import {AddIcon} from '../icons/material/Add';\nimport {Button} from '../ui/buttons/button';\nimport React, {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 elementType?: ButtonBaseProps['elementType'];\n onClick?: ButtonBaseProps['onClick'];\n}\nexport const DataTableAddItemButton = React.forwardRef<\n HTMLButtonElement,\n DataTableAddItemButtonProps\n>(({children, to, elementType, onClick}, ref) => {\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 elementType={elementType}\n onClick={onClick}\n >\n <AddIcon />\n </IconButton>\n );\n }\n\n return (\n <Button\n ref={ref}\n startIcon={<AddIcon />}\n variant=\"flat\"\n color=\"primary\"\n size=\"sm\"\n to={to}\n elementType={elementType}\n onClick={onClick}\n >\n {children}\n </Button>\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 React, {ReactNode} from 'react';\nimport {Avatar, AvatarProps} from '../../ui/images/avatar';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport clsx from 'clsx';\n\ninterface Props {\n image?: string;\n label: ReactNode;\n description?: ReactNode;\n labelClassName?: string;\n avatarSize?: AvatarProps['size'];\n}\nexport function NameWithAvatar({\n image,\n label,\n description,\n labelClassName,\n avatarSize = 'md',\n}: Props) {\n return (\n <div className=\"flex items-center gap-12\">\n {image && (\n <Avatar size={avatarSize} className=\"flex-shrink-0\" src={image} />\n )}\n <div className=\"min-w-0 overflow-hidden\">\n <div\n className={clsx(labelClassName, 'overflow-hidden overflow-ellipsis')}\n >\n {label}\n </div>\n {description && (\n <div className=\"overflow-hidden overflow-ellipsis text-xs text-muted\">\n {description}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport function NameWithAvatarPlaceholder({\n labelClassName,\n showDescription,\n}: Partial<Props> & {\n showDescription?: boolean;\n}) {\n return (\n <div className=\"flex w-full max-w-4/5 items-center gap-12\">\n <Skeleton size=\"w-40 h-40 md:w-32 md:h-32\" variant=\"rect\" />\n <div className=\"flex-auto\">\n <div className={clsx(labelClassName, 'leading-3')}>\n <Skeleton />\n </div>\n {showDescription && (\n <div className=\"mt-4 leading-3 text-muted\">{<Skeleton />}</div>\n )}\n </div>\n </div>\n );\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","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 {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 {useState} from 'react';\nimport {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 defaultValue?: string;\n onChange?: (color: string) => void;\n hideFooter?: boolean;\n showInput?: boolean;\n}\nexport function ColorPickerDialog({\n defaultValue,\n onChange,\n hideFooter = false,\n showInput = true,\n}: ColorPickerDialogProps) {\n const {close} = useDialogContext();\n const [value, setValue] = useState(defaultValue || '');\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={value}\n onChange={newValue => {\n setValue(newValue);\n onChange?.(newValue);\n }}\n />\n {!hideFooter && (\n <DialogFooter dividerTop>\n <Button\n variant=\"text\"\n size=\"xs\"\n onClick={() => {\n close();\n }}\n >\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n variant=\"flat\"\n color=\"primary\"\n size=\"xs\"\n onClick={() => {\n close(value);\n }}\n >\n <Trans message=\"Apply\" />\n </Button>\n </DialogFooter>\n )}\n </Dialog>\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","import {DragMonitor} from './use-drag-monitor';\nimport {ConnectedDraggable, DraggableId} from './use-draggable';\nimport {ConnectedDroppable} from './use-droppable';\n\nexport type DragSessionStatus =\n | 'dropSuccess'\n | 'dropFail'\n | 'dragging'\n | 'inactive';\n\nexport interface DragSession {\n dragTargetId?: DraggableId;\n status: DragSessionStatus;\n}\n\nexport const draggables = new Map<DraggableId, ConnectedDraggable>();\nexport const droppables = new Map<DraggableId, ConnectedDroppable>();\nexport const dragMonitors = new Map<DraggableId, DragMonitor>();\nexport const dragSession: DragSession = {\n status: 'inactive',\n};\n","import React from 'react';\n\ntype NativeEvent =\n | React.PointerEvent\n | PointerEvent\n | React.DragEvent<HTMLElement>\n | DragEvent;\n\nexport interface InteractableEvent {\n x: number;\n y: number;\n deltaX: number;\n deltaY: number;\n rect: InteractableRect;\n nativeEvent: NativeEvent;\n}\n\nexport interface InteractableRect {\n left: number;\n top: number;\n width: number;\n height: number;\n angle?: number;\n}\n\nexport function interactableEvent({\n e,\n rect,\n deltaX,\n deltaY,\n}: {\n e: NativeEvent;\n rect: InteractableRect;\n deltaX?: number;\n deltaY?: number;\n}): InteractableEvent {\n return {\n rect,\n x: e.clientX,\n y: e.clientY,\n deltaX: deltaX ?? 0,\n deltaY: deltaY ?? 0,\n nativeEvent: e,\n };\n}\n","type InteractionName = null | 'resize' | 'rotate' | 'drag' | 'move';\n\nexport let activeInteraction: InteractionName = null;\n\nexport function setActiveInteraction(name: InteractionName) {\n activeInteraction = name;\n}\n","import {InteractableRect} from '../interactable-event';\n\nexport function domRectToObj(rect: DOMRect): InteractableRect {\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n };\n}\n","// use intersection observer instead of getBoundingClientRect for better performance as this will be called in onPointerMove event\nimport {InteractableRect} from '../interactable-event';\nimport {ConnectedMouseSelectable} from './mouse-selection/use-mouse-selectable';\nimport {DraggableId} from './use-draggable';\nimport {ConnectedDroppable} from './use-droppable';\n\nexport function updateRects(\n targets: Map<DraggableId, ConnectedDroppable | ConnectedMouseSelectable>\n) {\n const observer = new IntersectionObserver(entries => {\n entries.forEach(entry => {\n const {width, height, left, top} = entry.boundingClientRect;\n const [id, target] =\n [...targets].find(\n ([, target]) => target.ref.current === entry.target\n ) || [];\n if (id == null || target == null) return;\n\n const rect: InteractableRect = {\n width,\n height,\n left,\n top,\n };\n targets.set(id, {...target, rect});\n });\n observer.disconnect();\n });\n\n [...targets.values()].forEach(target => {\n if (target.ref.current) {\n observer.observe(target.ref.current);\n }\n });\n}\n","import React, {RefObject, useLayoutEffect, useRef} from 'react';\nimport {draggables, dragMonitors, dragSession, droppables} from './drag-state';\nimport {\n InteractableEvent,\n interactableEvent,\n InteractableRect,\n} from '../interactable-event';\nimport {activeInteraction, setActiveInteraction} from '../active-interaction';\nimport {domRectToObj} from '../utils/dom-rect-to-obj';\nimport {updateRects} from './update-rects';\nimport {useGlobalListeners} from '@react-aria/utils';\nimport {DragMonitor} from './use-drag-monitor';\nimport {NativeFileDraggable} from './use-droppable';\n\ninterface DragState {\n currentRect?: InteractableRect;\n lastPosition: {x: number; y: number};\n clickedEl?: HTMLElement;\n}\n\nexport type DragPreviewRenderer = (\n draggable: ConnectedDraggable,\n callback: (node: HTMLElement) => void\n) => void;\n\nexport type DraggableId = string | number | object;\n\nexport interface ConnectedDraggable<T = any> {\n type: string;\n id: DraggableId;\n getData: () => T;\n ref: RefObject<HTMLElement>;\n}\n\n// Either draggable from within the app, or file dragged in from the desktop\nexport type MixedDraggable = ConnectedDraggable | NativeFileDraggable;\n\ninterface UseDragProps extends ConnectedDraggable {\n disabled?: boolean;\n onDragStart?: (e: InteractableEvent, target: ConnectedDraggable) => void;\n onDragMove?: (e: InteractableEvent, target: ConnectedDraggable) => void;\n onDragEnd?: (e: InteractableEvent, target: ConnectedDraggable) => void;\n preview?: RefObject<DragPreviewRenderer>;\n hidePreview?: boolean;\n}\nexport function useDraggable({\n id,\n disabled,\n ref,\n preview,\n hidePreview,\n ...options\n}: UseDragProps) {\n const dragHandleRef = useRef<HTMLButtonElement>(null);\n const {addGlobalListener, removeAllGlobalListeners} = useGlobalListeners();\n\n const state = useRef<DragState>({\n lastPosition: {x: 0, y: 0},\n }).current;\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n useLayoutEffect(() => {\n if (!disabled) {\n draggables.set(id, {\n ...draggables.get(id),\n id,\n ref,\n type: optionsRef.current.type,\n getData: optionsRef.current.getData,\n });\n } else {\n draggables.delete(id);\n }\n return () => {\n draggables.delete(id);\n };\n }, [id, disabled, optionsRef, ref]);\n\n // notify monitors connected to the same drag type as this draggable\n const notifyMonitors = (callback: (m: DragMonitor) => void) => {\n dragMonitors.forEach(monitor => {\n if (monitor.type === draggables.get(id)?.type) {\n callback(monitor);\n }\n });\n };\n\n const onDragStart = (e: React.DragEvent<HTMLElement>) => {\n const draggable = draggables.get(id);\n const el = ref.current;\n const clickedOnHandle =\n !dragHandleRef.current ||\n !state.clickedEl ||\n dragHandleRef.current.contains(state.clickedEl);\n\n // if another interaction is in progress (rotate, resize, drag etc.), bail\n if (activeInteraction || !el || !draggable || !clickedOnHandle) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n updateRects(droppables);\n setActiveInteraction('drag');\n\n // hide default browser ghost image\n if (hidePreview) {\n hideNativeGhostImage(e);\n }\n // this will hide default browser cursor icon, if \"dropEffect\" is not set in dragOver/dragEnter\n e.dataTransfer.effectAllowed = 'move';\n\n state.lastPosition = {x: e.clientX, y: e.clientY};\n state.currentRect = domRectToObj(el.getBoundingClientRect());\n const ie = interactableEvent({rect: state.currentRect!, e});\n\n // If there is a preview option, use it to render a custom preview image that will\n // appear under the pointer while dragging. If not, the element itself is dragged by the browser.\n if (preview?.current) {\n preview.current(draggable, node => {\n e.dataTransfer.setDragImage(node, 0, 0);\n });\n }\n\n dragSession.status = 'dragging';\n dragSession.dragTargetId = id;\n if (ref.current) {\n ref.current.dataset.dragging = 'true';\n }\n\n optionsRef.current.onDragStart?.(ie, draggable);\n\n // wait until next frame so changes made in \"onDragStart\" are reflected in drag monitors\n requestAnimationFrame(() => {\n notifyMonitors(m => m.onDragStart?.(ie, draggable));\n });\n\n // firefox does not provide clientX/clientY in \"onDrag\", need to listen for dragOver on window instead\n addGlobalListener(window, 'dragover', onDragOver, true);\n };\n\n const onDragOver = (e: React.DragEvent<HTMLElement> | DragEvent) => {\n e.preventDefault();\n\n if (!state.currentRect) return;\n\n const deltaX = e.clientX - state.lastPosition.x;\n const deltaY = e.clientY - state.lastPosition.y;\n\n const newRect = {\n ...state.currentRect,\n left: state.currentRect.left + deltaX,\n top: state.currentRect.top + deltaY,\n };\n\n const ie = interactableEvent({rect: newRect, e, deltaX, deltaY});\n\n const target = draggables.get(id);\n if (target) {\n optionsRef.current.onDragMove?.(ie, target);\n notifyMonitors(m => m.onDragMove?.(ie, target));\n }\n\n state.lastPosition = {x: e.clientX, y: e.clientY};\n state.currentRect = newRect;\n };\n\n const onDragEnd = (e: React.DragEvent<HTMLElement>) => {\n removeAllGlobalListeners();\n if (!state.currentRect) return;\n\n setActiveInteraction(null);\n if (emptyImage) {\n emptyImage.remove();\n }\n\n const ie = interactableEvent({rect: state.currentRect, e});\n\n const draggable = draggables.get(id);\n if (draggable) {\n optionsRef.current.onDragEnd?.(ie, draggable);\n notifyMonitors(m => m.onDragEnd?.(ie, draggable, dragSession!.status));\n }\n\n // wait a frame before clearing so monitors have a chance to use drag session status\n requestAnimationFrame(() => {\n dragSession.dragTargetId = undefined;\n dragSession.status = 'inactive';\n if (ref.current) {\n delete ref.current.dataset.dragging;\n }\n });\n };\n\n const draggableProps = {\n draggable: !disabled,\n onDragStart,\n onDragEnd,\n onPointerDown: (e: React.PointerEvent) => {\n state.clickedEl = e.target as HTMLElement;\n },\n };\n\n return {draggableProps, dragHandleRef};\n}\n\nlet emptyImage: HTMLImageElement | undefined;\nfunction hideNativeGhostImage(e: React.DragEvent) {\n if (!emptyImage) {\n emptyImage = new Image();\n // image needs to be in the dom to prevent \"globe\" icon in chrome\n document.body.append(emptyImage);\n emptyImage.src =\n 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n }\n\n e.dataTransfer.setDragImage(emptyImage, 0, 0);\n}\n","import {UploadedFile} from '@common/uploads/uploaded-file';\n\nexport async function* readFilesFromDataTransfer(dataTransfer: DataTransfer) {\n const entries: FileSystemEntry[] = [];\n\n // Pull out all entries before reading them, otherwise\n // some entries will be lost due to recursion with promises\n for (const item of dataTransfer.items) {\n if (item.kind === 'file') {\n const entry = item.webkitGetAsEntry();\n if (entry) {\n entries.push(entry);\n }\n }\n }\n\n for (const entry of entries) {\n if (entry.isFile) {\n if (entry.name === '.DS_Store') continue;\n const file = await getEntryFile(entry as FileSystemFileEntry);\n yield new UploadedFile(file, entry.fullPath);\n } else if (entry.isDirectory) {\n yield* getEntriesFromDirectory(entry as FileSystemDirectoryEntry);\n }\n }\n}\n\nasync function* getEntriesFromDirectory(\n item: FileSystemDirectoryEntry\n): AsyncIterable<any> {\n const reader = item.createReader();\n\n // We must call readEntries repeatedly because there may be a limit to the\n // number of entries that are returned at once.\n let entries: FileSystemEntry[];\n do {\n entries = await new Promise((resolve, reject) => {\n reader.readEntries(resolve, reject);\n });\n\n for (const entry of entries) {\n if (entry.isFile) {\n if (entry.name === '.DS_Store') continue;\n const file = await getEntryFile(entry as FileSystemFileEntry);\n yield new UploadedFile(file, entry.fullPath);\n } else if (entry.isDirectory) {\n yield* getEntriesFromDirectory(entry as FileSystemDirectoryEntry);\n }\n }\n } while (entries.length > 0);\n}\n\nfunction getEntryFile(entry: FileSystemFileEntry): Promise<File> {\n return new Promise((resolve, reject) => entry.file(resolve, reject));\n}\n","export async function asyncIterableToArray<T>(\n iterator: AsyncIterable<T>\n): Promise<T[]> {\n const items: T[] = [];\n for await (const item of iterator) {\n items.push(item);\n }\n return items;\n}\n","import React, {RefObject, useLayoutEffect, useRef} from 'react';\nimport {draggables, dragSession, droppables} from './drag-state';\nimport {readFilesFromDataTransfer} from './read-files-from-data-transfer';\nimport {asyncIterableToArray} from '@common/utils/array/async-iterable-to-array';\nimport {InteractableRect} from '../interactable-event';\nimport {DraggableId, MixedDraggable} from './use-draggable';\nimport {UploadedFile} from '@common/uploads/uploaded-file';\n\nexport interface ConnectedDroppable {\n id: DraggableId;\n rect?: InteractableRect;\n disabled?: boolean;\n ref: RefObject<HTMLElement>;\n}\n\n// File dragged in from desktop\nexport interface NativeFileDraggable {\n type: 'nativeFile';\n el: null;\n ref: null;\n getData: () => Promise<UploadedFile[]>;\n}\n\ninterface UseDroppableProps<T extends HTMLElement> {\n id: DraggableId;\n disabled?: boolean;\n types: ('nativeFile' | string)[];\n ref: RefObject<T>;\n // this will fire dragEnter/dragLeave/dragOver events when same element is both draggable and drop target and dragging target over itself. Used for showing line previews before/after element during sort.\n allowDragEventsFromItself?: boolean;\n onDragEnter?: (target: MixedDraggable) => void;\n onDragLeave?: (target: MixedDraggable) => void;\n onDragOver?: (\n target: MixedDraggable,\n e: React.DragEvent<HTMLElement>\n ) => void;\n // Handler that is called after draggable is held over droppable for a period of time.\n // This typically opens the item so that the user can drop within it.\n onDropActivate?: (e: MixedDraggable) => void;\n onDrop?: (target: MixedDraggable) => void | Promise<void> | false;\n acceptsDrop?: (target: MixedDraggable) => boolean;\n}\n\ninterface DroppableState {\n dragOverElements: Set<Element>;\n dropActivateTimer: ReturnType<typeof setTimeout> | undefined;\n}\n\nconst DROP_ACTIVATE_TIMEOUT = 400;\n\nexport function useDroppable<T extends HTMLElement>({\n id,\n disabled,\n ref,\n ...options\n}: UseDroppableProps<T>) {\n const state = useRef<DroppableState>({\n dragOverElements: new Set<Element>(),\n dropActivateTimer: undefined,\n }).current;\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n useLayoutEffect(() => {\n droppables.set(id, {\n ...droppables.get(id),\n disabled,\n id,\n ref,\n });\n return () => {\n droppables.delete(id);\n };\n }, [id, optionsRef, disabled, ref]);\n\n // check if drop target accepts drag target\n const canDrop = (draggable: MixedDraggable): boolean => {\n const options = optionsRef.current;\n\n const allowEventsOnSelf =\n options.allowDragEventsFromItself ||\n ref.current !== draggable.ref?.current;\n\n return !!(\n draggable?.type &&\n allowEventsOnSelf &&\n options.types.includes(draggable.type) &&\n (!options.acceptsDrop || options.acceptsDrop(draggable))\n );\n };\n\n const fireDragLeave = (e: React.DragEvent<HTMLElement>) => {\n const draggable = getDraggable(e);\n if (draggable) {\n optionsRef.current.onDragLeave?.(draggable);\n }\n };\n\n const onDragEnter = (e: React.DragEvent<HTMLElement>) => {\n e.stopPropagation();\n\n state.dragOverElements.add(e.target as Element);\n if (state.dragOverElements.size > 1) {\n return;\n }\n\n const draggable = getDraggable(e);\n if (draggable && canDrop(draggable)) {\n optionsRef.current.onDragEnter?.(draggable);\n\n clearTimeout(state.dropActivateTimer);\n if (typeof optionsRef.current.onDropActivate === 'function') {\n state.dropActivateTimer = setTimeout(() => {\n if (draggable) {\n optionsRef.current.onDropActivate?.(draggable);\n }\n }, DROP_ACTIVATE_TIMEOUT);\n }\n }\n };\n\n const onDragLeave = (e: React.DragEvent<HTMLElement>) => {\n e.stopPropagation();\n\n // Track all the targets of dragenter events in a set, and remove them\n // in dragleave. When the set becomes empty, we've left the drop target completely.\n // We must also remove any elements that are no longer in the DOM, because dragleave\n // events will never be fired for these. This can happen, for example, with drop\n // indicators between items, which disappear when the drop target changes.\n state.dragOverElements.delete(e.target as Element);\n for (const element of state.dragOverElements) {\n if (!e.currentTarget.contains(element)) {\n state.dragOverElements.delete(element);\n }\n }\n\n if (state.dragOverElements.size > 0) {\n return;\n }\n\n const draggable = getDraggable(e);\n if (draggable && canDrop(draggable)) {\n fireDragLeave(e);\n clearTimeout(state.dropActivateTimer);\n }\n };\n\n const onDrop = async (e: React.DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n state.dragOverElements.clear();\n\n fireDragLeave(e);\n clearTimeout(state.dropActivateTimer);\n\n const draggable = getDraggable(e);\n if (draggable) {\n optionsRef.current.onDragLeave?.(draggable);\n\n // drop target does not accept this type of droppable\n if (!canDrop(draggable)) {\n if (dragSession.status !== 'inactive') {\n dragSession.status = 'dropFail';\n }\n // drop target accepts this type, but it might still reject the drop in callback\n } else {\n // allow callback to mark drop as failed\n const dropResult = optionsRef.current.onDrop?.(draggable);\n\n // drag session will only be active for draggables within the app, never for files dragged in from desktop\n if (dragSession.status !== 'inactive') {\n dragSession.status =\n dropResult === false ? 'dropFail' : 'dropSuccess';\n }\n }\n }\n };\n\n const droppableProps = {\n onDragOver: (e: React.DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n const draggable = getDraggable(e);\n if (draggable && canDrop(draggable)) {\n optionsRef.current.onDragOver?.(draggable, e);\n }\n },\n onDragEnter,\n onDragLeave,\n onDrop,\n };\n\n return {\n droppableProps: disabled ? {} : droppableProps,\n };\n}\n\nfunction getDraggable(\n e: React.DragEvent<HTMLElement>\n): MixedDraggable | undefined {\n if (dragSession.dragTargetId != null) {\n return draggables.get(dragSession.dragTargetId);\n } else if (e.dataTransfer.types.includes('Files')) {\n return {\n type: 'nativeFile',\n el: null,\n ref: null,\n getData: () => {\n return asyncIterableToArray(readFilesFromDataTransfer(e.dataTransfer));\n },\n };\n }\n}\n","import {clamp} from '../number/clamp';\n\nexport function moveItemInArray<T = any>(\n array: T[],\n fromIndex: number,\n toIndex: number\n): T[] {\n const from = clamp(fromIndex, 0, array.length - 1);\n const to = clamp(toIndex, 0, array.length - 1);\n\n if (from === to) {\n return array;\n }\n\n const target = array[from];\n const delta = to < from ? -1 : 1;\n\n for (let i = from; i !== to; i += delta) {\n array[i] = array[i + delta];\n }\n\n array[to] = target;\n\n return array;\n}\n","export function moveItemInNewArray<T>(\n array: T[],\n from: number,\n to: number\n): T[] {\n const newArray = array.slice();\n newArray.splice(\n to < 0 ? newArray.length + to : to,\n 0,\n newArray.splice(from, 1)[0]\n );\n\n return newArray;\n}\n","import {DraggableId, DragPreviewRenderer, useDraggable} from './use-draggable';\nimport {useDroppable} from './use-droppable';\nimport {RefObject, useEffect, useRef} from 'react';\nimport {getScrollParent, mergeProps} from '@react-aria/utils';\nimport {moveItemInArray} from '@common/utils/array/move-item-in-array';\nimport {droppables} from './drag-state';\nimport {moveItemInNewArray} from '@common/utils/array/move-item-in-new-array';\nimport {updateRects} from '@common/ui/interactions/dnd/update-rects';\n\nlet sortSession: null | {\n // items in this list will be moved when user is sorting\n sortables: DraggableId[];\n\n // sortable user started dragging to start this session\n activeSortable: DraggableId;\n activeIndex: number;\n\n // final index sortable was dropped in and should be moved to\n finalIndex: number;\n\n // drop position for displaying line preview\n dropPosition: DropPosition;\n // element that currently has a line preview at the top or bottom\n linePreviewEl?: HTMLElement;\n scrollParent?: Element;\n scrollListener: () => void;\n} = null;\n\nexport type DropPosition = 'before' | 'after' | null;\n\nexport interface UseSortableProps {\n item: DraggableId;\n items: DraggableId[];\n onSortStart?: () => void;\n onSortEnd?: (oldIndex: number, newIndex: number) => void;\n onDragEnd?: () => void;\n onDropPositionChange?: (dropPosition: DropPosition) => void;\n ref: RefObject<HTMLElement>;\n type: string;\n preview?: RefObject<DragPreviewRenderer>;\n previewVariant?: 'line' | 'liveSort';\n disabled?: boolean;\n}\nexport function useSortable({\n item,\n items,\n type,\n ref,\n onSortEnd,\n onSortStart,\n onDragEnd,\n preview,\n disabled,\n onDropPositionChange,\n previewVariant = 'liveSort',\n}: UseSortableProps) {\n const dropPosition = useRef<DropPosition>(null);\n\n // todo: issue with sorting after scrolling menu editor item list\n\n // update sortables and active index, in case we lazy load more items while sorting\n useEffect(() => {\n if (sortSession && sortSession.sortables.length !== items.length) {\n sortSession.sortables = [...items];\n sortSession.activeIndex = items.indexOf(item);\n }\n }, [items, item]);\n\n const {draggableProps, dragHandleRef} = useDraggable({\n id: item,\n ref,\n type,\n preview,\n disabled,\n onDragStart: () => {\n dropPosition.current = null;\n sortSession = {\n sortables: [...items],\n activeSortable: item,\n activeIndex: items.indexOf(item),\n finalIndex: items.indexOf(item),\n dropPosition: null,\n scrollParent: ref.current ? getScrollParent(ref.current) : undefined,\n scrollListener: () => {\n updateRects(droppables);\n },\n };\n\n if (previewVariant === 'liveSort') {\n addSortStyles();\n }\n onSortStart?.();\n sortSession.scrollParent?.addEventListener(\n 'scroll',\n sortSession.scrollListener\n );\n },\n onDragEnd: () => {\n if (!sortSession) return;\n\n if (previewVariant === 'liveSort') {\n removeSortStyles();\n }\n\n sortSession.dropPosition = null;\n onDropPositionChange?.(sortSession.dropPosition);\n if (sortSession.activeIndex !== sortSession.finalIndex) {\n onSortEnd?.(sortSession.activeIndex, sortSession.finalIndex);\n }\n sortSession.scrollParent?.removeEventListener(\n 'scroll',\n sortSession.scrollListener\n );\n clearLinePreview();\n // call \"onDragEnd\" after \"onSortEnd\", so listener has a chance to use sort session data\n onDragEnd?.();\n sortSession = null;\n },\n getData: () => {},\n });\n\n const {droppableProps} = useDroppable({\n id: item,\n ref,\n types: [type],\n disabled,\n allowDragEventsFromItself: true,\n onDragOver: (target, e) => {\n if (!sortSession || previewVariant !== 'line') {\n return;\n }\n\n const previousPosition = sortSession.dropPosition;\n let newPosition: DropPosition = null;\n\n const rect = droppables.get(item)?.rect;\n if (rect) {\n const midY = rect.top + rect.height / 2;\n if (e.clientY <= midY) {\n newPosition = 'before';\n } else if (e.clientY >= midY) {\n newPosition = 'after';\n }\n }\n\n if (newPosition !== previousPosition) {\n const overIndex = sortSession.sortables.indexOf(item);\n sortSession.dropPosition = newPosition;\n onDropPositionChange?.(sortSession.dropPosition);\n\n clearLinePreview();\n if (ref.current) {\n if (sortSession.dropPosition === 'after') {\n addLinePreview(ref.current, 'bottom');\n } else {\n // if it's the first row, add preview to the top border, as there's no previous element\n if (overIndex === 0) {\n addLinePreview(ref.current, 'top');\n // otherwise add preview to the bottom border of the previous row\n } else {\n const droppableId = sortSession.sortables[overIndex - 1];\n const droppable = droppables.get(droppableId);\n if (droppable?.ref.current) {\n addLinePreview(droppable.ref.current, 'bottom');\n }\n }\n }\n }\n\n const itemIndex = items.indexOf(item);\n\n // don't move item at all if hovering over itself\n if (sortSession.activeIndex === itemIndex) {\n sortSession.finalIndex = sortSession.activeIndex;\n return;\n }\n\n // adjust final drop index based on whether we're dropping drag target after or before it's original index\n // this is needed, so we get the same index if target is dropped after current item or before next item\n const dragDirection =\n overIndex > sortSession.activeIndex ? 'after' : 'before';\n if (dragDirection === 'after') {\n sortSession.finalIndex =\n sortSession.dropPosition === 'before' ? itemIndex - 1 : itemIndex;\n } else {\n sortSession.finalIndex =\n sortSession.dropPosition === 'after' ? itemIndex + 1 : itemIndex;\n }\n }\n },\n onDragEnter: () => {\n if (!sortSession || previewVariant === 'line') return;\n\n const overIndex = sortSession.sortables.indexOf(item);\n const oldIndex = sortSession.sortables.indexOf(\n sortSession.activeSortable\n );\n\n moveItemInArray(sortSession.sortables, oldIndex, overIndex);\n const rects = sortSession.sortables.map(s => droppables.get(s)?.rect);\n\n sortSession.sortables.forEach((sortable, index) => {\n if (!sortSession) return;\n\n const newRects = moveItemInNewArray(\n rects,\n overIndex,\n sortSession.activeIndex\n );\n const oldRect = rects[index];\n const newRect = newRects[index];\n const sortableTarget = droppables.get(sortable);\n\n if (sortableTarget?.ref.current && newRect && oldRect) {\n const x = newRect.left - oldRect.left;\n const y = newRect.top - oldRect.top;\n sortableTarget.ref.current.style.transform = `translate3d(${x}px, ${y}px, 0)`;\n }\n });\n\n sortSession.finalIndex = overIndex;\n },\n onDragLeave: () => {\n if (!sortSession || previewVariant !== 'line') {\n return;\n }\n sortSession.dropPosition = null;\n onDropPositionChange?.(sortSession.dropPosition);\n },\n });\n\n return {\n sortableProps: {...mergeProps(draggableProps, droppableProps)},\n dragHandleRef,\n };\n}\n\nconst transition = 'transform 0.2s cubic-bezier(0.2, 0, 0, 1)';\n\nfunction addSortStyles() {\n if (!sortSession) return;\n sortSession.sortables.forEach((sortable, index) => {\n const droppable = droppables.get(sortable);\n if (!droppable?.ref.current) return;\n\n droppable.ref.current.style.transition = transition;\n\n if (sortSession?.activeIndex === index) {\n droppable.ref.current.style.opacity = '0.4';\n }\n });\n}\n\n// clear any styles and transforms applied to sortables during sorting\nfunction removeSortStyles() {\n if (!sortSession) return;\n sortSession.sortables.forEach(sortable => {\n const droppable = droppables.get(sortable);\n if (droppable?.ref.current) {\n droppable.ref.current.style.transform = '';\n droppable.ref.current.style.transition = '';\n droppable.ref.current.style.opacity = '';\n droppable.ref.current.style.zIndex = '';\n }\n });\n}\n\nfunction clearLinePreview() {\n if (sortSession?.linePreviewEl) {\n sortSession.linePreviewEl.style.borderBottomColor = '';\n sortSession.linePreviewEl.style.borderTopColor = '';\n sortSession.linePreviewEl = undefined;\n }\n}\n\nfunction addLinePreview(el: HTMLElement, side: 'top' | 'bottom') {\n const color = 'rgb(var(--be-primary))';\n if (side === 'top') {\n el.style.borderTopColor = color;\n } else {\n el.style.borderBottomColor = color;\n }\n if (sortSession) {\n sortSession.linePreviewEl = el;\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","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 {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 {createSvgIcon} from '../create-svg-icon';\n\nexport const TuneIcon = createSvgIcon(\n <path d=\"M3 17v2h6v-2H3zM3 5v2h10V5H3zm10 16v-2h8v-2h-8v-2h-2v6h2zM7 9v2H3v2h4v2h2V9H7zm14 4v-2H11v2h10zm-6-4h2V7h4V5h-4V3h-2v6z\" />\n, 'TuneOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const MoreVertIcon = createSvgIcon(\n <path d=\"M12 8c1.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, 'MoreVertOutlined');\n","import React, {RefObject} from 'react';\n\nexport interface TabsContext {\n selectedTab: number;\n setSelectedTab: (newTab: number) => void;\n tabsRef: RefObject<HTMLElement[]>;\n size: 'sm' | 'md';\n isLazy?: boolean;\n id: string;\n}\n\nexport const TabContext = React.createContext<TabsContext>(null!);\n","import React, {ReactElement, useId, useMemo, useRef} from 'react';\nimport clsx from 'clsx';\nimport {useControlledState} from '@react-stately/utils';\nimport {TabContext, TabsContext} from './tabs-context';\nimport {TabListProps} from './tab-list';\nimport {TabPanelsProps} from './tab-panels';\n\nexport interface TabsProps {\n children: [ReactElement<TabListProps>, ReactElement<TabPanelsProps>];\n size?: 'sm' | 'md';\n className?: string;\n selectedTab?: number;\n defaultSelectedTab?: number;\n onTabChange?: (newTab: number) => void;\n isLazy?: boolean;\n overflow?: string;\n}\n\nexport function Tabs(props: TabsProps) {\n const {\n size = 'md',\n children,\n className,\n isLazy,\n overflow = 'overflow-hidden',\n } = props;\n\n const tabsRef = useRef<HTMLButtonElement[]>([]);\n const id = useId();\n\n const [selectedTab, setSelectedTab] = useControlledState(\n props.selectedTab,\n props.defaultSelectedTab || 0,\n props.onTabChange\n );\n\n const ContextValue: TabsContext = useMemo(() => {\n return {\n selectedTab,\n setSelectedTab,\n tabsRef,\n size,\n isLazy,\n id,\n };\n }, [selectedTab, id, isLazy, setSelectedTab, size]);\n\n return (\n <TabContext.Provider value={ContextValue}>\n <div className={clsx(className, overflow, 'max-w-full')}>{children}</div>\n </TabContext.Provider>\n );\n}\n","import React, {useContext, useState} from 'react';\nimport {useLayoutEffect} from '@react-aria/utils';\nimport clsx from 'clsx';\nimport {TabContext} from './tabs-context';\n\ninterface TabLineStyle {\n width?: string;\n transform?: string;\n className?: string;\n}\n\nexport function TabLine() {\n const {tabsRef, selectedTab} = useContext(TabContext);\n const [style, setStyle] = useState<TabLineStyle>({\n width: undefined,\n transform: undefined,\n className: undefined,\n });\n\n useLayoutEffect(() => {\n if (selectedTab != null && tabsRef.current) {\n const el = tabsRef.current[selectedTab];\n if (!el) return;\n\n setStyle(prevState => {\n return {\n width: `${el.offsetWidth}px`,\n transform: `translateX(${el.offsetLeft}px)`,\n // disable initial transition for tabline\n className: prevState.width === undefined ? '' : 'transition-all',\n };\n });\n }\n }, [setStyle, selectedTab, tabsRef]);\n\n return (\n <div\n className={clsx(\n 'absolute bottom-0 left-0 h-2 bg-primary',\n style.className\n )}\n role=\"presentation\"\n style={{width: style.width, transform: style.transform}}\n />\n );\n}\n","import React, {Children, cloneElement, isValidElement, ReactNode} from 'react';\nimport clsx from 'clsx';\nimport {FocusScope} from '@react-aria/focus';\nimport {TabProps} from './tab';\nimport {TabLine} from './tab-line';\n\nexport interface TabListProps {\n children: ReactNode;\n // center tabs within tablist\n center?: boolean;\n // expand tabs to fill in tablist space fully. By default, tabs are only as wide as their content.\n expand?: boolean;\n className?: string;\n}\nexport function TabList({children, center, expand, className}: TabListProps) {\n const childrenArray = Children.toArray(children);\n\n return (\n <FocusScope>\n <div\n className={clsx(\n // hide scrollbar completely on mobile, show compact one on desktop\n 'flex relative max-w-full overflow-auto border-b max-sm:hidden-scrollbar md:compact-scrollbar',\n className\n )}\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n >\n {childrenArray.map((child, index) => {\n if (isValidElement<TabProps>(child)) {\n return cloneElement<TabProps>(child, {\n index,\n className: clsx(\n child.props.className,\n expand && 'flex-auto',\n center && index === 0 && 'ml-auto',\n center && index === childrenArray.length - 1 && 'mr-auto'\n ),\n });\n }\n return null;\n })}\n <TabLine />\n </div>\n </FocusScope>\n );\n}\n","import React, {JSXElementConstructor, ReactNode, useContext} from 'react';\nimport clsx from 'clsx';\nimport {useFocusManager} from '@react-aria/focus';\nimport {TabContext} from './tabs-context';\nimport {LinkProps} from 'react-router-dom';\n\nexport interface TabProps {\n className?: string;\n index?: number;\n children: ReactNode;\n isDisabled?: boolean;\n padding?: string;\n elementType?: 'button' | 'a' | JSXElementConstructor<any>;\n to?: LinkProps['to'];\n relative?: LinkProps['relative'];\n replace?: LinkProps['replace'];\n width?: string;\n}\nexport function Tab({\n index,\n className,\n isDisabled,\n children,\n padding: paddingProp,\n elementType = 'button',\n to,\n relative,\n width = 'min-w-min',\n}: TabProps) {\n const {\n selectedTab,\n setSelectedTab,\n tabsRef,\n size = 'md',\n id,\n } = useContext(TabContext);\n const isSelected = index === selectedTab;\n const focusManager = useFocusManager();\n const padding = paddingProp || (size === 'sm' ? 'px-12' : 'px-18');\n\n const mergedClassname = clsx(\n 'tracking-wide overflow-hidden capitalize text-sm flex items-center justify-center outline-none transition-colors',\n 'focus-visible:ring focus-visible:ring-2 ring-inset rounded whitespace-nowrap cursor-pointer',\n width,\n textColor({isDisabled, isSelected}),\n className,\n size === 'md' && `${padding} h-48`,\n size === 'sm' && `${padding} h-32`,\n isDisabled && 'pointer-events-none',\n );\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n switch (e.key) {\n case 'ArrowLeft':\n focusManager?.focusPrevious();\n break;\n case 'ArrowRight':\n focusManager?.focusNext();\n break;\n case 'Home':\n focusManager?.focusFirst();\n break;\n case 'End':\n focusManager?.focusLast();\n break;\n }\n };\n\n const tabIndex = isSelected ? 0 : -1;\n const Element = elementType;\n\n return (\n <Element\n disabled={isDisabled}\n id={`${id}-${index}-tab`}\n aria-controls={`${id}-${index}-tabpanel`}\n type=\"button\"\n role=\"tab\"\n aria-selected={isSelected}\n tabIndex={isDisabled ? undefined : tabIndex}\n onKeyDown={onKeyDown}\n onClick={() => {\n setSelectedTab(index!);\n }}\n to={to}\n relative={relative}\n className={mergedClassname}\n ref={(el: HTMLElement) => {\n if (tabsRef.current && el) {\n tabsRef.current[index!] = el;\n }\n }}\n >\n {children}\n </Element>\n );\n}\n\ninterface TextColorProps {\n isDisabled?: boolean;\n isSelected: boolean;\n}\nfunction textColor({isDisabled, isSelected}: TextColorProps): string {\n if (isDisabled) {\n return 'text-disabled cursor-default';\n }\n if (isSelected) {\n return 'text-primary';\n }\n return 'text-muted hover:text-main';\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 {ReactNode} from 'react';\nimport clsx from 'clsx';\n\ninterface SectionHelperProps {\n title?: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n color?: 'positive' | 'danger' | 'warning' | 'primary' | 'neutral';\n className?: string;\n}\nexport function SectionHelper({\n title,\n description,\n actions,\n color = 'primary',\n className,\n}: SectionHelperProps) {\n return (\n <div\n className={clsx(\n className,\n 'p-10 rounded',\n color === 'positive' &&\n 'bg-positive/focus border-l-positive border-l-4',\n color === 'warning' && 'bg-warning/focus border-l-warning border-l-4',\n color === 'danger' && 'bg-danger/focus border-l-danger border-l-4',\n color === 'primary' && 'bg-primary/focus border-l-primary border-l-4',\n color === 'neutral' && 'bg-paper border'\n )}\n >\n {title && <div className=\"text-sm mb-4 font-medium\">{title}</div>}\n {description && <div className=\"text-sm\">{description}</div>}\n {actions && <div className=\"mt-14\">{actions}</div>}\n </div>\n );\n}\n","import {useCallback, useRef, useState} from 'react';\n\nexport function useStickySentinel() {\n const [isSticky, setIsSticky] = useState(false);\n\n const observerRef = useRef<IntersectionObserver>();\n\n const sentinelRef = useCallback((sentinel: HTMLDivElement | null) => {\n if (sentinel) {\n const observer = new IntersectionObserver(\n ([e]) => setIsSticky(e.intersectionRatio < 1),\n {threshold: [1]}\n );\n observerRef.current = observer;\n observer.observe(sentinel);\n } else if (observerRef.current) {\n observerRef.current?.disconnect();\n }\n }, []);\n\n return {isSticky, sentinelRef};\n}\n","import slugify from 'slugify';\n\nexport function slugifyString(\n text: string,\n replacement = '-',\n strict = false\n): string {\n if (!text) return text;\n let slugified = slugify(text, {\n lower: true,\n replacement,\n strict,\n remove: /[*+~.()'\"!:@?\\|/\\\\]/g,\n });\n // some chinese text might not get slugified properly,\n // just replace whitespace with dash in that case\n if (!slugified) {\n slugified = text.replace(/\\s+/g, '-').toLowerCase();\n }\n return slugified;\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const UnfoldMoreIcon = createSvgIcon(\n <path d=\"M12 5.83 15.17 9l1.41-1.41L12 3 7.41 7.59 8.83 9 12 5.83zm0 12.34L8.83 15l-1.41 1.41L12 21l4.59-4.59L15.17 15 12 18.17z\" />\n, 'UnfoldMoreOutlined');\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {toast} from '../../ui/toast/toast';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {Workspace} from '../types/workspace';\nimport {onFormQueryError} from '../../errors/on-form-query-error';\nimport {message} from '../../i18n/message';\n\ninterface Response extends BackendResponse {\n workspace: Workspace;\n}\n\ninterface Props {\n name: string;\n}\n\nexport function useCreateWorkspace(form: UseFormReturn<Props>) {\n return useMutation({\n mutationFn: (props: Props) => createWorkspace(props),\n onSuccess: () => {\n toast(message('Created workspace'));\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.fetchUserWorkspaces,\n });\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction createWorkspace(props: Props): Promise<Response> {\n return apiClient.post('workspace', props).then(r => r.data);\n}\n","import {useForm} from 'react-hook-form';\nimport {FormTextField} from '../ui/forms/input-field/text-field/text-field';\nimport {Form} from '../ui/forms/form';\nimport {Button} from '../ui/buttons/button';\nimport {useCreateWorkspace} from './requests/create-workspace';\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';\n\nexport function NewWorkspaceDialog() {\n const form = useForm<{name: string}>();\n const {formId, close} = useDialogContext();\n const createWorkspace = useCreateWorkspace(form);\n\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Create workspace\" />\n </DialogHeader>\n <DialogBody>\n <Form\n form={form}\n id={formId}\n onSubmit={() => {\n createWorkspace.mutate(form.getValues(), {\n onSuccess: response => {\n close(response.workspace.id);\n },\n });\n }}\n >\n <FormTextField\n name=\"name\"\n autoFocus\n label={<Trans message=\"Workspace name\" />}\n minLength={3}\n required\n />\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button variant=\"text\" onClick={close}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n form={formId}\n disabled={createWorkspace.isPending}\n >\n <Trans message=\"Create\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {Workspace} from '../types/workspace';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {apiClient} from '../../http/query-client';\n\nexport interface FetchWorkspaceWithMembersResponse extends BackendResponse {\n workspace: Workspace;\n}\n\nfunction fetchWorkspaceWithMembers(\n workspaceId: number,\n): Promise<FetchWorkspaceWithMembersResponse> {\n return apiClient\n .get(`workspace/${workspaceId}`)\n .then(response => response.data);\n}\n\nexport function useWorkspaceWithMembers(workspaceId: number) {\n return useQuery({\n queryKey: WorkspaceQueryKeys.workspaceWithMembers(workspaceId),\n queryFn: () => fetchWorkspaceWithMembers(workspaceId),\n });\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const GroupIcon = createSvgIcon(\n <path d=\"M9 13.75c-2.34 0-7 1.17-7 3.5V19h14v-1.75c0-2.33-4.66-3.5-7-3.5zM4.34 17c.84-.58 2.87-1.25 4.66-1.25s3.82.67 4.66 1.25H4.34zM9 12c1.93 0 3.5-1.57 3.5-3.5S10.93 5 9 5 5.5 6.57 5.5 8.5 7.07 12 9 12zm0-5c.83 0 1.5.67 1.5 1.5S9.83 10 9 10s-1.5-.67-1.5-1.5S8.17 7 9 7zm7.04 6.81c1.16.84 1.96 1.96 1.96 3.44V19h4v-1.75c0-2.02-3.5-3.17-5.96-3.44zM15 12c1.93 0 3.5-1.57 3.5-3.5S16.93 5 15 5c-.54 0-1.04.13-1.5.35.63.89 1 1.98 1 3.15s-.37 2.26-1 3.15c.46.22.96.35 1.5.35z\" />\n, 'GroupOutlined');\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {WorkspaceInvite} from '../types/workspace-invite';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n invites: WorkspaceInvite[];\n}\n\ninterface Props {\n workspaceId: number;\n emails: string[];\n roleId: number;\n}\n\nfunction InviteMembers({workspaceId, ...other}: Props): Promise<Response> {\n return apiClient\n .post(`workspace/${workspaceId}/invite`, other)\n .then(r => r.data);\n}\n\nexport function useInviteMembers() {\n return useMutation({\n mutationFn: (props: Props) => InviteMembers(props),\n onSuccess: (response, props) => {\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.workspaceWithMembers(props.workspaceId),\n });\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {WorkspaceInvite} from '../types/workspace-invite';\nimport {toast} from '../../ui/toast/toast';\nimport {apiClient} from '../../http/query-client';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n invite: WorkspaceInvite;\n}\n\ninterface Props {\n workspaceId: number;\n inviteId: string;\n}\n\nfunction ResendInvite({\n workspaceId,\n inviteId,\n ...other\n}: Props): Promise<Response> {\n return apiClient\n .post(`workspace/${workspaceId}/${inviteId}/resend`, other)\n .then(r => r.data);\n}\n\nexport function useResendInvite() {\n return useMutation({\n mutationFn: (props: Props) => ResendInvite(props),\n onSuccess: () => {\n toast('Invite sent');\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n","const matcher =\n /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n\nexport function isEmail(string?: string): boolean {\n if (!string) return false;\n if (string.length > 320) return false;\n return matcher.test(string);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {toast} from '../../ui/toast/toast';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {WorkspaceMember} from '../types/workspace-member';\nimport {WorkspaceInvite} from '../types/workspace-invite';\nimport {message} from '../../i18n/message';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\ninterface Props {\n workspaceId: number;\n member: WorkspaceMember | WorkspaceInvite;\n roleId: number;\n}\n\nfunction ChangeRole({workspaceId, member, ...other}: Props): Promise<Response> {\n const modelType = member.model_type;\n const memberId =\n member.model_type === 'invite' ? member.id : member.member_id;\n return apiClient\n .post(\n `workspace/${workspaceId}/${modelType}/${memberId}/change-role`,\n other,\n )\n .then(r => r.data);\n}\n\nexport function useChangeRole() {\n return useMutation({\n mutationFn: (props: Props) => ChangeRole(props),\n onSuccess: (response, props) => {\n toast(message('Role changed'));\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.workspaceWithMembers(props.workspaceId),\n });\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {useAuth} from '../../auth/use-auth';\nimport {useActiveWorkspaceId} from '../active-workspace-id-context';\nimport {PersonalWorkspace} from '../user-workspaces';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\ninterface Props {\n workspaceId: number;\n memberId: number | string;\n memberType: 'invite' | 'member';\n}\n\nfunction removeMember({\n workspaceId,\n memberId,\n memberType,\n}: Props): Promise<Response> {\n const endpoint =\n memberType === 'invite'\n ? `workspace/invite/${memberId}`\n : `workspace/${workspaceId}/member/${memberId}`;\n return apiClient.delete(endpoint).then(r => r.data);\n}\n\nexport function useRemoveMember() {\n const {workspaceId, setWorkspaceId} = useActiveWorkspaceId();\n const {user} = useAuth();\n return useMutation({\n mutationFn: (props: Props) => removeMember(props),\n onSuccess: (response, props) => {\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.fetchUserWorkspaces,\n });\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.workspaceWithMembers(props.workspaceId),\n });\n\n // if user left workspace that is currently active, switch to personal workspace\n if (props.memberId === user?.id && workspaceId === props.workspaceId) {\n setWorkspaceId(PersonalWorkspace.id);\n }\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n","import {ConfirmationDialog} from '../ui/overlays/dialog/confirmation-dialog';\nimport {Trans} from '../i18n/trans';\n\ninterface Props {\n onConfirm?: () => void;\n isLoading?: boolean;\n}\nexport function LeaveWorkspaceConfirmation({onConfirm, isLoading}: Props) {\n return (\n <ConfirmationDialog\n isDanger\n title={<Trans message=\"Leave workspace\" />}\n isLoading={isLoading}\n onConfirm={onConfirm}\n body={\n <div>\n <Trans message=\"Are you sure you want to leave this workspace?\" />\n <div className=\"mt-8 font-semibold\">\n <Trans message=\"All resources you've created in the workspace will be transferred to workspace owner.\" />\n </div>\n </div>\n }\n confirm={<Trans message=\"Leave\" />}\n />\n );\n}\n","import {useEffect, useState} from 'react';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {useWorkspaceWithMembers} from './requests/workspace-with-members';\nimport {ProgressCircle} from '../ui/progress/progress-circle';\nimport {Workspace} from './types/workspace';\nimport {GroupIcon} from '../icons/material/Group';\nimport {WorkspaceMember} from './types/workspace-member';\nimport {useAuth} from '../auth/use-auth';\nimport {\n ChipField,\n ChipValue,\n} from '../ui/forms/input-field/chip-field/chip-field';\nimport {useValueLists} from '../http/value-lists';\nimport {Button} from '../ui/buttons/button';\nimport {ArrowDropDownIcon} from '../icons/material/ArrowDropDown';\nimport {useInviteMembers} from './requests/invite-members';\nimport {WorkspaceInvite} from './types/workspace-invite';\nimport {ConfirmationDialog} from '../ui/overlays/dialog/confirmation-dialog';\nimport {useResendInvite} from './requests/resend-invite';\nimport {isEmail} from '../utils/string/is-email';\nimport {ButtonSize} from '../ui/buttons/button-size';\nimport {useChangeRole} from './requests/change-role';\nimport {IconButton} from '../ui/buttons/icon-button';\nimport {useRemoveMember} from './requests/remove-member';\nimport {CloseIcon} from '../icons/material/Close';\nimport {ExitToAppIcon} from '../icons/material/ExitToApp';\nimport {toast} from '../ui/toast/toast';\nimport {DialogTrigger} from '../ui/overlays/dialog/dialog-trigger';\nimport {Menu, MenuItem, MenuTrigger} from '../ui/navigation/menu/menu-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';\nimport {useTrans} from '../i18n/use-trans';\nimport {message} from '../i18n/message';\nimport {LeaveWorkspaceConfirmation} from './leave-workspace-confirmation';\n\ninterface WorkspaceMembersDialogProps {\n workspace: Workspace;\n}\nexport function WorkspaceMembersDialog({\n workspace,\n}: WorkspaceMembersDialogProps) {\n const {data, isLoading} = useWorkspaceWithMembers(workspace.id);\n return (\n <Dialog size=\"lg\">\n <DialogHeader>\n <Trans message=\"Manage workspace members\" />\n </DialogHeader>\n <DialogBody>\n {isLoading ? (\n <div className=\"flex items-center justify-center min-h-[238px]\">\n <ProgressCircle isIndeterminate aria-label=\"Loading workspace...\" />\n </div>\n ) : (\n <Manager workspace={data!.workspace} />\n )}\n </DialogBody>\n </Dialog>\n );\n}\n\ninterface ManagerProps {\n workspace: Workspace;\n}\nfunction Manager({workspace}: ManagerProps) {\n const can = usePermissions(workspace);\n const members: (WorkspaceMember | WorkspaceInvite)[] = [\n ...(workspace.members || []),\n ...(workspace.invites || []),\n ];\n\n return (\n <div>\n {can.invite && <InviteChipField workspace={workspace} />}\n <div className=\"flex items-center gap-10 mb-14 text-base\">\n <GroupIcon className=\"icon-sm\" />\n <Trans\n message=\"Members of `:workspace`\"\n values={{workspace: workspace.name}}\n />\n </div>\n <AnimatePresence initial={false}>\n {members.map(member => (\n <MemberListItem\n key={`${member.model_type}.${member.id}`}\n workspace={workspace}\n member={member}\n />\n ))}\n </AnimatePresence>\n </div>\n );\n}\n\ninterface MemberListItemProps {\n member: WorkspaceMember | WorkspaceInvite;\n workspace: Workspace;\n}\nfunction MemberListItem({workspace, member}: MemberListItemProps) {\n return (\n <m.div\n initial={{x: '-100%', opacity: 0}}\n animate={{x: 0, opacity: 1}}\n exit={{x: '100%', opacity: 0}}\n transition={{type: 'tween', duration: 0.125}}\n className=\"flex items-start text-sm gap-14 mb-20\"\n key={`${member.model_type}.${member.id}`}\n >\n <img\n className=\"w-36 h-36 rounded flex-shrink-0\"\n src={member.avatar}\n alt=\"\"\n />\n <div className=\"md:flex flex-auto items-center justify-between gap-14 min-w-0\">\n <div className=\"overflow-hidden mb-10 md:mb-0 md:mr-10\">\n <div className=\"flex items-center justify-start gap-6\">\n <div className=\"overflow-hidden text-ellipsis whitespace-nowrap\">\n {member.display_name}\n </div>\n <MemberDisplayNameAppend workspace={workspace} member={member} />\n </div>\n <div className=\"text-muted\">{member.email}</div>\n </div>\n <MemberActions workspace={workspace} member={member} />\n </div>\n </m.div>\n );\n}\n\nfunction usePermissions(workspace: Workspace) {\n const {user: authUser} = useAuth();\n const response = {update: false, invite: false, delete: false};\n const permissions = ['update', 'invite', 'delete'] as const;\n const authMember = workspace.members?.find(mb => mb.id === authUser?.id);\n\n if (authMember) {\n permissions.forEach(permission => {\n response[permission] =\n authMember.is_owner ||\n !!authMember.permissions?.find(\n p => p.name === `workspace_members.${permission}`,\n );\n });\n }\n\n return response;\n}\n\ninterface MemberActionsProps {\n workspace: Workspace;\n member: WorkspaceMember | WorkspaceInvite;\n}\nfunction MemberActions({workspace, member}: MemberActionsProps) {\n const [selectedRole, setSelectedRole] = useState<number>(member.role_id);\n const changeRole = useChangeRole();\n const {user} = useAuth();\n\n const can = usePermissions(workspace);\n const isOwner = member.model_type === 'member' && member.is_owner;\n const isCurrentUser =\n member.model_type === 'member' && user?.id === member.id;\n\n const roleSelector =\n !can.update || isOwner || isCurrentUser ? (\n <div className=\"text-muted ml-auto first:capitalize\">\n <Trans message={member.role_name} />\n </div>\n ) : (\n <RoleMenuTrigger\n className=\"ml-auto flex-shrink-0\"\n size=\"xs\"\n value={selectedRole}\n isDisabled={changeRole.isPending}\n onChange={roleId => {\n setSelectedRole(roleId);\n changeRole.mutate({\n roleId,\n workspaceId: workspace.id,\n member,\n });\n }}\n />\n );\n\n return (\n <>\n {roleSelector}\n {!isOwner && (isCurrentUser || can.delete) && (\n <RemoveMemberButton\n type={isCurrentUser ? 'leave' : 'remove'}\n member={member}\n workspace={workspace}\n />\n )}\n </>\n );\n}\n\ninterface InviteChipFieldProps {\n workspace: Workspace;\n}\nfunction InviteChipField({workspace}: InviteChipFieldProps) {\n const {trans} = useTrans();\n const [chips, setChips] = useState<ChipValue[]>([]);\n const allEmailsValid = chips.every(chip => !chip.invalid);\n const displayWith = (chip: ChipValue) => chip.description || chip.name;\n const [selectedRole, setSelectedRole] = useState<number>();\n const inviteMembers = useInviteMembers();\n const {data} = useValueLists(['workspaceRoles']);\n\n useEffect(() => {\n if (!selectedRole && data?.workspaceRoles?.length) {\n setSelectedRole(data.workspaceRoles[0].id);\n }\n }, [data, selectedRole]);\n\n return (\n <div className=\"mb-30\">\n <ChipField\n value={chips}\n onChange={setChips}\n displayWith={displayWith}\n validateWith={chip => {\n const invalid = !isEmail(chip.description);\n return {\n ...chip,\n invalid,\n errorMessage: invalid\n ? trans({message: 'Not a valid email'})\n : undefined,\n };\n }}\n placeholder={trans({message: 'Enter email addresses'})}\n label={<Trans message=\"Invite people\" />}\n />\n <div className=\"flex items-center gap-14 justify-between mt-14\">\n <RoleMenuTrigger onChange={setSelectedRole} value={selectedRole} />\n {chips.length && selectedRole ? (\n <Button\n variant=\"flat\"\n color=\"primary\"\n size=\"sm\"\n disabled={inviteMembers.isPending || !allEmailsValid}\n onClick={() => {\n inviteMembers.mutate(\n {\n emails: chips.map(c => displayWith(c)),\n roleId: selectedRole,\n workspaceId: workspace.id,\n },\n {\n onSuccess: () => {\n setChips([]);\n },\n },\n );\n }}\n >\n <Trans message=\"Invite\" />\n </Button>\n ) : null}\n </div>\n </div>\n );\n}\n\ninterface RemoveMemberButtonProps {\n member: WorkspaceMember | WorkspaceInvite;\n workspace: Workspace;\n type: 'leave' | 'remove';\n}\nfunction RemoveMemberButton({\n member,\n workspace,\n type,\n}: RemoveMemberButtonProps) {\n const removeMember = useRemoveMember();\n const {close} = useDialogContext();\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={isConfirmed => {\n if (isConfirmed) {\n removeMember.mutate({\n workspaceId: workspace.id,\n memberId: member.id,\n memberType: member.model_type,\n });\n if (type === 'leave') {\n close();\n toast(message('Left workspace'));\n }\n }\n }}\n >\n <IconButton\n size=\"md\"\n className=\"text-muted flex-shrink-0\"\n disabled={removeMember.isPending}\n >\n {type === 'leave' ? <ExitToAppIcon /> : <CloseIcon />}\n </IconButton>\n {type === 'leave' ? (\n <LeaveWorkspaceConfirmation />\n ) : (\n <RemoveMemberConfirmation member={member} />\n )}\n </DialogTrigger>\n );\n}\n\ninterface RemoveMemberConfirmationProps {\n member: WorkspaceMember | WorkspaceInvite;\n}\nfunction RemoveMemberConfirmation({member}: RemoveMemberConfirmationProps) {\n return (\n <ConfirmationDialog\n isDanger\n title={<Trans message=\"Remove member\" />}\n body={\n <div>\n <Trans\n message=\"Are you sure you want to remove `:name`?\"\n values={{name: member.display_name}}\n />\n <div className=\"font-semibold mt-8\">\n <Trans\n message=\"All workspace resources created by `:name` will be transferred to workspace owner.\"\n values={{\n name: member.display_name,\n }}\n />\n </div>\n </div>\n }\n confirm={<Trans message=\"Remove\" />}\n />\n );\n}\n\ninterface RoleMenuTriggerProps {\n onChange: (value: number) => void;\n value?: number;\n size?: ButtonSize;\n className?: string;\n isDisabled?: boolean;\n}\nfunction RoleMenuTrigger({\n value,\n onChange,\n size = 'xs',\n className,\n isDisabled,\n}: RoleMenuTriggerProps) {\n const {data} = useValueLists(['workspaceRoles']);\n const role = data?.workspaceRoles?.find(r => r.id === value);\n if (!value || !role || !data?.workspaceRoles) return null;\n\n return (\n <MenuTrigger\n selectionMode=\"single\"\n selectedValue={value}\n onSelectionChange={newValue => {\n onChange(newValue as number);\n }}\n >\n <Button\n className={className}\n size={size}\n variant=\"flat\"\n color=\"chip\"\n disabled={isDisabled}\n endIcon={<ArrowDropDownIcon />}\n >\n <Trans message={role.name} />\n </Button>\n <Menu>\n {data.workspaceRoles.map(r => (\n <MenuItem value={r.id} key={r.id} description={r.description}>\n <Trans message={r.name} />\n </MenuItem>\n ))}\n </Menu>\n </MenuTrigger>\n );\n}\n\ninterface MemberDisplayNameAppendProps {\n member: WorkspaceMember | WorkspaceInvite;\n workspace: Workspace;\n}\nfunction MemberDisplayNameAppend({\n member,\n workspace,\n}: MemberDisplayNameAppendProps) {\n const {user} = useAuth();\n const can = usePermissions(workspace);\n\n if (user?.id === member.id) {\n return (\n <div className=\"font-medium\">\n (<Trans message=\"You\" />)\n </div>\n );\n }\n if (member.model_type === 'invite') {\n return (\n <div className=\"flex items-center gap-4\">\n <div>·</div>\n <div className=\"font-medium\">\n <Trans message=\"Invited\" />\n </div>\n {can.invite ? (\n <>\n <div>·</div>\n <ResendInviteDialogTrigger member={member} workspace={workspace} />\n </>\n ) : null}\n </div>\n );\n }\n return null;\n}\n\nfunction ResendInviteDialogTrigger({\n member,\n workspace,\n}: MemberDisplayNameAppendProps) {\n const resendInvite = useResendInvite();\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={isConfirmed => {\n if (isConfirmed) {\n resendInvite.mutate({\n workspaceId: workspace.id,\n inviteId: member.id as string,\n });\n }\n }}\n >\n <Button\n variant=\"link\"\n size=\"sm\"\n color=\"primary\"\n disabled={resendInvite.isPending}\n >\n <Trans message=\"Resend invite\" />\n </Button>\n <ConfirmationDialog\n title={<Trans message=\"Resend invite\" />}\n body={\n <Trans message=\"Are you sure you want to send this invite again?\" />\n }\n confirm={<Trans message=\"Send\" />}\n />\n </DialogTrigger>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PersonAddIcon = createSvgIcon(\n <path d=\"M15 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0-6c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm0 8c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4zm-6 4c.22-.72 3.31-2 6-2 2.7 0 5.8 1.29 6 2H9zm-3-3v-3h3v-2H6V7H4v3H1v2h3v3z\" />\n, 'PersonAddOutlined');\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {toast} from '../../ui/toast/toast';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {Workspace} from '../types/workspace';\nimport {onFormQueryError} from '../../errors/on-form-query-error';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {message} from '../../i18n/message';\n\ninterface Response extends BackendResponse {\n workspace: Workspace;\n}\n\nexport interface UpdateWorkspacePayload {\n id: number;\n name: string;\n}\n\nfunction updateWorkspace({\n id,\n ...props\n}: UpdateWorkspacePayload): Promise<Response> {\n return apiClient.put(`workspace/${id}`, props).then(r => r.data);\n}\n\nexport function useUpdateWorkspace(\n form: UseFormReturn<UpdateWorkspacePayload>,\n) {\n const {close} = useDialogContext();\n return useMutation({\n mutationFn: (props: UpdateWorkspacePayload) => updateWorkspace(props),\n onSuccess: response => {\n close();\n toast(message('Updated workspace'));\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.fetchUserWorkspaces,\n });\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.workspaceWithMembers(\n response.workspace.id,\n ),\n });\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n","import {useForm} from 'react-hook-form';\nimport {FormTextField} from '../ui/forms/input-field/text-field/text-field';\nimport {Form} from '../ui/forms/form';\nimport {Button} from '../ui/buttons/button';\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 {\n UpdateWorkspacePayload,\n useUpdateWorkspace,\n} from './requests/update-workspace';\nimport {Workspace} from './types/workspace';\nimport {Trans} from '../i18n/trans';\n\ninterface Props {\n workspace: Workspace;\n}\nexport function RenameWorkspaceDialog({workspace}: Props) {\n const form = useForm<UpdateWorkspacePayload>({\n defaultValues: {id: workspace.id, name: workspace.name},\n });\n const {formId, close} = useDialogContext();\n const updateWorkspace = useUpdateWorkspace(form);\n\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Rename workspace\" />\n </DialogHeader>\n <DialogBody>\n <Form\n form={form}\n id={formId}\n onSubmit={() => {\n updateWorkspace.mutate(form.getValues());\n }}\n >\n <FormTextField\n name=\"name\"\n autoFocus\n label={<Trans message=\"Name\" />}\n minLength={3}\n required\n />\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button variant=\"text\" onClick={close}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n form={formId}\n disabled={updateWorkspace.isPending}\n >\n <Trans message=\"Rename\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {toast} from '../../ui/toast/toast';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {useActiveWorkspaceId} from '../active-workspace-id-context';\nimport {PersonalWorkspace} from '../user-workspaces';\nimport {message} from '../../i18n/message';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\nexport interface DeleteWorkspacePayload {\n id: number;\n}\n\nfunction deleteWorkspace({id}: DeleteWorkspacePayload): Promise<Response> {\n return apiClient.delete(`workspace/${id}`).then(r => r.data);\n}\n\nexport function useDeleteWorkspace() {\n const {workspaceId, setWorkspaceId} = useActiveWorkspaceId();\n return useMutation({\n mutationFn: (props: DeleteWorkspacePayload) => deleteWorkspace(props),\n onSuccess: (r, payload) => {\n toast(message('Deleted workspace'));\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.fetchUserWorkspaces,\n });\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.workspaceWithMembers(payload.id),\n });\n\n // if user deleted workspace that is currently active, switch to personal workspace\n if (workspaceId === payload.id) {\n setWorkspaceId(PersonalWorkspace.id);\n }\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n","import clsx from 'clsx';\nimport {cloneElement, Fragment, ReactElement, useEffect, useState} from 'react';\nimport {ButtonBase} from '../ui/buttons/button-base';\nimport {PersonalWorkspace, useUserWorkspaces} from './user-workspaces';\nimport {UnfoldMoreIcon} from '../icons/material/UnfoldMore';\nimport {AddIcon} from '../icons/material/Add';\nimport {NewWorkspaceDialog} from './new-workspace-dialog';\nimport {WorkspaceMembersDialog} from './workspace-members-dialog';\nimport {useActiveWorkspaceId} from './active-workspace-id-context';\nimport {DialogTrigger} from '../ui/overlays/dialog/dialog-trigger';\nimport {Workspace} from './types/workspace';\nimport {Dialog} from '../ui/overlays/dialog/dialog';\nimport {DialogBody} from '../ui/overlays/dialog/dialog-body';\nimport {Button, ButtonProps} from '../ui/buttons/button';\nimport {CheckIcon} from '../icons/material/Check';\nimport {Menu, MenuItem, MenuTrigger} from '../ui/navigation/menu/menu-trigger';\nimport {KeyboardArrowDownIcon} from '../icons/material/KeyboardArrowDown';\nimport {PersonAddIcon} from '../icons/material/PersonAdd';\nimport {DeleteIcon} from '../icons/material/Delete';\nimport {ExitToAppIcon} from '../icons/material/ExitToApp';\nimport {EditIcon} from '../icons/material/Edit';\nimport {RenameWorkspaceDialog} from './rename-workspace-dialog';\nimport {ConfirmationDialog} from '../ui/overlays/dialog/confirmation-dialog';\nimport {useDeleteWorkspace} from './requests/delete-workspace';\nimport {useRemoveMember} from './requests/remove-member';\nimport {useAuth} from '../auth/use-auth';\nimport {Trans} from '../i18n/trans';\nimport {LeaveWorkspaceConfirmation} from './leave-workspace-confirmation';\nimport {openDialog} from '@common/ui/overlays/store/dialog-store';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\n\ninterface WorkspaceSelectorProps {\n className?: string;\n onChange?: (id: number) => void;\n trigger?: ReactElement<ButtonProps>;\n}\nexport function WorkspaceSelector({\n onChange,\n className,\n trigger: propsTrigger,\n}: WorkspaceSelectorProps) {\n const {data: workspaces, isFetched, isFetching} = useUserWorkspaces();\n const {workspaceId, setWorkspaceId} = useActiveWorkspaceId();\n const activeWorkspace = workspaces?.find(w => w.id === workspaceId);\n const [selectorIsOpen, setSelectorIsOpen] = useState(false);\n const {hasPermission} = useAuth();\n\n // if user no longer has access to previously selected workspace, select personal one\n useEffect(() => {\n // make sure we don't unset active workspace while user workspaces are being re-fetched\n if (isFetched && !isFetching && !activeWorkspace) {\n setWorkspaceId(PersonalWorkspace.id);\n }\n }, [activeWorkspace, workspaces, setWorkspaceId, isFetched, isFetching]);\n\n if (\n !activeWorkspace ||\n (!hasPermission('workspaces.create') && workspaces?.length === 1)\n ) {\n return null;\n }\n\n const defaultTrigger = (\n <ButtonBase\n className={clsx(\n 'flex items-center gap-10 rounded ring-inset hover:bg-hover focus-visible:ring-2',\n className,\n )}\n >\n <span className=\"mr-auto block flex-auto overflow-hidden text-left\">\n <span className=\"block overflow-hidden overflow-ellipsis text-sm font-medium text-main\">\n {activeWorkspace.default ? (\n <Trans message={activeWorkspace.name} />\n ) : (\n activeWorkspace.name\n )}\n </span>\n <span className=\"block text-xs text-muted\">\n {activeWorkspace.default ? (\n <Trans message=\"Personal workspace\" />\n ) : (\n <Trans\n message=\":count members\"\n values={{count: activeWorkspace.members_count}}\n />\n )}\n </span>\n </span>\n <UnfoldMoreIcon className=\"shrink-0 icon-md\" />\n </ButtonBase>\n );\n\n const trigger = propsTrigger || defaultTrigger;\n\n return (\n <Fragment>\n <DialogTrigger\n type=\"popover\"\n isOpen={selectorIsOpen}\n onClose={() => {\n setSelectorIsOpen(false);\n }}\n >\n {cloneElement(trigger, {\n onClick: () => setSelectorIsOpen(!selectorIsOpen),\n })}\n <Dialog size=\"min-w-320\">\n <DialogBody padding=\"p-10\">\n <div className=\"mb-16 border-b pb-10\">\n {workspaces?.map(workspace => (\n <WorkspaceItem\n key={workspace.id}\n workspace={workspace}\n setSelectorIsOpen={setSelectorIsOpen}\n onChange={onChange}\n />\n ))}\n </div>\n <div className=\"mb-4 px-4 text-center\">\n <Button\n onClick={async e => {\n e.preventDefault();\n e.stopPropagation();\n setSelectorIsOpen(false);\n const workspaceId = await openDialog(NewWorkspaceDialog);\n if (workspaceId) {\n setWorkspaceId(workspaceId);\n onChange?.(workspaceId);\n }\n }}\n variant=\"outline\"\n startIcon={<AddIcon />}\n color=\"primary\"\n className=\"h-40 w-full\"\n >\n <Trans message=\"Create new workspace\" />\n </Button>\n </div>\n </DialogBody>\n </Dialog>\n </DialogTrigger>\n </Fragment>\n );\n}\n\ninterface WorkspaceItemProps {\n workspace: Workspace;\n onChange: WorkspaceSelectorProps['onChange'];\n setSelectorIsOpen: (value: boolean) => void;\n}\nfunction WorkspaceItem({\n workspace,\n onChange,\n setSelectorIsOpen,\n}: WorkspaceItemProps) {\n const {workspaceId, setWorkspaceId} = useActiveWorkspaceId();\n const isActive = workspaceId === workspace.id;\n\n return (\n <div\n onClick={() => {\n setWorkspaceId(workspace.id);\n onChange?.(workspace.id);\n setSelectorIsOpen(false);\n }}\n className={clsx(\n 'mb-4 flex cursor-pointer items-center gap-12 rounded-lg p-10 text-left',\n isActive && 'bg-primary/5',\n !isActive && 'hover:bg-hover',\n )}\n >\n <CheckIcon\n size=\"sm\"\n className={clsx('flex-shrink-0 text-primary', !isActive && 'invisible')}\n />\n <div className=\"flex-auto\">\n <div className={clsx('text-sm', isActive && 'font-semibold')}>\n {workspace.name}\n </div>\n <div className=\"text-sm text-muted\">\n {workspace.default ? (\n <Trans message=\"Personal workspace\" />\n ) : (\n <Trans\n message=\":count members\"\n values={{count: workspace.members_count}}\n />\n )}\n </div>\n </div>\n {workspace.id !== 0 && (\n <ManageButton\n setSelectorIsOpen={setSelectorIsOpen}\n workspace={workspace}\n onChange={onChange}\n />\n )}\n </div>\n );\n}\n\ninterface LeaveWorkspaceDialogProps {\n workspace: Workspace;\n onChange?: (id: number) => void;\n}\nfunction LeaveWorkspaceDialog({\n workspace,\n onChange,\n}: LeaveWorkspaceDialogProps) {\n const removeMember = useRemoveMember();\n const {user} = useAuth();\n const {close} = useDialogContext();\n return (\n <LeaveWorkspaceConfirmation\n isLoading={removeMember.isPending}\n onConfirm={() => {\n removeMember.mutate(\n {\n workspaceId: workspace.id,\n memberId: user!.id,\n memberType: 'member',\n },\n {\n onSuccess: () => {\n close();\n onChange?.(PersonalWorkspace.id);\n },\n },\n );\n }}\n />\n );\n}\n\ninterface DeleteWorkspaceConfirmationProps {\n workspace: Workspace;\n onChange?: (id: number) => void;\n}\nfunction DeleteWorkspaceConfirmation({\n workspace,\n onChange,\n}: DeleteWorkspaceConfirmationProps) {\n const deleteWorkspace = useDeleteWorkspace();\n const {close} = useDialogContext();\n return (\n <ConfirmationDialog\n isDanger\n title={<Trans message=\"Delete workspace\" />}\n body={\n <Trans\n message=\"Are you sure you want to delete “:name“?\"\n values={{name: workspace.name}}\n />\n }\n confirm={<Trans message=\"Delete\" />}\n isLoading={deleteWorkspace.isPending}\n onConfirm={() => {\n deleteWorkspace.mutate(\n {id: workspace.id},\n {\n onSuccess: () => {\n close();\n onChange?.(PersonalWorkspace.id);\n },\n },\n );\n }}\n />\n );\n}\n\ninterface ManageButtonProps {\n setSelectorIsOpen: (value: boolean) => void;\n workspace: Workspace;\n onChange?: (id: number) => void;\n}\nfunction ManageButton({\n setSelectorIsOpen,\n workspace,\n onChange,\n}: ManageButtonProps) {\n const {user} = useAuth();\n\n return (\n <MenuTrigger onItemSelected={() => setSelectorIsOpen(false)}>\n <Button\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n }}\n color=\"primary\"\n size=\"xs\"\n variant=\"outline\"\n endIcon={<KeyboardArrowDownIcon />}\n >\n <Trans message=\"Manage\" />\n </Button>\n <Menu>\n <MenuItem\n onClick={e => {\n e.stopPropagation();\n openDialog(WorkspaceMembersDialog, {workspace});\n }}\n value=\"workspaceMembers\"\n startIcon={<PersonAddIcon />}\n >\n <Trans message=\"Members\" />\n </MenuItem>\n {workspace.owner_id === user?.id && (\n <MenuItem\n onClick={e => {\n e.stopPropagation();\n openDialog(RenameWorkspaceDialog, {workspace});\n }}\n value=\"updateWorkspace\"\n startIcon={<EditIcon />}\n >\n <Trans message=\"Rename\" />\n </MenuItem>\n )}\n {workspace.owner_id !== user?.id && (\n <MenuItem\n onClick={e => {\n e.stopPropagation();\n openDialog(LeaveWorkspaceDialog, {workspace, onChange});\n }}\n value=\"leaveWorkspace\"\n startIcon={<ExitToAppIcon />}\n >\n <Trans message=\"Leave\" />\n </MenuItem>\n )}\n {workspace.owner_id === user?.id && (\n <MenuItem\n onClick={e => {\n e.stopPropagation();\n openDialog(DeleteWorkspaceConfirmation, {workspace, onChange});\n }}\n value=\"deleteWorkspace\"\n startIcon={<DeleteIcon />}\n >\n <Trans message=\"Delete\" />\n </MenuItem>\n )}\n </Menu>\n </MenuTrigger>\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\nconst endpoint = 'link/usage';\n\nexport interface ResourceUsage {\n used: number;\n total: number | null;\n create?: boolean;\n update?: boolean;\n delete?: boolean;\n createMsgType?: CreateMsgType;\n}\n\nexport interface LinkFeaturePermissions {\n alias: boolean;\n password: boolean;\n expiration: boolean;\n utm: boolean;\n retargeting: boolean;\n}\n\nexport type CreateMsgType =\n | 'overQuota'\n | 'noPermission'\n | 'noWorkspacePermission'\n | keyof LinkFeaturePermissions;\n\nexport interface FetchLinkUsageResponse extends BackendResponse {\n forWorkspace?: boolean;\n userOwnsWorkspace?: boolean;\n usage: {\n links: ResourceUsage & LinkFeaturePermissions;\n biolinks: ResourceUsage;\n link_clicks: ResourceUsage;\n link_overlays: ResourceUsage;\n custom_pages: ResourceUsage & {options: boolean};\n custom_domains: ResourceUsage;\n link_groups: ResourceUsage;\n tracking_pixels: ResourceUsage;\n };\n}\n\nexport function useLinkSummary() {\n return useQuery({\n queryKey: [endpoint],\n queryFn: () => fetchLinkUsage(),\n });\n}\n\nfunction fetchLinkUsage(): Promise<FetchLinkUsageResponse> {\n return apiClient.get(endpoint).then(response => response.data);\n}\n","import React from 'react';\nimport {ProgressBarBase, ProgressBarBaseProps} from './progress-bar-base';\n\nexport function Meter(props: ProgressBarBaseProps) {\n return <ProgressBarBase {...props} role=\"meter progressbar\" />;\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 {FetchLinkUsageResponse, useLinkSummary} from './use-link-summary';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {message} from '@common/i18n/message';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\n\ntype ResourceKey = keyof FetchLinkUsageResponse['usage'];\n\nexport const resourceTranslationMap: Record<ResourceKey, MessageDescriptor> = {\n links: message('Links'),\n biolinks: message('Biolinks'),\n link_clicks: message('Visitors'),\n link_overlays: message('Link overlays'),\n custom_pages: message('Custom link pages'),\n custom_domains: message('Custom domains'),\n link_groups: message('Link groups'),\n tracking_pixels: message('Tracking pixels'),\n} as const;\n\nexport function ResourceUsageList() {\n const {data} = useLinkSummary();\n if (!data) {\n return null;\n }\n\n const unlimited = <Trans message=\"Unlimited\" />;\n\n return (\n <ul>\n {Object.entries(resourceTranslationMap).map(([key, label]) => {\n const usage = data?.usage[key as ResourceKey];\n if (!usage) return null;\n const name = <Trans {...label} />;\n return (\n <li key={key} className=\"mt-8\">\n {usage.total ? (\n <Trans\n message=\":used out of :total :name\"\n values={{\n used: <FormattedNumber value={usage.used} />,\n total: usage.total ? (\n <FormattedNumber value={usage.total} />\n ) : (\n unlimited\n ),\n name,\n }}\n />\n ) : (\n <Trans\n message=\":count :name created\"\n values={{count: usage.used, name}}\n />\n )}\n </li>\n );\n })}\n </ul>\n );\n}\n","import {useAuth} from '@common/auth/use-auth';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {InfoIcon} from '@common/icons/material/Info';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {Trans} from '@common/i18n/trans';\nimport {ResourceUsageList} from '@app/dashboard/layout/sidenav/resource-usage-list';\n\ninterface UsageDetailsTriggerProps {\n className?: string;\n}\nexport function UsageDetailsTrigger({className}: UsageDetailsTriggerProps) {\n const {user} = useAuth();\n const subscription = user?.subscriptions?.[0];\n const planName = subscription?.product?.name;\n const renewalDate = subscription?.renews_at ? (\n <FormattedDate date={subscription.renews_at} />\n ) : null;\n\n return (\n <DialogTrigger type=\"popover\" triggerOnHover>\n <IconButton size=\"md\" className={className}>\n <InfoIcon />\n </IconButton>\n <Dialog size=\"auto\">\n <DialogBody>\n <div className=\"border-b pb-10 mb-10\">\n <div className=\"font-semibold\">\n <Trans\n message=\"Current plan: :planName\"\n values={{\n planName: planName || <Trans message=\"Free\" />,\n }}\n />\n </div>\n <div className=\"text-muted text-xs\">\n <Trans\n message=\"Next payment: :date\"\n values={{\n date: renewalDate || <Trans message=\"Never\" />,\n }}\n />\n </div>\n </div>\n <ResourceUsageList />\n </DialogBody>\n </Dialog>\n </DialogTrigger>\n );\n}\n","import {useLinkSummary} from './use-link-summary';\nimport clsx from 'clsx';\nimport {Trans} from '@common/i18n/trans';\nimport {Meter} from '@common/ui/progress/meter';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {UsageDetailsTrigger} from '@app/dashboard/layout/sidenav/usage-details-trigger';\n\nexport function UsageMeter() {\n const {isLoading, data} = useLinkSummary();\n const links = data?.usage.links;\n\n // prevent layout shift while usage is loading\n if (!links) {\n return <div className=\"h-[53px] pt-24 mt-24 border-t\" />;\n }\n\n // prevent translation placeholders from showing if summary is not loaded yet\n const label = (\n <span className={clsx('whitespace-nowrap', isLoading && 'invisible')}>\n {links.total ? (\n <Trans\n message=\":used of :available links created\"\n values={{\n used: <FormattedNumber value={links.used} />,\n available: <FormattedNumber value={links.total} />,\n }}\n />\n ) : (\n <Trans message=\":count links created\" values={{count: links.used}} />\n )}\n </span>\n );\n return (\n <div className=\"border-t items-start gap-8 flex pl-6 pt-24 mt-24\">\n <UsageDetailsTrigger className=\"-mt-14\" />\n <Meter\n className=\"flex-auto max-w-144\"\n size=\"xs\"\n value={links.total && links.used ? (links.used / links.total) * 100 : 0}\n label={label}\n showValueLabel={false}\n labelPosition=\"bottom\"\n />\n </div>\n );\n}\n","import {Button, ButtonProps} from '@common/ui/buttons/button';\nimport {Link} from 'react-router-dom';\nimport {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {useAuth} from '@common/auth/use-auth';\n\nexport function UpgradeButton(props: ButtonProps) {\n const {isSubscribed} = useAuth();\n return (\n <Button\n elementType={Link}\n to={isSubscribed ? '/billing/change-plan' : '/pricing'}\n variant=\"outline\"\n color=\"primary\"\n size=\"xs\"\n {...props}\n >\n <Trans message=\"Upgrade\" />\n </Button>\n );\n}\n","import clsx from 'clsx';\nimport {CustomMenu} from '@common/menus/custom-menu';\nimport React from 'react';\nimport {WorkspaceSelector} from '@common/workspace/workspace-selector';\nimport {UsageMeter} from './usage-meter';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {UpgradeButton} from '@app/dashboard/layout/sidenav/upgrade-button';\nimport {UsageDetailsTrigger} from '@app/dashboard/layout/sidenav/usage-details-trigger';\n\ninterface Props {\n className?: string;\n isCompactMode?: boolean;\n}\nexport function BelinkDashboardSidenav({className, isCompactMode}: Props) {\n const {billing} = useSettings();\n\n return (\n <div\n className={clsx(\n 'text-sm pt-26 text-muted font-medium bg-alt flex flex-col gap-20 border-r overflow-y-auto relative',\n className\n )}\n >\n <div className=\"flex-auto px-12\">\n <CustomMenu\n matchDescendants={to => to === '/dashboard'}\n menu=\"dashboard-sidebar\"\n orientation=\"vertical\"\n onlyShowIcons={isCompactMode}\n gap=\"gap-8\"\n itemClassName={({isActive}) =>\n clsx(\n 'block w-full rounded py-12 px-16 border-l-4',\n isActive\n ? 'bg-primary/hover border-l-primary'\n : 'border-l-transparent hover:bg-hover'\n )\n }\n />\n {!isCompactMode && <UsageMeter />}\n {billing.enable && !isCompactMode && (\n <div className=\"mt-14 pl-60\">\n <UpgradeButton />\n </div>\n )}\n </div>\n {!isCompactMode && (\n <WorkspaceSelector className=\"w-full px-24 py-18 border-t flex-shrink-0 mt-auto\" />\n )}\n {isCompactMode && (\n <UsageDetailsTrigger className=\"flex-shrink-0 mx-auto mb-10\" />\n )}\n </div>\n );\n}\n","import {DashboardLayout} from '@common/ui/layout/dashboard-layout';\nimport {DashboardSidenav} from '@common/ui/layout/dashboard-sidenav';\nimport {DashboardContent} from '@common/ui/layout/dashboard-content';\nimport {Outlet} from 'react-router-dom';\nimport {DashboardNavbar} from '@common/ui/layout/dashboard-navbar';\nimport {BelinkDashboardSidenav} from './sidenav/belink-dashboard-sidenav';\nimport {useContext} from 'react';\nimport {DashboardLayoutContext} from '@common/ui/layout/dashboard-layout-context';\nimport {UpgradeButton} from '@app/dashboard/layout/sidenav/upgrade-button';\nimport {Button} from '@common/ui/buttons/button';\nimport {KeyboardArrowDownIcon} from '@common/icons/material/KeyboardArrowDown';\nimport {Trans} from '@common/i18n/trans';\nimport {WorkspaceSelector} from '@common/workspace/workspace-selector';\nimport {Footer} from '@common/ui/footer/footer';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {AdHost} from '@common/admin/ads/ad-host';\nimport {useThemeSelector} from '@common/ui/themes/theme-selector-context';\n\nexport function BelinkDashboardLayout() {\n const {\n links: {dash_footer},\n } = useSettings();\n return (\n <DashboardLayout name=\"belink-dashboard\" leftSidenavCanBeCompact>\n <BelinkNavbar />\n <DashboardSidenav position=\"left\">\n <BelinkDashboardSidenav />\n </DashboardSidenav>\n <DashboardContent>\n <div className=\"bg dark:bg-alt\">\n <AdHost slot=\"dashboard\" className=\"mb-20 mt-50\" />\n <Outlet />\n {dash_footer && (\n <Footer padding=\"px-16 md:px-28 pt-24 pb-28 md:pb-24\" />\n )}\n </div>\n </DashboardContent>\n </DashboardLayout>\n );\n}\n\ninterface DashboardNavbarProps {}\nfunction BelinkNavbar(props: DashboardNavbarProps) {\n const {billing} = useSettings();\n const {leftSidenavStatus} = useContext(DashboardLayoutContext);\n const {selectedTheme} = useThemeSelector();\n const buttonColor =\n selectedTheme.values?.['--be-navbar-color'] === 'bg' ? 'primary' : 'paper';\n return (\n <DashboardNavbar\n {...props}\n size=\"sm\"\n menuPosition=\"dashboard-navbar\"\n rightChildren={\n leftSidenavStatus === 'compact' &&\n billing.enable && <UpgradeButton variant=\"flat\" color={buttonColor} />\n }\n >\n {leftSidenavStatus === 'compact' && (\n <WorkspaceSelector\n trigger={\n <Button variant=\"text\" endIcon={<KeyboardArrowDownIcon />}>\n <Trans message=\"Workspaces\" />\n </Button>\n }\n />\n )}\n </DashboardNavbar>\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 {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 {Trans} from '@common/i18n/trans';\nimport {LinkStyle} from '@common/ui/buttons/external-link';\nimport {Chip} from '@common/ui/forms/input-field/chip-field/chip';\nimport {ChartLayout, ChartLayoutProps} from '@common/charts/chart-layout';\nimport React from 'react';\nimport {DatasetItem, ReportMetric} from '@common/admin/analytics/report-metric';\nimport clsx from 'clsx';\nimport {ChartLoadingIndicator} from '@common/charts/chart-loading-indicator';\nimport {removeProtocol} from '@common/utils/urls/remove-protocol';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\n\ninterface ReferrerChartProps extends Partial<ChartLayoutProps> {\n data?: ReportMetric<DatasetItem>;\n}\nexport function ReferrerChart({\n data,\n isLoading,\n ...layoutProps\n}: ReferrerChartProps) {\n const dataItems = data?.datasets[0].data || [];\n return (\n <ChartLayout\n {...layoutProps}\n className=\"w-1/2 min-w-500 md:min-w-0\"\n title={<Trans message=\"Referrers\" />}\n contentIsFlex={isLoading}\n contentClassName=\"max-h-[370px] overflow-y-auto\"\n >\n {isLoading && <ChartLoadingIndicator />}\n {dataItems.map((dataItem, index) => (\n <div\n key={dataItem.label || index}\n className=\"mb-20 flex items-center justify-between gap-24 text-sm\"\n >\n {dataItem.label ? (\n <div className=\"flex items-center gap-8\">\n <RemoteFavicon url={dataItem.label} />\n <a\n className={clsx(\n LinkStyle,\n 'overflow-hidden overflow-ellipsis whitespace-nowrap lowercase',\n )}\n href={dataItem.label}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {removeProtocol(dataItem.label)}\n </a>\n </div>\n ) : (\n <Trans message=\"Direct, Email, SMS\" />\n )}\n <Chip\n radius=\"rounded\"\n size=\"xs\"\n color=\"primary\"\n className=\"font-semibold\"\n >\n {dataItem.value}\n </Chip>\n </div>\n ))}\n </ChartLayout>\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 {createSvgIcon} from '../create-svg-icon';\n\nexport const ArrowBackIcon = createSvgIcon(\n <path d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\" />\n, 'ArrowBackOutlined');\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 InfoDialogTriggerProps {\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}: InfoDialogTriggerProps) {\n return (\n <DialogTrigger type=\"popover\" triggerOnHover>\n <IconButton\n className={clsx('text-muted opacity-70', className)}\n size=\"xs\"\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 {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 {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 {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 LocationDatasetItem,\n ReportMetric,\n} from '@common/admin/analytics/report-metric';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\n\nconst endpoint = 'reports/clicks';\n\nexport interface FetchLinkReportResponse extends BackendResponse {\n report: {\n totalClicks: number;\n clicks: ReportMetric;\n browsers: ReportMetric;\n countries: ReportMetric<LocationDatasetItem>;\n cities: ReportMetric;\n devices: ReportMetric;\n platforms: ReportMetric;\n referrers: ReportMetric;\n };\n}\n\nexport type ClicksReportMetric =\n | 'clicks'\n | 'devices'\n | 'browsers'\n | 'platforms'\n | 'countries'\n | 'cities'\n | 'referrers';\n\ninterface Payload {\n dateRange: DateRangeValue;\n model?: string;\n metrics?: ClicksReportMetric[];\n country?: string | null;\n}\n\ninterface Options {\n isEnabled: boolean;\n}\n\nexport function useClicksReport(payload: Payload, options: Options) {\n return useQuery<FetchLinkReportResponse>({\n queryKey: [endpoint, payload],\n queryFn: () => fetchClicksReport(endpoint, payload),\n placeholderData: keepPreviousData,\n enabled: options.isEnabled,\n });\n}\n\nfunction fetchClicksReport<\n T extends FetchLinkReportResponse = FetchLinkReportResponse,\n>(endpoint: string, payload: Payload): Promise<T> {\n const params: Record<string, any> = {\n model: payload.model,\n metrics: payload.metrics?.join(','),\n country: payload.country,\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, {\n cloneElement,\n Fragment,\n ReactElement,\n useCallback,\n useRef,\n useState,\n} from 'react';\nimport {LineChart} from '@common/charts/line-chart';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {PolarAreaChart} from '@common/charts/polar-area-chart';\nimport {ReferrerChart} from '@app/dashboard/reports/referrer-chart';\nimport {GeoChart} from '@common/admin/analytics/geo-chart/geo-chart';\nimport {BarChart} from '@common/charts/bar-chart';\nimport {\n ClicksReportMetric,\n FetchLinkReportResponse,\n useClicksReport,\n} from '@app/dashboard/reports/clicks/use-clicks-report';\nimport {BaseChartProps} from '@common/charts/base-chart';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {UseQueryResult} from '@tanstack/react-query';\nimport {useSearchParams} from 'react-router-dom';\n\ninterface Props {\n dateRange: DateRangeValue;\n model: string;\n}\nexport function ClicksReportCharts({dateRange, model}: Props) {\n const colGap = 'gap-12 md:gap-24 mb-12 md:mb-24';\n const rowClassName = `flex flex-col lg:flex-row lg:items-center overflow-x-auto ${colGap}`;\n\n return (\n <Fragment>\n <div className={rowClassName}>\n <AsyncChart metric=\"clicks\" model={model} dateRange={dateRange}>\n {({data}) => (\n <LineChart\n className=\"flex-auto\"\n title={<Trans message=\"Click count\" />}\n hideLegend\n description={\n <Trans\n message=\":count total clicks\"\n values={{\n count: (\n <FormattedNumber value={data?.report.clicks.total || 0} />\n ),\n }}\n />\n }\n />\n )}\n </AsyncChart>\n <AsyncChart metric=\"devices\" model={model} dateRange={dateRange}>\n <PolarAreaChart\n title={<Trans message=\"Top devices\" />}\n className=\"max-w-500\"\n />\n </AsyncChart>\n </div>\n <div className={rowClassName}>\n <AsyncChart metric=\"referrers\" model={model} dateRange={dateRange}>\n <ReferrerChart />\n </AsyncChart>\n <GeoChartWithCities dateRange={dateRange} model={model} />\n </div>\n <div className={rowClassName}>\n <AsyncChart metric=\"browsers\" model={model} dateRange={dateRange}>\n <BarChart\n className=\"max-w-500\"\n direction=\"horizontal\"\n individualBarColors\n hideLegend\n title={<Trans message=\"Top browsers\" />}\n />\n </AsyncChart>\n <AsyncChart metric=\"platforms\" model={model} dateRange={dateRange}>\n <PolarAreaChart\n className=\"max-w-500\"\n title={<Trans message=\"Top platforms\" />}\n />\n </AsyncChart>\n </div>\n </Fragment>\n );\n}\n\nfunction GeoChartWithCities({model, dateRange}: Props) {\n const [params, setParams] = useSearchParams();\n const selectedCountry = params.get('country') || undefined;\n\n const handleCountrySelected = useCallback(\n (country?: string) => {\n setParams(prev => {\n if (country) {\n prev.set('country', country);\n } else {\n prev.delete('country');\n }\n return prev;\n });\n },\n [setParams]\n );\n\n return (\n <AsyncChart\n metric={selectedCountry ? 'cities' : 'countries'}\n model={model}\n dateRange={dateRange}\n country={selectedCountry}\n >\n <GeoChart\n onCountrySelected={handleCountrySelected}\n country={selectedCountry}\n className=\"flex-auto w-1/2 lg:max-w-[740px]\"\n />\n </AsyncChart>\n );\n}\n\ninterface AsyncChartProps {\n children:\n | ReactElement<BaseChartProps>\n | ((\n query: UseQueryResult<FetchLinkReportResponse>\n ) => ReactElement<BaseChartProps>);\n metric: ClicksReportMetric;\n model: string;\n dateRange: DateRangeValue;\n country?: string;\n}\nfunction AsyncChart({children, metric, model, dateRange}: AsyncChartProps) {\n const [isEnabled, setIsEnabled] = useState(false);\n const [params] = useSearchParams();\n const query = useClicksReport(\n {metrics: [metric], model, dateRange, country: params.get('country')},\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 {StaticPageTitle} from '@common/seo/static-page-title';\nimport {Trans} from '@common/i18n/trans';\nimport {ReportDateSelector} from '@common/admin/analytics/report-date-selector';\nimport {ClicksReportCharts} from '@app/dashboard/reports/clicks/clicks-report-charts';\nimport React, {ReactNode, 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';\n\ninterface ClicksReportPageLayoutProps {\n model: string;\n title: ReactNode;\n actions?: ReactNode;\n}\nexport function ClicksReportPageLayout({\n model,\n title,\n actions,\n}: ClicksReportPageLayoutProps) {\n const [dateRange, setDateRange] = useState<DateRangeValue>(() => {\n // This week\n return DateRangePresets[2].getRangeValue();\n });\n return (\n <div className=\"min-h-full gap-12 md:gap-24 p-12 md:p-24\">\n <StaticPageTitle>\n <Trans message=\"Clicks report\" />\n </StaticPageTitle>\n <div className=\"md:flex items-center justify-between gap-24 mb-24\">\n {title}\n <div className=\"flex-shrink-0 flex items-center md:justify-end mt-10 md:mt-0 gap-12\">\n {actions}\n <div className=\"text-sm font-semibold\">\n <ReportDateSelector\n value={dateRange}\n onChange={setDateRange}\n compactOnMobile={false}\n />\n </div>\n </div>\n </div>\n <ClicksReportCharts dateRange={dateRange} model={model} />\n </div>\n );\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {ClicksReportPageLayout} from '@app/dashboard/reports/clicks/clicks-report-page-layout';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {useAuth} from '@common/auth/use-auth';\n\nexport function AllClicksReportPage() {\n const {workspaceId} = useActiveWorkspaceId();\n const {user} = useAuth();\n\n const model =\n workspaceId && workspaceId > 0\n ? `workspace=${workspaceId}`\n : `user=${user?.id}`;\n\n return (\n <ClicksReportPageLayout\n model={model}\n title={\n <h1 className=\"text-3xl font-light\">\n <Trans message=\"Clicks report\" />\n </h1>\n }\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 {USER_MODEL} from '@common/auth/user';\nimport {\n createdAtFilter,\n timestampFilter,\n updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\n\nexport const LinksDatatableFilters: BackendFilter[] = [\n {\n key: 'type',\n label: message('Type'),\n description: message('Type of the link'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: '01',\n options: [\n {\n key: '01',\n label: message('Direct'),\n value: 'direct',\n },\n {\n key: '02',\n label: message('Overlay'),\n value: 'overlay',\n },\n {\n key: '03',\n label: message('Frame'),\n value: 'frame',\n },\n {\n key: '04',\n label: message('Custom page'),\n value: 'link_page',\n },\n ],\n },\n },\n {\n key: 'active',\n label: message('Status'),\n description: message('Whether link is disabled or not'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: '01',\n options: [\n {\n key: '01',\n label: message('Enabled'),\n value: true,\n },\n {\n key: '02',\n label: message('Disabled'),\n value: false,\n },\n ],\n },\n },\n {\n key: 'password',\n label: message('Password'),\n description: message('Whether link is password protected'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: '01',\n options: [\n {\n key: '01',\n label: message('Has a password'),\n value: {value: null, operator: FilterOperator.ne},\n },\n {\n key: '02',\n label: message('Does not have a password'),\n value: {value: null, operator: FilterOperator.eq},\n },\n ],\n },\n },\n {\n key: 'clicks_count',\n label: message('Click count'),\n description: message('Total number of clicks for link'),\n defaultOperator: FilterOperator.gte,\n operators: ALL_PRIMITIVE_OPERATORS,\n control: {\n type: FilterControlType.Input,\n inputType: 'number',\n defaultValue: 1,\n },\n },\n timestampFilter({\n key: 'clicked_at',\n label: message('Clicked at'),\n description: message('Date link was last clicked'),\n }),\n timestampFilter({\n key: 'expires_at',\n label: message('Expires at'),\n description: message('Date link will expire'),\n }),\n createdAtFilter({\n description: message('Date link was created'),\n }),\n updatedAtFilter({\n description: message('Date link was last updated'),\n }),\n {\n key: 'user_id',\n label: message('User'),\n description: message('User link was created by'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.SelectModel,\n model: USER_MODEL,\n },\n },\n];\n","import {\n FetchValueListsResponse,\n prefetchValueLists,\n useValueLists,\n} from '@common/http/value-lists';\nimport {useAuth} from '@common/auth/use-auth';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nconst names: (keyof FetchValueListsResponse)[] = [\n 'countries',\n 'domains',\n 'pages',\n 'overlays',\n 'pixels',\n 'groups',\n];\n\nexport function useLinkFormValueLists() {\n const {user} = useAuth();\n return useValueLists(names, {userId: user?.id, pageType: 'link_page'});\n}\n\nexport function prefetchLinkFormValueLists() {\n prefetchValueLists(names, {\n userId: getBootstrapData().user?.id,\n pageType: 'link_page',\n });\n}\n","import {useSettings} from '@common/core/settings/use-settings';\nimport {useLinkFormValueLists} from '../requests/use-link-form-value-lists';\nimport {useFormContext} from 'react-hook-form';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {Trans} from '@common/i18n/trans';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {CrupdateLinkFormValues} from '@app/dashboard/links/forms/crupdate-link-form';\n\nexport function LinkTypeField() {\n const {\n branding: {site_name},\n } = useSettings();\n const {data} = useLinkFormValueLists();\n const {watch, setValue} = useFormContext<CrupdateLinkFormValues>();\n const type = watch('type');\n\n return (\n <div className=\"flex items-center gap-12\">\n <FormSelect\n className=\"mb-24 flex-auto\"\n name=\"type\"\n label={<Trans message=\"Type\" />}\n selectionMode=\"single\"\n onSelectionChange={() => {\n // clear type id when link type changes\n setValue('type_id', null);\n }}\n >\n <Item\n value=\"direct\"\n description={<Trans message=\"Redirect user to url instantly\" />}\n >\n <Trans message=\"Direct\" />\n </Item>\n <Item\n value=\"frame\"\n description={\n <Trans\n message=\" Show url inside iframe with :siteName navigation bar.\"\n values={{siteName: site_name}}\n />\n }\n >\n <Trans message=\"Frame\" />\n </Item>\n <Item\n value=\"splash\"\n description={\n <Trans message=\"Show splash page with optional ads and redirect user to url after a delay.\" />\n }\n >\n <Trans message=\"Splash\" />\n </Item>\n {data?.pages?.length ? (\n <Item\n value=\"page\"\n description={\n <Trans\n message=\"Show specified link page with :siteName navigation bar and button to open\n long url.\"\n values={{siteName: site_name}}\n />\n }\n >\n <Trans message=\"Link page\" />\n </Item>\n ) : null}\n {data?.overlays.length ? (\n <Item\n value=\"overlay\"\n description={\n <Trans message=\"Redirect user instantly and show specified overlay over the link.\" />\n }\n >\n <Trans message=\"Overlay\" />\n </Item>\n ) : null}\n </FormSelect>\n {type === 'page' && (\n <FormSelect\n label={<Trans message=\"Link page\" />}\n name=\"type_id\"\n selectionMode=\"single\"\n className=\"mb-24 flex-auto\"\n required\n >\n {data?.pages?.map(page => (\n <Item key={page.id} value={page.id}>\n {page.title}\n </Item>\n ))}\n </FormSelect>\n )}\n {type === 'overlay' && (\n <FormSelect\n label={<Trans message=\"Link overlay\" />}\n name=\"type_id\"\n selectionMode=\"single\"\n className=\"mb-24 flex-auto\"\n required\n >\n {data?.overlays?.map(overlay => (\n <Item key={overlay.id} value={overlay.id}>\n {overlay.name}\n </Item>\n ))}\n </FormSelect>\n )}\n </div>\n );\n}\n","export default \"__VITE_ASSET__4d22498a__\"","import {ReactNode} from 'react';\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 {Trans} from '@common/i18n/trans';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport upgradeSvg from '@app/dashboard/upgrade/upgrade.svg';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {Link} from 'react-router-dom';\n\ninterface UpgradeDialogProps {\n message?: ReactNode;\n messageSuffix?: ReactNode;\n}\nexport function UpgradeDialog({message, messageSuffix}: UpgradeDialogProps) {\n const {close} = useDialogContext();\n\n return (\n <Dialog size=\"sm\">\n <DialogHeader>\n <Trans message=\"Join the PROs\" />\n </DialogHeader>\n <DialogBody>\n <div className=\"text-center mb-20\">\n <SvgImage src={upgradeSvg} className=\"h-100 mx-auto\" />\n </div>\n <div>\n {message} {messageSuffix}\n </div>\n </DialogBody>\n <DialogFooter>\n <Button\n variant=\"text\"\n size=\"xs\"\n onClick={() => {\n close();\n }}\n >\n <Trans message=\"Maybe later\" />\n </Button>\n <Button\n variant=\"flat\"\n size=\"xs\"\n color=\"primary\"\n elementType={Link}\n to=\"/pricing\"\n target=\"_blank\"\n onClick={() => {\n close();\n }}\n >\n <Trans message=\"Find out more\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {UpgradeDialog} from '@app/dashboard/upgrade/upgrade-dialog';\nimport {Trans} from '@common/i18n/trans';\nimport {ReactNode} from 'react';\n\ninterface FeatureLockedDialogProps {\n message?: ReactNode;\n messageSuffix?: ReactNode;\n}\nexport function FeatureLockedDialog({\n message,\n messageSuffix,\n}: FeatureLockedDialogProps) {\n return (\n <UpgradeDialog\n message={message}\n messageSuffix={\n messageSuffix === undefined ? (\n <Trans message=\"Upgrade to unlock this feature and many more.\" />\n ) : (\n messageSuffix\n )\n }\n />\n );\n}\n","import {LockIcon} from '@common/icons/material/Lock';\nimport {Trans} from '@common/i18n/trans';\nimport {Button} from '@common/ui/buttons/button';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {ReactNode} from 'react';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {FeatureLockedDialog} from '@app/dashboard/upgrade/feature-locked-dialog';\n\ninterface UpgradeButtonProps {\n message?: ReactNode;\n className?: string;\n}\nexport function NoPermissionButton({message, className}: UpgradeButtonProps) {\n const {billing} = useSettings();\n\n if (!billing.enable) {\n return <GenericButton />;\n }\n\n return (\n <DialogTrigger type=\"popover\">\n <Button\n variant=\"flat\"\n color=\"primary\"\n size=\"2xs\"\n startIcon={<LockIcon />}\n className={className}\n >\n <Trans message=\"Upgrade\" />\n </Button>\n <FeatureLockedDialog message={message} />\n </DialogTrigger>\n );\n}\n\nfunction GenericButton() {\n return (\n <Tooltip\n label={\n <Trans message=\"You don't have permissions to access this feature.\" />\n }\n >\n <LockIcon size=\"sm\" className=\"text-muted\" />\n </Tooltip>\n );\n}\n","import {ReactElement, ReactNode} from 'react';\nimport {NoPermissionButton} from '@app/dashboard/upgrade/no-permission-button';\nimport clsx from 'clsx';\n\ninterface LinkFormSectionProps {\n title: ReactElement;\n description: ReactElement;\n children: ReactNode;\n upgradeMessage?: ReactNode;\n}\nexport function LinkFormSection({\n title,\n description,\n children,\n upgradeMessage,\n}: LinkFormSectionProps) {\n return (\n <div className=\"border-t pt-24\">\n <div\n className={clsx(\n 'font-semibold',\n upgradeMessage && 'flex items-center gap-10 mb-8'\n )}\n >\n <div className=\"text-sm\">{title}</div>\n {upgradeMessage && <NoPermissionButton message={upgradeMessage} />}\n </div>\n <div className=\"text-muted text-sm\">{description}</div>\n {children}\n </div>\n );\n}\n","import {\n LinkFeaturePermissions,\n useLinkSummary,\n} from '@app/dashboard/layout/sidenav/use-link-summary';\nimport {useAuth} from '@common/auth/use-auth';\n\nexport function useLinkFeatureStatus(feature: keyof LinkFeaturePermissions) {\n const {data} = useLinkSummary();\n const {hasPermission} = useAuth();\n const disabled: boolean =\n !data?.usage.links[feature] && !hasPermission('admin');\n return {disabled};\n}\n","import {Fragment, ReactElement} from 'react';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {useCurrentDateTime} from '@common/i18n/use-current-date-time';\nimport {FormDatePicker} from '@common/ui/forms/input-field/date/date-picker/date-picker';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {LinkFormSection} from './link-form-section';\nimport {useLinkFeatureStatus} from '@app/dashboard/upgrade/use-link-feature-status';\nimport {NoPermissionButton} from '@app/dashboard/upgrade/no-permission-button';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\ninterface LinkRestrictionFieldsProps {\n linkName: ReactElement<MessageDescriptor>;\n}\nexport function LinkRestrictionFields({linkName}: LinkRestrictionFieldsProps) {\n const {disabled} = useLinkFeatureStatus('password');\n\n return (\n <Fragment>\n <FormTextField\n type=\"password\"\n name=\"password\"\n label={<Trans message=\"Password\" />}\n autoComplete=\"new-password\"\n className=\"mb-24\"\n labelSuffix={\n disabled && (\n <NoPermissionButton\n message={\n <Trans message=\"Your current plan doesn't include link password protection.\" />\n }\n />\n )\n }\n disabled={disabled}\n />\n <ScheduleFields linkName={linkName} />\n <ExpirationClicksField linkName={linkName} />\n </Fragment>\n );\n}\n\nfunction ScheduleFields({linkName}: LinkRestrictionFieldsProps) {\n const now = useCurrentDateTime();\n const {disabled} = useLinkFeatureStatus('expiration');\n\n return (\n <LinkFormSection\n title={<Trans message=\"Schedule\" />}\n description={\n <Trans\n message=\"Specify a date when :name should become active and when it should expire. Both activation and expiration dates are optional.\"\n values={{name: linkName}}\n />\n }\n upgradeMessage={\n disabled && (\n <Trans\n message=\"Your current plan doesn't include :name scheduling.\"\n values={{name: linkName}}\n />\n )\n }\n >\n <div className=\"block md:flex items-center gap-24 mt-24\">\n <FormDatePicker\n showCalendarFooter\n label={<Trans message=\"Activation date\" />}\n min={now}\n name=\"activates_at\"\n className=\"mb-24 flex-auto\"\n disabled={disabled}\n />\n <FormDatePicker\n showCalendarFooter\n label={<Trans message=\"Expiration date\" />}\n min={now}\n name=\"expires_at\"\n className=\"mb-24 flex-auto\"\n disabled={disabled}\n />\n </div>\n </LinkFormSection>\n );\n}\n\nfunction ExpirationClicksField({linkName}: LinkRestrictionFieldsProps) {\n const {trans} = useTrans();\n const {disabled} = useLinkFeatureStatus('expiration');\n\n return (\n <LinkFormSection\n title={<Trans message=\"Expiration clicks\" />}\n description={\n <Trans\n message=\"After :name is visited specified amount of times, it will no longer be accessible.\nOptionally, after click amount is reached :name can redirect to specified url instead.\"\n values={{name: linkName}}\n />\n }\n upgradeMessage={\n disabled && (\n <Trans message=\"Your current plan doesn't include expiration clicks.\" />\n )\n }\n >\n <div className=\"block md:flex items-center gap-24 mt-24\">\n <FormTextField\n type=\"number\"\n label={<Trans message=\"Max clicks\" />}\n name=\"exp_clicks_rule.key\"\n className=\"mb-24 flex-auto\"\n disabled={disabled}\n />\n <FormTextField\n type=\"url\"\n label={<Trans message=\"Redirect URL\" />}\n placeholder={trans(message('Optional'))}\n name=\"exp_clicks_rule.value\"\n className=\"mb-24 flex-auto\"\n disabled={disabled}\n />\n </div>\n </LinkFormSection>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const SwapVertIcon = createSvgIcon(\n <path d=\"M16 17.01V10h-2v7.01h-3L15 21l4-3.99h-3zM9 3 5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3zM9 3 5 6.99h3V14h2V6.99h3L9 3z\" />\n, 'SwapVertOutlined');\n","import {LinkFormSection} from './link-form-section';\nimport {Trans} from '@common/i18n/trans';\nimport {useLinkFormValueLists} from '../requests/use-link-form-value-lists';\nimport {useFieldArray} from 'react-hook-form';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Button} from '@common/ui/buttons/button';\nimport {AddIcon} from '@common/icons/material/Add';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {cloneElement, Fragment, ReactElement} from 'react';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {CrupdateLinkFormValues} from '@app/dashboard/links/forms/crupdate-link-form';\nimport {useLinkFeatureStatus} from '@app/dashboard/upgrade/use-link-feature-status';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\n\nexport function LinkRetargetingFields() {\n return (\n <div>\n <GeoFields />\n <DeviceFields />\n <PlatformFields />\n </div>\n );\n}\n\nfunction GeoFields() {\n const {trans} = useTrans();\n const {data} = useLinkFormValueLists();\n return (\n <FieldsLayout\n defaultKey=\"us\"\n name=\"geo_rules\"\n title={<Trans message=\"Location targeting\" />}\n description={\n <Trans message=\"Redirect users to different url based on their location.\" />\n }\n buttonLabel={<Trans message=\"Add location\" />}\n >\n <FormSelect\n required\n showSearchField\n searchPlaceholder={trans(message('Search countries'))}\n selectionMode=\"single\"\n items={data?.countries}\n name=\"temp\"\n label={<Trans message=\"Country\" />}\n className=\"mt-24 flex-auto\"\n >\n {country => (\n <Item key={country.code} value={country.code}>\n {country.name}\n </Item>\n )}\n </FormSelect>\n </FieldsLayout>\n );\n}\n\nfunction DeviceFields() {\n return (\n <FieldsLayout\n name=\"device_rules\"\n title={<Trans message=\"Device targeting\" />}\n description={\n <Trans message=\"Redirect users to different url based on their device.\" />\n }\n buttonLabel={<Trans message=\"Add device\" />}\n defaultKey=\"desktop\"\n >\n <FormSelect\n required\n selectionMode=\"single\"\n name=\"temp\"\n label={<Trans message=\"Device\" />}\n className=\"mt-24 flex-auto\"\n >\n <Item value=\"desktop\">\n <Trans message=\"Desktop\" />\n </Item>\n <Item value=\"table\">\n <Trans message=\"Tablet\" />\n </Item>\n <Item value=\"mobile\">\n <Trans message=\"Mobile\" />\n </Item>\n </FormSelect>\n </FieldsLayout>\n );\n}\n\nfunction PlatformFields() {\n return (\n <FieldsLayout\n name=\"platform_rules\"\n title={<Trans message=\"Platform targeting\" />}\n description={\n <Trans message=\"Redirect users to different url based on their platform.\" />\n }\n defaultKey=\"windows\"\n buttonLabel={<Trans message=\"Add platform\" />}\n >\n <FormSelect\n name=\"temp\"\n required\n selectionMode=\"single\"\n label={<Trans message=\"Platform\" />}\n className=\"mt-24 flex-auto\"\n >\n <Item value=\"windows\">\n <Trans message=\"Windows\" />\n </Item>\n <Item value=\"osx\">\n <Trans message=\"MacOs\" />\n </Item>\n <Item value=\"ios\">\n <Trans message=\"iOS\" />\n </Item>\n <Item value=\"android\">\n <Trans message=\"Android\" />\n </Item>\n <Item value=\"linux\">\n <Trans message=\"Linux\" />\n </Item>\n </FormSelect>\n </FieldsLayout>\n );\n}\n\ninterface FieldsLayoutProps {\n name: 'geo_rules' | 'device_rules' | 'platform_rules';\n title: ReactElement;\n description: ReactElement;\n buttonLabel: ReactElement;\n defaultKey: string;\n children: ReactElement;\n}\nfunction FieldsLayout({\n name,\n title,\n description,\n buttonLabel,\n defaultKey,\n children,\n}: FieldsLayoutProps) {\n const {fields, append, remove} = useFieldArray<CrupdateLinkFormValues>({\n name,\n });\n const {disabled} = useLinkFeatureStatus('retargeting');\n\n return (\n <LinkFormSection\n title={title}\n description={description}\n upgradeMessage={\n disabled && (\n <Trans message=\"Your current plan doesn't include link retargeting.\" />\n )\n }\n >\n {fields.map((field, index) => (\n <div key={field.id} className=\"block items-end gap-14 md:flex\">\n {cloneElement(children, {name: `${name}.${index}.key`, disabled})}\n <FormTextField\n required\n type=\"url\"\n name={`${name}.${index}.value`}\n label={<Trans message=\"URL\" />}\n className=\"mt-24 flex-auto\"\n disabled={disabled}\n />\n <RemoveButton onClick={() => remove(index)} />\n </div>\n ))}\n <Button\n className=\"my-8\"\n variant=\"text\"\n color=\"primary\"\n startIcon={<AddIcon />}\n onClick={() => {\n append({key: defaultKey, value: ''} as any);\n }}\n disabled={disabled}\n >\n {buttonLabel}\n </Button>\n </LinkFormSection>\n );\n}\n\ninterface RemoveButtonProps {\n onClick: () => void;\n}\nfunction RemoveButton({onClick}: RemoveButtonProps) {\n return (\n <Fragment>\n <div className=\"mt-12 md:hidden\">\n <Button variant=\"outline\" color=\"danger\" size=\"xs\" onClick={onClick}>\n <Trans message=\"Remove\" />\n </Button>\n </div>\n <IconButton color=\"danger\" onClick={onClick} className=\"max-md:hidden\">\n <CloseIcon />\n </IconButton>\n </Fragment>\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 {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {FormChipField} from '@common/ui/forms/input-field/chip-field/form-chip-field';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\n\ninterface LinkSeoFieldsProps {\n hideTitle?: boolean;\n}\nexport function LinkSeoFields({hideTitle}: LinkSeoFieldsProps) {\n return (\n <div>\n <div className=\"block md:flex gap-24 mb-24\">\n <FileUploadProvider>\n <FormImageSelector\n name=\"image\"\n diskPrefix=\"links\"\n variant=\"avatar\"\n previewSize=\"w-90 h-90\"\n previewRadius=\"rounded\"\n placeholderIcon={<div className=\"w-full h-full bg-alt rounded\" />}\n showRemoveButton\n />\n </FileUploadProvider>\n <div className=\"flex-auto my-24 md:my-0\">\n {!hideTitle && (\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Title\" />}\n className=\"mb-24\"\n />\n )}\n <FormTextField\n inputElementType=\"textarea\"\n name=\"description\"\n rows={2}\n label={<Trans message=\"description\" />}\n />\n </div>\n </div>\n <FormChipField\n name=\"tags\"\n label={<Trans message=\"Tags\" />}\n valueKey=\"name\"\n />\n </div>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const AccountTreeIcon = createSvgIcon(\n <path d=\"M22 11V3h-7v3H9V3H2v8h7V8h2v10h4v3h7v-8h-7v3h-2V8h2v3h7zM7 9H4V5h3v4zm10 6h3v4h-3v-4zm0-10h3v4h-3V5z\" />\n, 'AccountTreeOutlined');\n","import {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';\nimport {AddIcon} from '@common/icons/material/Add';\nimport {Button} from '@common/ui/buttons/button';\nimport {useFieldArray} from 'react-hook-form';\nimport {CrupdateLinkFormValues} from '@app/dashboard/links/forms/crupdate-link-form';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {LinkFormSection} from '@app/dashboard/links/forms/link-form-section';\nimport {useLinkFeatureStatus} from '@app/dashboard/upgrade/use-link-feature-status';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\n\nexport function LinkUtmFields() {\n const {trans} = useTrans();\n const {disabled} = useLinkFeatureStatus('utm');\n\n return (\n <LinkFormSection\n title={<Trans message=\"UTM tags\" />}\n description={\n <Trans message=\"Add UTMs to track web traffic in analytics tools.\" />\n }\n upgradeMessage={\n disabled && (\n <Trans message=\"Your current plan doesn't include UTM functionality.\" />\n )\n }\n >\n <div className=\"block md:flex gap-24 items-center mt-24\">\n <FormTextField\n name=\"utm.source\"\n label={<Trans message=\"Source\" />}\n placeholder={trans(message('e.g: adwords, google, facebook'))}\n className=\"mb-24 flex-auto\"\n disabled={disabled}\n />\n <FormTextField\n name=\"utm.medium\"\n label={<Trans message=\"Medium\" />}\n placeholder={trans(message('e.g: banner, email, social post'))}\n className=\"mb-24 flex-auto\"\n disabled={disabled}\n />\n </div>\n <div className=\"block md:flex gap-24 items-center\">\n <FormTextField\n name=\"utm.campaign\"\n label={<Trans message=\"Campaign\" />}\n placeholder={trans(message('e.g: holiday special, birthday promo'))}\n className=\"mb-24 flex-auto\"\n disabled={disabled}\n />\n <FormTextField\n name=\"utm.term\"\n label={<Trans message=\"Term\" />}\n placeholder={trans(message('Use to identify ppc keywords'))}\n className=\"mb-24 flex-auto\"\n disabled={disabled}\n />\n </div>\n <FormTextField\n name=\"utm.content\"\n label={<Trans message=\"Content\" />}\n placeholder={trans(\n message('Use to differentiate ads or words on a page')\n )}\n className=\"mb-24\"\n disabled={disabled}\n />\n <CustomTagsSection />\n </LinkFormSection>\n );\n}\n\nfunction CustomTagsSection() {\n const {fields, append, remove} = useFieldArray<CrupdateLinkFormValues>({\n name: 'utm_custom',\n });\n const {disabled} = useLinkFeatureStatus('utm');\n\n return (\n <LinkFormSection\n title={<Trans message=\"Custom parameters\" />}\n description={\n <Trans message=\"Add query parameters to track web traffic in analytics tools.\" />\n }\n upgradeMessage={\n disabled && (\n <Trans message=\"Your current plan doesn't include query parameters functionality.\" />\n )\n }\n >\n {fields.map((field, index) => (\n <div key={field.id} className=\"block md:flex items-end gap-14\">\n <FormTextField\n required\n name={`utm_custom.${index}.key`}\n label={<Trans message=\"Key\" />}\n className=\"flex-auto mt-24\"\n disabled={disabled}\n />\n <FormTextField\n required\n name={`utm_custom.${index}.value`}\n label={<Trans message=\"Value\" />}\n className=\"flex-auto mt-24\"\n disabled={disabled}\n />\n <RemoveButton onClick={() => remove(index)} />\n </div>\n ))}\n <Button\n className=\"mb-24 mt-12\"\n variant=\"text\"\n color=\"primary\"\n startIcon={<AddIcon />}\n onClick={() => {\n append({key: '', value: ''});\n }}\n disabled={disabled}\n >\n <Trans message=\"Add parameter\" />\n </Button>\n </LinkFormSection>\n );\n}\n\ninterface RemoveButtonProps {\n onClick: () => void;\n}\nfunction RemoveButton({onClick}: RemoveButtonProps) {\n const isMobile = useIsMobileMediaQuery();\n\n if (isMobile) {\n return (\n <div className=\"mt-12\">\n <Button variant=\"outline\" color=\"danger\" size=\"xs\" onClick={onClick}>\n <Trans message=\"Remove\" />\n </Button>\n </div>\n );\n }\n\n return (\n <IconButton color=\"danger\" onClick={onClick}>\n <CloseIcon />\n </IconButton>\n );\n}\n","import {useMemo} from 'react';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {CustomDomain} from '@common/custom-domains/custom-domain';\n\nexport function useDefaultCustomDomainHost(\n allDomains?: CustomDomain[]\n): string {\n const {custom_domains, base_url} = useSettings();\n return useMemo(() => {\n const selectedHost = custom_domains?.default_host;\n if (selectedHost) {\n const host = allDomains?.find(d => d.host === selectedHost)?.host;\n if (host) return host;\n }\n return base_url.replace(/\\/$/, '').replace(/(^\\w+:|^)\\/\\//, '');\n }, [custom_domains, base_url, allDomains]);\n}\n","import {FormSelect, FormSelectProps} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {Trans} from '@common/i18n/trans';\nimport {useDefaultCustomDomainHost} from '@common/custom-domains/use-default-custom-domain-host';\nimport {removeProtocol} from '@common/utils/urls/remove-protocol';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {useLinkFormValueLists} from '@app/dashboard/links/requests/use-link-form-value-lists';\n\ninterface FormCustomDomainSelectProps\n extends Omit<FormSelectProps<any>, 'children' | 'selectionMode'> {}\nexport function LinkDomainSelect({\n ...selectProps\n}: FormCustomDomainSelectProps) {\n const {data} = useLinkFormValueLists();\n const defaultHost = useDefaultCustomDomainHost(data?.domains);\n const {custom_domains} = useSettings();\n const domains = data?.domains || [];\n\n if (!custom_domains?.allow_select || !domains.length) return null;\n\n return (\n <FormSelect\n selectionMode=\"single\"\n label={<Trans message=\"Domain\" />}\n {...selectProps}\n >\n {custom_domains.allow_all_option && (\n <Item value={null} key=\"all\">\n <Trans message=\"All my domains (including default)\" />\n </Item>\n )}\n <Item\n value={0}\n key=\"default\"\n startIcon={<RemoteFavicon url={defaultHost} />}\n >\n {removeProtocol(defaultHost)}\n </Item>\n {data?.domains?.map(domain => {\n if (domain.host === defaultHost) return null;\n return (\n <Item\n value={domain.id}\n key={domain.id}\n startIcon={<RemoteFavicon url={domain.host} />}\n >\n {removeProtocol(domain.host)}\n </Item>\n );\n })}\n </FormSelect>\n );\n}\n","import {Accordion, AccordionItem} from '@common/ui/accordion/accordion';\nimport {Trans} from '@common/i18n/trans';\nimport {SettingsIcon} from '@common/icons/material/Settings';\nimport {LinkTypeField} from '@app/dashboard/links/forms/link-type-field';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {LockIcon} from '@common/icons/material/Lock';\nimport {LinkRestrictionFields} from '@app/dashboard/links/forms/link-restriction-fields';\nimport {SwapVertIcon} from '@common/icons/material/SwapVert';\nimport {LinkRetargetingFields} from '@app/dashboard/links/forms/link-retargeting-fields';\nimport {PublicIcon} from '@common/icons/material/Public';\nimport {LinkSeoFields} from '@app/dashboard/links/forms/link-seo-fields';\nimport {AccountTreeIcon} from '@common/icons/material/AccountTree';\nimport {LinkUtmFields} from '@app/dashboard/links/forms/link-utm-fields';\nimport {useLinkFormValueLists} from '@app/dashboard/links/requests/use-link-form-value-lists';\nimport {FormChipField} from '@common/ui/forms/input-field/chip-field/form-chip-field';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {LinkDomainSelect} from '@app/dashboard/links/forms/link-domain-select';\nimport {Fragment, ReactElement, useState} from 'react';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\ntype AccordionKey = 'options' | 'restrictions' | 'retargeting' | 'seo' | 'utm';\nexport type HidableLinkSettingsField =\n | 'type'\n | 'groups'\n | 'seo'\n | 'enabled'\n | 'alias'\n | 'title';\n\ninterface LinkSettingsFormProps {\n multipleLinks?: boolean;\n defaultExpanded?: AccordionKey[];\n hiddenFields?: HidableLinkSettingsField[];\n linkName?: ReactElement<MessageDescriptor>;\n}\nexport function LinkSettingsForm({\n defaultExpanded,\n multipleLinks,\n hiddenFields = [],\n linkName = <Trans message=\"link\" />,\n}: LinkSettingsFormProps) {\n const {\n links: {retargeting},\n } = useSettings();\n const [expandedValues, setExpandedValues] = useState<AccordionKey[]>(\n defaultExpanded || []\n );\n\n return (\n <Accordion\n className=\"-ml-14 -mr-14\"\n mode=\"multiple\"\n variant=\"minimal\"\n expandedValues={expandedValues}\n onExpandedChange={values => {\n setExpandedValues(values as AccordionKey[]);\n }}\n >\n <AccordionItem\n value=\"options\"\n label={<Trans message=\"Settings\" />}\n startIcon={<SettingsIcon />}\n >\n <LinkOptionsFields\n multipleLinks={multipleLinks}\n hiddenFields={hiddenFields}\n linkName={linkName}\n />\n </AccordionItem>\n <AccordionItem\n value=\"restrictions\"\n label={<Trans message=\"Restrictions\" />}\n startIcon={<LockIcon />}\n >\n <LinkRestrictionFields linkName={linkName} />\n </AccordionItem>\n {retargeting && (\n <AccordionItem\n value=\"retargeting\"\n label={<Trans message=\"Retargeting\" />}\n startIcon={<SwapVertIcon />}\n >\n <LinkRetargetingFields />\n </AccordionItem>\n )}\n {!hiddenFields.includes('seo') && (\n <AccordionItem\n label={<Trans message=\"SEO\" />}\n startIcon={<PublicIcon />}\n value=\"seo\"\n >\n <LinkSeoFields hideTitle={hiddenFields?.includes('title')} />\n </AccordionItem>\n )}\n <AccordionItem\n value=\"utm\"\n label={<Trans message=\"UTM\" />}\n startIcon={<AccountTreeIcon />}\n >\n <LinkUtmFields />\n </AccordionItem>\n </Accordion>\n );\n}\n\ninterface LinkOptionsFieldsProps {\n multipleLinks?: boolean;\n hiddenFields: HidableLinkSettingsField[];\n linkName: ReactElement<MessageDescriptor>;\n}\nfunction LinkOptionsFields({\n multipleLinks,\n hiddenFields,\n linkName,\n}: LinkOptionsFieldsProps) {\n const {\n links: {enable_type, pixels},\n } = useSettings();\n const linkCount = multipleLinks ? 2 : 1;\n const hideGroups = hiddenFields.includes('groups');\n const hideType = hiddenFields.includes('type');\n const hideEnabled = hiddenFields.includes('enabled');\n\n return (\n <Fragment>\n {enable_type && !hideType && <LinkTypeField />}\n <LinkDomainSelect\n name=\"domain_id\"\n className=\"mb-24\"\n description={\n <Trans\n message=\"Select which domain should [one :name|other :names] be accessible with.\"\n values={{name: linkName, count: linkCount}}\n />\n }\n />\n {!hideGroups && <LinkGroupsField multipleLinks={multipleLinks} />}\n {pixels && (\n <LinkPixelsField multipleLinks={multipleLinks} linkName={linkName} />\n )}\n {!hideEnabled && (\n <FormSwitch\n name=\"active\"\n description={\n <Trans\n message=\"When [one :name is|other :names are] disabled, 404 page will be shown when short URL is visited.\"\n values={{name: linkName, count: linkCount}}\n />\n }\n >\n <Trans message=\"Enabled\" />\n </FormSwitch>\n )}\n </Fragment>\n );\n}\n\ninterface LinkGroupsFieldProps {\n multipleLinks?: boolean;\n}\nfunction LinkGroupsField({multipleLinks}: LinkGroupsFieldProps) {\n const {data} = useLinkFormValueLists();\n return (\n <FormChipField\n suggestions={data?.groups}\n openMenuOnFocus={true}\n allowCustomValue={false}\n showDropdownArrow\n className=\"mb-24\"\n name=\"groups\"\n label={<Trans message=\"Groups\" />}\n description={\n <Trans\n message=\"Which groups should [one link|other these links] belong to.\"\n values={{count: multipleLinks ? 2 : 1}}\n />\n }\n >\n {group => <Item value={group.id}>{group.name}</Item>}\n </FormChipField>\n );\n}\n\ninterface LinkPixelsFieldProps {\n multipleLinks?: boolean;\n linkName: ReactElement<MessageDescriptor>;\n}\nfunction LinkPixelsField({multipleLinks, linkName}: LinkPixelsFieldProps) {\n const {data} = useLinkFormValueLists();\n return (\n <FormChipField\n suggestions={data?.pixels}\n openMenuOnFocus={true}\n className=\"mb-24\"\n name=\"pixels\"\n label={<Trans message=\"Pixels\" />}\n description={\n <Trans\n message=\"Which tracking pixels should be used for [one this :name|other these :names].\"\n values={{count: multipleLinks ? 2 : 1, name: linkName}}\n />\n }\n >\n {pixel => <Item value={pixel.id}>{pixel.name}</Item>}\n </FormChipField>\n );\n}\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 {useSettings} from '@common/core/settings/use-settings';\nimport {useLinkFeatureStatus} from '@app/dashboard/upgrade/use-link-feature-status';\nimport {SlugEditor} from '@common/ui/slug-editor';\nimport {NoPermissionButton} from '@app/dashboard/upgrade/no-permission-button';\nimport {Trans} from '@common/i18n/trans';\nimport {UseFormReturn} from 'react-hook-form';\nimport {useLinkFormValueLists} from '@app/dashboard/links/requests/use-link-form-value-lists';\nimport {useDefaultCustomDomainHost} from '@common/custom-domains/use-default-custom-domain-host';\n\ninterface AliasFieldProps {\n form: UseFormReturn<{hash: string; alias: string} | any>;\n name: 'alias' | 'hash';\n}\nexport function AliasField({form, name}: AliasFieldProps) {\n const {\n links: {alias_min, alias_max},\n } = useSettings();\n const {data} = useLinkFormValueLists();\n const defaultHost = useDefaultCustomDomainHost(data?.domains);\n const {disabled} = useLinkFeatureStatus('alias');\n const {watch, setValue, formState} = form;\n const currentAlias = watch('alias') || watch('hash');\n const aliasError =\n formState.errors.alias?.message || formState.errors.hash?.message;\n\n return (\n <div className=\"mb-24\">\n <div className=\"flex items-center\">\n <SlugEditor\n host={defaultHost}\n pattern=\"[A-Za-z0-9\\-]+\"\n minLength={alias_min}\n maxLength={alias_max}\n value={currentAlias}\n onChange={newAlias => {\n setValue(name, newAlias, {shouldDirty: true});\n }}\n hideButton={disabled}\n />\n {disabled && (\n <NoPermissionButton\n message={\n <Trans message=\"Your current plan does not include alias editing.\" />\n }\n />\n )}\n </div>\n {aliasError && (\n <div className=\"text-xs text-danger mt-6\">{aliasError as string}</div>\n )}\n </div>\n );\n}\n","import {UseFormReturn} from 'react-hook-form';\nimport {Form} from '@common/ui/forms/form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {Link} from '../link';\nimport {\n HidableLinkSettingsField,\n LinkSettingsForm,\n} from '@app/dashboard/links/forms/link-settings-form';\nimport {urlIsValid} from '@app/dashboard/links/utils/url-is-valid';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {AliasField} from '@app/dashboard/links/forms/alias-field';\nimport {LinkeableFormValues} from '@app/dashboard/links/utils/build-linkeable-payload';\nimport clsx from 'clsx';\n\nexport interface CrupdateLinkFormValues\n extends Omit<Link, 'id' | 'utm'>,\n LinkeableFormValues {\n position?: number;\n}\n\ninterface CrupdateLinkFormProps {\n onSubmit: (values: CrupdateLinkFormValues) => void;\n formId?: string;\n form: UseFormReturn<CrupdateLinkFormValues>;\n showButtonLabelField?: boolean;\n hiddenFields?: HidableLinkSettingsField[];\n}\nexport function CrupdateLinkForm({\n form,\n onSubmit,\n formId,\n showButtonLabelField,\n hiddenFields,\n}: CrupdateLinkFormProps) {\n const {clearErrors} = form;\n const {trans} = useTrans();\n const {\n links: {min_len, max_len},\n } = useSettings();\n const hideAlias = hiddenFields?.includes('alias');\n\n return (\n <Form\n form={form}\n onSubmit={values => {\n if (!urlIsValid(values.long_url)) {\n form.setError('long_url', {\n message: trans(message('This url is invalid.')),\n });\n } else {\n onSubmit(values);\n }\n }}\n onBeforeSubmit={() => {\n // hook form won't clear errors for fields that are not bound to input\n clearErrors('alias');\n }}\n id={formId}\n >\n {showButtonLabelField && (\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Button label\" />}\n className=\"mb-24 flex-auto\"\n placeholder={trans(message('e.g. My Webpage'))}\n autoFocus\n />\n )}\n <FormTextField\n label={<Trans message=\"Destination URL\" />}\n name=\"long_url\"\n placeholder=\"https://example.com\"\n autoComplete=\"off\"\n spellCheck=\"false\"\n required\n className={clsx(hideAlias ? 'mb-24' : 'mb-12')}\n autoFocus={!showButtonLabelField}\n minLength={min_len}\n maxLength={max_len}\n />\n {!hideAlias && <AliasField form={form} name=\"alias\" />}\n <LinkSettingsForm hiddenFields={hiddenFields} />\n </Form>\n );\n}\n","import {Biolink} from '@app/dashboard/biolink/biolink';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {Link} from '@app/dashboard/links/link';\nimport {CrupdateLinkFormValues} from '@app/dashboard/links/forms/crupdate-link-form';\nimport {defaultUtmTags} from '@app/dashboard/links/utils/build-linkeable-payload';\n\nexport const placeholderPassword = '********';\n\nexport function buildLinkeableDefaultFormValues(\n linkeable: Biolink | LinkGroup | Link\n) {\n const rules = linkeable.rules || [];\n const defaultUtm: CrupdateLinkFormValues['utm'] = {};\n const customUtm: CrupdateLinkFormValues['utm_custom'] = [];\n\n if (linkeable.utm) {\n const queryParams = new URLSearchParams(linkeable.utm);\n for (const [key, value] of queryParams.entries()) {\n if (defaultUtmTags.includes(key)) {\n defaultUtm[key] = value;\n } else {\n customUtm.push({key, value});\n }\n }\n }\n\n return {\n hash: linkeable.hash,\n active: linkeable.active,\n activates_at: linkeable.activates_at,\n expires_at: linkeable.expires_at,\n name: linkeable.name,\n description: linkeable.description,\n image: linkeable.image,\n geo_rules: rules.filter(rule => rule.type === 'geo'),\n device_rules: rules.filter(rule => rule.type === 'device'),\n platform_rules: rules.filter(rule => rule.type === 'platform'),\n exp_clicks_rule: rules.find(r => r.type === 'exp_clicks'),\n // show an indication to user that password exists\n password: linkeable.has_password ? placeholderPassword : '',\n utm: defaultUtm,\n utm_custom: customUtm,\n domain_id: linkeable.domain_id,\n pixels: linkeable.pixels,\n tags: linkeable.tags,\n };\n}\n","import {removeEmptyValuesFromObject} from '@common/utils/objects/remove-empty-values-from-object';\nimport {Tag} from '@common/tags/tag';\nimport {LinkRule} from '@app/dashboard/links/link-rule';\nimport {TrackingPixel} from '@app/dashboard/tracking-pixels/tracking-pixel';\nimport {placeholderPassword} from '@app/dashboard/links/utils/build-linkeable-default-form-values';\n\nexport const defaultUtmTags = [\n 'source',\n 'medium',\n 'campaign',\n 'term',\n 'content',\n];\n\nexport interface CrupdateLinkeablePayload\n extends Omit<LinkeableFormValues, 'utm' | 'groups' | 'pixels' | 'tags'> {\n utm?: string | null;\n groups?: number[] | null;\n pixels?: number[] | null;\n tags?: string[] | null;\n}\n\nexport interface LinkeableFormValues {\n exp_clicks_rule?: LinkRule;\n geo_rules?: LinkRule[];\n device_rules?: LinkRule[];\n platform_rules?: LinkRule[];\n pixels?: TrackingPixel[];\n tags?: Tag[];\n password?: string;\n utm?: {\n source?: string;\n medium?: string;\n campaign?: string;\n term?: string;\n content?: string;\n [key: string]: string | undefined;\n };\n utm_custom?: {key: string; value: string}[];\n}\n\nexport function buildLinkeablePayload<R extends CrupdateLinkeablePayload>(\n values: LinkeableFormValues\n): R {\n // remove placeholder password, otherwise it will be set every time link is updated\n if (values.password === placeholderPassword) {\n delete values.password;\n }\n let payload: CrupdateLinkeablePayload = {\n ...values,\n utm: null,\n groups: null,\n pixels: null,\n tags: null,\n };\n payload = addUtmAndCustomQueryParams(payload, values);\n payload.pixels = values.pixels ? values.pixels.map(pixel => pixel.id) : [];\n payload.tags = values.tags?.map((tag: Tag | string) =>\n typeof tag === 'string' ? tag : tag.name\n );\n return payload as R;\n}\n\nfunction addUtmAndCustomQueryParams(\n payload: CrupdateLinkeablePayload,\n values: LinkeableFormValues\n): CrupdateLinkeablePayload {\n if (!values.utm && !values.utm_custom) return payload;\n const utm = removeEmptyValuesFromObject(values.utm || {}) as Record<\n string,\n string\n >;\n values.utm_custom?.forEach(({key, value}) => {\n utm[key] = value;\n });\n\n payload.utm = new URLSearchParams(utm).toString();\n return payload;\n}\n","import {CrupdateLinkFormValues} from '@app/dashboard/links/forms/crupdate-link-form';\nimport {\n buildLinkeablePayload,\n CrupdateLinkeablePayload,\n} from '@app/dashboard/links/utils/build-linkeable-payload';\n\nexport interface CrupdateLinkPayload\n extends Omit<CrupdateLinkFormValues, 'utm' | 'groups' | 'pixels' | 'tags'>,\n CrupdateLinkeablePayload {}\n\nexport function buildLinkPayload(\n values: CrupdateLinkFormValues\n): CrupdateLinkPayload {\n const payload = buildLinkeablePayload<CrupdateLinkPayload>(values);\n payload.groups = values.groups?.map(group => group.id);\n return payload;\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\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 {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {CrupdateLinkFormValues} from '@app/dashboard/links/forms/crupdate-link-form';\nimport {buildLinkPayload} from '@app/dashboard/links/requests/build-link-payload';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\ninterface Options {\n endpoint?: string;\n invalidateQueries?: boolean;\n}\n\nexport function useCreateLink(\n form: UseFormReturn<CrupdateLinkFormValues>,\n {endpoint, invalidateQueries = true}: Options = {},\n) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (payload: CrupdateLinkFormValues) =>\n createLink(payload, endpoint),\n onSuccess: () => {\n toast.positive(trans(message('Link created')));\n if (invalidateQueries) {\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('link'),\n });\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('link-group'),\n });\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('biolink'),\n });\n }\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction createLink(\n values: CrupdateLinkFormValues,\n endpoint?: string,\n): Promise<Response> {\n return apiClient\n .post(endpoint || `link`, buildLinkPayload(values))\n .then(r => r.data);\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {\n CrupdateLinkForm,\n CrupdateLinkFormValues,\n} from '../forms/crupdate-link-form';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\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 {useCreateLink} from '../requests/use-create-link';\nimport {useForm} from 'react-hook-form';\nimport {nanoid} from 'nanoid';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {useRecaptcha} from '@common/recaptcha/use-recaptcha';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {HidableLinkSettingsField} from '@app/dashboard/links/forms/link-settings-form';\n\nexport interface CreateLinkDialogProps {\n group?: LinkGroup | Biolink | null;\n showButtonLabelField?: boolean;\n hiddenFields?: HidableLinkSettingsField[];\n endpoint?: string;\n position?: number;\n invalidateQueries?: boolean;\n onSuccess?: (response: any) => void;\n}\nexport function CreateLinkDialog({\n group,\n position,\n showButtonLabelField,\n hiddenFields,\n endpoint,\n onSuccess,\n invalidateQueries,\n}: CreateLinkDialogProps) {\n const {close, formId} = useDialogContext();\n const {\n links: {default_type},\n custom_domains,\n } = useSettings();\n const {verify, isVerifying} = useRecaptcha('link_creation');\n\n const form = useForm<CrupdateLinkFormValues>({\n defaultValues: {\n hash: nanoid(5),\n active: true,\n type: default_type || 'direct',\n geo_rules: [],\n device_rules: [],\n platform_rules: [],\n // set undefined if no group id specified, so existing groups are not cleared in backend\n groups: group ? [group as LinkGroup] : [],\n position: position, // for biolink\n utm: {},\n utm_custom: [],\n domain_id: custom_domains?.allow_all_option ? undefined : 0,\n },\n });\n const createLink = useCreateLink(form, {endpoint, invalidateQueries});\n\n return (\n <Dialog size=\"lg\">\n <DialogHeader>\n <Trans message=\"Create link\" />\n </DialogHeader>\n <DialogBody>\n <CrupdateLinkForm\n hiddenFields={hiddenFields}\n showButtonLabelField={showButtonLabelField}\n formId={formId}\n form={form}\n onSubmit={async values => {\n const isValid = await verify();\n if (isValid) {\n createLink.mutate(values, {\n onSuccess: response => {\n onSuccess?.(response);\n close();\n },\n });\n }\n }}\n />\n </DialogBody>\n <DialogFooter>\n <Button\n variant=\"text\"\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={createLink.isPending || isVerifying}\n >\n <Trans message=\"Create\" />\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 {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 {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {CrupdateLinkFormValues} from '../forms/crupdate-link-form';\nimport {buildLinkPayload} from '@app/dashboard/links/requests/build-link-payload';\nimport {Link} from '../link';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {\n link: Link;\n}\n\ninterface Options {\n endpoint?: string;\n invalidateQueries?: boolean;\n}\n\nexport function useUpdateLink(\n form: UseFormReturn<CrupdateLinkFormValues>,\n linkId: number,\n {endpoint, invalidateQueries = true}: Options = {},\n) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (payload: CrupdateLinkFormValues) =>\n updateLink(linkId, payload, endpoint),\n onSuccess: async () => {\n if (invalidateQueries) {\n await Promise.allSettled([\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('link'),\n }),\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('link-group'),\n }),\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('biolink'),\n }),\n ]);\n }\n toast.positive(trans(message('Link updated')));\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction updateLink(\n id: number,\n values: CrupdateLinkFormValues,\n endpoint?: string,\n): Promise<Response> {\n return apiClient\n .put(endpoint || `link/${id}`, buildLinkPayload(values))\n .then(r => r.data);\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {\n CrupdateLinkForm,\n CrupdateLinkFormValues,\n} from '../forms/crupdate-link-form';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\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 {useUpdateLink} from '../requests/use-update-link';\nimport {Link} from '../link';\nimport {useMemo} from 'react';\nimport {useRecaptcha} from '@common/recaptcha/use-recaptcha';\nimport {buildLinkeableDefaultFormValues} from '@app/dashboard/links/utils/build-linkeable-default-form-values';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {CreateLinkDialogProps} from '@app/dashboard/links/dialogs/create-link-dialog';\n\ninterface UpdateLinkDialogProps extends Omit<CreateLinkDialogProps, 'group'> {\n link: Link;\n}\nexport function UpdateLinkDialog({\n link,\n showButtonLabelField,\n hiddenFields,\n invalidateQueries,\n onSuccess,\n endpoint,\n}: UpdateLinkDialogProps) {\n const {close, formId} = useDialogContext();\n const {verify, isVerifying} = useRecaptcha('link_creation');\n\n const defaultValues = useMemo(() => buildDefaultFormValues(link), [link]);\n const form = useForm<CrupdateLinkFormValues>({\n defaultValues,\n });\n const updateLink = useUpdateLink(form, link.id, {\n endpoint,\n invalidateQueries,\n });\n\n return (\n <Dialog size=\"lg\">\n <DialogHeader>\n <Trans message=\"Update link\" />\n </DialogHeader>\n <DialogBody>\n <CrupdateLinkForm\n hiddenFields={hiddenFields}\n showButtonLabelField={showButtonLabelField}\n formId={formId}\n form={form}\n onSubmit={async values => {\n const isValid = await verify();\n if (isValid) {\n updateLink.mutate(values, {\n onSuccess: response => {\n onSuccess?.(response);\n close();\n },\n });\n }\n }}\n />\n </DialogBody>\n <DialogFooter>\n <Button\n variant=\"text\"\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={updateLink.isPending || isVerifying}\n >\n <Trans message=\"Update\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n\nexport function buildDefaultFormValues(link: Link) {\n const values = buildLinkeableDefaultFormValues(link);\n return {\n ...values,\n long_url: link.long_url,\n alias: link.alias,\n type: link.type,\n type_id: link.type_id,\n groups: link.groups as LinkGroup[],\n };\n}\n","import {Link} from '@app/dashboard/links/link';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\nimport React from 'react';\n\ninterface LinkImageProps {\n link: Link;\n className?: string;\n}\nexport function LinkImage({link, className}: LinkImageProps) {\n return link.image ? (\n <img className={className} alt=\"\" src={link.image} />\n ) : (\n <RemoteFavicon className={className} url={link.long_url} />\n );\n}\n","import {UpgradeDialog} from '@app/dashboard/upgrade/upgrade-dialog';\nimport {Trans} from '@common/i18n/trans';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {useTrans} from '@common/i18n/use-trans';\n\ninterface FeatureLockedDialogProps {\n resourceName: MessageDescriptor;\n}\nexport function OverQuotaDialog({resourceName}: FeatureLockedDialogProps) {\n const {trans} = useTrans();\n return (\n <UpgradeDialog\n message={\n <Trans\n message=\"You've reached the maximum number of :resource allowed for your current plan.\"\n values={{resource: trans(resourceName)}}\n />\n }\n messageSuffix={\n <Trans message=\"Upgrade to increase this limit and unlock other features.\" />\n }\n />\n );\n}\n","import React, {\n cloneElement,\n forwardRef,\n ReactElement,\n useMemo,\n useState,\n} from 'react';\nimport {\n FetchLinkUsageResponse,\n useLinkSummary,\n} from '@app/dashboard/layout/sidenav/use-link-summary';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {OverQuotaDialog} from '@app/dashboard/upgrade/over-quota-dialog';\nimport {resourceTranslationMap} from '@app/dashboard/layout/sidenav/resource-usage-list';\nimport {createEventHandler} from '@common/utils/dom/create-event-handler';\nimport {Link} from '@app/dashboard/links/link';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {LinkOverlay} from '@app/dashboard/link-overlays/link-overlay';\nimport {CustomPage} from '@common/admin/custom-pages/custom-page';\nimport {CustomDomain} from '@common/custom-domains/custom-domain';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {TrackingPixel} from '@app/dashboard/tracking-pixels/tracking-pixel';\nimport {useAuth} from '@common/auth/use-auth';\n\ntype ResourceName =\n | Link['model_type']\n | Biolink['model_type']\n | LinkOverlay['model_type']\n | CustomPage['model_type']\n | CustomDomain['model_type']\n | LinkGroup['model_type']\n | TrackingPixel['model_type'];\n\ninterface PermissionAwareButtonProps {\n resource:\n | ResourceName\n | Link\n | LinkGroup\n | Biolink\n | CustomDomain\n | LinkOverlay\n | CustomPage\n | TrackingPixel;\n action: 'create' | 'update' | 'delete';\n children: ReactElement;\n}\n\nexport const PermissionAwareButton = forwardRef<\n HTMLElement,\n PermissionAwareButtonProps\n>(({children, resource, action, ...childProps}, ref) => {\n const {user} = useAuth();\n const [dialogIsOpen, setDialogIsOpen] = useState(false);\n const {data} = useLinkSummary();\n\n const usageKey = useMemo(() => {\n // extract model type from resource\n const resourceName =\n typeof resource === 'string' ? resource : resource.model_type;\n\n // pluralize model type and convert to snake case\n return `${camelCaseToSnakeCase(\n resourceName\n )}s` as keyof FetchLinkUsageResponse['usage'];\n }, [resource]);\n\n const hasPermission = data?.usage[usageKey][action];\n const messageType = data?.usage[usageKey].createMsgType;\n\n // user has permission or owns the resource\n if (\n hasPermission ||\n (typeof resource === 'object' && resource.user_id === user?.id)\n ) {\n return cloneElement(children, {...childProps, ref});\n }\n\n if (!hasPermission && messageType !== 'overQuota') {\n return null;\n }\n\n return (\n <div\n onPointerDown={createEventHandler(e => {\n e.preventDefault();\n e.stopPropagation();\n })}\n onClickCapture={createEventHandler(e => {\n e.preventDefault();\n e.stopPropagation();\n setDialogIsOpen(true);\n })}\n onKeyDownCapture={createEventHandler(event => {\n const e = event as unknown as KeyboardEvent;\n e.preventDefault();\n e.stopPropagation();\n if (e.key === 'Enter' || e.key === ' ') {\n setDialogIsOpen(true);\n }\n })}\n >\n {children}\n <DialogTrigger\n type=\"modal\"\n isOpen={dialogIsOpen}\n onOpenChange={setDialogIsOpen}\n >\n <OverQuotaDialog resourceName={resourceTranslationMap[usageKey]} />\n </DialogTrigger>\n </div>\n );\n});\n\nfunction camelCaseToSnakeCase(str: string) {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);\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 {Link} from '../link';\nimport {Trans} from '@common/i18n/trans';\nimport {removeProtocol} from '@common/utils/urls/remove-protocol';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {Chip} from '@common/ui/forms/input-field/chip-field/chip';\nimport {CheckIcon} from '@common/icons/material/Check';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Link as RouterLink} from 'react-router-dom';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {UpdateLinkDialog} from '../dialogs/update-link-dialog';\nimport React from 'react';\nimport {LinkImage} from '@app/dashboard/links/link-image';\nimport {ShareLinkButton} from '@app/dashboard/links/sharing/share-link-button';\nimport {LinkClipboardButton} from '@app/dashboard/links/sharing/link-clipboard-button';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\nimport {BarChartIcon} from '@common/icons/material/BarChart';\n\nexport const linksDatatableColumns: ColumnConfig<Link>[] = [\n {\n key: 'summary',\n header: () => <Trans message=\"Summary\" />,\n width: 'flex-3 min-w-200',\n visibleInMode: 'all',\n body: link => (\n <div>\n <div className=\"flex items-center gap-6 whitespace-nowrap\">\n <LinkImage link={link} className=\"w-16 h-16\" />\n <a\n className=\"block font-semibold hover:underline overflow-ellipsis overflow-hidden w-min\"\n href={link.long_url}\n target=\"_blank\"\n rel=\"noreferrer\"\n data-testid=\"long-url\"\n >\n {removeProtocol(link.long_url)}\n </a>\n </div>\n <LinkClipboardButton\n link={link}\n variant=\"text\"\n className=\"block text-muted hover:underline w-min\"\n data-testid=\"short-url\"\n />\n </div>\n ),\n },\n {\n key: 'user_id',\n allowsSorting: true,\n header: () => <Trans message=\"Owner\" />,\n width: 'flex-2 min-w-140',\n body: link => {\n if (!link.user) return '';\n return (\n <NameWithAvatar\n image={link.user.avatar}\n label={link.user.display_name}\n description={link.user.email}\n />\n );\n },\n },\n {\n key: 'clicks',\n sortingKey: 'clicks_count',\n allowsSorting: true,\n header: () => <Trans message=\"Clicks\" />,\n body: link =>\n link.clicks_count ? <FormattedNumber value={link.clicks_count} /> : '',\n },\n {\n key: 'type',\n sortingKey: 'type',\n allowsSorting: true,\n header: () => <Trans message=\"Type\" />,\n body: link => (\n <Chip size=\"xs\" radius=\"rounded\" className=\"capitalize\">\n <Trans message={link.type} />\n </Chip>\n ),\n },\n {\n key: 'password',\n allowsSorting: true,\n header: () => <Trans message=\"Password\" />,\n body: link =>\n link.has_password ? (\n <CheckIcon className=\"icon-md text-positive\" />\n ) : (\n <CloseIcon className=\"icon-md text-danger\" />\n ),\n },\n {\n key: 'expires_at',\n allowsSorting: true,\n header: () => <Trans message=\"Expires at\" />,\n body: link =>\n link.expires_at ? <FormattedDate date={link.expires_at} /> : '',\n },\n {\n key: 'clicked_at',\n allowsSorting: true,\n header: () => <Trans message=\"Last clicked\" />,\n body: link =>\n link.clicked_at ? <FormattedDate date={link.clicked_at} /> : '',\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n align: 'end',\n width: 'w-128 flex-shrink-0',\n visibleInMode: 'all',\n body: link => (\n <div className=\"text-muted\">\n <Tooltip label={<Trans message=\"Link statistics\" />}>\n <RouterLink to={`${link.id}`}>\n <IconButton size=\"md\">\n <BarChartIcon />\n </IconButton>\n </RouterLink>\n </Tooltip>\n <ShareLinkButton link={link} />\n <PermissionAwareButton resource={link} action=\"update\">\n <DialogTrigger type=\"modal\">\n <Tooltip label={<Trans message=\"Edit link\" />}>\n <IconButton size=\"md\">\n <EditIcon />\n </IconButton>\n </Tooltip>\n <UpdateLinkDialog link={link} />\n </DialogTrigger>\n </PermissionAwareButton>\n </div>\n ),\n },\n];\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const AddLinkIcon = createSvgIcon(\n <path d=\"M8 11h8v2H8v-2zm12.1 1H22c0-2.76-2.24-5-5-5h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1zM3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM19 12h-2v3h-3v2h3v3h2v-3h3v-2h-3v-3z\" />\n, 'AddLinkOutlined');\n","import {createSvgIcon} from '../../icons/create-svg-icon';\n\nexport const ExportCsvIcon = createSvgIcon(\n <path d=\"M 7 2 C 5.895 2 5 2.895 5 4 L 5 9 L 4 9 C 2.895 9 2 9.895 2 11 L 2 16 C 2 17.105 2.895 18 4 18 L 5 18 L 5 20 C 5 21.105 5.895 22 7 22 L 15.171875 22 L 13.171875 20 L 7 20 L 7 18 L 17 18 L 17 16 C 17 14.895 17.895 14 19 14 L 21 14 L 21 7 L 16 2 L 7 2 z M 7 4 L 15 4 L 15 8 L 19 8 L 19 9 L 7 9 L 7 4 z M 6 11 C 7.105 11 8 11.895 8 13 L 7 13 C 7 12.449 6.551 12 6 12 C 5.449 12 5 12.449 5 13 L 5 14 C 5 14.551 5.449 15 6 15 C 6.551 15 7 14.551 7 14 L 8 14 C 8 15.105 7.105 16 6 16 C 4.895 16 4 15.105 4 14 L 4 13 C 4 11.895 4.895 11 6 11 z M 10.644531 11 C 12.067531 11.041 12.154297 12.282906 12.154297 12.503906 L 11.1875 12.503906 C 11.1875 12.400906 11.204906 11.806641 10.628906 11.806641 C 10.453906 11.806641 10.059844 11.884188 10.089844 12.367188 C 10.118844 12.810188 10.703547 13.019406 10.810547 13.066406 C 11.034547 13.148406 12.141391 13.642391 12.150391 14.650391 C 12.152391 14.864391 12.097062 15.985 10.664062 16 C 9.1050625 16.017 9 14.675438 9 14.398438 L 9.9746094 14.398438 C 9.9746094 14.545438 9.9870625 15.256172 10.664062 15.201172 C 11.071063 15.167172 11.159828 14.87425 11.173828 14.65625 C 11.196828 14.28925 10.846563 14.068625 10.476562 13.890625 C 9.9565625 13.640625 9.1341406 13.333375 9.1191406 12.359375 C 9.1061406 11.482375 9.7505312 10.975 10.644531 11 z M 13 11 L 14.052734 11 L 14.992188 14.646484 L 15.9375 11 L 17 11 L 15.646484 16 L 14.345703 16 L 13 11 z M 19 16 L 19 20 L 16 20 L 20 24 L 24 20 L 21 20 L 21 16 L 19 16 z\"></path>\n);\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\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 {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {\n buildLinkPayload,\n CrupdateLinkPayload,\n} from '@app/dashboard/links/requests/build-link-payload';\nimport {CreateMultipleLinksFormValue} from '@app/dashboard/links/dialogs/create-multiple-links-dialog';\nimport {Link} from '@app/dashboard/links/link';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface CreateMultipleLinksPayload\n extends Omit<CrupdateLinkPayload, 'hash' | 'long_url'> {\n long_urls: string[];\n}\n\ninterface Response extends BackendResponse {\n links: Link[];\n}\n\nexport function useCreateMultipleLinks(\n form: UseFormReturn<CreateMultipleLinksFormValue>,\n) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (values: CreateMultipleLinksFormValue) => createLinks(values),\n onSuccess: response => {\n toast.positive(\n trans(\n message('[one 1 link|other :count links] shortened', {\n values: {count: response.links.length},\n }),\n ),\n );\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('link'),\n });\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('link-group'),\n });\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction createLinks(values: CreateMultipleLinksFormValue): Promise<Response> {\n return apiClient\n .post('link/batch/shorten', formToPayload(values))\n .then(r => r.data);\n}\n\nfunction formToPayload(\n values: CreateMultipleLinksFormValue,\n): CreateMultipleLinksPayload {\n const payload = buildLinkPayload(values as any);\n const longUrls = values.long_urls.split(/\\n/g);\n return {\n ...payload,\n long_urls: longUrls,\n };\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {CrupdateLinkFormValues} from '../forms/crupdate-link-form';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\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 {useCreateMultipleLinks} from '@app/dashboard/links/requests/use-create-multiple-links';\nimport {Form} from '@common/ui/forms/form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {LinkSettingsForm} from '@app/dashboard/links/forms/link-settings-form';\nimport {urlIsValid} from '@app/dashboard/links/utils/url-is-valid';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\n\nexport interface CreateMultipleLinksFormValue\n extends Omit<CrupdateLinkFormValues, 'hash' | 'long_url'> {\n long_urls: string;\n}\n\ninterface CreateMultipleLinksDialogProps {\n group?: LinkGroup | Biolink | null;\n}\nexport function CreateMultipleLinksDialog({\n group,\n}: CreateMultipleLinksDialogProps) {\n const {trans} = useTrans();\n const {close, formId} = useDialogContext();\n const form = useForm<CreateMultipleLinksFormValue>({\n defaultValues: {\n active: true,\n type: 'direct',\n geo_rules: [],\n device_rules: [],\n platform_rules: [],\n // set undefined if no group id specified, so existing groups are not cleared in backend\n groups: group ? [group as LinkGroup] : undefined,\n utm: {},\n utm_custom: [],\n },\n });\n const createMultiple = useCreateMultipleLinks(form);\n return (\n <Dialog size=\"lg\">\n <DialogHeader>\n <Trans message=\"Shorten links\" />\n </DialogHeader>\n <DialogBody>\n <Form\n id={formId}\n form={form}\n onSubmit={values => {\n const someUrlsInvalid = values.long_urls\n .split(/\\r?\\n/)\n .some(url => !urlIsValid(url));\n if (someUrlsInvalid) {\n form.setError('long_urls', {\n message: trans(message('Some of the urls are not valid.')),\n });\n } else {\n createMultiple.mutate(values, {onSuccess: () => close()});\n }\n }}\n >\n <FormTextField\n label={<Trans message=\"Multiple URLs (one per line)\" />}\n inputElementType=\"textarea\"\n rows={10}\n name=\"long_urls\"\n autoComplete=\"off\"\n spellCheck=\"false\"\n required\n className=\"mb-24\"\n autoFocus\n />\n <LinkSettingsForm multipleLinks />\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button\n variant=\"text\"\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={createMultiple.isPending}\n >\n <Trans message=\"Shorten\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {Trans} from '@common/i18n/trans';\nimport React, {Fragment, useEffect, useMemo} from 'react';\nimport {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {DeleteSelectedItemsAction} from '@common/datatable/page/delete-selected-items-action';\nimport shareLink from '../share-link.svg';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport {LinksDatatableFilters} from './links-datatable-filters';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {CreateLinkDialog} from '../dialogs/create-link-dialog';\nimport {useAuth} from '@common/auth/use-auth';\nimport {linksDatatableColumns} from './links-datatable-columns';\nimport {useExportCsv} from '@common/datatable/requests/use-export-csv';\nimport {Menu, MenuTrigger} from '@common/ui/navigation/menu/menu-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {MoreHorizIcon} from '@common/icons/material/MoreHoriz';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {AddLinkIcon} from '@common/icons/material/AddLink';\nimport {ExportCsvIcon} from '@common/datatable/csv-export/export-csv-icon';\nimport {downloadFileFromUrl} from '@common/uploads/utils/download-file-from-url';\nimport {CsvExportInfoDialog} from '@common/datatable/csv-export/csv-export-info-dialog';\nimport {CreateMultipleLinksDialog} from '@app/dashboard/links/dialogs/create-multiple-links-dialog';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {prefetchLinkFormValueLists} from '@app/dashboard/links/requests/use-link-form-value-lists';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\nimport {openDialog} from '@common/ui/overlays/store/dialog-store';\n\ninterface LinksDatablePageProps {\n forCurrentUser?: boolean;\n}\nexport function LinksDatablePage({forCurrentUser}: LinksDatablePageProps) {\n const {user} = useAuth();\n const {workspaceId} = useActiveWorkspaceId();\n const {filters, columns} = useMemo(() => {\n const columns = !forCurrentUser\n ? linksDatatableColumns\n : linksDatatableColumns.filter(col => col.key !== 'user_id');\n\n const filters = !forCurrentUser\n ? LinksDatatableFilters\n : LinksDatatableFilters.filter(filter => filter.key !== 'user_id');\n\n return {filters, columns};\n }, [forCurrentUser]);\n\n const userId = forCurrentUser ? user?.id : '';\n\n useEffect(() => {\n prefetchLinkFormValueLists();\n }, []);\n\n return (\n <DataTablePage\n endpoint=\"link\"\n queryParams={{userId, workspaceId, with: 'user'}}\n title={<Trans message=\"Links\" />}\n filters={filters}\n columns={columns}\n actions={<Actions />}\n selectedActions={\n <PermissionAwareButton resource=\"link\" action=\"delete\">\n <DeleteSelectedItemsAction />\n </PermissionAwareButton>\n }\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={shareLink}\n title={<Trans message=\"No links have been created yet\" />}\n filteringTitle={<Trans message=\"No matching links\" />}\n />\n }\n />\n );\n}\n\nfunction Actions() {\n const exportCsv = useExportCsv('link/csv/export');\n\n return (\n <Fragment>\n <MenuTrigger>\n <IconButton\n variant=\"outline\"\n color=\"primary\"\n size=\"sm\"\n className=\"flex-shrink-0\"\n >\n <MoreHorizIcon />\n </IconButton>\n <Menu>\n <Item\n value=\"addMultiple\"\n startIcon={<AddLinkIcon />}\n onSelected={() => {\n openDialog(CreateMultipleLinksDialog);\n }}\n >\n <Trans message=\"Shorten multiple links\" />\n </Item>\n <Item\n value=\"export\"\n startIcon={<ExportCsvIcon />}\n onSelected={() => {\n exportCsv.mutate(\n {},\n {\n onSuccess: response => {\n if (response.downloadPath) {\n downloadFileFromUrl(response.downloadPath);\n } else {\n openDialog(CsvExportInfoDialog);\n }\n },\n },\n );\n }}\n >\n <Trans message=\"Export links\" />\n </Item>\n </Menu>\n </MenuTrigger>\n <PermissionAwareButton resource=\"link\" action=\"create\">\n <DialogTrigger type=\"modal\">\n <DataTableAddItemButton>\n <Trans message=\"Shorten link\" />\n </DataTableAddItemButton>\n <CreateLinkDialog />\n </DialogTrigger>\n </PermissionAwareButton>\n </Fragment>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const MoveDownIcon = createSvgIcon(\n <path d=\"M3 11c0 2.45 1.76 4.47 4.08 4.91l-1.49-1.49L7 13l4 4.01L7 21l-1.41-1.41 1.58-1.58v-.06C3.7 17.54 1 14.58 1 11c0-3.87 3.13-7 7-7h3v2H8c-2.76 0-5 2.24-5 5zm19 0V4h-9v7h9zm-2-2h-5V6h5v3zm-7 4h9v7h-9z\" />\n, 'MoveDownOutlined');\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 {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n linkIds: number[];\n}\n\nexport function useMoveLinksToGroup(group: LinkGroup) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (payload: Payload) => moveLinks(group.id, payload),\n onSuccess: () => {\n toast.positive(\n trans(\n message('Moved links to “:group“', {values: {group: group.name}}),\n ),\n );\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('link-group'),\n });\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction moveLinks(groupId: number, payload: Payload): Promise<Response> {\n return apiClient\n .post(`link-group/${groupId}/attach`, payload)\n .then(r => r.data);\n}\n","import {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 {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Trans} from '@common/i18n/trans';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {List, ListItem} from '@common/ui/list/list';\nimport {Link} from '@app/dashboard/links/link';\nimport {useMoveLinksToGroup} from '@app/dashboard/link-groups/link-group-links-datatable-page/requests/use-move-links-to-group';\nimport {removeProtocol} from '@common/utils/urls/remove-protocol';\nimport React, {useState} from 'react';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Checkbox} from '@common/ui/forms/toggle/checkbox';\nimport {LinkImage} from '@app/dashboard/links/link-image';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {KeyboardArrowLeftIcon} from '@common/icons/material/KeyboardArrowLeft';\nimport {KeyboardArrowRightIcon} from '@common/icons/material/KeyboardArrowRight';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport linkSvg from '@app/dashboard/links/share-link.svg';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {\n GetDatatableDataParams,\n useDatatableData,\n} from '@common/datatable/requests/paginated-resources';\nimport {LengthAwarePaginationResponse} from '@common/http/backend-response/pagination-response';\n\ninterface MoveLinksToGroupDialogProps {\n group: LinkGroup;\n}\nexport function MoveLinksToGroupDialog({group}: MoveLinksToGroupDialogProps) {\n const {close} = useDialogContext();\n const [selectedIds, setSelectedIds] = useState<number[]>([]);\n const [params, setParams] = useState<GetDatatableDataParams>({\n groupId: `!${group.id}`,\n query: '',\n perPage: 8,\n });\n const {data, isLoading} = useDatatableData<Link>('link', params);\n const pagination = data?.pagination as LengthAwarePaginationResponse<Link>;\n const moveLinks = useMoveLinksToGroup(group);\n\n const paginationButtons = (\n <div className=\"text-muted\">\n <IconButton\n disabled={isLoading || !pagination?.prev_page}\n onClick={() => {\n setParams({\n ...params,\n page: pagination?.prev_page!,\n });\n }}\n >\n <KeyboardArrowLeftIcon />\n </IconButton>\n <IconButton\n disabled={isLoading || !pagination?.next_page}\n onClick={() => {\n setParams({\n ...params,\n page: pagination?.next_page!,\n });\n }}\n >\n <KeyboardArrowRightIcon />\n </IconButton>\n </div>\n );\n\n const emptyStageMessage = (\n <IllustratedMessage\n image={<SvgImage src={linkSvg} />}\n title={<Trans message=\"No links found\" />}\n />\n );\n\n const list = (\n <div className=\"min-h-[464px]\">\n <List>\n <AnimatePresence mode=\"wait\">\n {isLoading ? (\n <LinksSkeleton />\n ) : (\n <LinksList\n links={pagination?.data}\n selectedIds={selectedIds}\n setSelectedIds={setSelectedIds}\n />\n )}\n </AnimatePresence>\n </List>\n </div>\n );\n\n return (\n <Dialog size=\"lg\">\n <DialogHeader>\n <Trans message=\"Move links to “:group“\" values={{group: group.name}} />\n </DialogHeader>\n <DialogBody>\n <TextField\n className=\"mb-14\"\n label={<Trans message=\"Search for links...\" />}\n value={params.query}\n onChange={e => {\n setParams({...params, query: e.target.value});\n }}\n />\n {!isLoading && !pagination?.data.length ? emptyStageMessage : list}\n </DialogBody>\n <DialogFooter startAction={paginationButtons}>\n <Button variant=\"text\" onClick={close}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n variant=\"flat\"\n color=\"primary\"\n onClick={() => {\n moveLinks.mutate({linkIds: selectedIds}, {onSuccess: close});\n }}\n disabled={moveLinks.isPending}\n >\n <Trans message=\"Move\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n\ninterface ListItemsProps {\n links?: Link[];\n selectedIds: number[];\n setSelectedIds: (ids: number[]) => void;\n}\nfunction LinksList({links, selectedIds, setSelectedIds}: ListItemsProps) {\n return (\n <m.div key=\"links-list\" {...opacityAnimation}>\n <List>\n {(links || []).map(link => {\n const isSelected = selectedIds.includes(link.id);\n return (\n <ListItem\n key={link.id}\n isSelected={isSelected}\n onSelected={() => {\n if (isSelected) {\n setSelectedIds(selectedIds.filter(id => id !== link.id));\n } else {\n setSelectedIds([...selectedIds, link.id]);\n }\n }}\n startIcon={<Checkbox checked={isSelected} />}\n description={removeProtocol(link.short_url)}\n >\n <div className=\"flex items-center gap-8\">\n <LinkImage className=\"w-14 h-14\" link={link} />\n <div>{removeProtocol(link.long_url)}</div>\n </div>\n </ListItem>\n );\n })}\n </List>\n </m.div>\n );\n}\n\nconst skeletonCount = 8;\nfunction LinksSkeleton() {\n return (\n <m.div key=\"links-skeleton\" {...opacityAnimation}>\n <List>\n {Array.from({length: skeletonCount}).map((_, index) => (\n <ListItem key={index} isDisabled>\n <Skeleton variant=\"text\" className=\"min-h-40\" />\n </ListItem>\n ))}\n </List>\n </m.div>\n );\n}\n","import React, {Fragment, useContext} from 'react';\nimport {Trans} from '@common/i18n/trans';\nimport {LinksDatatableFilters} from '@app/dashboard/links/links-datatable-page/links-datatable-filters';\nimport {linksDatatableColumns} from '@app/dashboard/links/links-datatable-page/links-datatable-columns';\nimport {DeleteSelectedItemsAction} from '@common/datatable/page/delete-selected-items-action';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport shareLink from '../../links/share-link.svg';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {useParams} from 'react-router-dom';\nimport {BreadcrumbItem} from '@common/ui/breadcrumbs/breadcrumb-item';\nimport {Breadcrumb} from '@common/ui/breadcrumbs/breadcrumb';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {DataTable} from '@common/datatable/data-table';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {PaginatedBackendResponse} from '@common/http/backend-response/pagination-response';\nimport {Link} from '@app/dashboard/links/link';\nimport {StaticPageTitle} from '@common/seo/static-page-title';\nimport {CreateLinkDialog} from '@app/dashboard/links/dialogs/create-link-dialog';\nimport {Menu, MenuTrigger} from '@common/ui/navigation/menu/menu-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {AddLinkIcon} from '@common/icons/material/AddLink';\nimport {ExportCsvIcon} from '@common/datatable/csv-export/export-csv-icon';\nimport {MoreHorizIcon} from '@common/icons/material/MoreHoriz';\nimport {MoveDownIcon} from '@common/icons/material/MoveDown';\nimport {useExportCsv} from '@common/datatable/requests/use-export-csv';\nimport {downloadFileFromUrl} from '@common/uploads/utils/download-file-from-url';\nimport {CsvExportInfoDialog} from '@common/datatable/csv-export/csv-export-info-dialog';\nimport {MoveLinksToGroupDialog} from '@app/dashboard/link-groups/link-group-links-datatable-page/move-links-to-group-dialog';\nimport {DataTableContext} from '@common/datatable/page/data-table-context';\nimport {CreateMultipleLinksDialog} from '@app/dashboard/links/dialogs/create-multiple-links-dialog';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\nimport {openDialog} from '@common/ui/overlays/store/dialog-store';\n\ninterface LinkGroupLinksResponse extends PaginatedBackendResponse<Link> {\n linkGroup: LinkGroup;\n}\n\nexport function LinkGroupsLinksDatatablePage() {\n const {groupId} = useParams();\n\n return (\n <div className=\"p-12 md:p-24\">\n <DataTable\n endpoint={`link-group/${groupId}/links`}\n filters={LinksDatatableFilters}\n columns={linksDatatableColumns}\n actions={<Actions groupId={groupId ? +groupId : undefined} />}\n selectedActions={\n <PermissionAwareButton resource=\"link\" action=\"delete\">\n <DeleteSelectedItemsAction />\n </PermissionAwareButton>\n }\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={shareLink}\n title={<Trans message=\"There are no links in this group yet\" />}\n filteringTitle={<Trans message=\"No matching links\" />}\n />\n }\n >\n <PageTitle />\n </DataTable>\n </div>\n );\n}\n\nfunction PageTitle() {\n const navigate = useNavigate();\n const {query} = useContext(DataTableContext);\n const linkGroup = (query.data as LinkGroupLinksResponse)?.linkGroup;\n\n // avoid layout shift when link group is not loaded yet\n if (!linkGroup) return <Breadcrumb size=\"xl\" className=\"mb-16\" />;\n\n const title = (\n <Trans message=\"“:group“ links\" values={{group: linkGroup.name}} />\n );\n return (\n <Fragment>\n <StaticPageTitle>{title}</StaticPageTitle>\n <Breadcrumb size=\"xl\" className=\"mb-16\">\n <BreadcrumbItem\n onSelected={() => {\n navigate('/dashboard/link-groups');\n }}\n >\n <Trans message=\"Link groups\" />\n </BreadcrumbItem>\n <BreadcrumbItem className=\"first-letter:capitalize\">\n {title}\n </BreadcrumbItem>\n </Breadcrumb>\n </Fragment>\n );\n}\n\ninterface ActionsProps {\n groupId?: number;\n}\nfunction Actions({groupId}: ActionsProps) {\n const exportCsv = useExportCsv('link/csv/export');\n const {query} = useContext(DataTableContext);\n const linkGroup = (query.data as LinkGroupLinksResponse)?.linkGroup;\n\n return (\n <Fragment>\n <MenuTrigger>\n <IconButton\n variant=\"outline\"\n color=\"primary\"\n size=\"sm\"\n className=\"flex-shrink-0\"\n >\n <MoreHorizIcon />\n </IconButton>\n <Menu>\n <Item\n value=\"moveLinks\"\n startIcon={<MoveDownIcon />}\n onSelected={() => {\n openDialog(MoveLinksToGroupDialog, {group: linkGroup});\n }}\n >\n <Trans message=\"Move links to this group\" />\n </Item>\n <Item\n value=\"addMultiple\"\n startIcon={<AddLinkIcon />}\n onSelected={() => {\n openDialog(CreateMultipleLinksDialog, {group: linkGroup});\n }}\n >\n <Trans message=\"Add multiple links\" />\n </Item>\n <Item\n value=\"export\"\n startIcon={<ExportCsvIcon />}\n onSelected={() => {\n exportCsv.mutate(\n {groupId},\n {\n onSuccess: response => {\n if (response.downloadPath) {\n downloadFileFromUrl(response.downloadPath);\n } else {\n openDialog(CsvExportInfoDialog);\n }\n },\n },\n );\n }}\n >\n <Trans message=\"Export links\" />\n </Item>\n </Menu>\n </MenuTrigger>\n <PermissionAwareButton resource=\"link\" action=\"create\">\n <DialogTrigger type=\"modal\">\n <DataTableAddItemButton>\n <Trans message=\"Add link\" />\n </DataTableAddItemButton>\n <CreateLinkDialog group={linkGroup} />\n </DialogTrigger>\n </PermissionAwareButton>\n </Fragment>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ListAltIcon = createSvgIcon(\n <path d=\"M11 7h6v2h-6zm0 4h6v2h-6zm0 4h6v2h-6zM7 7h2v2H7zm0 4h2v2H7zm0 4h2v2H7zM20.1 3H3.9c-.5 0-.9.4-.9.9v16.2c0 .4.4.9.9.9h16.2c.4 0 .9-.5.9-.9V3.9c0-.5-.5-.9-.9-.9zM19 19H5V5h14v14z\" />\n, 'ListAltOutlined');\n","import {UseFormReturn} from 'react-hook-form';\nimport {Form} from '@common/ui/forms/form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {LinkDomainSelect} from '@app/dashboard/links/forms/link-domain-select';\nimport {LinkGroup} from '../../link-group';\nimport {AliasField} from '@app/dashboard/links/forms/alias-field';\n\nexport interface CrupdateLinkGroupPayload\n extends Pick<\n LinkGroup,\n 'name' | 'description' | 'hash' | 'active' | 'rotator' | 'domain_id'\n > {}\n\ninterface CrupdateLinkGroupFormProps {\n formId: string;\n form: UseFormReturn<CrupdateLinkGroupPayload>;\n onSubmit: (values: CrupdateLinkGroupPayload) => void;\n}\nexport function CrupdateLinkGroupForm({\n onSubmit,\n form,\n formId,\n}: CrupdateLinkGroupFormProps) {\n const {clearErrors} = form;\n return (\n <Form\n form={form}\n id={formId}\n onBeforeSubmit={() => {\n // hook form won't clear errors for fields that are not bound to input\n clearErrors('hash');\n }}\n onSubmit={onSubmit}\n >\n <div className=\"mb-24\">\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Name\" />}\n minLength={3}\n className=\"mb-8\"\n autoFocus\n />\n <AliasField form={form} name=\"hash\" />\n </div>\n <LinkDomainSelect name=\"domain_id\" className=\"mb-24\" />\n <FormTextField\n name=\"description\"\n className=\"mb-24\"\n label={<Trans message=\"Description\" />}\n inputElementType=\"textarea\"\n rows={2}\n />\n <FormSwitch\n name=\"active\"\n description={\n <Trans message=\"Whether this link group is viewable publicly.\" />\n }\n className=\"mb-24\"\n >\n <Trans message=\"Active\" />\n </FormSwitch>\n <FormSwitch\n name=\"rotator\"\n description={\n <Trans message=\"When checked, url above will redirect to random link from the group, instead of showing all links belonging to group.\" />\n }\n >\n <Trans message=\"Rotator\" />\n </FormSwitch>\n </Form>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {CrupdateLinkGroupPayload} from '../crupdate/crupdate-link-group-form';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\nexport function useUpdateLinkGroup(\n form: UseFormReturn<CrupdateLinkGroupPayload>,\n groupId: number,\n) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (payload: CrupdateLinkGroupPayload) =>\n updateLinkGroup(groupId, payload),\n onSuccess: () => {\n toast.positive(trans(message('Link group updated')));\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('link-group'),\n });\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction updateLinkGroup(\n id: number,\n payload: CrupdateLinkGroupPayload,\n): Promise<Response> {\n return apiClient.put(`link-group/${id}`, payload).then(r => r.data);\n}\n","import {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 {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {\n CrupdateLinkGroupForm,\n CrupdateLinkGroupPayload,\n} from './crupdate-link-group-form';\nimport {useForm} from 'react-hook-form';\nimport {useUpdateLinkGroup} from '../requests/use-update-link-group';\nimport {LinkGroup} from '../../link-group';\nimport {useRecaptcha} from '@common/recaptcha/use-recaptcha';\n\ninterface UpdateLinkGroupDialogProps {\n group: LinkGroup;\n}\nexport function UpdateLinkGroupDialog({group}: UpdateLinkGroupDialogProps) {\n const {verify, isVerifying} = useRecaptcha('link_creation');\n const {formId, close} = useDialogContext();\n const form = useForm<CrupdateLinkGroupPayload>({\n defaultValues: {\n name: group.name,\n hash: group.hash,\n description: group.description,\n active: group.active,\n rotator: group.rotator,\n },\n });\n const updateGroup = useUpdateLinkGroup(form, group.id);\n\n return (\n <Dialog size=\"md\">\n <DialogHeader>\n <Trans message=\"Update link group\" />\n </DialogHeader>\n <DialogBody>\n <CrupdateLinkGroupForm\n formId={formId}\n form={form}\n onSubmit={async values => {\n const isValid = await verify();\n if (isValid) {\n updateGroup.mutate(values, {onSuccess: () => close()});\n }\n }}\n />\n </DialogBody>\n <DialogFooter>\n <Button\n variant=\"text\"\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={updateGroup.isPending || isVerifying}\n >\n <Trans message=\"Update\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {CheckIcon} from '@common/icons/material/Check';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Link as RouterLink} from 'react-router-dom';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport React from 'react';\nimport {LinkGroup} from '../link-group';\nimport {ListAltIcon} from '@common/icons/material/ListAlt';\nimport {UpdateLinkGroupDialog} from '@app/dashboard/link-groups/link-groups-datatable-page/crupdate/update-link-group-dialog';\nimport {ShareLinkButton} from '@app/dashboard/links/sharing/share-link-button';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {LinkStyle} from '@common/ui/buttons/external-link';\nimport {BarChartIcon} from '@common/icons/material/BarChart';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\n\nexport const LinkGroupsDatatableColumns: ColumnConfig<LinkGroup>[] = [\n {\n key: 'name',\n allowsSorting: true,\n header: () => <Trans message=\"Name\" />,\n width: 'flex-3 min-w-200',\n visibleInMode: 'all',\n body: group => (\n <a\n href={group.short_url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={LinkStyle}\n >\n {group.name}\n </a>\n ),\n },\n {\n key: 'user_id',\n allowsSorting: true,\n width: 'flex-2 min-w-140',\n header: () => <Trans message=\"Owner\" />,\n body: group => {\n if (!group.user) return '';\n return (\n <NameWithAvatar\n image={group.user.avatar}\n label={group.user.display_name}\n description={group.user.email}\n />\n );\n },\n },\n {\n key: 'links_count',\n allowsSorting: true,\n header: () => <Trans message=\"Links\" />,\n body: group =>\n group.links_count ? <FormattedNumber value={group.links_count} /> : '-',\n },\n {\n key: 'active',\n allowsSorting: true,\n header: () => <Trans message=\"Active\" />,\n body: group =>\n group.active ? (\n <CheckIcon className=\"icon-md text-positive\" />\n ) : (\n <CloseIcon className=\"icon-md text-danger\" />\n ),\n },\n {\n key: 'rotator',\n allowsSorting: true,\n header: () => <Trans message=\"Rotator\" />,\n body: group =>\n group.rotator ? (\n <CheckIcon className=\"icon-md text-positive\" />\n ) : (\n <CloseIcon className=\"icon-md text-danger\" />\n ),\n },\n {\n key: 'updated_at',\n allowsSorting: true,\n header: () => <Trans message=\"Last updated\" />,\n body: link =>\n link.updated_at ? <FormattedDate date={link.updated_at} /> : '',\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n align: 'end',\n width: 'w-160 flex-shrink-0',\n visibleInMode: 'all',\n body: group => (\n <div className=\"text-muted\">\n <Tooltip label={<Trans message=\"Clicks report\" />}>\n <RouterLink to={`${group.id}`}>\n <IconButton size=\"md\">\n <BarChartIcon />\n </IconButton>\n </RouterLink>\n </Tooltip>\n <Tooltip label={<Trans message=\"Manage links\" />}>\n <RouterLink to={`${group.id}/links`}>\n <IconButton size=\"md\">\n <ListAltIcon />\n </IconButton>\n </RouterLink>\n </Tooltip>\n <ShareLinkButton link={group} />\n <PermissionAwareButton resource={group} action=\"update\">\n <DialogTrigger type=\"modal\">\n <Tooltip label={<Trans message=\"Edit link\" />}>\n <IconButton size=\"md\">\n <EditIcon />\n </IconButton>\n </Tooltip>\n <UpdateLinkGroupDialog group={group} />\n </DialogTrigger>\n </PermissionAwareButton>\n </div>\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 {USER_MODEL} from '@common/auth/user';\nimport {\n createdAtFilter,\n updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\n\nexport const LinkGroupsDatatableFilters: BackendFilter[] = [\n {\n key: 'rotator',\n label: message('Type'),\n defaultOperator: FilterOperator.eq,\n description: message('Type of the group'),\n control: {\n type: FilterControlType.Select,\n defaultValue: '01',\n options: [\n {\n key: '01',\n label: message('Default'),\n value: false,\n },\n {\n key: '02',\n label: message('Rotator'),\n value: true,\n },\n ],\n },\n },\n {\n key: 'active',\n label: message('Status'),\n description: message('Whether group is disabled or not'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: '01',\n options: [\n {\n key: '01',\n label: message('Enabled'),\n value: true,\n },\n {\n key: '02',\n label: message('Disabled'),\n value: false,\n },\n ],\n },\n },\n {\n key: 'links_count',\n label: message('Link count'),\n description: message('Number of links in the group'),\n defaultOperator: FilterOperator.gte,\n operators: ALL_PRIMITIVE_OPERATORS,\n control: {\n type: FilterControlType.Input,\n inputType: 'number',\n defaultValue: 1,\n },\n },\n createdAtFilter({\n description: message('Date group was created'),\n }),\n updatedAtFilter({\n description: message('Date group was last updated'),\n }),\n {\n key: 'user_id',\n label: message('User'),\n description: message('User group was created by'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.SelectModel,\n model: USER_MODEL,\n },\n },\n];\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {CrupdateLinkGroupPayload} from '../crupdate/crupdate-link-group-form';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\nexport function useCreateLinkGroup(\n form: UseFormReturn<CrupdateLinkGroupPayload>,\n) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (props: CrupdateLinkGroupPayload) => createLinkGroup(props),\n onSuccess: () => {\n toast.positive(trans(message('Link group created')));\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('link-group'),\n });\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction createLinkGroup(payload: CrupdateLinkGroupPayload): Promise<Response> {\n return apiClient.post(`link-group`, payload).then(r => r.data);\n}\n","import {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 {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {\n CrupdateLinkGroupForm,\n CrupdateLinkGroupPayload,\n} from './crupdate-link-group-form';\nimport {useForm} from 'react-hook-form';\nimport {useCreateLinkGroup} from '../requests/use-create-link-group';\nimport {nanoid} from 'nanoid';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {useRecaptcha} from '@common/recaptcha/use-recaptcha';\n\nexport function CreateLinkGroupDialog() {\n const {formId, close} = useDialogContext();\n const {custom_domains} = useSettings();\n const {verify, isVerifying} = useRecaptcha('link_creation');\n\n const form = useForm<CrupdateLinkGroupPayload>({\n defaultValues: {\n active: true,\n hash: nanoid(6),\n rotator: false,\n domain_id: custom_domains?.allow_all_option ? undefined : 0,\n },\n });\n\n const createGroup = useCreateLinkGroup(form);\n return (\n <Dialog size=\"md\">\n <DialogHeader>\n <Trans message=\"Create link group\" />\n </DialogHeader>\n <DialogBody>\n <CrupdateLinkGroupForm\n formId={formId}\n form={form}\n onSubmit={async values => {\n const isValid = await verify();\n if (isValid) {\n createGroup.mutate(values, {onSuccess: () => close()});\n }\n }}\n />\n </DialogBody>\n <DialogFooter>\n <Button\n variant=\"text\"\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={createGroup.isPending || isVerifying}\n >\n <Trans message=\"Create\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {useAuth} from '@common/auth/use-auth';\nimport React, {Fragment, useEffect, 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 shareLink from '../../links/share-link.svg';\nimport {DataTableExportCsvButton} from '@common/datatable/csv-export/data-table-export-csv-button';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {LinkGroupsDatatableColumns} from './link-groups-datatable-columns';\nimport {LinkGroupsDatatableFilters} from './link-groups-datatable-filters';\nimport {CreateLinkGroupDialog} from './crupdate/create-link-group-dialog';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\nimport {prefetchLinkFormValueLists} from '@app/dashboard/links/requests/use-link-form-value-lists';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\n\ninterface LinkGroupsDatatablePageProps {\n forCurrentUser?: boolean;\n}\nexport function LinkGroupsDatatablePage({\n forCurrentUser,\n}: LinkGroupsDatatablePageProps) {\n const {user} = useAuth();\n const {workspaceId} = useActiveWorkspaceId();\n const {filters, columns} = useMemo(() => {\n const columns = !forCurrentUser\n ? LinkGroupsDatatableColumns\n : LinkGroupsDatatableColumns.filter(col => col.key !== 'user_id');\n\n const filters = !forCurrentUser\n ? LinkGroupsDatatableFilters\n : LinkGroupsDatatableFilters.filter(filter => filter.key !== 'user_id');\n\n return {filters, columns};\n }, [forCurrentUser]);\n\n useEffect(() => {\n prefetchLinkFormValueLists();\n }, []);\n\n const userId = forCurrentUser ? user?.id : '';\n return (\n <DataTablePage\n endpoint=\"link-group\"\n queryParams={{\n userId,\n withCount: 'links',\n with: 'user,domain',\n workspaceId,\n }}\n title={<Trans message=\"Link groups\" />}\n headerContent={<InfoTrigger />}\n filters={filters}\n columns={columns}\n actions={<Actions />}\n selectedActions={\n <PermissionAwareButton resource=\"linkGroup\" action=\"delete\">\n <DeleteSelectedItemsAction />\n </PermissionAwareButton>\n }\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={shareLink}\n title={<Trans message=\"No groups have been created yet\" />}\n filteringTitle={<Trans message=\"No matching groups\" />}\n />\n }\n />\n );\n}\n\nfunction InfoTrigger() {\n return (\n <InfoDialogTrigger\n dialogSize=\"auto\"\n title={<Trans message=\"Group links together to:\" />}\n body={\n <ul className=\"list-inside list-disc whitespace-nowrap\">\n <li>\n <Trans message=\"Simplify multiple link management.\" />\n </li>\n <li>\n <Trans message=\"View aggregated clicks report for the whole group.\" />\n </li>\n <li>\n <Trans message=\"Redirect to a random link from within the group.\" />\n </li>\n <li>\n <Trans message=\"Share all links in the group with one link.\" />\n </li>\n </ul>\n }\n />\n );\n}\n\nfunction Actions() {\n return (\n <Fragment>\n <DataTableExportCsvButton endpoint=\"link-group/csv/export\" />\n <PermissionAwareButton resource=\"linkGroup\" action=\"create\">\n <DialogTrigger type=\"modal\">\n <DataTableAddItemButton>\n <Trans message=\"New group\" />\n </DataTableAddItemButton>\n <CreateLinkGroupDialog />\n </DialogTrigger>\n </PermissionAwareButton>\n </Fragment>\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {PaginatedBackendResponse} from '@common/http/backend-response/pagination-response';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface FetchLinkGroupResponse extends BackendResponse {\n linkGroup: LinkGroup;\n}\n\nexport function useLinkGroup(groupId: number | string) {\n return useQuery({\n queryKey: ['link-group', groupId],\n queryFn: () => fetchLinkGroup(groupId),\n initialData: seedInitialDataFromPaginatedList(groupId),\n });\n}\n\nfunction fetchLinkGroup(\n groupId: number | string,\n): Promise<FetchLinkGroupResponse> {\n return apiClient.get(`link-group/${groupId}`).then(response => response.data);\n}\n\nfunction seedInitialDataFromPaginatedList(groupId: number | string) {\n const linkGroup = queryClient\n .getQueryData<PaginatedBackendResponse<LinkGroup>>(\n DatatableDataQueryKey('link-group'),\n )\n ?.pagination?.data.find(link => link.id === +groupId);\n return linkGroup ? {linkGroup} : undefined;\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {ClicksReportPageLayout} from '@app/dashboard/reports/clicks/clicks-report-page-layout';\nimport {Breadcrumb} from '@common/ui/breadcrumbs/breadcrumb';\nimport {BreadcrumbItem} from '@common/ui/breadcrumbs/breadcrumb-item';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {useParams} from 'react-router-dom';\nimport {useLinkGroup} from '@app/dashboard/link-groups/link-group-links-datatable-page/requests/use-link-group';\nimport {ShareLinkButton} from '@app/dashboard/links/sharing/share-link-button';\nimport clsx from 'clsx';\n\nexport function LinkGroupClicksReportPage() {\n const navigate = useNavigate();\n const {groupId} = useParams();\n const query = useLinkGroup(groupId!);\n const group = query.data?.linkGroup;\n\n return (\n <ClicksReportPageLayout\n model={`link-group=${groupId}`}\n title={\n <Breadcrumb size=\"xl\" className={clsx(query.isLoading && 'invisible')}>\n <BreadcrumbItem\n onSelected={() => {\n navigate('..', {relative: 'path'});\n }}\n >\n <Trans message=\"Link groups\" />\n </BreadcrumbItem>\n <BreadcrumbItem className=\"first-letter:capitalize\">\n <Trans message=\"“:name“ clicks\" values={{name: group?.name}} />\n </BreadcrumbItem>\n </Breadcrumb>\n }\n actions={\n group && (\n <ShareLinkButton className=\"flex-shrink-0 text-muted\" link={group} />\n )\n }\n />\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {Link} from '@app/dashboard/links/link';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {PaginatedBackendResponse} from '@common/http/backend-response/pagination-response';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\nexport interface GetLinkResponse extends BackendResponse {\n link: Link;\n}\n\nexport function useLink(linkId: number | string) {\n return useQuery({\n queryKey: ['link', linkId],\n queryFn: () => fetchLink(linkId),\n initialData: seedInitialDataFromPaginatedList(linkId),\n });\n}\n\nfunction fetchLink(linkId: number | string): Promise<GetLinkResponse> {\n return apiClient.get(`link/${linkId}`).then(response => response.data);\n}\n\nfunction seedInitialDataFromPaginatedList(linkId: number | string) {\n const link = queryClient\n .getQueryData<PaginatedBackendResponse<Link>>(DatatableDataQueryKey('link'))\n ?.pagination?.data.find(link => link.id === +linkId);\n return link ? {link} : undefined;\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {ClicksReportPageLayout} from '@app/dashboard/reports/clicks/clicks-report-page-layout';\nimport {Breadcrumb} from '@common/ui/breadcrumbs/breadcrumb';\nimport {BreadcrumbItem} from '@common/ui/breadcrumbs/breadcrumb-item';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {useParams} from 'react-router-dom';\nimport {useLink} from '@app/dashboard/layout/sidenav/use-link';\nimport clsx from 'clsx';\nimport {ShareLinkButton} from '@app/dashboard/links/sharing/share-link-button';\n\nexport function LinkClicksReportPage() {\n const navigate = useNavigate();\n const {linkId} = useParams();\n const query = useLink(linkId!);\n const link = query.data?.link;\n\n return (\n <ClicksReportPageLayout\n model={`link=${linkId}`}\n title={\n <Breadcrumb size=\"xl\" className={clsx(query.isLoading && 'invisible')}>\n <BreadcrumbItem\n onSelected={() => {\n navigate('..', {relative: 'path'});\n }}\n >\n <Trans message=\"Links\" />\n </BreadcrumbItem>\n <BreadcrumbItem className=\"first-letter:capitalize\">\n <Trans message=\"“:name“ clicks\" values={{name: link?.name}} />\n </BreadcrumbItem>\n </Breadcrumb>\n }\n actions={\n link && (\n <ShareLinkButton className=\"flex-shrink-0 text-muted\" link={link} />\n )\n }\n />\n );\n}\n","export default \"__VITE_ASSET__9a950bec__\"","import world from '@common/custom-domains/datatable/world.svg';\nimport {Trans} from '@common/i18n/trans';\nimport {\n DataTableEmptyStateMessage,\n DataTableEmptyStateMessageProps,\n} from '@common/datatable/page/data-table-emty-state-message';\nimport React from 'react';\n\nexport function DomainsEmptyStateMessage(\n props: Partial<DataTableEmptyStateMessageProps>\n) {\n return (\n <DataTableEmptyStateMessage\n {...props}\n image={world}\n title={<Trans message=\"No domains have been connected yet\" />}\n filteringTitle={<Trans message=\"No matching domains\" />}\n />\n );\n}\n","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 {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';\nimport {CustomDomain} from '@common/custom-domains/custom-domain';\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n domain: CustomDomain;\n}\n\nexport function useDeleteDomain() {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (props: Payload) => deleteDomain(props),\n onSuccess: (response, props) => {\n toast.positive(\n trans(\n message('“:domain” removed', {values: {domain: props.domain.host}}),\n ),\n );\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('custom-domain'),\n });\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction deleteDomain({domain}: Payload): Promise<Response> {\n return apiClient.delete(`custom-domain/${domain.id}`).then(r => r.data);\n}\n","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 {useDeleteDomain} from '@common/custom-domains/datatable/requests/use-delete-domain';\nimport {CustomDomain} from '@common/custom-domains/custom-domain';\n\ninterface DeleteDomainButtonProps {\n domain: CustomDomain;\n}\nexport function DeleteDomainButton({domain}: DeleteDomainButtonProps) {\n const deleteDomain = useDeleteDomain();\n\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={isConfirmed => {\n if (isConfirmed) {\n deleteDomain.mutate({domain});\n }\n }}\n >\n <Button\n variant=\"outline\"\n color=\"danger\"\n size=\"xs\"\n disabled={deleteDomain.isPending}\n >\n <Trans message=\"Remove\" />\n </Button>\n <ConfirmationDialog\n title={<Trans message=\"Remove domain?\" />}\n body={\n <Trans\n message=\"Are you sure you want to remove “:domain“?\"\n values={{domain: domain.host}}\n />\n }\n confirm={<Trans message=\"Remove\" />}\n isDanger\n />\n </DialogTrigger>\n );\n}\n","import {CustomDomain} from '@common/custom-domains/custom-domain';\nimport {ColumnConfig} from '@common/datatable/column-config';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Trans} from '@common/i18n/trans';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\nimport React from 'react';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {BooleanIndicator} from '@common/datatable/column-templates/boolean-indicator';\nimport {DeleteDomainButton} from '@common/custom-domains/datatable/delete-domain-button';\n\nexport const domainsDatatableColumns: ColumnConfig<CustomDomain>[] = [\n {\n key: 'host',\n allowsSorting: true,\n header: () => <Trans message=\"Domain\" />,\n width: 'flex-3 min-w-200',\n visibleInMode: 'all',\n body: domain => (\n <div>\n <div className=\"flex items-center gap-6 whitespace-nowrap\">\n <RemoteFavicon url={domain.host} />\n <a\n className=\"block font-semibold hover:underline overflow-ellipsis overflow-hidden w-min\"\n href={domain.host}\n target=\"_blank\"\n rel=\"noreferrer\"\n data-testid=\"host-name\"\n >\n {domain.host}\n </a>\n </div>\n </div>\n ),\n },\n {\n key: 'user_id',\n allowsSorting: true,\n header: () => <Trans message=\"Owner\" />,\n width: 'flex-2 min-w-140',\n body: domain => {\n if (!domain.user) return '';\n return (\n <NameWithAvatar\n image={domain.user.avatar}\n label={domain.user.display_name}\n description={domain.user.email}\n />\n );\n },\n },\n {\n key: 'global',\n allowsSorting: true,\n header: () => <Trans message=\"Global\" />,\n body: domain => <BooleanIndicator value={domain.global} />,\n },\n {\n key: 'updated_at',\n allowsSorting: true,\n header: () => <Trans message=\"Last updated\" />,\n body: domain =>\n domain.updated_at ? <FormattedDate date={domain.updated_at} /> : '',\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n width: 'w-80 flex-shrink-0',\n visibleInMode: 'all',\n align: 'end',\n body: domain => <DeleteDomainButton domain={domain} />,\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';\n\nexport const DomainsDatatableFilters: BackendFilter[] = [\n {\n key: 'global',\n label: message('Global'),\n description: message('Whether domain is marked as global'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.BooleanToggle,\n defaultValue: true,\n },\n },\n createdAtFilter({\n description: message('Date domain was created'),\n }),\n updatedAtFilter({\n description: message('Date domain was last updated'),\n }),\n {\n key: 'user_id',\n label: message('Owner'),\n description: message('User domain belongs to'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.SelectModel,\n model: USER_MODEL,\n },\n },\n];\n","export function isSubdomain(host: string): boolean {\n return (host.replace('www.', '').match(/\\./g) || []).length > 1;\n}\n","import {ProgressCircle} from '@common/ui/progress/progress-circle';\nimport {Trans} from '@common/i18n/trans';\nimport {ReactNode} from 'react';\n\ninterface DomainProgressIndicatorProps {\n message?: ReactNode;\n}\nexport function DomainProgressIndicator({\n message = <Trans message=\"Checking DNS configuration...\" />,\n}: DomainProgressIndicatorProps) {\n return (\n <div className=\"flex items-center gap-18 text-base p-12 rounded bg-primary/10 text-primary\">\n <ProgressCircle isIndeterminate size=\"sm\" />\n <div>{message}</div>\n </div>\n );\n}\n","import {useSettings} from '@common/core/settings/use-settings';\nimport {Trans} from '@common/i18n/trans';\nimport {ReactNode} from 'react';\nimport {ConnectDomainStepProps} from '@common/custom-domains/datatable/connect-domain-dialog/connect-domain-step';\nimport {isSubdomain} from '@common/custom-domains/datatable/connect-domain-dialog/is-subdomain';\nimport {DomainProgressIndicator} from '@common/custom-domains/datatable/connect-domain-dialog/domain-progress-indicator';\n\nexport function InfoStep({\n stepper: {\n state: {isLoading, host, serverIp},\n },\n}: ConnectDomainStepProps) {\n const {base_url} = useSettings();\n\n if (isLoading) {\n return <DomainProgressIndicator />;\n }\n\n if (isSubdomain(host)) {\n return (\n <Message\n title={\n <Trans message=\"Add this CNAME record to your domain by visiting your DNS provider or registrar.\" />\n }\n record=\"CNAME\"\n target={base_url}\n />\n );\n }\n\n return (\n <Message\n title={\n <Trans message=\"Add this A record to your domain by visiting your DNS provider or registrar.\" />\n }\n record=\"A\"\n target={serverIp}\n />\n );\n}\n\ninterface MessageProps {\n title: ReactNode;\n record: string;\n target: string;\n}\n\nfunction Message({title, record, target}: MessageProps) {\n return (\n <div>\n <div className=\"text-muted mb-10\">{title}</div>\n <div className=\"flex items-center gap-12 text-base p-12 rounded bg-primary/10 text-primary font-semibold\">\n <div>{record}</div>\n {target}\n </div>\n </div>\n );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Fragment} from 'react';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {ConnectDomainStepProps} from '@common/custom-domains/datatable/connect-domain-dialog/connect-domain-step';\n\nexport function HostStep({stepper}: ConnectDomainStepProps) {\n return (\n <Fragment>\n <FormTextField\n autoFocus\n name=\"host\"\n required\n maxLength={100}\n label={<Trans message=\"Host\" />}\n placeholder=\"https://example.com\"\n description={\n <Trans message=\"Enter the exact domain name you want your items to be accessible with. It can be a subdomain (example.yourdomain.com) or root domain (yourdomain.com).\" />\n }\n />\n {stepper.showGlobalField && (\n <FormSwitch\n className=\"mt-24 border-t pt-24\"\n name=\"global\"\n description={\n <Trans message=\"Whether all users should be able to select this domain.\" />\n }\n >\n <Trans message=\"Global\" />\n </FormSwitch>\n )}\n </Fragment>\n );\n}\n","import {useConnectDomainStepper} from '@common/custom-domains/datatable/connect-domain-dialog/use-connect-domain-stepper';\n\nexport enum ConnectDomainStep {\n Host = 1,\n Info = 2,\n ValidationFailed = 3,\n Finalize = 4,\n}\n\nexport interface ConnectDomainStepProps {\n stepper: ReturnType<typeof useConnectDomainStepper>;\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\n\ninterface Response extends BackendResponse {\n result: 'connected' | null;\n}\n\ninterface Payload {\n host: string;\n}\n\nexport function useValidateDomainDns() {\n return useMutation({\n mutationFn: (props: Payload) => authorize(props),\n });\n}\n\nfunction authorize(payload: Payload): Promise<Response> {\n return apiClient\n .post('secure/custom-domain/validate/2BrM45vvfS/api', payload)\n .then(r => r.data);\n}\n","import {useSettings} from '@common/core/settings/use-settings';\nimport {Trans} from '@common/i18n/trans';\nimport {Fragment, ReactNode} from 'react';\nimport {ConnectDomainStepProps} from '@common/custom-domains/datatable/connect-domain-dialog/connect-domain-step';\nimport {useAuth} from '@common/auth/use-auth';\nimport {isSubdomain} from '@common/custom-domains/datatable/connect-domain-dialog/is-subdomain';\nimport {WarningIcon} from '@common/icons/material/Warning';\nimport {useValidateDomainDns} from '@common/custom-domains/datatable/requests/use-validate-domain-dns';\nimport {DomainProgressIndicator} from '@common/custom-domains/datatable/connect-domain-dialog/domain-progress-indicator';\n\nexport function ValidationFailedStep({\n stepper: {\n goToNextStep,\n state: {host, serverIp, isLoading, validationFailReason},\n },\n}: ConnectDomainStepProps) {\n const validateDns = useValidateDomainDns();\n const {base_url} = useSettings();\n const {hasPermission} = useAuth();\n const subdomain = isSubdomain(host);\n const record = subdomain ? 'CNAME' : 'A';\n const location = subdomain ? base_url : serverIp;\n\n if (isLoading) {\n return <DomainProgressIndicator />;\n }\n\n const errorMessage =\n validationFailReason === 'serverNotConfigured' && hasPermission('admin') ? (\n <ErrorMessage>\n <Trans\n message=\"DNS records for the domain are setup, however it seems that your server is not configured to handle requests from “:host“\"\n values={{host: location}}\n />\n </ErrorMessage>\n ) : (\n <ErrorMessage>\n <Trans\n message=\"The domain is missing :record record pointing to :location or the changes haven't propagated yet.\"\n values={{record, location}}\n />\n </ErrorMessage>\n );\n\n return (\n <Fragment>\n {errorMessage}\n <div className=\"whitespace-nowrap text-xs text-muted mt-10\">\n <Trans\n message=\"You can wait and try again later, or <b>refresh</b>\"\n values={{\n b: (text: string) => (\n <button\n disabled={isLoading}\n type=\"button\"\n className=\"text-primary underline\"\n onClick={() => {\n goToNextStep();\n }}\n >\n {text}\n </button>\n ),\n }}\n />\n </div>\n </Fragment>\n );\n}\n\ninterface ErrorMessageProps {\n children: ReactNode;\n}\nfunction ErrorMessage({children}: ErrorMessageProps) {\n return (\n <div className=\"flex items-center gap-12 text-base p-12 rounded bg-warning/15 text-warning font-medium\">\n <WarningIcon size=\"lg\" />\n {children}\n </div>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\n\ninterface Response extends BackendResponse {\n serverIp: string;\n}\n\nexport interface AuthorizeDomainConnectPayload {\n host: string;\n}\n\n// check if is this host is not connected already and if user has permissions to connect domains\nexport function useAuthorizeDomainConnect(\n form: UseFormReturn<AuthorizeDomainConnectPayload>,\n) {\n return useMutation({\n mutationFn: (props: AuthorizeDomainConnectPayload) => authorize(props),\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction authorize(payload: AuthorizeDomainConnectPayload): Promise<Response> {\n return apiClient\n .post('secure/custom-domain/authorize/store', payload)\n .then(r => r.data);\n}\n","import {useMutation, useQueryClient} from '@tanstack/react-query';\nimport {apiClient} 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';\nimport {CustomDomain} from '@common/custom-domains/custom-domain';\n\ninterface Response extends BackendResponse {\n domain: CustomDomain;\n}\n\ninterface Payload {\n host: string;\n global?: boolean;\n}\n\nexport function useConnectDomain() {\n const {trans} = useTrans();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (props: Payload) => connectDomain(props),\n onSuccess: response => {\n toast.positive(\n trans(\n message('“:domain” connected', {\n values: {domain: response.domain.host},\n }),\n ),\n );\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('custom-domain'),\n });\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction connectDomain(payload: Payload): Promise<Response> {\n return apiClient.post('custom-domain', payload).then(r => r.data);\n}\n","import {useState} from 'react';\nimport {ConnectDomainStep} from '@common/custom-domains/datatable/connect-domain-dialog/connect-domain-step';\nimport {DomainValidationErrorResponse} from '@common/custom-domains/datatable/connect-domain-dialog/connect-domain-dialog';\nimport {\n AuthorizeDomainConnectPayload,\n useAuthorizeDomainConnect,\n} from '@common/custom-domains/datatable/requests/use-authorize-domain-connect';\nimport {useForm} from 'react-hook-form';\nimport {AxiosError} from 'axios';\nimport {useValidateDomainDns} from '@common/custom-domains/datatable/requests/use-validate-domain-dns';\nimport {useConnectDomain} from '@common/custom-domains/datatable/requests/use-connect-domain';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\n\ninterface ConnectDomainStepperState {\n isLoading: boolean;\n currentStep: ConnectDomainStep;\n host: string;\n serverIp: string;\n validationFailReason?: DomainValidationErrorResponse['failReason'];\n}\n\ninterface StepHandlerResult {\n status: 'success' | 'error';\n newState?: Partial<ConnectDomainStepperState>;\n}\n\ninterface UseConnectDomainStepperProps {\n showGlobalField?: boolean;\n}\nexport function useConnectDomainStepper({\n showGlobalField,\n}: UseConnectDomainStepperProps) {\n const {close} = useDialogContext();\n const form = useForm<AuthorizeDomainConnectPayload>();\n const authorizeDomainConnect = useAuthorizeDomainConnect(form);\n const validateDns = useValidateDomainDns();\n const connectDomain = useConnectDomain();\n\n const [state, setState] = useState<ConnectDomainStepperState>({\n isLoading: false,\n currentStep: ConnectDomainStep.Host,\n host: '',\n serverIp: '',\n });\n\n const startLoading = () => {\n setState({\n ...state,\n isLoading: true,\n });\n };\n\n const handleDomainValidation = (): Promise<StepHandlerResult> => {\n return new Promise(resolve => {\n validateDns.mutate(\n {host: state.host},\n {\n onSuccess: () => {\n resolve({\n status: 'success',\n newState: {validationFailReason: undefined},\n });\n },\n onError: err => {\n resolve({\n status: 'error',\n newState: {\n validationFailReason: (\n err as AxiosError<DomainValidationErrorResponse>\n ).response?.data.failReason,\n },\n });\n },\n }\n );\n });\n };\n\n const handleDomainAuthorization = (): Promise<StepHandlerResult> => {\n return new Promise(resolve => {\n authorizeDomainConnect.mutate(form.getValues(), {\n onSuccess: response => {\n resolve({\n status: 'success',\n newState: {\n host: form.getValues().host,\n serverIp: response.serverIp,\n },\n });\n },\n onError: () => {\n resolve({status: 'error'});\n },\n });\n });\n };\n\n const hasPreviousStep = state.currentStep !== ConnectDomainStep.Host;\n\n const goToPreviousStep = () => {\n if (!hasPreviousStep || state.isLoading) return;\n\n if (state.currentStep === ConnectDomainStep.Info) {\n setState({\n ...state,\n currentStep: ConnectDomainStep.Host,\n });\n } else if (state.currentStep === ConnectDomainStep.ValidationFailed) {\n setState({\n ...state,\n currentStep: ConnectDomainStep.Info,\n });\n }\n };\n\n const goToNextStep = async () => {\n if (state.currentStep === ConnectDomainStep.Host) {\n startLoading();\n const result = await handleDomainAuthorization();\n setState({\n ...state,\n ...result.newState,\n isLoading: false,\n currentStep:\n result.status === 'success'\n ? ConnectDomainStep.Info\n : ConnectDomainStep.Host,\n });\n } else if (\n state.currentStep === ConnectDomainStep.Info ||\n state.currentStep === ConnectDomainStep.ValidationFailed\n ) {\n startLoading();\n const validationResult = await handleDomainValidation();\n const nextStep =\n validationResult.status === 'success'\n ? ConnectDomainStep.Finalize\n : ConnectDomainStep.ValidationFailed;\n setState({\n ...state,\n ...validationResult.newState,\n isLoading: false,\n currentStep: nextStep,\n });\n if (nextStep === ConnectDomainStep.Finalize) {\n connectDomain.mutate(form.getValues(), {\n onSettled: () => {\n close();\n },\n });\n }\n }\n };\n\n return {\n form,\n state,\n goToNextStep,\n hasPreviousStep,\n goToPreviousStep,\n showGlobalField,\n };\n}\n","import {Trans} from '@common/i18n/trans';\nimport {DomainProgressIndicator} from '@common/custom-domains/datatable/connect-domain-dialog/domain-progress-indicator';\n\nexport function FinalizeStep() {\n return (\n <div>\n <DomainProgressIndicator\n message={<Trans message=\"Connecting domain...\" />}\n />\n <div className=\"text-muted mt-10 text-xs\">\n <Trans message=\"Don't close this window until domain is connected.\" />\n </div>\n </div>\n );\n}\n","import {Trans} from '@common/i18n/trans';\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 {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 {KeyboardArrowRightIcon} from '@common/icons/material/KeyboardArrowRight';\nimport {InfoStep} from '@common/custom-domains/datatable/connect-domain-dialog/info-step';\nimport {HostStep} from '@common/custom-domains/datatable/connect-domain-dialog/host-step';\nimport {ConnectDomainStep} from '@common/custom-domains/datatable/connect-domain-dialog/connect-domain-step';\nimport {BackendErrorResponse} from '@common/errors/backend-error-response';\nimport {ValidationFailedStep} from '@common/custom-domains/datatable/connect-domain-dialog/validation-failed-step';\nimport {useConnectDomainStepper} from '@common/custom-domains/datatable/connect-domain-dialog/use-connect-domain-stepper';\nimport {Form} from '@common/ui/forms/form';\nimport {FinalizeStep} from '@common/custom-domains/datatable/connect-domain-dialog/finalize-step';\nimport {KeyboardArrowLeftIcon} from '@common/icons/material/KeyboardArrowLeft';\n\nexport interface DomainValidationErrorResponse extends BackendErrorResponse {\n failReason: 'serverNotConfigured' | 'dnsNotSetup';\n}\n\ninterface ConnectDomainDialogProps {\n showGlobalField?: boolean;\n}\nexport function ConnectDomainDialog({\n showGlobalField,\n}: ConnectDomainDialogProps) {\n const {close, formId} = useDialogContext();\n const stepper = useConnectDomainStepper({showGlobalField});\n const StepComponent = getStepComponent(stepper.state.currentStep);\n\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Connect domain\" />\n </DialogHeader>\n <DialogBody>\n <Form\n form={stepper.form}\n id={formId}\n onSubmit={() => {\n stepper.goToNextStep();\n }}\n >\n <StepComponent stepper={stepper} />\n </Form>\n </DialogBody>\n <DialogFooter\n startAction={\n <Button\n variant=\"text\"\n onClick={() => {\n close();\n }}\n >\n <Trans message=\"Cancel\" />\n </Button>\n }\n >\n {stepper.hasPreviousStep && (\n <Button\n startIcon={<KeyboardArrowLeftIcon />}\n color=\"primary\"\n variant=\"text\"\n onClick={() => {\n stepper.goToPreviousStep();\n }}\n disabled={stepper.state.isLoading}\n >\n <Trans message=\"Previous\" />\n </Button>\n )}\n <Button\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n form={formId}\n endIcon={<KeyboardArrowRightIcon />}\n disabled={stepper.state.isLoading}\n >\n <Trans message=\"Next\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n\nfunction getStepComponent(step: ConnectDomainStep) {\n switch (step) {\n case ConnectDomainStep.Host:\n return HostStep;\n case ConnectDomainStep.Info:\n return InfoStep;\n case ConnectDomainStep.ValidationFailed:\n return ValidationFailedStep;\n case ConnectDomainStep.Finalize:\n return FinalizeStep;\n }\n}\n","import {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {Trans} from '@common/i18n/trans';\nimport React, {useMemo} from 'react';\nimport {DomainsEmptyStateMessage} from '@common/custom-domains/datatable/domains-empty-state-message';\nimport {domainsDatatableColumns} from '@common/custom-domains/datatable/domains-datatable-columns';\nimport {DomainsDatatableFilters} from '@common/custom-domains/datatable/domains-datatable-filters';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {ConnectDomainDialog} from '@common/custom-domains/datatable/connect-domain-dialog/connect-domain-dialog';\nimport {useAuth} from '@common/auth/use-auth';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\nimport {DeleteDomainButton} from '@common/custom-domains/datatable/delete-domain-button';\nimport {CustomDomain} from '@common/custom-domains/custom-domain';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\n\nconst datatableColumns = domainsDatatableColumns.map(col => {\n if (col.key === 'actions') {\n return {\n ...col,\n body: (domain: CustomDomain) => (\n <PermissionAwareButton resource={domain} action=\"delete\">\n <DeleteDomainButton domain={domain} />\n </PermissionAwareButton>\n ),\n };\n }\n return col;\n});\n\ninterface DomainsDatatablePageProps {\n forCurrentUser?: boolean;\n}\nexport function DomainsDatatablePage({\n forCurrentUser,\n}: DomainsDatatablePageProps) {\n const {user} = useAuth();\n const {workspaceId} = useActiveWorkspaceId();\n const {filters, columns} = useMemo(() => {\n const columns = !forCurrentUser\n ? datatableColumns\n : datatableColumns.filter(col => col.key !== 'user_id');\n\n const filters = !forCurrentUser\n ? DomainsDatatableFilters\n : DomainsDatatableFilters.filter(filter => filter.key !== 'user_id');\n\n return {filters, columns};\n }, [forCurrentUser]);\n\n const userId = forCurrentUser ? user?.id : '';\n\n return (\n <DataTablePage\n enableSelection={false}\n endpoint=\"custom-domain\"\n queryParams={{userId, workspaceId, with: 'user'}}\n title={<Trans message=\"Branded domains\" />}\n headerContent={<InfoTrigger />}\n filters={filters}\n columns={columns}\n actions={<Actions />}\n emptyStateMessage={<DomainsEmptyStateMessage />}\n />\n );\n}\n\nfunction Actions() {\n const {hasPermission} = useAuth();\n return (\n <PermissionAwareButton resource=\"customDomain\" action=\"create\">\n <DialogTrigger type=\"modal\">\n <DataTableAddItemButton>\n <Trans message=\"Connect domain\" />\n </DataTableAddItemButton>\n <ConnectDomainDialog showGlobalField={hasPermission('admin')} />\n </DialogTrigger>\n </PermissionAwareButton>\n );\n}\n\nfunction InfoTrigger() {\n return (\n <InfoDialogTrigger\n body={\n <Trans message=\"Create trusted links with your own branded domains. Once connected, you can set the domain as default or only use it for specific links.\" />\n }\n />\n );\n}\n","export interface SupportedTrackingPixel {\n name: string;\n type: 'number' | 'text';\n pattern?: string;\n docsUrl?: string;\n}\n\nexport const SupportedTrackingPixels: SupportedTrackingPixel[] = [\n {\n name: 'facebook',\n type: 'number',\n docsUrl:\n 'https://www.facebook.com/business/help/952192354843755?id=1205376682832142',\n },\n {\n name: 'twitter',\n type: 'number',\n docsUrl:\n 'https://business.twitter.com/en/help/campaign-measurement-and-analytics/conversion-tracking-for-websites.html',\n },\n {\n name: 'google-tag-manager',\n type: 'text',\n pattern: 'GTM-[a-zA-Z0-9]+',\n docsUrl: 'https://tagmanager.google.com',\n },\n {\n name: 'google-analytics',\n type: 'text',\n docsUrl: 'https://analytics.google.com',\n },\n {\n name: 'adwords',\n type: 'number',\n docsUrl: 'https://ads.google.com',\n },\n {\n name: 'bing',\n type: 'number',\n docsUrl:\n 'https://about.ads.microsoft.com/en-us/solutions/tools/universal-event-tracking',\n },\n {\n name: 'pinterest',\n type: 'number',\n docsUrl:\n 'https://help.pinterest.com/en/business/article/track-conversions-with-pinterest-tag',\n },\n {\n name: 'linkedin',\n type: 'text',\n docsUrl:\n 'https://www.linkedin.com/help/lms/answer/a418880/add-the-linkedin-insight-tag-to-your-website',\n },\n {\n name: 'quora',\n type: 'text',\n pattern: '[a-z0-9]+',\n docsUrl:\n 'https://quoraadsupport.zendesk.com/hc/en-us/articles/115010303387-About-the-Quora-Pixel',\n },\n {\n name: 'adroll',\n type: 'text',\n docsUrl:\n 'https://help.adroll.com/hc/en-us/articles/211846018-What-is-the-AdRoll-Pixel',\n },\n {\n name: 'nexus-segment',\n type: 'text',\n docsUrl: 'https://segment.com/catalog/integrations/appnexus',\n },\n {\n name: 'custom',\n type: 'text',\n },\n];\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const HelpOutlineIcon = createSvgIcon(\n <path d=\"M11 18h2v-2h-2v2zm1-16C6.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 8zm0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4z\" />\n, 'HelpOutlineOutlined');\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {UseFormReturn} from 'react-hook-form';\nimport {Form} from '@common/ui/forms/form';\nimport {Trans} from '@common/i18n/trans';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {SupportedTrackingPixels} from '@app/dashboard/tracking-pixels/supported-tracking-pixels';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\nimport {TuneIcon} from '@common/icons/material/Tune';\nimport {Fragment} from 'react';\nimport {HelpOutlineIcon} from '@common/icons/material/HelpOutline';\n\nexport interface CrupdatePixelFormValue {\n name: string;\n type: string;\n pixel_id?: string | number;\n head_code?: string;\n body_code?: string;\n}\n\ninterface CrupdatePixelFormProps {\n formId: string;\n form: UseFormReturn<CrupdatePixelFormValue>;\n onSubmit: (value: CrupdatePixelFormValue) => void;\n}\nexport function CrupdatePixelForm({\n formId,\n form,\n onSubmit,\n}: CrupdatePixelFormProps) {\n const {watch} = form;\n const type = watch('type');\n const config = SupportedTrackingPixels.find(p => p.name === type);\n\n return (\n <Form id={formId} form={form} onSubmit={onSubmit}>\n <FormTextField\n autoFocus\n required\n name=\"name\"\n label={<Trans message=\"Name\" />}\n className=\"mb-24\"\n />\n <FormSelect\n name=\"type\"\n selectionMode=\"single\"\n className=\"mb-24\"\n label={<Trans message=\"Type\" />}\n description={\n config?.docsUrl ? (\n <div className=\"flex items-center gap-6\">\n <HelpOutlineIcon size=\"sm\" />\n <a\n data-testid=\"pixel-docs-link\"\n href={config.docsUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"underline\"\n >\n <Trans message=\"More information\" />\n </a>\n </div>\n ) : null\n }\n >\n {SupportedTrackingPixels.map(pixel => (\n <Item\n capitalizeFirst\n key={pixel.name}\n value={pixel.name}\n startIcon={\n pixel.docsUrl ? (\n <RemoteFavicon url={pixel.docsUrl} />\n ) : (\n <TuneIcon size=\"xs\" />\n )\n }\n >\n {pixel.name}\n </Item>\n ))}\n </FormSelect>\n {type !== 'custom' && (\n <FormTextField\n required\n pattern={config?.pattern}\n type={config?.type === 'number' ? 'number' : 'text'}\n name=\"pixel_id\"\n label={<Trans message=\"Pixel ID\" />}\n />\n )}\n {type === 'custom' && <CustomCodeFields />}\n </Form>\n );\n}\n\nfunction CustomCodeFields() {\n return (\n <Fragment>\n <FormTextField\n name=\"head_code\"\n label={<Trans message=\"Custom code for page head\" />}\n className=\"mb-24\"\n inputElementType=\"textarea\"\n rows={5}\n />\n <FormTextField\n name=\"body_code\"\n label={<Trans message=\"Custom code for page body\" />}\n inputElementType=\"textarea\"\n rows={5}\n />\n </Fragment>\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 {message} from '@common/i18n/message';\nimport {toast} from '@common/ui/toast/toast';\nimport {CrupdatePixelFormValue} from '@app/dashboard/tracking-pixels/crupdate-dialog/crupdate-pixel-form';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\nexport function useUpdatePixel(\n pixelId: number,\n form: UseFormReturn<CrupdatePixelFormValue>,\n) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (props: CrupdatePixelFormValue) => createPixel(pixelId, props),\n onSuccess: () => {\n toast.positive(trans(message('Pixel updated')));\n queryClient.invalidateQueries({queryKey: DatatableDataQueryKey('tp')});\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction createPixel(\n pixelId: number,\n payload: CrupdatePixelFormValue,\n): Promise<Response> {\n return apiClient.put(`tp/${pixelId}`, payload).then(r => r.data);\n}\n","import {useForm} from 'react-hook-form';\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 {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {\n CrupdatePixelForm,\n CrupdatePixelFormValue,\n} from '@app/dashboard/tracking-pixels/crupdate-dialog/crupdate-pixel-form';\nimport {Trans} from '@common/i18n/trans';\nimport {TrackingPixel} from '@app/dashboard/tracking-pixels/tracking-pixel';\nimport {useUpdatePixel} from '@app/dashboard/tracking-pixels/requests/use-update-pixel';\n\ninterface UpdatePixelDialogProps {\n pixel: TrackingPixel;\n}\nexport function UpdatePixelDialog({pixel}: UpdatePixelDialogProps) {\n const form = useForm<CrupdatePixelFormValue>({\n defaultValues: {\n name: pixel.name,\n type: pixel.type,\n pixel_id: pixel.pixel_id,\n head_code: pixel.head_code,\n body_code: pixel.body_code,\n },\n });\n const {formId, close} = useDialogContext();\n const updatePixel = useUpdatePixel(pixel.id, form);\n\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Update “:name“\" values={{name: pixel.name}} />\n </DialogHeader>\n <DialogBody>\n <CrupdatePixelForm\n formId={formId}\n form={form}\n onSubmit={values => {\n updatePixel.mutate(values, {\n onSuccess: () => {\n close();\n },\n });\n }}\n />\n </DialogBody>\n <DialogFooter>\n <Button\n variant=\"text\"\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={updatePixel.isPending}\n >\n <Trans message=\"Update\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {TrackingPixel} from '@app/dashboard/tracking-pixels/tracking-pixel';\nimport {SupportedTrackingPixels} from '@app/dashboard/tracking-pixels/supported-tracking-pixels';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\nimport {LinkStyle} from '@common/ui/buttons/external-link';\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 {UpdatePixelDialog} from '@app/dashboard/tracking-pixels/crupdate-dialog/update-pixel-dialog';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\n\nexport const TrackingPixelsDatatableColumns: ColumnConfig<TrackingPixel>[] = [\n {\n key: 'name',\n allowsSorting: true,\n width: 'flex-3 min-w-200',\n visibleInMode: 'all',\n header: () => <Trans message=\"Name\" />,\n body: pixel => pixel.name,\n },\n {\n key: 'type',\n allowsSorting: true,\n header: () => <Trans message=\"Type\" />,\n body: pixel => {\n const docsUrl = SupportedTrackingPixels.find(\n p => p.name === pixel.type\n )?.docsUrl;\n\n return (\n <div>\n <div className=\"flex items-center gap-10\">\n {docsUrl ? <RemoteFavicon url={docsUrl} /> : null}\n {docsUrl ? (\n <a\n href={docsUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={LinkStyle}\n >\n {pixel.type}\n </a>\n ) : (\n pixel.type\n )}\n </div>\n </div>\n );\n },\n },\n {\n key: 'user_id',\n allowsSorting: true,\n header: () => <Trans message=\"Owner\" />,\n width: 'flex-2 min-w-140',\n body: pixel => {\n if (!pixel.user) return '';\n return (\n <NameWithAvatar\n image={pixel.user.avatar}\n label={pixel.user.display_name}\n description={pixel.user.email}\n />\n );\n },\n },\n {\n key: 'pixel_id',\n header: () => <Trans message=\"Pixel ID\" />,\n body: pixel => pixel.pixel_id,\n },\n {\n key: 'updated_at',\n allowsSorting: true,\n header: () => <Trans message=\"Last updated\" />,\n body: pixel =>\n pixel.updated_at ? <FormattedDate date={pixel.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 body: pixel => {\n return (\n <PermissionAwareButton resource={pixel} action=\"update\">\n <DialogTrigger type=\"modal\">\n <IconButton className=\"text-muted\">\n <EditIcon />\n </IconButton>\n <UpdatePixelDialog pixel={pixel} />\n </DialogTrigger>\n </PermissionAwareButton>\n );\n },\n },\n];\n","export default \"__VITE_ASSET__537f9c7f__\"","import {\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';\nimport {USER_MODEL} from '@common/auth/user';\nimport {SupportedTrackingPixels} from '@app/dashboard/tracking-pixels/supported-tracking-pixels';\n\nexport const TrackingPixelsDatatableFilters: BackendFilter[] = [\n {\n key: 'type',\n label: message('Type'),\n description: message('Type of the pixel'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n options: SupportedTrackingPixels.map((pixel, index) => {\n return {key: pixel.name, value: pixel.name, label: message(pixel.name)};\n }),\n },\n },\n createdAtFilter({\n description: message('Date pixel was created'),\n }),\n updatedAtFilter({\n description: message('Date pixel was last updated'),\n }),\n {\n key: 'user_id',\n label: message('Owner'),\n description: message('User pixel belongs to'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.SelectModel,\n model: USER_MODEL,\n },\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 {message} from '@common/i18n/message';\nimport {toast} from '@common/ui/toast/toast';\nimport {CrupdatePixelFormValue} from '@app/dashboard/tracking-pixels/crupdate-dialog/crupdate-pixel-form';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\nexport function useCreatePixel(form: UseFormReturn<CrupdatePixelFormValue>) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (props: CrupdatePixelFormValue) => createPixel(props),\n onSuccess: () => {\n toast.positive(trans(message('Pixel created')));\n queryClient.invalidateQueries({queryKey: DatatableDataQueryKey('tp')});\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction createPixel(payload: CrupdatePixelFormValue): Promise<Response> {\n return apiClient.post('tp', payload).then(r => r.data);\n}\n","import {useForm} from 'react-hook-form';\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 {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {useCreatePixel} from '@app/dashboard/tracking-pixels/requests/use-create-pixel';\nimport {\n CrupdatePixelForm,\n CrupdatePixelFormValue,\n} from '@app/dashboard/tracking-pixels/crupdate-dialog/crupdate-pixel-form';\nimport {Trans} from '@common/i18n/trans';\n\nexport function CreatePixelDialog() {\n const form = useForm<CrupdatePixelFormValue>({\n defaultValues: {type: 'facebook'},\n });\n const {formId, close} = useDialogContext();\n const createPixel = useCreatePixel(form);\n\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Create pixel\" />\n </DialogHeader>\n <DialogBody>\n <CrupdatePixelForm\n formId={formId}\n form={form}\n onSubmit={values => {\n createPixel.mutate(values, {\n onSuccess: () => {\n close();\n },\n });\n }}\n />\n </DialogBody>\n <DialogFooter>\n <Button\n variant=\"text\"\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={createPixel.isPending}\n >\n <Trans message=\"Create\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {useAuth} from '@common/auth/use-auth';\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 React, {useMemo} from 'react';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {TrackingPixelsDatatableColumns} from '@app/dashboard/tracking-pixels/tracking-pixels-datatable-columns';\nimport locationTracking from './location-tracking.svg';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport {TrackingPixelsDatatableFilters} from '@app/dashboard/tracking-pixels/tracking-pixels-datatable-filters';\nimport {CreatePixelDialog} from '@app/dashboard/tracking-pixels/crupdate-dialog/create-pixel-dialog';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\n\ninterface TrackingPixelsDatablePageProps {\n forCurrentUser?: boolean;\n}\nexport function TrackingPixelsDatablePage({\n forCurrentUser,\n}: TrackingPixelsDatablePageProps) {\n const {user} = useAuth();\n const {workspaceId} = useActiveWorkspaceId();\n const {filters, columns} = useMemo(() => {\n const columns = !forCurrentUser\n ? TrackingPixelsDatatableColumns\n : TrackingPixelsDatatableColumns.filter(col => col.key !== 'user_id');\n\n const filters = !forCurrentUser\n ? TrackingPixelsDatatableFilters\n : TrackingPixelsDatatableFilters.filter(\n filter => filter.key !== 'user_id'\n );\n\n return {filters, columns};\n }, [forCurrentUser]);\n\n const userId = forCurrentUser ? user?.id : '';\n\n return (\n <DataTablePage\n endpoint=\"tp\"\n queryParams={{userId, with: 'user', workspaceId}}\n title={<Trans message=\"Tracking pixels\" />}\n filters={filters}\n columns={columns}\n headerContent={<InfoTrigger />}\n actions={<Actions />}\n selectedActions={\n <PermissionAwareButton resource=\"trackingPixel\" action=\"delete\">\n <DeleteSelectedItemsAction />\n </PermissionAwareButton>\n }\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={locationTracking}\n title={<Trans message=\"No tracking pixels have been added yet\" />}\n filteringTitle={<Trans message=\"No matching tracking pixels\" />}\n />\n }\n />\n );\n}\n\nfunction Actions() {\n return (\n <PermissionAwareButton resource=\"trackingPixel\" action=\"create\">\n <DialogTrigger type=\"modal\">\n <DataTableAddItemButton>\n <Trans message=\"Add pixel\" />\n </DataTableAddItemButton>\n <CreatePixelDialog />\n </DialogTrigger>\n </PermissionAwareButton>\n );\n}\n\nfunction InfoTrigger() {\n return (\n <InfoDialogTrigger\n body={\n <Trans message=\"Add third party tracking integration to your links using pixels or custom code snippet.\" />\n }\n />\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 {message} from '@common/i18n/message';\nimport {toast} from '@common/ui/toast/toast';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\nexport interface UpdateLinkPageOptionsPayload {\n hideNavbar: boolean;\n hideFooter: boolean;\n}\n\nexport function useUpdateLinkPageOptions(\n pageId: number | string,\n form: UseFormReturn<UpdateLinkPageOptionsPayload>,\n) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (props: UpdateLinkPageOptionsPayload) =>\n updatePage(pageId, props),\n onSuccess: () => {\n toast.positive(trans(message('Page options updated')));\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('link-page'),\n });\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction updatePage(\n pageId: number | string,\n payload: UpdateLinkPageOptionsPayload,\n): Promise<Response> {\n return apiClient\n .put(`link-page/${pageId}`, {meta: payload})\n .then(r => r.data);\n}\n","import {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {SettingsIcon} from '@common/icons/material/Settings';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {CustomPage} from '@common/admin/custom-pages/custom-page';\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 {Form} from '@common/ui/forms/form';\nimport {useForm} from 'react-hook-form';\nimport {\n UpdateLinkPageOptionsPayload,\n useUpdateLinkPageOptions,\n} from '@app/dashboard/link-pages/requests/use-update-link-page-options';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {NoPermissionButton} from '@app/dashboard/upgrade/no-permission-button';\nimport {useLinkSummary} from '@app/dashboard/layout/sidenav/use-link-summary';\nimport {useAuth} from '@common/auth/use-auth';\n\ninterface LinkPageOptionsTriggerProps {\n page: CustomPage;\n}\nexport function LinkPageOptionsTrigger({page}: LinkPageOptionsTriggerProps) {\n return (\n <DialogTrigger type=\"modal\">\n <Tooltip label={<Trans message=\"Page options\" />}>\n <IconButton className=\"text-muted\">\n <SettingsIcon />\n </IconButton>\n </Tooltip>\n <OptionsDialog page={page} />\n </DialogTrigger>\n );\n}\n\ninterface OptionsDialogProps {\n page: CustomPage;\n}\nfunction OptionsDialog({page}: OptionsDialogProps) {\n const {data} = useLinkSummary();\n const {hasPermission} = useAuth();\n const canChangeOptions =\n data?.usage.custom_pages.options || hasPermission('admin');\n const {formId, close} = useDialogContext();\n const form = useForm<UpdateLinkPageOptionsPayload>({\n defaultValues: {\n hideFooter: Boolean(page.meta?.hideFooter),\n hideNavbar: Boolean(page.meta?.hideNavbar),\n },\n });\n const updateOptions = useUpdateLinkPageOptions(page.id, form);\n\n return (\n <Dialog size=\"sm\">\n <DialogHeader>\n <Trans message=\"Link page options\" />\n </DialogHeader>\n <DialogBody>\n {!canChangeOptions && (\n <NoPermissionButton\n className=\"mb-24\"\n message={\n <Trans message=\"Your current plan does not include link page option editing.\" />\n }\n />\n )}\n <Form\n id={formId}\n form={form}\n onSubmit={values => {\n updateOptions.mutate(values, {onSuccess: close});\n }}\n >\n <FormSwitch\n className=\"mb-24\"\n name=\"hideNavbar\"\n disabled={!canChangeOptions}\n description={\n <Trans message=\"Whether navbar should be hidden on this link page.\" />\n }\n >\n <Trans message=\"Hide navbar\" />\n </FormSwitch>\n <FormSwitch\n name=\"hideFooter\"\n disabled={!canChangeOptions}\n description={\n <Trans message=\"Whether footer should be hidden on this link page.\" />\n }\n >\n <Trans message=\"Hide footer\" />\n </FormSwitch>\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button variant=\"text\" onClick={() => close()}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n form={formId}\n disabled={updateOptions.isPending || !canChangeOptions}\n >\n <Trans message=\"Save\" />\n </Button>\n </DialogFooter>\n </Dialog>\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, {Fragment} from 'react';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {LinkPageOptionsTrigger} from '@app/dashboard/link-pages/link-page-options-trigger';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\n\nexport const LinkPagesDatatableColumns: ColumnConfig<CustomPage>[] = [\n {\n key: 'title',\n allowsSorting: true,\n width: 'flex-2 min-w-200',\n visibleInMode: 'all',\n header: () => <Trans message=\"Title\" />,\n body: page => (\n <Link target=\"_blank\" to={`/pages/${page.slug}`} className={LinkStyle}>\n {page.title}\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: '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 <Fragment>\n <LinkPageOptionsTrigger page={page} />\n <PermissionAwareButton resource={page} action=\"update\">\n <Tooltip label={<Trans message=\"Edit page\" />}>\n <IconButton\n size=\"md\"\n className=\"text-muted\"\n elementType={Link}\n to={`${page.id}/edit`}\n >\n <EditIcon />\n </IconButton>\n </Tooltip>\n </PermissionAwareButton>\n </Fragment>\n ),\n },\n];\n","import {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport {CustomPageDatatableFilters} from '@common/admin/custom-pages/custom-page-datatable-filters';\nimport {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {DeleteSelectedItemsAction} from '@common/datatable/page/delete-selected-items-action';\nimport {useAuth} from '@common/auth/use-auth';\nimport React, {useContext, useMemo} from 'react';\nimport {Trans} from '@common/i18n/trans';\nimport {Link} from 'react-router-dom';\nimport articlesSvg from '@common/admin/custom-pages/articles.svg';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\nimport {LinkPagesDatatableColumns} from '@app/dashboard/link-pages/link-pages-datatable-columns';\n\ninterface CustomPageDatablePageProps {\n forCurrentUser?: boolean;\n}\nexport function LinkPagesDatatablePage({\n forCurrentUser,\n}: CustomPageDatablePageProps) {\n const config = useContext(SiteConfigContext);\n const {user} = useAuth();\n const {workspaceId} = useActiveWorkspaceId();\n const {filters, columns} = useMemo(() => {\n const columns = !forCurrentUser\n ? LinkPagesDatatableColumns\n : LinkPagesDatatableColumns.filter(col => col.key !== 'user_id');\n\n const filters = !forCurrentUser\n ? CustomPageDatatableFilters(config)\n : CustomPageDatatableFilters(config).filter(\n filter => filter.key !== 'user_id'\n );\n\n return {filters, columns};\n }, [forCurrentUser, config]);\n\n const userId = forCurrentUser ? user?.id : '';\n\n return (\n <DataTablePage\n endpoint=\"link-page\"\n title={<Trans message=\"Link pages\" />}\n filters={filters}\n columns={columns}\n headerContent={<InfoTrigger />}\n queryParams={{userId, with: 'user', workspaceId}}\n actions={<Actions />}\n selectedActions={\n <PermissionAwareButton resource=\"customPage\" action=\"delete\">\n <DeleteSelectedItemsAction />\n </PermissionAwareButton>\n }\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={articlesSvg}\n title={<Trans message=\"No link pages have been created yet\" />}\n filteringTitle={<Trans message=\"No matching link pages\" />}\n />\n }\n />\n );\n}\n\nfunction Actions() {\n return (\n <PermissionAwareButton resource=\"customPage\" action=\"create\">\n <DataTableAddItemButton elementType={Link} to=\"new\">\n <Trans message=\"New page\" />\n </DataTableAddItemButton>\n </PermissionAwareButton>\n );\n}\n\nfunction InfoTrigger() {\n return (\n <InfoDialogTrigger\n body={\n <Trans message=\"Show a transitional page with fully custom markup. Users who visit the short url will briefly see the page before being redirected to destination url.\" />\n }\n />\n );\n}\n","export default \"__VITE_ASSET__0aad6980__\"","import {ColumnConfig} from '@common/datatable/column-config';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {LinkOverlay} from '@app/dashboard/link-overlays/link-overlay';\nimport {Link} from 'react-router-dom';\nimport {ColorIcon} from '@common/admin/appearance/sections/themes/color-icon';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\n\nexport const LinkOverlaysDatatableColumns: ColumnConfig<LinkOverlay>[] = [\n {\n key: 'name',\n allowsSorting: true,\n width: 'flex-1 min-w-200',\n visibleInMode: 'all',\n header: () => <Trans message=\"Name\" />,\n body: overlay => overlay.name,\n },\n {\n key: 'message',\n allowsSorting: true,\n header: () => <Trans message=\"Message\" />,\n body: overlay => overlay.message,\n },\n {\n key: 'btn_text',\n allowsSorting: true,\n header: () => <Trans message=\"Button text\" />,\n body: overlay => overlay.btn_text,\n },\n {\n key: 'color',\n header: () => <Trans message=\"Color\" />,\n body: overlay => (\n <ColorIcon\n viewBox=\"0 0 48 48\"\n className=\"icon-lg\"\n style={{fill: overlay.colors['bg-color']}}\n />\n ),\n },\n {\n key: 'user_id',\n allowsSorting: true,\n header: () => <Trans message=\"Owner\" />,\n width: 'flex-2 min-w-140',\n body: overlay => {\n if (!overlay.user) return '';\n return (\n <NameWithAvatar\n image={overlay.user.avatar}\n label={overlay.user.display_name}\n description={overlay.user.email}\n />\n );\n },\n },\n {\n key: 'updated_at',\n allowsSorting: true,\n header: () => <Trans message=\"Last updated\" />,\n body: pixel =>\n pixel.updated_at ? <FormattedDate date={pixel.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 body: overlay => {\n return (\n <PermissionAwareButton resource={overlay} action=\"update\">\n <IconButton\n className=\"text-muted\"\n elementType={Link}\n to={`${overlay.id}/edit`}\n >\n <EditIcon />\n </IconButton>\n </PermissionAwareButton>\n );\n },\n },\n];\n","import {message} from '@common/i18n/message';\nimport {LinkOverlay} from '@app/dashboard/link-overlays/link-overlay';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\nexport const LinkOverlayThemes = [\n {key: 'default', label: message('Default')},\n {key: 'full-width', label: message('Full width')},\n {key: 'rounded', label: message('Rounded')},\n {key: 'pill', label: message('Pill')},\n];\n\nexport const LinkOverlayPositions = [\n {key: 'top-left', label: message('Top left')},\n {key: 'top-right', label: message('Top right')},\n {key: 'bottom-left', label: message('Bottom left')},\n {key: 'bottom-right', label: message('Bottom right')},\n];\n\nexport const LinkOverlayColors: {\n key: keyof LinkOverlay['colors'];\n label: MessageDescriptor;\n}[] = [\n {key: 'bg-color', label: message('Background color')},\n {key: 'text-color', label: message('Text color')},\n {key: 'btn-bg-color', label: message('Button background')},\n {key: 'btn-text-color', label: message('Button text')},\n {key: 'label-bg-color', label: message('Label background')},\n {key: 'label-color', label: message('Label text')},\n];\n","import {\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';\nimport {USER_MODEL} from '@common/auth/user';\nimport {\n LinkOverlayPositions,\n LinkOverlayThemes,\n} from '@app/dashboard/link-overlays/crupdate/link-overlay-constants';\n\nexport const LinkOverlaysDatatableFilters: BackendFilter[] = [\n {\n key: 'theme',\n label: message('Theme'),\n description: message('Theme for the overlay'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: 'default',\n options: LinkOverlayThemes.map(theme => ({\n key: theme.key,\n value: theme.key,\n label: theme.label,\n })),\n },\n },\n {\n key: 'position',\n label: message('Position'),\n description: message('Position for the overlay'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: 'bottom-left',\n options: LinkOverlayPositions.map(position => ({\n key: position.key,\n value: position.key,\n label: position.label,\n })),\n },\n },\n createdAtFilter({\n description: message('Date overlay was created'),\n }),\n updatedAtFilter({\n description: message('Date overlay was last updated'),\n }),\n {\n key: 'user_id',\n label: message('Owner'),\n description: message('User overlay belongs to'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.SelectModel,\n model: USER_MODEL,\n },\n },\n];\n","import {useAuth} from '@common/auth/use-auth';\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 React, {useMemo} from 'react';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport preferencesPopup from './preferences-popup.svg';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport {Link} from 'react-router-dom';\nimport {LinkOverlaysDatatableColumns} from '@app/dashboard/link-overlays/link-overlays-datatable-columns';\nimport {LinkOverlaysDatatableFilters} from '@app/dashboard/link-overlays/link-overlays-datatable-filters';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\n\ninterface TrackingPixelsDatablePageProps {\n forCurrentUser?: boolean;\n}\nexport function LinkOverlaysDatatablePage({\n forCurrentUser,\n}: TrackingPixelsDatablePageProps) {\n const {user} = useAuth();\n const {workspaceId} = useActiveWorkspaceId();\n const {filters, columns} = useMemo(() => {\n const columns = !forCurrentUser\n ? LinkOverlaysDatatableColumns\n : LinkOverlaysDatatableColumns.filter(col => col.key !== 'user_id');\n\n const filters = !forCurrentUser\n ? LinkOverlaysDatatableFilters\n : LinkOverlaysDatatableFilters.filter(filter => filter.key !== 'user_id');\n\n return {filters, columns};\n }, [forCurrentUser]);\n\n const userId = forCurrentUser ? user?.id : '';\n\n return (\n <DataTablePage\n endpoint=\"link-overlay\"\n queryParams={{userId, with: 'user', workspaceId}}\n title={<Trans message=\"Call-to-action overlays\" />}\n headerContent={<InfoTrigger />}\n filters={filters}\n columns={columns}\n actions={<Actions />}\n selectedActions={\n <PermissionAwareButton resource=\"linkOverlay\" action=\"delete\">\n <DeleteSelectedItemsAction />\n </PermissionAwareButton>\n }\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={preferencesPopup}\n title={<Trans message=\"No overlays have been added yet\" />}\n filteringTitle={<Trans message=\"No matching overlays\" />}\n />\n }\n />\n );\n}\n\nfunction InfoTrigger() {\n return (\n <InfoDialogTrigger\n body={\n <Trans message=\"Display fully customizable, non-intrusive overlay with a message and call-to-action button over destination website.\" />\n }\n />\n );\n}\n\nfunction Actions() {\n return (\n <PermissionAwareButton resource=\"linkOverlay\" action=\"create\">\n <DataTableAddItemButton to=\"new\" elementType={Link}>\n <Trans message=\"Add overlay\" />\n </DataTableAddItemButton>\n </PermissionAwareButton>\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 {message} from '@common/i18n/message';\nimport {toast} from '@common/ui/toast/toast';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {CrupdateLinkOverlayPayload} from '@app/dashboard/link-overlays/crupdate/crupdate-link-overlay-payload';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\nexport function useCreateLinkOverlay(\n form: UseFormReturn<CrupdateLinkOverlayPayload>,\n) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (payload: CrupdateLinkOverlayPayload) => createOverlay(payload),\n onSuccess: () => {\n toast.positive(trans(message('Overlay created')));\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('link-overlay'),\n });\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction createOverlay(payload: CrupdateLinkOverlayPayload): Promise<Response> {\n return apiClient.post('link-overlay', payload).then(r => r.data);\n}\n","export function OverlayWebsiteBackground() {\n return (\n <div className=\"bg-card h-full overflow-hidden\">\n <div className=\"navbar flex items-center bg-alt h-40 w-full\">\n <div\n className=\"os-button w-20 h-20 rounded-full ml-14\"\n style={{background: '#d7665d'}}\n />\n <div\n className=\"os-button w-20 h-20 rounded-full ml-14\"\n style={{background: '#deab54'}}\n />\n <div\n className=\"os-button w-20 h-20 rounded-full ml-14\"\n style={{background: '#6fb54c'}}\n />\n </div>\n\n <div className=\"page-body p-24\">\n <div className=\"top-row flex items-center h-60 bg-alt p-10 mb-24\">\n <div className=\"circle w-40 h-40 rounded-full mr-auto bg-disabled-bg\"></div>\n <div className=\"line w-1/6 h-20 rounded bg-disabled-bg ml-14\" />\n <div className=\"line w-1/6 h-20 rounded bg-disabled-bg ml-14\" />\n <div className=\"line w-1/6 h-20 rounded bg-disabled-bg ml-14\" />\n </div>\n\n <div className=\"middle-row flex items-center justify-center flex-col h-[260px] bg-alt my-24\">\n <div className=\"line rounded h-36 mb-20 w-3/5 bg-disabled-bg\" />\n <div className=\"line rounded h-14 mb-4 w-1/2 bg-disabled-bg/5\" />\n <div className=\"line rounded h-14 mb-4 w-1/2 bg-disabled-bg/5\" />\n <div className=\"line rounded h-14 mb-4 w-1/2 bg-disabled-bg/5\" />\n </div>\n\n <div className=\"flex-container flex\">\n <div className=\"left w-1/3\">\n <div className=\"rect h-144 bg-disabled-bg/5 mb-6\" />\n <div className=\"line fat-line h-36 mb-10 rounded bg-disabled-bg/5\" />\n <div className=\"line mb-10 h-20 rounded bg-disabled-bg\" />\n <div className=\"line mb-10 h-20 rounded bg-disabled-bg\" />\n <div className=\"separator h-1 bg-divider my-24\"></div>\n <div className=\"rect h-144 bg-disabled-bg/5 mb-10\" />\n <div className=\"line mb-10 h-20 rounded bg-disabled-bg\" />\n <div className=\"rect h-144 bg-disabled-bg/5 mb-6\" />\n </div>\n\n <div className=\"right w-2/3 pl-24\">\n <div className=\"rect h-288 mb-32 bg-disabled-bg/5\" />\n <div className=\"line mb-10 h-20 rounded bg-disabled-bg\" />\n <div className=\"line fat-line h-36 mb-10 rounded bg-disabled-bg/5\" />\n <div className=\"line mb-10 h-20 rounded bg-disabled-bg\" />\n <div className=\"separator h-1 bg-divider my-24\" />\n <div className=\"line mb-10 h-20 rounded bg-disabled-bg\" />\n <div className=\"rect h-288 mb-32 bg-disabled-bg/5\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import {useFormContext, UseFormReturn} from 'react-hook-form';\nimport {Form} from '@common/ui/forms/form';\nimport {Tabs} from '@common/ui/tabs/tabs';\nimport {TabList} from '@common/ui/tabs/tab-list';\nimport {Tab} from '@common/ui/tabs/tab';\nimport {Trans} from '@common/i18n/trans';\nimport {TabPanel, TabPanels} from '@common/ui/tabs/tab-panels';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {\n LinkOverlayColors,\n LinkOverlayPositions,\n LinkOverlayThemes,\n} from '@app/dashboard/link-overlays/crupdate/link-overlay-constants';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {OverlayWebsiteBackground} from './overlay-website-background';\nimport {Fragment, ReactElement} from 'react';\nimport {FloatingLinkOverlay} from '@app/short-links/floating-link-overlay';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {ColorIcon} from '@common/admin/appearance/sections/themes/color-icon';\nimport {ColorPickerDialog} from '@common/ui/color-picker/color-picker-dialog';\nimport {LinkOverlay} from '@app/dashboard/link-overlays/link-overlay';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\nimport {KeyboardArrowRightIcon} from '@common/icons/material/KeyboardArrowRight';\nimport {Button, ButtonProps} from '@common/ui/buttons/button';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {CrupdateLinkOverlayPayload} from '@app/dashboard/link-overlays/crupdate/crupdate-link-overlay-payload';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\n\ninterface CrupdateLinkOverlayFormProps {\n isLoading: boolean;\n form: UseFormReturn<CrupdateLinkOverlayPayload>;\n onSubmit: (values: CrupdateLinkOverlayPayload) => void;\n}\nexport function CrupdateLinkOverlayForm({\n form,\n isLoading,\n onSubmit,\n}: CrupdateLinkOverlayFormProps) {\n return (\n <Form form={form} onSubmit={onSubmit} className=\"flex h-full\">\n <div className=\"flex-shrink-0 w-full md:w-288 px-16 md:border-r md:shadow-lg h-full overflow-y-auto\">\n <Tabs>\n <TabList expand>\n <Tab>\n <Trans message=\"General\" />\n </Tab>\n <Tab>\n <Trans message=\"Style\" />\n </Tab>\n </TabList>\n <TabPanels className=\"my-24\">\n <TabPanel>\n <GeneralFields />\n <SaveButton disabled={isLoading} />\n </TabPanel>\n <TabPanel>\n <StyleFields />\n <SaveButton disabled={isLoading} className=\"mt-14\" />\n </TabPanel>\n </TabPanels>\n </Tabs>\n </div>\n <div className=\"flex-auto relative hidden md:block\">\n <OverlayWebsiteBackground />\n <OverlayPreview />\n </div>\n </Form>\n );\n}\n\nfunction SaveButton(props: ButtonProps) {\n return (\n <Button type=\"submit\" variant=\"flat\" color=\"primary\" {...props}>\n <Trans message=\"Save\" />\n </Button>\n );\n}\n\nfunction BackgroundField() {\n return (\n <FormImageSelector\n className=\"mb-20\"\n name=\"colors.bg-image\"\n label={<Trans message=\"Background image\" />}\n diskPrefix=\"overlays\"\n showRemoveButton\n />\n );\n}\n\ninterface ColorFieldProps {\n name: keyof LinkOverlay['colors'];\n children: ReactElement;\n}\nfunction ColorField({name, children}: ColorFieldProps) {\n const {watch, setValue} = useFormContext<CrupdateLinkOverlayPayload>();\n const color = watch(`colors.${name}`);\n\n return (\n <DialogTrigger\n currentValue={color}\n type=\"popover\"\n placement=\"right\"\n offset={10}\n onClose={newColor => {\n setValue(`colors.${name}`, newColor);\n }}\n >\n <ButtonBase className=\"flex items-center gap-10 w-full rounded border text-sm h-54 px-14 mb-10 bg relative hover:bg-hover\">\n <ColorIcon\n viewBox=\"0 0 48 48\"\n className=\"icon-lg\"\n style={{fill: color}}\n />\n <div>{children}</div>\n <KeyboardArrowRightIcon className=\"icon-sm text-muted ml-auto\" />\n </ButtonBase>\n <ColorPickerDialog\n defaultValue={color}\n onChange={newColor => {\n setValue(`colors.${name}`, newColor);\n }}\n />\n </DialogTrigger>\n );\n}\n\nfunction StyleFields() {\n return (\n <Fragment>\n <FileUploadProvider>\n <BackgroundField />\n </FileUploadProvider>\n {LinkOverlayColors.map(({key, label}) => (\n <ColorField name={key} key={key}>\n <Trans {...label} />\n </ColorField>\n ))}\n </Fragment>\n );\n}\n\nfunction GeneralFields() {\n return (\n <Fragment>\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Name\" />}\n className=\"mb-24\"\n required\n />\n <FormSelect\n name=\"position\"\n selectionMode=\"single\"\n label={<Trans message=\"Position\" />}\n className=\"mb-24\"\n >\n {LinkOverlayPositions.map(position => (\n <Item key={position.key} value={position.key}>\n <Trans {...position.label} />\n </Item>\n ))}\n </FormSelect>\n <FormSelect\n name=\"theme\"\n selectionMode=\"single\"\n label={<Trans message=\"Theme\" />}\n className=\"mb-24\"\n >\n {LinkOverlayThemes.map(theme => (\n <Item key={theme.key} value={theme.key}>\n <Trans {...theme.label} />\n </Item>\n ))}\n </FormSelect>\n <FormTextField\n name=\"message\"\n label={<Trans message=\"Message\" />}\n inputElementType=\"textarea\"\n maxLength={200}\n rows={2}\n className=\"mb-24\"\n />\n <FormTextField\n name=\"label\"\n label={<Trans message=\"Label\" />}\n maxLength={8}\n className=\"mb-24\"\n />\n <FormTextField\n type=\"url\"\n name=\"btn_link\"\n label={<Trans message=\"Button link\" />}\n className=\"mb-24\"\n />\n <FormTextField\n name=\"btn_text\"\n label={<Trans message=\"Button text\" />}\n maxLength={30}\n className=\"mb-24\"\n />\n </Fragment>\n );\n}\n\nfunction OverlayPreview() {\n const {watch} = useFormContext<CrupdateLinkOverlayPayload>();\n const values = watch();\n return <FloatingLinkOverlay overlay={values} />;\n}\n","import {useForm} from 'react-hook-form';\nimport {useCreateLinkOverlay} from '@app/dashboard/link-overlays/requests/use-create-link-overlay';\nimport {CrupdateLinkOverlayForm} from '@app/dashboard/link-overlays/crupdate/crupdate-link-overlay-form';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {CrupdateLinkOverlayPayload} from '@app/dashboard/link-overlays/crupdate/crupdate-link-overlay-payload';\n\nexport function CreateLinkOverlayPage() {\n const {trans} = useTrans();\n const navigate = useNavigate();\n const form = useForm<CrupdateLinkOverlayPayload>({\n defaultValues: {\n position: 'bottom-left',\n theme: 'default',\n label: trans(message('Label')),\n message: trans(message('Your message here')),\n btn_text: trans(message('Button text')),\n btn_link: 'https://google.com',\n colors: {\n 'bg-color': 'rgb(61, 75, 101)',\n 'text-color': 'rgb(255, 255, 255)',\n 'label-bg-color': 'rgb(255, 255, 255)',\n 'label-color': 'rgb(0, 0, 0)',\n },\n },\n });\n const createOverlay = useCreateLinkOverlay(form);\n return (\n <CrupdateLinkOverlayForm\n form={form}\n isLoading={createOverlay.isPending}\n onSubmit={values => {\n createOverlay.mutate(values, {\n onSuccess: () => navigate('..', {relative: 'path'}),\n });\n }}\n />\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';\nimport {LinkOverlay} from '@app/dashboard/link-overlays/link-overlay';\n\nexport const linkOverlayEndpoint = (overlayId: number | string) =>\n `link-overlay/${overlayId}`;\n\nexport interface GetLinkOverlayResponse extends BackendResponse {\n linkOverlay: LinkOverlay;\n}\n\nexport function useLinkOverlay(overlayId: number | string) {\n return useQuery({\n queryKey: [linkOverlayEndpoint(overlayId)],\n queryFn: () => getLinkOverlay(overlayId),\n });\n}\n\nfunction getLinkOverlay(\n overlayId: number | string,\n): Promise<GetLinkOverlayResponse> {\n return apiClient\n .get(linkOverlayEndpoint(overlayId))\n .then(response => response.data);\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 {message} from '@common/i18n/message';\nimport {toast} from '@common/ui/toast/toast';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {CrupdateLinkOverlayPayload} from '@app/dashboard/link-overlays/crupdate/crupdate-link-overlay-payload';\nimport {linkOverlayEndpoint} from '@app/dashboard/link-overlays/requests/use-link-overlay';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\nexport function useUpdateLinkOverlay(\n overlayId: number | string,\n form: UseFormReturn<CrupdateLinkOverlayPayload>,\n) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (payload: CrupdateLinkOverlayPayload) =>\n createOverlay(overlayId, payload),\n onSuccess: () => {\n toast.positive(trans(message('Overlay updated')));\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('link-overlay'),\n });\n queryClient.invalidateQueries({\n queryKey: [linkOverlayEndpoint(overlayId)],\n });\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction createOverlay(\n overlayId: number | string,\n payload: CrupdateLinkOverlayPayload,\n): Promise<Response> {\n return apiClient.put(`link-overlay/${overlayId}`, payload).then(r => r.data);\n}\n","import {useForm} from 'react-hook-form';\nimport {CrupdateLinkOverlayForm} from '@app/dashboard/link-overlays/crupdate/crupdate-link-overlay-form';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {CrupdateLinkOverlayPayload} from '@app/dashboard/link-overlays/crupdate/crupdate-link-overlay-payload';\nimport {useParams} from 'react-router-dom';\nimport {useLinkOverlay} from '@app/dashboard/link-overlays/requests/use-link-overlay';\nimport {FullPageLoader} from '@common/ui/progress/full-page-loader';\nimport {LinkOverlay} from '@app/dashboard/link-overlays/link-overlay';\nimport {useUpdateLinkOverlay} from '@app/dashboard/link-overlays/requests/use-update-link-overlay';\n\nexport function UpdateLinkOverlayPage() {\n const {overlayId} = useParams();\n const {data, isLoading, isError} = useLinkOverlay(overlayId!);\n\n if (data) {\n return <PageContent overlay={data.linkOverlay} />;\n }\n\n if (isLoading) {\n return <FullPageLoader />;\n }\n\n if (isError) {\n return null;\n }\n}\n\ninterface PageContentProps {\n overlay: LinkOverlay;\n}\nfunction PageContent({overlay}: PageContentProps) {\n const navigate = useNavigate();\n const form = useForm<CrupdateLinkOverlayPayload>({\n defaultValues: {\n name: overlay.name,\n position: overlay.position,\n theme: overlay.theme,\n label: overlay.label,\n message: overlay.message,\n btn_text: overlay.btn_text,\n btn_link: overlay.btn_link,\n colors: overlay.colors,\n },\n });\n const updateOverlay = useUpdateLinkOverlay(overlay.id, form);\n return (\n <CrupdateLinkOverlayForm\n form={form}\n isLoading={updateOverlay.isPending}\n onSubmit={values => {\n updateOverlay.mutate(values, {\n onSuccess: () => navigate('../..', {relative: 'path'}),\n });\n }}\n />\n );\n}\n","export default \"__VITE_ASSET__a9c0e6fa__\"","import {ColumnConfig} from '@common/datatable/column-config';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {CheckIcon} from '@common/icons/material/Check';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Link, Link as RouterLink} 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 {ShareLinkButton} from '@app/dashboard/links/sharing/share-link-button';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {CustomDomain} from '@common/custom-domains/custom-domain';\nimport {useDefaultCustomDomainHost} from '@common/custom-domains/use-default-custom-domain-host';\nimport {removeProtocol} from '@common/utils/urls/remove-protocol';\nimport {useLinkFormValueLists} from '@app/dashboard/links/requests/use-link-form-value-lists';\nimport {BarChartIcon} from '@common/icons/material/BarChart';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\nimport {LinkStyle} from '@common/ui/buttons/external-link';\n\nexport const BiolinksDatatableColumns: ColumnConfig<Biolink>[] = [\n {\n key: 'name',\n allowsSorting: true,\n header: () => <Trans message=\"Name\" />,\n width: 'flex-3 min-w-200',\n visibleInMode: 'all',\n body: biolink => (\n <a\n className={LinkStyle}\n href={biolink.short_url}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {biolink.name}\n </a>\n ),\n },\n {\n key: 'clicks_count',\n allowsSorting: true,\n header: () => <Trans message=\"Clicks\" />,\n body: biolink =>\n biolink.clicks_count ? (\n <FormattedNumber value={biolink.clicks_count} />\n ) : (\n '-'\n ),\n },\n {\n key: 'domain_id',\n allowsSorting: true,\n header: () => <Trans message=\"Domain\" />,\n body: biolink => <DomainColumn model={biolink} />,\n },\n {\n key: 'user_id',\n allowsSorting: true,\n header: () => <Trans message=\"Owner\" />,\n width: 'flex-2 min-w-140',\n body: biolink => {\n if (!biolink.user) return '';\n return (\n <NameWithAvatar\n image={biolink.user.avatar}\n label={biolink.user.display_name}\n description={biolink.user.email}\n />\n );\n },\n },\n {\n key: 'links_count',\n allowsSorting: true,\n header: () => <Trans message=\"Links\" />,\n body: biolink =>\n biolink.links_count ? (\n <FormattedNumber value={biolink.links_count} />\n ) : (\n '-'\n ),\n },\n {\n key: 'active',\n allowsSorting: true,\n header: () => <Trans message=\"Active\" />,\n body: biolink =>\n biolink.active ? (\n <CheckIcon className=\"icon-md text-positive\" />\n ) : (\n <CloseIcon className=\"icon-md text-danger\" />\n ),\n },\n {\n key: 'updated_at',\n allowsSorting: true,\n header: () => <Trans message=\"Last updated\" />,\n body: link =>\n link.updated_at ? <FormattedDate date={link.updated_at} /> : '',\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n align: 'end',\n width: 'w-128 flex-shrink-0',\n visibleInMode: 'all',\n body: biolink => (\n <div className=\"text-muted\">\n <Tooltip label={<Trans message=\"Clicks report\" />}>\n <RouterLink to={`${biolink.id}`}>\n <IconButton size=\"md\">\n <BarChartIcon />\n </IconButton>\n </RouterLink>\n </Tooltip>\n <ShareLinkButton link={biolink} />\n <PermissionAwareButton resource={biolink} action=\"update\">\n <Link to={`${biolink.id}/edit/content`}>\n <IconButton size=\"md\">\n <EditIcon />\n </IconButton>\n </Link>\n </PermissionAwareButton>\n </div>\n ),\n },\n];\n\ninterface DomainColumnProps {\n model: {\n domain_id?: number;\n domain?: CustomDomain;\n };\n}\nexport function DomainColumn({model}: DomainColumnProps) {\n const {data} = useLinkFormValueLists();\n const defaultHost = useDefaultCustomDomainHost(data?.domains);\n if (model.domain_id === 0 && defaultHost) {\n return <Fragment>{defaultHost}</Fragment>;\n }\n if (model.domain_id && model.domain) {\n return <Fragment>{removeProtocol(model.domain.host)}</Fragment>;\n }\n return <Trans message=\"All domains\" />;\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';\nimport {USER_MODEL} from '@common/auth/user';\n\nexport const BiolinksDatatableFilters: BackendFilter[] = [\n {\n key: 'active',\n label: message('Status'),\n description: message('Whether biolink is disabled or not'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: '01',\n options: [\n {\n key: '01',\n label: message('Enabled'),\n value: true,\n },\n {\n key: '02',\n label: message('Disabled'),\n value: false,\n },\n ],\n },\n },\n {\n key: 'clicks_count',\n label: message('Clicks count'),\n description: message('Number of times this biolink was visited'),\n defaultOperator: FilterOperator.gte,\n operators: ALL_PRIMITIVE_OPERATORS,\n control: {\n type: FilterControlType.Input,\n inputType: 'number',\n defaultValue: 1,\n },\n },\n {\n key: 'links_count',\n label: message('Link count'),\n description: message('Number of links in the biolink'),\n defaultOperator: FilterOperator.gte,\n operators: ALL_PRIMITIVE_OPERATORS,\n control: {\n type: FilterControlType.Input,\n inputType: 'number',\n defaultValue: 1,\n },\n },\n createdAtFilter({\n description: message('Date biolink was created'),\n }),\n updatedAtFilter({\n description: message('Date biolink was last updated'),\n }),\n {\n key: 'user_id',\n label: message('Owner'),\n description: message('User biolink was created by'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.SelectModel,\n model: USER_MODEL,\n },\n },\n];\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {CrupdateBiolinkFormValues} from '../crupdate/crupdate-biolink-form-values';\nimport {buildLinkeablePayload} from '@app/dashboard/links/utils/build-linkeable-payload';\nimport {CrupdateBiolinkPayload} from '@app/dashboard/biolink/biolink-editor/requests/use-update-biolink';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {\n biolink: Biolink;\n}\n\nexport function useCreateBiolink(\n form: UseFormReturn<CrupdateBiolinkFormValues>,\n) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (props: CrupdateBiolinkFormValues) => createLinkGroup(props),\n onSuccess: () => {\n toast.positive(trans(message('Biolink created')));\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('biolink'),\n });\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction createLinkGroup(\n payload: CrupdateBiolinkFormValues,\n): Promise<Response> {\n return apiClient\n .post('biolink', buildLinkeablePayload<CrupdateBiolinkPayload>(payload))\n .then(r => r.data);\n}\n","import {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 {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {CrupdateBiolinkFormValues} from './crupdate-biolink-form-values';\nimport {useForm} from 'react-hook-form';\nimport {useCreateBiolink} from '../requests/use-create-biolink';\nimport {nanoid} from 'nanoid';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {useRecaptcha} from '@common/recaptcha/use-recaptcha';\nimport {Form} from '@common/ui/forms/form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {AliasField} from '@app/dashboard/links/forms/alias-field';\nimport {LinkDomainSelect} from '@app/dashboard/links/forms/link-domain-select';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\n\nexport function CreateBiolinkDialog() {\n const navigate = useNavigate();\n const {formId, close} = useDialogContext();\n const {custom_domains} = useSettings();\n const {verify, isVerifying} = useRecaptcha('link_creation');\n\n const form = useForm<CrupdateBiolinkFormValues>({\n defaultValues: {\n active: true,\n hash: nanoid(6),\n domain_id: custom_domains?.allow_all_option ? undefined : 0,\n },\n });\n const createBiolink = useCreateBiolink(form);\n\n const handleSubmit = async (values: CrupdateBiolinkFormValues) => {\n const isValid = await verify();\n if (isValid) {\n createBiolink.mutate(values, {\n onSuccess: response => {\n close();\n navigate(`${response.biolink.id}/edit`);\n },\n });\n }\n };\n\n return (\n <Dialog size=\"md\">\n <DialogHeader>\n <Trans message=\"Create biolink\" />\n </DialogHeader>\n <DialogBody>\n <Form\n form={form}\n id={formId}\n onBeforeSubmit={() => {\n // hook form won't clear errors for fields that are not bound to input\n form.clearErrors('hash');\n }}\n onSubmit={handleSubmit}\n >\n <div className=\"mb-24\">\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Name\" />}\n minLength={3}\n className=\"mb-8\"\n autoFocus\n />\n <AliasField form={form} name=\"hash\" />\n </div>\n <LinkDomainSelect name=\"domain_id\" className=\"mb-24\" />\n <FormTextField\n name=\"description\"\n className=\"mb-24\"\n label={<Trans message=\"Description\" />}\n inputElementType=\"textarea\"\n rows={2}\n />\n <FormSwitch\n name=\"active\"\n description={\n <Trans message=\"Whether this biolink is viewable publicly.\" />\n }\n className=\"mb-24\"\n >\n <Trans message=\"Active\" />\n </FormSwitch>\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button\n variant=\"text\"\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={createBiolink.isPending || isVerifying}\n >\n <Trans message=\"Create\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {useAuth} from '@common/auth/use-auth';\nimport React, {useEffect, 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 marketing from './marketing.svg';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {BiolinksDatatableColumns} from './biolinks-datatable-columns';\nimport {BiolinksDatatableFilters} from './biolinks-datatable-filters';\nimport {CreateBiolinkDialog} from './crupdate/create-biolink-dialog';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\nimport {prefetchLinkFormValueLists} from '@app/dashboard/links/requests/use-link-form-value-lists';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\n\ninterface LinkGroupsDatatablePageProps {\n forCurrentUser?: boolean;\n}\nexport function BioLinksDatatablePage({\n forCurrentUser,\n}: LinkGroupsDatatablePageProps) {\n const {user} = useAuth();\n const {workspaceId} = useActiveWorkspaceId();\n const {filters, columns} = useMemo(() => {\n const columns = !forCurrentUser\n ? BiolinksDatatableColumns\n : BiolinksDatatableColumns.filter(col => col.key !== 'user_id');\n\n const filters = !forCurrentUser\n ? BiolinksDatatableFilters\n : BiolinksDatatableFilters.filter(filter => filter.key !== 'user_id');\n\n return {filters, columns};\n }, [forCurrentUser]);\n\n useEffect(() => {\n prefetchLinkFormValueLists();\n }, []);\n\n const userId = forCurrentUser ? user?.id : '';\n return (\n <DataTablePage\n endpoint=\"biolink\"\n queryParams={{\n userId,\n withCount: 'links',\n with: 'user,domain',\n workspaceId,\n }}\n title={<Trans message=\"Biolinks\" />}\n headerContent={<InfoTrigger />}\n filters={filters}\n columns={columns}\n actions={<Actions />}\n selectedActions={\n <PermissionAwareButton resource=\"biolink\" action=\"delete\">\n <DeleteSelectedItemsAction />\n </PermissionAwareButton>\n }\n emptyStateMessage={\n <DataTableEmptyStateMessage\n image={marketing}\n title={<Trans message=\"No biolinks have been created yet\" />}\n filteringTitle={<Trans message=\"No matching biolinks\" />}\n />\n }\n />\n );\n}\n\nfunction InfoTrigger() {\n return (\n <InfoDialogTrigger\n title={<Trans message=\"Link in bio\" />}\n body={\n <Trans message=\"Offer multiple choices to your followers when they click on your Biolink. Share all your Social Media profiles, videos, songs, articles and other important links with just one url.\" />\n }\n />\n );\n}\n\nfunction Actions() {\n return (\n <PermissionAwareButton resource=\"biolink\" action=\"create\">\n <DialogTrigger type=\"modal\">\n <DataTableAddItemButton>\n <Trans message=\"New biolink\" />\n </DataTableAddItemButton>\n <CreateBiolinkDialog />\n </DialogTrigger>\n </PermissionAwareButton>\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {PaginatedBackendResponse} from '@common/http/backend-response/pagination-response';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {useParams} from 'react-router-dom';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\nexport interface FetchBiolinkResponse extends BackendResponse {\n biolink: Biolink;\n}\n\ninterface FetchBiolinkParams {\n loadContent?: boolean;\n}\n\nexport const biolinkQueryKey = (\n biolinkId: string | number,\n params?: FetchBiolinkParams,\n) => {\n return DatatableDataQueryKey(\n `biolink/${biolinkId}`,\n params as Record<string, string | boolean> | undefined,\n );\n};\n\nexport function useBiolink() {\n const {biolinkId} = useParams();\n return useQuery({\n queryKey: biolinkQueryKey(biolinkId!),\n queryFn: () => fetchBiolink(biolinkId!),\n initialData: seedInitialDataFromPaginatedList(biolinkId!),\n });\n}\n\nexport async function fetchBiolink(\n biolinkId: number | string,\n params?: FetchBiolinkParams,\n onLoad?: (data: FetchBiolinkResponse) => void,\n): Promise<FetchBiolinkResponse> {\n const response = await apiClient\n .get(`biolink/${biolinkId}`, {params})\n .then(response => response.data);\n onLoad?.(response);\n return response;\n}\n\nfunction seedInitialDataFromPaginatedList(biolinkId: number | string) {\n const biolink = queryClient\n .getQueryData<PaginatedBackendResponse<Biolink>>(\n DatatableDataQueryKey('biolink'),\n )\n ?.pagination?.data.find(link => link.id === +biolinkId);\n return biolink ? {biolink} : undefined;\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {ClicksReportPageLayout} from '@app/dashboard/reports/clicks/clicks-report-page-layout';\nimport {Breadcrumb} from '@common/ui/breadcrumbs/breadcrumb';\nimport {BreadcrumbItem} from '@common/ui/breadcrumbs/breadcrumb-item';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {useParams} from 'react-router-dom';\nimport {ShareLinkButton} from '@app/dashboard/links/sharing/share-link-button';\nimport clsx from 'clsx';\nimport {useBiolink} from '@app/dashboard/biolink/biolinks-datatable-page/requests/use-biolink';\n\nexport function BiolinkClicksReportPage() {\n const navigate = useNavigate();\n const {biolinkId} = useParams();\n const query = useBiolink();\n const biolink = query.data?.biolink;\n\n return (\n <ClicksReportPageLayout\n model={`biolink=${biolinkId}`}\n title={\n <Breadcrumb size=\"xl\" className={clsx(query.isLoading && 'invisible')}>\n <BreadcrumbItem\n onSelected={() => {\n navigate('..', {relative: 'path'});\n }}\n >\n <Trans message=\"Biolinks\" />\n </BreadcrumbItem>\n <BreadcrumbItem className=\"first-letter:capitalize\">\n <Trans message=\"“:name“ clicks\" values={{name: biolink?.name}} />\n </BreadcrumbItem>\n </Breadcrumb>\n }\n actions={\n biolink && (\n <ShareLinkButton\n className=\"flex-shrink-0 text-muted\"\n link={biolink}\n />\n )\n }\n />\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const WidgetsIcon = createSvgIcon(\n <path d=\"m16.66 4.52 2.83 2.83-2.83 2.83-2.83-2.83 2.83-2.83M9 5v4H5V5h4m10 10v4h-4v-4h4M9 15v4H5v-4h4m7.66-13.31L11 7.34 16.66 13l5.66-5.66-5.66-5.65zM11 3H3v8h8V3zm10 10h-8v8h8v-8zm-10 0H3v8h8v-8z\" />\n, 'WidgetsOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const AnimationIcon = createSvgIcon(\n <path d=\"M15 2c-2.71 0-5.05 1.54-6.22 3.78-1.28.67-2.34 1.72-3 3C3.54 9.95 2 12.29 2 15c0 3.87 3.13 7 7 7 2.71 0 5.05-1.54 6.22-3.78 1.28-.67 2.34-1.72 3-3C20.46 14.05 22 11.71 22 9c0-3.87-3.13-7-7-7zM9 20c-2.76 0-5-2.24-5-5 0-1.12.37-2.16 1-3 0 3.87 3.13 7 7 7-.84.63-1.88 1-3 1zm3-3c-2.76 0-5-2.24-5-5 0-1.12.37-2.16 1-3 0 3.86 3.13 6.99 7 7-.84.63-1.88 1-3 1zm4.7-3.3c-.53.19-1.1.3-1.7.3-2.76 0-5-2.24-5-5 0-.6.11-1.17.3-1.7.53-.19 1.1-.3 1.7-.3 2.76 0 5 2.24 5 5 0 .6-.11 1.17-.3 1.7zM19 12c0-3.86-3.13-6.99-7-7 .84-.63 1.87-1 3-1 2.76 0 5 2.24 5 5 0 1.12-.37 2.16-1 3z\" />\n, 'AnimationOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ShortcutIcon = createSvgIcon(\n <path d=\"m15 5-1.41 1.41L15 7.83 17.17 10H8c-2.76 0-5 2.24-5 5v4h2v-4c0-1.65 1.35-3 3-3h9.17L15 14.17l-1.41 1.41L15 17l6-6-6-6z\" />\n, 'ShortcutOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const MoreTimeIcon = createSvgIcon(\n [<path d=\"M10 8v6l4.7 2.9.8-1.2-4-2.4V8z\" key=\"0\" />,<path d=\"M17.92 12c.05.33.08.66.08 1 0 3.9-3.1 7-7 7s-7-3.1-7-7 3.1-7 7-7c.7 0 1.37.1 2 .29V4.23c-.64-.15-1.31-.23-2-.23-5 0-9 4-9 9s4 9 9 9 9-4 9-9c0-.34-.02-.67-.06-1h-2.02z\" key=\"1\" />,<path d=\"M20 5V2h-2v3h-3v2h3v3h2V7h3V5z\" key=\"2\" />,]\n, 'MoreTimeOutlined');\n","import {create} from 'zustand';\nimport {immer} from 'zustand/middleware/immer';\nimport {Biolink, BiolinkAppearance} from '@app/dashboard/biolink/biolink';\n\ninterface BiolinkEditorState {\n appearance: BiolinkAppearance | null;\n appearanceIsDirty: boolean;\n setAppearanceIsDirty: (isDirty: boolean) => void;\n biolink: Omit<Biolink, 'appearance'> | null;\n updateAppearance: (payload: BiolinkAppearance) => void;\n setBiolink: (biolink: Biolink) => void;\n}\n\nexport const useBiolinkEditorStore = create<BiolinkEditorState>()(\n immer((set, get) => ({\n appearance: null,\n appearanceIsDirty: false,\n setAppearanceIsDirty: (isDirty: boolean) => {\n set(state => {\n state.appearanceIsDirty = isDirty;\n });\n },\n biolink: null,\n setBiolink: biolink => {\n set(state => {\n state.biolink = biolink;\n // don't override user appearance changes in the editor when biolink reloads from backend\n if (!state.appearanceIsDirty) {\n state.appearance = biolink.appearance?.config || null;\n }\n });\n },\n updateAppearance(payload: BiolinkAppearance) {\n set(state => {\n state.appearanceIsDirty = true;\n state.appearance = {\n ...state.appearance,\n ...payload,\n };\n });\n },\n }))\n);\n\nexport function biolinkEditorState() {\n return useBiolinkEditorStore.getState();\n}\n","import {useParams} from 'react-router-dom';\nimport {useQuery} from '@tanstack/react-query';\nimport {\n biolinkQueryKey,\n fetchBiolink,\n FetchBiolinkResponse,\n} from '@app/dashboard/biolink/biolinks-datatable-page/requests/use-biolink';\nimport {\n biolinkEditorState,\n useBiolinkEditorStore,\n} from '@app/dashboard/biolink/biolink-editor/biolink-editor-store';\nimport {queryClient} from '@common/http/query-client';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\n\nconst params = {\n loadContent: true,\n};\n\nexport function useEditorBiolink() {\n const biolinkId = useEditorBiolinkId();\n const biolink = useBiolinkEditorStore(s => s.biolink);\n const query = useQuery({\n queryKey: biolinkQueryKey(biolinkId, params),\n queryFn: () =>\n fetchBiolink(biolinkId, params, data => {\n biolinkEditorState().setBiolink(data.biolink);\n }),\n });\n\n return {isLoading: query.isLoading, biolink, status: query.status, biolinkId};\n}\n\nexport function useEditorBiolinkId(): number {\n const {biolinkId} = useParams();\n return +biolinkId!;\n}\n\nexport function setEditorBiolink(biolink: Biolink) {\n biolinkEditorState().setBiolink(biolink);\n queryClient.setQueryData<FetchBiolinkResponse>(\n biolinkQueryKey(biolink.id, params),\n {biolink},\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {message} from '@common/i18n/message';\nimport {\n Biolink,\n BiolinkLink,\n BiolinkWidget,\n} from '@app/dashboard/biolink/biolink';\nimport {\n setEditorBiolink,\n useEditorBiolinkId,\n} from '@app/dashboard/biolink/biolink-editor/requests/use-editor-biolink';\nimport {BiolinkItemPayload} from '@app/dashboard/biolink/biolink-editor/content/biolink-item-payload';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n biolink: Biolink;\n}\n\ninterface Payload {\n item: BiolinkLink | BiolinkWidget;\n values: BiolinkItemPayload;\n}\n\nexport function useUpdateBiolinkContentItem() {\n const biolinkId = useEditorBiolinkId();\n return useMutation({\n mutationFn: ({item, values}: Payload) =>\n updateItem(biolinkId, item, values),\n onSuccess: response => {\n setEditorBiolink(response.biolink);\n },\n onError: err =>\n showHttpErrorToast(err, message('Could not update content item')),\n });\n}\n\nfunction updateItem(\n biolinkId: number,\n item: BiolinkLink | BiolinkWidget,\n editorPayload: BiolinkItemPayload,\n): Promise<Response> {\n const backendPayload: BiolinkItemPayload & {\n item_id: number;\n item_model_type: string;\n } = {\n ...editorPayload,\n item_id: item.id,\n item_model_type: item.model_type,\n };\n return apiClient\n .put(`biolink/${biolinkId}/content-item`, backendPayload)\n .then(r => r.data);\n}\n","import {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 {Trans} from '@common/i18n/trans';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {FormDatePicker} from '@common/ui/forms/input-field/date/date-picker/date-picker';\nimport {SectionHelper} from '@common/ui/section-helper';\nimport {Fragment, ReactNode, useMemo} from 'react';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {useForm} from 'react-hook-form';\nimport {BiolinkLink} from '@app/dashboard/biolink/biolink';\nimport {Form} from '@common/ui/forms/form';\nimport {useCurrentDateTime} from '@common/i18n/use-current-date-time';\nimport {parseAbsolute} from '@internationalized/date';\nimport {useUserTimezone} from '@common/i18n/use-user-timezone';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {BiolinkItemPayload} from '@app/dashboard/biolink/biolink-editor/content/biolink-item-payload';\nimport {useUpdateBiolinkContentItem} from '@app/dashboard/biolink/biolink-editor/requests/use-update-biolink-content-item';\n\ninterface LinkScheduleDialogProps {\n link: BiolinkLink;\n}\nexport function LinkScheduleDialog({link}: LinkScheduleDialogProps) {\n const now = useCurrentDateTime();\n const timezone = useUserTimezone();\n const {close, formId} = useDialogContext();\n const form = useForm<BiolinkItemPayload>({\n defaultValues: {\n activates_at: link.activates_at,\n expires_at: link.expires_at,\n },\n });\n const updateItem = useUpdateBiolinkContentItem();\n const activationDate = form.watch('activates_at');\n\n const expirationMinDate = useMemo(() => {\n if (activationDate) {\n return parseAbsolute(activationDate, timezone);\n }\n return now;\n }, [activationDate, now, timezone]);\n\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Schedule\" />\n </DialogHeader>\n <DialogBody>\n <Form\n id={formId}\n form={form}\n onSubmit={async values => {\n updateItem.mutate(\n {\n item: link,\n values,\n },\n {\n onSuccess: () => {\n toast.positive(message('Schedule updated'));\n close();\n },\n },\n );\n }}\n >\n <FormDatePicker\n name=\"activates_at\"\n min={now}\n className=\"mb-24\"\n label={<Trans message=\"Start date\" />}\n showCalendarFooter\n />\n <FormDatePicker\n name=\"expires_at\"\n min={expirationMinDate}\n className=\"mb-24\"\n label={<Trans message=\"End date\" />}\n showCalendarFooter\n />\n </Form>\n <InfoSection />\n </DialogBody>\n <DialogFooter dividerTop>\n <Button\n variant=\"text\"\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={updateItem.isPending || !form.formState.isDirty}\n >\n <Trans message=\"Save\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n\nfunction InfoSection() {\n const values = {\n b: (parts: ReactNode) => <span className=\"font-bold\">{parts}</span>,\n };\n\n return (\n <SectionHelper\n description={\n <Fragment>\n <div>\n <Trans\n message=\"Leave <b>start date</b> blank to display this link immediately.\"\n values={values}\n />\n </div>\n <div>\n <Trans\n message=\"Leave <b>end date</b> blank to display this link forever.\"\n values={values}\n />\n </div>\n </Fragment>\n }\n />\n );\n}\n","import {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 {Trans} from '@common/i18n/trans';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {FormDatePicker} from '@common/ui/forms/input-field/date/date-picker/date-picker';\nimport {SectionHelper} from '@common/ui/section-helper';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {useForm} from 'react-hook-form';\nimport {BiolinkLink} from '@app/dashboard/biolink/biolink';\nimport {Form} from '@common/ui/forms/form';\nimport {useCurrentDateTime} from '@common/i18n/use-current-date-time';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {BiolinkItemPayload} from '@app/dashboard/biolink/biolink-editor/content/biolink-item-payload';\nimport {useUpdateBiolinkContentItem} from '@app/dashboard/biolink/biolink-editor/requests/use-update-biolink-content-item';\n\ninterface LinkScheduleDialogProps {\n link: BiolinkLink;\n}\nexport function LeapLinkDialog({link}: LinkScheduleDialogProps) {\n const now = useCurrentDateTime();\n const {close, formId} = useDialogContext();\n const form = useForm<BiolinkItemPayload>({\n defaultValues: {\n leap_until: link.leap_until,\n },\n });\n const isDirty = form.formState.isDirty;\n const updateItem = useUpdateBiolinkContentItem();\n\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Redirect link\" />\n </DialogHeader>\n <DialogBody>\n <Form\n id={formId}\n form={form}\n onSubmit={async values => {\n updateItem.mutate(\n {\n item: link,\n values,\n },\n {\n onSuccess: () => {\n toast.positive(message('Redirect link updated'));\n close();\n },\n },\n );\n }}\n >\n <FormDatePicker\n required\n name=\"leap_until\"\n min={now}\n className=\"mb-24\"\n label={<Trans message=\"Redirect until\" />}\n showCalendarFooter\n />\n </Form>\n <InfoSection />\n </DialogBody>\n <DialogFooter dividerTop>\n <Button\n variant=\"text\"\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={!isDirty || updateItem.isPending}\n >\n <Trans message=\"Save\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n\nfunction InfoSection() {\n return (\n <SectionHelper\n description={\n <Trans message=\"Send all visitors straight to this link, instead of your Biolink, until the specified date. After that date, Biolink will resume to showing normally.\" />\n }\n />\n );\n}\n","import {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 {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 {useForm} from 'react-hook-form';\nimport {BiolinkLink} from '@app/dashboard/biolink/biolink';\nimport {Form} from '@common/ui/forms/form';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {BiolinkItemPayload} from '@app/dashboard/biolink/biolink-editor/content/biolink-item-payload';\nimport {useUpdateBiolinkContentItem} from '@app/dashboard/biolink/biolink-editor/requests/use-update-biolink-content-item';\n\ninterface LinkThumbnailDialogProps {\n link: BiolinkLink;\n}\nexport function LinkThumbnailDialog({link}: LinkThumbnailDialogProps) {\n const {close, formId} = useDialogContext();\n const form = useForm<BiolinkItemPayload>({\n defaultValues: {\n image: link.image,\n },\n });\n const updateItem = useUpdateBiolinkContentItem();\n const isDirty = form.formState.isDirty;\n\n return (\n <Dialog size=\"sm\">\n <DialogHeader>\n <Trans message=\"Link thumbnail\" />\n </DialogHeader>\n <DialogBody>\n <Form\n id={formId}\n form={form}\n onSubmit={async values => {\n updateItem.mutate(\n {\n item: link,\n values,\n },\n {\n onSuccess: () => {\n toast.positive(message('Thumbnail updated'));\n close();\n },\n },\n );\n }}\n >\n <FileUploadProvider>\n <FormImageSelector\n showRemoveButton\n name=\"image\"\n diskPrefix=\"links\"\n />\n </FileUploadProvider>\n </Form>\n </DialogBody>\n <DialogFooter dividerTop>\n <Button\n variant=\"text\"\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={updateItem.isPending || !isDirty}\n >\n <Trans message=\"Save\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","export const LinkAnimationList = [\n 'none',\n 'bounce',\n 'flash',\n 'pulse',\n 'rubberBand',\n 'shakeX',\n 'shakeY',\n 'headShake',\n 'swing',\n 'tada',\n 'wobble',\n 'jello',\n 'heartBeat',\n];\n","import {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 {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 {useForm, useFormContext} from 'react-hook-form';\nimport {BiolinkLink} from '@app/dashboard/biolink/biolink';\nimport {Form} from '@common/ui/forms/form';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {LinkAnimationList} from '@app/dashboard/biolink/biolink-editor/content/link-content-item/link-animation-list';\nimport {useEffect, useState} from 'react';\nimport clsx from 'clsx';\nimport {SectionHelper} from '@common/ui/section-helper';\nimport {BiolinkItemPayload} from '@app/dashboard/biolink/biolink-editor/content/biolink-item-payload';\nimport {useUpdateBiolinkContentItem} from '@app/dashboard/biolink/biolink-editor/requests/use-update-biolink-content-item';\n\ninterface LinkAnimationDialogProps {\n link: BiolinkLink;\n}\nexport function LinkAnimationDialog({link}: LinkAnimationDialogProps) {\n const {close, formId} = useDialogContext();\n const form = useForm<BiolinkItemPayload>({\n defaultValues: {\n animation: link.animation,\n },\n });\n const isDirty = form.formState.isDirty;\n const updateItem = useUpdateBiolinkContentItem();\n\n useEffect(() => {\n import('./animate.min.css');\n }, []);\n\n return (\n <Dialog size=\"md\">\n <DialogHeader>\n <Trans message=\"Link animation\" />\n </DialogHeader>\n <DialogBody>\n <Form\n id={formId}\n form={form}\n onSubmit={async values => {\n updateItem.mutate(\n {\n item: link,\n values,\n },\n {\n onSuccess: () => {\n toast.positive(message('Animation updated'));\n close();\n },\n },\n );\n }}\n >\n <SectionHelper\n className=\"mb-24\"\n description={\n <Trans\n message=\"Add animation to draw attention to this link. :br Selected animation will repeat five times by default.\"\n values={{br: <br />}}\n />\n }\n />\n <div className=\"grid gap-14 grid-cols-[repeat(auto-fill,minmax(95px,1fr))]\">\n {LinkAnimationList.map((animation, index) => (\n <AnimationItem key={index} animationName={animation} />\n ))}\n </div>\n </Form>\n </DialogBody>\n <DialogFooter dividerTop>\n <Button\n variant=\"text\"\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={updateItem.isPending || !isDirty}\n >\n <Trans message=\"Save\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n\ninterface AnimationItemProps {\n animationName: string;\n}\nfunction AnimationItem({animationName}: AnimationItemProps) {\n const [isAnimating, setIsAnimating] = useState(false);\n const {watch, setValue} = useFormContext<BiolinkItemPayload>();\n const animation: string | null =\n animationName === 'none' ? null : animationName;\n const selectedAnimation = watch('animation');\n\n return (\n <button\n type=\"button\"\n onClick={() => {\n setValue('animation', animation, {shouldDirty: true});\n }}\n onPointerEnter={() => {\n setIsAnimating(true);\n }}\n onPointerLeave={() => {\n setIsAnimating(false);\n }}\n className={clsx(\n 'border border-2 px-10 h-64 uppercase font-medium rounded flex items-center justify-center animate__animated',\n isAnimating && `animate__${animationName}`,\n selectedAnimation === animation && 'border-primary',\n )}\n >\n {animationName}\n </button>\n );\n}\n","import {useMutation} 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 {\n Biolink,\n BiolinkLink,\n BiolinkWidget,\n} from '@app/dashboard/biolink/biolink';\nimport {\n setEditorBiolink,\n useEditorBiolinkId,\n} from '@app/dashboard/biolink/biolink-editor/requests/use-editor-biolink';\n\ninterface Response extends BackendResponse {\n biolink: Biolink;\n}\n\ninterface Payload {\n item: BiolinkLink | BiolinkWidget;\n}\n\nexport function useDetachBiolinkContentItem() {\n const biolinkId = useEditorBiolinkId();\n return useMutation({\n mutationFn: (payload: Payload) => detachItem(biolinkId, payload),\n onSuccess: response => {\n setEditorBiolink(response.biolink);\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction detachItem(biolinkId: number, payload: Payload): Promise<Response> {\n return apiClient\n .post(`biolink/${biolinkId}/content-item/detach`, payload)\n .then(r => r.data);\n}\n","import {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport {Trans} from '@common/i18n/trans';\nimport {BiolinkLink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {useDetachBiolinkContentItem} from '@app/dashboard/biolink/biolink-editor/requests/use-detach-biolink-content-item';\n\ninterface DetachItemButtonProps {\n item: BiolinkLink | BiolinkWidget;\n}\nexport function DetachContentItemButton({item}: DetachItemButtonProps) {\n const detachItem = useDetachBiolinkContentItem();\n return (\n <DialogTrigger type=\"modal\">\n <IconButton\n className=\"text-muted flex-shrink-0\"\n disabled={detachItem.isPending}\n >\n <CloseIcon />\n </IconButton>\n <ConfirmationDialog\n isDanger\n onConfirm={() => {\n detachItem.mutate({item});\n }}\n title={<Trans message=\"Remove item\" />}\n body={\n <Trans message=\"Are you sure you want to remove this item from the biolink?\" />\n }\n confirm={<Trans message=\"Remove\" />}\n />\n </DialogTrigger>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {moveItemInNewArray} from '@common/utils/array/move-item-in-new-array';\nimport {biolinkEditorState} from '@app/dashboard/biolink/biolink-editor/biolink-editor-store';\nimport {useEditorBiolinkId} from '@app/dashboard/biolink/biolink-editor/requests/use-editor-biolink';\n\ninterface Response extends BackendResponse {\n biolink: Biolink;\n}\n\ninterface Payload {\n oldIndex: number;\n newIndex: number;\n // id of widget that should be pinned to top\n widgetToPin?: number;\n}\n\nexport function useSortBiolinkContent() {\n const biolinkId = useEditorBiolinkId();\n return useMutation({\n mutationFn: (payload: Payload) => sortContent(biolinkId, payload),\n });\n}\n\nfunction sortContent(\n biolinkId: number,\n {oldIndex, newIndex, widgetToPin}: Payload,\n): Promise<Response> {\n const biolink = biolinkEditorState().biolink!;\n const content = moveItemInNewArray(biolink.content, oldIndex, newIndex);\n if (widgetToPin) {\n content[newIndex] = {...content[newIndex], pinned: 'top'};\n }\n biolinkEditorState().setBiolink({...biolink, content});\n\n const order = content.map(item => ({\n id: item.id,\n model_type: item.model_type,\n }));\n\n return apiClient.post(`biolink/${biolinkId}/change-order`, {\n order,\n widgetToPin,\n });\n}\n","import {DragIndicatorIcon} from '@common/icons/material/DragIndicator';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Button} from '@common/ui/buttons/button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {Trans} from '@common/i18n/trans';\nimport {DetachContentItemButton} from '@app/dashboard/biolink/biolink-editor/content/detach-content-item-button';\nimport {ReactNode, useRef} from 'react';\nimport {\n Biolink,\n BiolinkLink,\n BiolinkWidget,\n} from '@app/dashboard/biolink/biolink';\nimport {useSortable} from '@common/ui/interactions/dnd/use-sortable';\nimport {useSortBiolinkContent} from '@app/dashboard/biolink/biolink-editor/requests/use-sort-biolink-content';\nimport clsx from 'clsx';\n\ninterface BiolinkContentItemLayoutProps {\n item?: BiolinkLink | BiolinkWidget;\n biolink?: Biolink;\n title?: ReactNode;\n updateDialog?: ReactNode;\n children: ReactNode;\n actionRow?: ReactNode;\n}\nexport function BiolinkContentItemLayout({\n item,\n biolink,\n title,\n updateDialog,\n children,\n actionRow,\n}: BiolinkContentItemLayoutProps) {\n const sortContent = useSortBiolinkContent();\n const itemRef = useRef<HTMLDivElement>(null);\n const sortDisabled = !item || item.pinned != null;\n\n const {sortableProps, dragHandleRef} = useSortable({\n item: item || 'noop',\n items: biolink?.content || [],\n type: 'biolinkEditorSortable',\n ref: itemRef,\n onSortEnd: (oldIndex, newIndex) => {\n sortContent.mutate({oldIndex, newIndex});\n },\n disabled: sortDisabled,\n });\n\n return (\n <div\n className=\"mb-20 flex h-172 items-stretch rounded-panel border bg-paper shadow\"\n ref={itemRef}\n {...sortableProps}\n >\n <button\n type=\"button\"\n className={clsx(\n 'flex-shrink-0 border-r px-10 text-muted',\n !sortDisabled && 'hover:text-primary',\n )}\n disabled={sortDisabled}\n ref={dragHandleRef}\n >\n <DragIndicatorIcon />\n </button>\n <div className=\"min-w-0 flex-auto p-24\">\n <div className=\"flex items-center\">\n {title && (\n <div className=\"mb-4 mr-auto flex-auto overflow-hidden overflow-ellipsis whitespace-nowrap font-medium\">\n {title}\n </div>\n )}\n {updateDialog && (\n <DialogTrigger type=\"modal\">\n <Button\n className=\"ml-20 flex-shrink-0\"\n variant=\"text\"\n color=\"primary\"\n startIcon={<EditIcon />}\n >\n <Trans message=\"Edit\" />\n </Button>\n {updateDialog}\n </DialogTrigger>\n )}\n {biolink && item && <DetachContentItemButton item={item} />}\n </div>\n <div className=\"mb-20\">{children}</div>\n {actionRow}\n </div>\n </div>\n );\n}\n","import {removeProtocol} from '@common/utils/urls/remove-protocol';\nimport {Trans} from '@common/i18n/trans';\nimport {Switch} from '@common/ui/forms/toggle/switch';\nimport {Biolink, BiolinkLink} from '@app/dashboard/biolink/biolink';\nimport {Button} from '@common/ui/buttons/button';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {ImageIcon} from '@common/icons/material/Image';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {AnimationIcon} from '@common/icons/material/Animation';\nimport {ShortcutIcon} from '@common/icons/material/Shortcut';\nimport {MoreTimeIcon} from '@common/icons/material/MoreTime';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {LinkScheduleDialog} from '@app/dashboard/biolink/biolink-editor/content/link-content-item/link-schedule-dialog';\nimport {LeapLinkDialog} from '@app/dashboard/biolink/biolink-editor/content/link-content-item/leap-link-dialog';\nimport {UpdateLinkDialog} from '@app/dashboard/links/dialogs/update-link-dialog';\nimport {HidableLinkSettingsField} from '@app/dashboard/links/forms/link-settings-form';\nimport {LinkThumbnailDialog} from '@app/dashboard/biolink/biolink-editor/content/link-content-item/link-thumbnail-dialog';\nimport {LinkAnimationDialog} from '@app/dashboard/biolink/biolink-editor/content/link-content-item/link-animation-dialog';\nimport {BarChartIcon} from '@common/icons/material/BarChart';\nimport {BiolinkContentItemLayout} from '@app/dashboard/biolink/biolink-editor/content/biolink-content-item-layout';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\nimport {Link} from 'react-router-dom';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {useUpdateBiolinkContentItem} from '@app/dashboard/biolink/biolink-editor/requests/use-update-biolink-content-item';\nimport {\n setEditorBiolink,\n useEditorBiolinkId,\n} from '@app/dashboard/biolink/biolink-editor/requests/use-editor-biolink';\nimport {useMediaQuery} from '@common/utils/hooks/use-media-query';\n\nexport const linkDialogHiddenFields: HidableLinkSettingsField[] = [\n 'groups',\n 'seo',\n 'enabled',\n 'alias',\n];\n\ninterface LinkContentItemProps {\n item: BiolinkLink;\n biolink: Biolink;\n}\nexport function LinkContentItem({item: link, biolink}: LinkContentItemProps) {\n const biolinkId = useEditorBiolinkId();\n const endpoint = `biolink/${biolinkId}/link/${link.id}`;\n\n return (\n <BiolinkContentItemLayout\n item={link}\n biolink={biolink}\n title={link.name}\n actionRow={<ActionRow link={link} biolink={biolink} />}\n updateDialog={\n <UpdateLinkDialog\n endpoint={endpoint}\n link={link}\n showButtonLabelField\n hiddenFields={linkDialogHiddenFields}\n onSuccess={(response: {biolink: Biolink}) => {\n setEditorBiolink(response.biolink);\n }}\n />\n }\n >\n <div className=\"flex items-center gap-6\">\n <RemoteFavicon url={link.long_url} />\n <a\n href={link.short_url}\n target=\"_blank\"\n className=\"hover:underline whitespace-nowrap overflow-hidden overflow-ellipsis text-muted text-sm\"\n rel=\"noreferrer\"\n >\n {removeProtocol(link.long_url)}\n </a>\n </div>\n </BiolinkContentItemLayout>\n );\n}\n\ninterface ActionRowProps {\n link: BiolinkLink;\n biolink: Biolink;\n}\nfunction ActionRow({link, biolink}: ActionRowProps) {\n const updateItem = useUpdateBiolinkContentItem();\n\n return (\n <div className=\"flex md:gap-24 md:justify-between h-42 items-center\">\n <div className=\"flex items-center text-muted\">\n <Switch\n checked={link.active}\n disabled={link.active_locked || updateItem.isPending}\n onChange={() => {\n updateItem.mutate({\n item: link,\n values: {active: !link.active},\n });\n }}\n />\n <DialogTrigger type=\"popover\">\n <Tooltip label={<Trans message=\"Change thumbnail\" />}>\n <IconButton className=\"ml-10\" color={link.image ? 'primary' : null}>\n <ImageIcon />\n </IconButton>\n </Tooltip>\n <LinkThumbnailDialog link={link} />\n </DialogTrigger>\n <DialogTrigger type=\"popover\">\n <Tooltip label={<Trans message=\"Animation\" />}>\n <IconButton color={link.animation ? 'primary' : null}>\n <AnimationIcon />\n </IconButton>\n </Tooltip>\n <LinkAnimationDialog link={link} />\n </DialogTrigger>\n <DialogTrigger type=\"popover\">\n <Tooltip label={<Trans message=\"Redirect\" />}>\n <IconButton color={link.leap_until ? 'primary' : null}>\n <ShortcutIcon />\n </IconButton>\n </Tooltip>\n <LeapLinkDialog link={link} />\n </DialogTrigger>\n <DialogTrigger type=\"popover\">\n <Tooltip label={<Trans message=\"Schedule\" />}>\n <IconButton\n color={link.expires_at || link.activates_at ? 'primary' : null}\n >\n <MoreTimeIcon />\n </IconButton>\n </Tooltip>\n <LinkScheduleDialog link={link} />\n </DialogTrigger>\n </div>\n <ClicksButton link={link} />\n </div>\n );\n}\n\ninterface ClicksButtonProps {\n link: BiolinkLink;\n}\nfunction ClicksButton({link}: ClicksButtonProps) {\n const isMobile = useIsMobileMediaQuery();\n const isVerySmallScreen = useMediaQuery('(max-width: 380px)');\n if (isVerySmallScreen) {\n return null;\n }\n\n const clicksReportPath = `../../../../links/${link.id}`;\n\n const button = isMobile ? (\n <IconButton\n className=\"text-muted flex-shrink-0\"\n elementType={Link}\n to={clicksReportPath}\n relative=\"path\"\n >\n <BarChartIcon />\n </IconButton>\n ) : (\n <Button\n variant=\"text\"\n className=\"text-muted\"\n startIcon={<BarChartIcon />}\n elementType={Link}\n to={clicksReportPath}\n relative=\"path\"\n >\n <Trans message=\":count clicks\" values={{count: link.clicks_count}} />\n </Button>\n );\n\n return (\n <Tooltip\n label={\n <Trans\n message=\":count lifetime clicks\"\n values={{count: link.clicks_count}}\n />\n }\n >\n {button}\n </Tooltip>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {CrupdateBiolinkFormValues} from '@app/dashboard/biolink/biolinks-datatable-page/crupdate/crupdate-biolink-form-values';\nimport {\n buildLinkeablePayload,\n CrupdateLinkeablePayload,\n} from '@app/dashboard/links/utils/build-linkeable-payload';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\nexport interface CrupdateBiolinkPayload\n extends Omit<CrupdateBiolinkFormValues, 'utm' | 'groups' | 'pixels' | 'tags'>,\n CrupdateLinkeablePayload {}\n\ninterface Response extends BackendResponse {}\n\nexport function useUpdateBiolink(\n form: UseFormReturn<CrupdateBiolinkFormValues>,\n biolinkId: number,\n) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (payload: CrupdateBiolinkFormValues) =>\n updateBiolink(biolinkId, payload),\n onSuccess: () => {\n toast.positive(trans(message('Biolink updated')));\n queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('biolink'),\n });\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction updateBiolink(\n biolinkId: number,\n payload: CrupdateBiolinkFormValues,\n): Promise<Response> {\n return apiClient\n .put(\n `biolink/${biolinkId}`,\n buildLinkeablePayload<CrupdateBiolinkPayload>(payload),\n )\n .then(r => r.data);\n}\n","import {\n HidableLinkSettingsField,\n LinkSettingsForm,\n} from '@app/dashboard/links/forms/link-settings-form';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {useForm} from 'react-hook-form';\nimport {CrupdateBiolinkFormValues} from '@app/dashboard/biolink/biolinks-datatable-page/crupdate/crupdate-biolink-form-values';\nimport {Form} from '@common/ui/forms/form';\nimport {Trans} from '@common/i18n/trans';\nimport {buildLinkeableDefaultFormValues} from '@app/dashboard/links/utils/build-linkeable-default-form-values';\nimport {useUpdateBiolink} from '@app/dashboard/biolink/biolink-editor/requests/use-update-biolink';\nimport {Button} from '@common/ui/buttons/button';\nimport {FullPageLoader} from '@common/ui/progress/full-page-loader';\nimport {useEditorBiolink} from '@app/dashboard/biolink/biolink-editor/requests/use-editor-biolink';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {AliasField} from '@app/dashboard/links/forms/alias-field';\n\nconst hiddenLinkSettingsFields: HidableLinkSettingsField[] = [\n 'type',\n 'groups',\n 'title',\n];\n\nexport function BiolinkSettingsForm() {\n const {biolink} = useEditorBiolink();\n\n if (!biolink) {\n return (\n <div className=\"py-24\">\n <FullPageLoader />\n </div>\n );\n }\n\n return <SettingsForm biolink={biolink} />;\n}\n\ninterface SettingsFormProps {\n biolink: Biolink;\n}\nfunction SettingsForm({biolink}: SettingsFormProps) {\n const form = useForm<CrupdateBiolinkFormValues>({\n defaultValues: buildLinkeableDefaultFormValues(biolink),\n });\n const updateSettings = useUpdateBiolink(form, biolink.id);\n\n return (\n <Form\n form={form}\n onBeforeSubmit={() => {\n // hook form won't clear errors for fields that are not bound to input\n form.clearErrors('hash');\n }}\n onSubmit={values => {\n updateSettings.mutate(values);\n }}\n >\n <div className=\"mb-24\">\n <Button\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n disabled={updateSettings.isPending || !form.formState.isDirty}\n >\n <Trans message=\"Update\" />\n </Button>\n </div>\n <div className=\"mb-24\">\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Name\" />}\n minLength={3}\n className=\"mb-8\"\n autoFocus\n />\n <AliasField form={form} name=\"hash\" />\n </div>\n <LinkSettingsForm\n hiddenFields={hiddenLinkSettingsFields}\n linkName={<Trans message=\"biolink\" />}\n />\n </Form>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {message} from '@common/i18n/message';\nimport {toast} from '@common/ui/toast/toast';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {setEditorBiolink} from '@app/dashboard/biolink/biolink-editor/requests/use-editor-biolink';\n\ninterface Response extends BackendResponse {\n biolink: Biolink;\n}\n\ninterface Payload {\n widgetId?: number;\n type: WidgetType;\n position?: number;\n config: BiolinkWidget['config'] | null;\n}\n\nexport function useCrupdateBiolinkWidget(\n biolinkId: number,\n form: UseFormReturn<BiolinkWidget['config']>,\n) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (payload: Payload) => createWidget(biolinkId, payload),\n onSuccess: (response, payload) => {\n toast.positive(\n trans(\n !payload.widgetId\n ? message('Widget updated')\n : message('Widget added'),\n ),\n );\n setEditorBiolink(response.biolink);\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction createWidget(\n biolinkId: number,\n {widgetId, ...payload}: Payload,\n): Promise<Response> {\n const request = widgetId\n ? apiClient.put(`biolink/${biolinkId}/widget/${widgetId}`, payload)\n : apiClient.post(`biolink/${biolinkId}/widget`, payload);\n return request.then(r => r.data);\n}\n","import {useForm, UseFormReturn} from 'react-hook-form';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\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 {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Form} from '@common/ui/forms/form';\nimport {Trans} from '@common/i18n/trans';\nimport {useCrupdateBiolinkWidget} from '@app/dashboard/biolink/biolink-editor/requests/use-crupdate-biolink-widget';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {ReactNode, useMemo} from 'react';\nimport {\n WidgetList,\n WidgetType,\n} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\n\ninterface CrupdateWidgetDialogProps {\n biolink: Biolink;\n type: WidgetType;\n widget?: BiolinkWidget;\n children?: ReactNode;\n defaultValues?: BiolinkWidget['config'];\n // allow children to transform or validate values before submitting\n onSubmit?: (\n values: BiolinkWidget['config'],\n form: UseFormReturn<BiolinkWidget['config']>,\n ) => Promise<BiolinkWidget['config'] | undefined> | void;\n}\nexport function CrupdateWidgetDialog({\n biolink,\n widget,\n type,\n defaultValues,\n children,\n onSubmit,\n}: CrupdateWidgetDialogProps) {\n const widgetListItem = WidgetList[type];\n\n // make sure we are not using empty array or string for defaultValues, it will cause errors\n const cleanedValues = useMemo(() => {\n const values = widget?.config || defaultValues;\n const isEmpty = (Array.isArray(values) && values.length === 0) || !values;\n return isEmpty ? undefined : values;\n }, [widget?.config, defaultValues]);\n\n const form = useForm<BiolinkWidget['config']>({\n defaultValues: cleanedValues,\n });\n const {formId, close} = useDialogContext();\n const addWidget = useCrupdateBiolinkWidget(biolink.id, form);\n\n return (\n <Dialog>\n <DialogHeader>\n <Trans {...widgetListItem.name} />\n </DialogHeader>\n <DialogBody>\n <Form\n form={form}\n id={formId}\n onSubmit={async values => {\n const transformedValues = onSubmit\n ? await onSubmit(values, form)\n : values;\n // \"null\" is needed to clear selected value for widget (socials for example)\n if (transformedValues === undefined) {\n return;\n }\n addWidget.mutate(\n {\n widgetId: widget?.id,\n config: transformedValues,\n type,\n // put socials widget at the end (when creating a new widget), everything else at the start\n position:\n !widget && type === WidgetType.Socials\n ? biolink.content.length + 1\n : undefined,\n },\n {onSuccess: () => close()},\n );\n }}\n >\n {children}\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button\n variant=\"text\"\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={addWidget.isPending || !form.formState.isDirty}\n >\n {widget ? <Trans message=\"Update\" /> : <Trans message=\"Add\" />}\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {CrupdateWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {WidgetDialogProps} from '@app/dashboard/biolink/biolink-editor/content/widgets/types/widget-dialog-props';\n\nexport interface ImageWidget extends BiolinkWidget {\n type: WidgetType.Image;\n config: {\n url: string;\n destinationUrl?: string;\n type: 'default' | 'avatar';\n };\n}\n\nexport function ImageWidgetDialog({\n biolink,\n widget,\n}: WidgetDialogProps<ImageWidget>) {\n const {trans} = useTrans();\n return (\n <CrupdateWidgetDialog\n biolink={biolink}\n type={WidgetType.Image}\n widget={widget}\n >\n <FileUploadProvider>\n <FormImageSelector name=\"url\" diskPrefix=\"widgets\" required />\n </FileUploadProvider>\n <FormSelect\n className=\"my-24\"\n name=\"type\"\n label={<Trans message=\"Style\" />}\n selectionMode=\"single\"\n >\n <Item value=\"default\">\n <Trans message=\"Default\" />\n </Item>\n <Item value=\"avatar\">\n <Trans message=\"Avatar\" />\n </Item>\n </FormSelect>\n <FormTextField\n placeholder={trans(message('Optional'))}\n name=\"destinationUrl\"\n type=\"url\"\n label={<Trans message=\"Destination url\" />}\n description={\n <Trans message=\"Redirect user to this url when clicking the image.\" />\n }\n />\n </CrupdateWidgetDialog>\n );\n}\n","export default \"__VITE_ASSET__4ee84a82__\"","export default \"__VITE_ASSET__6f43011e__\"","export default \"__VITE_ASSET__c2cfbca9__\"","export default \"__VITE_ASSET__9e836dc6__\"","export default \"__VITE_ASSET__e9c6ece7__\"","export default \"__VITE_ASSET__5ee3b190__\"","export default \"__VITE_ASSET__f117f6fb__\"","export default \"__VITE_ASSET__36c11155__\"","export default \"__VITE_ASSET__113bafd9__\"","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {CrupdateWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport getVideoId from 'get-video-id';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\n\nexport interface YoutubeWidget extends BiolinkWidget {\n type: WidgetType.Youtube;\n config: {\n url: string;\n };\n}\n\ninterface YoutubeWidgetDialogProps {\n biolink: Biolink;\n widget?: YoutubeWidget;\n}\nexport function YoutubeWidgetDialog({\n biolink,\n widget,\n}: YoutubeWidgetDialogProps) {\n const {trans} = useTrans();\n return (\n <CrupdateWidgetDialog\n biolink={biolink}\n type={WidgetType.Youtube}\n widget={widget}\n onSubmit={(values, form) => {\n const youtubeId = getVideoId(values.url).id;\n if (!youtubeId) {\n form.setError('url', {\n message: trans(message('Invalid youtube url')),\n });\n } else {\n return Promise.resolve(values);\n }\n }}\n >\n <FormTextField\n required\n autoFocus\n placeholder=\"https://www.youtube.com/watch?v=YE7VzlLtp-4\"\n name=\"url\"\n type=\"url\"\n label={<Trans message=\"Youtube video url\" />}\n description={\n <Trans message=\"Embed this youtube video within biolink.\" />\n }\n />\n </CrupdateWidgetDialog>\n );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {CrupdateWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\n\nexport interface TextWidget extends BiolinkWidget {\n type: WidgetType.Text;\n config: {\n title: string;\n description?: string;\n };\n}\n\ninterface TextWidgetDialogProps {\n biolink: Biolink;\n widget?: TextWidget;\n}\nexport function TextWidgetDialog({biolink, widget}: TextWidgetDialogProps) {\n return (\n <CrupdateWidgetDialog\n biolink={biolink}\n type={WidgetType.Text}\n widget={widget}\n >\n <FormTextField\n className=\"mb-24\"\n required\n autoFocus\n name=\"title\"\n label={<Trans message=\"Title\" />}\n />\n <FormTextField\n name=\"description\"\n inputElementType=\"textarea\"\n rows={2}\n label={<Trans message=\"Description\" />}\n />\n </CrupdateWidgetDialog>\n );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {CrupdateWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {\n SocialsList,\n SocialsType,\n} from '@app/dashboard/biolink/biolink-editor/content/widgets/socials-widget/socials-list';\nimport {removeEmptyValuesFromObject} from '@common/utils/objects/remove-empty-values-from-object';\n\nexport interface SocialsWidget extends BiolinkWidget {\n type: WidgetType.Text;\n config: Record<SocialsType, string>;\n}\n\ninterface TextWidgetDialogProps {\n biolink: Biolink;\n widget?: SocialsWidget;\n}\nexport function SocialsWidgetDialog({biolink, widget}: TextWidgetDialogProps) {\n return (\n <CrupdateWidgetDialog\n biolink={biolink}\n type={WidgetType.Socials}\n widget={widget}\n onSubmit={values => {\n // remove key from object, if user empties social's input\n return Promise.resolve(removeEmptyValuesFromObject(values));\n }}\n >\n {Object.entries(SocialsList).map(([type, social], index) => {\n const Icon = social.icon;\n return (\n <FormTextField\n autoFocus={index === 0}\n key={type}\n className=\"mb-24\"\n name={type}\n placeholder={social.placeholder}\n label={<Trans {...social.name} />}\n pattern={social.pattern}\n type={social.inputType}\n autoComplete=\"off\"\n startAdornment={Icon && <Icon />}\n />\n );\n })}\n </CrupdateWidgetDialog>\n );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {CrupdateWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\n\nexport interface TwitchWidget extends BiolinkWidget {\n type: WidgetType.Image;\n config: {\n url: string;\n };\n}\n\ninterface YoutubeWidgetDialogProps {\n biolink: Biolink;\n widget?: TwitchWidget;\n}\nexport function TwitchWidgetDialog({\n biolink,\n widget,\n}: YoutubeWidgetDialogProps) {\n return (\n <CrupdateWidgetDialog\n biolink={biolink}\n type={WidgetType.Twitch}\n widget={widget}\n >\n <FormTextField\n required\n autoFocus\n placeholder=\"https://www.twitch.tv/kasparovchess\"\n name=\"url\"\n type=\"url\"\n pattern=\"https://(www.)?twitch.tv/.*\"\n label={<Trans message=\"Twitch channel or clip url\" />}\n description={\n <Trans message=\"Embed this twitch channel or clip within biolink.\" />\n }\n />\n </CrupdateWidgetDialog>\n );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {CrupdateWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\n\nexport interface SoundcloudWidget extends BiolinkWidget {\n type: WidgetType.Soundcloud;\n config: {\n url: string;\n embedUrl: string;\n };\n}\n\ninterface SoundcloudWidgetDialogProps {\n biolink: Biolink;\n widget?: SoundcloudWidget;\n}\nexport function SoundcloudWidgetDialog({\n biolink,\n widget,\n}: SoundcloudWidgetDialogProps) {\n const {trans} = useTrans();\n return (\n <CrupdateWidgetDialog\n biolink={biolink}\n type={WidgetType.Soundcloud}\n widget={widget}\n onSubmit={async (values, form) => {\n const encodedUrl = encodeURIComponent(values.url);\n const response = await fetch(\n `https://soundcloud.com/oembed?format=json&url=${encodedUrl}`\n ).then(res => res.json());\n const embedCode = response.html;\n\n const div = document.createElement('div');\n div.innerHTML = embedCode;\n const embedUrl = div.querySelector('iframe')?.src;\n\n if (embedUrl) {\n return {\n ...values,\n embedUrl,\n };\n }\n\n form.setError('url', {\n message: trans(message('Invalid soundcloud url')),\n });\n }}\n >\n <FormTextField\n required\n autoFocus\n placeholder=\"https://soundcloud.com/artist/track\"\n name=\"url\"\n type=\"url\"\n label={<Trans message=\"Soundcloud track url\" />}\n description={\n <Trans message=\"Embed this soundcloud track within biolink.\" />\n }\n />\n </CrupdateWidgetDialog>\n );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {CrupdateWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport getVideoId from 'get-video-id';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\n\nexport interface VimeoWidget extends BiolinkWidget {\n type: WidgetType.Vimeo;\n config: {\n url: string;\n };\n}\n\ninterface VimeoWidgetDialogProps {\n biolink: Biolink;\n widget?: VimeoWidget;\n}\nexport function VimeoWidgetDialog({biolink, widget}: VimeoWidgetDialogProps) {\n const {trans} = useTrans();\n return (\n <CrupdateWidgetDialog\n biolink={biolink}\n type={WidgetType.Vimeo}\n widget={widget}\n onSubmit={(values, form) => {\n const vimeoId = getVideoId(values.url).id;\n if (!vimeoId) {\n form.setError('url', {\n message: trans(message('Invalid vimeo url')),\n });\n } else {\n return Promise.resolve(values);\n }\n }}\n >\n <FormTextField\n required\n autoFocus\n placeholder=\"https://vimeo.com/1084537\"\n name=\"url\"\n type=\"url\"\n label={<Trans message=\"Vimeo video url\" />}\n description={<Trans message=\"Embed this vimeo video within biolink.\" />}\n />\n </CrupdateWidgetDialog>\n );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {CrupdateWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {parse} from '@app/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-uri';\n\nexport interface SpotifyWidget extends BiolinkWidget {\n type: WidgetType.Vimeo;\n config: {\n url: string;\n type?: string;\n };\n}\n\ninterface SpotifyWidgetDialogProps {\n biolink: Biolink;\n widget?: SpotifyWidget;\n}\nexport function SpotifyWidgetDialog({\n biolink,\n widget,\n}: SpotifyWidgetDialogProps) {\n const {trans} = useTrans();\n return (\n <CrupdateWidgetDialog\n biolink={biolink}\n type={WidgetType.Spotify}\n widget={widget}\n onSubmit={(values, form) => {\n const spotifyInfo = parse(values.url);\n if (!('id' in spotifyInfo)) {\n form.setError('url', {\n message: trans(message('Invalid spotify url')),\n });\n } else {\n return Promise.resolve({\n ...values,\n type: spotifyInfo.type,\n });\n }\n }}\n >\n <FormTextField\n required\n autoFocus\n placeholder=\"https://open.spotify.com/track/2sqfLwGKXDw1nGjFhH3GGX?si=f329040f45804ec5\"\n name=\"url\"\n type=\"url\"\n label={<Trans message=\"Spotify share url\" />}\n description={\n <Trans message=\"Any share url from spotify can be used, including artist, album, track, playlist etc.\" />\n }\n />\n </CrupdateWidgetDialog>\n );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {CrupdateWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\n\nexport interface TiktokWidget extends BiolinkWidget {\n type: WidgetType.Vimeo;\n config: {\n url: string;\n };\n}\n\ninterface TiktokWidgetDialogProps {\n biolink: Biolink;\n widget?: TiktokWidget;\n}\nexport function TiktokWidgetDialog({biolink, widget}: TiktokWidgetDialogProps) {\n const {trans} = useTrans();\n return (\n <CrupdateWidgetDialog\n biolink={biolink}\n type={WidgetType.Tiktok}\n widget={widget}\n onSubmit={(values, form) => {\n if (!values.url.includes('tiktok.com/')) {\n form.setError('url', {\n message: trans(message('Invalid tiktok url')),\n });\n } else {\n return Promise.resolve(values);\n }\n }}\n >\n <FormTextField\n required\n autoFocus\n placeholder=\"https://www.tiktok.com/@bts_official_bighit/video/6964945720885464322\"\n name=\"url\"\n type=\"url\"\n label={<Trans message=\"Tiktok url\" />}\n description={\n <Trans message=\"Embed this tiktok video within biolink.\" />\n }\n />\n </CrupdateWidgetDialog>\n );\n}\n","import {ImageWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/image-widget/image-widget-dialog';\nimport {JSXElementConstructor} from 'react';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {message} from '@common/i18n/message';\nimport imageThumbnail from './widget-selector/widget-images/image.png';\nimport textImage from './widget-selector/widget-images/text.png';\nimport socialsImage from './widget-selector/widget-images/socials.png';\nimport youtubeImage from './widget-selector/widget-images/youtube.png';\nimport soundcloudImage from './widget-selector/widget-images/soundcloud.png';\nimport vimeoImage from './widget-selector/widget-images/vimeo.jpeg';\nimport spotifyImage from './widget-selector/widget-images/spotify.png';\nimport twitchImage from './widget-selector/widget-images/twitch.svg';\nimport tiktokImage from './widget-selector/widget-images/tiktok.png';\nimport {WidgetDialogProps} from '@app/dashboard/biolink/biolink-editor/content/widgets/types/widget-dialog-props';\nimport {YoutubeWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/youtube-widget/youtube-widget-dialog';\nimport {TextWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/text-widget/text-widget-dialog';\nimport {SocialsWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/socials-widget/socials-widget-dialog';\nimport {TwitchWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/twitch-widget/twitch-widget-dialog';\nimport {SoundcloudWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/soundcloud-widget/soundcloud-widget-dialog';\nimport {VimeoWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/vimeo-widget/vimeo-widget-dialog';\nimport {SpotifyWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-widget-dialog';\nimport {TiktokWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/tiktok-widget/tiktok-widget-dialog';\n\nexport interface WidgetListItem {\n name: MessageDescriptor;\n description: MessageDescriptor;\n image?: string;\n dialog: JSXElementConstructor<WidgetDialogProps<any>>;\n}\n\nexport enum WidgetType {\n Image = 'image',\n Text = 'text',\n Socials = 'socials',\n Youtube = 'youtube',\n Soundcloud = 'soundcloud',\n Vimeo = 'video',\n Spotify = 'spotify',\n Twitch = 'twitch',\n Tiktok = 'tiktok',\n}\n\nexport const WidgetList: Record<WidgetType, WidgetListItem> = {\n [WidgetType.Image]: {\n name: message('Image'),\n image: imageThumbnail,\n description: message(\n 'Upload an image and optionally add a link it will redirect to when clicked.'\n ),\n dialog: ImageWidgetDialog,\n },\n [WidgetType.Text]: {\n name: message('Text'),\n image: textImage,\n description: message(\n 'Add title and optional description. Can be used as a header for the whole biolink or a group of multiple widgets.'\n ),\n dialog: TextWidgetDialog,\n },\n [WidgetType.Socials]: {\n name: message('Social Links'),\n image: socialsImage,\n description: message(\n 'Add your socials links to display them as icon buttons.'\n ),\n dialog: SocialsWidgetDialog,\n },\n [WidgetType.Youtube]: {\n name: message('Youtube Video'),\n image: youtubeImage,\n description: message(\n 'Paste a YouTube video URL to show it as a video embed in your profile.'\n ),\n dialog: YoutubeWidgetDialog,\n },\n [WidgetType.Soundcloud]: {\n name: message('Soundcloud Audio'),\n image: soundcloudImage,\n description: message(\n 'Paste a SoundCloud URL to show it as a playable song in your profile.'\n ),\n dialog: SoundcloudWidgetDialog,\n },\n [WidgetType.Vimeo]: {\n name: message('Vimeo Video'),\n image: vimeoImage,\n description: message(\n 'Paste a vimeo URL to show it as a video embed in your profile.'\n ),\n dialog: VimeoWidgetDialog,\n },\n [WidgetType.Spotify]: {\n name: message('Spotify Embed'),\n image: spotifyImage,\n description: message(\n 'Paste a spotify song, album, artist, playlist, podcast or episode url to show it as an embed in your profile.'\n ),\n dialog: SpotifyWidgetDialog,\n },\n [WidgetType.Twitch]: {\n name: message('Twitch Embed'),\n image: twitchImage,\n description: message(\n 'Paste twitch profile or clip url to show it as an embed in your profile.'\n ),\n dialog: TwitchWidgetDialog,\n },\n [WidgetType.Tiktok]: {\n name: message('TikTok Embed'),\n image: tiktokImage,\n description: message(\n 'Paste TikTok video url to show it as an embed in your profile.'\n ),\n dialog: TiktokWidgetDialog,\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 {WidgetList} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\n\nexport function SelectWidgetDialog() {\n const {close} = useDialogContext();\n return (\n <Dialog size=\"xl\">\n <DialogHeader titleTextSize=\"text-md\" padding=\"px-24 pt-14 pb-4\">\n <Trans message=\"Add widget\" />\n </DialogHeader>\n <DialogBody padding=\"p-24\">\n <div className=\"grid gap-14 grid-cols-1 md:grid-cols-2 lg:grid-cols-3\">\n {Object.entries(WidgetList).map(([widgetType, widget]) => (\n <div\n key={widgetType}\n className=\"bg-paper border rounded p-14 shadow cursor-pointer hover:bg-primary/hover\"\n role=\"button\"\n tabIndex={0}\n onClick={() => {\n close(widgetType);\n }}\n >\n <img\n src={widget.image}\n alt=\"\"\n className=\"block w-54 h-54 mb-20 mr-auto\"\n />\n <div className=\"text-primary text-lg font-semibold whitespace-nowrap overflow-hidden overflow-ellipsis\">\n <Trans {...widget.name} />\n </div>\n <div className=\"text-muted\">\n <Trans {...widget.description} />\n </div>\n </div>\n ))}\n </div>\n </DialogBody>\n </Dialog>\n );\n}\n","import {\n WidgetList,\n WidgetType,\n} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\n\ninterface WidgetDialogContainerProps {\n biolink: Biolink;\n activeWidget: WidgetType | null;\n onOpenChange: (isOpen: boolean) => void;\n}\nexport function NewWidgetDialogContainer({\n activeWidget,\n biolink,\n onOpenChange,\n}: WidgetDialogContainerProps) {\n const Dialog = activeWidget ? WidgetList[activeWidget].dialog : null;\n return (\n <DialogTrigger\n type=\"modal\"\n isOpen={activeWidget != null}\n onOpenChange={onOpenChange}\n >\n {Dialog && <Dialog biolink={biolink} />}\n </DialogTrigger>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ArrowUpwardIcon = createSvgIcon(\n <path d=\"m4 12 1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z\" />\n, 'ArrowUpwardOutlined');\n","import {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {WidgetList} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {Trans} from '@common/i18n/trans';\nimport {Switch} from '@common/ui/forms/toggle/switch';\nimport {BiolinkContentItemLayout} from '@app/dashboard/biolink/biolink-editor/content/biolink-content-item-layout';\nimport {useUpdateBiolinkContentItem} from '@app/dashboard/biolink/biolink-editor/requests/use-update-biolink-content-item';\nimport {Button} from '@common/ui/buttons/button';\nimport {ArrowUpwardIcon} from '@common/icons/material/ArrowUpward';\nimport {useSortBiolinkContent} from '@app/dashboard/biolink/biolink-editor/requests/use-sort-biolink-content';\nimport {biolinkEditorState} from '@app/dashboard/biolink/biolink-editor/biolink-editor-store';\nimport {ArrowDownwardIcon} from '@common/icons/material/ArrowDownward';\nimport {WidgetRenderers} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-renderers';\n\ninterface WidgetContentItemProps {\n item: BiolinkWidget;\n biolink: Biolink;\n}\nexport function WidgetContentItem({\n item: widget,\n biolink,\n}: WidgetContentItemProps) {\n const config = WidgetList[widget.type];\n const WidgetRenderer = WidgetRenderers[widget.type];\n const WidgetDialog = config.dialog;\n\n return (\n <BiolinkContentItemLayout\n biolink={biolink}\n item={widget}\n title={<Trans {...config.name} />}\n updateDialog={<WidgetDialog widget={widget} biolink={biolink} />}\n actionRow={<ActionRow widget={widget} />}\n >\n <WidgetRenderer widget={widget} variant=\"editor\" />\n </BiolinkContentItemLayout>\n );\n}\n\ninterface ActionRowProps {\n widget: BiolinkWidget;\n}\nfunction ActionRow({widget}: ActionRowProps) {\n const updateItem = useUpdateBiolinkContentItem();\n const sortContent = useSortBiolinkContent();\n\n const handlePinToTop = () => {\n const biolink = biolinkEditorState().biolink;\n if (!biolink) return;\n\n const pinnedCount = biolink.content.filter(x => x.pinned === 'top').length;\n\n if (!widget.pinned) {\n const oldIndex = biolink.content.findIndex(\n x => x.model_type === widget.model_type && x.id === widget.id,\n );\n sortContent.mutate({\n oldIndex,\n // pinned widget after any other widgets that are already pinned to top\n newIndex: pinnedCount,\n widgetToPin: widget.id,\n });\n } else {\n updateItem.mutate({item: widget, values: {pinned: null}});\n }\n };\n\n return (\n <div className=\"flex items-center gap-24 justify-between text-muted h-42\">\n <Switch\n checked={widget.active}\n disabled={updateItem.isPending}\n onChange={() => {\n updateItem.mutate({\n item: widget,\n values: {\n active: !widget.active,\n },\n });\n }}\n />\n <Button\n variant=\"outline\"\n size=\"2xs\"\n radius=\"rounded-full\"\n color={widget.pinned === 'top' ? 'primary' : undefined}\n startIcon={\n widget.pinned === 'top' ? <ArrowDownwardIcon /> : <ArrowUpwardIcon />\n }\n disabled={sortContent.isPending}\n onClick={handlePinToTop || updateItem.isPending}\n >\n {widget.pinned === 'top' ? (\n <Trans message=\"Unpin from top\" />\n ) : (\n <Trans message=\"Pin to top\" />\n )}\n </Button>\n </div>\n );\n}\n","import {ReactNode} from 'react';\nimport {BiolinkLayout} from '@app/short-links/renderers/biolink-renderer/biolink-layout';\nimport {Trans} from '@common/i18n/trans';\nimport {Chip} from '@common/ui/forms/input-field/chip-field/chip';\nimport {useBiolinkEditorStore} from '@app/dashboard/biolink/biolink-editor/biolink-editor-store';\nimport {useIsTabletMediaQuery} from '@common/utils/hooks/is-tablet-media-query';\nimport {useEditorBiolink} from '@app/dashboard/biolink/biolink-editor/requests/use-editor-biolink';\n\nexport function LivePreview() {\n const {biolink} = useEditorBiolink();\n const appearance = useBiolinkEditorStore(s => s.appearance);\n const isTablet = useIsTabletMediaQuery();\n\n if (isTablet) {\n return null;\n }\n\n return (\n <div className=\"flex-shrink-0 sticky top-24 h-max\">\n <Chip\n size=\"sm\"\n color=\"positive\"\n radius=\"rounded\"\n className=\"w-max m-auto mb-24\"\n >\n <Trans message=\"Live preview\" />\n </Chip>\n <PhoneSkeleton>\n {biolink ? (\n <BiolinkLayout biolink={biolink} appearance={appearance} />\n ) : null}\n </PhoneSkeleton>\n <div className=\"text-sm text-muted text-center mt-14\">\n <Trans message=\"Scheduled and disabled content is not shown\" />\n </div>\n </div>\n );\n}\n\ninterface PhoneSkeletonProps {\n children: ReactNode;\n}\nfunction PhoneSkeleton({children}: PhoneSkeletonProps) {\n return (\n <div className=\"w-350 h-[724px] rounded-[64px] shadow-lg border border-[#444546] border-[12px] overflow-hidden\">\n <div className=\"overflow-y-auto h-full compact-scrollbar\">{children}</div>\n </div>\n );\n}\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 {createSvgIcon} from '../create-svg-icon';\n\nexport const GradientIcon = createSvgIcon(\n <path d=\"M11 9h2v2h-2V9zm-2 2h2v2H9v-2zm4 0h2v2h-2v-2zm2-2h2v2h-2V9zM7 9h2v2H7V9zm12-6H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 18H7v-2h2v2zm4 0h-2v-2h2v2zm4 0h-2v-2h2v2zm2-7h-2v2h2v2h-2v-2h-2v2h-2v-2h-2v2H9v-2H7v2H5v-2h2v-2H5V5h14v6z\" />\n, 'GradientOutlined');\n","import clsx from 'clsx';\nimport {ComponentProps, forwardRef, ReactNode} from 'react';\n\ninterface BackgroundSelectorButtonProps extends ComponentProps<'button'> {\n isActive?: boolean;\n children?: ReactNode;\n label: ReactNode;\n}\nexport const BackgroundSelectorButton = forwardRef<\n HTMLButtonElement,\n BackgroundSelectorButtonProps\n>(({isActive, children, className, style, label, ...buttonProps}, ref) => {\n return (\n <button type=\"button\" {...buttonProps} ref={ref}>\n <span\n className={clsx(\n 'flex aspect-square items-center justify-center overflow-hidden rounded-panel border border-[#c3cbdc] outline-none focus-visible:ring',\n isActive && 'ring-2 ring-primary ring-offset-2',\n className,\n )}\n style={style}\n >\n {children}\n </span>\n <span className=\"mt-10 block overflow-hidden overflow-ellipsis text-xs\">\n {label}\n </span>\n </button>\n );\n});\n","import {ColorPresets} from '@common/ui/color-picker/color-presets';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {message} from '@common/i18n/message';\n\nexport interface ColorBackground {\n type: 'color';\n id: string;\n backgroundColor?: string;\n color?: string;\n label: MessageDescriptor;\n}\nexport const BaseColorBg: ColorBackground = {\n type: 'color',\n id: 'c-custom',\n label: message('Custom color'),\n};\n\nexport const ColorBackgrounds: ColorBackground[] = ColorPresets.map(\n (preset, index) => {\n return {\n ...BaseColorBg,\n id: `c${index}`,\n backgroundColor: preset.color,\n label: preset.name,\n color: preset.foreground,\n };\n }\n);\n","import {Trans} from '@common/i18n/trans';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {ColorPickerDialog} from '@common/ui/color-picker/color-picker-dialog';\nimport {BackgroundSelectorButton} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector-button';\nimport {FormatColorFillIcon} from '@common/icons/material/FormatColorFill';\nimport {BgSelectorTabProps} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector';\nimport {\n BaseColorBg,\n ColorBackground,\n ColorBackgrounds,\n} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/color-backgrounds';\n\nexport function ColorBackgroundTab({\n value,\n onChange,\n className,\n}: BgSelectorTabProps<ColorBackground>) {\n return (\n <div className={className}>\n <CustomColorButton value={value} onChange={onChange} />\n {ColorBackgrounds.map(background => (\n <BackgroundSelectorButton\n key={background.id}\n label={<Trans {...background.label} />}\n isActive={value?.id === background.id}\n style={{backgroundColor: background.backgroundColor}}\n onClick={() => {\n onChange?.({\n ...BaseColorBg,\n ...background,\n });\n }}\n />\n ))}\n </div>\n );\n}\n\nfunction CustomColorButton({\n value,\n onChange,\n}: BgSelectorTabProps<ColorBackground>) {\n const isCustomColor = value?.id === BaseColorBg.id;\n return (\n <DialogTrigger\n currentValue={value}\n type=\"popover\"\n onClose={(newValue: ColorBackground | string) => {\n // apply color or revert to original\n onChange?.(\n typeof newValue === 'string'\n ? {...BaseColorBg, backgroundColor: newValue}\n : newValue\n );\n }}\n >\n <BackgroundSelectorButton\n label={<Trans {...BaseColorBg.label} />}\n className=\"border-dashed border-2\"\n style={{\n backgroundColor: isCustomColor ? value?.backgroundColor : undefined,\n }}\n >\n <span className=\"inline-block text-white bg-black/20 rounded p-10\">\n <FormatColorFillIcon size=\"lg\" />\n </span>\n </BackgroundSelectorButton>\n <ColorPickerDialog\n defaultValue={value?.backgroundColor}\n onChange={newColor => {\n // set color on color picker interaction\n onChange?.({\n ...BaseColorBg,\n backgroundColor: newColor,\n });\n }}\n />\n </DialogTrigger>\n );\n}\n","import {message} from '@common/i18n/message';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\nexport interface GradientBackground {\n type: 'gradient';\n id: string;\n backgroundImage?: string;\n color?: string;\n label: MessageDescriptor;\n}\nexport const BaseGradientBg: GradientBackground = {\n type: 'gradient',\n id: 'g-custom',\n label: message('Custom gradient'),\n};\n\nexport const GradientBackgrounds: GradientBackground[] = [\n {\n ...BaseGradientBg,\n ...BaseGradientBg,\n id: 'g1',\n backgroundImage: 'linear-gradient(45deg, #ff9a9e, #fad0c4)',\n label: message('Worm flame'),\n },\n {\n ...BaseGradientBg,\n id: 'g2',\n backgroundImage: 'linear-gradient(0deg, #a18cd1, #fbc2eb)',\n label: message('Night fade'),\n },\n {\n ...BaseGradientBg,\n id: 'g3',\n backgroundImage: 'linear-gradient(120deg, #a1c4fd, #c2e9fb)',\n label: message('Winter nova'),\n },\n {\n ...BaseGradientBg,\n id: 'g4',\n backgroundImage: 'linear-gradient(0deg, #cfd9df, #e2ebf0)',\n label: message('Heavy rain'),\n },\n {\n ...BaseGradientBg,\n id: 'g5',\n backgroundImage: 'linear-gradient(120deg, #fdfbfb, #ebedee)',\n label: message('Cloudy knoxville'),\n },\n {\n ...BaseGradientBg,\n id: 'g6',\n backgroundImage: 'linear-gradient(0deg, #a8edea, #fed6e3)',\n label: message('Rare wind'),\n },\n {\n ...BaseGradientBg,\n id: 'g7',\n backgroundImage: 'linear-gradient(135deg, #f5f7fa, #c3cfe2)',\n label: message('Saint petersburg'),\n },\n {\n ...BaseGradientBg,\n id: 'g8',\n backgroundImage: 'linear-gradient(135deg, #fdfcfb, #e2d1c3)',\n label: message('Everlasting sky'),\n },\n {\n ...BaseGradientBg,\n id: 'g9',\n backgroundImage: 'linear-gradient(0deg, #c1dfc4, #deecdd)',\n label: message('Soft grass'),\n },\n {\n ...BaseGradientBg,\n id: 'g10',\n backgroundImage: 'linear-gradient(90deg, #E9E4F0, #D3CCE3)',\n label: message('Delicate'),\n },\n {\n ...BaseGradientBg,\n id: 'g11',\n backgroundImage: 'linear-gradient(90deg, #fffcdc, #d9a7c7)',\n label: message('Broken hearts'),\n },\n {\n ...BaseGradientBg,\n id: 'g12',\n backgroundImage: 'linear-gradient(90deg, #56ab2f, #a8e063)',\n label: message('Lush'),\n color: 'rgb(255, 255, 255)',\n },\n {\n ...BaseGradientBg,\n id: 'g13',\n backgroundImage: 'linear-gradient(90deg, #606c88, #3f4c6b)',\n label: message('Ash'),\n color: 'rgb(255, 255, 255)',\n },\n {\n ...BaseGradientBg,\n id: 'g14',\n backgroundImage: 'linear-gradient(90deg, #ece9e6, #ffffff)',\n label: message('Clouds'),\n },\n {\n ...BaseGradientBg,\n id: 'g15',\n backgroundImage: 'linear-gradient(90deg, #f09819, #edde5d)',\n label: message('Mango pulp'),\n },\n {\n ...BaseGradientBg,\n id: 'g16',\n backgroundImage: 'linear-gradient(90deg, #b79891, #94716b)',\n label: message('Cooper'),\n color: 'rgb(255, 255, 255)',\n },\n {\n ...BaseGradientBg,\n id: 'g17',\n backgroundImage: 'linear-gradient(60deg, #29323c, #485563)',\n label: message('Vicious stance'),\n color: 'rgb(255, 255, 255)',\n },\n];\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ArrowForwardIcon = createSvgIcon(\n <path d=\"m12 4-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8-8-8z\" />\n, 'ArrowForwardOutlined');\n","import {Trans} from '@common/i18n/trans';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {BackgroundSelectorButton} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector-button';\nimport {\n BaseGradientBg,\n GradientBackground,\n GradientBackgrounds,\n} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/gradient-backgrounds';\nimport {GradientIcon} from '@common/icons/material/Gradient';\nimport {BgSelectorTabProps} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector';\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 {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 {useCallback, useState} from 'react';\nimport clsx from 'clsx';\nimport {ColorPickerDialog} from '@common/ui/color-picker/color-picker-dialog';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {ArrowDownwardIcon} from '@common/icons/material/ArrowDownward';\nimport {ArrowForwardIcon} from '@common/icons/material/ArrowForward';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {ArrowUpwardIcon} from '@common/icons/material/ArrowUpward';\n\nexport function GradientBackgroundTab({\n value,\n onChange,\n className,\n}: BgSelectorTabProps<GradientBackground>) {\n return (\n <div className={className}>\n <CustomGradientButton value={value} onChange={onChange} />\n {GradientBackgrounds.map(gradient => (\n <BackgroundSelectorButton\n key={gradient.backgroundImage}\n label={gradient.label && <Trans {...gradient.label} />}\n isActive={value?.id === gradient.id}\n style={{backgroundImage: gradient.backgroundImage}}\n onClick={() => {\n onChange?.({\n ...BaseGradientBg,\n ...gradient,\n });\n }}\n />\n ))}\n </div>\n );\n}\n\nfunction CustomGradientButton({\n value,\n onChange,\n}: BgSelectorTabProps<GradientBackground>) {\n const isCustomGradient = value?.id === BaseGradientBg.id;\n return (\n <DialogTrigger\n type=\"popover\"\n currentValue={value}\n onOpenChange={isOpen => {\n // on dialog open set default gradient as active, if no other gradient is selected\n if (isOpen && !value) {\n onChange?.(GradientBackgrounds[0]);\n }\n }}\n onClose={gradient => {\n // apply gradient or revert to original\n onChange?.(gradient);\n }}\n >\n <BackgroundSelectorButton\n label={<Trans {...BaseGradientBg.label} />}\n className=\"border-2 border-dashed\"\n style={{\n backgroundImage: isCustomGradient\n ? value?.backgroundImage\n : undefined,\n }}\n >\n <span className=\"inline-block rounded bg-black/20 p-10 text-white\">\n <GradientIcon size=\"lg\" />\n </span>\n </BackgroundSelectorButton>\n <CustomGradientDialog\n defaultValue={value}\n onChange={newValue => {\n onChange?.(newValue);\n }}\n />\n </DialogTrigger>\n );\n}\n\ninterface CustomGradientState {\n colorOne: string;\n colorTwo: string;\n angle: string;\n}\ninterface CustomGradientDialogProps {\n defaultValue?: GradientBackground;\n onChange: (value: GradientBackground) => void;\n}\nfunction CustomGradientDialog({\n defaultValue = GradientBackgrounds[0],\n onChange,\n}: CustomGradientDialogProps) {\n const {close} = useDialogContext();\n const [state, setLocalState] = useState<CustomGradientState>(() => {\n const parts =\n defaultValue?.backgroundImage?.match(/\\(([0-9]+deg),.?(.+?),.?(.+?)\\)/) ||\n [];\n return {\n angle: parts[1] || '45deg',\n colorOne: parts[2] || '#ff9a9e',\n colorTwo: parts[3] || '#fad0c4',\n };\n });\n\n const buildGradientBackground = (s: CustomGradientState) => {\n return {\n ...BaseGradientBg,\n backgroundImage: `linear-gradient(${s.angle}, ${s.colorOne}, ${s.colorTwo})`,\n };\n };\n\n const setState = useCallback(\n (newValues: Partial<CustomGradientState>) => {\n const newState = {\n ...state,\n ...newValues,\n };\n setLocalState(newState);\n onChange(buildGradientBackground(newState));\n },\n [state, onChange],\n );\n\n return (\n <Dialog size=\"sm\">\n <DialogHeader>\n <Trans message=\"Custom gradient\" />\n </DialogHeader>\n <DialogBody>\n <div className=\"mb-6\">\n <Trans message=\"Colors\" />\n </div>\n <div className=\"mb-20 flex h-40 items-stretch\">\n <ColorPickerButton\n className=\"rounded-input\"\n value={state.colorOne}\n onChange={value => setState({colorOne: value})}\n />\n <div\n className=\"flex-auto border-y border-[#c3cbdc]\"\n style={{\n backgroundImage: buildGradientBackground(state).backgroundImage,\n }}\n />\n <ColorPickerButton\n className=\"rounded-r-input\"\n value={state.colorTwo}\n onChange={value => setState({colorTwo: value})}\n />\n </div>\n <div className=\"mb-6\">\n <Trans message=\"Direction\" />\n </div>\n <DirectionButtons\n value={state.angle}\n onChange={value => setState({angle: value})}\n />\n </DialogBody>\n <DialogFooter dividerTop>\n <Button onClick={() => close()}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n variant=\"flat\"\n color=\"primary\"\n onClick={() => {\n close(buildGradientBackground(state));\n }}\n >\n <Trans message=\"Apply\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n\ninterface ColorPickerButtonProps {\n className: string;\n value: string;\n onChange: (value: string) => void;\n}\nfunction ColorPickerButton({\n className,\n value,\n onChange,\n}: ColorPickerButtonProps) {\n return (\n <DialogTrigger type=\"popover\">\n <Tooltip label={<Trans message=\"Click to change color\" />}>\n <button\n type=\"button\"\n className={clsx(\n 'w-40 flex-shrink-0 border border-[#c3cbdc]',\n className,\n )}\n style={{backgroundColor: value}}\n />\n </Tooltip>\n <ColorPickerDialog defaultValue={value} onChange={onChange} hideFooter />\n </DialogTrigger>\n );\n}\n\ninterface DirectionButtonsProps {\n value: string;\n onChange: (value: string) => void;\n}\nfunction DirectionButtons({value, onChange}: DirectionButtonsProps) {\n const activeStyle = 'text-primary border-primary';\n return (\n <div className=\"flex flex-wrap items-center gap-8 text-muted\">\n <IconButton\n variant=\"outline\"\n className={value === '0deg' ? activeStyle : undefined}\n onClick={() => onChange('0deg')}\n >\n <ArrowUpwardIcon />\n </IconButton>\n <IconButton\n variant=\"outline\"\n className={value === '180deg' ? activeStyle : undefined}\n onClick={() => onChange('180deg')}\n >\n <ArrowDownwardIcon />\n </IconButton>\n <IconButton\n variant=\"outline\"\n className={value === '90deg' ? activeStyle : undefined}\n onClick={() => onChange('90deg')}\n >\n <ArrowForwardIcon />\n </IconButton>\n <IconButton\n variant=\"outline\"\n className={value === '135deg' ? activeStyle : undefined}\n onClick={() => onChange('135deg')}\n >\n <ArrowDownwardIcon className=\"-rotate-45\" />\n </IconButton>\n <IconButton\n variant=\"outline\"\n className={value === '225deg' ? activeStyle : undefined}\n onClick={() => onChange('225deg')}\n >\n <ArrowDownwardIcon className=\"rotate-45\" />\n </IconButton>\n <IconButton\n variant=\"outline\"\n className={value === '45deg' ? activeStyle : undefined}\n onClick={() => onChange('45deg')}\n >\n <ArrowUpwardIcon className=\"rotate-45\" />\n </IconButton>\n <IconButton\n variant=\"outline\"\n className={value === '325deg' ? activeStyle : undefined}\n onClick={() => onChange('325deg')}\n >\n <ArrowUpwardIcon className=\"-rotate-45\" />\n </IconButton>\n </div>\n );\n}\n","export default \"__VITE_ASSET__8bc67d0f__\"","export default \"__VITE_ASSET__41b0e93f__\"","export default \"__VITE_ASSET__b1b6f181__\"","export default \"__VITE_ASSET__4a88b941__\"","export default \"__VITE_ASSET__f6e1169b__\"","export default \"__VITE_ASSET__3293a920__\"","export default \"__VITE_ASSET__6535cdc4__\"","export default \"__VITE_ASSET__f278b47e__\"","export default \"__VITE_ASSET__bcc1c32b__\"","export default \"__VITE_ASSET__2880686e__\"","export default \"__VITE_ASSET__064759e5__\"","export default \"__VITE_ASSET__75287c80__\"","export default \"__VITE_ASSET__de4884cd__\"","export default \"__VITE_ASSET__f68020ea__\"","export default \"__VITE_ASSET__92c4c0e5__\"","export default \"__VITE_ASSET__dfa556bd__\"","export default \"__VITE_ASSET__1fa4c498__\"","import angledFocus from './svg-bgs/Angled-Focus.svg';\nimport circularFocus from './svg-bgs/Circular-Focus.svg';\nimport farseeingEyeball from './svg-bgs/Farseeing-Eyeball.svg';\nimport canyonFunnel from './svg-bgs/Canyon-Funnel.svg';\nimport looneyLoops from './svg-bgs/Looney-Loops.svg';\nimport hurricaneAperture from './svg-bgs/Hurricane-Aperture.svg';\nimport icyExplosion from './svg-bgs/Icy-Explosion.svg';\nimport protrudingSquares from './svg-bgs/Protruding-Squares.svg';\nimport alternatingTriangles from './svg-bgs/Alternating-Triangles.svg';\nimport monsteraPatch from './svg-bgs/Monstera-Patch.svg';\nimport confettiDoodles from './svg-bgs/Confetti-Doodles.svg';\nimport threadsAhead from './svg-bgs/Threads-Ahead.svg';\nimport launchDay from './svg-bgs/Launch-Day.svg';\nimport sprinkle from './svg-bgs/Sprinkle.svg';\nimport circuitBoard from './svg-bgs/Circuit-Board.svg';\nimport nuclearFocalPoint from './svg-bgs/nuclear-focalpoint.svg';\nimport snow from './svg-bgs/Snow.svg';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {message} from '@common/i18n/message';\n\nexport interface ImageBackground {\n type: 'image';\n id: string;\n backgroundColor?: string;\n backgroundAttachment?: string;\n backgroundSize?: string;\n backgroundRepeat?: string;\n backgroundPosition?: string;\n backgroundImage?: string;\n color?: string;\n label: MessageDescriptor;\n}\nexport const BaseImageBg: ImageBackground = {\n type: 'image',\n id: 'i-custom',\n label: message('Custom image'),\n};\n\nexport const ImageBackgrounds: ImageBackground[] = [\n {\n ...BaseImageBg,\n id: 'img0',\n backgroundColor: '#ee5522',\n backgroundImage: `url(${protrudingSquares})`,\n backgroundRepeat: 'repeat',\n label: message('Protruding squares'),\n color: '#fff',\n },\n {\n ...BaseImageBg,\n id: 'img1',\n backgroundColor: '#00bbff',\n backgroundImage: `url(${launchDay})`,\n label: message('Launch day'),\n backgroundSize: 'contain',\n backgroundPosition: 'bottom',\n backgroundRepeat: 'no-repeat',\n color: '#fff',\n },\n {\n ...BaseImageBg,\n id: 'img2',\n backgroundColor: '#fff',\n backgroundImage: `url(${alternatingTriangles})`,\n label: message('Alternating triangles'),\n color: '#000',\n },\n {\n ...BaseImageBg,\n id: 'img3',\n backgroundColor: '#002200',\n backgroundImage: `url(${monsteraPatch})`,\n label: message('Monstera patch'),\n color: '#fff',\n },\n {\n ...BaseImageBg,\n id: 'img4',\n backgroundColor: '#aa3333',\n backgroundImage: `url(${confettiDoodles})`,\n label: message('Confetti doodles'),\n color: '#fff',\n backgroundRepeat: 'repeat',\n backgroundPosition: 'center center',\n backgroundSize: 'contain',\n },\n {\n ...BaseImageBg,\n id: 'img5',\n backgroundColor: '#070014',\n backgroundImage: `url(${hurricaneAperture})`,\n label: message('Hurricane aperture'),\n backgroundSize: 'cover',\n backgroundRepeat: 'no-repeat',\n backgroundPosition: 'center center',\n color: '#fff',\n },\n {\n ...BaseImageBg,\n id: 'img6',\n backgroundColor: '#11ddaa',\n backgroundImage: `url(${looneyLoops})`,\n label: message('Looney loops'),\n backgroundPosition: 'center center',\n backgroundSize: 'cover',\n color: '#000',\n },\n {\n ...BaseImageBg,\n id: 'img7',\n backgroundColor: '#ccffff',\n backgroundImage: `url(${icyExplosion})`,\n label: message('Icy explosion'),\n backgroundSize: 'cover',\n backgroundRepeat: 'no-repeat',\n backgroundPosition: 'center center',\n color: '#000',\n },\n {\n ...BaseImageBg,\n id: 'img8',\n backgroundColor: '#442233',\n backgroundImage: `url(${nuclearFocalPoint})`,\n label: message('Nuclear point'),\n backgroundSize: 'cover',\n backgroundRepeat: 'no-repeat',\n backgroundPosition: 'center center',\n color: '#fff',\n },\n {\n ...BaseImageBg,\n id: 'img9',\n backgroundColor: '#ffdd55',\n backgroundImage: `url(${angledFocus})`,\n label: message('Angled focus'),\n backgroundPosition: 'center center',\n backgroundSize: 'cover',\n color: '#fff',\n },\n {\n ...BaseImageBg,\n id: 'img10',\n backgroundColor: '#220044',\n backgroundImage: `url(${circularFocus})`,\n label: message('Circular focus'),\n backgroundPosition: 'center center',\n backgroundSize: 'cover',\n color: '#fff',\n },\n {\n ...BaseImageBg,\n id: 'img11',\n backgroundColor: '#000000',\n backgroundImage: `url(${farseeingEyeball})`,\n label: message('Farseeing eyeball'),\n backgroundPosition: 'center center',\n backgroundSize: 'cover',\n color: '#fff',\n },\n {\n ...BaseImageBg,\n id: 'img12',\n backgroundColor: '#ff0000',\n backgroundImage: `url(${canyonFunnel})`,\n label: message('Canyon funnel'),\n backgroundPosition: 'center center',\n backgroundSize: 'cover',\n color: '#fff',\n },\n {\n ...BaseImageBg,\n id: 'img13',\n backgroundColor: '#ffdd99',\n backgroundImage: `url(${threadsAhead})`,\n label: message('Threads ahead'),\n color: '#000',\n backgroundRepeat: 'no-repeat',\n },\n {\n ...BaseImageBg,\n id: 'img14',\n backgroundImage: `url(${sprinkle})`,\n label: message('Sprinkle'),\n backgroundRepeat: 'repeat',\n backgroundPosition: 'center center',\n },\n {\n ...BaseImageBg,\n id: 'img15',\n backgroundImage: `url(${circuitBoard})`,\n label: message('Circuit board'),\n backgroundRepeat: 'repeat',\n backgroundPosition: 'center center',\n },\n {\n ...BaseImageBg,\n id: 'img16',\n backgroundImage: `url(${snow})`,\n label: message('Snow'),\n backgroundRepeat: 'repeat',\n backgroundPosition: 'center center',\n },\n];\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const UploadIcon = createSvgIcon(\n <path d=\"M9 16h6v-6h4l-7-7-7 7h4v6zm3-10.17L14.17 8H13v6h-2V8H9.83L12 5.83zM5 18h14v2H5z\" />\n, 'UploadOutlined');\n","import {BgSelectorTabProps} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector';\nimport {ImageBackground} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/image-backgrounds';\nimport {RadioGroup} from '@common/ui/forms/radio-group/radio-group';\nimport {Radio} from '@common/ui/forms/radio-group/radio';\nimport {Trans} from '@common/i18n/trans';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {message} from '@common/i18n/message';\n\nconst BackgroundPositions: Record<\n 'cover' | 'contain' | 'repeat',\n {\n label: MessageDescriptor;\n bgConfig: Partial<ImageBackground>;\n }\n> = {\n cover: {\n label: message('Stretch to fit'),\n bgConfig: {\n backgroundRepeat: 'no-repeat',\n backgroundSize: 'cover',\n },\n },\n contain: {\n label: message('Fit image'),\n bgConfig: {\n backgroundRepeat: 'no-repeat',\n backgroundSize: 'contain',\n backgroundPosition: 'center top',\n },\n },\n repeat: {\n label: message('Repeat image'),\n bgConfig: {\n backgroundRepeat: 'repeat',\n backgroundSize: undefined,\n backgroundPosition: 'left top',\n },\n },\n};\n\nexport function BackgroundPositionSelector({\n value: imageBgValue,\n onChange,\n}: Omit<BgSelectorTabProps<ImageBackground>, 'className'>) {\n const selectedPosition = positionKeyFromValue(imageBgValue);\n return (\n <div className=\"border-t mt-20 pt-14\">\n <RadioGroup size=\"sm\" disabled={!imageBgValue}>\n {Object.entries(BackgroundPositions).map(([key, position]) => {\n return (\n <Radio\n key={key}\n name=\"background-position\"\n value={key}\n checked={key === selectedPosition}\n onChange={e => {\n if (imageBgValue) {\n onChange?.({\n ...imageBgValue,\n ...position.bgConfig,\n });\n }\n }}\n >\n <Trans {...position.label} />\n </Radio>\n );\n })}\n </RadioGroup>\n </div>\n );\n}\n\nfunction positionKeyFromValue(\n value?: ImageBackground\n): keyof typeof BackgroundPositions {\n if (value?.backgroundSize === 'cover') {\n return 'cover';\n } else if (value?.backgroundSize === 'contain') {\n return 'contain';\n } else {\n return 'repeat';\n }\n}\n","import {\n BaseImageBg,\n ImageBackground,\n ImageBackgrounds,\n} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/image-backgrounds';\nimport {BackgroundSelectorButton} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector-button';\nimport {BgSelectorTabProps} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Trans} from '@common/i18n/trans';\nimport {UploadIcon} from '@common/icons/material/Upload';\nimport {useForm} from 'react-hook-form';\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 {Form} from '@common/ui/forms/form';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {BackgroundPositionSelector} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/image-background-tab/background-position-selector';\nimport {cssPropsFromBgConfig} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/css-props-from-bg-config';\n\nexport function ImageBackgroundTab({\n value,\n onChange,\n className,\n}: BgSelectorTabProps<ImageBackground>) {\n return (\n <div>\n <div className={className}>\n <CustomImageTrigger value={value} onChange={onChange} />\n {ImageBackgrounds.map(background => (\n <BackgroundSelectorButton\n key={background.id}\n onClick={() =>\n onChange?.({\n ...BaseImageBg,\n ...background,\n })\n }\n isActive={value?.id === background.id}\n style={{\n ...cssPropsFromBgConfig(background),\n backgroundAttachment: 'initial',\n }}\n label={<Trans {...background.label} />}\n />\n ))}\n </div>\n <BackgroundPositionSelector value={value} onChange={onChange} />\n </div>\n );\n}\n\ninterface CustomImageTrigger {\n value?: ImageBackground;\n onChange?: (value: ImageBackground | null) => void;\n}\nfunction CustomImageTrigger({value, onChange}: CustomImageTrigger) {\n // only seed form with custom uploaded image\n value = value?.id === BaseImageBg.id ? value : undefined;\n return (\n <DialogTrigger\n type=\"popover\"\n onClose={(imageUrl?: string) => {\n onChange?.(\n imageUrl\n ? {\n ...BaseImageBg,\n backgroundImage: `url(${imageUrl})`,\n }\n : null\n );\n }}\n >\n <BackgroundSelectorButton\n label={<Trans {...BaseImageBg.label} />}\n isActive={value?.id === BaseImageBg.id}\n className=\"border-dashed border-2\"\n style={cssPropsFromBgConfig(value)}\n >\n <span className=\"inline-block text-white bg-black/20 rounded p-10\">\n <UploadIcon size=\"lg\" />\n </span>\n </BackgroundSelectorButton>\n <CustomImageDialog value={value} />\n </DialogTrigger>\n );\n}\n\ninterface CustomImageDialogProps {\n value?: ImageBackground;\n}\nexport function CustomImageDialog({value}: CustomImageDialogProps) {\n const defaultValue = value?.backgroundImage\n ?.replace('url(', '')\n .replace(')', '');\n const form = useForm<{imageUrl: string}>({\n defaultValues: {imageUrl: defaultValue},\n });\n const {close, formId} = useDialogContext();\n return (\n <Dialog size=\"sm\">\n <DialogHeader>\n <Trans message=\"Upload image\" />\n </DialogHeader>\n <DialogBody>\n <Form\n id={formId}\n form={form}\n onSubmit={values => {\n close(values.imageUrl);\n }}\n >\n <FileUploadProvider>\n <FormImageSelector\n autoFocus\n name=\"imageUrl\"\n diskPrefix=\"biolinks\"\n showRemoveButton\n />\n </FileUploadProvider>\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button\n onClick={() => {\n close();\n }}\n >\n <Trans message=\"Cancel\" />\n </Button>\n <Button variant=\"flat\" color=\"primary\" type=\"submit\" form={formId}>\n <Trans message=\"Select\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","export const appearanceHeaderClassnames = {\n h2: 'text-xl font-semibold mb-20',\n h3: 'my-12 font-semibold',\n};\n","import clsx from 'clsx';\nimport {Trans} from '@common/i18n/trans';\nimport {ImageIcon} from '@common/icons/material/Image';\nimport {FormatColorFillIcon} from '@common/icons/material/FormatColorFill';\nimport {GradientIcon} from '@common/icons/material/Gradient';\nimport {ReactElement, ReactNode, useState} from 'react';\nimport {ColorBackgroundTab} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/color-background-tab';\nimport {GradientBackgroundTab} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/gradient-background-tab';\nimport {ImageBackgroundTab} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/image-background-tab/image-background-tab';\nimport {SelectedBackground} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/selected-background';\nimport {\n biolinkEditorState,\n useBiolinkEditorStore,\n} from '@app/dashboard/biolink/biolink-editor/biolink-editor-store';\nimport {appearanceHeaderClassnames} from '@app/dashboard/biolink/biolink-editor/appearance/header-classnames';\n\nexport interface BgSelectorTabProps<T extends SelectedBackground> {\n value?: T;\n onChange?: (value: T | null) => void;\n className?: string;\n}\n\nconst TabMap: Record<\n 'color' | 'gradient' | 'image',\n (value: BgSelectorTabProps<any>) => ReactElement\n> = {\n color: ColorBackgroundTab,\n gradient: GradientBackgroundTab,\n image: ImageBackgroundTab,\n};\ntype TabName = keyof typeof TabMap;\n\ninterface BackgroundSelectorProps {\n className?: string;\n}\nexport function BackgroundSelector({className}: BackgroundSelectorProps) {\n const value = useBiolinkEditorStore(s => s.appearance?.bgConfig);\n\n const [activeTab, setActiveTab] = useState<TabName>(() => {\n if (value?.type === 'color') return 'color';\n if (value?.type === 'gradient') return 'gradient';\n return 'color';\n });\n\n const Tab = TabMap[activeTab];\n\n return (\n <div className={className}>\n <h2 className={appearanceHeaderClassnames.h2}>\n <Trans message=\"Background\" />\n </h2>\n <TypeSelector activeTab={activeTab} onTabChange={setActiveTab} />\n <Tab\n value={activeTab === value?.type ? value : undefined}\n onChange={newValue => {\n biolinkEditorState().updateAppearance({bgConfig: newValue});\n }}\n className=\"grid grid-cols-[repeat(auto-fill,minmax(90px,1fr))] items-start gap-14\"\n />\n </div>\n );\n}\n\ninterface TypeSelectorProps {\n activeTab: TabName;\n onTabChange: (tab: TabName) => void;\n}\nfunction TypeSelector({activeTab, onTabChange}: TypeSelectorProps) {\n return (\n <div className=\"my-20 flex items-center gap-20 border-b pb-20\">\n <TypeButton\n isActive={activeTab === 'color'}\n icon={<FormatColorFillIcon />}\n title={<Trans message=\"Flat color\" />}\n onClick={() => {\n onTabChange('color');\n }}\n />\n <TypeButton\n isActive={activeTab === 'gradient'}\n icon={<GradientIcon />}\n title={<Trans message=\"Gradient\" />}\n onClick={() => {\n onTabChange('gradient');\n }}\n />\n <TypeButton\n isActive={activeTab === 'image'}\n icon={<ImageIcon />}\n title={<Trans message=\"Image\" />}\n onClick={() => {\n onTabChange('image');\n }}\n />\n </div>\n );\n}\n\ninterface TypeButtonProps {\n isActive: boolean;\n icon: ReactNode;\n title: ReactNode;\n onClick?: () => void;\n}\nfunction TypeButton({isActive, icon, title, onClick}: TypeButtonProps) {\n return (\n <div role=\"button\" className=\"block\" onClick={onClick}>\n <div\n className={clsx(\n 'mx-auto mb-8 flex h-50 w-50 items-center justify-center rounded-panel border text-muted',\n isActive && 'border-primary ring',\n )}\n >\n {icon}\n </div>\n <div className=\"text-center text-sm text-primary\">{title}</div>\n </div>\n );\n}\n","import {Trans} from '@common/i18n/trans';\nimport {BiolinkBtnConfig} from '@app/dashboard/biolink/biolink';\nimport {Button} from '@common/ui/buttons/button';\nimport clsx from 'clsx';\nimport {message} from '@common/i18n/message';\nimport {ButtonVariant} from '@common/ui/buttons/get-shared-button-style';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {\n biolinkEditorState,\n useBiolinkEditorStore,\n} from '@app/dashboard/biolink/biolink-editor/biolink-editor-store';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\nimport React, {useCallback} from 'react';\nimport {appearanceHeaderClassnames} from '@app/dashboard/biolink/biolink-editor/appearance/header-classnames';\n\nconst AvailableVariants: Record<\n NonNullable<Exclude<ButtonVariant, 'text' | 'raised' | 'link'>>,\n MessageDescriptor\n> = {\n flat: message('Fill'),\n outline: message('Outline'),\n} as const;\n\nconst AvailableRadius: Record<\n NonNullable<BiolinkBtnConfig['radius']>,\n MessageDescriptor\n> = {\n 'rounded-none': message('Square'),\n rounded: message('Rounded'),\n 'rounded-full': message('Pill'),\n} as const;\n\ninterface ButtonStyleSelectorProps {\n className?: string;\n}\nexport function ButtonStyleSelector({className}: ButtonStyleSelectorProps) {\n const value = useBiolinkEditorStore(s => s.appearance?.btnConfig);\n\n const setValue = useCallback(\n (newValue: Partial<BiolinkBtnConfig>) => {\n biolinkEditorState().updateAppearance({\n btnConfig: {\n ...value,\n ...newValue,\n },\n });\n },\n [value],\n );\n\n return (\n <div className={className}>\n <h2 className={appearanceHeaderClassnames.h2}>\n <Trans message=\"Buttons\" />\n </h2>\n <StyleSelector value={value} onChange={setValue} />\n <ShadowSelector value={value} onChange={setValue} />\n </div>\n );\n}\n\ninterface StyleSelectorProps {\n value?: BiolinkBtnConfig;\n onChange: (newValue: BiolinkBtnConfig) => void;\n}\nfunction StyleSelector({value, onChange}: StyleSelectorProps) {\n const selectedVariant = value?.variant ?? 'flat';\n const selectedRadius = value?.radius ?? 'rounded';\n\n return (\n <div>\n {Object.entries(AvailableVariants).map(([variant, variantLabel]) => (\n <div key={variant}>\n <h3 className={appearanceHeaderClassnames.h3}>\n <Trans {...variantLabel} />\n </h3>\n <div className=\"grid grid-cols-2 gap-24 md:grid-cols-3\">\n {Object.entries(AvailableRadius).map(([radius, radiusLabel]) => (\n <div\n key={radius}\n className={clsx(\n 'rounded',\n variant === selectedVariant &&\n selectedRadius === radius &&\n 'ring ring-primary-light ring-offset-4',\n )}\n >\n <Button\n variant={variant as ButtonVariant}\n color=\"primary\"\n radius={radius}\n className=\"w-full\"\n onClick={() => {\n onChange({\n variant: variant as ButtonVariant,\n radius: radius as BiolinkBtnConfig['radius'],\n });\n }}\n >\n <Trans {...radiusLabel} />\n </Button>\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nconst AvailableShadows: Record<string, MessageDescriptor> = {\n 'shadow-none': message('No shadow'),\n 'rgb(0 0 0 / 20%) 0.2rem 0.2rem 0.4rem 0px': message('Light shadow'),\n 'rgb(0 0 0 / 75%) 0.3rem 0.4rem 0px': message('Hard shadow'),\n} as const;\nfunction ShadowSelector({value, onChange}: StyleSelectorProps) {\n const selectedShadow = value?.shadow ?? 'shadow-none';\n return (\n <div>\n <h3 className=\"my-12 font-semibold\">\n <Trans message=\"Shadow\" />\n </h3>\n <div className=\"flex gap-24\">\n {Object.entries(AvailableShadows).map(([shadow, shadowLabel]) => (\n <div\n key={shadow}\n style={{boxShadow: shadow}}\n className=\"h-40 w-70 overflow-hidden rounded-button\"\n >\n <ButtonBase\n display=\"block\"\n radius=\"rounded-button\"\n className={clsx(\n 'h-full w-full border',\n selectedShadow === shadow && 'border-primary',\n )}\n onClick={() => {\n onChange({\n shadow: shadow === 'shadow-none' ? undefined : shadow,\n });\n }}\n >\n <span className=\"sr-only\">\n <Trans {...shadowLabel} />\n </span>\n </ButtonBase>\n </div>\n ))}\n </div>\n </div>\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 {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {message} from '@common/i18n/message';\nimport {toast} from '@common/ui/toast/toast';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {biolinkEditorState} from '@app/dashboard/biolink/biolink-editor/biolink-editor-store';\nimport {useEditorBiolinkId} from '@app/dashboard/biolink/biolink-editor/requests/use-editor-biolink';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n appearance: Biolink['appearance'];\n}\n\nexport function useSaveBiolinkAppearance() {\n const biolinkId = useEditorBiolinkId();\n return useMutation({\n mutationFn: () => {\n const appearance = biolinkEditorState().appearance!;\n return saveAppearance(biolinkId, {config: appearance});\n },\n onSuccess: () => {\n biolinkEditorState().setAppearanceIsDirty(false);\n toast.positive(message('Appearance saved'));\n },\n onError: err =>\n showHttpErrorToast(err, message('Could not save appearance')),\n });\n}\n\nfunction saveAppearance(\n biolinkId: number,\n appearance: Biolink['appearance'],\n): Promise<Response> {\n return apiClient\n .post(`biolink/${biolinkId}/appearance`, appearance)\n .then(r => r.data);\n}\n","import {getInputFieldClassNames} from '@common/ui/forms/input-field/get-input-field-class-names';\nimport React, {Fragment, ReactNode, useId} from 'react';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\nimport {ColorPickerDialog} from '@common/ui/color-picker/color-picker-dialog';\nimport {HexColorInput} from 'react-colorful';\n\ninterface ColorInputProps {\n value: string;\n onChange: (newValue: string) => void;\n label: ReactNode;\n}\nexport function ColorInput({value, onChange, label}: ColorInputProps) {\n const style = getInputFieldClassNames({\n size: 'md',\n startAppend: <Fragment />,\n });\n const id = useId();\n\n return (\n <div>\n <label className={style.label} htmlFor={id}>\n {label}\n </label>\n <div className=\"flex\">\n <DialogTrigger type=\"popover\">\n <ButtonBase\n className=\"h-42 w-42 flex-shrink-0 rounded-input border bg-black\"\n style={{backgroundColor: value}}\n />\n <ColorPickerDialog\n showInput={false}\n defaultValue={value}\n onChange={onChange}\n />\n </DialogTrigger>\n <HexColorInput\n id={id}\n autoComplete=\"off\"\n role=\"textbox\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n required\n prefixed\n className={style.input}\n color={value}\n onChange={onChange}\n />\n </div>\n </div>\n );\n}\n","import {Trans} from '@common/i18n/trans';\nimport {Button} from '@common/ui/buttons/button';\nimport {BackgroundSelector} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector';\nimport React, {Fragment} from 'react';\nimport {\n biolinkEditorState,\n useBiolinkEditorStore,\n} from '@app/dashboard/biolink/biolink-editor/biolink-editor-store';\nimport {ButtonStyleSelector} from '@app/dashboard/biolink/biolink-editor/appearance/button-style-selector';\nimport {FontSelector as CommonFontSelector} from '@common/ui/font-selector/font-selector';\nimport {useSaveBiolinkAppearance} from '@app/dashboard/biolink/biolink-editor/requests/use-save-biolink-appearance';\nimport {BrowserSafeFonts} from '@common/ui/font-picker/browser-safe-fonts';\nimport {ColorInput} from '@app/dashboard/biolink/biolink-editor/appearance/color-input';\nimport {appearanceHeaderClassnames} from '@app/dashboard/biolink/biolink-editor/appearance/header-classnames';\nimport {Switch} from '@common/ui/forms/toggle/switch';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {LockIcon} from '@common/icons/material/Lock';\nimport {FeatureLockedDialog} from '@app/dashboard/upgrade/feature-locked-dialog';\nimport {useAuth} from '@common/auth/use-auth';\n\nexport function BiolinkAppearanceEditor() {\n const saveAppearance = useSaveBiolinkAppearance();\n const isDirty = useBiolinkEditorStore(s => s.appearanceIsDirty);\n\n return (\n <Fragment>\n <header className=\"mb-40\">\n <h1 className=\"mb-4 text-2xl\">\n <Trans message=\"Custom appearance\" />\n </h1>\n <div className=\"mb-20 text-sm\">\n <Trans message=\"Fully customize your Biolink. Change background color or select gradients and images. Choose button style, text color, typeface and more.\" />\n </div>\n <Button\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n onClick={() => saveAppearance.mutate()}\n disabled={!isDirty || saveAppearance.isPending}\n >\n <Trans message=\"Save changes\" />\n </Button>\n </header>\n <BackgroundSelector />\n <ColorSelector />\n <ButtonStyleSelector className=\"my-60\" />\n <FontSelector />\n <BrandingSelector />\n </Fragment>\n );\n}\n\nfunction ColorSelector() {\n const btnConfig = useBiolinkEditorStore(s => s.appearance?.btnConfig);\n const bgConfig = useBiolinkEditorStore(s => s.appearance?.bgConfig);\n\n return (\n <div className=\"my-60\">\n <h2 className={appearanceHeaderClassnames.h2}>\n <Trans message=\"Colors\" />\n </h2>\n <div className=\"grid-cols-3 items-center gap-24 md:grid\">\n <ColorInput\n label={<Trans message=\"Text color\" />}\n value={bgConfig?.color || '#000'}\n onChange={newValue => {\n biolinkEditorState().updateAppearance({\n bgConfig: {\n ...bgConfig,\n color: newValue,\n },\n });\n }}\n />\n <ColorInput\n label={<Trans message=\"Button color\" />}\n value={btnConfig?.color || '#000'}\n onChange={newValue => {\n biolinkEditorState().updateAppearance({\n btnConfig: {\n ...btnConfig,\n color: newValue,\n },\n });\n }}\n />\n <ColorInput\n label={<Trans message=\"Button text color\" />}\n value={btnConfig?.textColor || '#000'}\n onChange={newValue => {\n biolinkEditorState().updateAppearance({\n btnConfig: {\n ...btnConfig,\n textColor: newValue,\n },\n });\n }}\n />\n </div>\n </div>\n );\n}\n\nfunction FontSelector() {\n const currentValue =\n useBiolinkEditorStore(s => s.appearance?.fontConfig) || BrowserSafeFonts[0];\n return (\n <div>\n <h2 className={appearanceHeaderClassnames.h2}>\n <Trans message=\"Font\" />\n </h2>\n <CommonFontSelector\n value={currentValue}\n onChange={newValue => {\n biolinkEditorState().updateAppearance({\n fontConfig: {\n ...currentValue,\n ...newValue,\n },\n });\n }}\n />\n </div>\n );\n}\n\nfunction BrandingSelector() {\n const {branding, biolink} = useSettings();\n const {isSubscribed} = useAuth();\n const {billing} = useSettings();\n const currentValue =\n useBiolinkEditorStore(s => s.appearance?.hideBranding) || false;\n\n return (\n <div className=\"my-60\">\n <h2 className={appearanceHeaderClassnames.h2}>\n <Trans message=\"Branding\" />\n </h2>\n {billing.enable && (\n <div className=\"mb-14\">\n <DialogTrigger type=\"popover\">\n <Button\n variant=\"flat\"\n color=\"primary\"\n size=\"2xs\"\n startIcon={<LockIcon />}\n >\n <Trans message=\"Upgrade\" />\n </Button>\n <FeatureLockedDialog\n message={\n <Trans\n message=\"Upgrade to remove :site logo.\"\n values={{site: branding.site_name}}\n />\n }\n messageSuffix={null}\n />\n </DialogTrigger>\n </div>\n )}\n {biolink.show_branding && (\n <Switch\n disabled={!isSubscribed}\n checked={currentValue}\n onChange={e => {\n biolinkEditorState().updateAppearance({\n hideBranding: e.target.checked,\n });\n }}\n >\n <Trans\n message=\"Hide :site logo\"\n values={{site: branding.site_name}}\n />\n </Switch>\n )}\n </div>\n );\n}\n","import {Tabs} from '@common/ui/tabs/tabs';\nimport {TabList} from '@common/ui/tabs/tab-list';\nimport {Tab} from '@common/ui/tabs/tab';\nimport {Trans} from '@common/i18n/trans';\nimport {TabPanel, TabPanels} from '@common/ui/tabs/tab-panels';\nimport {Fragment, ReactElement, useEffect, useState} from 'react';\nimport {Button} from '@common/ui/buttons/button';\nimport {WidgetsIcon} from '@common/icons/material/Widgets';\nimport {\n LinkContentItem,\n linkDialogHiddenFields,\n} from '@app/dashboard/biolink/biolink-editor/content/link-content-item/link-content-item';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {CreateLinkDialog} from '@app/dashboard/links/dialogs/create-link-dialog';\nimport {BiolinkSettingsForm} from '@app/dashboard/biolink/biolink-editor/biolink-settings-form';\nimport {SelectWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-selector/select-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {NewWidgetDialogContainer} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-selector/new-widget-dialog-container';\nimport {WidgetContentItem} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-content-item';\nimport {LivePreview} from '@app/dashboard/biolink/biolink-editor/live-preview';\nimport {BiolinkAppearanceEditor} from '@app/dashboard/biolink/biolink-editor/appearance/biolink-appearance-editor';\nimport {Link, useParams} from 'react-router-dom';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {BiolinkContentItemLayout} from '@app/dashboard/biolink/biolink-editor/content/biolink-content-item-layout';\nimport {prefetchLinkFormValueLists} from '@app/dashboard/links/requests/use-link-form-value-lists';\nimport {\n setEditorBiolink,\n useEditorBiolink,\n} from '@app/dashboard/biolink/biolink-editor/requests/use-editor-biolink';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport notifySvg from '@common/notifications/empty-state/notify.svg';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {LinkIcon} from '@common/icons/material/Link';\nimport {removeProtocol} from '@common/utils/urls/remove-protocol';\nimport {LinkStyle} from '@common/ui/buttons/external-link';\nimport {ShareLinkButton} from '@app/dashboard/links/sharing/share-link-button';\n\nconst TabsMap: Record<string, number> = {\n content: 0,\n appearance: 1,\n settings: 2,\n};\n\nexport function BiolinkEditorPage() {\n return (\n <div>\n <BiolinkEditorHeader />\n <div className=\"flex gap-60 p-24 container mx-auto\">\n <BiolinkEditor />\n <LivePreview />\n </div>\n </div>\n );\n}\n\nfunction BiolinkEditorHeader() {\n const {biolink} = useEditorBiolink();\n return (\n <header className=\"border-b px-10 py-4 flex items-center gap-10 min-h-46\">\n <LinkIcon className=\"text-muted\" />\n <AnimatePresence>\n {biolink && (\n <m.a\n key=\"link\"\n className={LinkStyle}\n href={biolink?.short_url}\n target=\"_blank\"\n rel=\"noreferrer\"\n {...opacityAnimation}\n >\n {removeProtocol(biolink.short_url)}\n </m.a>\n )}\n {biolink && (\n <m.div {...opacityAnimation} key=\"share-button\" className=\"ml-auto\">\n <ShareLinkButton variant=\"text\" link={biolink} />\n </m.div>\n )}\n </AnimatePresence>\n </header>\n );\n}\n\nfunction BiolinkEditor() {\n const {biolinkId} = useParams();\n const {tabName = 'content'} = useParams();\n const selectedTab = TabsMap[tabName] ?? TabsMap.content;\n useEditorBiolink();\n\n useEffect(() => {\n prefetchLinkFormValueLists();\n }, [biolinkId]);\n\n return (\n <div className=\"flex-auto min-w-0\">\n <Tabs overflow=\"overflow-visible\" selectedTab={selectedTab} isLazy>\n <TabList className=\"sticky top-0 bg dark:bg-alt z-10\">\n <Tab\n padding=\"w-140\"\n elementType={Link}\n to=\"../content\"\n relative=\"path\"\n >\n <Trans message=\"Content\" />\n </Tab>\n <Tab\n padding=\"w-140\"\n elementType={Link}\n to=\"../appearance\"\n relative=\"path\"\n >\n <Trans message=\"Appearance\" />\n </Tab>\n <Tab\n padding=\"w-140\"\n elementType={Link}\n to=\"../settings\"\n relative=\"path\"\n >\n <Trans message=\"Settings\" />\n </Tab>\n </TabList>\n <TabPanels className=\"py-20\">\n <TabPanel>{<BiolinkContent />}</TabPanel>\n <TabPanel>{<BiolinkAppearanceEditor />}</TabPanel>\n <TabPanel>\n <BiolinkSettingsForm />\n </TabPanel>\n </TabPanels>\n </Tabs>\n </div>\n );\n}\n\nfunction BiolinkContent() {\n const {isLoading, status, biolink} = useEditorBiolink();\n const [activeWidgetDialog, setActiveWidgetDialog] =\n useState<WidgetType | null>(null);\n\n let renderedContent: ReactElement;\n\n if (status === 'success' && !biolink?.content.length) {\n renderedContent = (\n <m.div {...opacityAnimation} key=\"no-results\">\n <IllustratedMessage\n className=\"mt-60\"\n image={<SvgImage src={notifySvg} />}\n title={<Trans message=\"This biolink does not have any content yet\" />}\n />\n </m.div>\n );\n } else if (isLoading) {\n renderedContent = <LoadingSkeleton />;\n } else {\n renderedContent = <BiolinkItemList biolink={biolink!} />;\n }\n\n return (\n <Fragment>\n {biolink && (\n <NewWidgetDialogContainer\n biolink={biolink}\n activeWidget={activeWidgetDialog}\n onOpenChange={isOpen => {\n if (!isOpen) {\n setActiveWidgetDialog(null);\n }\n }}\n />\n )}\n <div className=\"mb-20\">\n <AddNewLinkButton />\n <DialogTrigger\n type=\"modal\"\n onClose={(widgetType?: WidgetType) => {\n if (widgetType) {\n setActiveWidgetDialog(widgetType);\n }\n }}\n >\n <Button color=\"primary\" variant=\"outline\" startIcon={<WidgetsIcon />}>\n <Trans message=\"Add widget\" />\n </Button>\n <SelectWidgetDialog />\n </DialogTrigger>\n </div>\n <AnimatePresence initial={false} mode=\"wait\">\n {renderedContent}\n </AnimatePresence>\n </Fragment>\n );\n}\n\ninterface BiolinkItemListProps {\n biolink: Biolink;\n}\nfunction BiolinkItemList({biolink}: BiolinkItemListProps) {\n return (\n <m.div key=\"content\" {...opacityAnimation}>\n {biolink?.content.map(contentItem => {\n const ContentItem =\n contentItem.model_type === 'biolinkWidget'\n ? WidgetContentItem\n : LinkContentItem;\n return (\n <ContentItem\n key={`${contentItem.model_type}-${contentItem.id}`}\n item={contentItem as never}\n biolink={biolink}\n />\n );\n })}\n </m.div>\n );\n}\n\nfunction AddNewLinkButton() {\n const {biolink, biolinkId} = useEditorBiolink();\n const endpoint = `biolink/${biolinkId}/link`;\n\n const position = biolink?.content.filter(x => x.pinned).length;\n\n return (\n <DialogTrigger type=\"modal\">\n <Button color=\"primary\" variant=\"flat\" className=\"mr-14 min-w-144\">\n <Trans message=\"Add a link\" />\n </Button>\n <CreateLinkDialog\n endpoint={endpoint}\n position={position}\n group={biolink}\n hiddenFields={linkDialogHiddenFields}\n showButtonLabelField\n invalidateQueries={false}\n onSuccess={(response: {biolink: Biolink}) => {\n setEditorBiolink(response.biolink);\n }}\n />\n </DialogTrigger>\n );\n}\n\nfunction LoadingSkeleton() {\n return (\n <m.div key=\"loading-skeleton\" {...opacityAnimation}>\n {[...Array(4).keys()].map((value, index) => (\n <BiolinkSkeleton key={index} />\n ))}\n </m.div>\n );\n}\n\nfunction BiolinkSkeleton() {\n return (\n <BiolinkContentItemLayout\n title={<Skeleton className=\"mb-14 text-sm max-w-192\" />}\n actionRow={<Skeleton className=\"text-xs max-w-288\" />}\n >\n <Skeleton className=\"text-xs max-w-400\" />\n <Skeleton className=\"text-xs max-w-400\" />\n </BiolinkContentItemLayout>\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 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 currentValue={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 defaultValue={dialog === 'text' ? '#000000' : '#FFFFFF'}\n />\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 {createSvgIcon} from '../create-svg-icon';\n\nexport const UnfoldLessIcon = createSvgIcon(\n <path d=\"M7.41 18.59 8.83 20 12 16.83 15.17 20l1.41-1.41L12 14l-4.59 4.59zm9.18-13.18L15.17 4 12 7.17 8.83 4 7.41 5.41 12 10l4.59-4.59z\" />\n, 'UnfoldLessOutlined');\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}\n\nexport function ArticleBodyEditorMenubar({\n editor,\n size = 'md',\n justify = 'justify-center',\n hideInsertButton = false,\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 />\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 editor={editor} size={size} />\n </m.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n\nfunction ExtendedButtons({editor, size = 'md', hideInsertButton}: 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} />\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}\nexport function ArticleEditorStickyHeader({\n editor,\n allowSlugEditing = true,\n onSave,\n saveButton,\n isLoading = false,\n backLink,\n slugPrefix = 'pages',\n}: StickyHeaderProps) {\n const {isSticky, sentinelRef} = useStickySentinel();\n const isMobile = useIsMobileMediaQuery();\n\n return (\n <Fragment>\n <div ref={sentinelRef} />\n <div\n className={clsx(\n 'sticky top-0 z-10 mb-20 bg-paper',\n isSticky && 'shadow',\n )}\n >\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 editor={editor} size=\"sm\" />\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 {CustomPage} from '@common/admin/custom-pages/custom-page';\nimport {CreateCustomPagePayload} from '@common/admin/custom-pages/requests/use-create-custom-page';\n\ninterface Response extends BackendResponse {\n page: CustomPage;\n}\n\nexport function useCreateLinkPage() {\n return useMutation({\n mutationFn: (payload: CreateCustomPagePayload) => createPage(payload),\n onError: err => showHttpErrorToast(err),\n onSuccess: async () => {\n await queryClient.invalidateQueries({queryKey: ['link-page']});\n toast(message('Page created'));\n },\n });\n}\n\nfunction createPage(payload: CreateCustomPagePayload): Promise<Response> {\n return apiClient.post('link-page', 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 {CreateCustomPagePayload} from '@common/admin/custom-pages/requests/use-create-custom-page';\nimport {FullPageLoader} from '@common/ui/progress/full-page-loader';\nimport {useCreateLinkPage} from '@app/dashboard/link-pages/requests/use-create-link-page';\n\nconst ArticleBodyEditor = React.lazy(\n () => import('@common/article-editor/article-body-editor'),\n);\n\nexport function CreateLinkPage() {\n const navigate = useNavigate();\n const createPage = useCreateLinkPage();\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 allowSlugEditing={false}\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 {useQuery} from '@tanstack/react-query';\nimport {useParams} from 'react-router-dom';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {CustomPage} from '@common/admin/custom-pages/custom-page';\n\nexport interface FetchCustomPageResponse extends BackendResponse {\n page: CustomPage;\n}\n\nexport function useLinkPage(pageId?: number | string) {\n const params = useParams();\n if (!pageId) {\n pageId = params.pageId;\n }\n return useQuery({\n queryKey: ['link-page', `${pageId}`],\n queryFn: () => fetchLinkPage(pageId!),\n });\n}\n\nfunction fetchLinkPage(\n slugOrId: number | string,\n): Promise<FetchCustomPageResponse> {\n return apiClient.get(`link-page/${slugOrId}`).then(response => response.data);\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 {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';\nimport {CustomPage} from '@common/admin/custom-pages/custom-page';\n\ninterface Response extends BackendResponse {\n page: CustomPage;\n}\n\nexport function useUpdateLinkPage() {\n const {pageId} = useParams();\n return useMutation({\n mutationFn: (payload: CreateCustomPagePayload) =>\n updatePage(pageId!, payload),\n onError: err => showHttpErrorToast(err),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('link-page'),\n });\n toast(message('Page updated'));\n },\n });\n}\n\nfunction updatePage(\n pageId: number | string,\n payload: CreateCustomPagePayload,\n): Promise<Response> {\n return apiClient.put(`link-page/${pageId}`, 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 {CustomPage} from '@common/admin/custom-pages/custom-page';\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 {CreateCustomPagePayload} from '@common/admin/custom-pages/requests/use-create-custom-page';\nimport {FullPageLoader} from '@common/ui/progress/full-page-loader';\nimport {useLinkPage} from '@app/dashboard/link-pages/requests/use-link-page';\nimport {useUpdateLinkPage} from '@app/dashboard/link-pages/requests/use-update-link-page';\n\nconst ArticleBodyEditor = React.lazy(\n () => import('@common/article-editor/article-body-editor'),\n);\n\nexport function EditLinkPage() {\n const query = useLinkPage();\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 updatePage = useUpdateLinkPage();\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 updatePage.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={updatePage.isPending}\n onSave={handleSave}\n allowSlugEditing={false}\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 {Navigate, RouteObject, useRoutes} from 'react-router-dom';\nimport React from 'react';\nimport {AuthRoute} from '@common/auth/guards/auth-route';\nimport {NotFoundPage} from '@common/ui/not-found-page/not-found-page';\nimport {BelinkDashboardLayout} from './layout/belink-dasbboard-layout';\nimport {AllClicksReportPage} from './all-clicks-report-page';\nimport {LinksDatablePage} from './links/links-datatable-page/links-datatable-page';\nimport {LinkGroupsLinksDatatablePage} from './link-groups/link-group-links-datatable-page/link-group-links-datatable-page';\nimport {LinkGroupsDatatablePage} from './link-groups/link-groups-datatable-page/link-groups-datatable-page';\nimport {LinkGroupClicksReportPage} from '@app/dashboard/link-groups/link-group-clicks-report-page';\nimport {LinkClicksReportPage} from '@app/dashboard/links/link-clicks-report-page';\nimport {DomainsDatatablePage} from '@app/dashboard/custom-domains/domains-datatable-page';\nimport {TrackingPixelsDatablePage} from '@app/dashboard/tracking-pixels/tracking-pixels-datatable-page';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {LinkPagesDatatablePage} from '@app/dashboard/link-pages/link-pages-datatable-page';\nimport {LinkOverlaysDatatablePage} from '@app/dashboard/link-overlays/link-overlays-datatable-page';\nimport {CreateLinkOverlayPage} from '@app/dashboard/link-overlays/crupdate/create-link-overlay-page';\nimport {UpdateLinkOverlayPage} from '@app/dashboard/link-overlays/crupdate/update-link-overlay-page';\nimport {BioLinksDatatablePage} from '@app/dashboard/biolink/biolinks-datatable-page/biolinks-datatable-page';\nimport {BiolinkClicksReportPage} from '@app/dashboard/biolink/biolink-clicks-report-page';\nimport {BiolinkEditorPage} from '@app/dashboard/biolink/biolink-editor/biolink-editor-page';\nimport {CreateLinkPage} from '@app/dashboard/link-pages/create-link-page';\nimport {EditLinkPage} from '@app/dashboard/link-pages/edit-link-page';\n\nexport const SharedDashboardRoutes = ({forCurrentUser = false}) => {\n return [\n // links\n {\n path: 'links',\n element: <LinksDatablePage forCurrentUser={forCurrentUser} />,\n },\n {\n path: 'links/:linkId',\n element: <LinkClicksReportPage />,\n },\n\n // biolinks\n {\n path: 'biolinks',\n element: <BioLinksDatatablePage forCurrentUser={forCurrentUser} />,\n },\n {\n path: 'biolinks/:biolinkId',\n element: <BiolinkClicksReportPage />,\n },\n {\n path: 'biolinks/:biolinkId/edit',\n element: <Navigate to=\"content\" replace />,\n },\n {\n path: 'biolinks/:biolinkId/edit/:tabName',\n element: <BiolinkEditorPage />,\n },\n\n // groups\n {\n path: 'link-groups',\n element: <LinkGroupsDatatablePage forCurrentUser={forCurrentUser} />,\n },\n {\n path: 'link-groups/:groupId',\n element: <LinkGroupClicksReportPage />,\n },\n {\n path: 'link-groups/:groupId/links',\n element: <LinkGroupsLinksDatatablePage />,\n },\n {\n path: 'link-groups/:groupId/links/:linkId',\n element: <LinkClicksReportPage />,\n },\n\n // domains\n {\n path: 'custom-domains',\n element: <DomainsDatatablePage forCurrentUser={forCurrentUser} />,\n },\n\n // tracking pixels\n {\n path: 'pixels',\n element: <TrackingPixelsDatablePage forCurrentUser={forCurrentUser} />,\n },\n\n // overlays\n {\n path: 'link-overlays',\n element: <LinkOverlaysDatatablePage forCurrentUser={forCurrentUser} />,\n },\n {\n path: 'link-overlays/new',\n element: <CreateLinkOverlayPage />,\n },\n {\n path: 'link-overlays/:overlayId/edit',\n element: <UpdateLinkOverlayPage />,\n },\n ];\n};\n\nexport default function DashboardRoutes() {\n const {workspaceId} = useActiveWorkspaceId();\n const DashboardRouteConfig: RouteObject[] = [\n {\n path: '/',\n element: (\n <AuthRoute>\n <BelinkDashboardLayout />\n </AuthRoute>\n ),\n children: [\n {index: true, element: <AllClicksReportPage />},\n\n // link pages\n {\n path: 'link-pages',\n element: <LinkPagesDatatablePage forCurrentUser={!workspaceId} />,\n },\n {\n path: 'link-pages/new',\n element: <CreateLinkPage />,\n },\n {\n path: 'link-pages/:pageId/edit',\n element: <EditLinkPage />,\n },\n\n ...SharedDashboardRoutes({forCurrentUser: !workspaceId}),\n ],\n },\n {path: '*', element: <NotFoundPage />},\n ];\n\n return useRoutes(DashboardRouteConfig);\n}\n"],"names":["FilterControlType","FilterOperator","_a","_b","now","isSameMonth","getSizeClassName","isHourSegment","encodedFilters","decodedFilters","endpoint","params","response","Select","lazy","LoadingSkeleton","value","FilterList","names","query","deleteSelectedRows","exportCsv","target","useLayoutEffect","m","options","createWorkspace","Fragment","removeMember","MenuItem","updateWorkspace","workspaceId","deleteWorkspace","Footer","locale","formattedData","InfoTrigger","message","RemoveButton","createLink","updateLink","RouterLink","columns","filters","Actions","moveLinks","linkSvg","useNavigate","createLinkGroup","seedInitialDataFromPaginatedList","link","deleteDomain","ConnectDomainStep","authorize","queryClient","connectDomain","createPixel","updatePage","createOverlay","SaveButton","PageContent","updateItem","InfoSection","detachItem","sortContent","ActionRow","WidgetType","Dialog","Tab","FontSelector","saveAppearance","CommonFontSelector","Option","ArticleBodyEditor","createPage"],"mappings":"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"}