From fd3cc141577014110aa92801f0faac5e7a455260 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Mon, 4 Aug 2025 12:33:21 +0000 Subject: [PATCH] nestorly-poc-v2025-08-04 --- app-shell/src/_schema.json | 3 +- backend/src/db/api/chatbot_entries.js | 290 +++++++++++ backend/src/db/api/hoa_parameters.js | 480 ++++++++++++++++++ backend/src/db/migrations/1754219846755.js | 59 +++ backend/src/db/migrations/1754219862403.js | 54 ++ backend/src/db/migrations/1754219882461.js | 54 ++ backend/src/db/migrations/1754219892704.js | 54 ++ backend/src/db/migrations/1754219900632.js | 54 ++ backend/src/db/migrations/1754219910293.js | 54 ++ backend/src/db/migrations/1754219919319.js | 54 ++ backend/src/db/migrations/1754219924416.js | 91 ++++ backend/src/db/migrations/1754219938282.js | 54 ++ backend/src/db/migrations/1754219946864.js | 54 ++ backend/src/db/migrations/1754219954060.js | 59 +++ backend/src/db/migrations/1754219964227.js | 54 ++ backend/src/db/migrations/1754219981661.js | 54 ++ backend/src/db/migrations/1754219988342.js | 59 +++ backend/src/db/models/chatbot_entries.js | 53 ++ backend/src/db/models/hoa_parameters.js | 83 +++ backend/src/db/seeders/20250803111844.js | 71 +++ backend/src/index.js | 16 + backend/src/routes/chatbot_entries.js | 413 +++++++++++++++ backend/src/routes/hoa_parameters.js | 433 ++++++++++++++++ backend/src/services/chatbot_entries.js | 131 +++++ backend/src/services/search.js | 58 +++ .../Chatbot_entries/CardChatbot_entries.tsx | 120 +++++ .../Chatbot_entries/ListChatbot_entries.tsx | 87 ++++ .../Chatbot_entries/TableChatbot_entries.tsx | 441 ++++++++++++++++ .../configureChatbot_entriesCols.tsx | 118 +++++ .../Hoa_parameters/CardHoa_parameters.tsx | 165 ++++++ .../Hoa_parameters/ListHoa_parameters.tsx | 112 ++++ .../configureHoa_parametersCols.tsx | 180 +++++++ frontend/src/layouts/Authenticated.tsx | 2 +- frontend/src/menuAside.ts | 32 ++ .../chatbot_entries/[chatbot_entriesId].tsx | 174 +++++++ .../chatbot_entries/chatbot_entries-edit.tsx | 172 +++++++ .../chatbot_entries/chatbot_entries-list.tsx | 128 +++++ .../chatbot_entries/chatbot_entries-new.tsx | 118 +++++ .../chatbot_entries/chatbot_entries-table.tsx | 129 +++++ .../chatbot_entries/chatbot_entries-view.tsx | 104 ++++ frontend/src/pages/dashboard.tsx | 120 ++++- .../hoa_parameters/[hoa_parametersId].tsx | 229 +++++++++ .../hoa_parameters/hoa_parameters-edit.tsx | 227 +++++++++ .../hoa_parameters/hoa_parameters-list.tsx | 129 +++++ .../hoa_parameters/hoa_parameters-new.tsx | 182 +++++++ .../hoa_parameters/hoa_parameters-table.tsx | 130 +++++ .../hoa_parameters/hoa_parameters-view.tsx | 127 +++++ frontend/src/pages/hoas/hoas-view.tsx | 363 +++++++++++++ frontend/src/pages/users/users-view.tsx | 39 ++ .../chatbot_entries/chatbot_entriesSlice.ts | 229 +++++++++ frontend/src/stores/store.ts | 8 + 51 files changed, 6700 insertions(+), 4 deletions(-) create mode 100644 backend/src/db/api/chatbot_entries.js create mode 100644 backend/src/db/api/hoa_parameters.js create mode 100644 backend/src/db/migrations/1754219846755.js create mode 100644 backend/src/db/migrations/1754219862403.js create mode 100644 backend/src/db/migrations/1754219882461.js create mode 100644 backend/src/db/migrations/1754219892704.js create mode 100644 backend/src/db/migrations/1754219900632.js create mode 100644 backend/src/db/migrations/1754219910293.js create mode 100644 backend/src/db/migrations/1754219919319.js create mode 100644 backend/src/db/migrations/1754219924416.js create mode 100644 backend/src/db/migrations/1754219938282.js create mode 100644 backend/src/db/migrations/1754219946864.js create mode 100644 backend/src/db/migrations/1754219954060.js create mode 100644 backend/src/db/migrations/1754219964227.js create mode 100644 backend/src/db/migrations/1754219981661.js create mode 100644 backend/src/db/migrations/1754219988342.js create mode 100644 backend/src/db/models/chatbot_entries.js create mode 100644 backend/src/db/models/hoa_parameters.js create mode 100644 backend/src/db/seeders/20250803111844.js create mode 100644 backend/src/routes/chatbot_entries.js create mode 100644 backend/src/routes/hoa_parameters.js create mode 100644 backend/src/services/chatbot_entries.js create mode 100644 frontend/src/components/Chatbot_entries/CardChatbot_entries.tsx create mode 100644 frontend/src/components/Chatbot_entries/ListChatbot_entries.tsx create mode 100644 frontend/src/components/Chatbot_entries/TableChatbot_entries.tsx create mode 100644 frontend/src/components/Chatbot_entries/configureChatbot_entriesCols.tsx create mode 100644 frontend/src/components/Hoa_parameters/CardHoa_parameters.tsx create mode 100644 frontend/src/components/Hoa_parameters/ListHoa_parameters.tsx create mode 100644 frontend/src/components/Hoa_parameters/configureHoa_parametersCols.tsx create mode 100644 frontend/src/pages/chatbot_entries/[chatbot_entriesId].tsx create mode 100644 frontend/src/pages/chatbot_entries/chatbot_entries-edit.tsx create mode 100644 frontend/src/pages/chatbot_entries/chatbot_entries-list.tsx create mode 100644 frontend/src/pages/chatbot_entries/chatbot_entries-new.tsx create mode 100644 frontend/src/pages/chatbot_entries/chatbot_entries-table.tsx create mode 100644 frontend/src/pages/chatbot_entries/chatbot_entries-view.tsx create mode 100644 frontend/src/pages/hoa_parameters/[hoa_parametersId].tsx create mode 100644 frontend/src/pages/hoa_parameters/hoa_parameters-edit.tsx create mode 100644 frontend/src/pages/hoa_parameters/hoa_parameters-list.tsx create mode 100644 frontend/src/pages/hoa_parameters/hoa_parameters-new.tsx create mode 100644 frontend/src/pages/hoa_parameters/hoa_parameters-table.tsx create mode 100644 frontend/src/pages/hoa_parameters/hoa_parameters-view.tsx create mode 100644 frontend/src/stores/chatbot_entries/chatbot_entriesSlice.ts diff --git a/app-shell/src/_schema.json b/app-shell/src/_schema.json index 523cf14..6e339c5 100644 --- a/app-shell/src/_schema.json +++ b/app-shell/src/_schema.json @@ -1,4 +1,5 @@ { "Initial version": "{\"iv\":\"zzEtv+sFn/FAsGMY\",\"encryptedData\":\"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\"}", - "v1.0": "{\"iv\":\"13E36J1guiMrw27j\",\"encryptedData\":\"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\"}" + "v1.0": "{\"iv\":\"13E36J1guiMrw27j\",\"encryptedData\":\"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\"}", + "nestorly-poc-v2025-08-04": "{\"iv\":\"xpy//1BJlVp5mIgb\",\"encryptedData\":\"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\"}" } \ No newline at end of file diff --git a/backend/src/db/api/chatbot_entries.js b/backend/src/db/api/chatbot_entries.js new file mode 100644 index 0000000..69d084b --- /dev/null +++ b/backend/src/db/api/chatbot_entries.js @@ -0,0 +1,290 @@ + +const db = require('../models'); +const crypto = require('crypto'); +const Utils = require('../utils'); + +const Sequelize = db.Sequelize; +const Op = Sequelize.Op; + +module.exports = class Chatbot_entriesDBApi { + + static async create(data, options) { + const currentUser = (options && options.currentUser) || { id: null }; + const transaction = (options && options.transaction) || undefined; + + const chatbot_entries = await db.chatbot_entries.create( + { + id: data.id || undefined, + + question: data.question + || + null + , + + answer: data.answer + || + null + , + + importHash: data.importHash || null, + createdById: currentUser.id, + updatedById: currentUser.id, + }, + { transaction }, + ); + + return chatbot_entries; + } + + 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 chatbot_entriesData = data.map((item, index) => ({ + id: item.id || undefined, + + question: item.question + || + null + , + + answer: item.answer + || + null + , + + importHash: item.importHash || null, + createdById: currentUser.id, + updatedById: currentUser.id, + createdAt: new Date(Date.now() + index * 1000), + })); + + // Bulk create items + const chatbot_entries = await db.chatbot_entries.bulkCreate(chatbot_entriesData, { transaction }); + + return chatbot_entries; + } + + static async update(id, data, options) { + const currentUser = (options && options.currentUser) || {id: null}; + const transaction = (options && options.transaction) || undefined; + + const chatbot_entries = await db.chatbot_entries.findByPk(id, {}, {transaction}); + + const updatePayload = {}; + + if (data.question !== undefined) updatePayload.question = data.question; + + if (data.answer !== undefined) updatePayload.answer = data.answer; + + updatePayload.updatedById = currentUser.id; + + await chatbot_entries.update(updatePayload, {transaction}); + + return chatbot_entries; + } + + static async deleteByIds(ids, options) { + const currentUser = (options && options.currentUser) || { id: null }; + const transaction = (options && options.transaction) || undefined; + + const chatbot_entries = await db.chatbot_entries.findAll({ + where: { + id: { + [Op.in]: ids, + }, + }, + transaction, + }); + + await db.sequelize.transaction(async (transaction) => { + for (const record of chatbot_entries) { + await record.update( + {deletedBy: currentUser.id}, + {transaction} + ); + } + for (const record of chatbot_entries) { + await record.destroy({transaction}); + } + }); + + return chatbot_entries; + } + + static async remove(id, options) { + const currentUser = (options && options.currentUser) || {id: null}; + const transaction = (options && options.transaction) || undefined; + + const chatbot_entries = await db.chatbot_entries.findByPk(id, options); + + await chatbot_entries.update({ + deletedBy: currentUser.id + }, { + transaction, + }); + + await chatbot_entries.destroy({ + transaction + }); + + return chatbot_entries; + } + + static async findBy(where, options) { + const transaction = (options && options.transaction) || undefined; + + const chatbot_entries = await db.chatbot_entries.findOne( + { where }, + { transaction }, + ); + + if (!chatbot_entries) { + return chatbot_entries; + } + + const output = chatbot_entries.get({plain: true}); + + return output; + } + + static async findAll(filter, options) { + const limit = filter.limit || 0; + let offset = 0; + let where = {}; + const currentPage = +filter.page; + + const user = (options && options.currentUser) || null; + + 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.question) { + where = { + ...where, + [Op.and]: Utils.ilike( + 'chatbot_entries', + 'question', + filter.question, + ), + }; + } + + if (filter.answer) { + where = { + ...where, + [Op.and]: Utils.ilike( + 'chatbot_entries', + 'answer', + filter.answer, + ), + }; + } + + 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.chatbot_entries.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( + 'chatbot_entries', + 'answer', + query, + ), + ], + }; + } + + const records = await db.chatbot_entries.findAll({ + attributes: [ 'id', 'answer' ], + where, + limit: limit ? Number(limit) : undefined, + offset: offset ? Number(offset) : undefined, + orderBy: [['answer', 'ASC']], + }); + + return records.map((record) => ({ + id: record.id, + label: record.answer, + })); + } + +}; + diff --git a/backend/src/db/api/hoa_parameters.js b/backend/src/db/api/hoa_parameters.js new file mode 100644 index 0000000..07a0602 --- /dev/null +++ b/backend/src/db/api/hoa_parameters.js @@ -0,0 +1,480 @@ + +const db = require('../models'); +const crypto = require('crypto'); +const Utils = require('../utils'); + +const Sequelize = db.Sequelize; +const Op = Sequelize.Op; + +module.exports = class Hoa_parametersDBApi { + + static async create(data, options) { + const currentUser = (options && options.currentUser) || { id: null }; + const transaction = (options && options.transaction) || undefined; + + const hoa_parameters = await db.hoa_parameters.create( + { + id: data.id || undefined, + + units_per_hoa: data.units_per_hoa + || + null + , + + unit_types: data.unit_types + || + null + , + + vendor_categories: data.vendor_categories + || + null + , + + faq_limit: data.faq_limit + || + null + , + + doc_limit: data.doc_limit + || + null + , + + chatbot_suggestion_count: data.chatbot_suggestion_count + || + null + , + + reminder_periods: data.reminder_periods + || + null + , + + escalation_timeframes: data.escalation_timeframes + || + null + , + + importHash: data.importHash || null, + createdById: currentUser.id, + updatedById: currentUser.id, + }, + { transaction }, + ); + + return hoa_parameters; + } + + 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 hoa_parametersData = data.map((item, index) => ({ + id: item.id || undefined, + + units_per_hoa: item.units_per_hoa + || + null + , + + unit_types: item.unit_types + || + null + , + + vendor_categories: item.vendor_categories + || + null + , + + faq_limit: item.faq_limit + || + null + , + + doc_limit: item.doc_limit + || + null + , + + chatbot_suggestion_count: item.chatbot_suggestion_count + || + null + , + + reminder_periods: item.reminder_periods + || + null + , + + escalation_timeframes: item.escalation_timeframes + || + null + , + + importHash: item.importHash || null, + createdById: currentUser.id, + updatedById: currentUser.id, + createdAt: new Date(Date.now() + index * 1000), + })); + + // Bulk create items + const hoa_parameters = await db.hoa_parameters.bulkCreate(hoa_parametersData, { transaction }); + + return hoa_parameters; + } + + static async update(id, data, options) { + const currentUser = (options && options.currentUser) || {id: null}; + const transaction = (options && options.transaction) || undefined; + + const hoa_parameters = await db.hoa_parameters.findByPk(id, {}, {transaction}); + + const updatePayload = {}; + + if (data.units_per_hoa !== undefined) updatePayload.units_per_hoa = data.units_per_hoa; + + if (data.unit_types !== undefined) updatePayload.unit_types = data.unit_types; + + if (data.vendor_categories !== undefined) updatePayload.vendor_categories = data.vendor_categories; + + if (data.faq_limit !== undefined) updatePayload.faq_limit = data.faq_limit; + + if (data.doc_limit !== undefined) updatePayload.doc_limit = data.doc_limit; + + if (data.chatbot_suggestion_count !== undefined) updatePayload.chatbot_suggestion_count = data.chatbot_suggestion_count; + + if (data.reminder_periods !== undefined) updatePayload.reminder_periods = data.reminder_periods; + + if (data.escalation_timeframes !== undefined) updatePayload.escalation_timeframes = data.escalation_timeframes; + + updatePayload.updatedById = currentUser.id; + + await hoa_parameters.update(updatePayload, {transaction}); + + return hoa_parameters; + } + + static async deleteByIds(ids, options) { + const currentUser = (options && options.currentUser) || { id: null }; + const transaction = (options && options.transaction) || undefined; + + const hoa_parameters = await db.hoa_parameters.findAll({ + where: { + id: { + [Op.in]: ids, + }, + }, + transaction, + }); + + await db.sequelize.transaction(async (transaction) => { + for (const record of hoa_parameters) { + await record.update( + {deletedBy: currentUser.id}, + {transaction} + ); + } + for (const record of hoa_parameters) { + await record.destroy({transaction}); + } + }); + + return hoa_parameters; + } + + static async remove(id, options) { + const currentUser = (options && options.currentUser) || {id: null}; + const transaction = (options && options.transaction) || undefined; + + const hoa_parameters = await db.hoa_parameters.findByPk(id, options); + + await hoa_parameters.update({ + deletedBy: currentUser.id + }, { + transaction, + }); + + await hoa_parameters.destroy({ + transaction + }); + + return hoa_parameters; + } + + static async findBy(where, options) { + const transaction = (options && options.transaction) || undefined; + + const hoa_parameters = await db.hoa_parameters.findOne( + { where }, + { transaction }, + ); + + if (!hoa_parameters) { + return hoa_parameters; + } + + const output = hoa_parameters.get({plain: true}); + + return output; + } + + static async findAll(filter, options) { + const limit = filter.limit || 0; + let offset = 0; + let where = {}; + const currentPage = +filter.page; + + const user = (options && options.currentUser) || null; + + 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.unit_types) { + where = { + ...where, + [Op.and]: Utils.ilike( + 'hoa_parameters', + 'unit_types', + filter.unit_types, + ), + }; + } + + if (filter.vendor_categories) { + where = { + ...where, + [Op.and]: Utils.ilike( + 'hoa_parameters', + 'vendor_categories', + filter.vendor_categories, + ), + }; + } + + if (filter.reminder_periods) { + where = { + ...where, + [Op.and]: Utils.ilike( + 'hoa_parameters', + 'reminder_periods', + filter.reminder_periods, + ), + }; + } + + if (filter.escalation_timeframes) { + where = { + ...where, + [Op.and]: Utils.ilike( + 'hoa_parameters', + 'escalation_timeframes', + filter.escalation_timeframes, + ), + }; + } + + if (filter.units_per_hoaRange) { + const [start, end] = filter.units_per_hoaRange; + + if (start !== undefined && start !== null && start !== '') { + where = { + ...where, + units_per_hoa: { + ...where.units_per_hoa, + [Op.gte]: start, + }, + }; + } + + if (end !== undefined && end !== null && end !== '') { + where = { + ...where, + units_per_hoa: { + ...where.units_per_hoa, + [Op.lte]: end, + }, + }; + } + } + + if (filter.faq_limitRange) { + const [start, end] = filter.faq_limitRange; + + if (start !== undefined && start !== null && start !== '') { + where = { + ...where, + faq_limit: { + ...where.faq_limit, + [Op.gte]: start, + }, + }; + } + + if (end !== undefined && end !== null && end !== '') { + where = { + ...where, + faq_limit: { + ...where.faq_limit, + [Op.lte]: end, + }, + }; + } + } + + if (filter.doc_limitRange) { + const [start, end] = filter.doc_limitRange; + + if (start !== undefined && start !== null && start !== '') { + where = { + ...where, + doc_limit: { + ...where.doc_limit, + [Op.gte]: start, + }, + }; + } + + if (end !== undefined && end !== null && end !== '') { + where = { + ...where, + doc_limit: { + ...where.doc_limit, + [Op.lte]: end, + }, + }; + } + } + + if (filter.chatbot_suggestion_countRange) { + const [start, end] = filter.chatbot_suggestion_countRange; + + if (start !== undefined && start !== null && start !== '') { + where = { + ...where, + chatbot_suggestion_count: { + ...where.chatbot_suggestion_count, + [Op.gte]: start, + }, + }; + } + + if (end !== undefined && end !== null && end !== '') { + where = { + ...where, + chatbot_suggestion_count: { + ...where.chatbot_suggestion_count, + [Op.lte]: end, + }, + }; + } + } + + 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.hoa_parameters.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( + 'hoa_parameters', + 'id', + query, + ), + ], + }; + } + + const records = await db.hoa_parameters.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/1754219846755.js b/backend/src/db/migrations/1754219846755.js new file mode 100644 index 0000000..dd4eac4 --- /dev/null +++ b/backend/src/db/migrations/1754219846755.js @@ -0,0 +1,59 @@ +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( + 'hoa_parameters', + 'hoaId', + { + type: Sequelize.DataTypes.UUID, + + references: { + model: 'hoas', + key: 'id', + }, + + }, + { 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( + 'hoa_parameters', + 'hoaId', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1754219862403.js b/backend/src/db/migrations/1754219862403.js new file mode 100644 index 0000000..01fd14a --- /dev/null +++ b/backend/src/db/migrations/1754219862403.js @@ -0,0 +1,54 @@ +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( + 'hoa_parameters', + 'units_per_hoa', + { + type: Sequelize.DataTypes.INTEGER, + + }, + { 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( + 'hoa_parameters', + 'units_per_hoa', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1754219882461.js b/backend/src/db/migrations/1754219882461.js new file mode 100644 index 0000000..4be9e06 --- /dev/null +++ b/backend/src/db/migrations/1754219882461.js @@ -0,0 +1,54 @@ +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( + 'hoa_parameters', + 'unit_types', + { + 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( + 'hoa_parameters', + 'unit_types', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1754219892704.js b/backend/src/db/migrations/1754219892704.js new file mode 100644 index 0000000..94a1fae --- /dev/null +++ b/backend/src/db/migrations/1754219892704.js @@ -0,0 +1,54 @@ +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( + 'hoa_parameters', + 'vendor_categories', + { + 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( + 'hoa_parameters', + 'vendor_categories', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1754219900632.js b/backend/src/db/migrations/1754219900632.js new file mode 100644 index 0000000..aeacd0f --- /dev/null +++ b/backend/src/db/migrations/1754219900632.js @@ -0,0 +1,54 @@ +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( + 'hoa_parameters', + 'faq_limit', + { + type: Sequelize.DataTypes.INTEGER, + + }, + { 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( + 'hoa_parameters', + 'faq_limit', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1754219910293.js b/backend/src/db/migrations/1754219910293.js new file mode 100644 index 0000000..9e2576b --- /dev/null +++ b/backend/src/db/migrations/1754219910293.js @@ -0,0 +1,54 @@ +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( + 'hoa_parameters', + 'doc_limit', + { + type: Sequelize.DataTypes.INTEGER, + + }, + { 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( + 'hoa_parameters', + 'doc_limit', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1754219919319.js b/backend/src/db/migrations/1754219919319.js new file mode 100644 index 0000000..0e4fa87 --- /dev/null +++ b/backend/src/db/migrations/1754219919319.js @@ -0,0 +1,54 @@ +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( + 'hoa_parameters', + 'chatbot_suggestion_count', + { + type: Sequelize.DataTypes.INTEGER, + + }, + { 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( + 'hoa_parameters', + 'chatbot_suggestion_count', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1754219924416.js b/backend/src/db/migrations/1754219924416.js new file mode 100644 index 0000000..7feb819 --- /dev/null +++ b/backend/src/db/migrations/1754219924416.js @@ -0,0 +1,91 @@ +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('chatbot_entries', { + 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 queryInterface.addColumn( + 'chatbot_entries', + 'hoasId', + { + type: Sequelize.DataTypes.UUID, + + references: { + model: 'hoas', + key: 'id', + }, + + }, + { 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( + 'chatbot_entries', + 'hoasId', + { transaction } + ); + + await queryInterface.dropTable('chatbot_entries', { transaction }); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1754219938282.js b/backend/src/db/migrations/1754219938282.js new file mode 100644 index 0000000..9a7c86c --- /dev/null +++ b/backend/src/db/migrations/1754219938282.js @@ -0,0 +1,54 @@ +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( + 'chatbot_entries', + 'question', + { + 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( + 'chatbot_entries', + 'question', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1754219946864.js b/backend/src/db/migrations/1754219946864.js new file mode 100644 index 0000000..46292ed --- /dev/null +++ b/backend/src/db/migrations/1754219946864.js @@ -0,0 +1,54 @@ +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( + 'chatbot_entries', + 'answer', + { + 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( + 'chatbot_entries', + 'answer', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1754219954060.js b/backend/src/db/migrations/1754219954060.js new file mode 100644 index 0000000..0a60e61 --- /dev/null +++ b/backend/src/db/migrations/1754219954060.js @@ -0,0 +1,59 @@ +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( + 'chatbot_entries', + 'created_byId', + { + type: Sequelize.DataTypes.UUID, + + references: { + model: 'users', + key: 'id', + }, + + }, + { 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( + 'chatbot_entries', + 'created_byId', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1754219964227.js b/backend/src/db/migrations/1754219964227.js new file mode 100644 index 0000000..8344315 --- /dev/null +++ b/backend/src/db/migrations/1754219964227.js @@ -0,0 +1,54 @@ +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( + 'hoa_parameters', + 'reminder_periods', + { + 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( + 'hoa_parameters', + 'reminder_periods', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1754219981661.js b/backend/src/db/migrations/1754219981661.js new file mode 100644 index 0000000..6568bb1 --- /dev/null +++ b/backend/src/db/migrations/1754219981661.js @@ -0,0 +1,54 @@ +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( + 'hoa_parameters', + 'escalation_timeframes', + { + 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( + 'hoa_parameters', + 'escalation_timeframes', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1754219988342.js b/backend/src/db/migrations/1754219988342.js new file mode 100644 index 0000000..b345afd --- /dev/null +++ b/backend/src/db/migrations/1754219988342.js @@ -0,0 +1,59 @@ +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( + 'chatbot_entries', + 'hoaId', + { + type: Sequelize.DataTypes.UUID, + + references: { + model: 'hoas', + key: 'id', + }, + + }, + { 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( + 'chatbot_entries', + 'hoaId', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/models/chatbot_entries.js b/backend/src/db/models/chatbot_entries.js new file mode 100644 index 0000000..942817e --- /dev/null +++ b/backend/src/db/models/chatbot_entries.js @@ -0,0 +1,53 @@ +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 chatbot_entries = sequelize.define( + 'chatbot_entries', + { + id: { + type: DataTypes.UUID, + defaultValue: DataTypes.UUIDV4, + primaryKey: true, + }, + +question: { + type: DataTypes.TEXT, + + }, + +answer: { + type: DataTypes.TEXT, + + }, + + importHash: { + type: DataTypes.STRING(255), + allowNull: true, + unique: true, + }, + }, + { + timestamps: true, + paranoid: true, + freezeTableName: true, + }, + ); + + chatbot_entries.associate = (db) => { + + db.chatbot_entries.belongsTo(db.users, { + as: 'createdBy', + }); + + db.chatbot_entries.belongsTo(db.users, { + as: 'updatedBy', + }); + }; + + return chatbot_entries; +}; + diff --git a/backend/src/db/models/hoa_parameters.js b/backend/src/db/models/hoa_parameters.js new file mode 100644 index 0000000..aa46bc8 --- /dev/null +++ b/backend/src/db/models/hoa_parameters.js @@ -0,0 +1,83 @@ +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 hoa_parameters = sequelize.define( + 'hoa_parameters', + { + id: { + type: DataTypes.UUID, + defaultValue: DataTypes.UUIDV4, + primaryKey: true, + }, + +units_per_hoa: { + type: DataTypes.INTEGER, + + }, + +unit_types: { + type: DataTypes.TEXT, + + }, + +vendor_categories: { + type: DataTypes.TEXT, + + }, + +faq_limit: { + type: DataTypes.INTEGER, + + }, + +doc_limit: { + type: DataTypes.INTEGER, + + }, + +chatbot_suggestion_count: { + type: DataTypes.INTEGER, + + }, + +reminder_periods: { + type: DataTypes.TEXT, + + }, + +escalation_timeframes: { + type: DataTypes.TEXT, + + }, + + importHash: { + type: DataTypes.STRING(255), + allowNull: true, + unique: true, + }, + }, + { + timestamps: true, + paranoid: true, + freezeTableName: true, + }, + ); + + hoa_parameters.associate = (db) => { + + db.hoa_parameters.belongsTo(db.users, { + as: 'createdBy', + }); + + db.hoa_parameters.belongsTo(db.users, { + as: 'updatedBy', + }); + }; + + return hoa_parameters; +}; + diff --git a/backend/src/db/seeders/20250803111844.js b/backend/src/db/seeders/20250803111844.js new file mode 100644 index 0000000..c072345 --- /dev/null +++ b/backend/src/db/seeders/20250803111844.js @@ -0,0 +1,71 @@ + +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 = [ + + "chatbot_entries", + + ]; + + 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.super_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 0d00b3b..fdab3f0 100644 --- a/backend/src/index.js +++ b/backend/src/index.js @@ -38,6 +38,14 @@ const permissionsRoutes = require('./routes/permissions'); const hoasRoutes = require('./routes/hoas'); +const request_typesRoutes = require('./routes/request_types'); + +const global_parametersRoutes = require('./routes/global_parameters'); + +const hoa_parametersRoutes = require('./routes/hoa_parameters'); + +const chatbot_entriesRoutes = require('./routes/chatbot_entries'); + const getBaseUrl = (url) => { if (!url) return ''; return url.endsWith('/api') ? url.slice(0, -4) : url; @@ -114,6 +122,14 @@ app.use('/api/permissions', passport.authenticate('jwt', {session: false}), perm app.use('/api/hoas', passport.authenticate('jwt', {session: false}), hoasRoutes); +app.use('/api/request_types', passport.authenticate('jwt', {session: false}), request_typesRoutes); + +app.use('/api/global_parameters', passport.authenticate('jwt', {session: false}), global_parametersRoutes); + +app.use('/api/hoa_parameters', passport.authenticate('jwt', {session: false}), hoa_parametersRoutes); + +app.use('/api/chatbot_entries', passport.authenticate('jwt', {session: false}), chatbot_entriesRoutes); + app.use('/api/contact-form', contactFormRoutes); app.use( diff --git a/backend/src/routes/chatbot_entries.js b/backend/src/routes/chatbot_entries.js new file mode 100644 index 0000000..13c82f2 --- /dev/null +++ b/backend/src/routes/chatbot_entries.js @@ -0,0 +1,413 @@ + +const express = require('express'); + +const Chatbot_entriesService = require('../services/chatbot_entries'); +const Chatbot_entriesDBApi = require('../db/api/chatbot_entries'); +const wrapAsync = require('../helpers').wrapAsync; + +const router = express.Router(); + +const { parse } = require('json2csv'); + +/** + * @swagger + * components: + * schemas: + * Chatbot_entries: + * type: object + * properties: + + * question: + * type: string + * default: question + * answer: + * type: string + * default: answer + + */ + +/** + * @swagger + * tags: + * name: Chatbot_entries + * description: The Chatbot_entries managing API + */ + +/** +* @swagger +* /api/chatbot_entries: +* post: +* security: +* - bearerAuth: [] +* tags: [Chatbot_entries] +* 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/Chatbot_entries" +* responses: +* 200: +* description: The item was successfully added +* content: +* application/json: +* schema: +* $ref: "#/components/schemas/Chatbot_entries" +* 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 Chatbot_entriesService.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: [Chatbot_entries] + * 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/Chatbot_entries" + * responses: + * 200: + * description: The items were successfully imported + * content: + * application/json: + * schema: + * $ref: "#/components/schemas/Chatbot_entries" + * 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 Chatbot_entriesService.bulkImport(req, res, true, link.host); + const payload = true; + res.status(200).send(payload); +})); + +/** + * @swagger + * /api/chatbot_entries/{id}: + * put: + * security: + * - bearerAuth: [] + * tags: [Chatbot_entries] + * 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/Chatbot_entries" + * required: + * - id + * responses: + * 200: + * description: The item data was successfully updated + * content: + * application/json: + * schema: + * $ref: "#/components/schemas/Chatbot_entries" + * 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 Chatbot_entriesService.update(req.body.data, req.body.id, req.currentUser); + const payload = true; + res.status(200).send(payload); +})); + +/** + * @swagger + * /api/chatbot_entries/{id}: + * delete: + * security: + * - bearerAuth: [] + * tags: [Chatbot_entries] + * 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/Chatbot_entries" + * 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 Chatbot_entriesService.remove(req.params.id, req.currentUser); + const payload = true; + res.status(200).send(payload); +})); + +/** + * @swagger + * /api/chatbot_entries/deleteByIds: + * post: + * security: + * - bearerAuth: [] + * tags: [Chatbot_entries] + * 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/Chatbot_entries" + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 404: + * description: Items not found + * 500: + * description: Some server error + */ +router.post('/deleteByIds', wrapAsync(async (req, res) => { + await Chatbot_entriesService.deleteByIds(req.body.data, req.currentUser); + const payload = true; + res.status(200).send(payload); + })); + +/** + * @swagger + * /api/chatbot_entries: + * get: + * security: + * - bearerAuth: [] + * tags: [Chatbot_entries] + * summary: Get all chatbot_entries + * description: Get all chatbot_entries + * responses: + * 200: + * description: Chatbot_entries list successfully received + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: "#/components/schemas/Chatbot_entries" + * 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 Chatbot_entriesDBApi.findAll( + req.query, { currentUser } + ); + if (filetype && filetype === 'csv') { + const fields = ['id','question','answer', + + ]; + 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/chatbot_entries/count: + * get: + * security: + * - bearerAuth: [] + * tags: [Chatbot_entries] + * summary: Count all chatbot_entries + * description: Count all chatbot_entries + * responses: + * 200: + * description: Chatbot_entries count successfully received + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: "#/components/schemas/Chatbot_entries" + * 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 Chatbot_entriesDBApi.findAll( + req.query, + null, + { countOnly: true, currentUser } + ); + + res.status(200).send(payload); +})); + +/** + * @swagger + * /api/chatbot_entries/autocomplete: + * get: + * security: + * - bearerAuth: [] + * tags: [Chatbot_entries] + * summary: Find all chatbot_entries that match search criteria + * description: Find all chatbot_entries that match search criteria + * responses: + * 200: + * description: Chatbot_entries list successfully received + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: "#/components/schemas/Chatbot_entries" + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 404: + * description: Data not found + * 500: + * description: Some server error + */ +router.get('/autocomplete', async (req, res) => { + const payload = await Chatbot_entriesDBApi.findAllAutocomplete( + req.query.query, + req.query.limit, + req.query.offset, + ); + + res.status(200).send(payload); +}); + +/** + * @swagger + * /api/chatbot_entries/{id}: + * get: + * security: + * - bearerAuth: [] + * tags: [Chatbot_entries] + * 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/Chatbot_entries" + * 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 Chatbot_entriesDBApi.findBy( + { id: req.params.id }, + ); + + res.status(200).send(payload); +})); + +router.use('/', require('../helpers').commonErrorHandler); + +module.exports = router; diff --git a/backend/src/routes/hoa_parameters.js b/backend/src/routes/hoa_parameters.js new file mode 100644 index 0000000..54051f1 --- /dev/null +++ b/backend/src/routes/hoa_parameters.js @@ -0,0 +1,433 @@ + +const express = require('express'); + +const Hoa_parametersService = require('../services/hoa_parameters'); +const Hoa_parametersDBApi = require('../db/api/hoa_parameters'); +const wrapAsync = require('../helpers').wrapAsync; + +const router = express.Router(); + +const { parse } = require('json2csv'); + +/** + * @swagger + * components: + * schemas: + * Hoa_parameters: + * type: object + * properties: + + * unit_types: + * type: string + * default: unit_types + * vendor_categories: + * type: string + * default: vendor_categories + * reminder_periods: + * type: string + * default: reminder_periods + * escalation_timeframes: + * type: string + * default: escalation_timeframes + + * units_per_hoa: + * type: integer + * format: int64 + * faq_limit: + * type: integer + * format: int64 + * doc_limit: + * type: integer + * format: int64 + * chatbot_suggestion_count: + * type: integer + * format: int64 + + */ + +/** + * @swagger + * tags: + * name: Hoa_parameters + * description: The Hoa_parameters managing API + */ + +/** +* @swagger +* /api/hoa_parameters: +* post: +* security: +* - bearerAuth: [] +* tags: [Hoa_parameters] +* 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/Hoa_parameters" +* responses: +* 200: +* description: The item was successfully added +* content: +* application/json: +* schema: +* $ref: "#/components/schemas/Hoa_parameters" +* 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 Hoa_parametersService.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: [Hoa_parameters] + * 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/Hoa_parameters" + * responses: + * 200: + * description: The items were successfully imported + * content: + * application/json: + * schema: + * $ref: "#/components/schemas/Hoa_parameters" + * 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 Hoa_parametersService.bulkImport(req, res, true, link.host); + const payload = true; + res.status(200).send(payload); +})); + +/** + * @swagger + * /api/hoa_parameters/{id}: + * put: + * security: + * - bearerAuth: [] + * tags: [Hoa_parameters] + * 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/Hoa_parameters" + * required: + * - id + * responses: + * 200: + * description: The item data was successfully updated + * content: + * application/json: + * schema: + * $ref: "#/components/schemas/Hoa_parameters" + * 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 Hoa_parametersService.update(req.body.data, req.body.id, req.currentUser); + const payload = true; + res.status(200).send(payload); +})); + +/** + * @swagger + * /api/hoa_parameters/{id}: + * delete: + * security: + * - bearerAuth: [] + * tags: [Hoa_parameters] + * 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/Hoa_parameters" + * 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 Hoa_parametersService.remove(req.params.id, req.currentUser); + const payload = true; + res.status(200).send(payload); +})); + +/** + * @swagger + * /api/hoa_parameters/deleteByIds: + * post: + * security: + * - bearerAuth: [] + * tags: [Hoa_parameters] + * 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/Hoa_parameters" + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 404: + * description: Items not found + * 500: + * description: Some server error + */ +router.post('/deleteByIds', wrapAsync(async (req, res) => { + await Hoa_parametersService.deleteByIds(req.body.data, req.currentUser); + const payload = true; + res.status(200).send(payload); + })); + +/** + * @swagger + * /api/hoa_parameters: + * get: + * security: + * - bearerAuth: [] + * tags: [Hoa_parameters] + * summary: Get all hoa_parameters + * description: Get all hoa_parameters + * responses: + * 200: + * description: Hoa_parameters list successfully received + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: "#/components/schemas/Hoa_parameters" + * 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 Hoa_parametersDBApi.findAll( + req.query, { currentUser } + ); + if (filetype && filetype === 'csv') { + const fields = ['id','unit_types','vendor_categories','reminder_periods','escalation_timeframes', + 'units_per_hoa','faq_limit','doc_limit','chatbot_suggestion_count', + + ]; + 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/hoa_parameters/count: + * get: + * security: + * - bearerAuth: [] + * tags: [Hoa_parameters] + * summary: Count all hoa_parameters + * description: Count all hoa_parameters + * responses: + * 200: + * description: Hoa_parameters count successfully received + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: "#/components/schemas/Hoa_parameters" + * 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 Hoa_parametersDBApi.findAll( + req.query, + null, + { countOnly: true, currentUser } + ); + + res.status(200).send(payload); +})); + +/** + * @swagger + * /api/hoa_parameters/autocomplete: + * get: + * security: + * - bearerAuth: [] + * tags: [Hoa_parameters] + * summary: Find all hoa_parameters that match search criteria + * description: Find all hoa_parameters that match search criteria + * responses: + * 200: + * description: Hoa_parameters list successfully received + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: "#/components/schemas/Hoa_parameters" + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 404: + * description: Data not found + * 500: + * description: Some server error + */ +router.get('/autocomplete', async (req, res) => { + const payload = await Hoa_parametersDBApi.findAllAutocomplete( + req.query.query, + req.query.limit, + req.query.offset, + ); + + res.status(200).send(payload); +}); + +/** + * @swagger + * /api/hoa_parameters/{id}: + * get: + * security: + * - bearerAuth: [] + * tags: [Hoa_parameters] + * 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/Hoa_parameters" + * 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 Hoa_parametersDBApi.findBy( + { id: req.params.id }, + ); + + res.status(200).send(payload); +})); + +router.use('/', require('../helpers').commonErrorHandler); + +module.exports = router; diff --git a/backend/src/services/chatbot_entries.js b/backend/src/services/chatbot_entries.js new file mode 100644 index 0000000..6e1b932 --- /dev/null +++ b/backend/src/services/chatbot_entries.js @@ -0,0 +1,131 @@ +const db = require('../db/models'); +const Chatbot_entriesDBApi = require('../db/api/chatbot_entries'); +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 Chatbot_entriesService { + static async create(data, currentUser) { + const transaction = await db.sequelize.transaction(); + try { + await Chatbot_entriesDBApi.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 Chatbot_entriesDBApi.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 chatbot_entries = await Chatbot_entriesDBApi.findBy( + {id}, + {transaction}, + ); + + if (!chatbot_entries) { + throw new ValidationError( + 'chatbot_entriesNotFound', + ); + } + + const updatedChatbot_entries = await Chatbot_entriesDBApi.update( + id, + data, + { + currentUser, + transaction, + }, + ); + + await transaction.commit(); + return updatedChatbot_entries; + + } catch (error) { + await transaction.rollback(); + throw error; + } + }; + + static async deleteByIds(ids, currentUser) { + const transaction = await db.sequelize.transaction(); + + try { + await Chatbot_entriesDBApi.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 Chatbot_entriesDBApi.remove( + id, + { + currentUser, + transaction, + }, + ); + + await transaction.commit(); + } catch (error) { + await transaction.rollback(); + throw error; + } + } +}; + diff --git a/backend/src/services/search.js b/backend/src/services/search.js index 461d466..7924b8f 100644 --- a/backend/src/services/search.js +++ b/backend/src/services/search.js @@ -119,9 +119,67 @@ module.exports = class SearchService { ], + "request_types": [ + + "name", + + "status", + + ], + + "global_parameters": [ + + "allowed_unit_types", + + ], + + "hoa_parameters": [ + + "unit_types", + + "vendor_categories", + + "reminder_periods", + + "escalation_timeframes", + + ], + + "chatbot_entries": [ + + "question", + + "answer", + + ], + }; const columnsInt = { + "global_parameters": [ + + "max_units_per_hoa", + + "max_residents_per_unit", + + "max_managers_per_hoa", + + "max_security_per_hoa", + + ], + + "hoa_parameters": [ + + "units_per_hoa", + + "faq_limit", + + "doc_limit", + + "chatbot_suggestion_count", + + ], + }; let allFoundRecords = []; diff --git a/frontend/src/components/Chatbot_entries/CardChatbot_entries.tsx b/frontend/src/components/Chatbot_entries/CardChatbot_entries.tsx new file mode 100644 index 0000000..d45faf7 --- /dev/null +++ b/frontend/src/components/Chatbot_entries/CardChatbot_entries.tsx @@ -0,0 +1,120 @@ +import React from 'react'; +import ListActionsPopover from '../ListActionsPopover'; +import { useAppSelector } from '../../stores/hooks'; +import dataFormatter from '../../helpers/dataFormatter'; +import { Pagination } from '../Pagination'; +import LoadingSpinner from "../LoadingSpinner"; +import Link from 'next/link'; + +type Props = { + chatbot_entries: any[]; + loading: boolean; + onDelete: (id: string) => void; + currentPage: number; + numPages: number; + onPageChange: (page: number) => void; +}; + +const CardChatbot_entries = ({ + chatbot_entries, + 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); + + return ( +
+ {loading && } +
    + {!loading && chatbot_entries.map((item, index) => ( +
  • + + {item.answer} + + +
    + +
    +
+
+ +
+
Question
+
+
+ { item.question } +
+
+
+ +
+
Answer
+
+
+ { item.answer } +
+
+
+ +
+
Created_by
+
+
+ { dataFormatter.usersOneListFormatter(item.created_by) } +
+
+
+ +
+
Hoa
+
+
+ { dataFormatter.hoasOneListFormatter(item.hoa) } +
+
+
+ +
+ + ))} + {!loading && chatbot_entries.length === 0 && ( +
+

No data to display

+
+ )} + +
+ +
+ + ); +}; + +export default CardChatbot_entries; diff --git a/frontend/src/components/Chatbot_entries/ListChatbot_entries.tsx b/frontend/src/components/Chatbot_entries/ListChatbot_entries.tsx new file mode 100644 index 0000000..c56e0e3 --- /dev/null +++ b/frontend/src/components/Chatbot_entries/ListChatbot_entries.tsx @@ -0,0 +1,87 @@ +import React from 'react'; +import CardBox from '../CardBox'; +import dataFormatter from '../../helpers/dataFormatter'; +import ListActionsPopover from "../ListActionsPopover"; +import {useAppSelector} from "../../stores/hooks"; +import {Pagination} from "../Pagination"; +import LoadingSpinner from "../LoadingSpinner"; +import Link from 'next/link'; + +type Props = { + chatbot_entries: any[]; + loading: boolean; + onDelete: (id: string) => void; + currentPage: number; + numPages: number; + onPageChange: (page: number) => void; +}; + +const ListChatbot_entries = ({ chatbot_entries, loading, onDelete, currentPage, numPages, onPageChange }: Props) => { + const corners = useAppSelector((state) => state.style.corners); + const bgColor = useAppSelector((state) => state.style.cardsColor); + + return ( + <> +
+ {loading && } + {!loading && chatbot_entries.map((item) => ( +
+ +
+ + +
+

Question

+

{ item.question }

+
+ +
+

Answer

+

{ item.answer }

+
+ +
+

Created_by

+

{ dataFormatter.usersOneListFormatter(item.created_by) }

+
+ +
+

Hoa

+

{ dataFormatter.hoasOneListFormatter(item.hoa) }

+
+ + + +
+
+
+ ))} + {!loading && chatbot_entries.length === 0 && ( +
+

No data to display

+
+ )} +
+
+ +
+ + ) +}; + +export default ListChatbot_entries diff --git a/frontend/src/components/Chatbot_entries/TableChatbot_entries.tsx b/frontend/src/components/Chatbot_entries/TableChatbot_entries.tsx new file mode 100644 index 0000000..dcdbf0a --- /dev/null +++ b/frontend/src/components/Chatbot_entries/TableChatbot_entries.tsx @@ -0,0 +1,441 @@ +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/chatbot_entries/chatbot_entriesSlice' +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 "./configureChatbot_entriesCols"; +import _ from 'lodash'; +import dataFormatter from '../../helpers/dataFormatter' +import {dataGridStyles} from "../../styles"; +import axios from 'axios'; + +const perPage = 10; + +const TableSampleChatbot_entries = ({ 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 { chatbot_entries, loading, count, notify: chatbot_entriesNotify, refetch } = useAppSelector((state) => state.chatbot_entries) + 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 (chatbot_entriesNotify.showNotification) { + notify(chatbot_entriesNotify.typeNotification, chatbot_entriesNotify.textNotification); + } + }, [chatbot_entriesNotify.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(() => { + loadColumns(handleDeleteModalAction, `chatbot_entries`).then((newCols) => + setColumns(newCols), + ); + }, []); + + 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 border-gray-700 rounded dark:placeholder-gray-400 ' + + ` ${bgColor} ${focusRing} ${corners} ` + + 'dark:bg-slate-800 border'; + + const dataGrid = ( +
+ `datagrid--row`} + rows={chatbot_entries ?? []} + 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 TableSampleChatbot_entries diff --git a/frontend/src/components/Chatbot_entries/configureChatbot_entriesCols.tsx b/frontend/src/components/Chatbot_entries/configureChatbot_entriesCols.tsx new file mode 100644 index 0000000..7a71b20 --- /dev/null +++ b/frontend/src/components/Chatbot_entries/configureChatbot_entriesCols.tsx @@ -0,0 +1,118 @@ +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 dataFormatter from '../../helpers/dataFormatter' +import DataGridMultiSelect from "../DataGridMultiSelect"; +import ListActionsPopover from '../ListActionsPopover'; +type Params = (id: string) => void; + +export const loadColumns = async ( + onDelete: Params, + entityName: string, +) => { + async function callOptionsApi(entityName: string) { + try { + const data = await axios(`/${entityName}/autocomplete?limit=100`); + return data.data; + } catch (error) { + console.log(error); + return []; + } + } + return [ + + { + field: 'question', + headerName: 'Question', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + + }, + + { + field: 'answer', + headerName: 'Answer', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + + }, + + { + field: 'created_by', + headerName: 'Created_by', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + sortable: false, + type: 'singleSelect', + getOptionValue: (value: any) => value?.id, + getOptionLabel: (value: any) => value?.label, + valueOptions: await callOptionsApi('users'), + valueGetter: (params: GridValueGetterParams) => + params?.value?.id ?? params?.value, + + }, + + { + field: 'hoa', + headerName: 'Hoa', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + sortable: false, + type: 'singleSelect', + getOptionValue: (value: any) => value?.id, + getOptionLabel: (value: any) => value?.label, + valueOptions: await callOptionsApi('hoas'), + valueGetter: (params: GridValueGetterParams) => + params?.value?.id ?? params?.value, + + }, + + { + field: 'actions', + type: 'actions', + minWidth: 30, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + getActions: (params: GridRowParams) => { + + return [ +
+ +
, + ] + }, + }, + ]; +}; diff --git a/frontend/src/components/Hoa_parameters/CardHoa_parameters.tsx b/frontend/src/components/Hoa_parameters/CardHoa_parameters.tsx new file mode 100644 index 0000000..12e7909 --- /dev/null +++ b/frontend/src/components/Hoa_parameters/CardHoa_parameters.tsx @@ -0,0 +1,165 @@ +import React from 'react'; +import ListActionsPopover from '../ListActionsPopover'; +import { useAppSelector } from '../../stores/hooks'; +import dataFormatter from '../../helpers/dataFormatter'; +import { Pagination } from '../Pagination'; +import LoadingSpinner from "../LoadingSpinner"; +import Link from 'next/link'; + +type Props = { + hoa_parameters: any[]; + loading: boolean; + onDelete: (id: string) => void; + currentPage: number; + numPages: number; + onPageChange: (page: number) => void; +}; + +const CardHoa_parameters = ({ + hoa_parameters, + 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); + + return ( +
+ {loading && } +
    + {!loading && hoa_parameters.map((item, index) => ( +
  • + + {item.id} + + +
    + +
    +
+
+ +
+
Hoa
+
+
+ { dataFormatter.hoasOneListFormatter(item.hoa) } +
+
+
+ +
+
Units per hoa
+
+
+ { item.units_per_hoa } +
+
+
+ +
+
Unit types
+
+
+ { item.unit_types } +
+
+
+ +
+
Vendor categories
+
+
+ { item.vendor_categories } +
+
+
+ +
+
Faq limit
+
+
+ { item.faq_limit } +
+
+
+ +
+
Doc limit
+
+
+ { item.doc_limit } +
+
+
+ +
+
Chatbot suggestion count
+
+
+ { item.chatbot_suggestion_count } +
+
+
+ +
+
Reminder periods
+
+
+ { item.reminder_periods } +
+
+
+ +
+
Escalation timeframes
+
+
+ { item.escalation_timeframes } +
+
+
+ +
+ + ))} + {!loading && hoa_parameters.length === 0 && ( +
+

No data to display

+
+ )} + +
+ +
+ + ); +}; + +export default CardHoa_parameters; diff --git a/frontend/src/components/Hoa_parameters/ListHoa_parameters.tsx b/frontend/src/components/Hoa_parameters/ListHoa_parameters.tsx new file mode 100644 index 0000000..de38768 --- /dev/null +++ b/frontend/src/components/Hoa_parameters/ListHoa_parameters.tsx @@ -0,0 +1,112 @@ +import React from 'react'; +import CardBox from '../CardBox'; +import dataFormatter from '../../helpers/dataFormatter'; +import ListActionsPopover from "../ListActionsPopover"; +import {useAppSelector} from "../../stores/hooks"; +import {Pagination} from "../Pagination"; +import LoadingSpinner from "../LoadingSpinner"; +import Link from 'next/link'; + +type Props = { + hoa_parameters: any[]; + loading: boolean; + onDelete: (id: string) => void; + currentPage: number; + numPages: number; + onPageChange: (page: number) => void; +}; + +const ListHoa_parameters = ({ hoa_parameters, loading, onDelete, currentPage, numPages, onPageChange }: Props) => { + const corners = useAppSelector((state) => state.style.corners); + const bgColor = useAppSelector((state) => state.style.cardsColor); + + return ( + <> +
+ {loading && } + {!loading && hoa_parameters.map((item) => ( +
+ +
+ + +
+

Hoa

+

{ dataFormatter.hoasOneListFormatter(item.hoa) }

+
+ +
+

Units per hoa

+

{ item.units_per_hoa }

+
+ +
+

Unit types

+

{ item.unit_types }

+
+ +
+

Vendor categories

+

{ item.vendor_categories }

+
+ +
+

Faq limit

+

{ item.faq_limit }

+
+ +
+

Doc limit

+

{ item.doc_limit }

+
+ +
+

Chatbot suggestion count

+

{ item.chatbot_suggestion_count }

+
+ +
+

Reminder periods

+

{ item.reminder_periods }

+
+ +
+

Escalation timeframes

+

{ item.escalation_timeframes }

+
+ + + +
+
+
+ ))} + {!loading && hoa_parameters.length === 0 && ( +
+

No data to display

+
+ )} +
+
+ +
+ + ) +}; + +export default ListHoa_parameters diff --git a/frontend/src/components/Hoa_parameters/configureHoa_parametersCols.tsx b/frontend/src/components/Hoa_parameters/configureHoa_parametersCols.tsx new file mode 100644 index 0000000..34b07c1 --- /dev/null +++ b/frontend/src/components/Hoa_parameters/configureHoa_parametersCols.tsx @@ -0,0 +1,180 @@ +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 dataFormatter from '../../helpers/dataFormatter' +import DataGridMultiSelect from "../DataGridMultiSelect"; +import ListActionsPopover from '../ListActionsPopover'; +type Params = (id: string) => void; + +export const loadColumns = async ( + onDelete: Params, + entityName: string, +) => { + async function callOptionsApi(entityName: string) { + try { + const data = await axios(`/${entityName}/autocomplete?limit=100`); + return data.data; + } catch (error) { + console.log(error); + return []; + } + } + return [ + + { + field: 'hoa', + headerName: 'Hoa', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + sortable: false, + type: 'singleSelect', + getOptionValue: (value: any) => value?.id, + getOptionLabel: (value: any) => value?.label, + valueOptions: await callOptionsApi('hoas'), + valueGetter: (params: GridValueGetterParams) => + params?.value?.id ?? params?.value, + + }, + + { + field: 'units_per_hoa', + headerName: 'Units per hoa', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + type: 'number', + + }, + + { + field: 'unit_types', + headerName: 'Unit types', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + + }, + + { + field: 'vendor_categories', + headerName: 'Vendor categories', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + + }, + + { + field: 'faq_limit', + headerName: 'Faq limit', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + type: 'number', + + }, + + { + field: 'doc_limit', + headerName: 'Doc limit', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + type: 'number', + + }, + + { + field: 'chatbot_suggestion_count', + headerName: 'Chatbot suggestion count', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + type: 'number', + + }, + + { + field: 'reminder_periods', + headerName: 'Reminder periods', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + + }, + + { + field: 'escalation_timeframes', + headerName: 'Escalation timeframes', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + + }, + + { + field: 'actions', + type: 'actions', + minWidth: 30, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + getActions: (params: GridRowParams) => { + + return [ +
+ +
, + ] + }, + }, + ]; +}; diff --git a/frontend/src/layouts/Authenticated.tsx b/frontend/src/layouts/Authenticated.tsx index 36ccc7e..7108531 100644 --- a/frontend/src/layouts/Authenticated.tsx +++ b/frontend/src/layouts/Authenticated.tsx @@ -68,7 +68,7 @@ export default function LayoutAuthenticated({ } }, [router.events, dispatch]) - const layoutAsidePadding = 'xl:pl-60' + const layoutAsidePadding = 'lg:pl-60' // updated for responsiveness return (
diff --git a/frontend/src/menuAside.ts b/frontend/src/menuAside.ts index 26ad8e7..a132527 100644 --- a/frontend/src/menuAside.ts +++ b/frontend/src/menuAside.ts @@ -80,6 +80,38 @@ const menuAside: MenuAsideItem[] = [ icon: icon.mdiTable ?? icon.mdiTable, permissions: 'READ_HOAS' }, + { + href: '/request_types/request_types-list', + label: 'Request types', + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + icon: icon.mdiTable ?? icon.mdiTable, + permissions: 'READ_REQUEST_TYPES' + }, + { + href: '/global_parameters/global_parameters-list', + label: 'Global parameters', + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + icon: icon.mdiTable ?? icon.mdiTable, + permissions: 'READ_GLOBAL_PARAMETERS' + }, + { + href: '/hoa_parameters/hoa_parameters-list', + label: 'Hoa parameters', + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + icon: icon.mdiTable ?? icon.mdiTable, + permissions: 'READ_HOA_PARAMETERS' + }, + { + href: '/chatbot_entries/chatbot_entries-list', + label: 'Chatbot entries', + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + icon: icon.mdiTable ?? icon.mdiTable, + permissions: 'READ_CHATBOT_ENTRIES' + }, { href: '/profile', label: 'Profile', diff --git a/frontend/src/pages/chatbot_entries/[chatbot_entriesId].tsx b/frontend/src/pages/chatbot_entries/[chatbot_entriesId].tsx new file mode 100644 index 0000000..993fabf --- /dev/null +++ b/frontend/src/pages/chatbot_entries/[chatbot_entriesId].tsx @@ -0,0 +1,174 @@ +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 { SelectField } from "../../components/SelectField"; +import { SelectFieldMany } from "../../components/SelectFieldMany"; +import { SwitchField } from '../../components/SwitchField' +import {RichTextField} from "../../components/RichTextField"; + +import { update, fetch } from '../../stores/chatbot_entries/chatbot_entriesSlice' +import { useAppDispatch, useAppSelector } from '../../stores/hooks' +import { useRouter } from 'next/router' + +const EditChatbot_entries = () => { + const router = useRouter() + const dispatch = useAppDispatch() + const initVals = { + + hoas: null, + + 'question': '', + + 'answer': '', + + created_by: null, + + hoa: null, + + } + const [initialValues, setInitialValues] = useState(initVals) + + const { chatbot_entries } = useAppSelector((state) => state.chatbot_entries) + + const { chatbot_entriesId } = router.query + + useEffect(() => { + dispatch(fetch({ id: chatbot_entriesId })) + }, [chatbot_entriesId]) + + useEffect(() => { + if (typeof chatbot_entries === 'object') { + setInitialValues(chatbot_entries) + } + }, [chatbot_entries]) + + useEffect(() => { + if (typeof chatbot_entries === 'object') { + + const newInitialVal = {...initVals}; + + Object.keys(initVals).forEach(el => newInitialVal[el] = (chatbot_entries)[el]) + + setInitialValues(newInitialVal); + } + }, [chatbot_entries]) + + const handleSubmit = async (data) => { + await dispatch(update({ id: chatbot_entriesId, data })) + await router.push('/chatbot_entries/chatbot_entries-list') + } + + return ( + <> + + {getPageTitle('Edit chatbot_entries')} + + + + {''} + + + handleSubmit(values)} + > +
+ + + + + + + + + + + + + + + + + + + + + + + + + + router.push('/chatbot_entries/chatbot_entries-list')}/> + + +
+
+
+ + ) +} + +EditChatbot_entries.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} + +export default EditChatbot_entries diff --git a/frontend/src/pages/chatbot_entries/chatbot_entries-edit.tsx b/frontend/src/pages/chatbot_entries/chatbot_entries-edit.tsx new file mode 100644 index 0000000..6ada3ec --- /dev/null +++ b/frontend/src/pages/chatbot_entries/chatbot_entries-edit.tsx @@ -0,0 +1,172 @@ +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 { SelectField } from "../../components/SelectField"; +import { SelectFieldMany } from "../../components/SelectFieldMany"; +import { SwitchField } from '../../components/SwitchField' +import {RichTextField} from "../../components/RichTextField"; + +import { update, fetch } from '../../stores/chatbot_entries/chatbot_entriesSlice' +import { useAppDispatch, useAppSelector } from '../../stores/hooks' +import { useRouter } from 'next/router' +import dataFormatter from '../../helpers/dataFormatter'; + +const EditChatbot_entriesPage = () => { + const router = useRouter() + const dispatch = useAppDispatch() + const initVals = { + + hoas: null, + + 'question': '', + + 'answer': '', + + created_by: null, + + hoa: null, + + } + const [initialValues, setInitialValues] = useState(initVals) + + const { chatbot_entries } = useAppSelector((state) => state.chatbot_entries) + + const { id } = router.query + + useEffect(() => { + dispatch(fetch({ id: id })) + }, [id]) + + useEffect(() => { + if (typeof chatbot_entries === 'object') { + setInitialValues(chatbot_entries) + } + }, [chatbot_entries]) + + useEffect(() => { + if (typeof chatbot_entries === 'object') { + const newInitialVal = {...initVals}; + Object.keys(initVals).forEach(el => newInitialVal[el] = (chatbot_entries)[el]) + setInitialValues(newInitialVal); + } + }, [chatbot_entries]) + + const handleSubmit = async (data) => { + await dispatch(update({ id: id, data })) + await router.push('/chatbot_entries/chatbot_entries-list') + } + + return ( + <> + + {getPageTitle('Edit chatbot_entries')} + + + + {''} + + + handleSubmit(values)} + > +
+ + + + + + + + + + + + + + + + + + + + + + + + + + router.push('/chatbot_entries/chatbot_entries-list')}/> + + +
+
+
+ + ) +} + +EditChatbot_entriesPage.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} + +export default EditChatbot_entriesPage diff --git a/frontend/src/pages/chatbot_entries/chatbot_entries-list.tsx b/frontend/src/pages/chatbot_entries/chatbot_entries-list.tsx new file mode 100644 index 0000000..11b91ab --- /dev/null +++ b/frontend/src/pages/chatbot_entries/chatbot_entries-list.tsx @@ -0,0 +1,128 @@ +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 TableChatbot_entries from '../../components/Chatbot_entries/TableChatbot_entries' +import BaseButton from '../../components/BaseButton' +import axios from "axios"; +import {useAppDispatch, useAppSelector} from "../../stores/hooks"; +import CardBoxModal from "../../components/CardBoxModal"; +import DragDropFilePicker from "../../components/DragDropFilePicker"; +import {setRefetch, uploadCsv} from '../../stores/chatbot_entries/chatbot_entriesSlice'; + +const Chatbot_entriesTablesPage = () => { + const [filterItems, setFilterItems] = useState([]); + const [csvFile, setCsvFile] = useState(null); + const [isModalActive, setIsModalActive] = useState(false); + + const dispatch = useAppDispatch(); + + const [filters] = useState([{label: 'Question', title: 'question'},{label: 'Answer', title: 'answer'}, + + ]); + const addFilter = () => { + const newItem = { + id: uniqueId(), + fields: { + filterValue: '', + filterValueFrom: '', + filterValueTo: '', + selectedField: '', + }, + }; + newItem.fields.selectedField = filters[0].title; + setFilterItems([...filterItems, newItem]); + }; + + const getChatbot_entriesCSV = async () => { + const response = await axios({url: '/chatbot_entries?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 = 'chatbot_entriesCSV.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('Chatbot_entries')} + + + + {''} + + + + + + setIsModalActive(true)} + /> +
+
+
+
+ + + +
+ + + + + ) +} + +Chatbot_entriesTablesPage.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} + +export default Chatbot_entriesTablesPage diff --git a/frontend/src/pages/chatbot_entries/chatbot_entries-new.tsx b/frontend/src/pages/chatbot_entries/chatbot_entries-new.tsx new file mode 100644 index 0000000..4ee5d88 --- /dev/null +++ b/frontend/src/pages/chatbot_entries/chatbot_entries-new.tsx @@ -0,0 +1,118 @@ +import { mdiChartTimelineVariant } 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 { SwitchField } from '../../components/SwitchField' + +import { SelectField } from '../../components/SelectField' +import {RichTextField} from "../../components/RichTextField"; + +import { create } from '../../stores/chatbot_entries/chatbot_entriesSlice' +import { useAppDispatch } from '../../stores/hooks' +import { useRouter } from 'next/router' + +const initialValues = { + + hoas: '', + + question: '', + + answer: '', + + created_by: '', + + hoa: '', + +} + +const Chatbot_entriesNew = () => { + const router = useRouter() + const dispatch = useAppDispatch() + + const handleSubmit = async (data) => { + await dispatch(create(data)) + await router.push('/chatbot_entries/chatbot_entries-list') + } + return ( + <> + + {getPageTitle('New Item')} + + + + {''} + + + handleSubmit(values)} + > +
+ + + + + + + + + + + + + + + + + + + + + + + + + + router.push('/chatbot_entries/chatbot_entries-list')}/> + + +
+
+
+ + ) +} + +Chatbot_entriesNew.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} + +export default Chatbot_entriesNew diff --git a/frontend/src/pages/chatbot_entries/chatbot_entries-table.tsx b/frontend/src/pages/chatbot_entries/chatbot_entries-table.tsx new file mode 100644 index 0000000..405ae8e --- /dev/null +++ b/frontend/src/pages/chatbot_entries/chatbot_entries-table.tsx @@ -0,0 +1,129 @@ +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 TableChatbot_entries from '../../components/Chatbot_entries/TableChatbot_entries' +import BaseButton from '../../components/BaseButton' +import axios from "axios"; +import {useAppDispatch, useAppSelector} from "../../stores/hooks"; +import CardBoxModal from "../../components/CardBoxModal"; +import DragDropFilePicker from "../../components/DragDropFilePicker"; +import {setRefetch, uploadCsv} from '../../stores/chatbot_entries/chatbot_entriesSlice'; + +const Chatbot_entriesTablesPage = () => { + const [filterItems, setFilterItems] = useState([]); + const [csvFile, setCsvFile] = useState(null); + const [isModalActive, setIsModalActive] = useState(false); + + const dispatch = useAppDispatch(); + + const [filters] = useState([{label: 'Question', title: 'question'},{label: 'Answer', title: 'answer'}, + + ]); + const addFilter = () => { + const newItem = { + id: uniqueId(), + fields: { + filterValue: '', + filterValueFrom: '', + filterValueTo: '', + selectedField: '', + }, + }; + newItem.fields.selectedField = filters[0].title; + setFilterItems([...filterItems, newItem]); + }; + + const getChatbot_entriesCSV = async () => { + const response = await axios({url: '/chatbot_entries?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 = 'chatbot_entriesCSV.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('Chatbot_entries')} + + + + {''} + + + + + + + setIsModalActive(true)} + /> +
+
+
+
+ + + +
+ + + + + ) +} + +Chatbot_entriesTablesPage.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} + +export default Chatbot_entriesTablesPage diff --git a/frontend/src/pages/chatbot_entries/chatbot_entries-view.tsx b/frontend/src/pages/chatbot_entries/chatbot_entries-view.tsx new file mode 100644 index 0000000..9c2cd47 --- /dev/null +++ b/frontend/src/pages/chatbot_entries/chatbot_entries-view.tsx @@ -0,0 +1,104 @@ +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/chatbot_entries/chatbot_entriesSlice' +import dataFormatter from '../../helpers/dataFormatter'; +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 Chatbot_entriesView = () => { + const router = useRouter() + const dispatch = useAppDispatch() + const { chatbot_entries } = useAppSelector((state) => state.chatbot_entries) + + 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 chatbot_entries')} + + + + + + + +
+

hoas

+ +

{chatbot_entries?.hoas?.name ?? 'No data'}

+ +
+ +
+

Question

+

{chatbot_entries?.question}

+
+ +
+

Answer

+

{chatbot_entries?.answer}

+
+ +
+

Created_by

+ +

{chatbot_entries?.created_by?.firstName ?? 'No data'}

+ +
+ +
+

Hoa

+ +

{chatbot_entries?.hoa?.name ?? 'No data'}

+ +
+ + + + router.push('/chatbot_entries/chatbot_entries-list')} + /> +
+
+ + ); +}; + +Chatbot_entriesView.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} + +export default Chatbot_entriesView; diff --git a/frontend/src/pages/dashboard.tsx b/frontend/src/pages/dashboard.tsx index 3ab3e3a..20f337e 100644 --- a/frontend/src/pages/dashboard.tsx +++ b/frontend/src/pages/dashboard.tsx @@ -28,10 +28,14 @@ const Dashboard = () => { const [roles, setRoles] = React.useState(loadingMessage); const [permissions, setPermissions] = React.useState(loadingMessage); const [hoas, setHoas] = React.useState(loadingMessage); + const [request_types, setRequest_types] = React.useState(loadingMessage); + const [global_parameters, setGlobal_parameters] = React.useState(loadingMessage); + const [hoa_parameters, setHoa_parameters] = React.useState(loadingMessage); + const [chatbot_entries, setChatbot_entries] = React.useState(loadingMessage); async function loadData() { - const entities = ['users','announcements','invite_links','notifications','requests','security_alarms','units','vendors','roles','permissions','hoas',]; - const fns = [setUsers,setAnnouncements,setInvite_links,setNotifications,setRequests,setSecurity_alarms,setUnits,setVendors,setRoles,setPermissions,setHoas,]; + const entities = ['users','announcements','invite_links','notifications','requests','security_alarms','units','vendors','roles','permissions','hoas','request_types','global_parameters','hoa_parameters','chatbot_entries',]; + const fns = [setUsers,setAnnouncements,setInvite_links,setNotifications,setRequests,setSecurity_alarms,setUnits,setVendors,setRoles,setPermissions,setHoas,setRequest_types,setGlobal_parameters,setHoa_parameters,setChatbot_entries,]; const requests = entities.map((entity, index) => { return axios.get(`/${entity.toLowerCase()}/count`); @@ -321,6 +325,118 @@ const Dashboard = () => {
+ +
+
+
+
+ Request types +
+
+ {request_types} +
+
+
+ +
+
+
+ + + +
+
+
+
+ Global parameters +
+
+ {global_parameters} +
+
+
+ +
+
+
+ + + +
+
+
+
+ Hoa parameters +
+
+ {hoa_parameters} +
+
+
+ +
+
+
+ + + +
+
+
+
+ Chatbot entries +
+
+ {chatbot_entries} +
+
+
+ +
+
+
+ + diff --git a/frontend/src/pages/hoa_parameters/[hoa_parametersId].tsx b/frontend/src/pages/hoa_parameters/[hoa_parametersId].tsx new file mode 100644 index 0000000..f433595 --- /dev/null +++ b/frontend/src/pages/hoa_parameters/[hoa_parametersId].tsx @@ -0,0 +1,229 @@ +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 { SelectField } from "../../components/SelectField"; +import { SelectFieldMany } from "../../components/SelectFieldMany"; +import { SwitchField } from '../../components/SwitchField' +import {RichTextField} from "../../components/RichTextField"; + +import { update, fetch } from '../../stores/hoa_parameters/hoa_parametersSlice' +import { useAppDispatch, useAppSelector } from '../../stores/hooks' +import { useRouter } from 'next/router' + +const EditHoa_parameters = () => { + const router = useRouter() + const dispatch = useAppDispatch() + const initVals = { + + hoas: null, + + hoa: null, + + units_per_hoa: '', + + 'unit_types': '', + + 'vendor_categories': '', + + faq_limit: '', + + doc_limit: '', + + chatbot_suggestion_count: '', + + 'reminder_periods': '', + + 'escalation_timeframes': '', + + } + const [initialValues, setInitialValues] = useState(initVals) + + const { hoa_parameters } = useAppSelector((state) => state.hoa_parameters) + + const { hoa_parametersId } = router.query + + useEffect(() => { + dispatch(fetch({ id: hoa_parametersId })) + }, [hoa_parametersId]) + + useEffect(() => { + if (typeof hoa_parameters === 'object') { + setInitialValues(hoa_parameters) + } + }, [hoa_parameters]) + + useEffect(() => { + if (typeof hoa_parameters === 'object') { + + const newInitialVal = {...initVals}; + + Object.keys(initVals).forEach(el => newInitialVal[el] = (hoa_parameters)[el]) + + setInitialValues(newInitialVal); + } + }, [hoa_parameters]) + + const handleSubmit = async (data) => { + await dispatch(update({ id: hoa_parametersId, data })) + await router.push('/hoa_parameters/hoa_parameters-list') + } + + return ( + <> + + {getPageTitle('Edit hoa_parameters')} + + + + {''} + + + handleSubmit(values)} + > +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + router.push('/hoa_parameters/hoa_parameters-list')}/> + + +
+
+
+ + ) +} + +EditHoa_parameters.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} + +export default EditHoa_parameters diff --git a/frontend/src/pages/hoa_parameters/hoa_parameters-edit.tsx b/frontend/src/pages/hoa_parameters/hoa_parameters-edit.tsx new file mode 100644 index 0000000..6503d4f --- /dev/null +++ b/frontend/src/pages/hoa_parameters/hoa_parameters-edit.tsx @@ -0,0 +1,227 @@ +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 { SelectField } from "../../components/SelectField"; +import { SelectFieldMany } from "../../components/SelectFieldMany"; +import { SwitchField } from '../../components/SwitchField' +import {RichTextField} from "../../components/RichTextField"; + +import { update, fetch } from '../../stores/hoa_parameters/hoa_parametersSlice' +import { useAppDispatch, useAppSelector } from '../../stores/hooks' +import { useRouter } from 'next/router' +import dataFormatter from '../../helpers/dataFormatter'; + +const EditHoa_parametersPage = () => { + const router = useRouter() + const dispatch = useAppDispatch() + const initVals = { + + hoas: null, + + hoa: null, + + units_per_hoa: '', + + 'unit_types': '', + + 'vendor_categories': '', + + faq_limit: '', + + doc_limit: '', + + chatbot_suggestion_count: '', + + 'reminder_periods': '', + + 'escalation_timeframes': '', + + } + const [initialValues, setInitialValues] = useState(initVals) + + const { hoa_parameters } = useAppSelector((state) => state.hoa_parameters) + + const { id } = router.query + + useEffect(() => { + dispatch(fetch({ id: id })) + }, [id]) + + useEffect(() => { + if (typeof hoa_parameters === 'object') { + setInitialValues(hoa_parameters) + } + }, [hoa_parameters]) + + useEffect(() => { + if (typeof hoa_parameters === 'object') { + const newInitialVal = {...initVals}; + Object.keys(initVals).forEach(el => newInitialVal[el] = (hoa_parameters)[el]) + setInitialValues(newInitialVal); + } + }, [hoa_parameters]) + + const handleSubmit = async (data) => { + await dispatch(update({ id: id, data })) + await router.push('/hoa_parameters/hoa_parameters-list') + } + + return ( + <> + + {getPageTitle('Edit hoa_parameters')} + + + + {''} + + + handleSubmit(values)} + > +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + router.push('/hoa_parameters/hoa_parameters-list')}/> + + +
+
+
+ + ) +} + +EditHoa_parametersPage.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} + +export default EditHoa_parametersPage diff --git a/frontend/src/pages/hoa_parameters/hoa_parameters-list.tsx b/frontend/src/pages/hoa_parameters/hoa_parameters-list.tsx new file mode 100644 index 0000000..c214e90 --- /dev/null +++ b/frontend/src/pages/hoa_parameters/hoa_parameters-list.tsx @@ -0,0 +1,129 @@ +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 TableHoa_parameters from '../../components/Hoa_parameters/TableHoa_parameters' +import BaseButton from '../../components/BaseButton' +import axios from "axios"; +import {useAppDispatch, useAppSelector} from "../../stores/hooks"; +import CardBoxModal from "../../components/CardBoxModal"; +import DragDropFilePicker from "../../components/DragDropFilePicker"; +import {setRefetch, uploadCsv} from '../../stores/hoa_parameters/hoa_parametersSlice'; + +const Hoa_parametersTablesPage = () => { + const [filterItems, setFilterItems] = useState([]); + const [csvFile, setCsvFile] = useState(null); + const [isModalActive, setIsModalActive] = useState(false); + + const dispatch = useAppDispatch(); + + const [filters] = useState([{label: 'Unit types', title: 'unit_types'},{label: 'Vendor categories', title: 'vendor_categories'},{label: 'Reminder periods', title: 'reminder_periods'},{label: 'Escalation timeframes', title: 'escalation_timeframes'}, + {label: 'Units per hoa', title: 'units_per_hoa', number: 'true'},{label: 'Faq limit', title: 'faq_limit', number: 'true'},{label: 'Doc limit', title: 'doc_limit', number: 'true'},{label: 'Chatbot suggestion count', title: 'chatbot_suggestion_count', number: 'true'}, + + ]); + const addFilter = () => { + const newItem = { + id: uniqueId(), + fields: { + filterValue: '', + filterValueFrom: '', + filterValueTo: '', + selectedField: '', + }, + }; + newItem.fields.selectedField = filters[0].title; + setFilterItems([...filterItems, newItem]); + }; + + const getHoa_parametersCSV = async () => { + const response = await axios({url: '/hoa_parameters?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 = 'hoa_parametersCSV.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('Hoa_parameters')} + + + + {''} + + + + + + setIsModalActive(true)} + /> +
+
+
+
+ + + +
+ + + + + ) +} + +Hoa_parametersTablesPage.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} + +export default Hoa_parametersTablesPage diff --git a/frontend/src/pages/hoa_parameters/hoa_parameters-new.tsx b/frontend/src/pages/hoa_parameters/hoa_parameters-new.tsx new file mode 100644 index 0000000..015f5b4 --- /dev/null +++ b/frontend/src/pages/hoa_parameters/hoa_parameters-new.tsx @@ -0,0 +1,182 @@ +import { mdiChartTimelineVariant } 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 { SwitchField } from '../../components/SwitchField' + +import { SelectField } from '../../components/SelectField' +import {RichTextField} from "../../components/RichTextField"; + +import { create } from '../../stores/hoa_parameters/hoa_parametersSlice' +import { useAppDispatch } from '../../stores/hooks' +import { useRouter } from 'next/router' + +const initialValues = { + + hoas: '', + + hoa: '', + + units_per_hoa: '', + + unit_types: '', + + vendor_categories: '', + + faq_limit: '', + + doc_limit: '', + + chatbot_suggestion_count: '', + + reminder_periods: '', + + escalation_timeframes: '', + +} + +const Hoa_parametersNew = () => { + const router = useRouter() + const dispatch = useAppDispatch() + + const handleSubmit = async (data) => { + await dispatch(create(data)) + await router.push('/hoa_parameters/hoa_parameters-list') + } + return ( + <> + + {getPageTitle('New Item')} + + + + {''} + + + handleSubmit(values)} + > +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + router.push('/hoa_parameters/hoa_parameters-list')}/> + + +
+
+
+ + ) +} + +Hoa_parametersNew.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} + +export default Hoa_parametersNew diff --git a/frontend/src/pages/hoa_parameters/hoa_parameters-table.tsx b/frontend/src/pages/hoa_parameters/hoa_parameters-table.tsx new file mode 100644 index 0000000..336af00 --- /dev/null +++ b/frontend/src/pages/hoa_parameters/hoa_parameters-table.tsx @@ -0,0 +1,130 @@ +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 TableHoa_parameters from '../../components/Hoa_parameters/TableHoa_parameters' +import BaseButton from '../../components/BaseButton' +import axios from "axios"; +import {useAppDispatch, useAppSelector} from "../../stores/hooks"; +import CardBoxModal from "../../components/CardBoxModal"; +import DragDropFilePicker from "../../components/DragDropFilePicker"; +import {setRefetch, uploadCsv} from '../../stores/hoa_parameters/hoa_parametersSlice'; + +const Hoa_parametersTablesPage = () => { + const [filterItems, setFilterItems] = useState([]); + const [csvFile, setCsvFile] = useState(null); + const [isModalActive, setIsModalActive] = useState(false); + + const dispatch = useAppDispatch(); + + const [filters] = useState([{label: 'Unit types', title: 'unit_types'},{label: 'Vendor categories', title: 'vendor_categories'},{label: 'Reminder periods', title: 'reminder_periods'},{label: 'Escalation timeframes', title: 'escalation_timeframes'}, + {label: 'Units per hoa', title: 'units_per_hoa', number: 'true'},{label: 'Faq limit', title: 'faq_limit', number: 'true'},{label: 'Doc limit', title: 'doc_limit', number: 'true'},{label: 'Chatbot suggestion count', title: 'chatbot_suggestion_count', number: 'true'}, + + ]); + const addFilter = () => { + const newItem = { + id: uniqueId(), + fields: { + filterValue: '', + filterValueFrom: '', + filterValueTo: '', + selectedField: '', + }, + }; + newItem.fields.selectedField = filters[0].title; + setFilterItems([...filterItems, newItem]); + }; + + const getHoa_parametersCSV = async () => { + const response = await axios({url: '/hoa_parameters?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 = 'hoa_parametersCSV.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('Hoa_parameters')} + + + + {''} + + + + + + + setIsModalActive(true)} + /> +
+
+
+
+ + + +
+ + + + + ) +} + +Hoa_parametersTablesPage.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} + +export default Hoa_parametersTablesPage diff --git a/frontend/src/pages/hoa_parameters/hoa_parameters-view.tsx b/frontend/src/pages/hoa_parameters/hoa_parameters-view.tsx new file mode 100644 index 0000000..c134e2c --- /dev/null +++ b/frontend/src/pages/hoa_parameters/hoa_parameters-view.tsx @@ -0,0 +1,127 @@ +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/hoa_parameters/hoa_parametersSlice' +import dataFormatter from '../../helpers/dataFormatter'; +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 Hoa_parametersView = () => { + const router = useRouter() + const dispatch = useAppDispatch() + const { hoa_parameters } = useAppSelector((state) => state.hoa_parameters) + + 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 hoa_parameters')} + + + + + + + +
+

hoas

+ +

{hoa_parameters?.hoas?.name ?? 'No data'}

+ +
+ +
+

Hoa

+ +

{hoa_parameters?.hoa?.name ?? 'No data'}

+ +
+ +
+

Units per hoa

+

{hoa_parameters?.units_per_hoa || 'No data'}

+
+ +
+

Unit types

+

{hoa_parameters?.unit_types}

+
+ +
+

Vendor categories

+

{hoa_parameters?.vendor_categories}

+
+ +
+

Faq limit

+

{hoa_parameters?.faq_limit || 'No data'}

+
+ +
+

Doc limit

+

{hoa_parameters?.doc_limit || 'No data'}

+
+ +
+

Chatbot suggestion count

+

{hoa_parameters?.chatbot_suggestion_count || 'No data'}

+
+ +
+

Reminder periods

+

{hoa_parameters?.reminder_periods}

+
+ +
+

Escalation timeframes

+

{hoa_parameters?.escalation_timeframes}

+
+ + + + router.push('/hoa_parameters/hoa_parameters-list')} + /> +
+
+ + ); +}; + +Hoa_parametersView.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} + +export default Hoa_parametersView; diff --git a/frontend/src/pages/hoas/hoas-view.tsx b/frontend/src/pages/hoas/hoas-view.tsx index f1b367e..aa418f8 100644 --- a/frontend/src/pages/hoas/hoas-view.tsx +++ b/frontend/src/pages/hoas/hoas-view.tsx @@ -537,6 +537,369 @@ const HoasView = () => { + <> +

Request_types hoas

+ +
+ + + + + + + + + + + + {hoas.request_types_hoas && Array.isArray(hoas.request_types_hoas) && + hoas.request_types_hoas.map((item: any) => ( + router.push(`/request_types/request_types-view/?id=${item.id}`)}> + + + + + + + ))} + +
NameStatus
+ { item.name } + + { item.status } +
+
+ {!hoas?.request_types_hoas?.length &&
No data
} +
+ + + <> +

Request_types Hoa

+ +
+ + + + + + + + + + + + {hoas.request_types_hoa && Array.isArray(hoas.request_types_hoa) && + hoas.request_types_hoa.map((item: any) => ( + router.push(`/request_types/request_types-view/?id=${item.id}`)}> + + + + + + + ))} + +
NameStatus
+ { item.name } + + { item.status } +
+
+ {!hoas?.request_types_hoa?.length &&
No data
} +
+ + + <> +

Global_parameters hoas

+ +
+ + + + + + + + + + + + + + + + + + {hoas.global_parameters_hoas && Array.isArray(hoas.global_parameters_hoas) && + hoas.global_parameters_hoas.map((item: any) => ( + router.push(`/global_parameters/global_parameters-view/?id=${item.id}`)}> + + + + + + + + + + + + + ))} + +
Max units per hoaAllowed unit typesMax residents per unitMax managers per hoaMax security per hoa
+ { item.max_units_per_hoa } + + { item.allowed_unit_types } + + { item.max_residents_per_unit } + + { item.max_managers_per_hoa } + + { item.max_security_per_hoa } +
+
+ {!hoas?.global_parameters_hoas?.length &&
No data
} +
+ + + <> +

Hoa_parameters hoas

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + {hoas.hoa_parameters_hoas && Array.isArray(hoas.hoa_parameters_hoas) && + hoas.hoa_parameters_hoas.map((item: any) => ( + router.push(`/hoa_parameters/hoa_parameters-view/?id=${item.id}`)}> + + + + + + + + + + + + + + + + + + + ))} + +
Units per hoaUnit typesVendor categoriesFaq limitDoc limitChatbot suggestion countReminder periodsEscalation timeframes
+ { item.units_per_hoa } + + { item.unit_types } + + { item.vendor_categories } + + { item.faq_limit } + + { item.doc_limit } + + { item.chatbot_suggestion_count } + + { item.reminder_periods } + + { item.escalation_timeframes } +
+
+ {!hoas?.hoa_parameters_hoas?.length &&
No data
} +
+ + + <> +

Hoa_parameters Hoa

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + {hoas.hoa_parameters_hoa && Array.isArray(hoas.hoa_parameters_hoa) && + hoas.hoa_parameters_hoa.map((item: any) => ( + router.push(`/hoa_parameters/hoa_parameters-view/?id=${item.id}`)}> + + + + + + + + + + + + + + + + + + + ))} + +
Units per hoaUnit typesVendor categoriesFaq limitDoc limitChatbot suggestion countReminder periodsEscalation timeframes
+ { item.units_per_hoa } + + { item.unit_types } + + { item.vendor_categories } + + { item.faq_limit } + + { item.doc_limit } + + { item.chatbot_suggestion_count } + + { item.reminder_periods } + + { item.escalation_timeframes } +
+
+ {!hoas?.hoa_parameters_hoa?.length &&
No data
} +
+ + + <> +

Chatbot_entries hoas

+ +
+ + + + + + + + + + + + {hoas.chatbot_entries_hoas && Array.isArray(hoas.chatbot_entries_hoas) && + hoas.chatbot_entries_hoas.map((item: any) => ( + router.push(`/chatbot_entries/chatbot_entries-view/?id=${item.id}`)}> + + + + + + + ))} + +
QuestionAnswer
+ { item.question } + + { item.answer } +
+
+ {!hoas?.chatbot_entries_hoas?.length &&
No data
} +
+ + + <> +

Chatbot_entries Hoa

+ +
+ + + + + + + + + + + + {hoas.chatbot_entries_hoa && Array.isArray(hoas.chatbot_entries_hoa) && + hoas.chatbot_entries_hoa.map((item: any) => ( + router.push(`/chatbot_entries/chatbot_entries-view/?id=${item.id}`)}> + + + + + + + ))} + +
QuestionAnswer
+ { item.question } + + { item.answer } +
+
+ {!hoas?.chatbot_entries_hoa?.length &&
No data
} +
+ + { + <> +

Chatbot_entries Created_by

+ +
+ + + + + + + + + + + + {users.chatbot_entries_created_by && Array.isArray(users.chatbot_entries_created_by) && + users.chatbot_entries_created_by.map((item: any) => ( + router.push(`/chatbot_entries/chatbot_entries-view/?id=${item.id}`)}> + + + + + + + ))} + +
QuestionAnswer
+ { item.question } + + { item.answer } +
+
+ {!users?.chatbot_entries_created_by?.length &&
No data
} +
+ + { + const { id, query } = data + const result = await axios.get( + `chatbot_entries${ + query || (id ? `/${id}` : '') + }` + ) + return id ? result.data : {rows: result.data.rows, count: result.data.count}; +}) + +export const deleteItemsByIds = createAsyncThunk( + 'chatbot_entries/deleteByIds', + async (data: any, { rejectWithValue }) => { + try { + await axios.post('chatbot_entries/deleteByIds', { data }); + } catch (error) { + if (!error.response) { + throw error; + } + + return rejectWithValue(error.response.data); + } + }, +); + +export const deleteItem = createAsyncThunk('chatbot_entries/deleteChatbot_entries', async (id: string, { rejectWithValue }) => { + try { + await axios.delete(`chatbot_entries/${id}`) + } catch (error) { + if (!error.response) { + throw error; + } + + return rejectWithValue(error.response.data); + } +}) + +export const create = createAsyncThunk('chatbot_entries/createChatbot_entries', async (data: any, { rejectWithValue }) => { + try { + const result = await axios.post( + 'chatbot_entries', + { data } + ) + return result.data + } catch (error) { + if (!error.response) { + throw error; + } + + return rejectWithValue(error.response.data); + } +}) + +export const uploadCsv = createAsyncThunk( + 'chatbot_entries/uploadCsv', + async (file: File, { rejectWithValue }) => { + try { + const data = new FormData(); + data.append('file', file); + data.append('filename', file.name); + + const result = await axios.post('chatbot_entries/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('chatbot_entries/updateChatbot_entries', async (payload: any, { rejectWithValue }) => { + try { + const result = await axios.put( + `chatbot_entries/${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 chatbot_entriesSlice = createSlice({ + name: 'chatbot_entries', + 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.chatbot_entries = action.payload.rows; + state.count = action.payload.count; + } else { + state.chatbot_entries = 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, 'Chatbot_entries 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, `${'Chatbot_entries'.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, `${'Chatbot_entries'.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, `${'Chatbot_entries'.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, 'Chatbot_entries 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 } = chatbot_entriesSlice.actions + +export default chatbot_entriesSlice.reducer diff --git a/frontend/src/stores/store.ts b/frontend/src/stores/store.ts index 0d9b762..b8d6003 100644 --- a/frontend/src/stores/store.ts +++ b/frontend/src/stores/store.ts @@ -14,6 +14,10 @@ import vendorsSlice from "./vendors/vendorsSlice"; import rolesSlice from "./roles/rolesSlice"; import permissionsSlice from "./permissions/permissionsSlice"; import hoasSlice from "./hoas/hoasSlice"; +import request_typesSlice from "./request_types/request_typesSlice"; +import global_parametersSlice from "./global_parameters/global_parametersSlice"; +import hoa_parametersSlice from "./hoa_parameters/hoa_parametersSlice"; +import chatbot_entriesSlice from "./chatbot_entries/chatbot_entriesSlice"; export const store = configureStore({ reducer: { @@ -32,6 +36,10 @@ vendors: vendorsSlice, roles: rolesSlice, permissions: permissionsSlice, hoas: hoasSlice, +request_types: request_typesSlice, +global_parameters: global_parametersSlice, +hoa_parameters: hoa_parametersSlice, +chatbot_entries: chatbot_entriesSlice, }, })