@zengenti/contensis-react-base 3.0.0 → 3.0.1-beta.10
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/cjs/{App-e82ee728.js → App-ee485b92.js} +3 -2
- package/cjs/App-ee485b92.js.map +1 -0
- package/cjs/client.js +2 -2
- package/cjs/contensis-react-base.js +19 -12
- package/cjs/contensis-react-base.js.map +1 -1
- package/cjs/forms.js +19 -13
- package/cjs/forms.js.map +1 -1
- package/cjs/{login-6b9de6a1.js → login-840860bc.js} +18 -22
- package/cjs/login-840860bc.js.map +1 -0
- package/cjs/{sagas-594b5ecd.js → sagas-67df1936.js} +48 -27
- package/cjs/sagas-67df1936.js.map +1 -0
- package/cjs/search.js +11 -4
- package/cjs/search.js.map +1 -1
- package/cjs/urls-6fcaf4c6.js +25 -0
- package/cjs/urls-6fcaf4c6.js.map +1 -0
- package/cjs/user.js +1 -1
- package/cjs/util.js +3 -15
- package/cjs/util.js.map +1 -1
- package/esm/{App-986d0bc6.js → App-640239d2.js} +3 -2
- package/esm/App-640239d2.js.map +1 -0
- package/esm/client.js +3 -3
- package/esm/contensis-react-base.js +19 -12
- package/esm/contensis-react-base.js.map +1 -1
- package/esm/forms.js +19 -13
- package/esm/forms.js.map +1 -1
- package/esm/{login-508cac0f.js → login-57395c9c.js} +17 -21
- package/esm/login-57395c9c.js.map +1 -0
- package/esm/{sagas-1f2b2aa0.js → sagas-023783fd.js} +48 -27
- package/esm/sagas-023783fd.js.map +1 -0
- package/esm/search.js +12 -5
- package/esm/search.js.map +1 -1
- package/esm/urls-eac9a747.js +22 -0
- package/esm/urls-eac9a747.js.map +1 -0
- package/esm/user.js +1 -1
- package/esm/util.js +2 -14
- package/esm/util.js.map +1 -1
- package/models/search/models/Queries.d.ts +2 -1
- package/models/search/models/Search.d.ts +2 -0
- package/models/search/search/expressions.d.ts +2 -2
- package/models/server/features/reverse-proxy/index.d.ts +2 -1
- package/models/user/util/CookieHelper.class.d.ts +2 -2
- package/models/user/util/LoginHelper.class.d.ts +2 -5
- package/models/user/util/OidcUserManager.d.ts +3 -2
- package/package.json +3 -2
- package/cjs/App-e82ee728.js.map +0 -1
- package/cjs/login-6b9de6a1.js.map +0 -1
- package/cjs/sagas-594b5ecd.js.map +0 -1
- package/cjs/setCachingHeaders-ee619bdf.js +0 -12
- package/cjs/setCachingHeaders-ee619bdf.js.map +0 -1
- package/esm/App-986d0bc6.js.map +0 -1
- package/esm/login-508cac0f.js.map +0 -1
- package/esm/sagas-1f2b2aa0.js.map +0 -1
- package/esm/setCachingHeaders-d49060e1.js +0 -10
- package/esm/setCachingHeaders-d49060e1.js.map +0 -1
|
@@ -7,7 +7,7 @@ var actions = require('./actions-8dc9e8de.js');
|
|
|
7
7
|
var selectors = require('./selectors-656da4b7.js');
|
|
8
8
|
var mapJson = require('jsonpath-mapper');
|
|
9
9
|
var awaitToJs = require('await-to-js');
|
|
10
|
-
var
|
|
10
|
+
var JSCookie = require('js-cookie');
|
|
11
11
|
|
|
12
12
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
13
13
|
|
|
@@ -30,7 +30,7 @@ function _interopNamespace(e) {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
var mapJson__default = /*#__PURE__*/_interopDefaultLegacy(mapJson);
|
|
33
|
-
var
|
|
33
|
+
var JSCookie__default = /*#__PURE__*/_interopDefaultLegacy(JSCookie);
|
|
34
34
|
|
|
35
35
|
const findContentTypeMapping = (ContentTypeMappings, contentTypeId) => ContentTypeMappings.find(ct => ct.contentTypeID === contentTypeId);
|
|
36
36
|
|
|
@@ -101,16 +101,15 @@ const COOKIE_VALID_DAYS = 1; // 0 = Session cookie
|
|
|
101
101
|
// Override the default js-cookie conversion / encoding
|
|
102
102
|
// methods so the written values work with Contensis sites
|
|
103
103
|
|
|
104
|
-
const
|
|
104
|
+
const Cookies = JSCookie__default["default"].withConverter({
|
|
105
105
|
read: value => decodeURIComponent(value),
|
|
106
106
|
write: value => encodeURIComponent(value)
|
|
107
107
|
});
|
|
108
|
-
|
|
109
108
|
class CookieHelper {
|
|
110
109
|
static GetCookie(name) {
|
|
111
|
-
|
|
110
|
+
const cookie = Cookies.get(name);
|
|
112
111
|
|
|
113
|
-
if (typeof cookie
|
|
112
|
+
if (typeof cookie === 'undefined') {
|
|
114
113
|
return null;
|
|
115
114
|
}
|
|
116
115
|
|
|
@@ -118,13 +117,13 @@ class CookieHelper {
|
|
|
118
117
|
}
|
|
119
118
|
|
|
120
119
|
static SetCookie(name, value, maxAgeDays = COOKIE_VALID_DAYS) {
|
|
121
|
-
maxAgeDays === 0
|
|
120
|
+
if (maxAgeDays === 0) Cookies.set(name, value);else Cookies.set(name, value, {
|
|
122
121
|
expires: maxAgeDays
|
|
123
122
|
});
|
|
124
123
|
}
|
|
125
124
|
|
|
126
125
|
static DeleteCookie(name) {
|
|
127
|
-
|
|
126
|
+
Cookies.remove(name);
|
|
128
127
|
}
|
|
129
128
|
|
|
130
129
|
}
|
|
@@ -155,12 +154,10 @@ const createUserManager = async config => {
|
|
|
155
154
|
'oidc-client')); });
|
|
156
155
|
return new UserManager(config);
|
|
157
156
|
} catch (e) {
|
|
158
|
-
|
|
159
|
-
console.log('Exception in createUserManager: ', e);
|
|
157
|
+
console.error('Exception in createUserManager: ', e);
|
|
160
158
|
}
|
|
161
159
|
} else return {};
|
|
162
|
-
};
|
|
163
|
-
// export default userManager;
|
|
160
|
+
};
|
|
164
161
|
|
|
165
162
|
/* eslint-disable require-atomic-updates */
|
|
166
163
|
const LOGIN_COOKIE = 'ContensisCMSUserName';
|
|
@@ -429,16 +426,15 @@ class LoginHelper {
|
|
|
429
426
|
message: `Fetch credentials error: ${response.status} ${response.statusText}`
|
|
430
427
|
}];
|
|
431
428
|
}
|
|
432
|
-
}
|
|
429
|
+
} // static isZengentiStaff(email) {
|
|
430
|
+
// const emailRefs = ['@zengenti', '@contensis'];
|
|
431
|
+
// return emailRefs.some(emailRef => {
|
|
432
|
+
// if (email.includes(emailRef)) {
|
|
433
|
+
// return true;
|
|
434
|
+
// }
|
|
435
|
+
// });
|
|
436
|
+
// }
|
|
433
437
|
|
|
434
|
-
static isZengentiStaff(email) {
|
|
435
|
-
const emailRefs = ['@zengenti', '@contensis'];
|
|
436
|
-
return emailRefs.some(emailRef => {
|
|
437
|
-
if (email.includes(emailRef)) {
|
|
438
|
-
return true;
|
|
439
|
-
}
|
|
440
|
-
});
|
|
441
|
-
}
|
|
442
438
|
|
|
443
439
|
}
|
|
444
440
|
LoginHelper.CMS_URL = SERVERS.cms
|
|
@@ -655,4 +651,4 @@ exports.getManagementApiClient = getManagementApiClient;
|
|
|
655
651
|
exports.handleRequiresLoginSaga = handleRequiresLoginSaga;
|
|
656
652
|
exports.loginSagas = loginSagas;
|
|
657
653
|
exports.refreshSecurityToken = refreshSecurityToken;
|
|
658
|
-
//# sourceMappingURL=login-
|
|
654
|
+
//# sourceMappingURL=login-840860bc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-840860bc.js","sources":["../src/routing/util/find-contenttype-mapping.ts","../src/user/transformations/mapClientCredentials.js","../src/user/util/ContensisManagementApi.js","../src/user/util/CookieHelper.class.ts","../src/user/util/OidcUserManager.ts","../src/user/util/LoginHelper.class.js","../src/user/redux/sagas/login.js"],"sourcesContent":["import { ContentTypeMapping } from '../routes';\n\nexport const findContentTypeMapping = (\n ContentTypeMappings: ContentTypeMapping[],\n contentTypeId: string\n) => ContentTypeMappings.find(ct => ct.contentTypeID === contentTypeId);\n","import { mapJson } from '~/util/json-mapper';\n\nconst clientCredentials = {\n bearerToken: 'bearerToken',\n bearerTokenExpiryDate: ({ bearerTokenExpiryDate }) =>\n bearerTokenExpiryDate.toISOString(),\n refreshToken: 'refreshToken',\n refreshTokenExpiryDate: ({ refreshTokenExpiryDate }) =>\n refreshTokenExpiryDate.toISOString(),\n contensisClassicToken: 'contensisClassicToken',\n};\nexport default obj => mapJson(obj, clientCredentials);\n","// import { Client } from 'contensis-management-api';\n\nexport const getManagementApiClient = async ({\n bearerToken,\n bearerTokenExpiryDate,\n refreshToken,\n refreshTokenExpiryDate,\n contensisClassicToken,\n username,\n password,\n}) => {\n const rootUrl = SERVERS.api || SERVERS.cms; /* global SERVERS */\n const projectId = PROJECTS[0].id; /* global PROJECTS */\n\n let config = {};\n if (refreshToken) {\n config = {\n clientType: 'contensis_classic_refresh_token',\n clientDetails: {\n refreshToken,\n },\n };\n } else {\n config = {\n clientType: 'contensis_classic',\n clientDetails: {\n username,\n password,\n },\n };\n }\n const { Client } = await import('contensis-management-api');\n\n const client = Client.create({\n ...config,\n projectId,\n rootUrl,\n });\n\n if (bearerToken) client.bearerToken = bearerToken;\n if (bearerTokenExpiryDate)\n client.bearerTokenExpiryDate = bearerTokenExpiryDate;\n if (refreshToken) client.refreshToken = refreshToken;\n if (refreshTokenExpiryDate)\n client.refreshTokenExpiryDate = refreshTokenExpiryDate;\n if (contensisClassicToken)\n client.contensisClassicToken = contensisClassicToken;\n\n return client;\n};\n","import JSCookie from 'js-cookie';\n\nconst COOKIE_VALID_DAYS = 1; // 0 = Session cookie\n\n// Override the default js-cookie conversion / encoding\n// methods so the written values work with Contensis sites\nconst Cookies = JSCookie.withConverter({\n read: value => decodeURIComponent(value),\n write: value => encodeURIComponent(value),\n});\n\nexport class CookieHelper {\n static GetCookie(name) {\n const cookie = Cookies.get(name);\n if (typeof cookie === 'undefined') {\n return null;\n }\n return cookie;\n }\n\n static SetCookie(name, value, maxAgeDays = COOKIE_VALID_DAYS) {\n if (maxAgeDays === 0) Cookies.set(name, value);\n else Cookies.set(name, value, { expires: maxAgeDays });\n }\n\n static DeleteCookie(name) {\n Cookies.remove(name);\n }\n}\n","import { UserManagerSettings } from 'oidc-client';\n\nconst context = (\n typeof window != 'undefined' ? window : global\n) as typeof globalThis & {\n WSFED_LOGIN: string;\n};\n\nconst requireOidc =\n process.env.NODE_ENV === 'development'\n ? WSFED_LOGIN === 'true' /* global WSFED_LOGIN */\n : context.WSFED_LOGIN === 'true';\n\nconst servers = SERVERS; /* global SERVERS */\n\nexport const userManagerConfig =\n typeof window !== 'undefined'\n ? {\n authority: `${servers.cms}/authenticate/`,\n client_id: 'WebsiteAdfsClient',\n redirect_uri: window.location.toString(),\n post_logout_redirect_uri: window.location.toString(),\n response_type: 'id_token',\n scope: 'openid',\n filterProtocolClaims: false,\n }\n : {};\n\nexport const createUserManager = async (config: UserManagerSettings) => {\n if (typeof window !== 'undefined' && requireOidc) {\n try {\n const { UserManager } = await import(\n /* webpackChunkName: \"oidcclient\" */ 'oidc-client'\n );\n return new UserManager(config);\n } catch (e) {\n console.error('Exception in createUserManager: ', e);\n }\n } else return {};\n};\n","/* eslint-disable require-atomic-updates */\nimport { getManagementApiClient } from './ContensisManagementApi';\nimport { to } from 'await-to-js';\n\nimport { CookieHelper } from './CookieHelper.class';\n\nimport mapClientCredentials from '../transformations/mapClientCredentials';\nimport { createUserManager, userManagerConfig } from './OidcUserManager';\n\nconst LOGIN_COOKIE = 'ContensisCMSUserName';\nconst REFRESH_TOKEN_COOKIE = 'RefreshToken';\n\nconst context = typeof window != 'undefined' ? window : global;\n\nexport class LoginHelper {\n static CMS_URL = SERVERS.cms /* global SERVERS */;\n static WSFED_LOGIN =\n process.env.NODE_ENV === 'development'\n ? WSFED_LOGIN === 'true' /* global WSFED_LOGIN */\n : context.WSFED_LOGIN === 'true';\n static LOGIN_ROUTE = '/account/login';\n static ACCESS_DENIED_ROUTE = '/account/access-denied';\n\n static SetLoginCookies({ contensisClassicToken, refreshToken }) {\n console.info(\n 'SetLoginCookies:',\n LOGIN_COOKIE,\n contensisClassicToken,\n REFRESH_TOKEN_COOKIE,\n refreshToken\n );\n if (contensisClassicToken)\n CookieHelper.SetCookie(LOGIN_COOKIE, contensisClassicToken);\n if (refreshToken)\n CookieHelper.SetCookie(REFRESH_TOKEN_COOKIE, refreshToken);\n }\n\n static GetCachedCredentials() {\n return {\n bearerToken: null,\n bearerTokenExpiryDate: null,\n refreshToken: CookieHelper.GetCookie(REFRESH_TOKEN_COOKIE),\n refreshTokenExpiryDate: null,\n contensisClassicToken: CookieHelper.GetCookie(LOGIN_COOKIE),\n };\n }\n\n static ClearCachedCredentials() {\n CookieHelper.DeleteCookie(LOGIN_COOKIE);\n CookieHelper.DeleteCookie(REFRESH_TOKEN_COOKIE);\n\n if (LoginHelper.WSFED_LOGIN && typeof window !== 'undefined') {\n // remove any oidc keys left over in localStorage\n const { localStorage } = window;\n const keys = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (typeof key === 'string' && key.startsWith('oidc.'))\n keys.push(localStorage.key(i));\n }\n keys.forEach(key => localStorage.removeItem(key));\n }\n }\n\n static async LoginUser({ username, password, clientCredentials }) {\n let credentials = clientCredentials;\n let authenticationState = {\n clientCredentials: null,\n isAuthenticated: false,\n isAuthenticationError: false,\n isError: false,\n };\n let transientClient;\n let user;\n\n if (username && password) {\n // Get a management client with username and password\n transientClient = await getManagementApiClient({\n username,\n password,\n });\n\n // Ensure the client has requested a bearer token\n const [loginError, clientBearerToken] = await to(\n transientClient.ensureBearerToken()\n );\n\n // Problem getting token with username and password\n if (loginError) {\n authenticationState = {\n clientCredentials: null,\n errorMessage: loginError.message || null,\n isAuthenticated: false,\n isAuthenticationError: loginError.name.includes(\n 'ContensisAuthenticationError'\n ),\n isError: true,\n };\n LoginHelper.ClearCachedCredentials();\n }\n\n // Got a token using username and password\n if (clientBearerToken) {\n // Set credentials so we can continue to GetUserDetails\n credentials = mapClientCredentials(transientClient);\n LoginHelper.SetLoginCookies(credentials);\n authenticationState = {\n clientCredentials: credentials,\n isAuthenticated: true,\n isAuthenticationError: false,\n isError: false,\n };\n }\n }\n\n // If we have credentials supplied by a successful username and password login\n // or clientCredentials supplied in the options argument we can continue to\n // fetch the user's details\n if (credentials) {\n const client =\n transientClient || (await getManagementApiClient(credentials));\n const [error, userDetails] = await LoginHelper.GetUserDetails(client);\n\n if (error) {\n authenticationState = {\n clientCredentials: null,\n errorMessage: error.message,\n isAuthenticated: false,\n isAuthenticationError: false,\n isError: true,\n };\n LoginHelper.ClearCachedCredentials();\n } else {\n // Ensure we get latest refreshToken and contensisClassicToken from the latest client\n const latestCredentials = mapClientCredentials(client);\n LoginHelper.SetLoginCookies(latestCredentials);\n\n user = userDetails;\n authenticationState = {\n clientCredentials: latestCredentials,\n isAuthenticated: true,\n isAuthenticationError: false,\n isError: false,\n };\n }\n }\n\n return { authenticationState, user };\n }\n\n static GetUserDetails = async client => {\n let userError,\n groupsError,\n user = {},\n groupsResult;\n\n [userError, user] = await to(client.security.users.getCurrent());\n if (user && user.id) {\n [groupsError, groupsResult] = await to(\n client.security.users.getUserGroups({\n userId: user.id,\n includeInherited: true,\n })\n );\n // Set groups attribute in user object to be the items\n // array from the getUserGroups result\n if (groupsResult && groupsResult.items) user.groups = groupsResult.items;\n\n //If groups call fails then log the error but allow the user to login still\n // eslint-disable-next-line no-console\n if (groupsError) console.log(groupsError);\n }\n return [userError, user];\n };\n\n static LogoutUser(redirectPath) {\n LoginHelper.ClearCachedCredentials();\n if (LoginHelper.WSFED_LOGIN) {\n LoginHelper.WsFedLogout(redirectPath);\n } else {\n if (redirectPath) LoginHelper.ClientRedirectToPath(redirectPath);\n else LoginHelper.ClientRedirectToSignInPage();\n }\n }\n\n static ClientRedirectToHome(location) {\n if (typeof window != 'undefined') {\n let url = '/';\n if (location) {\n const { search, hash } = location;\n url = search ? `${url}${search}` : url;\n url = hash ? `${url}${hash}` : url;\n }\n window.location.href = url;\n }\n }\n\n static async ClientRedirectToSignInPage(redirectPath) {\n if (LoginHelper.WSFED_LOGIN) {\n await LoginHelper.WsFedLogout();\n await LoginHelper.WsFedLogin();\n } else {\n // Standard Contensis Login\n let url = LoginHelper.LOGIN_ROUTE;\n if (typeof redirectPath === 'string')\n url = `${url}?redirect_uri=${redirectPath}`;\n if (\n typeof location !== 'undefined' &&\n redirectPath !== LoginHelper.LOGIN_ROUTE\n )\n location.replace(url);\n }\n }\n\n static ClientRedirectToAccessDeniedPage(originalPath) {\n let url = LoginHelper.ACCESS_DENIED_ROUTE;\n if (originalPath === url) return;\n\n if (typeof originalPath === 'string')\n url = `${url}?original_uri=${originalPath}`;\n if (typeof location !== 'undefined') location.href = url;\n }\n\n static ClientRedirectToPath(redirectPath) {\n if (typeof redirectPath === 'string') {\n if (typeof location !== 'undefined') window.location.href = redirectPath;\n } else LoginHelper.ClientRedirectToHome();\n }\n\n static async WsFedLogin(redirectUri) {\n const userManager = await createUserManager(userManagerConfig);\n userManager.signinRedirect({\n scope: 'openid',\n response_type: 'id_token',\n redirect_uri: redirectUri || window.location.toString(),\n });\n }\n\n static RemoveSecurityTokenQuery() {\n const params = new URLSearchParams(window.location.search);\n if (params.has('securitytoken') || params.has('securityToken')) {\n params.delete('securitytoken');\n params.delete('securityToken');\n window.location = `${window.location.pathname}${\n params.toString() ? `?${params}` : ''\n }`;\n }\n }\n\n static async WsFedLogout(redirectPath) {\n await fetch(\n `${LoginHelper.CMS_URL}/authenticate/logout?jsonResponseRequired=true`,\n {\n credentials: 'include',\n }\n );\n if (redirectPath) {\n window.location = redirectPath;\n } else {\n // Explicitly check and remove any stale\n // security token that may be in the query string\n LoginHelper.RemoveSecurityTokenQuery();\n }\n }\n\n static async GetCredentialsForSecurityToken(securityToken) {\n const [error, response] = await to(\n fetch(`${LoginHelper.CMS_URL}/REST/Contensis/Security/IsAuthenticated`, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n securityToken: encodeURIComponent(securityToken),\n }),\n })\n );\n if (error) return [{ message: 'Failed to fetch credentials' }];\n if (response.ok) {\n const [parseError, body] = await to(response.json());\n if (parseError) return [parseError];\n\n const { LogonResult, ApplicationData = [] } = body;\n if (LogonResult !== 0) {\n return [\n { message: 'Security token is invalid', data: ApplicationData },\n ];\n }\n if (ApplicationData.length > 0) {\n let refreshToken;\n ApplicationData.forEach(item => {\n if (item.Key === 'ContensisSecurityRefreshToken')\n refreshToken = item.Value;\n });\n if (!refreshToken) {\n return [\n {\n message:\n 'Fetch credentials: Unable to find ContensisSecurityRefreshToken',\n },\n ];\n }\n return [undefined, refreshToken];\n } else {\n return [\n {\n message:\n 'Fetch credentials: Unable to find ContensisSecurityRefreshToken',\n },\n ];\n }\n } else {\n return [\n {\n message: `Fetch credentials error: ${response.status} ${response.statusText}`,\n },\n ];\n }\n }\n\n // static isZengentiStaff(email) {\n // const emailRefs = ['@zengenti', '@contensis'];\n\n // return emailRefs.some(emailRef => {\n // if (email.includes(emailRef)) {\n // return true;\n // }\n // });\n // }\n}\n","import { takeEvery, select, put, call } from 'redux-saga/effects';\nimport {\n SET_AUTHENTICATION_STATE,\n LOGIN_USER,\n LOGOUT_USER,\n VALIDATE_USER,\n} from '../types';\nimport {\n selectUserIsAuthenticated,\n selectClientCredentials,\n selectUserGroups,\n} from '../selectors';\n\nimport { setRoute } from '~/routing/redux/actions';\nimport { selectCurrentSearch } from '~/routing/redux/selectors';\nimport { findContentTypeMapping } from '~/routing/util/find-contenttype-mapping';\n\nimport mapClientCredentials from '~/user/transformations/mapClientCredentials';\n\nimport { getManagementApiClient } from '~/user/util/ContensisManagementApi';\nimport { LoginHelper } from '~/user/util/LoginHelper.class';\nimport { matchUserGroup } from '~/user/util/matchGroups';\nimport { queryParams } from '~/util/navigation';\n\nexport const loginSagas = [\n takeEvery(LOGIN_USER, loginUserSaga),\n takeEvery(LOGOUT_USER, logoutUserSaga),\n takeEvery(VALIDATE_USER, validateUserSaga),\n takeEvery(SET_AUTHENTICATION_STATE, redirectAfterSuccessfulLoginSaga),\n];\n\nexport function* handleRequiresLoginSaga(action) {\n const {\n entry,\n requireLogin,\n routes: { ContentTypeMappings },\n staticRoute,\n } = action;\n let userLoggedIn = yield select(selectUserIsAuthenticated);\n\n // Check for a securityToken in querystring\n const currentQs = queryParams(yield select(selectCurrentSearch));\n const securityToken = currentQs.securityToken || currentQs.securitytoken;\n\n // Check if any of the defined routes have \"requireLogin\" attribute\n const { requireLogin: authRoute } = (staticRoute && staticRoute.route) || {};\n const { requireLogin: authContentType } =\n (entry &&\n findContentTypeMapping(ContentTypeMappings, entry?.sys?.contentTypeId)) ||\n {};\n\n // If requireLogin, authRoute or authContentType has been specified as an\n // array of groups we can merge all the arrays and match on any group supplied\n const routeRequiresGroups = [\n ...((Array.isArray(authContentType) && authContentType) || []),\n ...((Array.isArray(authRoute) && authRoute) || []),\n ...((Array.isArray(requireLogin) && requireLogin) || []),\n ];\n const routeRequiresLogin = !!authContentType || !!authRoute || !!requireLogin;\n\n if (!userLoggedIn) {\n // If cookies or securityToken are found on any route change\n // always validate and login the user\n if (routeRequiresLogin) {\n // If routeRequiresLogin do a blocking call that returns userLoggedIn\n userLoggedIn = yield call(validateUserSaga, { securityToken });\n }\n // otherwise do a non blocking put to handle validation in the background\n else yield put({ type: VALIDATE_USER, securityToken });\n }\n\n if (routeRequiresLogin) {\n // If a security token is in the querystring and we are not already\n // logged in something is wrong and we won't bother going on another redirect loop\n if (!userLoggedIn && !securityToken) {\n LoginHelper.ClientRedirectToSignInPage(action.location.pathname);\n } else if (routeRequiresGroups.length > 0) {\n const userGroups = yield select(selectUserGroups, 'js');\n const groupMatch = matchUserGroup(userGroups, routeRequiresGroups);\n\n if (!groupMatch)\n LoginHelper.ClientRedirectToAccessDeniedPage(action.location.pathname);\n }\n }\n}\n\nfunction* validateUserSaga({ securityToken }) {\n // Check for refreshToken in cookies\n let clientCredentials = LoginHelper.GetCachedCredentials();\n\n if (securityToken || clientCredentials.refreshToken) {\n // We only attempt to validate the user if one of the stored\n // tokens are found, in this case we set loading state manually\n // so we don't need to set and unset loading if there are no stored\n yield put({\n type: SET_AUTHENTICATION_STATE,\n authenticationState: {\n isLoading: true,\n },\n });\n // If we have just a security token we will call a CMS endpoint\n // and provide us with a RefreshToken cookie we can use during login\n const [error, refreshToken] =\n yield LoginHelper.GetCredentialsForSecurityToken(securityToken);\n if (refreshToken) {\n // Set cookies and reload values\n LoginHelper.SetLoginCookies({\n contensisClassicToken: securityToken,\n refreshToken,\n });\n clientCredentials = LoginHelper.GetCachedCredentials();\n }\n\n // Log the user in if a refreshToken is found\n if (clientCredentials.refreshToken)\n yield call(loginUserSaga, { clientCredentials });\n else if (error)\n yield put({\n type: SET_AUTHENTICATION_STATE,\n authenticationState: {\n isError: true,\n errorMessage:\n error?.message ||\n (error && 'toString' in error && error.toString()),\n },\n });\n }\n\n // Tell any callers have we successfully logged in?\n return yield select(selectUserIsAuthenticated);\n}\n\nfunction* loginUserSaga(action = {}) {\n const { username, password, clientCredentials } = action;\n\n // If a WSFED_LOGIN site has dispatched the loginUser action\n // just redirect them to the Identity Provider sign in\n if (action.type === LOGIN_USER && LoginHelper.WSFED_LOGIN)\n LoginHelper.ClientRedirectToSignInPage();\n\n const { authenticationState, user } = yield LoginHelper.LoginUser({\n username,\n password,\n clientCredentials,\n });\n\n yield put({\n type: SET_AUTHENTICATION_STATE,\n authenticationState,\n user,\n });\n}\nconst removeHostnamePart = path => {\n // eslint-disable-next-line no-console\n console.log(path);\n const relativePath = '/' + path.split('/').splice(3).join('/');\n // eslint-disable-next-line no-console\n console.log(relativePath);\n return relativePath;\n};\n\nfunction* redirectAfterSuccessfulLoginSaga() {\n const isLoggedIn = yield select(selectUserIsAuthenticated);\n const { redirect_uri: redirectPath, ReturnURL: assetRedirectPath } =\n queryParams(yield select(selectCurrentSearch));\n\n if (isLoggedIn && assetRedirectPath && typeof window != 'undefined') {\n const path = removeHostnamePart(assetRedirectPath);\n // This has to be a hard href to get the app to\n // leave React and hit the server for the IIS hosted assets\n window.location.href = path;\n // yield put(setRoute(path)); // does not work in this scenario\n } else if (isLoggedIn && redirectPath) {\n yield put(setRoute(redirectPath));\n }\n}\n\nfunction* logoutUserSaga({ redirectPath }) {\n yield put({\n type: SET_AUTHENTICATION_STATE,\n user: null,\n });\n yield LoginHelper.LogoutUser(redirectPath);\n}\n\nexport function* refreshSecurityToken() {\n const clientCredentials = yield select(selectClientCredentials, 'js');\n if (Object.keys(clientCredentials).length > 0) {\n const client = yield getManagementApiClient(clientCredentials);\n yield client.authenticate();\n\n yield put({\n type: SET_AUTHENTICATION_STATE,\n authenticationState: {\n clientCredentials: mapClientCredentials(client),\n },\n });\n }\n}\n"],"names":["findContentTypeMapping","ContentTypeMappings","contentTypeId","find","ct","contentTypeID","clientCredentials","bearerToken","bearerTokenExpiryDate","toISOString","refreshToken","refreshTokenExpiryDate","contensisClassicToken","obj","mapJson","getManagementApiClient","username","password","rootUrl","SERVERS","api","cms","projectId","PROJECTS","id","config","clientType","clientDetails","Client","client","create","COOKIE_VALID_DAYS","Cookies","JSCookie","withConverter","read","value","decodeURIComponent","write","encodeURIComponent","CookieHelper","GetCookie","name","cookie","get","SetCookie","maxAgeDays","set","expires","DeleteCookie","remove","context","window","global","requireOidc","process","env","NODE_ENV","WSFED_LOGIN","servers","userManagerConfig","authority","client_id","redirect_uri","location","toString","post_logout_redirect_uri","response_type","scope","filterProtocolClaims","createUserManager","UserManager","e","console","error","LOGIN_COOKIE","REFRESH_TOKEN_COOKIE","LoginHelper","SetLoginCookies","info","GetCachedCredentials","ClearCachedCredentials","localStorage","keys","i","length","key","startsWith","push","forEach","removeItem","LoginUser","credentials","authenticationState","isAuthenticated","isAuthenticationError","isError","transientClient","user","loginError","clientBearerToken","to","ensureBearerToken","errorMessage","message","includes","mapClientCredentials","userDetails","GetUserDetails","latestCredentials","LogoutUser","redirectPath","WsFedLogout","ClientRedirectToPath","ClientRedirectToSignInPage","ClientRedirectToHome","url","search","hash","href","WsFedLogin","LOGIN_ROUTE","replace","ClientRedirectToAccessDeniedPage","originalPath","ACCESS_DENIED_ROUTE","redirectUri","userManager","signinRedirect","RemoveSecurityTokenQuery","params","URLSearchParams","has","delete","pathname","fetch","CMS_URL","GetCredentialsForSecurityToken","securityToken","response","method","headers","Accept","body","JSON","stringify","ok","parseError","json","LogonResult","ApplicationData","data","item","Key","Value","undefined","status","statusText","userError","groupsError","groupsResult","security","users","getCurrent","getUserGroups","userId","includeInherited","items","groups","log","loginSagas","takeEvery","LOGIN_USER","loginUserSaga","LOGOUT_USER","logoutUserSaga","VALIDATE_USER","validateUserSaga","SET_AUTHENTICATION_STATE","redirectAfterSuccessfulLoginSaga","handleRequiresLoginSaga","action","entry","requireLogin","routes","staticRoute","userLoggedIn","select","selectUserIsAuthenticated","currentQs","queryParams","selectCurrentSearch","securitytoken","authRoute","route","authContentType","sys","routeRequiresGroups","Array","isArray","routeRequiresLogin","call","put","type","userGroups","selectUserGroups","groupMatch","matchUserGroup","isLoading","removeHostnamePart","path","relativePath","split","splice","join","isLoggedIn","ReturnURL","assetRedirectPath","setRoute","refreshSecurityToken","selectClientCredentials","Object","authenticate"],"mappings":"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"}
|
|
@@ -715,7 +715,13 @@ const callCustomApi = async (customApi, filters) => {
|
|
|
715
715
|
const apiUri = customApi.uri || '';
|
|
716
716
|
let uri = buildUrl(apiUri, filters);
|
|
717
717
|
if (!uri) throw new Error('uri is required to use customApi');
|
|
718
|
-
|
|
718
|
+
|
|
719
|
+
if (typeof window == 'undefined') {
|
|
720
|
+
if (!uri.startsWith('http')) uri = `http://localhost:3001${uri}`;
|
|
721
|
+
const response = await fetch(uri);
|
|
722
|
+
return await response.json();
|
|
723
|
+
}
|
|
724
|
+
|
|
719
725
|
const response = await cachedSearch.fetch(uri);
|
|
720
726
|
return await response.clone().json();
|
|
721
727
|
};
|
|
@@ -755,39 +761,52 @@ const areArraysEqualSets = (a1, a2) => {
|
|
|
755
761
|
const searchUriTemplate = {
|
|
756
762
|
path: ({
|
|
757
763
|
state,
|
|
758
|
-
facet
|
|
759
|
-
pageIndex
|
|
764
|
+
facet
|
|
760
765
|
}) => {
|
|
761
|
-
const
|
|
766
|
+
const context = getSearchContext(state);
|
|
762
767
|
const currentPath = selectCurrentPath(state) || '/search';
|
|
763
|
-
|
|
764
|
-
if (
|
|
765
|
-
|
|
768
|
+
|
|
769
|
+
if (context !== 'listings') {
|
|
770
|
+
const currentFacet = facet || getCurrentFacet(state);
|
|
771
|
+
const filters = getSelectedFilters(state, facet, context);
|
|
772
|
+
const currentFilter = filters.contentTypeId; // Check if we have a filter first
|
|
773
|
+
|
|
774
|
+
const newPath = (currentFilter === null || currentFilter === void 0 ? void 0 : currentFilter.length) > 0 && currentFacet ? `${currentPath}/${currentFacet}/${currentFilter}` : currentFacet ? `${currentPath}/${currentFacet}` : currentPath;
|
|
775
|
+
return newPath;
|
|
776
|
+
} else {
|
|
777
|
+
return currentPath;
|
|
778
|
+
}
|
|
766
779
|
},
|
|
767
780
|
search: ({
|
|
768
781
|
state,
|
|
769
782
|
facet,
|
|
770
783
|
orderBy,
|
|
771
|
-
term
|
|
784
|
+
term,
|
|
785
|
+
pageIndex
|
|
772
786
|
}) => {
|
|
773
787
|
const searchContext = getSearchContext(state); // Lose stateFilters and currentSearch if a new
|
|
774
788
|
// term is passed via an argument
|
|
775
789
|
|
|
776
|
-
const stateFilters = term ? {} : Object.fromEntries(Object.entries(getSelectedFilters(state, facet, searchContext
|
|
790
|
+
const stateFilters = term ? {} : Object.fromEntries(Object.entries(getSelectedFilters(state, facet, searchContext)).map(([k, f]) => [k, f.join(',')]));
|
|
777
791
|
const currentSearch = !term && getImmutableOrJS(state, ['routing', 'location', 'search']);
|
|
778
792
|
const currentQs = removeEmptyAttributes(queryString.parse(currentSearch));
|
|
779
793
|
if (orderBy) currentQs.orderBy = orderBy;
|
|
780
|
-
const searchTerm = getSearchTerm(state); //
|
|
794
|
+
const searchTerm = getSearchTerm(state); // Use Immutable's merge to merge the stateFilters with any current Qs
|
|
795
|
+
// to build the new Qs.
|
|
796
|
+
|
|
797
|
+
const mergedSearch = removeEmptyAttributes(merge__default["default"](currentQs, stateFilters));
|
|
798
|
+
if (searchTerm) mergedSearch.term = searchTerm;
|
|
799
|
+
if (pageIndex) mergedSearch.pageIndex = pageIndex + 1;
|
|
800
|
+
if (pageIndex === 0) mergedSearch.pageIndex = undefined; // We don't want these as search params in the url, we just need the search package to see them
|
|
781
801
|
|
|
782
|
-
const mergedSearch = removeEmptyAttributes({ ...merge__default["default"](currentQs, stateFilters),
|
|
783
|
-
term: searchTerm
|
|
784
|
-
});
|
|
785
802
|
return queryString.stringify(mergedSearch);
|
|
786
803
|
},
|
|
787
|
-
hash:
|
|
804
|
+
hash: ({
|
|
805
|
+
state
|
|
806
|
+
}) => getImmutableOrJS(state, ['routing', 'location', 'hash'], '').replace('#', '')
|
|
788
807
|
};
|
|
789
808
|
|
|
790
|
-
const mapStateToSearchUri =
|
|
809
|
+
const mapStateToSearchUri = state => mapJson__default["default"](state, searchUriTemplate);
|
|
791
810
|
|
|
792
811
|
const DataFormats = {
|
|
793
812
|
asset: 'asset',
|
|
@@ -819,13 +838,13 @@ const Fields = {
|
|
|
819
838
|
wildcard: '*'
|
|
820
839
|
};
|
|
821
840
|
|
|
822
|
-
const fieldExpression = (field, value, operator = 'equalTo', weight) => {
|
|
841
|
+
const fieldExpression = (field, value, operator = 'equalTo', weight, fuzzySearch = false) => {
|
|
823
842
|
if (!field || !value || Array.isArray(value) && value.length === 0) return [];
|
|
824
843
|
if (Array.isArray(field)) // If an array of fieldIds have been provided, call self for each fieldId
|
|
825
844
|
// to generate expressions that are combined with an 'or' operator
|
|
826
|
-
return [contensisCoreApi.Op.or(...field.map(fieldId => fieldExpression(fieldId, value, operator, weight)).flat())];
|
|
845
|
+
return [contensisCoreApi.Op.or(...field.map(fieldId => fieldExpression(fieldId, value, operator, weight, fuzzySearch)).flat())];
|
|
827
846
|
if (operator === 'between') return between(field, value);
|
|
828
|
-
if (Array.isArray(value)) return equalToOrIn(field, value, operator);else return !weight ? equalToOrIn(field, value, operator) : [equalToOrIn(field, value, operator)[0].weight(weight)];
|
|
847
|
+
if (Array.isArray(value)) return equalToOrIn(field, value, operator, fuzzySearch);else return !weight ? equalToOrIn(field, value, operator, fuzzySearch) : [equalToOrIn(field, value, operator, fuzzySearch)[0].weight(weight)];
|
|
829
848
|
};
|
|
830
849
|
const contentTypeIdExpression = (contentTypeIds, webpageTemplates, assetTypes) => {
|
|
831
850
|
const expressions = [];
|
|
@@ -941,7 +960,7 @@ const orderByExpression = orderBy => {
|
|
|
941
960
|
return expression;
|
|
942
961
|
};
|
|
943
962
|
|
|
944
|
-
const equalToOrIn = (field, value, operator = 'equalTo') => {
|
|
963
|
+
const equalToOrIn = (field, value, operator = 'equalTo', fuzzySearch = false) => {
|
|
945
964
|
if (value.length === 0) return [];
|
|
946
965
|
|
|
947
966
|
if (Array.isArray(value)) {
|
|
@@ -961,7 +980,7 @@ const equalToOrIn = (field, value, operator = 'equalTo') => {
|
|
|
961
980
|
|
|
962
981
|
case 'freeText':
|
|
963
982
|
// TODO: Potentially needs further implementation of new options
|
|
964
|
-
return contensisCoreApi.Op[operator](field, innerValue,
|
|
983
|
+
return contensisCoreApi.Op[operator](field, innerValue, fuzzySearch, undefined);
|
|
965
984
|
|
|
966
985
|
default:
|
|
967
986
|
return contensisCoreApi.Op[operator](field, innerValue);
|
|
@@ -979,7 +998,7 @@ const equalToOrIn = (field, value, operator = 'equalTo') => {
|
|
|
979
998
|
|
|
980
999
|
case 'freeText':
|
|
981
1000
|
// TODO: Potentially needs further implementation of new options
|
|
982
|
-
return [contensisCoreApi.Op.freeText(field, value,
|
|
1001
|
+
return [contensisCoreApi.Op.freeText(field, value, fuzzySearch, undefined)];
|
|
983
1002
|
|
|
984
1003
|
default:
|
|
985
1004
|
return [contensisCoreApi.Op[operator](field, value)];
|
|
@@ -1085,7 +1104,7 @@ const customWhereExpressions = where => {
|
|
|
1085
1104
|
|
|
1086
1105
|
const makeJsExpression = (operator, field, value) => operator === 'freeText' || operator === 'contains' ? contensisCoreApi.Op[operator](field, value) : operator === 'in' ? contensisCoreApi.Op[operator](field, ...value) : operator === 'exists' ? contensisCoreApi.Op[operator](field, value) : operator === 'between' ? contensisCoreApi.Op[operator](field, value[0], value[1]) : operator === 'distanceWithin' ? contensisCoreApi.Op[operator](field, value === null || value === void 0 ? void 0 : value.lat, value === null || value === void 0 ? void 0 : value.lon, value === null || value === void 0 ? void 0 : value.distance) : contensisCoreApi.Op[operator](field, value);
|
|
1087
1106
|
|
|
1088
|
-
const termExpressions = (searchTerm, weightedSearchFields) => {
|
|
1107
|
+
const termExpressions = (searchTerm, weightedSearchFields, fuzzySearch) => {
|
|
1089
1108
|
if (searchTerm && weightedSearchFields && weightedSearchFields.length > 0) {
|
|
1090
1109
|
// Extract any phrases in quotes to array
|
|
1091
1110
|
const quotedPhrases = extractQuotedPhrases(searchTerm); // Modify the search term to remove any quoted phrases to leave any remaining terms
|
|
@@ -1097,7 +1116,7 @@ const termExpressions = (searchTerm, weightedSearchFields) => {
|
|
|
1097
1116
|
|
|
1098
1117
|
const containsOp = (f, term) => fieldExpression(f.fieldId, fixFreeTextForElastic(term), 'contains', f.weight);
|
|
1099
1118
|
|
|
1100
|
-
const freeTextOp = (f, term) => fieldExpression(f.fieldId, fixFreeTextForElastic(term), 'freeText', f.weight); // For each weighted search field
|
|
1119
|
+
const freeTextOp = (f, term) => fieldExpression(f.fieldId, fixFreeTextForElastic(term), 'freeText', f.weight, fuzzySearch); // For each weighted search field
|
|
1101
1120
|
|
|
1102
1121
|
|
|
1103
1122
|
weightedSearchFields.forEach(wsf => {
|
|
@@ -1128,11 +1147,11 @@ const termExpressions = (searchTerm, weightedSearchFields) => {
|
|
|
1128
1147
|
}
|
|
1129
1148
|
}); // Wrap operators in an Or operator
|
|
1130
1149
|
|
|
1131
|
-
return [contensisCoreApi.Op.or().addRange(operators).add(contensisCoreApi.Op.freeText(Fields.searchContent, searchTerm))];
|
|
1150
|
+
return [contensisCoreApi.Op.or().addRange(operators).add(contensisCoreApi.Op.freeText(Fields.searchContent, searchTerm, fuzzySearch))];
|
|
1132
1151
|
} else if (searchTerm) {
|
|
1133
1152
|
// Searching without weightedSearchFields defined will fall back
|
|
1134
1153
|
// to a default set of search fields with arbritary weights set.
|
|
1135
|
-
return [contensisCoreApi.Op.or(contensisCoreApi.Op.equalTo(Fields.entryTitle, searchTerm).weight(10), contensisCoreApi.Op.freeText(Fields.entryTitle, searchTerm).weight(2), contensisCoreApi.Op.freeText(Fields.entryDescription, searchTerm).weight(2), contensisCoreApi.Op.contains(Fields.keywords, searchTerm).weight(2), contensisCoreApi.Op.contains(Fields.sys.uri, searchTerm).weight(2), contensisCoreApi.Op.contains(Fields.sys.allUris, searchTerm), contensisCoreApi.Op.freeText(Fields.searchContent, searchTerm))];
|
|
1154
|
+
return [contensisCoreApi.Op.or(contensisCoreApi.Op.equalTo(Fields.entryTitle, searchTerm).weight(10), contensisCoreApi.Op.freeText(Fields.entryTitle, searchTerm, fuzzySearch).weight(2), contensisCoreApi.Op.freeText(Fields.entryDescription, searchTerm, fuzzySearch).weight(2), contensisCoreApi.Op.contains(Fields.keywords, searchTerm).weight(2), contensisCoreApi.Op.contains(Fields.sys.uri, searchTerm).weight(2), contensisCoreApi.Op.contains(Fields.sys.allUris, searchTerm), contensisCoreApi.Op.freeText(Fields.searchContent, searchTerm, fuzzySearch))];
|
|
1136
1155
|
} else {
|
|
1137
1156
|
return [];
|
|
1138
1157
|
}
|
|
@@ -1170,6 +1189,7 @@ const searchQuery = ({
|
|
|
1170
1189
|
featuredResults,
|
|
1171
1190
|
fields,
|
|
1172
1191
|
filters,
|
|
1192
|
+
fuzzySearch,
|
|
1173
1193
|
includeInSearchFields,
|
|
1174
1194
|
languages,
|
|
1175
1195
|
pageSize,
|
|
@@ -1180,7 +1200,7 @@ const searchQuery = ({
|
|
|
1180
1200
|
webpageTemplates,
|
|
1181
1201
|
weightedSearchFields
|
|
1182
1202
|
}, isFeatured = false) => {
|
|
1183
|
-
let expressions = [...termExpressions(searchTerm, weightedSearchFields), ...defaultExpressions(versionStatus), ...includeInSearchExpressions(webpageTemplates, includeInSearchFields), ...languagesExpression(languages), ...customWhereExpressions(customWhere), ...excludeIdsExpression(excludeIds)];
|
|
1203
|
+
let expressions = [...termExpressions(searchTerm, weightedSearchFields, fuzzySearch), ...defaultExpressions(versionStatus), ...includeInSearchExpressions(webpageTemplates, includeInSearchFields), ...languagesExpression(languages), ...customWhereExpressions(customWhere), ...excludeIdsExpression(excludeIds)];
|
|
1184
1204
|
if (isFeatured) expressions = [...expressions, ...featuredResultsExpression(featuredResults)];
|
|
1185
1205
|
if (!isFeatured || featuredResults && !featuredResults.contentTypeId) expressions = [...expressions, ...filterExpressions(filters), ...contentTypeIdExpression(contentTypeIds, webpageTemplates, assetTypes)];
|
|
1186
1206
|
const query = new contensisCoreApi.Query(...expressions);
|
|
@@ -1408,6 +1428,7 @@ const queryParamsTemplate = {
|
|
|
1408
1428
|
const filterParams = mapFiltersToFilterExpression(stateFilters, selectedFilters);
|
|
1409
1429
|
return filterParams;
|
|
1410
1430
|
},
|
|
1431
|
+
fuzzySearch: root => getQueryParameter(root, 'fuzzySearch', false),
|
|
1411
1432
|
includeInSearchFields: root => getQueryParameter(root, 'includeInSearch', []),
|
|
1412
1433
|
internalPageIndex: ({
|
|
1413
1434
|
action,
|
|
@@ -2087,4 +2108,4 @@ exports.updateSearchTerm = updateSearchTerm$1;
|
|
|
2087
2108
|
exports.updateSelectedFilters = updateSelectedFilters;
|
|
2088
2109
|
exports.updateSortOrder = updateSortOrder$1;
|
|
2089
2110
|
exports.withMappers = withMappers;
|
|
2090
|
-
//# sourceMappingURL=sagas-
|
|
2111
|
+
//# sourceMappingURL=sagas-67df1936.js.map
|