Focus Talent System Inicial Primer Día

This commit is contained in:
Flatlogic Bot 2025-07-15 09:35:58 +00:00
parent 9722f8bd24
commit 74cd95b763
29 changed files with 1539 additions and 19 deletions

5
.gitignore vendored
View File

@ -1,3 +1,8 @@
node_modules/ node_modules/
*/node_modules/ */node_modules/
*/build/ */build/
**/node_modules/
**/build/
.DS_Store
.env

File diff suppressed because one or more lines are too long

View File

@ -19,6 +19,15 @@ module.exports = class ProjectsDBApi {
job_description: data.job_description || null, job_description: data.job_description || null,
strategic_form: data.strategic_form || null, strategic_form: data.strategic_form || null,
interview_type: data.interview_type || null, interview_type: data.interview_type || null,
interviewmode: data.interviewmode || null,
guidetype: data.guidetype || null,
mission: data.mission || null,
objectives: data.objectives || null,
tasks: data.tasks || null,
experience_and_knowledge: data.experience_and_knowledge || null,
challenges: data.challenges || null,
work_environment: data.work_environment || null,
work_pace: data.work_pace || null,
importHash: data.importHash || null, importHash: data.importHash || null,
createdById: currentUser.id, createdById: currentUser.id,
updatedById: currentUser.id, updatedById: currentUser.id,
@ -63,6 +72,15 @@ module.exports = class ProjectsDBApi {
job_description: item.job_description || null, job_description: item.job_description || null,
strategic_form: item.strategic_form || null, strategic_form: item.strategic_form || null,
interview_type: item.interview_type || null, interview_type: item.interview_type || null,
interviewmode: item.interviewmode || null,
guidetype: item.guidetype || null,
mission: item.mission || null,
objectives: item.objectives || null,
tasks: item.tasks || null,
experience_and_knowledge: item.experience_and_knowledge || null,
challenges: item.challenges || null,
work_environment: item.work_environment || null,
work_pace: item.work_pace || null,
importHash: item.importHash || null, importHash: item.importHash || null,
createdById: currentUser.id, createdById: currentUser.id,
updatedById: currentUser.id, updatedById: currentUser.id,
@ -111,6 +129,29 @@ module.exports = class ProjectsDBApi {
if (data.interview_type !== undefined) if (data.interview_type !== undefined)
updatePayload.interview_type = data.interview_type; updatePayload.interview_type = data.interview_type;
if (data.interviewmode !== undefined)
updatePayload.interviewmode = data.interviewmode;
if (data.guidetype !== undefined) updatePayload.guidetype = data.guidetype;
if (data.mission !== undefined) updatePayload.mission = data.mission;
if (data.objectives !== undefined)
updatePayload.objectives = data.objectives;
if (data.tasks !== undefined) updatePayload.tasks = data.tasks;
if (data.experience_and_knowledge !== undefined)
updatePayload.experience_and_knowledge = data.experience_and_knowledge;
if (data.challenges !== undefined)
updatePayload.challenges = data.challenges;
if (data.work_environment !== undefined)
updatePayload.work_environment = data.work_environment;
if (data.work_pace !== undefined) updatePayload.work_pace = data.work_pace;
updatePayload.updatedById = currentUser.id; updatePayload.updatedById = currentUser.id;
await projects.update(updatePayload, { transaction }); await projects.update(updatePayload, { transaction });
@ -310,6 +351,45 @@ module.exports = class ProjectsDBApi {
}; };
} }
if (filter.mission) {
where = {
...where,
[Op.and]: Utils.ilike('projects', 'mission', filter.mission),
};
}
if (filter.objectives) {
where = {
...where,
[Op.and]: Utils.ilike('projects', 'objectives', filter.objectives),
};
}
if (filter.tasks) {
where = {
...where,
[Op.and]: Utils.ilike('projects', 'tasks', filter.tasks),
};
}
if (filter.experience_and_knowledge) {
where = {
...where,
[Op.and]: Utils.ilike(
'projects',
'experience_and_knowledge',
filter.experience_and_knowledge,
),
};
}
if (filter.challenges) {
where = {
...where,
[Op.and]: Utils.ilike('projects', 'challenges', filter.challenges),
};
}
if (filter.active !== undefined) { if (filter.active !== undefined) {
where = { where = {
...where, ...where,
@ -324,6 +404,34 @@ module.exports = class ProjectsDBApi {
}; };
} }
if (filter.interviewmode) {
where = {
...where,
interviewmode: filter.interviewmode,
};
}
if (filter.guidetype) {
where = {
...where,
guidetype: filter.guidetype,
};
}
if (filter.work_environment) {
where = {
...where,
work_environment: filter.work_environment,
};
}
if (filter.work_pace) {
where = {
...where,
work_pace: filter.work_pace,
};
}
if (filter.client) { if (filter.client) {
const listItems = filter.client.split('|').map((item) => { const listItems = filter.client.split('|').map((item) => {
return Utils.uuid(item); return Utils.uuid(item);

View File

@ -0,0 +1,51 @@
module.exports = {
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async up(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.addColumn(
'projects',
'interviewmode',
{
type: Sequelize.DataTypes.ENUM,
values: ['value'],
},
{ transaction },
);
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async down(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.removeColumn('projects', 'interviewmode', {
transaction,
});
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
};

View File

@ -0,0 +1,51 @@
module.exports = {
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async up(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.addColumn(
'projects',
'guidetype',
{
type: Sequelize.DataTypes.ENUM,
values: ['value'],
},
{ transaction },
);
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async down(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.removeColumn('projects', 'guidetype', {
transaction,
});
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
};

View File

@ -0,0 +1,47 @@
module.exports = {
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async up(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.addColumn(
'projects',
'mission',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction },
);
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async down(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.removeColumn('projects', 'mission', { transaction });
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
};

View File

@ -0,0 +1,49 @@
module.exports = {
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async up(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.addColumn(
'projects',
'objectives',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction },
);
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async down(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.removeColumn('projects', 'objectives', {
transaction,
});
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
};

View File

@ -0,0 +1,47 @@
module.exports = {
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async up(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.addColumn(
'projects',
'tasks',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction },
);
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async down(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.removeColumn('projects', 'tasks', { transaction });
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
};

View File

@ -0,0 +1,51 @@
module.exports = {
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async up(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.addColumn(
'projects',
'experience_and_knowledge',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction },
);
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async down(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.removeColumn(
'projects',
'experience_and_knowledge',
{ transaction },
);
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
};

View File

@ -0,0 +1,49 @@
module.exports = {
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async up(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.addColumn(
'projects',
'challenges',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction },
);
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async down(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.removeColumn('projects', 'challenges', {
transaction,
});
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
};

View File

@ -0,0 +1,51 @@
module.exports = {
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async up(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.addColumn(
'projects',
'work_environment',
{
type: Sequelize.DataTypes.ENUM,
values: ['value'],
},
{ transaction },
);
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async down(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.removeColumn('projects', 'work_environment', {
transaction,
});
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
};

View File

@ -0,0 +1,51 @@
module.exports = {
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async up(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.addColumn(
'projects',
'work_pace',
{
type: Sequelize.DataTypes.ENUM,
values: ['value'],
},
{ transaction },
);
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async down(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.removeColumn('projects', 'work_pace', {
transaction,
});
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
};

View File

@ -32,6 +32,50 @@ module.exports = function (sequelize, DataTypes) {
values: ['in_person', 'remote'], values: ['in_person', 'remote'],
}, },
interviewmode: {
type: DataTypes.ENUM,
values: ['value'],
},
guidetype: {
type: DataTypes.ENUM,
values: ['value'],
},
mission: {
type: DataTypes.TEXT,
},
objectives: {
type: DataTypes.TEXT,
},
tasks: {
type: DataTypes.TEXT,
},
experience_and_knowledge: {
type: DataTypes.TEXT,
},
challenges: {
type: DataTypes.TEXT,
},
work_environment: {
type: DataTypes.ENUM,
values: ['value'],
},
work_pace: {
type: DataTypes.ENUM,
values: ['value'],
},
importHash: { importHash: {
type: DataTypes.STRING(255), type: DataTypes.STRING(255),
allowNull: true, allowNull: true,

View File

@ -21,7 +21,7 @@ const CandidatesData = [
// type code here for "files" field // type code here for "files" field
interview_transcript: 'Max Delbruck', interview_transcript: 'Alfred Kinsey',
// type code here for "files" field // type code here for "files" field
@ -39,7 +39,7 @@ const CandidatesData = [
// type code here for "files" field // type code here for "files" field
interview_transcript: 'Edward Teller', interview_transcript: 'Lynn Margulis',
// type code here for "files" field // type code here for "files" field
@ -57,7 +57,25 @@ const CandidatesData = [
// type code here for "files" field // type code here for "files" field
interview_transcript: 'Claude Levi-Strauss', interview_transcript: 'Marcello Malpighi',
// type code here for "files" field
// type code here for "relation_one" field
},
{
name: 'Diana Evans',
email: 'diana.evans@example.com',
// type code here for "relation_one" field
// type code here for "files" field
// type code here for "files" field
interview_transcript: 'Claude Bernard',
// type code here for "files" field // type code here for "files" field
@ -75,13 +93,31 @@ const ProjectsData = [
// type code here for "files" field // type code here for "files" field
job_description: 'Jonas Salk', job_description: 'Sheldon Glashow',
strategic_form: 'Claude Levi-Strauss', strategic_form: 'Albrecht von Haller',
interview_type: 'in_person', interview_type: 'remote',
// type code here for "relation_one" field // type code here for "relation_one" field
interviewmode: 'value',
guidetype: 'value',
mission: 'Theodosius Dobzhansky',
objectives: 'Wilhelm Wundt',
tasks: 'William Bayliss',
experience_and_knowledge: 'James Watson',
challenges: 'Edwin Hubble',
work_environment: 'value',
work_pace: 'value',
}, },
{ {
@ -93,13 +129,31 @@ const ProjectsData = [
// type code here for "files" field // type code here for "files" field
job_description: 'Archimedes', job_description: 'August Kekule',
strategic_form: 'Pierre Simon de Laplace', strategic_form: 'Max Planck',
interview_type: 'remote', interview_type: 'in_person',
// type code here for "relation_one" field // type code here for "relation_one" field
interviewmode: 'value',
guidetype: 'value',
mission: 'Ludwig Boltzmann',
objectives: 'Ernst Mayr',
tasks: 'Rudolf Virchow',
experience_and_knowledge: 'Max von Laue',
challenges: 'Jean Piaget',
work_environment: 'value',
work_pace: 'value',
}, },
{ {
@ -111,13 +165,67 @@ const ProjectsData = [
// type code here for "files" field // type code here for "files" field
job_description: 'Frederick Gowland Hopkins', job_description: 'Edward Teller',
strategic_form: 'Emil Fischer', strategic_form: 'Paul Dirac',
interview_type: 'in_person',
// type code here for "relation_one" field
interviewmode: 'value',
guidetype: 'value',
mission: 'Joseph J. Thomson',
objectives: 'Lynn Margulis',
tasks: 'Paul Ehrlich',
experience_and_knowledge: 'Lucretius',
challenges: 'Alfred Binet',
work_environment: 'value',
work_pace: 'value',
},
{
title: 'HR Automation Suite',
// type code here for "relation_one" field
// type code here for "relation_many" field
// type code here for "files" field
job_description: 'Comte de Buffon',
strategic_form: 'Alfred Kinsey',
interview_type: 'remote', interview_type: 'remote',
// type code here for "relation_one" field // type code here for "relation_one" field
interviewmode: 'value',
guidetype: 'value',
mission: 'Sigmund Freud',
objectives: 'Trofim Lysenko',
tasks: 'Louis Pasteur',
experience_and_knowledge: 'William Bayliss',
challenges: 'Arthur Eddington',
work_environment: 'value',
work_pace: 'value',
}, },
]; ];
@ -145,6 +253,14 @@ const ReportsData = [
// type code here for "relation_one" field // type code here for "relation_one" field
}, },
{
// type code here for "relation_one" field
content: 'Evaluation of communication and leadership skills.',
// type code here for "relation_one" field
},
]; ];
const ClientsData = [ const ClientsData = [
@ -159,6 +275,10 @@ const ClientsData = [
{ {
name: 'Future Enterprises', name: 'Future Enterprises',
}, },
{
name: 'Global Dynamics',
},
]; ];
// Similar logic for "relation_many" // Similar logic for "relation_many"
@ -196,6 +316,17 @@ async function associateUserWithClient() {
if (User2?.setClient) { if (User2?.setClient) {
await User2.setClient(relatedClient2); await User2.setClient(relatedClient2);
} }
const relatedClient3 = await Clients.findOne({
offset: Math.floor(Math.random() * (await Clients.count())),
});
const User3 = await Users.findOne({
order: [['id', 'ASC']],
offset: 3,
});
if (User3?.setClient) {
await User3.setClient(relatedClient3);
}
} }
async function associateCandidateWithProject() { async function associateCandidateWithProject() {
@ -231,6 +362,17 @@ async function associateCandidateWithProject() {
if (Candidate2?.setProject) { if (Candidate2?.setProject) {
await Candidate2.setProject(relatedProject2); await Candidate2.setProject(relatedProject2);
} }
const relatedProject3 = await Projects.findOne({
offset: Math.floor(Math.random() * (await Projects.count())),
});
const Candidate3 = await Candidates.findOne({
order: [['id', 'ASC']],
offset: 3,
});
if (Candidate3?.setProject) {
await Candidate3.setProject(relatedProject3);
}
} }
async function associateCandidateWithClient() { async function associateCandidateWithClient() {
@ -266,6 +408,17 @@ async function associateCandidateWithClient() {
if (Candidate2?.setClient) { if (Candidate2?.setClient) {
await Candidate2.setClient(relatedClient2); await Candidate2.setClient(relatedClient2);
} }
const relatedClient3 = await Clients.findOne({
offset: Math.floor(Math.random() * (await Clients.count())),
});
const Candidate3 = await Candidates.findOne({
order: [['id', 'ASC']],
offset: 3,
});
if (Candidate3?.setClient) {
await Candidate3.setClient(relatedClient3);
}
} }
async function associateProjectWithClient() { async function associateProjectWithClient() {
@ -301,6 +454,17 @@ async function associateProjectWithClient() {
if (Project2?.setClient) { if (Project2?.setClient) {
await Project2.setClient(relatedClient2); await Project2.setClient(relatedClient2);
} }
const relatedClient3 = await Clients.findOne({
offset: Math.floor(Math.random() * (await Clients.count())),
});
const Project3 = await Projects.findOne({
order: [['id', 'ASC']],
offset: 3,
});
if (Project3?.setClient) {
await Project3.setClient(relatedClient3);
}
} }
// Similar logic for "relation_many" // Similar logic for "relation_many"
@ -338,6 +502,17 @@ async function associateProjectWithClient() {
if (Project2?.setClient) { if (Project2?.setClient) {
await Project2.setClient(relatedClient2); await Project2.setClient(relatedClient2);
} }
const relatedClient3 = await Clients.findOne({
offset: Math.floor(Math.random() * (await Clients.count())),
});
const Project3 = await Projects.findOne({
order: [['id', 'ASC']],
offset: 3,
});
if (Project3?.setClient) {
await Project3.setClient(relatedClient3);
}
} }
async function associateReportWithCandidate() { async function associateReportWithCandidate() {
@ -373,6 +548,17 @@ async function associateReportWithCandidate() {
if (Report2?.setCandidate) { if (Report2?.setCandidate) {
await Report2.setCandidate(relatedCandidate2); await Report2.setCandidate(relatedCandidate2);
} }
const relatedCandidate3 = await Candidates.findOne({
offset: Math.floor(Math.random() * (await Candidates.count())),
});
const Report3 = await Reports.findOne({
order: [['id', 'ASC']],
offset: 3,
});
if (Report3?.setCandidate) {
await Report3.setCandidate(relatedCandidate3);
}
} }
async function associateReportWithClient() { async function associateReportWithClient() {
@ -408,6 +594,17 @@ async function associateReportWithClient() {
if (Report2?.setClient) { if (Report2?.setClient) {
await Report2.setClient(relatedClient2); await Report2.setClient(relatedClient2);
} }
const relatedClient3 = await Clients.findOne({
offset: Math.floor(Math.random() * (await Clients.count())),
});
const Report3 = await Reports.findOne({
order: [['id', 'ASC']],
offset: 3,
});
if (Report3?.setClient) {
await Report3.setClient(relatedClient3);
}
} }
module.exports = { module.exports = {

View File

@ -31,7 +31,26 @@ router.use(checkCrudPermissions('projects'));
* strategic_form: * strategic_form:
* type: string * type: string
* default: strategic_form * default: strategic_form
* mission:
* type: string
* default: mission
* objectives:
* type: string
* default: objectives
* tasks:
* type: string
* default: tasks
* experience_and_knowledge:
* type: string
* default: experience_and_knowledge
* challenges:
* type: string
* default: challenges
*
*
*
*
* *
*/ */
@ -317,7 +336,17 @@ router.get(
currentUser, currentUser,
}); });
if (filetype && filetype === 'csv') { if (filetype && filetype === 'csv') {
const fields = ['id', 'title', 'job_description', 'strategic_form']; const fields = [
'id',
'title',
'job_description',
'strategic_form',
'mission',
'objectives',
'tasks',
'experience_and_knowledge',
'challenges',
];
const opts = { fields }; const opts = { fields };
try { try {
const csv = parse(payload.rows, opts); const csv = parse(payload.rows, opts);

View File

@ -45,7 +45,23 @@ module.exports = class SearchService {
candidates: ['name', 'email', 'interview_transcript'], candidates: ['name', 'email', 'interview_transcript'],
projects: ['title', 'job_description', 'strategic_form'], projects: [
'title',
'job_description',
'strategic_form',
'mission',
'objectives',
'tasks',
'experience_and_knowledge',
'challenges',
],
reports: ['content'], reports: ['content'],

View File

@ -0,0 +1 @@
{}

View File

@ -161,6 +161,101 @@ const CardProjects = ({
</div> </div>
</dd> </dd>
</div> </div>
<div className='flex justify-between gap-x-4 py-3'>
<dt className=' text-gray-500 dark:text-dark-600'>
Interviewmode
</dt>
<dd className='flex items-start gap-x-2'>
<div className='font-medium line-clamp-4'>
{item.interviewmode}
</div>
</dd>
</div>
<div className='flex justify-between gap-x-4 py-3'>
<dt className=' text-gray-500 dark:text-dark-600'>
Guidetype
</dt>
<dd className='flex items-start gap-x-2'>
<div className='font-medium line-clamp-4'>
{item.guidetype}
</div>
</dd>
</div>
<div className='flex justify-between gap-x-4 py-3'>
<dt className=' text-gray-500 dark:text-dark-600'>
Mission
</dt>
<dd className='flex items-start gap-x-2'>
<div className='font-medium line-clamp-4'>
{item.mission}
</div>
</dd>
</div>
<div className='flex justify-between gap-x-4 py-3'>
<dt className=' text-gray-500 dark:text-dark-600'>
Objectives
</dt>
<dd className='flex items-start gap-x-2'>
<div className='font-medium line-clamp-4'>
{item.objectives}
</div>
</dd>
</div>
<div className='flex justify-between gap-x-4 py-3'>
<dt className=' text-gray-500 dark:text-dark-600'>Tasks</dt>
<dd className='flex items-start gap-x-2'>
<div className='font-medium line-clamp-4'>{item.tasks}</div>
</dd>
</div>
<div className='flex justify-between gap-x-4 py-3'>
<dt className=' text-gray-500 dark:text-dark-600'>
Experience and knowledge
</dt>
<dd className='flex items-start gap-x-2'>
<div className='font-medium line-clamp-4'>
{item.experience_and_knowledge}
</div>
</dd>
</div>
<div className='flex justify-between gap-x-4 py-3'>
<dt className=' text-gray-500 dark:text-dark-600'>
Challenges
</dt>
<dd className='flex items-start gap-x-2'>
<div className='font-medium line-clamp-4'>
{item.challenges}
</div>
</dd>
</div>
<div className='flex justify-between gap-x-4 py-3'>
<dt className=' text-gray-500 dark:text-dark-600'>
Work environment
</dt>
<dd className='flex items-start gap-x-2'>
<div className='font-medium line-clamp-4'>
{item.work_environment}
</div>
</dd>
</div>
<div className='flex justify-between gap-x-4 py-3'>
<dt className=' text-gray-500 dark:text-dark-600'>
Work pace
</dt>
<dd className='flex items-start gap-x-2'>
<div className='font-medium line-clamp-4'>
{item.work_pace}
</div>
</dd>
</div>
</dl> </dl>
</li> </li>
))} ))}

View File

@ -110,6 +110,59 @@ const ListProjects = ({
</p> </p>
<p className={'line-clamp-2'}>{item.interview_type}</p> <p className={'line-clamp-2'}>{item.interview_type}</p>
</div> </div>
<div className={'flex-1 px-3'}>
<p className={'text-xs text-gray-500 '}>
Interviewmode
</p>
<p className={'line-clamp-2'}>{item.interviewmode}</p>
</div>
<div className={'flex-1 px-3'}>
<p className={'text-xs text-gray-500 '}>Guidetype</p>
<p className={'line-clamp-2'}>{item.guidetype}</p>
</div>
<div className={'flex-1 px-3'}>
<p className={'text-xs text-gray-500 '}>Mission</p>
<p className={'line-clamp-2'}>{item.mission}</p>
</div>
<div className={'flex-1 px-3'}>
<p className={'text-xs text-gray-500 '}>Objectives</p>
<p className={'line-clamp-2'}>{item.objectives}</p>
</div>
<div className={'flex-1 px-3'}>
<p className={'text-xs text-gray-500 '}>Tasks</p>
<p className={'line-clamp-2'}>{item.tasks}</p>
</div>
<div className={'flex-1 px-3'}>
<p className={'text-xs text-gray-500 '}>
Experience and knowledge
</p>
<p className={'line-clamp-2'}>
{item.experience_and_knowledge}
</p>
</div>
<div className={'flex-1 px-3'}>
<p className={'text-xs text-gray-500 '}>Challenges</p>
<p className={'line-clamp-2'}>{item.challenges}</p>
</div>
<div className={'flex-1 px-3'}>
<p className={'text-xs text-gray-500 '}>
Work environment
</p>
<p className={'line-clamp-2'}>{item.work_environment}</p>
</div>
<div className={'flex-1 px-3'}>
<p className={'text-xs text-gray-500 '}>Work pace</p>
<p className={'line-clamp-2'}>{item.work_pace}</p>
</div>
</Link> </Link>
<ListActionsPopover <ListActionsPopover
onDelete={onDelete} onDelete={onDelete}

View File

@ -150,6 +150,126 @@ export const loadColumns = async (
editable: hasUpdatePermission, editable: hasUpdatePermission,
}, },
{
field: 'interviewmode',
headerName: 'Interviewmode',
flex: 1,
minWidth: 120,
filterable: false,
headerClassName: 'datagrid--header',
cellClassName: 'datagrid--cell',
editable: hasUpdatePermission,
type: 'singleSelect',
valueOptions: ['value'],
},
{
field: 'guidetype',
headerName: 'Guidetype',
flex: 1,
minWidth: 120,
filterable: false,
headerClassName: 'datagrid--header',
cellClassName: 'datagrid--cell',
editable: hasUpdatePermission,
type: 'singleSelect',
valueOptions: ['value'],
},
{
field: 'mission',
headerName: 'Mission',
flex: 1,
minWidth: 120,
filterable: false,
headerClassName: 'datagrid--header',
cellClassName: 'datagrid--cell',
editable: hasUpdatePermission,
},
{
field: 'objectives',
headerName: 'Objectives',
flex: 1,
minWidth: 120,
filterable: false,
headerClassName: 'datagrid--header',
cellClassName: 'datagrid--cell',
editable: hasUpdatePermission,
},
{
field: 'tasks',
headerName: 'Tasks',
flex: 1,
minWidth: 120,
filterable: false,
headerClassName: 'datagrid--header',
cellClassName: 'datagrid--cell',
editable: hasUpdatePermission,
},
{
field: 'experience_and_knowledge',
headerName: 'Experience and knowledge',
flex: 1,
minWidth: 120,
filterable: false,
headerClassName: 'datagrid--header',
cellClassName: 'datagrid--cell',
editable: hasUpdatePermission,
},
{
field: 'challenges',
headerName: 'Challenges',
flex: 1,
minWidth: 120,
filterable: false,
headerClassName: 'datagrid--header',
cellClassName: 'datagrid--cell',
editable: hasUpdatePermission,
},
{
field: 'work_environment',
headerName: 'Work environment',
flex: 1,
minWidth: 120,
filterable: false,
headerClassName: 'datagrid--header',
cellClassName: 'datagrid--cell',
editable: hasUpdatePermission,
type: 'singleSelect',
valueOptions: ['value'],
},
{
field: 'work_pace',
headerName: 'Work pace',
flex: 1,
minWidth: 120,
filterable: false,
headerClassName: 'datagrid--header',
cellClassName: 'datagrid--cell',
editable: hasUpdatePermission,
type: 'singleSelect',
valueOptions: ['value'],
},
{ {
field: 'actions', field: 'actions',
type: 'actions', type: 'actions',

View File

@ -17,7 +17,7 @@ export default function WebSiteFooter({ projectName }: WebSiteFooterProps) {
const borders = useAppSelector((state) => state.style.borders); const borders = useAppSelector((state) => state.style.borders);
const websiteHeder = useAppSelector((state) => state.style.websiteHeder); const websiteHeder = useAppSelector((state) => state.style.websiteHeder);
const style = FooterStyle.WITH_PROJECT_NAME; const style = FooterStyle.WITH_PAGES;
const design = FooterDesigns.DEFAULT_DESIGN; const design = FooterDesigns.DEFAULT_DESIGN;

View File

@ -170,6 +170,24 @@ const ClientsView = () => {
<th>Title</th> <th>Title</th>
<th>InterviewType</th> <th>InterviewType</th>
<th>Interviewmode</th>
<th>Guidetype</th>
<th>Mission</th>
<th>Objectives</th>
<th>Tasks</th>
<th>Experience and knowledge</th>
<th>Challenges</th>
<th>Work environment</th>
<th>Work pace</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -189,6 +207,30 @@ const ClientsView = () => {
<td data-label='interview_type'> <td data-label='interview_type'>
{item.interview_type} {item.interview_type}
</td> </td>
<td data-label='interviewmode'>
{item.interviewmode}
</td>
<td data-label='guidetype'>{item.guidetype}</td>
<td data-label='mission'>{item.mission}</td>
<td data-label='objectives'>{item.objectives}</td>
<td data-label='tasks'>{item.tasks}</td>
<td data-label='experience_and_knowledge'>
{item.experience_and_knowledge}
</td>
<td data-label='challenges'>{item.challenges}</td>
<td data-label='work_environment'>
{item.work_environment}
</td>
<td data-label='work_pace'>{item.work_pace}</td>
</tr> </tr>
))} ))}
</tbody> </tbody>
@ -213,6 +255,24 @@ const ClientsView = () => {
<th>Title</th> <th>Title</th>
<th>InterviewType</th> <th>InterviewType</th>
<th>Interviewmode</th>
<th>Guidetype</th>
<th>Mission</th>
<th>Objectives</th>
<th>Tasks</th>
<th>Experience and knowledge</th>
<th>Challenges</th>
<th>Work environment</th>
<th>Work pace</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -232,6 +292,30 @@ const ClientsView = () => {
<td data-label='interview_type'> <td data-label='interview_type'>
{item.interview_type} {item.interview_type}
</td> </td>
<td data-label='interviewmode'>
{item.interviewmode}
</td>
<td data-label='guidetype'>{item.guidetype}</td>
<td data-label='mission'>{item.mission}</td>
<td data-label='objectives'>{item.objectives}</td>
<td data-label='tasks'>{item.tasks}</td>
<td data-label='experience_and_knowledge'>
{item.experience_and_knowledge}
</td>
<td data-label='challenges'>{item.challenges}</td>
<td data-label='work_environment'>
{item.work_environment}
</td>
<td data-label='work_pace'>{item.work_pace}</td>
</tr> </tr>
))} ))}
</tbody> </tbody>

View File

@ -53,6 +53,24 @@ const EditProjects = () => {
interview_type: '', interview_type: '',
clients: null, clients: null,
interviewmode: '',
guidetype: '',
mission: '',
objectives: '',
tasks: '',
experience_and_knowledge: '',
challenges: '',
work_environment: '',
work_pace: '',
}; };
const [initialValues, setInitialValues] = useState(initVals); const [initialValues, setInitialValues] = useState(initVals);
@ -188,6 +206,61 @@ const EditProjects = () => {
></Field> ></Field>
</FormField> </FormField>
<FormField label='Interviewmode'>
<FormCheckRadioGroup>
<FormCheckRadio type='radio' label='value'>
<Field type='radio' name='interviewmode' value='value' />
</FormCheckRadio>
</FormCheckRadioGroup>
</FormField>
<FormField label='Guidetype'>
<FormCheckRadioGroup>
<FormCheckRadio type='radio' label='value'>
<Field type='radio' name='guidetype' value='value' />
</FormCheckRadio>
</FormCheckRadioGroup>
</FormField>
<FormField label='Mission'>
<Field name='mission' placeholder='Mission' />
</FormField>
<FormField label='Objectives'>
<Field name='objectives' placeholder='Objectives' />
</FormField>
<FormField label='Tasks'>
<Field name='tasks' placeholder='Tasks' />
</FormField>
<FormField label='Experience and knowledge'>
<Field
name='experience_and_knowledge'
placeholder='Experience and knowledge'
/>
</FormField>
<FormField label='Challenges'>
<Field name='challenges' placeholder='Challenges' />
</FormField>
<FormField label='Work environment'>
<FormCheckRadioGroup>
<FormCheckRadio type='radio' label='value'>
<Field type='radio' name='work_environment' value='value' />
</FormCheckRadio>
</FormCheckRadioGroup>
</FormField>
<FormField label='Work pace'>
<FormCheckRadioGroup>
<FormCheckRadio type='radio' label='value'>
<Field type='radio' name='work_pace' value='value' />
</FormCheckRadio>
</FormCheckRadioGroup>
</FormField>
<BaseDivider /> <BaseDivider />
<BaseButtons> <BaseButtons>
<BaseButton type='submit' color='info' label='Submit' /> <BaseButton type='submit' color='info' label='Submit' />

View File

@ -53,6 +53,24 @@ const EditProjectsPage = () => {
interview_type: '', interview_type: '',
clients: null, clients: null,
interviewmode: '',
guidetype: '',
mission: '',
objectives: '',
tasks: '',
experience_and_knowledge: '',
challenges: '',
work_environment: '',
work_pace: '',
}; };
const [initialValues, setInitialValues] = useState(initVals); const [initialValues, setInitialValues] = useState(initVals);
@ -186,6 +204,61 @@ const EditProjectsPage = () => {
></Field> ></Field>
</FormField> </FormField>
<FormField label='Interviewmode'>
<FormCheckRadioGroup>
<FormCheckRadio type='radio' label='value'>
<Field type='radio' name='interviewmode' value='value' />
</FormCheckRadio>
</FormCheckRadioGroup>
</FormField>
<FormField label='Guidetype'>
<FormCheckRadioGroup>
<FormCheckRadio type='radio' label='value'>
<Field type='radio' name='guidetype' value='value' />
</FormCheckRadio>
</FormCheckRadioGroup>
</FormField>
<FormField label='Mission'>
<Field name='mission' placeholder='Mission' />
</FormField>
<FormField label='Objectives'>
<Field name='objectives' placeholder='Objectives' />
</FormField>
<FormField label='Tasks'>
<Field name='tasks' placeholder='Tasks' />
</FormField>
<FormField label='Experience and knowledge'>
<Field
name='experience_and_knowledge'
placeholder='Experience and knowledge'
/>
</FormField>
<FormField label='Challenges'>
<Field name='challenges' placeholder='Challenges' />
</FormField>
<FormField label='Work environment'>
<FormCheckRadioGroup>
<FormCheckRadio type='radio' label='value'>
<Field type='radio' name='work_environment' value='value' />
</FormCheckRadio>
</FormCheckRadioGroup>
</FormField>
<FormField label='Work pace'>
<FormCheckRadioGroup>
<FormCheckRadio type='radio' label='value'>
<Field type='radio' name='work_pace' value='value' />
</FormCheckRadio>
</FormCheckRadioGroup>
</FormField>
<BaseDivider /> <BaseDivider />
<BaseButtons> <BaseButtons>
<BaseButton type='submit' color='info' label='Submit' /> <BaseButton type='submit' color='info' label='Submit' />

View File

@ -32,6 +32,11 @@ const ProjectsTablesPage = () => {
{ label: 'Title', title: 'title' }, { label: 'Title', title: 'title' },
{ label: 'JobDescription', title: 'job_description' }, { label: 'JobDescription', title: 'job_description' },
{ label: 'StrategicForm', title: 'strategic_form' }, { label: 'StrategicForm', title: 'strategic_form' },
{ label: 'Mission', title: 'mission' },
{ label: 'Objectives', title: 'objectives' },
{ label: 'Tasks', title: 'tasks' },
{ label: 'Experience and knowledge', title: 'experience_and_knowledge' },
{ label: 'Challenges', title: 'challenges' },
{ label: 'Candidates', title: 'candidates' }, { label: 'Candidates', title: 'candidates' },
{ {
@ -40,6 +45,30 @@ const ProjectsTablesPage = () => {
type: 'enum', type: 'enum',
options: ['in_person', 'remote'], options: ['in_person', 'remote'],
}, },
{
label: 'Interviewmode',
title: 'interviewmode',
type: 'enum',
options: ['value'],
},
{
label: 'Guidetype',
title: 'guidetype',
type: 'enum',
options: ['value'],
},
{
label: 'Work environment',
title: 'work_environment',
type: 'enum',
options: ['value'],
},
{
label: 'Work pace',
title: 'work_pace',
type: 'enum',
options: ['value'],
},
]); ]);
const hasCreatePermission = const hasCreatePermission =

View File

@ -48,6 +48,24 @@ const initialValues = {
interview_type: 'in_person', interview_type: 'in_person',
clients: '', clients: '',
interviewmode: '',
guidetype: '',
mission: '',
objectives: '',
tasks: '',
experience_and_knowledge: '',
challenges: '',
work_environment: '',
work_pace: '',
}; };
const ProjectsNew = () => { const ProjectsNew = () => {
@ -155,6 +173,61 @@ const ProjectsNew = () => {
></Field> ></Field>
</FormField> </FormField>
<FormField label='Interviewmode'>
<FormCheckRadioGroup>
<FormCheckRadio type='radio' label='value'>
<Field type='radio' name='interviewmode' value='value' />
</FormCheckRadio>
</FormCheckRadioGroup>
</FormField>
<FormField label='Guidetype'>
<FormCheckRadioGroup>
<FormCheckRadio type='radio' label='value'>
<Field type='radio' name='guidetype' value='value' />
</FormCheckRadio>
</FormCheckRadioGroup>
</FormField>
<FormField label='Mission'>
<Field name='mission' placeholder='Mission' />
</FormField>
<FormField label='Objectives'>
<Field name='objectives' placeholder='Objectives' />
</FormField>
<FormField label='Tasks'>
<Field name='tasks' placeholder='Tasks' />
</FormField>
<FormField label='Experience and knowledge'>
<Field
name='experience_and_knowledge'
placeholder='Experience and knowledge'
/>
</FormField>
<FormField label='Challenges'>
<Field name='challenges' placeholder='Challenges' />
</FormField>
<FormField label='Work environment'>
<FormCheckRadioGroup>
<FormCheckRadio type='radio' label='value'>
<Field type='radio' name='work_environment' value='value' />
</FormCheckRadio>
</FormCheckRadioGroup>
</FormField>
<FormField label='Work pace'>
<FormCheckRadioGroup>
<FormCheckRadio type='radio' label='value'>
<Field type='radio' name='work_pace' value='value' />
</FormCheckRadio>
</FormCheckRadioGroup>
</FormField>
<BaseDivider /> <BaseDivider />
<BaseButtons> <BaseButtons>
<BaseButton type='submit' color='info' label='Submit' /> <BaseButton type='submit' color='info' label='Submit' />

View File

@ -32,6 +32,11 @@ const ProjectsTablesPage = () => {
{ label: 'Title', title: 'title' }, { label: 'Title', title: 'title' },
{ label: 'JobDescription', title: 'job_description' }, { label: 'JobDescription', title: 'job_description' },
{ label: 'StrategicForm', title: 'strategic_form' }, { label: 'StrategicForm', title: 'strategic_form' },
{ label: 'Mission', title: 'mission' },
{ label: 'Objectives', title: 'objectives' },
{ label: 'Tasks', title: 'tasks' },
{ label: 'Experience and knowledge', title: 'experience_and_knowledge' },
{ label: 'Challenges', title: 'challenges' },
{ label: 'Candidates', title: 'candidates' }, { label: 'Candidates', title: 'candidates' },
{ {
@ -40,6 +45,30 @@ const ProjectsTablesPage = () => {
type: 'enum', type: 'enum',
options: ['in_person', 'remote'], options: ['in_person', 'remote'],
}, },
{
label: 'Interviewmode',
title: 'interviewmode',
type: 'enum',
options: ['value'],
},
{
label: 'Guidetype',
title: 'guidetype',
type: 'enum',
options: ['value'],
},
{
label: 'Work environment',
title: 'work_environment',
type: 'enum',
options: ['value'],
},
{
label: 'Work pace',
title: 'work_pace',
type: 'enum',
options: ['value'],
},
]); ]);
const hasCreatePermission = const hasCreatePermission =

View File

@ -159,6 +159,51 @@ const ProjectsView = () => {
<p>{projects?.clients?.name ?? 'No data'}</p> <p>{projects?.clients?.name ?? 'No data'}</p>
</div> </div>
<div className={'mb-4'}>
<p className={'block font-bold mb-2'}>Interviewmode</p>
<p>{projects?.interviewmode ?? 'No data'}</p>
</div>
<div className={'mb-4'}>
<p className={'block font-bold mb-2'}>Guidetype</p>
<p>{projects?.guidetype ?? 'No data'}</p>
</div>
<div className={'mb-4'}>
<p className={'block font-bold mb-2'}>Mission</p>
<p>{projects?.mission}</p>
</div>
<div className={'mb-4'}>
<p className={'block font-bold mb-2'}>Objectives</p>
<p>{projects?.objectives}</p>
</div>
<div className={'mb-4'}>
<p className={'block font-bold mb-2'}>Tasks</p>
<p>{projects?.tasks}</p>
</div>
<div className={'mb-4'}>
<p className={'block font-bold mb-2'}>Experience and knowledge</p>
<p>{projects?.experience_and_knowledge}</p>
</div>
<div className={'mb-4'}>
<p className={'block font-bold mb-2'}>Challenges</p>
<p>{projects?.challenges}</p>
</div>
<div className={'mb-4'}>
<p className={'block font-bold mb-2'}>Work environment</p>
<p>{projects?.work_environment ?? 'No data'}</p>
</div>
<div className={'mb-4'}>
<p className={'block font-bold mb-2'}>Work pace</p>
<p>{projects?.work_pace ?? 'No data'}</p>
</div>
<> <>
<p className={'block font-bold mb-2'}>Candidates Project</p> <p className={'block font-bold mb-2'}>Candidates Project</p>
<CardBox <CardBox

View File

@ -74,7 +74,7 @@ export default function WebSite() {
<FeaturesSection <FeaturesSection
projectName={'focus Talent System'} projectName={'focus Talent System'}
image={['Icons representing various services']} image={['Icons representing various services']}
withBg={1} withBg={0}
features={features_points} features={features_points}
mainText={`Unleash the Power of ${projectName}`} mainText={`Unleash the Power of ${projectName}`}
subTitle={`Explore the robust features of ${projectName} that streamline your candidate evaluation process and enhance decision-making.`} subTitle={`Explore the robust features of ${projectName} that streamline your candidate evaluation process and enhance decision-making.`}