Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
e90b92e
Hotfix (#438)
alessandrofeitoza Jan 10, 2026
51a514e
Ajustando style code
alessandrofeitoza Jan 11, 2026
71b6f6c
Ajustando cadastro e edição do usuario (#441)
alessandrofeitoza Jan 12, 2026
2ddec10
Ajustes em espaços (#443)
alessandrofeitoza Jan 12, 2026
f35a273
Show all events data on home (#452)
imendes12 Jan 15, 2026
a261ba1
User Cover Image Update (#453)
TalysonSoares Jan 19, 2026
87d865a
Update space profile and space cover images (#456)
TalysonSoares Jan 19, 2026
78ffeb7
Show real data on Events details page (#454)
imendes12 Jan 19, 2026
97e3e3d
Fix space areas, forms and lists (#449)
alessandrofeitoza Jan 19, 2026
dd69412
Feature/register organization (#462)
alessandrofeitoza Jan 22, 2026
d684475
Improve the edit form for space
henriquelopeslima Jan 22, 2026
57147e5
Schedule time work (#464)
henriquelopeslima Jan 24, 2026
2871345
add events to space details page (#465)
TalysonSoares Jan 27, 2026
8da1dd4
Implement entity space portfolio (#459)
imendes12 Jan 28, 2026
1d36e13
Show real data on list opportunities
henriquelopeslima Jan 29, 2026
a7b86a5
Fix Organization Api Controller Test (#472)
TalysonSoares Feb 4, 2026
0f4ef2b
Implement Agent Portfolio (#476)
imendes12 Feb 6, 2026
ae540fd
Improve agent info and address on create form (#475)
henriquelopeslima Feb 6, 2026
e5c4856
Ajustando permissões para oportunidade
alessandrofeitoza Feb 6, 2026
aef2af0
Show real data from organizations (#474)
imendes12 Feb 9, 2026
deedcdc
Update data event by sections intro, address and social networks
henriquelopeslima Feb 9, 2026
82001d5
Show real data from Agents (#481)
imendes12 Feb 12, 2026
2fd4160
Create organization edit method (#483)
TalysonSoares Feb 18, 2026
81360d2
Improve edition form for agent
henriquelopeslima Mar 1, 2026
0c1ace4
add opportunity cover image (#484)
TalysonSoares Mar 9, 2026
73d4aea
Add inscription confirmation for events (#485)
imendes12 Mar 9, 2026
8b6596f
Fix show active filters on list spaces (#486)
imendes12 Mar 9, 2026
9731bc7
Adjust data from events (#487)
imendes12 Mar 9, 2026
797cb3d
Improvment navbar and dropdown (#490)
TalysonSoares Mar 9, 2026
efeb62c
Improvement homepage (#492)
TalysonSoares Mar 9, 2026
2271ca6
Show real data from opportunities (#494)
imendes12 Mar 9, 2026
8cd41d6
Show real data from initiative (#498)
imendes12 Mar 9, 2026
98c0b75
Fix tab content on components for entity list pages
alessandrofeitoza Mar 9, 2026
833c2cb
Fix the list of my organization
henriquelopeslima Mar 12, 2026
bfef4af
Improvement entities dashboard layout (#501)
TalysonSoares Mar 30, 2026
08feb4a
Improvement opportunity responsive page (#507)
TalysonSoares Mar 30, 2026
8fb4ae8
Fix cs fixer error (#508)
TalysonSoares Mar 30, 2026
e59c7ef
improvement agent responsive page (#509)
TalysonSoares Mar 30, 2026
8411452
Fix code sniffer error (#518)
TalysonSoares Mar 31, 2026
9c05e96
Improvement event responsive page (#510)
TalysonSoares Apr 21, 2026
1f26a51
Improvement Initiative Responsive Page (#514)
TalysonSoares Apr 21, 2026
1295017
Improvement space responsive page (#511)
TalysonSoares Apr 21, 2026
c79d662
fix empty finished opportunities error (#521)
TalysonSoares May 18, 2026
113125b
improv agent detail responsive page (#519)
TalysonSoares May 18, 2026
39ae8db
Improvement/initiative detail page (#530)
TalysonSoares Jun 15, 2026
cbb5700
improv opportunity detail responsive page (#523)
TalysonSoares Jun 15, 2026
cf07106
Improv/space details page (#524)
TalysonSoares Jul 27, 2026
d9b38f3
Improvement/organization details page (#526)
TalysonSoares Jul 27, 2026
9ef88cc
improvement account privacy responsiveness page (#541)
TalysonSoares Jul 27, 2026
adcf55c
Add tests to Log class (#656)
ronnyjohnti Mar 10, 2025
f00818e
Adds period filter to event page (#672)
ronnyjohnti Mar 28, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 12 additions & 40 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,15 +1,7 @@
# Makefile para automatizar setup do projeto PHP com Docker

include .env

.PHONY: up install_dependencies generate_proxies migrate_database load_fixtures install_frontend compile_frontend generate_keys

# Função para bloquear comandos em produção
guard-not-prod:
ifeq ($(APP_ENV),prod)
$(error Este comando não pode ser executado em produção)
endif

# Inicia os serviços Docker em modo detached
up:
docker compose up -d
Expand All @@ -28,7 +20,7 @@ container_php:

# Instala dependências dentro do contêiner PHP
install_dependencies:
docker compose exec -T php bash -c "composer install --ignore-platform-req=ext-mongodb"
docker compose exec -T php bash -c "COMPOSER_MEMORY_LIMIT=-1 composer install"

# Gera os arquivos de Proxies do MongoDB
generate_proxies:
Expand All @@ -46,56 +38,45 @@ migrate_odm:
docker compose exec -T php bash -c "php bin/console app:mongo:migrations:execute"

# Executa as fixtures de dados
load_fixtures: guard-not-prod
load_fixtures:
docker compose exec -T php bash -c "php bin/console doctrine:fixtures:load -n --purge-exclusions=city --purge-exclusions=state"

# Instala dependências do frontend
install_frontend:
docker compose exec -T php bash -c "php bin/console importmap:install"

# Compila os arquivos do frontend
compile_frontend: reset
compile_frontend:
docker compose exec -T php bash -c "php bin/console asset-map:compile"

# Abre uma instância gráfica do cypress
open_cypress: load_fixtures
xhost +local:
CYPRESS_MODE=open docker compose --profile tests up

# Executa as fixtures de dados e os testes de front-end
tests_front: guard-not-prod
if [ "$(fixtures)" != "no" ]; then \
make load_fixtures;\
fi;
tests_front: load_fixtures
docker compose up cypress

# Executa as fixtures de dados e os testes de back-end
tests_back: guard-not-prod
tests_back:
if [ "$(fixtures)" != "no" ]; then \
make load_fixtures;\
fi;
docker compose exec -T php bash -c "php bin/paratest $(filename) --no-coverage"

# Executa as fixtures de dados e os testes de back-end
tests_back_coverage: guard-not-prod
if [ "$(fixtures)" != "no" ]; then \
make load_fixtures;\
fi;
tests_back_coverage: load_fixtures
docker compose exec -T php bash -c "php -d memory_limit=512M bin/paratest $(filename)"

# Limpa o cache do projeto
reset:
docker compose exec -T php bash -c "php bin/console cache:clear"

# Limpa a cache e o banco
reset-deep: guard-not-prod
reset-deep:
rm -rf var/storage
rm -rf assets/uploads
docker compose exec -T php bash -c "rm -rf assets/uploads"
rm -rf assets/vendor
rm -rf public/assets
rm -rf var/cache
rm -rf var/log
docker compose exec -T php bash -c "php bin/console cache:clear"
docker compose exec -T php bash -c "rm -rf var/cache"
docker compose exec -T php bash -c "rm -rf var/log"
docker compose exec -T php bash -c "php -d memory_limit=-1 bin/console cache:clear"
docker compose exec -T php bash -c "php bin/console doctrine:mongodb:schema:drop --search-index"
docker compose exec -T php bash -c "php bin/console doctrine:mongodb:schema:drop --collection"
docker compose exec -T php bash -c "php bin/console doctrine:mongodb:schema:drop --db"
Expand All @@ -112,9 +93,6 @@ style:
docker compose exec -T php bash -c "php vendor/bin/phpcs --config-set installed_paths src/Standards"
docker compose exec -T php bash -c "php vendor/bin/phpcs"

create-admin-user:
docker compose exec -T php bash -c "php bin/console app:create-admin-user"

# Gera as chaves de autenticação JWT
generate_keys:
docker compose exec -T php bash -c "php bin/console lexik:jwt:generate-keypair --overwrite -n"
Expand All @@ -124,11 +102,5 @@ copy_dist:
cp phpcs.xml.dist phpcs.xml
cp phpunit.xml.dist phpunit.xml

permissions:
mkdir -p var/
mkdir -p vendor/
mkdir -p config/jwt
chmod -R 775 assets/ config/jwt var/ vendor/ public/

# Comando para rodar todos os passos juntos
setup: guard-not-prod up install_dependencies copy_dist reset-deep generate_proxies migrate_database load_fixtures install_frontend compile_frontend generate_keys
setup: up install_dependencies copy_dist reset-deep generate_proxies migrate_database load_fixtures install_frontend compile_frontend generate_keys
4 changes: 4 additions & 0 deletions assets/app.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import 'air-datepicker/air-datepicker.css';
import './styles/lib/air-datepicker-custom.css';

import './styles/app.css';
import './styles/components/navbar.css';
import './styles/components/footer.css';
Expand All @@ -7,6 +10,7 @@ import './styles/components/side-bar.css';
import './styles/components/title.css';
import './styles/components/form-step.css';
import './js/modal-confirm-remove.js';
import './js/_components/copy-id.js';

import './js/navbar-dropdown.js';
import '@iconify/iconify';
Binary file added assets/img/banner-default-white.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/img/default-image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
116 changes: 116 additions & 0 deletions assets/js/banner-cropper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('.js-cropper-input')
.forEach(input => new ImageCropper(input));
});

class ImageCropper {
constructor(inputElement) {
this.input = inputElement;

this.config = {
modalId: this.input.dataset.modalId,
previewSelector: this.input.dataset.preview,
aspectRatio: parseFloat(this.input.dataset.aspectRatio) || (16 / 9)
};

this.modalEl = document.getElementById(this.config.modalId);

if (!this.modalEl) {
return console.error(`ImageCropper: Modal "${this.config.modalId}" não encontrado.`);
}

this.imageEl = this.modalEl.querySelector('.image-to-crop');
this.saveBtn = this.modalEl.querySelector('.crop-save-btn');
this.previewEl = document.querySelector(this.config.previewSelector);

this.cropper = null;
this.bsModal = this.getBootstrapModal();

this.init();
}

init() {
if (!this.imageEl) return console.error('ImageCropper: Imagem .image-to-crop não encontrada.');

this.input.addEventListener('change', (e) => this.handleInputChange(e));
this.modalEl.addEventListener('shown.bs.modal', () => this.initCropperInstance());
this.modalEl.addEventListener('hidden.bs.modal', () => this.destroyCropperInstance());

if (this.saveBtn) {
this.saveBtn.addEventListener('click', () => this.handleSave());
}
}

getBootstrapModal() {
if (typeof bootstrap !== 'undefined') return new bootstrap.Modal(this.modalEl);
if (window.bootstrap) return new window.bootstrap.Modal(this.modalEl);
return null;
}

handleInputChange(e) {
const files = e.target.files;

if (!files || files.length === 0) return;
const file = files[0];
this.input.value = '';
this.imageEl.src = URL.createObjectURL(file);
if (this.bsModal) this.bsModal.show();
}

initCropperInstance() {
if (this.cropper) this.cropper.destroy();

this.cropper = new Cropper(this.imageEl, {
aspectRatio: this.config.aspectRatio,
viewMode: 1,
autoCropArea: 1,
});
}

destroyCropperInstance() {
if (!this.cropper) return;

this.cropper.destroy();
this.cropper = null;
this.imageEl.src = '';
}

handleSave() {
if (!this.cropper) return;

this.cropper.getCroppedCanvas({
width: 1920,
imageSmoothingEnabled: true,
imageSmoothingQuality: 'high',
}).toBlob((blob) => this.processBlob(blob), 'image/jpeg', 0.9);
}

processBlob(blob) {
if (!blob) return;

const file = new File([blob], "imagem-editada.jpg", {
type: "image/jpeg",
lastModified: Date.now()
});

const container = new DataTransfer();
container.items.add(file);
this.input.files = container.files;
this.updatePreview(blob);

if (this.bsModal) this.bsModal.hide();
}

updatePreview(blob) {
if (!this.previewEl) return;

const url = URL.createObjectURL(blob);

if (this.previewEl.tagName === 'IMG') {
this.previewEl.src = url;
return;
}

this.previewEl.style.backgroundImage = `url('${url}')`;
}
}
74 changes: 74 additions & 0 deletions assets/js/event/period-filter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import {getLocale} from "@symfony/ux-translator";
import AirDatepicker from 'air-datepicker';
import '../../styles/lib/air-datepicker-custom.css';
const datepickerLocale = await import('air-datepicker/locale/'+getLocale()+'.js');

const FORM_FILTER_SIDEBAR = document.getElementById('filter-sidebar');
const PERIOD_SELECT = document.getElementById('period');
const BTN_APPLY_PERIOD_FILTER = document.getElementById('apply-period-filter');
const BTN_CLOSE_CALENDAR = document.getElementById('close-calendar');

const datepicker = new AirDatepicker(document.getElementById('datepicker'), {
range: true,
multipleDates: true,
locale: await datepickerLocale.default.default,
onSelect: function ({ date, formattedDate }) {
const customPeriod = document.querySelector('#period option[data-name=custom]');
customPeriod.classList.remove('d-none');
customPeriod.innerText = formattedDate.join(' - ');

customPeriod.value = date.map(d => {
return d.getFullYear() + '-'
+ (d.getMonth()+1).toString().padStart(2, '0') + '-'
+ d.getDate().toString().padStart(2, '0');
}).join(',');
customPeriod.selected = true;

if (date.length === 2) {
customPeriod.selected = true;
BTN_CLOSE_CALENDAR.click();
}
},
});

PERIOD_SELECT.addEventListener('change', function () {
datepicker.clear({silent: true});
const customPeriod = document.querySelector('#period option[data-name=custom]');
customPeriod.classList.add('d-none');
customPeriod.innerText = '';
});

BTN_APPLY_PERIOD_FILTER.addEventListener('click', function () {
const period = PERIOD_SELECT.value;
const url = new URL(window.location.href);

url.searchParams.set('period', period);

window.location.href = url.toString();
});

(function () {
const searchParams = new URLSearchParams(window.location.search);

new FormData(FORM_FILTER_SIDEBAR).forEach(function (value, key) {
const element = FORM_FILTER_SIDEBAR.querySelector(`[name=${key}]`);
if (element) {
element.value = searchParams.get(key);
}
});

if ('' === PERIOD_SELECT.value) {
const period = searchParams.get('period');
if (period) {
const customPeriod = document.querySelector('#period option[data-name=custom]');
const periodInnerText = period.split(',').map(date => {
const [year, month, day] = date.split('-');
return `${day.padStart(2, '0')}/${month.padStart(2, '0')}/${year}`;
});

customPeriod.value = period;
customPeriod.selected = true;
customPeriod.innerText = periodInnerText.join(' - ');
}
}
})();
Loading
Loading