diff --git a/CODEOWNERS b/CODEOWNERS index ead9ee8a62e8..4c3dcb908ebb 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -132,30 +132,30 @@ go.mod @fleetdm/go /.github/workflows/trivy-scan.yml @lukeheath /.github/workflows/goreleaser-snapshot-fleet.yaml @lukeheath /.github/workflows/build-and-push-fleetctl-docker.yml @lukeheath -/.github/workflows/fleetd-tuf.yml @lucasmrod -/.github/workflows/generate-desktop-targets.yml @lucasmrod -/.github/workflows/test-yml-specs.yml @lucasmrod -/.github/workflows/build-binaries.yaml @lucasmrod -/.github/workflows/fleet-and-orbit.yml @lucasmrod -/.github/workflows/build-orbit.yaml @lucasmrod -/.github/workflows/generate-osqueryd-targets.yml @lucasmrod -/.github/workflows/test-packaging.yml @lucasmrod -/.github/workflows/release-helm.yaml @rfairburn -/.github/workflows/pr-helm.yaml @rfairburn -/.github/workflows/tfvalidate.yml @rfairburn -/.github/workflows/dogfood-deploy.yml @rfairburn -/.github/workflows/test-db-changes.yml @roperzh -/.github/workflows/test-go.yaml @roperzh -/.github/workflows/golangci-lint.yml @roperzh -/.github/workflows/test-native-tooling-packaging.yml @roperzh -/.github/workflows/check-tuf-timestamps.yml @roperzh -/.github/workflows/test-puppet.yml @roperzh -/.github/workflows/generate-nudge-targets.yml @roperzh -/.github/workflows/test-js.yml @ghernandez345 -/.github/workflows/dogfood-gitops.yml @getvictor -/.github/workflows/test-fleetd-chrome.yml @getvictor -/.github/workflows/release-fleetd-chrome.yml @getvictor -/.github/workflows/release-fleetd-chrome-beta.yml @getvictor +/.github/workflows/fleetd-tuf.yml @lucasmrod @lukeheath +/.github/workflows/generate-desktop-targets.yml @lucasmrod @lukeheath +/.github/workflows/test-yml-specs.yml @lucasmrod @lukeheath +/.github/workflows/build-binaries.yaml @lucasmrod @lukeheath +/.github/workflows/fleet-and-orbit.yml @lucasmrod @lukeheath +/.github/workflows/build-orbit.yaml @lucasmrod @lukeheath +/.github/workflows/generate-osqueryd-targets.yml @lucasmrod @lukeheath +/.github/workflows/test-packaging.yml @lucasmrod @lukeheath +/.github/workflows/release-helm.yaml @rfairburn @lukeheath +/.github/workflows/pr-helm.yaml @rfairburn @lukeheath +/.github/workflows/tfvalidate.yml @rfairburn @lukeheath +/.github/workflows/dogfood-deploy.yml @rfairburn @lukeheath +/.github/workflows/test-db-changes.yml @roperzh @lukeheath +/.github/workflows/test-go.yaml @roperzh @lukeheath +/.github/workflows/golangci-lint.yml @roperzh @lukeheath +/.github/workflows/test-native-tooling-packaging.yml @roperzh @lukeheath +/.github/workflows/check-tuf-timestamps.yml @roperzh @lukeheath +/.github/workflows/test-puppet.yml @roperzh @lukeheath +/.github/workflows/generate-nudge-targets.yml @roperzh @lukeheath +/.github/workflows/test-js.yml @ghernandez345 @lukeheath +/.github/workflows/dogfood-gitops.yml @getvictor @lukeheath +/.github/workflows/test-fleetd-chrome.yml @getvictor @lukeheath +/.github/workflows/release-fleetd-chrome.yml @getvictor @lukeheath +/.github/workflows/release-fleetd-chrome-beta.yml @getvictor @lukeheath # ℹ️ But wait, there's more! # See the comments up top to learn where else DRIs and maintainers are configured. diff --git a/changes/17208-hover-states b/changes/17208-hover-states new file mode 100644 index 000000000000..5ae0c7f17a04 --- /dev/null +++ b/changes/17208-hover-states @@ -0,0 +1 @@ +Fleet UI: Add hover states to clickable elements diff --git a/changes/17662-render-standard-query-platforms-correctly b/changes/17662-render-standard-query-platforms-correctly new file mode 100644 index 000000000000..c625264580fa --- /dev/null +++ b/changes/17662-render-standard-query-platforms-correctly @@ -0,0 +1 @@ +- Fixes UI bug to render the query platform correctly for queries imported from the standard query library diff --git a/ee/vulnerability-dashboard/api/hooks/OktaSSO/index.js b/ee/vulnerability-dashboard/api/hooks/okta-sso/index.js similarity index 96% rename from ee/vulnerability-dashboard/api/hooks/OktaSSO/index.js rename to ee/vulnerability-dashboard/api/hooks/okta-sso/index.js index d66c67db1e4a..d50c580c981a 100644 --- a/ee/vulnerability-dashboard/api/hooks/OktaSSO/index.js +++ b/ee/vulnerability-dashboard/api/hooks/okta-sso/index.js @@ -35,6 +35,7 @@ module.exports = function (sails){ } // Clone the existing routes + // NOTE: Changing sails.config after the app lifts goes against Sails.js conventions and this code should not be reproduced. let appRoutes = Object.assign({}, sails.config.routes); // Remove the routes for the built-in login page.. delete appRoutes['GET /login']; @@ -45,9 +46,9 @@ module.exports = function (sails){ 'bodyParser', 'compress', 'poweredBy', + 'www',// Note: This changes the conventions of Sails.js. Don't ever replicate this or use Passport.js. 'oktaSSO', 'router', - 'www', 'favicon', ]; // Specify a custom http middleware order, placing the Okta middleware before the router. This is so the routes generated by Okta will take precedence over the sails router. diff --git a/frontend/components/forms/fields/Checkbox/_styles.scss b/frontend/components/forms/fields/Checkbox/_styles.scss index 1e4479d3d837..bf816bf6938e 100644 --- a/frontend/components/forms/fields/Checkbox/_styles.scss +++ b/frontend/components/forms/fields/Checkbox/_styles.scss @@ -25,6 +25,12 @@ &--disabled { &::after { @include disabled; + + &:hover { + &::after { + background-color: $core-vibrant-blue-over; + border: solid 2px $core-vibrant-blue-over; + } } @@ -49,6 +55,7 @@ @include size(20px); @include position(absolute, 0 null null 0); display: inline-block; + cursor: pointer; &::after { @include size(20px); @@ -61,6 +68,18 @@ background-color: $core-white; visibility: visible; } + &:hover { + &::after { + border: solid 2px $core-vibrant-blue-over; + } + } + + &--disabled { + &::after { + background-color: $ui-fleet-black-25; + } + cursor: default; + } &--indeterminate { &::after { @@ -68,6 +87,15 @@ border: solid 1px $core-vibrant-blue; } + &:hover { + &::after { + &::after { + background-color: $core-vibrant-blue-over; + border: solid 1px $core-vibrant-blue-over; + } + } + } + &::before { @include position(absolute, 50% null null 50%); box-sizing: border-box; diff --git a/frontend/components/forms/fields/Dropdown/_styles.scss b/frontend/components/forms/fields/Dropdown/_styles.scss index d955d357f2d7..5523158b09e2 100644 --- a/frontend/components/forms/fields/Dropdown/_styles.scss +++ b/frontend/components/forms/fields/Dropdown/_styles.scss @@ -75,6 +75,8 @@ background-color: $ui-light-grey; border: 0; border-radius: $border-radius; + cursor: pointer; + .Select-value { font-size: $small; background-color: $ui-light-grey; diff --git a/frontend/pages/DashboardPage/cards/MDM/MDM.tsx b/frontend/pages/DashboardPage/cards/MDM/MDM.tsx index e102869a4d1a..2e79bd874926 100644 --- a/frontend/pages/DashboardPage/cards/MDM/MDM.tsx +++ b/frontend/pages/DashboardPage/cards/MDM/MDM.tsx @@ -166,6 +166,7 @@ const Mdm = ({ isAllPagesSelected={false} disableCount disablePagination + disableMultiRowSelect onClickRow={handleSolutionRowClick} /> )} diff --git a/frontend/pages/hosts/ManageHostsPage/components/LabelFilterSelect/_styles.scss b/frontend/pages/hosts/ManageHostsPage/components/LabelFilterSelect/_styles.scss index 0c1ed6fac543..72ab4f59e942 100644 --- a/frontend/pages/hosts/ManageHostsPage/components/LabelFilterSelect/_styles.scss +++ b/frontend/pages/hosts/ManageHostsPage/components/LabelFilterSelect/_styles.scss @@ -26,6 +26,10 @@ border-radius: $border-radius; height: 40px; + :hover { + cursor: pointer; + } + &--is-focused, &--menu-is-open, &:hover { diff --git a/frontend/pages/queries/edit/components/EditQueryForm/EditQueryForm.tsx b/frontend/pages/queries/edit/components/EditQueryForm/EditQueryForm.tsx index e6ac26e7c293..c5b70d70a963 100644 --- a/frontend/pages/queries/edit/components/EditQueryForm/EditQueryForm.tsx +++ b/frontend/pages/queries/edit/components/EditQueryForm/EditQueryForm.tsx @@ -724,7 +724,7 @@ const EditQueryForm = ({ placeholder="Select" label="Platform" onChange={onChangeSelectPlatformOptions} - value={lastEditedQueryPlatforms} + value={lastEditedQueryPlatforms.replace(/\s/g, "")} // NOTE: FE requires no whitespace to render UI multi wrapperClassName={`${baseClass}__form-field form-field--platform`} helpText="By default, your query collects data on all compatible platforms." diff --git a/handbook/product-design/README.md b/handbook/product-design/README.md index 21e61fe871c3..835982d97007 100644 --- a/handbook/product-design/README.md +++ b/handbook/product-design/README.md @@ -170,7 +170,7 @@ Every week, a member of the product team looks up whether there is: 4. a release of CIS Benchmarks for [macOS 14 Sonoma](https://workbench.cisecurity.org/community/20/benchmarks?q=sonoma&status=&sortBy=version&type=desc) 5. a new major or minor version of [ChromeOS](https://chromereleases.googleblog.com/search/label/Chrome%20OS) -The DRI should record the latest versions in the [maintenance tracker](https://docs.google.com/spreadsheets/d/1IWfQtSkOQgm_JIQZ0i2y3A8aaK5vQW1ayWRk6-4FOp0/edit#gid=0) and then notify the [#help-product-design Slack channel](https://fleetdm.slack.com/archives/C02A8BRABB5) with an update, noting the current versions and highlighting any changes. +The DRI should record the latest versions in the [maintenance tracker](https://docs.google.com/spreadsheets/d/1IWfQtSkOQgm_JIQZ0i2y3A8aaK5vQW1ayWRk6-4FOp0/edit#gid=0). If there are any changes, the DRI sends an update in the [#help-product-design Slack channel](https://fleetdm.slack.com/archives/C02A8BRABB5). ### View Fleet usage statistics In order to understand the usage of the Fleet product, we [collect statistics](https://fleetdm.com/docs/using-fleet/usage-statistics) from installations where this functionality is enabled. diff --git a/website/api/controllers/deliver-premium-upgrade-form.js b/website/api/controllers/deliver-premium-upgrade-form.js deleted file mode 100644 index 783191f13eef..000000000000 --- a/website/api/controllers/deliver-premium-upgrade-form.js +++ /dev/null @@ -1,72 +0,0 @@ -module.exports = { - - - friendlyName: 'Deliver premium upgrade form', - - - description: 'Delivers a Fleet Premium upgrade form submission to a Zapier webhook', - - - inputs: { - organization: { - type: 'string', - required: true, - }, - - monthsUsingFleetFree: { - type: 'string', - required: true, - example: '1 - 3 months' - }, - - emailAddress: { - type: 'string', - isEmail: true, - required: true, - }, - - numberOfHosts: { - type: 'number', - required: true, - isInteger: true, - } - }, - - - exits: { - success: { - description: 'The Fleet Premium upgrade form submission was sent to Zapier successfully.' - } - }, - - - fn: async function ({organization, monthsUsingFleetFree, emailAddress, numberOfHosts}) { - - if(!sails.config.custom.zapierSandboxWebhookSecret) { - throw new Error('Message not delivered: zapierSandboxWebhookSecret needs to be configured in sails.config.custom.'); - } - - // Send a POST request to Zapier - await sails.helpers.http.post( - 'https://hooks.zapier.com/hooks/catch/3627242/bvxxkjf/', - { - 'emailAddress': emailAddress, - 'organization': organization, - 'numberOfHosts': numberOfHosts, - 'monthsUsingFleetFree': monthsUsingFleetFree, - 'webhookSecret': sails.config.custom.zapierSandboxWebhookSecret - } - ) - .timeout(5000) - .tolerate(['non200Response', 'requestFailed', {name: 'TimeoutError'}], (err)=>{ - // Note that Zapier responds with a 2xx status code even if something goes wrong, so just because this message is not logged doesn't mean everything is hunky dory. More info: https://github.com/fleetdm/fleet/pull/6380#issuecomment-1204395762 - sails.log.warn(`When a user submitted the Fleet Premium upgrade form, an error occurred while sending a request to Zapier. Raw error: ${require('util').inspect(err)}`); - return; - });//∞ - - // All done. - return; - } - - -}; diff --git a/website/api/controllers/view-upgrade.js b/website/api/controllers/view-upgrade.js deleted file mode 100644 index e946b027004f..000000000000 --- a/website/api/controllers/view-upgrade.js +++ /dev/null @@ -1,27 +0,0 @@ -module.exports = { - - - friendlyName: 'View upgrade', - - - description: 'Display "Upgrade" page.', - - - exits: { - - success: { - viewTemplatePath: 'pages/upgrade' - } - - }, - - - fn: async function () { - - // Respond with view. - return {}; - - } - - -}; diff --git a/website/assets/images/premium-landing-feature-1.svg b/website/assets/images/premium-landing-feature-1.svg deleted file mode 100644 index 39945d4cfddb..000000000000 --- a/website/assets/images/premium-landing-feature-1.svg +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/website/assets/images/premium-landing-feature-2.svg b/website/assets/images/premium-landing-feature-2.svg deleted file mode 100644 index 61e48c60d3f1..000000000000 --- a/website/assets/images/premium-landing-feature-2.svg +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/website/assets/images/premium-landing-feature-3.svg b/website/assets/images/premium-landing-feature-3.svg deleted file mode 100644 index 28a0ffeaea4a..000000000000 --- a/website/assets/images/premium-landing-feature-3.svg +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/website/assets/images/premium-landing-feature-4.svg b/website/assets/images/premium-landing-feature-4.svg deleted file mode 100644 index 239a1cc75c0c..000000000000 --- a/website/assets/images/premium-landing-feature-4.svg +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/website/assets/images/premium-landing-feature-5.svg b/website/assets/images/premium-landing-feature-5.svg deleted file mode 100644 index 50ddd2e529a5..000000000000 --- a/website/assets/images/premium-landing-feature-5.svg +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/website/assets/js/pages/upgrade.page.js b/website/assets/js/pages/upgrade.page.js deleted file mode 100644 index 9281c1a9b774..000000000000 --- a/website/assets/js/pages/upgrade.page.js +++ /dev/null @@ -1,64 +0,0 @@ -parasails.registerPage('upgrade', { - // ╦╔╗╔╦╔╦╗╦╔═╗╦ ╔═╗╔╦╗╔═╗╔╦╗╔═╗ - // ║║║║║ ║ ║╠═╣║ ╚═╗ ║ ╠═╣ ║ ║╣ - // ╩╝╚╝╩ ╩ ╩╩ ╩╩═╝ ╚═╝ ╩ ╩ ╩ ╩ ╚═╝ - data: { - formData: { - monthsUsingFleetFree: 'Please select one', - }, - - // For tracking client-side validation errors in our form. - // > Has property set to `true` for each invalid property in `formData`. - formErrors: { /* … */ }, - - // Form rules - formRules: { - organization: {required: true }, - monthsUsingFleetFree: { - required: true, - isIn:[ - '1 - 3 months', - '3 - 6 months', - '6 - 12 months', - '12+ months', - ] - }, - emailAddress: {required: true, isEmail: true}, - numberOfHosts: {required: true }, - }, - cloudError: '', - // Syncing / loading state - syncing: false, - cloudSuccess: false, - }, - - // ╦ ╦╔═╗╔═╗╔═╗╦ ╦╔═╗╦ ╔═╗ - // ║ ║╠╣ ║╣ ║ ╚╦╝║ ║ ║╣ - // ╩═╝╩╚ ╚═╝╚═╝ ╩ ╚═╝╩═╝╚═╝ - beforeMount: function() { - //… - }, - mounted: async function() { - //… - }, - - // ╦╔╗╔╔╦╗╔═╗╦═╗╔═╗╔═╗╔╦╗╦╔═╗╔╗╔╔═╗ - // ║║║║ ║ ║╣ ╠╦╝╠═╣║ ║ ║║ ║║║║╚═╗ - // ╩╝╚╝ ╩ ╚═╝╩╚═╩ ╩╚═╝ ╩ ╩╚═╝╝╚╝╚═╝ - methods: { - typeClearOneFormError: async function(field) { - if(this.formErrors[field]){ - this.formErrors = _.omit(this.formErrors, field); - } - }, - submittedForm: function() { - this.cloudSuccess = true; - }, - _resetForms: async function() { - this.cloudError = ''; - this.formData = {}; - this.formErrors = {}; - await this.forceRender(); - }, - } -}); diff --git a/website/assets/styles/importer.less b/website/assets/styles/importer.less index 7d4131d5cf6d..0d2f94d67817 100644 --- a/website/assets/styles/importer.less +++ b/website/assets/styles/importer.less @@ -65,7 +65,6 @@ @import 'pages/vanta-authorization.less'; @import 'pages/admin/generate-license.less'; @import 'pages/device-management.less'; -@import 'pages/upgrade.less'; @import 'pages/endpoint-ops.less'; @import 'pages/transparency.less'; @import 'pages/press-kit.less'; diff --git a/website/assets/styles/pages/upgrade.less b/website/assets/styles/pages/upgrade.less deleted file mode 100644 index e883a27e38a8..000000000000 --- a/website/assets/styles/pages/upgrade.less +++ /dev/null @@ -1,199 +0,0 @@ -#upgrade { - background: linear-gradient(180deg, rgba(232, 241, 246, 0.5) 4.75%, rgba(255, 255, 255, 0) 37.29%); - [purpose='page-container'] { - padding-top: 100px; - padding-bottom: 120px; - max-width: 1200px; - margin-left: auto; - margin-right: auto; - padding-left: 40px; - padding-right: 40px; - } - h1 { - font-weight: 800; - font-size: 40px; - line-height: 48px; - text-align: left; - margin-bottom: 80px; - } - h2 { - font-weight: 800; - font-size: 28px; - line-height: 38px; - } - h3 { - font-weight: 700; - font-size: 20px; - line-height: 24px; - margin-bottom: 16px; - } - a { - font-size: 14px; - color: @core-vibrant-blue; - text-decoration: underline; - } - - [purpose='feature'] { - img { - margin-left: auto; - margin-right: auto; - } - [purpose='feature-image'] { - min-width: 160px; - margin-right: 40px; - } - margin-bottom: 80px; - } - [purpose='upgrade-form'] { - margin-left: 80px; - padding: 40px; - background: #F9FAFC; - box-shadow: 0px 0px 0px 1px #E2E4EA; - border-radius: 8px; - width: 480px; - input { - border: 1px solid #C5C7D1; - border-radius: 6px; - height: 48px; - font-size: 16px; - color: @core-fleet-black; - -webkit-appearance: none; - } - select { - // for hiding the -
Please enter the name of your company.
- -
- - -
Please select an option
-
-
- - -
This doesn’t appear to be a valid email address
-
-
- - -
Please enter a number of devices.
-
- -
- Submit -
- -

We will never spam you.

- - <%// Form success state %> -
-

We’ll be in touch soon!

-

A member of our team will be in touch within one business day.

-
- - - - -<%- /* Expose server-rendered data as window.SAILS_LOCALS :: */ exposeLocalsToBrowser() %>