From 88be0dafacc179374fe2fa871cef694644007ed1 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Tue, 28 Jan 2025 17:17:18 -0800 Subject: [PATCH 01/19] feat: update helper link migration with url and active columns --- backend/.env | 2 +- backend/migrations/0001-1.0-helperlink.js | 86 +++++++++++++++-------- 2 files changed, 57 insertions(+), 31 deletions(-) diff --git a/backend/.env b/backend/.env index 6a72f2d5..1a5c8ced 100644 --- a/backend/.env +++ b/backend/.env @@ -3,7 +3,7 @@ DB_USERNAME=user123 DB_PASSWORD=password123 DB_NAME=onboarding_db -DB_HOST=db +DB_HOST=localhost DB_PORT=5432 EMAIL=bluewaveguidefox@gmail.com diff --git a/backend/migrations/0001-1.0-helperlink.js b/backend/migrations/0001-1.0-helperlink.js index 4d722296..4b28cff4 100644 --- a/backend/migrations/0001-1.0-helperlink.js +++ b/backend/migrations/0001-1.0-helperlink.js @@ -6,41 +6,67 @@ module.exports = { up: async (queryInterface, Sequelize) => { const transaction = await queryInterface.sequelize.transaction(); try { - await queryInterface.createTable(TABLE_NAME, { - id: { - allowNull: false, - autoIncrement: true, - primaryKey: true, - type: Sequelize.INTEGER + await queryInterface.createTable( + TABLE_NAME, + { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER, + }, + title: { + type: Sequelize.STRING(255), + allowNull: false, + }, + headerBackgroundColor: { + type: Sequelize.STRING(15), + allowNull: false, + defaultValue: '#F8F9F8', + }, + linkFontColor: { + type: Sequelize.STRING(15), + allowNull: false, + defaultValue: '#344054', + }, + iconColor: { + type: Sequelize.STRING(15), + allowNull: false, + defaultValue: '#7F56D9', + }, + createdBy: { + type: Sequelize.INTEGER, + allowNull: false, + references: { + model: 'users', + key: 'id', + }, + }, }, - title: { + { transaction } + ); + + await queryInterface.addColumn( + TABLE_NAME, + 'url', + { type: Sequelize.STRING(255), allowNull: false, + defaultValue: '/', }, - headerBackgroundColor: { - type: Sequelize.STRING(15), - allowNull: false, - defaultValue : '#F8F9F8' - }, - linkFontColor: { - type: Sequelize.STRING(15), - allowNull: false, - defaultValue : '#344054' - }, - iconColor: { - type: Sequelize.STRING(15), + { transaction } + ); + + await queryInterface.addColumn( + TABLE_NAME, + 'active', + { + type: Sequelize.BOOLEAN, + defaultValue: true, allowNull: false, - defaultValue: '#7F56D9' }, - createdBy: { - type: Sequelize.INTEGER, - allowNull: false, - references: { - model: 'users', - key: 'id' - } - } - }, { transaction }); + { transaction } + ); // Commit the transaction await transaction.commit(); @@ -64,5 +90,5 @@ module.exports = { await transaction.rollback(); throw error; } - } + }, }; From 07179afc83f043cee63c74c54315ab5c82dbfb90 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Tue, 28 Jan 2025 17:19:53 -0800 Subject: [PATCH 02/19] feat: add url and active columns validation to controller --- backend/src/utils/helperLink.helper.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/src/utils/helperLink.helper.js b/backend/src/utils/helperLink.helper.js index d51dda53..b21f9b30 100644 --- a/backend/src/utils/helperLink.helper.js +++ b/backend/src/utils/helperLink.helper.js @@ -10,6 +10,8 @@ const helperValidator = [ .withMessage('Invalid value for headerBackgroundColor'), body('linkFontColor').optional().custom(isValidHexColor).withMessage('Invalid value for linkFontColor'), body('iconColor').optional().custom(isValidHexColor).withMessage('Invalid value for iconColor'), + body('url').isString().withMessage('Invalid value for url').custom(validateUrl).withMessage('Invalid value for url'), + body('active').optional().isBoolean().withMessage('Invalid value for active'), body('links').isArray().withMessage('links must be an array'), body('links.*.title') .trim() From e8626a3bdd13d487b436a3abb33ad944b4006032 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Tue, 28 Jan 2025 17:33:40 -0800 Subject: [PATCH 03/19] chore: undo .env change --- backend/.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/.env b/backend/.env index 1a5c8ced..6a72f2d5 100644 --- a/backend/.env +++ b/backend/.env @@ -3,7 +3,7 @@ DB_USERNAME=user123 DB_PASSWORD=password123 DB_NAME=onboarding_db -DB_HOST=localhost +DB_HOST=db DB_PORT=5432 EMAIL=bluewaveguidefox@gmail.com From 8b826bf855c2e46265d333b6b7de9f1efcf175fe Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Tue, 28 Jan 2025 18:13:01 -0800 Subject: [PATCH 04/19] feat: update helper link model --- backend/src/models/HelperLink.js | 42 ++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/backend/src/models/HelperLink.js b/backend/src/models/HelperLink.js index 4879b76e..cf5cd95b 100644 --- a/backend/src/models/HelperLink.js +++ b/backend/src/models/HelperLink.js @@ -1,4 +1,5 @@ -const { validateHexColor } = require("../utils/guide.helper"); +const { validateHexColor } = require('../utils/guide.helper'); +const { validateUrl } = require('../utils/link.helper'); /** * @@ -8,7 +9,7 @@ const { validateHexColor } = require("../utils/guide.helper"); */ module.exports = (sequelize, DataTypes) => { const HelperLink = sequelize.define( - "HelperLink", + 'HelperLink', { id: { type: DataTypes.INTEGER, @@ -25,30 +26,30 @@ module.exports = (sequelize, DataTypes) => { headerBackgroundColor: { type: DataTypes.STRING(15), allowNull: false, - defaultValue: "#F8F9F8", + defaultValue: '#F8F9F8', validate: { isHexColor(value) { - validateHexColor(value, "headerBackgroundColor"); + validateHexColor(value, 'headerBackgroundColor'); }, }, }, linkFontColor: { type: DataTypes.STRING(15), allowNull: false, - defaultValue: "#344054", + defaultValue: '#344054', validate: { isHexColor(value) { - validateHexColor(value, "linkFontColor"); + validateHexColor(value, 'linkFontColor'); }, }, }, iconColor: { type: DataTypes.STRING(15), allowNull: false, - defaultValue: "#7F56D9", + defaultValue: '#7F56D9', validate: { isHexColor(value) { - validateHexColor(value, "iconColor"); + validateHexColor(value, 'iconColor'); }, }, }, @@ -56,21 +57,36 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.INTEGER, allowNull: false, references: { - model: "users", - key: "id", + model: 'users', + key: 'id', }, }, + url: { + type: DataTypes.STRING(255), + allowNull: false, + validate: { + customValidation(value) { + return validateUrl(value); + }, + }, + defaultValue: '/', + }, + active: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: true, + }, }, { - tableName: "helper_link", + tableName: 'helper_link', timestamps: false, } ); HelperLink.associate = (models) => { HelperLink.belongsTo(models.User, { - foreignKey: "createdBy", - as: "creator", + foreignKey: 'createdBy', + as: 'creator', }); }; From 17e9ff1043b37eca33f1a42c78c5b287d559a956 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Tue, 28 Jan 2025 18:14:12 -0800 Subject: [PATCH 05/19] feat: update yup validation and add new fields to appearance form --- frontend/src/scenes/hints/CreateHintPage.jsx | 12 ----- .../LinkPageComponents/LinkAppearance.jsx | 50 ++++++++++++++++++- frontend/src/utils/linkHelper.js | 5 ++ 3 files changed, 53 insertions(+), 14 deletions(-) diff --git a/frontend/src/scenes/hints/CreateHintPage.jsx b/frontend/src/scenes/hints/CreateHintPage.jsx index ac4d4ff1..74b07836 100644 --- a/frontend/src/scenes/hints/CreateHintPage.jsx +++ b/frontend/src/scenes/hints/CreateHintPage.jsx @@ -44,18 +44,6 @@ const HintPage = ({ const [content, setContent] = useState(''); const markdownContent = new Turndown().turndown(content); - // const [buttonRepetition, setButtonRepetition] = useState('show only once'); - - // const [url, setUrl] = useState('https://'); - // const [actionButtonUrl, setActionButtonUrl] = useState('https://'); - // const [actionButtonText, setActionButtonText] = useState( - // 'Take me to subscription page' - // ); - // const [action, setAction] = useState('No action'); - // const [targetElement, setTargetElement] = useState('.element'); - // const [tooltipPlacement, setTooltipPlacement] = useState('Top'); - // const [isHintIconVisible, setIsHintIconVisible] = useState(true); - const [leftContent, setLeftContent] = useState({ buttonRepetition: 'show only once', url: 'https://', diff --git a/frontend/src/scenes/links/LinkPageComponents/LinkAppearance.jsx b/frontend/src/scenes/links/LinkPageComponents/LinkAppearance.jsx index a99a94bf..091d026b 100644 --- a/frontend/src/scenes/links/LinkPageComponents/LinkAppearance.jsx +++ b/frontend/src/scenes/links/LinkPageComponents/LinkAppearance.jsx @@ -2,11 +2,12 @@ import { Form, Formik } from 'formik'; import PropTypes from 'prop-types'; import { useContext, useEffect } from 'react'; import ColorInput from '../../../components/Links/ColorInput'; +import Switch from '../../../components/Switch/Switch'; import { HelperLinkContext } from '../../../services/linksProvider'; import { appearanceSchema } from '../../../utils/linkHelper'; import styles from '../LinkPage.module.scss'; -const LinkAppearance = ({ handleSaveHelper }) => { +const LinkAppearance = () => { const context = useContext(HelperLinkContext); if (!context) { throw new Error('LinkAppearance must be used within a HelperLinkProvider'); @@ -19,7 +20,11 @@ const LinkAppearance = ({ handleSaveHelper }) => { }, []); const handleHelperChange = (e) => { - const { name, value } = e.target; + const { name, checked } = e.target; + let { value } = e.target; + if (name === 'active') { + value = checked; + } setHelper((prev) => ({ ...prev, [name]: value })); }; @@ -29,6 +34,7 @@ const LinkAppearance = ({ handleSaveHelper }) => { validationSchema={appearanceSchema} validateOnMount={false} validateOnBlur={true} + enableReinitialize={true} > {({ errors, handleChange, handleBlur, values, validateField }) => (
@@ -49,12 +55,37 @@ const LinkAppearance = ({ handleSaveHelper }) => { onBlur={(e) => { handleBlur(e); handleHelperChange(e); + validateField('title'); }} /> {errors.title && ( {errors.title} )} + { title={'Helper icon color'} className={'icon'} /> + )} diff --git a/frontend/src/utils/linkHelper.js b/frontend/src/utils/linkHelper.js index 5eea9b1c..544318d9 100644 --- a/frontend/src/utils/linkHelper.js +++ b/frontend/src/utils/linkHelper.js @@ -31,6 +31,10 @@ const appearanceSchema = Yup.object().shape({ /^[A-Za-z'\s-]+$/, 'Header can only contain letters, hyphens and apostrophes' ), + url: Yup.string() + .required('URL is required') + .test('url', 'Invalid value for URL', validateUrl) + .max(2000, 'URL must be at most 2000 characters'), headerBackgroundColor: Yup.string() .optional() .matches(/^#[0-9A-Fa-f]{6}$/, 'Invalid value for headerBackgroundColor'), @@ -40,6 +44,7 @@ const appearanceSchema = Yup.object().shape({ iconColor: Yup.string() .optional() .matches(/^#[0-9A-Fa-f]{6}$/, 'Invalid value for iconColor'), + active: Yup.boolean('Active option must be a boolean'), }); export { appearanceSchema, newLinkSchema, validateUrl }; From fba07c6b7c23d740c7f05d3cbda4d63d35359616 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Tue, 28 Jan 2025 18:15:13 -0800 Subject: [PATCH 06/19] feat: add new fields to front end service functions --- .../src/scenes/links/LinkPage.module.scss | 9 +++++++ frontend/src/services/helperLinkService.js | 27 +++++++++++-------- frontend/src/services/linksProvider.jsx | 13 +++++++-- frontend/src/utils/guideHelper.js | 2 +- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/frontend/src/scenes/links/LinkPage.module.scss b/frontend/src/scenes/links/LinkPage.module.scss index 78be6990..288ab65d 100644 --- a/frontend/src/scenes/links/LinkPage.module.scss +++ b/frontend/src/scenes/links/LinkPage.module.scss @@ -68,6 +68,11 @@ $box-shadow-color: rgba(16, 24, 40, 0.05); font-size: 0.813rem; font-weight: 400; line-height: 1.54; + + &.last { + flex-direction: row; + gap: 1rem; + } } &__input { @@ -85,5 +90,9 @@ $box-shadow-color: rgba(16, 24, 40, 0.05); &:first-of-type { margin-top: 5px; } + + &.error { + border-color: var(--error-color); + } } } diff --git a/frontend/src/services/helperLinkService.js b/frontend/src/services/helperLinkService.js index 0f1f5a3c..ba3484d4 100644 --- a/frontend/src/services/helperLinkService.js +++ b/frontend/src/services/helperLinkService.js @@ -1,4 +1,4 @@ -import { apiClient } from "./apiClient"; +import { apiClient } from './apiClient'; export const getHelpers = async () => { try { @@ -6,7 +6,7 @@ export const getHelpers = async () => { if (response.status >= 400) throw new Error(response.data); return response.data; } catch (error) { - console.error("Get helper link error:", error.response); + console.error('Get helper link error:', error.response); throw error; } }; @@ -16,25 +16,25 @@ export const getHelperById = async (id) => { if (response.status >= 400) throw new Error(response.data); return response.data; } catch (error) { - console.error("Get helper link error:", error.response); + console.error('Get helper link error:', error.response); throw error; } }; const validateHelper = (helper, links) => { if (!helper?.title) { - throw new Error("Header is required"); + throw new Error('Header is required'); } if (!helper?.headerBackgroundColor) { - throw new Error("Header background color is required"); + throw new Error('Header background color is required'); } if (!helper?.linkFontColor) { - throw new Error("Link font color is required"); + throw new Error('Link font color is required'); } if (!helper?.iconColor) { - throw new Error("Icon color is required"); + throw new Error('Icon color is required'); } if (links.some((it) => !it?.title || !it?.url)) { - throw new Error("Title and URL are required"); + throw new Error('Title and URL are required'); } }; @@ -48,11 +48,14 @@ export const createHelper = async (helper, links) => { iconColor: helper.iconColor, userId: helper.userId, links, + url: helper.url, + active: helper.active, }); if (response.status >= 400) throw new Error(response.data); return response.data; } catch (error) { - console.error("Create helper link error:", error.message); + console.log(error.message); + console.error('Create helper link error:', error.message); throw error; } }; @@ -69,12 +72,14 @@ export const updateHelper = async (helper, links) => { iconColor: helper.iconColor, userId: helper.userId, links, + url: helper.url, + active: helper.active, } ); if (response.status >= 400) throw new Error(response.data); return response.data; } catch (error) { - console.error("Update helper link error:", error.response); + console.error('Update helper link error:', error.response); throw error; } }; @@ -85,7 +90,7 @@ export const deleteHelper = async (id) => { if (response.status >= 400) throw new Error(response.data); return response.data; } catch (error) { - console.error("Delete helper link error:", error.response); + console.error('Delete helper link error:', error.response); throw error; } }; diff --git a/frontend/src/services/linksProvider.jsx b/frontend/src/services/linksProvider.jsx index f4001f4d..7e34e960 100644 --- a/frontend/src/services/linksProvider.jsx +++ b/frontend/src/services/linksProvider.jsx @@ -2,8 +2,17 @@ import PropTypes from "prop-types"; import { createContext, useMemo, useState } from "react"; import { getLinks } from "./linkService"; +export const DEFAULT_VALUES = { + title: '', + headerBackgroundColor: '#F8F9F8', + linkFontColor: '#344054', + iconColor: '#7F56D9', + url: 'https://', + active: true, +}; + export const HelperLinkContext = createContext({ - helper: {}, + helper: DEFAULT_VALUES, setHelper: (helper) => {}, links: [], setLinks: (links) => {}, @@ -24,7 +33,7 @@ export const HelperLinkContext = createContext({ }); const HelperLinkProvider = ({ children }) => { - const [helper, setHelper] = useState({}); + const [helper, setHelper] = useState(DEFAULT_VALUES); const [links, setLinks] = useState([]); const [showSettings, setShowSettings] = useState(false); const [itemToDelete, setItemToDelete] = useState(null); diff --git a/frontend/src/utils/guideHelper.js b/frontend/src/utils/guideHelper.js index 9382bc39..ec16b7ea 100644 --- a/frontend/src/utils/guideHelper.js +++ b/frontend/src/utils/guideHelper.js @@ -3,7 +3,7 @@ import toastEmitter, { TOAST_EMITTER_KEY } from './toastEmitter'; export const emitToastError = (error) => { if (error.response?.data) { for (let i = 0; i < error.response.data.errors.length; i++){ - toastEmitter.emit(TOAST_EMITTER_KEY, 'An error occurred: ' + error.response.data.errors[i]) + toastEmitter.emit(TOAST_EMITTER_KEY, 'An error occurred: ' + error.response.data.errors[i].msg) } } else { toastEmitter.emit(TOAST_EMITTER_KEY, 'An error occurred. Please check your network connection and try again.') From f415b1b87e96ac139993167500b505cebb87a7a6 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Wed, 29 Jan 2025 13:30:26 -0800 Subject: [PATCH 07/19] feat: add absolutePath column to helper link --- backend/migrations/0001-1.0-helperlink.js | 11 +++++++++++ backend/src/models/HelperLink.js | 5 +++++ backend/src/utils/helperLink.helper.js | 1 + 3 files changed, 17 insertions(+) diff --git a/backend/migrations/0001-1.0-helperlink.js b/backend/migrations/0001-1.0-helperlink.js index 4b28cff4..96fa5e3b 100644 --- a/backend/migrations/0001-1.0-helperlink.js +++ b/backend/migrations/0001-1.0-helperlink.js @@ -68,6 +68,17 @@ module.exports = { { transaction } ); + await queryInterface.addColumn( + TABLE_NAME, + 'absolutePath', + { + type: Sequelize.BOOLEAN, + defaultValue: false, + allowNull: false, + }, + { transaction } + ); + // Commit the transaction await transaction.commit(); } catch (error) { diff --git a/backend/src/models/HelperLink.js b/backend/src/models/HelperLink.js index cf5cd95b..f14825b9 100644 --- a/backend/src/models/HelperLink.js +++ b/backend/src/models/HelperLink.js @@ -76,6 +76,11 @@ module.exports = (sequelize, DataTypes) => { allowNull: false, defaultValue: true, }, + absolutePath: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: false, + }, }, { tableName: 'helper_link', diff --git a/backend/src/utils/helperLink.helper.js b/backend/src/utils/helperLink.helper.js index b21f9b30..dc1a53a6 100644 --- a/backend/src/utils/helperLink.helper.js +++ b/backend/src/utils/helperLink.helper.js @@ -12,6 +12,7 @@ const helperValidator = [ body('iconColor').optional().custom(isValidHexColor).withMessage('Invalid value for iconColor'), body('url').isString().withMessage('Invalid value for url').custom(validateUrl).withMessage('Invalid value for url'), body('active').optional().isBoolean().withMessage('Invalid value for active'), + body('absolutePath').isBoolean().withMessage('Invalid value for absolutePath'), body('links').isArray().withMessage('links must be an array'), body('links.*.title') .trim() From 519dd75092e16fdcd759885a1ece78137e281e94 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Wed, 29 Jan 2025 13:30:43 -0800 Subject: [PATCH 08/19] feat: add absolutePath switch to front end --- .../src/scenes/links/LinkPage.module.scss | 2 +- .../LinkPageComponents/LinkAppearance.jsx | 21 +++++++++++++++++-- .../src/scenes/links/LinksDefaultPage.jsx | 3 +++ frontend/src/scenes/links/NewLinksPopup.jsx | 11 ++-------- frontend/src/services/helperLinkService.js | 2 ++ frontend/src/services/linksProvider.jsx | 1 + frontend/src/utils/linkHelper.js | 1 + 7 files changed, 29 insertions(+), 12 deletions(-) diff --git a/frontend/src/scenes/links/LinkPage.module.scss b/frontend/src/scenes/links/LinkPage.module.scss index 288ab65d..4d572945 100644 --- a/frontend/src/scenes/links/LinkPage.module.scss +++ b/frontend/src/scenes/links/LinkPage.module.scss @@ -69,7 +69,7 @@ $box-shadow-color: rgba(16, 24, 40, 0.05); font-weight: 400; line-height: 1.54; - &.last { + &.row { flex-direction: row; gap: 1rem; } diff --git a/frontend/src/scenes/links/LinkPageComponents/LinkAppearance.jsx b/frontend/src/scenes/links/LinkPageComponents/LinkAppearance.jsx index 091d026b..1b91195c 100644 --- a/frontend/src/scenes/links/LinkPageComponents/LinkAppearance.jsx +++ b/frontend/src/scenes/links/LinkPageComponents/LinkAppearance.jsx @@ -15,6 +15,8 @@ const LinkAppearance = () => { const { helper, setHelper } = context; + console.log({ helper }); + useEffect(() => { document.querySelector('#header').focus(); }, []); @@ -22,7 +24,7 @@ const LinkAppearance = () => { const handleHelperChange = (e) => { const { name, checked } = e.target; let { value } = e.target; - if (name === 'active') { + if (name === 'active' || name === 'absolutePath') { value = checked; } setHelper((prev) => ({ ...prev, [name]: value })); @@ -86,6 +88,21 @@ const LinkAppearance = () => { {errors.url} )} + { /> Date: Tue, 4 Feb 2025 11:44:43 -0800 Subject: [PATCH 15/19] chore: update migration --- backend/migrations/0001-1.0-helperlink.js | 91 ++++++++----------- .../20250204193712-add-columns-helper-link.js | 55 +++++++++++ 2 files changed, 91 insertions(+), 55 deletions(-) create mode 100644 backend/migrations/20250204193712-add-columns-helper-link.js diff --git a/backend/migrations/0001-1.0-helperlink.js b/backend/migrations/0001-1.0-helperlink.js index 1497822f..ee58ae8c 100644 --- a/backend/migrations/0001-1.0-helperlink.js +++ b/backend/migrations/0001-1.0-helperlink.js @@ -6,60 +6,41 @@ module.exports = { up: async (queryInterface, Sequelize) => { const transaction = await queryInterface.sequelize.transaction(); try { - await queryInterface.createTable( - TABLE_NAME, - { - id: { - allowNull: false, - autoIncrement: true, - primaryKey: true, - type: Sequelize.INTEGER, - }, - title: { - type: Sequelize.STRING(255), - allowNull: false, - }, - headerBackgroundColor: { - type: Sequelize.STRING(15), - allowNull: false, - defaultValue: '#F8F9F8', - }, - linkFontColor: { - type: Sequelize.STRING(15), - allowNull: false, - defaultValue: '#344054', - }, - iconColor: { - type: Sequelize.STRING(15), - allowNull: false, - defaultValue: '#7F56D9', - }, - url: { - type: Sequelize.STRING(255), - allowNull: false, - defaultValue: '/', - }, - active: { - type: Sequelize.BOOLEAN, - defaultValue: true, - allowNull: false, - }, - absolutePath: { - type: Sequelize.BOOLEAN, - defaultValue: false, - allowNull: false, - }, - createdBy: { - type: Sequelize.INTEGER, - allowNull: false, - references: { - model: 'users', - key: 'id', - }, - }, + await queryInterface.createTable(TABLE_NAME, { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER }, - { transaction } - ); + title: { + type: Sequelize.STRING(255), + allowNull: false, + }, + headerBackgroundColor: { + type: Sequelize.STRING(15), + allowNull: false, + defaultValue : '#F8F9F8' + }, + linkFontColor: { + type: Sequelize.STRING(15), + allowNull: false, + defaultValue : '#344054' + }, + iconColor: { + type: Sequelize.STRING(15), + allowNull: false, + defaultValue: '#7F56D9' + }, + createdBy: { + type: Sequelize.INTEGER, + allowNull: false, + references: { + model: 'users', + key: 'id' + } + } + }, { transaction }); // Commit the transaction await transaction.commit(); @@ -83,5 +64,5 @@ module.exports = { await transaction.rollback(); throw error; } - }, -}; + } +}; \ No newline at end of file diff --git a/backend/migrations/20250204193712-add-columns-helper-link.js b/backend/migrations/20250204193712-add-columns-helper-link.js new file mode 100644 index 00000000..ef4bccdf --- /dev/null +++ b/backend/migrations/20250204193712-add-columns-helper-link.js @@ -0,0 +1,55 @@ +'use strict'; + +const TABLE_NAME = 'helper_link'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + /** + * + * @param {import("sequelize").QueryInterface} queryInterface + * @param {import("sequelize").Sequelize} Sequelize + */ + async up(queryInterface, Sequelize) { + const transaction = queryInterface.sequelize.transaction(); + await queryInterface.addColumn( + TABLE_NAME, + 'url', + { + type: Sequelize.STRING(255), + allowNull: false, + defaultValue: '/', + }, + { transaction } + ); + + await queryInterface.addColumn( + TABLE_NAME, + 'active', + { + type: Sequelize.BOOLEAN, + defaultValue: true, + allowNull: false, + }, + { transaction } + ); + + await queryInterface.addColumn( + TABLE_NAME, + 'absolutePath', + { + type: Sequelize.BOOLEAN, + defaultValue: false, + allowNull: false, + }, + { transaction } + ); + }, + + async down(queryInterface, Sequelize) { + const transaction = queryInterface.sequelize.transaction(); + + await queryInterface.removeColumn(TABLE_NAME, 'url', { transaction }); + await queryInterface.removeColumn(TABLE_NAME, 'active', { transaction }); + await queryInterface.removeColumn(TABLE_NAME, 'absolutePath', { transaction }); + }, +}; From 1c966a2afd317494472e500dc4a06dc469130c67 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Tue, 4 Feb 2025 12:31:22 -0800 Subject: [PATCH 16/19] fix: fix link behaviour --- .../components/Links/Settings/Settings.jsx | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/Links/Settings/Settings.jsx b/frontend/src/components/Links/Settings/Settings.jsx index 27dbb29f..28b414a9 100644 --- a/frontend/src/components/Links/Settings/Settings.jsx +++ b/frontend/src/components/Links/Settings/Settings.jsx @@ -62,6 +62,7 @@ const Settings = () => { {} ); } + if (!e) { e = { target: settingsRef.current }; } @@ -95,7 +96,7 @@ const Settings = () => { validateOnBlur={false} onSubmit={async (values, { setSubmitting }) => { try { - handleClose(null, values); + await handleClose(null, state); } catch (error) { return; } finally { @@ -140,7 +141,10 @@ const Settings = () => { type="hidden" name="id" value={state.id} - onChange={handleChange} + onChange={(e) => { + handleChange(e); + setState((prev) => ({ ...prev, id: e.target.value })); + }} />