diff --git a/java/code/webapp/WEB-INF/decorators/layout_error.jsp b/java/code/webapp/WEB-INF/decorators/layout_error.jsp
index b396b226d266..5198ef7277d5 100644
--- a/java/code/webapp/WEB-INF/decorators/layout_error.jsp
+++ b/java/code/webapp/WEB-INF/decorators/layout_error.jsp
@@ -45,7 +45,6 @@
-
diff --git a/java/code/webapp/WEB-INF/decorators/layout_head.jsp b/java/code/webapp/WEB-INF/decorators/layout_head.jsp
index 56a3b58a74fe..21a4dd1c764d 100644
--- a/java/code/webapp/WEB-INF/decorators/layout_head.jsp
+++ b/java/code/webapp/WEB-INF/decorators/layout_head.jsp
@@ -29,8 +29,6 @@
-
-
@@ -71,7 +69,6 @@
-
diff --git a/java/code/webapp/WEB-INF/pages/common/fragments/schedule-options.jspf b/java/code/webapp/WEB-INF/pages/common/fragments/schedule-options.jspf
index d33be9940e8c..7c47d06c3718 100644
--- a/java/code/webapp/WEB-INF/pages/common/fragments/schedule-options.jspf
+++ b/java/code/webapp/WEB-INF/pages/common/fragments/schedule-options.jspf
@@ -3,7 +3,6 @@
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://rhn.redhat.com/rhn" prefix="rhn" %>
-
diff --git a/java/spacewalk-java.changes.eth.select2 b/java/spacewalk-java.changes.eth.select2
new file mode 100644
index 000000000000..18e05b70e964
--- /dev/null
+++ b/java/spacewalk-java.changes.eth.select2
@@ -0,0 +1 @@
+- Remove Select2
diff --git a/testsuite/features/reposync/reference_srv_sync_products_extra.feature b/testsuite/features/reposync/reference_srv_sync_products_extra.feature
index b79b45084386..02ab0e22a20b 100644
--- a/testsuite/features/reposync/reference_srv_sync_products_extra.feature
+++ b/testsuite/features/reposync/reference_srv_sync_products_extra.feature
@@ -37,7 +37,7 @@ Feature: Synchronize extra products in the products page of the Setup Wizard
When I follow the left menu "Admin > Setup Wizard > Products"
And I wait until I do not see "Loading" text
And I enter "Ubuntu" as the filtered product description
- And I select "amd64-deb" in the dropdown list of the architecture filter
+ And I select "amd64-deb" from "product-arch-filter"
And I wait until I see "Ubuntu 22.04" text
And I select "Ubuntu 22.04" as a product
Then I should see the "Ubuntu 22.04" selected
diff --git a/testsuite/features/reposync/srv_sync_products.feature b/testsuite/features/reposync/srv_sync_products.feature
index 3ef6c12dadf6..77b11ab196d6 100644
--- a/testsuite/features/reposync/srv_sync_products.feature
+++ b/testsuite/features/reposync/srv_sync_products.feature
@@ -18,7 +18,7 @@ Feature: Synchronize products in the products page of the Setup Wizard
And I wait until I do not see "Loading" text
And I enter "RHEL or SLES ES" as the filtered product description
Then I should see a "RHEL or SLES ES or CentOS 8 Base" text
- When I select "x86_64" in the dropdown list of the architecture filter
+ When I select "x86_64" from "product-arch-filter"
Then I should see a "RHEL or SLES ES or CentOS 8 Base" text
@scc_credentials
diff --git a/testsuite/features/secondary/srv_dist_channel_mapping.feature b/testsuite/features/secondary/srv_dist_channel_mapping.feature
index 1a41edd75c98..02b0e6ac093b 100644
--- a/testsuite/features/secondary/srv_dist_channel_mapping.feature
+++ b/testsuite/features/secondary/srv_dist_channel_mapping.feature
@@ -25,8 +25,8 @@ Feature: Distribution Channel Mapping
Then I should see a "Create Distribution Channel Map" text
When I enter "SUSE Linux Enterprise Server 15 SP 4" as "os"
And I enter "15.5" as "release"
- And I select "x86_64" from "architecture" dropdown
- And I select "SLE-Product-SLES15-SP4-Pool for x86_64" from "channel_label" dropdown
+ And I select "x86_64" from "architecture"
+ And I select "SLE-Product-SLES15-SP4-Pool for x86_64" from "channel_label"
And I click on "Create Mapping"
Then I should see a "SUSE Linux Enterprise Server 15 SP 4" link in the content area
@@ -37,8 +37,8 @@ Feature: Distribution Channel Mapping
Then I should see a "Create Distribution Channel Map" text
When I enter "openSUSE Leap 15.5" as "os"
And I enter "15.5" as "release"
- And I select "x86_64" from "architecture" dropdown
- And I select "openSUSE Leap 15.5 (x86_64)" from "channel_label" dropdown
+ And I select "x86_64" from "architecture"
+ And I select "openSUSE Leap 15.5 (x86_64)" from "channel_label"
And I click on "Create Mapping"
Then I should see a "openSUSE Leap 15.5" link in the content area
@@ -48,8 +48,8 @@ Feature: Distribution Channel Mapping
Then I should see a "Create Distribution Channel Map" text
When I enter "Ubuntu 22.04.01 LTS" as "os"
And I enter "22.04" as "release"
- And I select "x86_64" from "architecture" dropdown
- And I select "Fake-Base-Channel-Debian-like" from "channel_label" dropdown
+ And I select "x86_64" from "architecture"
+ And I select "Fake-Base-Channel-Debian-like" from "channel_label"
And I click on "Create Mapping"
Then I should see a "Ubuntu 22.04.01 LTS" link in the content area
@@ -60,8 +60,8 @@ Feature: Distribution Channel Mapping
Then I should see a "Create Distribution Channel Map" text
When I enter "SUSE Linux Enterprise Server 15 SP 4 iSeries" as "os"
And I enter "15.5" as "release"
- And I select "iSeries" from "architecture" dropdown
- And I select "Fake-Base-Channel-i586" from "channel_label" dropdown
+ And I select "iSeries" from "architecture"
+ And I select "Fake-Base-Channel-i586" from "channel_label"
And I click on "Create Mapping"
Then I should see a "SUSE Linux Enterprise Server 15 SP 4 iSeries" link in the content area
@@ -75,7 +75,7 @@ Feature: Distribution Channel Mapping
When I follow "SUSE Linux Enterprise Server 15 SP 4"
Then I should see a "Update Distribution Channel Map" text
When I enter "SUSE Linux Enterprise Server 15 SP 4 modified" as "os"
- And I select "SLE-Product-SLES15-SP4-Pool for x86_64" from "channel_label" dropdown
+ And I select "SLE-Product-SLES15-SP4-Pool for x86_64" from "channel_label"
And I click on "Update Mapping"
Then I should see the text "SUSE Linux Enterprise Server 15 SP 4 modified" in the Operating System field
And I should see the text "sle-product-sles15-sp4-pool-x86_64" in the Channel Label field
@@ -89,7 +89,7 @@ Feature: Distribution Channel Mapping
When I follow "openSUSE Leap 15.5"
Then I should see a "Update Distribution Channel Map" text
When I enter "openSUSE Leap 15.5 modified" as "os"
- And I select "openSUSE Leap 15.5 (x86_64)" from "channel_label" dropdown
+ And I select "openSUSE Leap 15.5 (x86_64)" from "channel_label"
And I click on "Update Mapping"
Then I should see the text "openSUSE Leap 15.5 modified" in the Operating System field
And I should see the text "opensuse_leap15_5-x86_64" in the Channel Label field
@@ -101,7 +101,7 @@ Feature: Distribution Channel Mapping
And I should see the text "sle-product-sles15-sp4-pool-x86_64" in the Channel Label field
When I follow "Ubuntu 22.04.01 LTS"
And I enter "Ubuntu 22.04.01 LTS modified" as "os"
- And I select "Fake-Base-Channel-Debian-like" from "channel_label" dropdown
+ And I select "Fake-Base-Channel-Debian-like" from "channel_label"
And I click on "Update Mapping"
Then I should see the text "Ubuntu 22.04.01 LTS modified" in the Operating System field
And I should see the text "fake-base-channel-suse-like" in the Channel Label field
@@ -114,7 +114,7 @@ Feature: Distribution Channel Mapping
And I should see the text "fake-base-channel-i586" in the Channel Label field
When I follow "SUSE Linux Enterprise Server 15 SP 4 iSeries"
And I enter "SUSE Linux Enterprise Server 15 SP 4 iSeries modified" as "os"
- And I select "Fake-Base-Channel-Debian-like" from "channel_label" dropdown
+ And I select "Fake-Base-Channel-Debian-like" from "channel_label"
And I click on "Update Mapping"
Then I should see the text "SUSE Linux Enterprise Server 15 SP 4 iSeries modified" in the Operating System field
And I should see the text "fake-base-channel-debian-like" in the Channel Label field
diff --git a/testsuite/features/step_definitions/navigation_steps.rb b/testsuite/features/step_definitions/navigation_steps.rb
index 504575bff9e8..71f318f347b6 100644
--- a/testsuite/features/step_definitions/navigation_steps.rb
+++ b/testsuite/features/step_definitions/navigation_steps.rb
@@ -202,15 +202,6 @@
end
end
-# select an item from any dropdown
-When(/^I select "(.*?)" from "([^"]*)" dropdown/) do |selection, label|
- # let the the select2js box filter open the hidden options
- xpath_query = "//select[@name='#{label}']"
- raise ScriptError, "xpath: #{xpath_query} not found" unless find(:xpath, xpath_query).click
- # select the desired option
- raise ScriptError, "#{label} #{selection} not found" unless find(:xpath, "//select[@name='#{label}']/option[contains(text(), '#{selection}')]").click
-end
-
When(/^I select the parent channel for the "([^"]*)" from "([^"]*)"$/) do |client, from|
product_key = $is_container_provider ? 'Fake' : product
select(BASE_CHANNEL_BY_CLIENT[product_key][client], from: from, exact: false)
diff --git a/testsuite/features/step_definitions/setup_steps.rb b/testsuite/features/step_definitions/setup_steps.rb
index 17e3e02de08c..495beeb3a477 100644
--- a/testsuite/features/step_definitions/setup_steps.rb
+++ b/testsuite/features/step_definitions/setup_steps.rb
@@ -73,14 +73,6 @@
end
end
-When(/^I select "(.*?)" in the dropdown list of the architecture filter$/) do |architecture|
- # let the the select2js box filter open the hidden options
- xpath_query = '//div[@id=\'s2id_product-arch-filter\']/ul/li/input'
- raise ScriptError, "xpath: #{xpath_query} not found" unless find(:xpath, xpath_query).click
- # select the desired option
- raise ScriptError, "Architecture #{architecture} not found" unless find(:xpath, "//div[@id='select2-drop']/ul/li/div[contains(text(), '#{architecture}')]").click
-end
-
When(/^I (deselect|select) "([^"]*)" as a product$/) do |select, product|
# click on the checkbox to select the product
xpath = "//span[contains(text(), '#{product}')]/ancestor::div[contains(@class, 'product-details-wrapper')]/div/input[@type='checkbox']"
diff --git a/web/html/javascript/schedule-options.js b/web/html/javascript/schedule-options.js
deleted file mode 100644
index c22ddf2137cf..000000000000
--- a/web/html/javascript/schedule-options.js
+++ /dev/null
@@ -1,34 +0,0 @@
-jQuery(function() {
- // load existing action chain data
- var combobox = jQuery("#action-chain");
- var actionChains = combobox.data("existing-action-chains");
-
- // init widget
- combobox.select2({
- width: "20em",
- data: actionChains,
- createSearchChoice: ifNotFound,
- maximumInputLength: 256,
- initSelection: function (element, callback) { callback(actionChains[0]); }
- });
-
- // init initial selection
- combobox.select2("val", actionChains[0].id);
-
- // select radio button when combobox has focus
- combobox.on("select2-focus", function(event) {
- jQuery("#schedule-by-action-chain").prop("checked", true);
- });
-
- // returns a new search choice if term is new
- function ifNotFound(term, data) {
- var matchingChoices = jQuery(data).filter(function() {
- return this.text.localeCompare(term) == 0;
- });
-
- if (matchingChoices.length == 0) {
- var sanitizedTerm = term.replace(/[',]/g, "");
- return {id: sanitizedTerm, text: sanitizedTerm};
- }
- }
-});
diff --git a/web/html/src/branding/css/base/visualization.less b/web/html/src/branding/css/base/visualization.less
index 4e84e99279c6..4217781542f4 100644
--- a/web/html/src/branding/css/base/visualization.less
+++ b/web/html/src/branding/css/base/visualization.less
@@ -7,10 +7,6 @@
display: inline-block;
}
-.no-bold {
- font-weight: normal!important;
-}
-
.inline-icon {
i {
width: 1em;
@@ -49,7 +45,6 @@
#visualization-filter-wrapper {
display: none;
- overflow-y: auto;
background: lighten(@gray-light, 8%);
font-size: 0.9em;
border: 1px solid #ddd;
@@ -83,10 +78,9 @@
vertical-align: top;
padding: 3px 10px;
> .filter-title {
- max-width: 250px;
font-weight: bold;
- padding: 4px 2px;
margin-right: 4px;
+ margin-bottom: 4px;
}
label {
font-weight: normal;
@@ -108,14 +102,6 @@
margin-right: 5px;
vertical-align: sub;
}
- .select2-container-multi .select2-choices .select2-search-field input {
- height: 28px;
- padding: 2px 4px;
- }
- .select2-container-multi .select2-choices .select2-search-choice {
- margin-top: 4px;
- margin-bottom: 1px;
- }
.toggle-grouping-level i{
margin: 0px 4px;
vertical-align: middle;
@@ -124,6 +110,32 @@
.grpCriterion {
margin-top: 1px;
}
+
+ .btn-group {
+ margin-top: 8px;
+ display: block;
+ }
+
+ .combobox {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ width: 250px;
+ margin-top: 4px;
+
+ > form {
+ flex: 1;
+ display: block;
+
+ .form-group {
+ margin: 0 !important;
+ }
+
+ .help-block {
+ display: none !important;
+ }
+ }
+ }
}
select {
width: 100%;
diff --git a/web/html/src/branding/css/susemanager/components/inputs.less b/web/html/src/branding/css/susemanager/components/inputs.less
index 64fa2f239f45..ca655ddff61f 100644
--- a/web/html/src/branding/css/susemanager/components/inputs.less
+++ b/web/html/src/branding/css/susemanager/components/inputs.less
@@ -50,36 +50,3 @@ select[size] {
.input-group-addon {
border-color: @eos-bc-gray-700 !important;
}
-
-.select2-container {
- padding: 0 !important;
-}
-
-.select2-choices {
- border-radius: 0 !important;
- border: none !important;
- outline: none !important;
- box-shadow: none !important;
-}
-
-.select2-search-field {
- width: 100%;
-}
-
-.select2-input {
- width: 100% !important;
- height: @input-height !important;
- padding: 8px !important;
- border: 1px solid @eos-bc-gray-700 !important;
- border-radius: @border-radius-base !important;
-
- .select2-container-active & {
- border-color: @eos-bc-blue-500 !important;
- outline: none !important;
- }
-}
-
-.select2-drop-active {
- border-color: @eos-bc-blue-500 !important;
- border-radius: 0 !important;
-}
diff --git a/web/html/src/build/webpack.config.js b/web/html/src/build/webpack.config.js
index 4f46dd5658a9..3d4d32fca480 100644
--- a/web/html/src/build/webpack.config.js
+++ b/web/html/src/build/webpack.config.js
@@ -64,14 +64,6 @@ module.exports = (env, argv) => {
to: path.resolve(__dirname, "../dist/javascript/legacy"),
},
// TODO: Take only what we need after we've confirmed it works fine, otherwise there's a lot of fluff in this
- {
- from: path.resolve(__dirname, "../node_modules/select2"),
- to: path.resolve(__dirname, "../dist/javascript/legacy/select2"),
- },
- {
- from: path.resolve(__dirname, "../node_modules/select2-bootstrap-css/select2-bootstrap.css"),
- to: path.resolve(__dirname, "../dist/javascript/legacy/select2"),
- },
{
from: path.resolve(__dirname, "../node_modules/timepicker/jquery.timepicker.js"),
to: path.resolve(__dirname, "../dist/javascript/legacy"),
diff --git a/web/html/src/components/action-schedule.tsx b/web/html/src/components/action-schedule.tsx
index d3f7e3f73b07..6f3583f9a57d 100644
--- a/web/html/src/components/action-schedule.tsx
+++ b/web/html/src/components/action-schedule.tsx
@@ -283,7 +283,7 @@ class ActionSchedule extends React.Component
diff --git a/web/html/src/components/combobox.tsx b/web/html/src/components/combobox.tsx
index 6d17b5224c2e..50ff06c09e28 100644
--- a/web/html/src/components/combobox.tsx
+++ b/web/html/src/components/combobox.tsx
@@ -16,12 +16,14 @@ export type ComboboxItem = {
};
type ComboboxProps = {
- id: string;
- name: string;
- data?: Array;
+ id?: string;
+ name?: string;
+ options?: Array;
selectedId?: (number | null | undefined) | (string | null | undefined);
onFocus?: () => void;
onSelect: (value: ComboboxItem) => void;
+ getNewOptionData?: (userInput: string, label: string) => { id: string; value: string; label: string };
+ placeholder?: string;
/** Id for testing purposes */
"data-testid"?: string;
@@ -74,7 +76,7 @@ export class Combobox extends React.Component {
// The react-select is expecting the value to be a string, but let's keep the original id here so we can propagate
// correctly the selected option up.
- const options: Array = (this.props.data || []).map((item) => ({
+ const options: Array = (this.props.options || []).map((item) => ({
value: item.id.toString(),
id: item.id,
label: item.text,
@@ -91,6 +93,9 @@ export class Combobox extends React.Component {
options={options}
styles={colourStyles}
menuPortalTarget={document.body}
+ formatCreateLabel={(label: string) => t("Create {label}", { label })}
+ getNewOptionData={this.props.getNewOptionData}
+ placeholder={this.props.placeholder}
{...testAttributes}
/>
);
diff --git a/web/html/src/components/input/Form.tsx b/web/html/src/components/input/Form.tsx
index e028f647d0d5..73ab54705ac2 100644
--- a/web/html/src/components/input/Form.tsx
+++ b/web/html/src/components/input/Form.tsx
@@ -8,7 +8,7 @@ type Props = {
/** Object storing the data of the form.
* Each field name in the form needs to map to a property of this
* object. The value is the one displayed in the form */
- model: any;
+ model?: any;
/** Object storing form field errors */
errors?: object;
@@ -29,7 +29,7 @@ type Props = {
formDirection?: string;
/** Children elements of the form. Usually includes fields and a submit button */
- children: React.ReactNode;
+ children?: React.ReactNode;
/** Function called when the model has been changed.
* Takes a new model as single parameter.
@@ -58,6 +58,7 @@ export const FormContext = React.createContext>({});
export class Form extends React.Component {
static defaultProps = {
+ model: {},
onSubmit: undefined,
formRef: undefined,
divClass: "",
diff --git a/web/html/src/components/picker/recurring-event-picker.tsx b/web/html/src/components/picker/recurring-event-picker.tsx
index 2d139ed2e1f4..83041bc8e7a1 100644
--- a/web/html/src/components/picker/recurring-event-picker.tsx
+++ b/web/html/src/components/picker/recurring-event-picker.tsx
@@ -408,7 +408,7 @@ class RecurringEventPicker extends React.Component
@@ -442,7 +442,7 @@ class RecurringEventPicker extends React.Component
diff --git a/web/html/src/manager/admin/setup/products/products.tsx b/web/html/src/manager/admin/setup/products/products.tsx
index 710242f29b68..1cc3770e91e2 100644
--- a/web/html/src/manager/admin/setup/products/products.tsx
+++ b/web/html/src/manager/admin/setup/products/products.tsx
@@ -8,6 +8,7 @@ import { AsyncButton, Button } from "components/buttons";
import { CustomDiv } from "components/custom-objects";
import { DangerDialog } from "components/dialog/DangerDialog";
import { Dialog } from "components/dialog/Dialog";
+import { Form, Select } from "components/input";
import { ChannelLink } from "components/links";
import { Messages, MessageType } from "components/messages";
import { Utils as MessagesUtils } from "components/messages";
@@ -34,16 +35,6 @@ declare global {
}
}
-type Instance = JQuery;
-type StaticProperties = {};
-type Select2 = ((...args: any[]) => Instance) & StaticProperties;
-
-declare global {
- interface JQuery {
- select2: Select2;
- }
-}
-
const messageMap = {
// Nothing for now
};
@@ -506,36 +497,10 @@ class Products extends React.Component {
visibleSubList: [] as any[],
};
- componentDidMount() {
- const currentObject = this;
-
- //HACK: usage of JQuery here is needed to apply the select2js plugin
- jQuery("select#product-arch-filter.apply-select2js-on-this").each(function () {
- var select = jQuery(this);
- // apply select2js only one time
- if (!select.hasClass("select2js-applied")) {
- select.addClass("select2js-applied");
-
- var select2js = select.select2({ placeholder: t("Filter by architecture") });
- select2js.on("change", function (event) {
- currentObject.handleFilterArchChange(select.val() || []);
- });
- }
- });
- }
-
- getDistinctArchsFromData = (data) => {
- var archs: any[] = [];
- Object.keys(data)
- .map((id) => data[id])
- .forEach(function (x) {
- if (!archs.includes(x.arch)) archs.push(x.arch);
- });
- return archs;
- };
-
- handleFilterArchChange = (archs) => {
- this.setState({ archCriteria: archs });
+ getDistinctArchsFromData = (data: any[] = []) => {
+ return Array.from(new Set(data.map((item) => item.arch)))
+ .filter(Boolean) // Some items don't have an arch set so pick those out
+ .sort();
};
filterDataByArch = (data: any[]) => {
@@ -587,18 +552,16 @@ class Products extends React.Component {
render() {
const archFilter = (
-
- {this.getDistinctArchsFromData(this.props.data).map((a, i) => (
-
- {a}
-
- ))}
-
+ {/* TODO: Remove this
);
return (
diff --git a/web/html/src/manager/index.ts b/web/html/src/manager/index.ts
index e6b31a5833c0..d01662332357 100644
--- a/web/html/src/manager/index.ts
+++ b/web/html/src/manager/index.ts
@@ -29,6 +29,7 @@ import Packages from "./packages";
import Proxy from "./proxy";
import RecurringActions from "./recurring";
import Salt from "./salt";
+import ScheduleOptions from "./schedule-options";
import Shared from "./shared";
import Highstate from "./state";
import Systems from "./systems";
@@ -53,6 +54,7 @@ const pages = {
...Packages,
...Proxy,
...Salt,
+ ...ScheduleOptions,
...Shared,
...Systems,
...Virtualization,
diff --git a/web/html/src/manager/maintenance/edit/schedule-edit.tsx b/web/html/src/manager/maintenance/edit/schedule-edit.tsx
index d01795f24d61..00c683b29303 100644
--- a/web/html/src/manager/maintenance/edit/schedule-edit.tsx
+++ b/web/html/src/manager/maintenance/edit/schedule-edit.tsx
@@ -139,7 +139,7 @@ const MaintenanceScheduleEdit = forwardRef((props: ScheduleEditProps, ref) => {
diff --git a/web/html/src/manager/minion/ansible/schedule-playbook.tsx b/web/html/src/manager/minion/ansible/schedule-playbook.tsx
index 5e5884cd0303..dae3649c52bc 100644
--- a/web/html/src/manager/minion/ansible/schedule-playbook.tsx
+++ b/web/html/src/manager/minion/ansible/schedule-playbook.tsx
@@ -129,7 +129,7 @@ export default function SchedulePlaybook({ playbook, onBack }: SchedulePlaybookP
diff --git a/web/html/src/manager/notifications/notification-messages.tsx b/web/html/src/manager/notifications/notification-messages.tsx
index 3ccb8f637959..e7d5063b5fb0 100644
--- a/web/html/src/manager/notifications/notification-messages.tsx
+++ b/web/html/src/manager/notifications/notification-messages.tsx
@@ -5,6 +5,7 @@ import * as React from "react";
import { AsyncButton } from "components/buttons";
import { Dialog } from "components/dialog/LegacyDialog";
import { showDialog } from "components/dialog/util";
+import { Form, Select } from "components/input";
import { Messages as MessageContainer, Utils as MessagesUtils } from "components/messages";
import { TopPanel } from "components/panels/TopPanel";
import { SectionToolbar } from "components/section-toolbar/section-toolbar";
@@ -17,12 +18,6 @@ import { Utils } from "utils/functions";
import { DEPRECATED_unsafeEquals } from "utils/legacy";
import Network from "utils/network";
-declare global {
- interface JQuery {
- select2: (...args: any[]) => JQuery;
- }
-}
-
const _MESSAGE_TYPE = {
OnboardingFailed: {
id: "OnboardingFailed",
@@ -145,20 +140,6 @@ class NotificationMessages extends React.Component {
messages: [],
selectedItems: [],
});
-
- //HACK: usage of JQuery here is needed to apply the select2js plugin
- jQuery("select#notification-messages-type-filter.apply-select2js-on-this").each(function (i) {
- var select = jQuery(this);
- // apply select2js only one time
- if (!select.hasClass("select2js-applied")) {
- select.addClass("select2js-applied");
-
- var select2js = select.select2({ placeholder: t("Filter by type") });
- select2js.on("change", function (event) {
- currentObject.handleFilterTypeChange(select.val() || []);
- });
- }
- });
})
.catch((response) => {
currentObject.setState({
@@ -174,10 +155,6 @@ class NotificationMessages extends React.Component {
});
};
- handleFilterTypeChange = (types) => {
- this.setState({ typeCriteria: types });
- };
-
filterDataByType = (data) => {
if (this.state.typeCriteria.length > 0) {
return data.filter((p) => this.state.typeCriteria.includes(p.type));
@@ -437,18 +414,18 @@ class NotificationMessages extends React.Component {
const typeFilter = (
-
- {Object.keys(_MESSAGE_TYPE).map((id) => (
-
- {this.decodeTypeText(id)}
-
- ))}
-
+ {/* TODO: Remove this
);
diff --git a/web/html/src/manager/schedule-options/action-chain-picker.renderer.tsx b/web/html/src/manager/schedule-options/action-chain-picker.renderer.tsx
new file mode 100644
index 000000000000..2a1be006d441
--- /dev/null
+++ b/web/html/src/manager/schedule-options/action-chain-picker.renderer.tsx
@@ -0,0 +1,18 @@
+import SpaRenderer from "core/spa/spa-renderer";
+
+import { ActionChainPicker } from "./action-chain-picker";
+
+type Props = {
+ actionChains: string;
+};
+
+export const renderer = (id: string, props: Props) => {
+ let actionChains = [] as any[];
+ try {
+ actionChains = JSON.parse((props.actionChains || "").replace(/"/g, '"'));
+ } catch (error) {
+ Loggerhead.error(error);
+ }
+
+ SpaRenderer.renderNavigationReact( , document.getElementById(id));
+};
diff --git a/web/html/src/manager/schedule-options/action-chain-picker.tsx b/web/html/src/manager/schedule-options/action-chain-picker.tsx
new file mode 100644
index 000000000000..3ba81d09a337
--- /dev/null
+++ b/web/html/src/manager/schedule-options/action-chain-picker.tsx
@@ -0,0 +1,37 @@
+import { useState } from "react";
+
+import { Combobox } from "components/combobox";
+
+type ActionChain = {
+ id: string;
+ text: string;
+};
+
+type Props = {
+ actionChains: ActionChain[];
+};
+
+export const ActionChainPicker = (props: Props) => {
+ const [selectedId, setSelectedId] = useState(props.actionChains[0]?.id || "");
+
+ return (
+ {
+ const sanitized = input.replace(/[',]/g, "");
+ const maxLength = 256;
+ const cut = sanitized.substring(0, maxLength);
+ return { id: cut, value: cut, label };
+ }}
+ onSelect={(item) => {
+ // This module needs to interface with legacy fields in schedule-options.jspf
+ document.getElementById("action-chain")?.setAttribute("value", item.id);
+ setSelectedId(item.id);
+ }}
+ onFocus={() => {
+ document.getElementById("schedule-by-action-chain")?.setAttribute("checked", "checked");
+ }}
+ />
+ );
+};
diff --git a/web/html/src/manager/schedule-options/index.ts b/web/html/src/manager/schedule-options/index.ts
new file mode 100644
index 000000000000..e19788b23757
--- /dev/null
+++ b/web/html/src/manager/schedule-options/index.ts
@@ -0,0 +1,3 @@
+export default {
+ "schedule-options/action-chain-picker": () => import("./action-chain-picker.renderer"),
+};
diff --git a/web/html/src/manager/visualization/data-tree.ts b/web/html/src/manager/visualization/data-tree.ts
index c0c8aaf45ef8..aae6fbb613bf 100644
--- a/web/html/src/manager/visualization/data-tree.ts
+++ b/web/html/src/manager/visualization/data-tree.ts
@@ -63,19 +63,19 @@ function dataTree(data, container) {
function instance() {}
- instance.data = function (d) {
+ instance.data = function (d?: any) {
return arguments.length ? ((data = d), instance) : data;
};
- instance.preprocessor = function (p) {
+ instance.preprocessor = function (p?: any): any {
return arguments.length ? ((preprocessor = p), instance) : preprocessor;
};
- instance.filters = function (f) {
+ instance.filters = function (f?: any) {
return arguments.length ? ((filters = f), instance) : filters;
};
- instance.partitioning = function (p) {
+ instance.partitioning = function (p?: any) {
return arguments.length ? ((partitioning = p), instance) : partitioning;
};
diff --git a/web/html/src/manager/visualization/hierarchy.tsx b/web/html/src/manager/visualization/hierarchy.tsx
index 9510567a4ecb..c3dfb5b152c7 100644
--- a/web/html/src/manager/visualization/hierarchy.tsx
+++ b/web/html/src/manager/visualization/hierarchy.tsx
@@ -4,8 +4,11 @@ import * as d3 from "d3";
import SpaRenderer from "core/spa/spa-renderer";
+import { DateTimePicker } from "components/datetime";
+import { Form, Select } from "components/input";
import { TopPanel } from "components/panels/TopPanel";
+import { LocalizedMoment, localizedMoment } from "utils";
import { DEPRECATED_unsafeEquals } from "utils/legacy";
import Network from "../../utils/network";
@@ -23,28 +26,6 @@ declare global {
}
}
-function displayHierarchy(data) {
- // disable the #spacewalk-content observer:
- // drawing svg triggers it for every small changes,
- // and it is not the desired behaviour/what the observer stands for
- // note: leaving it connected slow down the svg usability
- spacewalkContentObserver.disconnect();
-
- const container = Utils.prepareDom();
- const tree = DataTree.dataTree(data, container);
- if (window.view === "grouping") {
- // hack - derive preprocessor from global variable
- tree.preprocessor(Preprocessing.grouping());
- }
- tree.refresh();
-
- initUI(tree);
-
- d3.select(window).on("resize", function () {
- Utils.adjustSvgDimensions();
- });
-}
-
function showFilterTab(tabIdToShow) {
d3.selectAll(".filter-tab-selector").classed("active", false);
d3.selectAll(".filter-tab").classed("active", false);
@@ -53,140 +34,202 @@ function showFilterTab(tabIdToShow) {
Utils.adjustSvgDimensions();
}
-// util function for adding the UI to the dom and setting its callbacks
-function initUI(tree) {
- const filterNavTab = d3.select("#visualization-filter-wrapper").append("ul").attr("class", "nav nav-tabs");
-
- filterNavTab
- .append("li")
- .attr("id", "filtering-tab-selector")
- .attr("class", "filter-tab-selector active")
- .append("a")
- .text(t("Filtering"))
- .on("click", (d) => {
- showFilterTab("filtering-tab");
- });
- filterNavTab
- .append("li")
- .attr("id", "partitioning-tab-selector")
- .attr("class", "filter-tab-selector")
- .append("a")
- .text(t("Partitioning"))
- .on("click", (d) => {
- showFilterTab("partitioning-tab");
- });
+// NB! This is a magic constant
+const NO_GROUP_LABEL = "** NO GROUP **";
+
+type Props = {};
+
+type State = {
+ showFilters: boolean;
+ hasGroupingFilter: boolean;
+ tree: ReturnType | undefined;
+ partitioningDateTime: LocalizedMoment;
+ systemGroups: any[];
+ selectedSystemGroups: string[][];
+};
+
+class Hierarchy extends React.Component {
+ state: State = {
+ showFilters: false,
+ hasGroupingFilter: false,
+ tree: undefined,
+ partitioningDateTime: localizedMoment(),
+ systemGroups: [NO_GROUP_LABEL],
+ selectedSystemGroups: [],
+ };
- d3.select("#visualization-filter-wrapper")
- .append("div")
- .attr("id", "filtering-tab")
- .attr("class", "filter-tab active");
- d3.select("#visualization-filter-wrapper").append("div").attr("id", "partitioning-tab").attr("class", "filter-tab");
-
- // Patch count filter
- const patchCountsFilter = d3.select("#filtering-tab").append("div").attr("class", "filter");
-
- patchCountsFilter.append("div").attr("class", "filter-title no-bold").text(t("Show systems with:"));
-
- // state of the patch status checkboxes:
- // [bug fix adv. checked, prod. enhancements checked, security adv. checked]
- const patchCountFilterConfig = [false, false, false];
- // create a callback function that
- // - updates patchCountFilterConfig at given index,
- // - updates the filters based on patchCountFilterConfig
- // - refreshes the tree
- function patchCountFilterCallback(idx) {
- return function (checked) {
- patchCountFilterConfig[idx] = checked;
- if (!patchCountFilterConfig.includes(true)) {
- tree.filters().remove("patch_count_filter");
- } else {
- tree.filters().put("patch_count_filter", (d) => {
- return (
- Utils.isSystemType(d) &&
- patchCountFilterConfig // based on the checkboxes state, take into account the patch count
- .map((value, index) => value && (d.data.patch_counts || [])[index] > 0)
- .reduce((a, b) => a || b, false)
- );
- });
- }
- tree.refresh();
- };
+ componentDidMount() {
+ // Get data & put everything together in the graph!
+ Network.get(window.endpoint).then(
+ (data) => jQuery(document).ready(() => this.displayHierarchy(data)),
+ (xhr) => d3.select("#svg-wrapper").text(t("There was an error fetching data from the server."))
+ );
+ }
+
+ componentWillUnmount() {
+ d3.select("#visualization-filter-wrapper").exit().remove();
+ d3.select("#svg-wrapper").exit().remove();
+ // This was disabled in displayHierarchy
+ registerSpacewalkContentObservers && registerSpacewalkContentObservers();
}
- UI.addCheckbox(
- patchCountsFilter,
- t("security advisories"),
- "fa-shield",
- "security-patches",
- patchCountFilterCallback(2)
- );
- UI.addCheckbox(patchCountsFilter, t("bug fix advisories"), "fa-bug", "bug-patches", patchCountFilterCallback(0));
- UI.addCheckbox(
- patchCountsFilter,
- t("product enhancement advisories"),
- "spacewalk-icon-enhancement",
- "minor-patches",
- patchCountFilterCallback(1)
- );
-
- d3.select("#filtering-tab").append("div").attr("id", "filter-systems-box");
- // System name filter
- UI.addFilter(d3.select("#filter-systems-box"), t("Filter by system name"), t("e.g., client.nue.sles"), (input) => {
- tree.filters().put("name", (d) => d.data.name.toLowerCase().includes(input.toLowerCase()));
- tree.refresh();
- });
- // Base channel filter
- UI.addFilter(d3.select("#filter-systems-box"), t("Filter by system base channel"), t("e.g., SLE12"), (input) => {
- tree.filters().put("base_channel", (d) => (d.data.base_channel || "").toLowerCase().includes(input.toLowerCase()));
+ displayHierarchy = (data) => {
+ // disable the #spacewalk-content observer:
+ // drawing svg triggers it for every small changes,
+ // and it is not the desired behaviour/what the observer stands for
+ // note: leaving it connected slow down the svg usability
+ spacewalkContentObserver.disconnect();
+
+ const container = Utils.prepareDom();
+ const tree = DataTree.dataTree(data, container);
+ if (window.view === "grouping") {
+ // hack - derive preprocessor from global variable
+ tree.preprocessor(Preprocessing.grouping());
+ }
tree.refresh();
- });
- // Installed products filter
- UI.addFilter(d3.select("#filter-systems-box"), t("Filter by system installed products"), t("e.g., SLES"), (input) => {
- if (DEPRECATED_unsafeEquals(input, undefined) || DEPRECATED_unsafeEquals(input, "")) {
- tree.filters().remove("installedProducts");
- } else {
+ this.initUI(tree);
+
+ const treeSystemGroups = tree
+ .data()
+ .map((e) => e.managed_groups || [])
+ .reduce((a, b) => a.concat(b));
+ const systemGroups = [NO_GROUP_LABEL, ...treeSystemGroups];
+ this.setState({ tree, systemGroups });
+
+ d3.select(window).on("resize", function () {
+ Utils.adjustSvgDimensions();
+ });
+ };
+
+ initUI = (tree: ReturnType) => {
+ // Patch count filter
+ const patchCountsFilter = d3.select("#filtering-tab").append("div").attr("class", "filter");
+
+ patchCountsFilter.append("div").attr("class", "filter-title").text(t("Show systems with:"));
+
+ // state of the patch status checkboxes:
+ // [bug fix adv. checked, prod. enhancements checked, security adv. checked]
+ const patchCountFilterConfig = [false, false, false];
+ // create a callback function that
+ // - updates patchCountFilterConfig at given index,
+ // - updates the filters based on patchCountFilterConfig
+ // - refreshes the tree
+ function patchCountFilterCallback(idx) {
+ return function (checked) {
+ patchCountFilterConfig[idx] = checked;
+ if (!patchCountFilterConfig.includes(true)) {
+ tree.filters().remove("patch_count_filter");
+ } else {
+ tree.filters().put("patch_count_filter", (d) => {
+ return (
+ Utils.isSystemType(d) &&
+ patchCountFilterConfig // based on the checkboxes state, take into account the patch count
+ .map((value, index) => value && (d.data.patch_counts || [])[index] > 0)
+ .reduce((a, b) => a || b, false)
+ );
+ });
+ }
+ tree.refresh();
+ };
+ }
+ UI.addCheckbox(
+ patchCountsFilter,
+ t("security advisories"),
+ "fa-shield",
+ "security-patches",
+ patchCountFilterCallback(2)
+ );
+ UI.addCheckbox(patchCountsFilter, t("bug fix advisories"), "fa-bug", "bug-patches", patchCountFilterCallback(0));
+ UI.addCheckbox(
+ patchCountsFilter,
+ t("product enhancement advisories"),
+ "spacewalk-icon-enhancement",
+ "minor-patches",
+ patchCountFilterCallback(1)
+ );
+
+ d3.select("#filtering-tab").append("div").attr("id", "filter-systems-box");
+ // System name filter
+ UI.addFilter(d3.select("#filter-systems-box"), t("Filter by system name"), t("e.g., client.nue.sles"), (input) => {
+ tree.filters().put("name", (d) => d.data.name.toLowerCase().includes(input.toLowerCase()));
+ tree.refresh();
+ });
+
+ // Base channel filter
+ UI.addFilter(d3.select("#filter-systems-box"), t("Filter by system base channel"), t("e.g., SLE12"), (input) => {
tree
.filters()
- .put("installedProducts", (d) =>
- (d.data.installedProducts || [])
- .map((ip) => ip.toLowerCase().includes(input.toLowerCase()))
- .reduce((v1, v2) => v1 || v2, false)
- );
+ .put("base_channel", (d) => (d.data.base_channel || "").toLowerCase().includes(input.toLowerCase()));
+ tree.refresh();
+ });
+
+ // Installed products filter
+ UI.addFilter(
+ d3.select("#filter-systems-box"),
+ t("Filter by system installed products"),
+ t("e.g., SLES"),
+ (input) => {
+ if (!input) {
+ tree.filters().remove("installedProducts");
+ } else {
+ tree
+ .filters()
+ .put("installedProducts", (d) =>
+ (d.data.installedProducts || [])
+ .map((ip) => ip.toLowerCase().includes(input.toLowerCase()))
+ .reduce((v1, v2) => v1 || v2, false)
+ );
+ }
+ tree.refresh();
+ }
+ );
+
+ this.setState({
+ hasGroupingFilter: !!tree.preprocessor().groupingConfiguration,
+ });
+ };
+
+ toggleFilters = () => {
+ const filterBox = jQuery("#visualization-filter-wrapper");
+ if (filterBox.hasClass("open")) {
+ filterBox.removeClass("open").slideUp(Number.MIN_VALUE, () => {
+ Utils.adjustSvgDimensions();
+ });
+ this.setState({ showFilters: false });
+ } else {
+ filterBox.addClass("open").slideDown(Number.MIN_VALUE, () => {
+ Utils.adjustSvgDimensions();
+ });
+ this.setState({ showFilters: true });
+ }
+ };
+
+ // Partitioning filters
+ partitionByCheckin = () => {
+ const tree = this.state.tree;
+ if (!tree) {
+ return;
}
- tree.refresh();
- });
- // Partitioning by checkin time
- function partitionByCheckin(datetime) {
tree.partitioning().get()["user-partitioning"] = (d) => {
if (DEPRECATED_unsafeEquals(d.data.checkin, undefined)) {
return "";
}
- const firstPartition = d.data.checkin < datetime.getTime();
+ const referenceDateTime = this.state.partitioningDateTime.valueOf();
+ const firstPartition = d.data.checkin < referenceDateTime;
d.data.partition = firstPartition;
return firstPartition ? "stroke-red non-checking-in" : "stroke-green checking-in";
};
tree.refresh();
- }
- function clearPartitioning() {
- tree.partitioning().get()["user-partitioning"] = (d) => {
- return "";
- };
- tree.refresh();
- }
-
- UI.addCheckinTimePartitioningSelect("#partitioning-tab", partitionByCheckin, clearPartitioning);
-
- // Partitioning by patch existence
- const hasPatchesPartitioning = d3.select("#partitioning-tab").append("div").attr("class", "filter");
+ };
- hasPatchesPartitioning
- .append("div")
- .attr("class", "filter-title")
- .text(t("Partition systems based on whether there are patches for them:"));
+ applyPatchesPartitioning = () => {
+ const tree = this.state.tree;
+ if (!tree) {
+ return;
+ }
- function applyPatchesPartitioning() {
tree.partitioning().get()["user-partitioning"] = (d) => {
if (!Utils.isSystemType(d) || DEPRECATED_unsafeEquals(d.data.patch_counts, undefined)) {
return "";
@@ -196,64 +239,22 @@ function initUI(tree) {
return firstPartition ? "stroke-red unpatched" : "stroke-green patched";
};
tree.refresh();
- }
-
- const patchesPartitioningButtons = hasPatchesPartitioning.append("div").attr("class", "btn-group");
- UI.addButton(patchesPartitioningButtons, "Apply", applyPatchesPartitioning);
- UI.addButton(patchesPartitioningButtons, "Clear", clearPartitioning);
-
- // Grouping UI (based on the preprocessor type)
- if (tree.preprocessor().groupingConfiguration) {
- // we have a processor responding to groupingConfiguration
- UI.addGroupSelector(
- d3.select("#partitioning-tab"),
- tree
- .data()
- .map((e) => e.managed_groups || [])
- .reduce((a, b) => a.concat(b)),
- (data) => {
- tree.preprocessor().groupingConfiguration(data);
- tree.refresh();
- }
- );
- }
-}
-
-class Hierarchy extends React.Component {
- state = { showFilters: false };
-
- componentDidMount() {
- // Get data & put everything together in the graph!
- Network.get(window.endpoint).then(
- (data) => jQuery(document).ready(() => displayHierarchy(data)),
- (xhr) => d3.select("#svg-wrapper").text(t("There was an error fetching data from the server."))
- );
- }
-
- componentWillUnmount() {
- d3.select("#visualization-filter-wrapper").exit().remove();
- d3.select("#svg-wrapper").exit().remove();
- // This was disabled in displayHierarchy
- registerSpacewalkContentObservers && registerSpacewalkContentObservers();
- }
+ };
- showFilters = () => {
- const filterBox = jQuery("#visualization-filter-wrapper");
- if (filterBox.hasClass("open")) {
- filterBox.removeClass("open").slideUp("fast", () => {
- Utils.adjustSvgDimensions();
- });
- this.setState({ showFilters: false });
- } else {
- filterBox.addClass("open").slideDown("fast", () => {
- Utils.adjustSvgDimensions();
- });
- this.setState({ showFilters: true });
+ clearPartitioning = () => {
+ const tree = this.state.tree;
+ if (!tree) {
+ return;
}
+
+ tree.partitioning().get()["user-partitioning"] = (d) => {
+ return "";
+ };
+ tree.refresh();
};
render() {
- var hurl: string | undefined = undefined;
+ let hurl: string | undefined = undefined;
if (window.title === "Virtualization Hierarchy") {
hurl = "reference/systems/visualization-menu.html";
} else if (window.title === "Proxy Hierarchy") {
@@ -262,13 +263,131 @@ class Hierarchy extends React.Component {
hurl = "reference/systems/visualization-menu.html";
}
+ const formModel = this.state.selectedSystemGroups.reduce((result, item, index) => {
+ result[index] = item;
+ return result;
+ }, {});
+
return (
-
- {t((this.state.showFilters ? "Hide" : "Show") + " filters")}
+ this.toggleFilters()}>
+ {this.state.showFilters ? t("Hide filters") : t("Show filters")}
-
+
+
+
+
+
+
{t("Partition systems by given check-in time:")}
+
+ this.setState({ partitioningDateTime })}
+ />
+
+
+ this.partitionByCheckin()}>
+ {t("Apply")}
+
+ this.clearPartitioning()}>
+ {t("Clear")}
+
+
+
+
+
{t("Partition systems based on whether there are patches for them:")}
+
+ this.applyPatchesPartitioning()}
+ >
+ {t("Apply")}
+
+ this.clearPartitioning()}>
+ {t("Clear")}
+
+
+
+ {this.state.hasGroupingFilter ? (
+
+ ) : null}
+
+
diff --git a/web/html/src/manager/visualization/ui/components.ts b/web/html/src/manager/visualization/ui/components.ts
index 88d89a8fb5df..c2e226984e55 100644
--- a/web/html/src/manager/visualization/ui/components.ts
+++ b/web/html/src/manager/visualization/ui/components.ts
@@ -1,5 +1,3 @@
-import * as d3 from "d3";
-
// D3 UI "components" used for visualization
// Add a filter to given selection
@@ -21,63 +19,6 @@ function addFilter(targetSelection, caption, placeholder, onInputCallback) {
});
}
-// Add a checkin-time partitioning selector (date- and timepicker + 'Apply'
-// button)
-//
-// params:
-// - anchorId - id of element in DOM where the UI will be added
-// - applyCallback - applyCallback receiving picked time and date after user clicks
-// the 'Apply' button
-// - clearCallback - clearCallback will be executed when the user clicks the "Clear" button
-function addCheckinTimePartitioningSelect(anchorId, applyCallback, clearCallback) {
- const checkinTimePartitioning = d3.select(anchorId).append("div").attr("class", "filter");
-
- checkinTimePartitioning
- .append("div")
- .attr("class", "filter-title")
- .text(t("Partition systems by given check-in time:"));
-
- const inputGroup = checkinTimePartitioning.append("div").attr("class", "input-group");
-
- inputGroup.append("input").attr("type", "text").attr("class", "partitioning-datepicker input-group-addon");
-
- inputGroup.append("input").attr("type", "text").attr("class", "partitioning-timepicker input-group-addon");
-
- jQuery(anchorId + " .partitioning-datepicker").datepicker({
- autoclose: true,
- format: "yyyy-mm-dd",
- });
- // TODO: If you touch this code, please use `localizedMoment()` here instead
- // eslint-disable-next-line local-rules/no-raw-date
- jQuery(anchorId + " .partitioning-datepicker").datepicker("setDate", new Date());
- jQuery(anchorId + " .partitioning-timepicker").timepicker({ timeFormat: "H:i:s", maxTime: "23:30:00" });
- // TODO: If you touch this code, please use `localizedMoment()` here instead
- // eslint-disable-next-line local-rules/no-raw-date
- jQuery(anchorId + " .partitioning-timepicker").timepicker("setTime", new Date());
-
- const checkinPartitioningButtons = checkinTimePartitioning.append("div").attr("class", "btn-group");
- addButton(checkinPartitioningButtons, "Apply", () => {
- const date = jQuery(anchorId + " .partitioning-datepicker").datepicker("getDate");
- const time = jQuery(anchorId + " .partitioning-timepicker").timepicker("getTime");
- // TODO: If you touch this code, please use `localizedMoment()` here instead
- // eslint-disable-next-line local-rules/no-raw-date
- const datetime = new Date(
- date.getFullYear(),
- date.getMonth(),
- date.getDate(),
- time.getHours(),
- time.getMinutes(),
- time.getSeconds()
- );
- applyCallback(datetime);
- });
- addButton(checkinPartitioningButtons, "Clear", () => {
- clearCallback();
- });
-
- return checkinTimePartitioning;
-}
-
// Add a checkbox to given selection
//
// params:
@@ -106,136 +47,6 @@ function addCheckbox(targetSelection, caption, icon, classes, callback) {
.html((icon ? ' ' : "") + caption);
}
-// Simple JS component for selecting groups
-//
-// Adds an 'Add a grouping level' button, clicking on it appends a new
-// multiselect box in the UI. In each of these select boxes, the user can
-// specify multiple groups. Selected options are internally stored in the
-// 'data' array in the format:
-// [['grp1', 'grp2'], // selected groups on the 1st level
-// ['grp1', 'grp2'] // selected groups on the 2nd level
-// ]
-//
-// After a selection is changed, 'onChange' will be called with the new data as
-// a parameter.
-//
-// In addition, each selectbox is accompanied by a 'Remove this level' button
-// that deletes it from the UI, adjusts the data and fires the onChange
-// callback.
-//
-// input
-// - groups: array of possible group names (['grp1', 'grp2'])
-// - element: where to hook the UI
-// methods
-// - onChange: setter/getter for a function that is called after a selection
-// is changed or a select box on one level is collapsed
-function groupSelector(groups, element) {
- const NO_GROUP_LABEL = "** NO GROUP **";
- const data: any[] = [];
- let onChange = function (data) {
- // Do nothing
- };
- groups = Array.from(new Set(groups));
-
- function appendAdder() {
- element
- .append("a")
- .attr("href", "#")
- .attr("class", "toggle-grouping-level")
- .text(t("Add a grouping level"))
- .on("click", (d) => {
- data.push([]);
- update();
- })
- .append("i")
- .attr("class", "fa fa-plus");
- }
-
- function update() {
- const updateSection = element.selectAll(".grpCriterion").data(data, (d, i) => i);
-
- updateSection.exit().remove();
-
- const divEnter = updateSection.enter().append("div").attr("class", "grpCriterion");
-
- const selectEnter = divEnter
- .append("select")
- .attr("class", "apply-select2js-on-this")
- .attr("multiple", "multiple")
- .attr("style", "width: 250px");
-
- selectEnter
- .selectAll("option")
- .data(groups)
- .enter()
- .append("option")
- .attr("value", (d) => d)
- .text((d) => d);
-
- selectEnter.append("option").attr("value", NO_GROUP_LABEL).text(NO_GROUP_LABEL);
-
- //HACK: usage of JQuery here is needed to apply the select2js plugin
- jQuery("select.apply-select2js-on-this").each(function (i) {
- var select = jQuery(this);
- // apply select2js only one time
- if (!select.hasClass("select2js-applied")) {
- select.addClass("select2js-applied");
- var select2js = select.select2({ placeholder: t("Select a system group") });
- select2js.on("change", function (event) {
- data[i] = select.val() || [];
- onChange(data);
- });
-
- divEnter
- .append("a")
- .attr("href", "#")
- .attr("class", "toggle-grouping-level")
- .attr("title", "Remove this level")
- .on("click", function () {
- data.splice(i, 1);
- onChange(data);
- update();
- })
- .append("i")
- .attr("class", "fa fa-close");
- } else {
- // if data is changed, e.g. a level is removed,
- // we need to keep aligned data and selected values
- if (data[i] != null && data[i].length > 0) {
- select.val(data[i]).trigger("change");
- }
- }
- });
- }
-
- function my() {
- appendAdder();
- }
-
- my.onChange = function (callback) {
- return arguments.length ? ((onChange = callback), my) : onChange;
- };
-
- return my;
-}
-
-// Add a group selector (see comment for groupSelector)
-//
-// params:
-// - targetSelection - selection where to append the element to
-// - groups - all possible groups to appear in the select boxes
-// - callback - function called after the state of UI changes (either user
-// select a group from the selectbox or they remove the select box for a
-// grouping level)
-function addGroupSelector(targetSelection, groups, callback) {
- const groupingDiv = targetSelection.append("div").attr("class", "filter");
- groupingDiv.append("div").attr("class", "filter-title").text(t("Split into groups"));
-
- let mySel = groupSelector(groups, groupingDiv);
- mySel.onChange(callback);
- mySel();
-}
-
// Add a button with a caption
//
// params:
@@ -264,4 +75,4 @@ function svgTextStyle(container) {
textStyle.append("feComposite").attr("in", "SourceGraphic");
}
-export { addFilter, addCheckinTimePartitioningSelect, addCheckbox, addGroupSelector, addButton, svgTextStyle };
+export { addFilter, addCheckbox, addButton, svgTextStyle };
diff --git a/web/html/src/package.json b/web/html/src/package.json
index e0ea2620a280..ec53c74033dc 100644
--- a/web/html/src/package.json
+++ b/web/html/src/package.json
@@ -103,8 +103,6 @@
"react-toastify": "6.0.5",
"react-virtuoso": "^2.5.1",
"regenerator-runtime": "^0.13.7",
- "select2": "3.4.5",
- "select2-bootstrap-css": "1.4.6",
"semver": "^7.3.8",
"senna": "^2.7.8",
"shelljs": "0.8.5",
diff --git a/web/html/src/styleguide/template.js b/web/html/src/styleguide/template.js
index b320441b8247..e5bd07a73bca 100644
--- a/web/html/src/styleguide/template.js
+++ b/web/html/src/styleguide/template.js
@@ -15,8 +15,6 @@ module.exports = {
`/fonts/font-spacewalk/css/spacewalk-font.css?cb=${noCache}`,
`/css/jquery.timepicker.css?cb=${noCache}`,
`/css/bootstrap-datepicker.css?cb=${noCache}`,
- `/javascript/select2/select2.css?cb=${noCache}`,
- `/javascript/select2/select2-bootstrap.css?cb=${noCache}`,
]
.map(relativeToProxyUrl)
.map((url) => ({
@@ -29,7 +27,6 @@ module.exports = {
// `/javascript/frontend-log.js`,
`/javascript/legacy/jquery.min.js?cb=${noCache}`,
`/javascript/legacy/bootstrap.min.js?cb=${noCache}`,
- `/javascript/select2/select2.js?cb=${noCache}`,
`/javascript/spacewalk-essentials.js?cb=${noCache}`,
`/javascript/spacewalk-checkall.js?cb=${noCache}`,
`/javascript/legacy/jquery.timepicker.js?cb=${noCache}`,
diff --git a/web/html/src/utils/datetime/localizedMoment.ts b/web/html/src/utils/datetime/localizedMoment.ts
index 860ce3aff9bf..f341ab0aaa3a 100644
--- a/web/html/src/utils/datetime/localizedMoment.ts
+++ b/web/html/src/utils/datetime/localizedMoment.ts
@@ -225,4 +225,5 @@ function localizedMomentConstructor(input?: moment.MomentInput) {
}
const localizedMoment: typeof moment = Object.setPrototypeOf(localizedMomentConstructor, moment);
+export type LocalizedMoment = ReturnType;
export { localizedMoment, parseTimeString };
diff --git a/web/html/src/vendors/npm.licenses.structured.js b/web/html/src/vendors/npm.licenses.structured.js
index b0942c9d5234..9a8b20b3e295 100644
--- a/web/html/src/vendors/npm.licenses.structured.js
+++ b/web/html/src/vendors/npm.licenses.structured.js
@@ -1 +1 @@
-const npmLicensesArray=["MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MPL-2.0","MIT","ISC","LGPL-3.0-or-later","MIT","MIT","MIT","MIT","MIT","MIT","MIT","BSD-3-Clause","MIT","MIT","(MPL-2.0 OR Apache-2.0)","BSD-3-Clause","BSD-3-Clause","MIT","MIT","MIT","MIT","BSD-3-Clause","MIT","MIT","MIT","MIT","MIT","MIT","BSD-3-Clause","BSD","BSD","BSD","BSD","BSD","BSD","BSD","BSD","BSD","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","BSD-3-Clause","MIT","MIT","MIT","BSD-3-Clause","MIT","MIT","MIT","MIT","0BSD","MIT","MIT","MIT"],npmDependencies=[{name:"@babel/polyfill",license:"MIT",version:"7.7.0"},{name:"@babel/runtime",license:"MIT",version:"7.16.3"},{name:"@emotion/cache",license:"MIT",version:"11.4.0"},{name:"@emotion/hash",license:"MIT",version:"0.8.0"},{name:"@emotion/memoize",license:"MIT",version:"0.7.5"},{name:"@emotion/react",license:"MIT",version:"11.4.0"},{name:"@emotion/serialize",license:"MIT",version:"1.0.2"},{name:"@emotion/sheet",license:"MIT",version:"1.0.1"},{name:"@emotion/unitless",license:"MIT",version:"0.7.5"},{name:"@emotion/utils",license:"MIT",version:"1.0.0"},{name:"@emotion/weak-memoize",license:"MIT",version:"0.2.5"},{name:"@formatjs/ecma402-abstract",license:"MIT",version:"1.17.0"},{name:"@formatjs/fast-memoize",license:"MIT",version:"2.2.0"},{name:"@formatjs/icu-messageformat-parser",license:"MIT",version:"2.6.0"},{name:"@formatjs/icu-skeleton-parser",license:"MIT",version:"1.6.0"},{name:"@formatjs/intl",license:"MIT",version:"2.9.0"},{name:"@formatjs/intl-localematcher",license:"MIT",version:"0.4.0"},{name:"@fullcalendar/common",license:"MIT",version:"5.5.1"},{name:"@fullcalendar/core",license:"MIT",version:"5.5.0"},{name:"@fullcalendar/daygrid",license:"MIT",version:"5.5.0"},{name:"@fullcalendar/interaction",license:"MIT",version:"5.5.0"},{name:"@fullcalendar/react",license:"MIT",version:"5.5.0"},{name:"@fullcalendar/timegrid",license:"MIT",version:"5.5.0"},{name:"@hot-loader/react-dom",license:"MIT",version:"17.0.1+4.13.0"},{name:"@novnc/novnc",license:"MPL-2.0",version:"1.1.0"},{name:"@popperjs/core",license:"MIT",version:"2.11.6"},{name:"@seznam/compose-react-refs",license:"ISC",version:"1.0.6"},{name:"@spice-project/spice-html5",license:"LGPL-3.0-or-later",version:"0.2.1"},{name:"@virtuoso.dev/react-urx",license:"MIT",version:"0.2.12"},{name:"@virtuoso.dev/urx",license:"MIT",version:"0.2.12"},{name:"babel-loader",license:"MIT",version:"8.2.2"},{name:"bootstrap",license:"MIT",version:"3.4.1"},{name:"classnames",license:"MIT",version:"2.3.1"},{name:"core-js",license:"MIT",version:"3.8.1"},{name:"css-loader",license:"MIT",version:"2.1.1"},{name:"d3",license:"BSD-3-Clause",version:"4.5.0"},{name:"date-fns",license:"MIT",version:"2.29.3"},{name:"dom-helpers",license:"MIT",version:"5.1.4"},{name:"dompurify",license:"(MPL-2.0 OR Apache-2.0)",version:"3.0.3"},{name:"exenv",license:"BSD-3-Clause",version:"1.2.2"},{name:"hoist-non-react-statics",license:"BSD-3-Clause",version:"3.3.2"},{name:"html-dom-parser",license:"MIT",version:"0.2.3"},{name:"html-react-parser",license:"MIT",version:"0.10.0"},{name:"immer",license:"MIT",version:"9.0.6"},{name:"inline-style-parser",license:"MIT",version:"0.1.1"},{name:"intl-messageformat",license:"BSD-3-Clause",version:"10.5.0"},{name:"ip-regex",license:"MIT",version:"4.3.0"},{name:"jexl",license:"MIT",version:"2.2.2"},{name:"less-loader",license:"MIT",version:"10.2.0"},{name:"lodash",license:"MIT",version:"4.17.21"},{name:"lodash.get",license:"MIT",version:"4.4.2"},{name:"memoize-one",license:"MIT",version:"5.1.1"},{name:"metal",license:"BSD-3-Clause",version:"2.16.8"},{name:"metal-ajax",license:"BSD",version:"2.1.1"},{name:"metal-debounce",license:"BSD",version:"2.0.2"},{name:"metal-dom",license:"BSD",version:"2.16.8"},{name:"metal-events",license:"BSD",version:"2.16.8"},{name:"metal-path-parser",license:"BSD",version:"1.0.4"},{name:"metal-promise",license:"BSD",version:"2.0.1"},{name:"metal-structs",license:"BSD",version:"1.0.2"},{name:"metal-uri",license:"BSD",version:"2.4.0"},{name:"metal-useragent",license:"BSD",version:"3.0.1"},{name:"mini-css-extract-plugin",license:"MIT",version:"2.6.0"},{name:"moment",license:"MIT",version:"2.29.4"},{name:"moment-timezone",license:"MIT",version:"0.5.35"},{name:"node-gettext",license:"MIT",version:"3.0.0"},{name:"object-assign",license:"MIT",version:"4.1.1"},{name:"prop-types",license:"MIT",version:"15.7.2"},{name:"react",license:"MIT",version:"16.14.0"},{name:"react-datepicker",license:"MIT",version:"4.5.0"},{name:"react-fast-compare",license:"MIT",version:"3.2.0"},{name:"react-hot-loader",license:"MIT",version:"4.13.0"},{name:"react-input-autosize",license:"MIT",version:"3.0.0"},{name:"react-is",license:"MIT",version:"16.12.0"},{name:"react-is-mounted-hook",license:"MIT",version:"1.1.2"},{name:"react-lifecycles-compat",license:"MIT",version:"3.0.4"},{name:"react-modal",license:"MIT",version:"3.13.1"},{name:"react-onclickoutside",license:"MIT",version:"6.12.2"},{name:"react-popper",license:"MIT",version:"2.3.0"},{name:"react-property",license:"MIT",version:"1.0.1"},{name:"react-select",license:"MIT",version:"4.3.1"},{name:"react-select-async-paginate",license:"MIT",version:"0.6.0"},{name:"react-toastify",license:"MIT",version:"6.0.5"},{name:"react-transition-group",license:"BSD-3-Clause",version:"4.4.2"},{name:"react-virtuoso",license:"MIT",version:"2.5.1"},{name:"regenerator-runtime",license:"MIT",version:"0.13.5"},{name:"scheduler",license:"MIT",version:"0.20.1"},{name:"senna",license:"BSD-3-Clause",version:"2.7.9"},{name:"sleep-promise",license:"MIT",version:"9.1.0"},{name:"style-loader",license:"MIT",version:"0.23.1"},{name:"style-to-object",license:"MIT",version:"0.3.0"},{name:"stylis",license:"MIT",version:"4.0.10"},{name:"tslib",license:"0BSD",version:"2.1.0"},{name:"use-immer",license:"MIT",version:"0.3.5"},{name:"validator",license:"MIT",version:"13.7.0"},{name:"warning",license:"MIT",version:"4.0.3"}];module.exports={npmLicensesArray,npmDependencies};
\ No newline at end of file
+const npmLicensesArray=["MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MPL-2.0","MIT","ISC","LGPL-3.0-or-later","MIT","MIT","MIT","MIT","MIT","MIT","MIT","BSD-3-Clause","MIT","MIT","(MPL-2.0 OR Apache-2.0)","BSD-3-Clause","BSD-3-Clause","MIT","MIT","MIT","MIT","BSD-3-Clause","MIT","MIT","MIT","MIT","MIT","MIT","BSD-3-Clause","BSD","BSD","BSD","BSD","BSD","BSD","BSD","BSD","BSD","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","BSD-3-Clause","MIT","MIT","MIT","BSD-3-Clause","MIT","MIT","MIT","MIT","0BSD","MIT","MIT","MIT"],npmDependencies=[{name:"@babel/polyfill",license:"MIT",version:"7.7.0"},{name:"@babel/runtime",license:"MIT",version:"7.16.3"},{name:"@emotion/cache",license:"MIT",version:"11.11.0"},{name:"@emotion/hash",license:"MIT",version:"0.9.1"},{name:"@emotion/memoize",license:"MIT",version:"0.8.1"},{name:"@emotion/react",license:"MIT",version:"11.11.1"},{name:"@emotion/serialize",license:"MIT",version:"1.1.2"},{name:"@emotion/sheet",license:"MIT",version:"1.2.2"},{name:"@emotion/unitless",license:"MIT",version:"0.8.1"},{name:"@emotion/use-insertion-effect-with-fallbacks",license:"MIT",version:"1.0.1"},{name:"@emotion/utils",license:"MIT",version:"1.2.1"},{name:"@emotion/weak-memoize",license:"MIT",version:"0.3.1"},{name:"@formatjs/ecma402-abstract",license:"MIT",version:"1.17.0"},{name:"@formatjs/fast-memoize",license:"MIT",version:"2.2.0"},{name:"@formatjs/icu-messageformat-parser",license:"MIT",version:"2.6.0"},{name:"@formatjs/icu-skeleton-parser",license:"MIT",version:"1.6.0"},{name:"@formatjs/intl",license:"MIT",version:"2.9.0"},{name:"@formatjs/intl-localematcher",license:"MIT",version:"0.4.0"},{name:"@fullcalendar/common",license:"MIT",version:"5.5.1"},{name:"@fullcalendar/core",license:"MIT",version:"5.5.0"},{name:"@fullcalendar/daygrid",license:"MIT",version:"5.5.0"},{name:"@fullcalendar/interaction",license:"MIT",version:"5.5.0"},{name:"@fullcalendar/react",license:"MIT",version:"5.5.0"},{name:"@fullcalendar/timegrid",license:"MIT",version:"5.5.0"},{name:"@hot-loader/react-dom",license:"MIT",version:"17.0.1+4.13.0"},{name:"@novnc/novnc",license:"MPL-2.0",version:"1.1.0"},{name:"@popperjs/core",license:"MIT",version:"2.11.6"},{name:"@seznam/compose-react-refs",license:"ISC",version:"1.0.6"},{name:"@spice-project/spice-html5",license:"LGPL-3.0-or-later",version:"0.2.1"},{name:"@virtuoso.dev/react-urx",license:"MIT",version:"0.2.12"},{name:"@virtuoso.dev/urx",license:"MIT",version:"0.2.12"},{name:"babel-loader",license:"MIT",version:"8.2.2"},{name:"bootstrap",license:"MIT",version:"3.4.1"},{name:"classnames",license:"MIT",version:"2.3.1"},{name:"core-js",license:"MIT",version:"3.8.1"},{name:"css-loader",license:"MIT",version:"2.1.1"},{name:"d3",license:"BSD-3-Clause",version:"4.5.0"},{name:"date-fns",license:"MIT",version:"2.29.3"},{name:"dom-helpers",license:"MIT",version:"5.1.4"},{name:"dompurify",license:"(MPL-2.0 OR Apache-2.0)",version:"3.0.3"},{name:"exenv",license:"BSD-3-Clause",version:"1.2.2"},{name:"hoist-non-react-statics",license:"BSD-3-Clause",version:"3.3.2"},{name:"html-dom-parser",license:"MIT",version:"0.2.3"},{name:"html-react-parser",license:"MIT",version:"0.10.0"},{name:"immer",license:"MIT",version:"9.0.6"},{name:"inline-style-parser",license:"MIT",version:"0.1.1"},{name:"intl-messageformat",license:"BSD-3-Clause",version:"10.5.0"},{name:"ip-regex",license:"MIT",version:"4.3.0"},{name:"jexl",license:"MIT",version:"2.2.2"},{name:"less-loader",license:"MIT",version:"10.2.0"},{name:"lodash",license:"MIT",version:"4.17.21"},{name:"lodash.get",license:"MIT",version:"4.4.2"},{name:"memoize-one",license:"MIT",version:"5.2.1"},{name:"metal",license:"BSD-3-Clause",version:"2.16.8"},{name:"metal-ajax",license:"BSD",version:"2.1.1"},{name:"metal-debounce",license:"BSD",version:"2.0.2"},{name:"metal-dom",license:"BSD",version:"2.16.8"},{name:"metal-events",license:"BSD",version:"2.16.8"},{name:"metal-path-parser",license:"BSD",version:"1.0.4"},{name:"metal-promise",license:"BSD",version:"2.0.1"},{name:"metal-structs",license:"BSD",version:"1.0.2"},{name:"metal-uri",license:"BSD",version:"2.4.0"},{name:"metal-useragent",license:"BSD",version:"3.0.1"},{name:"mini-css-extract-plugin",license:"MIT",version:"2.6.0"},{name:"moment",license:"MIT",version:"2.29.4"},{name:"moment-timezone",license:"MIT",version:"0.5.35"},{name:"node-gettext",license:"MIT",version:"3.0.0"},{name:"object-assign",license:"MIT",version:"4.1.1"},{name:"prop-types",license:"MIT",version:"15.7.2"},{name:"react",license:"MIT",version:"16.14.0"},{name:"react-datepicker",license:"MIT",version:"4.5.0"},{name:"react-fast-compare",license:"MIT",version:"3.2.0"},{name:"react-hot-loader",license:"MIT",version:"4.13.0"},{name:"react-input-autosize",license:"MIT",version:"3.0.0"},{name:"react-is",license:"MIT",version:"16.12.0"},{name:"react-is-mounted-hook",license:"MIT",version:"1.1.2"},{name:"react-lifecycles-compat",license:"MIT",version:"3.0.4"},{name:"react-modal",license:"MIT",version:"3.13.1"},{name:"react-onclickoutside",license:"MIT",version:"6.12.2"},{name:"react-popper",license:"MIT",version:"2.3.0"},{name:"react-property",license:"MIT",version:"1.0.1"},{name:"react-select",license:"MIT",version:"4.3.1"},{name:"react-select-async-paginate",license:"MIT",version:"0.6.0"},{name:"react-toastify",license:"MIT",version:"6.0.5"},{name:"react-transition-group",license:"BSD-3-Clause",version:"4.4.2"},{name:"react-virtuoso",license:"MIT",version:"2.5.1"},{name:"regenerator-runtime",license:"MIT",version:"0.13.5"},{name:"scheduler",license:"MIT",version:"0.20.1"},{name:"senna",license:"BSD-3-Clause",version:"2.7.9"},{name:"sleep-promise",license:"MIT",version:"9.1.0"},{name:"style-loader",license:"MIT",version:"0.23.1"},{name:"style-to-object",license:"MIT",version:"0.3.0"},{name:"stylis",license:"MIT",version:"4.2.0"},{name:"tslib",license:"0BSD",version:"2.1.0"},{name:"use-immer",license:"MIT",version:"0.3.5"},{name:"validator",license:"MIT",version:"13.7.0"},{name:"warning",license:"MIT",version:"4.0.3"}];module.exports={npmLicensesArray,npmDependencies};
\ No newline at end of file
diff --git a/web/html/src/vendors/npm.licenses.txt b/web/html/src/vendors/npm.licenses.txt
index 6f60426348dd..9749f65a0108 100644
--- a/web/html/src/vendors/npm.licenses.txt
+++ b/web/html/src/vendors/npm.licenses.txt
@@ -61,7 +61,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
-@emotion/cache v11.4.0
+@emotion/cache v11.11.0
https://github.com/emotion-js/emotion/tree/main/packages/cache
--------------------------------------------------------------------------------
@@ -89,8 +89,8 @@ SOFTWARE.
--------------------------------------------------------------------------------
-@emotion/hash v0.8.0
-https://github.com/emotion-js/emotion/tree/master/packages/hash
+@emotion/hash v0.9.1
+https://github.com/emotion-js/emotion/tree/main/packages/hash
--------------------------------------------------------------------------------
MIT License
@@ -117,8 +117,8 @@ SOFTWARE.
--------------------------------------------------------------------------------
-@emotion/memoize v0.7.5
-https://github.com/emotion-js/emotion/tree/master/packages/memoize
+@emotion/memoize v0.8.1
+https://github.com/emotion-js/emotion/tree/main/packages/memoize
--------------------------------------------------------------------------------
MIT License
@@ -145,7 +145,7 @@ SOFTWARE.
--------------------------------------------------------------------------------
-@emotion/react v11.4.0 - mitchellhamilton
+@emotion/react v11.11.1 - Emotion Contributors
https://github.com/emotion-js/emotion/tree/main/packages/react
--------------------------------------------------------------------------------
@@ -173,7 +173,7 @@ SOFTWARE.
--------------------------------------------------------------------------------
-@emotion/serialize v1.0.2
+@emotion/serialize v1.1.2
https://github.com/emotion-js/emotion/tree/main/packages/serialize
--------------------------------------------------------------------------------
@@ -201,8 +201,8 @@ SOFTWARE.
--------------------------------------------------------------------------------
-@emotion/sheet v1.0.1
-https://github.com/emotion-js/emotion/tree/master/packages/sheet
+@emotion/sheet v1.2.2
+https://github.com/emotion-js/emotion/tree/main/packages/sheet
--------------------------------------------------------------------------------
MIT License
@@ -229,8 +229,8 @@ SOFTWARE.
--------------------------------------------------------------------------------
-@emotion/unitless v0.7.5
-https://github.com/emotion-js/emotion/tree/master/packages/unitless
+@emotion/unitless v0.8.1
+https://github.com/emotion-js/emotion/tree/main/packages/unitless
--------------------------------------------------------------------------------
MIT License
@@ -257,8 +257,8 @@ SOFTWARE.
--------------------------------------------------------------------------------
-@emotion/utils v1.0.0
-https://github.com/emotion-js/emotion/tree/master/packages/utils
+@emotion/use-insertion-effect-with-fallbacks v1.0.1
+https://github.com/emotion-js/emotion/tree/main/packages/use-insertion-effect-with-fallbacks
--------------------------------------------------------------------------------
MIT License
@@ -285,8 +285,36 @@ SOFTWARE.
--------------------------------------------------------------------------------
-@emotion/weak-memoize v0.2.5
-https://github.com/emotion-js/emotion/tree/master/packages/weak-memoize
+@emotion/utils v1.2.1
+https://github.com/emotion-js/emotion/tree/main/packages/utils
+--------------------------------------------------------------------------------
+
+MIT License
+
+Copyright (c) Emotion team and other contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+--------------------------------------------------------------------------------
+@emotion/weak-memoize v0.3.1
+https://github.com/emotion-js/emotion/tree/main/packages/weak-memoize
--------------------------------------------------------------------------------
MIT License
@@ -1867,7 +1895,7 @@ terms above.
--------------------------------------------------------------------------------
-memoize-one v5.1.1 - Alex Reardon
+memoize-one v5.2.1 - Alex Reardon
https://github.com/alexreardon/memoize-one.git
--------------------------------------------------------------------------------
@@ -3040,7 +3068,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
-stylis v4.0.10 - Sultan Tarimo
+stylis v4.2.0 - Sultan Tarimo
https://github.com/thysultan/stylis.js
--------------------------------------------------------------------------------
diff --git a/web/html/src/yarn.lock b/web/html/src/yarn.lock
index 16a7cf066386..4034dc3e3a59 100644
--- a/web/html/src/yarn.lock
+++ b/web/html/src/yarn.lock
@@ -1451,7 +1451,7 @@
core-js-pure "^3.0.0"
regenerator-runtime "^0.13.4"
-"@babel/runtime@7.16.3", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7":
+"@babel/runtime@7.16.3", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.18.3", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7":
version "7.16.3"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5"
integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==
@@ -1656,6 +1656,34 @@
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f"
integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==
+"@emotion/babel-plugin@^11.11.0":
+ version "11.11.0"
+ resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c"
+ integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/runtime" "^7.18.3"
+ "@emotion/hash" "^0.9.1"
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/serialize" "^1.1.2"
+ babel-plugin-macros "^3.1.0"
+ convert-source-map "^1.5.0"
+ escape-string-regexp "^4.0.0"
+ find-root "^1.1.0"
+ source-map "^0.5.7"
+ stylis "4.2.0"
+
+"@emotion/cache@^11.11.0":
+ version "11.11.0"
+ resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff"
+ integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==
+ dependencies:
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/sheet" "^1.2.2"
+ "@emotion/utils" "^1.2.1"
+ "@emotion/weak-memoize" "^0.3.1"
+ stylis "4.2.0"
+
"@emotion/cache@^11.4.0":
version "11.4.0"
resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.4.0.tgz#293fc9d9a7a38b9aad8e9337e5014366c3b09ac0"
@@ -1667,60 +1695,86 @@
"@emotion/weak-memoize" "^0.2.5"
stylis "^4.0.3"
-"@emotion/hash@^0.8.0":
- version "0.8.0"
- resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413"
- integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
+"@emotion/hash@^0.9.1":
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43"
+ integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==
"@emotion/memoize@^0.7.4":
version "0.7.5"
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50"
integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==
+"@emotion/memoize@^0.8.1":
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17"
+ integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
+
"@emotion/react@^11.1.1":
- version "11.4.0"
- resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.4.0.tgz#2465ad7b073a691409b88dfd96dc17097ddad9b7"
- integrity sha512-4XklWsl9BdtatLoJpSjusXhpKv9YVteYKh9hPKP1Sxl+mswEFoUe0WtmtWjxEjkA51DQ2QRMCNOvKcSlCQ7ivg==
- dependencies:
- "@babel/runtime" "^7.13.10"
- "@emotion/cache" "^11.4.0"
- "@emotion/serialize" "^1.0.2"
- "@emotion/sheet" "^1.0.1"
- "@emotion/utils" "^1.0.0"
- "@emotion/weak-memoize" "^0.2.5"
+ version "11.11.1"
+ resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.1.tgz#b2c36afac95b184f73b08da8c214fdf861fa4157"
+ integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==
+ dependencies:
+ "@babel/runtime" "^7.18.3"
+ "@emotion/babel-plugin" "^11.11.0"
+ "@emotion/cache" "^11.11.0"
+ "@emotion/serialize" "^1.1.2"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1"
+ "@emotion/utils" "^1.2.1"
+ "@emotion/weak-memoize" "^0.3.1"
hoist-non-react-statics "^3.3.1"
-"@emotion/serialize@^1.0.2":
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.2.tgz#77cb21a0571c9f68eb66087754a65fa97bfcd965"
- integrity sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==
+"@emotion/serialize@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.2.tgz#017a6e4c9b8a803bd576ff3d52a0ea6fa5a62b51"
+ integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==
dependencies:
- "@emotion/hash" "^0.8.0"
- "@emotion/memoize" "^0.7.4"
- "@emotion/unitless" "^0.7.5"
- "@emotion/utils" "^1.0.0"
+ "@emotion/hash" "^0.9.1"
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/unitless" "^0.8.1"
+ "@emotion/utils" "^1.2.1"
csstype "^3.0.2"
-"@emotion/sheet@^1.0.0", "@emotion/sheet@^1.0.1":
+"@emotion/sheet@^1.0.0":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.0.1.tgz#245f54abb02dfd82326e28689f34c27aa9b2a698"
integrity sha512-GbIvVMe4U+Zc+929N1V7nW6YYJtidj31lidSmdYcWozwoBIObXBnaJkKNDjZrLm9Nc0BR+ZyHNaRZxqNZbof5g==
-"@emotion/unitless@^0.7.5":
- version "0.7.5"
- resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed"
- integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
+"@emotion/sheet@^1.2.2":
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec"
+ integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==
+
+"@emotion/unitless@^0.8.1":
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3"
+ integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==
+
+"@emotion/use-insertion-effect-with-fallbacks@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963"
+ integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==
"@emotion/utils@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.0.0.tgz#abe06a83160b10570816c913990245813a2fd6af"
integrity sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==
+"@emotion/utils@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4"
+ integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==
+
"@emotion/weak-memoize@^0.2.5":
version "0.2.5"
resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46"
integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==
+"@emotion/weak-memoize@^0.3.1":
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6"
+ integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==
+
"@eslint/eslintrc@^0.4.3":
version "0.4.3"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c"
@@ -3714,6 +3768,15 @@ babel-plugin-jest-hoist@^27.4.0:
"@types/babel__core" "^7.0.0"
"@types/babel__traverse" "^7.0.6"
+babel-plugin-macros@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1"
+ integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==
+ dependencies:
+ "@babel/runtime" "^7.12.5"
+ cosmiconfig "^7.0.0"
+ resolve "^1.19.0"
+
babel-plugin-polyfill-corejs2@^0.3.0:
version "0.3.1"
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5"
@@ -4539,6 +4602,11 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
dependencies:
safe-buffer "~5.1.1"
+convert-source-map@^1.5.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
+ integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
+
convert-source-map@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
@@ -4657,6 +4725,17 @@ cosmiconfig@^6.0.0:
path-type "^4.0.0"
yaml "^1.7.2"
+cosmiconfig@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6"
+ integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.2.1"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.10.0"
+
cross-spawn@^6.0.0, cross-spawn@^6.0.5:
version "6.0.5"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
@@ -6343,6 +6422,11 @@ find-cache-dir@^3.3.1:
make-dir "^3.0.2"
pkg-dir "^4.1.0"
+find-root@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
+ integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
+
find-up@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
@@ -7427,6 +7511,13 @@ is-callable@^1.2.4:
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
+is-core-module@^2.13.0:
+ version "2.13.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db"
+ integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==
+ dependencies:
+ has "^1.0.3"
+
is-core-module@^2.2.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1"
@@ -8903,9 +8994,9 @@ memfs@^3.1.2, memfs@^3.2.2:
fs-monkey "1.0.3"
memoize-one@^5.0.0:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0"
- integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e"
+ integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==
memory-fs@^0.4.1:
version "0.4.1"
@@ -10191,7 +10282,7 @@ prompts@^2.4.2:
kleur "^3.0.3"
sisteransi "^1.0.5"
-prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
+prop-types@^15.5.10, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
version "15.7.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
@@ -10200,6 +10291,15 @@ prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1,
object-assign "^4.1.1"
react-is "^16.8.1"
+prop-types@^15.5.8:
+ version "15.8.1"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
+ integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
+ dependencies:
+ loose-envify "^1.4.0"
+ object-assign "^4.1.1"
+ react-is "^16.13.1"
+
proxy-addr@~2.0.7:
version "2.0.7"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
@@ -10458,6 +10558,11 @@ react-is-mounted-hook@^1.1.2:
resolved "https://registry.yarnpkg.com/react-is-mounted-hook/-/react-is-mounted-hook-1.1.2.tgz#0e57d237c0ed60f6a8dc0520634608a80ae864ff"
integrity sha512-yjq3Tj34CiFcdVOS/h6JerWLOLdJqEGKMNpTHc4kWebzz2YtIpgqMRrqxdmQhewM1KJREojdAV2tsNvBsUWyhA==
+react-is@^16.13.1:
+ version "16.13.1"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
react-is@^16.7.0, react-is@^16.8.1:
version "16.12.0"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c"
@@ -11003,6 +11108,15 @@ resolve@^1.14.2:
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
+resolve@^1.19.0:
+ version "1.22.8"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
+ integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
+ dependencies:
+ is-core-module "^2.13.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
resolve@^1.20.0, resolve@^1.9.0:
version "1.21.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.21.0.tgz#b51adc97f3472e6a5cf4444d34bc9d6b9037591f"
@@ -11223,16 +11337,6 @@ select-hose@^2.0.0:
resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=
-select2-bootstrap-css@1.4.6:
- version "1.4.6"
- resolved "https://registry.yarnpkg.com/select2-bootstrap-css/-/select2-bootstrap-css-1.4.6.tgz#5cfb68246f5299ca1858e01efd788804c734997e"
- integrity sha512-BBsisfivUYjwhj3QdWNS15sBqC/DHoszRC4B3GIzJwMNO1pT1uVvwDm5u2TLXi7oj/3S4vIeQ6yAuMa86d7c9A==
-
-select2@3.4.5:
- version "3.4.5"
- resolved "https://registry.yarnpkg.com/select2/-/select2-3.4.5.tgz#c0555ed77da22b1d402ec9e1a69687abc15e747a"
- integrity sha512-M+XNsLYyQ8oML8cRqqcPWuRs90gOxbS0O+OZtZycJ8ybJuJ1m/B/I3DJ5HlLWEXH1s6rZPsa0j2392XWdOQAaQ==
-
selfsigned@^1.10.8:
version "1.10.14"
resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.14.tgz#ee51d84d9dcecc61e07e4aba34f229ab525c1574"
@@ -11616,7 +11720,7 @@ source-map-url@^0.4.0:
resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
-source-map@^0.5.0, source-map@^0.5.6:
+source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
@@ -12018,6 +12122,11 @@ style-to-object@0.3.0:
dependencies:
inline-style-parser "0.1.1"
+stylis@4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51"
+ integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==
+
stylis@^4.0.3:
version "4.0.10"
resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.10.tgz#446512d1097197ab3f02fb3c258358c3f7a14240"
@@ -13163,6 +13272,11 @@ yallist@^4.0.0:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+yaml@^1.10.0:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+
yaml@^1.7.2:
version "1.7.2"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2"
diff --git a/web/spacewalk-web.changes.eth.select2 b/web/spacewalk-web.changes.eth.select2
new file mode 100644
index 000000000000..18e05b70e964
--- /dev/null
+++ b/web/spacewalk-web.changes.eth.select2
@@ -0,0 +1 @@
+- Remove Select2
diff --git a/web/spacewalk-web.spec b/web/spacewalk-web.spec
index 1562d66d29ce..043eba902eb1 100644
--- a/web/spacewalk-web.spec
+++ b/web/spacewalk-web.spec
@@ -267,8 +267,6 @@ sed -i -e 's/^web.theme_default =.*$/web.theme_default = susemanager-light/' $RP
%{www_path}/javascript/manager/*.{js,js.LICENSE.txt,css}
%dir %{www_path}/javascript/legacy
%{www_path}/javascript/legacy/*.{js,js.LICENSE.txt,css}
-%dir %{www_path}/javascript/legacy/select2
-%{www_path}/javascript/legacy/select2/*
%dir %{www_path}/javascript/legacy/ace-editor
%{www_path}/javascript/legacy/ace-editor/*
%license LICENSE