@v-office/website-sdk 2.7.0 → 2.9.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/README.md +28 -1
- package/dist/cli.mjs +25 -4
- package/dist/{client-45_ofP_d.mjs → client-CYK_5Vk7.mjs} +385 -187
- package/dist/index.d.mts +24 -4
- package/dist/index.mjs +3 -3
- package/dist/instructions/CHANGELOG.md +4 -1
- package/dist/instructions/MIGRATION.md +4 -1
- package/dist/instructions/README.md +9 -3
- package/dist/instructions/creation.md +82 -66
- package/dist/instructions/custom-attributes.md +560 -0
- package/dist/instructions/filter.md +62 -23
- package/dist/instructions/rentals.md +43 -2
- package/dist/instructions/search.md +29 -3
- package/dist/instructions/versions/2.5.0/MIGRATION.md +5 -0
- package/dist/instructions/versions/2.6.0/CHANGELOG.md +3 -25
- package/dist/instructions/versions/2.6.0/MIGRATION.md +4 -72
- package/dist/instructions/versions/2.7.0/CHANGELOG.md +44 -0
- package/dist/instructions/versions/2.7.0/MIGRATION.md +79 -0
- package/dist/instructions/versions/2.8.0/CHANGELOG.md +63 -0
- package/dist/instructions/versions/2.8.0/MIGRATION.md +252 -0
- package/dist/instructions/versions/2.9.0/CHANGELOG.md +37 -0
- package/dist/instructions/versions/2.9.0/MIGRATION.md +153 -0
- package/dist/{rentals-Lw1qUKIj.mjs → rentals-CFod9H4m.mjs} +21 -21
- package/dist/{search-wcoZw2rt.mjs → search-CO9ID9op.mjs} +16 -133
- package/dist/{to-rental-highlights-CxWlq76f.mjs → to-rental-highlights-B6a_fi0j.mjs} +33 -8
- package/dist/translations/v10/de-DE/core.json +2 -0
- package/dist/translations/v10/en-US/core.json +2 -0
- package/instructions/CHANGELOG.md +4 -1
- package/instructions/MIGRATION.md +4 -1
- package/instructions/README.md +9 -3
- package/instructions/creation.md +82 -66
- package/instructions/custom-attributes.md +560 -0
- package/instructions/filter.md +62 -23
- package/instructions/rentals.md +43 -2
- package/instructions/search.md +29 -3
- package/instructions/versions/2.5.0/MIGRATION.md +5 -0
- package/instructions/versions/2.6.0/CHANGELOG.md +3 -25
- package/instructions/versions/2.6.0/MIGRATION.md +4 -72
- package/instructions/versions/2.7.0/CHANGELOG.md +44 -0
- package/instructions/versions/2.7.0/MIGRATION.md +79 -0
- package/instructions/versions/2.8.0/CHANGELOG.md +63 -0
- package/instructions/versions/2.8.0/MIGRATION.md +252 -0
- package/instructions/versions/2.9.0/CHANGELOG.md +37 -0
- package/instructions/versions/2.9.0/MIGRATION.md +153 -0
- package/package.json +5 -3
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# Migration: 2.7.0 to 2.8.0
|
|
2
|
+
|
|
3
|
+
2.8.0 replaces `customAttributeDefinitionManifest` and
|
|
4
|
+
`source: "customAttribute"` filter definitions with one validated custom-attribute
|
|
5
|
+
registry. SDK construction and service method names are unchanged.
|
|
6
|
+
|
|
7
|
+
Consumers without custom attributes can upgrade without configuration changes.
|
|
8
|
+
|
|
9
|
+
## 1. Replace the Definition Manifest
|
|
10
|
+
|
|
11
|
+
Before:
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
const options = defineWebsiteSDKOptions({
|
|
15
|
+
customAttributeDefinitionManifest: {
|
|
16
|
+
byKey: {
|
|
17
|
+
region: {
|
|
18
|
+
id: "GQYKYgMVh28X7VLGursbkt",
|
|
19
|
+
key: "region",
|
|
20
|
+
type: "OPTION",
|
|
21
|
+
visibility: "PUBLIC",
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
byId: {
|
|
25
|
+
GQYKYgMVh28X7VLGursbkt: {
|
|
26
|
+
id: "GQYKYgMVh28X7VLGursbkt",
|
|
27
|
+
key: "region",
|
|
28
|
+
type: "OPTION",
|
|
29
|
+
visibility: "PUBLIC",
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
After:
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
import {
|
|
40
|
+
defineCustomAttributes,
|
|
41
|
+
defineWebsiteSDKOptions,
|
|
42
|
+
fetchCustomAttributeCatalog,
|
|
43
|
+
} from "@v-office/website-sdk";
|
|
44
|
+
|
|
45
|
+
const catalog = await fetchCustomAttributeCatalog({ config: v10Config });
|
|
46
|
+
|
|
47
|
+
const customAttributes = defineCustomAttributes({
|
|
48
|
+
catalog,
|
|
49
|
+
select: {
|
|
50
|
+
region: {
|
|
51
|
+
label: { "de-DE": "Region", "en-US": "Region" },
|
|
52
|
+
category: "OTHER",
|
|
53
|
+
filter: true,
|
|
54
|
+
optionLabels: {
|
|
55
|
+
north: { "de-DE": "Norden", "en-US": "North" },
|
|
56
|
+
south: { "de-DE": "Süden", "en-US": "South" },
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const options = defineWebsiteSDKOptions({ customAttributes });
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
`fetchCustomAttributeCatalog` is v10-only, requires a token authorized for the
|
|
66
|
+
public-definition operation, and returns no localized labels. Fetch it in an
|
|
67
|
+
authorized build environment or pin an equivalent literal catalog.
|
|
68
|
+
`defineCustomAttributes` validates the complete catalog/selection join and reports
|
|
69
|
+
all configuration errors together.
|
|
70
|
+
|
|
71
|
+
## 2. Move Custom-Attribute Filter Policy
|
|
72
|
+
|
|
73
|
+
Remove every `source: "customAttribute"` entry from
|
|
74
|
+
`customAttributeFilterDefinitions`. Put its behavior in the matching `select`
|
|
75
|
+
entry:
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
select: {
|
|
79
|
+
occupancyScore: {
|
|
80
|
+
label: { "de-DE": "Belegung", "en-US": "Occupancy" },
|
|
81
|
+
category: "ESSENTIALS",
|
|
82
|
+
filter: {
|
|
83
|
+
exposure: "public",
|
|
84
|
+
numericBounds: { min: 1, max: 12 },
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Use `filter: "internal"` or `filter: { exposure: "internal" }` for a queryable filter
|
|
91
|
+
that must not appear in `getFilters`. Omit `filter` for display only.
|
|
92
|
+
|
|
93
|
+
`customAttributeFilterDefinitions` remains the home of:
|
|
94
|
+
|
|
95
|
+
- `backendFilter`: v9 backend-native filters;
|
|
96
|
+
- `composition`: virtual Boolean filters composed from executable leaves.
|
|
97
|
+
|
|
98
|
+
## 3. Configure Display and v9 Bindings
|
|
99
|
+
|
|
100
|
+
Display is independent of filter exposure and defaults to `true`. A selected
|
|
101
|
+
catalog attribute can add a v9 rental-data binding:
|
|
102
|
+
|
|
103
|
+
```ts
|
|
104
|
+
select: {
|
|
105
|
+
privateSauna: {
|
|
106
|
+
label: { "de-DE": "Sauna", "en-US": "Sauna" },
|
|
107
|
+
display: true,
|
|
108
|
+
filter: true,
|
|
109
|
+
v9: "p_14418",
|
|
110
|
+
},
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Use `v9Only` for attributes that have no v10 catalog definition:
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
v9Only: {
|
|
118
|
+
thatchedRoof: {
|
|
119
|
+
v9: "p_14420",
|
|
120
|
+
type: "boolean",
|
|
121
|
+
label: { "de-DE": "Reetdach", "en-US": "Thatched roof" },
|
|
122
|
+
},
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
v9 renders bound values but does not advertise or execute catalog custom-attribute
|
|
127
|
+
filters. v10 filtering requires an enabled filter and a catalog ID.
|
|
128
|
+
|
|
129
|
+
## 4. Update Composition Expressions
|
|
130
|
+
|
|
131
|
+
Expressions now support equality leaves joined by `all`:
|
|
132
|
+
|
|
133
|
+
```ts
|
|
134
|
+
expression: {
|
|
135
|
+
all: [
|
|
136
|
+
{ filter: "privateSauna", value: true },
|
|
137
|
+
{ filter: "maxPersons", value: 4 },
|
|
138
|
+
],
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Remove `operator`, `gte`, `lte`, and `any`; they never had correct runtime
|
|
143
|
+
semantics. Nested composition references are rejected.
|
|
144
|
+
|
|
145
|
+
A composition is advertised only if every leaf can execute on the active backend.
|
|
146
|
+
Execution is atomic: if one configured leaf is unknown, unsupported, malformed, or
|
|
147
|
+
conflicts with a direct value, no generated composition leaf enters the backend
|
|
148
|
+
payload and only the composition key is unused.
|
|
149
|
+
|
|
150
|
+
Successful compositions return the parent and expanded leaves in `appliedFilters`.
|
|
151
|
+
|
|
152
|
+
## 5. Rename Colliding Query Keys
|
|
153
|
+
|
|
154
|
+
Every query key must have one owner. Configuration rejects:
|
|
155
|
+
|
|
156
|
+
- period/occupancy keys such as `start`, `adults`, and `pets`;
|
|
157
|
+
- filterable custom attributes or compositions that reuse v10 built-in filter keys;
|
|
158
|
+
- configured v9 filters that reuse v9 stable filter keys;
|
|
159
|
+
- a custom attribute and custom filter definition with the same key.
|
|
160
|
+
- repeated keys within `customAttributeFilterDefinitions`.
|
|
161
|
+
|
|
162
|
+
Use the selection's `key` override when a workspace definition collides:
|
|
163
|
+
|
|
164
|
+
```ts
|
|
165
|
+
select: {
|
|
166
|
+
sauna: {
|
|
167
|
+
key: "privateSauna",
|
|
168
|
+
label: { "de-DE": "Sauna", "en-US": "Sauna" },
|
|
169
|
+
filter: true,
|
|
170
|
+
},
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Update query URLs and `rentalHighlightPrioritization` to the resolved key.
|
|
175
|
+
|
|
176
|
+
## 6. Treat Categories as Display Labels
|
|
177
|
+
|
|
178
|
+
Configuration keeps stable keys such as `OUTDOORS`. `getFilters` and rental
|
|
179
|
+
attribute groups return localized labels such as `Außenbereich` or `Outdoor Area`.
|
|
180
|
+
Do not compare output categories to stable keys. Customize wording with
|
|
181
|
+
locale-nested overrides:
|
|
182
|
+
|
|
183
|
+
```ts
|
|
184
|
+
translationOverrides: {
|
|
185
|
+
"de-DE": {
|
|
186
|
+
"RentalAttributesCategory.OUTDOORS.label": "Draußen",
|
|
187
|
+
},
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## 7. Update Highlight Configuration
|
|
192
|
+
|
|
193
|
+
Custom attributes appear in rental/search `highlights` only when their resolved key
|
|
194
|
+
is listed in `rentalHighlightPrioritization`:
|
|
195
|
+
|
|
196
|
+
```ts
|
|
197
|
+
rentalHighlightPrioritization: ["bedrooms", customAttributes.keys.region, "bathrooms"];
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
The list remains authoritative for order. Registry contents do not reorder
|
|
201
|
+
built-ins, duplicate keys render once, and a built-in metadata key shadows a
|
|
202
|
+
same-named display-only custom attribute.
|
|
203
|
+
|
|
204
|
+
## 8. Update Applied-Filter Handling
|
|
205
|
+
|
|
206
|
+
Value-bearing applied filters now include canonical `value`:
|
|
207
|
+
|
|
208
|
+
```ts
|
|
209
|
+
{ key: "region", label: "Region: North", value: "north" }
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Use `key` plus `value` to remove an exact filter. Labels remain localized
|
|
213
|
+
presentation and are not identifiers. A scalar key may appear in both
|
|
214
|
+
`appliedFilters` and `unusedFilterKeys` when one value applied and another was
|
|
215
|
+
rejected.
|
|
216
|
+
|
|
217
|
+
## 9. CLI and Untyped Options
|
|
218
|
+
|
|
219
|
+
CLI JSON supplies catalog and selection **inputs**, not a finished registry:
|
|
220
|
+
|
|
221
|
+
```json
|
|
222
|
+
{
|
|
223
|
+
"customAttributes": {
|
|
224
|
+
"catalog": {
|
|
225
|
+
"privateSauna": {
|
|
226
|
+
"id": "GQYKYgMVh28X7VLGursbkt",
|
|
227
|
+
"type": "BOOLEAN"
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
"select": {
|
|
231
|
+
"privateSauna": {
|
|
232
|
+
"label": { "de-DE": "Sauna", "en-US": "Sauna" },
|
|
233
|
+
"filter": true
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
The CLI uses `defineCustomAttributesFromUnknown` and applies the same runtime
|
|
241
|
+
validation as typed configuration.
|
|
242
|
+
|
|
243
|
+
## Recommended Verification
|
|
244
|
+
|
|
245
|
+
1. Run `getFilters` for v9 and v10 in both locales.
|
|
246
|
+
2. Confirm internal filters are absent while public compositions using them remain
|
|
247
|
+
executable.
|
|
248
|
+
3. Inspect v9 GraphQL and v10 REST variables for one successful and one failed
|
|
249
|
+
composition.
|
|
250
|
+
4. Verify renamed custom attributes render in rentals, search highlights, URLs, and
|
|
251
|
+
applied-filter chips.
|
|
252
|
+
5. Verify `rentalHighlightPrioritization` order with and without custom attributes.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Changelog: 2.9.0
|
|
2
|
+
|
|
3
|
+
This release makes highlight selection explicit, improves the default rental and
|
|
4
|
+
property rankings across coastal, lake, and mountain portfolios, and removes
|
|
5
|
+
duplicate rental views.
|
|
6
|
+
|
|
7
|
+
## Changed
|
|
8
|
+
|
|
9
|
+
- `rentalHighlightPrioritization` and
|
|
10
|
+
`rentalPropertyHighlightPrioritization` are documented as ordered allowlists,
|
|
11
|
+
not sorts over every available fact. A key that is not listed is not emitted as
|
|
12
|
+
a highlight even when the source contains a value.
|
|
13
|
+
- The default rental allowlist now starts with capacity and size, moves distinctive
|
|
14
|
+
views and facilities ahead of common fittings, places `youthgroups` last, and
|
|
15
|
+
includes previously omitted terrain-specific and practical facts.
|
|
16
|
+
- `outdoorPool`, `indoorPool`, lake, mountain, countryside, river, and secondary
|
|
17
|
+
views can now appear through the default rental highlights, alongside facilities
|
|
18
|
+
such as `spa`, `terrace`, `lift`, `garage`, `dryer`, and `skiBootWarmer`.
|
|
19
|
+
- The default v10 property allowlist now prioritizes beach location and shared
|
|
20
|
+
facilities ahead of utilities. It also includes `locLake`, `lakedistance`,
|
|
21
|
+
`locMountain`, and `skidistance`.
|
|
22
|
+
- Rental highlights now emit only the first configured view fact that has a value.
|
|
23
|
+
The configured order defines which view is strongest. View-type descriptors such
|
|
24
|
+
as `seaviewType` remain independent qualifiers.
|
|
25
|
+
- Strongest-view selection applies consistently to v10 and legacy v9 rental
|
|
26
|
+
highlights. Keys unsupported by the active backend remain ignored.
|
|
27
|
+
|
|
28
|
+
## Migration Impact
|
|
29
|
+
|
|
30
|
+
- Sites using the SDK defaults may receive a different highlight order and more
|
|
31
|
+
highlight values.
|
|
32
|
+
- Sites that displayed several simultaneous rental views now receive at most one
|
|
33
|
+
view highlight.
|
|
34
|
+
- Explicit custom allowlists retain their configured order and membership, apart
|
|
35
|
+
from the new strongest-view rule.
|
|
36
|
+
- No SDK construction, service-call, or output-type changes are required. Review
|
|
37
|
+
`versions/2.9.0/MIGRATION.md` before upgrading.
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# Migration: 2.8.0 to 2.9.0
|
|
2
|
+
|
|
3
|
+
2.9.0 changes default highlight membership and order and emits at most one rental
|
|
4
|
+
view highlight. Configuration and output types are unchanged.
|
|
5
|
+
|
|
6
|
+
## 1. Treat Highlight Configuration as an Ordered Allowlist
|
|
7
|
+
|
|
8
|
+
`rentalHighlightPrioritization` and
|
|
9
|
+
`rentalPropertyHighlightPrioritization` select which facts become highlights and
|
|
10
|
+
set their order. They do not sort a complete list generated elsewhere.
|
|
11
|
+
|
|
12
|
+
- An omitted key is not emitted even when the source contains a value.
|
|
13
|
+
- `undefined` uses the SDK default.
|
|
14
|
+
- `[]` emits no highlights.
|
|
15
|
+
- Duplicate keys are evaluated once.
|
|
16
|
+
- Unknown, unresolved, or backend-unsupported keys are ignored.
|
|
17
|
+
- These options affect `highlights`, not `attributes` or `vicinity`.
|
|
18
|
+
|
|
19
|
+
Audit custom lists that were shortened only to express a preferred order. Add every
|
|
20
|
+
fact that must remain eligible for highlight output.
|
|
21
|
+
|
|
22
|
+
## 2. Review the New Rental Default
|
|
23
|
+
|
|
24
|
+
The default rental allowlist is now:
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
[
|
|
28
|
+
"maxPersons",
|
|
29
|
+
"bedrooms",
|
|
30
|
+
"squareMeters",
|
|
31
|
+
"bathrooms",
|
|
32
|
+
"seaview",
|
|
33
|
+
"lakeview",
|
|
34
|
+
"mountainview",
|
|
35
|
+
"valleyView",
|
|
36
|
+
"countrysideView",
|
|
37
|
+
"riverView",
|
|
38
|
+
"outdoorPool",
|
|
39
|
+
"indoorPool",
|
|
40
|
+
"sauna",
|
|
41
|
+
"spa",
|
|
42
|
+
"whirlpool",
|
|
43
|
+
"balcony",
|
|
44
|
+
"terrace",
|
|
45
|
+
"garden",
|
|
46
|
+
"beachChair",
|
|
47
|
+
"landingStage",
|
|
48
|
+
"boatBerth",
|
|
49
|
+
"skiBootWarmer",
|
|
50
|
+
"detached",
|
|
51
|
+
"fireplace",
|
|
52
|
+
"bbq",
|
|
53
|
+
"gym",
|
|
54
|
+
"closedPlot",
|
|
55
|
+
"beachview",
|
|
56
|
+
"gardenView",
|
|
57
|
+
"poolView",
|
|
58
|
+
"cityView",
|
|
59
|
+
"quietStreetView",
|
|
60
|
+
"innerCourtView",
|
|
61
|
+
"washer",
|
|
62
|
+
"dryer",
|
|
63
|
+
"privateparking",
|
|
64
|
+
"garage",
|
|
65
|
+
"carport",
|
|
66
|
+
"wifi",
|
|
67
|
+
"lift",
|
|
68
|
+
"childrenWelcome",
|
|
69
|
+
"nonsmoking",
|
|
70
|
+
"kitchen",
|
|
71
|
+
"dishwasher",
|
|
72
|
+
"tv",
|
|
73
|
+
"ac",
|
|
74
|
+
"heating",
|
|
75
|
+
"fridge",
|
|
76
|
+
"microwave",
|
|
77
|
+
"oven",
|
|
78
|
+
"stove",
|
|
79
|
+
"coffeemaker",
|
|
80
|
+
"freezer",
|
|
81
|
+
"electricKettle",
|
|
82
|
+
"youthgroups",
|
|
83
|
+
];
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Capacity and size come first, followed by distinctive views, facilities, outdoor
|
|
87
|
+
space, terrain-specific draws, practical confirmers, common fittings, and finally
|
|
88
|
+
the minority booking rule `youthgroups`.
|
|
89
|
+
|
|
90
|
+
## 3. Review the New Property Default
|
|
91
|
+
|
|
92
|
+
Property highlights apply only to v10 property data. Their default allowlist is:
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
[
|
|
96
|
+
"beachfront",
|
|
97
|
+
"beachaccess",
|
|
98
|
+
"beachdistance",
|
|
99
|
+
"seadistance",
|
|
100
|
+
"locBeach",
|
|
101
|
+
"locLake",
|
|
102
|
+
"lakedistance",
|
|
103
|
+
"locMountain",
|
|
104
|
+
"skidistance",
|
|
105
|
+
"outdoorPool",
|
|
106
|
+
"indoorPool",
|
|
107
|
+
"garden",
|
|
108
|
+
"terrace",
|
|
109
|
+
"bbqFacilities",
|
|
110
|
+
"playground",
|
|
111
|
+
"pool4kids",
|
|
112
|
+
"familyRoomsAvailable",
|
|
113
|
+
"parking",
|
|
114
|
+
"wifi",
|
|
115
|
+
"washer",
|
|
116
|
+
"dryer",
|
|
117
|
+
"ac",
|
|
118
|
+
"heating",
|
|
119
|
+
"locGroceries",
|
|
120
|
+
"restaurantdistance",
|
|
121
|
+
"publictransportdistance",
|
|
122
|
+
];
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Location and terrain now precede shared facilities, family signals, utilities, and
|
|
126
|
+
secondary map facts.
|
|
127
|
+
|
|
128
|
+
## 4. Expect One Rental View Highlight
|
|
129
|
+
|
|
130
|
+
When several configured view facts have values, only the first one in
|
|
131
|
+
`rentalHighlightPrioritization` is emitted:
|
|
132
|
+
|
|
133
|
+
```ts
|
|
134
|
+
rentalHighlightPrioritization: ["mountainview", "lakeview", "seaview", "gardenView", "wifi"];
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
For this configuration, a rental with both mountain and lake views emits only the
|
|
138
|
+
mountain view. If `mountainview` has no value, the lake view can emit instead.
|
|
139
|
+
View-type descriptors such as `mountainviewType` and `seaviewType` qualify a view
|
|
140
|
+
and do not compete for the single view slot.
|
|
141
|
+
|
|
142
|
+
The rule applies to v10 and legacy v9. An unsupported v9 view key does not prevent
|
|
143
|
+
a later supported view from being emitted.
|
|
144
|
+
|
|
145
|
+
## Recommended Verification
|
|
146
|
+
|
|
147
|
+
1. Check search cards and rental pages that truncate highlights.
|
|
148
|
+
2. Compare coastal, lake, and mountain workspaces against the new defaults.
|
|
149
|
+
3. Confirm capacity and size remain available to consumers that read them from
|
|
150
|
+
search highlights.
|
|
151
|
+
4. Verify rentals with cumulative view facts emit the expected first configured
|
|
152
|
+
view.
|
|
153
|
+
5. Review explicit custom allowlists for facts that were unintentionally omitted.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as VofficeUnitDataFieldSchemas, d as VofficeUnitDataPropertyMetadata, f as parseVofficeFacilityData, i as toLocalizedString, l as VofficeUnitDataPropertyCategoryLabelKeys, m as parseVofficeUnitData, n as toImages, o as rentalsAllFeedbacksQuery, p as parseVofficeFeedbackData, r as toAddress, s as rentalsAllWithoutFeedbacksQuery, t as toRentalHighlights, u as VofficeUnitDataPropertyCategoryValues } from "./to-rental-highlights-
|
|
2
|
-
import { makeTranslate,
|
|
1
|
+
import { c as VofficeUnitDataFieldSchemas, d as VofficeUnitDataPropertyMetadata, f as parseVofficeFacilityData, i as toLocalizedString, l as VofficeUnitDataPropertyCategoryLabelKeys, m as parseVofficeUnitData, n as toImages, o as rentalsAllFeedbacksQuery, p as parseVofficeFeedbackData, r as toAddress, s as rentalsAllWithoutFeedbacksQuery, t as toRentalHighlights, u as VofficeUnitDataPropertyCategoryValues } from "./to-rental-highlights-B6a_fi0j.mjs";
|
|
2
|
+
import { makeTranslate, renderLabeledAttributeValue, renderResolvedCustomAttribute, toCustomAttributeList, toResolvedCustomAttributeCategoryTranslationKey } from "@v-office/sdk-core";
|
|
3
3
|
import { Effect } from "effect";
|
|
4
4
|
//#region src/legacy-v9/parser/rentals/to-description.ts
|
|
5
5
|
const toDescription = (data, locale) => {
|
|
@@ -60,29 +60,30 @@ const PROPERTY_METADATA_ENTRIES = Object.entries(VofficeUnitDataPropertyMetadata
|
|
|
60
60
|
return (CATEGORY_ORDER.get(left.metadata.category.key) ?? Number.MAX_SAFE_INTEGER) - (CATEGORY_ORDER.get(right.metadata.category.key) ?? Number.MAX_SAFE_INTEGER) || left.index - right.index;
|
|
61
61
|
});
|
|
62
62
|
const canRenderLabeledAttributeValue$1 = (value) => value !== false && value !== 0 && value !== "false" && value !== "0" && value != null && value !== "";
|
|
63
|
-
const toRentalAttributes = ({ locale, translations, attributes,
|
|
63
|
+
const toRentalAttributes = ({ locale, translations, attributes, customAttributes }) => Effect.gen(function* () {
|
|
64
64
|
const result = [];
|
|
65
65
|
const categoriesByKey = /* @__PURE__ */ new Map();
|
|
66
66
|
const subCategoriesByKey = /* @__PURE__ */ new Map();
|
|
67
67
|
const knownAttributes = attributes.known;
|
|
68
68
|
const translate = makeTranslate(translations, locale);
|
|
69
|
-
const
|
|
70
|
-
|
|
69
|
+
const getCustomAttributeSubCategory = (categoryKey) => Effect.gen(function* () {
|
|
70
|
+
const labelKey = toResolvedCustomAttributeCategoryTranslationKey(categoryKey);
|
|
71
|
+
let category = categoriesByKey.get(categoryKey);
|
|
71
72
|
if (category == null) {
|
|
72
73
|
category = {
|
|
73
|
-
label: yield* translate(
|
|
74
|
+
label: yield* translate(labelKey, categoryKey),
|
|
74
75
|
subCategories: []
|
|
75
76
|
};
|
|
76
|
-
categoriesByKey.set(
|
|
77
|
+
categoriesByKey.set(categoryKey, category);
|
|
77
78
|
result.push(category);
|
|
78
79
|
}
|
|
79
|
-
let subCategory = subCategoriesByKey.get(
|
|
80
|
+
let subCategory = subCategoriesByKey.get(categoryKey);
|
|
80
81
|
if (subCategory == null) {
|
|
81
82
|
subCategory = {
|
|
82
83
|
label: category.label,
|
|
83
84
|
items: []
|
|
84
85
|
};
|
|
85
|
-
subCategoriesByKey.set(
|
|
86
|
+
subCategoriesByKey.set(categoryKey, subCategory);
|
|
86
87
|
category.subCategories.push(subCategory);
|
|
87
88
|
}
|
|
88
89
|
return subCategory;
|
|
@@ -118,18 +119,17 @@ const toRentalAttributes = ({ locale, translations, attributes, customAttributeF
|
|
|
118
119
|
}
|
|
119
120
|
subCategory.items.push(attribute);
|
|
120
121
|
}
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
key: definition.key,
|
|
122
|
+
for (const attribute of toCustomAttributeList(customAttributes)) {
|
|
123
|
+
const binding = attribute.v9;
|
|
124
|
+
if (binding === void 0) continue;
|
|
125
|
+
const rendered = renderResolvedCustomAttribute({
|
|
126
|
+
attribute,
|
|
127
127
|
locale,
|
|
128
|
-
value
|
|
128
|
+
value: knownAttributes[binding] ?? attributes.unknown[binding]
|
|
129
129
|
});
|
|
130
|
-
if (
|
|
130
|
+
if (rendered == null) continue;
|
|
131
|
+
(yield* getCustomAttributeSubCategory(attribute.category)).items.push(rendered);
|
|
131
132
|
}
|
|
132
|
-
if (customAttributeItems.length > 0) (yield* getGeneralSubCategory()).items.push(...customAttributeItems);
|
|
133
133
|
return result;
|
|
134
134
|
});
|
|
135
135
|
//#endregion
|
|
@@ -228,7 +228,7 @@ const toReviews = ({ locale, translations, rental }) => Effect.gen(function* ()
|
|
|
228
228
|
});
|
|
229
229
|
//#endregion
|
|
230
230
|
//#region src/legacy-v9/parser/rentals/to-rental-list-item.ts
|
|
231
|
-
const toRentalRentalsOutput = ({ rental, locale, translations, imageProxyBaseUrl, rentalHighlightPrioritization,
|
|
231
|
+
const toRentalRentalsOutput = ({ rental, locale, translations, imageProxyBaseUrl, rentalHighlightPrioritization, customAttributes }) => Effect.gen(function* () {
|
|
232
232
|
const data = parseVofficeUnitData(rental.data);
|
|
233
233
|
const rawRentalType = data.known.type?.trim();
|
|
234
234
|
const translatedRentalType = rawRentalType != null && rawRentalType.length > 0 ? yield* toRentalType({
|
|
@@ -244,7 +244,7 @@ const toRentalRentalsOutput = ({ rental, locale, translations, imageProxyBaseUrl
|
|
|
244
244
|
locale,
|
|
245
245
|
translations,
|
|
246
246
|
attributes: data,
|
|
247
|
-
|
|
247
|
+
customAttributes
|
|
248
248
|
});
|
|
249
249
|
const vicinity = yield* toRentalVicinity({
|
|
250
250
|
locale,
|
|
@@ -255,7 +255,7 @@ const toRentalRentalsOutput = ({ rental, locale, translations, imageProxyBaseUrl
|
|
|
255
255
|
locale,
|
|
256
256
|
translations,
|
|
257
257
|
highlightPrioritization: rentalHighlightPrioritization,
|
|
258
|
-
|
|
258
|
+
customAttributes,
|
|
259
259
|
attributes: data
|
|
260
260
|
});
|
|
261
261
|
const reviews = yield* toReviews({
|