@clickview/lite 0.50.0-rc.2 → 0.50.0-rc.3

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.
Files changed (45) hide show
  1. package/dist/bundles.json +2 -2
  2. package/dist/css/{355-lite-7e76df6ab5.chunk.css → 355-lite-e474c8ddce.chunk.css} +1 -1
  3. package/dist/css/{7715-lite-671ee43c49.chunk.css → 7715-lite-25809cdd3d.chunk.css} +1 -1
  4. package/dist/css/{8139-lite-10c11c0722.chunk.css → 8139-lite-5511af77bf.chunk.css} +1 -1
  5. package/dist/css/{8960-lite-d45f2332e6.chunk.css → 8960-lite-a80ad92ea7.chunk.css} +1 -1
  6. package/dist/css/{9395-lite-01ed62af75.chunk.css → 9395-lite-e7ca0b1320.chunk.css} +1 -1
  7. package/dist/css/lite-app-f2595ac365.css +53 -0
  8. package/dist/languages/en.json +1 -1
  9. package/dist/scripts/{355-81c86415d9-lite.chunk.js → 355-eaf55dc95f-lite.chunk.js} +1 -1
  10. package/dist/scripts/{355-81c86415d9-lite.chunk.js.map → 355-eaf55dc95f-lite.chunk.js.map} +1 -1
  11. package/dist/scripts/{4395-2e9e72a400-lite.chunk.js → 4395-322f459cb0-lite.chunk.js} +2 -2
  12. package/dist/scripts/4395-322f459cb0-lite.chunk.js.map +1 -0
  13. package/dist/scripts/{5562-42375ce894-lite.chunk.js → 5562-09db6be3de-lite.chunk.js} +3 -3
  14. package/dist/scripts/{5562-42375ce894-lite.chunk.js.map → 5562-09db6be3de-lite.chunk.js.map} +1 -1
  15. package/dist/scripts/{6480-06435aaa46-lite.chunk.js → 6480-60a0ad2ff5-lite.chunk.js} +1 -1
  16. package/dist/scripts/{6480-06435aaa46-lite.chunk.js.map → 6480-60a0ad2ff5-lite.chunk.js.map} +1 -1
  17. package/dist/scripts/{679-a58b19729d-lite.chunk.js → 679-51a0b936e0-lite.chunk.js} +2 -2
  18. package/dist/scripts/{679-a58b19729d-lite.chunk.js.map → 679-51a0b936e0-lite.chunk.js.map} +1 -1
  19. package/dist/scripts/{6863-562ff82f45-lite.chunk.js → 6863-670092eaa5-lite.chunk.js} +1 -1
  20. package/dist/scripts/{6863-562ff82f45-lite.chunk.js.map → 6863-670092eaa5-lite.chunk.js.map} +1 -1
  21. package/dist/scripts/{6948-8c8d9131eb-lite.chunk.js → 6948-e7a16d8c0b-lite.chunk.js} +2 -2
  22. package/dist/scripts/{6948-8c8d9131eb-lite.chunk.js.map → 6948-e7a16d8c0b-lite.chunk.js.map} +1 -1
  23. package/dist/scripts/{7052-32d8266e82-lite.chunk.js → 7052-a4d79c9f20-lite.chunk.js} +3 -3
  24. package/dist/scripts/{7052-32d8266e82-lite.chunk.js.map → 7052-a4d79c9f20-lite.chunk.js.map} +1 -1
  25. package/dist/scripts/{7715-e5380d1440-lite.chunk.js → 7715-634be84dc5-lite.chunk.js} +2 -2
  26. package/dist/scripts/{7715-e5380d1440-lite.chunk.js.map → 7715-634be84dc5-lite.chunk.js.map} +1 -1
  27. package/dist/scripts/{8055-f4de552821-lite.chunk.js → 8055-a6d102b953-lite.chunk.js} +3 -3
  28. package/dist/scripts/{8055-f4de552821-lite.chunk.js.map → 8055-a6d102b953-lite.chunk.js.map} +1 -1
  29. package/dist/scripts/{8139-37635f8bcd-lite.chunk.js → 8139-2a36098eae-lite.chunk.js} +3 -3
  30. package/dist/scripts/{8139-37635f8bcd-lite.chunk.js.map → 8139-2a36098eae-lite.chunk.js.map} +1 -1
  31. package/dist/scripts/{8419-70c7a44baa-lite.chunk.js → 8419-510dc22a69-lite.chunk.js} +1 -1
  32. package/dist/scripts/{8419-70c7a44baa-lite.chunk.js.map → 8419-510dc22a69-lite.chunk.js.map} +1 -1
  33. package/dist/scripts/{9395-181720391d-lite.chunk.js → 9395-77dfcbad18-lite.chunk.js} +2 -2
  34. package/dist/scripts/{9395-181720391d-lite.chunk.js.map → 9395-77dfcbad18-lite.chunk.js.map} +1 -1
  35. package/dist/scripts/{bundle-541e1ff041.min.js → bundle-0187039e1a.min.js} +3 -3
  36. package/dist/scripts/{bundle-541e1ff041.min.js.map → bundle-0187039e1a.min.js.map} +1 -1
  37. package/package.json +1 -1
  38. package/dist/css/lite-app-5b9f4761e1.css +0 -53
  39. package/dist/scripts/4395-2e9e72a400-lite.chunk.js.map +0 -1
  40. /package/dist/scripts/{5562-42375ce894-lite.chunk.js.LICENSE.txt → 5562-09db6be3de-lite.chunk.js.LICENSE.txt} +0 -0
  41. /package/dist/scripts/{7052-32d8266e82-lite.chunk.js.LICENSE.txt → 7052-a4d79c9f20-lite.chunk.js.LICENSE.txt} +0 -0
  42. /package/dist/scripts/{8055-f4de552821-lite.chunk.js.LICENSE.txt → 8055-a6d102b953-lite.chunk.js.LICENSE.txt} +0 -0
  43. /package/dist/scripts/{8139-37635f8bcd-lite.chunk.js.LICENSE.txt → 8139-2a36098eae-lite.chunk.js.LICENSE.txt} +0 -0
  44. /package/dist/scripts/{9395-181720391d-lite.chunk.js.LICENSE.txt → 9395-77dfcbad18-lite.chunk.js.LICENSE.txt} +0 -0
  45. /package/dist/scripts/{bundle-541e1ff041.min.js.LICENSE.txt → bundle-0187039e1a.min.js.LICENSE.txt} +0 -0
@@ -1,2 +1,2 @@
1
1
  "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[8419],{32697:(e,t,n)=>{n.d(t,{ed:()=>r.e,cQ:()=>m.c,i:()=>f,RP:()=>v});var r=n(9826),a=n(32735);n(36848);var c=n(75896),l=n(70154),i=n(86764),s=n(81514),u=n(92875),o=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n};function d(e){var t=a.useContext(l.x),n=t.expandedSubject,r=t.selectedSubjects;return a.createElement(a.Fragment,null,e.subjects.map((function(t){var c=function(e,t){return!(!t||e.id===t.id||t.children.find((function(t){return t.id===e.id})))}(t,n),l=e.onSelect;return t.isExpandableOption&&(l=e.onExpand),c&&(l=e.onCollapse),e.hasSelectedBulk&&(l=function(){}),a.createElement(v,{key:t.id,subject:t,selected:!e.hasSelectedBulk&&r.includes(t.id),disabled:e.hasSelectedBulk||c,onClick:function(){return l(t)},hasSelectedBulk:e.hasSelectedBulk})})))}function f(e){var t=e.subjects,n=e.hasSelectedBulk,r=o(e,["subjects","hasSelectedBulk"]),m=a.useContext(l.x).expandedSubject,p=function(){switch((0,s.V)()){case i.r.LG:default:return 5;case i.r.MD:return 4;case i.r.SM:return 3;case i.r.XS:return 2}}(),b=t.reduce((function(e,t,n){return n%p==0?e.push([t]):c.m.last(e).push(t),e}),[]);return a.createElement("ul",{className:u.Z.grid},b.map((function(e,t){var c=m&&!!e.find((function(e){return m.id===e.id&&e.isExpandableOption}));return a.createElement(a.Fragment,{key:t},a.createElement(d,Object.assign({subjects:e,hasSelectedBulk:n},r)),c&&a.createElement("li",{className:"".concat(u.Z.subgrid," m-0")},a.createElement(f,Object.assign({subjects:m.children,hasSelectedBulk:n},r))))})))}var m=n(386),p=n(76177),b=n(54610),h=n(67453);function v(e){var t,n,r=a.useContext(l.x),c=e.subject.cover?h.j.createUrl(e.subject.cover.url,{size:b.h2.Small}):"",i=e.subject.isExpandableOption?e.subject.children.map((function(e){return e.id})):[],s=e.hasSelectedBulk?0:null===(t=null==r?void 0:r.selectedSubjects)||void 0===t?void 0:t.filter((function(e){return i.includes(e)})).length,u=a.createElement(m.c,{name:e.subject.name,imageUrl:c,onClick:e.onClick,isSelected:e.selected,isDisabled:e.disabled,isExpandable:e.subject.isExpandableOption,expand:(null===(n=null==r?void 0:r.expandedSubject)||void 0===n?void 0:n.id)===e.subject.id,selectedChildCount:s,extraClasses:e.extraClasses,hideStatus:e.hideStatus});return e.disabled?a.createElement("span",null,u):a.createElement(p.u,{title:e.subject.name},a.createElement("span",null,u))}},386:(e,t,n)=>{n.d(t,{c:()=>u});var r=n(32735),a=n(83914),c=n(35223);const l={preferenceItem:"PSWHa",expandCaret:"CCsqs",up:"w7N1R",down:"mO0Kn",disabled:"Oyw2x",selected:"Czk2N",noBorder:"_e7oe",textBox:"pfksF",itemStatus:"H4u81",unchecked:"iYkPv",green:"w5g0e"};var i=function(e){return e.selectedChildrenCount?r.createElement("div",{className:"".concat(l.itemStatus," ").concat(l.green)},e.selectedChildrenCount):r.createElement(r.Fragment,null)},s=function(e){var t;return t=e.selected?r.createElement(a.x,{svgName:c.vn.Check}):e.radioButton?r.createElement(r.Fragment,null," "):r.createElement(a.x,{svgName:c.vn.Plus}),r.createElement("div",{className:"".concat(l.itemStatus," ").concat(e.selected?l.green:l.unchecked)},t)};function u(e){var t,n="".concat(l.expandCaret," ").concat(e.expand?l.up:l.down);return r.createElement("li",{className:(t="rounded-3 ".concat(l.preferenceItem),e.extraClasses&&(t+=" "+e.extraClasses),e.isDisabled&&(t+=" "+l.disabled),e.isSelected&&!e.isExpandable&&(t+=" "+l.selected),e.hideStatus&&(t+=" "+l.noBorder),t),onClick:e.onClick,"aria-checked":e.isSelected,"aria-haspopup":e.isExpandable,role:e.isExpandable?"button":"checkbox",style:{backgroundImage:"url(".concat(e.imageUrl,")")},tabIndex:0,title:e.name},r.createElement("div",{className:"".concat(l.textBox," p-2")},r.createElement("p",{className:"text-truncate mb-0"},e.name,r.createElement("span",{className:e.isExpandable?n:""})),!e.hideStatus&&r.createElement(r.Fragment,null,e.isExpandable?r.createElement(i,{selectedChildrenCount:e.selectedChildCount}):r.createElement(s,{selected:e.isSelected,radioButton:e.radioButton}))))}},22129:(e,t,n)=>{n.d(t,{A:()=>l});var r=n(32735),a=n(92875);const c={partialSubject:"KQYyH",lg:"KiWap",partialSubjectList:"Ng80C"};function l(e){var t="grid"===e.style?a.Z.grid:c.partialSubjectList;return r.createElement("div",{className:"p-3"},r.createElement("ul",{className:"".concat(t," ").concat(e.center?"justify-content-center":"")},Array(e.count).fill(null).map((function(t,n){return r.createElement("li",{key:n,className:"".concat(c.partialSubject," partial-loading-background rounded-3 ").concat("lg"===e.size?c.lg:"")})}))))}l.defaultProps={size:"sm"}},70154:(e,t,n)=>{n.d(t,{x:()=>r});var r=(0,n(32735).createContext)(void 0)},60836:(e,t,n)=>{n.d(t,{j:()=>c});var r=n(32735);function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var c=function(e){var t,n,c=(t=r.useState(1),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,c,l,i=[],s=!0,u=!1;try{if(c=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=c.call(n)).done)&&(i.push(r.value),i.length!==t);s=!0);}catch(e){u=!0,a=e}finally{try{if(!s&&null!=n.return&&(l=n.return(),Object(l)!==l))return}finally{if(u)throw a}}return i}}(t,n)||function(e,t){if(e){if("string"==typeof e)return a(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?a(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),l=c[0],i=c[1];return r.useEffect((function(){l>0||e()}),[l]),[function(){i((function(e){return e-1}))},i]}},6972:(e,t,n)=>{n.r(t),n.d(t,{TopicPreferencesView:()=>F});var r=n(32735),a=n(70680),c=n(20354),l=n(65858),i=n(22129),s=n(23481),u=n(81886),o=n(75896),d=n(32697),f=n(70154),m=n(49602),p=n(36848),b=n(2102),h=n(83345),v=n(83523),g=n(69883),S=n(60836);function E(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,c,l,i=[],s=!0,u=!1;try{if(c=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=c.call(n)).done)&&(i.push(r.value),i.length!==t);s=!0);}catch(e){u=!0,a=e}finally{try{if(!s&&null!=n.return&&(l=n.return(),Object(l)!==l))return}finally{if(u)throw a}}return i}}(e,t)||x(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function y(e){return function(e){if(Array.isArray(e))return j(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||x(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function x(e,t){if(e){if("string"==typeof e)return j(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?j(e,t):void 0}}function j(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var k="subjects.topicPreferences";function C(e){var t,n=E(r.useState([]),2),a=n[0],c=n[1],l=E(r.useState(null),2),i=l[0],x=l[1],j=E(r.useState(e.bulkPreferencesState),2),C=j[0],O=j[1],B=E(r.useState(!1),2),P=B[0],w=B[1],N=(0,g.Z)(),A=m.b.hasBulkSelectedTopics(C);r.useEffect((function(){var t;(null===(t=e.preselections)||void 0===t?void 0:t.length)?c(o.m.uniq([].concat(y(a),y(e.preselections.map((function(e){return e.id})))))):c([])}),[null===(t=e.preselections)||void 0===t?void 0:t.length]);var I=E((0,S.j)((function(){w(!1),e.isOnboarding||N.success(s.T.getPhrase(k,"success")),e.nextAppLink&&u.Q.C$.trigger(e.nextAppLink)})),2),F=I[0],L=I[1];function T(t){return!!e.preselections&&e.preselections.map((function(e){return e.id})).sort().toString()!==t.sort().toString()}function Z(){return e.bulkPreferencesState!==C}function U(){if(!a.length&&!A)return!1;var t=Z()||T(a);return!(!e.isOnboarding&&!t)}function _(){var e=m.b.getNextBulkState(C,"topics");x(null),O(e)}var z=function(e){if(!(null==e?void 0:e.length))return[];var t=[];return e.forEach((function(e){e.children&&e.children.length?t.push(Object.assign(Object.assign({},e),{isExpandableOption:!0,children:[Object.assign({},e)].concat(y(e.children))})):t.push(Object.assign({},e))})),t}(e.options);return r.createElement(h.D.Provider,{value:k},r.createElement("form",{className:"p-3 pb-5"},r.createElement("div",{className:"position-relative"},r.createElement(f.x.Provider,{value:{selectedSubjects:a,expandedSubject:i}},r.createElement(d.i,{subjects:z,onSelect:function(e){var t=o.m.addOrRemoveImmutable(a,e.id);c(t)},onExpand:function(e){x(i&&i.id===e.id?null:e)},onCollapse:function(){x(null)},hasSelectedBulk:A}))),r.createElement(d.ed,null,r.createElement("div",null,!!e.backButtonAppLink&&r.createElement(p.F,{appLink:e.backButtonAppLink,className:"btn btn-outline-dark"},r.createElement(h.x,{phrase:"back"}))),r.createElement("div",{className:"d-flex align-items-center justify-content-end"},r.createElement("div",{className:"d-flex me-3"},r.createElement("p",{onClick:_,className:"me-2 mb-0 fw-bold"},r.createElement(h.x,{phrase:"allSubjects"})),r.createElement(v.Z,{onClick:_,on:A,hideOutline:!0})),r.createElement(b.m,{variant:"dark",disabled:!U(),onClick:function(){if(U())if(T(a)||Z()){w(!0);var t=a.filter((function(t){return!e.preselections.find((function(e){return e.id===t}))})),n=e.preselections.filter((function(e){return!a.includes(e.id)})),r=0;t.length&&r++,n.length&&r++,Z()&&r++,L(r),e.saveChanges(t,n,C,F,(function(){N.error(s.T.getPhrase(k,"error")),w(!1)}))}else e.nextAppLink&&u.Q.C$.trigger(e.nextAppLink)},showSpinner:P},r.createElement(h.x,{phrase:e.isOnboarding?"next":"save"}))))))}var O=n(61699),B=n(77963),P=n(65728),w=n(31949),N=n(37802),A=n(71164),I="settings.topicPreferences";function F(){var e,t,n=c.a.useBasicFetch(w.N.currentUser()),s=c.a.useBasicFetch(O.o.availablePresentations()),u=c.a.useBasicFetch(O.o.allLevelPreferences()),o=(e=function(e){return e?e.filter((function(e){return e.canBePreferred})):[]},t=c.a.useBasicFetch(O.o.mySubjectPreferences((function(e){}))),Object.assign(Object.assign({},t),{isFetching:t.isFetching,data:e(t.data)})),d=c.a.useBasicFetch(O.o.allSubjectPreferences()),f=(0,N.r)(l.LZ.PreferencesSettings),m=f.bulkOnboardingPreferencesState,p=f.isLoadingSettings,b=f.updateSetting,v=(0,a.I0)(),g=!!d.hasCompleted&&!!o.hasCompleted&&!p;return r.createElement(A.T,{availablePresentations:s.data,audiences:u.data},r.createElement("p",{className:"mt-3"},r.createElement(h.x,{namespace:I,phrase:"info"})),g?r.createElement(C,{options:d.data,preselections:o.data,bulkPreferencesState:m,saveChanges:function(e,t,r,a,l){if(r!==m){var i={name:P.E.BulkOnboardingPreferencesState,value:r,kind:B.g.Permanent};b(n.data.id,i,a,l)}(null==e?void 0:e.length)&&c.a.fetch(v,O.o.followSubjects(e,a,l)),(null==t?void 0:t.length)&&c.a.fetch(v,O.o.unfollowSubjects(t.map((function(e){return e.id})),a,l))}}):r.createElement(i.A,{count:7,style:"grid"}))}},92875:(e,t,n)=>{n.d(t,{Z:()=>r});const r={grid:"X9r1Y",subgrid:"TgYhp"}}}]);
2
- //# sourceMappingURL=8419-70c7a44baa-lite.chunk.js.map
2
+ //# sourceMappingURL=8419-510dc22a69-lite.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scripts/8419-70c7a44baa-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/subjects/components/preferences/topic-preferences/subject-preference-grid/SubjectPreferenceGrid.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/topic-preferences/subject-preference-item/SubjectPreferenceItem.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/preference-item/preference-item.scss","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/preference-item/PreferenceItemStatus.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/preference-item/PreferenceItem.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/topic-preferences/subject-preference-item/partial-loading/partial-topic-preferences.scss","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/topic-preferences/subject-preference-item/partial-loading/PartialTopicPreferences.tsx","file:///app/packages/libs/shared/src/apps/subjects/contexts/TopicPreferencesContext.ts","file:///app/packages/libs/shared/src/hooks/UseOnSaveAll.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/topic-preferences/TopicPreferences.tsx","file:///app/packages/projects/lite/src/apps/settings/views/preferences/topics/TopicPreferencesView.tsx","file:///app/packages/libs/shared/src/apps/subjects/hooks/useGetPreferredSubjects.ts","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/topic-preferences/subject-preference-grid/subject-preference-grid.scss"],"sourcesContent":["import * as React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { SubjectPreferenceItem } from 'libs/shared/apps/subjects/components/preferences';\nimport { TopicPreferencesContext } from 'libs/shared/apps/subjects/contexts/TopicPreferencesContext';\nimport { ClassificationPreference } from 'libs/shared/apps/subjects/interfaces/ClassificationPreference';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useGetMediaQueryString } from 'libs/shared/hooks/UseGetMediaQueryString';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport styles from './subject-preference-grid.scss';\n\nfunction useGetRowItemCapacity(): number {\n const viewportWidth = useGetMediaQueryString();\n\n switch (viewportWidth) {\n case MediaQueryStrings.LG:\n default:\n return 5;\n\n case MediaQueryStrings.MD:\n return 4;\n\n case MediaQueryStrings.SM:\n return 3;\n\n case MediaQueryStrings.XS:\n return 2;\n }\n}\n\nfunction isDisabled(subject: ClassificationPreference, expandedSubject: ClassificationPreference): boolean {\n if (!expandedSubject || subject.id === expandedSubject.id)\n return false;\n\n if (expandedSubject.children.find(child => child.id === subject.id))\n return false;\n\n return true;\n}\n\ninterface SubjectPreferenceGridRowProps extends SubjectPreferenceGridProps {}\n\nfunction SubjectPreferenceGridRow(props: SubjectPreferenceGridRowProps): JSX.Element {\n const { expandedSubject, selectedSubjects: selections } = React.useContext(TopicPreferencesContext);\n\n return (\n <>\n {props.subjects.map(subject => {\n const itemDisabled = isDisabled(subject, expandedSubject);\n\n let clickHandler = props.onSelect;\n\n if (subject.isExpandableOption)\n clickHandler = props.onExpand;\n\n if (itemDisabled)\n clickHandler = props.onCollapse;\n\n if (props.hasSelectedBulk)\n clickHandler = () => {};\n\n return (\n <SubjectPreferenceItem\n key={subject.id}\n subject={subject}\n selected={!props.hasSelectedBulk && selections.includes(subject.id)}\n disabled={props.hasSelectedBulk || itemDisabled}\n onClick={() => clickHandler(subject)}\n hasSelectedBulk={props.hasSelectedBulk}\n />\n );\n })}\n </>\n );\n}\n\ninterface SubjectPreferenceGridProps {\n subjects: ClassificationPreference[];\n onSelect: (subject: Classification) => void;\n onExpand: (subject: Classification) => void;\n onCollapse: (subject: Classification) => void;\n hasSelectedBulk?: boolean;\n}\n\nexport function SubjectPreferenceGrid(props: SubjectPreferenceGridProps): JSX.Element {\n const { subjects, hasSelectedBulk, ...eventHandlers } = props;\n const { expandedSubject } = React.useContext(TopicPreferencesContext);\n\n const itemsPerRow = useGetRowItemCapacity();\n\n /**\n * This is an array of arrays, where each sub-array is a row of classifications.\n * We do this to make sure any sub-grid's of child preference options get rendered in the row\n * directly beneath their parent's row.\n */\n const subjectRows = subjects.reduce((\n acc: ClassificationPreference[][],\n subject: ClassificationPreference,\n index: number\n ) => {\n index % itemsPerRow === 0\n ? acc.push([subject]) // Start a new row\n : ArrayHelper.last(acc).push(subject); // Fill up an existing row\n\n return acc;\n }, []);\n\n return (\n <ul className={styles.grid}>\n {subjectRows.map((row, i) => {\n const isExpanded = expandedSubject && !!row.find(subject => {\n return expandedSubject.id === subject.id && subject.isExpandableOption;\n });\n\n return (\n <React.Fragment key={i}>\n <SubjectPreferenceGridRow\n subjects={row}\n hasSelectedBulk={hasSelectedBulk}\n {...eventHandlers}\n />\n\n {isExpanded && (\n <li className={`${styles.subgrid} m-0`}>\n <SubjectPreferenceGrid\n subjects={expandedSubject.children as ClassificationPreference[]}\n hasSelectedBulk={hasSelectedBulk}\n {...eventHandlers}\n />\n </li>\n )}\n </React.Fragment>\n );\n })}\n </ul>\n );\n}","import * as React from 'react';\n\nimport { PreferenceItem } from 'libs/shared/apps/subjects/components/preferences/preference-item/PreferenceItem';\nimport { TopicPreferencesContext } from 'libs/shared/apps/subjects/contexts/TopicPreferencesContext';\nimport { ClassificationPreference } from 'libs/shared/apps/subjects/interfaces/ClassificationPreference';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\ninterface SubjectPreferenceItemProps {\n subject: ClassificationPreference;\n selected: boolean;\n disabled?: boolean;\n onClick?: (event: React.MouseEvent<HTMLLIElement, MouseEvent>) => void;\n extraClasses?: string;\n hideStatus?: boolean;\n hasSelectedBulk?: boolean;\n}\n\nexport function SubjectPreferenceItem(props: SubjectPreferenceItemProps): JSX.Element {\n const context = React.useContext(TopicPreferencesContext);\n\n const coverUrl = props.subject.cover ? ImageHelper.createUrl(props.subject.cover.url, { size: ImageSize.Small }) : '';\n\n const childIds = props.subject.isExpandableOption ? props.subject.children.map(child => child.id) : [];\n const selectedChildCount = !props.hasSelectedBulk\n ? context?.selectedSubjects?.filter(selection => childIds.includes(selection)).length\n : 0;\n\n const component = (\n <PreferenceItem\n name={props.subject.name}\n imageUrl={coverUrl}\n onClick={props.onClick}\n isSelected={props.selected}\n isDisabled={props.disabled}\n isExpandable={props.subject.isExpandableOption}\n expand={context?.expandedSubject?.id === props.subject.id}\n selectedChildCount={selectedChildCount}\n extraClasses={props.extraClasses}\n hideStatus={props.hideStatus}\n />\n );\n\n return props.disabled\n ? <span>{component}</span>\n : <Tooltip title={props.subject.name}><span>{component}</span></Tooltip>;\n}","// extracted by mini-css-extract-plugin\nexport default {\"preferenceItem\":\"PSWHa\",\"expandCaret\":\"CCsqs\",\"up\":\"w7N1R\",\"down\":\"mO0Kn\",\"disabled\":\"Oyw2x\",\"selected\":\"Czk2N\",\"noBorder\":\"_e7oe\",\"textBox\":\"pfksF\",\"itemStatus\":\"H4u81\",\"unchecked\":\"iYkPv\",\"green\":\"w5g0e\"};","import * as React from 'react';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './preference-item.scss';\n\ninterface ExpandableItemStatusProps {\n selectedChildrenCount: number;\n}\n\nexport const ExpandableItemStatus = (props: ExpandableItemStatusProps): JSX.Element => {\n if (!props.selectedChildrenCount)\n return <></>;\n\n return (\n <div className={`${styles.itemStatus} ${styles.green}`}>\n {props.selectedChildrenCount}\n </div>\n );\n};\n\ninterface SelectableItemStatusProps {\n selected: boolean;\n radioButton?: boolean;\n}\n\nexport const SelectableItemStatus = (props: SelectableItemStatusProps): JSX.Element => {\n let svg;\n\n if (props.selected)\n svg = <SvgContainer svgName={cvSvgLibrary.Check} />;\n else if (!props.radioButton)\n svg = <SvgContainer svgName={cvSvgLibrary.Plus} />;\n else\n svg = <>&nbsp;</>;\n\n return (\n <div className={`${styles.itemStatus} ${props.selected ? styles.green : styles.unchecked}`}>\n {svg}\n </div>\n );\n};\n","import React from 'react';\n\nimport { ExpandableItemStatus, SelectableItemStatus } from './PreferenceItemStatus';\n\nimport styles from './preference-item.scss';\n\ninterface PreferenceItemProps {\n name: string;\n imageUrl: string;\n\n onClick?: (event: React.MouseEvent<HTMLLIElement, MouseEvent>) => void;\n isDisabled?: boolean;\n isSelected: boolean;\n hideStatus?: boolean;\n radioButton?: boolean;\n\n isExpandable?: boolean;\n expand?: boolean;\n selectedChildCount?: number;\n\n extraClasses?: string;\n}\n\nexport function PreferenceItem(props: PreferenceItemProps): JSX.Element {\n function getContainerClass(): string {\n let baseClass = `rounded-3 ${styles.preferenceItem}`;\n\n if (props.extraClasses)\n baseClass += ' ' + props.extraClasses;\n\n if (props.isDisabled)\n baseClass += ' ' + styles.disabled;\n\n if (props.isSelected && !props.isExpandable)\n baseClass += ' ' + styles.selected;\n\n if (props.hideStatus)\n baseClass += ' ' + styles.noBorder;\n\n return baseClass;\n }\n\n const caretClass = `${styles.expandCaret} ${props.expand ? styles.up : styles.down}`;\n\n return (\n <li\n className={getContainerClass()}\n onClick={props.onClick}\n aria-checked={props.isSelected}\n aria-haspopup={props.isExpandable}\n role={props.isExpandable ? 'button' : 'checkbox'}\n style={{ backgroundImage: `url(${props.imageUrl})` }}\n tabIndex={0}\n title={props.name}\n >\n <div className={`${styles.textBox} p-2`}>\n <p className='text-truncate mb-0'>\n {props.name}\n <span className={props.isExpandable ? caretClass : ''} />\n </p>\n\n {!props.hideStatus && (\n <>{props.isExpandable\n ? <ExpandableItemStatus selectedChildrenCount={props.selectedChildCount} />\n : <SelectableItemStatus selected={props.isSelected} radioButton={props.radioButton} />\n }</>\n )}\n </div>\n </li>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialSubject\":\"KQYyH\",\"lg\":\"KiWap\",\"partialSubjectList\":\"Ng80C\"};","import * as React from 'react';\n\nimport gridStyles from '../../subject-preference-grid/subject-preference-grid.scss';\nimport styles from './partial-topic-preferences.scss';\n\ninterface PartialTopicPreferencesProps {\n count: number;\n style: 'grid' | 'list';\n size?: 'sm' | 'lg';\n center?: boolean;\n}\n\nPartialTopicPreferences.defaultProps = {\n size: 'sm'\n};\n\nexport function PartialTopicPreferences(props: PartialTopicPreferencesProps): JSX.Element {\n const className = props.style === 'grid' ? gridStyles.grid : styles.partialSubjectList;\n\n return (\n <div className='p-3'>\n <ul className={`${className} ${props.center ? 'justify-content-center' : ''}`}>\n {Array(props.count).fill(null).map((item, i) => (\n <li\n key={i}\n className={`${styles.partialSubject} partial-loading-background rounded-3 ${props.size === 'lg' ? styles.lg : ''}`}\n />\n ))}\n </ul>\n </div>\n );\n}","import { createContext } from 'react';\n\nimport { ClassificationPreference } from '../interfaces/ClassificationPreference';\n\ninterface TopicPreferencesContextFields {\n selectedSubjects: string[];\n expandedSubject: ClassificationPreference;\n}\n\nexport const TopicPreferencesContext = createContext<TopicPreferencesContextFields>(undefined);","import React from 'react';\n\ntype ReturnValue = [\n () => void,\n React.Dispatch<React.SetStateAction<number>>\n];\n\n/**\n * This hook solves a problem where you want to trigger an \"onSuccess\" callback function\n * only after the last of multiple API calls have completed.\n * \n * Example: the user clicks a \"Save\" button, which triggers 2 API calls. You have a callback function\n * that you want to run after both API calls have succeeded. This hook will help you do that of you pass it\n * the callback function and set the counter to 2.\n */\nexport const useOnSaveAll = (onDone: () => void): ReturnValue => {\n const [ counter, setCounter ] = React.useState(1);\n\n function onSave(): void {\n setCounter(val => val - 1);\n }\n\n React.useEffect(() => {\n if (counter > 0)\n return;\n \n onDone();\n }, [counter]);\n\n return [ onSave, setCounter ];\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { OnboardingFooter, SubjectPreferenceGrid } from 'libs/shared/apps/subjects/components/preferences';\nimport { TopicPreferencesContext } from 'libs/shared/apps/subjects/contexts/TopicPreferencesContext';\nimport { ClassificationPreference } from 'libs/shared/apps/subjects/interfaces/ClassificationPreference';\nimport { OnboardingHelper } from 'libs/shared/apps/subjects/utils/OnboardingHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { BulkOnboardingPreferencesState } from 'libs/shared/enums/BulkOnboardingPreferencesState';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useOnSaveAll } from 'libs/shared/hooks/UseOnSaveAll';\nimport { Classification } from 'libs/shared/interfaces';\n\nconst namespace = 'subjects.topicPreferences';\n\nfunction structurePreferencesGrid(rawPreferenceOptions: ClassificationPreference[]): ClassificationPreference[] {\n if (!rawPreferenceOptions?.length)\n return [];\n\n const preferenceOptions: ClassificationPreference[] = [];\n\n rawPreferenceOptions.forEach(option => {\n if (!option.children || !option.children.length) {\n preferenceOptions.push({ ...option });\n return;\n }\n\n preferenceOptions.push({\n ...option,\n isExpandableOption: true,\n children: [{ ...option }, ...option.children ]\n });\n });\n\n return preferenceOptions;\n}\n\ninterface TopicPreferencesProps {\n options: ClassificationPreference[];\n preselections: Classification[];\n bulkPreferencesState: BulkOnboardingPreferencesState;\n saveChanges: (\n addedSubjects: string[],\n removedSubjects: Classification[],\n bulkState: BulkOnboardingPreferencesState,\n onSuccess: () => void,\n onError: () => void\n ) => void;\n\n isOnboarding?: boolean;\n backButtonAppLink?: Core.AppLink;\n nextAppLink?: Core.AppLink;\n}\n\nexport function TopicPreferences(props: TopicPreferencesProps): JSX.Element {\n const [ selectedTopics, setSelectedTopics ] = React.useState<string[]>([]);\n const [ expandedSubject, setExpandedSubject ] = React.useState<ClassificationPreference>(null);\n\n const [ bulkPreferencesState, setBulkPreferencesState ] = React.useState<BulkOnboardingPreferencesState>(\n props.bulkPreferencesState\n );\n\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n\n const alerts = useAlerts();\n\n const hasBulkSelectedTopics = OnboardingHelper.hasBulkSelectedTopics(bulkPreferencesState);\n\n /**\n * Set initial selections\n */\n React.useEffect(() => {\n if (!props.preselections?.length) {\n setSelectedTopics([]);\n return;\n }\n\n setSelectedTopics(ArrayHelper.uniq([ ...selectedTopics, ...props.preselections.map(p => p.id) ]));\n }, [props.preselections?.length]);\n\n const [ onSuccess, setCounter ] = useOnSaveAll(() => {\n setShowSpinner(false);\n\n if (!props.isOnboarding)\n alerts.success(LanguageService.getPhrase(namespace, 'success'));\n\n if (props.nextAppLink)\n Core.AppLinkHelper.trigger(props.nextAppLink);\n });\n\n /**\n * Event handlers\n */\n function onSelect(subject: ClassificationPreference): void {\n const newSelections = ArrayHelper.addOrRemoveImmutable(selectedTopics, subject.id);\n setSelectedTopics(newSelections);\n }\n\n function onExpand(subject: ClassificationPreference): void {\n setExpandedSubject(expandedSubject && expandedSubject.id === subject.id ? null : subject);\n }\n\n function onCollapse(): void {\n setExpandedSubject(null);\n }\n\n function hasChangedTopics(selectedTopics: string[]): boolean {\n if (!props.preselections)\n return false;\n\n const preselectedIds = props.preselections.map(p => p.id);\n return preselectedIds.sort().toString() !== selectedTopics.sort().toString();\n }\n\n function hasChangedBulkState(): boolean {\n return props.bulkPreferencesState !== bulkPreferencesState;\n }\n\n function isValid(): boolean {\n if (!selectedTopics.length && !hasBulkSelectedTopics)\n return false;\n\n const hasChanged = hasChangedBulkState() || hasChangedTopics(selectedTopics);\n\n if (!props.isOnboarding && !hasChanged)\n return false;\n\n return true;\n }\n\n function onSave(): void {\n if (!isValid())\n return;\n\n // If they have selected the bulk option, we do not want to clear their preferences or save any changes.\n if ((!hasChangedTopics(selectedTopics) && !hasChangedBulkState())) {\n if (props.nextAppLink)\n Core.AppLinkHelper.trigger(props.nextAppLink);\n\n return;\n }\n\n setShowSpinner(true);\n\n const addedSubjects = selectedTopics.filter(id => !props.preselections.find(p => p.id === id));\n const removedSubjects = props.preselections.filter(p => !selectedTopics.includes(p.id));\n\n let onSaveCounter = 0;\n\n if (addedSubjects.length)\n onSaveCounter++;\n\n if (removedSubjects.length)\n onSaveCounter++;\n\n if (hasChangedBulkState())\n onSaveCounter++;\n\n setCounter(onSaveCounter);\n\n props.saveChanges(\n addedSubjects,\n removedSubjects,\n bulkPreferencesState,\n onSuccess,\n () => {\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n setShowSpinner(false);\n }\n );\n }\n\n function onToggleSelectAll(): void {\n const newBulkState = OnboardingHelper.getNextBulkState(bulkPreferencesState, 'topics');\n\n setExpandedSubject(null);\n setBulkPreferencesState(newBulkState);\n }\n\n const optionsGrid = structurePreferencesGrid(props.options);\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <form className='p-3 pb-5'>\n <div className='position-relative'>\n <TopicPreferencesContext.Provider value={{ selectedSubjects: selectedTopics, expandedSubject }}>\n <SubjectPreferenceGrid\n subjects={optionsGrid}\n onSelect={onSelect}\n onExpand={onExpand}\n onCollapse={onCollapse}\n hasSelectedBulk={hasBulkSelectedTopics}\n />\n </TopicPreferencesContext.Provider>\n </div>\n\n <OnboardingFooter>\n <div>\n {!!props.backButtonAppLink && (\n <AppLink appLink={props.backButtonAppLink} className='btn btn-outline-dark'>\n <Text phrase='back' />\n </AppLink>\n )}\n </div>\n\n <div className='d-flex align-items-center justify-content-end'>\n <div className='d-flex me-3'>\n <p onClick={onToggleSelectAll} className='me-2 mb-0 fw-bold'>\n <Text phrase='allSubjects' />\n </p>\n <ToggleSwitch\n onClick={onToggleSelectAll}\n on={hasBulkSelectedTopics}\n hideOutline\n />\n </div>\n <SpinnerButton\n variant='dark'\n disabled={!isValid()}\n onClick={onSave}\n showSpinner={showSpinner}\n >\n <Text phrase={props.isOnboarding ? 'next' : 'save'} />\n </SpinnerButton>\n </div>\n </OnboardingFooter>\n </form>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PartialTopicPreferences } from 'libs/shared/apps/subjects/components/preferences/topic-preferences/subject-preference-item/partial-loading/PartialTopicPreferences';\nimport { TopicPreferences } from 'libs/shared/apps/subjects/components/preferences/topic-preferences/TopicPreferences';\nimport { useGetPreferredSubjects } from 'libs/shared/apps/subjects/hooks/useGetPreferredSubjects';\nimport { ClassificationPreference } from 'libs/shared/apps/subjects/interfaces/ClassificationPreference';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BulkOnboardingPreferencesState } from 'libs/shared/enums/BulkOnboardingPreferencesState';\nimport { SettingKind } from 'libs/shared/enums/SettingKind';\nimport { SettingName } from 'libs/shared/enums/SettingName';\nimport { PreferenceRequests } from 'libs/shared/flight-requests/PreferenceRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Classification, CurrentUser, Presentation, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { PreferencesLayout } from 'apps/settings/components/preferences/PreferencesLayout';\n\nconst namespace = 'settings.topicPreferences';\n\nexport function TopicPreferencesView(): JSX.Element {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const availablePresentations = Flight.useBasicFetch<Presentation[]>(PreferenceRequests.availablePresentations());\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(PreferenceRequests.allLevelPreferences());\n\n const preselections = useGetPreferredSubjects();\n const topics = Flight.useBasicFetch<ClassificationPreference[]>(PreferenceRequests.allSubjectPreferences());\n\n const {\n bulkOnboardingPreferencesState, isLoadingSettings, updateSetting\n } = useSettings(LocationContext.PreferencesSettings);\n\n const dispatch = useDispatch();\n\n function onSave(\n addedSubjects: string[],\n removedSubjects: Classification[],\n bulkState: BulkOnboardingPreferencesState,\n onSuccess: () => void,\n onError: () => void\n ): void {\n if (bulkState !== bulkOnboardingPreferencesState) {\n const newSetting = {\n name: SettingName.BulkOnboardingPreferencesState,\n value: bulkState,\n kind: SettingKind.Permanent\n };\n\n updateSetting(\n currentUser.data.id,\n newSetting,\n onSuccess,\n onError\n );\n }\n\n if (addedSubjects?.length)\n Flight.fetch(dispatch, PreferenceRequests.followSubjects(addedSubjects, onSuccess, onError));\n\n if (removedSubjects?.length)\n Flight.fetch(dispatch, PreferenceRequests.unfollowSubjects(removedSubjects.map(s => s.id), onSuccess, onError));\n }\n\n const dataLoaded = (\n !!topics.hasCompleted &&\n !!preselections.hasCompleted &&\n !isLoadingSettings\n );\n\n return (\n <PreferencesLayout\n availablePresentations={availablePresentations.data}\n audiences={audiences.data}\n >\n <p className='mt-3'><Text namespace={namespace} phrase='info' /></p>\n\n {dataLoaded ? (\n <TopicPreferences\n options={topics.data}\n preselections={preselections.data}\n bulkPreferencesState={bulkOnboardingPreferencesState}\n saveChanges={onSave}\n />\n ) : <PartialTopicPreferences count={7} style='grid' />}\n </PreferencesLayout>\n );\n}","import { Flight } from 'libs/common/flight';\n\nimport { PreferenceRequests } from 'libs/shared/flight-requests/PreferenceRequests';\nimport { Classification } from 'libs/shared/interfaces';\n\n/**\n * Fetches all followed subjects, then returns\n * the flight response object with only the subjects\n * that are marked as `canBePreferred`.\n * \n * We do this instead of using `formatData` on the request,\n * as some areas of the product that make this request\n * do not need to be filtered.\n * \n * This is intended to be used for onboarding / preference\n * selections only.\n */\nexport function useGetPreferredSubjects(\n onSuccess?: (classifications: Classification[]) => void\n): Flight.Response<Classification[]> {\n const filterSubjects = (subjects: Classification[]) => {\n if (!subjects)\n return [];\n\n return subjects.filter(s => s.canBePreferred);\n };\n\n const followedSubjects = Flight.useBasicFetch<Classification[]>(\n PreferenceRequests.mySubjectPreferences(followedSubjects => {\n onSuccess && onSuccess(filterSubjects(followedSubjects));\n })\n );\n\n return {\n ...followedSubjects,\n isFetching: followedSubjects.isFetching,\n data: filterSubjects(followedSubjects.data)\n };\n}","// extracted by mini-css-extract-plugin\nexport default {\"grid\":\"X9r1Y\",\"subgrid\":\"TgYhp\"};"],"names":["SubjectPreferenceGridRow","props","TopicPreferencesContext","expandedSubject","selections","selectedSubjects","subjects","map","subject","itemDisabled","id","children","find","child","isDisabled","clickHandler","onSelect","isExpandableOption","onExpand","onCollapse","hasSelectedBulk","SubjectPreferenceItem","key","selected","includes","disabled","onClick","SubjectPreferenceGrid","eventHandlers","itemsPerRow","useGetRowItemCapacity","subjectRows","reduce","acc","index","push","ArrayHelper","className","row","i","isExpanded","context","coverUrl","cover","ImageHelper","url","size","childIds","selectedChildCount","filter","selection","length","component","PreferenceItem","name","imageUrl","isSelected","isExpandable","expand","extraClasses","hideStatus","Tooltip","title","ExpandableItemStatus","selectedChildrenCount","SelectableItemStatus","svg","SvgContainer","svgName","radioButton","baseClass","caretClass","role","style","backgroundImage","tabIndex","PartialTopicPreferences","grid","center","Array","count","fill","item","defaultProps","createContext","undefined","useOnSaveAll","onDone","counter","setCounter","val","namespace","TopicPreferences","selectedTopics","setSelectedTopics","setExpandedSubject","bulkPreferencesState","setBulkPreferencesState","showSpinner","setShowSpinner","alerts","hasBulkSelectedTopics","OnboardingHelper","preselections","p","isOnboarding","success","LanguageService","nextAppLink","onSuccess","hasChangedTopics","sort","toString","hasChangedBulkState","isValid","hasChanged","onToggleSelectAll","newBulkState","optionsGrid","rawPreferenceOptions","preferenceOptions","forEach","option","structurePreferencesGrid","options","value","newSelections","backButtonAppLink","AppLink","appLink","Text","phrase","ToggleSwitch","on","hideOutline","SpinnerButton","variant","addedSubjects","removedSubjects","onSaveCounter","saveChanges","error","TopicPreferencesView","filterSubjects","followedSubjects","currentUser","UserRequests","availablePresentations","PreferenceRequests","audiences","s","canBePreferred","isFetching","data","topics","useSettings","bulkOnboardingPreferencesState","isLoadingSettings","updateSetting","dispatch","dataLoaded","hasCompleted","PreferencesLayout","bulkState","onError","newSetting","SettingName","kind","SettingKind"],"sourceRoot":""}
1
+ {"version":3,"file":"scripts/8419-510dc22a69-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/subjects/components/preferences/topic-preferences/subject-preference-grid/SubjectPreferenceGrid.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/topic-preferences/subject-preference-item/SubjectPreferenceItem.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/preference-item/preference-item.scss","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/preference-item/PreferenceItemStatus.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/preference-item/PreferenceItem.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/topic-preferences/subject-preference-item/partial-loading/partial-topic-preferences.scss","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/topic-preferences/subject-preference-item/partial-loading/PartialTopicPreferences.tsx","file:///app/packages/libs/shared/src/apps/subjects/contexts/TopicPreferencesContext.ts","file:///app/packages/libs/shared/src/hooks/UseOnSaveAll.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/topic-preferences/TopicPreferences.tsx","file:///app/packages/projects/lite/src/apps/settings/views/preferences/topics/TopicPreferencesView.tsx","file:///app/packages/libs/shared/src/apps/subjects/hooks/useGetPreferredSubjects.ts","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/topic-preferences/subject-preference-grid/subject-preference-grid.scss"],"sourcesContent":["import * as React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { SubjectPreferenceItem } from 'libs/shared/apps/subjects/components/preferences';\nimport { TopicPreferencesContext } from 'libs/shared/apps/subjects/contexts/TopicPreferencesContext';\nimport { ClassificationPreference } from 'libs/shared/apps/subjects/interfaces/ClassificationPreference';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useGetMediaQueryString } from 'libs/shared/hooks/UseGetMediaQueryString';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport styles from './subject-preference-grid.scss';\n\nfunction useGetRowItemCapacity(): number {\n const viewportWidth = useGetMediaQueryString();\n\n switch (viewportWidth) {\n case MediaQueryStrings.LG:\n default:\n return 5;\n\n case MediaQueryStrings.MD:\n return 4;\n\n case MediaQueryStrings.SM:\n return 3;\n\n case MediaQueryStrings.XS:\n return 2;\n }\n}\n\nfunction isDisabled(subject: ClassificationPreference, expandedSubject: ClassificationPreference): boolean {\n if (!expandedSubject || subject.id === expandedSubject.id)\n return false;\n\n if (expandedSubject.children.find(child => child.id === subject.id))\n return false;\n\n return true;\n}\n\ninterface SubjectPreferenceGridRowProps extends SubjectPreferenceGridProps {}\n\nfunction SubjectPreferenceGridRow(props: SubjectPreferenceGridRowProps): JSX.Element {\n const { expandedSubject, selectedSubjects: selections } = React.useContext(TopicPreferencesContext);\n\n return (\n <>\n {props.subjects.map(subject => {\n const itemDisabled = isDisabled(subject, expandedSubject);\n\n let clickHandler = props.onSelect;\n\n if (subject.isExpandableOption)\n clickHandler = props.onExpand;\n\n if (itemDisabled)\n clickHandler = props.onCollapse;\n\n if (props.hasSelectedBulk)\n clickHandler = () => {};\n\n return (\n <SubjectPreferenceItem\n key={subject.id}\n subject={subject}\n selected={!props.hasSelectedBulk && selections.includes(subject.id)}\n disabled={props.hasSelectedBulk || itemDisabled}\n onClick={() => clickHandler(subject)}\n hasSelectedBulk={props.hasSelectedBulk}\n />\n );\n })}\n </>\n );\n}\n\ninterface SubjectPreferenceGridProps {\n subjects: ClassificationPreference[];\n onSelect: (subject: Classification) => void;\n onExpand: (subject: Classification) => void;\n onCollapse: (subject: Classification) => void;\n hasSelectedBulk?: boolean;\n}\n\nexport function SubjectPreferenceGrid(props: SubjectPreferenceGridProps): JSX.Element {\n const { subjects, hasSelectedBulk, ...eventHandlers } = props;\n const { expandedSubject } = React.useContext(TopicPreferencesContext);\n\n const itemsPerRow = useGetRowItemCapacity();\n\n /**\n * This is an array of arrays, where each sub-array is a row of classifications.\n * We do this to make sure any sub-grid's of child preference options get rendered in the row\n * directly beneath their parent's row.\n */\n const subjectRows = subjects.reduce((\n acc: ClassificationPreference[][],\n subject: ClassificationPreference,\n index: number\n ) => {\n index % itemsPerRow === 0\n ? acc.push([subject]) // Start a new row\n : ArrayHelper.last(acc).push(subject); // Fill up an existing row\n\n return acc;\n }, []);\n\n return (\n <ul className={styles.grid}>\n {subjectRows.map((row, i) => {\n const isExpanded = expandedSubject && !!row.find(subject => {\n return expandedSubject.id === subject.id && subject.isExpandableOption;\n });\n\n return (\n <React.Fragment key={i}>\n <SubjectPreferenceGridRow\n subjects={row}\n hasSelectedBulk={hasSelectedBulk}\n {...eventHandlers}\n />\n\n {isExpanded && (\n <li className={`${styles.subgrid} m-0`}>\n <SubjectPreferenceGrid\n subjects={expandedSubject.children as ClassificationPreference[]}\n hasSelectedBulk={hasSelectedBulk}\n {...eventHandlers}\n />\n </li>\n )}\n </React.Fragment>\n );\n })}\n </ul>\n );\n}","import * as React from 'react';\n\nimport { PreferenceItem } from 'libs/shared/apps/subjects/components/preferences/preference-item/PreferenceItem';\nimport { TopicPreferencesContext } from 'libs/shared/apps/subjects/contexts/TopicPreferencesContext';\nimport { ClassificationPreference } from 'libs/shared/apps/subjects/interfaces/ClassificationPreference';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\ninterface SubjectPreferenceItemProps {\n subject: ClassificationPreference;\n selected: boolean;\n disabled?: boolean;\n onClick?: (event: React.MouseEvent<HTMLLIElement, MouseEvent>) => void;\n extraClasses?: string;\n hideStatus?: boolean;\n hasSelectedBulk?: boolean;\n}\n\nexport function SubjectPreferenceItem(props: SubjectPreferenceItemProps): JSX.Element {\n const context = React.useContext(TopicPreferencesContext);\n\n const coverUrl = props.subject.cover ? ImageHelper.createUrl(props.subject.cover.url, { size: ImageSize.Small }) : '';\n\n const childIds = props.subject.isExpandableOption ? props.subject.children.map(child => child.id) : [];\n const selectedChildCount = !props.hasSelectedBulk\n ? context?.selectedSubjects?.filter(selection => childIds.includes(selection)).length\n : 0;\n\n const component = (\n <PreferenceItem\n name={props.subject.name}\n imageUrl={coverUrl}\n onClick={props.onClick}\n isSelected={props.selected}\n isDisabled={props.disabled}\n isExpandable={props.subject.isExpandableOption}\n expand={context?.expandedSubject?.id === props.subject.id}\n selectedChildCount={selectedChildCount}\n extraClasses={props.extraClasses}\n hideStatus={props.hideStatus}\n />\n );\n\n return props.disabled\n ? <span>{component}</span>\n : <Tooltip title={props.subject.name}><span>{component}</span></Tooltip>;\n}","// extracted by mini-css-extract-plugin\nexport default {\"preferenceItem\":\"PSWHa\",\"expandCaret\":\"CCsqs\",\"up\":\"w7N1R\",\"down\":\"mO0Kn\",\"disabled\":\"Oyw2x\",\"selected\":\"Czk2N\",\"noBorder\":\"_e7oe\",\"textBox\":\"pfksF\",\"itemStatus\":\"H4u81\",\"unchecked\":\"iYkPv\",\"green\":\"w5g0e\"};","import * as React from 'react';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './preference-item.scss';\n\ninterface ExpandableItemStatusProps {\n selectedChildrenCount: number;\n}\n\nexport const ExpandableItemStatus = (props: ExpandableItemStatusProps): JSX.Element => {\n if (!props.selectedChildrenCount)\n return <></>;\n\n return (\n <div className={`${styles.itemStatus} ${styles.green}`}>\n {props.selectedChildrenCount}\n </div>\n );\n};\n\ninterface SelectableItemStatusProps {\n selected: boolean;\n radioButton?: boolean;\n}\n\nexport const SelectableItemStatus = (props: SelectableItemStatusProps): JSX.Element => {\n let svg;\n\n if (props.selected)\n svg = <SvgContainer svgName={cvSvgLibrary.Check} />;\n else if (!props.radioButton)\n svg = <SvgContainer svgName={cvSvgLibrary.Plus} />;\n else\n svg = <>&nbsp;</>;\n\n return (\n <div className={`${styles.itemStatus} ${props.selected ? styles.green : styles.unchecked}`}>\n {svg}\n </div>\n );\n};\n","import React from 'react';\n\nimport { ExpandableItemStatus, SelectableItemStatus } from './PreferenceItemStatus';\n\nimport styles from './preference-item.scss';\n\ninterface PreferenceItemProps {\n name: string;\n imageUrl: string;\n\n onClick?: (event: React.MouseEvent<HTMLLIElement, MouseEvent>) => void;\n isDisabled?: boolean;\n isSelected: boolean;\n hideStatus?: boolean;\n radioButton?: boolean;\n\n isExpandable?: boolean;\n expand?: boolean;\n selectedChildCount?: number;\n\n extraClasses?: string;\n}\n\nexport function PreferenceItem(props: PreferenceItemProps): JSX.Element {\n function getContainerClass(): string {\n let baseClass = `rounded-3 ${styles.preferenceItem}`;\n\n if (props.extraClasses)\n baseClass += ' ' + props.extraClasses;\n\n if (props.isDisabled)\n baseClass += ' ' + styles.disabled;\n\n if (props.isSelected && !props.isExpandable)\n baseClass += ' ' + styles.selected;\n\n if (props.hideStatus)\n baseClass += ' ' + styles.noBorder;\n\n return baseClass;\n }\n\n const caretClass = `${styles.expandCaret} ${props.expand ? styles.up : styles.down}`;\n\n return (\n <li\n className={getContainerClass()}\n onClick={props.onClick}\n aria-checked={props.isSelected}\n aria-haspopup={props.isExpandable}\n role={props.isExpandable ? 'button' : 'checkbox'}\n style={{ backgroundImage: `url(${props.imageUrl})` }}\n tabIndex={0}\n title={props.name}\n >\n <div className={`${styles.textBox} p-2`}>\n <p className='text-truncate mb-0'>\n {props.name}\n <span className={props.isExpandable ? caretClass : ''} />\n </p>\n\n {!props.hideStatus && (\n <>{props.isExpandable\n ? <ExpandableItemStatus selectedChildrenCount={props.selectedChildCount} />\n : <SelectableItemStatus selected={props.isSelected} radioButton={props.radioButton} />\n }</>\n )}\n </div>\n </li>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialSubject\":\"KQYyH\",\"lg\":\"KiWap\",\"partialSubjectList\":\"Ng80C\"};","import * as React from 'react';\n\nimport gridStyles from '../../subject-preference-grid/subject-preference-grid.scss';\nimport styles from './partial-topic-preferences.scss';\n\ninterface PartialTopicPreferencesProps {\n count: number;\n style: 'grid' | 'list';\n size?: 'sm' | 'lg';\n center?: boolean;\n}\n\nPartialTopicPreferences.defaultProps = {\n size: 'sm'\n};\n\nexport function PartialTopicPreferences(props: PartialTopicPreferencesProps): JSX.Element {\n const className = props.style === 'grid' ? gridStyles.grid : styles.partialSubjectList;\n\n return (\n <div className='p-3'>\n <ul className={`${className} ${props.center ? 'justify-content-center' : ''}`}>\n {Array(props.count).fill(null).map((item, i) => (\n <li\n key={i}\n className={`${styles.partialSubject} partial-loading-background rounded-3 ${props.size === 'lg' ? styles.lg : ''}`}\n />\n ))}\n </ul>\n </div>\n );\n}","import { createContext } from 'react';\n\nimport { ClassificationPreference } from '../interfaces/ClassificationPreference';\n\ninterface TopicPreferencesContextFields {\n selectedSubjects: string[];\n expandedSubject: ClassificationPreference;\n}\n\nexport const TopicPreferencesContext = createContext<TopicPreferencesContextFields>(undefined);","import React from 'react';\n\ntype ReturnValue = [\n () => void,\n React.Dispatch<React.SetStateAction<number>>\n];\n\n/**\n * This hook solves a problem where you want to trigger an \"onSuccess\" callback function\n * only after the last of multiple API calls have completed.\n * \n * Example: the user clicks a \"Save\" button, which triggers 2 API calls. You have a callback function\n * that you want to run after both API calls have succeeded. This hook will help you do that of you pass it\n * the callback function and set the counter to 2.\n */\nexport const useOnSaveAll = (onDone: () => void): ReturnValue => {\n const [ counter, setCounter ] = React.useState(1);\n\n function onSave(): void {\n setCounter(val => val - 1);\n }\n\n React.useEffect(() => {\n if (counter > 0)\n return;\n \n onDone();\n }, [counter]);\n\n return [ onSave, setCounter ];\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { OnboardingFooter, SubjectPreferenceGrid } from 'libs/shared/apps/subjects/components/preferences';\nimport { TopicPreferencesContext } from 'libs/shared/apps/subjects/contexts/TopicPreferencesContext';\nimport { ClassificationPreference } from 'libs/shared/apps/subjects/interfaces/ClassificationPreference';\nimport { OnboardingHelper } from 'libs/shared/apps/subjects/utils/OnboardingHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { BulkOnboardingPreferencesState } from 'libs/shared/enums/BulkOnboardingPreferencesState';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useOnSaveAll } from 'libs/shared/hooks/UseOnSaveAll';\nimport { Classification } from 'libs/shared/interfaces';\n\nconst namespace = 'subjects.topicPreferences';\n\nfunction structurePreferencesGrid(rawPreferenceOptions: ClassificationPreference[]): ClassificationPreference[] {\n if (!rawPreferenceOptions?.length)\n return [];\n\n const preferenceOptions: ClassificationPreference[] = [];\n\n rawPreferenceOptions.forEach(option => {\n if (!option.children || !option.children.length) {\n preferenceOptions.push({ ...option });\n return;\n }\n\n preferenceOptions.push({\n ...option,\n isExpandableOption: true,\n children: [{ ...option }, ...option.children ]\n });\n });\n\n return preferenceOptions;\n}\n\ninterface TopicPreferencesProps {\n options: ClassificationPreference[];\n preselections: Classification[];\n bulkPreferencesState: BulkOnboardingPreferencesState;\n saveChanges: (\n addedSubjects: string[],\n removedSubjects: Classification[],\n bulkState: BulkOnboardingPreferencesState,\n onSuccess: () => void,\n onError: () => void\n ) => void;\n\n isOnboarding?: boolean;\n backButtonAppLink?: Core.AppLink;\n nextAppLink?: Core.AppLink;\n}\n\nexport function TopicPreferences(props: TopicPreferencesProps): JSX.Element {\n const [ selectedTopics, setSelectedTopics ] = React.useState<string[]>([]);\n const [ expandedSubject, setExpandedSubject ] = React.useState<ClassificationPreference>(null);\n\n const [ bulkPreferencesState, setBulkPreferencesState ] = React.useState<BulkOnboardingPreferencesState>(\n props.bulkPreferencesState\n );\n\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n\n const alerts = useAlerts();\n\n const hasBulkSelectedTopics = OnboardingHelper.hasBulkSelectedTopics(bulkPreferencesState);\n\n /**\n * Set initial selections\n */\n React.useEffect(() => {\n if (!props.preselections?.length) {\n setSelectedTopics([]);\n return;\n }\n\n setSelectedTopics(ArrayHelper.uniq([ ...selectedTopics, ...props.preselections.map(p => p.id) ]));\n }, [props.preselections?.length]);\n\n const [ onSuccess, setCounter ] = useOnSaveAll(() => {\n setShowSpinner(false);\n\n if (!props.isOnboarding)\n alerts.success(LanguageService.getPhrase(namespace, 'success'));\n\n if (props.nextAppLink)\n Core.AppLinkHelper.trigger(props.nextAppLink);\n });\n\n /**\n * Event handlers\n */\n function onSelect(subject: ClassificationPreference): void {\n const newSelections = ArrayHelper.addOrRemoveImmutable(selectedTopics, subject.id);\n setSelectedTopics(newSelections);\n }\n\n function onExpand(subject: ClassificationPreference): void {\n setExpandedSubject(expandedSubject && expandedSubject.id === subject.id ? null : subject);\n }\n\n function onCollapse(): void {\n setExpandedSubject(null);\n }\n\n function hasChangedTopics(selectedTopics: string[]): boolean {\n if (!props.preselections)\n return false;\n\n const preselectedIds = props.preselections.map(p => p.id);\n return preselectedIds.sort().toString() !== selectedTopics.sort().toString();\n }\n\n function hasChangedBulkState(): boolean {\n return props.bulkPreferencesState !== bulkPreferencesState;\n }\n\n function isValid(): boolean {\n if (!selectedTopics.length && !hasBulkSelectedTopics)\n return false;\n\n const hasChanged = hasChangedBulkState() || hasChangedTopics(selectedTopics);\n\n if (!props.isOnboarding && !hasChanged)\n return false;\n\n return true;\n }\n\n function onSave(): void {\n if (!isValid())\n return;\n\n // If they have selected the bulk option, we do not want to clear their preferences or save any changes.\n if ((!hasChangedTopics(selectedTopics) && !hasChangedBulkState())) {\n if (props.nextAppLink)\n Core.AppLinkHelper.trigger(props.nextAppLink);\n\n return;\n }\n\n setShowSpinner(true);\n\n const addedSubjects = selectedTopics.filter(id => !props.preselections.find(p => p.id === id));\n const removedSubjects = props.preselections.filter(p => !selectedTopics.includes(p.id));\n\n let onSaveCounter = 0;\n\n if (addedSubjects.length)\n onSaveCounter++;\n\n if (removedSubjects.length)\n onSaveCounter++;\n\n if (hasChangedBulkState())\n onSaveCounter++;\n\n setCounter(onSaveCounter);\n\n props.saveChanges(\n addedSubjects,\n removedSubjects,\n bulkPreferencesState,\n onSuccess,\n () => {\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n setShowSpinner(false);\n }\n );\n }\n\n function onToggleSelectAll(): void {\n const newBulkState = OnboardingHelper.getNextBulkState(bulkPreferencesState, 'topics');\n\n setExpandedSubject(null);\n setBulkPreferencesState(newBulkState);\n }\n\n const optionsGrid = structurePreferencesGrid(props.options);\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <form className='p-3 pb-5'>\n <div className='position-relative'>\n <TopicPreferencesContext.Provider value={{ selectedSubjects: selectedTopics, expandedSubject }}>\n <SubjectPreferenceGrid\n subjects={optionsGrid}\n onSelect={onSelect}\n onExpand={onExpand}\n onCollapse={onCollapse}\n hasSelectedBulk={hasBulkSelectedTopics}\n />\n </TopicPreferencesContext.Provider>\n </div>\n\n <OnboardingFooter>\n <div>\n {!!props.backButtonAppLink && (\n <AppLink appLink={props.backButtonAppLink} className='btn btn-outline-dark'>\n <Text phrase='back' />\n </AppLink>\n )}\n </div>\n\n <div className='d-flex align-items-center justify-content-end'>\n <div className='d-flex me-3'>\n <p onClick={onToggleSelectAll} className='me-2 mb-0 fw-bold'>\n <Text phrase='allSubjects' />\n </p>\n <ToggleSwitch\n onClick={onToggleSelectAll}\n on={hasBulkSelectedTopics}\n hideOutline\n />\n </div>\n <SpinnerButton\n variant='dark'\n disabled={!isValid()}\n onClick={onSave}\n showSpinner={showSpinner}\n >\n <Text phrase={props.isOnboarding ? 'next' : 'save'} />\n </SpinnerButton>\n </div>\n </OnboardingFooter>\n </form>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PartialTopicPreferences } from 'libs/shared/apps/subjects/components/preferences/topic-preferences/subject-preference-item/partial-loading/PartialTopicPreferences';\nimport { TopicPreferences } from 'libs/shared/apps/subjects/components/preferences/topic-preferences/TopicPreferences';\nimport { useGetPreferredSubjects } from 'libs/shared/apps/subjects/hooks/useGetPreferredSubjects';\nimport { ClassificationPreference } from 'libs/shared/apps/subjects/interfaces/ClassificationPreference';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BulkOnboardingPreferencesState } from 'libs/shared/enums/BulkOnboardingPreferencesState';\nimport { SettingKind } from 'libs/shared/enums/SettingKind';\nimport { SettingName } from 'libs/shared/enums/SettingName';\nimport { PreferenceRequests } from 'libs/shared/flight-requests/PreferenceRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Classification, CurrentUser, Presentation, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { PreferencesLayout } from 'apps/settings/components/preferences/PreferencesLayout';\n\nconst namespace = 'settings.topicPreferences';\n\nexport function TopicPreferencesView(): JSX.Element {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const availablePresentations = Flight.useBasicFetch<Presentation[]>(PreferenceRequests.availablePresentations());\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(PreferenceRequests.allLevelPreferences());\n\n const preselections = useGetPreferredSubjects();\n const topics = Flight.useBasicFetch<ClassificationPreference[]>(PreferenceRequests.allSubjectPreferences());\n\n const {\n bulkOnboardingPreferencesState, isLoadingSettings, updateSetting\n } = useSettings(LocationContext.PreferencesSettings);\n\n const dispatch = useDispatch();\n\n function onSave(\n addedSubjects: string[],\n removedSubjects: Classification[],\n bulkState: BulkOnboardingPreferencesState,\n onSuccess: () => void,\n onError: () => void\n ): void {\n if (bulkState !== bulkOnboardingPreferencesState) {\n const newSetting = {\n name: SettingName.BulkOnboardingPreferencesState,\n value: bulkState,\n kind: SettingKind.Permanent\n };\n\n updateSetting(\n currentUser.data.id,\n newSetting,\n onSuccess,\n onError\n );\n }\n\n if (addedSubjects?.length)\n Flight.fetch(dispatch, PreferenceRequests.followSubjects(addedSubjects, onSuccess, onError));\n\n if (removedSubjects?.length)\n Flight.fetch(dispatch, PreferenceRequests.unfollowSubjects(removedSubjects.map(s => s.id), onSuccess, onError));\n }\n\n const dataLoaded = (\n !!topics.hasCompleted &&\n !!preselections.hasCompleted &&\n !isLoadingSettings\n );\n\n return (\n <PreferencesLayout\n availablePresentations={availablePresentations.data}\n audiences={audiences.data}\n >\n <p className='mt-3'><Text namespace={namespace} phrase='info' /></p>\n\n {dataLoaded ? (\n <TopicPreferences\n options={topics.data}\n preselections={preselections.data}\n bulkPreferencesState={bulkOnboardingPreferencesState}\n saveChanges={onSave}\n />\n ) : <PartialTopicPreferences count={7} style='grid' />}\n </PreferencesLayout>\n );\n}","import { Flight } from 'libs/common/flight';\n\nimport { PreferenceRequests } from 'libs/shared/flight-requests/PreferenceRequests';\nimport { Classification } from 'libs/shared/interfaces';\n\n/**\n * Fetches all followed subjects, then returns\n * the flight response object with only the subjects\n * that are marked as `canBePreferred`.\n * \n * We do this instead of using `formatData` on the request,\n * as some areas of the product that make this request\n * do not need to be filtered.\n * \n * This is intended to be used for onboarding / preference\n * selections only.\n */\nexport function useGetPreferredSubjects(\n onSuccess?: (classifications: Classification[]) => void\n): Flight.Response<Classification[]> {\n const filterSubjects = (subjects: Classification[]) => {\n if (!subjects)\n return [];\n\n return subjects.filter(s => s.canBePreferred);\n };\n\n const followedSubjects = Flight.useBasicFetch<Classification[]>(\n PreferenceRequests.mySubjectPreferences(followedSubjects => {\n onSuccess && onSuccess(filterSubjects(followedSubjects));\n })\n );\n\n return {\n ...followedSubjects,\n isFetching: followedSubjects.isFetching,\n data: filterSubjects(followedSubjects.data)\n };\n}","// extracted by mini-css-extract-plugin\nexport default {\"grid\":\"X9r1Y\",\"subgrid\":\"TgYhp\"};"],"names":["SubjectPreferenceGridRow","props","TopicPreferencesContext","expandedSubject","selections","selectedSubjects","subjects","map","subject","itemDisabled","id","children","find","child","isDisabled","clickHandler","onSelect","isExpandableOption","onExpand","onCollapse","hasSelectedBulk","SubjectPreferenceItem","key","selected","includes","disabled","onClick","SubjectPreferenceGrid","eventHandlers","itemsPerRow","useGetRowItemCapacity","subjectRows","reduce","acc","index","push","ArrayHelper","className","row","i","isExpanded","context","coverUrl","cover","ImageHelper","url","size","childIds","selectedChildCount","filter","selection","length","component","PreferenceItem","name","imageUrl","isSelected","isExpandable","expand","extraClasses","hideStatus","Tooltip","title","ExpandableItemStatus","selectedChildrenCount","SelectableItemStatus","svg","SvgContainer","svgName","radioButton","baseClass","caretClass","role","style","backgroundImage","tabIndex","PartialTopicPreferences","grid","center","Array","count","fill","item","defaultProps","createContext","undefined","useOnSaveAll","onDone","counter","setCounter","val","namespace","TopicPreferences","selectedTopics","setSelectedTopics","setExpandedSubject","bulkPreferencesState","setBulkPreferencesState","showSpinner","setShowSpinner","alerts","hasBulkSelectedTopics","OnboardingHelper","preselections","p","isOnboarding","success","LanguageService","nextAppLink","onSuccess","hasChangedTopics","sort","toString","hasChangedBulkState","isValid","hasChanged","onToggleSelectAll","newBulkState","optionsGrid","rawPreferenceOptions","preferenceOptions","forEach","option","structurePreferencesGrid","options","value","newSelections","backButtonAppLink","AppLink","appLink","Text","phrase","ToggleSwitch","on","hideOutline","SpinnerButton","variant","addedSubjects","removedSubjects","onSaveCounter","saveChanges","error","TopicPreferencesView","filterSubjects","followedSubjects","currentUser","UserRequests","availablePresentations","PreferenceRequests","audiences","s","canBePreferred","isFetching","data","topics","useSettings","bulkOnboardingPreferencesState","isLoadingSettings","updateSetting","dispatch","dataLoaded","hasCompleted","PreferencesLayout","bulkState","onError","newSetting","SettingName","kind","SettingKind"],"sourceRoot":""}