NopStation plugins

This commit is contained in:
Adam 2025-09-02 15:22:02 +02:00
parent b7b26adee8
commit e4a7bda236
69 changed files with 552240 additions and 0 deletions

View File

@ -0,0 +1,94 @@
@model IEnumerable<PluginInfoModel>
@{
Layout = "_AdminLayout";
//page title
ViewBag.PageTitle = T("Admin.NopStation.Core.AssemblyInfo").Text;
//active menu item (system name)
NopHtml.SetActiveMenuItemSystemName("NopStationCore.AssemblyInfo");
var i = 1;
}
<style>
.plugin-item {
border-bottom: 1px solid #eee;
padding: 15px 10px;
}
.plugin-item span.a-version {
background: yellow;
padding: 0px 9px;
border-radius: 10px;
font-weight: normal;
display: inline-block;
}
.plugin-item span.f-version {
background: #80FF00;
padding: 0px 9px;
border-radius: 10px;
font-weight: normal;
display: inline-block;
}
.plugin-item span.build {
background: green;
padding: 0px 9px;
border-radius: 10px;
font-weight: normal;
color: white;
display: inline-block;
}
.plugin-item-flie {
color: white;
background: #03a1db;
width: fit-content;
padding: 0 8px;
border-radius: 10px;
}
</style>
<div class="content-header clearfix">
<h1 class="float-left">
@T("Admin.NopStation.Core.AssemblyInfo")
</h1>
</div>
<section class="content">
<div class="container-fluid">
<div class="form-horizontal">
<div class="cards-group">
<div class="card card-default">
<div class="card-body">
@foreach (var item in Model)
{
<div class="plugin-item">
<div style="font-weight: bold;">
@(i++.ToString("00")). @item.AssemblyName
<span class="a-version">Assembly version=@(item.AssemblyVersion)</span>
<span class="f-version">File version=@(item.FileVersion)</span>
@if (!string.IsNullOrWhiteSpace(item.BuildType))
{
<span class="build">Build=@(item.BuildType)</span>
}
</div>
<i>@item.FilePath</i>
<div class="plugin-item-flie">@item.FileName</div>
<div class="plugin-item-description">@item.Description</div>
<span>
<span style="font-weight: bold">Created on:</span>
@item.CreatedOn.ToLongDateString()
@item.CreatedOn.ToLongTimeString()
@item.CreatedOn.ToString("\"GMT\" zzz")
</span>
</div>
}
</div>
</div>
</div>
</div>
</div>
</section>

View File

@ -0,0 +1,73 @@
@model ConfigurationModel
@{
Layout = "_AdminLayout";
NopHtml.SetActiveMenuItemSystemName("NopStationCore.Configure");
ViewBag.PageTitle = T("Admin.NopStation.Core.Configuration").Text;
}
<script>
$(document).ready(function() {
$("#@Html.IdFor(model => model.RestrictMainMenuByCustomerRoles)").change(toggleRestrictMainMenuByCustomerRoles);
toggleRestrictMainMenuByCustomerRoles();
});
function toggleRestrictMainMenuByCustomerRoles() {
if ($('#@Html.IdFor(model => model.RestrictMainMenuByCustomerRoles)').is(':checked')) {
$('#pnlAllowedCustomerRoleIds').show();
} else {
$('#pnlAllowedCustomerRoleIds').hide();
}
}
</script>
<form asp-controller="NopStationCore" asp-action="Configure" method="post">
<div class="content-header clearfix">
<h1 class="float-left">
@T("Admin.NopStation.Core.Configuration")
</h1>
<div class="float-right">
<button type="submit" name="save" class="btn btn-primary">
<i class="far fa-save"></i>
@T("Admin.Common.Save")
</button>
</div>
</div>
<section class="content">
<div class="container-fluid">
<div class="form-horizontal">
@await Component.InvokeAsync(typeof(StoreScopeConfigurationViewComponent))
<div asp-validation-summary="All"></div>
<div class="cards-group">
<div class="card card-default">
<div class="card-body">
<div class="form-group row">
<div class="col-md-3">
<nop-override-store-checkbox asp-for="RestrictMainMenuByCustomerRoles_OverrideForStore" asp-input="RestrictMainMenuByCustomerRoles" asp-store-scope="@Model.ActiveStoreScopeConfiguration" />
<nop-label asp-for="RestrictMainMenuByCustomerRoles" />
</div>
<div class="col-md-9">
<nop-editor asp-for="RestrictMainMenuByCustomerRoles" />
</div>
</div>
<nop-nested-setting asp-for="RestrictMainMenuByCustomerRoles">
<div class="form-group row" id="pnlAllowedCustomerRoleIds">
<div class="col-md-3">
<nop-label asp-for="AllowedCustomerRoleIds" />
</div>
<div class="col-md-9">
<nop-select asp-for="AllowedCustomerRoleIds" asp-items="Model.AvailableCustomerRoles" asp-multiple="true" />
<span asp-validation-for="AllowedCustomerRoleIds"></span>
</div>
</div>
</nop-nested-setting>
</div>
</div>
</div>
</div>
</div>
</section>
</form>

View File

@ -0,0 +1,131 @@
@model CoreLocaleResourceSearchModel
@inject AdminAreaSettings adminAreaSettings
@using Nop.Web.Areas.Admin.Models.Localization
@{
Layout = "_AdminLayout";
//page title
ViewBag.PageTitle = T("Admin.NopStation.Core.LocaleResources").Text;
//active menu item (system name)
NopHtml.SetActiveMenuItemSystemName("NopStationCore.LocaleResources");
}
@{
const string hideSearchBlockAttributeName = "CoreLocaleResourcesPage.HideSearchBlock";
var hideSearchBlock = await genericAttributeService.GetAttributeAsync<bool>(workContext.GetCurrentCustomerAsync().Result, hideSearchBlockAttributeName);
}
<div class="content-header clearfix">
<h1 class="float-left">
@T("Admin.NopStation.Core.LocaleResources")
</h1>
</div>
<section class="content">
<div class="container-fluid">
<div class="form-horizontal">
<div class="cards-group">
<div class="card card-default card-search">
<div class="card-body">
<div class="row search-row @(!hideSearchBlock ? "opened" : "")" data-hideAttribute="@hideSearchBlockAttributeName">
<div class="search-text">@T("Admin.Common.Search")</div>
<div class="icon-search"><i class="fas fa-search" aria-hidden="true"></i></div>
<div class="icon-collapse"><i class="far fa-angle-@(!hideSearchBlock ? "up" : "down")" aria-hidden="true"></i></div>
</div>
<div class="search-body @(hideSearchBlock ? "closed" : "")">
<div class="row">
<div class="col-md-5">
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="SearchResourceName" />
</div>
<div class="col-md-9">
<nop-editor asp-for="SearchResourceName" />
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="SearchLanguageId" />
</div>
<div class="col-md-9">
<nop-select asp-for="SearchLanguageId" asp-items="Model.AvailableLanguages" />
</div>
</div>
</div>
<div class="col-md-7">
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="SearchPluginSystemName" />
</div>
<div class="col-md-9">
<nop-select asp-for="SearchPluginSystemName" asp-items="Model.AvailablePlugins" />
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-7 offset-md-5">
<div class="form-group row">
<button type="button" id="search-resource" class="btn btn-primary btn-search">
<i class="fa fa-search"></i>
@T("Admin.Common.Search")
</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="card card-body">
@await Html.PartialAsync("Table", new DataTablesModel
{
Name = "resource-grid",
UrlRead = new DataUrl("LocaleResource", "NopStationCore", null),
UrlUpdate = new DataUrl("ResourceUpdate", "NopStationCore", null),
Length = adminAreaSettings.DefaultGridPageSize,
LengthMenu = adminAreaSettings.GridPageSizes,
SearchButtonId = "search-resource",
Filters = new List<FilterParameter>
{
new FilterParameter(nameof(Model.SearchLanguageId)),
new FilterParameter(nameof(Model.SearchPluginSystemName)),
new FilterParameter(nameof(Model.SearchResourceName))
},
ColumnCollection = new List<ColumnProperty>
{
new ColumnProperty(nameof(CoreLocaleResourceModel.ResourceName))
{
Title = T("Admin.NopStation.Core.Resources.Fields.Name").Text,
Width = "200"
},
new ColumnProperty(nameof(CoreLocaleResourceModel.ResourceValue))
{
Title = T("Admin.NopStation.Core.Resources.Fields.Value").Text,
Width = "300",
Editable = true,
EditType = EditType.String
},
new ColumnProperty(nameof(CoreLocaleResourceModel.LanguageId))
{
Title = T("Admin.NopStation.Core.Resources.Fields.Value").Text,
Editable = true,
EditType = EditType.Number,
Visible = false
},
new ColumnProperty(nameof(CoreLocaleResourceModel.ResourceNameLanguageId))
{
Title = T("Admin.Common.Edit").Text,
Width = "200",
ClassName = NopColumnClassDefaults.Button,
Render = new RenderButtonsInlineEdit()
}
}
})
</div>
</div>
</div>
</div>
</section>

View File

@ -0,0 +1,105 @@
@using Nop.Web.Areas.Admin.Models.Security
@using static Nop.Services.Common.NopLinksDefaults
@model PermissionConfigurationModel
@{
Layout = "_AdminLayout";
//page title
ViewBag.PageTitle = T("Admin.NopStation.Core.ACL").Text;
//active menu item (system name)
NopHtml.SetActiveMenuItemSystemName("NopStationCore.ACL");
}
<style type="text/css">
table.dataTable.table-hover>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(255, 255, 255, 1)}
table.dataTable.table-striped>tbody>tr.odd>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.05)}
</style>
<script type="text/javascript">
$(function () {
$('#permissions-grid').on( 'init.dt', function () {
$('tr').css('bg-color', 'white');
} );
});
</script>
<form asp-controller="NopStationCore" asp-action="Permissions" method="post" id="permissions-form">
<div class="content-header clearfix">
<div class="float-right">
@await Component.InvokeAsync(typeof(AdminWidgetViewComponent), new { widgetZone = AdminWidgetZones.PermissionListButtons, additionalData = Model })
</div>
</div>
<section class="content">
<div class="container-fluid">
<div class="form-horizontal">
<div class="cards-group">
<div class="card card-default">
<div class="card-body">
<p>
@T("Admin.Configuration.ACL.Description")
<nop-doc-reference asp-string-resource="@T("Admin.Documentation.Reference.Acl", Docs.Acl + Utm.OnAdmin)" asp-add-wrapper="false" />
</p>
@if (!Model.IsPermissionsAvailable)
{
<text>@T("Admin.Configuration.ACL.NoPermissionsDefined")</text>
}
else if (!Model.AreCustomerRolesAvailable)
{
<text>@T("Admin.Configuration.ACL.NoCustomerRolesAvailable")</text>
}
else
{
<div class="scroll-wrapper">
@await Html.PartialAsync("Table", new DataTablesModel
{
Name = "permission-items-grid",
UrlRead = new DataUrl("PermissionCategory", "Security", new RouteValueDictionary
{
[nameof(PermissionItemSearchModel.PermissionCategoryName)] = "NopStation"
}),
IsChildTable = true,
Length = Model.PermissionCategorySearchModel.PageSize,
LengthMenu = Model.PermissionCategorySearchModel.AvailablePageSizes,
ColumnCollection = new List<ColumnProperty>
{
new(nameof(PermissionItemModel.PermissionName))
{
Title = T("Admin.Configuration.ACL.Permission.PermissionName").Text,
Width = "400px"
},
new(nameof(PermissionItemModel.PermissionAppliedFor))
{
Title = T("Admin.Customers.CustomerRoles").Text,
AutoWidth = true,
Render = new RenderCustom("renderPermissionText")
},
new(nameof(PermissionItemModel.Id))
{
Title = T("Admin.Common.Edit").Text,
Width = "100px",
ClassName = NopColumnClassDefaults.Button,
Render = new RenderCustom("renderPermissionEdit")
},
}
})
<script>
function renderPermissionEdit(data, type, row, meta) {
return '<button onclick=\"javascript:OpenWindow(\'@Url.Content("~/Admin/Security/PermissionEditPopup/")' + data + '\', 800, 300, true); return false;\" class="btn btn-default"><i class="fas fa-pencil"></i>@T("Admin.Common.Edit").Text</button>';
}
function renderPermissionText(data, type, row, meta) {
return '<span id="permission-applied-for-' + row.Id + '">' + data + '</span>';
}
</script>
</div>
}
</div>
</div>
</div>
</div>
</div>
</section>
</form>

View File

@ -0,0 +1,43 @@
@model LicenseModel
@{
Layout = "_AdminLayout";
NopHtml.SetActiveMenuItemSystemName("NopStationCore.License");
ViewBag.PageTitle = T("Admin.NopStation.Core.License").Text;
}
<form asp-controller="NopStationLicense" asp-action="License" method="post">
<div class="content-header clearfix">
<h1 class="float-left">
@T("Admin.NopStation.Core.License")
</h1>
<div class="float-right">
<button type="submit" name="save" class="btn btn-primary">
<i class="far fa-save"></i>
@T("Admin.Common.Save")
</button>
</div>
</div>
<section class="content">
<div class="container-fluid">
<div class="form-horizontal">
<div asp-validation-summary="All"></div>
<div class="cards-group">
<div class="card card-default">
<div class="card-body">
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="LicenseString" />
</div>
<div class="col-md-9">
<nop-editor asp-for="LicenseString" />
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</form>

View File

@ -0,0 +1,38 @@
@model int
@inject Nop.Services.Catalog.ICategoryService categoryService
<select class="form-control" data-placeholder="Search for a category" style="width: 100%" id="@Html.IdForModel()" name="@Html.NameForModel()">
@if (Model > 0)
{
var category = await categoryService.GetCategoryByIdAsync(Model);
if (category != null && !category.Deleted)
{
<option value="@Model" selected="selected">@(await categoryService.GetFormattedBreadCrumbAsync(category))</option>
}
}
</select>
<script>
$(document).ready(function () {
$('#@Html.IdForModel()').select2({
ajax: {
url: '@(Url.Action("Categories", "Select2"))',
dataType: 'json',
data: function (params) {
var query = {
q: params.term,
page: params.page || 1
}
return query;
},
processResults: function (data, params) {
params.page = params.page || 1;
return data;
},
placeholder: 'Search for a category',
minimumInputLength: 1
}
});
});
</script>

View File

@ -0,0 +1,37 @@
@model int
@inject Nop.Services.Catalog.IManufacturerService manufacturerService
<select class="form-control" data-placeholder="Search for a manufacturer" style="width: 100%" id="@Html.IdForModel()" name="@Html.NameForModel()">
@if (Model > 0)
{
var manufacturer = await manufacturerService.GetManufacturerByIdAsync(Model);
if (manufacturer != null && !manufacturer.Deleted)
{
<option value="@Model" selected="selected">@manufacturer.Name</option>
}
}
</select>
<script>
$(document).ready(function () {
$('#@Html.IdForModel()').select2({
ajax: {
url: '@(Url.Action("Manufacturers", "Select2"))',
dataType: 'json',
data: function (params) {
var query = {
q: params.term,
page: params.page || 1
}
return query;
},
processResults: function (data, params) {
params.page = params.page || 1;
return data;
},
minimumInputLength: 1
}
});
});
</script>

View File

@ -0,0 +1,37 @@
@model int
@inject Nop.Services.Catalog.IProductService productService
<select class="form-control" data-placeholder="Search for a product" style="width: 100%" id="@Html.IdForModel()" name="@Html.NameForModel()">
@if (Model > 0)
{
var product = await productService.GetProductByIdAsync(Model);
if (product != null && !product.Deleted)
{
<option value="@Model" selected="selected">@product.Name</option>
}
}
</select>
<script>
$(document).ready(function () {
$('#@Html.IdForModel()').select2({
ajax: {
url: '@(Url.Action("Products", "Select2"))',
dataType: 'json',
data: function (params) {
var query = {
q: params.term,
page: params.page || 1
}
return query;
},
processResults: function (data, params) {
params.page = params.page || 1;
return data;
},
minimumInputLength: 1
}
});
});
</script>

View File

@ -0,0 +1,2 @@
@model DateTime
<input id="@Html.IdForModel()" name="@Html.NameForModel()" value="@((Model > DateTime.MinValue ? Model : DateTime.Today).ToString("hh:mm tt"))" type="date" class="form-control" />

View File

@ -0,0 +1,2 @@
@model DateTime?
<input id="@Html.IdForModel()" name="@Html.NameForModel()" value="@(Model > DateTime.MinValue || Model.HasValue ? Model.Value.ToShortDateString() : null)" type="date" class="form-control" />

View File

@ -0,0 +1,22 @@
@inherits Nop.Web.Framework.Mvc.Razor.NopRazorPage<TModel>
@inject Nop.Services.Common.IGenericAttributeService genericAttributeService
@inject Nop.Core.IWorkContext workContext
@inject INopHtmlHelper NopHtml
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, Nop.Web.Framework
@addTagHelper *, NopStation.Plugin.Misc.Actions
@using Microsoft.AspNetCore.Mvc.ViewFeatures
@using Nop.Web.Framework.UI
@using Nop.Web.Framework.Extensions
@using System.Text.Encodings.Web
@using Nop.Services.Events
@using Nop.Web.Framework.Events
@using Nop.Web.Framework.Infrastructure
@using NopStation.Plugin.Misc.Core.Models
@using Nop.Core.Domain.Common
@using Nop.Web.Framework.Models.DataTables
@using Microsoft.AspNetCore.Routing
@using Microsoft.AspNetCore.Mvc.Rendering
@using Nop.Core.Infrastructure
@using Nop.Web.Areas.Admin.Components

View File

@ -0,0 +1,38 @@
@font-face {
font-family: 'icomoon';
src: url('/Plugins/NopStation.Core/contents/fonts/icomoon.eot?h5ssf6');
src: url('/Plugins/NopStation.Core/contents/fonts/icomoon.eot?h5ssf6#iefix') format('embedded-opentype'), url('/Plugins/NopStation.Core/contents/fonts/icomoon.ttf?h5ssf6') format('truetype'), url('/Plugins/NopStation.Core/contents/fonts/icomoon.woff?h5ssf6') format('woff'), url('/Plugins/NopStation.Core/contents/fonts/icomoon.svg?h5ssf6#icomoon') format('svg');
font-weight: normal;
font-style: normal;
font-display: block;
}
[class^="icon-"], [class*=" icon-"] {
/* use !important to prevent issues with browser extensions that change fonts */
font-family: 'icomoon' !important;
speak: never;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
line-height: 1;
/* Better Font Rendering =========== */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-nop-station:before {
content: "\e900";
}
.icon-plugins:before {
content: "\e901";
}
.icon-themes:before {
content: "\e902";
}
.select2-container--default .select2-selection--single {
border-radius: 0 !important;
}

View File

@ -0,0 +1,13 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by IcoMoon</metadata>
<defs>
<font id="icomoon" horiz-adv-x="1024">
<font-face units-per-em="1024" ascent="960" descent="-64" />
<missing-glyph horiz-adv-x="1024" />
<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
<glyph unicode="&#xe900;" glyph-name="nopStation-logo" d="M156.212 589.382c-7.626-19.602-14.144-39.186-18.51-58.774 20.698 0 40.28-4.35 62.054-13.076l141.494-56.6c25.042-8.706 47.89-8.706 70.75 0 22.848 8.7 39.18 25.036 48.984 48.994l48.974 120.828c9.814 22.86 8.71 46.796-2.172 69.636-9.788 22.884-27.21 39.19-52.24 48.994l-109.924 43.54c-90.362-42.44-152.398-109.918-189.41-203.542zM431.594 822.316l45.724-18.51c40.264-14.158 68.566-42.446 87.076-80.534 17.41-38.096 18.51-76.188 3.262-114.306l-47.88-121.902c-16.326-38.096-43.55-65.306-82.726-80.558-39.19-15.238-78.396-15.238-117.556 0l-141.51 56.622c-58.506 19.080-53.114-4.524-48.83-50.464 5.166-55.24 21.308-107.578 49.908-157.43 38.108-67.504 98.406-121.932 168.066-155.668l12.64 37.018 180.68-71.834c121.928 8.7 216.598 63.128 286.254 161.072-1.078 8.706-3.256 18.51-7.606 30.486-10.878 22.864-28.308 40.274-53.324 48.974l-132.81 54.424c-3.492-1.756-6.99-2.788-9.938-3.144-4.104-1.14-8.458-1.73-12.932-1.73-26.66 0-48.28 21.58-48.28 48.246 0 26.686 21.622 48.292 48.28 48.292 22.392 0 41.204-15.212 46.652-35.874l131.864-53.612c23.958-8.706 47.896-8.706 72.932 0 10.882 5.45 20.682 10.882 29.386 19.608 18.51 106.674-3.25 202.44-67.484 291.684l-215.516 84.908 18.51 45.724 3.796 10.046c-38.476 11.088-78.314 17.394-118.348 17.394-26.792 0-53.666-2.824-80.29-8.932z" />
<glyph unicode="&#xe901;" glyph-name="plugins" d="M897.282 293.888v-154.112c0-42.558-34.5-77.056-77.056-77.056h-154.112v77.056c0 42.558-34.5 77.056-77.056 77.056s-77.058-34.5-77.058-77.058v-77.056h-154.112c-42.558 0-77.056 34.5-77.056 77.056v154.112h-77.056c-42.558 0-77.056 34.5-77.056 77.056s34.498 77.058 77.054 77.058h77.056v154.112c0 42.382 34.676 77.056 77.056 77.056h154.114v77.056c0 42.558 34.5 77.056 77.056 77.056s77.056-34.5 77.056-77.056v-77.056h154.112c42.558 0 77.056-34.5 77.056-77.056v-154.112h-77.056c-42.558 0-77.056-34.5-77.056-77.056s34.5-77.056 77.056-77.056h77.058z" />
<glyph unicode="&#xe902;" glyph-name="themes" d="M916 589.87c0 0.778-404.012 227.964-405.338 227.932-0.638-0.016-92.032-51.178-203.166-113.732s-201.92-113.964-201.816-114.284c0.234-0.716 402.332-232.71 404.32-233.276 1.324-0.378 406 232.22 406 233.36zM510.826 211.050l84.284 47.446c46.326 26.078 119.74 67.412 163.014 91.784 43.344 24.41 90.65 51.024 105.25 59.214 14.586 8.182 26.818 15.152 27.182 15.488 0.792 0.732-17.818 44.822-18.896 44.764-0.456-0.024-81.798-45.486-180.832-101.068l-180.004-101.024-175.238 98.994c-96.382 54.448-175.76 99.188-176.398 99.424-1.326 0.492-29.292-40.106-28.26-41.028 0.364-0.326 86.024-48.626 190.28-107.294l189.618-106.7zM693.068 227.252c-99.118-55.848-180.83-101.73-181.536-101.936-0.706-0.204-36.714 19.272-79.974 43.26-43.284 24.002-122.074 67.702-175.114 97.128s-96.91 53.532-97.502 53.578c-0.596 0.046-7.198-7.708-14.752-17.32-10.224-13.012-13.424-17.646-12.68-18.362 1.574-1.518 378.19-213.272 379.316-213.272 1.574 0 383.58 213.258 383.6 214.148 0.024 1.078-20.18 44.396-20.692 44.364-0.228-0.014-81.548-45.74-180.666-101.588z" />
</font></defs></svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,34 @@
@font-face {
font-family: 'icomoon';
src: url('/Plugins/NopStation.Core/contents/fonts/icomoon.eot?h5ssf6');
src: url('/Plugins/NopStation.Core/contents/fonts/icomoon.eot?h5ssf6#iefix') format('embedded-opentype'), url('/Plugins/NopStation.Core/contents/fonts/icomoon.ttf?h5ssf6') format('truetype'), url('/Plugins/NopStation.Core/contents/fonts/icomoon.woff?h5ssf6') format('woff'), url('/Plugins/NopStation.Core/contents/fonts/icomoon.svg?h5ssf6#icomoon') format('svg');
font-weight: normal;
font-style: normal;
font-display: block;
}
[class^="icon-"], [class*=" icon-"] {
/* use !important to prevent issues with browser extensions that change fonts */
font-family: 'icomoon' !important;
speak: never;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
line-height: 1;
/* Better Font Rendering =========== */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-nop-station:before {
content: "\e900";
}
.icon-plugins:before {
content: "\e901";
}
.icon-themes:before {
content: "\e902";
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

@ -0,0 +1,13 @@
{
"Group": "Nop-Station",
"FriendlyName": "Nop-Station Core",
"SystemName": "NopStation.Core",
"Version": "4.80.1.0",
"SupportedVersions": [
"4.80"
],
"Author": "Nop-Station Team",
"DisplayOrder": -100,
"FileName": "NopStation.Plugin.Misc.Core.dll",
"Description": "This plugin is used to manage Nop-Station plugins."
}

View File

@ -0,0 +1,42 @@
@model ConfigurationModel
@{
Layout = "_AdminLayout";
NopHtml.SetActiveMenuItemSystemName("CarHaven.Configuration");
ViewBag.PageTitle = T("Admin.NopStation.Theme.CarHaven.Configuration").Text;
var customer = await workContext.GetCurrentCustomerAsync();
const string hideColorBlockAttributeName = "CarHavenConfigurationPage.HideColorBlock";
var hideColorBlock = await genericAttributeService.GetAttributeAsync<bool>(customer, hideColorBlockAttributeName, defaultValue: true);
const string hideGeneralBlockAttributeName = "CarHavenConfigurationPage.HideGeneralBlock";
var hideGeneralBlock = await genericAttributeService.GetAttributeAsync<bool>(customer, hideGeneralBlockAttributeName, defaultValue: true);
}
<form asp-controller="CarHaven" asp-action="Configure" method="post">
<div class="content-header clearfix">
<h1 class="float-left">
@T("Admin.NopStation.Theme.CarHaven.Configuration")
</h1>
<div class="float-right">
<button type="submit" name="save" class="btn btn-primary">
<i class="far fa-save"></i>
@T("Admin.Common.Save")
</button>
</div>
</div>
<section class="content">
<div class="container-fluid">
<div class="form-horizontal">
@await Component.InvokeAsync(typeof(StoreScopeConfigurationViewComponent))
<div asp-validation-summary="All"></div>
<nop-cards id="CarHaven-panels">
<nop-card asp-name="CarHaven-color" asp-icon="fas fa-palette" asp-title="@T("Admin.NopStation.Theme.CarHaven.Configuration.TabTitle.Color")" asp-hide-block-attribute-name="@hideColorBlockAttributeName" asp-hide="@hideColorBlock" asp-advanced="true">@await Html.PartialAsync("_Configure.Color", Model)</nop-card>
<nop-card asp-name="CarHaven-info" asp-icon="fas fa-info" asp-title="@T("Admin.NopStation.Theme.CarHaven.Configuration.TabTitle.General")" asp-hide-block-attribute-name="@hideGeneralBlockAttributeName" asp-hide="@hideGeneralBlock" asp-advanced="true">@await Html.PartialAsync("_Configure.General", Model)</nop-card>
</nop-cards>
</div>
</div>
</section>
</form>

View File

@ -0,0 +1,42 @@
@model ConfigurationModel
@{
NopHtml.AddCssFileParts("/lib_npm/farbstastic/farbtastic.css", "");
NopHtml.AddScriptParts(ResourceLocation.Footer, "/lib_npm/farbstastic/farbtastic.min.js");
}
<div class="card-body">
<div class="form-group row">
<div class="col-md-3">
<nop-override-store-checkbox asp-for="PrimaryThemeColor_OverrideForStore" asp-input="PrimaryThemeColor" asp-store-scope="@Model.ActiveStoreScopeConfiguration" />
<nop-label asp-for="PrimaryThemeColor" />
</div>
<div class="col-md-9">
<nop-editor asp-for="PrimaryThemeColor" readonly />
<div id="primary-color-picker"></div>
<script asp-location="Footer">
$(document).ready(function () {
$('#primary-color-picker').farbtastic('#@Html.IdFor(model => model.PrimaryThemeColor)');
});
</script>
<span asp-validation-for="PrimaryThemeColor"></span>
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-override-store-checkbox asp-for="SecondaryThemeColor_OverrideForStore" asp-input="SecondaryThemeColor" asp-store-scope="@Model.ActiveStoreScopeConfiguration" />
<nop-label asp-for="SecondaryThemeColor" />
</div>
<div class="col-md-9">
<nop-editor asp-for="SecondaryThemeColor" readonly />
<div id="secondary-color-picker"></div>
<script asp-location="Footer">
$(document).ready(function () {
$('#secondary-color-picker').farbtastic('#@Html.IdFor(model => model.SecondaryThemeColor)');
});
</script>
<span asp-validation-for="SecondaryThemeColor"></span>
</div>
</div>
</div>

View File

@ -0,0 +1,53 @@
@model ConfigurationModel
<div class="card-body">
<div class="form-group row">
<div class="col-md-3">
<nop-override-store-checkbox asp-for="HideDesignedByNopStationAtFooter_OverrideForStore" asp-input="HideDesignedByNopStationAtFooter" asp-store-scope="@Model.ActiveStoreScopeConfiguration" />
<nop-label asp-for="HideDesignedByNopStationAtFooter" />
</div>
<div class="col-md-9">
<nop-editor asp-for="HideDesignedByNopStationAtFooter" />
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-override-store-checkbox asp-for="HeaderLogoPictureId_OverrideForStore" asp-input="HeaderLogoPictureId" asp-store-scope="@Model.ActiveStoreScopeConfiguration" />
<nop-label asp-for="HeaderLogoPictureId" />
</div>
<div class="col-md-9">
<nop-editor asp-for="HeaderLogoPictureId" />
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-override-store-checkbox asp-for="ShowSupportedCardsAtFooter_OverrideForStore" asp-input="ShowSupportedCardsAtFooter" asp-store-scope="@Model.ActiveStoreScopeConfiguration" />
<nop-label asp-for="ShowSupportedCardsAtFooter" />
</div>
<div class="col-md-9">
<nop-editor asp-for="ShowSupportedCardsAtFooter" />
</div>
</div>
<nop-nested-setting asp-for="ShowSupportedCardsAtFooter">
<div class="form-group row">
<div class="col-md-3">
<nop-override-store-checkbox asp-for="FooterSupportedCardsPictureId_OverrideForStore" asp-input="FooterSupportedCardsPictureId" asp-store-scope="@Model.ActiveStoreScopeConfiguration" />
<nop-label asp-for="FooterSupportedCardsPictureId" />
</div>
<div class="col-md-9">
<nop-editor asp-for="FooterSupportedCardsPictureId" />
</div>
</div>
</nop-nested-setting>
<div class="form-group row">
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-override-store-checkbox asp-for="CustomCss_OverrideForStore" asp-input="CustomCss" asp-store-scope="@Model.ActiveStoreScopeConfiguration" />
<nop-label asp-for="CustomCss" />
</div>
<div class="col-md-9">
<nop-textarea asp-for="CustomCss" rows="10"></nop-textarea>
</div>
</div>
</div>

View File

@ -0,0 +1,21 @@
@inherits Nop.Web.Framework.Mvc.Razor.NopRazorPage<TModel>
@inject Nop.Services.Common.IGenericAttributeService genericAttributeService
@inject Nop.Core.IWorkContext workContext
@inject INopHtmlHelper NopHtml
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, Nop.Web.Framework
@using Microsoft.AspNetCore.Mvc.Rendering
@using Microsoft.AspNetCore.Mvc.ViewFeatures
@using Microsoft.AspNetCore.Routing
@using Nop.Core.Domain.Common
@using Nop.Core.Infrastructure
@using Nop.Services.Events
@using Nop.Web.Areas.Admin.Components
@using Nop.Web.Framework.Events
@using Nop.Web.Framework.Extensions
@using Nop.Web.Framework.Infrastructure
@using Nop.Web.Framework.Models.DataTables
@using Nop.Web.Framework.UI
@using NopStation.Plugin.Theme.CarHaven.Areas.Admin.Models
@using System.Text.Encodings.Web

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,23 @@
@inherits Nop.Web.Framework.Mvc.Razor.NopRazorPage<TModel>
@inject Nop.Services.Common.IGenericAttributeService genericAttributeService
@inject Nop.Core.IWorkContext workContext
@inject INopHtmlHelper NopHtml
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, Nop.Web.Framework
@addTagHelper *, NopStation.Plugin.Misc.Actions
@using Microsoft.AspNetCore.Mvc.Rendering
@using Microsoft.AspNetCore.Mvc.ViewFeatures
@using Microsoft.AspNetCore.Routing
@using Nop.Core.Domain.Common
@using Nop.Core.Infrastructure
@using Nop.Services.Events
@using Nop.Web.Framework.Events
@using Nop.Web.Framework.Extensions
@using Nop.Web.Framework.Infrastructure
@using Nop.Web.Framework.Models.DataTables
@using Nop.Web.Framework.UI
@using Nop.Web.Models.Customer
@using NopStation.Plugin.Theme.CarHaven
@using NopStation.Plugin.Theme.CarHaven.Models
@using System.Text.Encodings.Web

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

@ -0,0 +1,12 @@
{
"Group": "Nop-Station",
"FriendlyName": "Nop-Station CarHaven Theme",
"SystemName": "NopStation.Plugin.Theme.CarHaven",
"Version": "4.80.1.0",
"SupportedVersions": [ "4.80" ],
"Author": "Nop-Station Team",
"DisplayOrder": 1,
"FileName": "NopStation.Plugin.Theme.CarHaven.dll",
"Description": "This plugin allows to configure NopStation Car Haven theme.",
"DependsOnSystemNames": [ "NopStation.Core" ]
}

View File

@ -0,0 +1 @@
4.80.1.0: Initial release

View File

@ -0,0 +1,126 @@
@model ConfigurationModel
@{
Layout = "_AdminLayout";
NopHtml.SetActiveMenuItemSystemName("CategoryBanner.Configure");
ViewBag.PageTitle = T("Admin.NopStation.CategoryBanners.Configuration").Text;
}
<script>
$(document).ready(function() {
$("#@Html.IdFor(model => model.AutoPlay)").change(toggleAutoPlay);
toggleAutoPlay();
});
function toggleAutoPlay() {
if ($('#@Html.IdFor(model => model.AutoPlay)').is(':checked')) {
$('#pnlAutoPlay').show();
} else {
$('#pnlAutoPlay').hide();
}
}
</script>
<form asp-controller="CategoryBanner" asp-action="Configure" method="post">
<div class="content-header clearfix">
<h1 class="float-left">
@T("Admin.NopStation.CategoryBanners.Configuration")
</h1>
<div class="float-right">
<button type="submit" name="save" class="btn btn-primary">
<i class="far fa-save"></i>
@T("Admin.Common.Save")
</button>
</div>
</div>
<section class="content">
<div class="container-fluid">
<div class="form-horizontal">
@await Component.InvokeAsync("StoreScopeConfiguration")
<div asp-validation-summary="All"></div>
<div class="cards-group">
<div class="card card-default">
<div class="card-body">
<div class="form-group row">
<div class="col-md-3">
<nop-override-store-checkbox asp-for="HideInPublicStore_OverrideForStore" asp-input="HideInPublicStore" asp-store-scope="@Model.ActiveStoreScopeConfiguration" />
<nop-label asp-for="HideInPublicStore" />
</div>
<div class="col-md-9">
<nop-editor asp-for="HideInPublicStore" />
<span asp-validation-for="HideInPublicStore"></span>
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-override-store-checkbox asp-for="BannerPictureSize_OverrideForStore" asp-input="BannerPictureSize" asp-store-scope="@Model.ActiveStoreScopeConfiguration" />
<nop-label asp-for="BannerPictureSize" />
</div>
<div class="col-md-9">
<nop-editor asp-for="BannerPictureSize" />
<span asp-validation-for="BannerPictureSize"></span>
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-override-store-checkbox asp-for="Loop_OverrideForStore" asp-input="Loop" asp-store-scope="@Model.ActiveStoreScopeConfiguration" />
<nop-label asp-for="Loop" />
</div>
<div class="col-md-9">
<nop-editor asp-for="Loop" />
<span asp-validation-for="Loop"></span>
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-override-store-checkbox asp-for="Nav_OverrideForStore" asp-input="Nav" asp-store-scope="@Model.ActiveStoreScopeConfiguration" />
<nop-label asp-for="Nav" />
</div>
<div class="col-md-9">
<nop-editor asp-for="Nav" />
<span asp-validation-for="Nav"></span>
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-override-store-checkbox asp-for="AutoPlay_OverrideForStore" asp-input="AutoPlay" asp-store-scope="@Model.ActiveStoreScopeConfiguration" />
<nop-label asp-for="AutoPlay" />
</div>
<div class="col-md-9">
<nop-editor asp-for="AutoPlay" />
<span asp-validation-for="AutoPlay"></span>
</div>
</div>
<nop-nested-setting asp-for="AutoPlay">
<div id="pnlAutoPlay">
<div class="form-group row">
<div class="col-md-3">
<nop-override-store-checkbox asp-for="AutoPlayTimeout_OverrideForStore" asp-input="AutoPlayTimeout" asp-store-scope="@Model.ActiveStoreScopeConfiguration" />
<nop-label asp-for="AutoPlayTimeout" />
</div>
<div class="col-md-9">
<nop-editor asp-for="AutoPlayTimeout" />
<span asp-validation-for="AutoPlayTimeout"></span>
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-override-store-checkbox asp-for="AutoPlayHoverPause_OverrideForStore" asp-input="AutoPlayHoverPause" asp-store-scope="@Model.ActiveStoreScopeConfiguration" />
<nop-label asp-for="AutoPlayHoverPause" />
</div>
<div class="col-md-9">
<nop-editor asp-for="AutoPlayHoverPause" />
<span asp-validation-for="AutoPlayHoverPause"></span>
</div>
</div>
</div>
</nop-nested-setting>
</div>
</div>
</div>
</div>
</div>
</section>
</form>

View File

@ -0,0 +1,8 @@
@model CategoryBannerSearchModel
@{
const string hideCategoryBannerBlockAttributeName = "CategoryBannerPage.HideCategoryBannerBlock";
var hideCategoryBannerBlock = await genericAttributeService.GetAttributeAsync<bool>(await workContext.GetCurrentCustomerAsync(), hideCategoryBannerBlockAttributeName);
}
<nop-card asp-name="category-banners" asp-icon="far fa-images" asp-title="@T("Admin.NopStation.CategoryBanners.Tab.Banners")" asp-hide-block-attribute-name="@hideCategoryBannerBlockAttributeName" asp-hide="@hideCategoryBannerBlock" asp-advanced="true">@await Html.PartialAsync("_Banners.cshtml", Model)</nop-card>

View File

@ -0,0 +1,192 @@
@model CategoryBannerSearchModel
<div class="card-body">
@if (Model.CategoryId > 0)
{
<div class="sub-panel">
@await Html.PartialAsync("Table", new DataTablesModel
{
Name = "category-banner-grid",
UrlRead = new DataUrl("CategoryBannerList", "CategoryBanner", new RouteValueDictionary { [nameof(Model.CategoryId)] = Model.CategoryId}),
UrlDelete = new DataUrl("CategoryBannerDelete", "CategoryBanner", null),
UrlUpdate = new DataUrl("CategoryBannerUpdate", "CategoryBanner", null),
Length = Model.PageSize,
LengthMenu = Model.AvailablePageSizes,
ColumnCollection = new List<ColumnProperty>
{
new ColumnProperty(nameof(CategoryBannerModel.PictureUrl))
{
Title = T("Admin.NopStation.CategoryBanners.CategoryBanners.Fields.Picture").Text,
Render = new RenderCustom("renderPicturesColumnProductPictureUrl")
},
new ColumnProperty(nameof(CategoryBannerModel.DisplayOrder))
{
Title = T("Admin.NopStation.CategoryBanners.CategoryBanners.Fields.DisplayOrder").Text,
Width = "150",
ClassName = NopColumnClassDefaults.CenterAll,
Editable = true,
EditType = EditType.Number
},
new ColumnProperty(nameof(CategoryBannerModel.OverrideAltAttribute))
{
Title = T("Admin.NopStation.CategoryBanners.CategoryBanners.Fields.OverrideAltAttribute").Text,
Width = "200",
Editable = true,
EditType = EditType.String
},
new ColumnProperty(nameof(CategoryBannerModel.OverrideTitleAttribute))
{
Title = T("Admin.NopStation.CategoryBanners.CategoryBanners.Fields.OverrideTitleAttribute").Text,
Width = "200",
Editable = true,
EditType = EditType.String
},
new ColumnProperty(nameof(CategoryBannerModel.ForMobile))
{
Title = T("Admin.NopStation.CategoryBanners.CategoryBanners.Fields.ForMobile").Text,
Width = "100",
Editable = true,
Render = new RenderBoolean(),
ClassName = NopColumnClassDefaults.CenterAll,
EditType = EditType.Checkbox
},
new ColumnProperty(nameof(CategoryBannerModel.Id))
{
Title = T("Admin.Common.Edit").Text,
Width = "200",
ClassName = NopColumnClassDefaults.Button,
Render = new RenderButtonsInlineEdit()
},
new ColumnProperty(nameof(CategoryBannerModel.Id))
{
Title = T("Admin.Common.Delete").Text,
Width = "100",
Render = new RenderButtonRemove(T("Admin.Common.Delete").Text),
ClassName = NopColumnClassDefaults.Button
}
}
})
<script>
function renderPicturesColumnProductPictureUrl(data, type, row, meta) {
return '<a href="' + row.PictureUrl + '" target="_blank"><img alt="' + row.PictureId + '" src="' + row.PictureUrl + '" width="150" /></a>';
}
</script>
</div>
<div class="card card-default">
<div class="card-header">
@T("Admin.NopStation.CategoryBanners.AddNew")
</div>
<div class="card-body">
<script>
$(document).ready(function() {
$('#saveBanner').click(function() {
var pictureId = $("#@Html.IdFor(model => model.CategoryBanner.PictureId)").val();
var displayOrder = $("#@Html.IdFor(model => model.CategoryBanner.DisplayOrder)").val();
var overrideAltAttribute = $("#@Html.IdFor(model => model.CategoryBanner.OverrideAltAttribute)").val();
var overrideTitleAttribute = $("#@Html.IdFor(model => model.CategoryBanner.OverrideTitleAttribute)").val();
var forMobile = $("#@Html.IdFor(model => model.CategoryBanner.ForMobile)").is(':checked');
if (pictureId == 0) {
$("#addProductPictureAlert").click();
return;
}
$('#saveBanner').attr('disabled', true);
var postData = {
PictureId: pictureId,
DisplayOrder: displayOrder,
CategoryId: '@Model.CategoryId',
ForMobile: forMobile,
OverrideAltAttribute: overrideAltAttribute,
OverrideTitleAttribute: overrideTitleAttribute
};
addAntiForgeryToken(postData);
$.ajax({
cache: false,
type: "POST",
url: "@(Url.Action("CreateBanner", "CategoryBanner"))",
data: postData,
success: function (data) {
if (!data.Result) {
return;
}
updateTable('#category-banner-grid');
},
error: function (jqXHR, textStatus, errorThrown) {
$("#categoryBannerAddAlert").click();
},
complete: function (jqXHR, textStatus) {
$('#saveBanner').attr('disabled', false);
}
});
});
});
</script>
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="CategoryBanner.PictureId" />
</div>
<div class="col-md-9">
<nop-editor asp-for="CategoryBanner.PictureId" />
<span asp-validation-for="CategoryBanner.PictureId"></span>
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="CategoryBanner.OverrideTitleAttribute" />
</div>
<div class="col-md-9">
<nop-editor asp-for="CategoryBanner.OverrideTitleAttribute" />
<span asp-validation-for="CategoryBanner.OverrideTitleAttribute"></span>
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="CategoryBanner.OverrideAltAttribute" />
</div>
<div class="col-md-9">
<nop-editor asp-for="CategoryBanner.OverrideAltAttribute" />
<span asp-validation-for="CategoryBanner.OverrideAltAttribute"></span>
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="CategoryBanner.DisplayOrder" />
</div>
<div class="col-md-9">
<nop-editor asp-for="CategoryBanner.DisplayOrder" />
<span asp-validation-for="CategoryBanner.DisplayOrder"></span>
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="CategoryBanner.ForMobile" />
</div>
<div class="col-md-9">
<nop-editor asp-for="CategoryBanner.ForMobile" />
<span asp-validation-for="CategoryBanner.ForMobile"></span>
</div>
</div>
<div class="form-group row">
<div class="col-md-9 col-md-offset-3">
<button type="button" id="saveBanner" class="btn btn-primary">@T("Admin.NopStation.CategoryBanners.AddButton")</button>
</div>
</div>
</div>
</div>
}
else
{
<div class="card card-default">
<div class="card-body">
@T("Admin.NopStation.CategoryBanners.SaveBeforeEdit")
</div>
</div>
}
</div>
<nop-alert asp-alert-id="addCategoryBannerAlert" asp-alert-message="@T("Admin.NopStation.CategoryBanners.Alert.AddNew")" />
<nop-alert asp-alert-id="categoryBannerAddAlert" asp-alert-message="@T("Admin.NopStation.CategoryBanners.Alert.BannerAdd")" />

View File

@ -0,0 +1,19 @@
@inherits Nop.Web.Framework.Mvc.Razor.NopRazorPage<TModel>
@inject Nop.Services.Common.IGenericAttributeService genericAttributeService
@inject Nop.Core.IWorkContext workContext
@inject INopHtmlHelper NopHtml
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, Nop.Web.Framework
@addTagHelper *, NopStation.Plugin.Misc.Actions
@using Microsoft.AspNetCore.Mvc.ViewFeatures
@using Nop.Web.Framework.UI
@using Nop.Web.Framework.Extensions
@using System.Text.Encodings.Web
@using Nop.Services.Events
@using Nop.Web.Framework.Events
@using NopStation.Plugin.Widgets.CategoryBanners.Areas.Admin.Models
@using Nop.Core.Domain.Common
@using Nop.Web.Framework.Models.DataTables
@using Microsoft.AspNetCore.Routing
@using Microsoft.AspNetCore.Mvc.Rendering
@using Nop.Core.Infrastructure

View File

@ -0,0 +1,3 @@
@{
Layout = "_AdminLayout";
}

View File

@ -0,0 +1,186 @@
/**
* Owl Carousel v2.3.4
* Copyright 2013-2018 David Deutsch
* Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
*/
/*
* Owl Carousel - Core
*/
.owl-carousel {
display: none;
width: 100%;
-webkit-tap-highlight-color: transparent;
/* position relative and z-index fix webkit rendering fonts issue */
position: relative;
z-index: 1; }
.owl-carousel .owl-stage {
position: relative;
-ms-touch-action: pan-Y;
touch-action: manipulation;
-moz-backface-visibility: hidden;
/* fix firefox animation glitch */ }
.owl-carousel .owl-stage:after {
content: ".";
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0; }
.owl-carousel .owl-stage-outer {
position: relative;
overflow: hidden;
/* fix for flashing background */
-webkit-transform: translate3d(0px, 0px, 0px); }
.owl-carousel .owl-wrapper,
.owl-carousel .owl-item {
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0); }
.owl-carousel .owl-item {
position: relative;
min-height: 1px;
float: left;
-webkit-backface-visibility: hidden;
-webkit-tap-highlight-color: transparent;
-webkit-touch-callout: none; }
.owl-carousel .owl-item img {
display: block;
width: 100%; }
.owl-carousel .owl-nav.disabled,
.owl-carousel .owl-dots.disabled {
display: none; }
.owl-carousel .owl-nav .owl-prev,
.owl-carousel .owl-nav .owl-next,
.owl-carousel .owl-dot {
cursor: pointer;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none; }
.owl-carousel .owl-nav button.owl-prev,
.owl-carousel .owl-nav button.owl-next,
.owl-carousel button.owl-dot {
background: none;
color: inherit;
border: none;
padding: 0 !important;
font: inherit; }
.owl-carousel.owl-loaded {
display: block; }
.owl-carousel.owl-loading {
opacity: 0;
display: block; }
.owl-carousel.owl-hidden {
opacity: 0; }
.owl-carousel.owl-refresh .owl-item {
visibility: hidden; }
.owl-carousel.owl-drag .owl-item {
-ms-touch-action: pan-y;
touch-action: pan-y;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none; }
.owl-carousel.owl-grab {
cursor: move;
cursor: grab; }
.owl-carousel.owl-rtl {
direction: rtl; }
.owl-carousel.owl-rtl .owl-item {
float: right; }
/* No Js */
.no-js .owl-carousel {
display: block; }
/*
* Owl Carousel - Animate Plugin
*/
.owl-carousel .animated {
animation-duration: 1000ms;
animation-fill-mode: both; }
.owl-carousel .owl-animated-in {
z-index: 0; }
.owl-carousel .owl-animated-out {
z-index: 1; }
.owl-carousel .fadeOut {
animation-name: fadeOut; }
@keyframes fadeOut {
0% {
opacity: 1; }
100% {
opacity: 0; } }
/*
* Owl Carousel - Auto Height Plugin
*/
.owl-height {
transition: height 500ms ease-in-out; }
/*
* Owl Carousel - Lazy Load Plugin
*/
.owl-carousel .owl-item {
/**
This is introduced due to a bug in IE11 where lazy loading combined with autoheight plugin causes a wrong
calculation of the height of the owl-item that breaks page layouts
*/ }
.owl-carousel .owl-item .owl-lazy {
opacity: 0;
transition: opacity 400ms ease; }
.owl-carousel .owl-item .owl-lazy[src^=""], .owl-carousel .owl-item .owl-lazy:not([src]) {
max-height: 0; }
.owl-carousel .owl-item img.owl-lazy {
transform-style: preserve-3d; }
/*
* Owl Carousel - Video Plugin
*/
.owl-carousel .owl-video-wrapper {
position: relative;
height: 100%;
background: #000; }
.owl-carousel .owl-video-play-icon {
position: absolute;
height: 80px;
width: 80px;
left: 50%;
top: 50%;
margin-left: -40px;
margin-top: -40px;
background: url("owl.video.play.png") no-repeat;
cursor: pointer;
z-index: 1;
-webkit-backface-visibility: hidden;
transition: transform 100ms ease; }
.owl-carousel .owl-video-play-icon:hover {
-ms-transform: scale(1.3, 1.3);
transform: scale(1.3, 1.3); }
.owl-carousel .owl-video-playing .owl-video-tn,
.owl-carousel .owl-video-playing .owl-video-play-icon {
display: none; }
.owl-carousel .owl-video-tn {
opacity: 0;
height: 100%;
background-position: center center;
background-repeat: no-repeat;
background-size: contain;
transition: opacity 400ms ease; }
.owl-carousel .owl-video-frame {
position: relative;
z-index: 1;
height: 100%;
width: 100%; }

View File

@ -0,0 +1,6 @@
/**
* Owl Carousel v2.3.4
* Copyright 2013-2018 David Deutsch
* Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
*/
.owl-theme .owl-dots,.owl-theme .owl-nav{text-align:center;-webkit-tap-highlight-color:transparent}.owl-theme .owl-nav{margin-top:10px}.owl-theme .owl-nav [class*=owl-]{color:#FFF;font-size:14px;margin:5px;padding:4px 7px;background:#D6D6D6;display:inline-block;cursor:pointer;border-radius:3px}.owl-theme .owl-nav [class*=owl-]:hover{background:#4DC7A0;color:#FFF;text-decoration:none}.owl-theme .owl-nav .disabled{opacity:.5;cursor:default}.owl-theme .owl-nav.disabled+.owl-dots{margin-top:10px}.owl-theme .owl-dots .owl-dot{display:inline-block;zoom:1}.owl-theme .owl-dots .owl-dot span{width:10px;height:10px;margin:5px 7px;background:#D6D6D6;display:block;-webkit-backface-visibility:visible;transition:opacity .2s ease;border-radius:30px}.owl-theme .owl-dots .owl-dot.active span,.owl-theme .owl-dots .owl-dot:hover span{background:#4DC7A0}

View File

@ -0,0 +1,253 @@
/**
* Owl Carousel v2.3.4
* Copyright 2013-2018 David Deutsch
* Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
*/
/*
* Owl Carousel - Core
*/
.owl-carousel {
display: none;
width: 100%;
-webkit-tap-highlight-color: transparent;
/* position relative and z-index fix webkit rendering fonts issue */
position: relative;
z-index: 1;
}
.owl-carousel .owl-stage {
position: relative;
-ms-touch-action: pan-Y;
touch-action: manipulation;
-moz-backface-visibility: hidden;
/* fix firefox animation glitch */
}
.owl-carousel .owl-stage:after {
content: ".";
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0;
}
.owl-carousel .owl-stage-outer {
position: relative;
overflow: hidden;
/* fix for flashing background */
-webkit-transform: translate3d(0px, 0px, 0px);
}
.owl-carousel .owl-wrapper,
.owl-carousel .owl-item {
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
}
.owl-carousel .owl-item {
position: relative;
min-height: 1px;
float: left;
-webkit-backface-visibility: hidden;
-webkit-tap-highlight-color: transparent;
-webkit-touch-callout: none;
}
.owl-carousel .owl-item img {
display: block;
width: 100%;
}
.owl-carousel .owl-nav.disabled,
.owl-carousel .owl-dots.disabled {
display: none;
}
.owl-carousel .owl-nav .owl-prev,
.owl-carousel .owl-nav .owl-next,
.owl-carousel .owl-dot {
cursor: pointer;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.owl-carousel .owl-nav button.owl-prev,
.owl-carousel .owl-nav button.owl-next,
.owl-carousel button.owl-dot {
background: none;
color: inherit;
border: none;
padding: 0 !important;
font: inherit;
}
.owl-carousel.owl-loaded {
display: block;
}
.owl-carousel.owl-loading {
opacity: 0;
display: block;
}
.owl-carousel.owl-hidden {
opacity: 0;
}
.owl-carousel.owl-refresh .owl-item {
visibility: hidden;
}
.owl-carousel.owl-drag .owl-item {
-ms-touch-action: pan-y;
touch-action: pan-y;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.owl-carousel.owl-grab {
cursor: move;
cursor: grab;
}
.owl-carousel.owl-rtl {
direction: rtl;
}
.owl-carousel.owl-rtl .owl-item {
float: right;
}
/* No Js */
.no-js .owl-carousel {
display: block;
}
/*
* Owl Carousel - Animate Plugin
*/
.owl-carousel .animated {
animation-duration: 1000ms;
animation-fill-mode: both;
}
.owl-carousel .owl-animated-in {
z-index: 0;
}
.owl-carousel .owl-animated-out {
z-index: 1;
}
.owl-carousel .fadeOut {
animation-name: fadeOut;
}
@keyframes fadeOut {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
/*
* Owl Carousel - Auto Height Plugin
*/
.owl-height {
transition: height 500ms ease-in-out;
}
/*
* Owl Carousel - Lazy Load Plugin
*/
.owl-carousel .owl-item {
/**
This is introduced due to a bug in IE11 where lazy loading combined with autoheight plugin causes a wrong
calculation of the height of the owl-item that breaks page layouts
*/
}
.owl-carousel .owl-item .owl-lazy {
opacity: 0;
transition: opacity 400ms ease;
}
.owl-carousel .owl-item .owl-lazy[src^=""], .owl-carousel .owl-item .owl-lazy:not([src]) {
max-height: 0;
}
.owl-carousel .owl-item img.owl-lazy {
transform-style: preserve-3d;
}
/*
* Owl Carousel - Video Plugin
*/
.owl-carousel .owl-video-wrapper {
position: relative;
height: 100%;
background: #000;
}
.owl-carousel .owl-video-play-icon {
position: absolute;
height: 80px;
width: 80px;
left: 50%;
top: 50%;
margin-left: -40px;
margin-top: -40px;
background: url("owl.video.play.png") no-repeat;
cursor: pointer;
z-index: 1;
-webkit-backface-visibility: hidden;
transition: transform 100ms ease;
}
.owl-carousel .owl-video-play-icon:hover {
-ms-transform: scale(1.3, 1.3);
transform: scale(1.3, 1.3);
}
.owl-carousel .owl-video-playing .owl-video-tn,
.owl-carousel .owl-video-playing .owl-video-play-icon {
display: none;
}
.owl-carousel .owl-video-tn {
opacity: 0;
height: 100%;
background-position: center center;
background-repeat: no-repeat;
background-size: contain;
transition: opacity 400ms ease;
}
.owl-carousel .owl-video-frame {
position: relative;
z-index: 1;
height: 100%;
width: 100%;
}
.owl-carousel,
.bx-wrapper {
direction: ltr;
}
.owl-carousel .owl-item {
direction: rtl;
}

View File

@ -0,0 +1,6 @@
/**
* Owl Carousel v2.3.4
* Copyright 2013-2018 David Deutsch
* Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
*/
.owl-theme .owl-dots,.owl-theme .owl-nav{text-align:center;-webkit-tap-highlight-color:transparent}.owl-theme .owl-nav{margin-top:10px}.owl-theme .owl-nav [class*=owl-]{color:#FFF;font-size:14px;margin:5px;padding:4px 7px;background:#D6D6D6;display:inline-block;cursor:pointer;border-radius:3px}.owl-theme .owl-nav [class*=owl-]:hover{background:#4DC7A0;color:#FFF;text-decoration:none}.owl-theme .owl-nav .disabled{opacity:.5;cursor:default}.owl-theme .owl-nav.disabled+.owl-dots{margin-top:10px}.owl-theme .owl-dots .owl-dot{display:inline-block;zoom:1}.owl-theme .owl-dots .owl-dot span{width:10px;height:10px;margin:5px 7px;background:#D6D6D6;display:block;-webkit-backface-visibility:visible;transition:opacity .2s ease;border-radius:30px}.owl-theme .owl-dots .owl-dot.active span,.owl-theme .owl-dots .owl-dot:hover span{background:#4DC7A0}

View File

@ -0,0 +1,36 @@
.category-banner {
width: 100%;
margin-bottom: 25px;
}
.category-banner img {
width: 100%;
}
.category-banner .owl-nav button.owl-prev,
.category-banner .owl-nav button.owl-next {
border: 1px solid #ccc;
padding: 0 10px !important;
background-color: #eee;
font-size: 23px;
position: absolute;
margin: 0;
}
.category-banner .owl-nav button.owl-prev {
left: 0;
}
.category-banner .owl-nav button.owl-next {
right: 0;
}
.category-banner .owl-nav {
position: absolute;
top: 30%;
width: 100%;
}
.category-banner .owl-dots {
display: none;
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,57 @@
@model CategoryBannerModel
@inject Nop.Core.IWorkContext workContext
@if (Model.Banners.Any())
{
NopHtml.AppendCssFileParts( "/Plugins/NopStation.Plugin.Widgets.CategoryBanners/Contents/css/styles.css", string.Empty);
var supportRtl = workContext.GetWorkingLanguageAsync().Result.Rtl;
if (Model.Banners.Count > 1)
{
<script asp-exclude-from-bundle="true" asp-location="Footer" src= "~/Plugins/NopStation.Plugin.Widgets.CategoryBanners/Contents/script/owl.carousel.min.js" ></script>
if (supportRtl)
{
NopHtml.AppendCssFileParts("/Plugins/NopStation.Plugin.Widgets.CategoryBanners/Contents/css/rtl/owl.theme.green.min.css", string.Empty);
NopHtml.AppendCssFileParts("/Plugins/NopStation.Plugin.Widgets.CategoryBanners/Contents/css/rtl/owl.carousel.css", string.Empty);
}
else
{
NopHtml.AppendCssFileParts("/Plugins/NopStation.Plugin.Widgets.CategoryBanners/Contents/css/owl.theme.green.min.css", string.Empty);
NopHtml.AppendCssFileParts("/Plugins/NopStation.Plugin.Widgets.CategoryBanners/Contents/css/owl.carousel.css", string.Empty);
}
<div class="category-banner owl-carousel owl-theme" id="category-banner-@Model.Id">
@foreach (var banner in Model.Banners)
{
<div class="banner-slider-item">
<img alt="@banner.AlternateText" src="@banner.ImageUrl" title="@banner.Title" />
</div>
}
</div>
<script asp-exclude-from-bundle="true" asp-location="Footer">
$(document).ready(function () {
$('#category-banner-@Model.Id').owlCarousel({
nav: @Model.Nav.ToString().ToLower(),
loop: @Model.Loop.ToString().ToLower(),
dots: true,
autoplay: @Model.AutoPlay.ToString().ToLower(),
rtl: @supportRtl.ToString().ToLower(),
autoplayTimeout: @Model.AutoPlayTimeout,
autoplayHoverPause: @Model.AutoPlayHoverPause.ToString().ToLower(),
responsive: {
0: {
items: 1
}
}
});
});
</script>
}
else
{
<div class="category-banner" id="category-banner-@Model.Id">
<img src="@Model.Banners[0].ImageUrl" alt="@Model.Banners[0].AlternateText" title="@Model.Banners[0].Title" />
</div>
}
}

View File

@ -0,0 +1,13 @@
@inherits Nop.Web.Framework.Mvc.Razor.NopRazorPage<TModel>
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, Nop.Web.Framework
@inject INopHtmlHelper NopHtml
@using Microsoft.AspNetCore.Mvc.ViewFeatures
@using Nop.Web.Framework.UI
@using Nop.Web.Framework.Extensions
@using System.Text.Encodings.Web
@using Nop.Services.Events
@using Nop.Web.Framework.Events
@using NopStation.Plugin.Widgets.CategoryBanners.Models
@using Nop.Web.Framework.Infrastructure

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

View File

@ -0,0 +1,16 @@
{
"Group": "Nop-Station",
"FriendlyName": "Nop-Station Category Banner",
"SystemName": "NopStation.Plugin.Widgets.CategoryBanners",
"Version": "4.80.1.0",
"SupportedVersions": [
"4.80"
],
"Author": "Nop-Station Team",
"DisplayOrder": 1,
"FileName": "NopStation.Plugin.Widgets.CategoryBanners.dll",
"Description": "This plugin allows to display category banner in category details page.",
"DependsOnSystemNames": [
"NopStation.Core"
]
}

View File

@ -0,0 +1,3 @@
4.70.1.0: Version upgrade
4.60.1.0: Version upgrade
4.50.1.0: Initial release

View File

@ -0,0 +1,45 @@
@model ConfigurationModel
@{
NopHtml.SetActiveMenuItemSystemName("WidgetPush.Configure");
ViewBag.PageTitle = T("Admin.NopStation.WidgetPush.Configuration").Text;
}
<form asp-controller="WidgetPush" asp-action="Configure" method="post">
<div class="content-header clearfix">
<h1 class="float-left">
@T("Admin.NopStation.WidgetPush.Configuration")
</h1>
<div class="float-right">
<button type="submit" name="save" class="btn btn-primary">
<i class="far fa-save"></i>
@T("Admin.Common.Save")
</button>
</div>
</div>
<section class="content">
<div class="container-fluid">
<div class="form-horizontal">
@await Component.InvokeAsync(typeof(StoreScopeConfigurationViewComponent))
<div asp-validation-summary="All"></div>
<div class="cards-group">
<div class="card card-default">
<div class="card-body">
<div class="form-group row">
<div class="col-md-4">
<nop-override-store-checkbox asp-for="HideInPublicStore_OverrideForStore" asp-input="HideInPublicStore" asp-store-scope="@Model.ActiveStoreScopeConfiguration" />
<nop-label asp-for="HideInPublicStore" />
</div>
<div class="col-md-8">
<nop-editor asp-for="HideInPublicStore" />
<span asp-validation-for="HideInPublicStore"></span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</form>

View File

@ -0,0 +1,31 @@
@model WidgetPushItemModel
@{
//page title
ViewBag.PageTitle = T("Admin.NopStation.WidgetPush.WidgetPushItems.AddNew").Text;
//active menu item (system name)
NopHtml.SetActiveMenuItemSystemName("WidgetPush.WidgetPushItems");
}
<form asp-controller="WidgetPush" asp-action="Create" method="post">
<div class="content-header clearfix">
<h1 class="float-left">
@T("Admin.NopStation.WidgetPush.WidgetPushItems.AddNew")
<small>
<i class="fas fa-arrow-circle-left"></i>
<a asp-action="List">@T("Admin.NopStation.WidgetPush.WidgetPushItems.BackToList")</a>
</small>
</h1>
<div class="float-right">
<button type="submit" name="save" class="btn btn-primary">
<i class="far fa-save"></i>
@T("Admin.Common.Save")
</button>
<button type="submit" name="save-continue" class="btn btn-primary">
<i class="far fa-save"></i>
@T("Admin.Common.SaveContinue")
</button>
</div>
</div>
@await Html.PartialAsync("_CreateOrUpdate", Model)
</form>

View File

@ -0,0 +1,36 @@
@model WidgetPushItemModel
@{
//page title
ViewBag.PageTitle = T("Admin.NopStation.WidgetPush.WidgetPushItems.EditWidgetPushItemDetails").Text;
//active menu item (system name)
NopHtml.SetActiveMenuItemSystemName("WidgetPush.WidgetPushItems");
}
<form asp-controller="WidgetPush" asp-action="Edit" method="post">
<div class="content-header clearfix">
<h1 class="float-left">
@T("Admin.NopStation.WidgetPush.WidgetPushItems.EditWidgetPushItemDetails")
<small>
<i class="fas fa-arrow-circle-left"></i>
<a asp-action="List">@T("Admin.NopStation.WidgetPush.WidgetPushItems.BackToList")</a>
</small>
</h1>
<div class="float-right">
<button type="submit" name="save" class="btn btn-primary">
<i class="far fa-save"></i>
@T("Admin.Common.Save")
</button>
<button type="submit" name="save-continue" class="btn btn-primary">
<i class="far fa-save"></i>
@T("Admin.Common.SaveContinue")
</button>
<span id="store-delete" class="btn btn-danger">
<i class="far fa-trash-alt"></i>
@T("Admin.Common.Delete")
</span>
</div>
</div>
@await Html.PartialAsync("_CreateOrUpdate", Model)
</form>
<nop-delete-confirmation asp-model-id="@Model.Id" asp-button-id="store-delete" />

View File

@ -0,0 +1,72 @@
@model WidgetPushItemSearchModel
@{
//page title
ViewBag.PageTitle = T("Admin.NopStation.WidgetPush.WidgetPushItems.List").Text;
//active menu item (system name)
NopHtml.SetActiveMenuItemSystemName("WidgetPush.WidgetPushItems");
}
<div class="content-header clearfix">
<h1 class="float-left">
@T("Admin.NopStation.WidgetPush.WidgetPushItems.List")
</h1>
<div class="float-right">
<a asp-action="Create" class="btn btn-primary">
<i class="fas fa-plus-square"></i>
@T("Admin.Common.AddNew")
</a>
</div>
</div>
<section class="content">
<div class="container-fluid">
<div class="form-horizontal">
<div class="cards-group">
<div class="card card-default">
<div class="card-body">
@await Html.PartialAsync("Table", new DataTablesModel
{
Name = "widgetpushitems-grid",
UrlRead = new DataUrl("List", "WidgetPush", null),
Length = Model.PageSize,
LengthMenu = Model.AvailablePageSizes,
ColumnCollection = new List<ColumnProperty>
{
new ColumnProperty(nameof(WidgetPushItemModel.Name))
{
Title = T("Admin.NopStation.WidgetPush.WidgetPushItems.Fields.Name").Text,
Width = "150"
},
new ColumnProperty(nameof(WidgetPushItemModel.WidgetZone))
{
Title = T("Admin.NopStation.WidgetPush.WidgetPushItems.Fields.WidgetZone").Text,
Width = "150"
},
new ColumnProperty(nameof(WidgetPushItemModel.DisplayOrder))
{
Title = T("Admin.NopStation.WidgetPush.WidgetPushItems.Fields.DisplayOrder").Text,
Width = "100"
},
new ColumnProperty(nameof(WidgetPushItemModel.Active))
{
Title = T("Admin.NopStation.WidgetPush.WidgetPushItems.Fields.Active").Text,
Width = "100",
Render = new RenderBoolean(),
ClassName = NopColumnClassDefaults.CenterAll
},
new ColumnProperty(nameof(WidgetPushItemModel.Id))
{
Title = T("Admin.Common.Edit").Text,
Width = "100",
ClassName = NopColumnClassDefaults.Button,
Render = new RenderButtonEdit(new DataUrl("Edit"))
}
}
})
</div>
</div>
</div>
</div>
</div>
</section>

View File

@ -0,0 +1,134 @@
@model WidgetPushItemModel
<div asp-validation-summary="All"></div>
<input asp-for="Id" type="hidden" />
<script>
$(document).ready(function () {
@Html.Raw(Model.FormattedExistingWidgetZones);
$("#@Html.IdFor(x => x.WidgetZone)").autocomplete({
source: existingWidgetZones
});
});
</script>
<section class="content">
<div class="container-fluid">
<div class="form-horizontal">
<div class="cards-group">
<div class="card card-default">
<div class="card-body">
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="Name" />
</div>
<div class="col-md-9">
<nop-editor asp-for="Name" asp-required="true" />
<span asp-validation-for="Name"></span>
</div>
</div>
@(await Html.LocalizedEditorAsync<WidgetPushItemModel, WidgetPushItemLocalizedModel>("widgetpushitem-localized",
@<div>
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="@Model.Locales[item].Content" />
</div>
<div class="col-md-9">
<nop-textarea asp-for="@Model.Locales[item].Content"></nop-textarea>
<span asp-validation-for="@Model.Locales[item].Content"></span>
</div>
</div>
<input type="hidden" asp-for="@Model.Locales[item].LanguageId" />
</div>
,
@<div>
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="Content" />
</div>
<div class="col-md-9">
<nop-textarea asp-for="Content" asp-required="true"></nop-textarea>
<span asp-validation-for="Content"></span>
</div>
</div>
</div>))
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="WidgetZone" />
</div>
<div class="col-md-9">
<nop-editor asp-for="WidgetZone" asp-required="true" />
<span asp-validation-for="WidgetZone"></span>
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="DisplayOrder" />
</div>
<div class="col-md-9">
<nop-editor asp-for="DisplayOrder" />
<span asp-validation-for="DisplayOrder"></span>
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="Active" />
</div>
<div class="col-md-9">
<nop-editor asp-for="Active" />
<span asp-validation-for="Active"></span>
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="DisplayStartDate" />
</div>
<div class="col-md-9">
<nop-editor asp-for="DisplayStartDate" />
<span asp-validation-for="DisplayStartDate"></span>
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="DisplayEndDate" />
</div>
<div class="col-md-9">
<nop-editor asp-for="DisplayEndDate" />
<span asp-validation-for="DisplayEndDate"></span>
</div>
</div>
<div class="form-group row">
<div class="col-md-3">
<nop-label asp-for="SelectedStoreIds" />
</div>
<div class="col-md-9">
<div class="row">
<div class="col-md-4">
<nop-select asp-for="SelectedStoreIds" asp-items="Model.AvailableStores" asp-multiple="true" />
<script>
$(function () {
var storesIdsInput = $('#@Html.IdFor(model => model.SelectedStoreIds)').select2({
closeOnSelect: false,
@if (!Model.AvailableStores.Any())
{
<text>
disabled: true,
placeholder: 'No stores available',
</text>
}
});
});
</script>
</div>
<div class="col-md-8">
@await Component.InvokeAsync(typeof(MultistoreDisabledWarningViewComponent))
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>

View File

@ -0,0 +1,21 @@
@inherits Nop.Web.Framework.Mvc.Razor.NopRazorPage<TModel>
@inject Nop.Services.Common.IGenericAttributeService genericAttributeService
@inject Nop.Core.IWorkContext workContext
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, Nop.Web.Framework
@addTagHelper *, NopStation.Plugin.Misc.Actions
@inject INopHtmlHelper NopHtml
@using Microsoft.AspNetCore.Mvc.ViewFeatures
@using Nop.Web.Framework.UI
@using Nop.Web.Framework.Extensions
@using System.Text.Encodings.Web
@using Nop.Services.Events
@using Nop.Web.Framework.Events
@using NopStation.Plugin.Widgets.WidgetPush.Areas.Admin.Models
@using Nop.Core.Domain.Common
@using Nop.Web.Framework.Models.DataTables
@using Microsoft.AspNetCore.Routing
@using Microsoft.AspNetCore.Mvc.Rendering
@using Nop.Core.Infrastructure
@using Nop.Web.Areas.Admin.Components

View File

@ -0,0 +1,3 @@
@{
Layout = "_AdminLayout";
}

View File

@ -0,0 +1,9 @@
@model WidgetPushModel
@if (Model.WidgetPushItems.Any())
{
foreach (var item in Model.WidgetPushItems)
{
@Html.Raw(item.Content)
}
}

View File

@ -0,0 +1,13 @@
@inherits Nop.Web.Framework.Mvc.Razor.NopRazorPage<TModel>
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, Nop.Web.Framework
@inject INopHtmlHelper NopHtml
@using Microsoft.AspNetCore.Mvc.ViewFeatures
@using Nop.Web.Framework.UI
@using Nop.Web.Framework.Extensions
@using System.Text.Encodings.Web
@using Nop.Services.Events
@using Nop.Web.Framework.Events
@using NopStation.Plugin.Widgets.WidgetPush.Models
@using Nop.Web.Framework.Infrastructure

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@ -0,0 +1,16 @@
{
"Group": "Nop-Station",
"FriendlyName": "Nop-Station Widget Push",
"SystemName": "NopStation.Plugin.Widgets.WidgetPush",
"Version": "4.80.1.0",
"SupportedVersions": [
"4.80"
],
"Author": "Jaber Kibria",
"DisplayOrder": 1,
"FileName": "NopStation.Plugin.Widgets.WidgetPush.dll",
"Description": "This plugin allows to push HTML content anywhere in admin or public site.",
"DependsOnSystemNames": [
"NopStation.Core"
]
}

View File

@ -0,0 +1 @@
4.70.1.0: Initial Release