diff --git a/lib/Controller/PageController.php b/lib/Controller/PageController.php index a6f739b0a..ec7b0c1fc 100644 --- a/lib/Controller/PageController.php +++ b/lib/Controller/PageController.php @@ -83,6 +83,7 @@ class PageController extends AEnvironmentPageAwareController { #[FrontpageRoute(verb: 'GET', url: '/')] public function index(): TemplateResponse { $this->initialState->provideInitialState('config', $this->accountService->getConfig($this->userSession->getUser())); + $this->initialState->provideInitialState('filters', $this->accountService->getConfigFilters($this->userSession->getUser())); $this->initialState->provideInitialState('certificate_engine', $this->accountService->getCertificateEngineName()); try { diff --git a/lib/Db/SignRequestMapper.php b/lib/Db/SignRequestMapper.php index 91fb8bb04..e3e4d734a 100644 --- a/lib/Db/SignRequestMapper.php +++ b/lib/Db/SignRequestMapper.php @@ -554,13 +554,15 @@ class SignRequestMapper extends QBMapper { ); } if (!empty($filter['start'])) { + $start = (new \DateTime('@' . $filter['start'], new \DateTimeZone('UTC')))->format('Y-m-d H:i:s'); $qb->andWhere( - $qb->expr()->gte('f.created_at', $qb->createNamedParameter($filter['start'], IQueryBuilder::PARAM_INT)) + $qb->expr()->gte('f.created_at', $qb->createNamedParameter($start, IQueryBuilder::PARAM_STR)) ); } if (!empty($filter['end'])) { + $end = (new \DateTime('@' . $filter['end'], new \DateTimeZone('UTC')))->format('Y-m-d H:i:s'); $qb->andWhere( - $qb->expr()->lte('f.created_at', $qb->createNamedParameter($filter['end'], IQueryBuilder::PARAM_INT)) + $qb->expr()->lte('f.created_at', $qb->createNamedParameter($end, IQueryBuilder::PARAM_STR)) ); } } diff --git a/lib/Service/AccountService.php b/lib/Service/AccountService.php index 694d3b53c..5341d5ebf 100644 --- a/lib/Service/AccountService.php +++ b/lib/Service/AccountService.php @@ -194,16 +194,21 @@ class AccountService { $info['hasSignatureFile'] = $this->hasSignatureFile($user); $info['phoneNumber'] = $this->getPhoneNumber($user); $info['isApprover'] = $this->validateHelper->userCanApproveValidationDocuments($user, false); - $info['grid_view'] = $this->getUserConfigGridView($user); $info['id_docs_filters'] = $this->getUserConfigIdDocsFilters($user); $info['id_docs_sort'] = $this->getUserConfigIdDocsSort($user); $info['crl_filters'] = $this->getUserConfigCrlFilters($user); $info['crl_sort'] = $this->getUserConfigCrlSort($user); + $info['grid_view'] = $this->getUserConfigByKey($user, 'grid_view') === '1'; return array_filter($info); } + public function getConfigFilters(?IUser $user = null): array { + $info['filter_modified'] = $this->getUserConfigByKey($user, 'filter_modified'); + $info['filter_status'] = $this->getUserConfigByKey($user, 'filter_status'); + return $info; + } private function updateIdentifyMethodToAccount(int $signRequestId, string $email, string $uid): void { $identifyMethods = $this->identifyMethodService->getIdentifyMethodsFromSignRequestId($signRequestId); @@ -241,12 +246,12 @@ class AccountService { } } - private function getUserConfigGridView(?IUser $user = null): bool { + private function getUserConfigByKey(?IUser $user = null, string $key): string { if (!$user) { - return false; + return ''; } - return $this->config->getUserValue($user->getUID(), Application::APP_ID, 'grid_view', false) === '1'; + return $this->config->getUserValue($user->getUID(), Application::APP_ID, $key); } private function getUserConfigIdDocsFilters(?IUser $user = null): array { diff --git a/src/store/filters.js b/src/store/filters.js index 750d1f694..b9d8fe218 100644 --- a/src/store/filters.js +++ b/src/store/filters.js @@ -6,25 +6,71 @@ import { defineStore } from 'pinia' import { emit } from '@nextcloud/event-bus' - +import { loadState } from '@nextcloud/initial-state' +import axios from '@nextcloud/axios' +import { generateOcsUrl } from '@nextcloud/router' import logger from '../helpers/logger.js' export const useFiltersStore = defineStore('filter', { state: () => ({ chips: {}, + filter_modified: loadState('libresign', 'filters', { filter_modified: '' }).filter_modified, + filter_status: loadState('libresign', 'filters', { filter_status: '' }).filter_status, }), getters: { activeChips(state) { return Object.values(state.chips).flat() }, + filterStatusArray(state) { + try { + return state.filter_status != '' ? JSON.parse(state.filter_status) : [] + } catch (e) { + console.error('Erro ao converter filter_status:', e) + return [] + } + }, }, actions: { - onFilterUpdateChips(event) { + async onFilterUpdateChips(event) { this.chips = { ...this.chips, [event.id]: [...event.detail] } + emit('libresign:filters:update') logger.debug('File list filter chips updated', { chips: event.detail }) + }, + + async onFilterUpdateChipsAndSave(event) { + this.chips = { ...this.chips, [event.id]: [...event.detail] } + + + if(event.id == 'modified'){ + let value = this.chips['modified'][0]?.id || ''; + + await axios.put(generateOcsUrl('/apps/libresign/api/v1/account/config/{key}', { key: 'filter_modified' }), { + value, + }) + + emit('libresign:filters:update') + } + + if(event.id == 'status'){ + + const value = event.detail.length > 0 ? JSON.stringify(event.detail.map(item => item.id)) : ''; + + await axios.put(generateOcsUrl('/apps/libresign/api/v1/account/config/{key}', { key: 'filter_status' }), { + value, + }) + + this.filter_status = value + + emit('libresign:filters:update') + } + + + logger.debug('File list filter chips updated', { chips: event.detail }) + }, + }, }) diff --git a/src/views/FilesList/FileListFilter/FileListFilter.vue b/src/views/FilesList/FileListFilter/FileListFilter.vue index cd8d7e242..924312e69 100644 --- a/src/views/FilesList/FileListFilter/FileListFilter.vue +++ b/src/views/FilesList/FileListFilter/FileListFilter.vue @@ -48,8 +48,10 @@ export default {