@orangelogic/orange-dam-content-browser-sdk 2.4.7 → 2.4.8

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/build/index.mjs CHANGED
@@ -12192,6 +12192,7 @@ let CxContentBrowserNoResult = class extends CortexElement {
12192
12192
  <div class="content-browser-no-result" data-testid="no-results">
12193
12193
  <cx-icon name=${this.icon}></cx-icon>
12194
12194
  ${this.message}
12195
+ <slot></slot>
12195
12196
  </div>
12196
12197
  `;
12197
12198
  }
@@ -12344,7 +12345,28 @@ const styles$2 = i$7`
12344
12345
  }
12345
12346
 
12346
12347
  .content-browser-grid {
12348
+ display: flex;
12349
+ flex-direction: column;
12347
12350
  height: 100%;
12351
+ position: relative;
12352
+ }
12353
+
12354
+ .content-browser-grid__list {
12355
+ flex: 1 1 auto;
12356
+ min-height: 0;
12357
+ overflow-x: hidden;
12358
+ }
12359
+
12360
+ .content-browser-grid__page-error {
12361
+ flex: none;
12362
+ display: flex;
12363
+ align-items: center;
12364
+ justify-content: center;
12365
+ gap: var(--cx-spacing-small, 8px);
12366
+ padding: var(--cx-spacing-small, 8px);
12367
+ border-top: 1px solid var(--cx-color-neutral-200, #e5e5e5);
12368
+ background-color: var(--cx-color-neutral-0, #fff);
12369
+ color: var(--cx-color-neutral);
12348
12370
  }
12349
12371
 
12350
12372
  .content-browser-grid-loading {
@@ -12381,6 +12403,7 @@ let CxContentBrowserGrid = class extends CortexElement {
12381
12403
  this.localize = new LocalizeController(this);
12382
12404
  this.assets = [];
12383
12405
  this.empty = false;
12406
+ this.error = false;
12384
12407
  this.view = GridView$1.Medium;
12385
12408
  this.hasMore = false;
12386
12409
  this.loading = false;
@@ -12520,6 +12543,63 @@ let CxContentBrowserGrid = class extends CortexElement {
12520
12543
  this.emit("cx-content-browser-grid-scroll-end");
12521
12544
  }
12522
12545
  }
12546
+ handleRetry() {
12547
+ this.emit("cx-content-browser-grid-retry");
12548
+ }
12549
+ renderRetry() {
12550
+ return b`
12551
+ <cx-button class="content-browser-grid__retry" variant="primary" @click=${this.handleRetry}>
12552
+ ${this.localize.term("retry")}
12553
+ </cx-button>
12554
+ `;
12555
+ }
12556
+ renderContent() {
12557
+ if (this.error && this.assets.length === 0) {
12558
+ return b`
12559
+ <cx-content-browser-no-result
12560
+ class="content-browser-grid__empty"
12561
+ icon="error_outline"
12562
+ message=${this.localize.term("oopsSomethingWentWrong")}
12563
+ role="alert"
12564
+ >
12565
+ ${this.renderRetry()}
12566
+ </cx-content-browser-no-result>
12567
+ `;
12568
+ }
12569
+ if (this.empty) {
12570
+ return b`
12571
+ <cx-content-browser-no-result
12572
+ class="content-browser-grid__empty"
12573
+ icon="search_off"
12574
+ message=${this.localize.term("noResults")}
12575
+ ></cx-content-browser-no-result>
12576
+ `;
12577
+ }
12578
+ return b`
12579
+ <lit-virtualizer
12580
+ class="content-browser-grid__list"
12581
+ scroller
12582
+ .layout=${grid({
12583
+ gap: `${__privateGet2(this, _gutter)}px`,
12584
+ itemSize: {
12585
+ height: `${Math.max(this.columnWidth, 150)}px`,
12586
+ width: `${this.columnWidth}px`
12587
+ },
12588
+ flex: { preserve: "aspect-ratio" }
12589
+ })}
12590
+ .items=${this.assets}
12591
+ .renderItem=${this.renderItem}
12592
+ @scroll=${this.handleScroll}
12593
+ ></lit-virtualizer>
12594
+ ${n$5(this.error, () => b`
12595
+ <div class="content-browser-grid__page-error" role="alert">
12596
+ <cx-icon name="error_outline"></cx-icon>
12597
+ ${this.localize.term("oopsSomethingWentWrong")}
12598
+ ${this.renderRetry()}
12599
+ </div>
12600
+ `)}
12601
+ `;
12602
+ }
12523
12603
  render() {
12524
12604
  return b`
12525
12605
  <div
@@ -12533,36 +12613,7 @@ let CxContentBrowserGrid = class extends CortexElement {
12533
12613
  </div>
12534
12614
  <cx-resize-observer @cx-resize=${this.handleResize}>
12535
12615
  <div class="content-browser-grid">
12536
- ${n$5(
12537
- this.empty,
12538
- () => b`
12539
- <cx-content-browser-no-result
12540
- class="content-browser-grid__empty"
12541
- icon="search_off"
12542
- message=${this.localize.term("noResults")}
12543
- ></cx-content-browser-no-result>
12544
- `,
12545
- () => b`
12546
- <lit-virtualizer
12547
- scroller
12548
- style=${o$2({
12549
- height: "100%",
12550
- "overflow-x": "hidden"
12551
- })}
12552
- .layout=${grid({
12553
- gap: `${__privateGet2(this, _gutter)}px`,
12554
- itemSize: {
12555
- height: `${Math.max(this.columnWidth, 150)}px`,
12556
- width: `${this.columnWidth}px`
12557
- },
12558
- flex: { preserve: "aspect-ratio" }
12559
- })}
12560
- .items=${this.assets}
12561
- .renderItem=${this.renderItem}
12562
- @scroll=${this.handleScroll}
12563
- ></lit-virtualizer>
12564
- `
12565
- )}
12616
+ ${this.renderContent()}
12566
12617
  </div>
12567
12618
  </cx-resize-observer>
12568
12619
  `;
@@ -12573,8 +12624,10 @@ _lastHeight = /* @__PURE__ */ new WeakMap();
12573
12624
  _lastWidth = /* @__PURE__ */ new WeakMap();
12574
12625
  CxContentBrowserGrid.styles = [componentStyles, styles$2];
12575
12626
  CxContentBrowserGrid.dependencies = {
12627
+ "cx-button": CxButton,
12576
12628
  "cx-content-browser-asset-card": CxContentBrowserAssetCard,
12577
12629
  "cx-content-browser-no-result": CxContentBrowserNoResult,
12630
+ "cx-icon": CxIcon,
12578
12631
  "cx-progress-bar": CxProgressBar,
12579
12632
  "cx-resize-observer": CxResizeObserver
12580
12633
  };
@@ -12590,6 +12643,9 @@ __decorateClass$2([
12590
12643
  __decorateClass$2([
12591
12644
  n$6({ attribute: "empty", reflect: true, type: Boolean })
12592
12645
  ], CxContentBrowserGrid.prototype, "empty", 2);
12646
+ __decorateClass$2([
12647
+ n$6({ attribute: "error", reflect: true, type: Boolean })
12648
+ ], CxContentBrowserGrid.prototype, "error", 2);
12593
12649
  __decorateClass$2([
12594
12650
  n$6({ attribute: "view", reflect: true, type: String })
12595
12651
  ], CxContentBrowserGrid.prototype, "view", 2);
@@ -12938,6 +12994,17 @@ function resolveAssetExtraFilters(selectedFacets) {
12938
12994
  function isCortexErrorResponse(response) {
12939
12995
  return response && typeof response === "object" && "ErrorCode" in response;
12940
12996
  }
12997
+ function isSearchFacet(facet) {
12998
+ const details = facet == null ? void 0 : facet.facetDetails;
12999
+ return !!facet && !!details && typeof details === "object" && !Array.isArray(details) && typeof details.facetFieldName === "string" && typeof details.displayName === "string" && Array.isArray(facet.values) && facet.values.every((facetValue) => !!facetValue && typeof facetValue.value === "string");
13000
+ }
13001
+ function isSearchResponse(response) {
13002
+ if (!response || typeof response !== "object" || Array.isArray(response)) {
13003
+ return false;
13004
+ }
13005
+ const { contentItems, facets, totalCount } = response;
13006
+ return Array.isArray(facets) && facets.every(isSearchFacet) && Number.isFinite(totalCount) && (contentItems === void 0 || Array.isArray(contentItems));
13007
+ }
12941
13008
  const POST_UNSUPPORTED_STATUSES = /* @__PURE__ */ new Set([405, 501]);
12942
13009
  const postUnsupportedOrigins = /* @__PURE__ */ new Set();
12943
13010
  function createId() {
@@ -13310,6 +13377,14 @@ function apiGetAssets(_0) {
13310
13377
  ...Array.isArray(http.defaults.transformResponse) ? http.defaults.transformResponse : [],
13311
13378
  (rawResponse) => {
13312
13379
  var _a2, _b2;
13380
+ if (!isSearchResponse(rawResponse)) {
13381
+ return {
13382
+ facets: [],
13383
+ isError: true,
13384
+ items: [],
13385
+ totalCount: 0
13386
+ };
13387
+ }
13313
13388
  const mappedItems = (_b2 = (_a2 = rawResponse.contentItems) == null ? void 0 : _a2.map((item) => {
13314
13389
  var _a3, _b3, _c2, _d2, _e3, _f2, _g, _h, _i, _j, _k, _l;
13315
13390
  let extension = (_a3 = item.fields[FIELD_EXTENSION]) != null ? _a3 : "";
@@ -13338,6 +13413,7 @@ function apiGetAssets(_0) {
13338
13413
  })) != null ? _b2 : [];
13339
13414
  return {
13340
13415
  facets: rawResponse.facets,
13416
+ isError: false,
13341
13417
  items: mappedItems,
13342
13418
  totalCount: rawResponse.totalCount
13343
13419
  };
@@ -13349,6 +13425,7 @@ function apiGetAssets(_0) {
13349
13425
  } catch (error) {
13350
13426
  return {
13351
13427
  facets: [],
13428
+ isError: true,
13352
13429
  items: [],
13353
13430
  totalCount: 0
13354
13431
  };
@@ -13846,6 +13923,7 @@ class FetchAndMergeAssetsController {
13846
13923
  this.items = [];
13847
13924
  this.totalCount = 0;
13848
13925
  this.lastRequest = null;
13926
+ this.failedRequest = null;
13849
13927
  this.sortOrders = {};
13850
13928
  this.parameters = null;
13851
13929
  this.availableExtensions = null;
@@ -14071,6 +14149,14 @@ class FetchAndMergeAssetsController {
14071
14149
  return yield apiGetFolders(request);
14072
14150
  });
14073
14151
  }
14152
+ /** Sends the last search that got an error again, with the same page and controls. */
14153
+ retrySearch() {
14154
+ return __async(this, null, function* () {
14155
+ if (this.failedRequest) {
14156
+ yield this.fetchAndMergeAssets(this.failedRequest);
14157
+ }
14158
+ });
14159
+ }
14074
14160
  /**
14075
14161
  * A folder switch (or any refetch) can return a facet list that no longer includes a
14076
14162
  * currently-selected value. Keep those selected-but-missing values visible (count 0) instead
@@ -14117,6 +14203,7 @@ class FetchAndMergeAssetsController {
14117
14203
  }
14118
14204
  const generation = __privateGet(this, _generation);
14119
14205
  this.loading = true;
14206
+ this.failedRequest = null;
14120
14207
  this.host.requestUpdate();
14121
14208
  if (this._debounceTimeout) {
14122
14209
  clearTimeout(this._debounceTimeout);
@@ -14171,17 +14258,25 @@ class FetchAndMergeAssetsController {
14171
14258
  if (generation !== __privateGet(this, _generation)) {
14172
14259
  return;
14173
14260
  }
14174
- if (isRestart) {
14175
- this.items = assets.items;
14261
+ if (assets.isError) {
14262
+ this.failedRequest = request;
14263
+ if (isRestart) {
14264
+ this.items = [];
14265
+ this.totalCount = 0;
14266
+ }
14176
14267
  } else {
14177
- this.items = uniqBy([...this.items, ...assets.items], "recordId");
14268
+ if (isRestart) {
14269
+ this.items = assets.items;
14270
+ } else {
14271
+ this.items = uniqBy([...this.items, ...assets.items], "recordId");
14272
+ }
14273
+ this.facets = this.mergeFacetsWithSelected(assets.facets, this.facets, request.selectedFacets);
14274
+ this.totalCount = assets.totalCount;
14275
+ __privateSet(this, _lastPage, {
14276
+ pageSize: request.pageSize || assets.items.length,
14277
+ start: (_g = request.start) != null ? _g : 0
14278
+ });
14178
14279
  }
14179
- this.facets = this.mergeFacetsWithSelected(assets.facets, this.facets, request.selectedFacets);
14180
- this.totalCount = assets.totalCount;
14181
- __privateSet(this, _lastPage, {
14182
- pageSize: request.pageSize || assets.items.length,
14183
- start: (_g = request.start) != null ? _g : 0
14184
- });
14185
14280
  __privateSet(this, _hasFetchedOnce, true);
14186
14281
  if (this._debounceResolve) {
14187
14282
  this._debounceResolve(this.lastRequest);
@@ -14392,6 +14487,7 @@ class FetchAndMergeAssetsController {
14392
14487
  ) : (_b2 = this.parameters.supportedRepresentativeSubtypes) != null ? _b2 : []
14393
14488
  }) : null,
14394
14489
  request: this.lastRequest,
14490
+ searchError: this.failedRequest !== null,
14395
14491
  sortOrders: this.sortOrders,
14396
14492
  totalCount: this.totalCount,
14397
14493
  userInfo: this.userInfo
@@ -14761,6 +14857,9 @@ let CxContentBrowser = class extends CortexElement {
14761
14857
  }
14762
14858
  handleScrollEnd() {
14763
14859
  return __async(this, null, function* () {
14860
+ if (this.fetchAndMergeAssetsController.getData().searchError) {
14861
+ return;
14862
+ }
14764
14863
  const nextPage = this.fetchAndMergeAssetsController.getNextPage();
14765
14864
  if (!nextPage) {
14766
14865
  return;
@@ -14818,9 +14917,9 @@ let CxContentBrowser = class extends CortexElement {
14818
14917
  if (!nextPage) {
14819
14918
  return;
14820
14919
  }
14821
- const totalCount = this.fetchAndMergeAssetsController.getData().totalCount;
14920
+ const { searchError, totalCount } = this.fetchAndMergeAssetsController.getData();
14822
14921
  const newStart = nextPage.start;
14823
- if (newPageSize <= nextPage.lastPageSize || newPageSize === 0 || newStart > totalCount) {
14922
+ if (searchError || newPageSize <= nextPage.lastPageSize || newPageSize === 0 || newStart > totalCount) {
14824
14923
  return;
14825
14924
  }
14826
14925
  this.lastRequest = __spreadProps(__spreadValues({}, this.lastRequest), {
@@ -14846,6 +14945,11 @@ let CxContentBrowser = class extends CortexElement {
14846
14945
  }
14847
14946
  });
14848
14947
  }
14948
+ handleRetry() {
14949
+ return __async(this, null, function* () {
14950
+ yield this.fetchAndMergeAssetsController.retrySearch();
14951
+ });
14952
+ }
14849
14953
  handleGridClick(event) {
14850
14954
  return __async(this, null, function* () {
14851
14955
  const { id } = event.detail;
@@ -15026,6 +15130,7 @@ let CxContentBrowser = class extends CortexElement {
15026
15130
  loading,
15027
15131
  parameters,
15028
15132
  request,
15133
+ searchError,
15029
15134
  sortOrders,
15030
15135
  totalCount,
15031
15136
  userInfo
@@ -15114,7 +15219,8 @@ let CxContentBrowser = class extends CortexElement {
15114
15219
  ></cx-content-browser-control-bar>
15115
15220
  <cx-content-browser-grid
15116
15221
  .assets=${items}
15117
- ?empty=${!loading && !this.initialFolderPending && items.length === 0}
15222
+ ?empty=${!loading && !this.initialFolderPending && !searchError && items.length === 0}
15223
+ ?error=${searchError}
15118
15224
  ?has-more=${items.length < totalCount}
15119
15225
  ?loading=${loading || this.initialFolderPending}
15120
15226
  ?show-title=${this.showTitle}
@@ -15125,6 +15231,7 @@ let CxContentBrowser = class extends CortexElement {
15125
15231
  view=${this.view}
15126
15232
  @cx-content-browser-grid-scroll-end=${this.handleScrollEnd}
15127
15233
  @cx-content-browser-grid-resize=${this.handleGridResize}
15234
+ @cx-content-browser-grid-retry=${this.handleRetry}
15128
15235
  @cx-content-browser-grid-click=${this.handleGridClick}
15129
15236
  ></cx-content-browser-grid>
15130
15237
  </cx-resize-observer>
@@ -31,6 +31,8 @@ export declare class FetchAndMergeAssetsController implements ReactiveController
31
31
  private items;
32
32
  private totalCount;
33
33
  private lastRequest;
34
+ /** The resolved request of the last search that got an error. A retry sends it again. */
35
+ private failedRequest;
34
36
  private sortOrders;
35
37
  private parameters;
36
38
  private availableExtensions;
@@ -74,6 +76,8 @@ export declare class FetchAndMergeAssetsController implements ReactiveController
74
76
  private mapAvailableExtensions;
75
77
  fetchAssets(request: GetAssetsRequest): Promise<import("../api/asset/asset.types").GetAssetsResponse>;
76
78
  fetchFolders(request: GetFolderRequest): Promise<import("../types/folder").GetFolderResponse>;
79
+ /** Sends the last search that got an error again, with the same page and controls. */
80
+ retrySearch(): Promise<void>;
77
81
  /**
78
82
  * A folder switch (or any refetch) can return a facet list that no longer includes a
79
83
  * currently-selected value. Keep those selected-but-missing values visible (count 0) instead
@@ -143,6 +147,7 @@ export declare class FetchAndMergeAssetsController implements ReactiveController
143
147
  supportedRepresentativeSubtypes?: string[];
144
148
  } | null;
145
149
  request: GetAssetsRequest | null;
150
+ searchError: boolean;
146
151
  sortOrders: Record<string, SortOrder[]>;
147
152
  totalCount: number;
148
153
  userInfo: UserInfo | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orangelogic/orange-dam-content-browser-sdk",
3
- "version": "2.4.7",
3
+ "version": "2.4.8",
4
4
  "description": "OrangeDAM Content Browser SDK source code",
5
5
  "main": "./build/OrangeDAMContentBrowserSDK.min.js",
6
6
  "module": "./build/index.mjs",