From 6764c421bf01097df195f6ee1a948d65cc081bc8 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Thu, 19 Jun 2025 01:45:21 +0000 Subject: [PATCH] Updated via schema editor on 2025-06-19 01:44 --- app-shell/src/_schema.json | 3 +- backend/src/db/api/owners.js | 235 +++++++++ backend/src/db/migrations/1750297457603.js | 72 +++ backend/src/db/models/owners.js | 45 ++ .../db/seeders/20200430130760-user-roles.js | 26 + .../db/seeders/20231127130745-sample-data.js | 38 +- backend/src/db/seeders/20250619014417.js | 87 ++++ backend/src/index.js | 8 + backend/src/routes/owners.js | 429 ++++++++++++++++ backend/src/services/owners.js | 114 +++++ frontend/src/components/Owners/CardOwners.tsx | 98 ++++ frontend/src/components/Owners/ListOwners.tsx | 82 +++ .../src/components/Owners/TableOwners.tsx | 481 ++++++++++++++++++ .../components/Owners/configureOwnersCols.tsx | 62 +++ frontend/src/menuAside.ts | 8 + frontend/src/pages/dashboard.tsx | 35 ++ frontend/src/pages/owners/[ownersId].tsx | 118 +++++ frontend/src/pages/owners/owners-edit.tsx | 116 +++++ frontend/src/pages/owners/owners-list.tsx | 160 ++++++ frontend/src/pages/owners/owners-new.tsx | 92 ++++ frontend/src/pages/owners/owners-table.tsx | 159 ++++++ frontend/src/pages/owners/owners-view.tsx | 76 +++ frontend/src/stores/owners/ownersSlice.ts | 236 +++++++++ frontend/src/stores/store.ts | 2 + 24 files changed, 2766 insertions(+), 16 deletions(-) create mode 100644 backend/src/db/api/owners.js create mode 100644 backend/src/db/migrations/1750297457603.js create mode 100644 backend/src/db/models/owners.js create mode 100644 backend/src/db/seeders/20250619014417.js create mode 100644 backend/src/routes/owners.js create mode 100644 backend/src/services/owners.js create mode 100644 frontend/src/components/Owners/CardOwners.tsx create mode 100644 frontend/src/components/Owners/ListOwners.tsx create mode 100644 frontend/src/components/Owners/TableOwners.tsx create mode 100644 frontend/src/components/Owners/configureOwnersCols.tsx create mode 100644 frontend/src/pages/owners/[ownersId].tsx create mode 100644 frontend/src/pages/owners/owners-edit.tsx create mode 100644 frontend/src/pages/owners/owners-list.tsx create mode 100644 frontend/src/pages/owners/owners-new.tsx create mode 100644 frontend/src/pages/owners/owners-table.tsx create mode 100644 frontend/src/pages/owners/owners-view.tsx create mode 100644 frontend/src/stores/owners/ownersSlice.ts diff --git a/app-shell/src/_schema.json b/app-shell/src/_schema.json index 3bc9ec6..c8ecb75 100644 --- a/app-shell/src/_schema.json +++ b/app-shell/src/_schema.json @@ -2,5 +2,6 @@ "Initial version": "{\"iv\":\"MDROmsmUCD1Vf2/D\",\"encryptedData\":\"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\"}", "Updated via schema editor on 2025-06-19 01:28": "{\"iv\":\"zPU1/ngMdqJmMgs+\",\"encryptedData\":\"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\"}", "Updated via schema editor on 2025-06-19 01:30": "{\"iv\":\"5vUJuPbqfvBgIa/U\",\"encryptedData\":\"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\"}", - "Updated via schema editor on 2025-06-19 01:34": "{\"iv\":\"8QISG/j1JIwJAmGC\",\"encryptedData\":\"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\"}" + "Updated via schema editor on 2025-06-19 01:34": "{\"iv\":\"8QISG/j1JIwJAmGC\",\"encryptedData\":\"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\"}", + "Updated via schema editor on 2025-06-19 01:44": "{\"iv\":\"DeGo275SwGSFqUzc\",\"encryptedData\":\"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\"}" } \ No newline at end of file diff --git a/backend/src/db/api/owners.js b/backend/src/db/api/owners.js new file mode 100644 index 0000000..97bfafc --- /dev/null +++ b/backend/src/db/api/owners.js @@ -0,0 +1,235 @@ +const db = require('../models'); +const FileDBApi = require('./file'); +const crypto = require('crypto'); +const Utils = require('../utils'); + +const Sequelize = db.Sequelize; +const Op = Sequelize.Op; + +module.exports = class OwnersDBApi { + static async create(data, options) { + const currentUser = (options && options.currentUser) || { id: null }; + const transaction = (options && options.transaction) || undefined; + + const owners = await db.owners.create( + { + id: data.id || undefined, + + importHash: data.importHash || null, + createdById: currentUser.id, + updatedById: currentUser.id, + }, + { transaction }, + ); + + return owners; + } + + static async bulkImport(data, options) { + const currentUser = (options && options.currentUser) || { id: null }; + const transaction = (options && options.transaction) || undefined; + + // Prepare data - wrapping individual data transformations in a map() method + const ownersData = data.map((item, index) => ({ + id: item.id || undefined, + + importHash: item.importHash || null, + createdById: currentUser.id, + updatedById: currentUser.id, + createdAt: new Date(Date.now() + index * 1000), + })); + + // Bulk create items + const owners = await db.owners.bulkCreate(ownersData, { transaction }); + + // For each item created, replace relation files + + return owners; + } + + static async update(id, data, options) { + const currentUser = (options && options.currentUser) || { id: null }; + const transaction = (options && options.transaction) || undefined; + + const owners = await db.owners.findByPk(id, {}, { transaction }); + + const updatePayload = {}; + + updatePayload.updatedById = currentUser.id; + + await owners.update(updatePayload, { transaction }); + + return owners; + } + + static async deleteByIds(ids, options) { + const currentUser = (options && options.currentUser) || { id: null }; + const transaction = (options && options.transaction) || undefined; + + const owners = await db.owners.findAll({ + where: { + id: { + [Op.in]: ids, + }, + }, + transaction, + }); + + await db.sequelize.transaction(async (transaction) => { + for (const record of owners) { + await record.update({ deletedBy: currentUser.id }, { transaction }); + } + for (const record of owners) { + await record.destroy({ transaction }); + } + }); + + return owners; + } + + static async remove(id, options) { + const currentUser = (options && options.currentUser) || { id: null }; + const transaction = (options && options.transaction) || undefined; + + const owners = await db.owners.findByPk(id, options); + + await owners.update( + { + deletedBy: currentUser.id, + }, + { + transaction, + }, + ); + + await owners.destroy({ + transaction, + }); + + return owners; + } + + static async findBy(where, options) { + const transaction = (options && options.transaction) || undefined; + + const owners = await db.owners.findOne({ where }, { transaction }); + + if (!owners) { + return owners; + } + + const output = owners.get({ plain: true }); + + return output; + } + + static async findAll(filter, options) { + const limit = filter.limit || 0; + let offset = 0; + let where = {}; + const currentPage = +filter.page; + + offset = currentPage * limit; + + const orderBy = null; + + const transaction = (options && options.transaction) || undefined; + + let include = []; + + if (filter) { + if (filter.id) { + where = { + ...where, + ['id']: Utils.uuid(filter.id), + }; + } + + if (filter.active !== undefined) { + where = { + ...where, + active: filter.active === true || filter.active === 'true', + }; + } + + if (filter.createdAtRange) { + const [start, end] = filter.createdAtRange; + + if (start !== undefined && start !== null && start !== '') { + where = { + ...where, + ['createdAt']: { + ...where.createdAt, + [Op.gte]: start, + }, + }; + } + + if (end !== undefined && end !== null && end !== '') { + where = { + ...where, + ['createdAt']: { + ...where.createdAt, + [Op.lte]: end, + }, + }; + } + } + } + + const queryOptions = { + where, + include, + distinct: true, + order: + filter.field && filter.sort + ? [[filter.field, filter.sort]] + : [['createdAt', 'desc']], + transaction: options?.transaction, + logging: console.log, + }; + + if (!options?.countOnly) { + queryOptions.limit = limit ? Number(limit) : undefined; + queryOptions.offset = offset ? Number(offset) : undefined; + } + + try { + const { rows, count } = await db.owners.findAndCountAll(queryOptions); + + return { + rows: options?.countOnly ? [] : rows, + count: count, + }; + } catch (error) { + console.error('Error executing query:', error); + throw error; + } + } + + static async findAllAutocomplete(query, limit, offset) { + let where = {}; + + if (query) { + where = { + [Op.or]: [ + { ['id']: Utils.uuid(query) }, + Utils.ilike('owners', 'id', query), + ], + }; + } + + const records = await db.owners.findAll({ + attributes: ['id', 'id'], + where, + limit: limit ? Number(limit) : undefined, + offset: offset ? Number(offset) : undefined, + orderBy: [['id', 'ASC']], + }); + + return records.map((record) => ({ + id: record.id, + label: record.id, + })); + } +}; diff --git a/backend/src/db/migrations/1750297457603.js b/backend/src/db/migrations/1750297457603.js new file mode 100644 index 0000000..aadf6e6 --- /dev/null +++ b/backend/src/db/migrations/1750297457603.js @@ -0,0 +1,72 @@ +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.createTable( + 'owners', + { + id: { + type: Sequelize.DataTypes.UUID, + defaultValue: Sequelize.DataTypes.UUIDV4, + primaryKey: true, + }, + createdById: { + type: Sequelize.DataTypes.UUID, + references: { + key: 'id', + model: 'users', + }, + }, + updatedById: { + type: Sequelize.DataTypes.UUID, + references: { + key: 'id', + model: 'users', + }, + }, + createdAt: { type: Sequelize.DataTypes.DATE }, + updatedAt: { type: Sequelize.DataTypes.DATE }, + deletedAt: { type: Sequelize.DataTypes.DATE }, + importHash: { + type: Sequelize.DataTypes.STRING(255), + allowNull: true, + unique: true, + }, + }, + { 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.dropTable('owners', { transaction }); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + }, +}; diff --git a/backend/src/db/models/owners.js b/backend/src/db/models/owners.js new file mode 100644 index 0000000..54762ff --- /dev/null +++ b/backend/src/db/models/owners.js @@ -0,0 +1,45 @@ +const config = require('../../config'); +const providers = config.providers; +const crypto = require('crypto'); +const bcrypt = require('bcrypt'); +const moment = require('moment'); + +module.exports = function (sequelize, DataTypes) { + const owners = sequelize.define( + 'owners', + { + id: { + type: DataTypes.UUID, + defaultValue: DataTypes.UUIDV4, + primaryKey: true, + }, + + importHash: { + type: DataTypes.STRING(255), + allowNull: true, + unique: true, + }, + }, + { + timestamps: true, + paranoid: true, + freezeTableName: true, + }, + ); + + owners.associate = (db) => { + /// loop through entities and it's fields, and if ref === current e[name] and create relation has many on parent entity + + //end loop + + db.owners.belongsTo(db.users, { + as: 'createdBy', + }); + + db.owners.belongsTo(db.users, { + as: 'updatedBy', + }); + }; + + return owners; +}; diff --git a/backend/src/db/seeders/20200430130760-user-roles.js b/backend/src/db/seeders/20200430130760-user-roles.js index b8c9f3f..14c9baf 100644 --- a/backend/src/db/seeders/20200430130760-user-roles.js +++ b/backend/src/db/seeders/20200430130760-user-roles.js @@ -97,6 +97,7 @@ module.exports = { 'units', 'roles', 'permissions', + 'owners', , ]; await queryInterface.bulkInsert( @@ -849,6 +850,31 @@ primary key ("roles_permissionsId", "permissionId") permissionId: getId('DELETE_PERMISSIONS'), }, + { + createdAt, + updatedAt, + roles_permissionsId: getId('Administrator'), + permissionId: getId('CREATE_OWNERS'), + }, + { + createdAt, + updatedAt, + roles_permissionsId: getId('Administrator'), + permissionId: getId('READ_OWNERS'), + }, + { + createdAt, + updatedAt, + roles_permissionsId: getId('Administrator'), + permissionId: getId('UPDATE_OWNERS'), + }, + { + createdAt, + updatedAt, + roles_permissionsId: getId('Administrator'), + permissionId: getId('DELETE_OWNERS'), + }, + { createdAt, updatedAt, diff --git a/backend/src/db/seeders/20231127130745-sample-data.js b/backend/src/db/seeders/20231127130745-sample-data.js index 7fa494e..b3a7289 100644 --- a/backend/src/db/seeders/20231127130745-sample-data.js +++ b/backend/src/db/seeders/20231127130745-sample-data.js @@ -11,6 +11,8 @@ const Notices = db.notices; const Units = db.units; +const Owners = db.owners; + const BudgetsData = [ { year: 2023, @@ -85,7 +87,7 @@ const MaintenanceRequestsData = [ description: 'Leaking faucet in kitchen', - status: 'pending', + status: 'in_progress', request_date: new Date('2023-10-01T10:00:00Z'), }, @@ -105,7 +107,7 @@ const MaintenanceRequestsData = [ description: 'Heating not working', - status: 'completed', + status: 'pending', request_date: new Date('2023-09-20T09:00:00Z'), }, @@ -115,7 +117,7 @@ const MaintenanceRequestsData = [ description: 'Elevator malfunction', - status: 'completed', + status: 'pending', request_date: new Date('2023-10-02T11:15:00Z'), }, @@ -171,11 +173,11 @@ const UnitsData = [ balance: 250, - unit_factor: 6, + unit_factor: 1, - cond_fee: 58.08, + cond_fee: 52.98, - parking_stall: 6, + parking_stall: 7, }, { @@ -185,11 +187,11 @@ const UnitsData = [ balance: 0, - unit_factor: 4, + unit_factor: 1, - cond_fee: 59.96, + cond_fee: 98.25, - parking_stall: 5, + parking_stall: 9, }, { @@ -199,11 +201,11 @@ const UnitsData = [ balance: 150, - unit_factor: 4, + unit_factor: 5, - cond_fee: 96.18, + cond_fee: 59.63, - parking_stall: 7, + parking_stall: 8, }, { @@ -213,14 +215,16 @@ const UnitsData = [ balance: 0, - unit_factor: 3, + unit_factor: 7, - cond_fee: 34.91, + cond_fee: 32.97, - parking_stall: 6, + parking_stall: 4, }, ]; +const OwnersData = [{}, {}, {}, {}]; + // Similar logic for "relation_many" async function associateUserWithUnit() { @@ -377,6 +381,8 @@ module.exports = { await Units.bulkCreate(UnitsData); + await Owners.bulkCreate(OwnersData); + await Promise.all([ // Similar logic for "relation_many" @@ -402,5 +408,7 @@ module.exports = { await queryInterface.bulkDelete('notices', null, {}); await queryInterface.bulkDelete('units', null, {}); + + await queryInterface.bulkDelete('owners', null, {}); }, }; diff --git a/backend/src/db/seeders/20250619014417.js b/backend/src/db/seeders/20250619014417.js new file mode 100644 index 0000000..7f2be8c --- /dev/null +++ b/backend/src/db/seeders/20250619014417.js @@ -0,0 +1,87 @@ +const { v4: uuid } = require('uuid'); +const db = require('../models'); +const Sequelize = require('sequelize'); +const config = require('../../config'); + +module.exports = { + /** + * @param{import("sequelize").QueryInterface} queryInterface + * @return {Promise} + */ + async up(queryInterface) { + const createdAt = new Date(); + const updatedAt = new Date(); + + /** @type {Map} */ + const idMap = new Map(); + + /** + * @param {string} key + * @return {string} + */ + function getId(key) { + if (idMap.has(key)) { + return idMap.get(key); + } + const id = uuid(); + idMap.set(key, id); + return id; + } + + /** + * @param {string} name + */ + function createPermissions(name) { + return [ + { + id: getId(`CREATE_${name.toUpperCase()}`), + createdAt, + updatedAt, + name: `CREATE_${name.toUpperCase()}`, + }, + { + id: getId(`READ_${name.toUpperCase()}`), + createdAt, + updatedAt, + name: `READ_${name.toUpperCase()}`, + }, + { + id: getId(`UPDATE_${name.toUpperCase()}`), + createdAt, + updatedAt, + name: `UPDATE_${name.toUpperCase()}`, + }, + { + id: getId(`DELETE_${name.toUpperCase()}`), + createdAt, + updatedAt, + name: `DELETE_${name.toUpperCase()}`, + }, + ]; + } + + const entities = ['owners']; + + const createdPermissions = entities.flatMap(createPermissions); + + // Add permissions to database + await queryInterface.bulkInsert('permissions', createdPermissions); + // Get permissions ids + const permissionsIds = createdPermissions.map((p) => p.id); + // Get admin role + const adminRole = await db.roles.findOne({ + where: { name: config.roles.admin }, + }); + + if (adminRole) { + // Add permissions to admin role if it exists + await adminRole.addPermissions(permissionsIds); + } + }, + down: async (queryInterface, Sequelize) => { + await queryInterface.bulkDelete( + 'permissions', + entities.flatMap(createPermissions), + ); + }, +}; diff --git a/backend/src/index.js b/backend/src/index.js index a108c7d..de5fb07 100644 --- a/backend/src/index.js +++ b/backend/src/index.js @@ -33,6 +33,8 @@ const rolesRoutes = require('./routes/roles'); const permissionsRoutes = require('./routes/permissions'); +const ownersRoutes = require('./routes/owners'); + const getBaseUrl = (url) => { if (!url) return ''; return url.endsWith('/api') ? url.slice(0, -4) : url; @@ -146,6 +148,12 @@ app.use( permissionsRoutes, ); +app.use( + '/api/owners', + passport.authenticate('jwt', { session: false }), + ownersRoutes, +); + app.use( '/api/openai', passport.authenticate('jwt', { session: false }), diff --git a/backend/src/routes/owners.js b/backend/src/routes/owners.js new file mode 100644 index 0000000..9c7d703 --- /dev/null +++ b/backend/src/routes/owners.js @@ -0,0 +1,429 @@ +const express = require('express'); + +const OwnersService = require('../services/owners'); +const OwnersDBApi = require('../db/api/owners'); +const wrapAsync = require('../helpers').wrapAsync; + +const router = express.Router(); + +const { parse } = require('json2csv'); + +const { checkCrudPermissions } = require('../middlewares/check-permissions'); + +router.use(checkCrudPermissions('owners')); + +/** + * @swagger + * components: + * schemas: + * Owners: + * type: object + * properties: + + */ + +/** + * @swagger + * tags: + * name: Owners + * description: The Owners managing API + */ + +/** + * @swagger + * /api/owners: + * post: + * security: + * - bearerAuth: [] + * tags: [Owners] + * summary: Add new item + * description: Add new item + * requestBody: + * required: true + * content: + * application/json: + * schema: + * properties: + * data: + * description: Data of the updated item + * type: object + * $ref: "#/components/schemas/Owners" + * responses: + * 200: + * description: The item was successfully added + * content: + * application/json: + * schema: + * $ref: "#/components/schemas/Owners" + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 405: + * description: Invalid input data + * 500: + * description: Some server error + */ +router.post( + '/', + wrapAsync(async (req, res) => { + const referer = + req.headers.referer || + `${req.protocol}://${req.hostname}${req.originalUrl}`; + const link = new URL(referer); + await OwnersService.create(req.body.data, req.currentUser, true, link.host); + const payload = true; + res.status(200).send(payload); + }), +); + +/** + * @swagger + * /api/budgets/bulk-import: + * post: + * security: + * - bearerAuth: [] + * tags: [Owners] + * summary: Bulk import items + * description: Bulk import items + * requestBody: + * required: true + * content: + * application/json: + * schema: + * properties: + * data: + * description: Data of the updated items + * type: array + * items: + * $ref: "#/components/schemas/Owners" + * responses: + * 200: + * description: The items were successfully imported + * content: + * application/json: + * schema: + * $ref: "#/components/schemas/Owners" + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 405: + * description: Invalid input data + * 500: + * description: Some server error + * + */ +router.post( + '/bulk-import', + wrapAsync(async (req, res) => { + const referer = + req.headers.referer || + `${req.protocol}://${req.hostname}${req.originalUrl}`; + const link = new URL(referer); + await OwnersService.bulkImport(req, res, true, link.host); + const payload = true; + res.status(200).send(payload); + }), +); + +/** + * @swagger + * /api/owners/{id}: + * put: + * security: + * - bearerAuth: [] + * tags: [Owners] + * summary: Update the data of the selected item + * description: Update the data of the selected item + * parameters: + * - in: path + * name: id + * description: Item ID to update + * required: true + * schema: + * type: string + * requestBody: + * description: Set new item data + * required: true + * content: + * application/json: + * schema: + * properties: + * id: + * description: ID of the updated item + * type: string + * data: + * description: Data of the updated item + * type: object + * $ref: "#/components/schemas/Owners" + * required: + * - id + * responses: + * 200: + * description: The item data was successfully updated + * content: + * application/json: + * schema: + * $ref: "#/components/schemas/Owners" + * 400: + * description: Invalid ID supplied + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 404: + * description: Item not found + * 500: + * description: Some server error + */ +router.put( + '/:id', + wrapAsync(async (req, res) => { + await OwnersService.update(req.body.data, req.body.id, req.currentUser); + const payload = true; + res.status(200).send(payload); + }), +); + +/** + * @swagger + * /api/owners/{id}: + * delete: + * security: + * - bearerAuth: [] + * tags: [Owners] + * summary: Delete the selected item + * description: Delete the selected item + * parameters: + * - in: path + * name: id + * description: Item ID to delete + * required: true + * schema: + * type: string + * responses: + * 200: + * description: The item was successfully deleted + * content: + * application/json: + * schema: + * $ref: "#/components/schemas/Owners" + * 400: + * description: Invalid ID supplied + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 404: + * description: Item not found + * 500: + * description: Some server error + */ +router.delete( + '/:id', + wrapAsync(async (req, res) => { + await OwnersService.remove(req.params.id, req.currentUser); + const payload = true; + res.status(200).send(payload); + }), +); + +/** + * @swagger + * /api/owners/deleteByIds: + * post: + * security: + * - bearerAuth: [] + * tags: [Owners] + * summary: Delete the selected item list + * description: Delete the selected item list + * requestBody: + * required: true + * content: + * application/json: + * schema: + * properties: + * ids: + * description: IDs of the updated items + * type: array + * responses: + * 200: + * description: The items was successfully deleted + * content: + * application/json: + * schema: + * $ref: "#/components/schemas/Owners" + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 404: + * description: Items not found + * 500: + * description: Some server error + */ +router.post( + '/deleteByIds', + wrapAsync(async (req, res) => { + await OwnersService.deleteByIds(req.body.data, req.currentUser); + const payload = true; + res.status(200).send(payload); + }), +); + +/** + * @swagger + * /api/owners: + * get: + * security: + * - bearerAuth: [] + * tags: [Owners] + * summary: Get all owners + * description: Get all owners + * responses: + * 200: + * description: Owners list successfully received + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: "#/components/schemas/Owners" + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 404: + * description: Data not found + * 500: + * description: Some server error + */ +router.get( + '/', + wrapAsync(async (req, res) => { + const filetype = req.query.filetype; + + const currentUser = req.currentUser; + const payload = await OwnersDBApi.findAll(req.query, { currentUser }); + if (filetype && filetype === 'csv') { + const fields = ['id']; + const opts = { fields }; + try { + const csv = parse(payload.rows, opts); + res.status(200).attachment(csv); + res.send(csv); + } catch (err) { + console.error(err); + } + } else { + res.status(200).send(payload); + } + }), +); + +/** + * @swagger + * /api/owners/count: + * get: + * security: + * - bearerAuth: [] + * tags: [Owners] + * summary: Count all owners + * description: Count all owners + * responses: + * 200: + * description: Owners count successfully received + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: "#/components/schemas/Owners" + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 404: + * description: Data not found + * 500: + * description: Some server error + */ +router.get( + '/count', + wrapAsync(async (req, res) => { + const currentUser = req.currentUser; + const payload = await OwnersDBApi.findAll(req.query, null, { + countOnly: true, + currentUser, + }); + + res.status(200).send(payload); + }), +); + +/** + * @swagger + * /api/owners/autocomplete: + * get: + * security: + * - bearerAuth: [] + * tags: [Owners] + * summary: Find all owners that match search criteria + * description: Find all owners that match search criteria + * responses: + * 200: + * description: Owners list successfully received + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: "#/components/schemas/Owners" + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 404: + * description: Data not found + * 500: + * description: Some server error + */ +router.get('/autocomplete', async (req, res) => { + const payload = await OwnersDBApi.findAllAutocomplete( + req.query.query, + req.query.limit, + req.query.offset, + ); + + res.status(200).send(payload); +}); + +/** + * @swagger + * /api/owners/{id}: + * get: + * security: + * - bearerAuth: [] + * tags: [Owners] + * summary: Get selected item + * description: Get selected item + * parameters: + * - in: path + * name: id + * description: ID of item to get + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Selected item successfully received + * content: + * application/json: + * schema: + * $ref: "#/components/schemas/Owners" + * 400: + * description: Invalid ID supplied + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 404: + * description: Item not found + * 500: + * description: Some server error + */ +router.get( + '/:id', + wrapAsync(async (req, res) => { + const payload = await OwnersDBApi.findBy({ id: req.params.id }); + + res.status(200).send(payload); + }), +); + +router.use('/', require('../helpers').commonErrorHandler); + +module.exports = router; diff --git a/backend/src/services/owners.js b/backend/src/services/owners.js new file mode 100644 index 0000000..009bca3 --- /dev/null +++ b/backend/src/services/owners.js @@ -0,0 +1,114 @@ +const db = require('../db/models'); +const OwnersDBApi = require('../db/api/owners'); +const processFile = require('../middlewares/upload'); +const ValidationError = require('./notifications/errors/validation'); +const csv = require('csv-parser'); +const axios = require('axios'); +const config = require('../config'); +const stream = require('stream'); + +module.exports = class OwnersService { + static async create(data, currentUser) { + const transaction = await db.sequelize.transaction(); + try { + await OwnersDBApi.create(data, { + currentUser, + transaction, + }); + + await transaction.commit(); + } catch (error) { + await transaction.rollback(); + throw error; + } + } + + static async bulkImport(req, res, sendInvitationEmails = true, host) { + const transaction = await db.sequelize.transaction(); + + try { + await processFile(req, res); + const bufferStream = new stream.PassThrough(); + const results = []; + + await bufferStream.end(Buffer.from(req.file.buffer, 'utf-8')); // convert Buffer to Stream + + await new Promise((resolve, reject) => { + bufferStream + .pipe(csv()) + .on('data', (data) => results.push(data)) + .on('end', async () => { + console.log('CSV results', results); + resolve(); + }) + .on('error', (error) => reject(error)); + }); + + await OwnersDBApi.bulkImport(results, { + transaction, + ignoreDuplicates: true, + validate: true, + currentUser: req.currentUser, + }); + + await transaction.commit(); + } catch (error) { + await transaction.rollback(); + throw error; + } + } + + static async update(data, id, currentUser) { + const transaction = await db.sequelize.transaction(); + try { + let owners = await OwnersDBApi.findBy({ id }, { transaction }); + + if (!owners) { + throw new ValidationError('ownersNotFound'); + } + + const updatedOwners = await OwnersDBApi.update(id, data, { + currentUser, + transaction, + }); + + await transaction.commit(); + return updatedOwners; + } catch (error) { + await transaction.rollback(); + throw error; + } + } + + static async deleteByIds(ids, currentUser) { + const transaction = await db.sequelize.transaction(); + + try { + await OwnersDBApi.deleteByIds(ids, { + currentUser, + transaction, + }); + + await transaction.commit(); + } catch (error) { + await transaction.rollback(); + throw error; + } + } + + static async remove(id, currentUser) { + const transaction = await db.sequelize.transaction(); + + try { + await OwnersDBApi.remove(id, { + currentUser, + transaction, + }); + + await transaction.commit(); + } catch (error) { + await transaction.rollback(); + throw error; + } + } +}; diff --git a/frontend/src/components/Owners/CardOwners.tsx b/frontend/src/components/Owners/CardOwners.tsx new file mode 100644 index 0000000..806a687 --- /dev/null +++ b/frontend/src/components/Owners/CardOwners.tsx @@ -0,0 +1,98 @@ +import React from 'react'; +import ImageField from '../ImageField'; +import ListActionsPopover from '../ListActionsPopover'; +import { useAppSelector } from '../../stores/hooks'; +import dataFormatter from '../../helpers/dataFormatter'; +import { Pagination } from '../Pagination'; +import { saveFile } from '../../helpers/fileSaver'; +import LoadingSpinner from '../LoadingSpinner'; +import Link from 'next/link'; + +import { hasPermission } from '../../helpers/userPermissions'; + +type Props = { + owners: any[]; + loading: boolean; + onDelete: (id: string) => void; + currentPage: number; + numPages: number; + onPageChange: (page: number) => void; +}; + +const CardOwners = ({ + owners, + loading, + onDelete, + currentPage, + numPages, + onPageChange, +}: Props) => { + const asideScrollbarsStyle = useAppSelector( + (state) => state.style.asideScrollbarsStyle, + ); + const bgColor = useAppSelector((state) => state.style.cardsColor); + const darkMode = useAppSelector((state) => state.style.darkMode); + const corners = useAppSelector((state) => state.style.corners); + const focusRing = useAppSelector((state) => state.style.focusRingColor); + + const currentUser = useAppSelector((state) => state.auth.currentUser); + const hasUpdatePermission = hasPermission(currentUser, 'UPDATE_OWNERS'); + + return ( +
+ {loading && } +
    + {!loading && + owners.map((item, index) => ( +
  • +
    + + {item.id} + + +
    + +
    +
    +
    +
  • + ))} + {!loading && owners.length === 0 && ( +
    +

    No data to display

    +
    + )} +
+
+ +
+
+ ); +}; + +export default CardOwners; diff --git a/frontend/src/components/Owners/ListOwners.tsx b/frontend/src/components/Owners/ListOwners.tsx new file mode 100644 index 0000000..1e090ea --- /dev/null +++ b/frontend/src/components/Owners/ListOwners.tsx @@ -0,0 +1,82 @@ +import React from 'react'; +import CardBox from '../CardBox'; +import ImageField from '../ImageField'; +import dataFormatter from '../../helpers/dataFormatter'; +import { saveFile } from '../../helpers/fileSaver'; +import ListActionsPopover from '../ListActionsPopover'; +import { useAppSelector } from '../../stores/hooks'; +import { Pagination } from '../Pagination'; +import LoadingSpinner from '../LoadingSpinner'; +import Link from 'next/link'; + +import { hasPermission } from '../../helpers/userPermissions'; + +type Props = { + owners: any[]; + loading: boolean; + onDelete: (id: string) => void; + currentPage: number; + numPages: number; + onPageChange: (page: number) => void; +}; + +const ListOwners = ({ + owners, + loading, + onDelete, + currentPage, + numPages, + onPageChange, +}: Props) => { + const currentUser = useAppSelector((state) => state.auth.currentUser); + const hasUpdatePermission = hasPermission(currentUser, 'UPDATE_OWNERS'); + + const corners = useAppSelector((state) => state.style.corners); + const bgColor = useAppSelector((state) => state.style.cardsColor); + + return ( + <> +
+ {loading && } + {!loading && + owners.map((item) => ( +
+ +
+ dark:divide-dark-700 overflow-x-auto' + } + > + +
+
+
+ ))} + {!loading && owners.length === 0 && ( +
+

No data to display

+
+ )} +
+
+ +
+ + ); +}; + +export default ListOwners; diff --git a/frontend/src/components/Owners/TableOwners.tsx b/frontend/src/components/Owners/TableOwners.tsx new file mode 100644 index 0000000..b92f0b8 --- /dev/null +++ b/frontend/src/components/Owners/TableOwners.tsx @@ -0,0 +1,481 @@ +import React, { useEffect, useState, useMemo } from 'react'; +import { createPortal } from 'react-dom'; +import { ToastContainer, toast } from 'react-toastify'; +import BaseButton from '../BaseButton'; +import CardBoxModal from '../CardBoxModal'; +import CardBox from '../CardBox'; +import { + fetch, + update, + deleteItem, + setRefetch, + deleteItemsByIds, +} from '../../stores/owners/ownersSlice'; +import { useAppDispatch, useAppSelector } from '../../stores/hooks'; +import { useRouter } from 'next/router'; +import { Field, Form, Formik } from 'formik'; +import { DataGrid, GridColDef } from '@mui/x-data-grid'; +import { loadColumns } from './configureOwnersCols'; +import _ from 'lodash'; +import dataFormatter from '../../helpers/dataFormatter'; +import { dataGridStyles } from '../../styles'; + +const perPage = 10; + +const TableSampleOwners = ({ + filterItems, + setFilterItems, + filters, + showGrid, +}) => { + const notify = (type, msg) => toast(msg, { type, position: 'bottom-center' }); + + const dispatch = useAppDispatch(); + const router = useRouter(); + + const pagesList = []; + const [id, setId] = useState(null); + const [currentPage, setCurrentPage] = useState(0); + const [filterRequest, setFilterRequest] = React.useState(''); + const [columns, setColumns] = useState([]); + const [selectedRows, setSelectedRows] = useState([]); + const [sortModel, setSortModel] = useState([ + { + field: '', + sort: 'desc', + }, + ]); + + const { + owners, + loading, + count, + notify: ownersNotify, + refetch, + } = useAppSelector((state) => state.owners); + const { currentUser } = useAppSelector((state) => state.auth); + const focusRing = useAppSelector((state) => state.style.focusRingColor); + const bgColor = useAppSelector((state) => state.style.bgLayoutColor); + const corners = useAppSelector((state) => state.style.corners); + const numPages = + Math.floor(count / perPage) === 0 ? 1 : Math.ceil(count / perPage); + for (let i = 0; i < numPages; i++) { + pagesList.push(i); + } + + const loadData = async (page = currentPage, request = filterRequest) => { + if (page !== currentPage) setCurrentPage(page); + if (request !== filterRequest) setFilterRequest(request); + const { sort, field } = sortModel[0]; + + const query = `?page=${page}&limit=${perPage}${request}&sort=${sort}&field=${field}`; + dispatch(fetch({ limit: perPage, page, query })); + }; + + useEffect(() => { + if (ownersNotify.showNotification) { + notify(ownersNotify.typeNotification, ownersNotify.textNotification); + } + }, [ownersNotify.showNotification]); + + useEffect(() => { + if (!currentUser) return; + loadData(); + }, [sortModel, currentUser]); + + useEffect(() => { + if (refetch) { + loadData(0); + dispatch(setRefetch(false)); + } + }, [refetch, dispatch]); + + const [isModalInfoActive, setIsModalInfoActive] = useState(false); + const [isModalTrashActive, setIsModalTrashActive] = useState(false); + + const handleModalAction = () => { + setIsModalInfoActive(false); + setIsModalTrashActive(false); + }; + + const handleDeleteModalAction = (id: string) => { + setId(id); + setIsModalTrashActive(true); + }; + const handleDeleteAction = async () => { + if (id) { + await dispatch(deleteItem(id)); + await loadData(0); + setIsModalTrashActive(false); + } + }; + + const generateFilterRequests = useMemo(() => { + let request = '&'; + filterItems.forEach((item) => { + const isRangeFilter = filters.find( + (filter) => + filter.title === item.fields.selectedField && + (filter.number || filter.date), + ); + + if (isRangeFilter) { + const from = item.fields.filterValueFrom; + const to = item.fields.filterValueTo; + if (from) { + request += `${item.fields.selectedField}Range=${from}&`; + } + if (to) { + request += `${item.fields.selectedField}Range=${to}&`; + } + } else { + const value = item.fields.filterValue; + if (value) { + request += `${item.fields.selectedField}=${value}&`; + } + } + }); + return request; + }, [filterItems, filters]); + + const deleteFilter = (value) => { + const newItems = filterItems.filter((item) => item.id !== value); + + if (newItems.length) { + setFilterItems(newItems); + } else { + loadData(0, ''); + + setFilterItems(newItems); + } + }; + + const handleSubmit = () => { + loadData(0, generateFilterRequests); + }; + + const handleChange = (id) => (e) => { + const value = e.target.value; + const name = e.target.name; + + setFilterItems( + filterItems.map((item) => { + if (item.id !== id) return item; + if (name === 'selectedField') return { id, fields: { [name]: value } }; + + return { id, fields: { ...item.fields, [name]: value } }; + }), + ); + }; + + const handleReset = () => { + setFilterItems([]); + loadData(0, ''); + }; + + const onPageChange = (page: number) => { + loadData(page); + setCurrentPage(page); + }; + + useEffect(() => { + if (!currentUser) return; + + loadColumns(handleDeleteModalAction, `owners`, currentUser).then( + (newCols) => setColumns(newCols), + ); + }, [currentUser]); + + const handleTableSubmit = async (id: string, data) => { + if (!_.isEmpty(data)) { + await dispatch(update({ id, data })) + .unwrap() + .then((res) => res) + .catch((err) => { + throw new Error(err); + }); + } + }; + + const onDeleteRows = async (selectedRows) => { + await dispatch(deleteItemsByIds(selectedRows)); + await loadData(0); + }; + + const controlClasses = + 'w-full py-2 px-2 my-2 rounded dark:placeholder-gray-400 ' + + ` ${bgColor} ${focusRing} ${corners} ` + + 'dark:bg-slate-800 border'; + + const dataGrid = ( +
+ `datagrid--row`} + rows={owners ?? []} + columns={columns} + initialState={{ + pagination: { + paginationModel: { + pageSize: 10, + }, + }, + }} + disableRowSelectionOnClick + onProcessRowUpdateError={(params) => { + console.log('Error', params); + }} + processRowUpdate={async (newRow, oldRow) => { + const data = dataFormatter.dataGridEditFormatter(newRow); + + try { + await handleTableSubmit(newRow.id, data); + return newRow; + } catch { + return oldRow; + } + }} + sortingMode={'server'} + checkboxSelection + onRowSelectionModelChange={(ids) => { + setSelectedRows(ids); + }} + onSortModelChange={(params) => { + params.length + ? setSortModel(params) + : setSortModel([{ field: '', sort: 'desc' }]); + }} + rowCount={count} + pageSizeOptions={[10]} + paginationMode={'server'} + loading={loading} + onPaginationModelChange={(params) => { + onPageChange(params.page); + }} + /> +
+ ); + + return ( + <> + {filterItems && Array.isArray(filterItems) && filterItems.length ? ( + + null} + > +
+ <> + {filterItems && + filterItems.map((filterItem) => { + return ( +
+
+
+ Filter +
+ + {filters.map((selectOption) => ( + + ))} + +
+ {filters.find( + (filter) => + filter.title === filterItem?.fields?.selectedField, + )?.type === 'enum' ? ( +
+
Value
+ + + {filters + .find( + (filter) => + filter.title === + filterItem?.fields?.selectedField, + ) + ?.options?.map((option) => ( + + ))} + +
+ ) : filters.find( + (filter) => + filter.title === + filterItem?.fields?.selectedField, + )?.number ? ( +
+
+
+ From +
+ +
+
+
+ To +
+ +
+
+ ) : filters.find( + (filter) => + filter.title === + filterItem?.fields?.selectedField, + )?.date ? ( +
+
+
+ From +
+ +
+
+
+ To +
+ +
+
+ ) : ( +
+
+ Contains +
+ +
+ )} +
+
+ Action +
+ { + deleteFilter(filterItem.id); + }} + /> +
+
+ ); + })} +
+ + +
+ +
+
+
+ ) : null} + +

Are you sure you want to delete this item?

+
+ + {dataGrid} + + {selectedRows.length > 0 && + createPortal( + onDeleteRows(selectedRows)} + />, + document.getElementById('delete-rows-button'), + )} + + + ); +}; + +export default TableSampleOwners; diff --git a/frontend/src/components/Owners/configureOwnersCols.tsx b/frontend/src/components/Owners/configureOwnersCols.tsx new file mode 100644 index 0000000..7bd47b7 --- /dev/null +++ b/frontend/src/components/Owners/configureOwnersCols.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import BaseIcon from '../BaseIcon'; +import { mdiEye, mdiTrashCan, mdiPencilOutline } from '@mdi/js'; +import axios from 'axios'; +import { + GridActionsCellItem, + GridRowParams, + GridValueGetterParams, +} from '@mui/x-data-grid'; +import ImageField from '../ImageField'; +import { saveFile } from '../../helpers/fileSaver'; +import dataFormatter from '../../helpers/dataFormatter'; +import DataGridMultiSelect from '../DataGridMultiSelect'; +import ListActionsPopover from '../ListActionsPopover'; + +import { hasPermission } from '../../helpers/userPermissions'; + +type Params = (id: string) => void; + +export const loadColumns = async ( + onDelete: Params, + entityName: string, + + user, +) => { + async function callOptionsApi(entityName: string) { + if (!hasPermission(user, 'READ_' + entityName.toUpperCase())) return []; + + try { + const data = await axios(`/${entityName}/autocomplete?limit=100`); + return data.data; + } catch (error) { + console.log(error); + return []; + } + } + + const hasUpdatePermission = hasPermission(user, 'UPDATE_OWNERS'); + + return [ + { + field: 'actions', + type: 'actions', + minWidth: 30, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + getActions: (params: GridRowParams) => { + return [ +
+ +
, + ]; + }, + }, + ]; +}; diff --git a/frontend/src/menuAside.ts b/frontend/src/menuAside.ts index 9877d07..5e5c40b 100644 --- a/frontend/src/menuAside.ts +++ b/frontend/src/menuAside.ts @@ -87,6 +87,14 @@ const menuAside: MenuAsideItem[] = [ icon: icon.mdiShieldAccountOutline ?? icon.mdiTable, permissions: 'READ_PERMISSIONS', }, + { + href: '/owners/owners-list', + label: 'Owners', + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + icon: icon.mdiTable ?? icon.mdiTable, + permissions: 'READ_OWNERS', + }, { href: '/profile', label: 'Profile', diff --git a/frontend/src/pages/dashboard.tsx b/frontend/src/pages/dashboard.tsx index eec08f5..cbace0e 100644 --- a/frontend/src/pages/dashboard.tsx +++ b/frontend/src/pages/dashboard.tsx @@ -37,6 +37,7 @@ const Dashboard = () => { const [units, setUnits] = React.useState(loadingMessage); const [roles, setRoles] = React.useState(loadingMessage); const [permissions, setPermissions] = React.useState(loadingMessage); + const [owners, setOwners] = React.useState(loadingMessage); const [widgetsRole, setWidgetsRole] = React.useState({ role: { value: '', label: '' }, @@ -56,6 +57,7 @@ const Dashboard = () => { 'units', 'roles', 'permissions', + 'owners', ]; const fns = [ setUsers, @@ -66,6 +68,7 @@ const Dashboard = () => { setUnits, setRoles, setPermissions, + setOwners, ]; const requests = entities.map((entity, index) => { @@ -455,6 +458,38 @@ const Dashboard = () => { )} + + {hasPermission(currentUser, 'READ_OWNERS') && ( + +
+
+
+
+ Owners +
+
+ {owners} +
+
+
+ +
+
+
+ + )} diff --git a/frontend/src/pages/owners/[ownersId].tsx b/frontend/src/pages/owners/[ownersId].tsx new file mode 100644 index 0000000..841df52 --- /dev/null +++ b/frontend/src/pages/owners/[ownersId].tsx @@ -0,0 +1,118 @@ +import { mdiChartTimelineVariant, mdiUpload } from '@mdi/js'; +import Head from 'next/head'; +import React, { ReactElement, useEffect, useState } from 'react'; +import DatePicker from 'react-datepicker'; +import 'react-datepicker/dist/react-datepicker.css'; +import dayjs from 'dayjs'; + +import CardBox from '../../components/CardBox'; +import LayoutAuthenticated from '../../layouts/Authenticated'; +import SectionMain from '../../components/SectionMain'; +import SectionTitleLineWithButton from '../../components/SectionTitleLineWithButton'; +import { getPageTitle } from '../../config'; + +import { Field, Form, Formik } from 'formik'; +import FormField from '../../components/FormField'; +import BaseDivider from '../../components/BaseDivider'; +import BaseButtons from '../../components/BaseButtons'; +import BaseButton from '../../components/BaseButton'; +import FormCheckRadio from '../../components/FormCheckRadio'; +import FormCheckRadioGroup from '../../components/FormCheckRadioGroup'; +import FormFilePicker from '../../components/FormFilePicker'; +import FormImagePicker from '../../components/FormImagePicker'; +import { SelectField } from '../../components/SelectField'; +import { SelectFieldMany } from '../../components/SelectFieldMany'; +import { SwitchField } from '../../components/SwitchField'; +import { RichTextField } from '../../components/RichTextField'; + +import { update, fetch } from '../../stores/owners/ownersSlice'; +import { useAppDispatch, useAppSelector } from '../../stores/hooks'; +import { useRouter } from 'next/router'; +import { saveFile } from '../../helpers/fileSaver'; +import dataFormatter from '../../helpers/dataFormatter'; +import ImageField from '../../components/ImageField'; + +const EditOwners = () => { + const router = useRouter(); + const dispatch = useAppDispatch(); + const initVals = {}; + const [initialValues, setInitialValues] = useState(initVals); + + const { owners } = useAppSelector((state) => state.owners); + + const { ownersId } = router.query; + + useEffect(() => { + dispatch(fetch({ id: ownersId })); + }, [ownersId]); + + useEffect(() => { + if (typeof owners === 'object') { + setInitialValues(owners); + } + }, [owners]); + + useEffect(() => { + if (typeof owners === 'object') { + const newInitialVal = { ...initVals }; + + Object.keys(initVals).forEach((el) => (newInitialVal[el] = owners[el])); + + setInitialValues(newInitialVal); + } + }, [owners]); + + const handleSubmit = async (data) => { + await dispatch(update({ id: ownersId, data })); + await router.push('/owners/owners-list'); + }; + + return ( + <> + + {getPageTitle('Edit owners')} + + + + {''} + + + handleSubmit(values)} + > +
+ + + + + router.push('/owners/owners-list')} + /> + + +
+
+
+ + ); +}; + +EditOwners.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ); +}; + +export default EditOwners; diff --git a/frontend/src/pages/owners/owners-edit.tsx b/frontend/src/pages/owners/owners-edit.tsx new file mode 100644 index 0000000..3b02f8c --- /dev/null +++ b/frontend/src/pages/owners/owners-edit.tsx @@ -0,0 +1,116 @@ +import { mdiChartTimelineVariant, mdiUpload } from '@mdi/js'; +import Head from 'next/head'; +import React, { ReactElement, useEffect, useState } from 'react'; +import DatePicker from 'react-datepicker'; +import 'react-datepicker/dist/react-datepicker.css'; +import dayjs from 'dayjs'; + +import CardBox from '../../components/CardBox'; +import LayoutAuthenticated from '../../layouts/Authenticated'; +import SectionMain from '../../components/SectionMain'; +import SectionTitleLineWithButton from '../../components/SectionTitleLineWithButton'; +import { getPageTitle } from '../../config'; + +import { Field, Form, Formik } from 'formik'; +import FormField from '../../components/FormField'; +import BaseDivider from '../../components/BaseDivider'; +import BaseButtons from '../../components/BaseButtons'; +import BaseButton from '../../components/BaseButton'; +import FormCheckRadio from '../../components/FormCheckRadio'; +import FormCheckRadioGroup from '../../components/FormCheckRadioGroup'; +import FormFilePicker from '../../components/FormFilePicker'; +import FormImagePicker from '../../components/FormImagePicker'; +import { SelectField } from '../../components/SelectField'; +import { SelectFieldMany } from '../../components/SelectFieldMany'; +import { SwitchField } from '../../components/SwitchField'; +import { RichTextField } from '../../components/RichTextField'; + +import { update, fetch } from '../../stores/owners/ownersSlice'; +import { useAppDispatch, useAppSelector } from '../../stores/hooks'; +import { useRouter } from 'next/router'; +import { saveFile } from '../../helpers/fileSaver'; +import dataFormatter from '../../helpers/dataFormatter'; +import ImageField from '../../components/ImageField'; + +const EditOwnersPage = () => { + const router = useRouter(); + const dispatch = useAppDispatch(); + const initVals = {}; + const [initialValues, setInitialValues] = useState(initVals); + + const { owners } = useAppSelector((state) => state.owners); + + const { id } = router.query; + + useEffect(() => { + dispatch(fetch({ id: id })); + }, [id]); + + useEffect(() => { + if (typeof owners === 'object') { + setInitialValues(owners); + } + }, [owners]); + + useEffect(() => { + if (typeof owners === 'object') { + const newInitialVal = { ...initVals }; + Object.keys(initVals).forEach((el) => (newInitialVal[el] = owners[el])); + setInitialValues(newInitialVal); + } + }, [owners]); + + const handleSubmit = async (data) => { + await dispatch(update({ id: id, data })); + await router.push('/owners/owners-list'); + }; + + return ( + <> + + {getPageTitle('Edit owners')} + + + + {''} + + + handleSubmit(values)} + > +
+ + + + + router.push('/owners/owners-list')} + /> + + +
+
+
+ + ); +}; + +EditOwnersPage.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ); +}; + +export default EditOwnersPage; diff --git a/frontend/src/pages/owners/owners-list.tsx b/frontend/src/pages/owners/owners-list.tsx new file mode 100644 index 0000000..ecd9928 --- /dev/null +++ b/frontend/src/pages/owners/owners-list.tsx @@ -0,0 +1,160 @@ +import { mdiChartTimelineVariant } from '@mdi/js'; +import Head from 'next/head'; +import { uniqueId } from 'lodash'; +import React, { ReactElement, useState } from 'react'; +import CardBox from '../../components/CardBox'; +import LayoutAuthenticated from '../../layouts/Authenticated'; +import SectionMain from '../../components/SectionMain'; +import SectionTitleLineWithButton from '../../components/SectionTitleLineWithButton'; +import { getPageTitle } from '../../config'; +import TableOwners from '../../components/Owners/TableOwners'; +import BaseButton from '../../components/BaseButton'; +import axios from 'axios'; +import Link from 'next/link'; +import { useAppDispatch, useAppSelector } from '../../stores/hooks'; +import CardBoxModal from '../../components/CardBoxModal'; +import DragDropFilePicker from '../../components/DragDropFilePicker'; +import { setRefetch, uploadCsv } from '../../stores/owners/ownersSlice'; + +import { hasPermission } from '../../helpers/userPermissions'; + +const OwnersTablesPage = () => { + const [filterItems, setFilterItems] = useState([]); + const [csvFile, setCsvFile] = useState(null); + const [isModalActive, setIsModalActive] = useState(false); + const [showTableView, setShowTableView] = useState(false); + + const { currentUser } = useAppSelector((state) => state.auth); + + const dispatch = useAppDispatch(); + + const [filters] = useState([]); + + const hasCreatePermission = + currentUser && hasPermission(currentUser, 'CREATE_OWNERS'); + + const addFilter = () => { + const newItem = { + id: uniqueId(), + fields: { + filterValue: '', + filterValueFrom: '', + filterValueTo: '', + selectedField: '', + }, + }; + newItem.fields.selectedField = filters[0].title; + setFilterItems([...filterItems, newItem]); + }; + + const getOwnersCSV = async () => { + const response = await axios({ + url: '/owners?filetype=csv', + method: 'GET', + responseType: 'blob', + }); + const type = response.headers['content-type']; + const blob = new Blob([response.data], { type: type }); + const link = document.createElement('a'); + link.href = window.URL.createObjectURL(blob); + link.download = 'ownersCSV.csv'; + link.click(); + }; + + const onModalConfirm = async () => { + if (!csvFile) return; + await dispatch(uploadCsv(csvFile)); + dispatch(setRefetch(true)); + setCsvFile(null); + setIsModalActive(false); + }; + + const onModalCancel = () => { + setCsvFile(null); + setIsModalActive(false); + }; + + return ( + <> + + {getPageTitle('Owners')} + + + + {''} + + + {hasCreatePermission && ( + + )} + + + + + {hasCreatePermission && ( + setIsModalActive(true)} + /> + )} + +
+
+
+
+ + + + +
+ + + + + ); +}; + +OwnersTablesPage.getLayout = function getLayout(page: ReactElement) { + return ( + {page} + ); +}; + +export default OwnersTablesPage; diff --git a/frontend/src/pages/owners/owners-new.tsx b/frontend/src/pages/owners/owners-new.tsx new file mode 100644 index 0000000..9a2cefb --- /dev/null +++ b/frontend/src/pages/owners/owners-new.tsx @@ -0,0 +1,92 @@ +import { + mdiAccount, + mdiChartTimelineVariant, + mdiMail, + mdiUpload, +} from '@mdi/js'; +import Head from 'next/head'; +import React, { ReactElement } from 'react'; +import CardBox from '../../components/CardBox'; +import LayoutAuthenticated from '../../layouts/Authenticated'; +import SectionMain from '../../components/SectionMain'; +import SectionTitleLineWithButton from '../../components/SectionTitleLineWithButton'; +import { getPageTitle } from '../../config'; + +import { Field, Form, Formik } from 'formik'; +import FormField from '../../components/FormField'; +import BaseDivider from '../../components/BaseDivider'; +import BaseButtons from '../../components/BaseButtons'; +import BaseButton from '../../components/BaseButton'; +import FormCheckRadio from '../../components/FormCheckRadio'; +import FormCheckRadioGroup from '../../components/FormCheckRadioGroup'; +import FormFilePicker from '../../components/FormFilePicker'; +import FormImagePicker from '../../components/FormImagePicker'; +import { SwitchField } from '../../components/SwitchField'; + +import { SelectField } from '../../components/SelectField'; +import { SelectFieldMany } from '../../components/SelectFieldMany'; +import { RichTextField } from '../../components/RichTextField'; + +import { create } from '../../stores/owners/ownersSlice'; +import { useAppDispatch } from '../../stores/hooks'; +import { useRouter } from 'next/router'; +import moment from 'moment'; + +const initialValues = {}; + +const OwnersNew = () => { + const router = useRouter(); + const dispatch = useAppDispatch(); + + const handleSubmit = async (data) => { + await dispatch(create(data)); + await router.push('/owners/owners-list'); + }; + return ( + <> + + {getPageTitle('New Item')} + + + + {''} + + + handleSubmit(values)} + > +
+ + + + + router.push('/owners/owners-list')} + /> + + +
+
+
+ + ); +}; + +OwnersNew.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ); +}; + +export default OwnersNew; diff --git a/frontend/src/pages/owners/owners-table.tsx b/frontend/src/pages/owners/owners-table.tsx new file mode 100644 index 0000000..e3f51b8 --- /dev/null +++ b/frontend/src/pages/owners/owners-table.tsx @@ -0,0 +1,159 @@ +import { mdiChartTimelineVariant } from '@mdi/js'; +import Head from 'next/head'; +import { uniqueId } from 'lodash'; +import React, { ReactElement, useState } from 'react'; +import CardBox from '../../components/CardBox'; +import LayoutAuthenticated from '../../layouts/Authenticated'; +import SectionMain from '../../components/SectionMain'; +import SectionTitleLineWithButton from '../../components/SectionTitleLineWithButton'; +import { getPageTitle } from '../../config'; +import TableOwners from '../../components/Owners/TableOwners'; +import BaseButton from '../../components/BaseButton'; +import axios from 'axios'; +import Link from 'next/link'; +import { useAppDispatch, useAppSelector } from '../../stores/hooks'; +import CardBoxModal from '../../components/CardBoxModal'; +import DragDropFilePicker from '../../components/DragDropFilePicker'; +import { setRefetch, uploadCsv } from '../../stores/owners/ownersSlice'; + +import { hasPermission } from '../../helpers/userPermissions'; + +const OwnersTablesPage = () => { + const [filterItems, setFilterItems] = useState([]); + const [csvFile, setCsvFile] = useState(null); + const [isModalActive, setIsModalActive] = useState(false); + const [showTableView, setShowTableView] = useState(false); + + const { currentUser } = useAppSelector((state) => state.auth); + + const dispatch = useAppDispatch(); + + const [filters] = useState([]); + + const hasCreatePermission = + currentUser && hasPermission(currentUser, 'CREATE_OWNERS'); + + const addFilter = () => { + const newItem = { + id: uniqueId(), + fields: { + filterValue: '', + filterValueFrom: '', + filterValueTo: '', + selectedField: '', + }, + }; + newItem.fields.selectedField = filters[0].title; + setFilterItems([...filterItems, newItem]); + }; + + const getOwnersCSV = async () => { + const response = await axios({ + url: '/owners?filetype=csv', + method: 'GET', + responseType: 'blob', + }); + const type = response.headers['content-type']; + const blob = new Blob([response.data], { type: type }); + const link = document.createElement('a'); + link.href = window.URL.createObjectURL(blob); + link.download = 'ownersCSV.csv'; + link.click(); + }; + + const onModalConfirm = async () => { + if (!csvFile) return; + await dispatch(uploadCsv(csvFile)); + dispatch(setRefetch(true)); + setCsvFile(null); + setIsModalActive(false); + }; + + const onModalCancel = () => { + setCsvFile(null); + setIsModalActive(false); + }; + + return ( + <> + + {getPageTitle('Owners')} + + + + {''} + + + {hasCreatePermission && ( + + )} + + + + + {hasCreatePermission && ( + setIsModalActive(true)} + /> + )} + +
+
+
+
+ + + +
+ + + + + ); +}; + +OwnersTablesPage.getLayout = function getLayout(page: ReactElement) { + return ( + {page} + ); +}; + +export default OwnersTablesPage; diff --git a/frontend/src/pages/owners/owners-view.tsx b/frontend/src/pages/owners/owners-view.tsx new file mode 100644 index 0000000..d1e1614 --- /dev/null +++ b/frontend/src/pages/owners/owners-view.tsx @@ -0,0 +1,76 @@ +import React, { ReactElement, useEffect } from 'react'; +import Head from 'next/head'; +import DatePicker from 'react-datepicker'; +import 'react-datepicker/dist/react-datepicker.css'; +import dayjs from 'dayjs'; +import { useAppDispatch, useAppSelector } from '../../stores/hooks'; +import { useRouter } from 'next/router'; +import { fetch } from '../../stores/owners/ownersSlice'; +import { saveFile } from '../../helpers/fileSaver'; +import dataFormatter from '../../helpers/dataFormatter'; +import ImageField from '../../components/ImageField'; +import LayoutAuthenticated from '../../layouts/Authenticated'; +import { getPageTitle } from '../../config'; +import SectionTitleLineWithButton from '../../components/SectionTitleLineWithButton'; +import SectionMain from '../../components/SectionMain'; +import CardBox from '../../components/CardBox'; +import BaseButton from '../../components/BaseButton'; +import BaseDivider from '../../components/BaseDivider'; +import { mdiChartTimelineVariant } from '@mdi/js'; +import { SwitchField } from '../../components/SwitchField'; +import FormField from '../../components/FormField'; + +const OwnersView = () => { + const router = useRouter(); + const dispatch = useAppDispatch(); + const { owners } = useAppSelector((state) => state.owners); + + const { id } = router.query; + + function removeLastCharacter(str) { + console.log(str, `str`); + return str.slice(0, -1); + } + + useEffect(() => { + dispatch(fetch({ id })); + }, [dispatch, id]); + + return ( + <> + + {getPageTitle('View owners')} + + + + + + + + + router.push('/owners/owners-list')} + /> + + + + ); +}; + +OwnersView.getLayout = function getLayout(page: ReactElement) { + return ( + {page} + ); +}; + +export default OwnersView; diff --git a/frontend/src/stores/owners/ownersSlice.ts b/frontend/src/stores/owners/ownersSlice.ts new file mode 100644 index 0000000..165ea7b --- /dev/null +++ b/frontend/src/stores/owners/ownersSlice.ts @@ -0,0 +1,236 @@ +import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'; +import axios from 'axios'; +import { + fulfilledNotify, + rejectNotify, + resetNotify, +} from '../../helpers/notifyStateHandler'; + +interface MainState { + owners: any; + loading: boolean; + count: number; + refetch: boolean; + rolesWidgets: any[]; + notify: { + showNotification: boolean; + textNotification: string; + typeNotification: string; + }; +} + +const initialState: MainState = { + owners: [], + loading: false, + count: 0, + refetch: false, + rolesWidgets: [], + notify: { + showNotification: false, + textNotification: '', + typeNotification: 'warn', + }, +}; + +export const fetch = createAsyncThunk('owners/fetch', async (data: any) => { + const { id, query } = data; + const result = await axios.get(`owners${query || (id ? `/${id}` : '')}`); + return id + ? result.data + : { rows: result.data.rows, count: result.data.count }; +}); + +export const deleteItemsByIds = createAsyncThunk( + 'owners/deleteByIds', + async (data: any, { rejectWithValue }) => { + try { + await axios.post('owners/deleteByIds', { data }); + } catch (error) { + if (!error.response) { + throw error; + } + + return rejectWithValue(error.response.data); + } + }, +); + +export const deleteItem = createAsyncThunk( + 'owners/deleteOwners', + async (id: string, { rejectWithValue }) => { + try { + await axios.delete(`owners/${id}`); + } catch (error) { + if (!error.response) { + throw error; + } + + return rejectWithValue(error.response.data); + } + }, +); + +export const create = createAsyncThunk( + 'owners/createOwners', + async (data: any, { rejectWithValue }) => { + try { + const result = await axios.post('owners', { data }); + return result.data; + } catch (error) { + if (!error.response) { + throw error; + } + + return rejectWithValue(error.response.data); + } + }, +); + +export const uploadCsv = createAsyncThunk( + 'owners/uploadCsv', + async (file: File, { rejectWithValue }) => { + try { + const data = new FormData(); + data.append('file', file); + data.append('filename', file.name); + + const result = await axios.post('owners/bulk-import', data, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); + + return result.data; + } catch (error) { + if (!error.response) { + throw error; + } + + return rejectWithValue(error.response.data); + } + }, +); + +export const update = createAsyncThunk( + 'owners/updateOwners', + async (payload: any, { rejectWithValue }) => { + try { + const result = await axios.put(`owners/${payload.id}`, { + id: payload.id, + data: payload.data, + }); + return result.data; + } catch (error) { + if (!error.response) { + throw error; + } + + return rejectWithValue(error.response.data); + } + }, +); + +export const ownersSlice = createSlice({ + name: 'owners', + initialState, + reducers: { + setRefetch: (state, action: PayloadAction) => { + state.refetch = action.payload; + }, + }, + extraReducers: (builder) => { + builder.addCase(fetch.pending, (state) => { + state.loading = true; + resetNotify(state); + }); + builder.addCase(fetch.rejected, (state, action) => { + state.loading = false; + rejectNotify(state, action); + }); + + builder.addCase(fetch.fulfilled, (state, action) => { + if (action.payload.rows && action.payload.count >= 0) { + state.owners = action.payload.rows; + state.count = action.payload.count; + } else { + state.owners = action.payload; + } + state.loading = false; + }); + + builder.addCase(deleteItemsByIds.pending, (state) => { + state.loading = true; + resetNotify(state); + }); + + builder.addCase(deleteItemsByIds.fulfilled, (state) => { + state.loading = false; + fulfilledNotify(state, 'Owners has been deleted'); + }); + + builder.addCase(deleteItemsByIds.rejected, (state, action) => { + state.loading = false; + rejectNotify(state, action); + }); + + builder.addCase(deleteItem.pending, (state) => { + state.loading = true; + resetNotify(state); + }); + + builder.addCase(deleteItem.fulfilled, (state) => { + state.loading = false; + fulfilledNotify(state, `${'Owners'.slice(0, -1)} has been deleted`); + }); + + builder.addCase(deleteItem.rejected, (state, action) => { + state.loading = false; + rejectNotify(state, action); + }); + + builder.addCase(create.pending, (state) => { + state.loading = true; + resetNotify(state); + }); + builder.addCase(create.rejected, (state, action) => { + state.loading = false; + rejectNotify(state, action); + }); + + builder.addCase(create.fulfilled, (state) => { + state.loading = false; + fulfilledNotify(state, `${'Owners'.slice(0, -1)} has been created`); + }); + + builder.addCase(update.pending, (state) => { + state.loading = true; + resetNotify(state); + }); + builder.addCase(update.fulfilled, (state) => { + state.loading = false; + fulfilledNotify(state, `${'Owners'.slice(0, -1)} has been updated`); + }); + builder.addCase(update.rejected, (state, action) => { + state.loading = false; + rejectNotify(state, action); + }); + + builder.addCase(uploadCsv.pending, (state) => { + state.loading = true; + resetNotify(state); + }); + builder.addCase(uploadCsv.fulfilled, (state) => { + state.loading = false; + fulfilledNotify(state, 'Owners has been uploaded'); + }); + builder.addCase(uploadCsv.rejected, (state, action) => { + state.loading = false; + rejectNotify(state, action); + }); + }, +}); + +// Action creators are generated for each case reducer function +export const { setRefetch } = ownersSlice.actions; + +export default ownersSlice.reducer; diff --git a/frontend/src/stores/store.ts b/frontend/src/stores/store.ts index 4dac16a..9beea09 100644 --- a/frontend/src/stores/store.ts +++ b/frontend/src/stores/store.ts @@ -12,6 +12,7 @@ import noticesSlice from './notices/noticesSlice'; import unitsSlice from './units/unitsSlice'; import rolesSlice from './roles/rolesSlice'; import permissionsSlice from './permissions/permissionsSlice'; +import ownersSlice from './owners/ownersSlice'; export const store = configureStore({ reducer: { @@ -28,6 +29,7 @@ export const store = configureStore({ units: unitsSlice, roles: rolesSlice, permissions: permissionsSlice, + owners: ownersSlice, }, });