@spotify/backstage-plugin-soundcheck 0.14.5 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/dist/alpha.d.ts +17 -17
- package/dist/api.esm.js +1 -1
- package/dist/components/Badges/LevelBadge.esm.js +1 -1
- package/dist/components/Badges/StatusBadge.esm.js +2 -0
- package/dist/components/CampaignForm/CampaignForm.esm.js +1 -1
- package/dist/components/CampaignInsightsPage/CampaignInsightsPage.esm.js +1 -1
- package/dist/components/CampaignInsightsPage/CampaignStatusHistoryTile.esm.js +1 -1
- package/dist/components/CampaignInsightsPage/CampaignStatusTile.esm.js +1 -1
- package/dist/components/CampaignInsightsPage/DaysRemainingTile.esm.js +1 -1
- package/dist/components/CampaignsPage/EditCampaignView.esm.js +1 -1
- package/dist/components/CertificationAccordion/CertificationAccordion.esm.js +1 -1
- package/dist/components/CertificationSidebar/CertificationSidebar.esm.js +1 -1
- package/dist/components/CertificationSidebar/CertificationSummary.esm.js +1 -1
- package/dist/components/CertificationSidebar/Check.esm.js +1 -1
- package/dist/components/CertificationSidebar/LevelSummary.esm.js +1 -1
- package/dist/components/CertificationSidebar/StatusDetails.esm.js +2 -0
- package/dist/components/CertificationsPage/CertificationTabs.esm.js +1 -1
- package/dist/components/CertificationsPage/Playlist/PlaylistProgress.esm.js +1 -1
- package/dist/components/Charts/LineChart/LineChartPlaceholder.esm.js +1 -1
- package/dist/components/CheckCard/CheckCard.esm.js +1 -1
- package/dist/components/CheckCard/CheckHistoryChart.esm.js +1 -1
- package/dist/components/CheckDetails/ResultStateBox.esm.js +1 -1
- package/dist/components/CheckForm/FormFields/RuleInput/Conditions/ValueListInput.esm.js +1 -1
- package/dist/components/CheckForm/utils/checkFormUtils.esm.js +1 -1
- package/dist/components/CheckPage/CheckEditPage.esm.js +2 -0
- package/dist/components/CollectorPage/Configurators/BigQuery/BigQueryConfigurator.esm.js +2 -0
- package/dist/components/CollectorPage/Configurators/BigQuery/QueryFactDetailsComponent.esm.js +2 -0
- package/dist/components/CollectorPage/Configurators/BigQuery/css/prism-dark-sql.css.esm.js +260 -0
- package/dist/components/CollectorPage/Configurators/BigQuery/utils.esm.js +2 -0
- package/dist/components/CollectorPage/Configurators/BigQuery/validation.esm.js +2 -0
- package/dist/components/CollectorPage/Configurators/Common/CollectorOption.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Common/CollectorSchedulingOptions.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Common/FactCollectionConfig.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Common/utils.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Configurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Github/utils.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Gitlab/utils.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Kubernetes/KubernetesConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Kubernetes/utils.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SCM/ExistsFactDetailsComponent.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SCM/FactDetailsComponent.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SCM/JsonFactDetailsComponent.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SCM/RegexFactDetailsComponent.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SCM/ScmConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SCM/utils.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SCM/validation.esm.js +1 -1
- package/dist/components/CollectorsPage/CollectorListPage/CollectorLogo.esm.js +1 -1
- package/dist/components/CollectorsPage/CollectorListPage/CollectorSummaryCard.esm.js +1 -1
- package/dist/components/EntitySoundcheckCard/Card.esm.js +1 -1
- package/dist/components/Filter/EntityAutocompletePicker.esm.js +1 -1
- package/dist/components/Filter/FilterComponent.esm.js +1 -1
- package/dist/components/Filter/FilterPreviewTable/EntityTableColumns.esm.js +1 -1
- package/dist/components/Filter/FilterPreviewTable/FilterPreviewTable.esm.js +1 -1
- package/dist/components/Filter/types.esm.js +1 -1
- package/dist/components/Filter/utils.esm.js +1 -1
- package/dist/components/FormControlledSelect/FormControlledSelect.esm.js +2 -0
- package/dist/components/FormFilterSection/FormFilterSection.esm.js +1 -1
- package/dist/components/Frequency/FrequencyComponent.esm.js +1 -1
- package/dist/components/Frequency/util.esm.js +1 -1
- package/dist/components/LevelCard/LevelCard.esm.js +1 -1
- package/dist/components/LevelCard/LevelTooltip.esm.js +1 -1
- package/dist/components/OverviewTable/Cell/TrackBadgeCell.esm.js +2 -0
- package/dist/components/OverviewTable/Cell/cellRenderer.esm.js +1 -1
- package/dist/components/OverviewTable/ResultsTableRow.esm.js +1 -1
- package/dist/components/OverviewTable/resultsTableUtils.esm.js +1 -1
- package/dist/components/PassRateGrid/PassRateMetadata.esm.js +1 -1
- package/dist/components/RoutingPage/RoutingPage.esm.js +1 -1
- package/dist/components/SoundcheckHeader/SoundcheckHeader.esm.js +1 -1
- package/dist/components/SummaryCard/SummaryCard.esm.js +1 -1
- package/dist/components/TechHealth/Filters/FacetFilter.esm.js +1 -1
- package/dist/components/TrackEditPage/TrackEditPage.esm.js +1 -1
- package/dist/components/TrackForm/Steps/TrackDetailsStep/TrackBadgeTypeSelect/TrackBadgeTypeSelect.esm.js +2 -0
- package/dist/components/TrackForm/Steps/TrackDetailsStep/TrackDetailsStep.esm.js +1 -1
- package/dist/components/TrackForm/utils/useTrackForm.esm.js +1 -1
- package/dist/components/TrackPage/TrackHistoryChart.esm.js +1 -1
- package/dist/components/TrackPage/TrackLevelsChart.esm.js +1 -1
- package/dist/graphql/generated/index.esm.js +141 -109
- package/dist/hooks/aggregations/useCheckStatusHistories.esm.js +2 -0
- package/dist/hooks/aggregations/useCheckStatuses.esm.js +2 -0
- package/dist/hooks/graphqlKeys.esm.js +1 -1
- package/dist/images/bigquery-rgb.svg +15 -0
- package/dist/images/bigquery-white.svg +15 -0
- package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js +2 -0
- package/package.json +25 -22
- package/dist/components/CheckPage/CheckDetailsView.esm.js +0 -2
- package/dist/components/CheckPage/CheckPage.esm.js +0 -2
- package/dist/components/CollectorPage/Configurators/SCM/FactCollectionConfig.esm.js +0 -2
- package/dist/components/Filter/FilterPreviewTable/EntityKindsFilter.esm.js +0 -2
- package/dist/components/Filter/FilterPreviewTable/EntitySystemsFilter.esm.js +0 -2
- package/dist/components/Filter/FilterPreviewTable/EntityTableToolbar.esm.js +0 -2
- package/dist/components/Filter/FilterPreviewTable/EntityTagFilter.esm.js +0 -2
- package/dist/components/OverviewTable/Cell/HighestLevelBadge.esm.js +0 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# @spotify/backstage-plugin-soundcheck
|
|
2
2
|
|
|
3
|
+
## 0.15.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Updated Check, Track, Campaign, and Integration forms to save filters in the new catalog filter format. This will be backwards compatible with existing items. Updated items will be saved with this new format. Please include latest versions of soundcheck-backend and soundcheck-common to have the latest schemas.
|
|
8
|
+
|
|
9
|
+
This also converts the filter `spec.owner` to `relations.ownedBy`. When updating an existing item that has `spec.owner` filter, the form will automatically convert this to a group entityRef, as the `relations.ownedBy` filter requires an entityRef not an entity name. This will not break existing items that use the `spec.owner` filter.
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- Fixes code block in descriptions overflowing summary card content.
|
|
14
|
+
- Add better display when there is no data or there are no applicable entities on the track and campaign insights pages.
|
|
15
|
+
- Align SCM Integration UI with rest of Integration UI styles.
|
|
16
|
+
- Adjust entity preview table to work with exclude filters.
|
|
17
|
+
- Aligning check state icons across Soundcheck.
|
|
18
|
+
- Adjust check, track and campaign edit page permissions.
|
|
19
|
+
- Added possibility to configure track badges that display check status and check pass percentage:
|
|
20
|
+
|
|
21
|
+
```yaml
|
|
22
|
+
badge:
|
|
23
|
+
type: 'status'
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
- Added regex `flags` configuration option to SCM Integration No-Code UI.
|
|
27
|
+
- Default values from yaml for SCM, Github, GitLab and Kubernetes integrations now propagate to new entries in the UI.
|
|
28
|
+
- Add Initial Delay to integration UI config. Previously this was a YAML only config option.
|
|
29
|
+
- Update to Backstage `v1.35.0`
|
|
30
|
+
- Updated dependencies
|
|
31
|
+
- @spotify/backstage-plugin-core@0.8.5
|
|
32
|
+
- @spotify/backstage-plugin-soundcheck-common@0.15.0
|
|
33
|
+
|
|
3
34
|
## 0.14.5
|
|
4
35
|
|
|
5
36
|
### Patch Changes
|
package/dist/alpha.d.ts
CHANGED
|
@@ -21,6 +21,23 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{}, {}, {
|
|
|
21
21
|
factory: _backstage_core_plugin_api_index.AnyApiFactory;
|
|
22
22
|
};
|
|
23
23
|
}>;
|
|
24
|
+
"nav-item:soundcheck": _backstage_frontend_plugin_api.ExtensionDefinition<{
|
|
25
|
+
kind: "nav-item";
|
|
26
|
+
name: undefined;
|
|
27
|
+
config: {};
|
|
28
|
+
configInput: {};
|
|
29
|
+
output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<{
|
|
30
|
+
title: string;
|
|
31
|
+
icon: _backstage_core_plugin_api_index.IconComponent;
|
|
32
|
+
routeRef: _backstage_frontend_plugin_api.RouteRef<undefined>;
|
|
33
|
+
}, "core.nav-item.target", {}>;
|
|
34
|
+
inputs: {};
|
|
35
|
+
params: {
|
|
36
|
+
title: string;
|
|
37
|
+
icon: _backstage_core_plugin_api_index.IconComponent;
|
|
38
|
+
routeRef: _backstage_frontend_plugin_api.RouteRef<undefined>;
|
|
39
|
+
};
|
|
40
|
+
}>;
|
|
24
41
|
"entity-content:soundcheck/entity": _backstage_frontend_plugin_api.ExtensionDefinition<{
|
|
25
42
|
kind: "entity-content";
|
|
26
43
|
name: "entity";
|
|
@@ -50,23 +67,6 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{}, {}, {
|
|
|
50
67
|
filter?: string | ((entity: _backstage_catalog_model_index.Entity) => boolean) | undefined;
|
|
51
68
|
};
|
|
52
69
|
}>;
|
|
53
|
-
"nav-item:soundcheck": _backstage_frontend_plugin_api.ExtensionDefinition<{
|
|
54
|
-
kind: "nav-item";
|
|
55
|
-
name: undefined;
|
|
56
|
-
config: {};
|
|
57
|
-
configInput: {};
|
|
58
|
-
output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<{
|
|
59
|
-
title: string;
|
|
60
|
-
icon: _backstage_core_plugin_api_index.IconComponent;
|
|
61
|
-
routeRef: _backstage_frontend_plugin_api.RouteRef<undefined>;
|
|
62
|
-
}, "core.nav-item.target", {}>;
|
|
63
|
-
inputs: {};
|
|
64
|
-
params: {
|
|
65
|
-
title: string;
|
|
66
|
-
icon: _backstage_core_plugin_api_index.IconComponent;
|
|
67
|
-
routeRef: _backstage_frontend_plugin_api.RouteRef<undefined>;
|
|
68
|
-
};
|
|
69
|
-
}>;
|
|
70
70
|
"entity-card:soundcheck/card": _backstage_frontend_plugin_api.ExtensionDefinition<{
|
|
71
71
|
kind: "entity-card";
|
|
72
72
|
name: "card";
|
package/dist/api.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createApiRef as c}from"@backstage/core-plugin-api";import{GraphQLClient as h}from"graphql-request";import{getSdk as u}from"./graphql/generated/index.esm.js";const o=c({id:"plugin.soundcheck"}),g=r=>"response"in r&&"errors"in r.response,y=r=>"response"in r&&"message"in r.response;class l{#a;#
|
|
1
|
+
import{createApiRef as c}from"@backstage/core-plugin-api";import{GraphQLClient as h}from"graphql-request";import{getSdk as u}from"./graphql/generated/index.esm.js";const o=c({id:"plugin.soundcheck"}),g=r=>"response"in r&&"errors"in r.response,y=r=>"response"in r&&"message"in r.response;class l{#s;#a;#t;constructor(t){this.#s=t.fetchApi,this.#a=t.discoveryApi;const e=new h("/graphql",{fetch:async(s,a)=>{const n=`${await this.#a.getBaseUrl("soundcheck")}${s}`;return this.#s.fetch(n,a)}});this.#t=u(e)}#r=t=>g(t)?t.response?.errors?.[0].message??`${t}`:y(t)?t.response.message:`${t}`;#e=async t=>{try{return await t()}catch(e){throw new Error(`Error from Soundcheck backend: ${this.#r(e)}`)}};async getAllCertifications(t){return this.#e(async()=>{const{certifications:e}=await this.#t.getAllCertifications({entityRef:t});return e})}async getCertificationDetails(t){return this.#e(async()=>{const{certifications:e}=await this.#t.getCertificationDetails({entityRef:t});return e})}async getCertificationDetailsForTrack(t,e){return this.#e(async()=>{const{programCertification:s}=await this.#t.getCertificationDetailsForTrack({entityRef:t,programId:e});return s})}async getCheckResultDetails(t,e,s){return this.#e(async()=>{const{checkResult:a}=await this.#t.getCheckResultDetails({entityRef:t,programId:e,checkId:s});return a})}async getFacetsForOwner(t){return this.#e(async()=>{const{facetsForOwner:e}=await this.#t.getFacetsForOwner({ownerEntityRef:t});return e})}async getProgramOverviewForOwner(t,e,s,a,n){return this.#e(async()=>{const{programOverviewForOwner:i}=await this.#t.getProgramOverviewForOwner({ownerEntityRef:t,facet:e,first:s,after:a,entitySearch:n});return i})}async getTracks(t){return this.#e(async()=>{const{programs:e}=await this.#t.getTracks({filter:t});return e})}async createProgram(t){return this.#e(async()=>{const{program:e}=await this.#t.createProgram({input:t});return e})}async updateProgram(t){return this.#e(async()=>{const{program:e}=await this.#t.updateProgram({input:t});return e})}async deleteProgram(t){return this.#e(async()=>{const{programDeleted:e}=await this.#t.deleteProgram({programId:t});return e})}async getPlaylists(t){return this.#e(async()=>{const{playlists:e}=await this.#t.getPlaylists({entityRef:t});return e})}async getOperators(){return this.#e(async()=>{const{operators:t}=await this.#t.getOperators();return t})}async getChecks(t){return this.#e(async()=>{const{checkers:e}=await this.#t.getCheckers({filter:t});return e})}async getExecutableChecks(){return this.#e(async()=>{const{executableChecks:t}=await this.#t.getExecutableChecks();return t})}async createCheck(t){return this.#e(async()=>{const{check:e}=await this.#t.createCheck({input:t});return e})}async updateCheck(t){return this.#e(async()=>{const{check:e}=await this.#t.updateCheck({input:t});return e})}async deleteCheck(t){return this.#e(async()=>await this.#t.deleteChecker({checkerId:t}))}async executeCheck(t){return this.#e(async()=>{const{result:e}=await this.#t.executeCheck({input:t});return e})}async getCollectors(t){return this.#e(async()=>{const{collectors:e}=await this.#t.getCollectors({ids:t});return e})}async getFactSchema(t,e){if(!(!t||!e))return this.#e(async()=>{const{factSchema:s}=await this.#t.getFactSchemas({collectorId:t,factName:e});return s})}async updateCollectorConfig(t){return this.#e(async()=>{const{collector:e}=await this.#t.updateCollectorConfig({input:t});return e})}async getOverallCheckPassRates(t){return this.#e(async()=>await this.#t.getOverallCheckPassRates({filter:t}))}async getIndividualCheckPassRates(t){return this.#e(async()=>await this.#t.getIndividualCheckPassRates({filter:t}))}async getOverallTrackPassRate(t){return this.#e(async()=>await this.#t.getOverallTrackPassRate({filter:t}))}async getIndividualTrackPassRate(t){return this.#e(async()=>await this.#t.getIndividualTrackPassRate({filter:t}))}async getOverallEntityPassRates(t){return this.#e(async()=>await this.#t.getOverallEntityPassRates({filter:t}))}async getIndividualEntityPassRates(t){return this.#e(async()=>await this.#t.getIndividualEntityPassRates({input:t}))}async getOverallGroupPassRates(t){return this.#e(async()=>await this.#t.getOverallGroupPassRates({input:t}))}async getIndividualGroupPassRates(t){return this.#e(async()=>await this.#t.getIndividualGroupPassRates({input:t}))}async getEntityRefsForTechHealthFilter(t){return this.#e(async()=>await this.#t.getEntityRefsForTechHealthFilter({ownerEntityRef:t}))}async getTrackEntities(t){return this.#e(async()=>await this.#t.getTrackEntities({input:t}))}async getCampaigns(t){return this.#e(async()=>{const{campaigns:e}=await this.#t.getCampaigns({filter:t});return e})}async createCampaign(t){return this.#e(async()=>{const{campaign:e}=await this.#t.createCampaign({input:t});return e})}async updateCampaign(t){return this.#e(async()=>{const{campaign:e}=await this.#t.updateCampaign({input:t});return e})}async deleteCampaign(t){return this.#e(async()=>{const{campaignDeleted:e}=await this.#t.deleteCampaign({campaignId:t});return e})}async archiveCampaign(t){return this.#e(async()=>{const{campaignArchived:e}=await this.#t.archiveCampaign({campaignId:t});return e})}async getCampaignProgress(t,e,s){return this.#e(async()=>{const{campaignProgress:a}=await this.#t.getCampaignProgress({id:t,first:e,after:s});return a})}async getCampaignOwners(){return this.#e(async()=>{const{campaignOwners:t}=await this.#t.getCampaignOwners();return t})}async getCheckOwners(){return this.#e(async()=>{const{checkOwners:t}=await this.#t.getCheckOwners();return t})}async getTrackOwners(){return this.#e(async()=>{const{trackOwners:t}=await this.#t.getTrackOwners();return t})}async getCertificationStatus(t){return this.#e(async()=>this.#t.getCertificationStatus({input:t}))}async getCertificationStatusHistory(t){return this.#e(async()=>this.#t.getCertificationStatusHistory({input:t}))}async getCheckStatus(t){return this.#e(async()=>(await this.#t.getCheckStatus({input:t})).checkStatus)}async getCheckStatuses(t){return this.#e(async()=>(await this.#t.getCheckStatuses({input:t})).checkStatuses)}async getCheckStatusHistory(t){return this.#e(async()=>(await this.#t.getCheckStatusHistory({input:t})).checkStatusHistory)}async getCheckStatusHistories(t){return this.#e(async()=>(await this.#t.getCheckStatusHistories({input:t})).checkStatusHistories)}async getCheckEntities(t){return this.#e(async()=>await this.#t.getCheckEntities({input:t}))}async getPathResolvers(){return this.#e(async()=>{const{pathResolvers:t}=await this.#t.getPathResolvers();return t})}async getCheckTemplates(){return this.#e(async()=>{const{checkerTemplates:t}=await this.#t.getCheckTemplates();return t})}async getFact(t){return this.#e(async()=>{const{fact:e}=await this.#t.getFact(t);return e})}}export{l as SoundcheckApi,o as soundcheckApiRef};
|
|
2
2
|
//# sourceMappingURL=api.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{makeStyles as
|
|
1
|
+
import{makeStyles as i,alpha as p}from"@material-ui/core";import m from"classnames";import r from"react";import{BadgeVariant as s}from"../../graphql/generated/index.esm.js";import{BaseBadge as n}from"./BaseBadge.esm.js";import{StatusBadge as c}from"./StatusBadge.esm.js";const d=i(t=>({root:{background:({color:e})=>e,color:({color:e})=>e?t.palette.getContrastText(e):t.palette.text.primary,border:({size:e})=>t.palette.type==="dark"?void 0:`${e==="small"?"1px":"2px"} solid ${p(t.palette.text.primary,.8)}`,"&::after":{position:"absolute",display:"block",content:'""',top:0,left:0,width:"100%",height:"100%",borderRadius:"50%",boxShadow:["inset 0 -0.10em 0 0 rgba(0, 0, 0, 0.15)","inset 0px 0.10em 0px 0px rgba(255, 255, 255, 0.4)","inset 0px 0.9em 0px -0.4em rgba(255, 255, 255, 0.1)"].join(",")}},borderTheme:{borderColor:t.palette.text.primary,borderStyle:"solid",color:t.palette.text.primary}})),b=({className:t,badge:e,size:a="small"})=>{const l=d({color:"color"in e.options?e.options.color:void 0,size:a});if(e.variant===s.Status){const o=e.options;return r.createElement(c,{className:t,size:a,status:o.status})}if(e.variant===s.Medal){const o=e.options;return r.createElement(n,{className:m(t,o.color?l.root:l.borderTheme),size:a,label:`L${o.level}`})}return r.createElement(r.Fragment,null)};export{b as LevelBadge};
|
|
2
2
|
//# sourceMappingURL=LevelBadge.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{makeStyles as g,useTheme as k,Box as C,Tooltip as E}from"@material-ui/core";import b from"@material-ui/icons/Check";import y from"@material-ui/icons/Close";import N from"@material-ui/icons/PriorityHigh";import v from"@mui/icons-material/QuestionMark";import z from"classnames";import e from"react";import{CircularProgressbarWithChildren as m,buildStyles as c}from"react-circular-progressbar";import"react-circular-progressbar/dist/styles.css";const u=24,W=15,d=i=>i==="small"?1:2,w=g(i=>({root:{position:"relative",display:"inline-block",alignItems:"center",justifyContent:"center",cursor:"default",lineHeight:0,width:({size:t})=>`${u*d(t)}px`,height:({size:t})=>`${u*d(t)}px`},icon:{color:i.palette.background.default,fontSize:({size:t})=>W*d(t)}})),x=({className:i,status:t,size:h="small"})=>{const s=w({size:h}),n=k();if(!t)return e.createElement(e.Fragment,null);const a=t.passed+t.failed+t.warning+t.error+t.notReported,r=a?t.passed/a*100:0,o=a?t.warning/a*100:0,l=a?(t.failed+t.error)/a*100:0,p=100-r-o-l,f=e.createElement(C,{className:z(i,s.root),role:"img","aria-label":`${r} badge`},e.createElement(m,{value:r,strokeWidth:r<100?15:50,styles:c({pathColor:n.palette.success.main,trailColor:"transparent",strokeLinecap:"butt",rotation:0})},r===100&&e.createElement(b,{className:s.icon}),r<100&&e.createElement(m,{value:o,strokeWidth:o<100?15:50,styles:c({pathColor:n.palette.warning.main,trailColor:"transparent",strokeLinecap:"butt",rotation:r/100})},o===100&&e.createElement(N,{className:s.icon}),o<100&&e.createElement(m,{value:l,strokeWidth:l<100?15:50,styles:c({pathColor:n.palette.error.main,trailColor:"transparent",strokeLinecap:"butt",rotation:(r+o)/100})},l===100&&e.createElement(y,{className:s.icon}),l<100&&e.createElement(m,{value:p,strokeWidth:p<100?15:50,styles:c({pathColor:n.palette.divider,trailColor:"transparent",strokeLinecap:"butt",rotation:(r+o+l)/100})},p===100&&e.createElement(v,{className:s.icon}))))));return e.createElement(E,{title:`${t.passed}/${a} checks passed (${Math.round(r)}%)`},f)};export{x as StatusBadge};
|
|
2
|
+
//# sourceMappingURL=StatusBadge.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Content as k}from"@backstage/core-components";import{Typography as y}from"@material-ui/core";import e from"react";import{Controller as v}from"react-hook-form";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{useCampaignFormContext as F}from"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import L from"../../hooks/useFeatureFlag.esm.js";import{formStyles as M}from"../../utils/formStyles.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import{emptyFilters as A}from"../Filter/types.esm.js";import{FilterComponent as D}from"../Filter/FilterComponent.esm.js";import{FormStepper as N}from"../FormStepper/FormStepper.esm.js";import{useCampaignForm as O}from"./hooks/useCampaignForm.esm.js";import{CampaignDetailsStep as x}from"./Steps/CampaignDetailsStep/CampaignDetailsStep.esm.js";import{CampaignTrackStep as T}from"./Steps/CampaignTrackStep.esm.js";import{CampaignMilestonesStep as I}from"./Steps/CampaignMilestonesStep.esm.js";import{StepNameMapping as R}from"./types/CampaignFormTypes.esm.js";import{CAMPAIGN_FIELDS as V}from"./utils/campaignFormUtils.esm.js";var d=(t=>(t.Details="Enter campaign details",t.Checks="Add checks",t.Entities="Choose the affected entities (Optional)",t.Milestones="Set campaign milestones",t))(d||{});const B=({onSave:t,onCancel:g,selectedCampaign:i})=>{const n=M(),{isLoading:o,isReadOnly:f}=F(),{control:r,handleSubmit:m,errors:a,trigger:C,getValues:S,onSubmit:s,checkChips:h,checksLoading:b}=O(t,i),l=S(),u=l.detailsStep.startDate;L("debugMode")&&console.log(l);const p=[{label:"Enter campaign details",content:()=>e.createElement(x,{control:r,isLoading:o,disabled:!1,errors:a.detailsStep,startDate:u})},{label:"Add checks",content:()=>e.createElement(T,{control:r,isLoading:o||b,disabled:!1,errors:a.tracksStep,checkChips:h})},{label:"Choose the affected entities (Optional)",content:()=>e.createElement("div",{className:n.filters},e.createElement(y,{variant:"body2"},V.filter.description),e.createElement(v,{name:"filtersStep",control:r,render:({field:c})=>e.createElement(D,{value:c.value??A(),onChange:c.onChange})}))},{label:"Set campaign milestones",content:()=>e.createElement(I,{control:r,isLoading:o,disabled:!1,errors:a.milestonesStep})}],E=i?[...Array(p.length).keys()]:[0];return e.createElement(e.Fragment,null,e.createElement(k,{className:n.formWrapper},e.createElement("form",{onSubmit:m(s)},e.createElement(N,{onClose:g,handleSubmit:m,trigger:C,onSubmit:s,initialVisited:E,stepNameMap:R,steps:p,isLoading:o,isReadOnly:f,saveButtonText:"Save Campaign"}))))};export{B as CampaignForm,d as CampaignStepLabel};
|
|
1
|
+
import{Content as k}from"@backstage/core-components";import{Typography as y}from"@material-ui/core";import e from"react";import{Controller as v}from"react-hook-form";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{useCampaignFormContext as F}from"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import L from"../../hooks/useFeatureFlag.esm.js";import{formStyles as M}from"../../utils/formStyles.esm.js";import"@backstage/catalog-model";import"@spotify/backstage-plugin-soundcheck-common";import{emptyFilters as A}from"../Filter/types.esm.js";import{FilterComponent as D}from"../Filter/FilterComponent.esm.js";import{FormStepper as N}from"../FormStepper/FormStepper.esm.js";import{useCampaignForm as O}from"./hooks/useCampaignForm.esm.js";import{CampaignDetailsStep as x}from"./Steps/CampaignDetailsStep/CampaignDetailsStep.esm.js";import{CampaignTrackStep as T}from"./Steps/CampaignTrackStep.esm.js";import{CampaignMilestonesStep as I}from"./Steps/CampaignMilestonesStep.esm.js";import{StepNameMapping as R}from"./types/CampaignFormTypes.esm.js";import{CAMPAIGN_FIELDS as V}from"./utils/campaignFormUtils.esm.js";var d=(t=>(t.Details="Enter campaign details",t.Checks="Add checks",t.Entities="Choose the affected entities (Optional)",t.Milestones="Set campaign milestones",t))(d||{});const B=({onSave:t,onCancel:g,selectedCampaign:i})=>{const n=M(),{isLoading:o,isReadOnly:f}=F(),{control:r,handleSubmit:m,errors:a,trigger:C,getValues:S,onSubmit:s,checkChips:h,checksLoading:b}=O(t,i),l=S(),u=l.detailsStep.startDate;L("debugMode")&&console.log(l);const p=[{label:"Enter campaign details",content:()=>e.createElement(x,{control:r,isLoading:o,disabled:!1,errors:a.detailsStep,startDate:u})},{label:"Add checks",content:()=>e.createElement(T,{control:r,isLoading:o||b,disabled:!1,errors:a.tracksStep,checkChips:h})},{label:"Choose the affected entities (Optional)",content:()=>e.createElement("div",{className:n.filters},e.createElement(y,{variant:"body2"},V.filter.description),e.createElement(v,{name:"filtersStep",control:r,render:({field:c})=>e.createElement(D,{value:c.value??A(),onChange:c.onChange})}))},{label:"Set campaign milestones",content:()=>e.createElement(I,{control:r,isLoading:o,disabled:!1,errors:a.milestonesStep})}],E=i?[...Array(p.length).keys()]:[0];return e.createElement(e.Fragment,null,e.createElement(k,{className:n.formWrapper},e.createElement("form",{onSubmit:m(s)},e.createElement(N,{onClose:g,handleSubmit:m,trigger:C,onSubmit:s,initialVisited:E,stepNameMap:R,steps:p,isLoading:o,isReadOnly:f,saveButtonText:"Save Campaign"}))))};export{B as CampaignForm,d as CampaignStepLabel};
|
|
2
2
|
//# sourceMappingURL=CampaignForm.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{MarkdownContent as
|
|
1
|
+
import{MarkdownContent as U,Content as N}from"@backstage/core-components";import{useRouteRef as A}from"@backstage/core-plugin-api";import{EntityRefLink as V}from"@backstage/plugin-catalog-react";import{usePermission as R}from"@backstage/plugin-permission-react";import{makeStyles as W,Button as $,Paper as j,Grid as o,Typography as b,Box as q}from"@material-ui/core";import{soundcheckCampaignReadPermission as J,soundcheckCampaignUpdatePermission as K}from"@spotify/backstage-plugin-soundcheck-common";import{DateTime as S}from"luxon";import t,{useMemo as d}from"react";import{useParams as Q,useNavigate as X}from"react-router-dom";import"@backstage/catalog-model";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import{useGetCampaigns as Y}from"../../hooks/campaigns/useGetCampaigns.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCheckStatuses as Z}from"../../hooks/aggregations/useCheckStatuses.esm.js";import{useCheckStatusHistories as _}from"../../hooks/aggregations/useCheckStatusHistories.esm.js";import{useSearchParam as g}from"../../hooks/useSearchParam.esm.js";import{campaignEditRouteRef as ee}from"../../routes.esm.js";import{CheckCard as te}from"../CheckCard/CheckCard.esm.js";import{LoadingIndicator as ae}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as ie}from"../PageWarningMessage/PageWarningMessage.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as re}from"../SoundcheckHeader/useHeader.esm.js";import{FilterBar as ne}from"../TrackPage/FilterBar/FilterBar.esm.js";import{toFilter as oe}from"../TrackPage/FilterBar/util.esm.js";import{TrackEntitiesTable as se}from"../TrackPage/TrackEntitiesTable/TrackEntitiesTable.esm.js";import{CampaignStatusHistoryTile as me}from"./CampaignStatusHistoryTile.esm.js";import{CampaignStatusTile as ce}from"./CampaignStatusTile.esm.js";import{DaysRemainingTile as le}from"./DaysRemainingTile.esm.js";const pe=W(e=>({root:{height:"100%",background:e.palette.background.default},header:{backgroundColor:e.palette.background.paper,borderRadius:0,marginBottom:e.spacing(2),paddingLeft:e.spacing(1),borderLeft:"none",borderRight:"none"},progressContainer:{display:"flex",marginBottom:e.spacing(3)},campaignContainerContent:{paddingTop:e.spacing(1),paddingBottom:e.spacing(1),backgroundColor:e.palette.background.paper},editButton:{marginLeft:"auto"},checksContainer:{},entitiesContainer:{marginTop:e.spacing(3)},headerDescription:{fontSize:e.typography.body2.fontSize,margin:e.spacing(.5,0,0),"& p":{margin:0},"& a":{color:"inherit",textDecoration:"underline"}},content:{paddingTop:0},ownerLink:{"& span":{color:"inherit","&:hover":{textDecoration:"underline"}}},sectionTitle:{paddingBottom:e.spacing(1)}})),de=()=>{const e=pe(),[s,T]=g("owners"),[m,x]=g("lifecycles"),[c,I]=g("types"),[l,L]=g("systems"),p=d(()=>oe({lifecycles:m,owners:s,types:c,systems:l}),[m,s,c,l]),{campaignId:n}=Q(),{data:B,isLoading:u}=Y({ids:[n],first:1}),r=B?.edges?.[0]?.node,a=r?.track,y=a?.levels?.[0],{loading:D,allowed:P}=R({permission:J,resourceRef:n}),{loading:h,allowed:E}=R({permission:K,resourceRef:n}),k=r?S.fromISO(r.startDate):void 0,M=k?Math.max(Math.ceil(S.now().diff(k,"days").days),1):void 0,C=Array.from(new Set(a?.levels.flatMap(i=>i.checks).map(i=>i.id)??[])),{data:z}=Z({trackId:a?.id,checkIds:C,filter:p},!!a),{data:F}=_({trackId:a?.id,checkIds:C,numberOfDays:M??30,filter:p},!!a),w=X(),v=A(ee),H=d(()=>a?.ownerEntityRef?t.createElement(V,{color:"inherit",entityRef:a.ownerEntityRef,className:e.ownerLink}):null,[a?.ownerEntityRef,e.ownerLink]),O=d(()=>!h&&E&&a?.isEditable?t.createElement($,{className:e.editButton,variant:"contained",color:"primary",onClick:()=>{w(v({campaignId:n}))}},"Edit Campaign"):null,[E,e.editButton,v,h,w,a,n]),G=d(()=>a?.description?t.createElement(U,{className:e.headerDescription,content:a.description}):null,[e.headerDescription,a?.description]);return re({title:a?.name,description:G,customSubtitle:H,sectionRight:O}),t.createElement("div",null,t.createElement(ie,{entityName:"track",entityId:n,showNotFound:!u&&!r,showCannotView:!D&&!P}),u&&t.createElement(ae,null),a&&t.createElement("div",{className:e.root},t.createElement(j,{elevation:1,className:e.header},t.createElement(N,{className:e.campaignContainerContent},t.createElement(ne,{track:a,owners:s,setOwners:T,lifecycles:m,setLifecycles:x,types:c,setTypes:I,systems:l,setSystems:L}))),t.createElement(N,{className:e.content},t.createElement("div",{className:e.progressContainer},t.createElement(o,{container:!0,spacing:2},t.createElement(o,{item:!0,xs:2},t.createElement(le,{campaign:r})),t.createElement(o,{item:!0,xs:4},t.createElement(ce,{campaign:r,filter:p})),t.createElement(o,{item:!0,xs:6},t.createElement(me,{campaign:r,filter:p})))),t.createElement("div",{className:e.checksContainer},t.createElement(b,{variant:"h3",className:e.sectionTitle},"Checks"),y&&t.createElement(q,{className:e.content},t.createElement(o,{container:!0,spacing:1},y.checks.map(i=>t.createElement(o,{item:!0,xs:12,sm:6,md:4,key:i.id},t.createElement(te,{track:a,check:i,status:z?.find(f=>f.id===i.id),history:F?.find(f=>f.id===i.id)}))))),a&&t.createElement("div",{className:e.entitiesContainer},t.createElement(b,{variant:"h3",className:e.sectionTitle},"Entities"),t.createElement(se,{track:a,initialPageSize:10,lifecycles:m,owners:s,types:c,systems:l}))))))};export{de as CampaignInsightsPage};
|
|
2
2
|
//# sourceMappingURL=CampaignInsightsPage.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useTheme as
|
|
1
|
+
import{useTheme as d,Paper as f,Box as h}from"@material-ui/core";import{makeStyles as u}from"@material-ui/core/styles";import{DateTime as m}from"luxon";import i,{useMemo as g}from"react";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatusHistory as y}from"../../hooks/aggregations/useCertificationStatusHistory.esm.js";import"react-router-dom";import{AreaChart as x}from"../AreaChart/AreaChart.esm.js";import{LineChartPlaceholder as S}from"../Charts/LineChart/LineChartPlaceholder.esm.js";const C=u(t=>({card:{display:"flex",flexDirection:"column",border:`1px solid ${t.palette.divider}`,height:"100%",width:"100%"},title:{fontWeight:"bold",fontSize:"1.1rem",lineHeight:`${t.typography.h5.fontSize}px`,cursor:"default"},content:{padding:t.spacing(1,2,1,0),width:"100%",height:"100%"}}));function E({campaign:t,filter:n}){const p=d(),r=C(),c=m.fromISO(t.startDate),l=Math.max(Math.ceil(m.now().diff(c,"days").days),1),{data:a}=y({trackId:t.track.id,filter:n,numberOfDays:l},!!t),e=a?.certificationStatusHistory.numberOfEntities??0,o=g(()=>e>0?a?.certificationStatusHistory.history.map(s=>({date:s.date,Passed:s.statusByLevel[0].passed/e*100})):[],[e,a]);return i.createElement(f,{className:r.card},i.createElement(h,{className:r.content},o?.length?i.createElement(x,{data:o,categories:["Passed"],categoryColors:{Passed:p.palette.success.main},index:"date",minValue:0,maxValue:100,showLegend:!1}):i.createElement(S,{height:200,text:e>0?"No Historical Data":"No Applicable Entities"})))}export{E as CampaignStatusHistoryTile};
|
|
2
2
|
//# sourceMappingURL=CampaignStatusHistoryTile.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useTheme as
|
|
1
|
+
import{useTheme as D,Paper as x,Box as n,Grid as v,Typography as u}from"@material-ui/core";import{makeStyles as I}from"@material-ui/core/styles";import N from"@material-ui/icons/TrendingDown";import C from"@material-ui/icons/TrendingFlat";import k from"@material-ui/icons/TrendingUp";import{DateTime as h}from"luxon";import e,{useMemo as B}from"react";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useCertificationStatus as R}from"../../hooks/aggregations/useCertificationStatus.esm.js";import{useCertificationStatusHistory as T}from"../../hooks/aggregations/useCertificationStatusHistory.esm.js";import"react-router-dom";import{CategoryBar as w}from"../CategoryBar/CategoryBar.esm.js";import{LoadingIndicator as L}from"../LoadingIndicator/LoadingIndicator.esm.js";const b=I(t=>({card:{display:"flex",flexDirection:"column",border:`1px solid ${t.palette.divider}`,height:"100%"},content:{padding:t.spacing(1),display:"flex",margin:t.spacing(1),gap:t.spacing(1)},item:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:t.spacing(.5)},legendDash:{width:t.spacing(2),height:t.spacing(1),borderRadius:t.spacing(.375),marginRight:t.spacing(1)},category:{display:"flex",alignItems:"center",flex:1,marginRight:t.spacing(2)}}));function E({label:t,value:m,total:a,color:s,valueFormatter:c}){const p=b();return e.createElement(v,{item:!0,xs:12,className:p.item},e.createElement(n,{className:p.category},e.createElement("span",{className:p.legendDash,style:{backgroundColor:s}}),e.createElement(u,null,t)),a&&e.createElement(u,null,c(m)," of ",c(a)," (",Math.round(m/a*100),"%)"))}function M({campaign:t,filter:m}){const a=D(),s=b(),{data:c,isLoading:p}=R({trackId:t.track.id,filter:m},!0),i=c?.certificationStatus.statusByLevel[0],F=Math.max(Math.ceil(h.now().diff(h.fromISO(t.startDate),"days").days),1),{data:f}=T({trackId:t.track.id,filter:m,numberOfDays:F},!!t),o=c?.certificationStatus.numberOfEntities??0,d=B(()=>{if(o===void 0||f===void 0||i===void 0)return;const r=(f.certificationStatusHistory.history[0]?.statusByLevel[0].passed??0)/o*100;return i.passed/o*100-r},[f,i,o]),g=r=>r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toString();let y=C,l;return d&&(l=`${d.toFixed(0)}% since campaign start`,d<=-1?(y=N,l=`-${l}`):d>=1&&(y=k,l=`+${l}`)),p?e.createElement(x,{className:s.card},e.createElement(L,null)):e.createElement(x,{className:s.card},i?e.createElement(n,{className:s.content},e.createElement(n,{width:"100%"},e.createElement(w,{data:i,valueFormatter:g,categories:["passed","failed","notReported"],categoryFormatter:r=>r.replace(/\b\w/g,S=>S.toUpperCase()),colors:[a.palette.success.main,a.palette.error.main,a.palette.text.disabled]}),e.createElement(n,{paddingTop:"12px"},e.createElement(v,{spacing:2},e.createElement(E,{label:"Passing",value:i.passed,total:o,color:a.palette.success.main,valueFormatter:g}),e.createElement(E,{label:"Failing",value:i.failed,total:o,color:a.palette.error.main,valueFormatter:g}),e.createElement(E,{label:"Not Reported",value:i.notReported,total:o,color:a.palette.text.disabled,valueFormatter:g}),!!d&&e.createElement(n,{display:"flex",alignItems:"center",paddingTop:"12px"},e.createElement(y,null),e.createElement(u,{style:{marginLeft:a.spacing(1)}},l)))))):e.createElement(n,{margin:"auto"},e.createElement(u,{variant:"subtitle1"},"No Data")))}export{M as CampaignStatusTile};
|
|
2
2
|
//# sourceMappingURL=CampaignStatusTile.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Paper as
|
|
1
|
+
import{Paper as m,Typography as i,Divider as s}from"@material-ui/core";import{makeStyles as d}from"@material-ui/core/styles";import{DateTime as n}from"luxon";import t from"react";const p=d(a=>({root:{display:"flex",flexDirection:"column",alignItems:"center",overflow:"hidden",width:"100%",height:"100%",padding:0},textWrapper:{display:"flex",flexDirection:"column",flexGrow:1,alignItems:"center",justifyContent:"center",padding:a.spacing(1)},daysRemaining:{textAlign:"center",marginBottom:a.spacing(.5)},daysRemainingText:{textAlign:"center",fontWeight:"bold"},divider:{width:"100%"},dateContainer:{display:"flex",flexDirection:"row",justifyContent:"flex-start",width:"100%",padding:a.spacing(1),flexGrow:0},dateSection:{width:"100%",paddingLeft:a.spacing(.5)},dateLabel:{fontSize:a.typography.caption.fontSize,color:a.palette.text.secondary},dateValue:{fontSize:a.typography.subtitle2.fontSize,color:a.palette.text.primary},verticalDivider:{height:"100%"}}));function g({campaign:a}){const e=p(),l=n.fromISO(a.startDate),r=n.fromISO(a.targetCompletionDate),c=n.now(),o=Math.max(Math.ceil(r.diff(c,"days").days),0);return t.createElement(m,{className:e.root},t.createElement("div",{className:e.textWrapper},t.createElement(i,{variant:"h1",className:e.daysRemaining},o),t.createElement(i,{variant:"subtitle2",className:e.daysRemainingText},o===1?"DAY REMAINING":"DAYS REMAINING")),t.createElement(s,{className:e.divider}),t.createElement("div",{className:e.dateContainer},t.createElement("div",{className:e.dateSection},t.createElement(i,{className:e.dateLabel},"START"),t.createElement(i,{className:e.dateValue},l.toLocaleString({month:"short",day:"numeric"}).toLocaleUpperCase())),t.createElement("div",{className:`${e.dateSection}`},t.createElement(i,{className:e.dateLabel},"END"),t.createElement(i,{className:e.dateValue},r.toLocaleString({month:"short",day:"numeric"}).toLocaleUpperCase()))))}export{g as DaysRemainingTile};
|
|
2
2
|
//# sourceMappingURL=DaysRemainingTile.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
1
|
+
import{usePermission as u}from"@backstage/plugin-permission-react";import{soundcheckCampaignUpdatePermission as f}from"@spotify/backstage-plugin-soundcheck-common";import e,{useEffect as C}from"react";import{useParams as E}from"react-router-dom";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import{useCampaignFormContext as y}from"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../hooks/useSoundcheckAlert.esm.js";import{useUpdateCampaign as h}from"../../hooks/campaigns/useUpdateCampaign.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as k}from"../../hooks/useNavigateBack.esm.js";import{useGetCampaign as L}from"../../hooks/campaigns/useGetCampaign.esm.js";import{campaignsPageRouteRef as P}from"../../routes.esm.js";import{CampaignForm as w}from"../CampaignForm/CampaignForm.esm.js";import{PageWarningMessage as F}from"../PageWarningMessage/PageWarningMessage.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as U}from"../SoundcheckHeader/useHeader.esm.js";import{Loading as I}from"../TechHealth/Loading/Loading.esm.js";import{EmptyCampaignState as R}from"./CampaignEmptyState.esm.js";const S=()=>{U({title:"Update Campaign",description:"Update your campaign, including schedule, milestones, and other associated details.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/campaigns"});const[r,n]=k(P),{campaignId:p}=E(),{setIsLoading:o}=y(),{mutateAsync:s,isLoading:i}=h(),{data:c,isLoading:m}=L(p??""),t=c?.edges?.[0]?.node,{loading:d,allowed:a}=u({permission:f,resourceRef:t?.id});if(C(()=>o(i),[o,i]),!m&&!t)return e.createElement(R,null);const g=async l=>{await s(l,{onSuccess:n})};return e.createElement(e.Fragment,null,e.createElement(F,{entityId:t?.id,entityName:t?.name??"",showCannotEdit:!d&&!a}),m?e.createElement(I,null):e.createElement(e.Fragment,null,a&&e.createElement(w,{onSave:g,onCancel:r,selectedCampaign:t})))};export{S as EditCampaignView};
|
|
2
2
|
//# sourceMappingURL=EditCampaignView.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useEntity as u}from"@backstage/plugin-catalog-react";import{styled as o,Accordion as f,AccordionSummary as E,AccordionDetails as b,makeStyles as y,Box as
|
|
1
|
+
import{useEntity as u}from"@backstage/plugin-catalog-react";import{styled as o,Accordion as f,AccordionSummary as E,AccordionDetails as b,makeStyles as y,Box as R}from"@material-ui/core";import h from"@material-ui/icons/ExpandMore";import e,{useRef as x}from"react";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import{useCertificationDetailsForTrack as k}from"../../hooks/certifications/useCertificationDetailsForTrack.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{AlertPanel as v}from"../AlertPanel/AlertPanel.esm.js";import"../CertificationSidebar/CertificationSidebar.esm.js";import{CertificationSummary as I}from"../CertificationSidebar/CertificationSummary.esm.js";import{CertificationSidebarSkeleton as T}from"../CertificationSidebar/skeletons/CertificationSidebarSkeleton.esm.js";import"@material-ui/lab";import{CertificationLevel as C}from"../CertificationSidebar/CertificationLevel.esm.js";const L=o(f)(({theme:t})=>({margin:"0",border:`1px solid ${t.palette.divider}`,borderRadius:0,"&.Mui-expanded":{borderRadius:0},"&:first-child":{borderTopLeftRadius:0,borderTopRightRadius:0},"&:last-child":{borderBottomLeftRadius:0,borderBottomRightRadius:0},"&:not(:first-child)":{borderTop:`1px solid ${t.palette.divider}`},"&:not(:last-child)":{marginBottom:t.spacing(1)}})),S=o(({...t})=>e.createElement(E,{classes:{content:"content",expanded:"expanded"},...t}))(({theme:t})=>({borderRadius:0,paddingTop:0,paddingLeft:0,paddingRight:t.spacing(1),"& > .content":{margin:"0 !important",padding:"0 !important"},"& > .content.expanded":{margin:"0 !important",padding:"0 !important"}})),A=o(b)(()=>({margin:"0 !important",borderRadius:0,padding:0})),n=y(()=>({sidebar:{width:"100%"}})),B=({playlistId:t,trackId:i,checkId:d})=>{const m=n(),{entity:p}=u(),c=x(null),{data:r,isLoading:l,isError:s}=k(p,i);if(s)return e.createElement("div",null,e.createElement(R,{padding:2},e.createElement(v,{severity:"error",title:"Error loading certification"})));if(l||!i)return e.createElement(T,null);if(!r)return null;const g=r.program.type==="campaign";return e.createElement(L,{ref:c,defaultExpanded:!0,elevation:0},e.createElement(S,{expandIcon:e.createElement(h,null),"aria-controls":"certification-content",id:"certification-summary"},e.createElement(I,{name:r.program.name,badge:r.program.badge,description:r.program.description,documentationUrl:r.program.documentationURL,trackType:r.program.type})),e.createElement(A,null,e.createElement("div",{className:m.sidebar},r?.levels.map(a=>e.createElement(C,{key:a.ordinal,level:a,checkId:d,trackId:i,playlistId:t,isCampaign:g})))))};export{B as CertificationAccordion,n as useStyles};
|
|
2
2
|
//# sourceMappingURL=CertificationAccordion.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useEntity as c}from"@backstage/plugin-catalog-react";import{makeStyles as d,Box as s}from"@material-ui/core";import
|
|
1
|
+
import{useEntity as c}from"@backstage/plugin-catalog-react";import{makeStyles as d,Box as s}from"@material-ui/core";import e from"react";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import{useCertificationDetailsForTrack as f}from"../../hooks/certifications/useCertificationDetailsForTrack.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{AlertPanel as g}from"../AlertPanel/AlertPanel.esm.js";import{CertificationLevel as u}from"./CertificationLevel.esm.js";import{CertificationSummary as y}from"./CertificationSummary.esm.js";import{CertificationSidebarSkeleton as k}from"./skeletons/CertificationSidebarSkeleton.esm.js";import"@material-ui/lab";const E=d(()=>({checks:{padding:0,margin:0,flex:1,listStyle:"none"}})),S=({playlistId:o,trackId:t,checkId:a})=>{const{entity:m}=c(),{data:r,isLoading:n,isError:p}=f(m,t);if(p)return e.createElement("div",null,e.createElement(s,{padding:2},e.createElement(g,{severity:"error",title:"Error loading certification"})));if(n||!t)return e.createElement(k,null);if(!r)return null;const l=r.program.type==="campaign";return e.createElement("div",null,e.createElement(y,{name:r.program.name,badge:r.program.badge,description:r.program.description,documentationUrl:r.program.documentationURL,trackType:r.program.type}),r?.levels.map(i=>e.createElement(u,{key:i.ordinal,level:i,checkId:a,trackId:t,playlistId:o,isCampaign:l})))};export{S as CertificationSidebar,E as useStyles};
|
|
2
2
|
//# sourceMappingURL=CertificationSidebar.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{MarkdownContent as
|
|
1
|
+
import{MarkdownContent as o,Link as p}from"@backstage/core-components";import{makeStyles as s,Typography as d,Grid as c}from"@material-ui/core";import e from"react";import{CertificationBadge as g}from"../Badges/CertificationBadge.esm.js";import{StatusDetails as u}from"./StatusDetails.esm.js";const i=s(t=>({description:{padding:0,margin:0,display:"block","& p":{margin:0}},root:{padding:t.spacing(2),margin:0,display:"grid",gridTemplateColumns:"min-content auto",gridGap:t.spacing(2)},title:{fontSize:t.typography.pxToRem(18),fontWeight:700,lineHeight:1.235,marginBottom:"6px"},level:{textTransform:"uppercase",color:t.palette.text.secondary,fontWeight:700,letterSpacing:"1px"}}));function y({description:t,documentationUrl:n}){const a=i();return n?e.createElement("div",{className:a.description},e.createElement(o,{content:t}),e.createElement(p,{to:n},"Learn more")):e.createElement("div",{className:a.description},e.createElement(o,{content:t}))}const E=({name:t,badge:n,description:a,documentationUrl:m,trackType:l="standard"})=>{const r=i();return e.createElement("div",{className:r.root},e.createElement(g,{badge:n,trackType:l,size:"large",showTooltip:!0}),e.createElement("div",null,e.createElement(d,{className:r.title},t),e.createElement(c,{container:!0,direction:"column",spacing:0},a&&e.createElement(c,{item:!0},e.createElement(y,{description:a,documentationUrl:m})),e.createElement(u,{badge:n}))))};export{E as CertificationSummary,i as useStyles};
|
|
2
2
|
//# sourceMappingURL=CertificationSummary.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{stringifyEntityRef as
|
|
1
|
+
import{stringifyEntityRef as h}from"@backstage/catalog-model";import{useEntity as b}from"@backstage/plugin-catalog-react";import{makeStyles as v,Typography as I,Tooltip as N,IconButton as x,CircularProgress as T}from"@material-ui/core";import z from"@material-ui/icons/Refresh";import S from"classnames";import e,{useState as F,useMemo as L}from"react";import{Link as w}from"react-router-dom";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import{useGetChecks as A}from"../../hooks/checks/useGetChecks.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useExecuteCheck as B}from"../../hooks/checks/useExecuteCheck.esm.js";import"../CheckDryRun/CheckDryRun.esm.js";import"../SoundcheckDialog/SoundcheckDialog.esm.js";import{CheckDryRunDialogButton as D}from"../CheckDryRun/CheckDryRunDialogButton.esm.js";import"../CheckDryRun/CheckDryRunDetails.esm.js";import"../CheckDryRun/CheckDryRunContext.esm.js";import{mapCheckToCheckInput as G}from"../CheckDryRun/checkDryRunUtils.esm.js";import{CheckIcon as $}from"../CheckIcon/CheckIcon.esm.js";import{RelativeTime as H}from"../RelativeTime/RelativeTime.esm.js";const d=v(t=>({root:{display:"grid",width:"100%",gridTemplateColumns:"auto 1fr auto auto auto",gridColumnGap:t.spacing(.5),padding:t.spacing(1),alignItems:"center","&.selected":{backgroundColor:t.palette.action.hover},"&:hover, &:active, &:focus":{backgroundColor:t.palette.action.hover}},checkIcon:{height:20}})),M=({className:t,href:a,name:r,children:c})=>a?e.createElement(w,{"aria-label":`select check ${r}`,to:a,className:t},c):e.createElement("div",{className:t},c),P=({result:t,name:a,id:r,timestamp:c,isExecutable:f=!1,selected:k=!1,href:g})=>{const n=d(),E=S(n.root,{selected:k}),{entity:i}=b(),{mutateAsync:y,isLoading:l}=B(),[o,C]=F(),{data:s}=A({ids:r?[r]:[]},!!o),u=L(()=>{const m=s?.edges?.[0]?.node;return m?G(m):null},[s?.edges]),R=async()=>{if(!i||!r)return;const m=await y({checkerId:r,entityRef:h(i),shouldRefreshFacts:!0}).catch(j=>{});m&&C(m)},p=!i||!r||!f;return e.createElement(M,{href:g,className:E,name:a},e.createElement($,{className:n.checkIcon,result:t}),e.createElement(I,{variant:"body2"},a),c&&!l?e.createElement(H,{timestamp:c}):null,!l&&e.createElement(e.Fragment,null,e.createElement(N,{title:"Execute Check",disableHoverListener:p},e.createElement("span",null,e.createElement(x,{size:"small",color:"inherit",onClick:R,disabled:p,"aria-label":"Execute Check"},e.createElement(z,{fontSize:"small"})))),!!o&&!!u&&e.createElement(D,{entityRef:h(i),check:u,checkResult:{checkResult:o.result,notes:o.details?.notes?.data??""},facts:o.facts,ruleResults:o.ruleResults,size:"small"})),l&&e.createElement(T,{color:"inherit",size:"1em"}))};export{P as Check,d as useStyles};
|
|
2
2
|
//# sourceMappingURL=Check.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{MarkdownContent as
|
|
1
|
+
import{MarkdownContent as i}from"@backstage/core-components";import{makeStyles as n,Typography as p,Grid as a}from"@material-ui/core";import r from"react";import{LevelBadge as d}from"../Badges/LevelBadge.esm.js";import"../Badges/NoLevelBadge.esm.js";import"../Badges/CampaignBadge.esm.js";import{StatusDetails as l}from"./StatusDetails.esm.js";const o=n(e=>({wrapper:{backgroundColor:e.palette.background.default,color:e.palette.text.primary,fontSize:e.typography.caption.fontSize,minHeight:"auto",borderTop:`1px solid ${e.palette.divider}`,borderBottom:`1px solid ${e.palette.divider}`,padding:e.spacing(1),display:"grid",gridTemplateAreas:({badge:t})=>[`"${t?"badge":"title"} title"`,`"${t?".":"description"} description"`].join(" "),gridTemplateColumns:"auto 1fr"},title:{gridArea:"title",textTransform:"uppercase",fontWeight:"bold",color:e.palette.text.primary,fontSize:e.typography.body2.fontSize,paddingTop:e.spacing(.5),paddingBottom:e.spacing(.5),lineHeight:1},badge:{gridArea:"badge",marginRight:e.spacing(1)},description:{gridArea:"description",color:e.palette.text.primary,fontSize:e.typography.subtitle2.fontSize,"& p":{marginBlockStart:0,marginBlockEnd:0}}})),m=e=>{const t=o({badge:e.badge});return r.createElement("div",{className:t.wrapper},e.badge?r.createElement(d,{className:t.badge,badge:e.badge}):null,r.createElement(p,{className:t.title},e.title),r.createElement(a,{container:!0,direction:"column",spacing:0,className:t.description},e.description?r.createElement(a,{item:!0},r.createElement(i,{content:e.description})):null,r.createElement(l,{badge:e.badge})))};export{m as LevelSummary,o as useStyles};
|
|
2
2
|
//# sourceMappingURL=LevelSummary.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{makeStyles as i,Grid as l,Typography as m}from"@material-ui/core";import e from"react";import{BadgeVariant as p}from"../../graphql/generated/index.esm.js";const s=i(a=>({status:{fontSize:"12px",color:a.palette.text.secondary}})),c=a=>{const n=s();if(a.badge?.variant!==p.Status)return e.createElement(e.Fragment,null);const t=a.badge.options.status;if(!t)return e.createElement(e.Fragment,null);const r=t.passed+t.failed+t.warning+t.error+t.notReported,o=r?t.passed/r*100:0;return e.createElement(l,{item:!0},e.createElement(m,{variant:"caption",className:n.status},`${t.passed}/${r} checks passed (${Math.round(o)}%)`))};export{c as StatusDetails,s as useStyles};
|
|
2
|
+
//# sourceMappingURL=StatusDetails.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useRouteRef as p}from"@backstage/core-plugin-api";import{useEntity as y}from"@backstage/plugin-catalog-react";import{Tabs as
|
|
1
|
+
import{useRouteRef as p}from"@backstage/core-plugin-api";import{useEntity as y}from"@backstage/plugin-catalog-react";import{Tabs as b}from"@material-ui/core";import n from"react";import{useAllCertifications as g}from"../../hooks/certifications/useAllCertifications.esm.js";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/catalog-model";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{usePlaylists as C}from"../../hooks/playlists/usePlaylists.esm.js";import{certificationPlaylistRouteRef as k,certificationTrackRouteRef as I}from"../../routes.esm.js";import{CertificationTab as R}from"./CertificationTab.esm.js";import{PlaylistCertificationTab as T}from"./PlaylistCertificationTab.esm.js";import{CertificationTabsSkeleton as h}from"./skeletons/CertificationTabsSkeleton.esm.js";function E(m=[],e=[],o,l){if(o){const i=m.findIndex(a=>a.id===o);return i<0?!1:i}const r=e.findIndex(i=>i.program.id===l);return r<0?!1:r+m.length}const x=({playlistId:m,trackId:e})=>{const{entity:o}=y(),{isLoading:l,data:r}=g(o),{isLoading:i,data:a}=C(o),c=p(k),s=p(I);if(i||l||!e)return n.createElement(h,null);const d=E(a,r,m,e);return n.createElement(b,{value:d,indicatorColor:"primary","aria-label":"Certifications",variant:"scrollable"},a?.length&&a.map(({id:t,name:f})=>n.createElement(T,{key:t,id:t,name:f,selected:t===e,href:c({playlistId:t})})),r&&r.filter(({program:{type:t}})=>t!=="playlist").map(({program:{id:t,name:f,badge:u}})=>n.createElement(R,{key:t,id:t,name:f,badge:u,selected:t===e,href:s({trackId:t})})))};export{x as CertificationTabs};
|
|
2
2
|
//# sourceMappingURL=CertificationTabs.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{LinearGauge as
|
|
1
|
+
import{LinearGauge as d}from"@backstage/core-components";import{makeStyles as g,useTheme as f,Typography as u}from"@material-ui/core";import s from"lodash";import t,{useMemo as y}from"react";import{ResultState as n}from"../../../graphql/generated/index.esm.js";import{LevelBadge as k}from"../../Badges/LevelBadge.esm.js";import{NoLevelBadge as h}from"../../Badges/NoLevelBadge.esm.js";import"../../Badges/CampaignBadge.esm.js";import{usePlaylistCertificationContext as x}from"./PlaylistContext.esm.js";const v=(l,r)=>{if(r)return r.filter(e=>l.trackIds.includes(e.program.id)).map(e=>{const i=s.sumBy(e.levels,m=>s.filter(m.checks,{result:n.Passed}).length),o=s.sumBy(e.levels,m=>s.reject(m.checks,{result:n.NotApplicable}).length),a=o===0?0:i/o;return{id:e.program.id,name:e.program.name,checkPassRate:a}})},c=g(()=>({root:{margin:0,width:"250px"},trackItem:{display:"flex",flexDirection:"column",alignItems:"flex-start"},badgeAndName:{display:"flex",flexDirection:"row",alignItems:"center"},trackName:{marginLeft:"8px"}})),N=({playlist:l})=>{const r=c(),{data:e}=x(),i=f(),o=y(()=>v(l,e),[e,l]);return t.createElement("div",{className:r.root},o&&o.map(a=>{const m=e?.find(p=>p.program.id===a.id)?.program?.badge;return t.createElement("div",{className:r.trackItem,key:a.id},t.createElement("div",{className:r.badgeAndName},m?t.createElement(k,{badge:m}):t.createElement(h,null),t.createElement(u,{variant:"caption",color:"textSecondary",className:r.trackName},a.name)),t.createElement("div",{style:{width:"100%",marginBottom:"8px"}},t.createElement(d,{value:a.checkPassRate,getColor:()=>i.palette.status.ok})))}))};export{N as PlaylistProgress,c as useStyles};
|
|
2
2
|
//# sourceMappingURL=PlaylistProgress.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Typography as
|
|
1
|
+
import{Typography as n}from"@material-ui/core";import{makeStyles as i}from"@material-ui/core/styles";import e from"react";import{LineChart as c,CartesianGrid as s,XAxis as m,YAxis as l,Line as d}from"recharts";import{CARTESIAN_GRID_OPACITY as p,AXIS_DOMAIN as h}from"../ChartTypes.esm.js";import{ChartWrapper as g}from"../ChartWrapper/ChartWrapper.esm.js";const y=i(t=>({container:{position:"relative"},chartMessage:{position:"absolute",top:"50%",left:"50%",fontWeight:"bold",transform:"translate(-50%, -50%)",backgroundColor:t.palette.background.default,padding:t.spacing(1),borderRadius:"5px",textAlign:"center",width:"50%",zIndex:2}})),x=({height:t,text:r})=>{const o=[{x:"A",y:0},{x:"B",y:50},{x:"C",y:100}],a=y();return e.createElement("div",{className:a.container},e.createElement(g,{height:t},e.createElement(c,{data:o},e.createElement(s,{strokeDasharray:"3 3",vertical:!1,opacity:p}),e.createElement(m,{dataKey:"x",stroke:"#ccc",hide:!0}),e.createElement(l,{domain:h,stroke:"#ccc",hide:!0}),e.createElement(d,{type:"monotone",dataKey:"y",stroke:"#ccc",dot:!1}))),e.createElement(n,{className:a.chartMessage},r??"No Data"))};export{x as LineChartPlaceholder};
|
|
2
2
|
//# sourceMappingURL=LineChartPlaceholder.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{makeStyles as
|
|
1
|
+
import{makeStyles as w,useTheme as v,Box as o,Paper as k,Typography as b,Tooltip as D}from"@material-ui/core";import u from"@material-ui/lab/Skeleton";import{DateTime as R}from"luxon";import t from"react";import{CircularProgressbar as $,buildStyles as B}from"react-circular-progressbar";import{getChartFontColor as g,formatDate as P}from"../Charts/chartUtils.esm.js";import{getApplicableCheckCount as p}from"../TrackPage/TrackEntitiesTable/utils.esm.js";import{getProgressColor as x}from"../TrackPage/utils.esm.js";import{CheckHistoryChart as T}from"./CheckHistoryChart.esm.js";import{getCheckName as W}from"./utils.esm.js";const y=w(e=>({card:{display:"flex",flexDirection:"column",border:`1px solid ${e.palette.divider}`,width:"99%"},title:{fontWeight:"bold",fontSize:"0.9rem",cursor:"default",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},headerRow:{display:"flex",padding:e.spacing(1.5,2),borderBottom:`1px solid ${e.palette.divider}`,width:"100%"},headerSection:{display:"flex",flexDirection:"column",gap:e.spacing(.5),flexGrow:1,width:"100%"},contentRow:{padding:e.spacing(1.5,2,.5),display:"flex"},leftSection:{width:"75px",minWidth:"75px"},summaryCard:{height:"100%",display:"flex",flexDirection:"column",justifyContent:"space-between"},chartSection:{flex:1,width:"100%",minWidth:"150px"},chartSkeletonSection:{flex:1,width:"100%",minWidth:"150px",padding:e.spacing(0,0,1,1)},overallSummaryBox:{display:"flex",flexDirection:"column",height:"100%",color:g(e),textAlign:"center",gap:e.spacing(2)}})),z=()=>{const e=y();return t.createElement(o,{className:e.contentRow},t.createElement(o,{className:e.leftSection},t.createElement(o,{className:e.summaryCard},t.createElement(u,{variant:"circle",height:75}))),t.createElement(o,{className:e.chartSkeletonSection},t.createElement(u,{variant:"rect",height:92})))};function A(e){if(!e)return[];const{history:n}=e,a=R.utc();return n.map((l,r)=>{const i=p(l);return{name:P(a,n.length-r-1),passRate:i?Math.round(l.passed/i*100):0}})}function M(e){if(!e)return 0;const{passed:n}=e,a=p(e);return a?Math.round(n/a*100):0}function j(e){if(!e)return{numerator:0,denominator:0};const{passed:n}=e,a=p(e);return{numerator:n,denominator:a}}const F=({check:e,track:n,status:a,history:l})=>{const r=y(),i=v(),E={dataKey:"passRate",name:"Pass rate"},C=l?.history?.length??0,S=A(l),c=M(a);let m;a?m=`${c}%`:m="No Data";let d=!1,s;if(!a)s="No Data";else{const{numerator:N,denominator:f}=j(a);f>0?(d=!0,s=`${N} of ${f} entities passing`):s="No Applicable Entities"}const h=d?t.createElement(o,{className:r.overallSummaryBox},t.createElement($,{value:c,text:m,styles:B({textColor:g(i),pathColor:x(i,c),trailColor:i.palette.divider,textSize:C?void 0:10})})):null;return t.createElement(k,{className:r.card,elevation:0},t.createElement(o,{className:r.headerRow},t.createElement(o,{className:r.headerSection},t.createElement(b,{className:r.title},W(n,e)))),!a||!l?t.createElement(z,null):t.createElement(D,{title:s},t.createElement(o,{className:r.contentRow},h&&t.createElement(o,{className:r.leftSection},t.createElement(o,{className:r.summaryCard},h)),t.createElement(o,{className:r.chartSection},t.createElement(T,{data:d?S:[],lineConfig:E,color:x(i,c)})))))};export{F as CheckCard};
|
|
2
2
|
//# sourceMappingURL=CheckCard.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useTheme as m}from"@material-ui/core";import e from"react";import{ResponsiveContainer as n,AreaChart as l,CartesianGrid as c,XAxis as s,YAxis as p,Area as A}from"recharts";import{CARTESIAN_GRID_OPACITY as d,CHART_DATA_KEY as
|
|
1
|
+
import{useTheme as m}from"@material-ui/core";import e from"react";import{ResponsiveContainer as n,AreaChart as l,CartesianGrid as c,XAxis as s,YAxis as p,Area as A}from"recharts";import{CARTESIAN_GRID_OPACITY as d,CHART_DATA_KEY as h,HORIZONTAL_Y_AXIS_WIDTH as C,AXIS_DOMAIN as f}from"../Charts/ChartTypes.esm.js";import"../Charts/LineChart/LineChart.esm.js";import{getChartFontColor as y}from"../Charts/chartUtils.esm.js";import"luxon";import"../TechHealthSummary/SummaryAggregationsProvider.esm.js";import"@backstage/catalog-model";import"../Charts/BarChart/BarChart.esm.js";import{LineChartPlaceholder as E}from"../Charts/LineChart/LineChartPlaceholder.esm.js";const I=({data:r,lineConfig:t,color:o})=>{const i=m(),a=y(i);return r.length?e.createElement(n,{minHeight:100,debounce:1},e.createElement(l,{data:r},e.createElement(c,{vertical:!1,opacity:d}),e.createElement(s,{dataKey:h,stroke:a,style:{fontSize:"0.7rem"}}),e.createElement(p,{width:C,domain:f,stroke:a,style:{fontSize:"0.7rem"}}),e.createElement(A,{key:t.dataKey,dataKey:t.dataKey,name:t.name,stackId:"1",type:"monotone",stroke:o,strokeWidth:1.2,fill:o}))):e.createElement(E,{height:100})};export{I as CheckHistoryChart};
|
|
2
2
|
//# sourceMappingURL=CheckHistoryChart.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{MarkdownContent as
|
|
1
|
+
import{MarkdownContent as d}from"@backstage/core-components";import{useApi as g,configApiRef as f}from"@backstage/core-plugin-api";import{makeStyles as u,Paper as k,Typography as C,Box as h,Button as x}from"@material-ui/core";import t,{useState as E}from"react";import{ResultState as e}from"../../graphql/generated/index.esm.js";import{CheckIcon as R}from"../CheckIcon/CheckIcon.esm.js";import{FixMeDialog as b}from"./FixMeDialog.esm.js";const w=u(a=>({markdownContent:{"& :last-child":{marginBottom:0},"& pre":{background:`${a.palette.background.paper} !important`}},root:{padding:a.spacing(2),display:"flex",gap:a.spacing(1.5)},iconContainer:{marginTop:1},passed:{},failed:{},warning:{},notReported:{},notApplicable:{},error:{},icon:{}}),{name:"CheckResultStateBox"}),y={[e.Passed]:"Check passed",[e.Failed]:"Check did not pass",[e.Warning]:"Check produced warning(s)",[e.NotReported]:"Check not reported",[e.NotApplicable]:"Check not applicable",[e.Error]:"Check encountered an error."},N={[e.Passed]:"passed",[e.Failed]:"failed",[e.Warning]:"warning",[e.NotReported]:"notReported",[e.NotApplicable]:"notApplicable",[e.Error]:"error"},A=({name:a,state:n,notes:i,templateRef:l})=>{const o=w(),[c,r]=E(!1),p=g(f).getOptionalStringArray("soundcheck.flags")?.includes("enable-fix-me"),s=()=>{r(!0)},m=()=>{r(!1)};return t.createElement(k,{variant:"outlined",className:`${o.root} ${o[N[n]]}`},t.createElement("div",{className:o.iconContainer},t.createElement(R,{className:o.icon,result:n})),t.createElement("div",{style:{width:"100%"}},t.createElement(C,{variant:"subtitle1"},y[n]),i?t.createElement(d,{className:o.markdownContent,content:i}):null,p&&n===e.Failed&&l&&t.createElement(h,{display:"flex",flexDirection:"column",alignItems:"flex-end",mt:2,width:"100%"},t.createElement(x,{color:"primary",variant:"contained",onClick:s},"Fix"),t.createElement(b,{title:`Fix ${a}`,open:c,setOpen:r,onClose:m,templateRef:l}))))};export{A as ResultStateBox};
|
|
2
2
|
//# sourceMappingURL=ResultStateBox.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{makeStyles as C,Box as p,Typography as k,TextField as
|
|
1
|
+
import{makeStyles as C,Box as p,Typography as k,TextField as x,IconButton as v,Button as d,Divider as y}from"@material-ui/core";import B from"@material-ui/icons/Add";import S from"@material-ui/icons/Delete";import e,{useContext as E,useCallback as r}from"react";import{SoundcheckDialog as V}from"../../../../SoundcheckDialog/SoundcheckDialog.esm.js";import{ValueListContext as f}from"./ValueListContext.esm.js";const h=C(t=>({dialogButton:{padding:t.spacing(1,1.5)}})),I=()=>{const{values:t,updateValues:n,updateOpen:i,onSave:o}=E(f),u=r((a,l)=>{const s=[...t];s[a]=l,n(s)},[n,t]),c=r(a=>{const l=[...t];l.splice(a,1),n(l)},[n,t]),m=r(()=>{const a=[...t,""];n(a)},[n,t]),g=r(()=>{o(t.filter(a=>!!a)),i(!1)},[o,i,t]);return e.createElement(p,{minWidth:640,paddingLeft:2,paddingRight:2,"data-testid":"rule-value-list-input"},e.createElement(k,{component:"div",variant:"subtitle2"},"Rule Value"),t.map((a,l)=>e.createElement(p,{display:"flex",marginBottom:1,alignItems:"center",key:l},e.createElement(x,{value:a,onChange:s=>u(l,s.currentTarget.value),variant:"outlined",margin:"dense",fullWidth:!0}),e.createElement(v,{onClick:()=>c(l),size:"small"},e.createElement(S,null)))),e.createElement(p,{marginTop:1,marginBottom:2},e.createElement(d,{onClick:m,startIcon:e.createElement(B,null),size:"small",variant:"outlined"},"Add")),e.createElement(y,null),e.createElement(p,{marginTop:2,display:"flex",gridGap:8,justifyContent:"flex-end"},e.createElement(d,{onClick:()=>i(!1),variant:"text"},"Cancel"),e.createElement(d,{onClick:g,variant:"contained",color:"primary"},"Save")))},L=({values:t=Array(5).fill(""),onSave:n,iconButton:i})=>{const{updateOpen:o,updateValues:u,updateOnSave:c}=E(f),m=r(()=>{const a=[...t.map(l=>String(l)),"","",""];o(!0),u(a),c(()=>n||(()=>{}))},[n,c,o,u,t]),g=h();return i?e.createElement(v,{"aria-label":"edit list",onClick:m,size:"small"},i):e.createElement(d,{className:g.dialogButton,onClick:m},"List")},T=()=>{const{open:t,updateOpen:n}=E(f);return e.createElement(V,{open:t,handleClose:()=>n(!1),title:"Input Value List",fullScreen:!1},e.createElement(I,null))};export{T as ValueListInputDialog,L as ValueListInputDialogButton};
|
|
2
2
|
//# sourceMappingURL=ValueListInput.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{FrequencySchema as
|
|
1
|
+
import{FrequencySchema as S}from"@spotify/backstage-plugin-soundcheck-common";import{isObject as k}from"lodash";import{v4 as T}from"uuid";import{mapInputFilterToFormFilters as R,mapFiltersToCatalogFilter as y}from"../../Filter/utils.esm.js";import"../../Filter/FilterComponent.esm.js";import{emptyFilters as A}from"../../Filter/types.esm.js";import{TimeUnit as g}from"../../Frequency/types.esm.js";import{isTimeUnit as C}from"../../Frequency/util.esm.js";import"../../Frequency/FrequencyComponent.esm.js";import{ExpressionType as p}from"../types/ExpressionType.esm.js";import{defaultSchedule as O}from"../types/Schedule.esm.js";import"../types/Path.esm.js";import{CHECK_NAME_MAX_LENGTH as P}from"./validation.esm.js";const x=e=>{if(k(e)&&"frequency"in e){const r=S.safeParse(e.frequency);if(r.success){const t=r.data;if("cron"in t)return{enabled:!0,frequency:{type:"cron",unit:g.Hours,value:1,cron:t.cron}};const s=Object.keys(t);if(s.length){const o=s[0];if(C(o))return{enabled:!0,frequency:{type:"HumanDuration",unit:o,value:t[o]??1,cron:""}}}}}return{enabled:!1,frequency:{type:"HumanDuration",unit:g.Hours,value:1,cron:""}}},v=(e,r)=>{const{enabled:t,frequency:s}=e;if(t){const{cron:o,type:n,unit:a,value:l}=s;return n==="HumanDuration"?{frequency:{[a]:l},filter:y(r)}:{frequency:{cron:o}}}},h=e=>{if(Array.isArray(e))return e.map(r=>h(r));if(typeof e=="string"){if(e==="true")return!0;if(e==="false")return!1;const r=Number(e);if(!isNaN(r))return r}return e},f=e=>{if(!e)return{};if(e.expressionType){const r={[e.expressionType]:e.conditions?.map(t=>({factRef:t.factRef,path:t.path,operator:t.operatorPrefix?`${t.operatorPrefix}:${t.operator}`:t.operator,value:h(t.value)}))};return e.expressions&&e.expressions.forEach(t=>{r[e.expressionType]?.push(f(t))}),r}if(e.expressions)return e.expressions.map(f);if(e.conditions&&e.conditions.length===1){const r=e.conditions[0];return{factRef:r.factRef,path:r.path,operator:r.operatorPrefix?`${r.operatorPrefix}:${r.operator}`:r.operator,value:h(r.value)}}return{}},w=e=>{if(e?.match(/.:./)){const r=e.split(":");if(["all","any","none"].includes(r[0]))return{operator:r[1],operatorPrefix:r[0]}}return{}},m=(e,r=!0)=>{if(!e)return{conditions:[]};const t=Object.keys(e);let s=t.includes("all")||r&&!t.includes("any")?p.AllOf:p.AnyOf;if(t.includes("not")&&(s=p.Not),t.includes(s)||r){const a=e[s]||[e],l=[],u=[];return a.forEach(i=>{const d=Object.keys(i);if(d.includes("all")||d.includes("any")||d.includes("not"))u.push(m(i,!1));else{const{operator:E,operatorPrefix:b}=w(i.operator);l.push({factRef:i.factRef,path:i.path,operator:E??i.operator,value:i.value,operatorPrefix:b})}}),{expressions:u.length>0?u:void 0,conditions:l,expressionType:s}}const{operator:o,operatorPrefix:n}=w(e.operator);return{expressionType:p.AllOf,conditions:[{factRef:e.factRef,path:e.path,operator:o??e.operator,value:e.value,operatorPrefix:n}]}},M=e=>({detailsStep:{name:e.name??"",description:e.description??"",ownerEntityRef:e.ownerEntityRef??""},rulesStep:{pathResolver:e.pathResolver??"jsonpath",expressions:m(e.rule),passedMessage:e.passedMessage??void 0,failedMessage:e.failedMessage??void 0,warning:e.warning??!1},filtersStep:{filter:R(e.filter)},scheduleStep:{schedule:x(e.schedule)}}),F=(e,r)=>{const{detailsStep:t,rulesStep:s,filtersStep:o,scheduleStep:n}=e;return{id:r?r.id:T(),ownerEntityRef:t.ownerEntityRef??void 0,name:t.name,description:t.description,pathResolver:s.pathResolver,passedMessage:s.passedMessage??void 0,failedMessage:s.failedMessage??void 0,rule:f(s.expressions),warning:s.warning??!1,filter:o.filter?y(o.filter):void 0,schedule:v(n.schedule,o.filter)}},c=(e,r="$")=>{const t=[];if(e.type==="object"&&e.properties){const s=e.properties;for(const o in s)if(s.hasOwnProperty(o)){const n=`${r}.${o}`;t.push(n);const a=s[o];t.push(...c(a,n))}}if(e.type==="array"&&e.items){const s=`${r}[*]`;t.push(s);const o=Array.isArray(e.items)?e.items:[e.items];for(const n of o)t.push(...c(n,s))}if(e.oneOf){const s=Array.isArray(e.oneOf)?e.oneOf:[e.oneOf];for(const o of s)t.push(...c(o,r))}if(e.allOf){const s=Array.isArray(e.allOf)?e.allOf:[e.allOf];for(const o of s)t.push(...c(o,r))}return[...new Set(t)]},q={detailsStep:{name:"",description:"",ownerEntityRef:""},rulesStep:{pathResolver:"jsonpath",expressions:{expressionType:p.AllOf,expressions:void 0,conditions:[{factRef:"",path:"",operator:"",operatorPrefix:"",value:"",conditions:[]}]},warning:!1},filtersStep:{filter:A()},scheduleStep:{schedule:O()}},N={details:{name:{name:"Check name",helperText:`Max ${P} characters`,placeholder:"Name your check (e.g., 'Code Coverage\u2019)"},description:{name:"Check description",placeholder:"Describe your check clearly so others understand its purpose. e.g., 'Ensure code coverage meets the minimum threshold.'"},owner:{name:"Check owner",selectLabel:"Assign an owner"}},rulesStep:{rules:{name:"Check rules",description:"Define the rules the check will verify."},messages:{name:"Pass/Fail messages (Optional)",description:"Add the messages for check success and failure.",passMessagePlaceholder:"Enter pass message...",failMessagePlaceholder:"Enter fail message...",passedTabName:"Passed Message",failedTabName:"Failed Message"},warnings:{name:"Enable warnings",description:"Enable to classify failures as warnings, so they don\u2019t impact certification.",label:"Warning"}},filter:{description:'Setting the filters below will limit the scope of the Check so that only those Entities that match the filter will be monitored by the Check. As an example, choosing a "Kind" of "Component" will make this Check only apply to Entities whose Kind is indeed set to "Component". This would exclude Entities like Groups, Users, APIs, etc. from being impacted by the Check.'},schedule:{description:"Checks are automatically triggered whenever a dependent fact is updated. When collectors are scheduled, there is generally no need to schedule checks.",checkboxLabel:"Schedule check"}};export{N as CHECK_FIELDS,q as DEFAULT_FORM_VALUES,c as generateJsonPaths,M as mapCheckerToFormValues,f as mapExpressionToRule,x as mapInputScheduleToSchedule,m as mapRuleToExpression,v as mapScheduleToInputSchedule,F as mapToCheckerInput};
|
|
2
2
|
//# sourceMappingURL=checkFormUtils.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{usePermission as p}from"@backstage/plugin-permission-react";import{soundcheckCheckUpdatePermission as c}from"@spotify/backstage-plugin-soundcheck-common";import e from"react";import{useParams as d}from"react-router-dom";import"../../contexts/TrackFormContext.esm.js";import{CheckFormProvider as l}from"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import{useGetChecks as f}from"../../hooks/checks/useGetChecks.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{LoadingIndicator as h}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as u}from"../PageWarningMessage/PageWarningMessage.esm.js";import{CheckEditView as g}from"./CheckEditView.esm.js";const k=()=>{const{checkId:o}=d(),{data:m,isLoading:n}=f({ids:[o??""],first:1}),r=m?.edges?.[0]?.node,{loading:s,allowed:a}=p({permission:c,resourceRef:o}),t=s||n,i=a&&r?.isEditable;return e.createElement(e.Fragment,null,e.createElement(u,{entityName:"check",entityId:o,showCannotEdit:!t&&!i,showNotFound:!t&&!r}),t&&e.createElement(h,null),e.createElement(l,null,!t&&!!r&&i&&e.createElement(g,{check:r})))};export{k as CheckEditPage};
|
|
2
|
+
//# sourceMappingURL=CheckEditPage.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{zodResolver as b}from"@hookform/resolvers/zod";import{makeStyles as v,Paper as B}from"@material-ui/core";import o,{useCallback as S}from"react";import{useForm as F,FormProvider as Q}from"react-hook-form";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../api.esm.js";import"../../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as h}from"../../../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as E}from"../../../../hooks/useNavigateBack.esm.js";import{useUpdateCollectorConfig as q}from"../../../../hooks/collectors/useUpdateCollectorConfig.esm.js";import{integrationsPageRouteRef as w}from"../../../../routes.esm.js";import{FooterButtons as k}from"../../../FooterButtons/FooterButtons.esm.js";import"../../../SoundcheckHeader/SoundcheckHeader.esm.js";import"../../../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as M}from"../../../SoundcheckHeader/useHeader.esm.js";import{FactCollectionConfig as N}from"../Common/FactCollectionConfig.esm.js";import{collectorHeaderContent as P,confirmationModalContent as R}from"../Common/utils.esm.js";import{QueryFactDetailsComponent as T}from"./QueryFactDetailsComponent.esm.js";import{mapConfigToBigQueryCollectorConfig as x,defaultBigQueryConfig as D,queryCollectorConfig as H,mapBigQueryCollectorConfigToConfig as I}from"./utils.esm.js";import{bigQueryCollectorFormSchema as V}from"./validation.esm.js";const z=v(t=>({spacer:{height:t.spacing(8),width:"100%"},section:{marginBottom:t.spacing(2)}})),A=({disabled:t,selectedCollector:e})=>{const c=S(async(r,...i)=>{const C={enabled:!1,collectors:[]},y={query:r.query.enabled?r.query:C};return b(V)(y,...i)},[]),a=F({defaultValues:e?x(e.config):D(),mode:"onChange",resolver:c}),{formState:{isValid:s},handleSubmit:m}=a,n=z(),f=!s,{mutateAsync:p}=q(),[u,d]=E(w),{showModal:g}=h(),l=async r=>{if(!await g(R(e)))return;const i=I(r);await p({collectorId:e.id,config:i})&&d()};return M(P(e)),o.createElement(o.Fragment,null,o.createElement(B,{className:n.section},o.createElement(Q,{...a},o.createElement("form",{onSubmit:m(l)},o.createElement(N,{name:"query",label:"Query",description:"Collects data from BigQuery.",disabled:t,FactDetailsComponent:T,multipleCollectors:{enable:!0,defaultConfig:H()}})))),o.createElement("div",{className:n.section},o.createElement(k,{onCancel:u,saveButtonText:"Save",isLoading:!1,onSave:m(l),disableSave:f})))};export{A as BigQueryConfigurator};
|
|
2
|
+
//# sourceMappingURL=BigQueryConfigurator.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{makeStyles as f,Box as x,Grid as n,Typography as m,TextField as d,FormHelperText as T,Tooltip as b,IconButton as E}from"@material-ui/core";import N from"@material-ui/icons/Add";import C from"@material-ui/icons/Remove";import v from"classnames";import{highlight as F,languages as I}from"prismjs";import"prismjs/components/prism-sql";import e from"react";import{useFormContext as S,useFieldArray as q,Controller as p}from"react-hook-form";import $ from"react-simple-code-editor";import{FormControlledSelect as h}from"../../../FormControlledSelect/FormControlledSelect.esm.js";import{FormFieldLabel as D}from"../../../FormFieldLabel/FormFieldLabel.esm.js";import*as L from"./css/prism-dark-sql.css.esm.js";import{DATA_TYPES as _,FOREIGN_KEY_OPTIONS as k,DEFAULT_SCHEMA_ITEM as H}from"./utils.esm.js";const P=f(r=>({...L,root:{paddingTop:r.spacing(1)},textInput:{marginTop:0,width:"580px"},queryCaption:{width:"580px",display:"block"},queryInput:{marginTop:0,width:"580px",minHeight:"100px",maxHeight:"300px",overflowY:"scroll",outline:`1px solid ${r.palette.action.disabled}`,borderRadius:"6px",display:"grid","&:hover":{outlineColor:r.palette.textContrast}},queryInputError:{outlineColor:r.palette.error.main,"&:hover":{outlineColor:r.palette.error.main}},queryTextarea:{outline:"none"},caption:{margin:r.spacing(2,0)},nameInput:{marginTop:0,display:"inline"},selectInput:{marginTop:0,width:"150px"},helperText:{marginLeft:0}})),w=({name:r,disabled:o})=>{const a=P(),{control:l}=S(),{fields:u,insert:g,remove:y}=q({control:l,name:`${r}.schema`});return e.createElement(x,null,e.createElement(n,{container:!0,spacing:1,direction:"column",className:a.root},e.createElement(n,{item:!0},e.createElement(m,{variant:"subtitle2"},"Fact Name"),e.createElement(p,{name:`${r}.factName`,control:l,render:({field:i,fieldState:{error:t}})=>e.createElement(d,{...i,type:"text",variant:"outlined",margin:"dense",placeholder:"Fact Name",className:a.textInput,disabled:o,error:!!t,helperText:t?.message??"Fact name must be unique",FormHelperTextProps:{className:a.helperText}})})),e.createElement(n,{item:!0},e.createElement(m,{variant:"subtitle2"},"GCP Project ID (Optional)"),e.createElement(p,{name:`${r}.projectId`,control:l,render:({field:i,fieldState:{error:t}})=>e.createElement(d,{...i,type:"text",variant:"outlined",margin:"dense",placeholder:"Project ID",className:a.textInput,disabled:o,error:!!t,helperText:t?.message??"Google Cloud project ID",FormHelperTextProps:{className:a.helperText}})})),e.createElement(n,{item:!0},e.createElement(D,{title:"SQL Query (GoogleSQL)",docLink:"https://cloud.google.com/bigquery/docs/introduction-sql"}),e.createElement(m,{variant:"caption",className:a.queryCaption},"The query can be parameterized, supported named parameters are @entity_refs and @entity_names (the values will be resolved automatically)"),e.createElement(p,{name:`${r}.query`,control:l,render:({field:i,fieldState:{error:t}})=>e.createElement(e.Fragment,null,e.createElement("div",{className:v(a.queryInput,t?a.queryInputError:void 0)},e.createElement($,{...i,highlight:c=>F(c,I.sql,"sql"),onValueChange:i.onChange,padding:10,disabled:o,placeholder:"Example: SELECT * FROM [bigquery-data:catalog.entities] WHERE entity_ref IN UNNEST(@entity_refs)",textareaClassName:a.queryTextarea})),e.createElement(T,{className:a.helperText,error:!!t},t?.message??"Consider updating the collector's batch size to schedule the query for multiple entities at once"))}))),e.createElement("div",{className:a.caption},e.createElement(m,{variant:"subtitle1"},"Output Schema"),e.createElement(m,{variant:"caption"},"List the columns returned by the query")),e.createElement(n,{container:!0,spacing:0,direction:"column"},u.map((i,t)=>e.createElement(n,{item:!0,container:!0,alignItems:"center",spacing:2,key:i.id},e.createElement(n,{item:!0},e.createElement(m,{variant:"subtitle2"},"Column Name"),e.createElement(p,{name:`${r}.schema.${t}.name`,control:l,render:({field:c,fieldState:{error:s}})=>e.createElement(d,{...c,type:"text",variant:"outlined",margin:"dense",placeholder:"Column Name",className:a.nameInput,disabled:o,error:!!s,helperText:s?.message??" ",FormHelperTextProps:{className:a.helperText}})})),e.createElement(n,{item:!0},e.createElement(m,{variant:"subtitle2"},"Data Type"),e.createElement(p,{name:`${r}.schema.${t}.type`,control:l,render:({field:c,fieldState:{error:s}})=>e.createElement(h,{...c,control:l,placeholder:"Data Type",options:_,disabled:o,helperText:s?.message??" "})})),e.createElement(n,{item:!0},e.createElement(b,{placement:"top",title:"Select a value if the column is a foreign key that references a catalog entity field"},e.createElement(m,{variant:"subtitle2"},"Foreign Key")),e.createElement(p,{name:`${r}.schema.${t}.foreignKey`,control:l,render:({field:c,fieldState:{error:s}})=>e.createElement(h,{...c,control:l,placeholder:"Foreign Key",options:k,disabled:o,helperText:s?.message??" "})})),e.createElement(n,{item:!0},e.createElement(E,{onClick:()=>y(t),disabled:o||u.length===1},e.createElement(C,{fontSize:"small"})),e.createElement(E,{onClick:()=>g(t+1,H),disabled:o},e.createElement(N,{fontSize:"small"})))))))};export{w as QueryFactDetailsComponent};
|
|
2
|
+
//# sourceMappingURL=QueryFactDetailsComponent.esm.js.map
|