@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../../source/feeds/academic/slider.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../../source/feeds/academic/slider.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAiBjD,eAAO,MAAM,cAAc,GAAI,OAAO,mBAAmB,KAAG,YAKxD,CAAC"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const
|
|
4
|
-
const slider = (props) => slider$1({
|
|
1
|
+
import { createSliderWidget } from "../../widgets/slider.js";
|
|
2
|
+
import { ACADEMIC_SLIDER_QUERY } from "../../strategies/fetch/academic.js";
|
|
3
|
+
const academicSlider = (props) => createSliderWidget({
|
|
5
4
|
...props,
|
|
6
|
-
query:
|
|
5
|
+
query: ACADEMIC_SLIDER_QUERY,
|
|
7
6
|
url: "https://provost.umd.edu/graphql"
|
|
8
7
|
});
|
|
9
|
-
|
|
8
|
+
export {
|
|
9
|
+
academicSlider
|
|
10
|
+
};
|
|
10
11
|
//# sourceMappingURL=slider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slider.js","sources":["../../../source/feeds/academic/slider.ts"],"sourcesContent":["/**\n * Academic Slider Feed (Migrated)\n *\n * Displays academic events in a horizontal carousel layout.\n * Uses strategy pattern for GraphQL queries.\n *\n * @module composite/academic/slider-new\n */\n\nimport { slider } from '../../widgets';\nimport { ACADEMIC_SLIDER_QUERY } from '../../strategies/fetch/academic';\nimport { type AcademicSliderProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\n/**\n * Creates an academic events slider feed\n *\n * @param props - Slider configuration options\n * @returns ElementModel with slider element and styles\n *\n * @example\n * ```typescript\n * const academicSlider = slider({\n * token: 'your-token',\n * categories: 'engineering,science',\n * isThemeDark: false,\n * });\n * ```\n */\nexport
|
|
1
|
+
{"version":3,"file":"slider.js","sources":["../../../source/feeds/academic/slider.ts"],"sourcesContent":["/**\n * Academic Slider Feed (Migrated)\n *\n * Displays academic events in a horizontal carousel layout.\n * Uses strategy pattern for GraphQL queries.\n *\n * @module composite/academic/slider-new\n */\n\nimport { slider } from '../../widgets';\nimport { ACADEMIC_SLIDER_QUERY } from '../../strategies/fetch/academic';\nimport { type AcademicSliderProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\n/**\n * Creates an academic events slider feed\n *\n * @param props - Slider configuration options\n * @returns ElementModel with slider element and styles\n *\n * @example\n * ```typescript\n * const academicSlider = slider({\n * token: 'your-token',\n * categories: 'engineering,science',\n * isThemeDark: false,\n * });\n * ```\n */\nexport const academicSlider = (props: AcademicSliderProps): ElementModel =>\n slider({\n ...props,\n query: ACADEMIC_SLIDER_QUERY,\n url: 'https://provost.umd.edu/graphql',\n });\n"],"names":["slider"],"mappings":";;AA6BO,MAAM,iBAAiB,CAAC,UAC7BA,mBAAO;AAAA,EACL,GAAG;AAAA,EACH,OAAO;AAAA,EACP,KAAK;AACP,CAAC;"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { BlockProps } from './_types';
|
|
2
2
|
import { ElementModel } from '../../_types';
|
|
3
|
-
declare const
|
|
4
|
-
export default _default;
|
|
3
|
+
export declare const eventsGrid: (props: BlockProps) => ElementModel;
|
|
5
4
|
//# sourceMappingURL=grid.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../../source/feeds/events/grid.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../../source/feeds/events/grid.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAqBjD,eAAO,MAAM,UAAU,GAAI,OAAO,UAAU,KAAG,YAa3C,CAAC"}
|
|
@@ -1,25 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const grid = (props) => createBaseFeed.createBaseFeed({
|
|
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 { eventsDisplayStrategy } from "../../strategies/display/events.js";
|
|
8
|
+
import "@universityofmaryland/web-elements-library/composite";
|
|
9
|
+
import "@universityofmaryland/web-utilities-library/elements";
|
|
10
|
+
import "@universityofmaryland/web-utilities-library/network";
|
|
11
|
+
import { eventsFetchStrategy } from "../../strategies/fetch/events.js";
|
|
12
|
+
import "../../strategies/fetch/news.js";
|
|
13
|
+
import "../../strategies/fetch/experts.js";
|
|
14
|
+
import { gridGapLayout } from "../../strategies/layout/grid.js";
|
|
15
|
+
import "@universityofmaryland/web-elements-library/layout";
|
|
16
|
+
const eventsGrid = (props) => createBaseFeed({
|
|
18
17
|
...props,
|
|
19
18
|
enableCategoryFallback: true,
|
|
20
|
-
fetchStrategy:
|
|
21
|
-
displayStrategy:
|
|
22
|
-
layoutStrategy:
|
|
19
|
+
fetchStrategy: eventsFetchStrategy,
|
|
20
|
+
displayStrategy: eventsDisplayStrategy,
|
|
21
|
+
layoutStrategy: gridGapLayout,
|
|
23
22
|
imageConfig: (entry) => ({
|
|
24
23
|
imageUrl: entry.image[0].url,
|
|
25
24
|
altText: entry.image[0].altText || "Event Image",
|
|
@@ -27,5 +26,7 @@ const grid = (props) => createBaseFeed.createBaseFeed({
|
|
|
27
26
|
linkLabel: "University of Maryland Event"
|
|
28
27
|
})
|
|
29
28
|
});
|
|
30
|
-
|
|
29
|
+
export {
|
|
30
|
+
eventsGrid
|
|
31
|
+
};
|
|
31
32
|
//# sourceMappingURL=grid.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid.js","sources":["../../../source/feeds/events/grid.ts"],"sourcesContent":["/**\n * Events Grid Feed (Factory Pattern)\n *\n * Grid layout for event entries using the feed factory pattern.\n * This is the NEW implementation using factory + strategies.\n *\n * @module composite/events/grid-new\n */\n\nimport { createBaseFeed } from 'factory';\nimport {\n eventsFetchStrategy,\n eventsDisplayStrategy,\n gridGapLayout,\n} from 'strategies';\nimport { type BlockProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\n/**\n * Create an events grid feed\n *\n * @param props - Feed configuration\n * @returns ElementModel with feed element and styles\n *\n * @example\n * ```typescript\n * const feed = eventsGrid({\n * token: 'my-token',\n * numberOfColumnsToShow: 3,\n * numberOfRowsToStart: 2,\n * isLazyLoad: true,\n * categories: ['sports', 'arts'],\n * });\n *\n * document.body.appendChild(feed.element);\n * ```\n */\nexport
|
|
1
|
+
{"version":3,"file":"grid.js","sources":["../../../source/feeds/events/grid.ts"],"sourcesContent":["/**\n * Events Grid Feed (Factory Pattern)\n *\n * Grid layout for event entries using the feed factory pattern.\n * This is the NEW implementation using factory + strategies.\n *\n * @module composite/events/grid-new\n */\n\nimport { createBaseFeed } from 'factory';\nimport {\n eventsFetchStrategy,\n eventsDisplayStrategy,\n gridGapLayout,\n} from 'strategies';\nimport { type BlockProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\n/**\n * Create an events grid feed\n *\n * @param props - Feed configuration\n * @returns ElementModel with feed element and styles\n *\n * @example\n * ```typescript\n * const feed = eventsGrid({\n * token: 'my-token',\n * numberOfColumnsToShow: 3,\n * numberOfRowsToStart: 2,\n * isLazyLoad: true,\n * categories: ['sports', 'arts'],\n * });\n *\n * document.body.appendChild(feed.element);\n * ```\n */\nexport const eventsGrid = (props: BlockProps): ElementModel =>\n createBaseFeed({\n ...props,\n enableCategoryFallback: true,\n fetchStrategy: eventsFetchStrategy,\n displayStrategy: eventsDisplayStrategy,\n layoutStrategy: gridGapLayout,\n imageConfig: (entry) => ({\n imageUrl: entry.image[0].url,\n altText: entry.image[0].altText || 'Event Image',\n linkUrl: entry.url,\n linkLabel: 'University of Maryland Event',\n }),\n });\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAqCO,MAAM,aAAa,CAAC,UACzB,eAAe;AAAA,EACb,GAAG;AAAA,EACH,wBAAwB;AAAA,EACxB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,aAAa,CAAC,WAAW;AAAA,IACvB,UAAU,MAAM,MAAM,CAAC,EAAE;AAAA,IACzB,SAAS,MAAM,MAAM,CAAC,EAAE,WAAW;AAAA,IACnC,SAAS,MAAM;AAAA,IACf,WAAW;AAAA,EAAA;AAEf,CAAC;"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { ListProps } from './_types';
|
|
2
2
|
import { ElementModel } from '../../_types';
|
|
3
|
-
declare const
|
|
4
|
-
export default _default;
|
|
3
|
+
export declare const eventsGrouped: (props: ListProps) => ElementModel;
|
|
5
4
|
//# sourceMappingURL=grouped.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grouped.d.ts","sourceRoot":"","sources":["../../../source/feeds/events/grouped.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"grouped.d.ts","sourceRoot":"","sources":["../../../source/feeds/events/grouped.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAibjD,eAAO,MAAM,aAAa,GAAI,OAAO,SAAS,KAAG,YA+HhD,CAAC"}
|
|
@@ -1,38 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const shadow = require("../../helpers/styles/shadow.js");
|
|
19
|
-
function _interopNamespaceDefault(e) {
|
|
20
|
-
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
21
|
-
if (e) {
|
|
22
|
-
for (const k in e) {
|
|
23
|
-
if (k !== "default") {
|
|
24
|
-
const d = Object.getOwnPropertyDescriptor(e, k);
|
|
25
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
26
|
-
enumerable: true,
|
|
27
|
-
get: () => e[k]
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
n.default = e;
|
|
33
|
-
return Object.freeze(n);
|
|
34
|
-
}
|
|
35
|
-
const Styles__namespace = /* @__PURE__ */ _interopNamespaceDefault(Styles);
|
|
1
|
+
import * as Styles from "@universityofmaryland/web-styles-library";
|
|
2
|
+
import { ElementBuilder } from "@universityofmaryland/web-builder-library";
|
|
3
|
+
import { card } from "@universityofmaryland/web-elements-library/composite";
|
|
4
|
+
import { events } from "@universityofmaryland/web-elements-library/atomic";
|
|
5
|
+
import { createImageOrLinkedImage, createTextContainer, createTextWithLink } from "@universityofmaryland/web-utilities-library/elements";
|
|
6
|
+
import { LoadingState } from "../../states/loading.js";
|
|
7
|
+
import { EmptyState } from "../../states/empty.js";
|
|
8
|
+
import { PaginationState } from "../../states/pagination.js";
|
|
9
|
+
import { Announcer } from "../../states/announcer.js";
|
|
10
|
+
import "@universityofmaryland/web-utilities-library/network";
|
|
11
|
+
import { eventsFetchStrategyRange } from "../../strategies/fetch/events.js";
|
|
12
|
+
import "../../strategies/fetch/news.js";
|
|
13
|
+
import "../../strategies/fetch/experts.js";
|
|
14
|
+
import "@universityofmaryland/web-elements-library/layout";
|
|
15
|
+
import { dispatch, eventNames } from "../../helpers/events/index.js";
|
|
16
|
+
import { groupEventsByDate } from "../../helpers/grouping/events.js";
|
|
17
|
+
import { setShadowStyles } from "../../helpers/styles/shadow.js";
|
|
36
18
|
const createFetchProps = (props, offset) => ({
|
|
37
19
|
token: props.token,
|
|
38
20
|
categories: props.categories,
|
|
@@ -76,8 +58,8 @@ class GroupedFeedState {
|
|
|
76
58
|
*
|
|
77
59
|
* @param shadow - Shadow root element
|
|
78
60
|
*/
|
|
79
|
-
setShadowRoot(
|
|
80
|
-
this.shadowRoot =
|
|
61
|
+
setShadowRoot(shadow) {
|
|
62
|
+
this.shadowRoot = shadow;
|
|
81
63
|
}
|
|
82
64
|
/**
|
|
83
65
|
* Update shadow DOM styles
|
|
@@ -86,7 +68,7 @@ class GroupedFeedState {
|
|
|
86
68
|
*/
|
|
87
69
|
async updateShadowStyles() {
|
|
88
70
|
if (!this.shadowRoot) return;
|
|
89
|
-
await
|
|
71
|
+
await setShadowStyles({
|
|
90
72
|
shadowRoot: this.shadowRoot,
|
|
91
73
|
styles: this.getStyles()
|
|
92
74
|
});
|
|
@@ -105,7 +87,7 @@ class GroupedFeedState {
|
|
|
105
87
|
* @returns Callback function for shadow root
|
|
106
88
|
*/
|
|
107
89
|
getShadowCallback() {
|
|
108
|
-
return (
|
|
90
|
+
return (shadow) => this.setShadowRoot(shadow);
|
|
109
91
|
}
|
|
110
92
|
/**
|
|
111
93
|
* Get current offset
|
|
@@ -159,19 +141,19 @@ class GroupedFeedState {
|
|
|
159
141
|
const createDateHeader = (date, state) => {
|
|
160
142
|
const dateHeadline = document.createElement("p");
|
|
161
143
|
dateHeadline.textContent = date;
|
|
162
|
-
const headerElement = new
|
|
144
|
+
const headerElement = new ElementBuilder(dateHeadline).styled(Styles.element.text.decoration.ribbon).withStyles({
|
|
163
145
|
element: {
|
|
164
|
-
margin: `${
|
|
146
|
+
margin: `${Styles.token.spacing.lg} 0`
|
|
165
147
|
}
|
|
166
148
|
}).build();
|
|
167
149
|
state.addStyles(headerElement.styles);
|
|
168
150
|
return headerElement;
|
|
169
151
|
};
|
|
170
152
|
const createEventCard = (entry, isThemeDark) => {
|
|
171
|
-
return
|
|
172
|
-
headline:
|
|
173
|
-
text:
|
|
174
|
-
dateSign:
|
|
153
|
+
return card.list({
|
|
154
|
+
headline: createTextWithLink({ text: entry.title, url: entry.url }),
|
|
155
|
+
text: createTextContainer({ text: entry.summary, allowHTML: true }),
|
|
156
|
+
dateSign: events.sign({
|
|
175
157
|
startMonth: entry.startMonth,
|
|
176
158
|
startDay: entry.startDay,
|
|
177
159
|
endMonth: entry.endMonth,
|
|
@@ -179,27 +161,27 @@ const createEventCard = (entry, isThemeDark) => {
|
|
|
179
161
|
isThemeDark,
|
|
180
162
|
isLargeSize: true
|
|
181
163
|
}),
|
|
182
|
-
eventMeta:
|
|
164
|
+
eventMeta: events.meta({
|
|
183
165
|
...entry,
|
|
184
166
|
isThemeDark
|
|
185
167
|
}),
|
|
186
|
-
image:
|
|
168
|
+
image: createImageOrLinkedImage(createImageConfig(entry)),
|
|
187
169
|
isAligned: false,
|
|
188
170
|
isThemeDark
|
|
189
171
|
});
|
|
190
172
|
};
|
|
191
173
|
const createGroupContainer = (events2, state, isThemeDark) => {
|
|
192
|
-
const entriesBuilder = new
|
|
174
|
+
const entriesBuilder = new ElementBuilder("div").withClassName("umd-feed-events-grouped-entries").withStyles({
|
|
193
175
|
element: {
|
|
194
176
|
[` > *:not(:last-child)`]: {
|
|
195
|
-
paddingBottom:
|
|
196
|
-
marginBottom:
|
|
197
|
-
borderBottom: `1px solid ${isThemeDark ?
|
|
177
|
+
paddingBottom: Styles.token.spacing.md,
|
|
178
|
+
marginBottom: Styles.token.spacing.md,
|
|
179
|
+
borderBottom: `1px solid ${isThemeDark ? Styles.token.color.gray.dark : Styles.token.color.gray.light}`
|
|
198
180
|
},
|
|
199
181
|
[`+ .umd-feed-events-grouped-entries`]: {
|
|
200
|
-
paddingTop:
|
|
201
|
-
marginTop:
|
|
202
|
-
borderTop: `1px solid ${isThemeDark ?
|
|
182
|
+
paddingTop: Styles.token.spacing.md,
|
|
183
|
+
marginTop: Styles.token.spacing.md,
|
|
184
|
+
borderTop: `1px solid ${isThemeDark ? Styles.token.color.gray.dark : Styles.token.color.gray.light}`
|
|
203
185
|
}
|
|
204
186
|
}
|
|
205
187
|
});
|
|
@@ -218,8 +200,8 @@ const renderGroupedEvents = async (container, events2, state, isThemeDark, isLaz
|
|
|
218
200
|
);
|
|
219
201
|
if (!grid) return;
|
|
220
202
|
container.querySelector(".umd-loader-container")?.remove();
|
|
221
|
-
container.querySelector(`.${
|
|
222
|
-
const groupedEvents =
|
|
203
|
+
container.querySelector(`.${Styles.layout.alignment.block.center.className}`)?.remove();
|
|
204
|
+
const groupedEvents = groupEventsByDate(events2);
|
|
223
205
|
let actualEventCount = 0;
|
|
224
206
|
groupedEvents.forEach((group) => {
|
|
225
207
|
if (group.date !== state.getLastDateHeadline()) {
|
|
@@ -233,13 +215,13 @@ const renderGroupedEvents = async (container, events2, state, isThemeDark, isLaz
|
|
|
233
215
|
});
|
|
234
216
|
state.incrementOffset(actualEventCount);
|
|
235
217
|
if (isLazyLoad && state.getTotalEntries() > state.getOffset()) {
|
|
236
|
-
const pagination
|
|
218
|
+
const pagination = new PaginationState({
|
|
237
219
|
totalEntries: state.getTotalEntries(),
|
|
238
220
|
offset: state.getOffset(),
|
|
239
221
|
isLazyLoad: true,
|
|
240
222
|
callback: loadMore
|
|
241
223
|
});
|
|
242
|
-
const paginationElement = pagination
|
|
224
|
+
const paginationElement = pagination.render(container);
|
|
243
225
|
if (paginationElement) {
|
|
244
226
|
state.addStyles(paginationElement.styles);
|
|
245
227
|
}
|
|
@@ -247,20 +229,20 @@ const renderGroupedEvents = async (container, events2, state, isThemeDark, isLaz
|
|
|
247
229
|
await state.updateShadowStyles();
|
|
248
230
|
};
|
|
249
231
|
const renderError = async (container, state, isThemeDark) => {
|
|
250
|
-
const emptyState = new
|
|
232
|
+
const emptyState = new EmptyState({
|
|
251
233
|
message: "No events found",
|
|
252
234
|
isThemeDark
|
|
253
235
|
});
|
|
254
236
|
emptyState.render(container);
|
|
255
237
|
state.addStyles(emptyState.styles);
|
|
256
|
-
const announcer
|
|
257
|
-
container.appendChild(announcer
|
|
258
|
-
|
|
238
|
+
const announcer = new Announcer({ message: "No events found" });
|
|
239
|
+
container.appendChild(announcer.getElement());
|
|
240
|
+
dispatch(container, eventNames.FEED_ERROR, {
|
|
259
241
|
error: "No results found"
|
|
260
242
|
});
|
|
261
243
|
await state.updateShadowStyles();
|
|
262
244
|
};
|
|
263
|
-
const
|
|
245
|
+
const eventsGrouped = (props) => {
|
|
264
246
|
const {
|
|
265
247
|
token,
|
|
266
248
|
isThemeDark = false,
|
|
@@ -268,21 +250,21 @@ const grouped = (props) => {
|
|
|
268
250
|
numberOfRowsToStart,
|
|
269
251
|
categories
|
|
270
252
|
} = props;
|
|
271
|
-
const containerBuilder = new
|
|
253
|
+
const containerBuilder = new ElementBuilder("div").withClassName(
|
|
272
254
|
"events-grouped-feed"
|
|
273
255
|
);
|
|
274
256
|
const container = containerBuilder.getElement();
|
|
275
|
-
const loading
|
|
276
|
-
const state = new GroupedFeedState(loading
|
|
277
|
-
const layoutElement = new
|
|
257
|
+
const loading = new LoadingState({ isThemeDark });
|
|
258
|
+
const state = new GroupedFeedState(loading.styles);
|
|
259
|
+
const layoutElement = new ElementBuilder("div").withClassName("umd-feed-events-grouped").build();
|
|
278
260
|
state.addStyles(layoutElement.styles);
|
|
279
261
|
const loadMore = async () => {
|
|
280
262
|
const fetchProps = createFetchProps(
|
|
281
263
|
{ token, categories, numberOfRowsToStart },
|
|
282
264
|
state.getOffset()
|
|
283
265
|
);
|
|
284
|
-
const variables =
|
|
285
|
-
const entries = await
|
|
266
|
+
const variables = eventsFetchStrategyRange.composeApiVariables(fetchProps);
|
|
267
|
+
const entries = await eventsFetchStrategyRange.fetchEntries(variables);
|
|
286
268
|
if (entries && entries.length > 0) {
|
|
287
269
|
await renderGroupedEvents(
|
|
288
270
|
container,
|
|
@@ -295,17 +277,17 @@ const grouped = (props) => {
|
|
|
295
277
|
}
|
|
296
278
|
};
|
|
297
279
|
const initialize = async () => {
|
|
298
|
-
loading
|
|
280
|
+
loading.show(container);
|
|
299
281
|
const fetchProps = createFetchProps(
|
|
300
282
|
{ token, categories, numberOfRowsToStart },
|
|
301
283
|
0
|
|
302
284
|
);
|
|
303
|
-
const variables =
|
|
285
|
+
const variables = eventsFetchStrategyRange.composeApiVariables(fetchProps);
|
|
304
286
|
const [count, entries] = await Promise.all([
|
|
305
|
-
|
|
306
|
-
|
|
287
|
+
eventsFetchStrategyRange.fetchCount(variables),
|
|
288
|
+
eventsFetchStrategyRange.fetchEntries(variables)
|
|
307
289
|
]);
|
|
308
|
-
loading
|
|
290
|
+
loading.hide();
|
|
309
291
|
if (!entries || entries.length === 0) {
|
|
310
292
|
await renderError(container, state, isThemeDark);
|
|
311
293
|
return;
|
|
@@ -316,7 +298,7 @@ const grouped = (props) => {
|
|
|
316
298
|
"umd-feed-events-grouped-container"
|
|
317
299
|
);
|
|
318
300
|
container.appendChild(layoutElement.element);
|
|
319
|
-
|
|
301
|
+
dispatch(container, eventNames.FEED_LOADED, {
|
|
320
302
|
items: entries,
|
|
321
303
|
count: entries.length,
|
|
322
304
|
total: state.getTotalEntries()
|
|
@@ -334,8 +316,8 @@ const grouped = (props) => {
|
|
|
334
316
|
state.getTotalEntries(),
|
|
335
317
|
isLazyLoad
|
|
336
318
|
);
|
|
337
|
-
const announcer
|
|
338
|
-
container.appendChild(announcer
|
|
319
|
+
const announcer = new Announcer({ message });
|
|
320
|
+
container.appendChild(announcer.getElement());
|
|
339
321
|
};
|
|
340
322
|
initialize();
|
|
341
323
|
const model = containerBuilder.build();
|
|
@@ -349,5 +331,7 @@ const grouped = (props) => {
|
|
|
349
331
|
}
|
|
350
332
|
};
|
|
351
333
|
};
|
|
352
|
-
|
|
334
|
+
export {
|
|
335
|
+
eventsGrouped
|
|
336
|
+
};
|
|
353
337
|
//# sourceMappingURL=grouped.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grouped.js","sources":["../../../source/feeds/events/grouped.ts"],"sourcesContent":["/**\n * Events Grouped Feed (Refactored with Element Builder)\n *\n * Grouped layout for event entries organized by date with dynamic headers.\n * Uses Element Builder pattern with custom grouping logic for date-based organization.\n *\n * @module feeds/events/grouped\n */\n\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport { card } from '@universityofmaryland/web-elements-library/composite';\nimport { events as eventElements } from '@universityofmaryland/web-elements-library/atomic';\nimport {\n createTextWithLink,\n createTextContainer,\n createImageOrLinkedImage,\n} from '@universityofmaryland/web-utilities-library/elements';\nimport { LoadingState, PaginationState, EmptyState, Announcer } from 'states';\nimport { eventsFetchStrategyRange } from 'strategies';\nimport { type EventEntry } from 'types/data';\nimport {\n grouping,\n events as eventUtilities,\n styles as styleUtilities,\n} from '../../helpers';\nimport { type ListProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\n// ============================================================================\n// PURE HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Create base props for fetch strategy\n *\n * @param props - Feed props\n * @param offset - Current offset\n * @returns Base props object for strategy's composeApiVariables\n */\nconst createFetchProps = (\n props: Pick<ListProps, 'token' | 'categories' | 'numberOfRowsToStart'>,\n offset: number,\n) => ({\n token: props.token,\n categories: props.categories,\n numberOfColumnsToShow: 1,\n numberOfRowsToStart: props.numberOfRowsToStart,\n getOffset: () => offset,\n});\n\n/**\n * Create image configuration for event entry\n *\n * @param entry - Event entry\n * @returns Image config object\n */\nconst createImageConfig = (entry: EventEntry) => ({\n imageUrl: entry.image[0].url,\n altText: entry.image[0].altText || 'Event Image',\n linkUrl: entry.url,\n linkLabel: 'University of Maryland Event',\n});\n\n/**\n * Create announcer message\n *\n * @param count - Number of events shown\n * @param total - Total events\n * @param isLazyLoad - Lazy load enabled\n * @returns Announcer message\n */\nconst createAnnouncerMessage = (\n count: number,\n total: number,\n isLazyLoad: boolean,\n): string => {\n return isLazyLoad\n ? `Showing ${count} of ${total} events`\n : `Showing ${count} events`;\n};\n\n// ============================================================================\n// STATE MANAGER CLASS\n// ============================================================================\n\n/**\n * Manages grouped feed state and shadow DOM synchronization\n *\n * Encapsulates all mutable state including offset, total,\n * last date headline tracking, and shadow DOM management.\n */\nclass GroupedFeedState {\n private stylesArray: string[] = [];\n private shadowRoot: ShadowRoot | null = null;\n private totalEntries: number = 0;\n private offset: number = 0;\n private lastDateHeadline: string | null = null;\n\n /**\n * Initialize state with initial styles\n *\n * @param initialStyles - Initial CSS styles\n */\n constructor(initialStyles: string) {\n this.stylesArray.push(initialStyles);\n }\n\n /**\n * Add styles to the accumulated styles\n *\n * @param styles - CSS styles to add\n */\n addStyles(styles: string): void {\n this.stylesArray.push(styles);\n }\n\n /**\n * Set shadow root reference for style updates\n *\n * @param shadow - Shadow root element\n */\n setShadowRoot(shadow: ShadowRoot): void {\n this.shadowRoot = shadow;\n }\n\n /**\n * Update shadow DOM styles\n *\n * @returns Promise that resolves when styles are updated\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 /**\n * Get accumulated styles as single string\n *\n * @returns Combined CSS styles\n */\n getStyles(): string {\n return this.stylesArray.join('\\n');\n }\n\n /**\n * Get shadow root callback for events\n *\n * @returns Callback function for shadow root\n */\n getShadowCallback(): (shadow: ShadowRoot) => void {\n return (shadow) => this.setShadowRoot(shadow);\n }\n\n /**\n * Get current offset\n *\n * @returns Current offset\n */\n getOffset(): number {\n return this.offset;\n }\n\n /**\n * Increment offset by count\n *\n * @param count - Number to increment by\n */\n incrementOffset(count: number): void {\n this.offset += count;\n }\n\n /**\n * Get total entries\n *\n * @returns Total entries\n */\n getTotalEntries(): number {\n return this.totalEntries;\n }\n\n /**\n * Set total entries\n *\n * @param total - Total entries\n */\n setTotalEntries(total: number): void {\n this.totalEntries = total;\n }\n\n /**\n * Get last date headline\n *\n * @returns Last date headline or null\n */\n getLastDateHeadline(): string | null {\n return this.lastDateHeadline;\n }\n\n /**\n * Set last date headline\n *\n * @param headline - Date headline\n */\n setLastDateHeadline(headline: string): void {\n this.lastDateHeadline = headline;\n }\n}\n\n// ============================================================================\n// RENDERING FUNCTIONS\n// ============================================================================\n\n/**\n * Create date header element\n *\n * @param date - Date string\n * @param state - State manager\n * @returns Date header element model\n */\nconst createDateHeader = (\n date: string,\n state: GroupedFeedState,\n): ElementModel => {\n const dateHeadline = document.createElement('p');\n dateHeadline.textContent = date;\n\n const headerElement = new ElementBuilder(dateHeadline)\n .styled(Styles.element.text.decoration.ribbon)\n .withStyles({\n element: {\n margin: `${Styles.token.spacing.lg} 0`,\n },\n })\n .build();\n\n state.addStyles(headerElement.styles);\n return headerElement;\n};\n\n/**\n * Create event card for grouped display\n *\n * @param entry - Event entry\n * @param isThemeDark - Dark theme flag\n * @returns Event card element model\n */\nconst createEventCard = (\n entry: EventEntry,\n isThemeDark: boolean,\n): ElementModel => {\n return card.list({\n headline: createTextWithLink({ text: entry.title, url: entry.url }),\n text: createTextContainer({ text: entry.summary, allowHTML: true }),\n dateSign: eventElements.sign({\n startMonth: entry.startMonth,\n startDay: entry.startDay,\n endMonth: entry.endMonth,\n endDay: entry.endDay,\n isThemeDark,\n isLargeSize: true,\n }),\n eventMeta: eventElements.meta({\n ...entry,\n isThemeDark,\n } as any),\n image: createImageOrLinkedImage(createImageConfig(entry)),\n isAligned: false,\n isThemeDark,\n });\n};\n\n/**\n * Create group container with entries\n *\n * @param events - Event entries for this group\n * @param state - State manager\n * @param isThemeDark - Dark theme flag\n * @returns Group container element model\n */\nconst createGroupContainer = (\n events: EventEntry[],\n state: GroupedFeedState,\n isThemeDark: boolean,\n): ElementModel => {\n const entriesBuilder = new ElementBuilder('div')\n .withClassName('umd-feed-events-grouped-entries')\n .withStyles({\n element: {\n [` > *:not(:last-child)`]: {\n paddingBottom: Styles.token.spacing.md,\n marginBottom: Styles.token.spacing.md,\n borderBottom: `1px solid ${\n isThemeDark\n ? Styles.token.color.gray.dark\n : Styles.token.color.gray.light\n }`,\n },\n [`+ .umd-feed-events-grouped-entries`]: {\n paddingTop: Styles.token.spacing.md,\n marginTop: Styles.token.spacing.md,\n borderTop: `1px solid ${\n isThemeDark\n ? Styles.token.color.gray.dark\n : Styles.token.color.gray.light\n }`,\n },\n },\n });\n\n // Create cards for each event\n events.forEach((entry) => {\n const eventCard = createEventCard(entry, isThemeDark);\n entriesBuilder.withChild(eventCard);\n state.addStyles(eventCard.styles);\n });\n\n const groupElement = entriesBuilder.build();\n state.addStyles(groupElement.styles);\n\n return groupElement;\n};\n\n/**\n * Render grouped events\n *\n * @param container - Container element\n * @param events - Event entries\n * @param state - State manager\n * @param isThemeDark - Dark theme flag\n * @param isLazyLoad - Lazy load enabled\n * @param loadMore - Load more callback\n * @returns Promise that resolves when rendering is complete\n */\nconst renderGroupedEvents = async (\n container: HTMLElement,\n events: EventEntry[],\n state: GroupedFeedState,\n isThemeDark: boolean,\n isLazyLoad: boolean,\n loadMore: () => Promise<void>,\n): Promise<void> => {\n const grid = container.querySelector(\n '#umd-feed-events-grouped-container',\n ) as HTMLElement;\n if (!grid) return;\n\n // Remove existing states\n container.querySelector('.umd-loader-container')?.remove();\n container\n .querySelector(`.${Styles.layout.alignment.block.center.className}`)\n ?.remove();\n\n // Group events by date\n const groupedEvents = grouping.groupEventsByDate(events);\n let actualEventCount = 0;\n\n groupedEvents.forEach((group) => {\n // Add date header if it's a new date\n if (group.date !== state.getLastDateHeadline()) {\n const headerElement = createDateHeader(group.date, state);\n grid.appendChild(headerElement.element);\n state.setLastDateHeadline(group.date);\n }\n\n // Create group container with entries\n const groupElement = createGroupContainer(group.events, state, isThemeDark);\n grid.appendChild(groupElement.element);\n\n actualEventCount += group.events.length;\n });\n\n // Update offset with actual event count\n state.incrementOffset(actualEventCount);\n\n // Add pagination if lazy load enabled\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(container);\n if (paginationElement) {\n state.addStyles(paginationElement.styles);\n }\n }\n\n // Update shadow root styles\n await state.updateShadowStyles();\n};\n\n/**\n * Render error state\n *\n * @param container - Container element\n * @param state - State manager\n * @param isThemeDark - Dark theme flag\n * @returns Promise that resolves when rendering is complete\n */\nconst renderError = async (\n container: HTMLElement,\n state: GroupedFeedState,\n isThemeDark: boolean,\n): Promise<void> => {\n const emptyState = new EmptyState({\n message: 'No events found',\n isThemeDark,\n });\n emptyState.render(container);\n state.addStyles(emptyState.styles);\n\n const announcer = new Announcer({ message: 'No events found' });\n container.appendChild(announcer.getElement());\n\n eventUtilities.dispatch(container, eventUtilities.eventNames.FEED_ERROR, {\n error: 'No results found',\n });\n\n await state.updateShadowStyles();\n};\n\n// ============================================================================\n// MAIN EXPORT\n// ============================================================================\n\n/**\n * Create a grouped events feed\n *\n * Groups events by date with dynamic date headers (Today, day names, formatted dates).\n * Events are sorted by priority within each group (multi-day events starting today first).\n * Uses Element Builder pattern for clean construction.\n *\n * @param props - Feed configuration\n * @returns ElementModel with feed element and styles\n *\n * @example\n * ```typescript\n * const feed = eventsGrouped({\n * token: 'my-token',\n * numberOfRowsToStart: 10,\n * isLazyLoad: true,\n * });\n * ```\n *\n * @example\n * ```typescript\n * // With dark theme\n * const feed = eventsGrouped({\n * token: 'my-token',\n * numberOfRowsToStart: 20,\n * isThemeDark: true,\n * });\n * ```\n */\nexport default (props: ListProps): ElementModel => {\n const {\n token,\n isThemeDark = false,\n isLazyLoad = false,\n numberOfRowsToStart,\n categories,\n } = props;\n\n // Create container using ElementBuilder\n const containerBuilder = new ElementBuilder('div').withClassName(\n 'events-grouped-feed',\n );\n\n // Get element for manipulation (non-destructive)\n const container = containerBuilder.getElement();\n\n // Initialize state management\n const loading = new LoadingState({ isThemeDark });\n const state = new GroupedFeedState(loading.styles);\n\n // Create layout\n const layoutElement = new ElementBuilder('div')\n .withClassName('umd-feed-events-grouped')\n .build();\n state.addStyles(layoutElement.styles);\n\n /**\n * Load more events (for lazy loading)\n */\n const loadMore = async (): Promise<void> => {\n const fetchProps = createFetchProps(\n { token, categories, numberOfRowsToStart },\n state.getOffset(),\n );\n const variables = eventsFetchStrategyRange.composeApiVariables(fetchProps);\n\n const entries = await eventsFetchStrategyRange.fetchEntries(variables);\n if (entries && entries.length > 0) {\n await renderGroupedEvents(\n container,\n entries,\n state,\n isThemeDark,\n isLazyLoad,\n loadMore,\n );\n }\n };\n\n /**\n * Initialize feed\n */\n const initialize = async (): Promise<void> => {\n loading.show(container);\n\n const fetchProps = createFetchProps(\n { token, categories, numberOfRowsToStart },\n 0,\n );\n const variables = eventsFetchStrategyRange.composeApiVariables(fetchProps);\n\n // Fetch count and entries\n const [count, entries] = await Promise.all([\n eventsFetchStrategyRange.fetchCount(variables),\n eventsFetchStrategyRange.fetchEntries(variables),\n ]);\n\n // Remove loading\n loading.hide();\n\n // Handle no results\n if (!entries || entries.length === 0) {\n await renderError(container, state, isThemeDark);\n return;\n }\n\n // Set total and append layout\n state.setTotalEntries(count || entries.length);\n layoutElement.element.setAttribute(\n 'id',\n 'umd-feed-events-grouped-container',\n );\n container.appendChild(layoutElement.element);\n\n // Dispatch loaded event\n eventUtilities.dispatch(container, eventUtilities.eventNames.FEED_LOADED, {\n items: entries,\n count: entries.length,\n total: state.getTotalEntries(),\n });\n\n // Render grouped events\n await renderGroupedEvents(\n container,\n entries,\n state,\n isThemeDark,\n isLazyLoad,\n loadMore,\n );\n\n // Add announcer\n const message = createAnnouncerMessage(\n entries.length,\n state.getTotalEntries(),\n isLazyLoad,\n );\n const announcer = new Announcer({ message });\n container.appendChild(announcer.getElement());\n };\n\n // Start initialization\n initialize();\n\n // Build and return element model\n const model = containerBuilder.build();\n\n return {\n element: model.element,\n get styles() {\n return state.getStyles();\n },\n events: {\n callback: state.getShadowCallback(),\n },\n };\n};\n"],"names":["shadow","styleUtilities.setShadowStyles","ElementBuilder","Styles","card","createTextWithLink","createTextContainer","eventElements","createImageOrLinkedImage","events","grouping.groupEventsByDate","pagination","PaginationState","EmptyState","announcer","Announcer","eventUtilities.dispatch","eventUtilities.eventNames","loading","LoadingState","eventsFetchStrategyRange"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"grouped.js","sources":["../../../source/feeds/events/grouped.ts"],"sourcesContent":["/**\n * Events Grouped Feed (Refactored with Element Builder)\n *\n * Grouped layout for event entries organized by date with dynamic headers.\n * Uses Element Builder pattern with custom grouping logic for date-based organization.\n *\n * @module feeds/events/grouped\n */\n\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport { card } from '@universityofmaryland/web-elements-library/composite';\nimport { events as eventElements } from '@universityofmaryland/web-elements-library/atomic';\nimport {\n createTextWithLink,\n createTextContainer,\n createImageOrLinkedImage,\n} from '@universityofmaryland/web-utilities-library/elements';\nimport { LoadingState, PaginationState, EmptyState, Announcer } from 'states';\nimport { eventsFetchStrategyRange } from 'strategies';\nimport { type EventEntry } from 'types/data';\nimport {\n grouping,\n events as eventUtilities,\n styles as styleUtilities,\n} from '../../helpers';\nimport { type ListProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\n// ============================================================================\n// PURE HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Create base props for fetch strategy\n *\n * @param props - Feed props\n * @param offset - Current offset\n * @returns Base props object for strategy's composeApiVariables\n */\nconst createFetchProps = (\n props: Pick<ListProps, 'token' | 'categories' | 'numberOfRowsToStart'>,\n offset: number,\n) => ({\n token: props.token,\n categories: props.categories,\n numberOfColumnsToShow: 1,\n numberOfRowsToStart: props.numberOfRowsToStart,\n getOffset: () => offset,\n});\n\n/**\n * Create image configuration for event entry\n *\n * @param entry - Event entry\n * @returns Image config object\n */\nconst createImageConfig = (entry: EventEntry) => ({\n imageUrl: entry.image[0].url,\n altText: entry.image[0].altText || 'Event Image',\n linkUrl: entry.url,\n linkLabel: 'University of Maryland Event',\n});\n\n/**\n * Create announcer message\n *\n * @param count - Number of events shown\n * @param total - Total events\n * @param isLazyLoad - Lazy load enabled\n * @returns Announcer message\n */\nconst createAnnouncerMessage = (\n count: number,\n total: number,\n isLazyLoad: boolean,\n): string => {\n return isLazyLoad\n ? `Showing ${count} of ${total} events`\n : `Showing ${count} events`;\n};\n\n// ============================================================================\n// STATE MANAGER CLASS\n// ============================================================================\n\n/**\n * Manages grouped feed state and shadow DOM synchronization\n *\n * Encapsulates all mutable state including offset, total,\n * last date headline tracking, and shadow DOM management.\n */\nclass GroupedFeedState {\n private stylesArray: string[] = [];\n private shadowRoot: ShadowRoot | null = null;\n private totalEntries: number = 0;\n private offset: number = 0;\n private lastDateHeadline: string | null = null;\n\n /**\n * Initialize state with initial styles\n *\n * @param initialStyles - Initial CSS styles\n */\n constructor(initialStyles: string) {\n this.stylesArray.push(initialStyles);\n }\n\n /**\n * Add styles to the accumulated styles\n *\n * @param styles - CSS styles to add\n */\n addStyles(styles: string): void {\n this.stylesArray.push(styles);\n }\n\n /**\n * Set shadow root reference for style updates\n *\n * @param shadow - Shadow root element\n */\n setShadowRoot(shadow: ShadowRoot): void {\n this.shadowRoot = shadow;\n }\n\n /**\n * Update shadow DOM styles\n *\n * @returns Promise that resolves when styles are updated\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 /**\n * Get accumulated styles as single string\n *\n * @returns Combined CSS styles\n */\n getStyles(): string {\n return this.stylesArray.join('\\n');\n }\n\n /**\n * Get shadow root callback for events\n *\n * @returns Callback function for shadow root\n */\n getShadowCallback(): (shadow: ShadowRoot) => void {\n return (shadow) => this.setShadowRoot(shadow);\n }\n\n /**\n * Get current offset\n *\n * @returns Current offset\n */\n getOffset(): number {\n return this.offset;\n }\n\n /**\n * Increment offset by count\n *\n * @param count - Number to increment by\n */\n incrementOffset(count: number): void {\n this.offset += count;\n }\n\n /**\n * Get total entries\n *\n * @returns Total entries\n */\n getTotalEntries(): number {\n return this.totalEntries;\n }\n\n /**\n * Set total entries\n *\n * @param total - Total entries\n */\n setTotalEntries(total: number): void {\n this.totalEntries = total;\n }\n\n /**\n * Get last date headline\n *\n * @returns Last date headline or null\n */\n getLastDateHeadline(): string | null {\n return this.lastDateHeadline;\n }\n\n /**\n * Set last date headline\n *\n * @param headline - Date headline\n */\n setLastDateHeadline(headline: string): void {\n this.lastDateHeadline = headline;\n }\n}\n\n// ============================================================================\n// RENDERING FUNCTIONS\n// ============================================================================\n\n/**\n * Create date header element\n *\n * @param date - Date string\n * @param state - State manager\n * @returns Date header element model\n */\nconst createDateHeader = (\n date: string,\n state: GroupedFeedState,\n): ElementModel => {\n const dateHeadline = document.createElement('p');\n dateHeadline.textContent = date;\n\n const headerElement = new ElementBuilder(dateHeadline)\n .styled(Styles.element.text.decoration.ribbon)\n .withStyles({\n element: {\n margin: `${Styles.token.spacing.lg} 0`,\n },\n })\n .build();\n\n state.addStyles(headerElement.styles);\n return headerElement;\n};\n\n/**\n * Create event card for grouped display\n *\n * @param entry - Event entry\n * @param isThemeDark - Dark theme flag\n * @returns Event card element model\n */\nconst createEventCard = (\n entry: EventEntry,\n isThemeDark: boolean,\n): ElementModel => {\n return card.list({\n headline: createTextWithLink({ text: entry.title, url: entry.url }),\n text: createTextContainer({ text: entry.summary, allowHTML: true }),\n dateSign: eventElements.sign({\n startMonth: entry.startMonth,\n startDay: entry.startDay,\n endMonth: entry.endMonth,\n endDay: entry.endDay,\n isThemeDark,\n isLargeSize: true,\n }),\n eventMeta: eventElements.meta({\n ...entry,\n isThemeDark,\n } as any),\n image: createImageOrLinkedImage(createImageConfig(entry)),\n isAligned: false,\n isThemeDark,\n });\n};\n\n/**\n * Create group container with entries\n *\n * @param events - Event entries for this group\n * @param state - State manager\n * @param isThemeDark - Dark theme flag\n * @returns Group container element model\n */\nconst createGroupContainer = (\n events: EventEntry[],\n state: GroupedFeedState,\n isThemeDark: boolean,\n): ElementModel => {\n const entriesBuilder = new ElementBuilder('div')\n .withClassName('umd-feed-events-grouped-entries')\n .withStyles({\n element: {\n [` > *:not(:last-child)`]: {\n paddingBottom: Styles.token.spacing.md,\n marginBottom: Styles.token.spacing.md,\n borderBottom: `1px solid ${\n isThemeDark\n ? Styles.token.color.gray.dark\n : Styles.token.color.gray.light\n }`,\n },\n [`+ .umd-feed-events-grouped-entries`]: {\n paddingTop: Styles.token.spacing.md,\n marginTop: Styles.token.spacing.md,\n borderTop: `1px solid ${\n isThemeDark\n ? Styles.token.color.gray.dark\n : Styles.token.color.gray.light\n }`,\n },\n },\n });\n\n // Create cards for each event\n events.forEach((entry) => {\n const eventCard = createEventCard(entry, isThemeDark);\n entriesBuilder.withChild(eventCard);\n state.addStyles(eventCard.styles);\n });\n\n const groupElement = entriesBuilder.build();\n state.addStyles(groupElement.styles);\n\n return groupElement;\n};\n\n/**\n * Render grouped events\n *\n * @param container - Container element\n * @param events - Event entries\n * @param state - State manager\n * @param isThemeDark - Dark theme flag\n * @param isLazyLoad - Lazy load enabled\n * @param loadMore - Load more callback\n * @returns Promise that resolves when rendering is complete\n */\nconst renderGroupedEvents = async (\n container: HTMLElement,\n events: EventEntry[],\n state: GroupedFeedState,\n isThemeDark: boolean,\n isLazyLoad: boolean,\n loadMore: () => Promise<void>,\n): Promise<void> => {\n const grid = container.querySelector(\n '#umd-feed-events-grouped-container',\n ) as HTMLElement;\n if (!grid) return;\n\n // Remove existing states\n container.querySelector('.umd-loader-container')?.remove();\n container\n .querySelector(`.${Styles.layout.alignment.block.center.className}`)\n ?.remove();\n\n // Group events by date\n const groupedEvents = grouping.groupEventsByDate(events);\n let actualEventCount = 0;\n\n groupedEvents.forEach((group) => {\n // Add date header if it's a new date\n if (group.date !== state.getLastDateHeadline()) {\n const headerElement = createDateHeader(group.date, state);\n grid.appendChild(headerElement.element);\n state.setLastDateHeadline(group.date);\n }\n\n // Create group container with entries\n const groupElement = createGroupContainer(group.events, state, isThemeDark);\n grid.appendChild(groupElement.element);\n\n actualEventCount += group.events.length;\n });\n\n // Update offset with actual event count\n state.incrementOffset(actualEventCount);\n\n // Add pagination if lazy load enabled\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(container);\n if (paginationElement) {\n state.addStyles(paginationElement.styles);\n }\n }\n\n // Update shadow root styles\n await state.updateShadowStyles();\n};\n\n/**\n * Render error state\n *\n * @param container - Container element\n * @param state - State manager\n * @param isThemeDark - Dark theme flag\n * @returns Promise that resolves when rendering is complete\n */\nconst renderError = async (\n container: HTMLElement,\n state: GroupedFeedState,\n isThemeDark: boolean,\n): Promise<void> => {\n const emptyState = new EmptyState({\n message: 'No events found',\n isThemeDark,\n });\n emptyState.render(container);\n state.addStyles(emptyState.styles);\n\n const announcer = new Announcer({ message: 'No events found' });\n container.appendChild(announcer.getElement());\n\n eventUtilities.dispatch(container, eventUtilities.eventNames.FEED_ERROR, {\n error: 'No results found',\n });\n\n await state.updateShadowStyles();\n};\n\n// ============================================================================\n// MAIN EXPORT\n// ============================================================================\n\n/**\n * Create a grouped events feed\n *\n * Groups events by date with dynamic date headers (Today, day names, formatted dates).\n * Events are sorted by priority within each group (multi-day events starting today first).\n * Uses Element Builder pattern for clean construction.\n *\n * @param props - Feed configuration\n * @returns ElementModel with feed element and styles\n *\n * @example\n * ```typescript\n * const feed = eventsGrouped({\n * token: 'my-token',\n * numberOfRowsToStart: 10,\n * isLazyLoad: true,\n * });\n * ```\n *\n * @example\n * ```typescript\n * // With dark theme\n * const feed = eventsGrouped({\n * token: 'my-token',\n * numberOfRowsToStart: 20,\n * isThemeDark: true,\n * });\n * ```\n */\nexport const eventsGrouped = (props: ListProps): ElementModel => {\n const {\n token,\n isThemeDark = false,\n isLazyLoad = false,\n numberOfRowsToStart,\n categories,\n } = props;\n\n // Create container using ElementBuilder\n const containerBuilder = new ElementBuilder('div').withClassName(\n 'events-grouped-feed',\n );\n\n // Get element for manipulation (non-destructive)\n const container = containerBuilder.getElement();\n\n // Initialize state management\n const loading = new LoadingState({ isThemeDark });\n const state = new GroupedFeedState(loading.styles);\n\n // Create layout\n const layoutElement = new ElementBuilder('div')\n .withClassName('umd-feed-events-grouped')\n .build();\n state.addStyles(layoutElement.styles);\n\n /**\n * Load more events (for lazy loading)\n */\n const loadMore = async (): Promise<void> => {\n const fetchProps = createFetchProps(\n { token, categories, numberOfRowsToStart },\n state.getOffset(),\n );\n const variables = eventsFetchStrategyRange.composeApiVariables(fetchProps);\n\n const entries = await eventsFetchStrategyRange.fetchEntries(variables);\n if (entries && entries.length > 0) {\n await renderGroupedEvents(\n container,\n entries,\n state,\n isThemeDark,\n isLazyLoad,\n loadMore,\n );\n }\n };\n\n /**\n * Initialize feed\n */\n const initialize = async (): Promise<void> => {\n loading.show(container);\n\n const fetchProps = createFetchProps(\n { token, categories, numberOfRowsToStart },\n 0,\n );\n const variables = eventsFetchStrategyRange.composeApiVariables(fetchProps);\n\n // Fetch count and entries\n const [count, entries] = await Promise.all([\n eventsFetchStrategyRange.fetchCount(variables),\n eventsFetchStrategyRange.fetchEntries(variables),\n ]);\n\n // Remove loading\n loading.hide();\n\n // Handle no results\n if (!entries || entries.length === 0) {\n await renderError(container, state, isThemeDark);\n return;\n }\n\n // Set total and append layout\n state.setTotalEntries(count || entries.length);\n layoutElement.element.setAttribute(\n 'id',\n 'umd-feed-events-grouped-container',\n );\n container.appendChild(layoutElement.element);\n\n // Dispatch loaded event\n eventUtilities.dispatch(container, eventUtilities.eventNames.FEED_LOADED, {\n items: entries,\n count: entries.length,\n total: state.getTotalEntries(),\n });\n\n // Render grouped events\n await renderGroupedEvents(\n container,\n entries,\n state,\n isThemeDark,\n isLazyLoad,\n loadMore,\n );\n\n // Add announcer\n const message = createAnnouncerMessage(\n entries.length,\n state.getTotalEntries(),\n isLazyLoad,\n );\n const announcer = new Announcer({ message });\n container.appendChild(announcer.getElement());\n };\n\n // Start initialization\n initialize();\n\n // Build and return element model\n const model = containerBuilder.build();\n\n return {\n element: model.element,\n get styles() {\n return state.getStyles();\n },\n events: {\n callback: state.getShadowCallback(),\n },\n };\n};\n"],"names":["styleUtilities.setShadowStyles","eventElements","events","grouping.groupEventsByDate","eventUtilities.dispatch","eventUtilities.eventNames"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
1
|
+
export { eventsGrid as grid } from './grid';
|
|
2
|
+
export { eventsList as list } from './list';
|
|
3
|
+
export { eventsSlider as slider } from './slider';
|
|
4
|
+
export { eventsGrouped as grouped } from './grouped';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/feeds/events/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/feeds/events/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,UAAU,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAkB5C,OAAO,EAAE,UAAU,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAiB5C,OAAO,EAAE,YAAY,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAkBlD,OAAO,EAAE,aAAa,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { ListProps } from './_types';
|
|
2
2
|
import { ElementModel } from '../../_types';
|
|
3
|
-
declare const
|
|
4
|
-
export default _default;
|
|
3
|
+
export declare const eventsList: (props: ListProps) => ElementModel;
|
|
5
4
|
//# sourceMappingURL=list.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../source/feeds/events/list.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../source/feeds/events/list.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAoBjD,eAAO,MAAM,UAAU,GAAI,OAAO,SAAS,KAAG,YAc1C,CAAC"}
|
|
@@ -1,26 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const list = (props) => createBaseFeed.createBaseFeed({
|
|
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 { eventsDisplayStrategy } from "../../strategies/display/events.js";
|
|
8
|
+
import "@universityofmaryland/web-elements-library/composite";
|
|
9
|
+
import "@universityofmaryland/web-utilities-library/elements";
|
|
10
|
+
import "@universityofmaryland/web-utilities-library/network";
|
|
11
|
+
import { eventsFetchStrategy } from "../../strategies/fetch/events.js";
|
|
12
|
+
import "../../strategies/fetch/news.js";
|
|
13
|
+
import "../../strategies/fetch/experts.js";
|
|
14
|
+
import { stackedLayout } from "../../strategies/layout/grid.js";
|
|
15
|
+
import "@universityofmaryland/web-elements-library/layout";
|
|
16
|
+
const eventsList = (props) => createBaseFeed({
|
|
18
17
|
...props,
|
|
19
18
|
enableCategoryFallback: true,
|
|
20
19
|
cardType: "list",
|
|
21
|
-
fetchStrategy:
|
|
22
|
-
displayStrategy:
|
|
23
|
-
layoutStrategy:
|
|
20
|
+
fetchStrategy: eventsFetchStrategy,
|
|
21
|
+
displayStrategy: eventsDisplayStrategy,
|
|
22
|
+
layoutStrategy: stackedLayout,
|
|
24
23
|
imageConfig: (entry) => ({
|
|
25
24
|
imageUrl: entry.image[0].url,
|
|
26
25
|
altText: entry.image[0].altText || "Event Image",
|
|
@@ -28,5 +27,7 @@ const list = (props) => createBaseFeed.createBaseFeed({
|
|
|
28
27
|
linkLabel: "University of Maryland Event"
|
|
29
28
|
})
|
|
30
29
|
});
|
|
31
|
-
|
|
30
|
+
export {
|
|
31
|
+
eventsList
|
|
32
|
+
};
|
|
32
33
|
//# sourceMappingURL=list.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sources":["../../../source/feeds/events/list.ts"],"sourcesContent":["/**\n * Events List Feed (Factory Pattern)\n *\n * List layout for event entries using the feed factory pattern.\n * This is the NEW implementation using factory + strategies.\n *\n * @module composite/events/list-new\n */\n\nimport { createBaseFeed } from 'factory';\nimport {\n eventsFetchStrategy,\n eventsDisplayStrategy,\n stackedLayout,\n} from 'strategies';\nimport { type ListProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\n/**\n * Create an events list feed\n *\n * @param props - Feed configuration\n * @returns ElementModel with feed element and styles\n *\n * @example\n * ```typescript\n * const feed = eventsList({\n * token: 'my-token',\n * numberOfRowsToStart: 5,\n * isLazyLoad: true,\n * categories: ['sports', 'arts'],\n * });\n *\n * document.body.appendChild(feed.element);\n * ```\n */\nexport
|
|
1
|
+
{"version":3,"file":"list.js","sources":["../../../source/feeds/events/list.ts"],"sourcesContent":["/**\n * Events List Feed (Factory Pattern)\n *\n * List layout for event entries using the feed factory pattern.\n * This is the NEW implementation using factory + strategies.\n *\n * @module composite/events/list-new\n */\n\nimport { createBaseFeed } from 'factory';\nimport {\n eventsFetchStrategy,\n eventsDisplayStrategy,\n stackedLayout,\n} from 'strategies';\nimport { type ListProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\n/**\n * Create an events list feed\n *\n * @param props - Feed configuration\n * @returns ElementModel with feed element and styles\n *\n * @example\n * ```typescript\n * const feed = eventsList({\n * token: 'my-token',\n * numberOfRowsToStart: 5,\n * isLazyLoad: true,\n * categories: ['sports', 'arts'],\n * });\n *\n * document.body.appendChild(feed.element);\n * ```\n */\nexport const eventsList = (props: ListProps): ElementModel =>\n createBaseFeed({\n ...props,\n enableCategoryFallback: true,\n cardType: 'list',\n fetchStrategy: eventsFetchStrategy,\n displayStrategy: eventsDisplayStrategy,\n layoutStrategy: stackedLayout,\n imageConfig: (entry) => ({\n imageUrl: entry.image[0].url,\n altText: entry.image[0].altText || 'Event Image',\n linkUrl: entry.url,\n linkLabel: 'University of Maryland Event',\n }),\n });\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAoCO,MAAM,aAAa,CAAC,UACzB,eAAe;AAAA,EACb,GAAG;AAAA,EACH,wBAAwB;AAAA,EACxB,UAAU;AAAA,EACV,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,aAAa,CAAC,WAAW;AAAA,IACvB,UAAU,MAAM,MAAM,CAAC,EAAE;AAAA,IACzB,SAAS,MAAM,MAAM,CAAC,EAAE,WAAW;AAAA,IACnC,SAAS,MAAM;AAAA,IACf,WAAW;AAAA,EAAA;AAEf,CAAC;"}
|