@universityofmaryland/web-feeds-library 1.2.1 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/composite/events/grouped.d.ts.map +1 -1
- package/dist/composite/events/grouped.js +6 -4
- package/dist/composite/events/grouped.js.map +1 -1
- package/dist/composite/events/grouped.mjs +6 -4
- package/dist/composite/events/grouped.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# University of Maryland Feeds Library
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/@universityofmaryland/web-feeds-library)
|
|
4
4
|
|
|
5
5
|
Dynamic content feed components for displaying University of Maryland news, events, and academic information with automatic updates, caching, and brand-compliant styling.
|
|
6
6
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grouped.d.ts","sourceRoot":"","sources":["../../../source/composite/events/grouped.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,SAAS,EAAoC,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;yBAuGjC,OAAO,SAAS,KAAG,YAAY;AAA/C,
|
|
1
|
+
{"version":3,"file":"grouped.d.ts","sourceRoot":"","sources":["../../../source/composite/events/grouped.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,SAAS,EAAoC,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;yBAuGjC,OAAO,SAAS,KAAG,YAAY;AAA/C,wBA8JO"}
|
|
@@ -182,12 +182,14 @@ const grouped = (props) => (() => {
|
|
|
182
182
|
elementStyles: {
|
|
183
183
|
element: {
|
|
184
184
|
[` > *:not(:last-child)`]: {
|
|
185
|
-
paddingBottom: Styles__namespace.token.spacing.
|
|
186
|
-
marginBottom: Styles__namespace.token.spacing.
|
|
185
|
+
paddingBottom: Styles__namespace.token.spacing.md,
|
|
186
|
+
marginBottom: Styles__namespace.token.spacing.md,
|
|
187
|
+
borderBottom: `1px solid ${isThemeDark ? Styles__namespace.token.color.gray.dark : Styles__namespace.token.color.gray.light}`
|
|
187
188
|
},
|
|
188
189
|
[`+ .umd-feed-events-grouped-entries`]: {
|
|
189
|
-
paddingTop: Styles__namespace.token.spacing.
|
|
190
|
-
marginTop: Styles__namespace.token.spacing.
|
|
190
|
+
paddingTop: Styles__namespace.token.spacing.md,
|
|
191
|
+
marginTop: Styles__namespace.token.spacing.md,
|
|
192
|
+
borderTop: `1px solid ${isThemeDark ? Styles__namespace.token.color.gray.dark : Styles__namespace.token.color.gray.light}`
|
|
191
193
|
}
|
|
192
194
|
}
|
|
193
195
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grouped.js","sources":["../../../source/composite/events/grouped.ts"],"sourcesContent":["import * as Styles from '@universityofmaryland/web-styles-library';\nimport {\n Atomic,\n Composite,\n Model,\n} from '@universityofmaryland/web-elements-library';\nimport * as feedElements from 'elements';\nimport * as feedMacros from 'macros';\nimport * as feedFetch from './common/fetch';\nimport * as feedDisplay from './common/display';\nimport * as dataComposed from './common/data';\nimport { type ListProps, type FeedDisplay, type EventType } from './_types';\nimport { type ElementModel } from '../../_types';\n\ninterface GroupedEvent {\n date: string;\n events: EventType[];\n}\n\nconst getDateBanner = (dateStamp: string): string => {\n // Parse the date string more reliably\n // Handle both \"YYYY-MM-DD\" and ISO format strings\n const dateParts = dateStamp.split('T')[0].split('-');\n const year = parseInt(dateParts[0], 10);\n const month = parseInt(dateParts[1], 10) - 1; // Month is 0-indexed\n const day = parseInt(dateParts[2], 10);\n\n // Create dates using local timezone to avoid timezone shifts\n const eventDate = new Date(year, month, day);\n const currentDate = new Date();\n currentDate.setHours(0, 0, 0, 0);\n\n const weekFromNow = new Date();\n weekFromNow.setDate(currentDate.getDate() + 7);\n weekFromNow.setHours(0, 0, 0, 0);\n\n // Check if it's today\n if (\n eventDate.getFullYear() === currentDate.getFullYear() &&\n eventDate.getMonth() === currentDate.getMonth() &&\n eventDate.getDate() === currentDate.getDate()\n ) {\n return 'Today';\n }\n\n // Check if it's within the next 7 days\n if (\n eventDate.getTime() > currentDate.getTime() &&\n eventDate.getTime() <= weekFromNow.getTime()\n ) {\n const days = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ];\n return days[eventDate.getDay()];\n }\n\n // Otherwise return day of week, month and day\n const days = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ];\n const months = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n ];\n return `${days[eventDate.getDay()]}, ${\n months[eventDate.getMonth()]\n } ${eventDate.getDate()}`;\n};\n\nconst groupEventsByDate = (events: EventType[]): GroupedEvent[] => {\n const grouped = events.reduce((acc, event) => {\n const dateKey = event.startStamp;\n if (!acc[dateKey]) {\n acc[dateKey] = {\n date: getDateBanner(event.startStamp),\n events: [],\n };\n }\n acc[dateKey].events.push(event);\n return acc;\n }, {} as Record<string, GroupedEvent>);\n\n return Object.values(grouped).sort((a, b) => {\n const dateA = new Date(\n Object.keys(grouped).find((key) => grouped[key] === a) || '',\n );\n const dateB = new Date(\n Object.keys(grouped).find((key) => grouped[key] === b) || '',\n );\n return dateA.getTime() - dateB.getTime();\n });\n};\n\nexport default (props: ListProps): ElementModel =>\n (() => {\n const { isThemeDark } = props;\n const loader = feedMacros.loader.create({ isThemeDark });\n const container = document.createElement('div');\n const setTotalEntries = (count: number) => (totalEntries = count);\n const setOffset = (count: number) => (offset = offset + count);\n const setStyles = (additonalStyles: string) => (styles += additonalStyles);\n const getContainer = () => container;\n const getTotalEntries = () => totalEntries;\n const getOffset = () => offset;\n const getStyles = () => styles;\n const getShadowRoot = () => shadowRoot;\n let totalEntries = 0;\n let offset = 0;\n let styles = `\n ${loader.styles}\n `;\n let shadowRoot: ShadowRoot | null = null;\n let lastDateHeadline: string | null = null;\n\n const helperFunctions = {\n setTotalEntries,\n setOffset,\n setStyles,\n getContainer,\n getOffset,\n getTotalEntries,\n getStyles,\n getShadowRoot,\n };\n\n const callback = (shadow: ShadowRoot) => {\n shadowRoot = shadow;\n };\n\n const groupLayout = (): { element: HTMLElement; styles: string } => {\n return Model.ElementModel.createDiv({\n className: 'umd-feed-events-grouped',\n elementStyles: {\n element: {},\n },\n });\n };\n\n const displayResults = async ({ feedData }: FeedDisplay) => {\n const groupedEvents = groupEventsByDate(feedData);\n const entries: { element: HTMLElement; styles: string }[] = [];\n let actualEventCount = 0;\n\n groupedEvents.forEach((group) => {\n if (group.date !== lastDateHeadline) {\n const dateHeadline = document.createElement('p');\n dateHeadline.textContent = group.date;\n\n entries.push(\n Model.ElementModel.text.ribbon({\n element: dateHeadline,\n elementStyles: {\n element: {\n margin: `${Styles.token.spacing.lg} 0`,\n },\n },\n }),\n );\n\n lastDateHeadline = group.date;\n }\n\n const dateEntries = group.events.map((entry) =>\n Composite.card.list({\n ...dataComposed.display({ entry, isThemeDark }),\n dateSign: Atomic.events.sign({\n ...entry,\n isThemeDark,\n isLargeSize: false,\n }),\n image: feedElements.asset.standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: false,\n }),\n );\n\n actualEventCount += group.events.length;\n\n entries.push(\n Model.ElementModel.createDiv({\n className: 'umd-feed-events-grouped-entries',\n children: [...dateEntries],\n elementStyles: {\n element: {\n [` > *:not(:last-child)`]: {\n paddingBottom: Styles.token.spacing.lg,\n marginBottom: Styles.token.spacing.lg,\n },\n\n [`+ .umd-feed-events-grouped-entries`]: {\n paddingTop: Styles.token.spacing.lg,\n marginTop: Styles.token.spacing.lg,\n },\n },\n },\n }),\n );\n });\n\n // Override the offset with actual event count to fix lazy load\n const originalSetOffset = helperFunctions.setOffset;\n helperFunctions.setOffset = () => originalSetOffset(actualEventCount);\n\n await feedDisplay.resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries,\n });\n\n // Restore original setOffset\n helperFunctions.setOffset = originalSetOffset;\n\n if (shadowRoot) {\n feedDisplay.setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n\n container.appendChild(loader.element);\n\n feedFetch.start({\n ...props,\n ...helperFunctions,\n displayResults,\n displayResultStart: feedDisplay.resultStart,\n displayNoResults: feedDisplay.noResults,\n layoutElement: groupLayout(),\n });\n\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n })();\n"],"names":["days","grouped","loader","feedMacros.loader","Model","Styles","Composite","dataComposed.display","Atomic","feedElements.asset.standard","feedDisplay.resultLoad","feedDisplay.setShadowStyles","feedFetch.start","feedDisplay.resultStart","feedDisplay.noResults"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"grouped.js","sources":["../../../source/composite/events/grouped.ts"],"sourcesContent":["import * as Styles from '@universityofmaryland/web-styles-library';\nimport {\n Atomic,\n Composite,\n Model,\n} from '@universityofmaryland/web-elements-library';\nimport * as feedElements from 'elements';\nimport * as feedMacros from 'macros';\nimport * as feedFetch from './common/fetch';\nimport * as feedDisplay from './common/display';\nimport * as dataComposed from './common/data';\nimport { type ListProps, type FeedDisplay, type EventType } from './_types';\nimport { type ElementModel } from '../../_types';\n\ninterface GroupedEvent {\n date: string;\n events: EventType[];\n}\n\nconst getDateBanner = (dateStamp: string): string => {\n // Parse the date string more reliably\n // Handle both \"YYYY-MM-DD\" and ISO format strings\n const dateParts = dateStamp.split('T')[0].split('-');\n const year = parseInt(dateParts[0], 10);\n const month = parseInt(dateParts[1], 10) - 1; // Month is 0-indexed\n const day = parseInt(dateParts[2], 10);\n\n // Create dates using local timezone to avoid timezone shifts\n const eventDate = new Date(year, month, day);\n const currentDate = new Date();\n currentDate.setHours(0, 0, 0, 0);\n\n const weekFromNow = new Date();\n weekFromNow.setDate(currentDate.getDate() + 7);\n weekFromNow.setHours(0, 0, 0, 0);\n\n // Check if it's today\n if (\n eventDate.getFullYear() === currentDate.getFullYear() &&\n eventDate.getMonth() === currentDate.getMonth() &&\n eventDate.getDate() === currentDate.getDate()\n ) {\n return 'Today';\n }\n\n // Check if it's within the next 7 days\n if (\n eventDate.getTime() > currentDate.getTime() &&\n eventDate.getTime() <= weekFromNow.getTime()\n ) {\n const days = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ];\n return days[eventDate.getDay()];\n }\n\n // Otherwise return day of week, month and day\n const days = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ];\n const months = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n ];\n return `${days[eventDate.getDay()]}, ${\n months[eventDate.getMonth()]\n } ${eventDate.getDate()}`;\n};\n\nconst groupEventsByDate = (events: EventType[]): GroupedEvent[] => {\n const grouped = events.reduce((acc, event) => {\n const dateKey = event.startStamp;\n if (!acc[dateKey]) {\n acc[dateKey] = {\n date: getDateBanner(event.startStamp),\n events: [],\n };\n }\n acc[dateKey].events.push(event);\n return acc;\n }, {} as Record<string, GroupedEvent>);\n\n return Object.values(grouped).sort((a, b) => {\n const dateA = new Date(\n Object.keys(grouped).find((key) => grouped[key] === a) || '',\n );\n const dateB = new Date(\n Object.keys(grouped).find((key) => grouped[key] === b) || '',\n );\n return dateA.getTime() - dateB.getTime();\n });\n};\n\nexport default (props: ListProps): ElementModel =>\n (() => {\n const { isThemeDark } = props;\n const loader = feedMacros.loader.create({ isThemeDark });\n const container = document.createElement('div');\n const setTotalEntries = (count: number) => (totalEntries = count);\n const setOffset = (count: number) => (offset = offset + count);\n const setStyles = (additonalStyles: string) => (styles += additonalStyles);\n const getContainer = () => container;\n const getTotalEntries = () => totalEntries;\n const getOffset = () => offset;\n const getStyles = () => styles;\n const getShadowRoot = () => shadowRoot;\n let totalEntries = 0;\n let offset = 0;\n let styles = `\n ${loader.styles}\n `;\n let shadowRoot: ShadowRoot | null = null;\n let lastDateHeadline: string | null = null;\n\n const helperFunctions = {\n setTotalEntries,\n setOffset,\n setStyles,\n getContainer,\n getOffset,\n getTotalEntries,\n getStyles,\n getShadowRoot,\n };\n\n const callback = (shadow: ShadowRoot) => {\n shadowRoot = shadow;\n };\n\n const groupLayout = (): { element: HTMLElement; styles: string } => {\n return Model.ElementModel.createDiv({\n className: 'umd-feed-events-grouped',\n elementStyles: {\n element: {},\n },\n });\n };\n\n const displayResults = async ({ feedData }: FeedDisplay) => {\n const groupedEvents = groupEventsByDate(feedData);\n const entries: { element: HTMLElement; styles: string }[] = [];\n let actualEventCount = 0;\n\n groupedEvents.forEach((group) => {\n if (group.date !== lastDateHeadline) {\n const dateHeadline = document.createElement('p');\n dateHeadline.textContent = group.date;\n\n entries.push(\n Model.ElementModel.text.ribbon({\n element: dateHeadline,\n elementStyles: {\n element: {\n margin: `${Styles.token.spacing.lg} 0`,\n },\n },\n }),\n );\n\n lastDateHeadline = group.date;\n }\n\n const dateEntries = group.events.map((entry) =>\n Composite.card.list({\n ...dataComposed.display({ entry, isThemeDark }),\n dateSign: Atomic.events.sign({\n ...entry,\n isThemeDark,\n isLargeSize: false,\n }),\n image: feedElements.asset.standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: false,\n }),\n );\n\n actualEventCount += group.events.length;\n\n entries.push(\n Model.ElementModel.createDiv({\n className: 'umd-feed-events-grouped-entries',\n children: [...dateEntries],\n elementStyles: {\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\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 );\n });\n\n // Override the offset with actual event count to fix lazy load\n const originalSetOffset = helperFunctions.setOffset;\n helperFunctions.setOffset = () => originalSetOffset(actualEventCount);\n\n await feedDisplay.resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries,\n });\n\n // Restore original setOffset\n helperFunctions.setOffset = originalSetOffset;\n\n if (shadowRoot) {\n feedDisplay.setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n\n container.appendChild(loader.element);\n\n feedFetch.start({\n ...props,\n ...helperFunctions,\n displayResults,\n displayResultStart: feedDisplay.resultStart,\n displayNoResults: feedDisplay.noResults,\n layoutElement: groupLayout(),\n });\n\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n })();\n"],"names":["days","grouped","loader","feedMacros.loader","Model","Styles","Composite","dataComposed.display","Atomic","feedElements.asset.standard","feedDisplay.resultLoad","feedDisplay.setShadowStyles","feedFetch.start","feedDisplay.resultStart","feedDisplay.noResults"],"mappings":"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"}
|
|
@@ -164,12 +164,14 @@ const grouped = (props) => (() => {
|
|
|
164
164
|
elementStyles: {
|
|
165
165
|
element: {
|
|
166
166
|
[` > *:not(:last-child)`]: {
|
|
167
|
-
paddingBottom: Styles.token.spacing.
|
|
168
|
-
marginBottom: Styles.token.spacing.
|
|
167
|
+
paddingBottom: Styles.token.spacing.md,
|
|
168
|
+
marginBottom: Styles.token.spacing.md,
|
|
169
|
+
borderBottom: `1px solid ${isThemeDark ? Styles.token.color.gray.dark : Styles.token.color.gray.light}`
|
|
169
170
|
},
|
|
170
171
|
[`+ .umd-feed-events-grouped-entries`]: {
|
|
171
|
-
paddingTop: Styles.token.spacing.
|
|
172
|
-
marginTop: Styles.token.spacing.
|
|
172
|
+
paddingTop: Styles.token.spacing.md,
|
|
173
|
+
marginTop: Styles.token.spacing.md,
|
|
174
|
+
borderTop: `1px solid ${isThemeDark ? Styles.token.color.gray.dark : Styles.token.color.gray.light}`
|
|
173
175
|
}
|
|
174
176
|
}
|
|
175
177
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grouped.mjs","sources":["../../../source/composite/events/grouped.ts"],"sourcesContent":["import * as Styles from '@universityofmaryland/web-styles-library';\nimport {\n Atomic,\n Composite,\n Model,\n} from '@universityofmaryland/web-elements-library';\nimport * as feedElements from 'elements';\nimport * as feedMacros from 'macros';\nimport * as feedFetch from './common/fetch';\nimport * as feedDisplay from './common/display';\nimport * as dataComposed from './common/data';\nimport { type ListProps, type FeedDisplay, type EventType } from './_types';\nimport { type ElementModel } from '../../_types';\n\ninterface GroupedEvent {\n date: string;\n events: EventType[];\n}\n\nconst getDateBanner = (dateStamp: string): string => {\n // Parse the date string more reliably\n // Handle both \"YYYY-MM-DD\" and ISO format strings\n const dateParts = dateStamp.split('T')[0].split('-');\n const year = parseInt(dateParts[0], 10);\n const month = parseInt(dateParts[1], 10) - 1; // Month is 0-indexed\n const day = parseInt(dateParts[2], 10);\n\n // Create dates using local timezone to avoid timezone shifts\n const eventDate = new Date(year, month, day);\n const currentDate = new Date();\n currentDate.setHours(0, 0, 0, 0);\n\n const weekFromNow = new Date();\n weekFromNow.setDate(currentDate.getDate() + 7);\n weekFromNow.setHours(0, 0, 0, 0);\n\n // Check if it's today\n if (\n eventDate.getFullYear() === currentDate.getFullYear() &&\n eventDate.getMonth() === currentDate.getMonth() &&\n eventDate.getDate() === currentDate.getDate()\n ) {\n return 'Today';\n }\n\n // Check if it's within the next 7 days\n if (\n eventDate.getTime() > currentDate.getTime() &&\n eventDate.getTime() <= weekFromNow.getTime()\n ) {\n const days = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ];\n return days[eventDate.getDay()];\n }\n\n // Otherwise return day of week, month and day\n const days = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ];\n const months = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n ];\n return `${days[eventDate.getDay()]}, ${\n months[eventDate.getMonth()]\n } ${eventDate.getDate()}`;\n};\n\nconst groupEventsByDate = (events: EventType[]): GroupedEvent[] => {\n const grouped = events.reduce((acc, event) => {\n const dateKey = event.startStamp;\n if (!acc[dateKey]) {\n acc[dateKey] = {\n date: getDateBanner(event.startStamp),\n events: [],\n };\n }\n acc[dateKey].events.push(event);\n return acc;\n }, {} as Record<string, GroupedEvent>);\n\n return Object.values(grouped).sort((a, b) => {\n const dateA = new Date(\n Object.keys(grouped).find((key) => grouped[key] === a) || '',\n );\n const dateB = new Date(\n Object.keys(grouped).find((key) => grouped[key] === b) || '',\n );\n return dateA.getTime() - dateB.getTime();\n });\n};\n\nexport default (props: ListProps): ElementModel =>\n (() => {\n const { isThemeDark } = props;\n const loader = feedMacros.loader.create({ isThemeDark });\n const container = document.createElement('div');\n const setTotalEntries = (count: number) => (totalEntries = count);\n const setOffset = (count: number) => (offset = offset + count);\n const setStyles = (additonalStyles: string) => (styles += additonalStyles);\n const getContainer = () => container;\n const getTotalEntries = () => totalEntries;\n const getOffset = () => offset;\n const getStyles = () => styles;\n const getShadowRoot = () => shadowRoot;\n let totalEntries = 0;\n let offset = 0;\n let styles = `\n ${loader.styles}\n `;\n let shadowRoot: ShadowRoot | null = null;\n let lastDateHeadline: string | null = null;\n\n const helperFunctions = {\n setTotalEntries,\n setOffset,\n setStyles,\n getContainer,\n getOffset,\n getTotalEntries,\n getStyles,\n getShadowRoot,\n };\n\n const callback = (shadow: ShadowRoot) => {\n shadowRoot = shadow;\n };\n\n const groupLayout = (): { element: HTMLElement; styles: string } => {\n return Model.ElementModel.createDiv({\n className: 'umd-feed-events-grouped',\n elementStyles: {\n element: {},\n },\n });\n };\n\n const displayResults = async ({ feedData }: FeedDisplay) => {\n const groupedEvents = groupEventsByDate(feedData);\n const entries: { element: HTMLElement; styles: string }[] = [];\n let actualEventCount = 0;\n\n groupedEvents.forEach((group) => {\n if (group.date !== lastDateHeadline) {\n const dateHeadline = document.createElement('p');\n dateHeadline.textContent = group.date;\n\n entries.push(\n Model.ElementModel.text.ribbon({\n element: dateHeadline,\n elementStyles: {\n element: {\n margin: `${Styles.token.spacing.lg} 0`,\n },\n },\n }),\n );\n\n lastDateHeadline = group.date;\n }\n\n const dateEntries = group.events.map((entry) =>\n Composite.card.list({\n ...dataComposed.display({ entry, isThemeDark }),\n dateSign: Atomic.events.sign({\n ...entry,\n isThemeDark,\n isLargeSize: false,\n }),\n image: feedElements.asset.standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: false,\n }),\n );\n\n actualEventCount += group.events.length;\n\n entries.push(\n Model.ElementModel.createDiv({\n className: 'umd-feed-events-grouped-entries',\n children: [...dateEntries],\n elementStyles: {\n element: {\n [` > *:not(:last-child)`]: {\n paddingBottom: Styles.token.spacing.lg,\n marginBottom: Styles.token.spacing.lg,\n },\n\n [`+ .umd-feed-events-grouped-entries`]: {\n paddingTop: Styles.token.spacing.lg,\n marginTop: Styles.token.spacing.lg,\n },\n },\n },\n }),\n );\n });\n\n // Override the offset with actual event count to fix lazy load\n const originalSetOffset = helperFunctions.setOffset;\n helperFunctions.setOffset = () => originalSetOffset(actualEventCount);\n\n await feedDisplay.resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries,\n });\n\n // Restore original setOffset\n helperFunctions.setOffset = originalSetOffset;\n\n if (shadowRoot) {\n feedDisplay.setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n\n container.appendChild(loader.element);\n\n feedFetch.start({\n ...props,\n ...helperFunctions,\n displayResults,\n displayResultStart: feedDisplay.resultStart,\n displayNoResults: feedDisplay.noResults,\n layoutElement: groupLayout(),\n });\n\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n })();\n"],"names":["days","grouped","loader","feedMacros.loader","dataComposed.display","feedElements.asset.standard","feedDisplay.resultLoad","feedDisplay.setShadowStyles","feedFetch.start","feedDisplay.resultStart","feedDisplay.noResults"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"grouped.mjs","sources":["../../../source/composite/events/grouped.ts"],"sourcesContent":["import * as Styles from '@universityofmaryland/web-styles-library';\nimport {\n Atomic,\n Composite,\n Model,\n} from '@universityofmaryland/web-elements-library';\nimport * as feedElements from 'elements';\nimport * as feedMacros from 'macros';\nimport * as feedFetch from './common/fetch';\nimport * as feedDisplay from './common/display';\nimport * as dataComposed from './common/data';\nimport { type ListProps, type FeedDisplay, type EventType } from './_types';\nimport { type ElementModel } from '../../_types';\n\ninterface GroupedEvent {\n date: string;\n events: EventType[];\n}\n\nconst getDateBanner = (dateStamp: string): string => {\n // Parse the date string more reliably\n // Handle both \"YYYY-MM-DD\" and ISO format strings\n const dateParts = dateStamp.split('T')[0].split('-');\n const year = parseInt(dateParts[0], 10);\n const month = parseInt(dateParts[1], 10) - 1; // Month is 0-indexed\n const day = parseInt(dateParts[2], 10);\n\n // Create dates using local timezone to avoid timezone shifts\n const eventDate = new Date(year, month, day);\n const currentDate = new Date();\n currentDate.setHours(0, 0, 0, 0);\n\n const weekFromNow = new Date();\n weekFromNow.setDate(currentDate.getDate() + 7);\n weekFromNow.setHours(0, 0, 0, 0);\n\n // Check if it's today\n if (\n eventDate.getFullYear() === currentDate.getFullYear() &&\n eventDate.getMonth() === currentDate.getMonth() &&\n eventDate.getDate() === currentDate.getDate()\n ) {\n return 'Today';\n }\n\n // Check if it's within the next 7 days\n if (\n eventDate.getTime() > currentDate.getTime() &&\n eventDate.getTime() <= weekFromNow.getTime()\n ) {\n const days = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ];\n return days[eventDate.getDay()];\n }\n\n // Otherwise return day of week, month and day\n const days = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ];\n const months = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n ];\n return `${days[eventDate.getDay()]}, ${\n months[eventDate.getMonth()]\n } ${eventDate.getDate()}`;\n};\n\nconst groupEventsByDate = (events: EventType[]): GroupedEvent[] => {\n const grouped = events.reduce((acc, event) => {\n const dateKey = event.startStamp;\n if (!acc[dateKey]) {\n acc[dateKey] = {\n date: getDateBanner(event.startStamp),\n events: [],\n };\n }\n acc[dateKey].events.push(event);\n return acc;\n }, {} as Record<string, GroupedEvent>);\n\n return Object.values(grouped).sort((a, b) => {\n const dateA = new Date(\n Object.keys(grouped).find((key) => grouped[key] === a) || '',\n );\n const dateB = new Date(\n Object.keys(grouped).find((key) => grouped[key] === b) || '',\n );\n return dateA.getTime() - dateB.getTime();\n });\n};\n\nexport default (props: ListProps): ElementModel =>\n (() => {\n const { isThemeDark } = props;\n const loader = feedMacros.loader.create({ isThemeDark });\n const container = document.createElement('div');\n const setTotalEntries = (count: number) => (totalEntries = count);\n const setOffset = (count: number) => (offset = offset + count);\n const setStyles = (additonalStyles: string) => (styles += additonalStyles);\n const getContainer = () => container;\n const getTotalEntries = () => totalEntries;\n const getOffset = () => offset;\n const getStyles = () => styles;\n const getShadowRoot = () => shadowRoot;\n let totalEntries = 0;\n let offset = 0;\n let styles = `\n ${loader.styles}\n `;\n let shadowRoot: ShadowRoot | null = null;\n let lastDateHeadline: string | null = null;\n\n const helperFunctions = {\n setTotalEntries,\n setOffset,\n setStyles,\n getContainer,\n getOffset,\n getTotalEntries,\n getStyles,\n getShadowRoot,\n };\n\n const callback = (shadow: ShadowRoot) => {\n shadowRoot = shadow;\n };\n\n const groupLayout = (): { element: HTMLElement; styles: string } => {\n return Model.ElementModel.createDiv({\n className: 'umd-feed-events-grouped',\n elementStyles: {\n element: {},\n },\n });\n };\n\n const displayResults = async ({ feedData }: FeedDisplay) => {\n const groupedEvents = groupEventsByDate(feedData);\n const entries: { element: HTMLElement; styles: string }[] = [];\n let actualEventCount = 0;\n\n groupedEvents.forEach((group) => {\n if (group.date !== lastDateHeadline) {\n const dateHeadline = document.createElement('p');\n dateHeadline.textContent = group.date;\n\n entries.push(\n Model.ElementModel.text.ribbon({\n element: dateHeadline,\n elementStyles: {\n element: {\n margin: `${Styles.token.spacing.lg} 0`,\n },\n },\n }),\n );\n\n lastDateHeadline = group.date;\n }\n\n const dateEntries = group.events.map((entry) =>\n Composite.card.list({\n ...dataComposed.display({ entry, isThemeDark }),\n dateSign: Atomic.events.sign({\n ...entry,\n isThemeDark,\n isLargeSize: false,\n }),\n image: feedElements.asset.standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: false,\n }),\n );\n\n actualEventCount += group.events.length;\n\n entries.push(\n Model.ElementModel.createDiv({\n className: 'umd-feed-events-grouped-entries',\n children: [...dateEntries],\n elementStyles: {\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\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 );\n });\n\n // Override the offset with actual event count to fix lazy load\n const originalSetOffset = helperFunctions.setOffset;\n helperFunctions.setOffset = () => originalSetOffset(actualEventCount);\n\n await feedDisplay.resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries,\n });\n\n // Restore original setOffset\n helperFunctions.setOffset = originalSetOffset;\n\n if (shadowRoot) {\n feedDisplay.setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n\n container.appendChild(loader.element);\n\n feedFetch.start({\n ...props,\n ...helperFunctions,\n displayResults,\n displayResultStart: feedDisplay.resultStart,\n displayNoResults: feedDisplay.noResults,\n layoutElement: groupLayout(),\n });\n\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n })();\n"],"names":["days","grouped","loader","feedMacros.loader","dataComposed.display","feedElements.asset.standard","feedDisplay.resultLoad","feedDisplay.setShadowStyles","feedFetch.start","feedDisplay.resultStart","feedDisplay.noResults"],"mappings":"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"}
|