diff --git a/ui-ngx/package.json b/ui-ngx/package.json index 74c29bf00e..c37706b5e0 100644 --- a/ui-ngx/package.json +++ b/ui-ngx/package.json @@ -59,7 +59,7 @@ "flot.curvedlines": "https://github.com/MichaelZinsmaier/CurvedLines.git#master", "font-awesome": "^4.7.0", "html2canvas": "^1.4.1", - "jquery": "^3.6.3", + "jquery": "^3.7.1", "jquery.terminal": "^2.35.3", "js-beautify": "1.14.7", "json-schema-defaults": "^0.4.0", @@ -127,7 +127,7 @@ "@types/flowjs": "^2.13.9", "@types/jasmine": "~3.10.2", "@types/jasminewd2": "^2.0.10", - "@types/jquery": "^3.5.16", + "@types/jquery": "^3.5.30", "@types/js-beautify": "^1.13.3", "@types/leaflet": "1.8.0", "@types/leaflet-polylinedecorator": "1.6.4", diff --git a/ui-ngx/src/app/app.component.ts b/ui-ngx/src/app/app.component.ts index 9ac5bc79a1..dcc33dcbd9 100644 --- a/ui-ngx/src/app/app.component.ts +++ b/ui-ngx/src/app/app.component.ts @@ -32,6 +32,7 @@ import { AuthService } from '@core/auth/auth.service'; import { svgIcons, svgIconsUrl } from '@shared/models/icon.models'; import { ActionSettingsChangeLanguage } from '@core/settings/settings.actions'; import { SETTINGS_KEY } from '@core/settings/settings.effects'; +import { initCustomJQueryEvents } from '@shared/models/jquery-event.models'; @Component({ selector: 'tb-root', @@ -74,6 +75,8 @@ export class AppComponent implements OnInit { this.setupTranslate(); this.setupAuth(); + + initCustomJQueryEvents(); } setupTranslate() { diff --git a/ui-ngx/src/app/modules/home/components/dashboard/dashboard.component.html b/ui-ngx/src/app/modules/home/components/dashboard/dashboard.component.html index 33c8d659f6..16498100ae 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard/dashboard.component.html +++ b/ui-ngx/src/app/modules/home/components/dashboard/dashboard.component.html @@ -27,7 +27,7 @@ [class.center-vertical]="centerVertical" [class.center-horizontal]="centerHorizontal" (mousedown)="onDashboardMouseDown($event)" - (contextmenu)="openDashboardContextMenu($event)"> + (tbcontextmenu)="openDashboardContextMenu($event)">
defaultSubscription property of widget context (ctx).',
+ 'the defaultSubscription property of widget context (ctx).',
meta: 'function'
},
onResize: {
- description: 'Called when widget container is resized. Latest width and height can be obtained from widget context (ctx).',
+ description: 'Called when widget container is resized. Latest width and height can be obtained from widget context (ctx).',
meta: 'function'
},
onEditModeChanged: {
- description: 'Called when dashboard editing mode is changed. Latest mode is handled by isEdit property of widget context (ctx).',
+ description: 'Called when dashboard editing mode is changed. Latest mode is handled by isEdit property of widget context (ctx).',
meta: 'function'
},
onMobileModeChanged: {
- description: 'Called when dashboard view width crosses mobile breakpoint. Latest state is handled by isMobile property of widget context (ctx).',
+ description: 'Called when dashboard view width crosses mobile breakpoint. Latest state is handled by isMobile property of widget context (ctx).',
meta: 'function'
},
onDestroy: {
@@ -51,7 +51,7 @@ const widgetEditorCompletions: TbEditorCompletions = {
meta: 'function'
},
getSettingsSchema: {
- description: 'Optional function returning widget settings schema json as alternative to Settings tab of Settings schema section.',
+ description: 'Optional function returning widget settings schema json as alternative to Settings tab of Settings schema section.',
meta: 'function',
return: {
description: 'An widget settings schema json',
@@ -59,7 +59,7 @@ const widgetEditorCompletions: TbEditorCompletions = {
}
},
getDataKeySettingsSchema: {
- description: 'Optional function returning particular data key settings schema json as alternative to Data key settings schema of Settings schema section.',
+ description: 'Optional function returning particular data key settings schema json as alternative to Data key settings schema of Settings schema section.',
meta: 'function',
return: {
description: 'A particular data key settings schema json',
@@ -71,7 +71,7 @@ const widgetEditorCompletions: TbEditorCompletions = {
meta: 'function',
return: {
description: 'An object describing widget datasource parameters.',
- type: 'WidgetTypeParameters'
+ type: 'WidgetTypeParameters'
}
},
actionSources: {
@@ -79,7 +79,7 @@ const widgetEditorCompletions: TbEditorCompletions = {
meta: 'function',
return: {
description: 'A map of action sources by action source id.',
- type: '{[actionSourceId: string]: WidgetActionSource}'
+ type: '{[actionSourceId: string]: WidgetActionSource}'
}
}
},
diff --git a/ui-ngx/src/app/shared/directives/context-menu.directive.ts b/ui-ngx/src/app/shared/directives/context-menu.directive.ts
new file mode 100644
index 0000000000..ada727cfe2
--- /dev/null
+++ b/ui-ngx/src/app/shared/directives/context-menu.directive.ts
@@ -0,0 +1,35 @@
+///
+/// Copyright © 2016-2024 The Thingsboard Authors
+///
+/// Licensed under the Apache License, Version 2.0 (the "License");
+/// you may not use this file except in compliance with the License.
+/// You may obtain a copy of the License at
+///
+/// http://www.apache.org/licenses/LICENSE-2.0
+///
+/// Unless required by applicable law or agreed to in writing, software
+/// distributed under the License is distributed on an "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+/// See the License for the specific language governing permissions and
+/// limitations under the License.
+///
+
+import { Directive, ElementRef, EventEmitter, OnDestroy, Output } from '@angular/core';
+import { TbContextMenuEvent } from '@shared/models/jquery-event.models';
+
+@Directive({
+ selector: '[tbcontextmenu]'
+})
+export class ContextMenuDirective implements OnDestroy {
+
+ @Output()
+ tbcontextmenu = new EventEmitterAggregationType == \'NONE\')',
@@ -132,7 +132,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
ctx: {
description: 'A reference to widget context that has all necessary APIcolor (text color), backgroundColor (widget background color), etc.',
meta: 'property',
- type: 'WidgetConfig',
+ type: 'WidgetConfig',
children: {
title: {
description: 'Widget title.',
@@ -233,17 +233,17 @@ export const widgetContextCompletions: TbEditorCompletions = {
legendConfig: {
description: 'Legend configuration.',
meta: 'property',
- type: 'LegendConfig',
+ type: 'LegendConfig',
children: {
position: {
description: 'Legend position. Possible values: \'top\', \'bottom\', \'left\', \'right\'',
meta: 'property',
- type: 'LegendPosition',
+ type: 'LegendPosition',
},
direction: {
description: 'Legend direction. Possible values: \'column\', \'row\'',
meta: 'property',
- type: 'LegendDirection',
+ type: 'LegendDirection',
},
showMin: {
description: 'Whether to display aggregated min values.',
@@ -331,12 +331,12 @@ export const widgetContextCompletions: TbEditorCompletions = {
alarmSource: {
description: 'Configured alarm source for alarm widget type.',
meta: 'property',
- type: 'Datasource'
+ type: 'Datasource'
},
alarmSearchStatus: {
description: 'Configured default alarm search status for alarm widget type.',
meta: 'property',
- type: 'AlarmSearchStatus'
+ type: 'AlarmSearchStatus'
},
alarmsPollingInterval: {
description: 'Configured alarms polling interval for alarm widget type.',
@@ -356,29 +356,29 @@ export const widgetContextCompletions: TbEditorCompletions = {
datasources: {
description: 'Array of configured widget datasources.',
meta: 'property',
- type: 'Array<Datasource>'
+ type: 'Array<Datasource>'
}
}
},
settings: {
- description: 'Widget settings containing widget specific properties according to the defined settings json schema',
+ description: 'Widget settings containing widget specific properties according to the defined settings json schema',
meta: 'property',
type: 'object'
},
datasources: {
description: 'Array of resolved widget datasources.',
meta: 'property',
- type: 'Array<Datasource>'
+ type: 'Array<Datasource>'
},
data: {
description: 'Array of latest datasources data.',
meta: 'property',
- type: 'Array<DatasourceData>'
+ type: 'Array<DatasourceData>'
},
timeWindow: {
description: 'Current widget timewindow (applicable for timeseries widgets).',
meta: 'property',
- type: 'WidgetTimewindow'
+ type: 'WidgetTimewindow'
},
units: {
description: 'Optional property defining units text of values displayed by widget. Useful for simple widgets like cards or gauges.',
@@ -393,7 +393,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
currentUser: {
description: 'Current user object.',
meta: 'property',
- type: 'AuthUser',
+ type: 'AuthUser',
children: {
sub: {
description: 'User subject (email).',
@@ -443,7 +443,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
authority: {
description: 'User authority. Possible values: SYS_ADMIN, TENANT_ADMIN, CUSTOMER_USER',
meta: 'property',
- type: 'Authority'
+ type: 'Authority'
}
}
},
@@ -468,12 +468,12 @@ export const widgetContextCompletions: TbEditorCompletions = {
defaultSubscription: {
description: 'Default widget subscription object contains all subscription information,startTimeMs and endTimeMs arguments.',
@@ -500,7 +500,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
controlApi: {
description: 'Object that provides API functions for RPC (Control) widgets.',
meta: 'property',
- type: 'RpcApi',
+ type: 'RpcApi',
children: {
sendOneWayCommand: {
description: 'Sends one way (without response) RPC command to the device.',
@@ -585,7 +585,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
actionsApi: {
description: 'Set of API functions to work with user defined actions.',
meta: 'property',
- type: 'WidgetActionsApi',
+ type: 'WidgetActionsApi',
children: {
getActionDescriptors: {
description: 'Get list of action descriptors for provided actionSourceId.',
@@ -599,7 +599,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
],
return: {
description: 'The list of action descriptors',
- type: 'Array<WidgetActionDescriptor>'
+ type: 'Array<WidgetActionDescriptor>'
}
},
handleWidgetAction: {
@@ -614,7 +614,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
{
name: 'descriptor',
description: 'An action descriptor.',
- type: 'WidgetActionDescriptor'
+ type: 'WidgetActionDescriptor'
},
{
name: 'entityId',
@@ -635,7 +635,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
stateController: {
description: 'Reference to Dashboard state controller, providing API to manage current dashboard state.',
meta: 'property',
- type: 'IStateController',
+ type: 'IStateController',
children: {
openState: {
description: 'Navigate to new dashboard state.',
@@ -649,7 +649,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
{
name: 'params',
description: 'An object with state parameters to use by the new state.',
- type: 'StateParams',
+ type: 'StateParams',
optional: true
},
{
@@ -667,7 +667,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
{
name: 'id',
description: 'An array state object of the target dashboard state.',
- type: 'Array StateObject',
+ type: 'Array StateObject',
},
{
name: 'openRightLayout',
@@ -690,7 +690,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
{
name: 'params',
description: 'An object with state parameters to update current state parameters.',
- type: 'StateParams',
+ type: 'StateParams',
optional: true
},
{
@@ -714,7 +714,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
meta: 'function',
return: {
description: 'current dashboard state parameters.',
- type: 'StateParams'
+ type: 'StateParams'
}
},
getStateParamsByStateId: {
@@ -729,7 +729,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
],
return: {
description: 'current dashboard state parameters.',
- type: 'StateParams'
+ type: 'StateParams'
}
}
}
diff --git a/ui-ngx/src/app/shared/models/jquery-event.models.ts b/ui-ngx/src/app/shared/models/jquery-event.models.ts
new file mode 100644
index 0000000000..5657beb60b
--- /dev/null
+++ b/ui-ngx/src/app/shared/models/jquery-event.models.ts
@@ -0,0 +1,80 @@
+///
+/// Copyright © 2016-2024 The Thingsboard Authors
+///
+/// Licensed under the Apache License, Version 2.0 (the "License");
+/// you may not use this file except in compliance with the License.
+/// You may obtain a copy of the License at
+///
+/// http://www.apache.org/licenses/LICENSE-2.0
+///
+/// Unless required by applicable law or agreed to in writing, software
+/// distributed under the License is distributed on an "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+/// See the License for the specific language governing permissions and
+/// limitations under the License.
+///
+
+import Timeout = NodeJS.Timeout;
+
+export interface TbContextMenuEvent extends Event {
+ clientX: number;
+ clientY: number;
+ ctrlKey: boolean;
+ metaKey: boolean;
+}
+
+const isIOSDevice = (): boolean =>
+ /iPhone|iPad|iPod/i.test(navigator.userAgent) || (navigator.userAgent.includes('Mac') && 'ontouchend' in document);
+
+export const initCustomJQueryEvents = () => {
+ $.event.special.tbcontextmenu = {
+ setup(this: HTMLElement) {
+ const el = $(this);
+ if (isIOSDevice()) {
+ let timeoutId: Timeout;
+
+ el.on('touchstart', (e) => {
+ e.stopPropagation();
+ timeoutId = setTimeout(() => {
+ timeoutId = null;
+ e.stopPropagation();
+ const touch = e.originalEvent.changedTouches[0];
+ const event = $.Event('tbcontextmenu', {
+ clientX: touch.clientX,
+ clientY: touch.clientY,
+ ctrlKey: false,
+ metaKey: false
+ });
+ el.trigger(event, e);
+ }, 500);
+ });
+
+ el.on('touchend touchmove', () => {
+ if (timeoutId) {
+ clearTimeout(timeoutId);
+ }
+ });
+ } else {
+ el.on('contextmenu', (e) => {
+ e.preventDefault();
+ e.stopPropagation();
+ const event = $.Event('tbcontextmenu', {
+ clientX: e.originalEvent.clientX,
+ clientY: e.originalEvent.clientY,
+ ctrlKey: e.originalEvent.ctrlKey,
+ metaKey: e.originalEvent.metaKey,
+ });
+ el.trigger(event, e);
+ });
+ }
+ },
+ teardown(this: HTMLElement) {
+ const el = $(this);
+ if (isIOSDevice()) {
+ el.off('touchstart touchend touchmove');
+ } else {
+ el.off('contextmenu');
+ }
+ }
+ };
+};
diff --git a/ui-ngx/src/app/shared/shared.module.ts b/ui-ngx/src/app/shared/shared.module.ts
index 130e272c21..309a3e2bf3 100644
--- a/ui-ngx/src/app/shared/shared.module.ts
+++ b/ui-ngx/src/app/shared/shared.module.ts
@@ -68,6 +68,7 @@ import { NgxHmCarouselModule } from 'ngx-hm-carousel';
import { EditorModule, TINYMCE_SCRIPT_SRC } from '@tinymce/tinymce-angular';
import { UserMenuComponent } from '@shared/components/user-menu.component';
import { TruncateWithTooltipDirective } from '@shared/directives/truncate-with-tooltip.directive';
+import { ContextMenuDirective } from '@shared/directives/context-menu.directive';
import { NospacePipe } from '@shared/pipe/nospace.pipe';
import { TranslateModule } from '@ngx-translate/core';
import { TbCheckboxComponent } from '@shared/components/tb-checkbox.component';
@@ -371,6 +372,7 @@ export function MarkedOptionsFactory(markedOptionsService: MarkedOptionsService)
LedLightComponent,
MarkdownEditorComponent,
TruncateWithTooltipDirective,
+ ContextMenuDirective,
NospacePipe,
MillisecondsToTimeStringPipe,
EnumToArrayPipe,
@@ -633,6 +635,7 @@ export function MarkedOptionsFactory(markedOptionsService: MarkedOptionsService)
LedLightComponent,
MarkdownEditorComponent,
TruncateWithTooltipDirective,
+ ContextMenuDirective,
NospacePipe,
MillisecondsToTimeStringPipe,
EnumToArrayPipe,
diff --git a/ui-ngx/src/assets/dashboard/tenant_admin_home_page.json b/ui-ngx/src/assets/dashboard/tenant_admin_home_page.json
index e3277ac88a..59eb61a935 100644
--- a/ui-ngx/src/assets/dashboard/tenant_admin_home_page.json
+++ b/ui-ngx/src/assets/dashboard/tenant_admin_home_page.json
@@ -1208,7 +1208,7 @@
"dropShadow": false,
"enableFullscreen": false,
"widgetStyle": {},
- "widgetCss": " .tb-widget-container > .tb-widget > .tb-widget-content .tb-widget-title > .title-row > .title {\n padding: 0;\n}\n\n .tb-widget-container > .tb-widget > .tb-widget-content .tb-widget-title > .title-row > .title {\n padding-bottom: 8px;\n font-weight: 600;\n font-size: 20px;\n line-height: 24px;\n letter-spacing: 0.1px;\n color: rgba(0, 0, 0, 0.76);\n}\n\n.tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel {\n padding: 0;\n}\n\n@media screen and (min-width: 960px) and (max-width: 1819px) {\n .tb-widget-container > .tb-widget > .tb-widget-content .tb-widget-title > .title-row > .title {\n padding-bottom: 0;\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0.25px;\n }\n}\n\n@media screen and (min-width: 960px) and (max-width: 1182px) {\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel {\n gap: 0;\n }\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-qrcode {\n min-width: 150px;\n }\n}\n\n@media screen and (max-width: 960px) {\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-qrcode {\n max-width: 120px;\n }\n \n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-badges {\n max-width: 160px;\n }\n}\n\n@media screen and (min-width: 1819px) {\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-qrcode {\n max-width: 125px;\n }\n \n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-badges {\n max-width: 160px;\n }\n}\n\n@media screen and (min-width: 960px) and (max-height: 960px) {\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-qrcode-label {\n display: none;\n }\n}",
+ "widgetCss": " .tb-widget-container > .tb-widget > .tb-widget-content .tb-widget-title > .title-row > .title {\n padding: 0;\n}\n\n .tb-widget-container > .tb-widget > .tb-widget-content .tb-widget-title > .title-row > .title {\n padding-bottom: 8px;\n font-weight: 600;\n font-size: 20px;\n line-height: 24px;\n letter-spacing: 0.1px;\n color: rgba(0, 0, 0, 0.76);\n}\n\n.tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel {\n padding: 0;\n}\n\n@media screen and (min-width: 960px) and (max-width: 1819px) {\n .tb-widget-container > .tb-widget > .tb-widget-content .tb-widget-title > .title-row > .title {\n padding-bottom: 0;\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0.25px;\n }\n}\n\n@media screen and (min-width: 960px) and (max-width: 1182px) {\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel {\n gap: 0;\n }\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-qrcode {\n min-width: 150px;\n }\n}\n\n@media screen and (max-width: 960px) {\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-qrcode {\n max-width: 120px;\n }\n \n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-badges {\n max-width: 160px;\n }\n}\n\n@media screen and (min-width: 1819px) {\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-qrcode {\n max-width: 125px;\n }\n \n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-badges {\n max-width: 160px;\n }\n}\n\n@media screen and (min-width: 960px) and (max-height: 965px) {\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-qrcode-label {\n display: none;\n }\n}",
"showTitleIcon": false,
"titleTooltip": "",
"titleStyle": null,
diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json
index 95314ded5c..c66cc6dbd5 100644
--- a/ui-ngx/src/assets/locale/locale.constant-en_US.json
+++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json
@@ -3142,10 +3142,11 @@
"title": "{{type}} Connector RPC parameters",
"templates-title": "Connector RPC Templates",
"methodFilter": "Method filter",
+ "method-name": "Method name",
"requestTopicExpression": "Request topic expression",
"responseTopicExpression": "Response topic expression",
- "responseTimeout": "Response Time",
- "valueExpression": "Value Expression",
+ "responseTimeout": "Response timeout",
+ "valueExpression": "Value expression",
"tag": "Tag",
"type": "Type",
"functionCode": "Function Code",
@@ -3184,6 +3185,11 @@
"tries": "Tries",
"httpHeaders": "HTTP Headers",
"header-name": "Header name",
+ "hint": {
+ "modbus-response-reading": "RPC response will return all subtracted values from all connected devices when the reading functions are selected.",
+ "modbus-writing-functions": "RPC will write a filled value to all connected devices when the writing functions are selected.",
+ "opc-method": "A filled method name is the OPC-UA method that will processed on the server side (make sure your node has the requested method)."
+ },
"security-name": "Security name",
"value": "Value",
"security": "Security",
diff --git a/ui-ngx/src/typings/jquery.typings.d.ts b/ui-ngx/src/typings/jquery.typings.d.ts
index d457729ace..a058373022 100644
--- a/ui-ngx/src/typings/jquery.typings.d.ts
+++ b/ui-ngx/src/typings/jquery.typings.d.ts
@@ -14,6 +14,9 @@
/// limitations under the License.
///
+import { TbContextMenuEvent } from '@shared/models/jquery-event.models';
+
interface JQuery {
terminal(options?: any): any;
+ on(events: 'tbcontextmenu', handler: (e: TbContextMenuEvent) => void): this;
}
diff --git a/ui-ngx/yarn.lock b/ui-ngx/yarn.lock
index 51bfe8f56e..cc6762eb57 100644
--- a/ui-ngx/yarn.lock
+++ b/ui-ngx/yarn.lock
@@ -3052,10 +3052,10 @@
dependencies:
"@types/jasmine" "*"
-"@types/jquery@*", "@types/jquery@^3.5.16", "@types/jquery@^3.5.29":
- version "3.5.29"
- resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.29.tgz#3c06a1f519cd5fc3a7a108971436c00685b5dcea"
- integrity sha512-oXQQC9X9MOPRrMhPHHOsXqeQDnWeCDT3PelUIg/Oy8FAbzSZtFHRjc7IpbfFVmpLtJ+UOoywpRsuO5Jxjybyeg==
+"@types/jquery@*", "@types/jquery@^3.5.29", "@types/jquery@^3.5.30":
+ version "3.5.30"
+ resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.30.tgz#888d584cbf844d3df56834b69925085038fd80f7"
+ integrity sha512-nbWKkkyb919DOUxjmRVk8vwtDb0/k8FKncmUKFi+NY+QXqWltooxTrswvz4LspQwxvLdvzBN1TImr6cw3aQx2A==
dependencies:
"@types/sizzle" "*"
@@ -7377,7 +7377,7 @@ jquery.terminal@^2.35.3:
optionalDependencies:
fsevents "^2.3.2"
-jquery@>=1.9.1, jquery@^3.5.0, jquery@^3.6.3, jquery@^3.7.1:
+jquery@>=1.9.1, jquery@^3.5.0, jquery@^3.7.1:
version "3.7.1"
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de"
integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==