@universityofmaryland/web-feeds-library 1.3.0-beta.2 → 1.3.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/dist/experts.js +2 -0
- package/dist/experts.js.map +1 -1
- package/dist/factory/core/createBaseFeed.d.ts.map +1 -1
- package/dist/factory/core/createBaseFeed.js +2 -0
- package/dist/factory/core/createBaseFeed.js.map +1 -1
- package/dist/factory/core/types.d.ts +1 -0
- package/dist/factory/core/types.d.ts.map +1 -1
- package/dist/feeds/events/grid.js +1 -0
- package/dist/feeds/events/grid.js.map +1 -1
- package/dist/feeds/events/grouped.js +1 -0
- package/dist/feeds/events/grouped.js.map +1 -1
- package/dist/feeds/events/list.js +1 -0
- package/dist/feeds/events/list.js.map +1 -1
- package/dist/feeds/experts/_types.d.ts +8 -2
- package/dist/feeds/experts/_types.d.ts.map +1 -1
- package/dist/feeds/experts/bio.d.ts.map +1 -1
- package/dist/feeds/experts/bio.js +14 -4
- package/dist/feeds/experts/bio.js.map +1 -1
- package/dist/feeds/experts/grid.js +1 -0
- package/dist/feeds/experts/grid.js.map +1 -1
- package/dist/feeds/experts/in-the-news.d.ts +4 -0
- package/dist/feeds/experts/in-the-news.d.ts.map +1 -0
- package/dist/feeds/experts/in-the-news.js +348 -0
- package/dist/feeds/experts/in-the-news.js.map +1 -0
- package/dist/feeds/experts/index.d.ts +1 -0
- package/dist/feeds/experts/index.d.ts.map +1 -1
- package/dist/feeds/experts/list.js +1 -0
- package/dist/feeds/experts/list.js.map +1 -1
- package/dist/feeds/in-the-news/_types.d.ts +14 -0
- package/dist/feeds/in-the-news/_types.d.ts.map +1 -0
- package/dist/feeds/in-the-news/grid.d.ts +4 -0
- package/dist/feeds/in-the-news/grid.d.ts.map +1 -0
- package/dist/feeds/in-the-news/grid.js +28 -0
- package/dist/feeds/in-the-news/grid.js.map +1 -0
- package/dist/feeds/in-the-news/index.d.ts +3 -0
- package/dist/feeds/in-the-news/index.d.ts.map +1 -0
- package/dist/feeds/in-the-news/list.d.ts +4 -0
- package/dist/feeds/in-the-news/list.d.ts.map +1 -0
- package/dist/feeds/in-the-news/list.js +29 -0
- package/dist/feeds/in-the-news/list.js.map +1 -0
- package/dist/feeds/news/featured.d.ts.map +1 -1
- package/dist/feeds/news/featured.js +10 -3
- package/dist/feeds/news/featured.js.map +1 -1
- package/dist/feeds/news/grid.js +1 -0
- package/dist/feeds/news/grid.js.map +1 -1
- package/dist/feeds/news/list.js +1 -0
- package/dist/feeds/news/list.js.map +1 -1
- package/dist/in-the-news.d.ts +2 -0
- package/dist/in-the-news.js +7 -0
- package/dist/in-the-news.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/strategies/display/experts.d.ts +2 -1
- package/dist/strategies/display/experts.d.ts.map +1 -1
- package/dist/strategies/display/experts.js +43 -11
- package/dist/strategies/display/experts.js.map +1 -1
- package/dist/strategies/display/inTheNews.d.ts +4 -0
- package/dist/strategies/display/inTheNews.d.ts.map +1 -0
- package/dist/strategies/display/inTheNews.js +99 -0
- package/dist/strategies/display/inTheNews.js.map +1 -0
- package/dist/strategies/display/index.d.ts +2 -1
- package/dist/strategies/display/index.d.ts.map +1 -1
- package/dist/strategies/fetch/experts.d.ts +1 -1
- package/dist/strategies/fetch/experts.d.ts.map +1 -1
- package/dist/strategies/fetch/experts.js +11 -8
- package/dist/strategies/fetch/experts.js.map +1 -1
- package/dist/strategies/fetch/graphql.d.ts.map +1 -1
- package/dist/strategies/fetch/graphql.js +6 -3
- package/dist/strategies/fetch/graphql.js.map +1 -1
- package/dist/strategies/fetch/inTheNews.d.ts +4 -0
- package/dist/strategies/fetch/inTheNews.d.ts.map +1 -0
- package/dist/strategies/fetch/inTheNews.js +87 -0
- package/dist/strategies/fetch/inTheNews.js.map +1 -0
- package/dist/strategies/fetch/index.d.ts +2 -0
- package/dist/strategies/fetch/index.d.ts.map +1 -1
- package/dist/strategies/index.d.ts +3 -3
- package/dist/strategies/index.d.ts.map +1 -1
- package/dist/types/api.d.ts +1 -0
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/data/experts.d.ts +8 -0
- package/dist/types/data/experts.d.ts.map +1 -1
- package/dist/types/data/inTheNews.d.ts +32 -0
- package/dist/types/data/inTheNews.d.ts.map +1 -0
- package/dist/types/data/index.d.ts +1 -0
- package/dist/types/data/index.d.ts.map +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import { ElementBuilder } from "@universityofmaryland/web-builder-library";
|
|
2
|
+
import * as token from "@universityofmaryland/web-token-library";
|
|
3
|
+
import { card } from "@universityofmaryland/web-elements-library/composite";
|
|
4
|
+
import { gridOffset, stacked } from "@universityofmaryland/web-elements-library/layout";
|
|
5
|
+
import { LoadingState } from "../../states/loading.js";
|
|
6
|
+
import { EmptyState } from "../../states/empty.js";
|
|
7
|
+
import { PaginationState } from "../../states/pagination.js";
|
|
8
|
+
import { Announcer } from "../../states/announcer.js";
|
|
9
|
+
import { expertsFetchStrategy } from "../../strategies/fetch/experts.js";
|
|
10
|
+
import { inTheNewsFetchStrategy } from "../../strategies/fetch/inTheNews.js";
|
|
11
|
+
import { expertsDisplayStrategy } from "../../strategies/display/experts.js";
|
|
12
|
+
import { inTheNewsDisplayStrategy } from "../../strategies/display/inTheNews.js";
|
|
13
|
+
import { dispatch, eventNames } from "../../helpers/events/index.js";
|
|
14
|
+
import { setShadowStyles } from "../../helpers/styles/shadow.js";
|
|
15
|
+
const DEFAULT_ROWS_TO_START = 5;
|
|
16
|
+
const MIN_ROWS_TO_START = 2;
|
|
17
|
+
const MAX_ROWS_TO_START = 10;
|
|
18
|
+
const LOAD_MORE_ITEMS = 5;
|
|
19
|
+
const normalizeRowCount = (rows) => {
|
|
20
|
+
if (rows === void 0) return DEFAULT_ROWS_TO_START;
|
|
21
|
+
return Math.max(MIN_ROWS_TO_START, Math.min(MAX_ROWS_TO_START, rows));
|
|
22
|
+
};
|
|
23
|
+
const createExpertFetchProps = (token2, expertId) => ({
|
|
24
|
+
token: token2,
|
|
25
|
+
limit: 1,
|
|
26
|
+
offset: 0,
|
|
27
|
+
ids: [expertId]
|
|
28
|
+
});
|
|
29
|
+
const createNewsFetchProps = (token2, expertId, numberOfRowsToStart, offset) => ({
|
|
30
|
+
token: token2,
|
|
31
|
+
expertId,
|
|
32
|
+
numberOfRowsToStart,
|
|
33
|
+
getOffset: () => offset
|
|
34
|
+
});
|
|
35
|
+
const createAnnouncerMessage = (showing, total, isLazyLoad) => isLazyLoad ? `Showing ${showing} of ${total} news articles` : `Showing ${showing} news articles`;
|
|
36
|
+
class InTheNewsFeedState {
|
|
37
|
+
constructor(initialStyles) {
|
|
38
|
+
this.stylesArray = [];
|
|
39
|
+
this.shadowRoot = null;
|
|
40
|
+
this.totalEntries = 0;
|
|
41
|
+
this.offset = 0;
|
|
42
|
+
this.pagination = null;
|
|
43
|
+
this.stylesArray.push(initialStyles);
|
|
44
|
+
}
|
|
45
|
+
addStyles(styles) {
|
|
46
|
+
this.stylesArray.push(styles);
|
|
47
|
+
}
|
|
48
|
+
setShadowRoot(shadow) {
|
|
49
|
+
this.shadowRoot = shadow;
|
|
50
|
+
}
|
|
51
|
+
async updateShadowStyles() {
|
|
52
|
+
if (!this.shadowRoot) return;
|
|
53
|
+
await setShadowStyles({
|
|
54
|
+
shadowRoot: this.shadowRoot,
|
|
55
|
+
styles: this.getStyles()
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
getStyles() {
|
|
59
|
+
return this.stylesArray.join("\n");
|
|
60
|
+
}
|
|
61
|
+
getShadowCallback() {
|
|
62
|
+
return (shadow) => this.setShadowRoot(shadow);
|
|
63
|
+
}
|
|
64
|
+
getOffset() {
|
|
65
|
+
return this.offset;
|
|
66
|
+
}
|
|
67
|
+
setOffset(value) {
|
|
68
|
+
this.offset = value;
|
|
69
|
+
}
|
|
70
|
+
incrementOffset(count) {
|
|
71
|
+
this.offset += count;
|
|
72
|
+
}
|
|
73
|
+
getTotalEntries() {
|
|
74
|
+
return this.totalEntries;
|
|
75
|
+
}
|
|
76
|
+
setTotalEntries(total) {
|
|
77
|
+
this.totalEntries = total;
|
|
78
|
+
}
|
|
79
|
+
getPagination() {
|
|
80
|
+
return this.pagination;
|
|
81
|
+
}
|
|
82
|
+
setPagination(pagination) {
|
|
83
|
+
this.pagination = pagination;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const createExpertOverlayCard = (expert, isThemeDark) => expertsDisplayStrategy.mapEntryToCard(expert, {
|
|
87
|
+
isOverlay: true,
|
|
88
|
+
isThemeDark
|
|
89
|
+
});
|
|
90
|
+
const createNewsListContainer = (entries, state, isThemeDark) => {
|
|
91
|
+
const stackedLayout = stacked({ isThemeDark, showDividers: true, gap: "0" });
|
|
92
|
+
stackedLayout.element.id = "umd-expert-in-the-news-list";
|
|
93
|
+
state.addStyles(stackedLayout.styles);
|
|
94
|
+
entries.forEach((entry) => {
|
|
95
|
+
const newsCard = inTheNewsDisplayStrategy.mapEntryToCard(entry, {
|
|
96
|
+
isThemeDark,
|
|
97
|
+
cardType: "list"
|
|
98
|
+
});
|
|
99
|
+
stackedLayout.element.appendChild(newsCard.element);
|
|
100
|
+
state.addStyles(newsCard.styles);
|
|
101
|
+
});
|
|
102
|
+
return stackedLayout.element;
|
|
103
|
+
};
|
|
104
|
+
const appendNewsEntries = (container, entries, state, isThemeDark) => {
|
|
105
|
+
const listContainer = container.querySelector(
|
|
106
|
+
"#umd-expert-in-the-news-list"
|
|
107
|
+
);
|
|
108
|
+
if (!listContainer) return;
|
|
109
|
+
entries.forEach((entry) => {
|
|
110
|
+
const newsCard = inTheNewsDisplayStrategy.mapEntryToCard(entry, {
|
|
111
|
+
isThemeDark,
|
|
112
|
+
cardType: "list"
|
|
113
|
+
});
|
|
114
|
+
listContainer.appendChild(newsCard.element);
|
|
115
|
+
state.addStyles(newsCard.styles);
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
const renderLayout = async (container, expert, newsEntries, state, props, loadMore) => {
|
|
119
|
+
const { isThemeDark = false, isLazyLoad = false } = props;
|
|
120
|
+
const offsetLayout = gridOffset({
|
|
121
|
+
columns: 2,
|
|
122
|
+
isLayoutReversed: false
|
|
123
|
+
});
|
|
124
|
+
const expertCard = createExpertOverlayCard(expert, isThemeDark);
|
|
125
|
+
state.addStyles(expertCard.styles);
|
|
126
|
+
state.addStyles(`
|
|
127
|
+
.${card.overlay.imageClassRef} {
|
|
128
|
+
height: inherit;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
@media (${token.media.queries.tablet.min}) {
|
|
132
|
+
.${card.overlay.imageClassRef} .card-overlay-image-container {
|
|
133
|
+
min-height: 560px;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.${card.overlay.imageClassRef} .umd-asset-image-wrapper-scaled {
|
|
138
|
+
position: absolute;
|
|
139
|
+
}
|
|
140
|
+
`);
|
|
141
|
+
const rightColumn = document.createElement("div");
|
|
142
|
+
rightColumn.className = "expert-in-the-news-right-column";
|
|
143
|
+
const newsList = createNewsListContainer(newsEntries, state, isThemeDark);
|
|
144
|
+
rightColumn.appendChild(newsList);
|
|
145
|
+
offsetLayout.element.appendChild(expertCard.element);
|
|
146
|
+
offsetLayout.element.appendChild(rightColumn);
|
|
147
|
+
container.appendChild(offsetLayout.element);
|
|
148
|
+
state.addStyles(offsetLayout.styles);
|
|
149
|
+
state.setOffset(newsEntries.length);
|
|
150
|
+
if (isLazyLoad && state.getTotalEntries() > state.getOffset()) {
|
|
151
|
+
const pagination = new PaginationState({
|
|
152
|
+
totalEntries: state.getTotalEntries(),
|
|
153
|
+
offset: state.getOffset(),
|
|
154
|
+
isLazyLoad: true,
|
|
155
|
+
callback: loadMore
|
|
156
|
+
});
|
|
157
|
+
const paginationElement = pagination.render(rightColumn);
|
|
158
|
+
if (paginationElement) state.addStyles(paginationElement.styles);
|
|
159
|
+
state.setPagination(pagination);
|
|
160
|
+
}
|
|
161
|
+
const announcer = new Announcer({
|
|
162
|
+
message: createAnnouncerMessage(
|
|
163
|
+
state.getOffset(),
|
|
164
|
+
state.getTotalEntries(),
|
|
165
|
+
isLazyLoad
|
|
166
|
+
)
|
|
167
|
+
});
|
|
168
|
+
container.appendChild(announcer.getElement());
|
|
169
|
+
await state.updateShadowStyles();
|
|
170
|
+
};
|
|
171
|
+
const renderError = async (container, message, state, isThemeDark) => {
|
|
172
|
+
const emptyState = new EmptyState({ message, isThemeDark });
|
|
173
|
+
emptyState.render(container);
|
|
174
|
+
state.addStyles(emptyState.styles);
|
|
175
|
+
await state.updateShadowStyles();
|
|
176
|
+
};
|
|
177
|
+
const renderLayoutWithNoNews = async (container, expert, state, isThemeDark) => {
|
|
178
|
+
const offsetLayout = gridOffset({
|
|
179
|
+
columns: 2,
|
|
180
|
+
isLayoutReversed: false
|
|
181
|
+
});
|
|
182
|
+
const expertCard = createExpertOverlayCard(expert, isThemeDark);
|
|
183
|
+
state.addStyles(expertCard.styles);
|
|
184
|
+
state.addStyles(`
|
|
185
|
+
.${card.overlay.imageClassRef} {
|
|
186
|
+
height: inherit;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
@media (${token.media.queries.tablet.min}) {
|
|
190
|
+
.${card.overlay.imageClassRef} .card-overlay-image-container {
|
|
191
|
+
min-height: 560px;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.${card.overlay.imageClassRef} .umd-asset-image-wrapper-scaled {
|
|
196
|
+
position: absolute;
|
|
197
|
+
}
|
|
198
|
+
`);
|
|
199
|
+
const rightColumn = document.createElement("div");
|
|
200
|
+
rightColumn.className = "expert-in-the-news-right-column";
|
|
201
|
+
const emptyState = new EmptyState({
|
|
202
|
+
message: "No news articles found for this expert",
|
|
203
|
+
isThemeDark
|
|
204
|
+
});
|
|
205
|
+
emptyState.render(rightColumn);
|
|
206
|
+
state.addStyles(emptyState.styles);
|
|
207
|
+
offsetLayout.element.appendChild(expertCard.element);
|
|
208
|
+
offsetLayout.element.appendChild(rightColumn);
|
|
209
|
+
container.appendChild(offsetLayout.element);
|
|
210
|
+
state.addStyles(offsetLayout.styles);
|
|
211
|
+
await state.updateShadowStyles();
|
|
212
|
+
};
|
|
213
|
+
const logError = (errorType, expertId, error) => {
|
|
214
|
+
const messages = {
|
|
215
|
+
expert_not_found: `No expert found with ID "${expertId}". Verify the expert ID is correct.`,
|
|
216
|
+
no_news: `No news articles found for expert "${expertId}".`,
|
|
217
|
+
graphql_error: `GraphQL error occurred for expert "${expertId}".`
|
|
218
|
+
};
|
|
219
|
+
console.warn(`[Expert In The News Feed] ${messages[errorType]}`, error || "");
|
|
220
|
+
};
|
|
221
|
+
const expertsInTheNews = (props) => {
|
|
222
|
+
const { token: token2, expertId, isThemeDark = false, isLazyLoad = false } = props;
|
|
223
|
+
const numberOfRowsToStart = normalizeRowCount(props.numberOfRowsToStart);
|
|
224
|
+
const containerBuilder = new ElementBuilder("div").withClassName(
|
|
225
|
+
"expert-in-the-news-feed"
|
|
226
|
+
);
|
|
227
|
+
const container = containerBuilder.getElement();
|
|
228
|
+
const loading = new LoadingState({ isThemeDark });
|
|
229
|
+
const state = new InTheNewsFeedState(loading.styles);
|
|
230
|
+
const loadMore = async () => {
|
|
231
|
+
const pagination = state.getPagination();
|
|
232
|
+
if (pagination) pagination.remove();
|
|
233
|
+
loading.show(container);
|
|
234
|
+
const fetchProps = createNewsFetchProps(
|
|
235
|
+
token2,
|
|
236
|
+
expertId,
|
|
237
|
+
LOAD_MORE_ITEMS,
|
|
238
|
+
state.getOffset()
|
|
239
|
+
);
|
|
240
|
+
const variables = inTheNewsFetchStrategy.composeApiVariables(fetchProps);
|
|
241
|
+
const entries = await inTheNewsFetchStrategy.fetchEntries(variables);
|
|
242
|
+
loading.hide();
|
|
243
|
+
if (!entries || entries.length === 0) return;
|
|
244
|
+
appendNewsEntries(container, entries, state, isThemeDark);
|
|
245
|
+
state.incrementOffset(entries.length);
|
|
246
|
+
if (pagination) {
|
|
247
|
+
pagination.updateState(state.getOffset(), state.getTotalEntries());
|
|
248
|
+
if (pagination.styles) state.addStyles(pagination.styles);
|
|
249
|
+
await state.updateShadowStyles();
|
|
250
|
+
}
|
|
251
|
+
const existingAnnouncer = container.querySelector(
|
|
252
|
+
'[role="status"]'
|
|
253
|
+
);
|
|
254
|
+
if (existingAnnouncer) {
|
|
255
|
+
existingAnnouncer.textContent = createAnnouncerMessage(
|
|
256
|
+
state.getOffset(),
|
|
257
|
+
state.getTotalEntries(),
|
|
258
|
+
isLazyLoad
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
dispatch(
|
|
262
|
+
container,
|
|
263
|
+
eventNames.FEED_LOADED_MORE,
|
|
264
|
+
{ items: entries, count: entries.length, total: state.getTotalEntries() }
|
|
265
|
+
);
|
|
266
|
+
};
|
|
267
|
+
const initialize = async () => {
|
|
268
|
+
if (!expertId) {
|
|
269
|
+
await renderError(container, "Expert ID is required", state, isThemeDark);
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
loading.show(container);
|
|
273
|
+
try {
|
|
274
|
+
const expertFetchProps = createExpertFetchProps(token2, expertId);
|
|
275
|
+
const expertVariables = expertsFetchStrategy.composeApiVariables(expertFetchProps);
|
|
276
|
+
const newsFetchProps = createNewsFetchProps(
|
|
277
|
+
token2,
|
|
278
|
+
expertId,
|
|
279
|
+
numberOfRowsToStart,
|
|
280
|
+
0
|
|
281
|
+
);
|
|
282
|
+
const newsVariables = inTheNewsFetchStrategy.composeApiVariables(newsFetchProps);
|
|
283
|
+
const [expertEntries, newsCount, newsEntries] = await Promise.all([
|
|
284
|
+
expertsFetchStrategy.fetchEntries(expertVariables),
|
|
285
|
+
inTheNewsFetchStrategy.fetchCount(newsVariables),
|
|
286
|
+
inTheNewsFetchStrategy.fetchEntries(newsVariables)
|
|
287
|
+
]);
|
|
288
|
+
loading.hide();
|
|
289
|
+
if (!expertEntries || expertEntries.length === 0) {
|
|
290
|
+
logError("expert_not_found", expertId);
|
|
291
|
+
await renderError(container, "Expert not found", state, isThemeDark);
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
if (!newsEntries || newsEntries.length === 0) {
|
|
295
|
+
logError("no_news", expertId);
|
|
296
|
+
await renderLayoutWithNoNews(
|
|
297
|
+
container,
|
|
298
|
+
expertEntries[0],
|
|
299
|
+
state,
|
|
300
|
+
isThemeDark
|
|
301
|
+
);
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
state.setTotalEntries(newsCount || newsEntries.length);
|
|
305
|
+
dispatch(
|
|
306
|
+
container,
|
|
307
|
+
eventNames.FEED_LOADED,
|
|
308
|
+
{
|
|
309
|
+
expert: expertEntries[0],
|
|
310
|
+
newsItems: newsEntries,
|
|
311
|
+
newsCount: newsEntries.length,
|
|
312
|
+
total: state.getTotalEntries()
|
|
313
|
+
}
|
|
314
|
+
);
|
|
315
|
+
await renderLayout(
|
|
316
|
+
container,
|
|
317
|
+
expertEntries[0],
|
|
318
|
+
newsEntries,
|
|
319
|
+
state,
|
|
320
|
+
props,
|
|
321
|
+
loadMore
|
|
322
|
+
);
|
|
323
|
+
} catch (error) {
|
|
324
|
+
loading.hide();
|
|
325
|
+
logError("graphql_error", expertId, error);
|
|
326
|
+
await renderError(
|
|
327
|
+
container,
|
|
328
|
+
"Failed to load content",
|
|
329
|
+
state,
|
|
330
|
+
isThemeDark
|
|
331
|
+
);
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
initialize();
|
|
335
|
+
return {
|
|
336
|
+
element: containerBuilder.build().element,
|
|
337
|
+
get styles() {
|
|
338
|
+
return state.getStyles();
|
|
339
|
+
},
|
|
340
|
+
events: {
|
|
341
|
+
callback: state.getShadowCallback()
|
|
342
|
+
}
|
|
343
|
+
};
|
|
344
|
+
};
|
|
345
|
+
export {
|
|
346
|
+
expertsInTheNews
|
|
347
|
+
};
|
|
348
|
+
//# sourceMappingURL=in-the-news.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-the-news.js","sources":["../../../source/feeds/experts/in-the-news.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport { card } from '@universityofmaryland/web-elements-library/composite';\nimport { gridOffset, stacked } from '@universityofmaryland/web-elements-library/layout';\nimport {\n LoadingState,\n PaginationState,\n EmptyState,\n Announcer,\n} from '../../states';\nimport { expertsFetchStrategy } from '../../strategies/fetch/experts';\nimport { inTheNewsFetchStrategy } from '../../strategies/fetch/inTheNews';\nimport { expertsDisplayStrategy } from '../../strategies/display/experts';\nimport { inTheNewsDisplayStrategy } from '../../strategies/display/inTheNews';\nimport {\n events as eventUtilities,\n styles as styleUtilities,\n} from '../../helpers';\nimport { type InTheNewsProps } from './_types';\nimport { type ElementModel } from '../../_types';\nimport { type ExpertEntry, type InTheNewsEntry } from 'types/data';\n\nconst DEFAULT_ROWS_TO_START = 5;\nconst MIN_ROWS_TO_START = 2;\nconst MAX_ROWS_TO_START = 10;\nconst LOAD_MORE_ITEMS = 5;\n\nconst normalizeRowCount = (rows?: number): number => {\n if (rows === undefined) return DEFAULT_ROWS_TO_START;\n return Math.max(MIN_ROWS_TO_START, Math.min(MAX_ROWS_TO_START, rows));\n};\n\nconst createExpertFetchProps = (token: string, expertId: string) => ({\n token,\n limit: 1,\n offset: 0,\n ids: [expertId],\n});\n\nconst createNewsFetchProps = (\n token: string,\n expertId: string,\n numberOfRowsToStart: number,\n offset: number,\n) => ({\n token,\n expertId,\n numberOfRowsToStart,\n getOffset: () => offset,\n});\n\nconst createAnnouncerMessage = (\n showing: number,\n total: number,\n isLazyLoad: boolean,\n): string =>\n isLazyLoad\n ? `Showing ${showing} of ${total} news articles`\n : `Showing ${showing} news articles`;\n\nclass InTheNewsFeedState {\n private stylesArray: string[] = [];\n private shadowRoot: ShadowRoot | null = null;\n private totalEntries: number = 0;\n private offset: number = 0;\n private pagination: PaginationState | null = null;\n\n constructor(initialStyles: string) {\n this.stylesArray.push(initialStyles);\n }\n\n addStyles(styles: string): void {\n this.stylesArray.push(styles);\n }\n\n setShadowRoot(shadow: ShadowRoot): void {\n this.shadowRoot = shadow;\n }\n\n async updateShadowStyles(): Promise<void> {\n if (!this.shadowRoot) return;\n await styleUtilities.setShadowStyles({\n shadowRoot: this.shadowRoot,\n styles: this.getStyles(),\n });\n }\n\n getStyles(): string {\n return this.stylesArray.join('\\n');\n }\n\n getShadowCallback(): (shadow: ShadowRoot) => void {\n return (shadow) => this.setShadowRoot(shadow);\n }\n\n getOffset(): number {\n return this.offset;\n }\n\n setOffset(value: number): void {\n this.offset = value;\n }\n\n incrementOffset(count: number): void {\n this.offset += count;\n }\n\n getTotalEntries(): number {\n return this.totalEntries;\n }\n\n setTotalEntries(total: number): void {\n this.totalEntries = total;\n }\n\n getPagination(): PaginationState | null {\n return this.pagination;\n }\n\n setPagination(pagination: PaginationState | null): void {\n this.pagination = pagination;\n }\n}\n\nconst createExpertOverlayCard = (\n expert: ExpertEntry,\n isThemeDark: boolean,\n): ElementModel =>\n expertsDisplayStrategy.mapEntryToCard(expert, {\n isOverlay: true,\n isThemeDark,\n });\n\nconst createNewsListContainer = (\n entries: InTheNewsEntry[],\n state: InTheNewsFeedState,\n isThemeDark: boolean,\n): HTMLElement => {\n const stackedLayout = stacked({ isThemeDark, showDividers: true, gap: '0' });\n stackedLayout.element.id = 'umd-expert-in-the-news-list';\n state.addStyles(stackedLayout.styles);\n\n entries.forEach((entry) => {\n const newsCard = inTheNewsDisplayStrategy.mapEntryToCard(entry, {\n isThemeDark,\n cardType: 'list',\n });\n stackedLayout.element.appendChild(newsCard.element);\n state.addStyles(newsCard.styles);\n });\n\n return stackedLayout.element;\n};\n\nconst appendNewsEntries = (\n container: HTMLElement,\n entries: InTheNewsEntry[],\n state: InTheNewsFeedState,\n isThemeDark: boolean,\n): void => {\n const listContainer = container.querySelector(\n '#umd-expert-in-the-news-list',\n ) as HTMLElement;\n\n if (!listContainer) return;\n\n entries.forEach((entry) => {\n const newsCard = inTheNewsDisplayStrategy.mapEntryToCard(entry, {\n isThemeDark,\n cardType: 'list',\n });\n listContainer.appendChild(newsCard.element);\n state.addStyles(newsCard.styles);\n });\n};\n\nconst renderLayout = async (\n container: HTMLElement,\n expert: ExpertEntry,\n newsEntries: InTheNewsEntry[],\n state: InTheNewsFeedState,\n props: InTheNewsProps,\n loadMore: () => Promise<void>,\n): Promise<void> => {\n const { isThemeDark = false, isLazyLoad = false } = props;\n\n const offsetLayout = gridOffset({\n columns: 2,\n isLayoutReversed: false,\n });\n\n const expertCard = createExpertOverlayCard(expert, isThemeDark);\n state.addStyles(expertCard.styles);\n\n state.addStyles(`\n .${card.overlay.imageClassRef} {\n height: inherit;\n }\n\n @media (${token.media.queries.tablet.min}) {\n .${card.overlay.imageClassRef} .card-overlay-image-container {\n min-height: 560px;\n }\n }\n\n .${card.overlay.imageClassRef} .umd-asset-image-wrapper-scaled {\n position: absolute;\n }\n `);\n\n const rightColumn = document.createElement('div');\n rightColumn.className = 'expert-in-the-news-right-column';\n\n const newsList = createNewsListContainer(newsEntries, state, isThemeDark);\n rightColumn.appendChild(newsList);\n\n offsetLayout.element.appendChild(expertCard.element);\n offsetLayout.element.appendChild(rightColumn);\n container.appendChild(offsetLayout.element);\n\n state.addStyles(offsetLayout.styles);\n state.setOffset(newsEntries.length);\n\n if (isLazyLoad && state.getTotalEntries() > state.getOffset()) {\n const pagination = new PaginationState({\n totalEntries: state.getTotalEntries(),\n offset: state.getOffset(),\n isLazyLoad: true,\n callback: loadMore,\n });\n\n const paginationElement = pagination.render(rightColumn);\n if (paginationElement) state.addStyles(paginationElement.styles);\n state.setPagination(pagination);\n }\n\n const announcer = new Announcer({\n message: createAnnouncerMessage(\n state.getOffset(),\n state.getTotalEntries(),\n isLazyLoad,\n ),\n });\n container.appendChild(announcer.getElement());\n\n await state.updateShadowStyles();\n};\n\nconst renderError = async (\n container: HTMLElement,\n message: string,\n state: InTheNewsFeedState,\n isThemeDark: boolean,\n): Promise<void> => {\n const emptyState = new EmptyState({ message, isThemeDark });\n emptyState.render(container);\n state.addStyles(emptyState.styles);\n await state.updateShadowStyles();\n};\n\nconst renderLayoutWithNoNews = async (\n container: HTMLElement,\n expert: ExpertEntry,\n state: InTheNewsFeedState,\n isThemeDark: boolean,\n): Promise<void> => {\n const offsetLayout = gridOffset({\n columns: 2,\n isLayoutReversed: false,\n });\n\n const expertCard = createExpertOverlayCard(expert, isThemeDark);\n state.addStyles(expertCard.styles);\n\n state.addStyles(`\n .${card.overlay.imageClassRef} {\n height: inherit;\n }\n\n @media (${token.media.queries.tablet.min}) {\n .${card.overlay.imageClassRef} .card-overlay-image-container {\n min-height: 560px;\n }\n }\n\n .${card.overlay.imageClassRef} .umd-asset-image-wrapper-scaled {\n position: absolute;\n }\n `);\n\n const rightColumn = document.createElement('div');\n rightColumn.className = 'expert-in-the-news-right-column';\n\n const emptyState = new EmptyState({\n message: 'No news articles found for this expert',\n isThemeDark,\n });\n emptyState.render(rightColumn);\n state.addStyles(emptyState.styles);\n\n offsetLayout.element.appendChild(expertCard.element);\n offsetLayout.element.appendChild(rightColumn);\n container.appendChild(offsetLayout.element);\n\n state.addStyles(offsetLayout.styles);\n await state.updateShadowStyles();\n};\n\nconst logError = (\n errorType: 'expert_not_found' | 'no_news' | 'graphql_error',\n expertId: string,\n error?: unknown,\n): void => {\n const messages = {\n expert_not_found: `No expert found with ID \"${expertId}\". Verify the expert ID is correct.`,\n no_news: `No news articles found for expert \"${expertId}\".`,\n graphql_error: `GraphQL error occurred for expert \"${expertId}\".`,\n };\n console.warn(`[Expert In The News Feed] ${messages[errorType]}`, error || '');\n};\n\nexport const expertsInTheNews = (props: InTheNewsProps): ElementModel => {\n const { token, expertId, isThemeDark = false, isLazyLoad = false } = props;\n const numberOfRowsToStart = normalizeRowCount(props.numberOfRowsToStart);\n\n const containerBuilder = new ElementBuilder('div').withClassName(\n 'expert-in-the-news-feed',\n );\n const container = containerBuilder.getElement();\n\n const loading = new LoadingState({ isThemeDark });\n const state = new InTheNewsFeedState(loading.styles);\n\n const loadMore = async (): Promise<void> => {\n const pagination = state.getPagination();\n if (pagination) pagination.remove();\n\n loading.show(container);\n\n const fetchProps = createNewsFetchProps(\n token,\n expertId,\n LOAD_MORE_ITEMS,\n state.getOffset(),\n );\n const variables = inTheNewsFetchStrategy.composeApiVariables(fetchProps);\n const entries = await inTheNewsFetchStrategy.fetchEntries(variables);\n\n loading.hide();\n\n if (!entries || entries.length === 0) return;\n\n appendNewsEntries(container, entries, state, isThemeDark);\n state.incrementOffset(entries.length);\n\n if (pagination) {\n pagination.updateState(state.getOffset(), state.getTotalEntries());\n if (pagination.styles) state.addStyles(pagination.styles);\n await state.updateShadowStyles();\n }\n\n const existingAnnouncer = container.querySelector(\n '[role=\"status\"]',\n ) as HTMLElement;\n if (existingAnnouncer) {\n existingAnnouncer.textContent = createAnnouncerMessage(\n state.getOffset(),\n state.getTotalEntries(),\n isLazyLoad,\n );\n }\n\n eventUtilities.dispatch(\n container,\n eventUtilities.eventNames.FEED_LOADED_MORE,\n { items: entries, count: entries.length, total: state.getTotalEntries() },\n );\n };\n\n const initialize = async (): Promise<void> => {\n if (!expertId) {\n await renderError(container, 'Expert ID is required', state, isThemeDark);\n return;\n }\n\n loading.show(container);\n\n try {\n const expertFetchProps = createExpertFetchProps(token, expertId);\n const expertVariables =\n expertsFetchStrategy.composeApiVariables(expertFetchProps);\n\n const newsFetchProps = createNewsFetchProps(\n token,\n expertId,\n numberOfRowsToStart,\n 0,\n );\n const newsVariables =\n inTheNewsFetchStrategy.composeApiVariables(newsFetchProps);\n\n const [expertEntries, newsCount, newsEntries] = await Promise.all([\n expertsFetchStrategy.fetchEntries(expertVariables),\n inTheNewsFetchStrategy.fetchCount(newsVariables),\n inTheNewsFetchStrategy.fetchEntries(newsVariables),\n ]);\n\n loading.hide();\n\n if (!expertEntries || expertEntries.length === 0) {\n logError('expert_not_found', expertId);\n await renderError(container, 'Expert not found', state, isThemeDark);\n return;\n }\n\n if (!newsEntries || newsEntries.length === 0) {\n logError('no_news', expertId);\n await renderLayoutWithNoNews(\n container,\n expertEntries[0],\n state,\n isThemeDark,\n );\n return;\n }\n\n state.setTotalEntries(newsCount || newsEntries.length);\n\n eventUtilities.dispatch(\n container,\n eventUtilities.eventNames.FEED_LOADED,\n {\n expert: expertEntries[0],\n newsItems: newsEntries,\n newsCount: newsEntries.length,\n total: state.getTotalEntries(),\n },\n );\n\n await renderLayout(\n container,\n expertEntries[0],\n newsEntries,\n state,\n props,\n loadMore,\n );\n } catch (error) {\n loading.hide();\n logError('graphql_error', expertId, error);\n await renderError(\n container,\n 'Failed to load content',\n state,\n isThemeDark,\n );\n }\n };\n\n initialize();\n\n return {\n element: containerBuilder.build().element,\n get styles() {\n return state.getStyles();\n },\n events: {\n callback: state.getShadowCallback(),\n },\n };\n};\n"],"names":["token","styleUtilities.setShadowStyles","eventUtilities.dispatch","eventUtilities.eventNames"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/feeds/experts/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,WAAW,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAM7C,OAAO,EAAE,WAAW,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAO7C,OAAO,EAAE,UAAU,IAAI,GAAG,EAAE,MAAM,OAAO,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/feeds/experts/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,WAAW,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAM7C,OAAO,EAAE,WAAW,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAO7C,OAAO,EAAE,UAAU,IAAI,GAAG,EAAE,MAAM,OAAO,CAAC;AAO1C,OAAO,EAAE,gBAAgB,IAAI,SAAS,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -12,6 +12,7 @@ import "@universityofmaryland/web-utilities-library/network";
|
|
|
12
12
|
import "../../strategies/fetch/events.js";
|
|
13
13
|
import "../../strategies/fetch/news.js";
|
|
14
14
|
import { expertsFetchStrategy } from "../../strategies/fetch/experts.js";
|
|
15
|
+
import "../../strategies/fetch/inTheNews.js";
|
|
15
16
|
import { stackedLayout } from "../../strategies/layout/grid.js";
|
|
16
17
|
import "@universityofmaryland/web-elements-library/layout";
|
|
17
18
|
const expertsList = (props) => createBaseFeed({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sources":["../../../source/feeds/experts/list.ts"],"sourcesContent":["/**\n * Experts List Feed (Factory Pattern)\n *\n * List layout for expert profile entries using the feed factory pattern.\n * Uses person elements for displaying expert profiles in a single-column list.\n *\n * @module feeds/experts/list\n */\n\nimport { createBaseFeed } from 'factory';\nimport {\n expertsFetchStrategy,\n expertsDisplayStrategy,\n stackedLayout,\n} from 'strategies';\nimport { type ListProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\n/**\n * Create an experts list feed\n *\n * @param props - Feed configuration\n * @returns ElementModel with feed element and styles\n *\n * @example\n * ```typescript\n * const feed = expertsList({\n * token: 'my-token',\n * numberOfRowsToStart: 10,\n * cardType: 'list',\n * isLazyLoad: true,\n * categories: ['computer-science', 'engineering'],\n * });\n *\n * document.body.appendChild(feed.element);\n * ```\n */\nexport const expertsList = (props: ListProps): ElementModel =>\n createBaseFeed({\n ...props,\n fetchStrategy: expertsFetchStrategy,\n displayStrategy: expertsDisplayStrategy,\n layoutStrategy: stackedLayout,\n });\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list.js","sources":["../../../source/feeds/experts/list.ts"],"sourcesContent":["/**\n * Experts List Feed (Factory Pattern)\n *\n * List layout for expert profile entries using the feed factory pattern.\n * Uses person elements for displaying expert profiles in a single-column list.\n *\n * @module feeds/experts/list\n */\n\nimport { createBaseFeed } from 'factory';\nimport {\n expertsFetchStrategy,\n expertsDisplayStrategy,\n stackedLayout,\n} from 'strategies';\nimport { type ListProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\n/**\n * Create an experts list feed\n *\n * @param props - Feed configuration\n * @returns ElementModel with feed element and styles\n *\n * @example\n * ```typescript\n * const feed = expertsList({\n * token: 'my-token',\n * numberOfRowsToStart: 10,\n * cardType: 'list',\n * isLazyLoad: true,\n * categories: ['computer-science', 'engineering'],\n * });\n *\n * document.body.appendChild(feed.element);\n * ```\n */\nexport const expertsList = (props: ListProps): ElementModel =>\n createBaseFeed({\n ...props,\n fetchStrategy: expertsFetchStrategy,\n displayStrategy: expertsDisplayStrategy,\n layoutStrategy: stackedLayout,\n });\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAqCO,MAAM,cAAc,CAAC,UAC1B,eAAe;AAAA,EACb,GAAG;AAAA,EACH,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAClB,CAAC;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface BaseProps {
|
|
2
|
+
token: string;
|
|
3
|
+
numberOfRowsToStart: number;
|
|
4
|
+
isThemeDark?: boolean;
|
|
5
|
+
isLazyLoad: boolean;
|
|
6
|
+
entriesToRemove?: string[];
|
|
7
|
+
}
|
|
8
|
+
export interface GridProps extends BaseProps {
|
|
9
|
+
numberOfColumnsToShow?: number;
|
|
10
|
+
isTransparent?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface ListProps extends BaseProps {
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=_types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_types.d.ts","sourceRoot":"","sources":["../../../source/feeds/in-the-news/_types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,SAAU,SAAQ,SAAS;IAC1C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,SAAU,SAAQ,SAAS;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../../source/feeds/in-the-news/grid.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,eAAO,MAAM,aAAa,GAAI,OAAO,SAAS,KAAG,YAO7C,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { createBaseFeed } from "../../factory/core/createBaseFeed.js";
|
|
2
|
+
import "@universityofmaryland/web-builder-library";
|
|
3
|
+
import "@universityofmaryland/web-styles-library";
|
|
4
|
+
import "@universityofmaryland/web-styles-library/typography";
|
|
5
|
+
import "@universityofmaryland/web-utilities-library/theme";
|
|
6
|
+
import "@universityofmaryland/web-elements-library";
|
|
7
|
+
import "@universityofmaryland/web-elements-library/composite";
|
|
8
|
+
import "@universityofmaryland/web-elements-library/atomic";
|
|
9
|
+
import "@universityofmaryland/web-utilities-library/elements";
|
|
10
|
+
import { inTheNewsDisplayStrategy } from "../../strategies/display/inTheNews.js";
|
|
11
|
+
import "@universityofmaryland/web-utilities-library/network";
|
|
12
|
+
import "../../strategies/fetch/events.js";
|
|
13
|
+
import "../../strategies/fetch/news.js";
|
|
14
|
+
import "../../strategies/fetch/experts.js";
|
|
15
|
+
import { inTheNewsFetchStrategy } from "../../strategies/fetch/inTheNews.js";
|
|
16
|
+
import { gridGapLayout } from "../../strategies/layout/grid.js";
|
|
17
|
+
import "@universityofmaryland/web-elements-library/layout";
|
|
18
|
+
const inTheNewsGrid = (props) => createBaseFeed({
|
|
19
|
+
...props,
|
|
20
|
+
isAligned: true,
|
|
21
|
+
fetchStrategy: inTheNewsFetchStrategy,
|
|
22
|
+
displayStrategy: inTheNewsDisplayStrategy,
|
|
23
|
+
layoutStrategy: gridGapLayout
|
|
24
|
+
});
|
|
25
|
+
export {
|
|
26
|
+
inTheNewsGrid
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=grid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid.js","sources":["../../../source/feeds/in-the-news/grid.ts"],"sourcesContent":["import { createBaseFeed } from 'factory';\nimport {\n inTheNewsFetchStrategy,\n inTheNewsDisplayStrategy,\n gridGapLayout,\n} from 'strategies';\nimport { type GridProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\nexport const inTheNewsGrid = (props: GridProps): ElementModel =>\n createBaseFeed({\n ...props,\n isAligned: true,\n fetchStrategy: inTheNewsFetchStrategy,\n displayStrategy: inTheNewsDisplayStrategy,\n layoutStrategy: gridGapLayout,\n });\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AASO,MAAM,gBAAgB,CAAC,UAC5B,eAAe;AAAA,EACb,GAAG;AAAA,EACH,WAAW;AAAA,EACX,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAClB,CAAC;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/feeds/in-the-news/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,aAAa,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../source/feeds/in-the-news/list.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,eAAO,MAAM,aAAa,GAAI,OAAO,SAAS,KAAG,YAQ7C,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { createBaseFeed } from "../../factory/core/createBaseFeed.js";
|
|
2
|
+
import "@universityofmaryland/web-builder-library";
|
|
3
|
+
import "@universityofmaryland/web-styles-library";
|
|
4
|
+
import "@universityofmaryland/web-styles-library/typography";
|
|
5
|
+
import "@universityofmaryland/web-utilities-library/theme";
|
|
6
|
+
import "@universityofmaryland/web-elements-library";
|
|
7
|
+
import "@universityofmaryland/web-elements-library/composite";
|
|
8
|
+
import "@universityofmaryland/web-elements-library/atomic";
|
|
9
|
+
import "@universityofmaryland/web-utilities-library/elements";
|
|
10
|
+
import { inTheNewsDisplayStrategy } from "../../strategies/display/inTheNews.js";
|
|
11
|
+
import "@universityofmaryland/web-utilities-library/network";
|
|
12
|
+
import "../../strategies/fetch/events.js";
|
|
13
|
+
import "../../strategies/fetch/news.js";
|
|
14
|
+
import "../../strategies/fetch/experts.js";
|
|
15
|
+
import { inTheNewsFetchStrategy } from "../../strategies/fetch/inTheNews.js";
|
|
16
|
+
import { stackedLayout } from "../../strategies/layout/grid.js";
|
|
17
|
+
import "@universityofmaryland/web-elements-library/layout";
|
|
18
|
+
const inTheNewsList = (props) => createBaseFeed({
|
|
19
|
+
...props,
|
|
20
|
+
cardType: "list",
|
|
21
|
+
isAligned: false,
|
|
22
|
+
fetchStrategy: inTheNewsFetchStrategy,
|
|
23
|
+
displayStrategy: inTheNewsDisplayStrategy,
|
|
24
|
+
layoutStrategy: stackedLayout
|
|
25
|
+
});
|
|
26
|
+
export {
|
|
27
|
+
inTheNewsList
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sources":["../../../source/feeds/in-the-news/list.ts"],"sourcesContent":["import { createBaseFeed } from 'factory';\nimport {\n inTheNewsFetchStrategy,\n inTheNewsDisplayStrategy,\n stackedLayout,\n} from 'strategies';\nimport { type ListProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\nexport const inTheNewsList = (props: ListProps): ElementModel =>\n createBaseFeed({\n ...props,\n cardType: 'list',\n isAligned: false,\n fetchStrategy: inTheNewsFetchStrategy,\n displayStrategy: inTheNewsDisplayStrategy,\n layoutStrategy: stackedLayout,\n });\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AASO,MAAM,gBAAgB,CAAC,UAC5B,eAAe;AAAA,EACb,GAAG;AAAA,EACH,UAAU;AAAA,EACV,WAAW;AAAA,EACX,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAClB,CAAC;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featured.d.ts","sourceRoot":"","sources":["../../../source/feeds/news/featured.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"featured.d.ts","sourceRoot":"","sources":["../../../source/feeds/news/featured.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAgejD,eAAO,MAAM,YAAY,GAAI,OAAO,aAAa,KAAG,YAsJnD,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ElementBuilder } from "@universityofmaryland/web-builder-library";
|
|
2
|
+
import * as token from "@universityofmaryland/web-token-library";
|
|
2
3
|
import { card } from "@universityofmaryland/web-elements-library/composite";
|
|
3
4
|
import { gridOffset, gridGap } from "@universityofmaryland/web-elements-library/layout";
|
|
4
5
|
import { LoadingState } from "../../states/loading.js";
|
|
@@ -171,6 +172,12 @@ const createOverlayCard = (entry, state, isThemeDark) => {
|
|
|
171
172
|
height: inherit;
|
|
172
173
|
}
|
|
173
174
|
|
|
175
|
+
@media (${token.media.queries.tablet.min}) {
|
|
176
|
+
.${card.overlay.imageClassRef} .card-overlay-image-container {
|
|
177
|
+
min-height: 560px;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
174
181
|
.${card.overlay.imageClassRef} .umd-asset-image-wrapper-scaled {
|
|
175
182
|
position: absolute;
|
|
176
183
|
}
|
|
@@ -271,7 +278,7 @@ const renderError = async (container, message, state, isThemeDark) => {
|
|
|
271
278
|
};
|
|
272
279
|
const newsFeatured = (props) => {
|
|
273
280
|
const {
|
|
274
|
-
token,
|
|
281
|
+
token: token2,
|
|
275
282
|
categories,
|
|
276
283
|
isUnion,
|
|
277
284
|
isThemeDark = false,
|
|
@@ -291,7 +298,7 @@ const newsFeatured = (props) => {
|
|
|
291
298
|
}
|
|
292
299
|
loading.show(container);
|
|
293
300
|
const fetchProps = createFetchProps(
|
|
294
|
-
{ token, categories, isUnion },
|
|
301
|
+
{ token: token2, categories, isUnion },
|
|
295
302
|
state.getOffset()
|
|
296
303
|
);
|
|
297
304
|
const variables = newsFetchStrategy.composeApiVariables(fetchProps);
|
|
@@ -329,7 +336,7 @@ const newsFeatured = (props) => {
|
|
|
329
336
|
};
|
|
330
337
|
const initialize = async () => {
|
|
331
338
|
loading.show(container);
|
|
332
|
-
const fetchProps = createFetchProps({ token, categories, isUnion }, 0);
|
|
339
|
+
const fetchProps = createFetchProps({ token: token2, categories, isUnion }, 0);
|
|
333
340
|
const variables = newsFetchStrategy.composeApiVariables(fetchProps);
|
|
334
341
|
const [count, entries] = await Promise.all([
|
|
335
342
|
newsFetchStrategy.fetchCount(variables),
|