1"use strict"; 2(self["__LOADABLE_LOADED_CHUNKS__"] = self["__LOADABLE_LOADED_CHUNKS__"] || []).push([[1092],{ 3 4/***/ 32624 5(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6 7 8// EXPORTS 9__webpack_require__.d(__webpack_exports__, { 10 Z: () => (/* binding */ ContactUs) 11}); 12 13// EXTERNAL MODULE: ./node_modules/react/index.js 14var react = __webpack_require__(29633); 15// EXTERNAL MODULE: ./node_modules/prop-types/index.js 16var prop_types = __webpack_require__(86627); 17var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types); 18// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js + 7 modules 19var styled_components_browser_esm = __webpack_require__(67780); 20// EXTERNAL MODULE: ./src/app/blocks/theme/breakpoints.js 21var breakpoints = __webpack_require__(3726); 22;// ./src/app/blocks/pages/ContentGeneric/ContactUs/ContactUs.styled.js 23 24 25const ContactUsStyled = styled_components_browser_esm["default"].div` 26 background-color: ${(p) => p.$bgColour === "Primary" ? "#ffffff" : "#eaeff0"}; 27 border-radius: 8px; 28 padding: 24px; 29 @media (max-width: ${breakpoints/* breakpoints */.f.desktop - 1}px) { 30 width: auto; 31 margin: 8px 16px; 32 } 33 34 .contact-us--content { 35 display: flex; 36 flex-direction: column; 37 gap: 12px; 38 } 39 40 ${(p) => p.$fullWidth && ` 41 .contact-us--content { 42 max-width: 80%; 43 gap: 24px; 44 } 45 46 @media (min-width: ${breakpoints/* breakpoints */.f.desktop}px) { 47 padding: 64px 24px; 48 } 49 50 @media (max-width: ${breakpoints/* breakpoints */.f.desktop - 1}px) { 51 padding: 12px; 52 border-radius: 0; 53 width: 100%; 54 55 .contact-us--content { 56 max-width: 100%; 57 gap: 8px; 58 } 59 60 .section-divider { 61 margin: 16px 0; 62 } 63 } 64 `} 65 66 .contact-us--title { 67 font-family: Wix Madefor Display, sans-serif; 68 font-size: 1.5rem; 69 font-weight: 700; 70 line-height: 1.3; 71 color: #000000; 72 text-transform: none; 73 } 74 75 .contact-us--summary { 76 color: #000000; 77 font-family: Wix MadeFor Text, sans-serif; 78 font-size: 1rem; 79 font-weight: 400; 80 line-height: 1.5; 81 } 82 83 .contact-us--subheading { 84 color: #000000; 85 font-family: Wix MadeFor Text, sans-serif; 86 font-size: 1rem; 87 font-weight: 700; 88 line-height: 1.5; 89 margin-bottom: -4px; 90 } 91 92 .linkCta { 93 &:visited { 94 .linkCta--text { 95 color: #8056c1; 96 } 97 98 .svg-inline--fa { 99 color: #8056c1; 100 } 101 } 102 103 &:hover { 104 .linkCta--text { 105 color: #002395; 106 text-decoration: none; 107 } 108 } 109 110 &:focus-visible { 111 background: #ffdd00; 112 box-shadow: inset 0 -4px 0 #000; 113 outline: none; 114 padding: 2px; 115 116 .linkCta--text { 117 color: #000; 118 } 119 } 120 } 121 122 .linkCta--text { 123 color: #005ad2; 124 font-family: Wix MadeFor Text, sans-serif; 125 font-size: 1rem; 126 font-weight: 700; 127 line-height: 1.5; 128 text-decoration: underline; 129 } 130 131 .link--title { 132 text-decoration: none; 133 } 134 135 .contact-us--email { 136 margin-bottom: 0; 137 } 138 139 .contact-us-email--icon { 140 padding-right: 8px; 141 padding-top: 4.8px; 142 } 143 144 .contact-us--telephone { 145 margin-bottom: 0; 146 } 147 148 .contact-us--telephone-icon { 149 padding-right: 8px; 150 padding-top: 4.8px; 151 } 152 153 .contact-us--location-icon { 154 padding-top: 4.8px; 155 padding-right: 8px; 156 } 157 158 .section-divider { 159 width: 100%; 160 height: 1px; 161 background: #a5afb5; 162 } 163`; 164 165// EXTERNAL MODULE: ./src/app/features/common/utils/getEntryLink.js 166var getEntryLink = __webpack_require__(40153); 167// EXTERNAL MODULE: ./src/app/blocks/shared/components/index.js + 138 modules 168var components = __webpack_require__(61009); 169// EXTERNAL MODULE: ./node_modules/@fortawesome/react-fontawesome/index.es.js 170var index_es = __webpack_require__(18149); 171// EXTERNAL MODULE: ./src/app/blocks/shared/utils/index.js + 7 modules 172var utils = __webpack_require__(92562); 173// EXTERNAL MODULE: ./src/app/core/util/isClient.js 174var isClient = __webpack_require__(74831); 175// EXTERNAL MODULE: ./src/app/features/common/Map/Map.js + 1 modules 176var Map = __webpack_require__(2962); 177;// ./src/app/blocks/pages/ContentGeneric/ContactUs/ContactUsMap.js 178 179 180 181 182 183function ContactUsMap({ location, showMap }) { 184 return /* @__PURE__ */ react.createElement(react.Fragment, null, (0,isClient/* default */.A)() && showMap && /* @__P
184URE__ */ react.createElement( 185 Map/* default */.A, 186 { 187 attributionControl: true, 188 center: [location.location.lat, location.location.lon], 189 markers: [ 190 { 191 key: location.name, 192 position: [location.location.lat, location.location.lon], 193 popup: /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("a", { href: (0,getEntryLink/* default */.A)(location) }, location.name)) 194 } 195 ] 196 } 197 )); 198} 199ContactUsMap.propTypes = { 200 location: (prop_types_default()).object, 201 showMap: (prop_types_default()).bool 202}; 203 204;// ./src/app/blocks/pages/ContentGeneric/ContactUs/utils/helpers.js 205function hasAnyLocationData(location) { 206 return Boolean( 207 location?.phoneNumber || location?.location?.entryTitle || location?.location?.address 208 ); 209} 210 211;// ./src/app/blocks/pages/ContentGeneric/ContactUs/ContactUsOtherLocations.js 212 213 214 215 216 217 218 219function ContactUsOtherLocations({ otherLocations }) { 220 if ((0,utils/* isInvalidArray */.J_)(otherLocations)) { 221 return null; 222 } 223 const validLocations = otherLocations.filter(hasAnyLocationData); 224 if ((0,utils/* isInvalidArray */.J_)(validLocations)) { 225 return null; 226 } 227 return /* @__PURE__ */ react.createElement(react.Fragment, null, validLocations.map((location, index) => /* @__PURE__ */ react.createElement(react.Fragment, { key: index }, location?.heading && /* @__PURE__ */ react.createElement("p", { className: "contact-us--subheading" }, location.heading), location?.phoneNumber && /* @__PURE__ */ react.createElement( 228 components/* LinkCta */.$l, 229 { 230 url: `tel:${location.phoneNumber}`, 231 className: "contact-us--telephone", 232 leftIcon: /* @__PURE__ */ react.createElement( 233 index_es/* FontAwesomeIcon */.g, 234 { 235 icon: "fa-regular fa-phone", 236 className: "contact-us--telephone-icon" 237 } 238 ) 239 }, 240 location.phoneNumber 241 ), location?.location?.entryTitle && location?.location?.address && /* @__P
241URE__ */ react.createElement( 242 components/* LinkCta */.$l, 243 { 244 url: (0,getEntryLink/* default */.A)(location.location), 245 title: location.entryTitle, 246 leftIcon: /* @__PURE__ */ react.createElement( 247 index_es/* FontAwesomeIcon */.g, 248 { 249 className: "contact-us--location-icon", 250 icon: "fa-regular fa-location-pin" 251 } 252 ) 253 }, 254 `${location.location.entryTitle}, ${location.location.address}` 255 ), /* @__PURE__ */ react.createElement("div", { className: "section-divider" })))); 256} 257ContactUsOtherLocations.propTypes = { 258 otherLocations: (prop_types_default()).array, 259 phoneNumber: (prop_types_default()).string 260}; 261 262;// ./src/app/blocks/pages/ContentGeneric/ContactUs/ContactUs.js 263 264 265 266 267 268 269 270 271 272function ContactUs({ value, fullWidth, backgroundColour }) { 273 const { 274 title, 275 summary, 276 emailAddress, 277 phoneNumber, 278 location, 279 subscribeHeading, 280 subscribeSummary, 281 subscribeLink, 282 showMap, 283 otherLocations 284 } = value; 285 if (!(0,utils/* isFeatureEnabled */.G7)("FEATURE_CONTACT_US") || (0,utils/* isInvalidObject */.b2)(value)) { 286 return null; 287 } 288 const content = /* @__PURE__ */ react.createElement(components/* KIExpansionPanel */.M1, { panelTitle: title, defaultExpanded: true }, /* @__PURE__ */ react.createElement("div", { className: "contact-us--content" }, summary && /* @__PURE__ */ react.createElement("p", { className: "contact-us--summary" }
288, summary), emailAddress && /* @__PURE__ */ react.createElement( 289 components/* LinkCta */.$l, 290 { 291 url: `mailto:${emailAddress}`, 292 className: "contact-us--email", 293 leftIcon: /* @__PURE__ */ react.createElement( 294 index_es/* FontAwesomeIcon */.g, 295 { 296 icon: "fa-regular fa-envelope", 297 className: "contact-us-email--icon" 298 } 299 ) 300 }, 301 emailAddress 302 ), phoneNumber && /* @__PURE__ */ react.createElement( 303 components/* LinkCta */.$l, 304 { 305 url: `tel:${phoneNumber}`, 306 className: "contact-us--telephone", 307 leftIcon: /* @__PURE__ */ react.createElement( 308 index_es/* FontAwesomeIcon */.g, 309 { 310 icon: "fa-regular fa-phone", 311 className: "contact-us--telephone-icon" 312 } 313 ) 314 }, 315 phoneNumber 316 ), location?.entryTitle && location?.address && /* @__PURE__ */ react.createElement( 317 components/* LinkCta */.$l, 318 { 319 url: (0,getEntryLink/* default */.A)(location), 320 title: location.entryTitle, 321 leftIcon: /* @__PURE__ */ react.createElement( 322 index_es/* FontAwesomeIcon */.g, 323 { 324 className: "contact-us--location-icon", 325 icon: "fa-regular fa-location-pin" 326 } 327 ) 328 }, 329 `${location.entryTitle}, ${location.address}`
330 ), location && /* @__PURE__ */ react.createElement(ContactUsMap, { location, showMap }), otherLocations && /* @__PURE__ */ react.createElement(ContactUsOtherLocations, { otherLocations }), subscribeHeading && /* @__PURE__ */ react.createElement("p", { className: "contact-us--subheading" }, subscribeHeading), subscribeSummary && /* @__PURE__ */ react.createElement("p", { className: "contact-us--summary" }, subscribeSummary), subscribeLink?.entryTitle && /* @__PURE__ */ react.createElement( 331 components/* LinkCta */.$l, 332 { 333 childClassName: "link--title", 334 maxCharacterLength: 150, 335 url: (0,getEntryLink/* default */.A)(subscribeLink), 336 title: subscribeLink.entryTitle, 337 rightIcon: /* @__PURE__ */ react.createElement("div", { className: "icon-container" }, /* @__PURE__ */ react.createElement( 338 index_es/* FontAwesomeIcon */.g, 339 { 340 icon: "fa-solid fa-arrow-right", 341 className: "icon--right" 342 } 343 )) 344 }, 345 subscribeLink.entryTitle 346 ))); 347 return /* @__PURE__ */ react.createElement(ContactUsStyled, { $bgColour: backgroundColour, $fullWidth: fullWidth }, fullWidth ? /* @__PURE__ */ react.createElement(components/* ResponsiveContainer */.uf, null, content) : content); 348} 349ContactUs.propTypes = { 350 value: (prop_types_default()).object, 351 fullWidth: (prop_types_default()).bool, 352 backgroundColour: (prop_types_default()).string 353}; 354 355 356/***/ }, 357 358/***/ 65795 359(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 360 361 362// EXPORTS 363__webpack_require__.d(__webpack_exports__, { 364 y: () => (/* binding */ CourseListing) 365}); 366 367// EXTERNAL MODULE: ./node_modules/react/index.js 368var react = __webpack_require__(29633); 369// EXTERNAL MODULE: ./node_modules/prop-types/index.js 370var prop_types = __webpack_require__(86627); 371var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types); 372// EXTERNAL MODULE: ./node_modules/react-redux/es/index.js + 20 modules 373var es = __webpack_require__(10136); 374// EXTERNAL MODULE: ./src/app/core/redux/selectors/courseListing.js 375var courseListing = __webpack_require__(74906); 376;// ./src/app/core/redux/hooks/useCourseListing.js 377 378 379const useCourseListing = () => (0,es/* useSelector */.d4)((state) => (0,courseListing/* selectCourseListingEntries */.s)(state)); 380 381;// ./src/app/core/redux/hooks/index.js 382 383 384// EXTERNAL MODULE: ./src/app/blocks/shared/components/index.js + 138 modules 385var components = __webpack_require__(61009); 386// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js + 7 modules 387var styled_components_browser_esm = __webpack_require__(67780); 388// EXTERNAL MODULE: ./src/app/blocks/theme/breakpoints.js 389var breakpoints = __webpack_require__(3726); 390;// ./src/app/blocks/pages/ContentGeneric/CourseListing/CourseListing.styled.js 391 392 393const CourseListingStyled = styled_components_browser_esm["default"].div` 394 .responsive-outer-container { 395 margin: 64px 0; 396 397 ${(p) => p.$isEmbedded && (0,styled_components_browser_esm.css)` 398 margin: 0; 399 `} 400 } 401`; 402const CourseListingHeadingStyled = styled_components_browser_esm["default"].div` 403 .course-listing-heading { 404 text-align: ${(p) => p.$centered ? "center" : "left"}; 405 font-size: 2rem; 406 font-style: normal; 407 font-weight: 400; 408 line-height: 1.2; 409 font-family: Kings Caslon Display, sans-serif; 410 text-transform: none; 411 412 @media (min-width: ${breakpoints/* mediaBreakpoints */.l.desktop}) { 413 font-size: 2.375rem; 414 } 415 } 416`; 417const CourseListingSummaryStyled = styled_components_browser_esm["default"].p` 418 text-align: ${(p) => p.$centered ? "center" : "left"}; 419 420 ${(p) => { 421 if (p.$centered) { 422 return (0,styled_components_browser_esm.css)` 423 text-align: center; 424 max-width: 822px; 425 margin: 0 auto; 426 `; 427 } 428 return (0,styled_components_browser_esm.css)` 429 text-align: left; 430 `; 431}} 432 433 margin-top: 24px; 434 font-size: 1.125rem; 435 font-style: normal; 436 font-weight: 400; 437 line-height: 1.5; 438 font-family: Wix MadeFor Text, sans-serif; 439`; 440const CardsListStyled = styled_components_browser_esm["default"].div` 441 display: flex; 442 flex-direction: column; 443 gap: 32px 0; 444 margin-top: 32px; 445 margin-bottom: 16px; 446 width: 100%; 447 padding: 0 4px 16px; 448 box-sizing: border-box; 449 450 @media (min-width: ${breakpoints/* mediaBreakpoints */.l.desktop}) { 451 margin-top: 40px; 452 } 453`; 454 455// EXTERNAL MODULE: ./node_modules/@fortawesome/react-fontawesome/index.es.js 456var index_es = __webpack_require__(18149); 457;// ./src/app/blocks/pages/ContentGeneric/CourseListing/CourseCard/CourseCard.styled.js 458 459const accessibilityLinkStyles = { 460 focusVisible: (0,styled_components_browser_esm.css)` 461 &:focus-visible { 462 background: #ffdd00; 463 box-shadow: inset 0 -4px 0 #000; 464 outline: none; 465 padding: 2px; 466 span { 467 color: #000; 468 } 469 } 470 `, 471 hover: (0,styled_components_browser_esm.css)` 472 &:hover, 473 &:focus { 474 color: #002395; 475 text-decoration: none; 476 477 .svg-inline--fa { 478 color: #002395; 479 } 480 } 481 `, 482 visited: (0,styled_components_browser_esm.css)` 483 &:visited { 484 color: #8056c1; 485 486 .svg-inline--fa { 487 color: #8056c1; 488 } 489 } 490 ` 491}; 492const CourseCardStyled = styled_components_browser_esm["default"].article` 493 background-color: #fff; 494 border-radius: 8px; 495 box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1); 496 padding: 16px; 497 width: 100%; 498 overflow: visible; 499 box-sizing: border-box; 500 501 @media (min-width: ${(p) => p.theme?.breakpoints?.smallTablet ?? 768}px) { 502 padding: 24px; 503 } 504 505 .course-card-title { 506 display: flex; 507 margin-bottom: 16px; 508 509 & > .course-card-link { 510 width: 100%; 511 font-weight: 700; 512 line-height: 1.3; 513 color: #005ad2; 514 text-decoration: none; 515 516 ${accessibilityLinkStyles.focusVisible} 517 ${accessibilityLinkStyles.hover} 518 ${accessibilityLinkStyles.visited} 519 520 .linkCta--text { 521 font-family: Wix MadeFor Display, sans-serif; 522 font-size: 1.125rem; 523 } 524 525 .svg-inline--fa { 526 height: 27px; 527 } 528 529 @media (min-width: ${(p) => p.theme?.breakpoints?.smallTablet ?? 768}px) { 530 .linkCta--text { 531 font-size: 1.5rem; 532 } 533 534 .svg-inline--fa { 535 height: 31px; 536 } 537 } 538 } 539 } 540 541 .course-card-meta { 542 display: flex; 543 flex-direction: column; 544 align-items: flex-start; 545 gap: 6px; 546 margin-bottom: 16px; 547 548 @media (min-width: ${(p) => p.theme?.breakpoints?.smallTablet ?? 768}px) { 549 flex-direction: row; 550 flex-wrap: wrap; 551 align-items: center; 552 gap: 6px 24px; 553 } 554 } 555 556 .course-card-description { 557 font-size: 1rem; 558 line-height: 1.5; 559 font-weight: 400; 560 font-family: Wix MadeFor Text, sans-serif; 561 color: #000; 562 margin: 0; 563 display: -webkit-box; 564 -webkit-box-orient: vertical; 565 -webkit-line-clamp: 6; 566 overflow: hidden; 567 text-overflow: ellipsis; 568 } 569 570 @media (min-width: ${(p) => p.theme?.breakpoints?.smallTablet ?? 768}px) { 571 .course-card-description { 572 -webkit-line-clamp: 2; 573 } 574 } 575`; 576const ArrowIconStyled = styled_components_browser_esm["default"].span` 577 flex-shrink: 0; 578 color: #005ad2; 579 font-size: 1rem; 580`;
581const MetaItemStyled = styled_components_browser_esm["default"].div` 582 display: flex; 583 align-items: start; 584 gap: 6px; 585 font-size: 0.875rem; 586 font-weight: 700; 587 font-family: Wix MadeFor Text, sans-serif; 588 color: #000; 589 590 svg { 591 flex-shrink: 0; 592 color: #000; 593 width: 16px; 594 height: 16px; 595 font-size: 16px; 596 } 597 598 .fa-chalkboard-user, 599 .fa-laptop { 600 transform: scale(1.15); 601 transform-origin: center; 602 } 603 604 .meta-item-icons { 605 display: flex; 606 column-gap: 4px; 607 } 608 609 @media (min-width: ${(p) => p.theme?.breakpoints?.desktop ?? 1024}px) { 610 gap: 12px; 611 } 612`; 613 614// EXTERNAL MODULE: ./src/app/blocks/shared/utils/index.js + 7 modules 615var utils = __webpack_require__(92562); 616;// ./src/app/blocks/pages/ContentGeneric/CourseListing/utils.js 617 618const DELIVERY_MODE_ICONS = { 619 "In person": ["fa-regular fa-user"], 620 "On campus": ["fa-regular fa-location-dot"], 621 Hyflex: ["fa-regular fa-location-crosshairs"], 622 Online: ["fa-regular fa-laptop"], 623 Blended: ["fa-regular fa-user", "fa-regular fa-laptop"], 624 "Work based": ["fa-regular fa-briefcase"], 625 "Classroom & Online": [ 626 "fa-regular fa-laptop", 627 "fa-regular fa-chalkboard-user" 628 ] 629}; 630function getDeliveryModeIcons(entryTitle) { 631 return DELIVERY_MODE_ICONS[entryTitle] || ["fa-regular fa-circle-info"]; 632} 633function normalizeStudyMode(studyMode) { 634 if ((0,utils/* isValidArray */.OP)(studyMode)) { 635 return studyMode.map(({ entryTitle }) => entryTitle).join(" "); 636 } 637 if ((0,utils/* IsValidObject */.GF)(studyMode)) { 638 return studyMode.entryTitle; 639 } 640 return ""; 641} 642function normalizeDeliveryMode(deliveryMode) { 643 if ((0,utils/* isValidArray */.OP)(deliveryMode)) { 644 return deliveryMode.map(({ entryTitle }) => ({ 645 label: entryTitle, 646 icons: getDeliveryModeIcons(entryTitle) 647 })); 648 } 649 if ((0,utils/* IsValidObject */.GF)(deliveryMode)) { 650 const entryTitle = deliveryMode.entryTitle; 651 return [ 652 { 653 label: entryTitle, 654 icons: getDeliveryModeIcons(entryTitle) 655 } 656 ]; 657 } 658 return []; 659} 660 661;// ./src/app/blocks/pages/ContentGeneric/CourseListing/CourseCard/index.js 662 663 664 665 666 667 668 669function CourseCard({ item }) { 670 const { 671 ucasCode, 672 qualification, 673 entryTitle, 674 duration, 675 studyMode, 676 deliveryMode, 677 entryDescription, 678 pageOverride, 679 sys 680 } = item; 681 const qualificationTitle = qualification?.entryTitle; 682 const displayTitle = entryTitle && qualificationTitle ? `${entryTitle} ${qualificationTitle}`.trim() : entryTitle; 683 const studyModeLabel = normalizeStudyMode(studyMode); 684 const deliveryModes = normalizeDeliveryMode(deliveryMode); 685 const displayUrl = pageOverride || sys.uri || "#"; 686 const isExternalUrl = sys.contentTypeId === "postgraduateCourse" && pageOverride; 687 const linkIcon = isExternalUrl ? "fa-regular fa-arrow-up-right-from-square" : "fa-regular fa-arrow-right"; 688 const ariaLabel = isExternalUrl ? `${displayTitle} (opens in a new tab)` : displayTitle; 689 const showMeta = Boolean( 690 ucasCode || duration || studyModeLabel || (0,utils/* isValidArray */.OP)(deliveryModes) 691 ); 692 return /* @__PURE__ */ react.createElement(CourseCardStyled, null, /* @__PURE__ */ react.createElement("div", { className: "course-card-title" }, /* @__PURE__ */ react.createElement( 693 components/* LinkCta */.$l, 694 { 695 ariaLabel, 696 url: displayUrl, 697 rightIcon: /* @__PURE__ */ react.createElement(ArrowIconStyled, { "aria-hidden": true }, /* @__PURE__ */ react.createElement(index_es/* FontAwesomeIcon */.g, { icon: linkIcon })), 698 maxCharacterLength: 160, 699 className: "course-card-link" 700 }, 701 displayTitle
702 )), showMeta && /* @__PURE__ */ react.createElement("div", { className: "course-card-meta" }, ucasCode && /* @__PURE__ */ react.createElement(MetaItemStyled, null, /* @__PURE__ */ react.createElement(index_es/* FontAwesomeIcon */.g, { icon: "fa-regular fa-display-code" }), /* @__PURE__ */ react.createElement("span", null, "UCAS CODE: ", ucasCode)), duration && /* @__PURE__ */ react.createElement(MetaItemStyled, null, /* @__PURE__ */ react.createElement(index_es/* FontAwesomeIcon */.g, { icon: "fa-regular fa-calendar" }), /* @__PURE__ */ react.createElement("span", null, duration)), studyModeLabel && /* @__PURE__ */ react.createElement(MetaItemStyled, null, /* @__PURE__ */ react.createElement(index_es/* FontAwesomeIcon */.g, { icon: "fa-regular fa-clock" }), /* @__PURE__ */ react.createElement("span", null, studyModeLabel)), deliveryModes.map(({ label, icons }, idx) => /* @__PURE__ */ react.createElement(MetaItemStyled, { key: `${label}-${idx}` }, /* @__PURE__ */ react.createElement("div", { className: "meta-item-icons" }, icons.map((icon, iconIdx) => /* @__PURE__ */ react.createElement( 703 index_es/* FontAwesomeIcon */.g, 704 { 705 key: `${label}-${idx}-${iconIdx}`, 706 icon, 707 "aria-hidden": true 708 } 709 ))), /* @__PURE__ */ react.createElement("span", null, label)))), entryDescription && /* @__P
709URE__ */ react.createElement("p", { className: "course-card-description", title: entryDescription }, entryDescription)); 710} 711CourseCard.propTypes = { 712 item: (prop_types_default()).object 713}; 714 715;// ./src/app/blocks/pages/ContentGeneric/CourseListing/index.js 716 717 718 719 720 721 722 723function CourseListing({ value, isEmbedded }) { 724 const { 725 heading, 726 summary, 727 headingLevel = "Level 2", 728 alignment = "center" 729 } = value; 730 const items = useCourseListing(); 731 const hasCourses = (0,utils/* isValidArray */.OP)(items); 732 if (!heading && !summary && !hasCourses) { 733 return null; 734 } 735 return /* @__PURE__ */ react.createElement(CourseListingStyled, { $isEmbedded: isEmbedded }, /* @__PURE__ */ react.createElement(components/* ResponsiveContainer */.uf, { isEmbedded }, heading && /* @__PURE__ */ react.createElement(CourseListingHeadingStyled, { $centered: alignment === "center" }, /* @__PURE__ */ react.createElement( 736 components/* Heading */.DZ, 737 { 738 headingText: heading, 739 headingLevel, 740 className: "course-listing-heading" 741 } 742 )), summary && /* @__PURE__ */ react.createElement(CourseListingSummaryStyled, { $centered: true }, summary), hasCourses && /* @__PURE__ */ react.createElement(CardsListStyled, null, items.map((item) => /* @__PURE__ */ react.createElement(CourseCard, { key: item.sys.id, item }))))); 743} 744CourseListing.propTypes = { 745 isEmbedded: (prop_types_default()).bool, 746 value: (prop_types_default()).object 747}; 748 749 750/***/ }, 751 752/***/ 80969 753(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 754 755/* harmony export */ __webpack_require__.d(__webpack_exports__, { 756/* harmony export */ N: () => (/* binding */ RichTextWrapper) 757/* harmony export */ }); 758/* harmony import */ var styled_components__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(67780); 759/* harmony import */ var _theme_breakpoints__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3726); 760 761 762const RichTextWrapper = styled_components__WEBPACK_IMPORTED_MODULE_0__["default"].div` 763 padding: 16px 0; 764 765 @media (min-width: ${_theme_breakpoints__WEBPACK_IMPORTED_MODULE_1__/* .mediaBreakpoints */ .l.desktop}) { 766 padding: 46px 0; 767 } 768`; 769 770 771/***/ }, 772 773/***/ 43415 774(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 775 776 777// EXPORTS 778__webpack_require__.d(__webpack_exports__, { 779 U: () => (/* binding */ HubPromoSection) 780}); 781 782// EXTERNAL MODULE: ./node_modules/react/index.js 783var react = __webpack_require__(29633); 784// EXTERNAL MODULE: ./node_modules/prop-types/index.js 785var prop_types = __webpack_require__(86627); 786var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types); 787// EXTERNAL MODULE: ./src/app/blocks/shared/components/index.js + 138 modules 788var components = __webpack_require__(61009); 789// EXTERNAL MODULE: ./src/app/blocks/pages/PostgraduateCourses/CoursePathway/utils/promo-sorter.js 790var promo_sorter = __webpack_require__(65274); 791// EXTERNAL MODULE: ./src/app/blocks/shared/utils/index.js + 7 modules 792var utils = __webpack_require__(92562); 793// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js + 7 modules 794var styled_components_browser_esm = __webpack_require__(67780); 795// EXTERNAL MODULE: ./src/app/blocks/shared/components/Promos/PromoSection.styled.js 796var PromoSection_styled = __webpack_require__(12925); 797;// ./src/app/blocks/pages/Hub/HubPromoSection/HubPromoSection.styled.js 798 799 800const HubPromoSectionStyled = styled_components_browser_esm["default"].div` 801 .promos--title { 802 font-size: 2.375rem; 803 } 804 .promoCard--description { 805 font-size: 1rem; 806 } 807 808 ${PromoSection_styled/* PromoSectionStyled */.qc} { 809 .promos--header { 810 display: flex; 811 flex-direction: column; 812 row-gap: 24px; 813 text-align: center; 814 padding-left: 120px; 815 padding-right: 120px; 816 padding-bottom: 40px; 817 } 818 819 .promos--title { 820 font-size: 3.125rem; 821 } 822 823 .promos--description { 824 display: flex; 825 text-align: center; 826 max-width: 696px; 827 margin: 0 auto; 828 flex-direction: column; 829 font-family: Wix Madefor Display, sans-serif; 830 font-weight: 400; 831 font-size: 1.125rem; 832 line-height: 1.5; 833 color: #2a2b2c; 834 } 835 } 836 837 @media (max-width: ${(p) => p.theme.breakpoints.tablet}px) { 838 .ug-careers-promos .promos--header { 839 padding-bottom: 32px; 840 } 841 .promos--items { 842 row-gap: 32px; 843 } 844 } 845`; 846 847;// ./src/app/blocks/pages/Hub/HubPromoSection/HubPromoSection.js 848 849 850 851 852 853 854const HubPromoSection = ({ promoSection }) => { 855 const promosToRender = (0,promo_sorter/* promosToUse */.P)(promoSection.promos); 856 return /* @__PURE__ */ react.createElement(HubPromoSectionStyled, null, /* @__P
856URE__ */ react.createElement( 857 components/* PromoSection */.VX, 858 { 859 title: promoSection.title, 860 shortCourseSubjectAreas: (0,utils/* isValidArray */.OP)(promosToRender.promoGroup) ? promosToRender.promoGroup : promosToRender.promos, 861 description: promoSection.summary, 862 className: "ug-careers-promos", 863 bgColour: promoSection.backgroundColour 864 } 865 )); 866}; 867HubPromoSection.propTypes = { 868 promoSection: (prop_types_default()).object 869}; 870 871 872/***/ }, 873 874/***/ 8586 875(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 876 877 878// EXPORTS 879__webpack_require__.d(__webpack_exports__, { 880 v: () => (/* binding */ NewsEventCardPromo) 881}); 882 883// EXTERNAL MODULE: ./node_modules/react/index.js 884var react = __webpack_require__(29633); 885// EXTERNAL MODULE: ./node_modules/prop-types/index.js 886var prop_types = __webpack_require__(86627); 887var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types); 888// EXTERNAL MODULE: ./node_modules/classnames/index.js 889var classnames = __webpack_require__(10054); 890var classnames_default = /*#__PURE__*/__webpack_require__.n(classnames); 891// EXTERNAL MODULE: ./node_modules/@fortawesome/react-fontawesome/index.es.js 892var index_es = __webpack_require__(18149); 893// EXTERNAL MODULE: ./node_modules/contensis-delivery-api/lib/index.js 894var lib = __webpack_require__(43196); 895// EXTERNAL MODULE: ./src/app/blocks/shared/hooks/index.js + 17 modules 896var hooks = __webpack_require__(88429); 897// EXTERNAL MODULE: ./src/app/blocks/shared/utils/helpers.js 898var helpers = __webpack_require__(91655); 899// EXTERNAL MODULE: ./src/app/blocks/shared/utils/date-utils.js 900var date_utils = __webpack_require__(26292); 901// EXTERNAL MODULE: ./src/app/features/common/utils/getEntryLink.js 902var getEntryLink = __webpack_require__(40153); 903;// ./src/app/blocks/pages/Hub/NewsEventCardPromo/hooks/useNewsEventsQuery.js 904 905 906 907 908 909 910const parseNewsResult = (result, limit) => { 911 if ((0,helpers/* isInvalidArray */.J_)(result?.items)) return []; 912 return result.items.filter((item) => item.hideFromListings !== true).slice(0, limit).map((item) => ({ 913 id: item.sys.id, 914 entryTitle: item.entryTitle, 915 uri: item.sys.uri, 916 summary: item.summary, 917 image: item.image, 918 publishedDate: item.sys.version.published, 919 type: "news" 920 })); 921}; 922const parseEventsResult = (result, limit) => { 923 if ((0,helpers/* isInvalidArray */.J_)(result?.items)) return []; 924 const filtered = result.items.filter((item) => { 925 const eventDateTo = item.date?.to; 926 if (!eventDateTo) return false; 927 if ((0,date_utils/* checkIfDateIsAfter */.aP)(eventDateTo) || item.showInShortListings === false) 928 return false; 929 return true; 930 }); 931 const sorted = (0,date_utils/* sortEventsByDate */.Z0)(filtered); 932 return sorted.slice(0, limit).map((item) => ({ 933 id: item.sys.id, 934 entryTitle: item.entryTitle, 935 uri: (0,getEntryLink/* default */.A)(item), 936 description: item.description, 937 location: item.location, 938 image: item.thumbnail, 939 eventDate: item.date, 940 timeZone: item.timeZone, 941 type: "event" 942 })); 943}; 944const useNewsEventsQuery = ({ 945 orgUnit, 946 format = "4NewsStories", 947 inSidebar = false 948}) => { 949 const rightMax = inSidebar ? 2 : 4; 950 const rightHalf = inSidebar ? 1 : 2; 951 const getQueryCounts = () => { 952 switch (format) { 953 case "4NewsStories": 954 return { newsCount: rightMax, eventsCount: 0 }; 955 case "4Events": 956 return { newsCount: 0, eventsCount: rightMax }; 957 case "2News2Events": 958 return { newsCount: rightHalf, eventsCount: rightHalf }; 959 default: 960 return { newsCount: rightMax, eventsCount: 0 }; 961 } 962 }; 963 const { newsCount, eventsCount } = getQueryCounts(); 964 const { 965 isLoading: newsLoading, 966 result: newsResult, 967 setQuery: setNewsQuery 968 } = (0,hooks/* useSearch */.SQ)(); 969 const { 970 isLoading: eventsLoading, 971 result: eventsResult, 972 setQuery: setEventsQuery 973 } = (0,hooks/* useSearch */.SQ)(); 974 (0,react.useEffect)(() => { 975 if (!orgUnit || newsCount === 0 || !orgUnit.sys?.id) { 976 return; 977 } 978 const newsQuery = new lib.Query( 979 lib.Op.and( 980 lib.Op.equalTo("sys.contentTypeId", "news"), 981 lib.Op.equalTo("sys.versionStatus", "latest"), 982 lib.Op.equalTo("orgUnit.sys.id", orgUnit.sys.id) 983 ) 984 ); 985 newsQuery.orderBy = lib.OrderBy.desc("sys.version.published"); 986 newsQuery.pageSize = 100; 987 newsQuery.fields = [ 988 "entryTitle", 989 "sys.uri", 990 "sys.id", 991 "sys.version.published", 992 "summary", 993 "image", 994 "hideFromListings" 995 ]; 996 setNewsQuery(newsQuery); 997 }, [orgUnit, newsCount, setNewsQuery]); 998 (0,react.useEffect)(() => { 999 if (!orgUnit || eventsCount === 0 || !orgUnit.sys?.id) { 1000 return; 1001 } 1002 const today = (/* @__PURE__ */ new Date()).toISOString(); 1003 const eventsQuery = new lib.Query( 1004 lib.Op.and( 1005 lib.Op.equalTo("sys.contentTypeId", "events"), 1006 lib.Op.equalTo("sys.versionStatus", "latest"), 1007 lib.Op.equalTo("facultiesAndDepartments.sys.id", orgUnit.sys.id), 1008 lib.Op.greaterThanOrEqualTo("date.to", today) 1009 ) 1010 ); 1011 eventsQuery.orderBy = lib.OrderBy.asc("date.to"); 1012 eventsQuery.pageSize = eventsCount; 1013 eventsQuery.fields = [ 1014 "entryTitle", 1015 "sys.uri", 1016 "sys.slug", 1017 "sys.id", 1018 "description", 1019 "location", 1020 "thumbnail", 1021 "date", 1022 "timeZone", 1023 "showInShortListings" 1024 ]; 1025 setEventsQuery(eventsQuery); 1026 }, [orgUnit, eventsCount, setEventsQuery]); 1027 const newsItems = newsResult && newsCount > 0 ? parseNewsResult(newsResult, newsCount) : []; 1028 const eventItems = eventsResult && eventsCount > 0 ? parseEventsResult(eventsResult, eventsCount) : []; 1029 const getLoadingState = () => { 1030 if (!orgUnit) return false;
1031 const shouldLoadNews = newsCount > 0; 1032 const shouldLoadEvents = eventsCount > 0; 1033 if (shouldLoadNews && shouldLoadEvents) { 1034 return newsLoading || eventsLoading || newsResult?.items === void 0 || eventsResult?.items === void 0; 1035 } else if (shouldLoadNews) { 1036 return newsLoading || newsResult?.items === void 0; 1037 } else if (shouldLoadEvents) { 1038 return eventsLoading || eventsResult?.items === void 0; 1039 } 1040 return false; 1041 }; 1042 return { 1043 isLoading: getLoadingState(), 1044 newsItems, 1045 eventItems, 1046 totalItems: newsItems.length + eventItems.length 1047 }; 1048}; 1049 1050// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js + 7 modules 1051var styled_components_browser_esm = __webpack_require__(67780); 1052// EXTERNAL MODULE: ./src/app/blocks/theme/breakpoints.js 1053var breakpoints = __webpack_require__(3726); 1054;// ./src/app/blocks/pages/Hub/NewsEventCardPromo/NewsEventCardPromo.styled.js 1055 1056 1057const NewsEventCardPromoStyled = styled_components_browser_esm["default"].section` 1058 background-color: ${(p) => p.bgColour === "secondary" ? "#EAEFF0" : "#FFFFFF"}; 1059 padding: 40px 0; 1060 1061 .container { 1062 max-width: 1200px; 1063 margin: 0 auto; 1064 } 1065 1066 .promo-heading { 1067 font-family: Kings Caslon Display, serif; 1068 font-weight: 400; 1069 font-size: 2.375rem; 1070 line-height: 1.2; 1071 color: #000000; 1072 text-transform: none; 1073 padding-bottom: 40px; 1074 text-align: center; 1075 } 1076 1077 .loading-message, 1078 .error-message { 1079 font-family: Wix Madefor Display, sans-serif; 1080 padding: 32px; 1081 text-align: center; 1082 font-size: 1.125rem; 1083 line-height: 1.5; 1084 color: #000000; 1085 text-transform: none; 1086 } 1087 1088 .events-list-link { 1089 color: #005ad2; 1090 font-weight: 700; 1091 text-transform: none; 1092 font-style: normal; 1093 1094 &:visited { 1095 color: #774db9; 1096 } 1097 1098 &:hover { 1099 color: #002395; 1100 } 1101 1102 &:active { 1103 color: #002395; 1104 } 1105 1106 &:focus-visible { 1107 background-color: #ffdd00; 1108 border-bottom: 4px solid #000000; 1109 color: #000000; 1110 } 1111 } 1112 1113 .card-row { 1114 display: grid; 1115 gap: 24px; 1116 grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); 1117 } 1118 1119 .card-count-1 { 1120 grid-template-columns: 1fr; 1121 max-width: 100%; 1122 } 1123 1124 .card-count-2 { 1125 grid-template-columns: repeat(2, 1fr); 1126 } 1127 1128 .card-count-3 { 1129 grid-template-columns: repeat(3, 1fr); 1130 } 1131 1132 .card-count-4 { 1133 grid-template-columns: repeat(4, 1fr); 1134 } 1135 1136 @media (max-width: ${(p) => p.theme.breakpoints.desktop}px) { 1137 .card-count-4 { 1138 grid-template-columns: repeat(2, 1fr); 1139 } 1140 } 1141 1142 @media (max-width: ${(p) => p.theme.breakpoints.tablet}px) { 1143 .card-count-3, 1144 .card-count-4 { 1145 grid-template-columns: 1fr; 1146 } 1147 1148 .card-count-2 { 1149 grid-template-columns: 1fr; 1150 } 1151 } 1152 1153 .card-wrapper { 1154 display: flex; 1155 } 1156 1157 ${(p) => p.$inSidebar && (0,styled_components_browser_esm.css)` 1158 width: 384px; 1159 padding: 24px; 1160 border-radius: 8px; 1161 background-color: #eaeff0; 1162 1163 .container { 1164 max-width: 100%; 1165 width: 100%; 1166 margin: 0; 1167 display: flex; 1168 flex-direction: column; 1169 gap: 32px; 1170 } 1171 1172 .sidebar-header { 1173 display: flex; 1174 justify-content: space-between; 1175 align-items: center; 1176 width: 100%; 1177 gap: 24px; 1178 } 1179 1180 .error-message { 1181 font-family: Wix Madefor Text, sans-serif; 1182 text-align: center; 1183 font-size: 1rem; 1184 line-height: 1.5; 1185 color: #000000; 1186 padding: 0; 1187 } 1188 1189 .sidebar-heading { 1190 margin: 0; 1191 font-family: Wix Madefor Display, sans-serif; 1192 font-weight: 700; 1193 font-size: 1.5rem; 1194 line-height: 1.3; 1195 color: #000000; 1196 text-align: left; 1197 text-transform: none; 1198 } 1199 1200 .sidebar-toggle { 1201 border: 0; 1202 padding: 0; 1203 background: transparent; 1204 display: flex; 1205 flex-direction: row; 1206 justify-content: space-between; 1207 align-items: center; 1208 width: 100%; 1209 cursor: pointer; 1210 } 1211 1212 .sidebar-toggle-icon { 1213 width: 16px; 1214 height: 24px; 1215 color: #005ad2; 1216 transform: rotate(0deg); 1217 display: block; 1218 } 1219 1220 .sidebar-toggle-icon--expanded { 1221 transform: rotate(180deg); 1222 } 1223 1224 @media (min-width: ${breakpoints/* breakpoints */.f.tablet + 1}px) { 1225 .sidebar-toggle-icon { 1226 display: none; 1227 } 1228 } 1229 1230 .card-row { 1231 grid-template-columns: 1fr; 1232 gap: 32px; 1233 } 1234 1235 @media (max-width: ${breakpoints/* breakpoints */.f.tablet}px) { 1236 width: auto; 1237 margin: 8px 16px; 1238 1239 .sidebar-toggle { 1240 display: flex; 1241 } 1242 1243 .card-row--collapsed { 1244 display: none; 1245 } 1246 } 1247 `} 1248`; 1249 1250// EXTERNAL MODULE: ./src/app/blocks/shared/components/index.js + 138 modules
1251var components = __webpack_require__(61009); 1252;// ./src/app/blocks/pages/Hub/NewsEventCardPromo/NewsCard/NewsCard.styled.js 1253 1254const NewsCardStyled = styled_components_browser_esm["default"].article` 1255 display: grid; 1256 grid-template-columns: 1fr; 1257 grid-template-rows: 208px 1fr; 1258 grid-template-areas: 'cardImgArea' 'cardContentArea'; 1259 border-radius: 8px; 1260 max-width: 100%; 1261 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); 1262 background-color: #ffffff; 1263 height: 100%; 1264 width: 100%; 1265 1266 .card-image { 1267 grid-area: cardImgArea; 1268 height: 208px; 1269 width: 100%; 1270 overflow: hidden; 1271 1272 img { 1273 width: 100%; 1274 height: 100%; 1275 border-top-right-radius: 8px; 1276 border-top-left-radius: 8px; 1277 object-fit: cover; 1278 display: block; 1279 } 1280 } 1281 1282 .card-content { 1283 grid-area: cardContentArea; 1284 display: flex; 1285 flex-direction: column; 1286 justify-content: start; 1287 align-content: center; 1288 row-gap: 16px; 1289 padding: 24px; 1290 font-family: Wix Madefor Display, sans-serif; 1291 } 1292 1293 .card-date { 1294 display: flex; 1295 column-gap: 10px; 1296 font-size: 1rem; 1297 color: #000000; 1298 font-weight: 700; 1299 line-height: 1.5; 1300 padding-top: 3.8px; 1301 } 1302 1303 .card-title { 1304 margin: 0; 1305 line-height: 1.5; 1306 } 1307 1308 .card-summary { 1309 margin: 0; 1310 font-size: 1rem; 1311 font-style: normal; 1312 font-weight: 400; 1313 line-height: 1.5; 1314 color: #000000; 1315 } 1316 .card-icon { 1317 color: #000000; 1318 padding-top: 3.8px; 1319 } 1320 1321 .card-link-icon { 1322 align-items: flex-start; 1323 padding: 4.8px 0 0 8px; 1324 } 1325 1326 ${(p) => !p.$inSidebar && (0,styled_components_browser_esm.css)` 1327 @media (min-width: ${p.theme.breakpoints.desktop}px) { 1328 grid-template-rows: 208px auto; 1329 min-height: 518.496px; 1330 1331 .card-image { 1332 height: 208px; 1333 } 1334 1335 .card-image img { 1336 height: 100%; 1337 } 1338 1339 .card-count-3 & { 1340 grid-template-rows: 216.338px auto; 1341 1342 .card-image { 1343 height: 216.338px; 1344 } 1345 } 1346 1347 .card-count-2 & { 1348 grid-template-rows: 331.268px auto; 1349 1350 .card-image { 1351 height: 331.268px; 1352 } 1353 } 1354 1355 .card-count-1 & { 1356 grid-template-columns: 588px 1fr; 1357 grid-template-rows: auto; 1358 grid-template-areas: 'cardImgArea cardContentArea'; 1359 max-width: 100%; 1360 min-height: 450.317px; 1361 1362 .card-image { 1363 height: 100%; 1364 width: 588px; 1365 min-height: 450.317px; 1366 } 1367 1368 .card-image img { 1369 height: 100%; 1370 border-radius: 0; 1371 border-top-left-radius: 8px; 1372 border-bottom-left-radius: 8px; 1373 border-top-right-radius: 0; 1374 } 1375 1376 .card-content { 1377 padding: 24px 40px; 1378 justify-content: center; 1379 } 1380 1381 .card-link { 1382 font-size: 1.5rem; 1383 } 1384 } 1385 } 1386 `} 1387`; 1388 1389// EXTERNAL MODULE: ./node_modules/lodash/truncate.js 1390var truncate = __webpack_require__(59973); 1391var truncate_default = /*#__PURE__*/__webpack_require__.n(truncate); 1392;// ./src/app/blocks/pages/Hub/NewsEventCardPromo/NewsCard/NewsCard.js 1393 1394 1395 1396 1397 1398 1399 1400 1401function NewsCard({ item, inSidebar = false }) { 1402 if ((0,helpers/* isInvalidObject */.b2)(item)) { 1403 return null; 1404 } 1405 return /* @__PURE__ */ react.createElement(NewsCardStyled, { $inSidebar: inSidebar }, item.image && /* @__PURE__ */ react.createElement("div", { className: "card-image" }, /* @__PURE__ */ react.createElement(components/* Image */._V, { image: item.image })), /* @__PURE__ */ react.createElement("div", { className: "card-content" }, /* @__PURE__ */ react.createElement( 1406 components/* LinkCta */.$l, 1407 { 1408 childClassName: "card-link", 1409 className: "card-link", 1410 url: item.uri, 1411 rightIcon: /* @__PURE__ */ react.createElement( 1412 index_es/* FontAwesomeIcon */.g, 1413 { 1414 className: "card-link-icon", 1415 icon: "fa-solid fa-arrow-right" 1416 } 1417 ), 1418 maxCharacterLength: 150 1419 }, 1420 item.entryTitle 1421 ), item.publishedDate && /* @__PURE__ */ react.createElement("div", { className: "card-date" }
1421, /* @__PURE__ */ react.createElement( 1422 index_es/* FontAwesomeIcon */.g, 1423 { 1424 className: "card-icon", 1425 icon: "fa-regular fa-calendar" 1426 } 1427 ), /* @__PURE__ */ react.createElement("p", null, (0,date_utils/* formatToLocaleDate */.$p)(item.publishedDate))), item.summary && /* @__PURE__ */ react.createElement("p", { className: "card-summary" }, truncate_default()(item.summary, { length: 200 })))); 1428} 1429NewsCard.propTypes = { 1430 item: (prop_types_default()).object, 1431 inSidebar: (prop_types_default()).bool 1432}; 1433 1434;// ./src/app/blocks/pages/Hub/NewsEventCardPromo/EventsCard/EventsCard.styled.js 1435 1436const EventsCardStyled = styled_components_browser_esm["default"].article` 1437 display: grid; 1438 grid-template-columns: 1fr; 1439 grid-template-rows: 208px 1fr; 1440 grid-template-areas: 'cardImgArea' 'cardContentArea'; 1441 border-radius: 8px; 1442 max-width: 100%; 1443 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); 1444 background-color: #ffffff; 1445 height: 100%; 1446 width: 100%; 1447 position: relative; 1448 1449 .card-icon-tab { 1450 position: absolute; 1451 top: 0; 1452 left: 0; 1453 background-color: #000000; 1454 color: #ffffff; 1455 padding: 10px 8px; 1456 border-bottom-right-radius: 8px; 1457 border-top-left-radius: 8px; 1458 z-index: 10; 1459 display: flex; 1460 align-items: center; 1461 justify-content: center; 1462 1463 svg { 1464 width: 21px; 1465 height: 24px; 1466 } 1467 1468 .card-icon { 1469 color: #ffffff; 1470 font-size: 1.25rem; 1471 } 1472 } 1473 1474 .card-image { 1475 grid-area: cardImgArea; 1476 height: 208px; 1477 width: 100%; 1478 overflow: hidden; 1479 display: block; 1480 1481 img { 1482 width: 100%; 1483 height: 100%; 1484 border-top-right-radius: 8px; 1485 border-top-left-radius: 8px; 1486 object-fit: cover; 1487 } 1488 } 1489 1490 .card-content { 1491 grid-area: cardContentArea; 1492 display: flex; 1493 flex-direction: column; 1494 justify-content: start; 1495 align-content: center; 1496 gap: 16px; 1497 padding: 24px; 1498 font-family: Wix Madefor Display, sans-serif; 1499 } 1500 1501 .card-details { 1502 display: flex; 1503 flex-direction: column; 1504 gap: 16px; 1505 } 1506 1507 .card-link-icon { 1508 align-items: flex-start; 1509 padding: 4.8px 0 0 8px; 1510 } 1511 1512 .card-info { 1513 display: flex; 1514 flex-direction: row; 1515 align-items: flex-start; 1516 gap: 8px; 1517 font-size: 1rem; 1518 font-weight: 700; 1519 line-height: 1.5; 1520 color: #000000; 1521 1522 p { 1523 margin: 0; 1524 } 1525 } 1526 1527 .card-icon { 1528 color: #000000; 1529 padding-top: 3.8px; 1530 } 1531 1532 .card-summary { 1533 margin: 0; 1534 font-size: 1rem; 1535 font-style: normal; 1536 font-weight: 400; 1537 line-height: 1.5; 1538 color: #000000; 1539 } 1540 1541 ${(p) => !p.$inSidebar && (0,styled_components_browser_esm.css)` 1542 @media (min-width: ${p.theme.breakpoints.desktop}px) { 1543 grid-template-rows: 208px auto; 1544 min-height: 518.496px; 1545 1546 .card-image { 1547 height: 208px; 1548 } 1549 1550 .card-image img { 1551 height: 100%; 1552 } 1553 1554 .card-count-3 & { 1555 grid-template-rows: 216.338px auto; 1556 1557 .card-image { 1558 height: 216.338px; 1559 } 1560 } 1561 1562 .card-count-2 & { 1563 grid-template-rows: 331.268px auto; 1564 1565 .card-image { 1566 height: 331.268px; 1567 } 1568 } 1569 1570 .card-count-1 & { 1571 grid-template-columns: 588px 1fr; 1572 grid-template-rows: auto; 1573 grid-template-areas: 'cardImgArea cardContentArea'; 1574 max-width: 100%; 1575 min-height: 450.317px; 1576 1577 .card-image { 1578 height: 100%; 1579 width: 588px; 1580 min-height: 450.317px; 1581 } 1582 1583 .card-image img { 1584 height: 100%; 1585 border-radius: 0; 1586 border-top-left-radius: 8px; 1587 border-bottom-left-radius: 8px; 1588 border-top-right-radius: 0; 1589 } 1590 1591 .card-content { 1592 padding: 24px 40px; 1593 justify-content: center; 1594 } 1595 1596 .card-link { 1597 font-size: 1.5rem; 1598 } 1599 } 1600 } 1601 `} 1602`; 1603 1604;// ./src/app/blocks/pages/Hub/NewsEventCardPromo/EventsCard/EventCard.js 1605 1606 1607 1608 1609 1610 1611 1612 1613function EventCard({ item, inSidebar = false }) { 1614 if ((0,helpers/* isInvalidObject */.b2)(item)) { 1615 return null; 1616 } 1617 const eventStartDate = item.eventDate?.from; 1618 const eventEndDate = item.eventDate?.to; 1619 const { dates, times } = (0,date_utils/* formatDates */.HA)(eventStartDate, eventEndDate); 1620 const timeZoneText = item.timeZone?.entryDescription || "UK time"; 1621 return /* @__PURE__ */ react.createElement(EventsCardStyled, { $inSidebar: inSidebar }
1621, /* @__PURE__ */ react.createElement("div", { className: "card-icon-tab" }, /* @__PURE__ */ react.createElement( 1622 index_es/* FontAwesomeIcon */.g, 1623 { 1624 className: "card-icon-tab-icon", 1625 icon: "fa-regular fa-calendar fa-xl" 1626 } 1627 )), item.image && /* @__PURE__ */ react.createElement("div", { className: "card-image" }, /* @__PURE__ */ react.createElement(components/* Image */._V, { image: item.image })), /* @__PURE__ */ react.createElement("div", { className: "card-content" }, /* @__PURE__ */ react.createElement( 1628 components/* LinkCta */.$l, 1629 { 1630 className: "card-link", 1631 childClassName: "card-link", 1632 url: item.uri, 1633 rightIcon: /* @__PURE__ */ react.createElement( 1634 index_es/* FontAwesomeIcon */.g, 1635 { 1636 className: "card-link-icon", 1637 icon: "fa-solid fa-arrow-right" 1638 } 1639 ), 1640 maxCharacterLength: 150 1641 }, 1642 item.entryTitle 1643 ), /* @__PURE__ */ react.createElement("div", { className: "card-details" }, /* @__PURE__ */ react.createElement("div", { className: "card-info" }, /* @__PURE__ */ react.createElement( 1644 index_es/* FontAwesomeIcon */.g, 1645 { 1646 className: "card-icon", 1647 icon: "fa-regular fa-calendar" 1648 } 1649 ), /* @__PURE__ */ react.createElement("p", null, dates)), /* @__PURE__ */ react.createElement("div", { className: "card-info" }, /* @__PURE__ */ react.createElement(index_es/* FontAwesomeIcon */.g, { className: "card-icon", icon: "fa-regular fa-clock" }), /* @__PURE__ */ react.createElement("p", null, `${times} (${timeZoneText})`)), item.location?.entryTitle && /* @__PURE__ */ react.createElement("div", { className: "card-info" }, /* @__PURE__ */ react.createElement( 1650 index_es/* FontAwesomeIcon */.g, 1651 { 1652 className: "card-icon", 1653 icon: "fa-regular fa-location-pin" 1654 } 1655 ), /* @__PURE__ */ react.createElement("p", null, item.location.entryTitle))), item.description && /* @__P
1655URE__ */ react.createElement("p", { className: "card-summary" }, truncate_default()(item.description, { length: 200 })))); 1656} 1657EventCard.propTypes = { 1658 item: (prop_types_default()).object, 1659 inSidebar: (prop_types_default()).bool 1660}; 1661 1662// EXTERNAL MODULE: ./src/app/blocks/pages/Hub/utils/index.js 1663var utils = __webpack_require__(96517); 1664;// ./src/app/blocks/pages/Hub/NewsEventCardPromo/NewsEventCardPromo.js 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676function NewsEventCardPromo({ 1677 title, 1678 orgUnit, 1679 format = "4NewsStories", 1680 backgroundColour, 1681 headingLevel, 1682 inSidebar = false 1683}) { 1684 const { isLoading, newsItems, eventItems } = useNewsEventsQuery({ 1685 orgUnit, 1686 format, 1687 inSidebar 1688 }); 1689 const [isExpanded, setIsExpanded] = (0,react.useState)(true); 1690 const renderHeading = () => { 1691 if (!inSidebar) { 1692 return /* @__PURE__ */ react.createElement( 1693 components/* Heading */.DZ, 1694 { 1695 headingLevel, 1696 className: "promo-heading", 1697 headingText: title 1698 } 1699 ); 1700 } 1701 return /* @__PURE__ */ react.createElement("div", { className: "sidebar-header" }, /* @__PURE__ */ react.createElement( 1702 "button", 1703 { 1704 type: "button", 1705 className: "sidebar-toggle", 1706 onClick: () => setIsExpanded((prev) => !prev), 1707 "aria-expanded": isExpanded, 1708 "aria-label": isExpanded ? "Collapse section" : "Expand section" 1709 },
1710 /* @__PURE__ */ react.createElement( 1711 components/* Heading */.DZ, 1712 { 1713 headingLevel, 1714 className: "sidebar-heading", 1715 headingText: title 1716 } 1717 ), 1718 /* @__PURE__ */ react.createElement( 1719 index_es/* FontAwesomeIcon */.g, 1720 { 1721 className: classnames_default()("sidebar-toggle-icon", { 1722 "sidebar-toggle-icon--expanded": isExpanded 1723 }), 1724 icon: "fa-solid fa-chevron-down" 1725 } 1726 ) 1727 )); 1728 }; 1729 const withWrapper = (inner) => inSidebar ? inner : /* @__PURE__ */ react.createElement(components/* Section */.wn, { variant: backgroundColour }, inner); 1730 if (isLoading) { 1731 return withWrapper( 1732 /* @__PURE__ */ react.createElement( 1733 NewsEventCardPromoStyled, 1734 { 1735 bgColour: backgroundColour, 1736 $inSidebar: inSidebar 1737 }, 1738 /* @__PURE__ */ react.createElement("div", { className: "container" }, /* @__PURE__ */ react.createElement("div", { className: "loading-message" }, "Loading...")) 1739 ) 1740 ); 1741 } 1742 const items = (0,utils/* getCombinedItems */.WG)(format, newsItems, eventItems); 1743 if ((0,helpers/* isInvalidArray */.J_)(items)) { 1744 return withWrapper(
1745 /* @__PURE__ */ react.createElement( 1746 NewsEventCardPromoStyled, 1747 { 1748 bgColour: backgroundColour, 1749 $inSidebar: inSidebar 1750 }, 1751 /* @__PURE__ */ react.createElement("div", { className: "container" }, renderHeading(), format === "4Events" ? /* @__PURE__ */ react.createElement("div", { className: "error-message" }, "No upcoming events in ", orgUnit?.entryTitle, ".", /* @__PURE__ */ react.createElement("br", null), "View the", " ", /* @__PURE__ */ react.createElement("a", { href: "/events", className: "events-list-link" }, "Main events list"), " ", "instead.") : /* @__PURE__ */ react.createElement("div", { className: "error-message" }, "No results found")) 1752 ) 1753 ); 1754 } 1755 return withWrapper( 1756 /* @__PURE__ */ react.createElement( 1757 NewsEventCardPromoStyled, 1758 { 1759 bgColour: backgroundColour, 1760 $inSidebar: inSidebar 1761 }, 1762 /* @__PURE__ */ react.createElement("div", { className: "container" }, renderHeading(), /* @__PURE__ */ react.createElement( 1763 "div", 1764 { 1765 className: classnames_default()("card-row", { 1766 [`card-count-${items.length}`]: !inSidebar, 1767 "card-row--collapsed": inSidebar && !isExpanded 1768 }) 1769 }, 1770 items.map((item) => /* @__PURE__ */ react.createElement("div", { key: item.id, className: "card-wrapper" }
1770, item.type === "news" ? /* @__PURE__ */ react.createElement(NewsCard, { item, inSidebar }) : /* @__PURE__ */ react.createElement(EventCard, { item, inSidebar }))) 1771 )) 1772 ) 1773 ); 1774} 1775NewsEventCardPromo.propTypes = { 1776 title: (prop_types_default()).string.isRequired, 1777 orgUnit: prop_types_default().shape({ 1778 sys: prop_types_default().shape({ 1779 id: (prop_types_default()).string.isRequired 1780 }).isRequired, 1781 entryTitle: (prop_types_default()).string 1782 }), 1783 format: prop_types_default().oneOf(["4NewsStories", "4Events", "2News2Events"]), 1784 backgroundColour: (prop_types_default()).string, 1785 headingLevel: (prop_types_default()).string, 1786 inSidebar: (prop_types_default()).bool 1787}; 1788 1789 1790/***/ }, 1791 1792/***/ 21309 1793(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 1794 1795 1796// EXPORTS 1797__webpack_require__.d(__webpack_exports__, { 1798 s: () => (/* binding */ PeopleGroupDisplayer) 1799}); 1800 1801// EXTERNAL MODULE: ./node_modules/react/index.js 1802var react = __webpack_require__(29633); 1803// EXTERNAL MODULE: ./node_modules/prop-types/index.js 1804var prop_types = __webpack_require__(86627); 1805var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types); 1806// EXTERNAL MODULE: ./src/app/blocks/shared/components/index.js + 138 modules 1807var components = __webpack_require__(61009); 1808// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js + 7 modules 1809var styled_components_browser_esm = __webpack_require__(67780); 1810;// ./src/app/blocks/pages/Hub/PeopleGroupDisplayer/PeopleGroupDisplayer.styled.js 1811 1812const PeopleGroupDisplayerStyled = styled_components_browser_esm["default"].section` 1813 background-color: ${(p) => p.$bgColour}; 1814 padding: 40px 0; 1815 1816 .container { 1817 max-width: 1200px; 1818 margin: 0 auto; 1819 } 1820 1821 .section-heading { 1822 font-family: Kings Caslon Display, serif; 1823 font-weight: 400; 1824 font-size: 2.375rem; 1825 line-height: 1.2; 1826 color: #000000; 1827 text-transform: none; 1828 padding-bottom: 16px; 1829 text-align: center; 1830 } 1831 .section-summary { 1832 font-family: Wix Madefor Display, sans-serif; 1833 font-size: 1.125rem; 1834 line-height: 1.5; 1835 color: #000000; 1836 text-align: center; 1837 max-width: 800px; 1838 margin: 0 auto 40px; 1839 } 1840 1841 .people-grid { 1842 display: grid; 1843 gap: 24px; 1844 grid-template-columns: repeat(3, 384px); 1845 justify-content: center; 1846 } 1847 1848 @media (max-width: ${(p) => p.theme.breakpoints.desktop}px) { 1849 .people-grid { 1850 grid-template-columns: repeat(2, 384px); 1851 } 1852 } 1853 1854 @media (max-width: ${(p) => p.theme.breakpoints.tablet}px) { 1855 padding: 16px 0; 1856 .people-grid { 1857 grid-template-columns: 1fr; 1858 } 1859 1860 .card-wrapper > div { 1861 width: 100%; 1862 } 1863 } 1864 1865 .card-wrapper { 1866 display: flex; 1867 justify-content: center; 1868 } 1869`; 1870 1871// EXTERNAL MODULE: ./node_modules/@fortawesome/react-fontawesome/index.es.js 1872var index_es = __webpack_require__(18149); 1873// EXTERNAL MODULE: ./node_modules/lodash/truncate.js 1874var truncate = __webpack_require__(59973); 1875var truncate_default = /*#__PURE__*/__webpack_require__.n(truncate); 1876// EXTERNAL MODULE: ./src/app/blocks/shared/utils/index.js + 7 modules 1877var utils = __webpack_require__(92562); 1878// EXTERNAL MODULE: ./src/app/blocks/shared/components/Image/utils.js 1879var Image_utils = __webpack_require__(58762); 1880;// ./src/app/blocks/pages/Hub/PeopleGroupDisplayer/PersonCard/PersonCard.styled.js 1881 1882const PersonCardStyled = styled_components_browser_esm["default"].div` 1883 display: flex; 1884 flex-direction: row; 1885 gap: 16px; 1886 border-radius: 8px; 1887 padding: 24px 16px; 1888 background-color: #ffffff; 1889 width: 384px; 1890 box-shadow: 0 2px 16px 0 rgba(0, 0, 0, 0.1); 1891 1892 .personCard--imageContainer { 1893 flex-shrink: 0; 1894 1895 .person--image { 1896 width: 64px; 1897 height: 64px; 1898 border-radius: 50%; 1899 object-fit: cover; 1900 } 1901 } 1902 1903 .personCard--contentContainer { 1904 display: flex; 1905 flex-direction: column; 1906 gap: 6px; 1907 width: 100%; 1908 overflow: hidden; 1909 } 1910 1911 .person--name { 1912 &:visited { 1913 color: #774db9; 1914 } 1915 1916 &:focus-visible { 1917 background-color: #ffdd00; 1918 border-bottom: 4px solid #000000; 1919 color: #000000; 1920 } 1921 1922 .linkCta--text { 1923 font-family: Wix Madefor Display, sans-serif; 1924 font-size: 1rem; 1925 font-weight: 600; 1926 } 1927 } 1928 1929 .person--jobTitle { 1930 font-family: Wix Madefor Text, sans-serif; 1931 font-size: 0.875rem; 1932 font-weight: 400; 1933 line-height: 1.5; 1934 color: #2a2b2c; 1935 margin: 0; 1936 } 1937 1938 .person--contact { 1939 display: flex; 1940 align-items: flex-start; 1941 gap: 12px; 1942 font-family: Wix Madefor Text, sans-serif; 1943 font-size: 0.875rem; 1944 font-weight: 700; 1945 line-height: 1.5; 1946 color: #005ad2; 1947 text-decoration: underline; 1948 1949 &:hover { 1950 color: #002395; 1951 } 1952 1953 &:visited { 1954 color: #774db9; 1955 } 1956 1957 &:focus-visible { 1958 background-color: #ffdd00; 1959 border-bottom: 4px solid #000000; 1960 color: #000000; 1961 } 1962 1963 span { 1964 word-break: break-all; 1965 } 1966 1967 svg { 1968 padding-top: 3px; 1969 flex-shrink: 0; 1970 width: 16px; 1971 height: 16px; 1972 } 1973 } 1974 1975 .icon--arrow { 1976 padding-top: 5px; 1977 padding-left: 8px; 1978 } 1979`; 1980 1981;// ./src/app/blocks/pages/Hub/PeopleGroupDisplayer/PersonCard/PersonCard.js 1982 1983 1984 1985 1986 1987 1988 1989 1990function PersonCard({ person, showJobTitle = true }) { 1991 const { 1992 firstName, 1993 lastName, 1994 suffix, 1995 entryDescription, 1996 title, 1997 sys, 1998 override, 1999 entryThumbnail, 2000 socialLinks = [] 2001 } = person; 2002 const titles = (0,utils/* isValidArray */.OP)(title) ? title.join(", ") : title; 2003 const fullName = [titles, firstName, lastName, suffix].filter(
2003Boolean).join(" "); 2004 const emailItem = socialLinks.find((item) => item.type === "email"); 2005 const email = emailItem?.value?.emailAddress || emailItem?.value; 2006 const phoneItem = socialLinks.find((item) => item.type === "telephone"); 2007 const telephone = phoneItem?.value?.telephoneNumber || phoneItem?.value; 2008 return /* @__PURE__ */ react.createElement(PersonCardStyled, null, /* @__PURE__ */ react.createElement("div", { className: "personCard--imageContainer" }, /* @__PURE__ */ react.createElement( 2009 components/* Image */._V, 2010 { 2011 image: (0,Image_utils/* getDefaultImage */.Ny)( 2012 entryThumbnail, 2013 "https://kcl.ac.uk/siteelements/2017/images/default-pic.jpg" 2014 ), 2015 className: "person--image", 2016 width: 64, 2017 height: 64, 2018 crop: true 2019 } 2020 )), /* @__PURE__ */ react.createElement("div", { className: "personCard--contentContainer" }, /* @__PURE__ */ react.createElement( 2021 components/* LinkCta */.$l, 2022 { 2023 fullwidth: true, 2024 url: override || `/people/${sys?.slug}`, 2025 className: "person--name", 2026 maxCharacterLength: fullName.length, 2027 rightIcon: /* @__PURE__ */ react.createElement( 2028 index_es/* FontAwesomeIcon */.g, 2029 { 2030 icon: override ? "fa-regular fa-arrow-up-right-from-square" : "fa-solid fa-arrow-right", 2031 className: "icon--arrow", 2032 "aria-hidden": "true" 2033 } 2034 ) 2035 }, 2036 fullName
2037 ), showJobTitle && entryDescription && /* @__PURE__ */ react.createElement("p", { className: "person--jobTitle" }, truncate_default()(entryDescription, { length: 65 })), email && /* @__PURE__ */ react.createElement( 2038 "a", 2039 { 2040 href: `mailto:${email}`, 2041 className: "person--contact", 2042 "aria-label": `Email ${fullName}: ${email}` 2043 }, 2044 /* @__PURE__ */ react.createElement(index_es/* FontAwesomeIcon */.g, { icon: "fa-regular fa-envelope", "aria-hidden": "true" }), 2045 /* @__PURE__ */ react.createElement("span", null, email) 2046 ), telephone && /* @__PURE__ */ react.createElement( 2047 "a", 2048 { 2049 href: `tel:${telephone}`, 2050 className: "person--contact", 2051 "aria-label": `Telephone ${fullName}: ${telephone}` 2052 }, 2053 /* @__PURE__ */ react.createElement(index_es/* FontAwesomeIcon */.g, { icon: "fa-regular fa-phone", "aria-hidden": "true" }), 2054 /* @__PURE__ */ react.createElement("span", null, telephone) 2055 ))); 2056} 2057PersonCard.propTypes = { 2058 person: (prop_types_default()).object, 2059 showJobTitle: (prop_types_default()).bool 2060}; 2061 2062// EXTERNAL MODULE: ./src/app/blocks/shared/utils/helpers.js 2063var helpers = __webpack_require__(91655); 2064// EXTERNAL MODULE: ./src/app/blocks/pages/Hub/utils/index.js 2065var Hub_utils = __webpack_require__(96517); 2066;// ./src/app/blocks/pages/Hub/PeopleGroupDisplayer/PeopleGroupDisplayer.js 2067 2068 2069 2070 2071 2072 2073 2074const MAX_PEOPLE = 15; 2075const BG_COLOURS = { 2076 secondary: "#EAEFF0", 2077 primary: "#ffffff" 2078}; 2079const PeopleGroupDisplayer = ({ peopleGroupPicker }) => { 2080 const { 2081 sectionTitle, 2082 summary, 2083 peopleGroup, 2084 showJobTitles, 2085 sortNames, 2086 headingLevel, 2087 backgroundColour 2088 } = peopleGroupPicker; 2089 const peopleList = peopleGroup?.people; 2090 let people = (0,helpers/* isInvalidArray */.J_)(peopleList) ? [] : peopleList.filter((person) => person.hide !== true); 2091 if (sortNames === "alphabetically") { 2092 people.sort((a, b) => { 2093 const lastNameCompare = (a.lastName || "").localeCompare( 2094 b.lastName || "" 2095 ); 2096 if (lastNameCompare !== 0) return lastNameCompare; 2097 return (a.firstName || "").localeCompare(b.firstName || ""); 2098 }); 2099 } 2100 const isOverLimit = people.length > MAX_PEOPLE; 2101 people = people.slice(0, MAX_PEOPLE); 2102 if ((0,helpers/* isInvalidArray */.J_)(people)) return null; 2103 const bgColour = BG_COLOURS[backgroundColour] ?? BG_COLOURS.primary; 2104 return /* @__PURE__ */ react.createElement(components/* Section */.wn, { bgColour }, /* @__PURE__ */ react.createElement(PeopleGroupDisplayerStyled, { $bgColour: bgColour }, /* @__PURE__ */ react.createElement( 2105 components/* Warning */.N5, 2106 { 2107 show: isOverLimit, 2108 message: `There is a limit of ${MAX_PEOPLE} people per group and there are more people in this group. It is suggested that you split larger groups over multiple groups by type of person or use a full people listing.` 2109 } 2110 ), /* @__PURE__ */ react.createElement("div", { className: "container" }, /* @__PURE__ */ react.createElement( 2111 components/* Heading */.DZ, 2112 { 2113 headingLevel: (0,Hub_utils/* getHeadingLevel */.lD)(headingLevel), 2114 className: "section-heading", 2115 headingText: sectionTitle 2116 } 2117 ), summary && /* @__PURE__ */ react.createElement("p", { className: "section-summary" }, summary), /* @__PURE__ */ react.createElement("div", { className: "people-grid" }, people.map((person) => /* @__PURE__ */ react.createElement("div", { key: person.sys?.id, className: "card-wrapper" }, /* @__PURE__ */ react.createElement(PersonCard, { person, showJobTitle: showJobTitles }))))))); 2118}; 2119PeopleGroupDisplayer.propTypes = { 2120 peopleGroupPicker: (prop_types_default()).object 2121}; 2122 2123 2124/***/ }, 2125 2126/***/ 84104 2127(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 2128 2129 2130// EXPORTS 2131__webpack_require__.d(__webpack_exports__, { 2132 h: () => (/* binding */ ResearchProjectListing) 2133}); 2134 2135// EXTERNAL MODULE: ./node_modules/react/index.js 2136var react = __webpack_require__(29633); 2137// EXTERNAL MODULE: ./node_modules/prop-types/index.js 2138var prop_types = __webpack_require__(86627); 2139var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types); 2140// EXTERNAL MODULE: ./node_modules/@fortawesome/react-fontawesome/index.es.js 2141var index_es = __webpack_require__(18149); 2142// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js + 7 modules 2143var styled_components_browser_esm = __webpack_require__(67780); 2144// EXTERNAL MODULE: ./src/app/blocks/theme/breakpoints.js 2145var breakpoints = __webpack_require__(3726); 2146;// ./src/app/blocks/pages/Hub/ResearchProjectListing/ResearchProjectListing.styled.js 2147 2148 2149const ResearchProjectListingStyled = styled_components_browser_esm["default"].div` 2150 padding-top: ${(p) => p.$noHeadingOrSummary ? "16px" : "40px"}; 2151 padding-bottom: 48px; 2152 2153 .responsive-inner-container { 2154 overflow-x: visible; 2155 } 2156 2157 .listing-heading { 2158 margin-bottom: 40px; 2159 font-family: Kings Caslon Display, serif; 2160 font-weight: 400; 2161 font-size: 2.375rem; 2162 line-height: 1.2; 2163 text-transform: none; 2164 } 2165 2166 h1.listing-heading { 2167 font-size: 2.875rem; 2168 } 2169 2170 .listing-summary { 2171 margin-bottom: 40px; 2172 font-family: Wix Madefor Text, sans-serif; 2173 font-size: 1.125rem; 2174 font-weight: 400; 2175 line-height: 1.5; 2176 color: #000000; 2177 } 2178 2179 .listing-filter-bar { 2180 background: #ffffff; 2181 border-radius: 8px; 2182 box-shadow: 0 2px 16px 0 rgba(0, 0, 0, 0.1); 2183 padding: 24px 64px; 2184 margin-bottom: 24px; 2185 2186 @media (max-width: ${breakpoints/* mediaBreakpoints */.l.tablet}) { 2187 padding: 24px; 2188 } 2189 } 2190 2191 .filter-bar-header { 2192 display: flex; 2193 flex-direction: row; 2194 justify-content: space-between; 2195 align-items: center; 2196 margin-bottom: 16px; 2197 2198 @media (max-width: ${breakpoints/* mediaBreakpoints */.l.tablet}) { 2199 flex-direction: column; 2200 align-items: flex-start; 2201 gap: 16px; 2202 } 2203 } 2204 2205 .filter-bar-title { 2206 font-family: Wix Madefor Display, sans-serif; 2207 font-weight: 700; 2208 font-size: 1.313rem; 2209 line-height: 1.3; 2210 color: #000000; 2211 margin: 0; 2212 } 2213 2214 .filter-bar-counter { 2215 font-family: Wix Madefor Text, sans-serif; 2216 font-weight: 400; 2217 font-size: 1rem; 2218 line-height: 1.5; 2219 color: #000000; 2220 margin: 0; 2221 } 2222 2223 .filter-bar-dropdown { 2224 width: 100%; 2225 } 2226 2227 .card-grid { 2228 display: grid; 2229 grid-template-columns: 1fr; 2230 row-gap: 32px; 2231 column-gap: 24px; 2232 padding-top: 8px; 2233 2234 @media (min-width: ${breakpoints/* mediaBreakpoints */.l.tablet}) { 2235 grid-template-columns: repeat(2, 1fr); 2236 } 2237 2238 @media (min-width: ${breakpoints/* mediaBreakpoints */.l.desktop}) { 2239 grid-template-columns: ${(p) => p.$hasSidebar ? "repeat(2, 1fr)" : "repeat(3, 1fr)"}; 2240 row-gap: 40px; 2241 padding-top: 16px; 2242 } 2243 } 2244 2245 .card-wrapper { 2246 display: flex; 2247 } 2248 2249 .listing-pagination { 2250 margin-top: 64px; 2251 } 2252 2253 .back-to-top { 2254 display: flex; 2255 justify-content: center;
2256 align-items: center; 2257 gap: 8px; 2258 margin-top: 40px; 2259 font-family: Wix Madefor Text, sans-serif; 2260 font-weight: 700; 2261 font-size: 1.125rem; 2262 color: #005ad2; 2263 text-decoration: underline; 2264 cursor: pointer; 2265 2266 &:hover { 2267 text-decoration: none; 2268 } 2269 2270 @media (min-width: ${breakpoints/* mediaBreakpoints */.l.desktop}) { 2271 display: none; 2272 } 2273 } 2274 2275 .no-results { 2276 h2 { 2277 color: #000000; 2278 font-family: Wix Madefor Display, sans-serif; 2279 font-size: 1.5rem; 2280 font-weight: 700; 2281 line-height: 1.3; 2282 text-transform: none; 2283 } 2284 2285 p { 2286 color: #000000; 2287 font-family: Wix Madefor Text, sans-serif; 2288 font-size: 1.125rem; 2289 font-weight: 400; 2290 line-height: 1.5; 2291 } 2292 } 2293`; 2294 2295// EXTERNAL MODULE: ./src/app/blocks/shared/components/index.js + 138 modules 2296var components = __webpack_require__(61009); 2297// EXTERNAL MODULE: ./src/app/blocks/shared/components/SearchSection/SearchDropdown/SearchDropdown.js + 1 modules 2298var SearchDropdown = __webpack_require__(22968); 2299// EXTERNAL MODULE: ./src/app/blocks/shared/components/SearchSection/SearchSection.js + 10 modules 2300var SearchSection = __webpack_require__(31176); 2301;// ./src/app/blocks/pages/Hub/ResearchProjectListing/ResearchProjectCard/ResearchProjectCard.styled.js 2302 2303const ResearchProjectCardStyled = styled_components_browser_esm["default"].article` 2304 display: flex; 2305 flex-direction: column; 2306 border-radius: 8px; 2307 max-width: 100%; 2308 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); 2309 background-color: #ffffff; 2310 height: 100%; 2311 width: 100%; 2312 2313 .card-image { 2314 flex-shrink: 0; 2315 height: 208px; 2316 width: 100%; 2317 overflow: hidden; 2318 2319 img { 2320 width: 100%; 2321 height: 100%; 2322 border-top-right-radius: 8px; 2323 border-top-left-radius: 8px; 2324 object-fit: cover; 2325 display: block; 2326 } 2327 2328 @media (max-width: ${(p) => p.theme.breakpoints.tablet - 1}px) { 2329 display: none; 2330 } 2331 } 2332 2333 .card-content { 2334 display: flex; 2335 flex-direction: column; 2336 row-gap: 16px; 2337 padding: 24px; 2338 font-family: Wix Madefor Text, sans-serif; 2339 min-height: 0; 2340 } 2341 2342 .card-description { 2343 margin: 0; 2344 font-size: 1rem; 2345 font-weight: 400; 2346 line-height: 1.5; 2347 color: #000000; 2348 display: -webkit-box; 2349 -webkit-line-clamp: 5; 2350 -webkit-box-orient: vertical; 2351 overflow: hidden; 2352 } 2353 2354 .card-tags { 2355 display: flex; 2356 flex-wrap: wrap; 2357 gap: 8px; 2358 margin-top: auto; 2359 padding-top: 8px; 2360 } 2361 2362 .card-link-icon { 2363 padding: 4.8px 0 0 8px; 2364 } 2365`; 2366 2367// EXTERNAL MODULE: ./src/app/blocks/shared/components/Image/utils.js 2368var utils = __webpack_require__(58762); 2369;// ./src/app/blocks/pages/Hub/ResearchProjectListing/ResearchProjectCard/ResearchProjectCard.js 2370 2371 2372 2373 2374 2375 2376function ResearchProjectCard({ project, showThumbnails = true }) { 2377 const { 2378 title, 2379 uri, 2380 description, 2381 status, 2382 thumbnail, 2383 researchAreas = [], 2384 subjectAreas = [] 2385 } = project; 2386 const firstResearchArea = researchAreas[0]; 2387 const displaySubjectAreas = subjectAreas.slice(0, 3); 2388 const cardImage = showThumbnails ? (0,utils/* getDefaultImage */.Ny)(thumbnail, utils/* DEFAULT_THUMBNAIL */.fX) : null; 2389 return /* @__PURE__ */ react.createElement(ResearchProjectCardStyled, null, cardImage && /* @__PURE__ */ react.createElement("div", { className: "card-image" }, /* @__PURE__ */ react.createElement(components/* Image */._V, { image: cardImage, defaultImgOnError: true })), /* @__PURE__ */ react.createElement("div", { className: "card-content" }, /* @__PURE__ */ react.createElement( 2390 components/* LinkCta */.$l, 2391 { 2392 className: "card-link", 2393 childClassName: "card-link", 2394 url: uri, 2395 rightIcon: /* @__PURE__ */ react.createElement( 2396 index_es/* FontAwesomeIcon */.g, 2397 { 2398 className: "card-link-icon", 2399 icon: "fa-solid fa-arrow-right" 2400 } 2401 ), 2402 maxCharacterLength: 150 2403 }, 2404 title
2405 ), description && /* @__PURE__ */ react.createElement("p", { className: "card-description" }, description), /* @__PURE__ */ react.createElement("div", { className: "card-tags" }, status?.name && /* @__PURE__ */ react.createElement(components/* Pill */.ab, { bgColour: "#F4A6A2", className: "tag tag--status" }, status.name), firstResearchArea && /* @__PURE__ */ react.createElement(components/* Pill */.ab, { bgColour: "#EAEFF0", className: "tag tag--category" }, firstResearchArea.entryTitle), displaySubjectAreas.map((area) => /* @__PURE__ */ react.createElement( 2406 components/* Pill */.ab, 2407 { 2408 key: area.sys.id, 2409 bgColour: "#EAEFF0", 2410 className: "tag tag--category" 2411 }, 2412 area.entryTitle 2413 ))))); 2414} 2415ResearchProjectCard.propTypes = { 2416 showThumbnails: (prop_types_default()).bool, 2417 project: prop_types_default().shape({ 2418 id: (prop_types_default()).string.isRequired, 2419 uri: (prop_types_default()).string, 2420 title: (prop_types_default()).string, 2421 description: (prop_types_default()).string, 2422 status: prop_types_default().shape({ name: (prop_types_default()).string }), 2423 thumbnail: (prop_types_default()).object, 2424 researchAreas: prop_types_default().arrayOf( 2425 prop_types_default().shape({ 2426 sys: prop_types_default().shape({ id: (prop_types_default()).string }), 2427 entryTitle: (prop_types_default()).string 2428 }) 2429 ), 2430 subjectAreas: prop_types_default().arrayOf( 2431 prop_types_default().shape({ 2432 sys: prop_types_default().shape({ id: (prop_types_default()).string }), 2433 entryTitle: (prop_types_default()).string 2434 }) 2435 ) 2436 }).isRequired 2437}; 2438 2439// EXTERNAL MODULE: ./node_modules/contensis-delivery-api/lib/index.js 2440var lib = __webpack_require__(43196); 2441// EXTERNAL MODULE: ./src/app/blocks/shared/hooks/index.js + 17 modules 2442var hooks = __webpack_require__(88429); 2443// EXTERNAL MODULE: ./src/app/blocks/shared/utils/index.js + 7 modules 2444var shared_utils = __webpack_require__(92562); 2445// EXTERNAL MODULE: ./src/app/features/listings/util/util.js 2446var util = __webpack_require__(9514); 2447;// ./src/app/blocks/pages/Hub/ResearchProjectListing/hooks/useResearchProjectsQuery.js 2448 2449 2450 2451 2452 2453const parseProjectsResult = (result) => { 2454 if ((0,shared_utils/* isInvalidArray */.J_)(result?.items)) return []; 2455 return result.items.map((item) => ({ 2456 id: item.sys.id, 2457 uri: item.sys.uri, 2458 title: item.entryTitle, 2459 description: item.description, 2460 status: item.status, 2461 thumbnail: item.thumbnail, 2462 researchAreas: item.researchAreas || [], 2463 subjectAreas: item.subjectAreas || [] 2464 })); 2465}; 2466const useResearchProjectsQuery = ({ 2467 sourceId, 2468 status, 2469 pageIndex = 0, 2470 pageSize = 12, 2471 enabled = true 2472}) => { 2473 const { isLoading, result, setQuery } = (0,hooks/* useSearch */.SQ)(); 2474 (0,react.useEffect)(() => { 2475 if (!enabled || !sourceId) return; 2476 const conditions = [ 2477 lib.Op.equalTo("sys.contentTypeId", "researchProject"), 2478 lib.Op.equalTo("sys.versionStatus", "published"), 2479 lib.Op.equalTo("orgUnits[].sys.id", sourceId), 2480 lib.Op.equalTo("searchOptions.includeInKCLSiteListings", true) 2481 ]; 2482 if (status && status !== "All" && util/* projectStatusTaxonomy */.NZ[status]) { 2483 conditions.push(lib.Op.equalTo("status", util/* projectStatusTaxonomy */.NZ[status])); 2484 } 2485 const query = new lib.Query(lib.Op.and(...conditions)); 2486 query.orderBy = lib.OrderBy.asc("entryTitle"); 2487 query.pageSize = pageSize; 2488 query.pageIndex = pageIndex; 2489 query.fields = [ 2490 "entryTitle", 2491 "sys.uri", 2492 "sys.id", 2493 "description", 2494 "status", 2495 "thumbnail", 2496 "researchAreas", 2497 "subjectAreas" 2498 ]; 2499 setQuery(query); 2500 }, [enabled, sourceId, status, pageIndex, pageSize, setQuery]); 2501 const totalCount = result?.totalCount ?? 0; 2502 return { 2503 isLoading: isLoading || !!sourceId && result?.items === void 0, 2504 projects: parseProjectsResult(result), 2505 totalCount 2506 }; 2507}; 2508 2509;// ./src/app/blocks/pages/Hub/ResearchProjectListing/hooks/useResearchProfilesQuery.js 2510 2511 2512 2513 2514const parseProfilesResult = (result) => { 2515 if ((0,shared_utils/* isInvalidArray */.J_)(result?.items)) return []; 2516 return result.items.map((item) => ({ 2517 id: item.sys.id, 2518 uri: item.sys.uri, 2519 title: item.entryTitle, 2520 description: item.description, 2521 thumbnail: item.promoImage, 2522 researchAreas: item.categories || [], 2523 subjectAreas: item.topics || [] 2524 })); 2525}; 2526const useResearchProfilesQuery = ({ 2527 sourceId, 2528 searchText = "", 2529 letter = "", 2530 pageIndex = 0, 2531 pageSize = 12, 2532 enabled = true 2533}) => { 2534 const { isLoading, result, setQuery } = (0,hooks/* useSearch */.SQ)(); 2535 (0,react.useEffect)(() => { 2536 if (!enabled || !sourceId) return; 2537 const filters = [ 2538 lib.Op.equalTo("sys.contentTypeId", "researchProfile"), 2539 lib.Op.equalTo("sys.versionStatus", "published"), 2540 lib.Op.equalTo("orgUnits[].sys.id", sourceId), 2541 lib.Op.equalTo("searchOptions.includeInKCLSiteListings", true) 2542 ]; 2543 if (searchText) { 2544 filters.push( 2545 lib.Op.or( 2546 lib.Op.contains("entryTitle", searchText), 2547 lib.Op.contains("description", searchText), 2548 lib.Op.contains("categories[].entryTitle", searchText), 2549 lib.Op.contains("topics[].entryTitle", searchText) 2550 ) 2551 ); 2552 } 2553 if (letter) { 2554 filters.push(lib.Op.startsWith("entryTitle", letter)); 2555 } 2556 const query = new lib.Query(lib.Op.and(...filters)); 2557 query.orderBy = lib.OrderBy.asc("entryTitle"); 2558 query.pageSize = pageSize; 2559 query.pageIndex = pageIndex; 2560 query.fields = [ 2561 "entryTitle", 2562 "sys.uri", 2563 "sys.id", 2564 "description", 2565 "promoImage", 2566 "categories", 2567 "topics" 2568 ]; 2569 setQuery(query); 2570 }, [enabled, sourceId, searchText, letter, pageIndex, pageSize, setQuery]); 2571 const totalCount = result?.totalCount ?? 0; 2572 return { 2573 isLoading: isLoading || !!sourceId && result?.items === void 0, 2574 profiles: parseProfilesResult(result), 2575 totalCount 2576 }; 2577}; 2578 2579// EXTERNAL MODULE: ./src/app/blocks/shared/utils/dom-helpers.js 2580var dom_helpers = __webpack_require__(97306); 2581// EXTERNAL MODULE: ./src/app/blocks/shared/utils/filter-utils.js 2582var filter_utils = __webpack_require__(67218); 2583// EXTERNAL MODULE: ./src/app/blocks/pages/ListingPage/utils/constants.js 2584var constants = __webpack_require__(68568); 2585;// ./src/app/blocks/pages/Hub/ResearchProjectListing/utils/index.js 2586 2587 2588const STATUS_FILTERS = ["Ongoing", "Completed", "Starting"]; 2589const STATUS_DROPDOWN_OPTIONS = STATUS_FILTERS.map((s) => ({ 2590 value: s, 2591 label: s 2592})); 2593const PAGE_SIZE_WITH_THUMBNAILS = 6; 2594const PAGE_SIZE_WITHOUT_THUMBNAILS = 12; 2595const PROFILE_FILTER_LIST = [ 2596 (0,filter_utils/* createFilterInput */.JU)( 2597 "profile-search", 2598 "Search", 2599 "Type here to find a profile", 2600 "" 2601 ), 2602 (0,filter_utils/* createAToZFilterDropdown */.og)( 2603 "profile-atoz", 2604 "Filter by letter (A - Z)", 2605 "Please select", 2606 constants/* atoZ */.LZ, 2607 "" 2608 ) 2609]; 2610 2611;// ./src/app/blocks/pages/Hub/ResearchProjectListing/ResearchProjectListing.js 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626function ResearchProjectListing({ value = {}, hasSidebar = false }) { 2627 const { 2628 heading, 2629 summary, 2630 headingLevel, 2631 facultyDepartment, 2632 showThumbnails = true, 2633 showProjectsOrProfiles = "projects" 2634 } = value; 2635 const headingLevelMap = { "level-1": "Level 1", "level-2": "Level 2" }; 2636 const mappedHeadingLevel = headingLevelMap[headingLevel] ?? headingLevel; 2637 const isProfiles = showProjectsOrProfiles === "profiles"; 2638 const noHeadingOrSummary = !heading && !summary; 2639 const [status, setStatus] = (0,react.useState)("Ongoing"); 2640 const [pageIndex, setPageIndex] = (0,react.useState)(0); 2641 const [profileFilters, setProfileFilters] = (0,react.useState)({ 2642 pageIndex: 0, 2643 searchText: "", 2644 letter: "" 2645 }); 2646 const sourceId = facultyDepartment?.sys?.id; 2647 const { isMobile } = (0,hooks/* useScreenType */.mk)(); 2648 const { isMobile: isBelowDesktop } = (0,hooks/* useScreenType */.mk)(1024); 2649 const pageSize = showThumbnails && !isBelowDesktop ? PAGE_SIZE_WITH_THUMBNAILS : PAGE_SIZE_WITHOUT_THUMBNAILS; 2650 const { 2651 isLoading: projectsLoading, 2652 projects, 2653 totalCount: projectsTotalCount 2654 } = useResearchProjectsQuery({ 2655 sourceId, 2656 status, 2657 pageIndex, 2658 pageSize, 2659 enabled: !isProfiles 2660 }); 2661 const { 2662 isLoading: profilesLoading, 2663 profiles, 2664 totalCount: profilesTotalCount 2665 } = useResearchProfilesQuery({ 2666 sourceId, 2667 searchText: profileFilters.searchText, 2668 letter: profileFilters.letter, 2669 pageIndex: profileFilters.pageIndex, 2670 pageSize, 2671 enabled: isProfiles 2672 }); 2673 const isLoading = isProfiles ? profilesLoading : projectsLoading; 2674 const items = isProfiles ? profiles : projects; 2675 const totalCount = isProfiles ? profilesTotalCount : projectsTotalCount; 2676 const currentPageIndex = isProfiles ? profileFilters.pageIndex : pageIndex; 2677 const projectFilterRef = (0,react.useRef)(null); 2678 const profileFilterRef = (0,react.useRef)(null); 2679 const handleStatusChange = ({ value: value2 }) => { 2680 setStatus(value2); 2681 setPageIndex(0); 2682 }; 2683 const handleProfileSearch = (filters) => {
2684 const letter = filters["profile-atoz"]; 2685 setProfileFilters({ 2686 searchText: filters["profile-search"] ?? "", 2687 letter: letter === "All" ? "" : letter ?? "", 2688 pageIndex: 0 2689 }); 2690 }; 2691 const endCount = Math.min((currentPageIndex + 1) * pageSize, totalCount); 2692 const startCount = totalCount > 0 ? currentPageIndex * pageSize + 1 : 0; 2693 return /* @__PURE__ */ react.createElement( 2694 ResearchProjectListingStyled, 2695 { 2696 $hasSidebar: hasSidebar, 2697 $noHeadingOrSummary: noHeadingOrSummary 2698 }, 2699 /* @__PURE__ */ react.createElement(components/* ResponsiveContainer */.uf, { isEmbedded: hasSidebar }, /* @__PURE__ */ react.createElement("span", { id: "projects-top" }), heading && /* @__PURE__ */ react.createElement( 2700 components/* Heading */.DZ, 2701 { 2702 headingLevel: mappedHeadingLevel, 2703 className: "listing-heading", 2704 headingText: heading 2705 } 2706 ), summary && /* @__PURE__ */ react.createElement("p", { className: "listing-summary" }, summary), isProfiles ? /* @__PURE__ */ react.createElement("div", { ref: profileFilterRef }, /* @__PURE__ */ react.createElement( 2707 SearchSection/* SearchSection */.u, 2708 { 2709 searchSectionId: "research-profiles", 2710 title: "Refine your results", 2711 filterList: PROFILE_FILTER_LIST, 2712 onSearch: handleProfileSearch, 2713 onInputEnterKey: ({ filterValue }) => handleProfileSearch(filterValue), 2714 paginatorStartElementIndexLabel: startCount, 2715 paginatorEndElementIndexLabel: endCount, 2716 totalNumberOfElements: totalCount, 2717 hideAdvancedFilters: true, 2718 stackFilters: hasSidebar 2719 } 2720 )) : /* @__PURE__ */ react.createElement("div", { ref: projectFilterRef, className: "listing-filter-bar" }, /* @__PURE__ */ react.createElement("div", { className: "filter-bar-header" }, /* @__PURE__ */ react.createElement("p", { className: "filter-bar-title" }, "Refine your results"), totalCount > 0 && /* @__PURE__ */ react.createElement( 2721 "p", 2722 { 2723 className: "filter-bar-counter", 2724 "aria-live": "polite", 2725 "aria-atomic": "true" 2726 }, 2727 endCount, 2728 " of ", 2729 totalCount, 2730 " results shown"
2731 )), /* @__PURE__ */ react.createElement("div", { className: "filter-bar-dropdown" }, /* @__PURE__ */ react.createElement( 2732 SearchDropdown/* SearchDropdown */.G, 2733 { 2734 id: "project-status-filter", 2735 label: "Filter by project status", 2736 value: status, 2737 placeholder: "All", 2738 isPlaceholderSelectable: true, 2739 dropdownOptions: STATUS_DROPDOWN_OPTIONS, 2740 onChange: handleStatusChange 2741 } 2742 ))), isLoading && /* @__PURE__ */ react.createElement(components/* ListingLoader */.kV, null), !isLoading && (0,shared_utils/* isInvalidArray */.J_)(items) && /* @__PURE__ */ react.createElement("div", { className: "no-results", "aria-live": "polite", "aria-atomic": "true" }, /* @__PURE__ */ react.createElement("h2", null, "No results found"), /* @__PURE__ */ react.createElement("p", null, "Please adjust your terms and filters and try searching again.")), !isLoading && (0,shared_utils/* isValidArray */.OP)(items) && /* @__PURE__ */ react.createElement("div", { className: "card-grid" }, items.map((item) => /* @__PURE__ */ react.createElement("div", { key: item.id, className: "card-wrapper" }, /* @__PURE__ */ react.createElement( 2743 ResearchProjectCard, 2744 { 2745 project: item, 2746 showThumbnails 2747 } 2748 )))), totalCount > pageSize && /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("a", { href: "#projects-top", className: "back-to-top" }, "Back to top", /* @__PURE__ */ react.createElement(index_es/* FontAwesomeIcon */.g, { icon: "fa-solid fa-arrow-up" })), /* @__PURE__ */ react.createElement("div", { className: "listing-pagination" }, /* @__PURE__ */ react.createElement( 2749 components/* Paginator */.mg, 2750 { 2751 currentPage: currentPageIndex, 2752 totalNumberOfElements: totalCount, 2753 elementsPerPage: pageSize, 2754 numberOfPagesUntilSuspension: isMobile ? 2 : 5, 2755 onPageChange: (page) => { 2756 if (isProfiles) { 2757 setProfileFilters((prev) => ({ ...prev, pageIndex: page })); 2758 (0,dom_helpers/* getFirstFocusableElement */.$)(profileFilterRef.current)?.focus(); 2759 } else { 2760 setPageIndex(page); 2761 (0,dom_helpers/* getFirstFocusableElement */.$)(projectFilterRef.current)?.focus(); 2762 } 2763 } 2764 } 2765 )))) 2766 ); 2767} 2768ResearchProjectListing.propTypes = { 2769 hasSidebar: (prop_types_default()).bool, 2770 value: prop_types_default().shape({ 2771 heading: (prop_types_default()).string, 2772 summary: (prop_types_default()).string, 2773 headingLevel: (prop_types_default()).string, 2774 facultyDepartment: prop_types_default().shape({ 2775 sys: prop_types_default().shape({ id: (prop_types_default()).string }) 2776 }), 2777 showThumbnails: (prop_types_default()).bool, 2778 showProjectsOrProfiles: prop_types_default().oneOf(["projects", "profiles"]) 2779 }) 2780}; 2781 2782 2783/***/ }, 2784 2785/***/ 96517 2786(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 2787 2788/* harmony export */ __webpack_require__.d(__webpack_exports__, { 2789/* harmony export */ Tw: () => (/* binding */ getVariantByIndex), 2790/* harmony export */ WG: () => (/* binding */ getCombinedItems), 2791/* harmony export */ lD: () => (/* binding */ getHeadingLevel) 2792/* harmony export */ }); 2793function getVariantByIndex(index) { 2794 return index % 2 === 0 ? "secondary" : "primary"; 2795} 2796const getHeadingLevel = (headingLevel) => { 2797 switch (headingLevel) { 2798 case "heading-level-3": 2799 return "Level 3"; 2800 case "heading-level-4": 2801 return "Level 4"; 2802 default: 2803 return "Level 3"; 2804 } 2805}; 2806const getCombinedItems = (format, newsItems, eventItems) => { 2807 switch (format) { 2808 case "4NewsStories": 2809 return newsItems; 2810 case "4Events": 2811 return eventItems; 2812 case "2News2Events": { 2813 const combined = [...newsItems, ...eventItems]; 2814 return combined; 2815 } 2816 default: 2817 return []; 2818 } 2819}; 2820 2821 2822/***/ }, 2823 2824/***/ 65274 2825(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 2826 2827/* harmony export */ __webpack_require__.d(__webpack_exports__, { 2828/* harmony export */ P: () => (/* binding */ promosToUse) 2829/* harmony export */ }); 2830const promosToUse = (promos) => { 2831 return Array.isArray(promos) ? promos.reduce( 2832 (acc, item) => { 2833 if (item.sys?.contentTypeId === "promoGroup" && Array.isArray(item.promo)) { 2834 acc.promoGroup = item.promo; 2835 } else { 2836 acc.promos.push(item); 2837 } 2838 return acc; 2839 }, 2840 { promos: [], promoGroup: [] } 2841 ) : { promos: [], promoGroup: [] }; 2842}; 2843 2844 2845/***/ } 2846 2847}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.