@clickview/lite 0.71.0-rc.3 → 0.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/scripts/6302-2535c0bedd-lite.chunk.js +2 -0
- package/dist/scripts/6302-2535c0bedd-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-d5b9393a22.min.js → bundle-960245b5c3.min.js} +3 -3
- package/dist/scripts/{bundle-d5b9393a22.min.js.map → bundle-960245b5c3.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/6302-9a16c5ee6d-lite.chunk.js +0 -2
- package/dist/scripts/6302-9a16c5ee6d-lite.chunk.js.map +0 -1
- /package/dist/scripts/{bundle-d5b9393a22.min.js.LICENSE.txt → bundle-960245b5c3.min.js.LICENSE.txt} +0 -0
package/dist/bundles.json
CHANGED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[6302],{11658:(e,r,t)=>{t.r(r),t.d(r,{BulkUserUploadReviewAccountsView:()=>X});var a=t(32735),n=t(70680),s=t(23481),i=t(81886),o=t(20354),l=t(79447),u=t(83345),c=t(76881),d="userManager.bulkUserUploadLoaderValidation";function m(e){var r,t,n=Math.floor(e.totalCompleted/e.totalUsers*100);return a.createElement("div",{className:"d-flex flex-column align-items-center py-5"},a.createElement("h1",{className:"h5"},a.createElement(u.x,{namespace:d,phrase:e.userType===c.Y.Learner?"headingStudents":"headingStaff"})),a.createElement("p",null,a.createElement(u.x,{namespace:d,phrase:e.userType===c.Y.Learner?"progressStudents":"progressStaff",options:{totalLoaded:null!==(r=e.totalCompleted)&&void 0!==r?r:0,totalUsers:null!==(t=e.totalUsers)&&void 0!==t?t:0}})),a.createElement(l.Z,{className:"w-50",variant:"info",now:n}))}var p=t(67370),f=t(63598),y=t(93898),b=t(42949),v=t(19717),g=t(96728),h=t(69883),k=t(299),E=t(45541),S=t(39739),w=t(91693),T=t(83523),U={downloadCsvArray:function(e,r){var t="data:text/csv;charset=utf-8,";t+=e.map((function(e){return e.join(",")})).join("\n");var a=document.createElement("a");a.href=encodeURI(t),a.download=r,a.click()},safeDownloadCsv:function(e,r){var t=new Blob([e],{type:"text/csv;charset=utf-8;"}),a=URL.createObjectURL(t),n=document.createElement("a");n.href=a,n.download=r,n.click(),URL.revokeObjectURL(a)}},C=t(35223);function x(e){return x="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},x(e)}function P(e,r,t){return(r=function(e){var r=function(e){if("object"!=x(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var t=r.call(e,"string");if("object"!=x(t))return t;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==x(r)?r:r+""}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}var L=P(P(P({},c.Y.Learner,"userManager.studentSpreadsheetHeading"),c.Y.Staff,"userManager.staffSpreadsheetHeading"),c.Y.Unknown,"");function I(e){var r=(0,E.V)().invalidUsers,t=v.b.getTotalInvalidListings(r);return a.createElement(a.Fragment,null,a.createElement("h2",{className:"h4"},a.createElement(u.x,{namespace:L[e.userType],phrase:"heading"})),t?a.createElement(a.Fragment,null,a.createElement("p",{className:"mb-3 fw-semibold"},a.createElement(u.x,{namespace:L[e.userType],phrase:"reviewInfo"})),a.createElement("div",{className:"pb-3"},a.createElement(w.h,{svgName:C.vn.Upload,appLink:e.appLinks.userUploadPopup,className:"btn btn-outline-dark me-2"},a.createElement(u.x,{namespace:L[e.userType],phrase:"reupload"})),a.createElement(w.h,{svgName:C.vn.Download,onClick:function(){var t=Object.keys(r).map((function(e){return r[e]})).map((function(r){var t,a,n=r.user,s=r.errorCodes,i=S.P.getMinimumPasswordLength(e.passwordPolicy,n.userType,n.masterRole),o=S.P.getErrorMessages(s,i,!0,e.localErrorMessage),l=function(e){var r,t=o[e]||null;return null===t?null!==(r=n[e])&&void 0!==r?r:"":n[e]?t+=": ".concat(n[e]):t};return e.userType===c.Y.Learner?[l("firstName"),l("surname"),null!==(t=o.masterYearGroup)&&void 0!==t?t:null===(a=n.masterYearGroup)||void 0===a?void 0:a.name,l("email"),l("username"),l("password")]:[l("firstName"),l("surname"),l("email"),l("username")]}));e.userType===c.Y.Learner?t.unshift(["First Name","Last Name","Year level","Email","Username","Password"]):t.unshift(["First Name","Last Name","Email","Username"]),U.downloadCsvArray(t,s.T.getPhrase(L[e.userType],"errorFileName"))},className:"btn btn-outline-dark"},a.createElement(u.x,{namespace:L[e.userType],phrase:"exportErrors"})))):a.createElement("p",{className:"mb-2"},a.createElement(u.x,{namespace:L[e.userType],phrase:"reviewComplete"})),a.createElement("div",{className:"d-flex align-items-center flex-wrap"},a.createElement("p",{className:"pe-3 mb-0"},a.createElement(u.x,{namespace:L[e.userType],phrase:"switchLabel"})),a.createElement(T.Z,{onClick:e.onToggleValidListings,on:e.hideValidListings})),a.createElement("div",{className:"d-flex align-items-center ms-3 ps-1 mt-3"},a.createElement(w.h,{svgName:C.vn.Close,onClick:e.onClickRemove,className:"btn btn-outline-dark",disabled:!e.bulkIndeterminate&&!e.bulkChecked||e.disableBulkCheckbox},a.createElement(u.x,{namespace:L[e.userType],phrase:"removeFromSpreadsheet"}))))}function N(e){return N="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},N(e)}function j(e,r){return function(e){if(Array.isArray(e))return e}(e)||function(e,r){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var a,n,s,i,o=[],l=!0,u=!1;try{if(s=(t=t.call(e)).next,0===r){if(Object(t)!==t)return;l=!1}else for(;!(l=(a=s.call(t)).done)&&(o.push(a.value),o.length!==r);l=!0);}catch(e){u=!0,n=e}finally{try{if(!l&&null!=t.return&&(i=t.return(),Object(i)!==i))return}finally{if(u)throw n}}return o}}(e,r)||function(e,r){if(e){if("string"==typeof e)return M(e,r);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?M(e,r):void 0}}(e,r)||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 M(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,a=Array(r);t<r;t++)a[t]=e[t];return a}function A(e,r,t){return(r=function(e){var r=function(e){if("object"!=N(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var t=r.call(e,"string");if("object"!=N(t))return t;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==N(r)?r:r+""}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}var O=A(A(A({},c.Y.Learner,"userManager.editStudentSpreadsheet"),c.Y.Staff,"userManager.editStaffSpreadsheet"),c.Y.Unknown,"");function V(e){var r=O[e.userType],t=j(a.useState(!0),2),n=t[0],o=t[1],l=j(a.useState(),2),u=l[0],c=l[1],d=j(a.useState([]),2),S=d[0],w=d[1],T=(0,E.V)(),U=T.users,C=T.invalidUsers,x=T.setInvalidUsers,P=T.hasValidatedUsers,L=T.setExistingUsers,N=P?n?Object.keys(C).map((function(e){return C[e].user})):U:[],M=(0,k.X)(N,{idField:"lookupId"}),A=a.useContext(g.e),V=A.setDisableNext,F=A.setShowButtons,R=A.setOnClickConfirm,Y=(0,h.Z)(),B=v.b.getTotalInvalidListings(C),$=(0,p.Ix)({hasValidatedUsers:P,setInvalidUsers:x,userType:e.userType,setHideValidListings:o,setExistingUsers:L});function H(){Y.error(s.T.getPhrase(r,"error")),i.Q.C$.trigger(e.appLinks.userManager,{replace:!0})}return a.useEffect((function(){P||(e.setTotalValidatedUsers(0),e.validateSpreadsheet(U,$,H))}),[P]),a.useEffect((function(){F(P),V(!!Object.keys(null!=C?C:{}).length)}),[C,P]),a.useEffect((function(){R((function(){return e.onClickConfirm}))}),[e.onClickConfirm]),P?a.createElement(a.Fragment,null,a.createElement(I,{appLinks:e.appLinks,userType:e.userType,hideValidListings:n,passwordPolicy:e.passwordPolicy,onToggleValidListings:function(){return(0,p.zV)({setHideValidListings:o,hideValidListings:n,userType:e.userType})},bulkChecked:M.bulkChecked,bulkIndeterminate:M.hasSomeSelections(),onClickRemove:function(){var e=M.getSelected();w(e)},disableBulkCheckbox:!N.length,localErrorMessage:e.localErrorMessage}),a.createElement("main",{className:"pt-2 pb-3 position-relative"},a.createElement(b.M,{users:N,invalidUsers:C,userType:e.userType,onClickEdit:c,onClickDelete:w,onClickCreate:e.onClickConfirm,appLinks:e.appLinks,showInvalidEmptyState:n&&!B,emptyStateImageUrl:e.emptyStateImageUrl,showPasswordField:e.showPasswordField,passwordPolicy:e.passwordPolicy,checkboxId:"bulk-upload-remove",isChecked:function(e){return M.isChecked(e)&&!!N.length},onToggleCheckbox:M.onToggleItem,localErrorMessage:e.localErrorMessage,bulkCheckboxChecked:M.bulkChecked,bulkIndeterminate:M.hasSomeSelections(),onToggleBulkCheckbox:M.onToggleBulk,disableBulkCheckbox:!N.length})),!!u&&a.createElement(y.n,{key:u.lookupId,user:u,setUser:c,closePopup:function(){return(0,p.UJ)(c,e.closePopup)},title:s.T.getPhrase(r,"editUser"),userType:e.userType,yearGroups:e.yearGroups,analyticsOptions:v.b.getAnalyticsOptions(e.userType),currentUser:e.currentUser,formSize:e.formSize,validateUser:e.validateUser,emailRequired:e.emailRequired,showPasswordField:e.showPasswordField,passwordPolicy:e.passwordPolicy,validateEmail:e.validateEmail,appLinks:e.appLinks,localErrorMessage:e.localErrorMessage}),!!S.length&&a.createElement(f.Q,{users:S,userType:e.userType,closePopup:function(){return(0,p.RF)(w,e.closePopup)},analyticsOptions:v.b.getAnalyticsOptions(e.userType)})):a.createElement(m,{userType:e.userType,totalCompleted:e.totalValidatedUsers,totalUsers:null==U?void 0:U.length})}var F=t(27150),R=t(26055),Y=t(43820),B=t(149),$=t(31949),H=t(79612),q=t(99742),G=t(29613),D=t(80658),J=t(47288),Z=t(18087);function _(e){return _="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_(e)}function z(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,a=Array(r);t<r;t++)a[t]=e[t];return a}function Q(e,r,t){return(r=function(e){var r=function(e){if("object"!=_(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var t=r.call(e,"string");if("object"!=_(t))return t;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==_(r)?r:r+""}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}var W=Q(Q(Q({},c.Y.Learner,"userManager.bulkStudentUploadReviewAccounts"),c.Y.Staff,"userManager.bulkStaffUploadReviewAccounts"),c.Y.Unknown,"");function X(e){var r,t,l=(0,E.V)().users,u=(r=a.useState(0),t=2,function(e){if(Array.isArray(e))return e}(r)||function(e,r){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var a,n,s,i,o=[],l=!0,u=!1;try{if(s=(t=t.call(e)).next,0===r){if(Object(t)!==t)return;l=!1}else for(;!(l=(a=s.call(t)).done)&&(o.push(a.value),o.length!==r);l=!0);}catch(e){u=!0,n=e}finally{try{if(!l&&null!=t.return&&(i=t.return(),Object(i)!==i))return}finally{if(u)throw n}}return o}}(r,t)||function(e,r){if(e){if("string"==typeof e)return z(e,r);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?z(e,r):void 0}}(r,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.")}()),d=u[0],m=u[1],p=o.a.useBasicFetch($.N.currentUser()),f=o.a.useBasicFetch(p.data&&J.N.yearGroups(p.data.customerId)),y=o.a.useBasicFetch(p.data&&D.F.getCustomerSecuritySettings(p.data.customerId)),b=(0,n.I0)(),g=o.a.useGetFetchAsync();(0,H.M)({title:s.T.getPhrase(W[e.userType],"pageTitle")});var h=(0,Z.Y)(e.userType),k=B.b.useCreateJobErrorAlert();function w(r){i.Q.C$.trigger(Object.assign(Object.assign({},h.userUploadStatus.polling),{params:{userType:e.userType,jobId:r.id}}))}return a.createElement(R.A.Provider,{value:Y.a.Primary},a.createElement(F.$,{appLinks:h,userType:e.userType,currentStep:"review-accounts",canAddExistingUsers:!0},a.createElement("div",{className:"px-3"},a.createElement(V,{onClickConfirm:function(){var r=v.b.getJobData({users:l,customerId:p.data.customerId,userType:e.userType});o.a.fetch(b,G.q.createJob(r,w,k))},userType:e.userType,appLinks:h,currentUser:p.data,yearGroups:f.data,closePopup:e.closePopup,validateSpreadsheet:function(r,t,a){v.b.validateSpreadsheetRequest({users:r,userType:e.userType,customerId:p.data.customerId,dispatch:b,requestFn:J.N.bulkUsersValidate,setTotalCompletedUsers:m,canInviteExistingUsers:!0,onSuccess:t,onError:a})},validateUser:function(r){var t=S.P.formatCreateOrValidateUserRequest([r],e.userType,p.data.customerId);return g(J.N.bulkUsersValidate(t,!0))},totalValidatedUsers:d,setTotalValidatedUsers:m,emptyStateImageUrl:q.W.EmptyStates.UserManager.REVIEWS,showPasswordField:e.userType===c.Y.Learner,emailRequired:e.userType===c.Y.Staff,passwordPolicy:y.data,validateEmail:function(r){var t={userEmails:[{email:r,userType:e.userType}]};return g(J.N.bulkCheckEmail(t,p.data.customerId))},localErrorMessage:v.b.getErrorMessageOverride(e.userType)}))))}},79447:(e,r,t)=>{t.d(r,{Z:()=>m});var a=t(95685),n=t.n(a),s=t(32735),i=t(46304),o=t(58661),l=t(74512);function u(e,r,t){const a=(e-r)/(t-r)*100;return Math.round(1e3*a)/1e3}function c({min:e,now:r,max:t,label:a,visuallyHidden:s,striped:i,animated:o,className:c,style:d,variant:m,bsPrefix:p,...f},y){return(0,l.jsx)("div",{ref:y,...f,role:"progressbar",className:n()(c,`${p}-bar`,{[`bg-${m}`]:m,[`${p}-bar-animated`]:o,[`${p}-bar-striped`]:o||i}),style:{width:`${u(r,e,t)}%`,...d},"aria-valuenow":r,"aria-valuemin":e,"aria-valuemax":t,children:s?(0,l.jsx)("span",{className:"visually-hidden",children:a}):a})}const d=s.forwardRef((({isChild:e=!1,...r},t)=>{const a={min:0,max:100,animated:!1,visuallyHidden:!1,striped:!1,...r};if(a.bsPrefix=(0,i.vE)(a.bsPrefix,"progress"),e)return c(a,t);const{min:u,now:d,max:m,label:p,visuallyHidden:f,striped:y,animated:b,bsPrefix:v,variant:g,className:h,children:k,...E}=a;return(0,l.jsx)("div",{ref:t,...E,className:n()(h,v),children:k?(0,o.UI)(k,(e=>(0,s.cloneElement)(e,{isChild:!0}))):c({min:u,now:d,max:m,label:p,visuallyHidden:f,striped:y,animated:b,bsPrefix:v,variant:g},t)})}));d.displayName="ProgressBar";const m=d}}]);
|
|
2
|
+
//# sourceMappingURL=6302-2535c0bedd-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/6302-2535c0bedd-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/bulk-user-upload-loader/BulkUserUploadLoader.tsx","file:///app/packages/libs/shared/src/utils/FileHelper.ts","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/edit-user-spreadsheet/spreadsheet-heading/EditUserSpreadsheetHeading.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/edit-user-spreadsheet/EditUserSpreadsheet.tsx","file:///app/packages/projects/lite/src/apps/user-manager/views/bulk-user-upload/review-accounts/BulkUserUploadReviewAccountsView.tsx","file:///app/node_modules/react-bootstrap/esm/ProgressBar.js"],"sourcesContent":["import React from 'react';\nimport { ProgressBar } from 'react-bootstrap';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nconst namespace = 'userManager.bulkUserUploadLoaderValidation';\n\ninterface BulkUserUploadLoaderProps {\n userType: UserGroup;\n totalCompleted: number;\n totalUsers: number;\n}\n\nexport function BulkUserUploadLoader(props: BulkUserUploadLoaderProps): JSX.Element {\n const percentageLoaded = Math.floor(props.totalCompleted / props.totalUsers * 100);\n\n return (\n <div className='d-flex flex-column align-items-center py-5'>\n <h1 className='h5'>\n <Text namespace={namespace} phrase={props.userType === UserGroup.Learner ? 'headingStudents' : 'headingStaff'} />\n </h1>\n <p>\n <Text\n namespace={namespace}\n phrase={props.userType === UserGroup.Learner ? 'progressStudents' : 'progressStaff'}\n options={{\n totalLoaded: props.totalCompleted ?? 0,\n totalUsers: props.totalUsers ?? 0\n }}\n />\n </p>\n \n <ProgressBar className='w-50' variant='info' now={percentageLoaded} />\n </div>\n );\n}","export const FileHelper = {\n downloadCsvArray(rows: string[][], filename: string): void {\n let csvContent = 'data:text/csv;charset=utf-8,';\n\n csvContent += rows.map(row => row.join(',')).join('\\n');\n\n const anchor = document.createElement('a');\n\n anchor.href = encodeURI(csvContent);\n anchor.download = filename;\n anchor.click();\n },\n // This handles special characters in csv\n safeDownloadCsv(csvContent: string, filename: string): void {\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.click();\n\n URL.revokeObjectURL(url);\n }\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { FileHelper } from 'libs/shared/utils/FileHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespaces = {\n [UserGroup.Learner]: 'userManager.studentSpreadsheetHeading',\n [UserGroup.Staff]: 'userManager.staffSpreadsheetHeading',\n [UserGroup.Unknown]: ''\n};\n\ninterface EditUserSpreadsheetHeadingProps {\n appLinks: UserManagerAppLinks;\n userType: UserGroup;\n passwordPolicy: SecuritySettingsResponse;\n onToggleValidListings: () => void;\n hideValidListings: boolean;\n\n bulkChecked: boolean;\n bulkIndeterminate: boolean;\n onClickRemove: () => void;\n disableBulkCheckbox: boolean;\n localErrorMessage?: HashObject;\n}\n\nexport function EditUserSpreadsheetHeading(props: EditUserSpreadsheetHeadingProps): JSX.Element {\n const { invalidUsers } = useBulkUploadUsers();\n\n function onClickExportErrors(): void {\n const erroredUsers = Object.keys(invalidUsers).map(name => invalidUsers[name]);\n\n const rows = erroredUsers.map(erroredUser => {\n const { user, errorCodes } = erroredUser;\n\n const minPasswordLength = UserManagerHelper.getMinimumPasswordLength(\n props.passwordPolicy,\n user.userType,\n user.masterRole\n );\n\n const errorMessages = UserManagerHelper.getErrorMessages(\n errorCodes,\n minPasswordLength,\n true,\n props.localErrorMessage\n );\n\n const getError = (key: keyof typeof user) => {\n let error: string | null = errorMessages[key] || null;\n\n if (error === null)\n return user[key] ?? '';\n\n if (!user[key])\n return error;\n\n error += `: ${user[key]}`;\n\n return error;\n };\n\n if (props.userType === UserGroup.Learner) {\n return [\n getError('firstName'),\n getError('surname'),\n errorMessages.masterYearGroup ?? user.masterYearGroup?.name,\n getError('email'),\n getError('username'),\n getError('password')\n ];\n }\n\n // Staff\n return [\n getError('firstName'),\n getError('surname'),\n getError('email'),\n getError('username')\n ];\n });\n\n // Add heading rows so it can be uploaded again\n if (props.userType === UserGroup.Learner) {\n rows.unshift([ 'First Name', 'Last Name', 'Year level', 'Email', 'Username', 'Password' ]);\n } else {\n rows.unshift([ 'First Name', 'Last Name', 'Email', 'Username' ]);\n }\n\n FileHelper.downloadCsvArray(rows, LanguageService.getPhrase(namespaces[props.userType], 'errorFileName'));\n }\n\n const totalInvalidListings = BulkUserUploadHelper.getTotalInvalidListings(invalidUsers);\n\n return (\n <>\n <h2 className='h4'><Text namespace={namespaces[props.userType]} phrase='heading' /></h2>\n\n {totalInvalidListings ? (\n <>\n <p className='mb-3 fw-semibold'>\n <Text namespace={namespaces[props.userType]} phrase='reviewInfo' />\n </p>\n\n <div className='pb-3'>\n <IconButton svgName={cvSvgLibrary.Upload} appLink={props.appLinks.userUploadPopup} className='btn btn-outline-dark me-2'>\n <Text namespace={namespaces[props.userType]} phrase='reupload' />\n </IconButton>\n <IconButton svgName={cvSvgLibrary.Download} onClick={onClickExportErrors} className='btn btn-outline-dark'>\n <Text namespace={namespaces[props.userType]} phrase='exportErrors' />\n </IconButton>\n </div>\n </>\n ) : (\n <p className='mb-2'>\n <Text namespace={namespaces[props.userType]} phrase='reviewComplete' />\n </p>\n )}\n\n <div className='d-flex align-items-center flex-wrap'>\n <p className='pe-3 mb-0'><Text namespace={namespaces[props.userType]} phrase='switchLabel' /></p>\n <ToggleSwitch\n onClick={props.onToggleValidListings}\n on={props.hideValidListings}\n />\n </div>\n\n <div className='d-flex align-items-center ms-3 ps-1 mt-3'>\n <IconButton\n svgName={cvSvgLibrary.Close}\n onClick={props.onClickRemove}\n className='btn btn-outline-dark'\n disabled={(!props.bulkIndeterminate && !props.bulkChecked) || props.disableBulkCheckbox}\n >\n <Text namespace={namespaces[props.userType]} phrase='removeFromSpreadsheet' />\n </IconButton>\n </div>\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { BulkUserUploadLoader } from 'libs/shared/apps/user-manager/components/bulk-upload/bulk-user-upload-loader/BulkUserUploadLoader';\nimport { getOnValidateSuccess, onCloseDeletePopup, onCloseEditPopup, onToggleValidListings } from 'libs/shared/apps/user-manager/components/bulk-upload/BulkUserUploadEvents';\nimport { DeleteUploadedUserPopup } from 'libs/shared/apps/user-manager/components/delete-uploaded-user-popup/DeleteUploadedUserPopup';\nimport { EditUploadedUserPopup } from 'libs/shared/apps/user-manager/components/edit-uploaded-user-popup/EditUploadedUserPopup';\nimport { UserReviewTable } from 'libs/shared/apps/user-manager/components/user-review-table/UserReviewTable';\nimport { BulkUserEmailCheckResponse, EditUserRequest, ErroredUsers, UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useBulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\nimport { CurrentUser, YearGroup } from 'libs/shared/interfaces';\n\nimport { useBulkUploadUsers } from '../../../hooks/useBulkUploadUsers';\nimport { SecuritySettingsResponse } from '../../../interfaces/SecuritySettingsResponse';\n\nimport { EditUserSpreadsheetHeading } from './spreadsheet-heading/EditUserSpreadsheetHeading';\n\nconst subNamespaces = {\n [UserGroup.Learner]: 'userManager.editStudentSpreadsheet',\n [UserGroup.Staff]: 'userManager.editStaffSpreadsheet',\n [UserGroup.Unknown]: ''\n};\n\ntype ValidateAllFunction = (\n users: EditUserRequest[],\n onSuccess: (errors: ErroredUsers, users: EditUserRequest[]) => void,\n onError: () => void\n) => void;\n\ninterface EditUserSpreadsheetProps {\n userType: UserGroup;\n appLinks: UserManagerAppLinks;\n currentUser: CurrentUser;\n validateSpreadsheet: ValidateAllFunction;\n validateUser: (user: EditUserRequest) => Promise<ErroredUsers>;\n validateEmail?: (email: string) => Promise<BulkUserEmailCheckResponse>;\n closePopup: () => void;\n emptyStateImageUrl: string;\n totalValidatedUsers: number;\n setTotalValidatedUsers: (total: number) => void;\n yearGroups: YearGroup[];\n emailRequired: boolean;\n passwordPolicy: SecuritySettingsResponse;\n onClickConfirm: () => void;\n showPasswordField?: boolean;\n formSize?: FormSize;\n localErrorMessage?: HashObject;\n}\n\nexport function EditUserSpreadsheet(props: EditUserSpreadsheetProps): JSX.Element {\n const subNamespace = subNamespaces[props.userType];\n\n const [ hideValidListings, setHideValidListings ] = React.useState(true);\n const [ editingUser, setEditingUser ] = React.useState<EditUserRequest>();\n const [ deletingUsers, setDeletingUsers ] = React.useState<string[]>([]);\n\n const { users, invalidUsers, setInvalidUsers, hasValidatedUsers, setExistingUsers } = useBulkUploadUsers();\n\n function getUsersToDisplay(): EditUserRequest[] {\n // We don't want to show any users until validation is completed\n if (!hasValidatedUsers)\n return [];\n \n // If the toggle switch to hide valid listings is on, we filter out all valid listings\n if (hideValidListings)\n return Object.keys(invalidUsers).map(name => invalidUsers[name].user);\n \n // Else, show all users\n return users;\n }\n\n const usersToDisplay = getUsersToDisplay();\n\n const CheckboxHelper = useBulkCheckboxManager(usersToDisplay, { idField: 'lookupId' });\n\n const { setDisableNext, setShowButtons, setOnClickConfirm } = React.useContext(WizardLayoutContext);\n\n const alerts = useAlerts();\n\n const totalInvalidListings = BulkUserUploadHelper.getTotalInvalidListings(invalidUsers);\n\n const onValidateSuccess = getOnValidateSuccess({\n hasValidatedUsers,\n setInvalidUsers,\n userType: props.userType,\n setHideValidListings,\n setExistingUsers\n });\n\n function onValidateError(): void {\n alerts.error(LanguageService.getPhrase(subNamespace, 'error'));\n Core.AppLinkHelper.trigger(props.appLinks.userManager, { replace: true });\n }\n\n function onClickRemove(): void {\n const selected = CheckboxHelper.getSelected();\n \n setDeletingUsers(selected);\n }\n\n // Runs on page load to lock the nav, and validate the initially uploaded users\n React.useEffect(() => {\n if (hasValidatedUsers)\n return;\n\n props.setTotalValidatedUsers(0);\n\n // Everytime the reducer state changes, we want to validate the new state.\n props.validateSpreadsheet(users, onValidateSuccess, onValidateError);\n }, [hasValidatedUsers]);\n\n React.useEffect(() => {\n setShowButtons(hasValidatedUsers);\n setDisableNext(!!Object.keys(invalidUsers ?? {}).length);\n }, [ invalidUsers, hasValidatedUsers ]);\n\n React.useEffect(() => {\n setOnClickConfirm(() => props.onClickConfirm);\n }, [props.onClickConfirm]);\n\n if (!hasValidatedUsers) {\n return (\n <BulkUserUploadLoader\n userType={props.userType}\n totalCompleted={props.totalValidatedUsers}\n totalUsers={users?.length}\n />\n );\n }\n\n return (\n <>\n <EditUserSpreadsheetHeading\n appLinks={props.appLinks}\n userType={props.userType}\n hideValidListings={hideValidListings}\n passwordPolicy={props.passwordPolicy}\n onToggleValidListings={() => onToggleValidListings({\n setHideValidListings,\n hideValidListings,\n userType: props.userType\n })}\n bulkChecked={CheckboxHelper.bulkChecked}\n bulkIndeterminate={CheckboxHelper.hasSomeSelections()}\n onClickRemove={onClickRemove}\n disableBulkCheckbox={!usersToDisplay.length}\n localErrorMessage={props.localErrorMessage}\n />\n\n <main className='pt-2 pb-3 position-relative'>\n <UserReviewTable\n users={usersToDisplay}\n invalidUsers={invalidUsers}\n userType={props.userType}\n onClickEdit={setEditingUser}\n onClickDelete={setDeletingUsers}\n onClickCreate={props.onClickConfirm}\n appLinks={props.appLinks}\n showInvalidEmptyState={hideValidListings && !totalInvalidListings}\n emptyStateImageUrl={props.emptyStateImageUrl}\n showPasswordField={props.showPasswordField}\n passwordPolicy={props.passwordPolicy}\n checkboxId='bulk-upload-remove'\n isChecked={id => CheckboxHelper.isChecked(id) && !!usersToDisplay.length}\n onToggleCheckbox={CheckboxHelper.onToggleItem}\n localErrorMessage={props.localErrorMessage}\n bulkCheckboxChecked={CheckboxHelper.bulkChecked}\n bulkIndeterminate={CheckboxHelper.hasSomeSelections()}\n onToggleBulkCheckbox={CheckboxHelper.onToggleBulk}\n disableBulkCheckbox={!usersToDisplay.length}\n />\n </main>\n\n {!!editingUser && (\n <EditUploadedUserPopup\n key={editingUser.lookupId}\n user={editingUser}\n setUser={setEditingUser}\n closePopup={() => onCloseEditPopup(setEditingUser, props.closePopup)}\n title={LanguageService.getPhrase(subNamespace, 'editUser')}\n userType={props.userType}\n yearGroups={props.yearGroups}\n analyticsOptions={BulkUserUploadHelper.getAnalyticsOptions(props.userType)}\n currentUser={props.currentUser}\n formSize={props.formSize}\n validateUser={props.validateUser}\n emailRequired={props.emailRequired}\n showPasswordField={props.showPasswordField}\n passwordPolicy={props.passwordPolicy}\n validateEmail={props.validateEmail}\n appLinks={props.appLinks}\n localErrorMessage={props.localErrorMessage}\n />\n )}\n\n {!!deletingUsers.length && (\n <DeleteUploadedUserPopup\n users={deletingUsers}\n userType={props.userType}\n closePopup={() => onCloseDeletePopup(setDeletingUsers, props.closePopup)}\n analyticsOptions={BulkUserUploadHelper.getAnalyticsOptions(props.userType)}\n />\n )}\n </>\n );\n}","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { EditUserSpreadsheet } from 'libs/shared/apps/user-manager/components/bulk-upload/edit-user-spreadsheet/EditUserSpreadsheet';\nimport { BulkUserUploadWizardLayout } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { BulkUserEmailCheckRequest, BulkUserEmailCheckResponse, EditUserRequest, ErroredUsers } from 'libs/shared/apps/user-manager/interfaces';\nimport { UserWizardParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserWizardParams';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { BulkUserActionsHelper } from 'libs/shared/apps/user-manager/utils/BulkUserActionsHelper';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { BatchJob, CurrentUser, PropsWithPopupViewProps, YearGroup } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { JobRequests } from 'shared/flight-requests/JobRequests';\n\nimport { SecuritySettingsRequests } from 'apps/settings/flight-requests/SecuritySettingsRequests';\nimport { UserManagerRequests } from 'apps/user-manager/flight-requests/UserManagerRequests';\nimport { getUserManagerAppLinks } from 'apps/user-manager/utils/LiteUserManagerAppLinks';\n\nconst namespaces = {\n [UserGroup.Learner]: 'userManager.bulkStudentUploadReviewAccounts',\n [UserGroup.Staff]: 'userManager.bulkStaffUploadReviewAccounts',\n [UserGroup.Unknown]: ''\n};\n\nexport function BulkUserUploadReviewAccountsView(props: PropsWithPopupViewProps<UserWizardParams>): JSX.Element {\n const { users } = useBulkUploadUsers();\n\n const [ totalValidatedUsers, setTotalValidatedUsers ] = React.useState(0);\n \n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && UserManagerRequests.yearGroups(currentUser.data.customerId)\n );\n const passwordPolicy = Flight.useBasicFetch<SecuritySettingsResponse>(currentUser.data &&\n SecuritySettingsRequests.getCustomerSecuritySettings(currentUser.data.customerId));\n\n const dispatch = useDispatch();\n const fetchAsync = Flight.useGetFetchAsync();\n useSetPageMetadata({ title: LanguageService.getPhrase(namespaces[props.userType], 'pageTitle') });\n\n const appLinks = getUserManagerAppLinks(props.userType);\n\n /**\n * Will validate the entire spreadsheet. This can be a very slow operation, so it should\n * only ever be run once when the user first uploads their spreadsheet\n */\n function validateSpreadsheet(\n users: EditUserRequest[],\n onSuccess: (errors: ErroredUsers, users: EditUserRequest[]) => void,\n onError: () => void\n ): void {\n BulkUserUploadHelper.validateSpreadsheetRequest({\n users,\n userType: props.userType,\n customerId: currentUser.data.customerId,\n dispatch,\n requestFn: UserManagerRequests.bulkUsersValidate,\n setTotalCompletedUsers: setTotalValidatedUsers,\n canInviteExistingUsers: true,\n onSuccess,\n onError\n });\n }\n\n function validateUser(user: EditUserRequest): Promise<ErroredUsers> {\n const data = UserManagerHelper.formatCreateOrValidateUserRequest(\n [user],\n props.userType,\n currentUser.data.customerId\n );\n\n return fetchAsync(UserManagerRequests.bulkUsersValidate(data, true));\n }\n\n function validateEmail(email: string): Promise<BulkUserEmailCheckResponse> {\n const body: BulkUserEmailCheckRequest = {\n userEmails: [{ email, userType: props.userType }]\n };\n\n return fetchAsync(UserManagerRequests.bulkCheckEmail(body, currentUser.data.customerId));\n }\n\n const onCreateJobError = BulkUserActionsHelper.useCreateJobErrorAlert();\n function startBulkUpload(): void {\n const jobData = BulkUserUploadHelper.getJobData({\n users, customerId: currentUser.data.customerId, userType: props.userType\n });\n Flight.fetch(dispatch, JobRequests.createJob(jobData, onCreateJob, onCreateJobError));\n }\n\n function onCreateJob(job: BatchJob): void {\n Core.AppLinkHelper.trigger({\n ...appLinks.userUploadStatus.polling,\n params: {\n userType: props.userType,\n jobId: job.id\n }\n });\n }\n\n return (\n <UserManagerClientContext.Provider value={UserManagerClient.Primary}>\n <BulkUserUploadWizardLayout\n appLinks={appLinks}\n userType={props.userType}\n currentStep='review-accounts'\n canAddExistingUsers\n >\n <div className='px-3'>\n <EditUserSpreadsheet\n onClickConfirm={startBulkUpload}\n userType={props.userType}\n appLinks={appLinks}\n currentUser={currentUser.data}\n yearGroups={yearGroups.data}\n closePopup={props.closePopup}\n validateSpreadsheet={validateSpreadsheet}\n validateUser={validateUser}\n totalValidatedUsers={totalValidatedUsers}\n setTotalValidatedUsers={setTotalValidatedUsers}\n emptyStateImageUrl={ImageUrls.EmptyStates.UserManager.REVIEWS}\n showPasswordField={props.userType === UserGroup.Learner}\n emailRequired={props.userType === UserGroup.Staff}\n passwordPolicy={passwordPolicy.data}\n validateEmail={validateEmail}\n localErrorMessage={BulkUserUploadHelper.getErrorMessageOverride(props.userType)}\n />\n </div>\n </BulkUserUploadWizardLayout>\n </UserManagerClientContext.Provider>\n );\n}","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { cloneElement } from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { map } from './ElementChildren';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst ROUND_PRECISION = 1000;\n\n/**\n * Validate that children, if any, are instances of `ProgressBar`.\n */\nfunction onlyProgressBar(props, propName, componentName) {\n const children = props[propName];\n if (!children) {\n return null;\n }\n let error = null;\n React.Children.forEach(children, child => {\n if (error) {\n return;\n }\n\n /**\n * Compare types in a way that works with libraries that patch and proxy\n * components like react-hot-loader.\n *\n * see https://github.com/gaearon/react-hot-loader#checking-element-types\n */\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n const element = /*#__PURE__*/_jsx(ProgressBar, {});\n if (child.type === element.type) return;\n const childType = child.type;\n const childIdentifier = /*#__PURE__*/React.isValidElement(child) ? childType.displayName || childType.name || childType : child;\n error = new Error(`Children of ${componentName} can contain only ProgressBar ` + `components. Found ${childIdentifier}.`);\n });\n return error;\n}\nfunction getPercentage(now, min, max) {\n const percentage = (now - min) / (max - min) * 100;\n return Math.round(percentage * ROUND_PRECISION) / ROUND_PRECISION;\n}\nfunction renderProgressBar({\n min,\n now,\n max,\n label,\n visuallyHidden,\n striped,\n animated,\n className,\n style,\n variant,\n bsPrefix,\n ...props\n}, ref) {\n return /*#__PURE__*/_jsx(\"div\", {\n ref: ref,\n ...props,\n role: \"progressbar\",\n className: classNames(className, `${bsPrefix}-bar`, {\n [`bg-${variant}`]: variant,\n [`${bsPrefix}-bar-animated`]: animated,\n [`${bsPrefix}-bar-striped`]: animated || striped\n }),\n style: {\n width: `${getPercentage(now, min, max)}%`,\n ...style\n },\n \"aria-valuenow\": now,\n \"aria-valuemin\": min,\n \"aria-valuemax\": max,\n children: visuallyHidden ? /*#__PURE__*/_jsx(\"span\", {\n className: \"visually-hidden\",\n children: label\n }) : label\n });\n}\nconst ProgressBar = /*#__PURE__*/React.forwardRef(({\n isChild = false,\n ...rest\n}, ref) => {\n const props = {\n min: 0,\n max: 100,\n animated: false,\n visuallyHidden: false,\n striped: false,\n ...rest\n };\n props.bsPrefix = useBootstrapPrefix(props.bsPrefix, 'progress');\n if (isChild) {\n return renderProgressBar(props, ref);\n }\n const {\n min,\n now,\n max,\n label,\n visuallyHidden,\n striped,\n animated,\n bsPrefix,\n variant,\n className,\n children,\n ...wrapperProps\n } = props;\n return /*#__PURE__*/_jsx(\"div\", {\n ref: ref,\n ...wrapperProps,\n className: classNames(className, bsPrefix),\n children: children ? map(children, child => /*#__PURE__*/cloneElement(child, {\n isChild: true\n })) : renderProgressBar({\n min,\n now,\n max,\n label,\n visuallyHidden,\n striped,\n animated,\n bsPrefix,\n variant\n }, ref)\n });\n});\nProgressBar.displayName = 'ProgressBar';\nexport default ProgressBar;"],"names":["namespace","BulkUserUploadLoader","props","percentageLoaded","Math","floor","totalCompleted","totalUsers","className","Text","phrase","userType","UserGroup","options","totalLoaded","ProgressBar","variant","now","FileHelper","downloadCsvArray","rows","filename","csvContent","map","row","join","anchor","document","createElement","href","encodeURI","download","click","safeDownloadCsv","blob","Blob","type","url","URL","createObjectURL","revokeObjectURL","namespaces","EditUserSpreadsheetHeading","invalidUsers","useBulkUploadUsers","totalInvalidListings","BulkUserUploadHelper","IconButton","svgName","appLink","appLinks","userUploadPopup","onClick","Object","keys","name","erroredUser","user","errorCodes","minPasswordLength","UserManagerHelper","passwordPolicy","masterRole","errorMessages","localErrorMessage","getError","key","error","masterYearGroup","unshift","LanguageService","ToggleSwitch","onToggleValidListings","on","hideValidListings","onClickRemove","disabled","bulkIndeterminate","bulkChecked","disableBulkCheckbox","subNamespaces","EditUserSpreadsheet","subNamespace","setHideValidListings","editingUser","setEditingUser","deletingUsers","setDeletingUsers","users","setInvalidUsers","hasValidatedUsers","setExistingUsers","usersToDisplay","CheckboxHelper","useBulkCheckboxManager","idField","WizardLayoutContext","setDisableNext","setShowButtons","setOnClickConfirm","alerts","onValidateSuccess","onValidateError","userManager","replace","setTotalValidatedUsers","validateSpreadsheet","length","onClickConfirm","hasSomeSelections","selected","getSelected","UserReviewTable","onClickEdit","onClickDelete","onClickCreate","showInvalidEmptyState","emptyStateImageUrl","showPasswordField","checkboxId","isChecked","id","onToggleCheckbox","onToggleItem","bulkCheckboxChecked","onToggleBulkCheckbox","onToggleBulk","EditUploadedUserPopup","lookupId","setUser","closePopup","title","yearGroups","analyticsOptions","currentUser","formSize","validateUser","emailRequired","validateEmail","DeleteUploadedUserPopup","totalValidatedUsers","BulkUserUploadReviewAccountsView","UserRequests","data","UserManagerRequests","customerId","SecuritySettingsRequests","dispatch","fetchAsync","useSetPageMetadata","onCreateJobError","BulkUserActionsHelper","onCreateJob","job","userUploadStatus","polling","params","jobId","UserManagerClientContext","value","UserManagerClient","BulkUserUploadWizardLayout","currentStep","canAddExistingUsers","jobData","JobRequests","onSuccess","onError","requestFn","setTotalCompletedUsers","canInviteExistingUsers","ImageUrls","email","body","userEmails","getPercentage","min","max","percentage","round","renderProgressBar","label","visuallyHidden","striped","animated","style","bsPrefix","ref","role","width","children","isChild","rest","wrapperProps","child","cloneElement","displayName"],"sourceRoot":""}
|