4 Commits

Author SHA1 Message Date
quiet-professional dc0ae8eb96 updated module name
Build and Release Core / Test and Build (push) Successful in 5m26s
2026-04-29 11:04:14 -04:00
quiet-professional b07a114227 updated paths
Build and Release Core / Test and Build (push) Successful in 4m2s
2026-04-29 10:36:05 -04:00
quiet-professional 88f77edadd added license call out
Build and Release Core / Test and Build (push) Successful in 4m23s
2026-04-28 13:52:01 -04:00
quiet-professional decad4cc82 patched folder bug for users
Build and Release Core / Test and Build (push) Successful in 4m28s
2026-04-02 15:27:33 -04:00
42 changed files with 135 additions and 115 deletions
+6 -2
View File
@@ -13,7 +13,7 @@ Just drop the binary on a server and start triaging.
### Option A: Download the Binary
1. Go to the [Releases](https://epigas.gitea.cloud/RiskRancher/core/releases) tab and download the compiled executable for your OS (Windows/macOS/Linux).
1. Go to the [Releases](https://code.riskrancher.com/RiskRancher/core/releases) tab and download the compiled executable for your OS (Windows/macOS/Linux).
2. Place the binary in a dedicated directory and execute it.
3. Visit `http://localhost:8080` in your browser.
@@ -22,8 +22,12 @@ Just drop the binary on a server and start triaging.
Ensure you have **Go 1.26+** installed (*CGO is required for the native `mattn/go-sqlite3` driver*).
```bash
git clone https://epigas.gitea.cloud/RiskRancher/core
git clone https://code.riskrancher.com/RiskRancher/core
cd core
go build -o rr ./cmd/rr/main.go
./rr
```
## License
Apache License 2.0
+3 -3
View File
@@ -4,9 +4,9 @@ import (
"log"
"net/http"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"epigas.gitea.cloud/RiskRancher/core/pkg/server"
"epigas.gitea.cloud/RiskRancher/core/ui"
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
"code.riskrancher.com/RiskRancher/core/pkg/server"
"code.riskrancher.com/RiskRancher/core/ui"
)
var (
+2 -2
View File
@@ -10,8 +10,8 @@ import (
"net/http"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/auth"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"code.riskrancher.com/RiskRancher/core/pkg/auth"
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
)
func main() {
+1 -1
View File
@@ -1,4 +1,4 @@
module epigas.gitea.cloud/RiskRancher/core
module code.riskrancher.com/RiskRancher/core
go 1.26.0
+1 -1
View File
@@ -9,7 +9,7 @@ import (
"strconv"
"strings"
domain2 "epigas.gitea.cloud/RiskRancher/core/pkg/domain"
domain2 "code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func (h *Handler) HandleGetAdapters(w http.ResponseWriter, r *http.Request) {
+2 -2
View File
@@ -9,8 +9,8 @@ import (
"testing"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func setupTestAdapters(t *testing.T) (*Handler, *sql.DB) {
+1 -1
View File
@@ -1,7 +1,7 @@
package adapters
import (
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
type Handler struct {
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"strconv"
"strings"
"epigas.gitea.cloud/RiskRancher/core/pkg/auth"
"code.riskrancher.com/RiskRancher/core/pkg/auth"
)
// PasswordResetRequest is the expected JSON payload
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"net/http/httptest"
"testing"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func TestGetGlobalConfig(t *testing.T) {
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"net/http/httptest"
"testing"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func TestExportSystemState(t *testing.T) {
+1 -1
View File
@@ -1,7 +1,7 @@
package admin
import (
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
// Handler encapsulates all Admin and Sheriff HTTP logic
+2 -2
View File
@@ -7,8 +7,8 @@ import (
"testing"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
// setupTestAdmin returns the clean Admin Handler and the raw DB
+2 -2
View File
@@ -9,8 +9,8 @@ import (
"testing"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func setupTestAnalytics(t *testing.T) (*Handler, *sql.DB) {
+1 -1
View File
@@ -1,7 +1,7 @@
package analytics
import (
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
type Handler struct {
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"encoding/base64"
"math/rand"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
"golang.org/x/crypto/bcrypt"
)
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"net/http/httptest"
"testing"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
)
func setupTestAuth(t *testing.T) (*Handler, *sql.DB) {
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"errors"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
// ErrNotFound is a standard error we can use across our handlers
+10 -3
View File
@@ -6,9 +6,11 @@ import (
_ "embed"
"encoding/json"
"log"
"os"
"path/filepath"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
_ "modernc.org/sqlite"
)
@@ -18,9 +20,14 @@ var schemaSQL string
//go:embed defaults/*.json
var defaultAdaptersFS embed.FS
func InitDB(filepath string) *sql.DB {
func InitDB(dbPath string) *sql.DB {
dsn := "file:" + filepath + "?_pragma=journal_mode(WAL)&_pragma=busy_timeout(5000)&_pragma=synchronous(NORMAL)&_pragma=foreign_keys(1)"
dir := filepath.Dir(dbPath)
if err := os.MkdirAll(dir, 0755); err != nil {
log.Fatalf("Failed to create database directory: %v", err)
}
dsn := "file:" + dbPath + "?_pragma=journal_mode(WAL)&_pragma=busy_timeout(5000)&_pragma=synchronous(NORMAL)&_pragma=foreign_keys(1)"
db, err := sql.Open("sqlite", dsn)
if err != nil {
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"database/sql"
"testing"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
_ "modernc.org/sqlite" // We need the SQLite driver for the test
)
+1 -1
View File
@@ -3,7 +3,7 @@ package datastore
import (
"database/sql"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
type SQLiteStore struct {
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"context"
"time"
domain2 "epigas.gitea.cloud/RiskRancher/core/pkg/domain"
domain2 "code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func (s *SQLiteStore) UpdateAppConfig(ctx context.Context, config domain2.AppConfig) error {
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"fmt"
"time"
domain2 "epigas.gitea.cloud/RiskRancher/core/pkg/domain"
domain2 "code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func (s *SQLiteStore) GetSheriffAnalytics(ctx context.Context) (domain2.SheriffAnalytics, error) {
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"context"
"fmt"
domain2 "epigas.gitea.cloud/RiskRancher/core/pkg/domain"
domain2 "code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func (s *SQLiteStore) SaveDraft(ctx context.Context, d domain2.DraftTicket) error {
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"database/sql"
"time"
domain2 "epigas.gitea.cloud/RiskRancher/core/pkg/domain"
domain2 "code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func (s *SQLiteStore) IngestTickets(ctx context.Context, tickets []domain2.Ticket) error {
+1 -1
View File
@@ -7,7 +7,7 @@ import (
"fmt"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func (s *SQLiteStore) GetTickets(ctx context.Context) ([]domain.Ticket, error) {
+1 -1
View File
@@ -1,7 +1,7 @@
package ingest
import (
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
type Handler struct {
+1 -1
View File
@@ -9,7 +9,7 @@ import (
"net/http"
"strconv"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func (h *Handler) HandleIngest(w http.ResponseWriter, r *http.Request) {
+2 -2
View File
@@ -13,8 +13,8 @@ import (
"testing"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func setupTestIngest(t *testing.T) (*Handler, *sql.DB) {
+2 -2
View File
@@ -5,8 +5,8 @@ import (
"net/http"
"strconv"
"epigas.gitea.cloud/RiskRancher/core/pkg/auth"
domain2 "epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/auth"
domain2 "code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func (h *Handler) HandleSaveDraft(w http.ResponseWriter, r *http.Request) {
+1 -1
View File
@@ -1,7 +1,7 @@
package report
import (
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
type Handler struct {
+2 -2
View File
@@ -13,8 +13,8 @@ import (
"testing"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func setupTestReport(t *testing.T) (*Handler, *sql.DB) {
+2 -2
View File
@@ -3,8 +3,8 @@ package server
import (
"net/http"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"epigas.gitea.cloud/RiskRancher/core/pkg/sla"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/sla"
)
type App struct {
+8 -8
View File
@@ -3,14 +3,14 @@ package server
import (
"net/http"
"epigas.gitea.cloud/RiskRancher/core/pkg/adapters"
"epigas.gitea.cloud/RiskRancher/core/pkg/admin"
"epigas.gitea.cloud/RiskRancher/core/pkg/analytics"
"epigas.gitea.cloud/RiskRancher/core/pkg/auth"
"epigas.gitea.cloud/RiskRancher/core/pkg/ingest"
"epigas.gitea.cloud/RiskRancher/core/pkg/report"
"epigas.gitea.cloud/RiskRancher/core/pkg/tickets"
"epigas.gitea.cloud/RiskRancher/core/ui"
"code.riskrancher.com/RiskRancher/core/pkg/adapters"
"code.riskrancher.com/RiskRancher/core/pkg/admin"
"code.riskrancher.com/RiskRancher/core/pkg/analytics"
"code.riskrancher.com/RiskRancher/core/pkg/auth"
"code.riskrancher.com/RiskRancher/core/pkg/ingest"
"code.riskrancher.com/RiskRancher/core/pkg/report"
"code.riskrancher.com/RiskRancher/core/pkg/tickets"
"code.riskrancher.com/RiskRancher/core/ui"
)
func RegisterRoutes(app *App) {
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"log"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
// DefaultSLACalculator implements the SLACalculator interface
+1 -1
View File
@@ -1,7 +1,7 @@
package tickets
import (
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
// Handler encapsulates all Ticket-related HTTP logic
+2 -2
View File
@@ -10,8 +10,8 @@ import (
"testing"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func setupTestTickets(t *testing.T) (*Handler, *sql.DB) {
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"net/http"
"strconv"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
type InlineUpdateRequest struct {
+3
View File
@@ -10,15 +10,18 @@
<div class="tab-nav">
<button class="tab-btn active" onclick="switchTab('tab-metrics', this)">📊 Metrics</button>
<button class="tab-btn" onclick="switchTab('tab-performance', this)">📡 Performance</button>
{{ block "pro_risk_tab_btn" .}}
<button class="tab-btn" style="color: #94a3b8; cursor: not-allowed;" title="Available in RiskRancher Pro">
🔒 Risk Reviews (Pro)
</button>
{{ end }}
<button class="tab-btn" onclick="switchTab('tab-config', this)">⚙️ Configuration</button>
<button class="tab-btn" onclick="switchTab('tab-feed', this)">📻 System Logs</button>
</div>
{{template "admin_metrics" .}}
{{template "admin_performance" .}}
{{block "pro_risk_tab_content" .}}{{end}}
{{template "admin_config" .}}
{{template "admin_feed" .}}
{{template "admin_modals" .}}
+51 -47
View File
@@ -24,7 +24,7 @@
</table>
</div>
<div style="border: 1px solid #e2e8f0; border-radius: 8px; padding: 15px;">
{{block "pro_source_routing" .}}
<div style="border: 1px solid #e2e8f0; border-radius: 8px; padding: 15px; background: #f8fafc;">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;">
<h3 style="margin: 0; color: #64748b;">🛤️ Source Routing</h3>
@@ -35,65 +35,69 @@
<a href="https://RiskRancher.com/pro" target="_blank" style="color: #8b5cf6; text-decoration: none; font-weight: bold; font-size: 0.85rem;">Learn about RiskRancher Pro &rarr;</a>
</div>
</div>
</div>
{{end}}
</div>
<div style="display: grid; grid-template-columns: 2fr 1fr; gap: 20px;">
<div style="border: 1px solid #e2e8f0; border-radius: 8px; padding: 15px; position: relative;">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;">
<div>
<h3 style="margin: 0;">⏱️ SLA Policies & System Time</h3>
<p style="margin: 2px 0 0 0; font-size: 0.8rem; color: #64748b;">Locked to Standard FedRAMP/NIST Default Timeframes</p>
{{block "pro_sla_policy" .}}
<div style="border: 1px solid #e2e8f0; border-radius: 8px; padding: 15px; position: relative;">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;">
<div>
<h3 style="margin: 0;">⏱️ SLA Policies & System Time</h3>
<p style="margin: 2px 0 0 0; font-size: 0.8rem; color: #64748b;">Locked to Standard FedRAMP/NIST Default Timeframes</p>
</div>
<button class="btn" style="padding: 6px 12px; font-size: 0.85rem; background: #f8fafc; color: #64748b; border: 1px solid #cbd5e1;" onclick="showUpsell('Custom SLA Timers & Business Hours')">🔒 Customize (Pro)</button>
</div>
<button class="btn" style="padding: 6px 12px; font-size: 0.85rem; background: #f8fafc; color: #64748b; border: 1px solid #cbd5e1;" onclick="showUpsell('Custom SLA Timers & Business Hours')">🔒 Customize (Pro)</button>
</div>
<div style="display: flex; gap: 30px; opacity: 0.7; pointer-events: none;">
<div style="flex: 1; padding: 15px; background: #f8fafc; border-radius: 6px; border: 1px solid #e2e8f0;">
<h4 style="margin-top: 0;">Base Configuration</h4>
<label>System Timezone:</label>
<select disabled style="width: 100%; padding: 6px; margin-bottom: 10px; background: #e2e8f0;">
<option selected>UTC (Universal)</option>
</select>
<div style="display: flex; gap: 10px; margin-bottom: 10px;">
<div style="flex: 1;"><label>Biz Start:</label><input type="text" disabled value="09:00" style="width: 100%; padding: 6px; background: #e2e8f0;"></div>
<div style="flex: 1;"><label>Biz End:</label><input type="text" disabled value="17:00" style="width: 100%; padding: 6px; background: #e2e8f0;"></div>
<div style="display: flex; gap: 30px; opacity: 0.7; pointer-events: none;">
<div style="flex: 1; padding: 15px; background: #f8fafc; border-radius: 6px; border: 1px solid #e2e8f0;">
<h4 style="margin-top: 0;">Base Configuration</h4>
<label>System Timezone:</label>
<select disabled style="width: 100%; padding: 6px; margin-bottom: 10px; background: #e2e8f0;">
<option selected>UTC (Universal)</option>
</select>
<div style="display: flex; gap: 10px; margin-bottom: 10px;">
<div style="flex: 1;"><label>Biz Start:</label><input type="text" disabled value="09:00" style="width: 100%; padding: 6px; background: #e2e8f0;"></div>
<div style="flex: 1;"><label>Biz End:</label><input type="text" disabled value="17:00" style="width: 100%; padding: 6px; background: #e2e8f0;"></div>
</div>
</div>
<div style="flex: 2;">
<div style="margin-bottom: 10px; display: flex; justify-content: space-between;">
<h4 style="margin: 0;">SLA Matrix (Days to Patch)</h4>
</div>
<table style="font-size: 0.85rem; width: 100%; text-align: left;">
<thead><tr><th style="padding-bottom: 5px;">Severity</th><th>Triage</th><th>Patch</th></tr></thead>
<tbody>
<tr class="sla-row"><td style="padding: 4px 0;"><span class="badge critical">Critical</span></td><td>1</td><td>3</td></tr>
<tr class="sla-row"><td style="padding: 4px 0;"><span class="badge high">High</span></td><td>3</td><td>14</td></tr>
<tr class="sla-row"><td style="padding: 4px 0;"><span class="badge medium">Medium</span></td><td>7</td><td>30</td></tr>
<tr class="sla-row"><td style="padding: 4px 0;"><span class="badge low">Low</span></td><td>14</td><td>90</td></tr>
</tbody>
</table>
</div>
</div>
<div style="flex: 2;">
<div style="margin-bottom: 10px; display: flex; justify-content: space-between;">
<h4 style="margin: 0;">SLA Matrix (Days to Patch)</h4>
</div>
<table style="font-size: 0.85rem; width: 100%; text-align: left;">
<thead><tr><th style="padding-bottom: 5px;">Severity</th><th>Triage</th><th>Patch</th></tr></thead>
<tbody>
<tr class="sla-row"><td style="padding: 4px 0;"><span class="badge critical">Critical</span></td><td>1</td><td>3</td></tr>
<tr class="sla-row"><td style="padding: 4px 0;"><span class="badge high">High</span></td><td>3</td><td>14</td></tr>
<tr class="sla-row"><td style="padding: 4px 0;"><span class="badge medium">Medium</span></td><td>7</td><td>30</td></tr>
<tr class="sla-row"><td style="padding: 4px 0;"><span class="badge low">Low</span></td><td>14</td><td>90</td></tr>
</tbody>
</table>
</div>
</div>
</div>
{{end}}
<div style="border: 1px solid #e2e8f0; border-radius: 8px; padding: 15px; display: flex; flex-direction: column;">
<h3 style="margin: 0 0 15px 0;">⚙️ Operations</h3>
<div style="margin-bottom: 20px;">
<label style="font-weight: bold; display: flex; justify-content: space-between;">
Automated Backups
<span style="font-size: 0.75rem; color: #8b5cf6; font-weight: normal;">Pro Feature</span>
</label>
<div style="display: flex; gap: 10px; margin-top: 5px;">
<select disabled style="flex: 1; padding: 6px; background: #f1f5f9; color: #94a3b8; cursor: not-allowed; border: 1px solid #cbd5e1;">
<option>Manual Only (Free Core)</option>
<option>Daily Automated</option>
<option>Weekly Automated</option>
</select>
<button class="btn btn-secondary" style="color: #94a3b8; border-color: #cbd5e1;" onclick="showUpsell('Automated DB Backups')">🔒 Apply</button>
{{block "pro_backups" .}}
<div style="margin-bottom: 20px;">
<label style="font-weight: bold; display: flex; justify-content: space-between;">
Automated Backups
<span style="font-size: 0.75rem; color: #8b5cf6; font-weight: normal;">Pro Feature</span>
</label>
<div style="display: flex; gap: 10px; margin-top: 5px;">
<select disabled style="flex: 1; padding: 6px; background: #f1f5f9; color: #94a3b8; cursor: not-allowed; border: 1px solid #cbd5e1;">
<option>Manual Only (Free Core)</option>
<option>Daily Automated</option>
<option>Weekly Automated</option>
</select>
<button class="btn btn-secondary" style="color: #94a3b8; border-color: #cbd5e1;" onclick="showUpsell('Automated DB Backups')">🔒 Apply</button>
</div>
</div>
</div>
{{end}}
<div style="margin-bottom: 20px;">
<label style="font-weight: bold;">Data Portability</label>
+5 -3
View File
@@ -8,9 +8,11 @@
</a>
<a href="/dashboard?tab=chute" class="tab-btn {{if eq .CurrentTab "chute"}}active{{end}}">🤠 The Chute (Assigned)</a>
<a href="javascript:void(0)" onclick="showUpsell('E2E Exception & Verification Pipeline')" class="tab-btn" style="color: #94a3b8;">
🔒 Pending Verification (Pro)
</a>
{{block "pro_verification_tab" .}}
<a href="javascript:void(0)" onclick="showUpsell('E2E Exception & Verification Pipeline')" class="tab-btn" style="color: #94a3b8;">
🔒 Pending Verification (Pro)
</a>
{{end}}
<a href="/dashboard?tab=archives" class="tab-btn {{if eq .CurrentTab "archives"}}active{{end}}">
🗄️ The Archives
+2 -2
View File
@@ -1,11 +1,12 @@
{{define "content"}}
<script>
window.CurrentTab = "{{.CurrentTab}}";
</script>
{{template "dash_tabs" .}}
{{block "pro_risk_tab_content" .}}{{end}}
<div class="tab-pane active">
{{template "dash_table" .}}
</div>
@@ -13,5 +14,4 @@
{{template "dash_modals" .}}
<script src="/static/dashboard.js"></script>
{{end}}
+3 -3
View File
@@ -13,9 +13,9 @@ import (
"strconv"
"strings"
"epigas.gitea.cloud/RiskRancher/core/pkg/auth"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"epigas.gitea.cloud/RiskRancher/core/pkg/report"
"code.riskrancher.com/RiskRancher/core/pkg/auth"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/report"
)
//go:embed templates/* templates/components/* static/*