Skip to content

Commit e974593

Browse files
authored
Merge pull request #209 from PRO-Robotech/feature/dev
new field selector/rename props in tables and events
2 parents 3286c43 + 9b718ca commit e974593

File tree

6 files changed

+84
-60
lines changed

6 files changed

+84
-60
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@prorobotech/openapi-k8s-toolkit",
3-
"version": "0.0.1-alpha.153",
3+
"version": "0.0.1-alpha.154",
44
"description": "ProRobotech OpenAPI k8s tools",
55
"main": "dist/openapi-k8s-toolkit.cjs.js",
66
"module": "dist/openapi-k8s-toolkit.es.js",

src/components/organisms/DynamicComponents/molecules/EnrichedTable/EnrichedTable.tsx

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { useMultiQuery } from '../../../DynamicRendererWithProviders/multiQueryP
1717
import { usePartsOfUrl } from '../../../DynamicRendererWithProviders/partsOfUrlContext'
1818
import { useTheme } from '../../../DynamicRendererWithProviders/themeContext'
1919
import { parseAll } from '../utils'
20-
import { serializeLabels } from './utils'
20+
import { serializeLabelsWithNoEncoding } from './utils'
2121

2222
export const EnrichedTable: FC<{ data: TDynamicComponentsAppTypeMap['EnrichedTable']; children?: any }> = ({
2323
data,
@@ -43,8 +43,8 @@ export const EnrichedTable: FC<{ data: TDynamicComponentsAppTypeMap['EnrichedTab
4343
fetchUrl,
4444
pathToItems,
4545
clusterNamePartOfUrl,
46-
labelsSelector,
47-
labelsSelectorFull,
46+
labelSelector,
47+
labelSelectorFull,
4848
fieldSelector,
4949
namespace,
5050
k8sResource,
@@ -108,48 +108,52 @@ export const EnrichedTable: FC<{ data: TDynamicComponentsAppTypeMap['EnrichedTab
108108

109109
const fetchUrlPrepared = parseAll({ text: fetchUrl, replaceValues, multiQueryData })
110110

111-
let labelsSuffix: string | undefined
112-
if (labelsSelector) {
111+
const sParams = new URLSearchParams()
112+
113+
if (labelSelector && Object.keys(labelSelector).length > 0) {
113114
const parsedObject: Record<string, string> = Object.fromEntries(
114-
Object.entries(labelsSelector).map(
115-
([key, value]) => [key, parseAll({ text: value, replaceValues, multiQueryData })] as [string, string],
115+
Object.entries(labelSelector).map(
116+
([k, v]) => [k, parseAll({ text: v, replaceValues, multiQueryData })] as [string, string],
116117
),
117118
)
118-
const serializedLabels = serializeLabels(parsedObject)
119-
labelsSuffix = serializeLabels.length > 0 ? `?labelSelector=${serializedLabels}` : undefined
119+
const serializedLabels = serializeLabelsWithNoEncoding(parsedObject)
120+
if (serializedLabels.length > 0) sParams.set('labelSelector', serializedLabels)
120121
}
121122

122-
if (labelsSelectorFull) {
123-
const value = Array.isArray(labelsSelectorFull.pathToLabels)
124-
? _.get(multiQueryData[`req${labelsSelectorFull.reqIndex}`], labelsSelectorFull.pathToLabels)
125-
: jp.query(multiQueryData[`req${labelsSelectorFull.reqIndex}`], `$${labelsSelectorFull.pathToLabels}`)[0]
126-
const serializedLabels = serializeLabels(value)
127-
labelsSuffix = serializeLabels.length > 0 ? `?labelSelector=${serializedLabels}` : undefined
123+
if (labelSelectorFull) {
124+
const root = multiQueryData[`req${labelSelectorFull.reqIndex}`]
125+
const value = Array.isArray(labelSelectorFull.pathToLabels)
126+
? _.get(root, labelSelectorFull.pathToLabels)
127+
: jp.query(root, `$${labelSelectorFull.pathToLabels}`)[0]
128+
129+
const serializedLabels = serializeLabelsWithNoEncoding(value)
130+
if (serializedLabels.length > 0) sParams.set('labelSelector', serializedLabels)
128131
}
129132

130-
let fieldSelectorSuffix: string | undefined
131133
if (fieldSelector) {
132-
const preparedFieldSelectorValueText = parseAll({ text: fieldSelector?.parsedText, replaceValues, multiQueryData })
133-
134-
const preparedFieldSelectorValueTextWithPartsOfUrl = prepareTemplate({
135-
template: preparedFieldSelectorValueText,
136-
replaceValues,
137-
})
138-
139-
const preparedSelector = encodeURIComponent(
140-
`${fieldSelector.fieldName}=${preparedFieldSelectorValueTextWithPartsOfUrl}`,
134+
const parsedObject: Record<string, string> = Object.fromEntries(
135+
Object.entries(fieldSelector).map(
136+
([k, v]) =>
137+
[
138+
parseAll({ text: k, replaceValues, multiQueryData }),
139+
parseAll({ text: v, replaceValues, multiQueryData }),
140+
] as [string, string],
141+
),
141142
)
142-
const prefix = labelsSelector ? '&fieldSelector=' : '?fieldSelector='
143-
fieldSelectorSuffix = `${prefix}${preparedSelector}`
143+
const serializedFields = serializeLabelsWithNoEncoding(parsedObject)
144+
145+
if (serializedFields.length > 0) sParams.set('fieldSelector', serializedFields)
144146
}
145147

148+
const searchParams = sParams.toString()
149+
146150
const {
147151
data: fetchedData,
148152
isLoading: isFetchedDataLoading,
149153
error: fetchedDataError,
150154
} = useDirectUnknownResource<unknown>({
151-
uri: `${fetchUrlPrepared}${labelsSuffix || ''}${fieldSelectorSuffix || ''}`,
152-
queryKey: [`${fetchUrlPrepared}${labelsSuffix || ''}${fieldSelectorSuffix || ''}`],
155+
uri: `${fetchUrlPrepared}${searchParams ? `?${searchParams}` : ''}`,
156+
queryKey: [`${fetchUrlPrepared}${searchParams ? `?${searchParams}` : ''}`],
153157
isEnabled: !isMultiqueryLoading,
154158
})
155159

src/components/organisms/DynamicComponents/molecules/EnrichedTable/utils.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,25 @@ export const serializeLabels = (input: unknown): string => {
1919
// 3+4. Build "k=v" pairs, join with commas, then URL‑encode
2020
return encodeURIComponent(entries.map(([k, v]) => `${k}=${v}`).join(','))
2121
}
22+
23+
export const serializeLabelsWithNoEncoding = (input: unknown): string => {
24+
// 1. Must be a non-null plain object
25+
if (
26+
typeof input !== 'object' ||
27+
input === null ||
28+
Array.isArray(input) ||
29+
Object.getPrototypeOf(input) !== Object.prototype
30+
) {
31+
return 'Expected a plain object'
32+
}
33+
34+
const entries = Object.entries(input)
35+
36+
// 2. Validate all values are string|number
37+
if (!entries.map(([, v]) => v).every(v => typeof v === 'string' || typeof v === 'number')) {
38+
return 'All values must be string or number'
39+
}
40+
41+
// 3+4. Build "k=v" pairs, join with commas
42+
return entries.map(([k, v]) => `${k}=${v}`).join(',')
43+
}

src/components/organisms/DynamicComponents/molecules/Events/Events.tsx

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ export const Events: FC<{ data: TDynamicComponentsAppTypeMap['Events']; children
2727
pageSize,
2828
substractHeight,
2929
limit,
30-
labelsSelector,
31-
labelsSelectorFull,
30+
labelSelector,
31+
labelSelectorFull,
3232
fieldSelector,
3333
baseFactoryNamespacedAPIKey,
3434
baseFactoryClusterSceopedAPIKey,
@@ -59,35 +59,39 @@ export const Events: FC<{ data: TDynamicComponentsAppTypeMap['Events']; children
5959
params.set('limit', limit.toString())
6060
}
6161

62-
if (labelsSelector && Object.keys(labelsSelector).length > 0) {
62+
if (labelSelector && Object.keys(labelSelector).length > 0) {
6363
const parsedObject: Record<string, string> = Object.fromEntries(
64-
Object.entries(labelsSelector).map(
64+
Object.entries(labelSelector).map(
6565
([k, v]) => [k, parseAll({ text: v, replaceValues, multiQueryData })] as [string, string],
6666
),
6767
)
6868
const serializedLabels = serializeLabelsWithNoEncoding(parsedObject)
6969
if (serializedLabels.length > 0) params.set('labelSelector', serializedLabels)
7070
}
7171

72-
if (labelsSelectorFull) {
73-
const root = multiQueryData[`req${labelsSelectorFull.reqIndex}`]
74-
const value = Array.isArray(labelsSelectorFull.pathToLabels)
75-
? _.get(root, labelsSelectorFull.pathToLabels)
76-
: jp.query(root, `$${labelsSelectorFull.pathToLabels}`)[0]
72+
if (labelSelectorFull) {
73+
const root = multiQueryData[`req${labelSelectorFull.reqIndex}`]
74+
const value = Array.isArray(labelSelectorFull.pathToLabels)
75+
? _.get(root, labelSelectorFull.pathToLabels)
76+
: jp.query(root, `$${labelSelectorFull.pathToLabels}`)[0]
7777

7878
const serializedLabels = serializeLabelsWithNoEncoding(value)
7979
if (serializedLabels.length > 0) params.set('labelSelector', serializedLabels)
8080
}
8181

8282
if (fieldSelector) {
83-
const preparedFieldSelectorValueText = parseAll({ text: fieldSelector?.parsedText, replaceValues, multiQueryData })
84-
85-
const preparedFieldSelectorValueTextWithPartsOfUrl = prepareTemplate({
86-
template: preparedFieldSelectorValueText,
87-
replaceValues,
88-
})
83+
const parsedObject: Record<string, string> = Object.fromEntries(
84+
Object.entries(fieldSelector).map(
85+
([k, v]) =>
86+
[
87+
parseAll({ text: k, replaceValues, multiQueryData }),
88+
parseAll({ text: v, replaceValues, multiQueryData }),
89+
] as [string, string],
90+
),
91+
)
92+
const serializedFields = serializeLabelsWithNoEncoding(parsedObject)
8993

90-
params.set('fieldSelector', `${fieldSelector.fieldName}=${preparedFieldSelectorValueTextWithPartsOfUrl}`)
94+
if (serializedFields.length > 0) params.set('fieldSelector', serializedFields)
9195
}
9296

9397
const searchParams = params.toString()

src/components/organisms/DynamicComponents/types.ts

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,12 @@ export type TDynamicComponentsAppTypeMap = {
7272
fetchUrl: string
7373
pathToItems: string | string[] // jsonpath or keys as string[]
7474
clusterNamePartOfUrl: string
75-
labelsSelector?: Record<string, string>
76-
labelsSelectorFull?: {
75+
labelSelector?: Record<string, string>
76+
labelSelectorFull?: {
7777
reqIndex: number
7878
pathToLabels: string | string[] // jsonpath or keys as string[]
7979
}
80-
fieldSelector?: {
81-
fieldName: string
82-
parsedText: string
83-
}
80+
fieldSelector?: Record<string, string>
8481
} & Omit<
8582
TEnrichedTableProviderProps,
8683
| 'tableMappingsReplaceValues'
@@ -288,15 +285,12 @@ export type TDynamicComponentsAppTypeMap = {
288285
pageSize?: number
289286
substractHeight?: number
290287
limit?: number
291-
labelsSelector?: Record<string, string>
292-
labelsSelectorFull?: {
288+
labelSelector?: Record<string, string>
289+
labelSelectorFull?: {
293290
reqIndex: number
294291
pathToLabels: string | string[] // jsonpath or keys as string[]
295292
}
296-
fieldSelector?: {
297-
fieldName: string
298-
parsedText: string
299-
}
293+
fieldSelector?: Record<string, string>
300294
baseFactoryNamespacedAPIKey: string
301295
baseFactoryClusterSceopedAPIKey: string
302296
baseFactoryNamespacedBuiltinKey: string

0 commit comments

Comments
 (0)