diff --git a/.gitignore b/.gitignore index e427ff3..d0eb167 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ node_modules/ */node_modules/ */build/ + +**/node_modules/ +**/build/ +.DS_Store +.env \ No newline at end of file diff --git a/app-shell/src/_schema.json b/app-shell/src/_schema.json index cc9a451..0fa56a6 100644 --- a/app-shell/src/_schema.json +++ b/app-shell/src/_schema.json @@ -1,5 +1,4 @@ - - { - "Initial version": "{\"iv\":\"+NJWfM1F4skyRoxO\",\"encryptedData\":\"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\"}" -} + "Initial version": "{\"iv\":\"+NJWfM1F4skyRoxO\",\"encryptedData\":\"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\"}", + "v1.1-NewFrontEndSearch": "{\"iv\":\"/3+kfh1fqIgInvAm\",\"encryptedData\":\"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\"}" +} \ No newline at end of file diff --git a/backend/src/db/api/users.js b/backend/src/db/api/users.js index 3a11e69..a43efd4 100644 --- a/backend/src/db/api/users.js +++ b/backend/src/db/api/users.js @@ -34,6 +34,8 @@ module.exports = class UsersDBApi { passwordResetTokenExpiresAt: data.data.passwordResetTokenExpiresAt || null, provider: data.data.provider || null, + title: data.data.title || null, + location: data.data.location || null, importHash: data.data.importHash || null, createdById: currentUser.id, updatedById: currentUser.id, @@ -60,6 +62,10 @@ module.exports = class UsersDBApi { transaction, }); + await users.setTags(data.data.tags || [], { + transaction, + }); + await FileDBApi.replaceRelationFiles( { belongsTo: db.users.getTableName(), @@ -96,6 +102,8 @@ module.exports = class UsersDBApi { passwordResetToken: item.passwordResetToken || null, passwordResetTokenExpiresAt: item.passwordResetTokenExpiresAt || null, provider: item.provider || null, + title: item.title || null, + location: item.location || null, importHash: item.importHash || null, createdById: currentUser.id, updatedById: currentUser.id, @@ -178,6 +186,10 @@ module.exports = class UsersDBApi { if (data.provider !== undefined) updatePayload.provider = data.provider; + if (data.title !== undefined) updatePayload.title = data.title; + + if (data.location !== undefined) updatePayload.location = data.location; + updatePayload.updatedById = currentUser.id; await users.update(updatePayload, { transaction }); @@ -196,6 +208,10 @@ module.exports = class UsersDBApi { }); } + if (data.tags !== undefined) { + await users.setTags(data.tags, { transaction }); + } + await FileDBApi.replaceRelationFiles( { belongsTo: db.users.getTableName(), @@ -285,6 +301,10 @@ module.exports = class UsersDBApi { transaction, }); + output.tags = await users.getTags({ + transaction, + }); + return output; } @@ -333,6 +353,12 @@ module.exports = class UsersDBApi { required: false, }, + { + model: db.tags, + as: 'tags', + required: false, + }, + { model: db.file, as: 'avatar', @@ -411,6 +437,20 @@ module.exports = class UsersDBApi { }; } + if (filter.title) { + where = { + ...where, + [Op.and]: Utils.ilike('users', 'title', filter.title), + }; + } + + if (filter.location) { + where = { + ...where, + [Op.and]: Utils.ilike('users', 'location', filter.location), + }; + } + if (filter.emailVerificationTokenExpiresAtRange) { const [start, end] = filter.emailVerificationTokenExpiresAtRange; @@ -512,6 +552,38 @@ module.exports = class UsersDBApi { ]; } + if (filter.tags) { + const searchTerms = filter.tags.split('|'); + + include = [ + { + model: db.tags, + as: 'tags_filter', + required: searchTerms.length > 0, + where: + searchTerms.length > 0 + ? { + [Op.or]: [ + { + id: { + [Op.in]: searchTerms.map((term) => Utils.uuid(term)), + }, + }, + { + name: { + [Op.or]: searchTerms.map((term) => ({ + [Op.iLike]: `%${term}%`, + })), + }, + }, + ], + } + : undefined, + }, + ...include, + ]; + } + if (filter.createdAtRange) { const [start, end] = filter.createdAtRange; diff --git a/backend/src/db/migrations/1758082362735.js b/backend/src/db/migrations/1758082362735.js new file mode 100644 index 0000000..c5578e0 --- /dev/null +++ b/backend/src/db/migrations/1758082362735.js @@ -0,0 +1,47 @@ +module.exports = { + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async up(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + await queryInterface.addColumn( + 'users', + 'title', + { + type: Sequelize.DataTypes.TEXT, + }, + { transaction }, + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + }, + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async down(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + await queryInterface.removeColumn('users', 'title', { transaction }); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + }, +}; diff --git a/backend/src/db/migrations/1758082383753.js b/backend/src/db/migrations/1758082383753.js new file mode 100644 index 0000000..1981f84 --- /dev/null +++ b/backend/src/db/migrations/1758082383753.js @@ -0,0 +1,47 @@ +module.exports = { + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async up(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + await queryInterface.addColumn( + 'users', + 'location', + { + type: Sequelize.DataTypes.TEXT, + }, + { transaction }, + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + }, + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async down(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + await queryInterface.removeColumn('users', 'location', { transaction }); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + }, +}; diff --git a/backend/src/db/migrations/1758082403503.js b/backend/src/db/migrations/1758082403503.js new file mode 100644 index 0000000..e6bfba3 --- /dev/null +++ b/backend/src/db/migrations/1758082403503.js @@ -0,0 +1,36 @@ +module.exports = { + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async up(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + }, + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async down(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + }, +}; diff --git a/backend/src/db/models/users.js b/backend/src/db/models/users.js index 74e549e..30a41b7 100644 --- a/backend/src/db/models/users.js +++ b/backend/src/db/models/users.js @@ -68,6 +68,14 @@ module.exports = function (sequelize, DataTypes) { type: DataTypes.TEXT, }, + title: { + type: DataTypes.TEXT, + }, + + location: { + type: DataTypes.TEXT, + }, + importHash: { type: DataTypes.STRING(255), allowNull: true, @@ -100,6 +108,24 @@ module.exports = function (sequelize, DataTypes) { through: 'usersCustom_permissionsPermissions', }); + db.users.belongsToMany(db.tags, { + as: 'tags', + foreignKey: { + name: 'users_tagsId', + }, + constraints: false, + through: 'usersTagsTags', + }); + + db.users.belongsToMany(db.tags, { + as: 'tags_filter', + foreignKey: { + name: 'users_tagsId', + }, + constraints: false, + through: 'usersTagsTags', + }); + /// loop through entities and it's fields, and if ref === current e[name] and create relation has many on parent entity //end loop diff --git a/backend/src/db/seeders/20231127130745-sample-data.js b/backend/src/db/seeders/20231127130745-sample-data.js index f5331f4..7b14345 100644 --- a/backend/src/db/seeders/20231127130745-sample-data.js +++ b/backend/src/db/seeders/20231127130745-sample-data.js @@ -17,10 +17,6 @@ const AlertsData = [ { message: 'New tag created: AI', }, - - { - message: 'User Bob Brown updated profile', - }, ]; const TagsData = [ @@ -39,18 +35,14 @@ const TagsData = [ { name: 'Development', - category: 'Profession', - }, - - { - name: 'Marketing', - category: 'Expertise', }, ]; // Similar logic for "relation_many" +// Similar logic for "relation_many" + module.exports = { up: async (queryInterface, Sequelize) => { await Alerts.bulkCreate(AlertsData); @@ -59,6 +51,7 @@ module.exports = { await Promise.all([ // Similar logic for "relation_many" + // Similar logic for "relation_many" ]); }, diff --git a/backend/src/routes/users.js b/backend/src/routes/users.js index a6d214f..d2d04b9 100644 --- a/backend/src/routes/users.js +++ b/backend/src/routes/users.js @@ -32,6 +32,12 @@ router.use(checkCrudPermissions('users')); * email: * type: string * default: email + * title: + * type: string + * default: title + * location: + * type: string + * default: location */ @@ -308,7 +314,15 @@ router.get( const currentUser = req.currentUser; const payload = await UsersDBApi.findAll(req.query, { currentUser }); if (filetype && filetype === 'csv') { - const fields = ['id', 'firstName', 'lastName', 'phoneNumber', 'email']; + const fields = [ + 'id', + 'firstName', + 'lastName', + 'phoneNumber', + 'email', + 'title', + 'location', + ]; const opts = { fields }; try { const csv = parse(payload.rows, opts); diff --git a/backend/src/services/search.js b/backend/src/services/search.js index 03c5782..954f09b 100644 --- a/backend/src/services/search.js +++ b/backend/src/services/search.js @@ -41,7 +41,19 @@ module.exports = class SearchService { throw new ValidationError('iam.errors.searchQueryRequired'); } const tableColumns = { - users: ['firstName', 'lastName', 'phoneNumber', 'email'], + users: [ + 'firstName', + + 'lastName', + + 'phoneNumber', + + 'email', + + 'title', + + 'location', + ], alerts: ['message'], diff --git a/frontend/json/runtimeError.json b/frontend/json/runtimeError.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/frontend/json/runtimeError.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/frontend/src/components/Users/CardUsers.tsx b/frontend/src/components/Users/CardUsers.tsx index 91f2dda..b18e0b4 100644 --- a/frontend/src/components/Users/CardUsers.tsx +++ b/frontend/src/components/Users/CardUsers.tsx @@ -173,6 +173,35 @@ const CardUsers = ({ + +
+
Title
+
+
{item.title}
+
+
+ +
+
+ Location +
+
+
+ {item.location} +
+
+
+ +
+
Tags
+
+
+ {dataFormatter + .tagsManyListFormatter(item.tags) + .join(', ')} +
+
+
))} diff --git a/frontend/src/components/Users/ListUsers.tsx b/frontend/src/components/Users/ListUsers.tsx index 2533b8a..c2400ac 100644 --- a/frontend/src/components/Users/ListUsers.tsx +++ b/frontend/src/components/Users/ListUsers.tsx @@ -115,6 +115,25 @@ const ListUsers = ({ .join(', ')}

+ +
+

Title

+

{item.title}

+
+ +
+

Location

+

{item.location}

+
+ +
+

Tags

+

+ {dataFormatter + .tagsManyListFormatter(item.tags) + .join(', ')} +

+
+ dataFormatter.tagsManyListFormatter(value).join(', '), + renderEditCell: (params) => ( + + ), + }, + { field: 'actions', type: 'actions', diff --git a/frontend/src/components/WebPageComponents/Footer.tsx b/frontend/src/components/WebPageComponents/Footer.tsx index 8a84dff..7da214b 100644 --- a/frontend/src/components/WebPageComponents/Footer.tsx +++ b/frontend/src/components/WebPageComponents/Footer.tsx @@ -17,9 +17,9 @@ export default function WebSiteFooter({ projectName }: WebSiteFooterProps) { const borders = useAppSelector((state) => state.style.borders); const websiteHeder = useAppSelector((state) => state.style.websiteHeder); - const style = FooterStyle.WITH_PAGES; + const style = FooterStyle.WITH_PROJECT_NAME; - const design = FooterDesigns.DEFAULT_DESIGN; + const design = FooterDesigns.DESIGN_DIVERSITY; return (
item.name); + }, + tagsOneListFormatter(val) { + if (!val) return ''; + return val.name; + }, + tagsManyListFormatterEdit(val) { + if (!val || !val.length) return []; + return val.map((item) => { + return { id: item.id, label: item.name }; + }); + }, + tagsOneListFormatterEdit(val) { + if (!val) return ''; + return { label: val.name, id: val.id }; + }, + rolesManyListFormatter(val) { if (!val || !val.length) return []; return val.map((item) => item.name); diff --git a/frontend/src/pages/index.tsx b/frontend/src/pages/index.tsx index a118bfc..ed5ce8b 100644 --- a/frontend/src/pages/index.tsx +++ b/frontend/src/pages/index.tsx @@ -93,7 +93,7 @@ export default function WebSite() { { E-Mail Disabled + + Title + + Location @@ -138,6 +142,10 @@ const RolesView = () => { {dataFormatter.booleanFormatter(item.disabled)} + + {item.title} + + {item.location} ))} diff --git a/frontend/src/pages/users/[usersId].tsx b/frontend/src/pages/users/[usersId].tsx index e16077f..27380a2 100644 --- a/frontend/src/pages/users/[usersId].tsx +++ b/frontend/src/pages/users/[usersId].tsx @@ -52,6 +52,12 @@ const EditUsers = () => { custom_permissions: [], + title: '', + + location: '', + + tags: [], + password: '', }; const [initialValues, setInitialValues] = useState(initVals); @@ -170,6 +176,25 @@ const EditUsers = () => { > + + + + + + + + + + + + diff --git a/frontend/src/pages/users/users-edit.tsx b/frontend/src/pages/users/users-edit.tsx index 87d7090..70684ee 100644 --- a/frontend/src/pages/users/users-edit.tsx +++ b/frontend/src/pages/users/users-edit.tsx @@ -52,6 +52,12 @@ const EditUsersPage = () => { custom_permissions: [], + title: '', + + location: '', + + tags: [], + password: '', }; const [initialValues, setInitialValues] = useState(initVals); @@ -168,6 +174,25 @@ const EditUsersPage = () => { > + + + + + + + + + + + + diff --git a/frontend/src/pages/users/users-list.tsx b/frontend/src/pages/users/users-list.tsx index 6d03ebc..cfdc667 100644 --- a/frontend/src/pages/users/users-list.tsx +++ b/frontend/src/pages/users/users-list.tsx @@ -33,10 +33,13 @@ const UsersTablesPage = () => { { label: 'Last Name', title: 'lastName' }, { label: 'Phone Number', title: 'phoneNumber' }, { label: 'E-Mail', title: 'email' }, + { label: 'Title', title: 'title' }, + { label: 'Location', title: 'location' }, { label: 'App Role', title: 'app_role' }, { label: 'Custom Permissions', title: 'custom_permissions' }, + { label: 'Tags', title: 'tags' }, ]); const hasCreatePermission = diff --git a/frontend/src/pages/users/users-new.tsx b/frontend/src/pages/users/users-new.tsx index 4f3fa45..5726084 100644 --- a/frontend/src/pages/users/users-new.tsx +++ b/frontend/src/pages/users/users-new.tsx @@ -48,6 +48,12 @@ const initialValues = { app_role: '', custom_permissions: [], + + title: '', + + location: '', + + tags: [], }; const UsersNew = () => { @@ -140,6 +146,24 @@ const UsersNew = () => { > + + + + + + + + + + + + diff --git a/frontend/src/pages/users/users-table.tsx b/frontend/src/pages/users/users-table.tsx index a408cd6..5f82ad9 100644 --- a/frontend/src/pages/users/users-table.tsx +++ b/frontend/src/pages/users/users-table.tsx @@ -33,10 +33,13 @@ const UsersTablesPage = () => { { label: 'Last Name', title: 'lastName' }, { label: 'Phone Number', title: 'phoneNumber' }, { label: 'E-Mail', title: 'email' }, + { label: 'Title', title: 'title' }, + { label: 'Location', title: 'location' }, { label: 'App Role', title: 'app_role' }, { label: 'Custom Permissions', title: 'custom_permissions' }, + { label: 'Tags', title: 'tags' }, ]); const hasCreatePermission = diff --git a/frontend/src/pages/users/users-view.tsx b/frontend/src/pages/users/users-view.tsx index ce0851d..46db75b 100644 --- a/frontend/src/pages/users/users-view.tsx +++ b/frontend/src/pages/users/users-view.tsx @@ -138,6 +138,55 @@ const UsersView = () => { +
+

Title

+

{users?.title}

+
+ +
+

Location

+

{users?.location}

+
+ + <> +

Tags

+ +
+ + + + + + + + + + {users.tags && + Array.isArray(users.tags) && + users.tags.map((item: any) => ( + + router.push(`/tags/tags-view/?id=${item.id}`) + } + > + + + + + ))} + +
NameCategory
{item.name}{item.category}
+
+ {!users?.tags?.length && ( +
No data
+ )} +
+ +