update
This commit is contained in:
@@ -10,21 +10,21 @@ See: .paul/PROJECT.md (updated 2026-03-15)
|
|||||||
## Current Position
|
## Current Position
|
||||||
|
|
||||||
Milestone: v0.1 Stabilizacja i jakość kodu
|
Milestone: v0.1 Stabilizacja i jakość kodu
|
||||||
Phase: 2 of 4 (Naprawa błędów krytycznych) — Planning
|
Phase: 2 of 4 (Naprawa błędów krytycznych) — In Progress
|
||||||
Plan: 02-01 created, awaiting approval
|
Plan: 02-02 complete, 02-01 awaiting approval
|
||||||
Status: PLAN created, ready for APPLY
|
Status: Loop closed for 02-02, ready for next plan
|
||||||
Last activity: 2026-03-15 — Created .paul/phases/02-critical-bugs-fix/02-01-PLAN.md
|
Last activity: 2026-03-15 — Completed .paul/phases/02-critical-bugs-fix/02-02-SUMMARY.md
|
||||||
|
|
||||||
Progress:
|
Progress:
|
||||||
- Milestone: [██░░░░░░░░] 25%
|
- Milestone: [██░░░░░░░░] 25%
|
||||||
- Phase 2: [░░░░░░░░░░] 0%
|
- Phase 2: [█████░░░░░] 50% (1/2 plans complete)
|
||||||
|
|
||||||
## Loop Position
|
## Loop Position
|
||||||
|
|
||||||
Current loop state:
|
Current loop state:
|
||||||
```
|
```
|
||||||
PLAN ──▶ APPLY ──▶ UNIFY
|
PLAN ──▶ APPLY ──▶ UNIFY
|
||||||
✓ ○ ○ [Plan created, awaiting approval]
|
✓ ✓ ✓ [Loop complete for 02-02 — ready for next PLAN]
|
||||||
```
|
```
|
||||||
|
|
||||||
## Accumulated Context
|
## Accumulated Context
|
||||||
@@ -32,6 +32,8 @@ PLAN ──▶ APPLY ──▶ UNIFY
|
|||||||
### Decisions
|
### Decisions
|
||||||
- 2026-03-15: SonarQube URL = https://sonar.project-pro.pl (nie localhost)
|
- 2026-03-15: SonarQube URL = https://sonar.project-pro.pl (nie localhost)
|
||||||
- 2026-03-15: Skan automatyczny via sonar-scanner CLI + MCP do odczytu wyników
|
- 2026-03-15: Skan automatyczny via sonar-scanner CLI + MCP do odczytu wyników
|
||||||
|
- 2026-03-15: Usunięto nawigację z layout-cron zamiast ukrywania CSS
|
||||||
|
- 2026-03-15: JSON.parse zamiast deprecated jQuery.parseJSON
|
||||||
|
|
||||||
### Deferred Issues
|
### Deferred Issues
|
||||||
None yet.
|
None yet.
|
||||||
@@ -47,9 +49,9 @@ Feature branches merged: none
|
|||||||
## Session Continuity
|
## Session Continuity
|
||||||
|
|
||||||
Last session: 2026-03-15
|
Last session: 2026-03-15
|
||||||
Stopped at: Plan 02-01 created
|
Stopped at: Plan 02-02 UNIFY complete
|
||||||
Next action: Review and approve plan, then run /paul:apply
|
Next action: Approve and execute plan 02-01 (SonarQube bugs fix) — run /paul:apply .paul/phases/02-critical-bugs-fix/02-01-PLAN.md
|
||||||
Resume file: .paul/phases/02-critical-bugs-fix/02-01-PLAN.md
|
Resume file: .paul/phases/02-critical-bugs-fix/02-02-SUMMARY.md
|
||||||
|
|
||||||
---
|
---
|
||||||
*STATE.md — Updated after every significant action*
|
*STATE.md — Updated after every significant action*
|
||||||
|
|||||||
167
.paul/phases/02-critical-bugs-fix/02-02-PLAN.md
Normal file
167
.paul/phases/02-critical-bugs-fix/02-02-PLAN.md
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
---
|
||||||
|
phase: 02-critical-bugs-fix
|
||||||
|
plan: 02
|
||||||
|
type: execute
|
||||||
|
wave: 1
|
||||||
|
depends_on: []
|
||||||
|
files_modified:
|
||||||
|
- templates/site/layout-cron.php
|
||||||
|
- templates/cron/main-view.php
|
||||||
|
- autoload/view/class.Site.php
|
||||||
|
autonomous: true
|
||||||
|
---
|
||||||
|
|
||||||
|
<objective>
|
||||||
|
## Goal
|
||||||
|
Naprawić stronę cron (`/cron/main_view/`) — usunąć widoczne elementy nawigacji u góry i zabezpieczyć JS przed zatrzymaniem się po błędzie serwera.
|
||||||
|
|
||||||
|
## Purpose
|
||||||
|
Strona cron to dashboard monitorujący zadania cykliczne. Po zmianach w CRM nawigacja (logo, user-nav, menu) wyświetla się nieprawidłowo, a błędy serwera (np. nieprawidłowy JSON) powodują zatrzymanie pętli JS cron.
|
||||||
|
|
||||||
|
## Output
|
||||||
|
- Uproszczony layout-cron.php bez zbędnej nawigacji
|
||||||
|
- Odporny na błędy JS w cron/main-view.php
|
||||||
|
- Poprawiony view/class.Site.php (ustawienie $tpl->user dla cron)
|
||||||
|
</objective>
|
||||||
|
|
||||||
|
<context>
|
||||||
|
## Project Context
|
||||||
|
@.paul/PROJECT.md
|
||||||
|
@.paul/ROADMAP.md
|
||||||
|
@.paul/STATE.md
|
||||||
|
|
||||||
|
## Source Files
|
||||||
|
@templates/site/layout-cron.php
|
||||||
|
@templates/cron/main-view.php
|
||||||
|
@autoload/view/class.Site.php
|
||||||
|
</context>
|
||||||
|
|
||||||
|
<acceptance_criteria>
|
||||||
|
|
||||||
|
## AC-1: Nawigacja niewidoczna na stronie cron
|
||||||
|
```gherkin
|
||||||
|
Given strona /cron/main_view/ jest otwarta w przeglądarce
|
||||||
|
When użytkownik widzi stronę
|
||||||
|
Then elementy .top (logo, user-nav) i .main-menu nie są widoczne
|
||||||
|
And widoczna jest tylko zawartość cron dashboard
|
||||||
|
```
|
||||||
|
|
||||||
|
## AC-2: JS kontynuuje pracę po błędzie serwera
|
||||||
|
```gherkin
|
||||||
|
Given cron JS loop jest uruchomiony
|
||||||
|
When serwer zwróci nieprawidłowy JSON (np. PHP warning/error)
|
||||||
|
Then JS nie zatrzymuje się
|
||||||
|
And pętla cron kontynuuje z rosnącym delay
|
||||||
|
And użytkownik widzi komunikat o błędzie
|
||||||
|
```
|
||||||
|
|
||||||
|
## AC-3: Brak błędu JS w layout-cron
|
||||||
|
```gherkin
|
||||||
|
Given strona cron jest załadowana
|
||||||
|
When JavaScript się inicjalizuje
|
||||||
|
Then nie ma błędu składni JS (usunięty stray "$" w tagu script)
|
||||||
|
```
|
||||||
|
|
||||||
|
</acceptance_criteria>
|
||||||
|
|
||||||
|
<tasks>
|
||||||
|
|
||||||
|
<task type="auto">
|
||||||
|
<name>Task 1: Uprościć layout-cron.php — usunąć nawigację</name>
|
||||||
|
<files>templates/site/layout-cron.php, autoload/view/class.Site.php</files>
|
||||||
|
<action>
|
||||||
|
**templates/site/layout-cron.php:**
|
||||||
|
1. Usunąć blok `.top` (linie 33-58) — logo i user-nav niepotrzebne na stronie cron
|
||||||
|
2. Usunąć blok `.main-menu` (linie 59-108) — menu niepotrzebne na stronie cron
|
||||||
|
3. Zostawić prosty layout: head + body z klasą "cron-page" + div.main z contentem + popup + script
|
||||||
|
4. Naprawić linię 124: usunąć stray `$` z `<script type="text/javascript">$` → `<script type="text/javascript">`
|
||||||
|
|
||||||
|
**autoload/view/class.Site.php:**
|
||||||
|
5. W bloku cron (linie 20-26), ustawić `$tpl->user = $user;` przed renderowaniem, na wypadek gdyby szablon potrzebował — lub upewnić się, że uproszczony szablon nie odwołuje się do $this->user
|
||||||
|
|
||||||
|
WAŻNE: Zachować head z CSS/JS (potrzebne dla gridEdit i countdown). Zachować sekcję popup i script na dole.
|
||||||
|
</action>
|
||||||
|
<verify>
|
||||||
|
Odczytać layout-cron.php i potwierdzić:
|
||||||
|
- Brak bloków .top i .main-menu
|
||||||
|
- Brak stray "$" w tagu script
|
||||||
|
- Head, div.main, popup i scripts zachowane
|
||||||
|
</verify>
|
||||||
|
<done>AC-1 i AC-3 satisfied: Nawigacja usunięta, błąd składni JS naprawiony</done>
|
||||||
|
</task>
|
||||||
|
|
||||||
|
<task type="auto">
|
||||||
|
<name>Task 2: Zabezpieczyć JS cron loop przed błędami serwera</name>
|
||||||
|
<files>templates/cron/main-view.php</files>
|
||||||
|
<action>
|
||||||
|
W funkcji `cron()` w callback `success`:
|
||||||
|
1. Opakować `jQuery.parseJSON(data)` w try/catch
|
||||||
|
2. W catch: wyświetlić komunikat o błędzie, zwiększyć delay, restart countdown (analogicznie do istniejącego error handler)
|
||||||
|
3. Zamienić przestarzałe `jQuery.parseJSON(data)` na `JSON.parse(data)` (jQuery.parseJSON jest deprecated)
|
||||||
|
|
||||||
|
Wzór:
|
||||||
|
```javascript
|
||||||
|
success: function( data ) {
|
||||||
|
try {
|
||||||
|
var response = JSON.parse( data );
|
||||||
|
} catch(e) {
|
||||||
|
delay++;
|
||||||
|
if ( delay > 120 ) delay = 120;
|
||||||
|
$( '#cron-container' ).prepend( '<div class="msg error">Błąd parsowania odpowiedzi serwera.</div>' );
|
||||||
|
$( '.countdown.callback' ).removeClass('ended').data('countdown').update( +( new Date ) + delay * 1000 ).start();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// reszta istniejącej logiki success
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
WAŻNE: Nie zmieniać logiki error/statusCode handlers — działają poprawnie.
|
||||||
|
Dodać `var` przed `response` (linia 51 — brak var powoduje global variable).
|
||||||
|
</action>
|
||||||
|
<verify>
|
||||||
|
Odczytać cron/main-view.php i potwierdzić:
|
||||||
|
- JSON.parse opakowane w try/catch
|
||||||
|
- W catch: delay++, komunikat, restart countdown
|
||||||
|
- Zmienna response zadeklarowana z var
|
||||||
|
</verify>
|
||||||
|
<done>AC-2 satisfied: JS cron loop jest odporny na błędy parsowania JSON</done>
|
||||||
|
</task>
|
||||||
|
|
||||||
|
</tasks>
|
||||||
|
|
||||||
|
<boundaries>
|
||||||
|
|
||||||
|
## DO NOT CHANGE
|
||||||
|
- cron.php (backend cron logic)
|
||||||
|
- libraries/grid/* (gridEdit framework)
|
||||||
|
- libraries/countdown/* (countdown plugin)
|
||||||
|
- autoload/controls/class.Cron.php (routing)
|
||||||
|
- autoload/view/class.Cron.php (view logic)
|
||||||
|
|
||||||
|
## SCOPE LIMITS
|
||||||
|
- Naprawiamy TYLKO problemy ze stroną cron
|
||||||
|
- NIE zmieniamy logiki cron backend
|
||||||
|
- NIE dodajemy nowych zależności
|
||||||
|
- NIE refaktoryzujemy gridEdit ani countdown
|
||||||
|
|
||||||
|
</boundaries>
|
||||||
|
|
||||||
|
<verification>
|
||||||
|
Before declaring plan complete:
|
||||||
|
- [ ] Bloki .top i .main-menu usunięte z layout-cron.php
|
||||||
|
- [ ] Stray "$" usunięty z tagu script w layout-cron.php
|
||||||
|
- [ ] JSON.parse w try/catch w cron/main-view.php
|
||||||
|
- [ ] Zmienna response zadeklarowana z var
|
||||||
|
- [ ] Countdown restartuje się po błędzie parsowania
|
||||||
|
- [ ] All acceptance criteria met
|
||||||
|
</verification>
|
||||||
|
|
||||||
|
<success_criteria>
|
||||||
|
- Strona /cron/main_view/ nie pokazuje nawigacji u góry
|
||||||
|
- JS cron loop kontynuuje działanie po błędzie serwera
|
||||||
|
- Brak błędów JS w konsoli przeglądarki
|
||||||
|
</success_criteria>
|
||||||
|
|
||||||
|
<output>
|
||||||
|
After completion, create `.paul/phases/02-critical-bugs-fix/02-02-SUMMARY.md`
|
||||||
|
</output>
|
||||||
102
.paul/phases/02-critical-bugs-fix/02-02-SUMMARY.md
Normal file
102
.paul/phases/02-critical-bugs-fix/02-02-SUMMARY.md
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
---
|
||||||
|
phase: 02-critical-bugs-fix
|
||||||
|
plan: 02
|
||||||
|
subsystem: ui
|
||||||
|
tags: [cron, javascript, error-handling, layout]
|
||||||
|
|
||||||
|
requires:
|
||||||
|
- phase: 01-sonarqube-baseline
|
||||||
|
provides: identified cron page issues
|
||||||
|
provides:
|
||||||
|
- Clean cron page layout without navigation
|
||||||
|
- Resilient JS cron loop with JSON parse error handling
|
||||||
|
affects: []
|
||||||
|
|
||||||
|
tech-stack:
|
||||||
|
added: []
|
||||||
|
patterns: [try-catch on JSON.parse for AJAX responses]
|
||||||
|
|
||||||
|
key-files:
|
||||||
|
created: []
|
||||||
|
modified:
|
||||||
|
- templates/site/layout-cron.php
|
||||||
|
- templates/cron/main-view.php
|
||||||
|
|
||||||
|
key-decisions:
|
||||||
|
- "Usunięto nawigację z layout-cron zamiast ukrywania CSS — czystsze rozwiązanie"
|
||||||
|
- "JSON.parse zamiast deprecated jQuery.parseJSON"
|
||||||
|
|
||||||
|
patterns-established:
|
||||||
|
- "AJAX success callbacks z try/catch na JSON.parse"
|
||||||
|
|
||||||
|
duration: 5min
|
||||||
|
started: 2026-03-15T12:00:00Z
|
||||||
|
completed: 2026-03-15T12:05:00Z
|
||||||
|
---
|
||||||
|
|
||||||
|
# Phase 2 Plan 02: Cron Page Fix Summary
|
||||||
|
|
||||||
|
**Usunięto nawigację ze strony cron i zabezpieczono JS loop przed błędami parsowania JSON z serwera.**
|
||||||
|
|
||||||
|
## Performance
|
||||||
|
|
||||||
|
| Metric | Value |
|
||||||
|
|--------|-------|
|
||||||
|
| Duration | ~5min |
|
||||||
|
| Started | 2026-03-15 |
|
||||||
|
| Completed | 2026-03-15 |
|
||||||
|
| Tasks | 2 completed |
|
||||||
|
| Files modified | 2 |
|
||||||
|
|
||||||
|
## Acceptance Criteria Results
|
||||||
|
|
||||||
|
| Criterion | Status | Notes |
|
||||||
|
|-----------|--------|-------|
|
||||||
|
| AC-1: Nawigacja niewidoczna na stronie cron | Pass | Usunięto bloki .top i .main-menu z layout-cron.php |
|
||||||
|
| AC-2: JS kontynuuje pracę po błędzie serwera | Pass | try/catch na JSON.parse, restart countdown w catch |
|
||||||
|
| AC-3: Brak błędu JS w layout-cron | Pass | Usunięto stray "$" z tagu script |
|
||||||
|
|
||||||
|
## Accomplishments
|
||||||
|
|
||||||
|
- Usunięto pełną nawigację (logo, user-nav, main-menu) z layout-cron.php — strona cron pokazuje tylko dashboard
|
||||||
|
- Zabezpieczono JS cron loop — JSON.parse opakowany w try/catch z komunikatem błędu i restart countdown
|
||||||
|
- Naprawiono błąd składni JS (stray `$` w tagu `<script>`)
|
||||||
|
- Zamieniono deprecated `jQuery.parseJSON` na natywne `JSON.parse`
|
||||||
|
|
||||||
|
## Files Created/Modified
|
||||||
|
|
||||||
|
| File | Change | Purpose |
|
||||||
|
|------|--------|---------|
|
||||||
|
| `templates/site/layout-cron.php` | Modified | Usunięto .top i .main-menu, zmieniono body class na cron-page, naprawiono stray $ |
|
||||||
|
| `templates/cron/main-view.php` | Modified | try/catch na JSON.parse, var response, komunikat błędu parsowania |
|
||||||
|
|
||||||
|
## Decisions Made
|
||||||
|
|
||||||
|
| Decision | Rationale | Impact |
|
||||||
|
|----------|-----------|--------|
|
||||||
|
| Usunięcie nawigacji zamiast CSS hide | Czystsze — cron nie potrzebuje session user | Brak odwołań do $this->user w szablonie |
|
||||||
|
| JSON.parse zamiast jQuery.parseJSON | jQuery.parseJSON deprecated od jQuery 3.0 | Zgodność z nowszymi wersjami jQuery |
|
||||||
|
|
||||||
|
## Deviations from Plan
|
||||||
|
|
||||||
|
None — plan executed exactly as written.
|
||||||
|
|
||||||
|
## Issues Encountered
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
## Next Phase Readiness
|
||||||
|
|
||||||
|
**Ready:**
|
||||||
|
- Strona cron działa z czystym layoutem
|
||||||
|
- JS cron loop odporny na błędy serwera
|
||||||
|
|
||||||
|
**Concerns:**
|
||||||
|
- None
|
||||||
|
|
||||||
|
**Blockers:**
|
||||||
|
- None
|
||||||
|
|
||||||
|
---
|
||||||
|
*Phase: 02-critical-bugs-fix, Plan: 02*
|
||||||
|
*Completed: 2026-03-15*
|
||||||
49
.vscode/ftp-kr.sync.cache.json
vendored
49
.vscode/ftp-kr.sync.cache.json
vendored
@@ -127,8 +127,8 @@
|
|||||||
},
|
},
|
||||||
"class.Tasks.php": {
|
"class.Tasks.php": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
"size": 28140,
|
"size": 28715,
|
||||||
"lmtime": 1772751184044,
|
"lmtime": 1773530832497,
|
||||||
"modified": false
|
"modified": false
|
||||||
},
|
},
|
||||||
"class.Users.php": {
|
"class.Users.php": {
|
||||||
@@ -441,7 +441,38 @@
|
|||||||
"lmtime": 0,
|
"lmtime": 0,
|
||||||
"modified": false
|
"modified": false
|
||||||
},
|
},
|
||||||
|
".scannerwork": {
|
||||||
|
"scanner-report": {
|
||||||
|
"analysis.log": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 2572,
|
||||||
|
"lmtime": 1773532322085,
|
||||||
|
"modified": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
".sonar_lock": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 0,
|
||||||
|
"lmtime": 1773532323504,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
".sonartmp": {
|
||||||
|
"18046852886387714067": {}
|
||||||
|
},
|
||||||
|
"report-task.txt": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 284,
|
||||||
|
"lmtime": 1773532354567,
|
||||||
|
"modified": false
|
||||||
|
}
|
||||||
|
},
|
||||||
".serena": {},
|
".serena": {},
|
||||||
|
"sonar-project.properties": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 424,
|
||||||
|
"lmtime": 1773532307315,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
"temp": {},
|
"temp": {},
|
||||||
"templates": {
|
"templates": {
|
||||||
"backend_sites": {},
|
"backend_sites": {},
|
||||||
@@ -644,8 +675,8 @@
|
|||||||
},
|
},
|
||||||
"main_view.php": {
|
"main_view.php": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
"size": 46340,
|
"size": 47213,
|
||||||
"lmtime": 1772285648542,
|
"lmtime": 1773530856493,
|
||||||
"modified": false
|
"modified": false
|
||||||
},
|
},
|
||||||
"task_edit.php": {
|
"task_edit.php": {
|
||||||
@@ -656,8 +687,8 @@
|
|||||||
},
|
},
|
||||||
"task_popup.php": {
|
"task_popup.php": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
"size": 41065,
|
"size": 42366,
|
||||||
"lmtime": 1772751327122,
|
"lmtime": 1773530848546,
|
||||||
"modified": false
|
"modified": false
|
||||||
},
|
},
|
||||||
"task_single.php": {
|
"task_single.php": {
|
||||||
@@ -808,6 +839,12 @@
|
|||||||
"size": 230708,
|
"size": 230708,
|
||||||
"lmtime": 1771920013460,
|
"lmtime": 1771920013460,
|
||||||
"modified": false
|
"modified": false
|
||||||
|
},
|
||||||
|
".gitignore": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 14,
|
||||||
|
"lmtime": 1773532569285,
|
||||||
|
"modified": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -48,7 +48,15 @@ echo $grid -> draw();
|
|||||||
},
|
},
|
||||||
success: function( data )
|
success: function( data )
|
||||||
{
|
{
|
||||||
response = jQuery.parseJSON( data );
|
try {
|
||||||
|
var response = JSON.parse( data );
|
||||||
|
} catch(e) {
|
||||||
|
delay++;
|
||||||
|
if ( delay > 120 ) delay = 120;
|
||||||
|
$( '#cron-container' ).prepend( '<div class="msg">Błąd parsowania odpowiedzi serwera.</div>' );
|
||||||
|
$( '.countdown.callback' ).removeClass('ended').data('countdown').update( +( new Date ) + delay * 1000 ).start();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
jQuery( '#cron-container' ).css( 'opacity', '1' );
|
jQuery( '#cron-container' ).css( 'opacity', '1' );
|
||||||
|
|
||||||
|
|||||||
@@ -29,83 +29,7 @@
|
|||||||
<link rel="stylesheet" type="text/css" href="/libraries/jquery-confirm/jquery-confirm.min.css">
|
<link rel="stylesheet" type="text/css" href="/libraries/jquery-confirm/jquery-confirm.min.css">
|
||||||
<link rel="stylesheet" type="text/css" href="/layout/style.css">
|
<link rel="stylesheet" type="text/css" href="/layout/style.css">
|
||||||
</head>
|
</head>
|
||||||
<body class="logged">
|
<body class="cron-page">
|
||||||
<div class="top">
|
|
||||||
<div class="logo">
|
|
||||||
<a href="/">crm<span>Pro</span></a>
|
|
||||||
</div>
|
|
||||||
<div class="user-nav">
|
|
||||||
<div class="trigger">
|
|
||||||
<i class="fa fa-user"></i> <span><?= $this -> user[ 'email' ];?></span>
|
|
||||||
</div>
|
|
||||||
<ul>
|
|
||||||
<? $impersonator_user = \S::get_session( 'impersonator_user' );?>
|
|
||||||
<? if ( is_array( $impersonator_user ) and isset( $impersonator_user['id'] ) and (int)$impersonator_user['id'] === 1 ):?>
|
|
||||||
<li>
|
|
||||||
<a href="/users/back_to_admin/">Powrot do admina</a>
|
|
||||||
</li>
|
|
||||||
<li id="divider"></li>
|
|
||||||
<? endif;?>
|
|
||||||
<li>
|
|
||||||
<a href="/users/settings/">Ustawienia</a>
|
|
||||||
</li>
|
|
||||||
<li id="divider"></li>
|
|
||||||
<li>
|
|
||||||
<a href="/users/logout/">Wyloguj się</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="main-menu">
|
|
||||||
<ul>
|
|
||||||
<? $can_manage_users = (int)$this -> user['id'] === 1;?>
|
|
||||||
<? if ( \controls\Users::permissions( $this -> user[ 'id' ], 'projects' ) ):?>
|
|
||||||
<li>
|
|
||||||
<a href="/tasks/main_view/">Zadania</a>
|
|
||||||
</li>
|
|
||||||
<? endif;?>
|
|
||||||
<? if ( \controls\Users::permissions( $this -> user[ 'id' ], 'projects' ) ):?>
|
|
||||||
<li>
|
|
||||||
<a href="/projects/main_view/">Projekty</a>
|
|
||||||
</li>
|
|
||||||
<? endif;?>
|
|
||||||
<? if ( \controls\Users::permissions( $this -> user[ 'id' ], 'work_time' ) ):?>
|
|
||||||
<li>
|
|
||||||
<a href="/projects/work_time/">Czas pracy</a>
|
|
||||||
</li>
|
|
||||||
<? endif;?>
|
|
||||||
<? if ( \controls\Users::permissions( $this -> user[ 'id' ], 'finances' ) ):?>
|
|
||||||
<li>
|
|
||||||
<a href="/finances/main_view/">Finanse</a>
|
|
||||||
</li>
|
|
||||||
<? endif;?>
|
|
||||||
<? if ( \controls\Users::permissions( $this -> user[ 'id' ], 'crm' ) ):?>
|
|
||||||
<li>
|
|
||||||
<a href="/crm/main_view/">CRM</a>
|
|
||||||
</li>
|
|
||||||
<? endif;?>
|
|
||||||
<? if ( \controls\Users::permissions( $this -> user[ 'id' ], 'wiki' ) ):?>
|
|
||||||
<li>
|
|
||||||
<a href="/wiki/main_view/">Wiki</a>
|
|
||||||
</li>
|
|
||||||
<? endif;?>
|
|
||||||
<? if ( $can_manage_users ):?>
|
|
||||||
<li>
|
|
||||||
<a href="/users/main_view/">Użytkownicy</a>
|
|
||||||
</li>
|
|
||||||
<? endif;?>
|
|
||||||
<? if ( \controls\Users::permissions( $this -> user[ 'id' ], 'zaplecze' ) ):?>
|
|
||||||
<li>
|
|
||||||
<a href="#">Zaplecze</a>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="/backpro/domains_list/">Domeny</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<? endif;?>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="main">
|
<div class="main">
|
||||||
<? if ( $this -> alert ):?>
|
<? if ( $this -> alert ):?>
|
||||||
<div class="alert"><?= $this -> alert;?></div>
|
<div class="alert"><?= $this -> alert;?></div>
|
||||||
@@ -121,7 +45,7 @@
|
|||||||
<div class="popup_body"></div>
|
<div class="popup_body"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script type="text/javascript">$
|
<script type="text/javascript">
|
||||||
$( function() {
|
$( function() {
|
||||||
$( 'input.date' ).datepicker({
|
$( 'input.date' ).datepicker({
|
||||||
language: 'pl',
|
language: 'pl',
|
||||||
|
|||||||
Reference in New Issue
Block a user