diff --git a/.github/workflows/alerts-ee.yaml b/.github/workflows/alerts-ee.yaml index 1df316c3e..ad7201b2f 100644 --- a/.github/workflows/alerts-ee.yaml +++ b/.github/workflows/alerts-ee.yaml @@ -130,7 +130,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,alerts,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,alerts,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks --kube-version=$k_version | kubectl apply -f - diff --git a/.github/workflows/alerts.yaml b/.github/workflows/alerts.yaml index c5d268648..7fb6e6742 100644 --- a/.github/workflows/alerts.yaml +++ b/.github/workflows/alerts.yaml @@ -130,7 +130,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,alerts,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,alerts,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks | kubectl apply -n app -f - diff --git a/.github/workflows/api-ee.yaml b/.github/workflows/api-ee.yaml index ad2250e24..f93b0d873 100644 --- a/.github/workflows/api-ee.yaml +++ b/.github/workflows/api-ee.yaml @@ -127,7 +127,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,chalice,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,chalice,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks --kube-version=$k_version | kubectl apply -f - diff --git a/.github/workflows/api.yaml b/.github/workflows/api.yaml index 4dbbfadb0..537510ce4 100644 --- a/.github/workflows/api.yaml +++ b/.github/workflows/api.yaml @@ -120,7 +120,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,chalice,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,chalice,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks | kubectl apply -n app -f - diff --git a/.github/workflows/assist-ee.yaml b/.github/workflows/assist-ee.yaml index 808646328..c10b22939 100644 --- a/.github/workflows/assist-ee.yaml +++ b/.github/workflows/assist-ee.yaml @@ -113,7 +113,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,assist,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,assist,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks --kube-version=$k_version | kubectl apply -f - diff --git a/.github/workflows/assist-server-ee.yaml b/.github/workflows/assist-server-ee.yaml index 62f857f9d..39401f5d2 100644 --- a/.github/workflows/assist-server-ee.yaml +++ b/.github/workflows/assist-server-ee.yaml @@ -111,7 +111,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,assist-server,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,assist-server,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks --kube-version=$k_version | kubectl apply -f - diff --git a/.github/workflows/assist-stats.yaml b/.github/workflows/assist-stats.yaml index f76861237..5323d13da 100644 --- a/.github/workflows/assist-stats.yaml +++ b/.github/workflows/assist-stats.yaml @@ -130,7 +130,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,assist-stats,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,assist-stats,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks | kubectl apply -f - diff --git a/.github/workflows/assist.yaml b/.github/workflows/assist.yaml index 4c8a454b7..970ceb3c1 100644 --- a/.github/workflows/assist.yaml +++ b/.github/workflows/assist.yaml @@ -112,7 +112,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,assist,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,assist,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks --kube-version=$k_version | kubectl apply -f - diff --git a/.github/workflows/crons-ee.yaml b/.github/workflows/crons-ee.yaml index 56bf97b2c..7c46049c5 100644 --- a/.github/workflows/crons-ee.yaml +++ b/.github/workflows/crons-ee.yaml @@ -129,7 +129,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,utilities,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,utilities,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks --kube-version=$k_version | kubectl apply -f - diff --git a/.github/workflows/frontend-dev.yaml b/.github/workflows/frontend-dev.yaml index 548ed2537..446164ba6 100644 --- a/.github/workflows/frontend-dev.yaml +++ b/.github/workflows/frontend-dev.yaml @@ -76,7 +76,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,frontend,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,frontend,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks | kubectl apply -n app -f - diff --git a/.github/workflows/frontend.yaml b/.github/workflows/frontend.yaml index 1dc69c580..25e68c0c8 100644 --- a/.github/workflows/frontend.yaml +++ b/.github/workflows/frontend.yaml @@ -89,7 +89,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,frontend,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,frontend,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks | kubectl apply -n app -f - @@ -138,7 +138,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,frontend,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,frontend,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks | kubectl apply -n app -f - diff --git a/.github/workflows/sourcemaps-reader-ee.yaml b/.github/workflows/sourcemaps-reader-ee.yaml index 459762c69..0822f4b32 100644 --- a/.github/workflows/sourcemaps-reader-ee.yaml +++ b/.github/workflows/sourcemaps-reader-ee.yaml @@ -119,7 +119,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,sourcemapreader,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,sourcemapreader,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks | kubectl apply -n app -f - diff --git a/.github/workflows/sourcemaps-reader.yaml b/.github/workflows/sourcemaps-reader.yaml index a05dfaeb2..b6a8ea79b 100644 --- a/.github/workflows/sourcemaps-reader.yaml +++ b/.github/workflows/sourcemaps-reader.yaml @@ -118,7 +118,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,sourcemapreader,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,sourcemapreader,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks | kubectl apply -n app -f - diff --git a/.github/workflows/workers-ee.yaml b/.github/workflows/workers-ee.yaml index 5ed1039b2..5c8951f75 100644 --- a/.github/workflows/workers-ee.yaml +++ b/.github/workflows/workers-ee.yaml @@ -148,9 +148,7 @@ jobs: set -x echo > /tmp/image_override.yaml mkdir /tmp/helmcharts - mv openreplay/charts/ingress-nginx /tmp/helmcharts/ - mv openreplay/charts/quickwit /tmp/helmcharts/ - mv openreplay/charts/connector /tmp/helmcharts/ + mv openreplay/charts/{ingress-nginx,quickwit,connector,assist-api} /tmp/helmcharts/ ## Update images for image in $(cat /tmp/images_to_build.txt); do diff --git a/.github/workflows/workers.yaml b/.github/workflows/workers.yaml index ceb4e0f43..0e1c4c341 100644 --- a/.github/workflows/workers.yaml +++ b/.github/workflows/workers.yaml @@ -141,9 +141,7 @@ jobs: set -x echo > /tmp/image_override.yaml mkdir /tmp/helmcharts - mv openreplay/charts/ingress-nginx /tmp/helmcharts/ - mv openreplay/charts/quickwit /tmp/helmcharts/ - mv openreplay/charts/connector /tmp/helmcharts/ + mv openreplay/charts/{ingress-nginx,quickwit,connector,assist-api} /tmp/helmcharts/ ## Update images for image in $(cat /tmp/images_to_build.txt); do diff --git a/api/chalicelib/core/events/events_pg.py b/api/chalicelib/core/events/events_pg.py index 06b524f51..d8bba29d5 100644 --- a/api/chalicelib/core/events/events_pg.py +++ b/api/chalicelib/core/events/events_pg.py @@ -131,7 +131,7 @@ def supported_types(): query=autocomplete.__generic_query( typename=schemas.EventType.GRAPHQL)), schemas.EventType.STATE_ACTION: SupportedFilter( - get=autocomplete.__generic_autocomplete(schemas.EventType.STATEACTION), + get=autocomplete.__generic_autocomplete(schemas.EventType.STATE_ACTION), query=autocomplete.__generic_query( typename=schemas.EventType.STATE_ACTION)), schemas.EventType.TAG: SupportedFilter(get=_search_tags, query=None), diff --git a/api/routers/core.py b/api/routers/core.py index 260df30f2..a79cb9245 100644 --- a/api/routers/core.py +++ b/api/routers/core.py @@ -4,8 +4,9 @@ from decouple import config from fastapi import Depends, Body, BackgroundTasks import schemas -from chalicelib.core import events, projects, metadata, reset_password, log_tools, \ +from chalicelib.core import projects, metadata, reset_password, log_tools, \ announcements, weekly_report, assist, mobile, tenants, boarding, notifications, webhook, users, saved_search, tags +from chalicelib.core.events import events from chalicelib.core.issues import issues from chalicelib.core.sourcemaps import sourcemaps from chalicelib.core.metrics import custom_metrics diff --git a/backend/pkg/db/clickhouse/connector.go b/backend/pkg/db/clickhouse/connector.go index 8f723712a..de39bb2cc 100644 --- a/backend/pkg/db/clickhouse/connector.go +++ b/backend/pkg/db/clickhouse/connector.go @@ -107,7 +107,7 @@ func (c *connectorImpl) newBatch(name, query string) error { } var batches = map[string]string{ - "sessions": "INSERT INTO experimental.sessions (session_id, project_id, user_id, user_uuid, user_os, user_os_version, user_device, user_device_type, user_country, user_state, user_city, datetime, duration, pages_count, events_count, errors_count, issue_score, referrer, issue_types, tracker_version, user_browser, user_browser_version, metadata_1, metadata_2, metadata_3, metadata_4, metadata_5, metadata_6, metadata_7, metadata_8, metadata_9, metadata_10, platform, timezone, utm_source, utm_medium, utm_campaign) VALUES (?, ?, SUBSTR(?, 1, 8000), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, SUBSTR(?, 1, 8000), ?, ?, ?, ?, SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), ?, ?, ?, ?, ?)", + "sessions": "INSERT INTO experimental.sessions (session_id, project_id, user_id, user_uuid, user_os, user_os_version, user_device, user_device_type, user_country, user_state, user_city, datetime, duration, pages_count, events_count, errors_count, issue_score, referrer, issue_types, tracker_version, user_browser, user_browser_version, metadata_1, metadata_2, metadata_3, metadata_4, metadata_5, metadata_6, metadata_7, metadata_8, metadata_9, metadata_10, platform, timezone, utm_source, utm_medium, utm_campaign, screen_width, screen_height) VALUES (?, ?, SUBSTR(?, 1, 8000), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, SUBSTR(?, 1, 8000), ?, ?, ?, ?, SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), ?, ?, ?, ?, ?, ?, ?)", "autocompletes": "INSERT INTO experimental.autocomplete (project_id, type, value) VALUES (?, ?, SUBSTR(?, 1, 8000))", "pages": `INSERT INTO product_analytics.events (session_id, project_id, event_id, "$event_name", created_at, "$time", distinct_id, "$auto_captured", "$device", "$os_version", "$os", "$browser", "$referrer", "$country", "$state", "$city", "$current_url", "$properties") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, "clicks": `INSERT INTO product_analytics.events (session_id, project_id, event_id, "$event_name", created_at, "$time", distinct_id, "$auto_captured", "$device", "$os_version", "$os", "$browser", "$referrer", "$country", "$state", "$city", "$current_url", "$properties") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, @@ -221,6 +221,8 @@ func (c *connectorImpl) InsertWebSession(session *sessions.Session) error { session.UtmSource, session.UtmMedium, session.UtmCampaign, + session.ScreenWidth, + session.ScreenHeight, ); err != nil { c.checkError("sessions", err) return fmt.Errorf("can't append to sessions batch: %s", err) diff --git a/ee/scripts/schema/db/init_dbs/clickhouse/create/init_schema.sql b/ee/scripts/schema/db/init_dbs/clickhouse/create/init_schema.sql index 7d1a9559a..71bd6ad55 100644 --- a/ee/scripts/schema/db/init_dbs/clickhouse/create/init_schema.sql +++ b/ee/scripts/schema/db/init_dbs/clickhouse/create/init_schema.sql @@ -791,7 +791,8 @@ CREATE TABLE IF NOT EXISTS product_analytics.property_values_samples ENGINE = ReplacingMergeTree(_timestamp) ORDER BY (project_id, property_name, is_event_property); -- Incremental materialized view to get random examples of property values using $properties & properties -CREATE MATERIALIZED VIEW IF NOT EXISTS product_analytics.property_values_sampler_mvREFRESHEVERY30HOURTOproduct_analytics.property_values_samples AS +CREATE MATERIALIZED VIEW IF NOT EXISTS product_analytics.property_values_sampler_mv + REFRESH EVERY 30 HOUR TO product_analytics.property_values_samples AS SELECT project_id, property_name, TRUE AS is_event_property, diff --git a/ee/scripts/schema/db/init_dbs/postgresql/1.23.0/1.23.0.sql b/ee/scripts/schema/db/init_dbs/postgresql/1.23.0/1.23.0.sql index 718a6e693..9c878f57a 100644 --- a/ee/scripts/schema/db/init_dbs/postgresql/1.23.0/1.23.0.sql +++ b/ee/scripts/schema/db/init_dbs/postgresql/1.23.0/1.23.0.sql @@ -23,6 +23,8 @@ DROP SCHEMA IF EXISTS or_cache CASCADE; ALTER TABLE public.tenants ALTER COLUMN scope_state SET DEFAULT 2; +ALTER TYPE issue_type ADD VALUE IF NOT EXISTS 'incident'; + COMMIT; \elif :is_next diff --git a/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql b/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql index 4701bc53f..caf4e7467 100644 --- a/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql +++ b/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql @@ -352,7 +352,8 @@ CREATE TYPE issue_type AS ENUM ( 'custom', 'js_exception', 'mouse_thrashing', - 'app_crash' + 'app_crash', + 'incident' ); CREATE TABLE public.issues diff --git a/frontend/app/components/Kai/KaiChat.tsx b/frontend/app/components/Kai/KaiChat.tsx index 4d3d13586..dfc504ef7 100644 --- a/frontend/app/components/Kai/KaiChat.tsx +++ b/frontend/app/components/Kai/KaiChat.tsx @@ -38,6 +38,7 @@ function KaiChat() { showModal( { setTitle(title); setThreadId(threadId); @@ -118,7 +119,9 @@ function KaiChat() { style={{ maxWidth: PANEL_SIZES.maxWidth }} >
-
+
OpenReplay AI can make mistakes. Verify its outputs.
diff --git a/frontend/app/components/Kai/components/ChatHeader.tsx b/frontend/app/components/Kai/components/ChatHeader.tsx index 29aaa4365..adcf7e0de 100644 --- a/frontend/app/components/Kai/components/ChatHeader.tsx +++ b/frontend/app/components/Kai/components/ChatHeader.tsx @@ -49,7 +49,7 @@ function ChatHeader({
{goBack ? (
onCreate()} className="font-semibold w-fit cursor-pointer hover:text-main flex items-center gap-2" > diff --git a/frontend/app/components/Kai/components/ChatInput.tsx b/frontend/app/components/Kai/components/ChatInput.tsx index b860c4c32..9e6e0f1c2 100644 --- a/frontend/app/components/Kai/components/ChatInput.tsx +++ b/frontend/app/components/Kai/components/ChatInput.tsx @@ -101,7 +101,7 @@ function ChatInput({ + ) : null} + bodyRef.current?.innerHTML} + content={text} + isIcon + format={'text/html'} + />
) : (
@@ -234,14 +234,14 @@ function ChatMsg({ tooltip="Like this answer" onClick={() => onFeedback('like', messageId)} > - + onFeedback('dislike', messageId)} > - + {supports_visualization ? ( - + ) : null} - +
)} diff --git a/frontend/app/components/Kai/components/ChatsModal.tsx b/frontend/app/components/Kai/components/ChatsModal.tsx index 8fb279aea..4165328fb 100644 --- a/frontend/app/components/Kai/components/ChatsModal.tsx +++ b/frontend/app/components/Kai/components/ChatsModal.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { splitByDate } from '../utils'; import { useQuery } from '@tanstack/react-query'; -import { MessagesSquare, Trash } from 'lucide-react'; +import { MessagesSquare, Trash, X } from 'lucide-react'; import { kaiService } from 'App/services'; import { toast } from 'react-toastify'; import { useTranslation } from 'react-i18next'; @@ -11,9 +11,11 @@ import { observer } from 'mobx-react-lite'; function ChatsModal({ onSelect, projectId, + onHide, }: { onSelect: (threadId: string, title: string) => void; projectId: string; + onHide: () => void; }) { const { t } = useTranslation(); const { usage } = kaiStore; @@ -45,12 +47,21 @@ function ChatsModal({ }; return (
{t('Previous Chats')} +
+
+ +
{usage.percent > 80 ? (
@@ -94,8 +105,8 @@ function ChatCollection({ date: string; }) { return ( -
-
{date}
+
+
{date}
); diff --git a/frontend/app/components/Kai/components/Ideas.tsx b/frontend/app/components/Kai/components/Ideas.tsx index bade87acb..11c3d5418 100644 --- a/frontend/app/components/Kai/components/Ideas.tsx +++ b/frontend/app/components/Kai/components/Ideas.tsx @@ -8,10 +8,12 @@ function Ideas({ onClick, projectId, threadId = null, + inChat, }: { onClick: (query: string) => void; projectId: string; threadId?: string | null; + inChat?: boolean; }) { const { t } = useTranslation(); const { data: suggestedPromptIdeas = [], isPending } = useQuery({ @@ -35,7 +37,7 @@ function Ideas({ return (
- Suggested Ideas: + {inChat ? 'Suggested Follow-up Questions' : 'Suggested Ideas:'}
{isPending ? (
diff --git a/frontend/app/components/ui/CopyButton/CopyButton.tsx b/frontend/app/components/ui/CopyButton/CopyButton.tsx index f82375914..9628eac8d 100644 --- a/frontend/app/components/ui/CopyButton/CopyButton.tsx +++ b/frontend/app/components/ui/CopyButton/CopyButton.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import copy from 'copy-to-clipboard'; import { Button, Tooltip } from 'antd'; -import { ClipboardCopy, ClipboardCheck } from 'lucide-react'; +import { Copy, Check } from 'lucide-react'; interface Props { content: string; @@ -30,10 +30,10 @@ function CopyButton({ setTimeout(() => { setCopied(false); }, 1000); - } + }; const copyHandler = () => { setCopied(true); - const contentIsGetter = !!getHtml + const contentIsGetter = !!getHtml; const textContent = contentIsGetter ? getHtml() : content; const isHttps = window.location.protocol === 'https:'; if (!isHttps) { @@ -43,15 +43,16 @@ function CopyButton({ } const blob = new Blob([textContent], { type: format }); const cbItem = new ClipboardItem({ - [format]: blob - }) - navigator.clipboard.write([cbItem]) - .catch(e => { + [format]: blob, + }); + navigator.clipboard + .write([cbItem]) + .catch((e) => { copy(textContent); }) .finally(() => { - reset() - }) + reset(); + }); }; if (isIcon) { @@ -62,7 +63,11 @@ function CopyButton({ onClick={copyHandler} size={size} icon={ - copied ? : + copied ? ( + + ) : ( + + ) } /> diff --git a/frontend/app/components/ui/Icons/export_pdf.tsx b/frontend/app/components/ui/Icons/export_pdf.tsx new file mode 100644 index 000000000..c267c5d8d --- /dev/null +++ b/frontend/app/components/ui/Icons/export_pdf.tsx @@ -0,0 +1,18 @@ +/* Auto-generated, do not edit */ +import React from 'react'; + +interface Props { + size?: number | string; + width?: number | string; + height?: number | string; + fill?: string; +} + +function Export_pdf(props: Props) { + const { size = 14, width = size, height = size, fill = '' } = props; + return ( + + ); +} + +export default Export_pdf; diff --git a/frontend/app/components/ui/Icons/index.ts b/frontend/app/components/ui/Icons/index.ts index ff67c7ffe..225deb1b0 100644 --- a/frontend/app/components/ui/Icons/index.ts +++ b/frontend/app/components/ui/Icons/index.ts @@ -211,6 +211,7 @@ export { default as Exclamation_circle_fill } from './exclamation_circle_fill'; export { default as Exclamation_circle } from './exclamation_circle'; export { default as Exclamation_triangle } from './exclamation_triangle'; export { default as Explosion } from './explosion'; +export { default as Export_pdf } from './export_pdf'; export { default as External_link_alt } from './external_link_alt'; export { default as Eye_slash_fill } from './eye_slash_fill'; export { default as Eye_slash } from './eye_slash'; diff --git a/frontend/app/components/ui/SVG.tsx b/frontend/app/components/ui/SVG.tsx index a7ee85dca..4cec3d10f 100644 --- a/frontend/app/components/ui/SVG.tsx +++ b/frontend/app/components/ui/SVG.tsx @@ -213,6 +213,7 @@ import { Exclamation_circle, Exclamation_triangle, Explosion, + Export_pdf, External_link_alt, Eye_slash_fill, Eye_slash, @@ -489,7 +490,7 @@ import { Zoom_in } from './Icons' -export type IconNames = 'activity' | 'analytics' | 'anchor' | 'arrow-bar-left' | 'arrow-clockwise' | 'arrow-counterclockwise' | 'arrow-down-short' | 'arrow-down-up' | 'arrow-down' | 'arrow-repeat' | 'arrow-right-short' | 'arrow-up-short' | 'arrow-up' | 'avatar/icn_avatar1' | 'avatar/icn_avatar10' | 'avatar/icn_avatar11' | 'avatar/icn_avatar12' | 'avatar/icn_avatar13' | 'avatar/icn_avatar14' | 'avatar/icn_avatar15' | 'avatar/icn_avatar16' | 'avatar/icn_avatar17' | 'avatar/icn_avatar18' | 'avatar/icn_avatar19' | 'avatar/icn_avatar2' | 'avatar/icn_avatar20' | 'avatar/icn_avatar21' | 'avatar/icn_avatar22' | 'avatar/icn_avatar23' | 'avatar/icn_avatar3' | 'avatar/icn_avatar4' | 'avatar/icn_avatar5' | 'avatar/icn_avatar6' | 'avatar/icn_avatar7' | 'avatar/icn_avatar8' | 'avatar/icn_avatar9' | 'ban' | 'bar-chart-line' | 'bar-pencil' | 'battery-charging' | 'battery' | 'bell-plus' | 'bell-slash' | 'bell' | 'binoculars' | 'book' | 'bookmark' | 'broadcast' | 'browser/browser' | 'browser/chrome' | 'browser/edge' | 'browser/electron' | 'browser/facebook' | 'browser/firefox' | 'browser/ie' | 'browser/opera' | 'browser/safari' | 'buildings' | 'bullhorn' | 'calendar' | 'call' | 'camera-video-off' | 'camera-video' | 'camera' | 'card-list' | 'card-text' | 'caret-down-fill' | 'caret-right-fill' | 'chat-dots' | 'chat-left-text' | 'chat-square-quote' | 'check-circle-fill' | 'check-circle' | 'check' | 'chevron-down' | 'chevron-left' | 'chevron-right' | 'chevron-up' | 'circle-fill' | 'circle' | 'click-hesitation' | 'click-rage' | 'clipboard-check' | 'clock-history' | 'clock' | 'close' | 'code' | 'cog' | 'cogs' | 'collection-play' | 'collection' | 'color/apple' | 'color/browser/chrome' | 'color/browser/edge' | 'color/browser/facebook' | 'color/browser/firefox' | 'color/browser/google' | 'color/browser/opera' | 'color/browser/safari' | 'color/browser/unknown' | 'color/browser/whale' | 'color/chrome' | 'color/country/de' | 'color/country/fr' | 'color/country/gb' | 'color/country/in' | 'color/country/us' | 'color/de' | 'color/device/desktop' | 'color/device/mobile' | 'color/device/tablet' | 'color/device/unkown' | 'color/edge' | 'color/fedora' | 'color/firefox' | 'color/fr' | 'color/gb' | 'color/in' | 'color/issues/bad_request' | 'color/issues/click_rage' | 'color/issues/cpu' | 'color/issues/crash' | 'color/issues/custom' | 'color/issues/dead_click' | 'color/issues/errors' | 'color/issues/excessive_scrolling' | 'color/issues/js_exception' | 'color/issues/memory' | 'color/issues/missing_resource' | 'color/issues/mouse_thrashing' | 'color/issues/slow_page_load' | 'color/microsoft' | 'color/opera' | 'color/os/android' | 'color/os/apple' | 'color/os/elementary' | 'color/os/fedora' | 'color/os/ios' | 'color/os/linux' | 'color/os/macos' | 'color/os/microsoft' | 'color/os/ubuntu' | 'color/os/unkown' | 'color/safari' | 'color/ubuntu' | 'color/us' | 'columns-gap' | 'console/error' | 'console/exception' | 'console/info' | 'console/warning' | 'console' | 'controller' | 'cookies' | 'copy' | 'credit-card-2-back' | 'cross' | 'cubes' | 'cursor-trash' | 'cypress' | 'dash' | 'dashboard-icn' | 'dashboards/circle-alert' | 'dashboards/cohort-chart' | 'dashboards/heatmap-2' | 'dashboards/user-journey' | 'db-icons/icn-card-clickMap' | 'db-icons/icn-card-errors' | 'db-icons/icn-card-funnel' | 'db-icons/icn-card-funnels' | 'db-icons/icn-card-insights' | 'db-icons/icn-card-library' | 'db-icons/icn-card-mapchart' | 'db-icons/icn-card-pathAnalysis' | 'db-icons/icn-card-performance' | 'db-icons/icn-card-resources' | 'db-icons/icn-card-table' | 'db-icons/icn-card-timeseries' | 'db-icons/icn-card-webVitals' | 'desktop' | 'device' | 'diagram-3' | 'dizzy' | 'door-closed' | 'download' | 'drag' | 'edit' | 'ellipsis-v' | 'emoji-dizzy' | 'enter' | 'envelope-check' | 'envelope-paper' | 'envelope-x' | 'envelope' | 'errors-icon' | 'event/click' | 'event/click_hesitation' | 'event/clickrage' | 'event/code' | 'event/i-cursor' | 'event/input' | 'event/input_hesitation' | 'event/link' | 'event/location' | 'event/mouse_thrashing' | 'event/resize' | 'event/view' | 'exclamation-circle-fill' | 'exclamation-circle' | 'exclamation-triangle' | 'explosion' | 'external-link-alt' | 'eye-slash-fill' | 'eye-slash' | 'eye' | 'fetch-request' | 'fetch' | 'fflag-multi' | 'fflag-single' | 'file-bar-graph' | 'file-code' | 'file-medical-alt' | 'file-pdf' | 'file' | 'files' | 'filetype-js' | 'filetype-pdf' | 'filter' | 'filters/arrow-return-right' | 'filters/browser' | 'filters/chevrons-up-down' | 'filters/click' | 'filters/clickrage' | 'filters/code' | 'filters/console' | 'filters/country' | 'filters/cpu-load' | 'filters/custom' | 'filters/device' | 'filters/dom-complete' | 'filters/duration' | 'filters/error' | 'filters/fetch-failed' | 'filters/fetch' | 'filters/file-code' | 'filters/graphql' | 'filters/i-cursor' | 'filters/input' | 'filters/lcpt' | 'filters/link' | 'filters/location' | 'filters/memory-load' | 'filters/metadata' | 'filters/os' | 'filters/perfromance-network-request' | 'filters/platform' | 'filters/referrer' | 'filters/resize' | 'filters/rev-id' | 'filters/screen' | 'filters/state-action' | 'filters/tag-element' | 'filters/ttfb' | 'filters/user-alt' | 'filters/userid' | 'filters/view' | 'flag-na' | 'folder-plus' | 'folder2' | 'fullscreen' | 'funnel/cpu-fill' | 'funnel/cpu' | 'funnel/dizzy' | 'funnel/emoji-angry-fill' | 'funnel/emoji-angry' | 'funnel/emoji-dizzy-fill' | 'funnel/exclamation-circle-fill' | 'funnel/exclamation-circle' | 'funnel/file-earmark-break-fill' | 'funnel/file-earmark-break' | 'funnel/file-earmark-minus-fill' | 'funnel/file-earmark-minus' | 'funnel/file-medical-alt' | 'funnel/file-x' | 'funnel/hdd-fill' | 'funnel/hourglass-top' | 'funnel/image-fill' | 'funnel/image' | 'funnel/message-circle-warning' | 'funnel/microchip' | 'funnel/mouse' | 'funnel/patch-exclamation-fill' | 'funnel/sd-card' | 'funnel-fill' | 'funnel' | 'gear' | 'github' | 'graph-up' | 'grid-3x3' | 'grid-check' | 'grid' | 'hash' | 'headset' | 'history' | 'ic-errors' | 'ic-network' | 'ic-rage' | 'ic-resources' | 'icn_fetch-request' | 'icn_referrer' | 'icn_url' | 'id-card' | 'image' | 'info-circle-fill' | 'info-circle' | 'info-square' | 'info' | 'input-hesitation' | 'inspect' | 'integrations/assist' | 'integrations/bugsnag-text' | 'integrations/bugsnag' | 'integrations/cloudwatch-text' | 'integrations/cloudwatch' | 'integrations/datadog' | 'integrations/dynatrace' | 'integrations/elasticsearch-text' | 'integrations/elasticsearch' | 'integrations/github' | 'integrations/graphql' | 'integrations/jira-text' | 'integrations/jira' | 'integrations/mobx' | 'integrations/newrelic-text' | 'integrations/newrelic' | 'integrations/ngrx' | 'integrations/openreplay-text' | 'integrations/openreplay' | 'integrations/redux' | 'integrations/rollbar-text' | 'integrations/rollbar' | 'integrations/segment' | 'integrations/sentry-text' | 'integrations/sentry' | 'integrations/slack-bw' | 'integrations/slack' | 'integrations/stackdriver' | 'integrations/sumologic-text' | 'integrations/sumologic' | 'integrations/teams-white' | 'integrations/teams' | 'integrations/vuejs' | 'integrations/zustand' | 'journal-code' | 'kai' | 'kai_colored' | 'key' | 'keyboard' | 'layers-half' | 'lightbulb-on' | 'lightbulb' | 'link-45deg' | 'list-alt' | 'list-ul' | 'list' | 'low-disc-space' | 'magic' | 'map-marker-alt' | 'memory-ios' | 'memory' | 'metadata-more' | 'mic-mute' | 'mic' | 'minus' | 'mobile' | 'mouse-alt' | 'mouse-pointer-click' | 'network' | 'next1' | 'no-dashboard' | 'no-metrics-chart' | 'no-metrics' | 'no-recordings' | 'orIcn' | 'orSpot' | 'orspotOutline' | 'os/android' | 'os/chrome_os' | 'os/fedora' | 'os/ios' | 'os/linux' | 'os/mac_os_x' | 'os/other' | 'os/ubuntu' | 'os/windows' | 'os' | 'pause-circle-fill' | 'pause-fill' | 'pause' | 'pdf-download' | 'pencil-stop' | 'pencil' | 'people' | 'percent' | 'performance-icon' | 'person-border' | 'person-fill' | 'person' | 'pie-chart-fill' | 'pin-fill' | 'play-circle-bold' | 'play-circle-light' | 'play-circle' | 'play-fill-new' | 'play-fill' | 'play-hover' | 'play' | 'plug' | 'plus-circle' | 'plus' | 'prev1' | 'pulse' | 'puppeteer' | 'puzzle-piece' | 'puzzle' | 'pwright' | 'question-circle' | 'question-lg' | 'quotes' | 'record-circle-fill' | 'record-circle' | 'record2' | 'redo' | 'redux' | 'referrer' | 'remote-control' | 'resources-icon' | 'safe' | 'sandglass' | 'search' | 'server' | 'share-alt' | 'shield-lock' | 'side_menu_closed' | 'side_menu_open' | 'signpost-split' | 'signup' | 'slack' | 'slash-circle' | 'sleep' | 'sliders' | 'social/slack' | 'social/trello' | 'sparkles' | 'speedometer2' | 'spinner' | 'square-mouse-pointer' | 'star' | 'step-forward' | 'stickies' | 'stop-record-circle' | 'stopwatch' | 'store' | 'sync-alt' | 'table' | 'tags' | 'terminal' | 'thermometer-sun' | 'toggles' | 'tools' | 'trash' | 'turtle' | 'user-alt' | 'user-circle' | 'user-friends' | 'user-journey' | 'user-switch' | 'users' | 'vendors/graphql' | 'web-vitals' | 'wifi' | 'window-x' | 'window' | 'zoom-in'; +export type IconNames = 'activity' | 'analytics' | 'anchor' | 'arrow-bar-left' | 'arrow-clockwise' | 'arrow-counterclockwise' | 'arrow-down-short' | 'arrow-down-up' | 'arrow-down' | 'arrow-repeat' | 'arrow-right-short' | 'arrow-up-short' | 'arrow-up' | 'avatar/icn_avatar1' | 'avatar/icn_avatar10' | 'avatar/icn_avatar11' | 'avatar/icn_avatar12' | 'avatar/icn_avatar13' | 'avatar/icn_avatar14' | 'avatar/icn_avatar15' | 'avatar/icn_avatar16' | 'avatar/icn_avatar17' | 'avatar/icn_avatar18' | 'avatar/icn_avatar19' | 'avatar/icn_avatar2' | 'avatar/icn_avatar20' | 'avatar/icn_avatar21' | 'avatar/icn_avatar22' | 'avatar/icn_avatar23' | 'avatar/icn_avatar3' | 'avatar/icn_avatar4' | 'avatar/icn_avatar5' | 'avatar/icn_avatar6' | 'avatar/icn_avatar7' | 'avatar/icn_avatar8' | 'avatar/icn_avatar9' | 'ban' | 'bar-chart-line' | 'bar-pencil' | 'battery-charging' | 'battery' | 'bell-plus' | 'bell-slash' | 'bell' | 'binoculars' | 'book' | 'bookmark' | 'broadcast' | 'browser/browser' | 'browser/chrome' | 'browser/edge' | 'browser/electron' | 'browser/facebook' | 'browser/firefox' | 'browser/ie' | 'browser/opera' | 'browser/safari' | 'buildings' | 'bullhorn' | 'calendar' | 'call' | 'camera-video-off' | 'camera-video' | 'camera' | 'card-list' | 'card-text' | 'caret-down-fill' | 'caret-right-fill' | 'chat-dots' | 'chat-left-text' | 'chat-square-quote' | 'check-circle-fill' | 'check-circle' | 'check' | 'chevron-down' | 'chevron-left' | 'chevron-right' | 'chevron-up' | 'circle-fill' | 'circle' | 'click-hesitation' | 'click-rage' | 'clipboard-check' | 'clock-history' | 'clock' | 'close' | 'code' | 'cog' | 'cogs' | 'collection-play' | 'collection' | 'color/apple' | 'color/browser/chrome' | 'color/browser/edge' | 'color/browser/facebook' | 'color/browser/firefox' | 'color/browser/google' | 'color/browser/opera' | 'color/browser/safari' | 'color/browser/unknown' | 'color/browser/whale' | 'color/chrome' | 'color/country/de' | 'color/country/fr' | 'color/country/gb' | 'color/country/in' | 'color/country/us' | 'color/de' | 'color/device/desktop' | 'color/device/mobile' | 'color/device/tablet' | 'color/device/unkown' | 'color/edge' | 'color/fedora' | 'color/firefox' | 'color/fr' | 'color/gb' | 'color/in' | 'color/issues/bad_request' | 'color/issues/click_rage' | 'color/issues/cpu' | 'color/issues/crash' | 'color/issues/custom' | 'color/issues/dead_click' | 'color/issues/errors' | 'color/issues/excessive_scrolling' | 'color/issues/js_exception' | 'color/issues/memory' | 'color/issues/missing_resource' | 'color/issues/mouse_thrashing' | 'color/issues/slow_page_load' | 'color/microsoft' | 'color/opera' | 'color/os/android' | 'color/os/apple' | 'color/os/elementary' | 'color/os/fedora' | 'color/os/ios' | 'color/os/linux' | 'color/os/macos' | 'color/os/microsoft' | 'color/os/ubuntu' | 'color/os/unkown' | 'color/safari' | 'color/ubuntu' | 'color/us' | 'columns-gap' | 'console/error' | 'console/exception' | 'console/info' | 'console/warning' | 'console' | 'controller' | 'cookies' | 'copy' | 'credit-card-2-back' | 'cross' | 'cubes' | 'cursor-trash' | 'cypress' | 'dash' | 'dashboard-icn' | 'dashboards/circle-alert' | 'dashboards/cohort-chart' | 'dashboards/heatmap-2' | 'dashboards/user-journey' | 'db-icons/icn-card-clickMap' | 'db-icons/icn-card-errors' | 'db-icons/icn-card-funnel' | 'db-icons/icn-card-funnels' | 'db-icons/icn-card-insights' | 'db-icons/icn-card-library' | 'db-icons/icn-card-mapchart' | 'db-icons/icn-card-pathAnalysis' | 'db-icons/icn-card-performance' | 'db-icons/icn-card-resources' | 'db-icons/icn-card-table' | 'db-icons/icn-card-timeseries' | 'db-icons/icn-card-webVitals' | 'desktop' | 'device' | 'diagram-3' | 'dizzy' | 'door-closed' | 'download' | 'drag' | 'edit' | 'ellipsis-v' | 'emoji-dizzy' | 'enter' | 'envelope-check' | 'envelope-paper' | 'envelope-x' | 'envelope' | 'errors-icon' | 'event/click' | 'event/click_hesitation' | 'event/clickrage' | 'event/code' | 'event/i-cursor' | 'event/input' | 'event/input_hesitation' | 'event/link' | 'event/location' | 'event/mouse_thrashing' | 'event/resize' | 'event/view' | 'exclamation-circle-fill' | 'exclamation-circle' | 'exclamation-triangle' | 'explosion' | 'export-pdf' | 'external-link-alt' | 'eye-slash-fill' | 'eye-slash' | 'eye' | 'fetch-request' | 'fetch' | 'fflag-multi' | 'fflag-single' | 'file-bar-graph' | 'file-code' | 'file-medical-alt' | 'file-pdf' | 'file' | 'files' | 'filetype-js' | 'filetype-pdf' | 'filter' | 'filters/arrow-return-right' | 'filters/browser' | 'filters/chevrons-up-down' | 'filters/click' | 'filters/clickrage' | 'filters/code' | 'filters/console' | 'filters/country' | 'filters/cpu-load' | 'filters/custom' | 'filters/device' | 'filters/dom-complete' | 'filters/duration' | 'filters/error' | 'filters/fetch-failed' | 'filters/fetch' | 'filters/file-code' | 'filters/graphql' | 'filters/i-cursor' | 'filters/input' | 'filters/lcpt' | 'filters/link' | 'filters/location' | 'filters/memory-load' | 'filters/metadata' | 'filters/os' | 'filters/perfromance-network-request' | 'filters/platform' | 'filters/referrer' | 'filters/resize' | 'filters/rev-id' | 'filters/screen' | 'filters/state-action' | 'filters/tag-element' | 'filters/ttfb' | 'filters/user-alt' | 'filters/userid' | 'filters/view' | 'flag-na' | 'folder-plus' | 'folder2' | 'fullscreen' | 'funnel/cpu-fill' | 'funnel/cpu' | 'funnel/dizzy' | 'funnel/emoji-angry-fill' | 'funnel/emoji-angry' | 'funnel/emoji-dizzy-fill' | 'funnel/exclamation-circle-fill' | 'funnel/exclamation-circle' | 'funnel/file-earmark-break-fill' | 'funnel/file-earmark-break' | 'funnel/file-earmark-minus-fill' | 'funnel/file-earmark-minus' | 'funnel/file-medical-alt' | 'funnel/file-x' | 'funnel/hdd-fill' | 'funnel/hourglass-top' | 'funnel/image-fill' | 'funnel/image' | 'funnel/microchip' | 'funnel/mouse' | 'funnel/patch-exclamation-fill' | 'funnel/sd-card' | 'funnel-fill' | 'funnel' | 'gear' | 'github' | 'graph-up' | 'grid-3x3' | 'grid-check' | 'grid' | 'hash' | 'headset' | 'history' | 'ic-errors' | 'ic-network' | 'ic-rage' | 'ic-resources' | 'icn_fetch-request' | 'icn_referrer' | 'icn_url' | 'id-card' | 'image' | 'info-circle-fill' | 'info-circle' | 'info-square' | 'info' | 'input-hesitation' | 'inspect' | 'integrations/assist' | 'integrations/bugsnag-text' | 'integrations/bugsnag' | 'integrations/cloudwatch-text' | 'integrations/cloudwatch' | 'integrations/datadog' | 'integrations/dynatrace' | 'integrations/elasticsearch-text' | 'integrations/elasticsearch' | 'integrations/github' | 'integrations/graphql' | 'integrations/jira-text' | 'integrations/jira' | 'integrations/mobx' | 'integrations/newrelic-text' | 'integrations/newrelic' | 'integrations/ngrx' | 'integrations/openreplay-text' | 'integrations/openreplay' | 'integrations/redux' | 'integrations/rollbar-text' | 'integrations/rollbar' | 'integrations/segment' | 'integrations/sentry-text' | 'integrations/sentry' | 'integrations/slack-bw' | 'integrations/slack' | 'integrations/stackdriver' | 'integrations/sumologic-text' | 'integrations/sumologic' | 'integrations/teams-white' | 'integrations/teams' | 'integrations/vuejs' | 'integrations/zustand' | 'journal-code' | 'kai-mono' | 'kai' | 'kai_colored' | 'key' | 'keyboard' | 'layers-half' | 'lightbulb-on' | 'lightbulb' | 'link-45deg' | 'list-alt' | 'list-ul' | 'list' | 'low-disc-space' | 'magic' | 'map-marker-alt' | 'memory-ios' | 'memory' | 'metadata-more' | 'mic-mute' | 'mic' | 'minus' | 'mobile' | 'mouse-alt' | 'mouse-pointer-click' | 'network' | 'next1' | 'no-dashboard' | 'no-metrics-chart' | 'no-metrics' | 'no-recordings' | 'orIcn' | 'orSpot' | 'orspotOutline' | 'os/android' | 'os/chrome_os' | 'os/fedora' | 'os/ios' | 'os/linux' | 'os/mac_os_x' | 'os/other' | 'os/ubuntu' | 'os/windows' | 'os' | 'pause-circle-fill' | 'pause-fill' | 'pause' | 'pdf-download' | 'pencil-stop' | 'pencil' | 'people' | 'percent' | 'performance-icon' | 'person-border' | 'person-fill' | 'person' | 'pie-chart-fill' | 'pin-fill' | 'play-circle-bold' | 'play-circle-light' | 'play-circle' | 'play-fill-new' | 'play-fill' | 'play-hover' | 'play' | 'plug' | 'plus-circle' | 'plus' | 'prev1' | 'pulse' | 'puppeteer' | 'puzzle-piece' | 'puzzle' | 'pwright' | 'question-circle' | 'question-lg' | 'quotes' | 'record-circle-fill' | 'record-circle' | 'record2' | 'redo' | 'redux' | 'referrer' | 'remote-control' | 'resources-icon' | 'safe' | 'sandglass' | 'search' | 'server' | 'share-alt' | 'shield-lock' | 'side_menu_closed' | 'side_menu_open' | 'signpost-split' | 'signup' | 'slack' | 'slash-circle' | 'sleep' | 'sliders' | 'social/slack' | 'social/trello' | 'sparkles' | 'speedometer2' | 'spinner' | 'square-mouse-pointer' | 'star' | 'step-forward' | 'stickies' | 'stop-record-circle' | 'stopwatch' | 'store' | 'sync-alt' | 'table' | 'tags' | 'terminal' | 'thermometer-sun' | 'toggles' | 'tools' | 'trash' | 'turtle' | 'user-alt' | 'user-circle' | 'user-friends' | 'user-journey' | 'user-switch' | 'users' | 'vendors/graphql' | 'web-vitals' | 'wifi' | 'window-x' | 'window' | 'zoom-in'; interface Props { name: IconNames; @@ -1137,6 +1138,9 @@ const SVG = (props: Props) => { case 'explosion': return ; + // case 'export-pdf': + case 'export-pdf': return ; + // case 'external-link-alt': case 'external-link-alt': return ; diff --git a/frontend/app/styles/global.css b/frontend/app/styles/global.css index 068b7857e..b6154b6d2 100644 --- a/frontend/app/styles/global.css +++ b/frontend/app/styles/global.css @@ -25,6 +25,11 @@ img { stroke-width: 1.5px; } +.reset .lucide { + stroke-width: revert-layer; +} + + .ant-pagination-simple-pager input { min-width: 80px; } diff --git a/frontend/app/svg/icons/export-pdf.svg b/frontend/app/svg/icons/export-pdf.svg new file mode 100644 index 000000000..9bc497e2b --- /dev/null +++ b/frontend/app/svg/icons/export-pdf.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/scripts/schema/db/init_dbs/clickhouse/1.23.0/1.23.0.sql b/scripts/schema/db/init_dbs/clickhouse/1.23.0/1.23.0.sql index 50dd204bb..baef5f007 100644 --- a/scripts/schema/db/init_dbs/clickhouse/1.23.0/1.23.0.sql +++ b/scripts/schema/db/init_dbs/clickhouse/1.23.0/1.23.0.sql @@ -168,7 +168,8 @@ CREATE TABLE IF NOT EXISTS product_analytics.property_values_samples ENGINE = ReplacingMergeTree(_timestamp) ORDER BY (project_id, property_name, is_event_property); -CREATE MATERIALIZED VIEW IF NOT EXISTS product_analytics.property_values_sampler_mvREFRESHEVERY30HOURTOproduct_analytics.property_values_samples AS +CREATE MATERIALIZED VIEW IF NOT EXISTS product_analytics.property_values_sampler_mv + REFRESH EVERY 30 HOUR TO product_analytics.property_values_samples AS SELECT project_id, property_name, TRUE AS is_event_property, @@ -219,7 +220,8 @@ CREATE TABLE IF NOT EXISTS product_analytics.autocomplete_events_grouped ORDER BY (project_id, value) TTL _timestamp + INTERVAL 1 MONTH; -CREATE MATERIALIZED VIEW IF NOT EXISTS product_analytics.autocomplete_events_grouped_mvREFRESHEVERY30MINUTETOproduct_analytics.autocomplete_events_grouped AS +CREATE MATERIALIZED VIEW IF NOT EXISTS product_analytics.autocomplete_events_grouped_mv + REFRESH EVERY 30 MINUTE TO product_analytics.autocomplete_events_grouped AS SELECT project_id, value, count(1) AS data_count, @@ -265,7 +267,8 @@ CREATE TABLE IF NOT EXISTS product_analytics.autocomplete_event_properties_group ORDER BY (project_id, event_name, property_name, value) TTL _timestamp + INTERVAL 1 MONTH; -CREATE MATERIALIZED VIEW IF NOT EXISTS product_analytics.autocomplete_event_properties_grouped_mvREFRESHEVERY30MINUTETOproduct_analytics.autocomplete_event_properties_grouped AS +CREATE MATERIALIZED VIEW IF NOT EXISTS product_analytics.autocomplete_event_properties_grouped_mv + REFRESH EVERY 30 MINUTE TO product_analytics.autocomplete_event_properties_grouped AS SELECT project_id, event_name, property_name, diff --git a/scripts/schema/db/init_dbs/postgresql/1.23.0/1.23.0.sql b/scripts/schema/db/init_dbs/postgresql/1.23.0/1.23.0.sql index 8003f6753..36f9e8d6d 100644 --- a/scripts/schema/db/init_dbs/postgresql/1.23.0/1.23.0.sql +++ b/scripts/schema/db/init_dbs/postgresql/1.23.0/1.23.0.sql @@ -23,6 +23,8 @@ DROP SCHEMA IF EXISTS or_cache CASCADE; ALTER TABLE public.tenants ALTER COLUMN scope_state SET DEFAULT 2; +ALTER TYPE issue_type ADD VALUE IF NOT EXISTS 'incident'; + COMMIT; \elif :is_next diff --git a/scripts/schema/db/init_dbs/postgresql/init_schema.sql b/scripts/schema/db/init_dbs/postgresql/init_schema.sql index 7c6eb396e..2df44883a 100644 --- a/scripts/schema/db/init_dbs/postgresql/init_schema.sql +++ b/scripts/schema/db/init_dbs/postgresql/init_schema.sql @@ -314,7 +314,8 @@ CREATE TYPE issue_type AS ENUM ( 'custom', 'js_exception', 'mouse_thrashing', - 'app_crash' + 'app_crash', + 'incident' ); CREATE TABLE public.issues