Compare commits

...

7 Commits

Author SHA1 Message Date
masoodafar-web b60d1da4b7 Merge branch 'kub-stage' into production
Build and Deploy to Production / build-and-deploy (push) Successful in 9m21s
2026-10-05 01:26:11 +03:30
masoodafar-web 016b259da0 feat(index): add configuration options for landing page sections
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 8m47s
- Introduced new settings in appsettings files to control the visibility of the steps and features sections on the landing page, allowing for dynamic content presentation.
- Updated Index.razor and Index.razor.cs to utilize these settings, enhancing user experience by enabling or disabling sections based on configuration.
2026-10-04 23:54:42 +03:30
masoodafar-web bb789e443e feat(index): enable conditional rendering for steps and features sections
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 8m21s
- Added support for conditional rendering of the steps and features sections on the landing page, controlled by the new `StepsEnabled` and `FeaturesEnabled` properties in the Index.razor.cs file.
- This enhancement allows for more dynamic content presentation based on user settings, improving the overall user experience.
2026-10-04 23:34:22 +03:30
masoodafar-web 0c1842cf02 Merge branch 'kub-stage' into production
Build and Deploy to Production / build-and-deploy (push) Successful in 11m31s
2026-10-04 23:02:04 +03:30
masoodafar-web 392e038913 chore(k8s): update kub-deploy workflow and frontoffice deployment configuration
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 10m11s
- Modified the kub-deploy.yml to remove cached images using containerd's ctr command, ensuring that both IfNotPresent and Always image pull policies work correctly.
- Updated frontoffice-deployment.yaml to set imagePullPolicy to Always, preventing stale node cache issues with the :latest tag.

These changes improve the deployment process and ensure that the latest images are always used in the staging environment.
2026-10-03 23:53:02 +03:30
masoodafar-web d7f25efce2 fix(index): remove unnecessary fade-in effect from TwentyCard promo section
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 11m13s
- Eliminated the fade-in effect from the MudPaper component in the TwentyCard credit promo section on the landing page, streamlining the visual presentation.

This change enhances the user experience by simplifying the design of the promotional section.
2026-10-03 22:43:53 +03:30
masoodafar-web 5246d8c1ba feat(index): add TwentyCard credit promo section and integrate portal link
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 9m23s
- Introduced a new promotional section for TwentyCard credit on the landing page, featuring details about the service and a button to access the TwentyCard portal.
- Updated the Index.razor.cs file to retrieve the portal URL from configuration and implemented the logic to open the portal in a new tab.
- Enhanced site.css with styling specific to the TwentyCard promo box.

These changes enhance user engagement by promoting the TwentyCard credit option and providing easy access to its portal.
2026-10-03 22:18:44 +03:30
7 changed files with 83 additions and 3 deletions
+5 -1
View File
@@ -74,7 +74,11 @@ jobs:
# Apply manifests and restart
sshpass -e ssh -o StrictHostKeyChecking=no root@${{ env.K8S_SERVER }} "
kubectl apply -n kbs-stage -f /tmp/frontoffice-deployment.yaml &&
crictl rmi ${REGISTRY}/${IMAGE_NAME}:latest 2>/dev/null || true &&
# Drop cached :latest so IfNotPresent/Always both pick the new digest
# (crictl is broken on this host — use containerd ctr)
ctr -n k8s.io images ls -q | grep -E 'frontoffice(:latest|@)' | while read -r ref; do
ctr -n k8s.io images rm \"\$ref\" 2>/dev/null || true
done
kubectl -n kbs-stage rollout restart deployment/frontoffice &&
kubectl -n kbs-stage rollout status deployment/frontoffice --timeout=180s &&
rm -f /tmp/frontoffice-deployment.yaml
+2 -1
View File
@@ -21,7 +21,8 @@ spec:
containers:
- name: frontoffice
image: 185.252.31.44:30080/admin/frontoffice:latest
imagePullPolicy: IfNotPresent
# Staging uses :latest — Always avoids stale node cache after registry retag
imagePullPolicy: Always
ports:
- containerPort: 80
name: http
+45 -1
View File
@@ -94,8 +94,47 @@
}
@* ═══════════════════════════════════════════════
2. HOW IT WORKS — 3 numbered steps
1c. TWENTYCARD CREDIT — promo box
═══════════════════════════════════════════════ *@
<section class="py-4" style="background:var(--mud-palette-surface);">
<MudContainer MaxWidth="MaxWidth.Medium">
<MudPaper Elevation="0" Class="landing-twentycard-box rounded-xl pa-4 pa-md-5">
<MudStack Row="true" Spacing="3" AlignItems="AlignItems.Start" Class="flex-wrap">
<MudAvatar Color="Color.Info" Variant="Variant.Filled" Size="Size.Large" Class="rounded-lg" Style="min-width:56px;">
<MudIcon Icon="@Icons.Material.Filled.AccountBalance" />
</MudAvatar>
<MudStack Spacing="2" Style="flex:1; min-width:220px;">
<MudText Typo="Typo.h6">تأمین اعتبار ۲۰کارت</MudText>
<MudText Typo="Typo.body2" Class="mud-text-secondary">
با تأمین اعتبار از طریق ۲۰کارت می‌توانید بدون پرداخت نقدی کامل، هزینه خرید پکیج و محصولات در کارا بازار را پوشش دهید.
فرایند درخواست و تأیید اعتبار در پنل ۲۰کارت انجام می‌شود و پس از آن پرداخت از همان مسیر در دسترس است.
این روش برای کسانی مناسب است که می‌خواهند سریع‌تر وارد مسیر عضویت و خرید شوند.
</MudText>
<MudText Typo="Typo.body2">
بعد از دریافت وام، می‌توانید در کارا بازار از باشگاه مشتریان استفاده کنید و با فروش و دعوت، توسعه سرمایه داشته باشید.
</MudText>
<div class="mt-1">
<MudButton Variant="Variant.Filled"
Color="Color.Info"
Class="rounded-pill"
StartIcon="@Icons.Material.Filled.OpenInNew"
Disabled="@string.IsNullOrWhiteSpace(_twentyCardPortalUrl)"
OnClick="OpenTwentyCardPortal">
ورود به سایت ۲۰کارت
</MudButton>
</div>
</MudStack>
</MudStack>
</MudPaper>
</MudContainer>
</section>
@* ═══════════════════════════════════════════════
2. HOW IT WORKS — 3 numbered steps
(appsettings Landing:ShowStepsSection; default false)
═══════════════════════════════════════════════ *@
@if (_showStepsSection)
{
<section class="section-landing">
<MudContainer MaxWidth="MaxWidth.Large">
<div class="text-center mb-8 fade-in-up">
@@ -121,10 +160,14 @@
</MudGrid>
</MudContainer>
</section>
}
@* ═══════════════════════════════════════════════
3. FEATURES — 6 cards with icons
(appsettings Landing:ShowFeaturesSection; default false)
═══════════════════════════════════════════════ *@
@if (_showFeaturesSection)
{
<section class="section-landing" style="background:var(--mud-palette-background-gray);">
<MudContainer MaxWidth="MaxWidth.Large">
<div class="text-center mb-8 fade-in-up">
@@ -152,6 +195,7 @@
</MudGrid>
</MudContainer>
</section>
}
@* ═══════════════════════════════════════════════
4. STATS — Counter cards
+17
View File
@@ -1,5 +1,6 @@
using FrontOffice.Main.Utilities;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Configuration;
using Microsoft.JSInterop;
using MudBlazor;
@@ -16,8 +17,12 @@ public partial class Index : IDisposable
[Inject] private DiscountCartService DiscountCart { get; set; } = default!;
[Inject] private GuestActionGate GuestGate { get; set; } = default!;
[Inject] private VATService VAT { get; set; } = default!;
[Inject] private IConfiguration Configuration { get; set; } = default!;
private bool _isAuthenticated;
private string _twentyCardPortalUrl = string.Empty;
private bool _showStepsSection;
private bool _showFeaturesSection;
// ── CMS page data ──
private PageSettingsDto? _pageData;
@@ -49,6 +54,10 @@ public partial class Index : IDisposable
{
MainService.OnChangeHandler += OnStateChanged;
_isAuthenticated = await AuthService.IsAuthenticatedAsync();
_twentyCardPortalUrl = Configuration["TwentyCard:CreditPortalUrl"] ?? string.Empty;
// appsettings Landing:* — default false (hidden). Set true to restore sections.
_showStepsSection = Configuration.GetValue("Landing:ShowStepsSection", false);
_showFeaturesSection = Configuration.GetValue("Landing:ShowFeaturesSection", false);
// Load landing page settings from CMS
try
@@ -298,6 +307,12 @@ public partial class Index : IDisposable
Navigation.NavigateTo(RouteConstants.Registration.Wizard);
}
private async Task OpenTwentyCardPortal()
{
if (string.IsNullOrWhiteSpace(_twentyCardPortalUrl)) return;
await JS.InvokeVoidAsync("open", _twentyCardPortalUrl, "_blank");
}
private void NavigateToPost(string slug)
{
Navigation.NavigateTo($"/blog/{slug}");
@@ -334,8 +349,10 @@ public partial class Index : IDisposable
public string? HeroButtonPrimaryText { get; set; }
public string? HeroButtonSecondaryText { get; set; }
public List<TrustBadgeItem>? TrustBadges { get; set; }
public bool? StepsEnabled { get; set; }
public string? StepsTitle { get; set; }
public List<StepItem>? Steps { get; set; }
public bool? FeaturesEnabled { get; set; }
public string? FeaturesTitle { get; set; }
public List<FeatureItem>? Features { get; set; }
public string? StatsTitle { get; set; }
@@ -9,6 +9,10 @@
"TwentyCard": {
"CreditPortalUrl": "https://userpanel.20card.ir/"
},
"Landing": {
"ShowStepsSection": false,
"ShowFeaturesSection": false
},
"EncryptionSettings": {
"Key": "kmcQ3XTmH4mrdh8VHziuscyf8LLYjG//Kyni81nH/0E=",
"IV": "1wyF3Tt142MOkCpIyCxh/g=="
+4
View File
@@ -9,6 +9,10 @@
"TwentyCard": {
"CreditPortalUrl": "https://userpanel.20card.ir/"
},
"Landing": {
"ShowStepsSection": false,
"ShowFeaturesSection": false
},
"EncryptionSettings": {
"Key": "kmcQ3XTmH4mrdh8VHziuscyf8LLYjG//Kyni81nH/0E=",
"IV": "1wyF3Tt142MOkCpIyCxh/g=="
@@ -1617,6 +1617,12 @@ html, body {
overflow: hidden;
}
/* ── Landing TwentyCard credit promo ── */
.landing-twentycard-box {
background: var(--ds-info-soft);
border: 1px solid rgba(59, 130, 246, 0.22);
}
/* ── Register Wizard Unified ── */
.wizard-section {
min-height: 80vh;