diff --git a/package.json b/package.json index 4d321b99b11d432c3d010d81b125e961dd6ed9ad..35896fc2e4c12746ad39ae1f8990037056fbb20f 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "workspaces": [ "packages/ui-core", "packages/ui-express", + "packages/i18n", "packages/electron" ], "devDependencies": { diff --git a/packages/ui-core/i18next-scanner.config.js b/packages/i18n/i18next-scanner.config.js similarity index 100% rename from packages/ui-core/i18next-scanner.config.js rename to packages/i18n/i18next-scanner.config.js diff --git a/packages/i18n/locales/en/common.json b/packages/i18n/locales/en/common.json new file mode 100644 index 0000000000000000000000000000000000000000..01a5a09bd5216019b3c8f1dff757039c0e97f722 --- /dev/null +++ b/packages/i18n/locales/en/common.json @@ -0,0 +1,8 @@ +{ + "action": { + "submit": null + }, + "label": { + "loadingData": "Loading data..." + } +} diff --git a/packages/i18n/locales/en/translations.json b/packages/i18n/locales/en/translations.json new file mode 100644 index 0000000000000000000000000000000000000000..b822698d46897384eed1e89932840d3528debc37 --- /dev/null +++ b/packages/i18n/locales/en/translations.json @@ -0,0 +1,14 @@ +{ + "user": { + "public": { + "form": { + "login": { + "label": { + "password": null, + "username": null + } + } + } + } + } +} diff --git a/packages/i18n/package.json b/packages/i18n/package.json new file mode 100644 index 0000000000000000000000000000000000000000..d6650749f2e1a840db14682de23b5663d8c98856 --- /dev/null +++ b/packages/i18n/package.json @@ -0,0 +1,62 @@ +{ + "name": "@grin-global/i18n", + "version": "0.0.1", + "license": "Apache-2.0", + "scripts": { + "precompile": "yarn run i18n:generateI18n", + "i18n:generateI18n": "node src/generateI18n.ts", + "i18n:scanI18nDuplicates": "ts-node src/duplicateDetector.ts", + "i18n:i18nscan": "i18next-scanner --config i18next-scanner.config.js '../**/src/**/*.tsx'" + }, + "dependencies": { + "@grin-global/ui-core": "file:../ui-core", + "axios": "^0.19.2", + "i18next": "^19.0.3", + "i18next-browser-languagedetector": "^4.0.1", + "i18next-express-middleware": "^1.9.1", + "i18next-sync-fs-backend": "^1.1.1", + "i18next-xhr-backend": "^3.2.2" + }, + "devDependencies": { + "@babel/cli": "^7.8.4", + "@babel/core": "^7.8.4", + "@types/enzyme": "^3.10.5", + "@types/jest": "^25.1.2", + "@types/react": "16.9.19", + "@types/react-router": "5.1.4", + "@types/react-router-dom": "5.1.3", + "@types/redux-form": "8.2.0", + "@types/webpack-env": "^1.15.1", + "@typescript-eslint/eslint-plugin": "^2.17.0", + "@typescript-eslint/eslint-plugin-tslint": "^2.17.0", + "@typescript-eslint/parser": "^2.18.0", + "awesome-typescript-loader": "^5.2.1", + "babel-eslint": "^10.0.3", + "babel-plugin-module-resolver": "^4.0.0", + "babel-plugin-react-transform": "^3.0.0", + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0", + "babel-plugin-transform-runtime": "^6.23.0", + "babel-polyfill": "^6.26.0", + "babel-preset-env": "^1.7.0", + "babel-preset-react": "^6.24.1", + "babel-preset-typescript": "^7.0.0-alpha.19", + "eslint": "^6.8.0", + "eslint-config-airbnb": "^18.0.1", + "eslint-config-prettier": "^6.10.0", + "eslint-loader": "^3.0.3", + "eslint-plugin-import": "^2.20.0", + "eslint-plugin-jsx-a11y": "^6.2.3", + "eslint-plugin-prefer-arrow": "^1.1.7", + "eslint-plugin-react": "^7.18.0", + "file-system": "^2.2.2", + "i18next-scanner": "^2.10.3", + "lerna": "^3.20.2", + "rimraf": "^3.0.1", + "ts-node": "^8.6.2", + "tslint": "^6.0.0", + "tslint-loader": "^3.5.4", + "tslint-react": "^4.2.0", + "typescript": "^3.7.5" + } +} diff --git a/packages/ui-core/src/core/data/Languages.ts b/packages/i18n/src/data/Languages.ts similarity index 100% rename from packages/ui-core/src/core/data/Languages.ts rename to packages/i18n/src/data/Languages.ts diff --git a/packages/ui-core/src/i18n/detectLocaleFromPath.ts b/packages/i18n/src/detectLocaleFromPath.ts similarity index 90% rename from packages/ui-core/src/i18n/detectLocaleFromPath.ts rename to packages/i18n/src/detectLocaleFromPath.ts index eafe4f9f3b6b400c0a45e300e12c9750121b8053..cb4b906f33dcb07ebdaa5ada76e63f6b325aabf8 100644 --- a/packages/ui-core/src/i18n/detectLocaleFromPath.ts +++ b/packages/i18n/src/detectLocaleFromPath.ts @@ -1,4 +1,4 @@ -import languages from '@/core/data/Languages'; +import languages from '@grin-global/i18n/data/Languages'; export default function detectLocaleFromPath(virtualPath: string, path: string, index: number) { if (virtualPath && path.startsWith(virtualPath)) { diff --git a/packages/ui-core/src/i18n/duplicateDetector.ts b/packages/i18n/src/duplicateDetector.ts similarity index 96% rename from packages/ui-core/src/i18n/duplicateDetector.ts rename to packages/i18n/src/duplicateDetector.ts index 63dc429d3ff04b6b16ea5296733cc6423fedc4c6..57e8a4dd793dddc70cbb2cede90f8b6648f0961e 100644 --- a/packages/ui-core/src/i18n/duplicateDetector.ts +++ b/packages/i18n/src/duplicateDetector.ts @@ -25,7 +25,7 @@ const duplicates = new Map(); async function main() { console.log('Running...'); - const dupes = fastGlob(['./locales/en/common.json', './src/**/translations.json', './src/translations.json']) + const dupes = fastGlob(['./locales/en/common.json', '../../**/src/**/translations.json', '../../**/src/translations.json']) .then((paths) => paths.map((path) => testFile(path))); console.log('Awawiting results...', dupes); diff --git a/packages/ui-core/src/i18n/generateI18n.ts b/packages/i18n/src/generateI18n.ts similarity index 96% rename from packages/ui-core/src/i18n/generateI18n.ts rename to packages/i18n/src/generateI18n.ts index 88d09e21320bc01da0ff1a860825d3a8c1dafa38..2f8190e2af26e7d8706a7b6fa5984f1722b166c3 100644 --- a/packages/ui-core/src/i18n/generateI18n.ts +++ b/packages/i18n/src/generateI18n.ts @@ -6,8 +6,8 @@ const mkdirp = require('mkdirp'); const rimraf = require('rimraf'); const getPrefix = (path) => path.substring(path.indexOf('./src/') + './src/'.length, path.indexOf('/translations.json')); - -fg(['./src/**/translations.json', './src/translations.json']) +// TODO fix generated paths +fg(['../../**/src/**/translations.json', '../../**/src/translations.json']) .then((entries) => entries.sort((a, b) => getPrefix(a).localeCompare(getPrefix(b)))) .then((entries) => { let result = {}; diff --git a/packages/ui-core/src/i18n/i18n-client.ts b/packages/i18n/src/i18n-client.ts similarity index 91% rename from packages/ui-core/src/i18n/i18n-client.ts rename to packages/i18n/src/i18n-client.ts index 29025a3108cf469051c18c8486a7c0309eb38477..15e41fbd8e9e9fcd37fe0992df7e8a50a1ffb4f3 100644 --- a/packages/ui-core/src/i18n/i18n-client.ts +++ b/packages/i18n/src/i18n-client.ts @@ -2,9 +2,9 @@ import i18n from 'i18next'; import axios from 'axios'; // eslint-disable-next-line no-restricted-imports -import optionsBase from '@/i18n/options-base'; +import optionsBase from '@grin-global/i18n/options-base'; // eslint-disable-next-line no-restricted-imports -import langDetector from '@/i18n/langDetector'; +import langDetector from '@grin-global/i18n/langDetector'; import XHR from 'i18next-xhr-backend'; import LanguageDetector from 'i18next-browser-languagedetector'; diff --git a/packages/ui-core/src/i18n/i18n-server.ts b/packages/i18n/src/i18n-server.ts similarity index 93% rename from packages/ui-core/src/i18n/i18n-server.ts rename to packages/i18n/src/i18n-server.ts index fdd88df83fe9d1d53f64a8b6aa2c958ae00f7f2b..3362cf50570364ebe479fb63742503e223a5a913 100644 --- a/packages/ui-core/src/i18n/i18n-server.ts +++ b/packages/i18n/src/i18n-server.ts @@ -1,7 +1,7 @@ // @ts-ignore import i18n from 'i18next'; import * as path from 'path'; -import optionsBase from '@/i18n/options-base'; +import optionsBase from '@grin-global/i18n/options-base'; import Backend from 'i18next-sync-fs-backend'; import { initReactI18next } from 'react-i18next'; diff --git a/packages/ui-core/src/i18n/langDetector.ts b/packages/i18n/src/langDetector.ts similarity index 84% rename from packages/ui-core/src/i18n/langDetector.ts rename to packages/i18n/src/langDetector.ts index 7b0ee537ae7e9e1516c06d4127a4e987c163d260..3b58da1a48cf476ece11613edb36bdce0119d64a 100644 --- a/packages/ui-core/src/i18n/langDetector.ts +++ b/packages/i18n/src/langDetector.ts @@ -1,4 +1,4 @@ -import detectLocaleFromPath from '@/i18n/detectLocaleFromPath'; +import detectLocaleFromPath from '@grin-global/i18n/detectLocaleFromPath'; export default { name: 'catalogLangDetector', diff --git a/packages/ui-core/src/i18n/options-base.ts b/packages/i18n/src/options-base.ts similarity index 100% rename from packages/ui-core/src/i18n/options-base.ts rename to packages/i18n/src/options-base.ts diff --git a/packages/i18n/tsconfig.json b/packages/i18n/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..899a3fab78a4bcdbe8a738ca221fb21c107371dd --- /dev/null +++ b/packages/i18n/tsconfig.json @@ -0,0 +1,42 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "*": [ + "*", + "src/*", + "server/*", + "node_modules/*" + ], + "@grin-global/ui-core/*": [ + "../ui-core/*", + "../ui-core/src/*" + ], + "@grin-global/i18n/*": [ + "../i18n/src/*" + ] + }, + "outDir": "../../target", + "module": "esnext", + "target": "esnext", + "sourceMap": false, + "inlineSourceMap": true, + "experimentalDecorators": false, + "noUnusedParameters": false, + "noUnusedLocals": true, + "jsx": "react", + "moduleResolution": "node", + "importHelpers": true, + "types": [ + "node", + "webpack-env" + ] + }, + "exclude": [ + "node_modules", + "build", + "typings/main", + "typings/main.d.ts" + ] +} diff --git a/packages/ui-core/locales/en/common.json b/packages/ui-core/locales/en/common.json deleted file mode 100644 index a38c80231cff5266130f31bd88302290c45ba3d8..0000000000000000000000000000000000000000 --- a/packages/ui-core/locales/en/common.json +++ /dev/null @@ -1,167 +0,0 @@ -{ - "action": { - "OK": "OK", - "acceptAndPublish": "ACCEPT AND PUBLISH", - "add": "Add {{what, lowercase}}", - "applyFilters": "Apply filters", - "approve": "Approve", - "back": "Back", - "backTo": "Back to {{where, lowercase}}", - "backToDashboard": "Back to dashboard", - "backToList": "Back to list", - "cancel": "Cancel", - "clear": "Clear", - "close": "Close", - "collapse": "Collapse", - "confirm": "Confirm", - "copiedToClipboard": "Copied to clipboard", - "copyToClipboard": "Copy to clipboard", - "create": "Create", - "createNewVersion": "Create new version", - "delete": "Delete", - "deleteData": "Delete data", - "download": "Download", - "edit": "Edit", - "login": "Login", - "logout": "Logout", - "manage": "Manage", - "nextStep": "Next step", - "openSidebar": "Open sidebar", - "publish": "Publish", - "read": "Read", - "reject": "Reject", - "remove": "Remove {{what}}", - "reset": "Reset", - "return": "Return", - "save": "Save", - "saveChanges": "Save changes", - "search": "Search", - "sendToReview": "Send to review", - "show": "Show", - "un-publish": "Un-publish", - "unpublish": "Unpublish", - "view": "View", - "viewDetails": "View details", - "write": "Write" - }, - "csv": { - "autoDetect": "Auto-detect ", - "autoDetectLabel": "Auto-detect CSV settings", - "comma": "Comma", - "configuration": "CSV configuration", - "escapeCharacter": "Escape character", - "other": "Other", - "quoteCharacter": "Quote character", - "semicolon": "Semicolon", - "separator": "Separator character", - "space": "Space", - "tab": "Tab", - "typeYourEscapeCharacter": "Type your escape character", - "typeYourQuoteCharacter": "Type your quote character", - "typeYourSeparator": "Type your separator" - }, - "f": { - "NOTNULL": "Either", - "NULL": "Not provided", - "createdDate": "Created on", - "dataExists": "Data exists", - "dataNotProvided": "Data not provided", - "dateSearch": "Date search", - "dontCare": "Don't use filter", - "fromIncluding": "At least (min)", - "keyword": "Keyword search", - "lastModifiedDate": "Last modified", - "lastReminderDate": "Last reminder", - "noFilters": "No available filters", - "suggestedFilters": "Suggested filters", - "textSearch": "Text search", - "toIncluding": "At most (max)" - }, - "fileUploader": { - "chooseFiles": "Choose files to upload", - "dragFiles": "Drag files here \n or", - "release": "Release to upload" - }, - "label": { - "UUID": "UUID", - "allRightsReserved": "All rights reserved", - "andMore": "And {{otherMore, number}} more", - "availableToRegistered": "Available to registered users only", - "basicMarkdown": "Basic markdown supported", - "created": "Created", - "createdBy": "Created by {{who}}", - "createdDate": "Created date", - "dateNotProvided": "Date not provided", - "deleteDescription": "Deleting this will remove all related data.", - "description": "Description", - "editMarkdown": "Edit Markdown", - "either": "Either", - "enabled": "Enabled", - "errorHappen": "Error happened while processing request", - "false": "False", - "filters": "Filters", - "from": "From", - "fullMarkdown": "Full markdown supported", - "here": "here", - "item": "Item", - "item_plural": "Items", - "itemEditorWarn": "Don't use the ItemsEditor for more than 100 items!", - "lastModified": "Last modified", - "lastUpdated": "Last updated", - "lastUpdatedBy": "Last updated by {{who}}", - "list": "List", - "list_plural": "Lists", - "loading": "Loading {{what}}", - "loadingData": "Loading data...", - "missing": "Not specified", - "modified": "Modified", - "name": "Name", - "newVersionAvailable": "New version available", - "no": "No", - "noChanges": "No changes yet", - "noValue": "No value", - "nothingMatchesYourRequest": "Nothing matches your request", - "notApplicable": "N/A", - "notSpecified": "Not specified", - "other": "Other", - "prettyNumber": "{{value, number}}", - "previewMarkdown": "Preview markdown", - "registered": "Registered", - "saved": "Saved", - "sortBy": "Sort By", - "status": "Status", - "stepsForDataPublication": "Steps for data publication completion", - "title": "Title", - "to": "To", - "true": "True", - "untitled": "Untitled", - "useDefault": "Use default", - "version": "Version {{version, number}}", - "yes": "Yes", - "warning": "Warning" - }, - "paginate": { - "numberOfItems": "{{count, number}} {{what, lowercase}}", - "estimatedNumberOfItems": "About {{count, number}} {{what, lowercase}}" - }, - "permissions": { - "class": "Class", - "inheritedPermissions": "Permissions inherited from parent ACL object", - "inheritsPermissions": "Inherits permissions", - "label": "Permissions", - "managePermissions": "Manage permissions", - "objectID": "Object ID", - "objectIdentityId": "ACL OID ID", - "owner": "Owner", - "parentObjectIdentityId": "Parent OID ID", - "sid": "Sid", - "updateParentOID": "Update Parent OID ID" - }, - "sort": { - "name": "Name", - "title": "Title", - "owner": "Owner", - "version": "Version", - "latestEdit": "Recently modified" - } -} diff --git a/packages/ui-core/locales/en/translations.json b/packages/ui-core/locales/en/translations.json deleted file mode 100644 index 26e71dcc98aed55dbcd6056148a9c32d83364959..0000000000000000000000000000000000000000 --- a/packages/ui-core/locales/en/translations.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "core": {}, - "user": {} -} \ No newline at end of file diff --git a/packages/ui-core/package.json b/packages/ui-core/package.json index 251eb3b96fa9dd68fd038836cd5cf04b3a44138e..ff298b9d1481675408b730c350b89231b3aac5ad 100644 --- a/packages/ui-core/package.json +++ b/packages/ui-core/package.json @@ -4,10 +4,6 @@ "license": "Apache-2.0", "scripts": { "clean": "rimraf target", - "precompile": "yarn run clean && yarn run i18n:generateI18n", - "i18n:generateI18n": "node src/i18n/generateI18n.ts", - "i18n:scanI18nDuplicates": "ts-node src/i18n/duplicateDetector.ts", - "i18n:i18nscan": "i18next-scanner --config i18next-scanner.config.js 'src/**/*.tsx'", "test": "jest" }, "dependencies": { diff --git a/packages/ui-core/src/core/action/applicationConfig.ts b/packages/ui-core/src/action/applicationConfig.ts similarity index 65% rename from packages/ui-core/src/core/action/applicationConfig.ts rename to packages/ui-core/src/action/applicationConfig.ts index ae8f730a67385e11c6cf71c894ae8aa21206a921..a592dd6415a8e2df6a6715ed7b760d7dc3d2fe02 100644 --- a/packages/ui-core/src/core/action/applicationConfig.ts +++ b/packages/ui-core/src/action/applicationConfig.ts @@ -1,4 +1,4 @@ -import { CONFIGURE_APPLICATION, SET_LANG } from '@/core/constants/applicationConfig'; +import { CONFIGURE_APPLICATION, SET_LANG } from '@grin-global/ui-core/constants/applicationConfig'; export const configure = (config: object) => ({ diff --git a/packages/ui-core/src/core/action/login.ts b/packages/ui-core/src/action/login.ts similarity index 56% rename from packages/ui-core/src/core/action/login.ts rename to packages/ui-core/src/action/login.ts index 5cd44fb54ddb3c062d65c71b7fd43e3373e8fb8c..8b38bc8383c12b9a6e04000da3360885e48f32de 100644 --- a/packages/ui-core/src/core/action/login.ts +++ b/packages/ui-core/src/action/login.ts @@ -1,22 +1,88 @@ import * as cookies from 'es-cookie'; import * as jwt from 'jsonwebtoken'; import { call, put, select, takeEvery } from 'redux-saga/effects'; -// actions -import { loginUserSuccess } from '@/user/action/public'; +// action +import navigateTo from '@grin-global/ui-core/action/navigation'; // constants -import { LOGIN_APP, LOGIN_APP_SAGA } from '@/core/constants/login'; -import { ROLE_CLIENT } from '@/core/constants/userRoles'; +import { + LOGIN_APP, LOGIN_USER, + LOGIN_APP_SAGA, LOGIN_USER_SAGA, LOGOUT_USER_SAGA, +} from '@grin-global/ui-core/constants/login'; +import { ROLE_CLIENT } from '@grin-global/ui-core/constants/userRoles'; // service -import { LoginService } from '@/core/service/LoginService'; +import { LoginService } from '@grin-global/ui-core/service/LoginService'; // utilities -import { clearCookies, saveCookies } from '@/core/utilities'; -import { log } from '@/core/utilities/debug'; -import { configureBackendApi } from '@/core/utilities/requestUtils'; +import { clearCookies, saveCookies } from '@grin-global/ui-core/utilities'; +import { log } from '@grin-global/ui-core/utilities/debug'; +import { configureBackendApi } from '@grin-global/ui-core/utilities/requestUtils'; export const loginSagas = [ takeEvery(LOGIN_APP_SAGA, loginAppSaga), + takeEvery(LOGIN_USER_SAGA, loginUserSaga), + takeEvery(LOGOUT_USER_SAGA, logoutUserSaga), ]; + +// #loginUser +export const loginUserAction = (username, password, needRedirect = false) => ({ + type: LOGIN_USER_SAGA, + payload: { + username, + password, + needRedirect, + }, +}); + +function* loginUserSaga(action) { + const { username, password, needRedirect } = action.payload; + // log('Trying login', username); + try { + yield call(loginRequest, username, password); + if (needRedirect) { + yield call(navigateTo, '/'); + } + window.location.reload(); + return false; + } catch (e) { + return ({ error: e, errorDescription: e.message }); + } +} + +function* loginRequest(username, password) { + const userData = yield call(LoginService.login, username, password); + const apiUrl = yield select((state) => state.applicationConfig.apiUrl); + + const tokenData = jwt.decode(userData.access_token); + saveCookies( + { access_token: userData.access_token, ...userData, ...tokenData }, + userData.exp * 1000 || new Date().getTime() + userData.expires_in * 1000, + apiUrl, + ); + return put(loginUserSuccess({ ...userData, ...tokenData })); +} + +export const loginUserSuccess = (payload) => ({ + type: LOGIN_USER, + ...payload, +}); + +// #logoutUser +export const logoutUserAction = () => ({ + type: LOGOUT_USER_SAGA, +}); + +function* logoutUserSaga() { + const token = yield select((state) => state.login.access_token); + yield call(LoginService.logout, token); + clearCookies(); + const appTokenData = yield call(loginAppAction); + + const apiUrl = yield select((state) => state.applicationConfig.apiUrl); + saveCookies(appTokenData, appTokenData.exp * 1000 || new Date().getTime() + appTokenData.expires_in * 1000, apiUrl); + window.location.replace('/'); +} + + export function checkAccessTokens(dispatch, getState) { const cookieToken: string = typeof window !== 'undefined' && cookies.get('access_token'); diff --git a/packages/ui-core/src/core/action/navigation.ts b/packages/ui-core/src/action/navigation.ts similarity index 100% rename from packages/ui-core/src/core/action/navigation.ts rename to packages/ui-core/src/action/navigation.ts diff --git a/packages/ui-core/src/action/saga.ts b/packages/ui-core/src/action/saga.ts new file mode 100644 index 0000000000000000000000000000000000000000..e7e13584c6205cce5e40fcca732040446dd9fa82 --- /dev/null +++ b/packages/ui-core/src/action/saga.ts @@ -0,0 +1,16 @@ +import { takeEvery } from 'redux-saga/effects'; +import { loginSagas } from '@grin-global/ui-core/action/login'; + + +export const coreSagas = [ + process.env.NODE_ENV === 'development' ? takeEvery((action) => /^api\//.test(action.type), logApi) : {}, + ...loginSagas, +]; + +function* logApi(action) { + console.log('Api call to ', action.type); + console.log('Params: ', action.params); + + // const state = yield select(); + // console.log('State after', state); +} diff --git a/packages/ui-core/src/core/constants/applicationConfig.ts b/packages/ui-core/src/constants/applicationConfig.ts similarity index 100% rename from packages/ui-core/src/core/constants/applicationConfig.ts rename to packages/ui-core/src/constants/applicationConfig.ts diff --git a/packages/ui-core/src/core/constants/login.ts b/packages/ui-core/src/constants/login.ts similarity index 74% rename from packages/ui-core/src/core/constants/login.ts rename to packages/ui-core/src/constants/login.ts index 373608e7f89d636adcab891b2e6dadf0b6e5c924..f880c57585a62619506d8dade1b113f559ba5fe2 100644 --- a/packages/ui-core/src/core/constants/login.ts +++ b/packages/ui-core/src/constants/login.ts @@ -1,10 +1,15 @@ export const LOGIN_USER = 'LOGIN_USER'; export const LOGIN_APP = 'LOGIN_APP'; -export const LOGIN_APP_SAGA = 'saga/login/LOGIN_APP'; export const CHECK_TOKEN = 'CHECK_TOKEN'; export const VERIFY_GOOGLE_TOKEN = 'VERIFY_GOOGLE_TOKEN'; +// saga +export const LOGIN_USER_SAGA = 'saga/login/LOGIN_USER'; +export const LOGOUT_USER_SAGA = 'saga/login/LOGOUT_USER_SAGA'; +export const LOGIN_APP_SAGA = 'saga/login/LOGIN_APP'; +// form +export const USER_LOGIN_FORM = 'Form/Login/USER_LOGIN_FORM'; export const REGISTRATION_FORM = 'Form/Login/REGISTRATION_FORM'; export const FORGOT_PASSWORD_FORM = 'Form/user/FORGOT_PASSWORD'; export const RESET_PASSWORD_FORM = 'Form/user/RESET_PASSWORD'; diff --git a/packages/ui-core/src/core/constants/pageTitle.ts b/packages/ui-core/src/constants/pageTitle.ts similarity index 100% rename from packages/ui-core/src/core/constants/pageTitle.ts rename to packages/ui-core/src/constants/pageTitle.ts diff --git a/packages/ui-core/src/core/constants/userRoles.ts b/packages/ui-core/src/constants/userRoles.ts similarity index 100% rename from packages/ui-core/src/core/constants/userRoles.ts rename to packages/ui-core/src/constants/userRoles.ts diff --git a/packages/ui-core/src/core/action/saga.ts b/packages/ui-core/src/core/action/saga.ts deleted file mode 100644 index 182b2984357b0a87f9912746e4459c03e775b863..0000000000000000000000000000000000000000 --- a/packages/ui-core/src/core/action/saga.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { all, takeEvery } from 'redux-saga/effects'; -import { userPublicSagas } from '@/user/action/public'; -import { loginSagas } from '@/core/action/login'; - - -export default function*() { - yield all([ - process.env.NODE_ENV === 'development' ? takeEvery((action) => /^api\//.test(action.type), logApi) : {}, - ...loginSagas, - ...userPublicSagas, - ]); -} - -function* logApi(action) { - console.log('Api call to ', action.type); - console.log('Params: ', action.params); - - // const state = yield select(); - // console.log('State after', state); -} diff --git a/packages/ui-core/src/core/model/common/index.ts b/packages/ui-core/src/core/model/common/index.ts deleted file mode 100644 index 2167a31b4128dae3afee255fec9d849f03621973..0000000000000000000000000000000000000000 --- a/packages/ui-core/src/core/model/common/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export { default as ApiError } from '@/core/model/common/ApiError'; -export { default as EmptyModel } from '@/core/model/common/EmptyModel'; -export { default as BasicModel } from '@/core/model/common/BasicModel'; -export { default as IVersionedEntity } from '@/core/model/common/IVersionedEntity'; -export { default as VersionedModel } from '@/core/model/common/VersionedModel'; -export { default as AuditedVersionedModel } from '@/core/model/common/AuditedVersionedModel'; -export { default as UuidModel } from '@/core/model/common/UuidModel'; diff --git a/packages/ui-core/src/core/reducer/index.ts b/packages/ui-core/src/core/reducer/index.ts deleted file mode 100644 index 77d08443333f3d252f07b10fef11f5d1518d9af0..0000000000000000000000000000000000000000 --- a/packages/ui-core/src/core/reducer/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { combineReducers } from 'redux'; -import { reducer as formReducer } from 'redux-form'; -import { connectRouter } from 'connected-react-router'; - -// common reduces -import applicationConfig from '@/core/reducer/applicationConfig'; -import login from '@/core/reducer/login'; -import pageTitle from '@/core/reducer/pageTitle'; -// model reducers -import user from '@/user/reducer'; - -const rootReducer = (history?) => combineReducers({ - // lib reducers - router: history ? connectRouter(history) : undefined, - form: formReducer, - - // common reducers - applicationConfig, - login, - pageTitle, - - // model reducers - user, -}); - -export default rootReducer; diff --git a/packages/ui-core/src/core/ui/routes.ts b/packages/ui-core/src/core/ui/routes.ts deleted file mode 100644 index 19f2b0c1a707cfb0cf04097dd29476a9b95f0ff8..0000000000000000000000000000000000000000 --- a/packages/ui-core/src/core/ui/routes.ts +++ /dev/null @@ -1,22 +0,0 @@ -// model -import IRoute from '@/core/model/common/IRoute'; - -// User -import { userPublicRotes } from '@/user/routes'; - -import WelcomePage from '@/core/ui/pages/Welcome'; -import App from '@/core/ui/App'; - - -export const routes: IRoute[] = [ - { - component: App, - routes: [ - ...userPublicRotes, - { - component: WelcomePage, - path: '/', - }, - ], - }, -] ; diff --git a/packages/ui-core/src/core/model/acl/ACL.ts b/packages/ui-core/src/model/acl/ACL.ts similarity index 100% rename from packages/ui-core/src/core/model/acl/ACL.ts rename to packages/ui-core/src/model/acl/ACL.ts diff --git a/packages/ui-core/src/core/model/acl/AclClass.ts b/packages/ui-core/src/model/acl/AclClass.ts similarity index 100% rename from packages/ui-core/src/core/model/acl/AclClass.ts rename to packages/ui-core/src/model/acl/AclClass.ts diff --git a/packages/ui-core/src/core/model/acl/AclEntry.ts b/packages/ui-core/src/model/acl/AclEntry.ts similarity index 82% rename from packages/ui-core/src/core/model/acl/AclEntry.ts rename to packages/ui-core/src/model/acl/AclEntry.ts index a8cd81f507475be5c02f940ca48429ae43d7f3b6..342d9fc5481feb966e1ff150ec0ee82a0f9df79c 100644 --- a/packages/ui-core/src/core/model/acl/AclEntry.ts +++ b/packages/ui-core/src/model/acl/AclEntry.ts @@ -1,4 +1,4 @@ -import AclSid from '@/core/model/acl/AclSid'; +import AclSid from '@grin-global/ui-core/model/acl/AclSid'; /* * Defined in Swagger as '#/definitions/AclEntry' diff --git a/packages/ui-core/src/core/model/acl/AclObjectIdentity.ts b/packages/ui-core/src/model/acl/AclObjectIdentity.ts similarity index 66% rename from packages/ui-core/src/core/model/acl/AclObjectIdentity.ts rename to packages/ui-core/src/model/acl/AclObjectIdentity.ts index 7dcfbcc1cf66561926fb8e2f7a4bc46cbeae8fe6..22b19f7d2e065fc2417776f29901231d5f8b3f52 100644 --- a/packages/ui-core/src/core/model/acl/AclObjectIdentity.ts +++ b/packages/ui-core/src/model/acl/AclObjectIdentity.ts @@ -1,6 +1,6 @@ -import AclClass from '@/core/model/acl/AclClass'; -import AclSid from '@/core/model/acl/AclSid'; -import SidPermissions from '@/core/model/acl/SidPermissions'; +import AclClass from '@grin-global/ui-core/model/acl/AclClass'; +import AclSid from '@grin-global/ui-core/model/acl/AclSid'; +import SidPermissions from '@grin-global/ui-core/model/acl/SidPermissions'; /* diff --git a/packages/ui-core/src/core/model/acl/AclSid.ts b/packages/ui-core/src/model/acl/AclSid.ts similarity index 100% rename from packages/ui-core/src/core/model/acl/AclSid.ts rename to packages/ui-core/src/model/acl/AclSid.ts diff --git a/packages/ui-core/src/core/model/acl/SidPermissions.ts b/packages/ui-core/src/model/acl/SidPermissions.ts similarity index 82% rename from packages/ui-core/src/core/model/acl/SidPermissions.ts rename to packages/ui-core/src/model/acl/SidPermissions.ts index c8590a09ac99684aced9593f7b925468ee93a2c4..8a41f712e9022ef8bce118bdffeb447d6afa9cc8 100644 --- a/packages/ui-core/src/core/model/acl/SidPermissions.ts +++ b/packages/ui-core/src/model/acl/SidPermissions.ts @@ -1,4 +1,4 @@ -import AclSid from '@/core/model/acl/AclSid'; +import AclSid from '@grin-global/ui-core/model/acl/AclSid'; /* * Defined in Swagger as '#/definitions/SidPermissions' diff --git a/packages/ui-core/src/core/model/common/ApiError.ts b/packages/ui-core/src/model/common/ApiError.ts similarity index 100% rename from packages/ui-core/src/core/model/common/ApiError.ts rename to packages/ui-core/src/model/common/ApiError.ts diff --git a/packages/ui-core/src/core/model/common/AuditedVersionedModel.ts b/packages/ui-core/src/model/common/AuditedVersionedModel.ts similarity index 90% rename from packages/ui-core/src/core/model/common/AuditedVersionedModel.ts rename to packages/ui-core/src/model/common/AuditedVersionedModel.ts index 2ca8c829f00fd8683e1919ec2c35e63ad7695484..48f0211d8a62d0d725194352ed2c77e7b769f118 100644 --- a/packages/ui-core/src/core/model/common/AuditedVersionedModel.ts +++ b/packages/ui-core/src/model/common/AuditedVersionedModel.ts @@ -1,4 +1,4 @@ -import { VersionedModel } from '@/core/model/common'; +import { VersionedModel } from '@grin-global/ui-core/model/common/index'; export default abstract class AuditedVersionedModel extends VersionedModel { public createdBy: number; diff --git a/packages/ui-core/src/core/model/common/BasicModel.ts b/packages/ui-core/src/model/common/BasicModel.ts similarity index 88% rename from packages/ui-core/src/core/model/common/BasicModel.ts rename to packages/ui-core/src/model/common/BasicModel.ts index 408266d16654598629b2fb8279d6b4140d0cd708..e558618bad1a0606fee61150a31a1a6efc87304a 100644 --- a/packages/ui-core/src/core/model/common/BasicModel.ts +++ b/packages/ui-core/src/model/common/BasicModel.ts @@ -1,4 +1,4 @@ -import { EmptyModel } from '@/core/model/common'; +import { EmptyModel } from '@grin-global/ui-core/model/common/index'; export default class BasicModel extends EmptyModel { public id: number; diff --git a/packages/ui-core/src/core/model/common/EmptyModel.ts b/packages/ui-core/src/model/common/EmptyModel.ts similarity index 81% rename from packages/ui-core/src/core/model/common/EmptyModel.ts rename to packages/ui-core/src/model/common/EmptyModel.ts index 2a1938868f3b4faf4ed8cd0f78336c2d7c33c7a1..789cabf594d34854f86ae6e2670330071a21ed38 100644 --- a/packages/ui-core/src/core/model/common/EmptyModel.ts +++ b/packages/ui-core/src/model/common/EmptyModel.ts @@ -1,4 +1,4 @@ -import { fixDate } from '@/core/utilities/dateUtils'; +import { fixDate } from '@grin-global/ui-core/utilities/dateUtils'; export default class EmptyModel { public constructor(obj?) { diff --git a/packages/ui-core/src/core/model/common/IRoute.ts b/packages/ui-core/src/model/common/IRoute.ts similarity index 74% rename from packages/ui-core/src/core/model/common/IRoute.ts rename to packages/ui-core/src/model/common/IRoute.ts index c7994b963ecc53e67bb9a0ff30c6f81c0477d34a..bc0205f701c8a80d5efe015d26121da8d5df11f9 100644 --- a/packages/ui-core/src/core/model/common/IRoute.ts +++ b/packages/ui-core/src/model/common/IRoute.ts @@ -1,6 +1,6 @@ import { RouteProps } from 'react-router'; // model -import { UserRole } from '@/core/model/user/User'; +import { UserRole } from '@grin-global/ui-core/model/user/User'; export default interface IRoute extends RouteProps { auth?: UserRole[]; diff --git a/packages/ui-core/src/core/model/common/IVersionedEntity.ts b/packages/ui-core/src/model/common/IVersionedEntity.ts similarity index 100% rename from packages/ui-core/src/core/model/common/IVersionedEntity.ts rename to packages/ui-core/src/model/common/IVersionedEntity.ts diff --git a/packages/ui-core/src/core/model/common/UuidModel.ts b/packages/ui-core/src/model/common/UuidModel.ts similarity index 72% rename from packages/ui-core/src/core/model/common/UuidModel.ts rename to packages/ui-core/src/model/common/UuidModel.ts index 322141e255c83912fddbbb5c0a00c5ba0866c060..60074b997db6e0a9527b0b63e37c1832109ec032 100644 --- a/packages/ui-core/src/core/model/common/UuidModel.ts +++ b/packages/ui-core/src/model/common/UuidModel.ts @@ -1,4 +1,4 @@ -import { AuditedVersionedModel } from '@/core/model/common'; +import { AuditedVersionedModel } from '@grin-global/ui-core/model/common/index'; export default abstract class UuidModel extends AuditedVersionedModel { public uuid: string; diff --git a/packages/ui-core/src/core/model/common/VersionedModel.ts b/packages/ui-core/src/model/common/VersionedModel.ts similarity index 69% rename from packages/ui-core/src/core/model/common/VersionedModel.ts rename to packages/ui-core/src/model/common/VersionedModel.ts index 0b62acaab424f83aaa0d06e896836c2e7daff135..1e5eee3b5aed67ab4d0887d3f75f953c68ab5d55 100644 --- a/packages/ui-core/src/core/model/common/VersionedModel.ts +++ b/packages/ui-core/src/model/common/VersionedModel.ts @@ -1,4 +1,4 @@ -import { BasicModel, IVersionedEntity } from '@/core/model/common'; +import { BasicModel, IVersionedEntity } from '@grin-global/ui-core/model/common/index'; export default abstract class VersionedModel extends BasicModel implements IVersionedEntity { public version: number; diff --git a/packages/ui-core/src/model/common/index.ts b/packages/ui-core/src/model/common/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..1cd108e77abf36ca3d0245ebc27dbeb79d8b6be4 --- /dev/null +++ b/packages/ui-core/src/model/common/index.ts @@ -0,0 +1,7 @@ +export { default as ApiError } from '@grin-global/ui-core/model/common/ApiError'; +export { default as EmptyModel } from '@grin-global/ui-core/model/common/EmptyModel'; +export { default as BasicModel } from '@grin-global/ui-core/model/common/BasicModel'; +export { default as IVersionedEntity } from '@grin-global/ui-core/model/common/IVersionedEntity'; +export { default as VersionedModel } from '@grin-global/ui-core/model/common/VersionedModel'; +export { default as AuditedVersionedModel } from '@grin-global/ui-core/model/common/AuditedVersionedModel'; +export { default as UuidModel } from '@grin-global/ui-core/model/common/UuidModel'; diff --git a/packages/ui-core/src/core/model/user/User.ts b/packages/ui-core/src/model/user/User.ts similarity index 93% rename from packages/ui-core/src/core/model/user/User.ts rename to packages/ui-core/src/model/user/User.ts index 2c051f97da14fd76965761cd2c8eff3c0e2713fe..68fd99dfcc0e4ea400a2e37bf731c84d777631a0 100644 --- a/packages/ui-core/src/core/model/user/User.ts +++ b/packages/ui-core/src/model/user/User.ts @@ -1,4 +1,4 @@ -import { UuidModel } from '@/core/model/common'; +import { UuidModel } from '@grin-global/ui-core/model/common'; class User extends UuidModel { public clazz: string = 'org.genesys2.server.model.impl.User'; diff --git a/packages/ui-core/src/core/reducer/applicationConfig.ts b/packages/ui-core/src/reducer/applicationConfig.ts similarity index 87% rename from packages/ui-core/src/core/reducer/applicationConfig.ts rename to packages/ui-core/src/reducer/applicationConfig.ts index c81b7794ffa10f72978cb6e50bf197cba79eba9e..1c0fbc1b0849778e7dea79617829c9bc073766c9 100644 --- a/packages/ui-core/src/core/reducer/applicationConfig.ts +++ b/packages/ui-core/src/reducer/applicationConfig.ts @@ -1,6 +1,6 @@ import update from 'immutability-helper'; -import { CONFIGURE_APPLICATION, SET_LANG } from '@/core/constants/applicationConfig'; -import { LOGIN_APP, LOGIN_USER } from '@/core/constants/login'; +import { CONFIGURE_APPLICATION, SET_LANG } from '@grin-global/ui-core/constants/applicationConfig'; +import { LOGIN_APP, LOGIN_USER } from '@grin-global/ui-core/constants/login'; const INITIAL_STATE: { diff --git a/packages/ui-core/src/reducer/index.ts b/packages/ui-core/src/reducer/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..fca65eb04f0b3cfe01cca5f913e019a816a8b6bb --- /dev/null +++ b/packages/ui-core/src/reducer/index.ts @@ -0,0 +1,22 @@ +import { reducer as formReducer } from 'redux-form'; +import { connectRouter } from 'connected-react-router'; + +// common reduces +import applicationConfig from '@grin-global/ui-core/reducer/applicationConfig'; +import login from '@grin-global/ui-core/reducer/login'; +import pageTitle from '@grin-global/ui-core/reducer/pageTitle'; + +const coreReducers = (history?) => ({ + // lib reducers + router: history ? connectRouter(history) : undefined, + form: formReducer, + + // common reducers + applicationConfig, + login, + pageTitle, + + // model reducers +}); + +export default coreReducers; diff --git a/packages/ui-core/src/core/reducer/login.ts b/packages/ui-core/src/reducer/login.ts similarity index 79% rename from packages/ui-core/src/core/reducer/login.ts rename to packages/ui-core/src/reducer/login.ts index fb7465d9dd6a483089c202c35037efdd31b5a6e7..1c72ca327559ce17f78611ce48f41e8c934a5ef7 100644 --- a/packages/ui-core/src/core/reducer/login.ts +++ b/packages/ui-core/src/reducer/login.ts @@ -1,8 +1,7 @@ import * as cookies from 'es-cookie'; // constants -import { CHECK_TOKEN, LOGIN_APP, VERIFY_GOOGLE_TOKEN } from '@/core/constants/login'; -import { LOGIN_USER } from '@/user/constants' -import { ROLE_CLIENT } from '@/core/constants/userRoles'; +import { CHECK_TOKEN, LOGIN_APP, LOGIN_USER, VERIFY_GOOGLE_TOKEN } from '@grin-global/ui-core/constants/login'; +import { ROLE_CLIENT } from '@grin-global/ui-core/constants/userRoles'; let authorities = [ROLE_CLIENT]; diff --git a/packages/ui-core/src/core/reducer/pageTitle.ts b/packages/ui-core/src/reducer/pageTitle.ts similarity index 87% rename from packages/ui-core/src/core/reducer/pageTitle.ts rename to packages/ui-core/src/reducer/pageTitle.ts index 93fa78a49f2891fd8a0c17730fdf4177287ff3e2..198c1f662002f3e98192b581cae84fbee2a6daec 100644 --- a/packages/ui-core/src/core/reducer/pageTitle.ts +++ b/packages/ui-core/src/reducer/pageTitle.ts @@ -1,6 +1,6 @@ import update from 'immutability-helper'; -import { SET_PAGE_TITLE } from '@/core/constants/pageTitle'; +import { SET_PAGE_TITLE } from '@grin-global/ui-core/constants/pageTitle'; const INITIAL_STATE: { title: string, diff --git a/packages/ui-core/src/core/service/LoginService.ts b/packages/ui-core/src/service/LoginService.ts similarity index 98% rename from packages/ui-core/src/core/service/LoginService.ts rename to packages/ui-core/src/service/LoginService.ts index acfb283315a6815e3d36f0da2b000623b6e999b7..fd35a4db736223592075798f4b27a6213257ebfe 100644 --- a/packages/ui-core/src/core/service/LoginService.ts +++ b/packages/ui-core/src/service/LoginService.ts @@ -1,4 +1,4 @@ -import { axiosBackend } from '@/core/utilities/requestUtils'; +import { axiosBackend } from '@grin-global/ui-core/utilities/requestUtils'; import * as UrlTemplate from 'url-template'; // import FormData from 'form-data'; // it's in the browser diff --git a/packages/ui-core/src/core/service/UserService.ts b/packages/ui-core/src/service/UserService.ts similarity index 85% rename from packages/ui-core/src/core/service/UserService.ts rename to packages/ui-core/src/service/UserService.ts index 70228ebc4dfcfe242532a4fec802bef69c073bdd..162f813d2ce5d1f506c20cb4e2c25c664d0eb725 100644 --- a/packages/ui-core/src/core/service/UserService.ts +++ b/packages/ui-core/src/service/UserService.ts @@ -1,9 +1,9 @@ import { AxiosRequestConfig } from 'axios'; import * as UrlTemplate from 'url-template'; // Model -import User from '@/core/model/user/User'; +import User from '@grin-global/ui-core/model/user/User'; // utilities -import { axiosBackend } from '@/core/utilities/requestUtils'; +import { axiosBackend } from '@grin-global/ui-core/utilities/requestUtils'; const LIST_USERS_URL = '/api/user/list'; const GET_USER_URL = UrlTemplate.parse('/api/user/{uuid}'); diff --git a/packages/ui-core/src/core/translations.json b/packages/ui-core/src/translations.json similarity index 100% rename from packages/ui-core/src/core/translations.json rename to packages/ui-core/src/translations.json diff --git a/packages/ui-core/src/core/ui/App.tsx b/packages/ui-core/src/ui/App.tsx similarity index 91% rename from packages/ui-core/src/core/ui/App.tsx rename to packages/ui-core/src/ui/App.tsx index f350166f3ee20edd8a4fa20cebc7f371588602fb..8ea31b24a717a4ad6a7681621e2d2abb70a6446b 100644 --- a/packages/ui-core/src/core/ui/App.tsx +++ b/packages/ui-core/src/ui/App.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { withRouter, RouteComponentProps } from 'react-router-dom'; -import renderRoutes from '@/core/ui/renderRoutes'; +import renderRoutes from '@grin-global/ui-core/ui/renderRoutes'; interface IAppProps extends React.ClassAttributes, RouteComponentProps { route?: any; diff --git a/packages/ui-core/src/core/ui/common/Loading.tsx b/packages/ui-core/src/ui/common/Loading.tsx similarity index 100% rename from packages/ui-core/src/core/ui/common/Loading.tsx rename to packages/ui-core/src/ui/common/Loading.tsx diff --git a/packages/ui-core/src/core/ui/common/authorized/Authorize.tsx b/packages/ui-core/src/ui/common/authorized/Authorize.tsx similarity index 100% rename from packages/ui-core/src/core/ui/common/authorized/Authorize.tsx rename to packages/ui-core/src/ui/common/authorized/Authorize.tsx diff --git a/packages/ui-core/src/core/ui/common/authorized/AuthorizedRouteComponent.tsx b/packages/ui-core/src/ui/common/authorized/AuthorizedRouteComponent.tsx similarity index 94% rename from packages/ui-core/src/core/ui/common/authorized/AuthorizedRouteComponent.tsx rename to packages/ui-core/src/ui/common/authorized/AuthorizedRouteComponent.tsx index f32425bed656148a4dc61ef78d3cf2619c579ee0..d13eda3f3b301c9832ce35e5827bd6c9e9c79545 100644 --- a/packages/ui-core/src/core/ui/common/authorized/AuthorizedRouteComponent.tsx +++ b/packages/ui-core/src/ui/common/authorized/AuthorizedRouteComponent.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { connect } from 'react-redux'; import { Redirect } from 'react-router-dom'; // model -import { UserRole } from '@/core/model/user/User'; +import { UserRole } from '@grin-global/ui-core/model/user/User'; interface IAuthorizedRouteComponentProps extends React.ClassAttributes { children: any; diff --git a/packages/ui-core/src/core/ui/matchRoutes.ts b/packages/ui-core/src/ui/matchRoutes.ts similarity index 100% rename from packages/ui-core/src/core/ui/matchRoutes.ts rename to packages/ui-core/src/ui/matchRoutes.ts diff --git a/packages/ui-core/src/core/ui/pages/Welcome.tsx b/packages/ui-core/src/ui/pages/Welcome.tsx similarity index 100% rename from packages/ui-core/src/core/ui/pages/Welcome.tsx rename to packages/ui-core/src/ui/pages/Welcome.tsx diff --git a/packages/ui-core/src/core/ui/renderRoutes.tsx b/packages/ui-core/src/ui/renderRoutes.tsx similarity index 88% rename from packages/ui-core/src/core/ui/renderRoutes.tsx rename to packages/ui-core/src/ui/renderRoutes.tsx index 0affdb6127853bd67e36012d65ad8d50a36e3404..76f9de19645fb4e3210b3802c861c5b92727b24a 100644 --- a/packages/ui-core/src/core/ui/renderRoutes.tsx +++ b/packages/ui-core/src/ui/renderRoutes.tsx @@ -3,9 +3,9 @@ import { Switch } from 'react-router'; import { Route } from 'react-router-dom'; // model -import IRoute from '@/core/model/common/IRoute'; +import IRoute from '@grin-global/ui-core/model/common/IRoute'; // ui -import AuthorizedRouteComponent from '@/core/ui/common/authorized/AuthorizedRouteComponent'; +import AuthorizedRouteComponent from '@grin-global/ui-core/ui/common/authorized/AuthorizedRouteComponent'; const renderRoutes = (routes: IRoute[], parentPath = '', extraProps = {}) => { diff --git a/packages/ui-core/src/ui/routes.ts b/packages/ui-core/src/ui/routes.ts new file mode 100644 index 0000000000000000000000000000000000000000..28aeaa0e4adaa49118b226de13f57dabc6ab0f2a --- /dev/null +++ b/packages/ui-core/src/ui/routes.ts @@ -0,0 +1,21 @@ +// model +import IRoute from '@grin-global/ui-core/model/common/IRoute'; + + +import WelcomePage from '@grin-global/ui-core/ui/pages/Welcome'; + + +export const publicCoreRoutes: IRoute[] = [ + { + component: WelcomePage, + path: '/', + }, +] ; + +export const dashboardCoreRoutes: IRoute[] = [ + +] ; + +export const adminCoreRoutes: IRoute[] = [ + +] ; diff --git a/packages/ui-core/src/user/action/public.ts b/packages/ui-core/src/user/action/public.ts deleted file mode 100644 index 515163c327f0f4013aedf249afa5ef38f7e6169f..0000000000000000000000000000000000000000 --- a/packages/ui-core/src/user/action/public.ts +++ /dev/null @@ -1,124 +0,0 @@ -import * as jwt from 'jsonwebtoken'; -import { call, put, select, takeEvery } from 'redux-saga/effects'; - -// actions -import navigateTo from '@/core/action/navigation'; -import { loginAppAction } from '@/core/action/login'; -// Constants -import { - RECEIVE_USER, RECEIVE_USERS, LOGIN_USER, - SAGA_RECEIVE_USER, SAGA_RECEIVE_USERS, SAGA_LOGIN_USER, SAGA_LOGOUT_USER, -} from '@/user/constants'; -// Model -import User from '@/core/model/user/User'; -// Service -import UserService from '@/core/service/UserService'; -import { LoginService } from '@/core/service/LoginService'; -// Utilities -import { clearCookies, saveCookies } from '@/core/utilities'; - - -export const userPublicSagas = [ - takeEvery(SAGA_LOGIN_USER, loginUserSaga), - takeEvery(SAGA_LOGOUT_USER, logoutUserSaga), - takeEvery(SAGA_RECEIVE_USER, getUserSaga), - takeEvery(SAGA_RECEIVE_USERS, listUsersSaga), -]; - -// #loginUser -export const loginUserAction = (username, password, needRedirect = false) => ({ - type: SAGA_LOGIN_USER, - payload: { - username, - password, - needRedirect, - }, -}); - -function* loginUserSaga(action) { - const { username, password, needRedirect } = action.payload; - // log('Trying login', username); - try { - yield call(loginRequest, username, password); - if (needRedirect) { - yield call(navigateTo, '/'); - } - window.location.reload(); - return false; - } catch (e) { - return ({ error: e, errorDescription: e.message }); - } -} - -function* loginRequest(username, password) { - const userData = yield call(LoginService.login, username, password); - const apiUrl = yield select((state) => state.applicationConfig.apiUrl); - - const tokenData = jwt.decode(userData.access_token); - saveCookies( - { access_token: userData.access_token, ...userData, ...tokenData }, - userData.exp * 1000 || new Date().getTime() + userData.expires_in * 1000, - apiUrl, - ); - return put(loginUserSuccess({ ...userData, ...tokenData })); -} - -export const loginUserSuccess = (payload) => ({ - type: LOGIN_USER, - ...payload, -}); - -// #logoutUser -export const logoutUserAction = () => ({ - type: SAGA_LOGOUT_USER, -}); - -function* logoutUserSaga() { - const token = yield select((state) => state.login.access_token); - yield call(LoginService.logout, token); - clearCookies(); - const appTokenData = yield call(loginAppAction); - - const apiUrl = yield select((state) => state.applicationConfig.apiUrl); - saveCookies(appTokenData, appTokenData.exp * 1000 || new Date().getTime() + appTokenData.expires_in * 1000, apiUrl); - window.location.replace('/'); -} - -// #getUser -export const getUserAction = (uuid) => ({ - type: SAGA_RECEIVE_USER, - payload: { - uuid, - }, -}); - -function* getUserSaga(action) { - const { uuid } = action.payload; - const user = yield call(UserService.getUser, uuid); - yield put(receiveUserSuccess(user)); -} - -const receiveUserSuccess = (user: User) => ({ - type: RECEIVE_USER, - payload: { user }, -}); - - -// #listUsers -export const listUsersAction = (uuid) => ({ - type: SAGA_RECEIVE_USERS, - payload: { - uuid, - }, -}); - -function * listUsersSaga() { - const users = yield call(UserService.listUsers); - yield put(receiveUsersSuccess(users)); -} - -const receiveUsersSuccess = (users: User[]) => ({ - type: RECEIVE_USERS, - payload: { users }, -}); - diff --git a/packages/ui-core/src/core/utilities/CustomReactLoadable.ts b/packages/ui-core/src/utilities/CustomReactLoadable.ts similarity index 92% rename from packages/ui-core/src/core/utilities/CustomReactLoadable.ts rename to packages/ui-core/src/utilities/CustomReactLoadable.ts index ca4472e77b9bc1bbee58b1b40635b169039b63b3..58153535c32f871c441907ecf99cd801aa159525 100644 --- a/packages/ui-core/src/core/utilities/CustomReactLoadable.ts +++ b/packages/ui-core/src/utilities/CustomReactLoadable.ts @@ -5,7 +5,7 @@ * The file checks for import 'utilities/CustomReactLoadable'. If this component is renamed * or moved please update the babel file. */ -import Loading from '@/core/ui/common/Loading'; +import Loading from '@grin-global/ui-core/ui/common/Loading'; import Loadable from 'react-loadable'; export default function CustomReactLoadable(opts) { diff --git a/packages/ui-core/src/core/utilities/dateUtils.ts b/packages/ui-core/src/utilities/dateUtils.ts similarity index 100% rename from packages/ui-core/src/core/utilities/dateUtils.ts rename to packages/ui-core/src/utilities/dateUtils.ts diff --git a/packages/ui-core/src/core/utilities/debug.tsx b/packages/ui-core/src/utilities/debug.tsx similarity index 100% rename from packages/ui-core/src/core/utilities/debug.tsx rename to packages/ui-core/src/utilities/debug.tsx diff --git a/packages/ui-core/src/core/utilities/index.ts b/packages/ui-core/src/utilities/index.ts similarity index 98% rename from packages/ui-core/src/core/utilities/index.ts rename to packages/ui-core/src/utilities/index.ts index 497e391ab26e57f92d0a4816edd3685ebdb08a17..373b100d0b0a6108ffaa8eb9b9f967bfe46df6a5 100644 --- a/packages/ui-core/src/core/utilities/index.ts +++ b/packages/ui-core/src/utilities/index.ts @@ -1,6 +1,6 @@ import * as cookies from 'es-cookie'; // utilities -import { log } from '@/core/utilities/debug'; +import { log } from '@grin-global/ui-core/utilities/debug'; /** * A very wordy comparison of two arrays diff --git a/packages/ui-core/src/core/utilities/requestUtils.ts b/packages/ui-core/src/utilities/requestUtils.ts similarity index 93% rename from packages/ui-core/src/core/utilities/requestUtils.ts rename to packages/ui-core/src/utilities/requestUtils.ts index 902997580ab2589870c63a99e89b291a94fef9dc..c41a1190bb6aa238e8b5f74a2656c09e8ca8f58e 100644 --- a/packages/ui-core/src/core/utilities/requestUtils.ts +++ b/packages/ui-core/src/utilities/requestUtils.ts @@ -1,7 +1,7 @@ import axios from 'axios'; -import { ApiError } from '@/core/model/common'; -import { clearCookies } from '@/core/utilities'; +import { ApiError } from '@grin-global/ui-core/model/common'; +import { clearCookies } from '@grin-global/ui-core/utilities/index'; /** * Generate API prefix when a language is selected diff --git a/packages/ui-core/tsconfig.json b/packages/ui-core/tsconfig.json index ddaf1afaf085a3ed8784b59ec2d6f94d9662885b..18e991fc33874330283c00bc8ddd1dd494708ac8 100644 --- a/packages/ui-core/tsconfig.json +++ b/packages/ui-core/tsconfig.json @@ -3,7 +3,7 @@ "compilerOptions": { "baseUrl": ".", "paths": { - "@/*": [ + "@grin-global/ui-core/*": [ "./src/*" ], "#/*": [ diff --git a/packages/ui-express/config/server.config.js b/packages/ui-express/config/server.config.js index 1e9c2af063a9023d93b15f1bcf9f999a3c73c2e4..ff4aeeedbb49ab2d4a5abf4451f7b89a79655d87 100644 --- a/packages/ui-express/config/server.config.js +++ b/packages/ui-express/config/server.config.js @@ -29,10 +29,11 @@ module.exports = { extensions: [ '.ts', '.tsx', '.js', '.jsx' ], - modules: [path.resolve('./src'), 'node_modules'], + modules: [path.resolve('./src'), path.resolve('./server'), 'node_modules'], alias: { '@grin-global/ui-core': path.resolve(__dirname, '../../ui-core/src'), - '@': path.resolve(__dirname, '../../ui-core/src'), + '@grin-global/i18n': path.resolve(__dirname, '../../i18n/src'), + 'server': path.resolve(__dirname, '../server'), } }, diff --git a/packages/ui-express/config/webpack-base.config.js b/packages/ui-express/config/webpack-base.config.js index cf3004ae3c8588f2542dd05d30833354a721ad86..00d787bf404c7a964d64e6f75ebd25799fc4df88 100644 --- a/packages/ui-express/config/webpack-base.config.js +++ b/packages/ui-express/config/webpack-base.config.js @@ -127,10 +127,11 @@ module.exports = { resolve: { extensions: ['.ts', '.tsx', '.js', '.jsx'], - modules: [path.resolve('./src'), 'node_modules'], + modules: [path.resolve('./src'), path.resolve('./server'), 'node_modules'], alias: { '@grin-global/ui-core': path.resolve(__dirname, '../../ui-core/src'), - '@': path.resolve(__dirname, '../../ui-core/src'), + '@grin-global/i18n': path.resolve(__dirname, '../../i18n/src'), + 'server': path.resolve(__dirname, '../server'), } }, @@ -226,8 +227,8 @@ module.exports = { new HtmlWebpackExcludeAssetsPlugin(), new CopyWebpackPlugin([ - { from: '../ui-core/locales', to: 'locales' }, - { from: '../ui-core/generated/locales', to: 'locales' }, + { from: '../i18n/locales', to: 'locales' }, + { from: '../i18n/generated/locales', to: 'locales' }, ]), new ReactLoadable.ReactLoadablePlugin({ diff --git a/packages/ui-express/entrypoints/client.tsx b/packages/ui-express/entrypoints/client.tsx index ab798b5b86a55beaa9b793d18fbb0117df58d4f5..d29e89cbc072cbe0b49f4b5aecb5752a60644416 100644 --- a/packages/ui-express/entrypoints/client.tsx +++ b/packages/ui-express/entrypoints/client.tsx @@ -9,22 +9,22 @@ import createSagaMiddleware from 'redux-saga' import { routerMiddleware, ConnectedRouter } from 'connected-react-router'; import { createBrowserHistory as createHistory } from 'history'; // middleware -import detectLocaleFromPath from 'middleware/detectLocaleFromPath'; -import getDir from 'middleware/detectDirection'; +import detectLocaleFromPath from 'server/middleware/detectLocaleFromPath'; +import getDir from 'server/middleware/detectDirection'; // i18n -import { i18nClient } from '@grin-global/ui-core/i18n/i18n-client'; +import { i18nClient } from '@grin-global/i18n/i18n-client'; // action -import { checkAccessTokens } from '@grin-global/ui-core/core/action/login'; -import { receiveLang } from '@grin-global/ui-core/core/action/applicationConfig'; -import saga from '@grin-global/ui-core/core/action/saga'; +import { checkAccessTokens } from '@grin-global/ui-core/action/login'; +import { receiveLang } from '@grin-global/ui-core/action/applicationConfig'; +import saga from 'core/action/saga'; // reducer -import rootReducer from '@grin-global/ui-core/core/reducer'; +import rootReducer from 'core/reducer'; // utilities -import { log } from '@grin-global/ui-core/core/utilities/debug'; -import { configureBackendApi } from '@grin-global/ui-core/core/utilities/requestUtils'; +import { log } from '@grin-global/ui-core/utilities/debug'; +import { configureBackendApi } from '@grin-global/ui-core/utilities/requestUtils'; // ui -import { routes } from '@grin-global/ui-core/core/ui/routes'; -import renderRoutes from '@grin-global/ui-core/core/ui/renderRoutes'; +import { routes } from 'core/ui/routes'; +import renderRoutes from '@grin-global/ui-core/ui/renderRoutes'; declare const __PRELOADED_STATE__: any; diff --git a/packages/ui-express/src/config.ts b/packages/ui-express/server/config.ts similarity index 100% rename from packages/ui-express/src/config.ts rename to packages/ui-express/server/config.ts diff --git a/packages/ui-express/src/index.ts b/packages/ui-express/server/index.ts similarity index 86% rename from packages/ui-express/src/index.ts rename to packages/ui-express/server/index.ts index 770f8828a3233c1eb16248cfb11e3adcc16bb7e5..134787045944983b8a50ca16c3070f357c31160e 100644 --- a/packages/ui-express/src/index.ts +++ b/packages/ui-express/server/index.ts @@ -1,10 +1,10 @@ import * as Loadable from 'react-loadable'; // server -import config from 'config'; +import config from 'server/config'; // service -import { LoginService } from '@grin-global/ui-core/core/service/LoginService'; +import { LoginService } from '@grin-global/ui-core/service/LoginService'; // utilities -import { configureBackendApi } from '@grin-global/ui-core/core/utilities/requestUtils'; +import { configureBackendApi } from '@grin-global/ui-core/utilities/requestUtils'; /** * Start the frontend server diff --git a/packages/ui-express/src/middleware/checkAuthToken.ts b/packages/ui-express/server/middleware/checkAuthToken.ts similarity index 87% rename from packages/ui-express/src/middleware/checkAuthToken.ts rename to packages/ui-express/server/middleware/checkAuthToken.ts index 1d8f5a68951ec57482a4fe4521187be6e25b6203..dfec299c924dfd2f9a2084009d9df4117bdff04e 100644 --- a/packages/ui-express/src/middleware/checkAuthToken.ts +++ b/packages/ui-express/server/middleware/checkAuthToken.ts @@ -1,12 +1,11 @@ import * as jwt from 'jsonwebtoken'; // server -import config from 'config'; +import config from 'server/config'; // action -import { loginAppRequest } from '@grin-global/ui-core/core/action/login'; -import { loginUserSuccess } from '@grin-global/ui-core/user/action/public'; +import { loginAppAction, loginUserSuccess } from '@grin-global/ui-core/action/login'; // model -import ApiError from '@grin-global/ui-core/core/model/common/ApiError'; +import ApiError from '@grin-global/ui-core/model/common/ApiError'; function checkAuthTokenRequest(req, dispatch) { @@ -24,11 +23,11 @@ function checkAuthTokenRequest(req, dispatch) { return Promise.resolve({ access_token: accessToken, ...parsedToken }); } catch (e) { console.log('Error while parsing token:', e.message); - return dispatch(loginAppRequest()); + return dispatch(loginAppAction()); } } else { console.log('Server: No token in cookie, dispatching loginAppRequest'); - return dispatch(loginAppRequest()); + return dispatch(loginAppAction()); } } diff --git a/packages/ui-express/src/middleware/detectDirection.ts b/packages/ui-express/server/middleware/detectDirection.ts similarity index 77% rename from packages/ui-express/src/middleware/detectDirection.ts rename to packages/ui-express/server/middleware/detectDirection.ts index b748a8b8aac6b1262a7581b94eaa0daa04c7b27e..73a0693d86f672da0b0f971a0ad9347f97bc7800 100644 --- a/packages/ui-express/src/middleware/detectDirection.ts +++ b/packages/ui-express/server/middleware/detectDirection.ts @@ -1,4 +1,4 @@ -import languages from '@grin-global/ui-core/core/data/Languages'; +import languages from '@grin-global/i18n/data/Languages'; export default function getDir(lang) { let dir = 'ltr'; diff --git a/packages/ui-express/src/middleware/detectLocaleFromPath.ts b/packages/ui-express/server/middleware/detectLocaleFromPath.ts similarity index 88% rename from packages/ui-express/src/middleware/detectLocaleFromPath.ts rename to packages/ui-express/server/middleware/detectLocaleFromPath.ts index c8ee57c6fc3c1caa3c2ee8d0b3e810b54c8d563f..cb4b906f33dcb07ebdaa5ada76e63f6b325aabf8 100644 --- a/packages/ui-express/src/middleware/detectLocaleFromPath.ts +++ b/packages/ui-express/server/middleware/detectLocaleFromPath.ts @@ -1,4 +1,4 @@ -import languages from '@grin-global/ui-core/core/data/Languages'; +import languages from '@grin-global/i18n/data/Languages'; export default function detectLocaleFromPath(virtualPath: string, path: string, index: number) { if (virtualPath && path.startsWith(virtualPath)) { diff --git a/packages/ui-express/src/middleware/fetchComponentData.ts b/packages/ui-express/server/middleware/fetchComponentData.ts similarity index 100% rename from packages/ui-express/src/middleware/fetchComponentData.ts rename to packages/ui-express/server/middleware/fetchComponentData.ts diff --git a/packages/ui-express/src/middleware/httpProxy.ts b/packages/ui-express/server/middleware/httpProxy.ts similarity index 91% rename from packages/ui-express/src/middleware/httpProxy.ts rename to packages/ui-express/server/middleware/httpProxy.ts index 9f0b62c284b48f25416ba878cf6a675ed3d4ea92..4d0d63bce385d38088ef27debb78b2ee2cf48778 100644 --- a/packages/ui-express/src/middleware/httpProxy.ts +++ b/packages/ui-express/server/middleware/httpProxy.ts @@ -1,6 +1,6 @@ import * as proxy from 'express-http-proxy'; -import config from 'config'; -import refreshAuthToken from 'middleware/refreshAuthToken'; +import config from 'server/config'; +import refreshAuthToken from 'server/middleware/refreshAuthToken'; const httpProxy = proxy(config.apiUrl, { parseReqBody: false, diff --git a/packages/ui-express/src/middleware/SSR.tsx b/packages/ui-express/server/middleware/prerenderer.tsx similarity index 91% rename from packages/ui-express/src/middleware/SSR.tsx rename to packages/ui-express/server/middleware/prerenderer.tsx index 1ad7a3f2a871edba4ccdedce8e81a19aa4cc2e0c..21dd36d103b0f4aa13137f6e1ee9b18d579e8cb5 100644 --- a/packages/ui-express/src/middleware/SSR.tsx +++ b/packages/ui-express/server/middleware/prerenderer.tsx @@ -13,23 +13,23 @@ import { createStore, applyMiddleware } from 'redux'; import { I18nextProvider } from 'react-i18next'; import thunk from 'redux-thunk'; import createSagaMiddleware from 'redux-saga' -import rootReducer from '@grin-global/ui-core/core/reducer'; -import languages from '@grin-global/ui-core/core/data/Languages'; +import rootReducer from 'core/reducer'; +import languages from '@grin-global/i18n/data/Languages'; // import checkAuthToken from './checkAuthToken'; -import { routes } from '@grin-global/ui-core/core/ui/routes'; -import matchRoutes from '@grin-global/ui-core/core/ui/matchRoutes'; -import renderRoutes from '@grin-global/ui-core/core/ui/renderRoutes'; -import fetchComponentData from 'middleware/fetchComponentData'; -import detectLocaleFromPath from 'middleware/detectLocaleFromPath'; -import getDir from 'middleware/detectDirection'; -import config from 'config'; -import checkAuthToken from 'middleware/checkAuthToken'; -import { configure, receiveLang } from '@grin-global/ui-core/core/action/applicationConfig'; -import ApiError from '@grin-global/ui-core/core/model/common/ApiError'; - -import sagas from '@grin-global/ui-core/core/action/saga'; +import { routes } from 'core/ui/routes'; +import matchRoutes from '@grin-global/ui-core/ui/matchRoutes'; +import renderRoutes from '@grin-global/ui-core/ui/renderRoutes'; +import fetchComponentData from 'server/middleware/fetchComponentData'; +import detectLocaleFromPath from 'server/middleware/detectLocaleFromPath'; +import getDir from 'server/middleware/detectDirection'; +import config from 'server/config'; +import checkAuthToken from 'server/middleware/checkAuthToken'; +import { configure, receiveLang } from '@grin-global/ui-core/action/applicationConfig'; +import ApiError from '@grin-global/ui-core/model/common/ApiError'; + +import sagas from 'core/action/saga'; // react-loadable webpack stats import * as path from 'path'; diff --git a/packages/ui-express/src/middleware/refreshAuthToken.ts b/packages/ui-express/server/middleware/refreshAuthToken.ts similarity index 89% rename from packages/ui-express/src/middleware/refreshAuthToken.ts rename to packages/ui-express/server/middleware/refreshAuthToken.ts index 594f64a3f2299807592e0e3154537641850dabf2..c91542ad23b4623d822aa68c1f828ef122a6394f 100644 --- a/packages/ui-express/src/middleware/refreshAuthToken.ts +++ b/packages/ui-express/server/middleware/refreshAuthToken.ts @@ -1,5 +1,5 @@ import * as jwt from 'jsonwebtoken'; -import config from 'config'; +import config from 'server/config'; const refreshAuthToken = async (req, res) => { const refreshToken = req.query.refresh_token; diff --git a/packages/ui-express/src/robots.ts b/packages/ui-express/server/robots.ts similarity index 89% rename from packages/ui-express/src/robots.ts rename to packages/ui-express/server/robots.ts index 2d6322ca47d742707cc125f449733cbf848e1cee..92a1fb377e732ea293277c34b5842519a49881d0 100644 --- a/packages/ui-express/src/robots.ts +++ b/packages/ui-express/server/robots.ts @@ -1,4 +1,4 @@ -import config from 'config'; +import config from 'server/config'; const robotsAllow = `User-Agent: * Allow: / diff --git a/packages/ui-express/src/server.ts b/packages/ui-express/server/server.ts similarity index 91% rename from packages/ui-express/src/server.ts rename to packages/ui-express/server/server.ts index fc5efe8c751f3f1a616dbd18768088ef94ef28da..e6d311d844ea20dfbd1ef8203c310f9cfc907bd0 100644 --- a/packages/ui-express/src/server.ts +++ b/packages/ui-express/server/server.ts @@ -9,14 +9,14 @@ import { readFileSync } from 'fs'; const i18nextMiddleware = require('i18next-express-middleware'); // has no proper import yet // server -import config from 'config'; -import robots from 'robots'; -import sitemap from 'sitemap'; +import config from 'server/config'; +import robots from 'server/robots'; +import sitemap from 'server/sitemap'; // middleware -import prerenderer from 'middleware/SSR'; -import httpProxy from 'middleware/httpProxy'; +import prerenderer from 'server/middleware/prerenderer'; +import httpProxy from 'server/middleware/httpProxy'; // i18n -import { i18nServer } from '@grin-global/ui-core/i18n/i18n-server'; +import { i18nServer } from '@grin-global/i18n/i18n-server'; const app = express(); diff --git a/packages/ui-express/src/sitemap.ts b/packages/ui-express/server/sitemap.ts similarity index 90% rename from packages/ui-express/src/sitemap.ts rename to packages/ui-express/server/sitemap.ts index ecb34f6215b2d6217409c3fe465e333ac1466ada..e7bb100897781f4dd9648bcf9876080ea77d2850 100644 --- a/packages/ui-express/src/sitemap.ts +++ b/packages/ui-express/server/sitemap.ts @@ -1,6 +1,6 @@ import axios from 'axios'; // server -import config from 'config'; +import config from 'server/config'; const sitemap = (req, res) => { axios({ diff --git a/packages/ui-express/src/core/action/saga.ts b/packages/ui-express/src/core/action/saga.ts new file mode 100644 index 0000000000000000000000000000000000000000..6d3e8ab1455b6ab6b3930f099f71b5e788f51df2 --- /dev/null +++ b/packages/ui-express/src/core/action/saga.ts @@ -0,0 +1,13 @@ +import { all } from 'redux-saga/effects'; + +import { coreSagas } from '@grin-global/ui-core/action/saga'; + +import { userPublicSagas } from 'user/action/public'; + + +export default function*() { + yield all([ + ...coreSagas, + ...userPublicSagas, + ]); +} diff --git a/packages/ui-express/src/core/reducer/index.ts b/packages/ui-express/src/core/reducer/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..505c855d99f57b0cb3cb8443398460ec8512b567 --- /dev/null +++ b/packages/ui-express/src/core/reducer/index.ts @@ -0,0 +1,15 @@ +import { combineReducers } from 'redux'; + +import coreReducers from '@grin-global/ui-core/reducer'; +// model reducers +import user from 'user/reducer'; + +const rootReducer = (history?) => (combineReducers({ + // model reducers + ...user, + + ...coreReducers(history), +})); + + +export default rootReducer; diff --git a/packages/ui-express/src/core/ui/routes.ts b/packages/ui-express/src/core/ui/routes.ts new file mode 100644 index 0000000000000000000000000000000000000000..25be43a76092e20ea55fa8f35e1d9a7fbea5ab92 --- /dev/null +++ b/packages/ui-express/src/core/ui/routes.ts @@ -0,0 +1,22 @@ +// model +import IRoute from '@grin-global/ui-core/model/common/IRoute'; + +// core + +import { publicCoreRoutes } from '@grin-global/ui-core/ui/routes'; + +// User +import { userPublicRotes } from 'user/routes'; + +import App from '@grin-global/ui-core/ui/App'; + + +export const routes: IRoute[] = [ + { + component: App, + routes: [ + ...userPublicRotes, + ...publicCoreRoutes, + ], + }, +] ; diff --git a/packages/ui-express/src/user/action/public.ts b/packages/ui-express/src/user/action/public.ts new file mode 100644 index 0000000000000000000000000000000000000000..1a04f74360ad0912c4aee376d1717d677a5e3fe6 --- /dev/null +++ b/packages/ui-express/src/user/action/public.ts @@ -0,0 +1,56 @@ +import { call, put, takeEvery } from 'redux-saga/effects'; + +// Constants +import { + RECEIVE_USER, RECEIVE_USERS, + SAGA_RECEIVE_USER, SAGA_RECEIVE_USERS, +} from 'user/constants'; +// Model +import User from '@grin-global/ui-core/model/user/User'; +// Service +import UserService from '@grin-global/ui-core/service/UserService'; + + +export const userPublicSagas = [ + takeEvery(SAGA_RECEIVE_USER, getUserSaga), + takeEvery(SAGA_RECEIVE_USERS, listUsersSaga), +]; + +// #getUser +export const getUserAction = (uuid) => ({ + type: SAGA_RECEIVE_USER, + payload: { + uuid, + }, +}); + +function* getUserSaga(action) { + const { uuid } = action.payload; + const user = yield call(UserService.getUser, uuid); + yield put(receiveUserSuccess(user)); +} + +const receiveUserSuccess = (user: User) => ({ + type: RECEIVE_USER, + payload: { user }, +}); + + +// #listUsers +export const listUsersAction = (uuid) => ({ + type: SAGA_RECEIVE_USERS, + payload: { + uuid, + }, +}); + +function * listUsersSaga() { + const users = yield call(UserService.listUsers); + yield put(receiveUsersSuccess(users)); +} + +const receiveUsersSuccess = (users: User[]) => ({ + type: RECEIVE_USERS, + payload: { users }, +}); + diff --git a/packages/ui-core/src/user/constants.ts b/packages/ui-express/src/user/constants.ts similarity index 89% rename from packages/ui-core/src/user/constants.ts rename to packages/ui-express/src/user/constants.ts index dfbd68f295b5c4d30afa76cef958cd25936124e6..4dd10ea356cbb8e221eadc601c8f6158678f267a 100644 --- a/packages/ui-core/src/user/constants.ts +++ b/packages/ui-express/src/user/constants.ts @@ -3,7 +3,6 @@ export const USER_LOGIN_FORM = 'user/form/USER_LOGIN_FORM'; export const RECEIVE_USER = 'user/public/RECEIVE_USER'; export const RECEIVE_USERS = 'user/public/RECEIVE_USERS'; -export const LOGIN_USER = 'user/public/LOGIN_USER'; export const SAGA_RECEIVE_USER = 'saga/user/public/RECEIVE_USER'; diff --git a/packages/ui-core/src/user/reducer/index.ts b/packages/ui-express/src/user/reducer/index.ts similarity index 73% rename from packages/ui-core/src/user/reducer/index.ts rename to packages/ui-express/src/user/reducer/index.ts index 6452cd72579dc7923c217133f7586f3480c9752f..aee53d4baf6b77566d35d41f995999c1678115ec 100644 --- a/packages/ui-core/src/user/reducer/index.ts +++ b/packages/ui-express/src/user/reducer/index.ts @@ -1,5 +1,5 @@ import { combineReducers } from 'redux'; -import userPublic from '@/user/reducer/public'; +import userPublic from 'user/reducer/public'; const rootReducer = combineReducers({ public: userPublic, diff --git a/packages/ui-core/src/user/reducer/public.ts b/packages/ui-express/src/user/reducer/public.ts similarity index 88% rename from packages/ui-core/src/user/reducer/public.ts rename to packages/ui-express/src/user/reducer/public.ts index 66a6eaaf62f2d2e0e19c4612a8f10872f99c0684..6f32c664cd5c1482c29e5a46055cdb16bdd2d742 100644 --- a/packages/ui-core/src/user/reducer/public.ts +++ b/packages/ui-express/src/user/reducer/public.ts @@ -1,8 +1,8 @@ import update from 'immutability-helper'; // Constants -import { RECEIVE_USER, RECEIVE_USERS } from '@/user/constants'; +import { RECEIVE_USER, RECEIVE_USERS } from 'user/constants'; // Model -import User from '@/core/model/user/User'; +import User from '@grin-global/ui-core/model/user/User'; const initialState: { users: User[], diff --git a/packages/ui-core/src/user/routes.ts b/packages/ui-express/src/user/routes.ts similarity index 66% rename from packages/ui-core/src/user/routes.ts rename to packages/ui-express/src/user/routes.ts index 8030e3dac0edfd7588c4a11b589e78ddbe5d0f00..06f05fcebc24ce05fda4890973f32a94cab5d62f 100644 --- a/packages/ui-core/src/user/routes.ts +++ b/packages/ui-express/src/user/routes.ts @@ -1,26 +1,26 @@ -import Loadable from '@/core/utilities/CustomReactLoadable'; +import Loadable from '@grin-global/ui-core/utilities/CustomReactLoadable'; // model -import IRoute from '@/core/model/common/IRoute'; +import IRoute from '@grin-global/ui-core/model/common/IRoute'; const publicRoutes: IRoute[] = [ { exact: true, component: Loadable({ - loader: () => import(/* webpackMode:"lazy", webpackChunkName: "user" */'@/user/ui/LoginPage'), + loader: () => import(/* webpackMode:"lazy", webpackChunkName: "user" */'user/ui/LoginPage'), }), path: '/login', }, { exact: true, component: Loadable({ - loader: () => import(/* webpackMode:"lazy", webpackChunkName: "user" */'@/user/ui/admin/BrowsePage'), + loader: () => import(/* webpackMode:"lazy", webpackChunkName: "user" */ 'user/ui/admin/BrowsePage'), }), path: '/user', }, { component: Loadable({ - loader: () => import(/* webpackMode:"lazy", webpackChunkName: "user" */'@/user/ui/admin/DetailsPage'), + loader: () => import(/* webpackMode:"lazy", webpackChunkName: "user" */'user/ui/admin/DetailsPage'), }), path: '/user/:uuid', }, diff --git a/packages/ui-core/src/user/translations.json b/packages/ui-express/src/user/translations.json similarity index 100% rename from packages/ui-core/src/user/translations.json rename to packages/ui-express/src/user/translations.json diff --git a/packages/ui-core/src/user/ui/LoginPage.tsx b/packages/ui-express/src/user/ui/LoginPage.tsx similarity index 91% rename from packages/ui-core/src/user/ui/LoginPage.tsx rename to packages/ui-express/src/user/ui/LoginPage.tsx index 9f6392b5692ba8bf09fe2c484f80b6a4000bc449..d3751c8777f8675fdee863521c6516cedfeea8af 100644 --- a/packages/ui-core/src/user/ui/LoginPage.tsx +++ b/packages/ui-express/src/user/ui/LoginPage.tsx @@ -3,9 +3,9 @@ import { bindActionCreators, compose } from 'redux'; import { connect } from 'react-redux'; import { WithTranslation, withTranslation } from 'react-i18next'; // action -import { loginUserAction, logoutUserAction } from '@/user/action/public'; +import { loginUserAction, logoutUserAction } from '@grin-global/ui-core/action/login'; // ui -import LoginForm from '@/user/ui/c/form/LoginForm'; +import LoginForm from 'user/ui/c/form/LoginForm'; interface ILoginPageProps extends React.ClassAttributes, WithTranslation { diff --git a/packages/ui-core/src/user/ui/admin/BrowsePage.tsx b/packages/ui-express/src/user/ui/admin/BrowsePage.tsx similarity index 91% rename from packages/ui-core/src/user/ui/admin/BrowsePage.tsx rename to packages/ui-express/src/user/ui/admin/BrowsePage.tsx index 62e395f6e49dd30578d6ea63af38da4dac568c30..0f5afc6e9ab0e2909bd23b2f541bd68d88d6e300 100644 --- a/packages/ui-core/src/user/ui/admin/BrowsePage.tsx +++ b/packages/ui-express/src/user/ui/admin/BrowsePage.tsx @@ -3,9 +3,9 @@ import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { Link } from 'react-router-dom'; // Action -import { listUsersAction } from '@/user/action/public'; +import { listUsersAction } from 'user/action/public'; // Model -import User from '@/core/model/user/User'; +import User from '@grin-global/ui-core/model/user/User'; interface IBrowsePageProps extends React.ClassAttributes { listUsersAction: () => void; diff --git a/packages/ui-core/src/user/ui/admin/DetailsPage.tsx b/packages/ui-express/src/user/ui/admin/DetailsPage.tsx similarity index 91% rename from packages/ui-core/src/user/ui/admin/DetailsPage.tsx rename to packages/ui-express/src/user/ui/admin/DetailsPage.tsx index 3633e905996a7a3ec7983f2d1acb005575138d1f..6978e8e61f1ba352347454bd3ef8e997f4ffec55 100644 --- a/packages/ui-core/src/user/ui/admin/DetailsPage.tsx +++ b/packages/ui-express/src/user/ui/admin/DetailsPage.tsx @@ -3,9 +3,9 @@ import { bindActionCreators, compose } from 'redux'; import { connect } from 'react-redux'; import { WithTranslation, withTranslation } from 'react-i18next'; // Action -import { getUserAction } from '@/user/action/public'; +import { getUserAction } from 'user/action/public'; // Model -import User from '@/core/model/user/User'; +import User from '@grin-global/ui-core/model/user/User'; interface IUserDetailsPage extends React.ClassAttributes, WithTranslation { diff --git a/packages/ui-core/src/user/ui/c/form/LoginForm.tsx b/packages/ui-express/src/user/ui/c/form/LoginForm.tsx similarity index 91% rename from packages/ui-core/src/user/ui/c/form/LoginForm.tsx rename to packages/ui-express/src/user/ui/c/form/LoginForm.tsx index 76ae650cae562c377f704ec32033b7124cd882a2..a55cbb20fd7d8602f78464a78031c69104e0820f 100644 --- a/packages/ui-core/src/user/ui/c/form/LoginForm.tsx +++ b/packages/ui-express/src/user/ui/c/form/LoginForm.tsx @@ -3,9 +3,9 @@ import { compose } from 'redux'; import { Field, InjectedFormProps, reduxForm } from 'redux-form'; import { withTranslation, WithTranslation } from 'react-i18next'; // constants -import { USER_LOGIN_FORM } from '@/user/constants'; +import { USER_LOGIN_FORM } from '@grin-global/ui-core/constants/login'; // model -import User from '@/core/model/user/User'; +import User from '@grin-global/ui-core/model/user/User'; interface ILoginFormProps extends React.ClassAttributes, WithTranslation, InjectedFormProps { diff --git a/packages/ui-core/src/user/ui/c/form/RegistrationForm.tsx b/packages/ui-express/src/user/ui/c/form/RegistrationForm.tsx similarity index 100% rename from packages/ui-core/src/user/ui/c/form/RegistrationForm.tsx rename to packages/ui-express/src/user/ui/c/form/RegistrationForm.tsx diff --git a/packages/ui-express/tsconfig.json b/packages/ui-express/tsconfig.json index 26d5d94f21cef686035c229d082f66028dc13fba..899a3fab78a4bcdbe8a738ca221fb21c107371dd 100644 --- a/packages/ui-express/tsconfig.json +++ b/packages/ui-express/tsconfig.json @@ -6,15 +6,15 @@ "*": [ "*", "src/*", + "server/*", "node_modules/*" ], - "@/*": [ - "../ui-core/*", - "../ui-core/src/*" - ], "@grin-global/ui-core/*": [ "../ui-core/*", "../ui-core/src/*" + ], + "@grin-global/i18n/*": [ + "../i18n/src/*" ] }, "outDir": "../../target",