F4ilji
9023fdd7e7
fix(schedule): restore original Index.vue with SSR-safe fixes
2026-08-31 20:31:35 +05:00
F4ilji
d6a10d46c7
fix(schedule): case-sensitive import MainPageNavbar (Linux)
2026-08-31 20:23:36 +05:00
F4ilji
a1183f91f6
fix(schedule): merge duplicate script blocks into one
2026-08-31 20:20:59 +05:00
F4ilji
36c122cf65
fix(deploy): restart SSR after build to pick up new SSR bundle
2026-08-31 20:14:55 +05:00
F4ilji
774de4a6ab
fix(deploy): explicit SSR restart after build + defensive props
2026-08-31 20:05:39 +05:00
F4ilji
712f172071
fix(schedule): SSR-safe props to prevent null component hydration error
2026-08-31 19:45:12 +05:00
F4ilji
7052b35c19
fix(seeder): remove is_zaoch column not in schedules table
2026-08-20 11:38:36 +05:00
F4ilji
9b0c8f8158
feat(seeder): add ScheduleMockSeeder with 40 fake records
2026-08-20 11:34:08 +05:00
F4ilji
e6d223d15c
feat(schedules): add 'select all N' across pages
...
- Add GetAllScheduleIdsAction + GetFilteredScheduleIdsTask
- Add GET /dashboard/schedules/all-ids route returning filtered IDs
- Add selectAllFiltered method to Index.vue
- Button 'Выбрать все N' appears when total > per-page count
2026-08-20 11:31:04 +05:00
F4ilji
24387d6767
feat(schedules): add bulk delete via checkboxes
...
- Add BulkDeleteSchedulesTask, BulkDeleteSchedulesAction
- Add route DELETE /dashboard/schedules/bulk-destroy
- Add bulkDestroy method to ScheduleController
- Update Index.vue: select all/individual checkboxes, bulk actions bar
- Fix CheckDashboardPermission: replace naive /s$/ regex with Str::singular()
to resolve irregular plurals (faculties→faculty, categories→category)
2026-08-20 11:16:53 +05:00
F4ilji
f8d55092e5
fix: add null guard in generateSlug to prevent SSR crash on null tab titles
2026-08-03 11:52:36 +05:00
F4ilji
63e456088d
feat(dashboard): add Roles CRUD with permission-based menu filtering
...
- Roles CRUD: List/Create/Update/Delete actions, controller, requests
- Roles Vue pages: Index, Create, Edit (Options API, DashboardLayout)
- SidebarNav: filter menu items by user permissions via Inertia shared data
- HandleInertiaRequests: share permissions and roles arrays to frontend
- HttpKernel: register dashboard.permission middleware alias
- SidebarNavItem: add shield-check icon mapping
2026-08-03 10:39:15 +05:00
F4ilji
d4ef7daeb1
feat(dashboard): add page export/import functionality
...
- ExportPageAction: exports page with SEO and section path as JSON
- ImportPageAction: imports page from JSON, resolves section by slug path
- PageController: export/download and import endpoints
- Routes: GET /{page}/export, POST /import
- Index.vue: export button per row, import button in header (local only)
- Import restricted to APP_ENV=local (backend + frontend check)
2026-08-03 10:21:14 +05:00
F4ilji
3860c5d24c
fix(permissions): remove direct user permission sync — roles only
...
UpdateUserAction and CreateUserAction were calling syncPermissions()
which wrote to model_has_permissions table directly. This meant
permissions persisted even after being removed from the role.
Now users only get permissions through their roles.
2026-07-16 14:09:30 +05:00
F4ilji
b7259fdd6f
refactor(permissions): replace hardcoded route middleware with auto-resolving CheckDashboardPermission
...
- New middleware extracts permission name from route name automatically
- dashboard.posts.index → view_any_post
- dashboard.admission-campaigns.store → view_any_admission_campaign
- vikon-updates, integration-credentials excluded from check
- Single middleware on parent group instead of 28 individual ones
2026-07-16 12:05:15 +05:00
F4ilji
b8fd42d9f8
fix(security): add permission middleware to dashboard routes
...
Each route group now requires view_any_{resource} permission.
Without the permission, Spatie returns 403 Forbidden.
VIKON updates and integration-credentials remain unprotected.
2026-07-16 11:57:20 +05:00
F4ilji
4f4bed0899
fix(menu): use 'view_any_role' instead of 'view_any_shield::role'
...
Permission name mismatch between menuConfig and DB was hiding the Roles tab.
2026-07-16 11:35:44 +05:00
F4ilji
9ac4f89e36
feat(jenkins): add dashboard:sync-permissions after migrations
...
Ensures all dashboard permissions exist on every deploy.
Command is idempotent — safe to run repeatedly.
2026-07-11 14:22:05 +05:00
F4ilji
c6ca3258c1
feat(permissions): add dashboard:sync-permissions artisan command
...
Auto-discovers all dashboard permissions from resource/prefix matrix,
creates missing ones in DB, syncs to super_admin and admin roles.
Run on production after deploy or when adding new menu sections.
2026-07-11 14:17:11 +05:00
F4ilji
4e2105190b
fix(tests): replace RefreshDatabase with DatabaseTransactions
...
- Prevents local DB data loss when running 'php artisan test'
- ViconApiConfigTest uses updateOrCreate to avoid unique constraint
- Delete + Cache::flush for 'not configured' test case
2026-07-10 17:11:27 +05:00
F4ilji
c59a08b3a0
test(vikon): add live API integration tests
...
- getNaprs, getPrograms, getProgramByUuid — real API calls
- EducationalProgramService cross-check
- invalid token rejection via Http::fake
2026-07-10 16:55:30 +05:00
F4ilji
0ea2b7d9ef
test(vikon): add ViconApiConfig unit tests
...
- token returns value from DB
- apiUrl returns value from DB
- apiUrl falls back to constant when not in payload
- token throws RuntimeException when not configured
- token throws when payload is empty
- inactive credential is ignored
2026-07-10 16:51:34 +05:00
F4ilji
73a0a6fe9c
feat(vikon): extract API URL from hardcoded to integration_credentials
...
- Rename ViconApiToken → ViconApiConfig with token() and apiUrl()
- Replace 9 hardcoded db-nica.ru URLs with dynamic apiUrl()
- Payload now stores both token and api_url with fallback
2026-07-10 16:47:18 +05:00
F4ilji
7748b05547
feat(vikon): move API token from .env to integration_credentials
...
- Rename VICON_TOKEN → VIKON_API_TOKEN in .env and config
- Add ViconApiToken service reading from integration_credentials table
- Update 3 Vicon services to use ViconApiToken instead of config()
- Config/env kept as fallback for clean migration
2026-07-10 16:43:09 +05:00
F4ilji
8db442a34a
Revert "fix(ssr): add Vue lifecycle guard plugin to suppress browser API errors in SSR hooks"
...
This reverts commit bb74bb48ba .
2026-07-07 11:22:32 +05:00
F4ilji
bb74bb48ba
fix(ssr): add Vue lifecycle guard plugin to suppress browser API errors in SSR hooks
2026-07-06 21:18:33 +05:00
F4ilji
6db62d9961
fix(ssr): suppress lifecycle hook errors (nextSibling null) at process level to prevent SSR crashes
2026-07-06 21:16:12 +05:00
F4ilji
63b71b87df
fix(ssr): always return {head,body} from createInertiaApp — .then() fallback for undefined resolve
2026-07-06 18:59:24 +05:00
F4ilji
f575325fa7
fix(ssr): remove window polyfill that broke Inertia SSR detection (typeof window check)
2026-07-06 18:53:06 +05:00
F4ilji
5fddb97cbf
fix(ssr): return empty string on SSR failure instead of throwing to prevent undefined response
2026-07-06 18:30:26 +05:00
F4ilji
778ea67cb4
fix(ssr): add addEventListener/removeEventListener to document and window polyfills
2026-07-06 18:22:22 +05:00
F4ilji
48ab0b384e
fix(ssr): add getElementById and other DOM methods to document polyfill
2026-07-06 18:05:35 +05:00
F4ilji
4c0152ae0f
fix(ssr): polyfill localStorage/sessionStorage, guard BasicListBadge filters prop, remove this. from template
2026-07-06 17:57:28 +05:00
F4ilji
eda69f4e37
fix(ssr): polyfill IntersectionObserver for Node.js SSR runtime
2026-07-06 17:53:46 +05:00
F4ilji
520533ef1f
fix(ssr): null-safe campaign access to prevent TypeError during SSR
2026-07-06 14:11:38 +05:00
F4ilji
3ee875a6db
fix(handler): fallback to HTML when Vite manifest missing during error rendering
2026-07-06 13:41:52 +05:00
F4ilji
9bac98d175
fix(logging): route EmailFetchException to email channel instead of app
2026-07-06 13:39:26 +05:00
F4ilji
65f4220932
fix(vikon): store version in file instead of cache to prevent revert after TTL expiry
2026-07-06 13:28:22 +05:00
F4ilji
9f4dfd9bfc
ci: optimize Jenkinsfile — parallel pre-deploy, npm ci, fix rollback composer path
2026-07-06 12:39:40 +05:00
F4ilji
9943f7ab90
fix error
2026-07-06 12:35:40 +05:00
F4ilji
b454c1ce97
fix(ssr): add null-check for breadcrumbs.page in Page.vue to prevent TypeError during SSR
2026-07-05 23:51:40 +05:00
F4ilji
769b2ff342
feat(logging): migrate remaining files to app channel — all Log:: calls now use domain channels
2026-07-05 23:32:01 +05:00
F4ilji
6bc1b3e921
feat(logging): migrate Education container to education channel
2026-07-05 23:30:30 +05:00
F4ilji
cd9b682994
feat(logging): migrate AI tasks to ai channel
2026-07-05 23:29:39 +05:00
F4ilji
49dd578e50
feat(logging): migrate email pipeline to email channel
2026-07-05 23:28:23 +05:00
F4ilji
41b00fcdae
feat(logging): migrate VK API jobs and services to vk channel
2026-07-05 23:26:41 +05:00
F4ilji
720aa4d0ae
feat(logging): migrate VikonIntegration to vikon channel
2026-07-05 23:13:51 +05:00
F4ilji
dfe8de0680
feat(logging): add 6 domain-specific daily channels to config
2026-07-05 23:11:27 +05:00
F4ilji
e3eda2adbc
fix(vikon): revert to api_domain for authorize URL, use vikon_core redirect_uri
2026-07-05 22:39:21 +05:00
F4ilji
fd7de347d4
fix: null-safe role check, enable SQLite test DB, improve TinyMCE paste handling
2026-07-05 22:34:04 +05:00
F4ilji
bec37c0e22
fix(vikon): use auth_domain for OAuth authorize URL instead of api_domain
2026-07-05 22:31:51 +05:00
F4ilji
a372f725cd
fix(ssr): embed Ziggy routes as fallback for SSR context
...
ZiggyVue needs routes in its config, but page.props.ziggy from the
server may not carry them in the SSR worker. Importing the static
Ziggy config ensures routes are always available.
2026-07-05 21:56:51 +05:00
F4ilji
09771bf8ad
fix(ssr): remove conflicting RouteMixin that caused 'Cannot read properties of undefined (reading index)'
...
RouteMixin received the full Inertia page object instead of page.props,
producing a Ziggy config without routes. ZiggyVue already provides the
route() function with the correct config, so the duplicate mixin is
unnecessary.
2026-07-05 21:47:03 +05:00
F4ilji
a80a60bdbe
feat(vikon): redesign UI with update all button, specialized icons, and manual ZIP upload
2026-07-05 18:00:49 +05:00
F4ilji
a32572f5e8
fix(vikon): remove env override for version, use hardcoded default
2026-07-05 17:44:45 +05:00
F4ilji
eb142b2513
refactor(vikon): use Redis cache for version instead of file
2026-07-05 15:11:17 +05:00
F4ilji
ad8a4d861b
fix(vikon): read version from file and update after core update
2026-07-05 15:06:14 +05:00
F4ilji
b0ff3bf397
feat(vikon): cleanup _old/_new artifacts after successful sync
2026-07-05 13:58:00 +05:00
F4ilji
416403b6ce
debug(vikon): add detailed logging for ZIP size and FM sync stats
2026-07-05 13:33:13 +05:00
F4ilji
b9ff255878
fix(vikon): use cURL streaming for ZIP downloads to avoid memory/timeout issues
2026-07-05 13:26:10 +05:00
F4ilji
a18765aafa
feat(vikon): merge update buttons into single flow with all parts selected by default
2026-07-05 13:10:49 +05:00
F4ilji
af86841ebc
feat(vikon): improve part update UI with per-part status indicators and Russian messages
2026-07-05 12:53:44 +05:00
F4ilji
08c04c5615
feat(vikon): show disabled modules with warning instead of hiding them
2026-07-05 12:34:44 +05:00
F4ilji
efce5be699
fix(vikon): use moduleData['id'] instead of array key, handle additional_access_flags
2026-07-05 12:25:15 +05:00
F4ilji
97c4ab99f1
debug(vikon): log raw API response structure for parts mapping
2026-07-05 12:19:14 +05:00
F4ilji
a162154f70
fix(vikon): cast API module IDs to int for Vue compatibility
2026-07-05 12:12:04 +05:00
F4ilji
0a5f99e6ae
refactor(vikon): remove hardcoded module IDs and use config everywhere
2026-07-05 11:40:02 +05:00
F4ilji
8cf195efb0
refactor(vikon): fetch parts from VIKON API instead of hardcoded config
2026-07-05 11:32:54 +05:00
F4ilji
9a9521c570
fix(vikon): initialize selectedParts arrays to prevent crash on checkbox click
2026-07-05 11:11:24 +05:00
F4ilji
af1fb094d2
fix(vikon): check HTTP status instead of JSON field for part generation check
2026-07-05 10:55:37 +05:00
F4ilji
3d9982e5be
fix(vikon): handle numeric status codes from VIKON API (1=completed, -1=failed)
2026-07-05 10:46:02 +05:00
F4ilji
2bf2f4a861
fix(vikon): send POST data as form-urlencoded to match VIKON API expectations
2026-07-05 10:31:40 +05:00
F4ilji
e83cd0109d
fix(vikon): correct VIKON API endpoint names for part updates
2026-07-05 10:21:27 +05:00
F4ilji
d83364432e
feat(vikon): replace part select with checkboxes for multi-selection
2026-07-05 09:55:45 +05:00
F4ilji
11b2def517
test(vikon): add validateFileTypes mock to UpdatePartActionTest
2026-07-05 03:02:03 +05:00
F4ilji
e8e36156e9
fix(vikon): add file type validation and temp cleanup in UpdatePartAction
2026-07-05 03:01:12 +05:00
F4ilji
059705d60d
test(vikon): add feature tests for part update endpoint
2026-07-05 02:58:32 +05:00
F4ilji
1d423adc12
feat(vikon): add part selection UI to Vue dashboard
2026-07-05 02:52:50 +05:00
F4ilji
b259809960
feat(vikon): add updatePart endpoint with request validation
2026-07-05 02:50:41 +05:00
F4ilji
15f72b4de1
feat(vikon): add restoreAfterFail for crash recovery in FilesystemTask
2026-07-05 02:47:40 +05:00
F4ilji
da90011ad3
feat(vikon): add UpdatePartAction for partial module updates
2026-07-05 02:45:47 +05:00
F4ilji
514123a19f
feat(vikon): add parts config for partial updates
2026-07-05 02:42:51 +05:00
F4ilji
4764d4e2d9
feat(vikon): add PollPartStatusTask for part update polling
2026-07-05 02:41:23 +05:00
F4ilji
a624b83f18
feat(vikon): add atomicSwap to FilesystemTask for crash-safe updates
2026-07-05 02:35:25 +05:00
F4ilji
982e80027d
docs: add partial updates implementation plan
2026-07-05 02:31:27 +05:00
F4ilji
5c081261b0
docs: add partial updates design spec for VikonIntegration module
2026-07-05 02:29:18 +05:00
F4ilji
cc69c3566b
docs: add dashboard error page final report and plan
2026-07-05 01:21:39 +05:00
F4ilji
df6110adf8
feat(dashboard): modify exception handlers to render DashboardError for dashboard routes
2026-07-05 01:19:04 +05:00
F4ilji
a4fef0bb3d
feat(dashboard): add DashboardError.vue with full error context display
2026-07-05 01:18:04 +05:00
F4ilji
e3511462f7
fix(vikon): skip existing files during FM sync, match original PHP diff behavior
...
Original vikon_core sync_root_dir.php only downloads files that are
missing locally or have size 0. Added local file size check before
downloading to avoid re-fetching 14GB+ of existing files.
2026-07-04 23:25:59 +05:00
F4ilji
b538b4119f
fix(vikon): all FM files go to files/ dir, matching original PHP getFsPathByModule
...
Original vikon_core Path::getFsPathByModule() returns moduleRoot/files/,
not moduleRoot. Root FM files, 3-letter subdirs, and new files all go
under files/ directory. index.html etc come from core ZIP, not FM sync.
2026-07-04 23:02:43 +05:00
F4ilji
cccdbbbbd8
fix(vikon): keep ZIP and extracted files in temp after update
2026-07-04 22:41:39 +05:00
F4ilji
a33d93e163
fix(vikon): root files to module root, 3-letter dirs to files/{code}/
...
- UpdateCoreAction: split syncDirFiles into syncRootDir (→module root)
and syncSubDir (→files/{dirId})
- SyncFilesAction: same split, matching original PHP vikon_core behavior
- index.html, file_stubs/ etc go to module root
- 3-letter FM codes (eib, eid, rir) go inside files/
2026-07-04 22:40:30 +05:00
F4ilji
a7d0628a13
fix(vikon): use module root as FM sync base path instead of files/ subdir
...
Root files (index.html, file_stubs/) and non-3-letter directories now go
to module root where VIKON expects them, not into files/ subdirectory.
dir_name from FM API is relative to module root.
2026-07-04 22:31:10 +05:00
F4ilji
bf3bcc4eca
fix(vikon): revert syncDirFiles - keep 3-letter dirIds as subdirectories
2026-07-04 22:18:20 +05:00
F4ilji
c4314e2f43
fix(vikon): use getFileByIdentityInfo dir_name for correct file paths
2026-07-04 22:15:59 +05:00
F4ilji
d7c9de2bd6
fix(vikon): restore syncDirFiles subdirs - files go to files/{dirId}/
2026-07-04 21:55:29 +05:00
F4ilji
241ac576fe
fix(vikon): revert syncDirFiles - save files directly in files/ without subdirs
2026-07-04 21:52:21 +05:00
F4ilji
997ef6d483
fix(vikon): syncDirFiles saves to correct subdirectory, increase timeouts to 600s
2026-07-04 21:49:17 +05:00
F4ilji
b115cb93fd
fix(vikon): increase nginx fastcgi_read_timeout to 600s, PHP set_time_limit 600
2026-07-04 21:40:51 +05:00