@universityofmaryland/web-feeds-library 1.2.2 → 1.2.6
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/academic/slider.js +2 -0
- package/dist/composite/academic/slider.js.map +1 -1
- package/dist/composite/academic/slider.mjs +2 -0
- package/dist/composite/academic/slider.mjs.map +1 -1
- package/dist/composite/events/common/data.d.ts +1 -5
- package/dist/composite/events/common/data.d.ts.map +1 -1
- package/dist/composite/events/common/data.js +1 -0
- package/dist/composite/events/common/data.js.map +1 -1
- package/dist/composite/events/common/data.mjs +1 -0
- package/dist/composite/events/common/data.mjs.map +1 -1
- package/dist/composite/events/common/display.d.ts +1 -0
- package/dist/composite/events/common/display.d.ts.map +1 -1
- package/dist/composite/events/common/display.js +2 -1
- package/dist/composite/events/common/display.js.map +1 -1
- package/dist/composite/events/common/display.mjs +2 -1
- package/dist/composite/events/common/display.mjs.map +1 -1
- package/dist/composite/events/common/fetch.d.ts +3 -0
- package/dist/composite/events/common/fetch.d.ts.map +1 -1
- package/dist/composite/events/common/fetch.js +20 -8
- package/dist/composite/events/common/fetch.js.map +1 -1
- package/dist/composite/events/common/fetch.mjs +20 -8
- package/dist/composite/events/common/fetch.mjs.map +1 -1
- package/dist/composite/events/common/queries.d.ts +4 -2
- package/dist/composite/events/common/queries.d.ts.map +1 -1
- package/dist/composite/events/common/queries.js +10 -4
- package/dist/composite/events/common/queries.js.map +1 -1
- package/dist/composite/events/common/queries.mjs +11 -5
- package/dist/composite/events/common/queries.mjs.map +1 -1
- package/dist/composite/events/grid.js +2 -0
- package/dist/composite/events/grid.js.map +1 -1
- package/dist/composite/events/grid.mjs +2 -0
- package/dist/composite/events/grid.mjs.map +1 -1
- package/dist/composite/events/grouped.d.ts.map +1 -1
- package/dist/composite/events/grouped.js +94 -37
- package/dist/composite/events/grouped.js.map +1 -1
- package/dist/composite/events/grouped.mjs +95 -38
- package/dist/composite/events/grouped.mjs.map +1 -1
- package/dist/composite/events/list.js +2 -0
- package/dist/composite/events/list.js.map +1 -1
- package/dist/composite/events/list.mjs +2 -0
- package/dist/composite/events/list.mjs.map +1 -1
- package/dist/composite/events/slider.js +2 -0
- package/dist/composite/events/slider.js.map +1 -1
- package/dist/composite/events/slider.mjs +2 -0
- package/dist/composite/events/slider.mjs.map +1 -1
- package/dist/composite/news/common/data.js +1 -0
- package/dist/composite/news/common/data.js.map +1 -1
- package/dist/composite/news/common/data.mjs +1 -0
- package/dist/composite/news/common/data.mjs.map +1 -1
- package/dist/composite/news/common/fetch.js +3 -1
- package/dist/composite/news/common/fetch.js.map +1 -1
- package/dist/composite/news/common/fetch.mjs +3 -1
- package/dist/composite/news/common/fetch.mjs.map +1 -1
- package/dist/composite/news/featured.js +2 -0
- package/dist/composite/news/featured.js.map +1 -1
- package/dist/composite/news/featured.mjs +2 -0
- package/dist/composite/news/featured.mjs.map +1 -1
- package/dist/composite/news/grid.js +2 -0
- package/dist/composite/news/grid.js.map +1 -1
- package/dist/composite/news/grid.mjs +2 -0
- package/dist/composite/news/grid.mjs.map +1 -1
- package/dist/composite/news/list.js +2 -0
- package/dist/composite/news/list.js.map +1 -1
- package/dist/composite/news/list.mjs +2 -0
- package/dist/composite/news/list.mjs.map +1 -1
- package/dist/elements/layout.d.ts +5 -17
- package/dist/elements/layout.d.ts.map +1 -1
- package/dist/elements/layout.js +36 -44
- package/dist/elements/layout.js.map +1 -1
- package/dist/elements/layout.mjs +37 -45
- package/dist/elements/layout.mjs.map +1 -1
- package/dist/macros/lazy-load.d.ts +2 -5
- package/dist/macros/lazy-load.d.ts.map +1 -1
- package/dist/macros/lazy-load.js +9 -18
- package/dist/macros/lazy-load.js.map +1 -1
- package/dist/macros/lazy-load.mjs +9 -18
- package/dist/macros/lazy-load.mjs.map +1 -1
- package/dist/macros/loader.d.ts +2 -5
- package/dist/macros/loader.d.ts.map +1 -1
- package/dist/macros/loader.js +39 -59
- package/dist/macros/loader.js.map +1 -1
- package/dist/macros/loader.mjs +39 -59
- package/dist/macros/loader.mjs.map +1 -1
- package/dist/macros/no-results.d.ts +2 -5
- package/dist/macros/no-results.d.ts.map +1 -1
- package/dist/macros/no-results.js +21 -26
- package/dist/macros/no-results.js.map +1 -1
- package/dist/macros/no-results.mjs +21 -26
- package/dist/macros/no-results.mjs.map +1 -1
- package/dist/macros/slider.d.ts.map +1 -1
- package/dist/macros/slider.js +2 -4
- package/dist/macros/slider.js.map +1 -1
- package/dist/macros/slider.mjs +2 -4
- package/dist/macros/slider.mjs.map +1 -1
- package/package.json +12 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.mjs","sources":["../../../../source/composite/events/common/queries.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"queries.mjs","sources":["../../../../source/composite/events/common/queries.ts"],"sourcesContent":["type DateFilterType = 'startsAfterOrAt' | 'rangeStart';\n\nconst buildEventsCountQuery = (\n dateFilter: DateFilterType = 'startsAfterOrAt',\n) => `\nquery getEventsCount($startDate: String!, $related: [QueryArgument]) {\n count: solspace_calendar {\n events(relatedTo: $related, loadOccurrences: true, ${dateFilter}: $startDate) {\n ... on communications_Event {\n id\n }\n ... on submission_Event {\n id\n }\n }\n }\n}\n`;\n\nconst buildEventsQuery = (dateFilter: DateFilterType = 'startsAfterOrAt') => `\nquery getEvents($startDate: String!, $related: [QueryArgument], $limit: Int, $offset: Int) {\n entries: solspace_calendar {\n events(\n relatedTo: $related\n loadOccurrences: true\n ${dateFilter}: $startDate\n limit: $limit\n offset: $offset\n ) {\n ... on communications_Event {\n id\n title\n url\n startDayOfWeek: startDate @formatDateTime(format: \"D\")\n startMonth: startDate @formatDateTime(format: \"M\")\n startDay: startDate @formatDateTime(format: \"d\")\n startStamp: startDate @formatDateTime(format: \"Y-m-d\")\n startTime: startDate @formatDateTime(format: \"g:ia\")\n endDayOfWeek: endDate @formatDateTime(format: \"D\")\n endMonth: endDate @formatDateTime(format: \"M\")\n endDay: endDate @formatDateTime(format: \"d\")\n endTime: endDate @formatDateTime(format: \"g:ia\")\n allDay\n desciption: commonRichText\n summary: commonRichTextTwo\n image: commonAssetHeroImageSingle {\n title\n commonPlainTextTwo: alt\n url\n }\n location: categoriesCampusBuildingSingle {\n title\n }\n link: commonEntriesLinkSingle {\n ... on links_links_Entry {\n type: linksDropdownSelector\n externalUrl: commonPlainTextThree\n altTitle: commonPlainTextTwo\n title\n internalLinks: calendarEntriesEvent {\n id\n url\n }\n }\n }\n }\n ... on submission_Event {\n id\n title\n url\n startDayOfWeek: startDate @formatDateTime(format: \"D\")\n startMonth: startDate @formatDateTime(format: \"M\")\n startDay: startDate @formatDateTime(format: \"d\")\n startStamp: startDate @formatDateTime(format: \"Y-m-d\")\n startTime: startDate @formatDateTime(format: \"g:ia\")\n endDayOfWeek: endDate @formatDateTime(format: \"D\")\n endMonth: endDate @formatDateTime(format: \"M\")\n endDay: endDate @formatDateTime(format: \"d\")\n endTime: endDate @formatDateTime(format: \"g:ia\")\n allDay\n desciption: commonRichText\n summary: commonRichTextTwo\n image: commonAssetHeroImageSingle {\n title\n commonPlainTextTwo: alt\n url\n }\n location: categoriesCampusBuildingSingle {\n title\n }\n link: commonEntriesLinkSingle {\n ... on links_links_Entry {\n type: linksDropdownSelector\n externalUrl: commonPlainTextThree\n altTitle: commonPlainTextTwo\n title\n internalLinks: calendarEntriesEvent {\n id\n url\n }\n }\n }\n }\n }\n }\n}\n`;\n\nexport const EVENTS_COUNT_QUERY = buildEventsCountQuery();\nexport const EVENTS_COUNT_RANGE_QUERY = buildEventsCountQuery('rangeStart');\n\nexport const EVENTS_QUERY = buildEventsQuery();\nexport const EVENTS_RANGE_QUERY = buildEventsQuery('rangeStart');\n"],"names":[],"mappings":"AAEA,MAAM,wBAAwB,CAC5B,aAA6B,sBAC1B;AAAA;AAAA;AAAA,yDAGoD,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYnE,MAAM,mBAAmB,CAAC,aAA6B,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAMrE,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmFX,MAAM,qBAAqB,sBAAA;AAC3B,MAAM,2BAA2B,sBAAsB,YAAY;AAEnE,MAAM,eAAe,iBAAA;AACrB,MAAM,qBAAqB,iBAAiB,YAAY;"}
|
|
@@ -3,7 +3,9 @@ const webElementsLibrary = require("@universityofmaryland/web-elements-library")
|
|
|
3
3
|
const asset = require("../../elements/asset.js");
|
|
4
4
|
const layout = require("../../elements/layout.js");
|
|
5
5
|
require("@universityofmaryland/web-styles-library");
|
|
6
|
+
require("@universityofmaryland/web-builder-library");
|
|
6
7
|
const loader = require("../../macros/loader.js");
|
|
8
|
+
require("@universityofmaryland/web-utilities-library/theme");
|
|
7
9
|
require("@universityofmaryland/web-utilities-library/network");
|
|
8
10
|
require("@universityofmaryland/web-elements-library/composite");
|
|
9
11
|
require("@universityofmaryland/web-elements-library/atomic");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid.js","sources":["../../../source/composite/events/grid.ts"],"sourcesContent":["import { Composite } 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 BlockProps, type FeedDisplay } from './_types';\nimport { type ElementModel } from '../../_types';\n\nexport default (props: BlockProps): ElementModel =>\n (() => {\n const { isThemeDark, isTransparent, numberOfColumnsToShow } = 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\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 displayResults = async ({ feedData }: FeedDisplay) => {\n await feedDisplay.resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries: feedData.map((entry) =>\n Composite.card.block({\n ...dataComposed.display({ entry, isThemeDark }),\n image: feedElements.asset.standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: false,\n isTransparent,\n }),\n ),\n });\n\n if (shadowRoot) {\n feedDisplay.setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n\n const layoutElement = feedElements.layout.gridGap({\n count: numberOfColumnsToShow,\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,\n isThemeDark,\n });\n\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n })();\n"],"names":["loader","feedMacros.loader","feedDisplay.resultLoad","Composite","dataComposed.display","feedElements.asset.standard","feedDisplay.setShadowStyles","feedElements.layout.gridGap","feedFetch.start","feedDisplay.resultStart","feedDisplay.noResults"],"mappings":"
|
|
1
|
+
{"version":3,"file":"grid.js","sources":["../../../source/composite/events/grid.ts"],"sourcesContent":["import { Composite } 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 BlockProps, type FeedDisplay } from './_types';\nimport { type ElementModel } from '../../_types';\n\nexport default (props: BlockProps): ElementModel =>\n (() => {\n const { isThemeDark, isTransparent, numberOfColumnsToShow } = 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\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 displayResults = async ({ feedData }: FeedDisplay) => {\n await feedDisplay.resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries: feedData.map((entry) =>\n Composite.card.block({\n ...dataComposed.display({ entry, isThemeDark }),\n image: feedElements.asset.standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: false,\n isTransparent,\n }),\n ),\n });\n\n if (shadowRoot) {\n feedDisplay.setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n\n const layoutElement = feedElements.layout.gridGap({\n count: numberOfColumnsToShow,\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,\n isThemeDark,\n });\n\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n })();\n"],"names":["loader","feedMacros.loader","feedDisplay.resultLoad","Composite","dataComposed.display","feedElements.asset.standard","feedDisplay.setShadowStyles","feedElements.layout.gridGap","feedFetch.start","feedDisplay.resultStart","feedDisplay.noResults"],"mappings":";;;;;;;;;;;;;;AASA,MAAA,OAAe,CAAC,WACb,MAAM;AACL,QAAM,EAAE,aAAa,eAAe,sBAAA,IAA0B;AAC9D,QAAMA,WAASC,OAAkB,OAAO,EAAE,aAAa;AACvD,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,QAAM,kBAAkB,CAAC,UAAmB,eAAe;AAC3D,QAAM,YAAY,CAAC,UAAmB,SAAS,SAAS;AACxD,QAAM,YAAY,CAAC,oBAA6B,UAAU;AAC1D,QAAM,eAAe,MAAM;AAC3B,QAAM,kBAAkB,MAAM;AAC9B,QAAM,YAAY,MAAM;AACxB,QAAM,YAAY,MAAM;AACxB,QAAM,gBAAgB,MAAM;AAC5B,MAAI,eAAe;AACnB,MAAI,SAAS;AACb,MAAI,SAAS;AAAA,QACTD,SAAO,MAAM;AAAA;AAEjB,MAAI,aAAgC;AAEpC,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,QAAM,WAAW,CAAC,WAAuB;AACvC,iBAAa;AAAA,EACf;AAEA,QAAM,iBAAiB,OAAO,EAAE,eAA4B;AAC1D,UAAME,mBAAuB;AAAA,MAC3B,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA,SAAS,SAAS;AAAA,QAAI,CAAC,UACrBC,mBAAAA,UAAU,KAAK,MAAM;AAAA,UACnB,GAAGC,aAAqB,EAAE,OAAO,aAAa;AAAA,UAC9C,OAAOC,MAAAA,SAA4B;AAAA,YACjC,QAAQ,MAAM;AAAA,YACd,KAAK,MAAM;AAAA,UAAA,CACZ;AAAA,UACD,WAAW;AAAA,UACX;AAAA,QAAA,CACD;AAAA,MAAA;AAAA,IACH,CACD;AAED,QAAI,YAAY;AACdC,8BAA4B;AAAA,QAC1B;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IACH;AAAA,EACF;AAEA,QAAM,gBAAgBC,OAAAA,QAA4B;AAAA,IAChD,OAAO;AAAA,EAAA,CACR;AACD,YAAU,YAAYP,SAAO,OAAO;AAEpCQ,cAAgB;AAAA,IACd,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,IACA,oBAAoBC,QAAAA;AAAAA,IACpB,kBAAkBC,QAAAA;AAAAA,IAClB;AAAA,IACA;AAAA,EAAA,CACD;AAED,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,QAAQ;AAAA,MACN;AAAA,IAAA;AAAA,EACF;AAEJ,GAAA;;"}
|
|
@@ -2,7 +2,9 @@ import { Composite } from "@universityofmaryland/web-elements-library";
|
|
|
2
2
|
import { standard } from "../../elements/asset.mjs";
|
|
3
3
|
import { gridGap } from "../../elements/layout.mjs";
|
|
4
4
|
import "@universityofmaryland/web-styles-library";
|
|
5
|
+
import "@universityofmaryland/web-builder-library";
|
|
5
6
|
import loader from "../../macros/loader.mjs";
|
|
7
|
+
import "@universityofmaryland/web-utilities-library/theme";
|
|
6
8
|
import "@universityofmaryland/web-utilities-library/network";
|
|
7
9
|
import "@universityofmaryland/web-elements-library/composite";
|
|
8
10
|
import "@universityofmaryland/web-elements-library/atomic";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid.mjs","sources":["../../../source/composite/events/grid.ts"],"sourcesContent":["import { Composite } 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 BlockProps, type FeedDisplay } from './_types';\nimport { type ElementModel } from '../../_types';\n\nexport default (props: BlockProps): ElementModel =>\n (() => {\n const { isThemeDark, isTransparent, numberOfColumnsToShow } = 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\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 displayResults = async ({ feedData }: FeedDisplay) => {\n await feedDisplay.resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries: feedData.map((entry) =>\n Composite.card.block({\n ...dataComposed.display({ entry, isThemeDark }),\n image: feedElements.asset.standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: false,\n isTransparent,\n }),\n ),\n });\n\n if (shadowRoot) {\n feedDisplay.setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n\n const layoutElement = feedElements.layout.gridGap({\n count: numberOfColumnsToShow,\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,\n isThemeDark,\n });\n\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n })();\n"],"names":["loader","feedMacros.loader","feedDisplay.resultLoad","dataComposed.display","feedElements.asset.standard","feedDisplay.setShadowStyles","feedElements.layout.gridGap","feedFetch.start","feedDisplay.resultStart","feedDisplay.noResults"],"mappings":"
|
|
1
|
+
{"version":3,"file":"grid.mjs","sources":["../../../source/composite/events/grid.ts"],"sourcesContent":["import { Composite } 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 BlockProps, type FeedDisplay } from './_types';\nimport { type ElementModel } from '../../_types';\n\nexport default (props: BlockProps): ElementModel =>\n (() => {\n const { isThemeDark, isTransparent, numberOfColumnsToShow } = 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\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 displayResults = async ({ feedData }: FeedDisplay) => {\n await feedDisplay.resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries: feedData.map((entry) =>\n Composite.card.block({\n ...dataComposed.display({ entry, isThemeDark }),\n image: feedElements.asset.standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: false,\n isTransparent,\n }),\n ),\n });\n\n if (shadowRoot) {\n feedDisplay.setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n\n const layoutElement = feedElements.layout.gridGap({\n count: numberOfColumnsToShow,\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,\n isThemeDark,\n });\n\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n })();\n"],"names":["loader","feedMacros.loader","feedDisplay.resultLoad","dataComposed.display","feedElements.asset.standard","feedDisplay.setShadowStyles","feedElements.layout.gridGap","feedFetch.start","feedDisplay.resultStart","feedDisplay.noResults"],"mappings":";;;;;;;;;;;;;AASA,MAAA,OAAe,CAAC,WACb,MAAM;AACL,QAAM,EAAE,aAAa,eAAe,sBAAA,IAA0B;AAC9D,QAAMA,WAASC,OAAkB,OAAO,EAAE,aAAa;AACvD,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,QAAM,kBAAkB,CAAC,UAAmB,eAAe;AAC3D,QAAM,YAAY,CAAC,UAAmB,SAAS,SAAS;AACxD,QAAM,YAAY,CAAC,oBAA6B,UAAU;AAC1D,QAAM,eAAe,MAAM;AAC3B,QAAM,kBAAkB,MAAM;AAC9B,QAAM,YAAY,MAAM;AACxB,QAAM,YAAY,MAAM;AACxB,QAAM,gBAAgB,MAAM;AAC5B,MAAI,eAAe;AACnB,MAAI,SAAS;AACb,MAAI,SAAS;AAAA,QACTD,SAAO,MAAM;AAAA;AAEjB,MAAI,aAAgC;AAEpC,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,QAAM,WAAW,CAAC,WAAuB;AACvC,iBAAa;AAAA,EACf;AAEA,QAAM,iBAAiB,OAAO,EAAE,eAA4B;AAC1D,UAAME,WAAuB;AAAA,MAC3B,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA,SAAS,SAAS;AAAA,QAAI,CAAC,UACrB,UAAU,KAAK,MAAM;AAAA,UACnB,GAAGC,QAAqB,EAAE,OAAO,aAAa;AAAA,UAC9C,OAAOC,SAA4B;AAAA,YACjC,QAAQ,MAAM;AAAA,YACd,KAAK,MAAM;AAAA,UAAA,CACZ;AAAA,UACD,WAAW;AAAA,UACX;AAAA,QAAA,CACD;AAAA,MAAA;AAAA,IACH,CACD;AAED,QAAI,YAAY;AACdC,sBAA4B;AAAA,QAC1B;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IACH;AAAA,EACF;AAEA,QAAM,gBAAgBC,QAA4B;AAAA,IAChD,OAAO;AAAA,EAAA,CACR;AACD,YAAU,YAAYN,SAAO,OAAO;AAEpCO,QAAgB;AAAA,IACd,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,IACA,oBAAoBC;AAAAA,IACpB,kBAAkBC;AAAAA,IAClB;AAAA,IACA;AAAA,EAAA,CACD;AAED,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,QAAQ;AAAA,MACN;AAAA,IAAA;AAAA,EACF;AAEJ,GAAA;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grouped.d.ts","sourceRoot":"","sources":["../../../source/composite/events/grouped.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"grouped.d.ts","sourceRoot":"","sources":["../../../source/composite/events/grouped.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,SAAS,EAAoC,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;yBAwLjC,OAAO,SAAS,KAAG,YAAY;AAA/C,wBA8JO"}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const Styles = require("@universityofmaryland/web-styles-library");
|
|
3
|
+
const webBuilderLibrary = require("@universityofmaryland/web-builder-library");
|
|
3
4
|
const webElementsLibrary = require("@universityofmaryland/web-elements-library");
|
|
4
5
|
const asset = require("../../elements/asset.js");
|
|
5
6
|
const loader = require("../../macros/loader.js");
|
|
7
|
+
require("@universityofmaryland/web-utilities-library/theme");
|
|
6
8
|
require("@universityofmaryland/web-utilities-library/network");
|
|
7
9
|
require("@universityofmaryland/web-elements-library/composite");
|
|
8
10
|
require("@universityofmaryland/web-elements-library/atomic");
|
|
9
11
|
const fetch = require("./common/fetch.js");
|
|
10
12
|
const display = require("./common/display.js");
|
|
11
13
|
const data = require("./common/data.js");
|
|
14
|
+
const queries = require("./common/queries.js");
|
|
12
15
|
function _interopNamespaceDefault(e) {
|
|
13
16
|
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
14
17
|
if (e) {
|
|
@@ -77,18 +80,81 @@ const getDateBanner = (dateStamp) => {
|
|
|
77
80
|
];
|
|
78
81
|
return `${days[eventDate.getDay()]}, ${months[eventDate.getMonth()]} ${eventDate.getDate()}`;
|
|
79
82
|
};
|
|
83
|
+
const MONTH_MAP = {
|
|
84
|
+
Jan: "01",
|
|
85
|
+
Feb: "02",
|
|
86
|
+
Mar: "03",
|
|
87
|
+
Apr: "04",
|
|
88
|
+
May: "05",
|
|
89
|
+
Jun: "06",
|
|
90
|
+
Jul: "07",
|
|
91
|
+
Aug: "08",
|
|
92
|
+
Sep: "09",
|
|
93
|
+
Oct: "10",
|
|
94
|
+
Nov: "11",
|
|
95
|
+
Dec: "12"
|
|
96
|
+
};
|
|
97
|
+
const parseLocalDate = (dateString) => {
|
|
98
|
+
const parts = dateString.split("-");
|
|
99
|
+
const date = new Date(
|
|
100
|
+
parseInt(parts[0], 10),
|
|
101
|
+
parseInt(parts[1], 10) - 1,
|
|
102
|
+
parseInt(parts[2], 10)
|
|
103
|
+
);
|
|
104
|
+
date.setHours(0, 0, 0, 0);
|
|
105
|
+
return date;
|
|
106
|
+
};
|
|
107
|
+
const getEventStartDate = (event) => {
|
|
108
|
+
return parseLocalDate(event.startStamp.split("T")[0]);
|
|
109
|
+
};
|
|
110
|
+
const isMultiDayEvent = (event) => {
|
|
111
|
+
const startParts = event.startStamp.split("T")[0].split("-");
|
|
112
|
+
const startMonth = startParts[1];
|
|
113
|
+
const startDay = startParts[2];
|
|
114
|
+
const endMonth = MONTH_MAP[event.endMonth];
|
|
115
|
+
const endDay = event.endDay.padStart(2, "0");
|
|
116
|
+
return !(startMonth === endMonth && startDay === endDay);
|
|
117
|
+
};
|
|
118
|
+
const eventStartsOnDate = (event, targetDate) => {
|
|
119
|
+
const eventStartDate = getEventStartDate(event);
|
|
120
|
+
return eventStartDate.getTime() === targetDate.getTime();
|
|
121
|
+
};
|
|
122
|
+
const getEventPriority = (event, groupDate) => {
|
|
123
|
+
const isMulti = isMultiDayEvent(event);
|
|
124
|
+
const startsOnDate = eventStartsOnDate(event, groupDate);
|
|
125
|
+
if (isMulti && startsOnDate) return 1;
|
|
126
|
+
if (!isMulti) return 2;
|
|
127
|
+
return 3;
|
|
128
|
+
};
|
|
129
|
+
const sortEventsByPriority = (events, groupDate) => {
|
|
130
|
+
return [...events].sort((a, b) => {
|
|
131
|
+
const aPriority = getEventPriority(a, groupDate);
|
|
132
|
+
const bPriority = getEventPriority(b, groupDate);
|
|
133
|
+
return aPriority - bPriority;
|
|
134
|
+
});
|
|
135
|
+
};
|
|
80
136
|
const groupEventsByDate = (events) => {
|
|
137
|
+
const currentDate = /* @__PURE__ */ new Date();
|
|
138
|
+
currentDate.setHours(0, 0, 0, 0);
|
|
81
139
|
const grouped2 = events.reduce((acc, event) => {
|
|
82
|
-
const
|
|
140
|
+
const eventDate = getEventStartDate(event);
|
|
141
|
+
const dateKey = eventDate < currentDate ? currentDate.toISOString().split("T")[0] : event.startStamp;
|
|
83
142
|
if (!acc[dateKey]) {
|
|
84
143
|
acc[dateKey] = {
|
|
85
|
-
date: getDateBanner(
|
|
144
|
+
date: getDateBanner(dateKey),
|
|
86
145
|
events: []
|
|
87
146
|
};
|
|
88
147
|
}
|
|
89
148
|
acc[dateKey].events.push(event);
|
|
90
149
|
return acc;
|
|
91
150
|
}, {});
|
|
151
|
+
Object.keys(grouped2).forEach((dateKey) => {
|
|
152
|
+
const groupDate = parseLocalDate(dateKey);
|
|
153
|
+
grouped2[dateKey].events = sortEventsByPriority(
|
|
154
|
+
grouped2[dateKey].events,
|
|
155
|
+
groupDate
|
|
156
|
+
);
|
|
157
|
+
});
|
|
92
158
|
return Object.values(grouped2).sort((a, b) => {
|
|
93
159
|
const dateA = new Date(
|
|
94
160
|
Object.keys(grouped2).find((key) => grouped2[key] === a) || ""
|
|
@@ -132,12 +198,7 @@ const grouped = (props) => (() => {
|
|
|
132
198
|
shadowRoot = shadow;
|
|
133
199
|
};
|
|
134
200
|
const groupLayout = () => {
|
|
135
|
-
return
|
|
136
|
-
className: "umd-feed-events-grouped",
|
|
137
|
-
elementStyles: {
|
|
138
|
-
element: {}
|
|
139
|
-
}
|
|
140
|
-
});
|
|
201
|
+
return new webBuilderLibrary.ElementBuilder().withClassName("umd-feed-events-grouped").build();
|
|
141
202
|
};
|
|
142
203
|
const displayResults = async ({ feedData }) => {
|
|
143
204
|
const groupedEvents = groupEventsByDate(feedData);
|
|
@@ -148,14 +209,11 @@ const grouped = (props) => (() => {
|
|
|
148
209
|
const dateHeadline = document.createElement("p");
|
|
149
210
|
dateHeadline.textContent = group.date;
|
|
150
211
|
entries.push(
|
|
151
|
-
|
|
152
|
-
element:
|
|
153
|
-
|
|
154
|
-
element: {
|
|
155
|
-
margin: `${Styles__namespace.token.spacing.lg} 0`
|
|
156
|
-
}
|
|
212
|
+
new webBuilderLibrary.ElementBuilder(dateHeadline).styled(Styles__namespace.element.text.decoration.ribbon).withStyles({
|
|
213
|
+
element: {
|
|
214
|
+
margin: `${Styles__namespace.token.spacing.lg} 0`
|
|
157
215
|
}
|
|
158
|
-
})
|
|
216
|
+
}).build()
|
|
159
217
|
);
|
|
160
218
|
lastDateHeadline = group.date;
|
|
161
219
|
}
|
|
@@ -165,7 +223,7 @@ const grouped = (props) => (() => {
|
|
|
165
223
|
dateSign: webElementsLibrary.Atomic.events.sign({
|
|
166
224
|
...entry,
|
|
167
225
|
isThemeDark,
|
|
168
|
-
isLargeSize:
|
|
226
|
+
isLargeSize: true
|
|
169
227
|
}),
|
|
170
228
|
image: asset.standard({
|
|
171
229
|
images: entry.image,
|
|
@@ -175,26 +233,22 @@ const grouped = (props) => (() => {
|
|
|
175
233
|
})
|
|
176
234
|
);
|
|
177
235
|
actualEventCount += group.events.length;
|
|
178
|
-
entries.
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
[`+ .umd-feed-events-grouped-entries`]: {
|
|
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}`
|
|
193
|
-
}
|
|
194
|
-
}
|
|
236
|
+
const entriesBuilder = new webBuilderLibrary.ElementBuilder().withClassName("umd-feed-events-grouped-entries").withStyles({
|
|
237
|
+
element: {
|
|
238
|
+
[` > *:not(:last-child)`]: {
|
|
239
|
+
paddingBottom: Styles__namespace.token.spacing.md,
|
|
240
|
+
marginBottom: Styles__namespace.token.spacing.md,
|
|
241
|
+
borderBottom: `1px solid ${isThemeDark ? Styles__namespace.token.color.gray.dark : Styles__namespace.token.color.gray.light}`
|
|
242
|
+
},
|
|
243
|
+
[`+ .umd-feed-events-grouped-entries`]: {
|
|
244
|
+
paddingTop: Styles__namespace.token.spacing.md,
|
|
245
|
+
marginTop: Styles__namespace.token.spacing.md,
|
|
246
|
+
borderTop: `1px solid ${isThemeDark ? Styles__namespace.token.color.gray.dark : Styles__namespace.token.color.gray.light}`
|
|
195
247
|
}
|
|
196
|
-
}
|
|
197
|
-
);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
dateEntries.forEach((entry) => entriesBuilder.withChild(entry));
|
|
251
|
+
entries.push(entriesBuilder.build());
|
|
198
252
|
});
|
|
199
253
|
const originalSetOffset = helperFunctions.setOffset;
|
|
200
254
|
helperFunctions.setOffset = () => originalSetOffset(actualEventCount);
|
|
@@ -202,7 +256,8 @@ const grouped = (props) => (() => {
|
|
|
202
256
|
...props,
|
|
203
257
|
...helperFunctions,
|
|
204
258
|
displayResults,
|
|
205
|
-
entries
|
|
259
|
+
entries,
|
|
260
|
+
query: queries.EVENTS_RANGE_QUERY
|
|
206
261
|
});
|
|
207
262
|
helperFunctions.setOffset = originalSetOffset;
|
|
208
263
|
if (shadowRoot) {
|
|
@@ -219,7 +274,9 @@ const grouped = (props) => (() => {
|
|
|
219
274
|
displayResults,
|
|
220
275
|
displayResultStart: display.resultStart,
|
|
221
276
|
displayNoResults: display.noResults,
|
|
222
|
-
layoutElement: groupLayout()
|
|
277
|
+
layoutElement: groupLayout(),
|
|
278
|
+
query: queries.EVENTS_RANGE_QUERY,
|
|
279
|
+
countQuery: queries.EVENTS_COUNT_RANGE_QUERY
|
|
223
280
|
});
|
|
224
281
|
return {
|
|
225
282
|
element: container,
|
|
@@ -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.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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"}
|
|
1
|
+
{"version":3,"file":"grouped.js","sources":["../../../source/composite/events/grouped.ts"],"sourcesContent":["import * as Styles from '@universityofmaryland/web-styles-library';\nimport { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport { Atomic, Composite } 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 { EVENTS_RANGE_QUERY, EVENTS_COUNT_RANGE_QUERY } from './common/queries';\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 MONTH_MAP: Record<string, string> = {\n Jan: '01',\n Feb: '02',\n Mar: '03',\n Apr: '04',\n May: '05',\n Jun: '06',\n Jul: '07',\n Aug: '08',\n Sep: '09',\n Oct: '10',\n Nov: '11',\n Dec: '12',\n};\n\nconst parseLocalDate = (dateString: string): Date => {\n const parts = dateString.split('-');\n const date = new Date(\n parseInt(parts[0], 10),\n parseInt(parts[1], 10) - 1,\n parseInt(parts[2], 10),\n );\n date.setHours(0, 0, 0, 0);\n return date;\n};\n\nconst getEventStartDate = (event: EventType): Date => {\n return parseLocalDate(event.startStamp.split('T')[0]);\n};\n\nconst isMultiDayEvent = (event: EventType): boolean => {\n const startParts = event.startStamp.split('T')[0].split('-');\n const startMonth = startParts[1];\n const startDay = startParts[2];\n const endMonth = MONTH_MAP[event.endMonth];\n const endDay = event.endDay.padStart(2, '0');\n\n return !(startMonth === endMonth && startDay === endDay);\n};\n\nconst eventStartsOnDate = (event: EventType, targetDate: Date): boolean => {\n const eventStartDate = getEventStartDate(event);\n return eventStartDate.getTime() === targetDate.getTime();\n};\n\nconst getEventPriority = (event: EventType, groupDate: Date): number => {\n const isMulti = isMultiDayEvent(event);\n const startsOnDate = eventStartsOnDate(event, groupDate);\n\n if (isMulti && startsOnDate) return 1;\n if (!isMulti) return 2;\n return 3;\n};\n\nconst sortEventsByPriority = (\n events: EventType[],\n groupDate: Date,\n): EventType[] => {\n return [...events].sort((a, b) => {\n const aPriority = getEventPriority(a, groupDate);\n const bPriority = getEventPriority(b, groupDate);\n return aPriority - bPriority;\n });\n};\n\nconst groupEventsByDate = (events: EventType[]): GroupedEvent[] => {\n const currentDate = new Date();\n currentDate.setHours(0, 0, 0, 0);\n\n const grouped = events.reduce((acc, event) => {\n const eventDate = getEventStartDate(event);\n const dateKey =\n eventDate < currentDate\n ? currentDate.toISOString().split('T')[0]\n : event.startStamp;\n\n if (!acc[dateKey]) {\n acc[dateKey] = {\n date: getDateBanner(dateKey),\n events: [],\n };\n }\n acc[dateKey].events.push(event);\n return acc;\n }, {} as Record<string, GroupedEvent>);\n\n Object.keys(grouped).forEach((dateKey) => {\n const groupDate = parseLocalDate(dateKey);\n grouped[dateKey].events = sortEventsByPriority(\n grouped[dateKey].events,\n groupDate,\n );\n });\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 = (): ElementModel => {\n return new ElementBuilder()\n .withClassName('umd-feed-events-grouped')\n .build();\n };\n\n const displayResults = async ({ feedData }: FeedDisplay) => {\n const groupedEvents = groupEventsByDate(feedData);\n const entries: ElementModel[] = [];\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 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\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: true,\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 const entriesBuilder = new ElementBuilder()\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\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 dateEntries.forEach((entry) => entriesBuilder.withChild(entry));\n\n entries.push(entriesBuilder.build());\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 query: EVENTS_RANGE_QUERY,\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 query: EVENTS_RANGE_QUERY,\n countQuery: EVENTS_COUNT_RANGE_QUERY,\n });\n\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n })();\n"],"names":["days","grouped","loader","feedMacros.loader","ElementBuilder","Styles","Composite","dataComposed.display","Atomic","feedElements.asset.standard","feedDisplay.resultLoad","EVENTS_RANGE_QUERY","feedDisplay.setShadowStyles","feedFetch.start","feedDisplay.resultStart","feedDisplay.noResults","EVENTS_COUNT_RANGE_QUERY"],"mappings":"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"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import * as Styles from "@universityofmaryland/web-styles-library";
|
|
2
|
-
import {
|
|
2
|
+
import { ElementBuilder } from "@universityofmaryland/web-builder-library";
|
|
3
|
+
import { Composite, Atomic } from "@universityofmaryland/web-elements-library";
|
|
3
4
|
import { standard } from "../../elements/asset.mjs";
|
|
4
5
|
import loader from "../../macros/loader.mjs";
|
|
6
|
+
import "@universityofmaryland/web-utilities-library/theme";
|
|
5
7
|
import "@universityofmaryland/web-utilities-library/network";
|
|
6
8
|
import "@universityofmaryland/web-elements-library/composite";
|
|
7
9
|
import "@universityofmaryland/web-elements-library/atomic";
|
|
8
10
|
import { start } from "./common/fetch.mjs";
|
|
9
11
|
import { noResults, resultStart, resultLoad, setShadowStyles } from "./common/display.mjs";
|
|
10
12
|
import { display } from "./common/data.mjs";
|
|
13
|
+
import { EVENTS_COUNT_RANGE_QUERY, EVENTS_RANGE_QUERY } from "./common/queries.mjs";
|
|
11
14
|
const getDateBanner = (dateStamp) => {
|
|
12
15
|
const dateParts = dateStamp.split("T")[0].split("-");
|
|
13
16
|
const year = parseInt(dateParts[0], 10);
|
|
@@ -59,18 +62,81 @@ const getDateBanner = (dateStamp) => {
|
|
|
59
62
|
];
|
|
60
63
|
return `${days[eventDate.getDay()]}, ${months[eventDate.getMonth()]} ${eventDate.getDate()}`;
|
|
61
64
|
};
|
|
65
|
+
const MONTH_MAP = {
|
|
66
|
+
Jan: "01",
|
|
67
|
+
Feb: "02",
|
|
68
|
+
Mar: "03",
|
|
69
|
+
Apr: "04",
|
|
70
|
+
May: "05",
|
|
71
|
+
Jun: "06",
|
|
72
|
+
Jul: "07",
|
|
73
|
+
Aug: "08",
|
|
74
|
+
Sep: "09",
|
|
75
|
+
Oct: "10",
|
|
76
|
+
Nov: "11",
|
|
77
|
+
Dec: "12"
|
|
78
|
+
};
|
|
79
|
+
const parseLocalDate = (dateString) => {
|
|
80
|
+
const parts = dateString.split("-");
|
|
81
|
+
const date = new Date(
|
|
82
|
+
parseInt(parts[0], 10),
|
|
83
|
+
parseInt(parts[1], 10) - 1,
|
|
84
|
+
parseInt(parts[2], 10)
|
|
85
|
+
);
|
|
86
|
+
date.setHours(0, 0, 0, 0);
|
|
87
|
+
return date;
|
|
88
|
+
};
|
|
89
|
+
const getEventStartDate = (event) => {
|
|
90
|
+
return parseLocalDate(event.startStamp.split("T")[0]);
|
|
91
|
+
};
|
|
92
|
+
const isMultiDayEvent = (event) => {
|
|
93
|
+
const startParts = event.startStamp.split("T")[0].split("-");
|
|
94
|
+
const startMonth = startParts[1];
|
|
95
|
+
const startDay = startParts[2];
|
|
96
|
+
const endMonth = MONTH_MAP[event.endMonth];
|
|
97
|
+
const endDay = event.endDay.padStart(2, "0");
|
|
98
|
+
return !(startMonth === endMonth && startDay === endDay);
|
|
99
|
+
};
|
|
100
|
+
const eventStartsOnDate = (event, targetDate) => {
|
|
101
|
+
const eventStartDate = getEventStartDate(event);
|
|
102
|
+
return eventStartDate.getTime() === targetDate.getTime();
|
|
103
|
+
};
|
|
104
|
+
const getEventPriority = (event, groupDate) => {
|
|
105
|
+
const isMulti = isMultiDayEvent(event);
|
|
106
|
+
const startsOnDate = eventStartsOnDate(event, groupDate);
|
|
107
|
+
if (isMulti && startsOnDate) return 1;
|
|
108
|
+
if (!isMulti) return 2;
|
|
109
|
+
return 3;
|
|
110
|
+
};
|
|
111
|
+
const sortEventsByPriority = (events, groupDate) => {
|
|
112
|
+
return [...events].sort((a, b) => {
|
|
113
|
+
const aPriority = getEventPriority(a, groupDate);
|
|
114
|
+
const bPriority = getEventPriority(b, groupDate);
|
|
115
|
+
return aPriority - bPriority;
|
|
116
|
+
});
|
|
117
|
+
};
|
|
62
118
|
const groupEventsByDate = (events) => {
|
|
119
|
+
const currentDate = /* @__PURE__ */ new Date();
|
|
120
|
+
currentDate.setHours(0, 0, 0, 0);
|
|
63
121
|
const grouped2 = events.reduce((acc, event) => {
|
|
64
|
-
const
|
|
122
|
+
const eventDate = getEventStartDate(event);
|
|
123
|
+
const dateKey = eventDate < currentDate ? currentDate.toISOString().split("T")[0] : event.startStamp;
|
|
65
124
|
if (!acc[dateKey]) {
|
|
66
125
|
acc[dateKey] = {
|
|
67
|
-
date: getDateBanner(
|
|
126
|
+
date: getDateBanner(dateKey),
|
|
68
127
|
events: []
|
|
69
128
|
};
|
|
70
129
|
}
|
|
71
130
|
acc[dateKey].events.push(event);
|
|
72
131
|
return acc;
|
|
73
132
|
}, {});
|
|
133
|
+
Object.keys(grouped2).forEach((dateKey) => {
|
|
134
|
+
const groupDate = parseLocalDate(dateKey);
|
|
135
|
+
grouped2[dateKey].events = sortEventsByPriority(
|
|
136
|
+
grouped2[dateKey].events,
|
|
137
|
+
groupDate
|
|
138
|
+
);
|
|
139
|
+
});
|
|
74
140
|
return Object.values(grouped2).sort((a, b) => {
|
|
75
141
|
const dateA = new Date(
|
|
76
142
|
Object.keys(grouped2).find((key) => grouped2[key] === a) || ""
|
|
@@ -114,12 +180,7 @@ const grouped = (props) => (() => {
|
|
|
114
180
|
shadowRoot = shadow;
|
|
115
181
|
};
|
|
116
182
|
const groupLayout = () => {
|
|
117
|
-
return
|
|
118
|
-
className: "umd-feed-events-grouped",
|
|
119
|
-
elementStyles: {
|
|
120
|
-
element: {}
|
|
121
|
-
}
|
|
122
|
-
});
|
|
183
|
+
return new ElementBuilder().withClassName("umd-feed-events-grouped").build();
|
|
123
184
|
};
|
|
124
185
|
const displayResults = async ({ feedData }) => {
|
|
125
186
|
const groupedEvents = groupEventsByDate(feedData);
|
|
@@ -130,14 +191,11 @@ const grouped = (props) => (() => {
|
|
|
130
191
|
const dateHeadline = document.createElement("p");
|
|
131
192
|
dateHeadline.textContent = group.date;
|
|
132
193
|
entries.push(
|
|
133
|
-
|
|
134
|
-
element:
|
|
135
|
-
|
|
136
|
-
element: {
|
|
137
|
-
margin: `${Styles.token.spacing.lg} 0`
|
|
138
|
-
}
|
|
194
|
+
new ElementBuilder(dateHeadline).styled(Styles.element.text.decoration.ribbon).withStyles({
|
|
195
|
+
element: {
|
|
196
|
+
margin: `${Styles.token.spacing.lg} 0`
|
|
139
197
|
}
|
|
140
|
-
})
|
|
198
|
+
}).build()
|
|
141
199
|
);
|
|
142
200
|
lastDateHeadline = group.date;
|
|
143
201
|
}
|
|
@@ -147,7 +205,7 @@ const grouped = (props) => (() => {
|
|
|
147
205
|
dateSign: Atomic.events.sign({
|
|
148
206
|
...entry,
|
|
149
207
|
isThemeDark,
|
|
150
|
-
isLargeSize:
|
|
208
|
+
isLargeSize: true
|
|
151
209
|
}),
|
|
152
210
|
image: standard({
|
|
153
211
|
images: entry.image,
|
|
@@ -157,26 +215,22 @@ const grouped = (props) => (() => {
|
|
|
157
215
|
})
|
|
158
216
|
);
|
|
159
217
|
actualEventCount += group.events.length;
|
|
160
|
-
entries.
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
[`+ .umd-feed-events-grouped-entries`]: {
|
|
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}`
|
|
175
|
-
}
|
|
176
|
-
}
|
|
218
|
+
const entriesBuilder = new ElementBuilder().withClassName("umd-feed-events-grouped-entries").withStyles({
|
|
219
|
+
element: {
|
|
220
|
+
[` > *:not(:last-child)`]: {
|
|
221
|
+
paddingBottom: Styles.token.spacing.md,
|
|
222
|
+
marginBottom: Styles.token.spacing.md,
|
|
223
|
+
borderBottom: `1px solid ${isThemeDark ? Styles.token.color.gray.dark : Styles.token.color.gray.light}`
|
|
224
|
+
},
|
|
225
|
+
[`+ .umd-feed-events-grouped-entries`]: {
|
|
226
|
+
paddingTop: Styles.token.spacing.md,
|
|
227
|
+
marginTop: Styles.token.spacing.md,
|
|
228
|
+
borderTop: `1px solid ${isThemeDark ? Styles.token.color.gray.dark : Styles.token.color.gray.light}`
|
|
177
229
|
}
|
|
178
|
-
}
|
|
179
|
-
);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
dateEntries.forEach((entry) => entriesBuilder.withChild(entry));
|
|
233
|
+
entries.push(entriesBuilder.build());
|
|
180
234
|
});
|
|
181
235
|
const originalSetOffset = helperFunctions.setOffset;
|
|
182
236
|
helperFunctions.setOffset = () => originalSetOffset(actualEventCount);
|
|
@@ -184,7 +238,8 @@ const grouped = (props) => (() => {
|
|
|
184
238
|
...props,
|
|
185
239
|
...helperFunctions,
|
|
186
240
|
displayResults,
|
|
187
|
-
entries
|
|
241
|
+
entries,
|
|
242
|
+
query: EVENTS_RANGE_QUERY
|
|
188
243
|
});
|
|
189
244
|
helperFunctions.setOffset = originalSetOffset;
|
|
190
245
|
if (shadowRoot) {
|
|
@@ -201,7 +256,9 @@ const grouped = (props) => (() => {
|
|
|
201
256
|
displayResults,
|
|
202
257
|
displayResultStart: resultStart,
|
|
203
258
|
displayNoResults: noResults,
|
|
204
|
-
layoutElement: groupLayout()
|
|
259
|
+
layoutElement: groupLayout(),
|
|
260
|
+
query: EVENTS_RANGE_QUERY,
|
|
261
|
+
countQuery: EVENTS_COUNT_RANGE_QUERY
|
|
205
262
|
});
|
|
206
263
|
return {
|
|
207
264
|
element: container,
|