mirror of
https://github.com/openobserve/openobserve.git
synced 2026-11-04 00:08:55 +00:00
chore(deps): update web npm dependencies (2026-08-06) (#13673)
## 📦 Weekly NPM Dependencies Update This automated PR updates `web/` npm packages to their latest versions and regenerates `package-lock.json`. ### Updated Packages - **@rudderstack/analytics-js**: 3.6.0 → 3.31.6 - **@tanstack/vue-form**: ^1.29.1 → ^1.33.3 - **@tanstack/vue-table**: ^8.21.3 → ^9.0.0 - **@tanstack/vue-virtual**: ^3.13.16 → ^3.13.35 - **@vue-flow/core**: ^1.48.1 → ^1.48.2 - **acorn**: ^8.15.0 → ^8.18.0 - **acorn-walk**: ^8.3.4 → ^8.3.5 - **cron-parser**: ^5.4.0 → ^5.7.0 - **date-fns**: ^4.1.0 → ^4.4.0 - **dompurify**: ^3.4.12 → ^3.4.13 - **gridstack**: ^12.4.2 → ^13.0.2 - **js-beautify**: ^1.15.4 → ^2.0.3 - **js-cookie**: ^3.0.7 → ^3.0.8 - **js-yaml**: ^4.3.0 → ^5.2.3 - **lucide-vue-next**: ^0.562.0 → ^1.0.0 - **marked**: ^17.0.1 → ^18.0.9 - **moment-timezone**: ^0.6.0 → ^0.6.3 - **monaco-editor**: ^0.52.2 → ^0.56.0 - **node-polyfill-webpack-plugin**: ^4.0.0 → ^4.1.0 - **reka-ui**: ^2.9.6 → ^2.10.1 - **reodotdev**: ^1.0.0 → ^1.1.0 - **sql-formatter**: ^15.6.12 → ^15.8.2 - **uuid**: ^14.0.0 → ^14.0.1 - **vue**: ^3.5.26 → ^3.5.41 - **vue-i18n**: ^11.2.8 → ^11.4.8 - **vue-router**: ^4.6.4 → ^5.2.0 - **@cypress/vue**: ^6.0.2 → ^6.0.3 - **@cypress/webpack-dev-server**: ^5.4.1 → ^5.6.2 - **@iconify-json/majesticons**: ^1.2.4 → ^1.2.5 - **@iconify-json/material-symbols**: ^1.2.72 → ^1.2.88 - **@iconify-json/octicon**: ^1.2.25 → ^1.2.31 - **@intlify/core-base**: ^11.2.8 → ^11.4.8 - **@rushstack/eslint-patch**: ^1.15.0 → ^1.16.1 - **@tailwindcss/postcss**: ^4.1.18 → ^4.3.3 - **@tailwindcss/typography**: ^0.5.19 → ^0.5.20 - **@tailwindcss/vite**: ^4.1.18 → ^4.3.3 - **@types/jsdom**: ^27.0.0 → ^28.0.3 - **@types/leaflet**: ^1.9.21 → ^1.9.22 - **@types/luxon**: ^3.7.1 → ^3.7.3 - **@types/node**: ^25.0.3 → ^26.1.2 - **@vitejs/plugin-vue**: ^6.0.3 → ^6.0.8 - **@vitejs/plugin-vue-jsx**: ^5.1.3 → ^5.1.6 - **@vitest/coverage-v8**: ^4.0.16 → ^4.1.10 - **@vitest/ui**: ^4.0.16 → ^4.1.10 - **@vue/eslint-config-typescript**: ^14.6.0 → ^14.9.0 - **@vue/test-utils**: ^2.4.6 → ^2.4.11 - **@vue/tsconfig**: ^0.8.1 → ^0.9.1 - **autoprefixer**: ^10.4.23 → ^10.5.4 - **c8**: ^10.1.3 → ^12.0.0 - **cypress**: ^15.19.0 → ^15.20.0 - **cypress-localstorage-commands**: ^2.2.8 → ^2.3.0 - **dotenv**: ^17.2.3 → ^17.4.2 - **eslint**: ^9.39.2 → ^10.8.0 - **eslint-plugin-cypress**: ^5.2.0 → ^7.0.0 - **eslint-plugin-vue**: ^10.6.2 → ^10.10.0 - **fs-extra**: ^11.3.3 → ^11.4.0 - **happy-dom**: ^20.8.9 → ^20.11.1 - **jsdom**: ^27.4.0 → ^30.0.1 - **msw**: ^2.12.7 → ^2.15.0 - **postcss**: ^8.5.10 → ^8.5.26 - **postcss-html**: ^1.8.1 → ^2.0.0 - **prettier**: ^3.7.4 → ^3.9.6 - **rollup-plugin-visualizer**: ^6.0.5 → ^7.0.1 - **sass**: ^1.97.1 → ^1.102.0 - **sass-loader**: ^16.0.6 → ^17.0.0 - **start-server-and-test**: ^2.1.3 → ^3.0.12 - **stylelint**: ^17.14.0 → ^17.14.1 - **vite**: ^7.3.2 → ^8.2.0 - **vite-plugin-istanbul**: ^7.2.1 → ^9.0.1 - **vitest-canvas-mock**: ^1.1.3 → ^1.1.4 - **vue-tsc**: ^3.2.1 → ^3.3.9 - **typescript**: ~5.9.3 → ~7.0.2 - **vitest**: ^4.0.16 → ^4.1.10 ### Validation This workflow does **not** run any checks — type check, unit tests and build all run as normal PR checks below. Review the results there before merging; a red check usually means one of the upgrades above needs to be pinned back or accompanied by a code change. --- 🤖 This PR was automatically created by the Weekly NPM Update workflow --------- Co-authored-by: Bhargav <551527+bjp232004@users.noreply.github.com> Co-authored-by: Bhargav <BJP232004@GMAIL.COM> Co-authored-by: ktx-abhay <abhay.padamani@kiara.tech> Co-authored-by: Abhay Padamani <141122205+ktx-abhay@users.noreply.github.com>
This commit is contained in:
co-authored by
Bhargav
Bhargav
ktx-abhay
Abhay Padamani
parent
79fbd566b3
commit
74805cf8ae
@@ -18,6 +18,19 @@ jobs:
|
||||
# nothing here needs to install node_modules or compile anything.
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
env:
|
||||
# Shared by both npm-check-updates invocations below — they must stay
|
||||
# identical, or the PR body would advertise upgrades the commit didn't make.
|
||||
#
|
||||
# `--reject typescript`: TypeScript 7 is the Go rewrite. Its package no
|
||||
# longer exports the `./lib/tsc` subpath, and vue-tsc — the only tool that
|
||||
# can type-check .vue SFCs — resolves exactly that path, so `type-check:app`
|
||||
# dies with ERR_PACKAGE_PATH_NOT_EXPORTED before checking a single file.
|
||||
# `--peer` cannot catch this: vue-tsc declares `typescript: >=5.0.0`, which
|
||||
# 7.x satisfies. Bump TypeScript by hand, together with a vue-tsc release
|
||||
# that supports it (5.x and 6.x are both fine today).
|
||||
NCU_ARGS: --target latest --peer --reject typescript
|
||||
|
||||
steps:
|
||||
- name: Clone the current repo
|
||||
uses: actions/checkout@v5
|
||||
@@ -35,9 +48,11 @@ jobs:
|
||||
|
||||
- name: Configure Git
|
||||
run: |
|
||||
# Commit as one of the user rather than the bot, so the commit and the PR share
|
||||
# one author and the PR shows up under his own filters.
|
||||
|
||||
# Commit as a real user rather than the bot, so the commit and the PR
|
||||
# share one author and the PR shows up under their own filters.
|
||||
# Without these, `git commit` below aborts with "Please tell me who you
|
||||
# are" — Actions runners have no global git identity of their own.
|
||||
|
||||
- name: Create update branch
|
||||
run: |
|
||||
BRANCH_NAME="chore/npm-update-$(date +%Y%m%d)"
|
||||
@@ -52,7 +67,7 @@ jobs:
|
||||
# Snapshot the pre-update manifest so the PR body can show old → new.
|
||||
cp package.json "$RUNNER_TEMP/package.json.before"
|
||||
|
||||
npx --yes npm-check-updates --target latest --peer --jsonUpgraded \
|
||||
npx --yes npm-check-updates $NCU_ARGS --jsonUpgraded \
|
||||
> "$RUNNER_TEMP/upgrades.json"
|
||||
|
||||
if ! jq -e 'type == "object"' "$RUNNER_TEMP/upgrades.json" > /dev/null; then
|
||||
@@ -77,7 +92,7 @@ jobs:
|
||||
echo "Updating dependencies..."
|
||||
|
||||
# Apply the same upgrades that were just reported.
|
||||
npx --yes npm-check-updates -u --target latest --peer
|
||||
npx --yes npm-check-updates -u $NCU_ARGS
|
||||
|
||||
# Regenerate package-lock.json only — node_modules is never needed
|
||||
# here, and skipping the install keeps this job to well under a minute.
|
||||
@@ -107,6 +122,13 @@ jobs:
|
||||
|
||||
$UPDATED_PACKAGES
|
||||
|
||||
### Not upgraded here
|
||||
|
||||
- **typescript** — excluded on purpose. TypeScript 7 (the Go rewrite)
|
||||
drops the \`./lib/tsc\` subpath that vue-tsc needs, so it breaks
|
||||
\`type-check:app\` outright. Bump it by hand alongside a vue-tsc that
|
||||
supports it. See \`NCU_ARGS\` in \`.github/workflows/npm-update.yml\`.
|
||||
|
||||
### Validation
|
||||
|
||||
This workflow does **not** run any checks — type check, unit tests and
|
||||
|
||||
@@ -130,7 +130,7 @@ jobs:
|
||||
|
||||
- uses: actions/setup-node@v7
|
||||
with:
|
||||
node-version: 22
|
||||
node-version: 24
|
||||
|
||||
- name: Lint frontend code
|
||||
run: cd web && npm ci && npm run lint:ci
|
||||
@@ -271,7 +271,7 @@ jobs:
|
||||
|
||||
- uses: actions/setup-node@v7
|
||||
with:
|
||||
node-version: 22
|
||||
node-version: 24
|
||||
|
||||
- name: Cache Playwright browser
|
||||
id: playwright-cache
|
||||
@@ -404,7 +404,7 @@ jobs:
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v7
|
||||
with:
|
||||
node-version: 22
|
||||
node-version: 24
|
||||
|
||||
- name: Install project dependencies
|
||||
run: cd tests/ui-testing && npm ci
|
||||
|
||||
Generated
+1553
-1493
File diff suppressed because it is too large
Load Diff
+52
-50
@@ -46,21 +46,21 @@
|
||||
"@openobserve/node-sql-parser": "^0.1.5",
|
||||
"@openobserve/rrweb-player": "^0.2.1",
|
||||
"@rudderstack/analytics-js": "3.6.0",
|
||||
"@tanstack/vue-form": "^1.29.1",
|
||||
"@tanstack/vue-form": "^1.33.3",
|
||||
"@tanstack/vue-table": "^8.21.3",
|
||||
"@tanstack/vue-virtual": "^3.13.16",
|
||||
"@tanstack/vue-virtual": "^3.13.35",
|
||||
"@types/js-yaml": "^4.0.9",
|
||||
"@vue-flow/background": "^1.3.2",
|
||||
"@vue-flow/controls": "^1.1.3",
|
||||
"@vue-flow/core": "^1.48.1",
|
||||
"acorn": "^8.15.0",
|
||||
"acorn-walk": "^8.3.4",
|
||||
"cron-parser": "^5.4.0",
|
||||
"@vue-flow/core": "^1.48.2",
|
||||
"acorn": "^8.18.0",
|
||||
"acorn-walk": "^8.3.5",
|
||||
"cron-parser": "^5.7.0",
|
||||
"d3-force": "^3.0.0",
|
||||
"d3-scale": "^4.0.2",
|
||||
"date-fns": "^4.1.0",
|
||||
"date-fns": "^4.4.0",
|
||||
"date-fns-tz": "^3.2.0",
|
||||
"dompurify": "^3.4.12",
|
||||
"dompurify": "^3.4.13",
|
||||
"echarts": "^6.1.0",
|
||||
"echarts-gl": "^2.1.0",
|
||||
"escodegen": "^2.1.0",
|
||||
@@ -68,7 +68,7 @@
|
||||
"gridstack": "^12.4.2",
|
||||
"highlight.js": "^11.11.1",
|
||||
"js-beautify": "^1.15.4",
|
||||
"js-cookie": "^3.0.7",
|
||||
"js-cookie": "^3.0.8",
|
||||
"js-yaml": "^4.3.1",
|
||||
"json-2-csv": "^5.5.11",
|
||||
"jszip": "^3.10.1",
|
||||
@@ -78,90 +78,92 @@
|
||||
"luxon": "^3.7.2",
|
||||
"marked": "^17.0.1",
|
||||
"moment": "^2.30.1",
|
||||
"moment-timezone": "^0.6.0",
|
||||
"moment-timezone": "^0.6.3",
|
||||
"monaco-editor": "^0.52.2",
|
||||
"node-polyfill-webpack-plugin": "^4.0.0",
|
||||
"reka-ui": "^2.9.6",
|
||||
"reodotdev": "^1.0.0",
|
||||
"node-polyfill-webpack-plugin": "^4.1.0",
|
||||
"reka-ui": "^2.10.1",
|
||||
"reodotdev": "^1.1.0",
|
||||
"rollup-plugin-node-polyfills": "^0.2.1",
|
||||
"rollup-plugin-polyfill-node": "^0.13.0",
|
||||
"sql-formatter": "^15.6.12",
|
||||
"sql-formatter": "^15.8.2",
|
||||
"tw-animate-css": "^1.4.0",
|
||||
"uuid": "^14.0.0",
|
||||
"vue": "^3.5.26",
|
||||
"uuid": "^14.0.1",
|
||||
"vue": "^3.5.41",
|
||||
"vue-drag-resize": "^1.5.4",
|
||||
"vue-draggable-next": "^2.3.0",
|
||||
"vue-i18n": "^11.2.8",
|
||||
"vue-i18n": "^11.4.8",
|
||||
"vue-router": "^4.6.4",
|
||||
"vuex": "^4.1.0",
|
||||
"zod": "^4.4.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@cypress/vue": "^6.0.2",
|
||||
"@cypress/webpack-dev-server": "^5.4.1",
|
||||
"@iconify-json/majesticons": "^1.2.4",
|
||||
"@iconify-json/material-symbols": "^1.2.72",
|
||||
"@cypress/vue": "^6.0.3",
|
||||
"@cypress/webpack-dev-server": "^5.6.2",
|
||||
"@iconify-json/majesticons": "^1.2.5",
|
||||
"@iconify-json/material-symbols": "^1.2.88",
|
||||
"@iconify-json/mdi": "^1.2.3",
|
||||
"@iconify-json/octicon": "^1.2.25",
|
||||
"@iconify-json/octicon": "^1.2.31",
|
||||
"@iconify-json/si": "^1.2.17",
|
||||
"@intlify/core-base": "^11.2.8",
|
||||
"@intlify/core-base": "^11.4.8",
|
||||
"@intlify/eslint-plugin-vue-i18n": "^4.5.1",
|
||||
"@rushstack/eslint-patch": "^1.15.0",
|
||||
"@tailwindcss/postcss": "^4.1.18",
|
||||
"@tailwindcss/typography": "^0.5.19",
|
||||
"@tailwindcss/vite": "^4.1.18",
|
||||
"@rushstack/eslint-patch": "^1.16.1",
|
||||
"@tailwindcss/postcss": "^4.3.3",
|
||||
"@tailwindcss/typography": "^0.5.20",
|
||||
"@tailwindcss/vite": "^4.3.3",
|
||||
"@types/d3-force": "^3.0.10",
|
||||
"@types/d3-scale": "^4.0.9",
|
||||
"@types/fs-extra": "^11.0.4",
|
||||
"@types/js-cookie": "^3.0.6",
|
||||
"@types/jsdom": "^27.0.0",
|
||||
"@types/leaflet": "^1.9.21",
|
||||
"@types/leaflet": "^1.9.22",
|
||||
"@types/lodash-es": "^4.17.12",
|
||||
"@types/luxon": "^3.7.1",
|
||||
"@types/luxon": "^3.7.3",
|
||||
"@types/node": "^25.0.3",
|
||||
"@types/uuid": "^11.0.0",
|
||||
"@vitejs/plugin-vue": "^6.0.3",
|
||||
"@vitejs/plugin-vue-jsx": "^5.1.3",
|
||||
"@vitest/coverage-v8": "^4.0.16",
|
||||
"@vitest/ui": "^4.0.16",
|
||||
"@typescript-eslint/eslint-plugin": "^8.66.0",
|
||||
"@typescript-eslint/parser": "^8.66.0",
|
||||
"@vitejs/plugin-vue": "^6.0.8",
|
||||
"@vitejs/plugin-vue-jsx": "^5.1.6",
|
||||
"@vitest/coverage-v8": "^4.1.10",
|
||||
"@vitest/ui": "^4.1.10",
|
||||
"@vue/eslint-config-prettier": "^10.2.0",
|
||||
"@vue/eslint-config-typescript": "^14.6.0",
|
||||
"@vue/test-utils": "^2.4.6",
|
||||
"@vue/eslint-config-typescript": "^14.9.0",
|
||||
"@vue/test-utils": "^2.4.11",
|
||||
"@vue/tsconfig": "^0.8.1",
|
||||
"autoprefixer": "^10.4.23",
|
||||
"autoprefixer": "^10.5.4",
|
||||
"c8": "^10.1.3",
|
||||
"cypress": "^15.19.0",
|
||||
"cypress-localstorage-commands": "^2.2.8",
|
||||
"dotenv": "^17.2.3",
|
||||
"cypress": "^15.20.0",
|
||||
"cypress-localstorage-commands": "^2.3.0",
|
||||
"dotenv": "^17.4.2",
|
||||
"eslint": "^9.39.2",
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"eslint-formatter-unix": "^9.0.1",
|
||||
"eslint-plugin-cypress": "^5.2.0",
|
||||
"eslint-plugin-vue": "^10.6.2",
|
||||
"fs-extra": "^11.3.3",
|
||||
"happy-dom": "^20.8.9",
|
||||
"eslint-plugin-vue": "^10.10.0",
|
||||
"fs-extra": "^11.4.0",
|
||||
"happy-dom": "^20.11.1",
|
||||
"jsdom": "^27.4.0",
|
||||
"msw": "^2.12.7",
|
||||
"msw": "^2.15.0",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"postcss": "^8.5.25",
|
||||
"postcss": "^8.5.26",
|
||||
"postcss-html": "^1.8.1",
|
||||
"prettier": "^3.7.4",
|
||||
"prettier": "^3.9.6",
|
||||
"prettier-plugin-tailwindcss": "^0.8.1",
|
||||
"rollup-plugin-analyzer": "^4.0.0",
|
||||
"rollup-plugin-visualizer": "^6.0.5",
|
||||
"sass": "^1.97.1",
|
||||
"sass": "^1.102.0",
|
||||
"sass-loader": "^16.0.6",
|
||||
"start-server-and-test": "^2.1.3",
|
||||
"stylelint": "^17.14.0",
|
||||
"stylelint": "^17.14.1",
|
||||
"tailwindcss": "^4.1.18",
|
||||
"typescript": "~5.9.3",
|
||||
"unplugin-icons": "^23.0.1",
|
||||
"vite": "^7.3.2",
|
||||
"vite-plugin-istanbul": "^7.2.1",
|
||||
"vite-plugin-monaco-editor": "^1.1.0",
|
||||
"vitest": "^4.0.16",
|
||||
"vitest-canvas-mock": "^1.1.3",
|
||||
"vue-tsc": "^3.2.1"
|
||||
"vitest": "^4.1.10",
|
||||
"vitest-canvas-mock": "^1.1.4",
|
||||
"vue-tsc": "^3.3.9"
|
||||
},
|
||||
"overrides": {
|
||||
"axios": "1.13.2"
|
||||
|
||||
@@ -30,8 +30,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<pre
|
||||
data-test="rum-content-text"
|
||||
class="m-0 p-3 pr-10 text-sm leading-5 wrap-break-word whitespace-pre-wrap"
|
||||
>{{ computedContent }}</pre
|
||||
>
|
||||
>{{ computedContent }}</pre>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -588,18 +588,16 @@ const editScriptSchema = makeEditScriptSchema({
|
||||
// Dynamic (edit-prefill) defaults: projects the form-owned fields out of the
|
||||
// component's `formData` / `frequency`. Seeds useOForm at create; re-applied
|
||||
// via form.reset() when an edited record arrives async (see below).
|
||||
const editScriptDefaults = computed(
|
||||
(): EditScriptForm => ({
|
||||
name: formData.value.name ?? "",
|
||||
description: formData.value.description ?? "",
|
||||
type: formData.value.type ?? "scheduled",
|
||||
service_account: formData.value.service_account ?? "",
|
||||
timezone: formData.value.timezone ?? "UTC",
|
||||
codeZip: (formData.value.codeZip as File | null) ?? null,
|
||||
cron: frequency.value.cron ?? "",
|
||||
frequencyType: frequency.value.type ?? "once",
|
||||
}),
|
||||
);
|
||||
const editScriptDefaults = computed((): EditScriptForm => ({
|
||||
name: formData.value.name ?? "",
|
||||
description: formData.value.description ?? "",
|
||||
type: formData.value.type ?? "scheduled",
|
||||
service_account: formData.value.service_account ?? "",
|
||||
timezone: formData.value.timezone ?? "UTC",
|
||||
codeZip: (formData.value.codeZip as File | null) ?? null,
|
||||
cron: frequency.value.cron ?? "",
|
||||
frequencyType: frequency.value.type ?? "once",
|
||||
}));
|
||||
|
||||
// Headless form (Rule ③ owner). defaultValues seed the blank create form; the
|
||||
// async edit record re-seeds via form.reset() below. onSubmit is deferred to
|
||||
|
||||
@@ -395,8 +395,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
font-family: var(--font-mono);
|
||||
font-size: var(--text-xs);
|
||||
"
|
||||
>{{ selectedRow.error }}</pre
|
||||
>
|
||||
>{{ selectedRow.error }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -421,8 +420,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
font-family: var(--font-mono);
|
||||
font-size: var(--text-xs);
|
||||
"
|
||||
>{{ selectedRow.success_response }}</pre
|
||||
>
|
||||
>{{ selectedRow.success_response }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -287,8 +287,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</div>
|
||||
<pre
|
||||
class="text-compact m-0 flex-1 overflow-x-auto overflow-y-auto p-[10px_14px] font-mono leading-relaxed whitespace-pre-wrap"
|
||||
>{{ anomalySql || t("alerts.alertDetails.noCondition") }}</pre
|
||||
>
|
||||
>{{ anomalySql || t("alerts.alertDetails.noCondition") }}</pre>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -351,8 +350,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
})
|
||||
: t("alerts.alertDetails.noCondition")
|
||||
: t("alerts.alertDetails.noCondition")
|
||||
}}</pre
|
||||
>
|
||||
}}</pre>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -131,8 +131,7 @@ limitations under the License. -->
|
||||
</div>
|
||||
<pre
|
||||
class="rounded-default text-3xs text-text-body m-0 max-h-37.5 overflow-y-auto border border-[rgba(0,0,0,0.1)] bg-[rgba(0,0,0,0.05)] p-2 font-mono leading-[1.5] whitespace-pre dark:border-[rgba(255,255,255,0.1)] dark:bg-[rgba(255,255,255,0.05)]"
|
||||
>{{ formatResponseBody(result.responseBody) }}</pre
|
||||
>
|
||||
>{{ formatResponseBody(result.responseBody) }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</OCollapsible>
|
||||
|
||||
@@ -284,8 +284,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
>
|
||||
<pre
|
||||
class="m-0 font-[inherit] [overflow-wrap:break-word] [word-break:break-word] [white-space:pre-wrap] [word-wrap:break-word]"
|
||||
>{{ val.message }}</pre
|
||||
>
|
||||
>{{ val.message }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -173,8 +173,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
>
|
||||
<pre
|
||||
class="m-0 font-[inherit] [overflow-wrap:break-word] [word-break:break-word] [white-space:pre-wrap] [word-wrap:break-word]"
|
||||
>{{ val.message }}</pre
|
||||
>
|
||||
>{{ val.message }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -128,8 +128,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<pre
|
||||
data-test="trigger-payload-json"
|
||||
class="bg-surface-secondary rounded-surface max-h-[60vh] overflow-auto p-3 text-xs"
|
||||
>{{ formattedPayload }}</pre
|
||||
>
|
||||
>{{ formattedPayload }}</pre>
|
||||
</template>
|
||||
</ODialog>
|
||||
</div>
|
||||
|
||||
@@ -1028,8 +1028,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
'text-compact overflow-x-auto break-words whitespace-pre-wrap',
|
||||
'text-text-body',
|
||||
]"
|
||||
>{{ alerts[selectedAlertIndex]?.query_condition?.sql }}</pre
|
||||
>
|
||||
>{{ alerts[selectedAlertIndex]?.query_condition?.sql }}</pre>
|
||||
</div>
|
||||
|
||||
<!-- PromQL Query -->
|
||||
@@ -1039,8 +1038,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
'text-compact overflow-x-auto break-words whitespace-pre-wrap',
|
||||
'text-text-body',
|
||||
]"
|
||||
>{{ alerts[selectedAlertIndex]?.query_condition?.promql }}</pre
|
||||
>
|
||||
>{{ alerts[selectedAlertIndex]?.query_condition?.promql }}</pre>
|
||||
</div>
|
||||
|
||||
<!-- Custom Conditions -->
|
||||
@@ -1056,8 +1054,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
formatCustomConditions(
|
||||
alerts[selectedAlertIndex]?.query_condition?.conditions,
|
||||
)
|
||||
}}</pre
|
||||
>
|
||||
}}</pre>
|
||||
</div>
|
||||
|
||||
<!-- No conditions -->
|
||||
|
||||
@@ -248,8 +248,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<pre
|
||||
class="bg-surface-panel rounded-default text-3xs overflow-auto p-3"
|
||||
data-test="template-preview-panel-raw-json"
|
||||
>{{ rawPayloadJson }}</pre
|
||||
>
|
||||
>{{ rawPayloadJson }}</pre>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -175,14 +175,12 @@ export default defineComponent({
|
||||
// Dynamic (edit-prefill) defaults → a typed component computed. Seeds
|
||||
// name/url/fields/newFieldName from the current `link`; re-applied on open
|
||||
// via form.reset (the form is created here, so it persists across opens).
|
||||
const crossLinkDefaults = computed(
|
||||
(): CrossLinkDialogForm => ({
|
||||
name: props.link?.name ?? "",
|
||||
url: props.link?.url ?? "",
|
||||
fields: props.link?.fields ? props.link.fields.map((f) => ({ name: f.name })) : [],
|
||||
newFieldName: "",
|
||||
}),
|
||||
);
|
||||
const crossLinkDefaults = computed((): CrossLinkDialogForm => ({
|
||||
name: props.link?.name ?? "",
|
||||
url: props.link?.url ?? "",
|
||||
fields: props.link?.fields ? props.link.fields.map((f) => ({ name: f.name })) : [],
|
||||
newFieldName: "",
|
||||
}));
|
||||
|
||||
// Owner-pattern form (Rule ③): CrossLinkDialog OWNS the <OForm> and its
|
||||
// template renders the chip list from the form-owned `fields` array. We
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
</div>
|
||||
<div class="group relative mt-1">
|
||||
<div
|
||||
class="rounded-default bg-theme-body-bg-primary border-card-glass-border inspector-query-editor max-h-40 overflow-y-auto border p-2 font-mono text-sm break-all whitespace-pre-wrap [scrollbar-color:color-mix(in_srgb,var(--color-grey-500)_20%,transparent)_transparent] [scrollbar-width:thin]"
|
||||
class="rounded-default bg-theme-body-bg-primary border-card-glass-border inspector-query-editor max-h-40 [scrollbar-width:thin] [scrollbar-color:color-mix(in_srgb,var(--color-grey-500)_20%,transparent)_transparent] overflow-y-auto border p-2 font-mono text-sm break-all whitespace-pre-wrap"
|
||||
:data-test="`query-inspector-original-query-${index}`"
|
||||
v-html="
|
||||
highlightSearch(
|
||||
@@ -99,7 +99,7 @@
|
||||
</div>
|
||||
<div class="group relative mt-1">
|
||||
<div
|
||||
class="rounded-default bg-theme-body-bg-primary border-card-glass-border inspector-query-editor max-h-40 overflow-y-auto border p-2 font-mono text-sm break-all whitespace-pre-wrap [scrollbar-color:color-mix(in_srgb,var(--color-grey-500)_20%,transparent)_transparent] [scrollbar-width:thin]"
|
||||
class="rounded-default bg-theme-body-bg-primary border-card-glass-border inspector-query-editor max-h-40 [scrollbar-width:thin] [scrollbar-color:color-mix(in_srgb,var(--color-grey-500)_20%,transparent)_transparent] overflow-y-auto border p-2 font-mono text-sm break-all whitespace-pre-wrap"
|
||||
:data-test="`query-inspector-executed-query-${index}`"
|
||||
v-html="
|
||||
highlightSearch(
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
</div>
|
||||
<Teleport to="body">
|
||||
<div
|
||||
class="user-guide border-border-default rounded-default bg-surface-base pointer-events-auto fixed z-9999 max-h-75 w-125 overflow-y-auto border p-2.5 [scrollbar-color:color-mix(in_srgb,var(--color-grey-950)_25%,transparent)_color-mix(in_srgb,var(--color-grey-950)_5%,transparent)] [scrollbar-width:thin] [&_div]:m-0 [&_li]:m-0 [&_p]:m-0 [&_ul]:m-0"
|
||||
class="user-guide border-border-default rounded-default bg-surface-base pointer-events-auto fixed z-9999 max-h-75 w-125 [scrollbar-width:thin] [scrollbar-color:color-mix(in_srgb,var(--color-grey-950)_25%,transparent)_color-mix(in_srgb,var(--color-grey-950)_5%,transparent)] overflow-y-auto border p-2.5 [&_div]:m-0 [&_li]:m-0 [&_p]:m-0 [&_ul]:m-0"
|
||||
v-show="showUserGuide"
|
||||
@mouseleave="showUserGuide = false"
|
||||
ref="userGuideDivRef"
|
||||
|
||||
@@ -20,7 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<DashboardHeader :title="title" backButton @back="close"> </DashboardHeader>
|
||||
|
||||
<div
|
||||
class="[&::-webkit-scrollbar-thumb]:rounded-default [&::-webkit-scrollbar-thumb]:bg-border-default min-h-0 flex-1 overflow-y-auto px-0.75 pb-4 [scrollbar-color:var(--color-border-default)_transparent] [scrollbar-width:thin] [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar]:bg-transparent"
|
||||
class="[&::-webkit-scrollbar-thumb]:rounded-default [&::-webkit-scrollbar-thumb]:bg-border-default min-h-0 flex-1 [scrollbar-width:thin] [scrollbar-color:var(--color-border-default)_transparent] overflow-y-auto px-0.75 pb-4 [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar]:bg-transparent"
|
||||
>
|
||||
<OForm greedy id="add-setting-variable-form" :form="form" class="px-0.5">
|
||||
<div class="mt-3">
|
||||
|
||||
@@ -110,11 +110,9 @@ export default defineComponent({
|
||||
// OForm reads `defaultValues` once at mount, and ODialog remounts the body on
|
||||
// open — so this computed seeds `name` each time the dialog opens (edit → the
|
||||
// tab's name, create → blank). No local model / no manual reset needed.
|
||||
const addTabDefaults = computed(
|
||||
(): AddTabForm => ({
|
||||
name: props.editMode ? (editingTab.value?.name ?? "") : "",
|
||||
}),
|
||||
);
|
||||
const addTabDefaults = computed((): AddTabForm => ({
|
||||
name: props.editMode ? (editingTab.value?.name ?? "") : "",
|
||||
}));
|
||||
|
||||
// Edit data arrives ASYNC (getDashboard may hit the API) after the dialog has
|
||||
// mounted, so `:default-values` has already been read. Per the playbook
|
||||
|
||||
@@ -613,9 +613,9 @@ export default defineComponent({
|
||||
}
|
||||
|
||||
// if variables data is null, set it to empty list
|
||||
if (
|
||||
!(currentDashboardData.data?.variables && currentDashboardData.data?.variables?.list.length)
|
||||
) {
|
||||
if (!(
|
||||
currentDashboardData.data?.variables && currentDashboardData.data?.variables?.list.length
|
||||
)) {
|
||||
variablesData.isVariablesLoading = false;
|
||||
variablesData.values = [];
|
||||
}
|
||||
|
||||
@@ -145,8 +145,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
>
|
||||
<pre
|
||||
class="text-compact text-text-code m-0 cursor-default border-0 bg-transparent p-4 font-mono leading-normal font-normal break-words whitespace-pre-wrap select-text"
|
||||
>{{ selectedDefinition }}</pre
|
||||
>
|
||||
>{{ selectedDefinition }}</pre>
|
||||
</div>
|
||||
</OCardSection>
|
||||
</OCard>
|
||||
|
||||
@@ -207,8 +207,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<pre
|
||||
v-if="compilationErr"
|
||||
class="text-status-error-text text-sm font-bold whitespace-pre-wrap"
|
||||
>{{ compilationErr }}</pre
|
||||
>
|
||||
>{{ compilationErr }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -128,8 +128,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<pre
|
||||
class="text-status-error-text my-0 whitespace-pre-wrap"
|
||||
style="font-family: var(--font-mono); font-size: var(--text-compact)"
|
||||
>{{ vrlFunctionError }}</pre
|
||||
>
|
||||
>{{ vrlFunctionError }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -224,8 +224,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<pre
|
||||
class="bg-surface-subtle border-border-default rounded-default overflow-x-auto border p-3 font-mono text-xs whitespace-pre"
|
||||
data-test="synthetics-token-install-cmd"
|
||||
>{{ installCommand }}</pre
|
||||
>
|
||||
>{{ installCommand }}</pre>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
|
||||
@@ -85,11 +85,9 @@ const addGroupSchema = makeAddGroupSchema(t);
|
||||
// The OForm owns `name`. The ODialog unmounts its body on close + remounts fresh
|
||||
// on open, so this typed computed re-seeds `:default-values` each open (the
|
||||
// optional `group` prop prefills it, otherwise blank). No local model / watch.
|
||||
const addGroupDefaults = computed(
|
||||
(): AddGroupForm => ({
|
||||
name: props.group?.name ?? "",
|
||||
}),
|
||||
);
|
||||
const addGroupDefaults = computed((): AddGroupForm => ({
|
||||
name: props.group?.name ?? "",
|
||||
}));
|
||||
|
||||
// Plain async @submit handler — the validated `value` is the source of truth.
|
||||
// The schema validates the trimmed name (so surrounding whitespace doesn't trip
|
||||
|
||||
@@ -246,14 +246,12 @@ const saveGroupChanges = () => {
|
||||
remove_roles: Array.from(removedRoles.value) as string[],
|
||||
};
|
||||
|
||||
if (
|
||||
!(
|
||||
payload.add_users.length ||
|
||||
payload.remove_users.length ||
|
||||
payload.add_roles.length ||
|
||||
payload.remove_roles.length
|
||||
)
|
||||
) {
|
||||
if (!(
|
||||
payload.add_users.length ||
|
||||
payload.remove_users.length ||
|
||||
payload.add_roles.length ||
|
||||
payload.remove_roles.length
|
||||
)) {
|
||||
toast({
|
||||
variant: "info",
|
||||
message: t("iam.editGroup.noUpdates"),
|
||||
|
||||
@@ -139,13 +139,11 @@ export default defineComponent({
|
||||
// The OForm owns id/name/makeBilledMember. This typed computed seeds them each
|
||||
// time the dialog body mounts (edit → id + name from modelValue, create →
|
||||
// blank); makeBilledMember always starts unchecked.
|
||||
const addUpdateOrganizationDefaults = computed(
|
||||
(): AddUpdateOrganizationForm => ({
|
||||
id: props.modelValue?.id ?? "",
|
||||
name: props.modelValue?.name ?? "",
|
||||
makeBilledMember: false,
|
||||
}),
|
||||
);
|
||||
const addUpdateOrganizationDefaults = computed((): AddUpdateOrganizationForm => ({
|
||||
id: props.modelValue?.id ?? "",
|
||||
name: props.modelValue?.name ?? "",
|
||||
makeBilledMember: false,
|
||||
}));
|
||||
|
||||
const currentOrgName = computed(
|
||||
() =>
|
||||
|
||||
@@ -111,12 +111,10 @@ const addRoleSchema = makeAddRoleSchema(t);
|
||||
// remounts fresh on open, so this typed computed re-seeds `:default-values` each
|
||||
// open (the optional `role` prop prefills the name; startFrom resets to "custom").
|
||||
// No local model / watch.
|
||||
const addRoleDefaults = computed(
|
||||
(): AddRoleForm => ({
|
||||
name: props.role?.name ?? "",
|
||||
startFrom: "custom",
|
||||
}),
|
||||
);
|
||||
const addRoleDefaults = computed((): AddRoleForm => ({
|
||||
name: props.role?.name ?? "",
|
||||
startFrom: "custom",
|
||||
}));
|
||||
|
||||
// Plain async @submit handler — the validated `value` is the source of truth.
|
||||
// The schema validates the trimmed name; trim again here so the saved value
|
||||
|
||||
@@ -2224,14 +2224,12 @@ const saveRole = () => {
|
||||
) as string[],
|
||||
};
|
||||
|
||||
if (
|
||||
!(
|
||||
payload.add.length ||
|
||||
payload.remove.length ||
|
||||
payload.add_users.length ||
|
||||
payload.remove_users.length
|
||||
)
|
||||
) {
|
||||
if (!(
|
||||
payload.add.length ||
|
||||
payload.remove.length ||
|
||||
payload.add_users.length ||
|
||||
payload.remove_users.length
|
||||
)) {
|
||||
toast({
|
||||
variant: "info",
|
||||
message: t("iam.editRole.noUpdatesDetected"),
|
||||
|
||||
@@ -177,14 +177,12 @@ export default defineComponent({
|
||||
|
||||
// The OForm owns all editable fields. Name/roles/groups are always blank on
|
||||
// create; the description prefills from modelValue in update mode.
|
||||
const addServiceAccountDefaults = computed(
|
||||
(): AddServiceAccountForm => ({
|
||||
name: "",
|
||||
first_name: props.modelValue?.first_name ?? "",
|
||||
roles: [],
|
||||
groups: [],
|
||||
}),
|
||||
);
|
||||
const addServiceAccountDefaults = computed((): AddServiceAccountForm => ({
|
||||
name: "",
|
||||
first_name: props.modelValue?.first_name ?? "",
|
||||
roles: [],
|
||||
groups: [],
|
||||
}));
|
||||
|
||||
// Roles/groups exist only on enterprise/cloud (OSS has no RBAC UI).
|
||||
const showAccessPickers = computed(
|
||||
|
||||
@@ -283,20 +283,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OTabPanel name="curl">
|
||||
<pre
|
||||
class="bg-surface-subtle text-text-body rounded-default overflow-auto p-3 text-xs whitespace-pre-wrap"
|
||||
>{{ tokenCurlSnippet }}</pre
|
||||
>
|
||||
>{{ tokenCurlSnippet }}</pre>
|
||||
</OTabPanel>
|
||||
<OTabPanel name="header">
|
||||
<pre
|
||||
class="bg-surface-subtle text-text-body rounded-default overflow-auto p-3 text-xs whitespace-pre-wrap"
|
||||
>{{ tokenHeaderSnippet }}</pre
|
||||
>
|
||||
>{{ tokenHeaderSnippet }}</pre>
|
||||
</OTabPanel>
|
||||
<OTabPanel name="env">
|
||||
<pre
|
||||
class="bg-surface-subtle text-text-body rounded-default overflow-auto p-3 text-xs whitespace-pre-wrap"
|
||||
>{{ tokenEnvSnippet }}</pre
|
||||
>
|
||||
>{{ tokenEnvSnippet }}</pre>
|
||||
</OTabPanel>
|
||||
</OTabPanels>
|
||||
|
||||
|
||||
@@ -119,12 +119,10 @@ export default defineComponent({
|
||||
// EDIT-prefill: the OForm owns role/first_name; this typed computed seeds them
|
||||
// from the externally-provided modelValue each time the dialog body mounts.
|
||||
// org_member_id/email stay non-form data (read from modelValue at submit).
|
||||
const updateRoleDefaults = computed(
|
||||
(): UpdateRoleForm => ({
|
||||
role: props.modelValue?.role ?? "",
|
||||
first_name: props.modelValue?.first_name ?? "",
|
||||
}),
|
||||
);
|
||||
const updateRoleDefaults = computed((): UpdateRoleForm => ({
|
||||
role: props.modelValue?.role ?? "",
|
||||
first_name: props.modelValue?.first_name ?? "",
|
||||
}));
|
||||
|
||||
// Options-API: the schema (and the defaults computed) MUST be returned from
|
||||
// setup() — a bare module import is out of the template's scope, so :schema
|
||||
|
||||
@@ -36,8 +36,7 @@ export { safeHttpUrl } from "@/components/ingestion/setupCard/subs";
|
||||
const marked = new Marked({ gfm: true, breaks: false });
|
||||
|
||||
export type CardSegment =
|
||||
| { type: "html"; html: string }
|
||||
| { type: "code"; code: string; lang: string };
|
||||
{ type: "html"; html: string } | { type: "code"; code: string; lang: string };
|
||||
|
||||
function substitute(md: string, subs: CardSubstitutions): string {
|
||||
return md
|
||||
|
||||
@@ -230,13 +230,11 @@ const selectedNodeType = ref(
|
||||
);
|
||||
|
||||
// Typed dynamic (edit-prefill) defaults — read once at each OForm mount.
|
||||
const streamDefaults = computed(
|
||||
(): StreamForm => ({
|
||||
stream_type: streamTypeSeed,
|
||||
stream_name: streamNameSeed,
|
||||
appendData: appendDataSeed,
|
||||
}),
|
||||
);
|
||||
const streamDefaults = computed((): StreamForm => ({
|
||||
stream_type: streamTypeSeed,
|
||||
stream_name: streamNameSeed,
|
||||
appendData: appendDataSeed,
|
||||
}));
|
||||
|
||||
// Rule ③ OWNER pattern: this component OWNS <OForm>, so it creates the form here
|
||||
// with useOForm and hands it to <OForm :form="form">. The owner needs the live
|
||||
|
||||
@@ -284,14 +284,12 @@ const errorMessage = ref("");
|
||||
|
||||
// Typed dynamic defaults for the form-owned fields. The time range is an
|
||||
// absolute range seeded empty (forces the picker to absolute mode).
|
||||
const backfillDefaults = computed(
|
||||
(): BackfillForm => ({
|
||||
timerange: { type: "absolute", from: undefined, to: undefined },
|
||||
chunkPeriodMinutes: (props.scheduleFrequency || 60) as number | null,
|
||||
delayBetweenChunks: null,
|
||||
deleteBeforeBackfill: false,
|
||||
}),
|
||||
);
|
||||
const backfillDefaults = computed((): BackfillForm => ({
|
||||
timerange: { type: "absolute", from: undefined, to: undefined },
|
||||
chunkPeriodMinutes: (props.scheduleFrequency || 60) as number | null,
|
||||
delayBetweenChunks: null,
|
||||
deleteBeforeBackfill: false,
|
||||
}));
|
||||
|
||||
// Rule ③ OWNER pattern: this component OWNS <OForm> and needs the live values
|
||||
// (timerange/chunk/delay/deleteBeforeBackfill) for estimatedInfo + the delete
|
||||
|
||||
@@ -186,18 +186,16 @@ const errorMessage = ref("");
|
||||
// Typed dynamic defaults for the form-owned fields (seeded from props.job). The
|
||||
// time range is an absolute range carrying the job's start/end (forces the
|
||||
// picker to absolute mode + pre-fills it).
|
||||
const backfillDefaults = computed(
|
||||
(): BackfillForm => ({
|
||||
timerange: {
|
||||
type: "absolute",
|
||||
from: props.job?.start_time,
|
||||
to: props.job?.end_time,
|
||||
},
|
||||
chunkPeriodMinutes: props.job?.chunk_period_minutes || null,
|
||||
delayBetweenChunks: props.job?.delay_between_chunks_secs || null,
|
||||
deleteBeforeBackfill: props.job?.delete_before_backfill || false,
|
||||
}),
|
||||
);
|
||||
const backfillDefaults = computed((): BackfillForm => ({
|
||||
timerange: {
|
||||
type: "absolute",
|
||||
from: props.job?.start_time,
|
||||
to: props.job?.end_time,
|
||||
},
|
||||
chunkPeriodMinutes: props.job?.chunk_period_minutes || null,
|
||||
delayBetweenChunks: props.job?.delay_between_chunks_secs || null,
|
||||
deleteBeforeBackfill: props.job?.delete_before_backfill || false,
|
||||
}));
|
||||
|
||||
// Blank defaults used by cancel/reset (the open-watch re-seeds from props.job).
|
||||
const blankDefaults = (): BackfillForm => ({
|
||||
|
||||
@@ -385,8 +385,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
font-family: var(--font-mono);
|
||||
font-size: var(--text-xs);
|
||||
"
|
||||
>{{ selectedRow.error }}</pre
|
||||
>
|
||||
>{{ selectedRow.error }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -409,8 +408,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
font-family: var(--font-mono);
|
||||
font-size: var(--text-xs);
|
||||
"
|
||||
>{{ selectedRow.success_response }}</pre
|
||||
>
|
||||
>{{ selectedRow.success_response }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -630,13 +630,11 @@ export default defineComponent({
|
||||
// Built once from the component's `t` so the messages are localized.
|
||||
const generalSettingsSchema = makeGeneralSettingsSchema(t);
|
||||
// Dynamic defaults (edit-prefill from the store) → a typed computed.
|
||||
const generalSettingsDefaults = computed(
|
||||
(): GeneralSettingsForm => ({
|
||||
scrape_interval: store.state?.organizationData?.organizationSettings?.scrape_interval ?? 15,
|
||||
max_series_per_query:
|
||||
store.state?.organizationData?.organizationSettings?.max_series_per_query ?? null,
|
||||
}),
|
||||
);
|
||||
const generalSettingsDefaults = computed((): GeneralSettingsForm => ({
|
||||
scrape_interval: store.state?.organizationData?.organizationSettings?.scrape_interval ?? 15,
|
||||
max_series_per_query:
|
||||
store.state?.organizationData?.organizationSettings?.max_series_per_query ?? null,
|
||||
}));
|
||||
|
||||
const loadingState = ref(false);
|
||||
const customText = ref("");
|
||||
|
||||
@@ -122,8 +122,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<pre
|
||||
class="creators-message max-w-full whitespace-pre-wrap"
|
||||
style="word-wrap: break-word; overflow-wrap: break-word; word-break: break-word"
|
||||
>{{ val.message }}</pre
|
||||
>
|
||||
>{{ val.message }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -155,8 +155,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<pre
|
||||
class="max-w-full whitespace-pre-wrap"
|
||||
style="word-wrap: break-word; overflow-wrap: break-word; word-break: break-word"
|
||||
>{{ val.message }}</pre
|
||||
>
|
||||
>{{ val.message }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -434,8 +434,8 @@ function blankFormValues(provider: string): OrgStorageEditorForm {
|
||||
|
||||
// Dynamic defaults (region from cloud/store, provider projected from the card
|
||||
// grid) → a typed computed.
|
||||
const orgStorageEditorDefaults = computed(
|
||||
(): OrgStorageEditorForm => blankFormValues(selectedProvider.value),
|
||||
const orgStorageEditorDefaults = computed((): OrgStorageEditorForm =>
|
||||
blankFormValues(selectedProvider.value),
|
||||
);
|
||||
|
||||
const cloudProviders = computed(() => {
|
||||
|
||||
@@ -378,9 +378,9 @@ export default defineComponent({
|
||||
// Extend-trial week count is bridged from the pill grid into the form below.
|
||||
// Dynamic defaults (project the current pill value) → a typed computed.
|
||||
const extendTrialFormRef = ref<any>(null);
|
||||
const extendTrialDefaults = computed(
|
||||
(): ExtendTrialForm => ({ extendedTrial: extendedTrial.value }),
|
||||
);
|
||||
const extendTrialDefaults = computed((): ExtendTrialForm => ({
|
||||
extendedTrial: extendedTrial.value,
|
||||
}));
|
||||
|
||||
// Keep the form's copy of the bridged pill value in sync (the pill grid is a
|
||||
// custom control, not an <input>, so it is bridged via setFieldValue — the
|
||||
|
||||
@@ -107,8 +107,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<pre
|
||||
class="bg-surface-subtle border-border-default rounded-default overflow-x-auto border p-3 font-mono text-xs whitespace-pre"
|
||||
data-test="synthetics-agent-setup-install-cmd"
|
||||
>{{ composedCommand }}</pre
|
||||
>
|
||||
>{{ composedCommand }}</pre>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
@@ -126,8 +125,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<pre
|
||||
class="bg-surface-subtle border-border-default rounded-default overflow-x-auto border p-3 font-mono text-xs whitespace-pre"
|
||||
data-test="synthetics-agent-setup-install-cmd"
|
||||
>{{ install }}</pre
|
||||
>
|
||||
>{{ install }}</pre>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
|
||||
@@ -1002,8 +1002,7 @@ function openChromeExtensions() {
|
||||
v-if="blockedDetail"
|
||||
class="text-text-body bg-surface-subtle rounded-default m-0 overflow-x-auto px-2 py-1.5 font-mono text-xs whitespace-pre-wrap"
|
||||
data-test="synthetics-journey-preflight-detail"
|
||||
>{{ blockedDetail }}</pre
|
||||
>
|
||||
>{{ blockedDetail }}</pre>
|
||||
<div class="flex items-center gap-2">
|
||||
<OButton
|
||||
variant="primary"
|
||||
|
||||
@@ -330,8 +330,7 @@ function toggleExpanded() {
|
||||
v-if="showStackTrace"
|
||||
class="bg-code-bg rounded-default m-0 mt-2 max-h-75 overflow-x-auto overflow-y-auto p-3 font-mono text-xs leading-relaxed"
|
||||
data-test="synthetics-journey-step-stack-content"
|
||||
>{{ se?.stack }}</pre
|
||||
>
|
||||
>{{ se?.stack }}</pre>
|
||||
</div>
|
||||
|
||||
<!-- Info boxes -->
|
||||
|
||||
@@ -279,8 +279,7 @@ function toggleSteps(executionId: string) {
|
||||
</p>
|
||||
<pre
|
||||
class="text-text-secondary bg-status-error-bg rounded-default border border-[var(--color-status-error-text)] px-3 py-2 font-mono text-xs leading-relaxed whitespace-pre-wrap"
|
||||
>{{ loc.error }}</pre
|
||||
>
|
||||
>{{ loc.error }}</pre>
|
||||
</div>
|
||||
|
||||
<!-- Steps -->
|
||||
|
||||
@@ -406,13 +406,7 @@ export interface StepEvidence {
|
||||
// why the panel reads the bundle rather than the index.
|
||||
|
||||
export type EvidenceKind =
|
||||
| "console"
|
||||
| "pageerror"
|
||||
| "response"
|
||||
| "requestfailed"
|
||||
| "dialog"
|
||||
| "crash"
|
||||
| "truncation";
|
||||
"console" | "pageerror" | "response" | "requestfailed" | "dialog" | "crash" | "truncation";
|
||||
|
||||
export interface EvidenceEvent {
|
||||
/** When the event was OBSERVED. */
|
||||
|
||||
@@ -1575,8 +1575,7 @@ export function useAlertForm(props: AlertFormProps, emit: AlertFormEmit) {
|
||||
// needs the SQL parser, which is async and lives here rather than in the
|
||||
// (pure, synchronous) adapters.
|
||||
const sqlHaving = prefill.meta?.sqlHaving as
|
||||
| { column: string; operator: string; value: number }
|
||||
| undefined;
|
||||
{ column: string; operator: string; value: number } | undefined;
|
||||
if (sql && sqlHaving?.column) {
|
||||
if (!parser) await importSqlParser();
|
||||
sql = addHavingClauseToQuery(
|
||||
|
||||
@@ -81,9 +81,7 @@ export function useLatencyInsightsAnalysis() {
|
||||
streamName: string,
|
||||
timeRange: { startTime: number; endTime: number },
|
||||
durationFilter:
|
||||
| { start: number; end: number; timeStart?: number; timeEnd?: number }
|
||||
| null
|
||||
| undefined,
|
||||
{ start: number; end: number; timeStart?: number; timeEnd?: number } | null | undefined,
|
||||
baseFilter?: string,
|
||||
applyDurationFilter: boolean = true,
|
||||
) => {
|
||||
@@ -131,9 +129,7 @@ export function useLatencyInsightsAnalysis() {
|
||||
streamName: string,
|
||||
timeRange: { startTime: number; endTime: number },
|
||||
durationFilter:
|
||||
| { start: number; end: number; timeStart?: number; timeEnd?: number }
|
||||
| null
|
||||
| undefined,
|
||||
{ start: number; end: number; timeStart?: number; timeEnd?: number } | null | undefined,
|
||||
baseFilter?: string,
|
||||
applyDurationFilter: boolean = true,
|
||||
) => {
|
||||
|
||||
@@ -487,8 +487,7 @@ export const logsUtils = () => {
|
||||
} else {
|
||||
// else preserve existing visualization data from the current URL
|
||||
const existingEncodedConfig = router.currentRoute.value?.query?.visualization_data as
|
||||
| string
|
||||
| undefined;
|
||||
string | undefined;
|
||||
if (existingEncodedConfig) {
|
||||
query["visualization_data"] = existingEncodedConfig;
|
||||
}
|
||||
@@ -507,8 +506,7 @@ export const logsUtils = () => {
|
||||
} else {
|
||||
// else preserve existing build data from the current URL
|
||||
const existingEncodedBuildConfig = router.currentRoute.value?.query?.build_data as
|
||||
| string
|
||||
| undefined;
|
||||
string | undefined;
|
||||
if (existingEncodedBuildConfig) {
|
||||
query["build_data"] = existingEncodedBuildConfig;
|
||||
}
|
||||
|
||||
@@ -16,12 +16,7 @@ import { computed, ref } from "vue";
|
||||
|
||||
// Canonical keys for every pinnable item in the logs More menu.
|
||||
export type ToolbarPinKey =
|
||||
| "histogram"
|
||||
| "sqlMode"
|
||||
| "quickMode"
|
||||
| "functionEditor"
|
||||
| "savedViews"
|
||||
| "syntaxGuide";
|
||||
"histogram" | "sqlMode" | "quickMode" | "functionEditor" | "savedViews" | "syntaxGuide";
|
||||
|
||||
// Fixed left-to-right render order for pinned controls. Pinning never changes an
|
||||
// item's position — it only toggles whether the item is shown outside the menu.
|
||||
|
||||
@@ -263,8 +263,7 @@ const useTraces = () => {
|
||||
const key = `${identifier}_${searchObj.data.stream.selectedStream.value}`;
|
||||
// storage ref .value is typed {} at this boundary; narrow to the stored map shape
|
||||
const stored = useLocalTraceFilterField()?.value as
|
||||
| Record<string, Record<string, string[]>>
|
||||
| undefined;
|
||||
Record<string, Record<string, string[]>> | undefined;
|
||||
const saved: Record<string, string[]> | undefined = stored?.[key];
|
||||
|
||||
const fields: string[] = saved?.[searchMode]?.length
|
||||
|
||||
@@ -214,7 +214,7 @@ describe("useWebSocket", () => {
|
||||
const id = uid("create");
|
||||
const handle = connectAndWrap(id, "ws://localhost:8080");
|
||||
expect(handle.raw).toBeDefined();
|
||||
expect(handle.raw.url).toBe("ws://localhost:8080");
|
||||
expect(handle.raw.url).toBe("ws://localhost:8080/");
|
||||
});
|
||||
|
||||
it("stores a socket in the registry for a valid wss:// URL", () => {
|
||||
|
||||
@@ -185,8 +185,7 @@
|
||||
<!-- Hard cap the filter condition height; longer conditions scroll. -->
|
||||
<pre
|
||||
class="text-compact text-text-body m-0 max-h-50 overflow-x-auto overflow-y-auto px-3.5 py-2.5 font-mono leading-[1.6] whitespace-pre-wrap"
|
||||
>{{ filterText || t("onlineEvals.job.detail.filterEmpty") }}</pre
|
||||
>
|
||||
>{{ filterText || t("onlineEvals.job.detail.filterEmpty") }}</pre>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
@@ -639,8 +639,7 @@
|
||||
<pre
|
||||
class="rounded-default bg-card-bg border-border-default text-text-body m-0 max-h-[60vh] overflow-auto border p-3 font-mono text-xs font-normal whitespace-pre [tab-size:2]"
|
||||
v-else
|
||||
>{{ schemaPreview }}</pre
|
||||
>
|
||||
>{{ schemaPreview }}</pre>
|
||||
|
||||
<template #footer>
|
||||
<div class="flex w-full items-center justify-between gap-2">
|
||||
@@ -1208,9 +1207,7 @@ function initForm(row: Scorer | null, scorerType: ScorerType): ScorerForm {
|
||||
.map((f) => ({
|
||||
name: String(f.name || ""),
|
||||
type: (f.type === "number" || f.type === "boolean" ? f.type : "string") as
|
||||
| "string"
|
||||
| "number"
|
||||
| "boolean",
|
||||
"string" | "number" | "boolean",
|
||||
description: String(f.description || ""),
|
||||
}))
|
||||
: [],
|
||||
|
||||
@@ -142,8 +142,7 @@
|
||||
</summary>
|
||||
<pre
|
||||
class="text-text-secondary text-2xs m-0 mt-1.5 font-mono font-normal break-words whitespace-pre-wrap"
|
||||
>{{ rawResponseText }}</pre
|
||||
>
|
||||
>{{ rawResponseText }}</pre>
|
||||
</details>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -14,10 +14,7 @@ export type CheckboxColor = "primary" | "negative";
|
||||
*/
|
||||
export type CheckboxPrimitive = string | number;
|
||||
export type CheckboxModelValue =
|
||||
| boolean
|
||||
| "indeterminate"
|
||||
| CheckboxPrimitive
|
||||
| CheckboxPrimitive[];
|
||||
boolean | "indeterminate" | CheckboxPrimitive | CheckboxPrimitive[];
|
||||
|
||||
export interface CheckboxProps {
|
||||
/** Current checked state. Use `true`, `false`, or `'indeterminate'` */
|
||||
|
||||
@@ -384,7 +384,7 @@ const alignClasses: Record<NonNullable<OTabsProps["align"]>, string> = {
|
||||
<!-- Scrollbar hidden: the arrows stay the visible affordance. -->
|
||||
<div
|
||||
ref="scrollRef"
|
||||
class="relative flex-1 overflow-x-auto pt-0.75 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden"
|
||||
class="relative flex-1 [scrollbar-width:none] overflow-x-auto pt-0.75 [&::-webkit-scrollbar]:hidden"
|
||||
>
|
||||
<TabsList as-child :loop="true">
|
||||
<div
|
||||
|
||||
@@ -1650,8 +1650,7 @@ const subjectMatchCounts = computed<Record<string, number>>(() => {
|
||||
if (seen.has(stream.stream_name)) continue;
|
||||
seen.add(stream.stream_name);
|
||||
const schema = cachedSchemas[stream.stream_name]?.schema as
|
||||
| Array<{ name: string }>
|
||||
| undefined;
|
||||
Array<{ name: string }> | undefined;
|
||||
if (schema && schema.length > 0 && subjectFieldAliases.size > 0) {
|
||||
if (schema.some((c) => subjectFieldAliases.has(c.name))) matchCount++;
|
||||
} else if (streamMatchesPatterns(stream.stream_name, button.poolPatterns)) {
|
||||
|
||||
@@ -2325,13 +2325,11 @@ export default defineComponent({
|
||||
// The dialog body unmounts on close + remounts on open; the form is created
|
||||
// here (owner pattern), so re-seed it to "create" mode on open. The
|
||||
// OFormToggleGroup changes the mode within the open session.
|
||||
const savedFunctionDefaults = computed(
|
||||
(): SavedFunctionForm => ({
|
||||
isSavedFunctionAction: "create",
|
||||
savedFunctionName: "",
|
||||
savedFunctionSelectedName: "",
|
||||
}),
|
||||
);
|
||||
const savedFunctionDefaults = computed((): SavedFunctionForm => ({
|
||||
isSavedFunctionAction: "create",
|
||||
savedFunctionName: "",
|
||||
savedFunctionSelectedName: "",
|
||||
}));
|
||||
|
||||
// Owner-pattern form (Rule ③): SearchBar OWNS this <OForm> and its dialog
|
||||
// body needs the create/update mode to drive a v-if. We create the form here
|
||||
@@ -2446,13 +2444,11 @@ export default defineComponent({
|
||||
// savedViewSchema).
|
||||
const savedViewFormRef = ref<any>(null);
|
||||
const savedViewSchema = makeSavedViewSchema(t);
|
||||
const savedViewDefaults = computed(
|
||||
(): SavedViewForm => ({
|
||||
isSavedViewAction: isSavedViewAction.value,
|
||||
savedViewName: "",
|
||||
savedViewSelectedName: "",
|
||||
}),
|
||||
);
|
||||
const savedViewDefaults = computed((): SavedViewForm => ({
|
||||
isSavedViewAction: isSavedViewAction.value,
|
||||
savedViewName: "",
|
||||
savedViewSelectedName: "",
|
||||
}));
|
||||
const showExplainDialog = ref(false);
|
||||
const confirmDelete = ref(false);
|
||||
const deleteViewID = ref("");
|
||||
|
||||
@@ -175,8 +175,7 @@
|
||||
<pre
|
||||
v-else
|
||||
class="text-compact m-0 font-mono leading-[1.6] break-words whitespace-pre-wrap"
|
||||
>{{ row?.sql }}</pre
|
||||
>
|
||||
>{{ row?.sql }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -218,8 +217,7 @@
|
||||
<pre
|
||||
v-else
|
||||
class="text-compact m-0 font-mono leading-[1.6] break-words whitespace-pre-wrap"
|
||||
>{{ row?.function }}</pre
|
||||
>
|
||||
>{{ row?.function }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -389,8 +389,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<pre
|
||||
class="text-compact m-0 font-mono leading-[1.6] break-words whitespace-pre-wrap"
|
||||
data-test="inspector-sql-query-content"
|
||||
>{{ profileData?.sql || t("logs.searchJobInspector.noSqlAvailable") }}</pre
|
||||
>
|
||||
>{{ profileData?.sql || t("logs.searchJobInspector.noSqlAvailable") }}</pre>
|
||||
</div>
|
||||
</ODrawer>
|
||||
|
||||
|
||||
@@ -474,8 +474,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<pre
|
||||
v-if="isFunctionErrorOpen"
|
||||
class="text-status-warning-text mt-1 break-words whitespace-pre-wrap"
|
||||
>{{ searchObj?.data?.functionError }}</pre
|
||||
>
|
||||
>{{ searchObj?.data?.functionError }}</pre>
|
||||
</div>
|
||||
|
||||
<!-- Row/cell actions live in a right-click context menu as well as the
|
||||
|
||||
@@ -164,8 +164,7 @@
|
||||
<pre
|
||||
v-else
|
||||
class="text-compact m-0 font-mono leading-[1.6] break-words whitespace-pre-wrap"
|
||||
>{{ row?.sql }}</pre
|
||||
>
|
||||
>{{ row?.sql }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -206,8 +205,7 @@
|
||||
<pre
|
||||
v-else
|
||||
class="text-compact m-0 font-mono leading-[1.6] break-words whitespace-pre-wrap"
|
||||
>{{ row?.function }}</pre
|
||||
>
|
||||
>{{ row?.function }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -98,8 +98,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<div v-else-if="isPlainText" class="text-content">
|
||||
<pre
|
||||
class="plain-text-content text-compact bg-code-bg rounded-default m-0 overflow-x-auto p-2 font-mono leading-normal wrap-break-word whitespace-pre-wrap"
|
||||
>{{ contentStats.previewText }}</pre
|
||||
>
|
||||
>{{ contentStats.previewText }}</pre>
|
||||
</div>
|
||||
<div v-else class="json-content">
|
||||
<CodeQueryEditor
|
||||
@@ -194,8 +193,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<div v-else-if="isPlainText" class="text-content">
|
||||
<pre
|
||||
class="plain-text-content text-compact bg-code-bg rounded-default m-0 overflow-x-auto p-2 font-mono leading-normal wrap-break-word whitespace-pre-wrap"
|
||||
>{{ fullText }}</pre
|
||||
>
|
||||
>{{ fullText }}</pre>
|
||||
</div>
|
||||
<div v-else class="json-content h-full">
|
||||
<CodeQueryEditor
|
||||
|
||||
@@ -87,8 +87,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</div>
|
||||
<pre
|
||||
class="thread-tool-body__pre bg-surface-base border-border-default text-text-body border"
|
||||
>{{ formatToolPayload(getInputRaw(tool) || tool.tool_args) }}</pre
|
||||
>
|
||||
>{{ formatToolPayload(getInputRaw(tool) || tool.tool_args) }}</pre>
|
||||
</div>
|
||||
<div class="thread-tool-body__section">
|
||||
<div class="thread-tool-body__label text-text-secondary">
|
||||
@@ -103,8 +102,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
formatToolPayload(getOutputRaw(tool)) ||
|
||||
tool.status_message ||
|
||||
t("traces.threadToolCalls.empty")
|
||||
}}</pre
|
||||
>
|
||||
}}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -533,7 +533,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/>
|
||||
<div
|
||||
ref="traceScrollContainer"
|
||||
class="relative-position trace-content-scroll min-h-0! max-w-full! flex-1! overflow-x-hidden! overflow-y-auto! [scrollbar-gutter:stable]!"
|
||||
class="relative-position trace-content-scroll min-h-0! max-w-full! flex-1! [scrollbar-gutter:stable]! overflow-x-hidden! overflow-y-auto!"
|
||||
:style="{
|
||||
width: isSidebarOpen ? leftWidth + 'px' : '100%',
|
||||
}"
|
||||
@@ -1999,12 +1999,10 @@ export default defineComponent({
|
||||
endTime = Math.ceil(res.data.hits[0].end_time / 1000);
|
||||
|
||||
// If the trace is not in the current time range, update the time range
|
||||
if (
|
||||
!(
|
||||
startTime >= Number(router.currentRoute.value.query.from) &&
|
||||
endTime <= Number(router.currentRoute.value.query.to)
|
||||
)
|
||||
) {
|
||||
if (!(
|
||||
startTime >= Number(router.currentRoute.value.query.from) &&
|
||||
endTime <= Number(router.currentRoute.value.query.to)
|
||||
)) {
|
||||
updateUrlQueryParams({
|
||||
from: startTime,
|
||||
to: endTime,
|
||||
|
||||
@@ -39,12 +39,7 @@ import {
|
||||
export type LLMPanelType = "stacked-area" | "stacked-bar" | "horizontal-bar" | "table";
|
||||
|
||||
export type LLMTableColumnFormat =
|
||||
| "time"
|
||||
| "service-chip"
|
||||
| "error"
|
||||
| "cost"
|
||||
| "view-link"
|
||||
| "text";
|
||||
"time" | "service-chip" | "error" | "cost" | "view-link" | "text";
|
||||
|
||||
export interface LLMTableColumn {
|
||||
/** Hit field used as the value source. May be omitted for "view-link". */
|
||||
|
||||
@@ -29,11 +29,7 @@ export interface CreateBackfillJobResponse {
|
||||
}
|
||||
|
||||
export type DeletionStatus =
|
||||
| "not_required"
|
||||
| "pending"
|
||||
| "in_progress"
|
||||
| "completed"
|
||||
| { failed: string };
|
||||
"not_required" | "pending" | "in_progress" | "completed" | { failed: string };
|
||||
|
||||
export interface BackfillJob {
|
||||
job_id: string;
|
||||
|
||||
@@ -20,12 +20,7 @@ export interface Group {
|
||||
}
|
||||
|
||||
export type PermissionType =
|
||||
| "AllowAll"
|
||||
| "AllowDelete"
|
||||
| "AllowGet"
|
||||
| "AllowList"
|
||||
| "AllowPost"
|
||||
| "AllowPut";
|
||||
"AllowAll" | "AllowDelete" | "AllowGet" | "AllowList" | "AllowPost" | "AllowPut";
|
||||
|
||||
export interface Permission {
|
||||
object: string; // stream:geo or stream:org_id
|
||||
|
||||
@@ -362,8 +362,7 @@ export interface RecorderPortMessage {
|
||||
|
||||
/** Anything the extension can post over the port (data push + command acks). */
|
||||
export type RecorderPortInbound =
|
||||
| RecorderPortMessage
|
||||
| { type: "synthetics-response"; response: unknown };
|
||||
RecorderPortMessage | { type: "synthetics-response"; response: unknown };
|
||||
|
||||
// ---- Bridge transport types (content-script relay, replaces chrome.runtime.*) ----
|
||||
|
||||
|
||||
@@ -107,15 +107,7 @@ export interface ConversionContext {
|
||||
* Aggregation function type for single-value charts
|
||||
*/
|
||||
export type AggregationFunction =
|
||||
| "last"
|
||||
| "first"
|
||||
| "min"
|
||||
| "max"
|
||||
| "avg"
|
||||
| "sum"
|
||||
| "count"
|
||||
| "range"
|
||||
| "diff";
|
||||
"last" | "first" | "min" | "max" | "avg" | "sum" | "count" | "range" | "diff";
|
||||
|
||||
/**
|
||||
* Configuration options for table charts
|
||||
|
||||
@@ -27,9 +27,7 @@ export interface SelectedDate {
|
||||
}
|
||||
|
||||
export type TimeQueryParams =
|
||||
| { period: string }
|
||||
| { from: number | string; to: number | string }
|
||||
| Record<string, never>;
|
||||
{ period: string } | { from: number | string; to: number | string } | Record<string, never>;
|
||||
|
||||
// URL params -> selectedDate (period wins, else from/to, else relative 15m).
|
||||
export const queryParamsToSelectedDate = (
|
||||
|
||||
@@ -17,13 +17,7 @@ import type { I18nKey, I18nText } from "@/types/i18n";
|
||||
* Prebuilt destination types
|
||||
*/
|
||||
export type PrebuiltTypeId =
|
||||
| "slack"
|
||||
| "discord"
|
||||
| "msteams"
|
||||
| "pagerduty"
|
||||
| "servicenow"
|
||||
| "email"
|
||||
| "opsgenie";
|
||||
"slack" | "discord" | "msteams" | "pagerduty" | "servicenow" | "email" | "opsgenie";
|
||||
|
||||
/**
|
||||
* A user-facing validation message, expressed as an i18n KEY (+ optional
|
||||
|
||||
@@ -39,14 +39,7 @@
|
||||
|
||||
/** Names of monaco's CompletionItemKind members that we actually use. */
|
||||
export type CompletionKindName =
|
||||
| "Function"
|
||||
| "Keyword"
|
||||
| "Operator"
|
||||
| "Field"
|
||||
| "Value"
|
||||
| "Variable"
|
||||
| "Snippet"
|
||||
| "Text";
|
||||
"Function" | "Keyword" | "Operator" | "Field" | "Value" | "Variable" | "Snippet" | "Text";
|
||||
|
||||
/** Names of monaco's CompletionItemInsertTextRule members. */
|
||||
export type InsertTextRuleName = "InsertAsSnippet" | "KeepWhitespace" | "None";
|
||||
|
||||
@@ -35,14 +35,7 @@
|
||||
|
||||
/** The kind an entity is classified into. RPC is a first-class dependency. */
|
||||
export type EntityKind =
|
||||
| "service"
|
||||
| "datastore"
|
||||
| "queue"
|
||||
| "external"
|
||||
| "rpc"
|
||||
| "agent"
|
||||
| "tool"
|
||||
| "model";
|
||||
"service" | "datastore" | "queue" | "external" | "rpc" | "agent" | "tool" | "model";
|
||||
|
||||
/** The inferred types we branch on explicitly. */
|
||||
export type KnownInferType = "database" | "queue" | "external" | "rpc";
|
||||
|
||||
@@ -416,12 +416,10 @@ export default defineComponent({
|
||||
};
|
||||
|
||||
const previousJoins =
|
||||
currentQuery.joins?.slice(0, props.joinIndex)?.map(
|
||||
(join: any): StreamReference => ({
|
||||
stream: join.stream,
|
||||
streamAlias: join.streamAlias,
|
||||
}),
|
||||
) ?? [];
|
||||
currentQuery.joins?.slice(0, props.joinIndex)?.map((join: any): StreamReference => ({
|
||||
stream: join.stream,
|
||||
streamAlias: join.streamAlias,
|
||||
})) ?? [];
|
||||
|
||||
return [mainStream, ...previousJoins];
|
||||
} catch (error) {
|
||||
@@ -437,12 +435,10 @@ export default defineComponent({
|
||||
try {
|
||||
const response = (await getStreams(streamType, false)) as GetStreamsResponse;
|
||||
|
||||
streamOptions.value = response.list.map(
|
||||
(stream: StreamListEntry): StreamOption => ({
|
||||
label: raw(stream.name),
|
||||
value: stream.name,
|
||||
}),
|
||||
);
|
||||
streamOptions.value = response.list.map((stream: StreamListEntry): StreamOption => ({
|
||||
label: raw(stream.name),
|
||||
value: stream.name,
|
||||
}));
|
||||
|
||||
// Select first stream if no stream is selected or current stream is invalid
|
||||
if (streamOptions.value.length > 0) {
|
||||
|
||||
@@ -756,9 +756,9 @@ export default defineComponent({
|
||||
}
|
||||
|
||||
// if variables data is null, set it to empty list
|
||||
if (
|
||||
!(currentDashboardData.data?.variables && currentDashboardData.data?.variables?.list.length)
|
||||
) {
|
||||
if (!(
|
||||
currentDashboardData.data?.variables && currentDashboardData.data?.variables?.list.length
|
||||
)) {
|
||||
variablesData.isVariablesLoading = false;
|
||||
variablesData.values = [];
|
||||
}
|
||||
|
||||
@@ -174,7 +174,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</div>
|
||||
<div
|
||||
ref="svcGridRef"
|
||||
class="flex flex-row gap-2 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden"
|
||||
class="flex [scrollbar-width:none] flex-row gap-2 overflow-x-auto [&::-webkit-scrollbar]:hidden"
|
||||
@scroll="onSvcScroll"
|
||||
>
|
||||
<div
|
||||
|
||||
@@ -34,8 +34,7 @@
|
||||
<OCardSection>
|
||||
<pre
|
||||
class="text-text-link m-0 p-3 font-mono text-sm leading-relaxed font-medium wrap-break-word whitespace-pre-wrap"
|
||||
>{{ generatedQuery || t("metrics.queryBuilder.noQueryBuilt") }}</pre
|
||||
>
|
||||
>{{ generatedQuery || t("metrics.queryBuilder.noQueryBuilt") }}</pre>
|
||||
</OCardSection>
|
||||
</OCard>
|
||||
|
||||
@@ -74,8 +73,7 @@
|
||||
<OCardSection>
|
||||
<pre
|
||||
class="text-text-body m-0 max-h-100 overflow-y-auto p-3 font-mono text-sm leading-relaxed wrap-break-word whitespace-pre-wrap"
|
||||
>{{ queryResult }}</pre
|
||||
>
|
||||
>{{ queryResult }}</pre>
|
||||
</OCardSection>
|
||||
</OCard>
|
||||
</OCardSection>
|
||||
|
||||
@@ -191,9 +191,9 @@ export default defineComponent({
|
||||
currentDashboardData.data = overviewDashboard;
|
||||
|
||||
// if variables data is null, set it to empty list
|
||||
if (
|
||||
!(currentDashboardData.data?.variables && currentDashboardData.data?.variables?.list.length)
|
||||
) {
|
||||
if (!(
|
||||
currentDashboardData.data?.variables && currentDashboardData.data?.variables?.list.length
|
||||
)) {
|
||||
variablesData.isVariablesLoading = false;
|
||||
variablesData.values = [];
|
||||
}
|
||||
|
||||
@@ -122,15 +122,13 @@ const uploadSourceMapsSchema = makeUploadSourceMapsSchema(t);
|
||||
// Dynamic (query-param prefill) defaults → a typed component computed. The
|
||||
// service/version/environment are seeded from the route query; `file` always
|
||||
// starts empty.
|
||||
const uploadSourceMapsDefaults = computed(
|
||||
(): UploadSourceMapsForm => ({
|
||||
service: (route.query.service as string) || "",
|
||||
version: (route.query.version as string) || "",
|
||||
environment: (route.query.environment as string) || "",
|
||||
// Empty file slot at init; schema is `.nullable()` so null is valid at runtime.
|
||||
file: null as unknown as File,
|
||||
}),
|
||||
);
|
||||
const uploadSourceMapsDefaults = computed((): UploadSourceMapsForm => ({
|
||||
service: (route.query.service as string) || "",
|
||||
version: (route.query.version as string) || "",
|
||||
environment: (route.query.environment as string) || "",
|
||||
// Empty file slot at init; schema is `.nullable()` so null is valid at runtime.
|
||||
file: null as unknown as File,
|
||||
}));
|
||||
|
||||
// Navigate back to source maps list
|
||||
const navigateBack = () => {
|
||||
|
||||
@@ -284,8 +284,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
v-if="stackOpen && currentRun.errorStack"
|
||||
class="text-2xs text-text-body bg-code-bg rounded-default mt-2 overflow-auto p-[10px_12px] font-mono leading-[1.6] whitespace-pre-wrap"
|
||||
data-test="synthetics-run-detail-error-stack"
|
||||
>{{ currentRun.errorStack }}</pre
|
||||
>
|
||||
>{{ currentRun.errorStack }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -479,8 +478,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
!expandedStepErrors.has(row.id) &&
|
||||
(row.error?.length ?? 0) > 200,
|
||||
}"
|
||||
>{{ row.error }}</pre
|
||||
>
|
||||
>{{ row.error }}</pre>
|
||||
<div class="mt-1.5 flex items-center gap-2">
|
||||
<OButton
|
||||
v-if="(row.error?.length ?? 0) > 200"
|
||||
|
||||
Reference in New Issue
Block a user