@universityofmaryland/web-feeds-library 1.3.0-beta.0 → 1.3.0-beta.1
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/academic.js +4 -4
- package/dist/academic.js.map +1 -1
- package/dist/events.js +10 -10
- package/dist/events.js.map +1 -1
- package/dist/experts.js +8 -8
- package/dist/experts.js.map +1 -1
- package/dist/factory/core/createBaseFeed.d.ts.map +1 -1
- package/dist/factory/core/createBaseFeed.js +19 -17
- 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/factory/helpers/displayHandler.js +29 -47
- package/dist/factory/helpers/displayHandler.js.map +1 -1
- package/dist/factory/helpers/feedHelpers.js +3 -3
- package/dist/factory/helpers/feedHelpers.js.map +1 -1
- package/dist/factory/helpers/fetchHandler.js +16 -33
- package/dist/factory/helpers/fetchHandler.js.map +1 -1
- package/dist/feeds/academic/index.d.ts +1 -1
- package/dist/feeds/academic/index.d.ts.map +1 -1
- package/dist/feeds/academic/slider.d.ts +1 -2
- package/dist/feeds/academic/slider.d.ts.map +1 -1
- package/dist/feeds/academic/slider.js +7 -6
- package/dist/feeds/academic/slider.js.map +1 -1
- package/dist/feeds/events/grid.d.ts +1 -2
- package/dist/feeds/events/grid.d.ts.map +1 -1
- package/dist/feeds/events/grid.js +22 -21
- package/dist/feeds/events/grid.js.map +1 -1
- package/dist/feeds/events/grouped.d.ts +1 -2
- package/dist/feeds/events/grouped.d.ts.map +1 -1
- package/dist/feeds/events/grouped.js +62 -78
- package/dist/feeds/events/grouped.js.map +1 -1
- package/dist/feeds/events/index.d.ts +4 -4
- package/dist/feeds/events/index.d.ts.map +1 -1
- package/dist/feeds/events/list.d.ts +1 -2
- package/dist/feeds/events/list.d.ts.map +1 -1
- package/dist/feeds/events/list.js +22 -21
- package/dist/feeds/events/list.js.map +1 -1
- package/dist/feeds/events/slider.d.ts +1 -2
- package/dist/feeds/events/slider.d.ts.map +1 -1
- package/dist/feeds/events/slider.js +7 -6
- package/dist/feeds/events/slider.js.map +1 -1
- package/dist/feeds/experts/_types.d.ts +2 -1
- package/dist/feeds/experts/_types.d.ts.map +1 -1
- package/dist/feeds/experts/bio.d.ts +1 -2
- package/dist/feeds/experts/bio.d.ts.map +1 -1
- package/dist/feeds/experts/bio.js +32 -31
- package/dist/feeds/experts/bio.js.map +1 -1
- package/dist/feeds/experts/grid.d.ts +1 -2
- package/dist/feeds/experts/grid.d.ts.map +1 -1
- package/dist/feeds/experts/grid.js +24 -23
- package/dist/feeds/experts/grid.js.map +1 -1
- package/dist/feeds/experts/index.d.ts +3 -3
- package/dist/feeds/experts/index.d.ts.map +1 -1
- package/dist/feeds/experts/list.d.ts +1 -2
- package/dist/feeds/experts/list.d.ts.map +1 -1
- package/dist/feeds/experts/list.js +23 -22
- package/dist/feeds/experts/list.js.map +1 -1
- package/dist/feeds/news/featured.d.ts +1 -2
- package/dist/feeds/news/featured.d.ts.map +1 -1
- package/dist/feeds/news/featured.js +56 -55
- package/dist/feeds/news/featured.js.map +1 -1
- package/dist/feeds/news/grid.d.ts +1 -2
- package/dist/feeds/news/grid.d.ts.map +1 -1
- package/dist/feeds/news/grid.js +24 -23
- package/dist/feeds/news/grid.js.map +1 -1
- package/dist/feeds/news/index.d.ts +3 -3
- package/dist/feeds/news/index.d.ts.map +1 -1
- package/dist/feeds/news/list.d.ts +1 -2
- package/dist/feeds/news/list.d.ts.map +1 -1
- package/dist/feeds/news/list.js +23 -22
- package/dist/feeds/news/list.js.map +1 -1
- package/dist/helpers/events/index.js +4 -4
- package/dist/helpers/events/index.js.map +1 -1
- package/dist/helpers/grouping/events.js +10 -10
- package/dist/helpers/grouping/events.js.map +1 -1
- package/dist/helpers/styles/shadow.js +5 -22
- package/dist/helpers/styles/shadow.js.map +1 -1
- package/dist/index.js +10 -10
- package/dist/index.js.map +1 -1
- package/dist/news.js +8 -8
- package/dist/news.js.map +1 -1
- package/dist/states/_types.d.ts +0 -24
- package/dist/states/_types.d.ts.map +1 -1
- package/dist/states/_types.js +3 -3
- package/dist/states/_types.js.map +1 -1
- package/dist/states/announcer.d.ts +1 -3
- package/dist/states/announcer.d.ts.map +1 -1
- package/dist/states/announcer.js +5 -5
- package/dist/states/announcer.js.map +1 -1
- package/dist/states/empty.d.ts +0 -2
- package/dist/states/empty.d.ts.map +1 -1
- package/dist/states/empty.js +15 -32
- package/dist/states/empty.js.map +1 -1
- package/dist/states/index.d.ts +4 -8
- package/dist/states/index.d.ts.map +1 -1
- package/dist/states/loading.d.ts +1 -3
- package/dist/states/loading.d.ts.map +1 -1
- package/dist/states/loading.js +16 -16
- package/dist/states/loading.js.map +1 -1
- package/dist/states/pagination.d.ts +1 -3
- package/dist/states/pagination.d.ts.map +1 -1
- package/dist/states/pagination.js +11 -28
- package/dist/states/pagination.js.map +1 -1
- package/dist/strategies/display/events.js +13 -13
- package/dist/strategies/display/events.js.map +1 -1
- package/dist/strategies/display/experts.js +23 -23
- package/dist/strategies/display/experts.js.map +1 -1
- package/dist/strategies/display/news.js +13 -13
- package/dist/strategies/display/news.js.map +1 -1
- package/dist/strategies/fetch/academic.js +3 -3
- package/dist/strategies/fetch/academic.js.map +1 -1
- package/dist/strategies/fetch/events.js +13 -13
- package/dist/strategies/fetch/events.js.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 +13 -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 +11 -7
- package/dist/strategies/fetch/graphql.js.map +1 -1
- package/dist/strategies/fetch/news.js +6 -6
- package/dist/strategies/fetch/news.js.map +1 -1
- package/dist/strategies/layout/grid.js +11 -11
- package/dist/strategies/layout/grid.js.map +1 -1
- package/dist/widgets/index.d.ts +1 -1
- package/dist/widgets/index.d.ts.map +1 -1
- package/dist/widgets/slider.d.ts +1 -2
- package/dist/widgets/slider.d.ts.map +1 -1
- package/dist/widgets/slider.js +19 -35
- package/dist/widgets/slider.js.map +1 -1
- package/package.json +15 -14
- package/dist/academic.mjs +0 -5
- package/dist/academic.mjs.map +0 -1
- package/dist/events.mjs +0 -11
- package/dist/events.mjs.map +0 -1
- package/dist/experts.mjs +0 -9
- package/dist/experts.mjs.map +0 -1
- package/dist/factory/core/createBaseFeed.mjs +0 -114
- package/dist/factory/core/createBaseFeed.mjs.map +0 -1
- package/dist/factory/helpers/displayHandler.mjs +0 -169
- package/dist/factory/helpers/displayHandler.mjs.map +0 -1
- package/dist/factory/helpers/feedHelpers.mjs +0 -32
- package/dist/factory/helpers/feedHelpers.mjs.map +0 -1
- package/dist/factory/helpers/fetchHandler.mjs +0 -123
- package/dist/factory/helpers/fetchHandler.mjs.map +0 -1
- package/dist/feeds/academic/slider.mjs +0 -11
- package/dist/feeds/academic/slider.mjs.map +0 -1
- package/dist/feeds/events/grid.mjs +0 -32
- package/dist/feeds/events/grid.mjs.map +0 -1
- package/dist/feeds/events/grouped.mjs +0 -337
- package/dist/feeds/events/grouped.mjs.map +0 -1
- package/dist/feeds/events/list.mjs +0 -33
- package/dist/feeds/events/list.mjs.map +0 -1
- package/dist/feeds/events/slider.mjs +0 -11
- package/dist/feeds/events/slider.mjs.map +0 -1
- package/dist/feeds/experts/bio.mjs +0 -147
- package/dist/feeds/experts/bio.mjs.map +0 -1
- package/dist/feeds/experts/grid.mjs +0 -37
- package/dist/feeds/experts/grid.mjs.map +0 -1
- package/dist/feeds/experts/list.mjs +0 -26
- package/dist/feeds/experts/list.mjs.map +0 -1
- package/dist/feeds/news/featured.mjs +0 -379
- package/dist/feeds/news/featured.mjs.map +0 -1
- package/dist/feeds/news/grid.mjs +0 -37
- package/dist/feeds/news/grid.mjs.map +0 -1
- package/dist/feeds/news/list.mjs +0 -34
- package/dist/feeds/news/list.mjs.map +0 -1
- package/dist/helpers/events/index.mjs +0 -21
- package/dist/helpers/events/index.mjs.map +0 -1
- package/dist/helpers/grouping/events.mjs +0 -147
- package/dist/helpers/grouping/events.mjs.map +0 -1
- package/dist/helpers/styles/shadow.mjs +0 -16
- package/dist/helpers/styles/shadow.mjs.map +0 -1
- package/dist/index.mjs +0 -11
- package/dist/index.mjs.map +0 -1
- package/dist/news.mjs +0 -9
- package/dist/news.mjs.map +0 -1
- package/dist/states/_types.mjs +0 -12
- package/dist/states/_types.mjs.map +0 -1
- package/dist/states/announcer.mjs +0 -62
- package/dist/states/announcer.mjs.map +0 -1
- package/dist/states/empty.mjs +0 -104
- package/dist/states/empty.mjs.map +0 -1
- package/dist/states/loading.mjs +0 -155
- package/dist/states/loading.mjs.map +0 -1
- package/dist/states/pagination.mjs +0 -102
- package/dist/states/pagination.mjs.map +0 -1
- package/dist/strategies/display/events.mjs +0 -60
- package/dist/strategies/display/events.mjs.map +0 -1
- package/dist/strategies/display/experts.mjs +0 -266
- package/dist/strategies/display/experts.mjs.map +0 -1
- package/dist/strategies/display/news.mjs +0 -58
- package/dist/strategies/display/news.mjs.map +0 -1
- package/dist/strategies/fetch/academic.mjs +0 -30
- package/dist/strategies/fetch/academic.mjs.map +0 -1
- package/dist/strategies/fetch/events.mjs +0 -223
- package/dist/strategies/fetch/events.mjs.map +0 -1
- package/dist/strategies/fetch/experts.mjs +0 -189
- package/dist/strategies/fetch/experts.mjs.map +0 -1
- package/dist/strategies/fetch/graphql.mjs +0 -100
- package/dist/strategies/fetch/graphql.mjs.map +0 -1
- package/dist/strategies/fetch/news.mjs +0 -95
- package/dist/strategies/fetch/news.mjs.map +0 -1
- package/dist/strategies/layout/grid.mjs +0 -36
- package/dist/strategies/layout/grid.mjs.map +0 -1
- package/dist/widgets/slider.mjs +0 -87
- package/dist/widgets/slider.mjs.map +0 -1
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const graphql = require("./graphql.js");
|
|
4
|
-
const network = require("@universityofmaryland/web-utilities-library/network");
|
|
1
|
+
import { createGraphQLFetchStrategy } from "./graphql.js";
|
|
2
|
+
import { fetchGraphQL } from "@universityofmaryland/web-utilities-library/network";
|
|
5
3
|
const CALENDARS = ["communications", "submission"];
|
|
6
4
|
function generateFragments() {
|
|
7
5
|
return CALENDARS.map(
|
|
@@ -135,7 +133,7 @@ const EVENTS_SLIDER_QUERY = `
|
|
|
135
133
|
}
|
|
136
134
|
${generateSliderFragments()}
|
|
137
135
|
`;
|
|
138
|
-
const baseFetchStrategy =
|
|
136
|
+
const baseFetchStrategy = createGraphQLFetchStrategy({
|
|
139
137
|
endpoint: "https://calendar.umd.edu/graphql",
|
|
140
138
|
queries: {
|
|
141
139
|
entries: EVENTS_QUERY,
|
|
@@ -164,7 +162,7 @@ const baseFetchStrategy = graphql.createGraphQLFetchStrategy({
|
|
|
164
162
|
});
|
|
165
163
|
async function fetchCategoryNames(categoryIds, token) {
|
|
166
164
|
try {
|
|
167
|
-
const response = await
|
|
165
|
+
const response = await fetchGraphQL({
|
|
168
166
|
url: "https://calendar.umd.edu/graphql",
|
|
169
167
|
query: CATEGORY_NAMES_QUERY,
|
|
170
168
|
token: token || "",
|
|
@@ -183,7 +181,7 @@ const eventsFetchStrategy = {
|
|
|
183
181
|
...baseFetchStrategy,
|
|
184
182
|
fetchCategoryNames
|
|
185
183
|
};
|
|
186
|
-
const baseFetchStrategyRange =
|
|
184
|
+
const baseFetchStrategyRange = createGraphQLFetchStrategy({
|
|
187
185
|
endpoint: "https://calendar.umd.edu/graphql",
|
|
188
186
|
queries: {
|
|
189
187
|
entries: buildEventsQuery("rangeStart"),
|
|
@@ -214,10 +212,12 @@ const eventsFetchStrategyRange = {
|
|
|
214
212
|
...baseFetchStrategyRange,
|
|
215
213
|
fetchCategoryNames
|
|
216
214
|
};
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
215
|
+
export {
|
|
216
|
+
CATEGORY_NAMES_QUERY,
|
|
217
|
+
EVENTS_COUNT_QUERY,
|
|
218
|
+
EVENTS_QUERY,
|
|
219
|
+
EVENTS_SLIDER_QUERY,
|
|
220
|
+
eventsFetchStrategy,
|
|
221
|
+
eventsFetchStrategyRange
|
|
222
|
+
};
|
|
223
223
|
//# sourceMappingURL=events.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sources":["../../../source/strategies/fetch/events.ts"],"sourcesContent":["/**\n * Events Fetch Strategy\n *\n * Strategy for fetching event data from the UMD Calendar GraphQL API.\n *\n * @module strategies/fetch/events\n */\n\nimport { createGraphQLFetchStrategy } from './graphql';\nimport { EventEntry } from 'types/data';\nimport { fetchGraphQL } from '@universityofmaryland/web-utilities-library/network';\n\n/**\n * Calendar types available in the UMD Calendar system\n */\nconst CALENDARS = ['communications', 'submission'] as const;\n\n/**\n * Generate GraphQL fragments for all calendar types\n * Creates type-specific fragments to avoid interface limitations\n */\nfunction generateFragments() {\n return CALENDARS.map(\n (cal) => `\n fragment EventBasicFields_${cal} on ${cal}_Event {\n id\n title\n url\n }\n\n fragment EventDateFields_${cal} on ${cal}_Event {\n startDayOfWeek: startDate @formatDateTime(format: \"D\")\n startMonth: startDate @formatDateTime(format: \"M\")\n startDay: startDate @formatDateTime(format: \"d\")\n startStamp: startDate @formatDateTime(format: \"Y-m-d\")\n startTime: startDate @formatDateTime(format: \"g:ia\")\n endDayOfWeek: endDate @formatDateTime(format: \"D\")\n endMonth: endDate @formatDateTime(format: \"M\")\n endDay: endDate @formatDateTime(format: \"d\")\n endTime: endDate @formatDateTime(format: \"g:ia\")\n allDay\n }\n\n fragment EventContentFields_${cal} on ${cal}_Event {\n summary: commonRichTextTwo\n image: commonAssetHeroImageSingle {\n url\n altText: commonPlainTextTwo\n }\n location: categoriesCampusBuildingSingle {\n title\n }\n }\n\n fragment EventCategoryFields_${cal} on ${cal}_Event {\n categories: categoriesEventAudienceMultiple {\n id\n title\n }\n }\n `,\n ).join('\\n');\n}\n\n/**\n * Generate inline fragment spreads for all calendar types\n * Used in the main query to apply fragments to each calendar type\n */\nfunction generateInlineSpreads() {\n return CALENDARS.map(\n (cal) => `\n ... on ${cal}_Event {\n ...EventBasicFields_${cal}\n ...EventDateFields_${cal}\n ...EventContentFields_${cal}\n ...EventCategoryFields_${cal}\n }\n `,\n ).join('\\n');\n}\n\n/**\n * Generate inline fragment spreads for slider queries\n * Minimal fields for carousel displays\n */\nfunction generateSliderSpreads() {\n return CALENDARS.map(\n (cal) => `\n ... on ${cal}_Event {\n ...EventSliderFields_${cal}\n }\n `,\n ).join('\\n');\n}\n\n/**\n * Generate slider-specific fragments\n */\nfunction generateSliderFragments() {\n return CALENDARS.map(\n (cal) => `\n fragment EventSliderFields_${cal} on ${cal}_Event {\n title\n url\n startMonth: startDate @formatDateTime(format: \"M\")\n startDay: startDate @formatDateTime(format: \"d\")\n endMonth: endDate @formatDateTime(format: \"M\")\n endDay: endDate @formatDateTime(format: \"d\")\n }\n `,\n ).join('\\n');\n}\n\n/**\n * GraphQL queries for events\n */\nconst buildEventsCountQuery = (\n dateFilter: 'startsAfterOrAt' | 'rangeStart' = 'startsAfterOrAt',\n) => `\n query getEventsCount($startDate: String!, $related: [QueryArgument]) {\n count: solspace_calendar {\n events(relatedTo: $related, loadOccurrences: true, ${dateFilter}: $startDate) {\n ... on communications_Event {\n id\n }\n ... on submission_Event {\n id\n }\n }\n }\n }\n`;\n\nconst buildEventsQuery = (\n dateFilter: 'startsAfterOrAt' | 'rangeStart' = 'startsAfterOrAt',\n) => `\n query getEvents($startDate: String!, $related: [QueryArgument], $limit: Int, $offset: Int) {\n entries: solspace_calendar {\n events(\n relatedTo: $related\n loadOccurrences: true\n ${dateFilter}: $startDate\n limit: $limit\n offset: $offset\n ) {\n ${generateInlineSpreads()}\n }\n }\n }\n ${generateFragments()}\n`;\n\nexport const EVENTS_COUNT_QUERY = buildEventsCountQuery();\nexport const EVENTS_QUERY = buildEventsQuery();\n\n/**\n * Query for fetching category names by IDs\n * Queries the categories table directly\n */\nexport const CATEGORY_NAMES_QUERY = `\n query getCategoryNames($ids: [QueryArgument]!) {\n categories(id: $ids) {\n id\n title\n }\n }\n`;\n\n/**\n * Slider-specific query with minimal fields\n * Used by events slider for carousel displays\n */\nexport const EVENTS_SLIDER_QUERY = `\n query getEvents($startDate: String!, $related: [QueryArgument]) {\n entries: solspace_calendar {\n events(\n relatedTo: $related\n loadOccurrences: true\n startsAfterOrAt: $startDate\n limit: 12\n ) {\n ${generateSliderSpreads()}\n }\n }\n }\n ${generateSliderFragments()}\n`;\n\n/**\n * Events fetch strategy\n *\n * Fetches event data from the UMD Calendar GraphQL API.\n * Handles date filtering, category filtering, and pagination.\n *\n * @example\n * ```typescript\n * const feed = createBaseFeed({\n * token: 'my-token',\n * fetchStrategy: eventsFetchStrategy,\n * // ...\n * });\n * ```\n */\nconst baseFetchStrategy = createGraphQLFetchStrategy<EventEntry>({\n endpoint: 'https://calendar.umd.edu/graphql',\n\n queries: {\n entries: EVENTS_QUERY,\n count: EVENTS_COUNT_QUERY,\n },\n\n transformResponse: (data) => {\n if (!data || !data.data || !data.data.entries) {\n return null;\n }\n return data.data.entries.events || null;\n },\n\n transformCount: (data) => {\n if (!data || !data.data || !data.data.count) {\n return 0;\n }\n return data.data.count.events?.length || 0;\n },\n\n composeVariables: (baseVariables) => {\n const { categories, ...rest } = baseVariables;\n\n return {\n ...rest,\n related: categories,\n startDate: new Date().toDateString(),\n };\n },\n});\n\n/**\n * Fetch category names by their IDs\n */\nasync function fetchCategoryNames(\n categoryIds: string[],\n token?: string,\n): Promise<string[] | null> {\n try {\n const response = await fetchGraphQL({\n url: 'https://calendar.umd.edu/graphql',\n query: CATEGORY_NAMES_QUERY,\n token: token || '',\n variables: { ids: categoryIds },\n });\n\n if (!response || !response.data || !response.data.categories) {\n return null;\n }\n\n return response.data.categories.map((category: any) => category.title);\n } catch (error) {\n console.error('Fetch category names error:', error);\n return null;\n }\n}\n\nexport const eventsFetchStrategy = {\n ...baseFetchStrategy,\n fetchCategoryNames,\n};\n\n/**\n * Events fetch strategy for range queries\n *\n * Uses rangeStart filter instead of startsAfterOrAt.\n * Used for grouped event displays.\n */\nconst baseFetchStrategyRange = createGraphQLFetchStrategy<EventEntry>({\n endpoint: 'https://calendar.umd.edu/graphql',\n\n queries: {\n entries: buildEventsQuery('rangeStart'),\n count: buildEventsCountQuery('rangeStart'),\n },\n\n transformResponse: (data) => {\n if (!data || !data.data || !data.data.entries) {\n return null;\n }\n return data.data.entries.events || null;\n },\n\n transformCount: (data) => {\n if (!data || !data.data || !data.data.count) {\n return 0;\n }\n return data.data.count.events?.length || 0;\n },\n\n composeVariables: (baseVariables) => {\n const { categories, ...rest } = baseVariables;\n\n return {\n ...rest,\n related: categories,\n startDate: new Date().toDateString(),\n };\n },\n});\n\nexport const eventsFetchStrategyRange = {\n ...baseFetchStrategyRange,\n fetchCategoryNames,\n};\n"],"names":["createGraphQLFetchStrategy","fetchGraphQL"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"events.js","sources":["../../../source/strategies/fetch/events.ts"],"sourcesContent":["/**\n * Events Fetch Strategy\n *\n * Strategy for fetching event data from the UMD Calendar GraphQL API.\n *\n * @module strategies/fetch/events\n */\n\nimport { createGraphQLFetchStrategy } from './graphql';\nimport { EventEntry } from 'types/data';\nimport { fetchGraphQL } from '@universityofmaryland/web-utilities-library/network';\n\n/**\n * Calendar types available in the UMD Calendar system\n */\nconst CALENDARS = ['communications', 'submission'] as const;\n\n/**\n * Generate GraphQL fragments for all calendar types\n * Creates type-specific fragments to avoid interface limitations\n */\nfunction generateFragments() {\n return CALENDARS.map(\n (cal) => `\n fragment EventBasicFields_${cal} on ${cal}_Event {\n id\n title\n url\n }\n\n fragment EventDateFields_${cal} on ${cal}_Event {\n startDayOfWeek: startDate @formatDateTime(format: \"D\")\n startMonth: startDate @formatDateTime(format: \"M\")\n startDay: startDate @formatDateTime(format: \"d\")\n startStamp: startDate @formatDateTime(format: \"Y-m-d\")\n startTime: startDate @formatDateTime(format: \"g:ia\")\n endDayOfWeek: endDate @formatDateTime(format: \"D\")\n endMonth: endDate @formatDateTime(format: \"M\")\n endDay: endDate @formatDateTime(format: \"d\")\n endTime: endDate @formatDateTime(format: \"g:ia\")\n allDay\n }\n\n fragment EventContentFields_${cal} on ${cal}_Event {\n summary: commonRichTextTwo\n image: commonAssetHeroImageSingle {\n url\n altText: commonPlainTextTwo\n }\n location: categoriesCampusBuildingSingle {\n title\n }\n }\n\n fragment EventCategoryFields_${cal} on ${cal}_Event {\n categories: categoriesEventAudienceMultiple {\n id\n title\n }\n }\n `,\n ).join('\\n');\n}\n\n/**\n * Generate inline fragment spreads for all calendar types\n * Used in the main query to apply fragments to each calendar type\n */\nfunction generateInlineSpreads() {\n return CALENDARS.map(\n (cal) => `\n ... on ${cal}_Event {\n ...EventBasicFields_${cal}\n ...EventDateFields_${cal}\n ...EventContentFields_${cal}\n ...EventCategoryFields_${cal}\n }\n `,\n ).join('\\n');\n}\n\n/**\n * Generate inline fragment spreads for slider queries\n * Minimal fields for carousel displays\n */\nfunction generateSliderSpreads() {\n return CALENDARS.map(\n (cal) => `\n ... on ${cal}_Event {\n ...EventSliderFields_${cal}\n }\n `,\n ).join('\\n');\n}\n\n/**\n * Generate slider-specific fragments\n */\nfunction generateSliderFragments() {\n return CALENDARS.map(\n (cal) => `\n fragment EventSliderFields_${cal} on ${cal}_Event {\n title\n url\n startMonth: startDate @formatDateTime(format: \"M\")\n startDay: startDate @formatDateTime(format: \"d\")\n endMonth: endDate @formatDateTime(format: \"M\")\n endDay: endDate @formatDateTime(format: \"d\")\n }\n `,\n ).join('\\n');\n}\n\n/**\n * GraphQL queries for events\n */\nconst buildEventsCountQuery = (\n dateFilter: 'startsAfterOrAt' | 'rangeStart' = 'startsAfterOrAt',\n) => `\n query getEventsCount($startDate: String!, $related: [QueryArgument]) {\n count: solspace_calendar {\n events(relatedTo: $related, loadOccurrences: true, ${dateFilter}: $startDate) {\n ... on communications_Event {\n id\n }\n ... on submission_Event {\n id\n }\n }\n }\n }\n`;\n\nconst buildEventsQuery = (\n dateFilter: 'startsAfterOrAt' | 'rangeStart' = 'startsAfterOrAt',\n) => `\n query getEvents($startDate: String!, $related: [QueryArgument], $limit: Int, $offset: Int) {\n entries: solspace_calendar {\n events(\n relatedTo: $related\n loadOccurrences: true\n ${dateFilter}: $startDate\n limit: $limit\n offset: $offset\n ) {\n ${generateInlineSpreads()}\n }\n }\n }\n ${generateFragments()}\n`;\n\nexport const EVENTS_COUNT_QUERY = buildEventsCountQuery();\nexport const EVENTS_QUERY = buildEventsQuery();\n\n/**\n * Query for fetching category names by IDs\n * Queries the categories table directly\n */\nexport const CATEGORY_NAMES_QUERY = `\n query getCategoryNames($ids: [QueryArgument]!) {\n categories(id: $ids) {\n id\n title\n }\n }\n`;\n\n/**\n * Slider-specific query with minimal fields\n * Used by events slider for carousel displays\n */\nexport const EVENTS_SLIDER_QUERY = `\n query getEvents($startDate: String!, $related: [QueryArgument]) {\n entries: solspace_calendar {\n events(\n relatedTo: $related\n loadOccurrences: true\n startsAfterOrAt: $startDate\n limit: 12\n ) {\n ${generateSliderSpreads()}\n }\n }\n }\n ${generateSliderFragments()}\n`;\n\n/**\n * Events fetch strategy\n *\n * Fetches event data from the UMD Calendar GraphQL API.\n * Handles date filtering, category filtering, and pagination.\n *\n * @example\n * ```typescript\n * const feed = createBaseFeed({\n * token: 'my-token',\n * fetchStrategy: eventsFetchStrategy,\n * // ...\n * });\n * ```\n */\nconst baseFetchStrategy = createGraphQLFetchStrategy<EventEntry>({\n endpoint: 'https://calendar.umd.edu/graphql',\n\n queries: {\n entries: EVENTS_QUERY,\n count: EVENTS_COUNT_QUERY,\n },\n\n transformResponse: (data) => {\n if (!data || !data.data || !data.data.entries) {\n return null;\n }\n return data.data.entries.events || null;\n },\n\n transformCount: (data) => {\n if (!data || !data.data || !data.data.count) {\n return 0;\n }\n return data.data.count.events?.length || 0;\n },\n\n composeVariables: (baseVariables) => {\n const { categories, ...rest } = baseVariables;\n\n return {\n ...rest,\n related: categories,\n startDate: new Date().toDateString(),\n };\n },\n});\n\n/**\n * Fetch category names by their IDs\n */\nasync function fetchCategoryNames(\n categoryIds: string[],\n token?: string,\n): Promise<string[] | null> {\n try {\n const response = await fetchGraphQL({\n url: 'https://calendar.umd.edu/graphql',\n query: CATEGORY_NAMES_QUERY,\n token: token || '',\n variables: { ids: categoryIds },\n });\n\n if (!response || !response.data || !response.data.categories) {\n return null;\n }\n\n return response.data.categories.map((category: any) => category.title);\n } catch (error) {\n console.error('Fetch category names error:', error);\n return null;\n }\n}\n\nexport const eventsFetchStrategy = {\n ...baseFetchStrategy,\n fetchCategoryNames,\n};\n\n/**\n * Events fetch strategy for range queries\n *\n * Uses rangeStart filter instead of startsAfterOrAt.\n * Used for grouped event displays.\n */\nconst baseFetchStrategyRange = createGraphQLFetchStrategy<EventEntry>({\n endpoint: 'https://calendar.umd.edu/graphql',\n\n queries: {\n entries: buildEventsQuery('rangeStart'),\n count: buildEventsCountQuery('rangeStart'),\n },\n\n transformResponse: (data) => {\n if (!data || !data.data || !data.data.entries) {\n return null;\n }\n return data.data.entries.events || null;\n },\n\n transformCount: (data) => {\n if (!data || !data.data || !data.data.count) {\n return 0;\n }\n return data.data.count.events?.length || 0;\n },\n\n composeVariables: (baseVariables) => {\n const { categories, ...rest } = baseVariables;\n\n return {\n ...rest,\n related: categories,\n startDate: new Date().toDateString(),\n };\n },\n});\n\nexport const eventsFetchStrategyRange = {\n ...baseFetchStrategyRange,\n fetchCategoryNames,\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { ExpertEntry } from '../../types/data';
|
|
2
|
-
export declare const EXPERTS_QUERY = "\n query getExpertsContent($limit: Int, $offset: Int, $id: [QueryArgument], $relatedTo: [QueryArgument]) {\n entryCount(\n section: \"experts\"\n limit: $limit\n offset: $offset\n type: \"expertsContent\"\n id: $id\n relatedTo: $relatedTo\n )\n entries(\n section: \"experts\"\n limit: $limit\n offset: $offset\n type: \"expertsContent\"\n id: $id\n relatedTo: $relatedTo\n orderBy: \"expertsNameLast\"\n ) {\n ...EntriesNativeFields\n ... on expertsContent_Entry {\n ...Content\n ...Categories\n }\n }\n }\n \n fragment EntriesNativeFields on EntryInterface {\n id\n uid\n status\n enabled\n slug\n title\n type: typeHandle\n postDate\n expiryDate\n dateUpdated\n dateCreated\n }\n\n \n fragment CategoryFields on CategoryInterface {\n title\n url\n id\n }\n\n \n fragment Content on expertsContent_Entry {\n ...Name\n ...Imagery\n ...Biography\n organizations: expertsOrganization {\n ...Organizations\n }\n ...Contact\n ...Skills\n }\n\n \n fragment Categories on expertsContent_Entry {\n areasOfExpertise: expertsCategoryAreaOfExpertise {\n ...CategoryFields\n }\n campusUnits: categoryCampusUnit {\n ...CategoryFields\n }\n tags: expertsCategoryTags {\n ...CategoryFields\n }\n }\n\n \n fragment Name on expertsContent_Entry {\n prefix: expertsNamePrefix\n firstName: expertsNameFirst\n middleName: expertsNameMiddle\n lastName: expertsNameLast\n suffix: expertsNameSuffix\n pronouns: expertsNamePronouns\n }\n\n \n fragment Imagery on expertsContent_Entry {\n headshot: expertsImageHeadShot {\n ... on experts_Asset {\n url\n }\n }\n }\n\n \n fragment Biography on expertsContent_Entry {\n summary: expertsSummary {\n html\n }\n bio: expertsBiography {\n html\n }\n }\n\n \n fragment Organizations on expertsOrganization_Entry {\n id\n title\n url\n jobs: expertsOrganizationJob {\n ...Jobs\n }\n }\n\n \n fragment Jobs on expertsOrganizationJob_Entry {\n id\n url\n title: expertsOrganizationJobTitle\n roomNumber: expertsOrganizationJobRoomNumber\n campusUnits: categoryCampusUnit {\n title\n ... on campusUnits_Category {\n link: externalLink {\n url\n }\n }\n }\n }\n\n \n fragment Contact on expertsContent_Entry {\n email: expertsContactEmail\n linkedin: expertsContactLinkedin\n website: expertsContactWebsite\n twitter: expertsContactTwitter\n }\n\n \n fragment Skills on expertsContent_Entry {\n languages: expertsLanguages\n mediaTrained: expertsMediaTrained\n }\n\n";
|
|
2
|
+
export declare const EXPERTS_QUERY = "\n query getExpertsContent($limit: Int, $offset: Int, $id: [QueryArgument], $relatedTo: [QueryArgument], $isMediaTrained:Boolean) {\n entryCount(\n section: \"experts\"\n limit: $limit\n offset: $offset\n type: \"expertsContent\"\n id: $id\n relatedTo: $relatedTo\n expertsMediaTrained: $isMediaTrained\n )\n entries(\n section: \"experts\"\n limit: $limit\n offset: $offset\n type: \"expertsContent\"\n id: $id\n relatedTo: $relatedTo\n expertsMediaTrained: $isMediaTrained\n orderBy: \"expertsNameLast\"\n ) {\n ...EntriesNativeFields\n ... on expertsContent_Entry {\n ...Content\n ...Categories\n }\n }\n }\n \n fragment EntriesNativeFields on EntryInterface {\n id\n uid\n status\n enabled\n slug\n title\n type: typeHandle\n postDate\n expiryDate\n dateUpdated\n dateCreated\n }\n\n \n fragment CategoryFields on CategoryInterface {\n title\n url\n id\n }\n\n \n fragment Content on expertsContent_Entry {\n ...Name\n ...Imagery\n ...Biography\n organizations: expertsOrganization {\n ...Organizations\n }\n ...Contact\n ...Skills\n }\n\n \n fragment Categories on expertsContent_Entry {\n areasOfExpertise: expertsCategoryAreaOfExpertise {\n ...CategoryFields\n }\n campusUnits: categoryCampusUnit {\n ...CategoryFields\n }\n tags: expertsCategoryTags {\n ...CategoryFields\n }\n }\n\n \n fragment Name on expertsContent_Entry {\n prefix: expertsNamePrefix\n firstName: expertsNameFirst\n middleName: expertsNameMiddle\n lastName: expertsNameLast\n suffix: expertsNameSuffix\n pronouns: expertsNamePronouns\n }\n\n \n fragment Imagery on expertsContent_Entry {\n headshot: expertsImageHeadShot {\n ... on experts_Asset {\n url\n }\n }\n }\n\n \n fragment Biography on expertsContent_Entry {\n summary: expertsSummary {\n html\n }\n bio: expertsBiography {\n html\n }\n }\n\n \n fragment Organizations on expertsOrganization_Entry {\n id\n title\n url\n jobs: expertsOrganizationJob {\n ...Jobs\n }\n }\n\n \n fragment Jobs on expertsOrganizationJob_Entry {\n id\n url\n title: expertsOrganizationJobTitle\n roomNumber: expertsOrganizationJobRoomNumber\n campusUnits: categoryCampusUnit {\n title\n ... on campusUnits_Category {\n link: externalLink {\n url\n }\n }\n }\n }\n\n \n fragment Contact on expertsContent_Entry {\n email: expertsContactEmail\n linkedin: expertsContactLinkedin\n website: expertsContactWebsite\n twitter: expertsContactTwitter\n }\n\n \n fragment Skills on expertsContent_Entry {\n languages: expertsLanguages\n mediaTrained: expertsMediaTrained\n }\n\n";
|
|
3
3
|
export declare const expertsFetchStrategy: import('../../factory').FetchStrategy<ExpertEntry, any>;
|
|
4
4
|
//# sourceMappingURL=experts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"experts.d.ts","sourceRoot":"","sources":["../../../source/strategies/fetch/experts.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAwIzC,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"experts.d.ts","sourceRoot":"","sources":["../../../source/strategies/fetch/experts.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAwIzC,eAAO,MAAM,aAAa,s1FAuCzB,CAAC;AAmBF,eAAO,MAAM,oBAAoB,yDA0C/B,CAAC"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const graphql = require("./graphql.js");
|
|
1
|
+
import { createGraphQLFetchStrategy } from "./graphql.js";
|
|
4
2
|
const FRAGMENT_CATEGORIES_NATIVE_FIELDS = `
|
|
5
3
|
fragment CategoryFields on CategoryInterface {
|
|
6
4
|
title
|
|
@@ -118,7 +116,7 @@ const FRAGMENT_EXPERT_CATEGORIES = `
|
|
|
118
116
|
}
|
|
119
117
|
`;
|
|
120
118
|
const EXPERTS_QUERY = `
|
|
121
|
-
query getExpertsContent($limit: Int, $offset: Int, $id: [QueryArgument], $relatedTo: [QueryArgument]) {
|
|
119
|
+
query getExpertsContent($limit: Int, $offset: Int, $id: [QueryArgument], $relatedTo: [QueryArgument], $isMediaTrained:Boolean) {
|
|
122
120
|
entryCount(
|
|
123
121
|
section: "experts"
|
|
124
122
|
limit: $limit
|
|
@@ -126,6 +124,7 @@ const EXPERTS_QUERY = `
|
|
|
126
124
|
type: "expertsContent"
|
|
127
125
|
id: $id
|
|
128
126
|
relatedTo: $relatedTo
|
|
127
|
+
expertsMediaTrained: $isMediaTrained
|
|
129
128
|
)
|
|
130
129
|
entries(
|
|
131
130
|
section: "experts"
|
|
@@ -134,6 +133,7 @@ const EXPERTS_QUERY = `
|
|
|
134
133
|
type: "expertsContent"
|
|
135
134
|
id: $id
|
|
136
135
|
relatedTo: $relatedTo
|
|
136
|
+
expertsMediaTrained: $isMediaTrained
|
|
137
137
|
orderBy: "expertsNameLast"
|
|
138
138
|
) {
|
|
139
139
|
...EntriesNativeFields
|
|
@@ -155,7 +155,7 @@ const EXPERTS_QUERY = `
|
|
|
155
155
|
${FRAGMENT_EXPERT_CONTACT}
|
|
156
156
|
${FRAGMENT_EXPERT_SKILLS}
|
|
157
157
|
`;
|
|
158
|
-
const expertsFetchStrategy =
|
|
158
|
+
const expertsFetchStrategy = createGraphQLFetchStrategy({
|
|
159
159
|
endpoint: "https://umd-api.production.servd.dev/graphql",
|
|
160
160
|
queries: {
|
|
161
161
|
entries: EXPERTS_QUERY
|
|
@@ -173,7 +173,7 @@ const expertsFetchStrategy = graphql.createGraphQLFetchStrategy({
|
|
|
173
173
|
return data.data.entryCount || 0;
|
|
174
174
|
},
|
|
175
175
|
composeVariables: (baseVariables) => {
|
|
176
|
-
const { categories, entriesToRemove, id, ...rest } = baseVariables;
|
|
176
|
+
const { categories, entriesToRemove, id, isMediaTrained, ...rest } = baseVariables;
|
|
177
177
|
const variables = { ...rest };
|
|
178
178
|
if (id) {
|
|
179
179
|
variables.id = Array.isArray(id) ? id : [id];
|
|
@@ -181,9 +181,14 @@ const expertsFetchStrategy = graphql.createGraphQLFetchStrategy({
|
|
|
181
181
|
if (categories) {
|
|
182
182
|
variables.relatedTo = categories;
|
|
183
183
|
}
|
|
184
|
+
if (isMediaTrained) {
|
|
185
|
+
variables.isMediaTrained = isMediaTrained;
|
|
186
|
+
}
|
|
184
187
|
return variables;
|
|
185
188
|
}
|
|
186
189
|
});
|
|
187
|
-
|
|
188
|
-
|
|
190
|
+
export {
|
|
191
|
+
EXPERTS_QUERY,
|
|
192
|
+
expertsFetchStrategy
|
|
193
|
+
};
|
|
189
194
|
//# sourceMappingURL=experts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"experts.js","sources":["../../../source/strategies/fetch/experts.ts"],"sourcesContent":["/**\n * Experts Fetch Strategy\n *\n * Strategy for fetching expert profile data from the UMD Experts GraphQL API.\n *\n * @module strategies/fetch/experts\n */\n\nimport { createGraphQLFetchStrategy } from './graphql';\nimport { ExpertEntry } from 'types/data';\n\n/**\n * GraphQL fragments for expert data\n */\nconst FRAGMENT_CATEGORIES_NATIVE_FIELDS = `\n fragment CategoryFields on CategoryInterface {\n title\n url\n id\n }\n`;\n\nconst FRAGMENT_ENTRIES_NATIVE_FIELDS = `\n fragment EntriesNativeFields on EntryInterface {\n id\n uid\n status\n enabled\n slug\n title\n type: typeHandle\n postDate\n expiryDate\n dateUpdated\n dateCreated\n }\n`;\n\nconst FRAGMENT_EXPERT_JOBS = `\n fragment Jobs on expertsOrganizationJob_Entry {\n id\n url\n title: expertsOrganizationJobTitle\n roomNumber: expertsOrganizationJobRoomNumber\n campusUnits: categoryCampusUnit {\n title\n ... on campusUnits_Category {\n link: externalLink {\n url\n }\n }\n }\n }\n`;\n\nconst FRAGMENT_EXPERT_NAME = `\n fragment Name on expertsContent_Entry {\n prefix: expertsNamePrefix\n firstName: expertsNameFirst\n middleName: expertsNameMiddle\n lastName: expertsNameLast\n suffix: expertsNameSuffix\n pronouns: expertsNamePronouns\n }\n`;\n\nconst FRAGMENT_EXPERT_IMAGERY = `\n fragment Imagery on expertsContent_Entry {\n headshot: expertsImageHeadShot {\n ... on experts_Asset {\n url\n }\n }\n }\n`;\n\nconst FRAGMENT_EXPERT_BIOGRAPHY = `\n fragment Biography on expertsContent_Entry {\n summary: expertsSummary {\n html\n }\n bio: expertsBiography {\n html\n }\n }\n`;\n\nconst FRAGMENT_ENTRIES_ORGANIZATIONS = `\n fragment Organizations on expertsOrganization_Entry {\n id\n title\n url\n jobs: expertsOrganizationJob {\n ...Jobs\n }\n }\n`;\n\nconst FRAGMENT_EXPERT_CONTACT = `\n fragment Contact on expertsContent_Entry {\n email: expertsContactEmail\n linkedin: expertsContactLinkedin\n website: expertsContactWebsite\n twitter: expertsContactTwitter\n }\n`;\n\nconst FRAGMENT_EXPERT_SKILLS = `\n fragment Skills on expertsContent_Entry {\n languages: expertsLanguages\n mediaTrained: expertsMediaTrained\n }\n`;\n\nconst FRAGMENT_EXPERT_CONTENT = `\n fragment Content on expertsContent_Entry {\n ...Name\n ...Imagery\n ...Biography\n organizations: expertsOrganization {\n ...Organizations\n }\n ...Contact\n ...Skills\n }\n`;\n\nconst FRAGMENT_EXPERT_CATEGORIES = `\n fragment Categories on expertsContent_Entry {\n areasOfExpertise: expertsCategoryAreaOfExpertise {\n ...CategoryFields\n }\n campusUnits: categoryCampusUnit {\n ...CategoryFields\n }\n tags: expertsCategoryTags {\n ...CategoryFields\n }\n }\n`;\n\n/**\n * GraphQL query for experts\n * Supports filtering by ID, relatedTo, or fetching all experts\n */\nexport const EXPERTS_QUERY = `\n query getExpertsContent($limit: Int, $offset: Int, $id: [QueryArgument], $relatedTo: [QueryArgument]) {\n entryCount(\n section: \"experts\"\n limit: $limit\n offset: $offset\n type: \"expertsContent\"\n id: $id\n relatedTo: $relatedTo\n )\n entries(\n section: \"experts\"\n limit: $limit\n offset: $offset\n type: \"expertsContent\"\n id: $id\n relatedTo: $relatedTo\n orderBy: \"expertsNameLast\"\n ) {\n ...EntriesNativeFields\n ... on expertsContent_Entry {\n ...Content\n ...Categories\n }\n }\n }\n ${FRAGMENT_ENTRIES_NATIVE_FIELDS}\n ${FRAGMENT_CATEGORIES_NATIVE_FIELDS}\n ${FRAGMENT_EXPERT_CONTENT}\n ${FRAGMENT_EXPERT_CATEGORIES}\n ${FRAGMENT_EXPERT_NAME}\n ${FRAGMENT_EXPERT_IMAGERY}\n ${FRAGMENT_EXPERT_BIOGRAPHY}\n ${FRAGMENT_ENTRIES_ORGANIZATIONS}\n ${FRAGMENT_EXPERT_JOBS}\n ${FRAGMENT_EXPERT_CONTACT}\n ${FRAGMENT_EXPERT_SKILLS}\n`;\n\n/**\n * Experts fetch strategy\n *\n * Fetches expert profile data from the UMD Experts GraphQL API.\n * Handles category filtering via relatedTo parameter, pagination,\n * and entry exclusion.\n *\n * @example\n * ```typescript\n * const feed = createBaseFeed({\n * token: 'my-token',\n * fetchStrategy: expertsFetchStrategy,\n * categories: ['computer-science', 'engineering'],\n * // ...\n * });\n * ```\n */\nexport const expertsFetchStrategy = createGraphQLFetchStrategy<ExpertEntry>({\n endpoint: 'https://umd-api.production.servd.dev/graphql',\n\n queries: {\n entries: EXPERTS_QUERY,\n },\n\n transformResponse: (data) => {\n if (!data || !data.data || !data.data.entries) {\n return null;\n }\n return data.data.entries || null;\n },\n\n transformCount: (data) => {\n if (!data || !data.data) {\n return 0;\n }\n return data.data.entryCount || 0;\n },\n\n composeVariables: (baseVariables) => {\n const { categories, entriesToRemove, id, ...rest }
|
|
1
|
+
{"version":3,"file":"experts.js","sources":["../../../source/strategies/fetch/experts.ts"],"sourcesContent":["/**\n * Experts Fetch Strategy\n *\n * Strategy for fetching expert profile data from the UMD Experts GraphQL API.\n *\n * @module strategies/fetch/experts\n */\n\nimport { createGraphQLFetchStrategy } from './graphql';\nimport { ExpertEntry } from 'types/data';\n\n/**\n * GraphQL fragments for expert data\n */\nconst FRAGMENT_CATEGORIES_NATIVE_FIELDS = `\n fragment CategoryFields on CategoryInterface {\n title\n url\n id\n }\n`;\n\nconst FRAGMENT_ENTRIES_NATIVE_FIELDS = `\n fragment EntriesNativeFields on EntryInterface {\n id\n uid\n status\n enabled\n slug\n title\n type: typeHandle\n postDate\n expiryDate\n dateUpdated\n dateCreated\n }\n`;\n\nconst FRAGMENT_EXPERT_JOBS = `\n fragment Jobs on expertsOrganizationJob_Entry {\n id\n url\n title: expertsOrganizationJobTitle\n roomNumber: expertsOrganizationJobRoomNumber\n campusUnits: categoryCampusUnit {\n title\n ... on campusUnits_Category {\n link: externalLink {\n url\n }\n }\n }\n }\n`;\n\nconst FRAGMENT_EXPERT_NAME = `\n fragment Name on expertsContent_Entry {\n prefix: expertsNamePrefix\n firstName: expertsNameFirst\n middleName: expertsNameMiddle\n lastName: expertsNameLast\n suffix: expertsNameSuffix\n pronouns: expertsNamePronouns\n }\n`;\n\nconst FRAGMENT_EXPERT_IMAGERY = `\n fragment Imagery on expertsContent_Entry {\n headshot: expertsImageHeadShot {\n ... on experts_Asset {\n url\n }\n }\n }\n`;\n\nconst FRAGMENT_EXPERT_BIOGRAPHY = `\n fragment Biography on expertsContent_Entry {\n summary: expertsSummary {\n html\n }\n bio: expertsBiography {\n html\n }\n }\n`;\n\nconst FRAGMENT_ENTRIES_ORGANIZATIONS = `\n fragment Organizations on expertsOrganization_Entry {\n id\n title\n url\n jobs: expertsOrganizationJob {\n ...Jobs\n }\n }\n`;\n\nconst FRAGMENT_EXPERT_CONTACT = `\n fragment Contact on expertsContent_Entry {\n email: expertsContactEmail\n linkedin: expertsContactLinkedin\n website: expertsContactWebsite\n twitter: expertsContactTwitter\n }\n`;\n\nconst FRAGMENT_EXPERT_SKILLS = `\n fragment Skills on expertsContent_Entry {\n languages: expertsLanguages\n mediaTrained: expertsMediaTrained\n }\n`;\n\nconst FRAGMENT_EXPERT_CONTENT = `\n fragment Content on expertsContent_Entry {\n ...Name\n ...Imagery\n ...Biography\n organizations: expertsOrganization {\n ...Organizations\n }\n ...Contact\n ...Skills\n }\n`;\n\nconst FRAGMENT_EXPERT_CATEGORIES = `\n fragment Categories on expertsContent_Entry {\n areasOfExpertise: expertsCategoryAreaOfExpertise {\n ...CategoryFields\n }\n campusUnits: categoryCampusUnit {\n ...CategoryFields\n }\n tags: expertsCategoryTags {\n ...CategoryFields\n }\n }\n`;\n\n/**\n * GraphQL query for experts\n * Supports filtering by ID, relatedTo, or fetching all experts\n */\nexport const EXPERTS_QUERY = `\n query getExpertsContent($limit: Int, $offset: Int, $id: [QueryArgument], $relatedTo: [QueryArgument], $isMediaTrained:Boolean) {\n entryCount(\n section: \"experts\"\n limit: $limit\n offset: $offset\n type: \"expertsContent\"\n id: $id\n relatedTo: $relatedTo\n expertsMediaTrained: $isMediaTrained\n )\n entries(\n section: \"experts\"\n limit: $limit\n offset: $offset\n type: \"expertsContent\"\n id: $id\n relatedTo: $relatedTo\n expertsMediaTrained: $isMediaTrained\n orderBy: \"expertsNameLast\"\n ) {\n ...EntriesNativeFields\n ... on expertsContent_Entry {\n ...Content\n ...Categories\n }\n }\n }\n ${FRAGMENT_ENTRIES_NATIVE_FIELDS}\n ${FRAGMENT_CATEGORIES_NATIVE_FIELDS}\n ${FRAGMENT_EXPERT_CONTENT}\n ${FRAGMENT_EXPERT_CATEGORIES}\n ${FRAGMENT_EXPERT_NAME}\n ${FRAGMENT_EXPERT_IMAGERY}\n ${FRAGMENT_EXPERT_BIOGRAPHY}\n ${FRAGMENT_ENTRIES_ORGANIZATIONS}\n ${FRAGMENT_EXPERT_JOBS}\n ${FRAGMENT_EXPERT_CONTACT}\n ${FRAGMENT_EXPERT_SKILLS}\n`;\n\n/**\n * Experts fetch strategy\n *\n * Fetches expert profile data from the UMD Experts GraphQL API.\n * Handles category filtering via relatedTo parameter, pagination,\n * and entry exclusion.\n *\n * @example\n * ```typescript\n * const feed = createBaseFeed({\n * token: 'my-token',\n * fetchStrategy: expertsFetchStrategy,\n * categories: ['computer-science', 'engineering'],\n * // ...\n * });\n * ```\n */\nexport const expertsFetchStrategy = createGraphQLFetchStrategy<ExpertEntry>({\n endpoint: 'https://umd-api.production.servd.dev/graphql',\n\n queries: {\n entries: EXPERTS_QUERY,\n },\n\n transformResponse: (data) => {\n if (!data || !data.data || !data.data.entries) {\n return null;\n }\n return data.data.entries || null;\n },\n\n transformCount: (data) => {\n if (!data || !data.data) {\n return 0;\n }\n return data.data.entryCount || 0;\n },\n\n composeVariables: (baseVariables) => {\n const { categories, entriesToRemove, id, isMediaTrained, ...rest } =\n baseVariables;\n\n const variables: any = { ...rest };\n\n // Handle fetching by ID (for single expert bio)\n if (id) {\n variables.id = Array.isArray(id) ? id : [id];\n }\n\n if (categories) {\n variables.relatedTo = categories;\n }\n\n if (isMediaTrained) {\n variables.isMediaTrained = isMediaTrained;\n }\n\n return variables;\n },\n});\n"],"names":[],"mappings":";AAcA,MAAM,oCAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ1C,MAAM,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBvC,MAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiB7B,MAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAW7B,MAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUhC,MAAM,4BAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWlC,MAAM,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWvC,MAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAShC,MAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAO/B,MAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAahC,MAAM,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB5B,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA4BzB,8BAA8B;AAAA,IAC9B,iCAAiC;AAAA,IACjC,uBAAuB;AAAA,IACvB,0BAA0B;AAAA,IAC1B,oBAAoB;AAAA,IACpB,uBAAuB;AAAA,IACvB,yBAAyB;AAAA,IACzB,8BAA8B;AAAA,IAC9B,oBAAoB;AAAA,IACpB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA;AAoBnB,MAAM,uBAAuB,2BAAwC;AAAA,EAC1E,UAAU;AAAA,EAEV,SAAS;AAAA,IACP,SAAS;AAAA,EAAA;AAAA,EAGX,mBAAmB,CAAC,SAAS;AAC3B,QAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,KAAK,KAAK,SAAS;AAC7C,aAAO;AAAA,IACT;AACA,WAAO,KAAK,KAAK,WAAW;AAAA,EAC9B;AAAA,EAEA,gBAAgB,CAAC,SAAS;AACxB,QAAI,CAAC,QAAQ,CAAC,KAAK,MAAM;AACvB,aAAO;AAAA,IACT;AACA,WAAO,KAAK,KAAK,cAAc;AAAA,EACjC;AAAA,EAEA,kBAAkB,CAAC,kBAAkB;AACnC,UAAM,EAAE,YAAY,iBAAiB,IAAI,gBAAgB,GAAG,SAC1D;AAEF,UAAM,YAAiB,EAAE,GAAG,KAAA;AAG5B,QAAI,IAAI;AACN,gBAAU,KAAK,MAAM,QAAQ,EAAE,IAAI,KAAK,CAAC,EAAE;AAAA,IAC7C;AAEA,QAAI,YAAY;AACd,gBAAU,YAAY;AAAA,IACxB;AAEA,QAAI,gBAAgB;AAClB,gBAAU,iBAAiB;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT;AACF,CAAC;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../../source/strategies/fetch/graphql.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAKzD,MAAM,WAAW,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,GAAG;IAExD,QAAQ,EAAE,MAAM,CAAC;IAGjB,OAAO,EAAE;QAEP,OAAO,EAAE,MAAM,CAAC;QAEhB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAGF,iBAAiB,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,KAAK,EAAE,GAAG,IAAI,CAAC;IAGvD,cAAc,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,MAAM,CAAC;IAG5C,gBAAgB,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,KAAK,GAAG,CAAC;CAChD;AA+BD,wBAAgB,0BAA0B,CACxC,KAAK,EACL,SAAS,GAAG,GAAG,EACf,UAAU,GAAG,GAAG,EAEhB,MAAM,EAAE,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,GAC3C,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../../source/strategies/fetch/graphql.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAKzD,MAAM,WAAW,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,GAAG;IAExD,QAAQ,EAAE,MAAM,CAAC;IAGjB,OAAO,EAAE;QAEP,OAAO,EAAE,MAAM,CAAC;QAEhB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAGF,iBAAiB,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,KAAK,EAAE,GAAG,IAAI,CAAC;IAGvD,cAAc,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,MAAM,CAAC;IAG5C,gBAAgB,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,KAAK,GAAG,CAAC;CAChD;AA+BD,wBAAgB,0BAA0B,CACxC,KAAK,EACL,SAAS,GAAG,GAAG,EACf,UAAU,GAAG,GAAG,EAEhB,MAAM,EAAE,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,GAC3C,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CA6HlC"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const network = require("@universityofmaryland/web-utilities-library/network");
|
|
1
|
+
import { fetchGraphQL } from "@universityofmaryland/web-utilities-library/network";
|
|
4
2
|
function createGraphQLFetchStrategy(config) {
|
|
5
3
|
const {
|
|
6
4
|
endpoint,
|
|
@@ -16,7 +14,7 @@ function createGraphQLFetchStrategy(config) {
|
|
|
16
14
|
fetchCount: async (variables) => {
|
|
17
15
|
try {
|
|
18
16
|
const query = queries.count || queries.entries;
|
|
19
|
-
const response = await
|
|
17
|
+
const response = await fetchGraphQL({
|
|
20
18
|
url: endpoint,
|
|
21
19
|
query,
|
|
22
20
|
token: variables.token,
|
|
@@ -39,7 +37,7 @@ function createGraphQLFetchStrategy(config) {
|
|
|
39
37
|
*/
|
|
40
38
|
fetchEntries: async (variables) => {
|
|
41
39
|
try {
|
|
42
|
-
const response = await
|
|
40
|
+
const response = await fetchGraphQL({
|
|
43
41
|
url: endpoint,
|
|
44
42
|
query: queries.entries,
|
|
45
43
|
token: variables.token,
|
|
@@ -68,7 +66,8 @@ function createGraphQLFetchStrategy(config) {
|
|
|
68
66
|
numberOfRowsToStart,
|
|
69
67
|
getOffset,
|
|
70
68
|
entriesToRemove,
|
|
71
|
-
id
|
|
69
|
+
id,
|
|
70
|
+
isMediaTrained
|
|
72
71
|
} = props;
|
|
73
72
|
const baseVariables = {
|
|
74
73
|
token,
|
|
@@ -84,6 +83,9 @@ function createGraphQLFetchStrategy(config) {
|
|
|
84
83
|
if (id) {
|
|
85
84
|
baseVariables.id = id;
|
|
86
85
|
}
|
|
86
|
+
if (isMediaTrained !== void 0) {
|
|
87
|
+
baseVariables.isMediaTrained = isMediaTrained;
|
|
88
|
+
}
|
|
87
89
|
if (composeVariables) {
|
|
88
90
|
return composeVariables(baseVariables);
|
|
89
91
|
}
|
|
@@ -96,5 +98,7 @@ function createGraphQLFetchStrategy(config) {
|
|
|
96
98
|
}
|
|
97
99
|
};
|
|
98
100
|
}
|
|
99
|
-
|
|
101
|
+
export {
|
|
102
|
+
createGraphQLFetchStrategy
|
|
103
|
+
};
|
|
100
104
|
//# sourceMappingURL=graphql.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql.js","sources":["../../../source/strategies/fetch/graphql.ts"],"sourcesContent":["/**\n * GraphQL Fetch Strategy Factory\n *\n * Generic factory for creating GraphQL-based fetch strategies.\n * Handles common GraphQL patterns: queries, variables, transformations.\n *\n * @module strategies/fetch/graphql\n */\n\nimport {\n fetchGraphQL,\n GraphQLVariables,\n} from '@universityofmaryland/web-utilities-library/network';\nimport { FetchStrategy } from '../../factory/core/types';\n\n/**\n * Configuration for creating a GraphQL fetch strategy\n */\nexport interface GraphQLFetchConfig<TData, TResponse = any> {\n /** GraphQL endpoint URL */\n endpoint: string;\n\n /** GraphQL queries */\n queries: {\n /** Query for fetching entries */\n entries: string;\n /** Optional separate query for count (if not in entries query) */\n count?: string;\n };\n\n /** Transform GraphQL response to entries array */\n transformResponse: (data: TResponse) => TData[] | null;\n\n /** Transform GraphQL response to count */\n transformCount: (data: TResponse) => number;\n\n /** Optional: Compose additional variables */\n composeVariables?: (baseVariables: any) => any;\n}\n\n/**\n * Create a GraphQL fetch strategy\n *\n * This factory handles the common patterns for GraphQL APIs:\n * - Fetching with variables\n * - Response transformation\n * - Count vs entries queries\n * - Error handling\n *\n * @template TData - The type of entry data\n * @template TResponse - The type of raw GraphQL response\n * @template TVariables - The type of GraphQL variables\n *\n * @param config - Configuration for the strategy\n * @returns Fetch strategy for use with createBaseFeed\n *\n * @example\n * ```typescript\n * const eventsFetchStrategy = createGraphQLFetchStrategy({\n * endpoint: 'https://calendar.umd.edu/graphql',\n * queries: {\n * entries: EVENTS_QUERY,\n * count: EVENTS_COUNT_QUERY,\n * },\n * transformResponse: (data) => data?.data?.entries?.events || null,\n * transformCount: (data) => data?.data?.count?.events?.length || 0,\n * });\n * ```\n */\nexport function createGraphQLFetchStrategy<\n TData,\n TResponse = any,\n TVariables = any,\n>(\n config: GraphQLFetchConfig<TData, TResponse>,\n): FetchStrategy<TData, TVariables> {\n const {\n endpoint,\n queries,\n transformResponse,\n transformCount,\n composeVariables,\n } = config;\n\n return {\n /**\n * Fetch the total count of entries\n */\n fetchCount: async (variables: TVariables): Promise<number | null> => {\n try {\n // Use count query if provided, otherwise use entries query\n const query = queries.count || queries.entries;\n const response = await fetchGraphQL({\n url: endpoint,\n query,\n token: (variables as any).token,\n variables: variables as GraphQLVariables,\n });\n\n // Check for errors\n if (!response || !response.data || response.message) {\n if (response?.message) {\n console.error(`GraphQL Error: ${response.message}`);\n }\n return null;\n }\n\n return transformCount(response);\n } catch (error) {\n console.error('Fetch count error:', error);\n return null;\n }\n },\n\n /**\n * Fetch the actual entries\n */\n fetchEntries: async (variables: TVariables): Promise<TData[] | null> => {\n try {\n const response = await fetchGraphQL({\n url: endpoint,\n query: queries.entries,\n token: (variables as any).token,\n variables: variables as GraphQLVariables,\n });\n\n // Check for errors\n if (!response || !response.data || response.message) {\n if (response?.message) {\n console.error(`GraphQL Error: ${response.message}`);\n }\n return null;\n }\n\n return transformResponse(response);\n } catch (error) {\n console.error('Fetch entries error:', error);\n return null;\n }\n },\n\n /**\n * Compose API variables from feed props\n */\n composeApiVariables: (props: any): TVariables => {\n const {\n token,\n categories,\n numberOfColumnsToShow = 1,\n numberOfRowsToStart,\n getOffset,\n entriesToRemove,\n id,\n } = props;\n\n // Base variables - pass all props through\n const baseVariables: any = {\n token,\n limit: numberOfColumnsToShow * numberOfRowsToStart,\n offset: getOffset ? getOffset() : 0,\n };\n\n // Pass categories through (let composeVariables decide how to map it)\n if (categories) {\n baseVariables.categories = categories;\n }\n\n // Pass entriesToRemove through\n if (entriesToRemove) {\n baseVariables.entriesToRemove = entriesToRemove;\n }\n\n // Pass id through\n if (id) {\n baseVariables.id = id;\n }\n\n // Allow custom variable composition\n if (composeVariables) {\n return composeVariables(baseVariables);\n }\n\n // Default mapping (for strategies without custom composeVariables)\n const defaultVariables: any = { ...baseVariables };\n\n // Default: map categories to 'related' if not customized\n if (categories) {\n defaultVariables.related = categories;\n delete defaultVariables.categories;\n }\n\n return defaultVariables as TVariables;\n },\n };\n}\n"],"names":[
|
|
1
|
+
{"version":3,"file":"graphql.js","sources":["../../../source/strategies/fetch/graphql.ts"],"sourcesContent":["/**\n * GraphQL Fetch Strategy Factory\n *\n * Generic factory for creating GraphQL-based fetch strategies.\n * Handles common GraphQL patterns: queries, variables, transformations.\n *\n * @module strategies/fetch/graphql\n */\n\nimport {\n fetchGraphQL,\n GraphQLVariables,\n} from '@universityofmaryland/web-utilities-library/network';\nimport { FetchStrategy } from '../../factory/core/types';\n\n/**\n * Configuration for creating a GraphQL fetch strategy\n */\nexport interface GraphQLFetchConfig<TData, TResponse = any> {\n /** GraphQL endpoint URL */\n endpoint: string;\n\n /** GraphQL queries */\n queries: {\n /** Query for fetching entries */\n entries: string;\n /** Optional separate query for count (if not in entries query) */\n count?: string;\n };\n\n /** Transform GraphQL response to entries array */\n transformResponse: (data: TResponse) => TData[] | null;\n\n /** Transform GraphQL response to count */\n transformCount: (data: TResponse) => number;\n\n /** Optional: Compose additional variables */\n composeVariables?: (baseVariables: any) => any;\n}\n\n/**\n * Create a GraphQL fetch strategy\n *\n * This factory handles the common patterns for GraphQL APIs:\n * - Fetching with variables\n * - Response transformation\n * - Count vs entries queries\n * - Error handling\n *\n * @template TData - The type of entry data\n * @template TResponse - The type of raw GraphQL response\n * @template TVariables - The type of GraphQL variables\n *\n * @param config - Configuration for the strategy\n * @returns Fetch strategy for use with createBaseFeed\n *\n * @example\n * ```typescript\n * const eventsFetchStrategy = createGraphQLFetchStrategy({\n * endpoint: 'https://calendar.umd.edu/graphql',\n * queries: {\n * entries: EVENTS_QUERY,\n * count: EVENTS_COUNT_QUERY,\n * },\n * transformResponse: (data) => data?.data?.entries?.events || null,\n * transformCount: (data) => data?.data?.count?.events?.length || 0,\n * });\n * ```\n */\nexport function createGraphQLFetchStrategy<\n TData,\n TResponse = any,\n TVariables = any,\n>(\n config: GraphQLFetchConfig<TData, TResponse>,\n): FetchStrategy<TData, TVariables> {\n const {\n endpoint,\n queries,\n transformResponse,\n transformCount,\n composeVariables,\n } = config;\n\n return {\n /**\n * Fetch the total count of entries\n */\n fetchCount: async (variables: TVariables): Promise<number | null> => {\n try {\n // Use count query if provided, otherwise use entries query\n const query = queries.count || queries.entries;\n const response = await fetchGraphQL({\n url: endpoint,\n query,\n token: (variables as any).token,\n variables: variables as GraphQLVariables,\n });\n\n // Check for errors\n if (!response || !response.data || response.message) {\n if (response?.message) {\n console.error(`GraphQL Error: ${response.message}`);\n }\n return null;\n }\n\n return transformCount(response);\n } catch (error) {\n console.error('Fetch count error:', error);\n return null;\n }\n },\n\n /**\n * Fetch the actual entries\n */\n fetchEntries: async (variables: TVariables): Promise<TData[] | null> => {\n try {\n const response = await fetchGraphQL({\n url: endpoint,\n query: queries.entries,\n token: (variables as any).token,\n variables: variables as GraphQLVariables,\n });\n\n // Check for errors\n if (!response || !response.data || response.message) {\n if (response?.message) {\n console.error(`GraphQL Error: ${response.message}`);\n }\n return null;\n }\n\n return transformResponse(response);\n } catch (error) {\n console.error('Fetch entries error:', error);\n return null;\n }\n },\n\n /**\n * Compose API variables from feed props\n */\n composeApiVariables: (props: any): TVariables => {\n const {\n token,\n categories,\n numberOfColumnsToShow = 1,\n numberOfRowsToStart,\n getOffset,\n entriesToRemove,\n id,\n isMediaTrained,\n } = props;\n\n // Base variables - pass all props through\n const baseVariables: any = {\n token,\n limit: numberOfColumnsToShow * numberOfRowsToStart,\n offset: getOffset ? getOffset() : 0,\n };\n\n // Pass categories through (let composeVariables decide how to map it)\n if (categories) {\n baseVariables.categories = categories;\n }\n\n // Pass entriesToRemove through\n if (entriesToRemove) {\n baseVariables.entriesToRemove = entriesToRemove;\n }\n\n // Pass id through\n if (id) {\n baseVariables.id = id;\n }\n\n // Pass isMediaTrained through (can be true, false, or null)\n if (isMediaTrained !== undefined) {\n baseVariables.isMediaTrained = isMediaTrained;\n }\n\n // Allow custom variable composition\n if (composeVariables) {\n return composeVariables(baseVariables);\n }\n\n // Default mapping (for strategies without custom composeVariables)\n const defaultVariables: any = { ...baseVariables };\n\n // Default: map categories to 'related' if not customized\n if (categories) {\n defaultVariables.related = categories;\n delete defaultVariables.categories;\n }\n\n return defaultVariables as TVariables;\n },\n };\n}\n"],"names":[],"mappings":";AAqEO,SAAS,2BAKd,QACkC;AAClC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL,YAAY,OAAO,cAAkD;AACnE,UAAI;AAEF,cAAM,QAAQ,QAAQ,SAAS,QAAQ;AACvC,cAAM,WAAW,MAAM,aAAa;AAAA,UAClC,KAAK;AAAA,UACL;AAAA,UACA,OAAQ,UAAkB;AAAA,UAC1B;AAAA,QAAA,CACD;AAGD,YAAI,CAAC,YAAY,CAAC,SAAS,QAAQ,SAAS,SAAS;AACnD,cAAI,UAAU,SAAS;AACrB,oBAAQ,MAAM,kBAAkB,SAAS,OAAO,EAAE;AAAA,UACpD;AACA,iBAAO;AAAA,QACT;AAEA,eAAO,eAAe,QAAQ;AAAA,MAChC,SAAS,OAAO;AACd,gBAAQ,MAAM,sBAAsB,KAAK;AACzC,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKA,cAAc,OAAO,cAAmD;AACtE,UAAI;AACF,cAAM,WAAW,MAAM,aAAa;AAAA,UAClC,KAAK;AAAA,UACL,OAAO,QAAQ;AAAA,UACf,OAAQ,UAAkB;AAAA,UAC1B;AAAA,QAAA,CACD;AAGD,YAAI,CAAC,YAAY,CAAC,SAAS,QAAQ,SAAS,SAAS;AACnD,cAAI,UAAU,SAAS;AACrB,oBAAQ,MAAM,kBAAkB,SAAS,OAAO,EAAE;AAAA,UACpD;AACA,iBAAO;AAAA,QACT;AAEA,eAAO,kBAAkB,QAAQ;AAAA,MACnC,SAAS,OAAO;AACd,gBAAQ,MAAM,wBAAwB,KAAK;AAC3C,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKA,qBAAqB,CAAC,UAA2B;AAC/C,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA,wBAAwB;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,IACE;AAGJ,YAAM,gBAAqB;AAAA,QACzB;AAAA,QACA,OAAO,wBAAwB;AAAA,QAC/B,QAAQ,YAAY,cAAc;AAAA,MAAA;AAIpC,UAAI,YAAY;AACd,sBAAc,aAAa;AAAA,MAC7B;AAGA,UAAI,iBAAiB;AACnB,sBAAc,kBAAkB;AAAA,MAClC;AAGA,UAAI,IAAI;AACN,sBAAc,KAAK;AAAA,MACrB;AAGA,UAAI,mBAAmB,QAAW;AAChC,sBAAc,iBAAiB;AAAA,MACjC;AAGA,UAAI,kBAAkB;AACpB,eAAO,iBAAiB,aAAa;AAAA,MACvC;AAGA,YAAM,mBAAwB,EAAE,GAAG,cAAA;AAGnC,UAAI,YAAY;AACd,yBAAiB,UAAU;AAC3B,eAAO,iBAAiB;AAAA,MAC1B;AAEA,aAAO;AAAA,IACT;AAAA,EAAA;AAEJ;"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const graphql = require("./graphql.js");
|
|
1
|
+
import { createGraphQLFetchStrategy } from "./graphql.js";
|
|
4
2
|
const FRAGMENT_ARTICLE_BASIC = `
|
|
5
3
|
fragment ArticleBasicFields on articles_today_Entry {
|
|
6
4
|
id
|
|
@@ -58,7 +56,7 @@ const ARTICLES_QUERY = `
|
|
|
58
56
|
${FRAGMENT_ARTICLE_CONTENT}
|
|
59
57
|
${FRAGMENT_ARTICLE_CATEGORIES}
|
|
60
58
|
`;
|
|
61
|
-
const newsFetchStrategy =
|
|
59
|
+
const newsFetchStrategy = createGraphQLFetchStrategy({
|
|
62
60
|
endpoint: "https://today.umd.edu/graphql",
|
|
63
61
|
queries: {
|
|
64
62
|
entries: ARTICLES_QUERY
|
|
@@ -90,6 +88,8 @@ const newsFetchStrategy = graphql.createGraphQLFetchStrategy({
|
|
|
90
88
|
return variables;
|
|
91
89
|
}
|
|
92
90
|
});
|
|
93
|
-
|
|
94
|
-
|
|
91
|
+
export {
|
|
92
|
+
ARTICLES_QUERY,
|
|
93
|
+
newsFetchStrategy
|
|
94
|
+
};
|
|
95
95
|
//# sourceMappingURL=news.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"news.js","sources":["../../../source/strategies/fetch/news.ts"],"sourcesContent":["/**\n * News Fetch Strategy\n *\n * Strategy for fetching news article data from the Maryland Today GraphQL API.\n *\n * @module strategies/fetch/news\n */\n\nimport { createGraphQLFetchStrategy } from './graphql';\nimport { NewsEntry } from 'types/data';\n\n/**\n * GraphQL fragments for news article data\n */\nconst FRAGMENT_ARTICLE_BASIC = `\n fragment ArticleBasicFields on articles_today_Entry {\n id\n title\n url\n }\n`;\n\nconst FRAGMENT_ARTICLE_DATES = `\n fragment ArticleDateFields on articles_today_Entry {\n date: postDate\n dateFormatted: postDate @formatDateTime(format: \"M d, Y\")\n }\n`;\n\nconst FRAGMENT_ARTICLE_CONTENT = `\n fragment ArticleContentFields on articles_today_Entry {\n summary: genericText\n image: articlesHeroImage {\n url\n ... on hero_Asset {\n id\n altText: genericText\n }\n }\n }\n`;\n\nconst FRAGMENT_ARTICLE_CATEGORIES = `\n fragment ArticleCategoryFields on articles_today_Entry {\n categories: categoryTodaySectionMultiple {\n title\n url\n }\n }\n`;\n\n/**\n * GraphQL query for news articles\n */\nexport const ARTICLES_QUERY = `\n query getArticles($related: [QueryArgument], $relatedToAll: [QueryArgument], $limit: Int, $offset: Int, $not: [QueryArgument]) {\n entryCount(section: \"articles\", relatedTo: $related, relatedToAll: $relatedToAll)\n entries(\n section: \"articles\",\n relatedTo: $related,\n relatedToAll: $relatedToAll,\n limit: $limit,\n offset: $offset,\n id: $not\n ) {\n ... on articles_today_Entry {\n ...ArticleBasicFields\n ...ArticleDateFields\n ...ArticleContentFields\n ...ArticleCategoryFields\n }\n }\n }\n ${FRAGMENT_ARTICLE_BASIC}\n ${FRAGMENT_ARTICLE_DATES}\n ${FRAGMENT_ARTICLE_CONTENT}\n ${FRAGMENT_ARTICLE_CATEGORIES}\n`;\n\n/**\n * News fetch strategy\n *\n * Fetches news article data from the Maryland Today GraphQL API.\n * Handles category filtering (both union and intersection), pagination,\n * and entry exclusion.\n *\n * @example\n * ```typescript\n * const feed = createBaseFeed({\n * token: 'my-token',\n * fetchStrategy: newsFetchStrategy,\n * categories: ['research', 'campus-news'],\n * // ...\n * });\n * ```\n */\nexport const newsFetchStrategy = createGraphQLFetchStrategy<NewsEntry>({\n endpoint: 'https://today.umd.edu/graphql',\n\n queries: {\n entries: ARTICLES_QUERY,\n },\n\n transformResponse: (data) => {\n if (!data || !data.data || !data.data.entries) {\n return null;\n }\n return data.data.entries || null;\n },\n\n transformCount: (data) => {\n if (!data || !data.data) {\n return 0;\n }\n return data.data.entryCount || 0;\n },\n\n composeVariables: (baseVariables) => {\n const { categories, isUnion, entriesToRemove, ...rest } = baseVariables;\n\n const variables: any = { ...rest };\n\n // Handle categories (union vs intersection)\n if (!isUnion && categories) {\n variables.relatedToAll = categories;\n }\n\n if (isUnion && categories) {\n variables.related = categories;\n }\n\n // Handle entry exclusion\n if (entriesToRemove) {\n variables.not = ['not', ...entriesToRemove];\n }\n\n return variables;\n },\n});\n"],"names":[
|
|
1
|
+
{"version":3,"file":"news.js","sources":["../../../source/strategies/fetch/news.ts"],"sourcesContent":["/**\n * News Fetch Strategy\n *\n * Strategy for fetching news article data from the Maryland Today GraphQL API.\n *\n * @module strategies/fetch/news\n */\n\nimport { createGraphQLFetchStrategy } from './graphql';\nimport { NewsEntry } from 'types/data';\n\n/**\n * GraphQL fragments for news article data\n */\nconst FRAGMENT_ARTICLE_BASIC = `\n fragment ArticleBasicFields on articles_today_Entry {\n id\n title\n url\n }\n`;\n\nconst FRAGMENT_ARTICLE_DATES = `\n fragment ArticleDateFields on articles_today_Entry {\n date: postDate\n dateFormatted: postDate @formatDateTime(format: \"M d, Y\")\n }\n`;\n\nconst FRAGMENT_ARTICLE_CONTENT = `\n fragment ArticleContentFields on articles_today_Entry {\n summary: genericText\n image: articlesHeroImage {\n url\n ... on hero_Asset {\n id\n altText: genericText\n }\n }\n }\n`;\n\nconst FRAGMENT_ARTICLE_CATEGORIES = `\n fragment ArticleCategoryFields on articles_today_Entry {\n categories: categoryTodaySectionMultiple {\n title\n url\n }\n }\n`;\n\n/**\n * GraphQL query for news articles\n */\nexport const ARTICLES_QUERY = `\n query getArticles($related: [QueryArgument], $relatedToAll: [QueryArgument], $limit: Int, $offset: Int, $not: [QueryArgument]) {\n entryCount(section: \"articles\", relatedTo: $related, relatedToAll: $relatedToAll)\n entries(\n section: \"articles\",\n relatedTo: $related,\n relatedToAll: $relatedToAll,\n limit: $limit,\n offset: $offset,\n id: $not\n ) {\n ... on articles_today_Entry {\n ...ArticleBasicFields\n ...ArticleDateFields\n ...ArticleContentFields\n ...ArticleCategoryFields\n }\n }\n }\n ${FRAGMENT_ARTICLE_BASIC}\n ${FRAGMENT_ARTICLE_DATES}\n ${FRAGMENT_ARTICLE_CONTENT}\n ${FRAGMENT_ARTICLE_CATEGORIES}\n`;\n\n/**\n * News fetch strategy\n *\n * Fetches news article data from the Maryland Today GraphQL API.\n * Handles category filtering (both union and intersection), pagination,\n * and entry exclusion.\n *\n * @example\n * ```typescript\n * const feed = createBaseFeed({\n * token: 'my-token',\n * fetchStrategy: newsFetchStrategy,\n * categories: ['research', 'campus-news'],\n * // ...\n * });\n * ```\n */\nexport const newsFetchStrategy = createGraphQLFetchStrategy<NewsEntry>({\n endpoint: 'https://today.umd.edu/graphql',\n\n queries: {\n entries: ARTICLES_QUERY,\n },\n\n transformResponse: (data) => {\n if (!data || !data.data || !data.data.entries) {\n return null;\n }\n return data.data.entries || null;\n },\n\n transformCount: (data) => {\n if (!data || !data.data) {\n return 0;\n }\n return data.data.entryCount || 0;\n },\n\n composeVariables: (baseVariables) => {\n const { categories, isUnion, entriesToRemove, ...rest } = baseVariables;\n\n const variables: any = { ...rest };\n\n // Handle categories (union vs intersection)\n if (!isUnion && categories) {\n variables.relatedToAll = categories;\n }\n\n if (isUnion && categories) {\n variables.related = categories;\n }\n\n // Handle entry exclusion\n if (entriesToRemove) {\n variables.not = ['not', ...entriesToRemove];\n }\n\n return variables;\n },\n});\n"],"names":[],"mappings":";AAcA,MAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ/B,MAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAO/B,MAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAajC,MAAM,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAY7B,MAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAmB1B,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,2BAA2B;AAAA;AAoBxB,MAAM,oBAAoB,2BAAsC;AAAA,EACrE,UAAU;AAAA,EAEV,SAAS;AAAA,IACP,SAAS;AAAA,EAAA;AAAA,EAGX,mBAAmB,CAAC,SAAS;AAC3B,QAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,KAAK,KAAK,SAAS;AAC7C,aAAO;AAAA,IACT;AACA,WAAO,KAAK,KAAK,WAAW;AAAA,EAC9B;AAAA,EAEA,gBAAgB,CAAC,SAAS;AACxB,QAAI,CAAC,QAAQ,CAAC,KAAK,MAAM;AACvB,aAAO;AAAA,IACT;AACA,WAAO,KAAK,KAAK,cAAc;AAAA,EACjC;AAAA,EAEA,kBAAkB,CAAC,kBAAkB;AACnC,UAAM,EAAE,YAAY,SAAS,iBAAiB,GAAG,SAAS;AAE1D,UAAM,YAAiB,EAAE,GAAG,KAAA;AAG5B,QAAI,CAAC,WAAW,YAAY;AAC1B,gBAAU,eAAe;AAAA,IAC3B;AAEA,QAAI,WAAW,YAAY;AACzB,gBAAU,UAAU;AAAA,IACtB;AAGA,QAAI,iBAAiB;AACnB,gBAAU,MAAM,CAAC,OAAO,GAAG,eAAe;AAAA,IAC5C;AAEA,WAAO;AAAA,EACT;AACF,CAAC;"}
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const layout = require("@universityofmaryland/web-elements-library/layout");
|
|
1
|
+
import { gridGap, stacked, grid, gridBorder } from "@universityofmaryland/web-elements-library/layout";
|
|
4
2
|
const gridLayout = {
|
|
5
3
|
create: (options) => {
|
|
6
4
|
const { columns = 3 } = options;
|
|
7
|
-
return
|
|
5
|
+
return grid({ columns, minHeight: "560px" });
|
|
8
6
|
},
|
|
9
7
|
getId: () => "umd-grid-layout-container"
|
|
10
8
|
};
|
|
11
9
|
const gridGapLayout = {
|
|
12
10
|
create: (options) => {
|
|
13
11
|
const { columns = 3 } = options;
|
|
14
|
-
return
|
|
12
|
+
return gridGap({ columns });
|
|
15
13
|
},
|
|
16
14
|
getId: () => "umd-grid-gap-layout-container"
|
|
17
15
|
};
|
|
18
16
|
const gridBorderLayout = {
|
|
19
17
|
create: (options) => {
|
|
20
18
|
const { columns = 3, isThemeDark = false } = options;
|
|
21
|
-
return
|
|
19
|
+
return gridBorder({ columns, isThemeDark });
|
|
22
20
|
},
|
|
23
21
|
getId: () => "umd-grid-border-layout-container"
|
|
24
22
|
};
|
|
25
23
|
const stackedLayout = {
|
|
26
24
|
create: (options) => {
|
|
27
25
|
const { isThemeDark, showDividers = true } = options;
|
|
28
|
-
return
|
|
26
|
+
return stacked({ isThemeDark, showDividers, gap: "0" });
|
|
29
27
|
},
|
|
30
28
|
getId: () => "umd-stacked-layout-container"
|
|
31
29
|
};
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
30
|
+
export {
|
|
31
|
+
gridBorderLayout,
|
|
32
|
+
gridGapLayout,
|
|
33
|
+
gridLayout,
|
|
34
|
+
stackedLayout
|
|
35
|
+
};
|
|
36
36
|
//# sourceMappingURL=grid.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid.js","sources":["../../../source/strategies/layout/grid.ts"],"sourcesContent":["/**\n * Grid Layout Strategies\n *\n * Layout strategies for grid-based feed displays.\n *\n * @module strategies/layout/grid\n */\n\nimport {\n grid,\n gridGap,\n gridBorder,\n gridOffset,\n stacked,\n} from '@universityofmaryland/web-elements-library/layout';\nimport { LayoutStrategy, LayoutOptions } from '../../factory/core/types';\n\n/**\n * Standard grid layout strategy\n *\n * Creates a responsive grid layout with specified columns.\n * Uses standard grid spacing.\n */\nexport const gridLayout: LayoutStrategy = {\n create: (options: LayoutOptions) => {\n const { columns = 3 } = options;\n return grid({ columns: columns as 2 | 3 | 4, minHeight: '560px' });\n },\n getId: () => 'umd-grid-layout-container',\n};\n\n/**\n * Grid gap layout strategy\n *\n * Creates a responsive grid layout with visual gaps between items.\n * Provides more pronounced spacing than standard grid.\n */\nexport const gridGapLayout: LayoutStrategy = {\n create: (options: LayoutOptions) => {\n const { columns = 3 } = options;\n return gridGap({ columns: columns as 2 | 3 | 4 });\n },\n getId: () => 'umd-grid-gap-layout-container',\n};\n\n/**\n * Grid border layout strategy\n *\n * Creates a responsive grid layout with borders between items.\n * Supports light and dark theme variants.\n */\nexport const gridBorderLayout: LayoutStrategy = {\n create: (options: LayoutOptions) => {\n const { columns = 3, isThemeDark = false } = options;\n return gridBorder({ columns: columns as 2 | 3 | 4, isThemeDark });\n },\n getId: () => 'umd-grid-border-layout-container',\n};\n\n/**\n * Stacked layout strategy\n *\n * Creates a vertical stack layout with optional dividers.\n * Good for list-style displays.\n */\nexport const stackedLayout: LayoutStrategy = {\n create: (options: LayoutOptions) => {\n const { isThemeDark, showDividers = true } = options;\n return stacked({ isThemeDark, showDividers, gap: '0' });\n },\n getId: () => 'umd-stacked-layout-container',\n};\n\n/**\n * Grid offset layout strategy\n *\n * Creates a grid with sticky offset positioning for the first item.\n * Used for featured layouts where the first item is prominently displayed.\n */\nexport const gridOffsetLayout: LayoutStrategy = {\n create: (options: LayoutOptions) => {\n const {\n columns = 2,\n isLayoutReversed = false,\n stickyTopPosition,\n } = options;\n\n return gridOffset({\n columns: columns as 2 | 3 | 4,\n isLayoutReversed,\n stickyTopPosition,\n });\n },\n getId: () => 'umd-grid-offset-layout-container',\n};\n"],"names":[
|
|
1
|
+
{"version":3,"file":"grid.js","sources":["../../../source/strategies/layout/grid.ts"],"sourcesContent":["/**\n * Grid Layout Strategies\n *\n * Layout strategies for grid-based feed displays.\n *\n * @module strategies/layout/grid\n */\n\nimport {\n grid,\n gridGap,\n gridBorder,\n gridOffset,\n stacked,\n} from '@universityofmaryland/web-elements-library/layout';\nimport { LayoutStrategy, LayoutOptions } from '../../factory/core/types';\n\n/**\n * Standard grid layout strategy\n *\n * Creates a responsive grid layout with specified columns.\n * Uses standard grid spacing.\n */\nexport const gridLayout: LayoutStrategy = {\n create: (options: LayoutOptions) => {\n const { columns = 3 } = options;\n return grid({ columns: columns as 2 | 3 | 4, minHeight: '560px' });\n },\n getId: () => 'umd-grid-layout-container',\n};\n\n/**\n * Grid gap layout strategy\n *\n * Creates a responsive grid layout with visual gaps between items.\n * Provides more pronounced spacing than standard grid.\n */\nexport const gridGapLayout: LayoutStrategy = {\n create: (options: LayoutOptions) => {\n const { columns = 3 } = options;\n return gridGap({ columns: columns as 2 | 3 | 4 });\n },\n getId: () => 'umd-grid-gap-layout-container',\n};\n\n/**\n * Grid border layout strategy\n *\n * Creates a responsive grid layout with borders between items.\n * Supports light and dark theme variants.\n */\nexport const gridBorderLayout: LayoutStrategy = {\n create: (options: LayoutOptions) => {\n const { columns = 3, isThemeDark = false } = options;\n return gridBorder({ columns: columns as 2 | 3 | 4, isThemeDark });\n },\n getId: () => 'umd-grid-border-layout-container',\n};\n\n/**\n * Stacked layout strategy\n *\n * Creates a vertical stack layout with optional dividers.\n * Good for list-style displays.\n */\nexport const stackedLayout: LayoutStrategy = {\n create: (options: LayoutOptions) => {\n const { isThemeDark, showDividers = true } = options;\n return stacked({ isThemeDark, showDividers, gap: '0' });\n },\n getId: () => 'umd-stacked-layout-container',\n};\n\n/**\n * Grid offset layout strategy\n *\n * Creates a grid with sticky offset positioning for the first item.\n * Used for featured layouts where the first item is prominently displayed.\n */\nexport const gridOffsetLayout: LayoutStrategy = {\n create: (options: LayoutOptions) => {\n const {\n columns = 2,\n isLayoutReversed = false,\n stickyTopPosition,\n } = options;\n\n return gridOffset({\n columns: columns as 2 | 3 | 4,\n isLayoutReversed,\n stickyTopPosition,\n });\n },\n getId: () => 'umd-grid-offset-layout-container',\n};\n"],"names":[],"mappings":";AAuBO,MAAM,aAA6B;AAAA,EACxC,QAAQ,CAAC,YAA2B;AAClC,UAAM,EAAE,UAAU,EAAA,IAAM;AACxB,WAAO,KAAK,EAAE,SAA+B,WAAW,SAAS;AAAA,EACnE;AAAA,EACA,OAAO,MAAM;AACf;AAQO,MAAM,gBAAgC;AAAA,EAC3C,QAAQ,CAAC,YAA2B;AAClC,UAAM,EAAE,UAAU,EAAA,IAAM;AACxB,WAAO,QAAQ,EAAE,SAA+B;AAAA,EAClD;AAAA,EACA,OAAO,MAAM;AACf;AAQO,MAAM,mBAAmC;AAAA,EAC9C,QAAQ,CAAC,YAA2B;AAClC,UAAM,EAAE,UAAU,GAAG,cAAc,UAAU;AAC7C,WAAO,WAAW,EAAE,SAA+B,aAAa;AAAA,EAClE;AAAA,EACA,OAAO,MAAM;AACf;AAQO,MAAM,gBAAgC;AAAA,EAC3C,QAAQ,CAAC,YAA2B;AAClC,UAAM,EAAE,aAAa,eAAe,KAAA,IAAS;AAC7C,WAAO,QAAQ,EAAE,aAAa,cAAc,KAAK,KAAK;AAAA,EACxD;AAAA,EACA,OAAO,MAAM;AACf;"}
|
package/dist/widgets/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { createSliderWidget as slider } from './slider';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/widgets/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/widgets/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,kBAAkB,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/widgets/slider.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
declare const
|
|
1
|
+
export declare const createSliderWidget: ({ token, query, url, categories, isThemeDark, headline, actions, }: {
|
|
2
2
|
token: string;
|
|
3
3
|
query: string;
|
|
4
4
|
url: string;
|
|
@@ -13,5 +13,4 @@ declare const _default: ({ token, query, url, categories, isThemeDark, headline,
|
|
|
13
13
|
element: HTMLDivElement;
|
|
14
14
|
styles: string;
|
|
15
15
|
};
|
|
16
|
-
export default _default;
|
|
17
16
|
//# sourceMappingURL=slider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../source/widgets/slider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../source/widgets/slider.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,kBAAkB,GAAI,oEAQhC;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAC9B;;2BA0B2B,UAAU;;;;CA8DrC,CAAC"}
|
package/dist/widgets/slider.js
CHANGED
|
@@ -1,26 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
function _interopNamespaceDefault(e) {
|
|
7
|
-
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
8
|
-
if (e) {
|
|
9
|
-
for (const k in e) {
|
|
10
|
-
if (k !== "default") {
|
|
11
|
-
const d = Object.getOwnPropertyDescriptor(e, k);
|
|
12
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
13
|
-
enumerable: true,
|
|
14
|
-
get: () => e[k]
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
n.default = e;
|
|
20
|
-
return Object.freeze(n);
|
|
21
|
-
}
|
|
22
|
-
const Styles__namespace = /* @__PURE__ */ _interopNamespaceDefault(Styles);
|
|
23
|
-
const slider = ({
|
|
1
|
+
import * as Styles from "@universityofmaryland/web-styles-library";
|
|
2
|
+
import { fetchGraphQL } from "@universityofmaryland/web-utilities-library/network";
|
|
3
|
+
import { slider } from "@universityofmaryland/web-elements-library/composite";
|
|
4
|
+
import { events, textLockup } from "@universityofmaryland/web-elements-library/atomic";
|
|
5
|
+
const createSliderWidget = ({
|
|
24
6
|
token,
|
|
25
7
|
query,
|
|
26
8
|
url,
|
|
@@ -30,7 +12,7 @@ const slider = ({
|
|
|
30
12
|
actions
|
|
31
13
|
}) => {
|
|
32
14
|
const dataSlider = document.createElement("div");
|
|
33
|
-
const
|
|
15
|
+
const slider$1 = slider.events({
|
|
34
16
|
isThemeDark,
|
|
35
17
|
dataSlider,
|
|
36
18
|
headline,
|
|
@@ -43,7 +25,7 @@ const slider = ({
|
|
|
43
25
|
styles
|
|
44
26
|
}) => {
|
|
45
27
|
const styleElement = document.createElement("style");
|
|
46
|
-
const optimizedCss = await
|
|
28
|
+
const optimizedCss = await Styles.utilities.transform.css.removeDuplicates(
|
|
47
29
|
styles
|
|
48
30
|
);
|
|
49
31
|
styleElement.textContent = optimizedCss;
|
|
@@ -63,41 +45,43 @@ const slider = ({
|
|
|
63
45
|
token,
|
|
64
46
|
variables
|
|
65
47
|
};
|
|
66
|
-
const feedData = await
|
|
48
|
+
const feedData = await fetchGraphQL(fetchVariables);
|
|
67
49
|
const slides = feedData?.data?.entries?.events.map(
|
|
68
50
|
(data, i) => {
|
|
69
51
|
const headline2 = document.createElement("p");
|
|
70
52
|
headline2.textContent = data.title;
|
|
71
|
-
const dateSign =
|
|
53
|
+
const dateSign = events.sign({
|
|
72
54
|
startMonth: data.startMonth,
|
|
73
55
|
startDay: data.startDay,
|
|
74
56
|
endDay: data.endDay,
|
|
75
57
|
endMonth: data.endMonth,
|
|
76
58
|
isThemeDark
|
|
77
59
|
});
|
|
78
|
-
const textLockup =
|
|
60
|
+
const textLockup$1 = textLockup.date({
|
|
79
61
|
headline: headline2,
|
|
80
62
|
isThemeDark,
|
|
81
63
|
dateSign
|
|
82
64
|
});
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
return textLockup;
|
|
65
|
+
slider$1.styles += textLockup$1.styles;
|
|
66
|
+
slider$1.styles += dateSign.styles;
|
|
67
|
+
return textLockup$1;
|
|
86
68
|
}
|
|
87
69
|
);
|
|
88
70
|
slides?.forEach((slide) => dataSlider.appendChild(slide.element));
|
|
89
|
-
if (shadowRoot) setShadowStyles({ shadowRoot, styles:
|
|
71
|
+
if (shadowRoot) setShadowStyles({ shadowRoot, styles: slider$1.styles });
|
|
90
72
|
setTimeout(() => {
|
|
91
|
-
|
|
73
|
+
slider$1.events.load();
|
|
92
74
|
}, 100);
|
|
93
75
|
};
|
|
94
76
|
loadEvents();
|
|
95
77
|
return {
|
|
96
|
-
...
|
|
78
|
+
...slider$1,
|
|
97
79
|
events: {
|
|
98
80
|
callback
|
|
99
81
|
}
|
|
100
82
|
};
|
|
101
83
|
};
|
|
102
|
-
|
|
84
|
+
export {
|
|
85
|
+
createSliderWidget
|
|
86
|
+
};
|
|
103
87
|
//# sourceMappingURL=slider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slider.js","sources":["../../source/widgets/slider.ts"],"sourcesContent":["import * as Styles from '@universityofmaryland/web-styles-library';\nimport { fetchGraphQL } from '@universityofmaryland/web-utilities-library/network';\nimport { slider as elementSlider } from '@universityofmaryland/web-elements-library/composite';\nimport {\n textLockup as elementTextLockup,\n events as elementEvents,\n} from '@universityofmaryland/web-elements-library/atomic';\n\ntype TypeSlideFeedResponse = {\n title: string;\n startMonth: string;\n startDay: string;\n endMonth?: string;\n endDay?: string;\n};\n\nexport
|
|
1
|
+
{"version":3,"file":"slider.js","sources":["../../source/widgets/slider.ts"],"sourcesContent":["import * as Styles from '@universityofmaryland/web-styles-library';\nimport { fetchGraphQL } from '@universityofmaryland/web-utilities-library/network';\nimport { slider as elementSlider } from '@universityofmaryland/web-elements-library/composite';\nimport {\n textLockup as elementTextLockup,\n events as elementEvents,\n} from '@universityofmaryland/web-elements-library/atomic';\n\ntype TypeSlideFeedResponse = {\n title: string;\n startMonth: string;\n startDay: string;\n endMonth?: string;\n endDay?: string;\n};\n\nexport const createSliderWidget = ({\n token,\n query,\n url,\n categories,\n isThemeDark,\n headline,\n actions,\n}: {\n token: string;\n query: string;\n url: string;\n categories?: string | null;\n isThemeDark?: boolean;\n headline?: HTMLElement | null;\n actions?: HTMLElement | null;\n}) => {\n const dataSlider = document.createElement('div');\n const slider = elementSlider.events({\n isThemeDark,\n dataSlider,\n headline,\n actions,\n });\n let variables: any = { startDate: new Date().toDateString() };\n let shadowRoot: ShadowRoot | null = null;\n\n const setShadowStyles = async ({\n shadowRoot,\n styles,\n }: {\n shadowRoot: ShadowRoot;\n styles: string;\n }) => {\n const styleElement = document.createElement('style');\n const optimizedCss = await Styles.utilities.transform.css.removeDuplicates(\n styles,\n );\n styleElement.textContent = optimizedCss;\n shadowRoot.appendChild(styleElement);\n };\n\n const callback = (shadow: ShadowRoot) => {\n shadowRoot = shadow;\n };\n\n const loadEvents = async () => {\n if (categories) {\n const related = categories.split(',');\n variables.related = related;\n }\n\n const fetchVariables = {\n query,\n url,\n token,\n variables,\n };\n\n const feedData = await fetchGraphQL(fetchVariables);\n\n const slides: { element: HTMLElement; styles: string }[] =\n feedData?.data?.entries?.events.map(\n (data: TypeSlideFeedResponse, i: number) => {\n const headline = document.createElement('p');\n headline.textContent = data.title;\n\n const dateSign = elementEvents.sign({\n startMonth: data.startMonth,\n startDay: data.startDay,\n endDay: data.endDay,\n endMonth: data.endMonth,\n isThemeDark,\n });\n\n const textLockup = elementTextLockup.date({\n headline,\n isThemeDark,\n dateSign,\n });\n\n slider.styles += textLockup.styles;\n slider.styles += dateSign.styles;\n\n return textLockup;\n },\n );\n\n slides?.forEach((slide) => dataSlider.appendChild(slide.element));\n\n if (shadowRoot) setShadowStyles({ shadowRoot, styles: slider.styles });\n setTimeout(() => {\n slider.events.load();\n }, 100);\n };\n\n loadEvents();\n\n return {\n ...slider,\n events: {\n callback,\n },\n };\n};\n"],"names":["slider","elementSlider","shadowRoot","headline","elementEvents","textLockup","elementTextLockup"],"mappings":";;;;AAgBO,MAAM,qBAAqB,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAQM;AACJ,QAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,QAAMA,WAASC,OAAc,OAAO;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AACD,MAAI,YAAiB,EAAE,gCAAe,KAAA,GAAO,eAAa;AAC1D,MAAI,aAAgC;AAEpC,QAAM,kBAAkB,OAAO;AAAA,IAC7B,YAAAC;AAAAA,IACA;AAAA,EAAA,MAII;AACJ,UAAM,eAAe,SAAS,cAAc,OAAO;AACnD,UAAM,eAAe,MAAM,OAAO,UAAU,UAAU,IAAI;AAAA,MACxD;AAAA,IAAA;AAEF,iBAAa,cAAc;AAC3BA,gBAAW,YAAY,YAAY;AAAA,EACrC;AAEA,QAAM,WAAW,CAAC,WAAuB;AACvC,iBAAa;AAAA,EACf;AAEA,QAAM,aAAa,YAAY;AAC7B,QAAI,YAAY;AACd,YAAM,UAAU,WAAW,MAAM,GAAG;AACpC,gBAAU,UAAU;AAAA,IACtB;AAEA,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAGF,UAAM,WAAW,MAAM,aAAa,cAAc;AAElD,UAAM,SACJ,UAAU,MAAM,SAAS,OAAO;AAAA,MAC9B,CAAC,MAA6B,MAAc;AAC1C,cAAMC,YAAW,SAAS,cAAc,GAAG;AAC3CA,kBAAS,cAAc,KAAK;AAE5B,cAAM,WAAWC,OAAc,KAAK;AAAA,UAClC,YAAY,KAAK;AAAA,UACjB,UAAU,KAAK;AAAA,UACf,QAAQ,KAAK;AAAA,UACb,UAAU,KAAK;AAAA,UACf;AAAA,QAAA,CACD;AAED,cAAMC,eAAaC,WAAkB,KAAK;AAAA,UACxC,UAAAH;AAAAA,UACA;AAAA,UACA;AAAA,QAAA,CACD;AAEDH,iBAAO,UAAUK,aAAW;AAC5BL,iBAAO,UAAU,SAAS;AAE1B,eAAOK;AAAAA,MACT;AAAA,IAAA;AAGJ,YAAQ,QAAQ,CAAC,UAAU,WAAW,YAAY,MAAM,OAAO,CAAC;AAEhE,QAAI,WAAY,iBAAgB,EAAE,YAAY,QAAQL,SAAO,QAAQ;AACrE,eAAW,MAAM;AACfA,eAAO,OAAO,KAAA;AAAA,IAChB,GAAG,GAAG;AAAA,EACR;AAEA,aAAA;AAEA,SAAO;AAAA,IACL,GAAGA;AAAAA,IACH,QAAQ;AAAA,MACN;AAAA,IAAA;AAAA,EACF;AAEJ;"}
|