Compare commits

...

10 Commits

Author SHA1 Message Date
Benedek Farkas
1eaa9f3068 Removing duplicate action from the Core/Navigation AdminController 2025-10-05 19:53:45 +02:00
Benedek Farkas
ce23a974d7 Merge branch '1.10.x' into 1.10.x-to-dev
# Conflicts:
#	src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs
2025-10-05 19:46:43 +02:00
Benedek Farkas
dbbe3efedf Merge branch 'dev' into 1.10.x-to-dev 2025-10-05 19:42:59 +02:00
Benedek Farkas
28f0bd52ed #8830: Fixing that fields attached to a Menu Item are not updated (#8844)
Some checks failed
Compile / Compile .NET solution (push) Has been cancelled
Compile / Compile Client-side Assets (push) Has been cancelled
SpecFlow Tests / Define Strategy Matrix (push) Has been cancelled
SpecFlow Tests / SpecFlow Tests (push) Has been cancelled
* Navigation: Fixing that saving a menu item should not force creating a draft version

* Navigation: Adding support to the AdminController for the Delete button rendered by the Contents feature

* Navigation: Fixing that fields attached to a Menu Item should also be updated when creating the item

* MainMenuService: Fixing that unpublished menu items could not be deleted

* Adding notification when deleting a menu items
2025-10-05 16:26:36 +02:00
Benedek Farkas
971a97874c Preventing Indexing AdminController and Commands from operating with unsafe index names (#8845)
Some checks failed
Compile / Compile .NET solution (push) Has been cancelled
Compile / Compile Client-side Assets (push) Has been cancelled
SpecFlow Tests / Define Strategy Matrix (push) Has been cancelled
SpecFlow Tests / SpecFlow Tests (push) Has been cancelled
2025-10-02 19:18:19 +02:00
Benedek Farkas
8851f622a3 Adding release package workflow (#8846)
Some checks failed
Compile / Compile .NET solution (push) Has been cancelled
Compile / Compile Client-side Assets (push) Has been cancelled
SpecFlow Tests / Define Strategy Matrix (push) Has been cancelled
SpecFlow Tests / SpecFlow Tests (push) Has been cancelled
(cherry picked from commit 4268b28d95)
2025-09-29 21:10:53 +02:00
Benedek Farkas
4268b28d95 Adding release package workflow (#8846)
* Updating release-package workflow

* Updating 3rd-party actions to their latest versions

* Testing artifact upload without separate compress step to avoid double-zipping [skip ci]

Hopefully it doesn't have horrible performance anymore

* Updating release-package workflow [skip ci]
2025-09-29 20:53:30 +02:00
Benedek Farkas
8891ee4873 Adding the skeleton of the release-package workflow [skip ci] 2025-09-29 19:45:48 +02:00
Michael Wentz
26fcdfbc5b #8839 Orchard Layouts Bootstrap 4 columns fix (#8840)
Some checks failed
Compile / Compile .NET solution (push) Has been cancelled
Compile / Compile Client-side Assets (push) Has been cancelled
SpecFlow Tests / Define Strategy Matrix (push) Has been cancelled
SpecFlow Tests / SpecFlow Tests (push) Has been cancelled
Build Crowdin Translation Packages / build-crowdin-translation-packages (push) Has been cancelled
* #8839 update all col-xs-* in Orchard.Layouts module to just col-* to fix columns. col-xs-* was removed in Bootstrap 4. display:flex was also added to Row.less to counteract the display:block on all the divs between .row and the .col-*

* Remove unnecessary file update. Didn't mean to include this, it is part of the Bootstrap 3 source which is not used anymore.

* OrchardCMS#8839 fixes for the layout editor from the previous work. If multiple elements were in a column, they were displaying horizontally instead of vertically. In order to fix this and manage situations where there are nested rows, the CSS specification had to be high.

* Rebuild client-side assets

---------

Co-authored-by: Benedek Farkas <benedek.farkas@lombiq.com>
2025-09-26 21:29:55 +02:00
Benedek Farkas
acd93104e2 Merge branch '1.10.x-to-dev' into dev 2025-09-26 20:48:59 +02:00
16 changed files with 169 additions and 81 deletions

View File

@@ -11,7 +11,7 @@ jobs:
steps:
- name: Orchard CMS
uses: andrii-bodnar/crowdin-request-action@aac9a865d62b37060b0ce530db5ac5cfca02dd2c # 0.0.2
uses: andrii-bodnar/crowdin-request-action@ee7a2af9564d8934b5b4a8427185aaaffee0165e # v0.3.0
with:
route: POST /projects/{projectId}/translations/builds
projectId: 46524
@@ -19,7 +19,7 @@ jobs:
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_API_TOKEN }}
- name: Orchard CMS Gallery
uses: andrii-bodnar/crowdin-request-action@aac9a865d62b37060b0ce530db5ac5cfca02dd2c # 0.0.2
uses: andrii-bodnar/crowdin-request-action@ee7a2af9564d8934b5b4a8427185aaaffee0165e # v0.3.0
with:
route: POST /projects/{projectId}/translations/builds
projectId: 63766

View File

@@ -18,13 +18,13 @@ jobs:
runs-on: windows-2025
steps:
- name: Clone Repository
uses: actions/checkout@v4.1.1
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Restore NuGet Packages
run: nuget restore src/Orchard.sln
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v2
uses: microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce # v2.0.0
- name: Compile
run: msbuild Orchard.proj /m /v:minimal /t:Compile /p:TreatWarningsAsErrors=true -WarnAsError /p:MvcBuildViews=true
@@ -70,10 +70,10 @@ jobs:
runs-on: windows-2025
steps:
- name: Clone Repository
uses: actions/checkout@v4.1.1
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Setup NodeJS
uses: actions/setup-node@v4.0.2
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
node-version: 7

39
.github/workflows/release-package.yml vendored Normal file
View File

@@ -0,0 +1,39 @@
name: Release Package
# Builds the release package and uploads it as an artifact.
on:
workflow_dispatch:
jobs:
release-package:
name: Release Package
runs-on: Windows-2025
defaults:
run:
shell: cmd
steps:
- name: Clone Repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Restore NuGet Packages
run: nuget restore src/Orchard.sln
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce # v2.0.0
- name: Build Precompiled Application
run: msbuild Orchard.proj /m /v:minimal /t:Precompiled
- name: Generate Release Package Name
id: package-name
shell: pwsh
run: |
$packageName = "Orchard-$('${{ github.ref_name }}'.Replace('/', '_'))-${{ github.sha }}"
"package-name=$packageName" >> $Env:GITHUB_OUTPUT
- name: Upload Release Package
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ${{ steps.package-name.outputs.package-name }}
path: .\build\Precompiled
if-no-files-found: error

View File

@@ -39,7 +39,7 @@ jobs:
shell: cmd
steps:
- name: Clone Repository
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
ref: ${{ matrix.branch }}

View File

@@ -13,6 +13,7 @@ using Orchard.Data;
using Orchard.Exceptions;
using Orchard.Localization;
using Orchard.Logging;
using Orchard.Mvc;
using Orchard.Mvc.Extensions;
using Orchard.Mvc.Html;
using Orchard.Security;
@@ -130,11 +131,15 @@ namespace Orchard.Core.Navigation.Controllers {
return RedirectToAction("Index", new { menuId });
}
[HttpPost, ActionName("Edit")]
[FormValueRequired("submit.Delete")]
public ActionResult EditDeletePOST(int id) => Delete(id);
[HttpPost]
public ActionResult Delete(int id) {
MenuPart menuPart = _menuService.Get(id);
int? menuId = null;
if (!_authorizer.Authorize(
Permissions.ManageMenus,
menuPart == null ? null : _menuService.GetMenu(menuPart.Menu.Id),
@@ -151,7 +156,7 @@ namespace Orchard.Core.Navigation.Controllers {
.ToList();
foreach (var menuItem in menuItems.Concat(new[] { menuPart })) {
// if the menu item is a concrete content item, don't delete it, just unreference the menu
// if the menu item is a concrete content item, don't delete it, just remove the menu reference
if (!menuPart.ContentItem.TypeDefinition.Settings.ContainsKey("Stereotype")
|| menuPart.ContentItem.TypeDefinition.Settings["Stereotype"] != "MenuItem") {
menuPart.Menu = null;
@@ -161,6 +166,11 @@ namespace Orchard.Core.Navigation.Controllers {
}
}
_notifier.Information(T.Plural(
"The menu item '{1}' has been deleted.",
"The menu item '{1}' and its children have been deleted.",
menuItems.Count() + 1,
menuPart.MenuText));
}
return RedirectToAction("Index", new { menuId });
@@ -171,7 +181,8 @@ namespace Orchard.Core.Navigation.Controllers {
return new HttpUnauthorizedResult();
// create a new temporary menu item
var menuPart = _contentManager.New<MenuPart>(id);
var contentItem = _contentManager.New(id);
var menuPart = contentItem.As<MenuPart>();
if (menuPart == null)
return HttpNotFound();
@@ -186,7 +197,7 @@ namespace Orchard.Core.Navigation.Controllers {
// filter the content items for this specific menu
menuPart.MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu));
menuPart.Menu = menu;
var model = _contentManager.BuildEditor(menuPart);
var model = _contentManager.BuildEditor(contentItem);
return View(model);
}
@@ -205,23 +216,32 @@ namespace Orchard.Core.Navigation.Controllers {
public ActionResult CreateMenuItemPost(string id, int menuId, string returnUrl) {
if (!_authorizer.Authorize(Permissions.ManageMenus, _menuService.GetMenu(menuId), T("Couldn't manage the menu")))
return new HttpUnauthorizedResult();
var menuPart = _contentManager.New<MenuPart>(id);
var contentItem = _contentManager.New(id);
var menuPart = contentItem.As<MenuPart>();
if (menuPart == null)
return HttpNotFound();
// load the menu
var menu = _contentManager.Get(menuId);
if (menu == null)
return HttpNotFound();
_contentManager.Create(contentItem);
menuPart.Menu = menu;
var model = _contentManager.UpdateEditor(menuPart, this);
menuPart.MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu));
_contentManager.Create(menuPart);
var model = _contentManager.UpdateEditor(contentItem, this);
if (!ModelState.IsValid) {
_transactionManager.Cancel();
return View(model);
}
_notifier.Success(T("Your {0} has been added.", menuPart.TypeDefinition.DisplayName));
_notifier.Information(T("Your {0} has been added.", contentItem.TypeDefinition.DisplayName));
return this.RedirectLocal(returnUrl, () => RedirectToAction("Index"));
}
@@ -293,10 +313,6 @@ namespace Orchard.Core.Navigation.Controllers {
return RedirectToAction("Index", new { menuId = menuPart.Menu.Id });
}
[HttpPost, ActionName("Edit")]
[Mvc.FormValueRequired("submit.Delete")]
public ActionResult EditDeletePOST(int id) => Delete(id);
[HttpPost, ActionName("Edit")]
[Mvc.FormValueRequired("submit.Unpublish")]
public ActionResult EditUnpublishPOST(int id) => Unpublish(id);
@@ -315,7 +331,8 @@ namespace Orchard.Core.Navigation.Controllers {
}
private ActionResult EditPOST(int id, string returnUrl, Action<ContentItem> conditionallyPublish) {
var menuPart = _contentManager.GetDraftRequired<MenuPart>(id);
var contentItem = _contentManager.GetLatest(id);
var menuPart = contentItem.As<MenuPart>();
if (menuPart == null)
return HttpNotFound();
@@ -323,8 +340,6 @@ namespace Orchard.Core.Navigation.Controllers {
if (!_authorizer.Authorize(Permissions.ManageMenus, menuPart.Menu, T("Couldn't manage the menu")))
return new HttpUnauthorizedResult();
var contentItem = menuPart.ContentItem;
string previousRoute = null;
if (contentItem.Has<IAliasAspect>()
&& !string.IsNullOrWhiteSpace(returnUrl)

View File

@@ -41,7 +41,7 @@ namespace Orchard.Core.Navigation.Services {
}
public MenuPart Get(int menuPartId) {
return _contentManager.Get<MenuPart>(menuPartId);
return _contentManager.Get<MenuPart>(menuPartId, VersionOptions.Latest);
}
public IContent Create(string name) {

View File

@@ -4,7 +4,7 @@ using Orchard.Commands;
using Orchard.ContentManagement;
using Orchard.Indexing.Services;
using Orchard.Tasks.Indexing;
using Orchard.Utility.Extensions;
using static Orchard.Indexing.Helpers.IndexingHelpers;
namespace Orchard.Indexing.Commands {
public class IndexingCommands : DefaultOrchardCommandHandler {
@@ -38,27 +38,22 @@ namespace Orchard.Indexing.Commands {
return;
}
if (string.IsNullOrWhiteSpace(index)) {
if (!IsValidIndexName(index)) {
Context.Output.WriteLine(T("Invalid index name."));
return;
}
if (index.ToSafeName() != index) {
Context.Output.WriteLine(T("Invalid index name."));
var indexProvider = _indexManager.GetSearchIndexProvider();
if (indexProvider == null) {
Context.Output.WriteLine(T("No indexing service was found. Please enable a module like Lucene."));
}
else {
var indexProvider = _indexManager.GetSearchIndexProvider();
if(indexProvider == null) {
Context.Output.WriteLine(T("No indexing service was found. Please enable a module like Lucene."));
if (indexProvider.Exists(index)) {
Context.Output.WriteLine(T("The specified index already exists."));
}
else {
if (indexProvider.Exists(index)) {
Context.Output.WriteLine(T("The specified index already exists."));
}
else {
_indexManager.GetSearchIndexProvider().CreateIndex(index);
Context.Output.WriteLine(T("New index has been created successfully."));
}
_indexManager.GetSearchIndexProvider().CreateIndex(index);
Context.Output.WriteLine(T("New index has been created successfully."));
}
}
}
@@ -66,7 +61,7 @@ namespace Orchard.Indexing.Commands {
[CommandName("index update")]
[CommandHelp("index update <index>\r\n\t" + "Updates the specified index")]
public void Update(string index) {
if (string.IsNullOrWhiteSpace(index)) {
if (!IsValidIndexName(index)) {
Context.Output.WriteLine(T("Invalid index name."));
return;
}
@@ -78,7 +73,7 @@ namespace Orchard.Indexing.Commands {
[CommandName("index rebuild")]
[CommandHelp("index rebuild <index> \r\n\t" + "Rebuilds the specified index")]
public void Rebuild(string index) {
if (string.IsNullOrWhiteSpace(index)) {
if (!IsValidIndexName(index)) {
Context.Output.WriteLine(T("Invalid index name."));
return;
}
@@ -91,24 +86,24 @@ namespace Orchard.Indexing.Commands {
[CommandHelp("index query <index> /Query:<query>\r\n\t" + "Searches the specified <query> terms in the specified index")]
[OrchardSwitches("Query")]
public void Search(string index) {
if (string.IsNullOrWhiteSpace(index)) {
if (!IsValidIndexName(index)) {
Context.Output.WriteLine(T("Invalid index name."));
return;
}
if ( !_indexManager.HasIndexProvider() ) {
if (!_indexManager.HasIndexProvider()) {
Context.Output.WriteLine(T("No index available"));
return;
}
var searchBuilder = _indexManager.GetSearchIndexProvider().CreateSearchBuilder(index);
var results = searchBuilder.Parse( new [] {"body", "title"}, Query).Search();
var results = searchBuilder.Parse(new[] { "body", "title" }, Query).Search();
Context.Output.WriteLine("{0} result{1}\r\n-----------------\r\n", results.Count(), results.Count() > 0 ? "s" : "");
Context.Output.WriteLine("┌──────────────────────────────────────────────────────────────┬────────┐");
Context.Output.WriteLine("│ {0} │ {1,6} │", "Title" + new string(' ', 60 - "Title".Length), "Score");
Context.Output.WriteLine("├──────────────────────────────────────────────────────────────┼────────┤");
foreach ( var searchHit in results ) {
foreach (var searchHit in results) {
var contentItem = _contentManager.Get(searchHit.ContentItemId);
var metadata = _contentManager.GetItemMetadata(contentItem);
var title = String.IsNullOrWhiteSpace(metadata.DisplayText) ? "- no title -" : metadata.DisplayText;
@@ -126,12 +121,12 @@ namespace Orchard.Indexing.Commands {
[CommandHelp("index stats <index>\r\n\t" + "Displays some statistics about the search index")]
[OrchardSwitches("IndexName")]
public void Stats(string index) {
if (string.IsNullOrWhiteSpace(index)) {
if (!IsValidIndexName(index)) {
Context.Output.WriteLine(T("Invalid index name."));
return;
}
if ( !_indexManager.HasIndexProvider() ) {
if (!_indexManager.HasIndexProvider()) {
Context.Output.WriteLine(T("No index available"));
return;
}
@@ -140,11 +135,10 @@ namespace Orchard.Indexing.Commands {
}
[CommandName("index refresh")]
[CommandHelp("index refresh /ContentItem:<content item id> \r\n\t" + "Refreshes the index for the specifed <content item id>")]
[CommandHelp("index refresh /ContentItem:<content item id> \r\n\t" + "Refreshes the index for the specified <content item id>")]
[OrchardSwitches("ContentItem")]
public void Refresh() {
int contentItemId;
if ( !int.TryParse(ContentItem, out contentItemId) ) {
if (!int.TryParse(ContentItem, out int contentItemId)) {
Context.Output.WriteLine(T("Invalid content item id. Not an integer."));
return;
}
@@ -152,19 +146,18 @@ namespace Orchard.Indexing.Commands {
var contentItem = _contentManager.Get(contentItemId);
_indexingTaskManager.CreateUpdateIndexTask(contentItem);
Context.Output.WriteLine(T("Content Item marked for reindexing"));
Context.Output.WriteLine(T("Content Item marked for re-indexing"));
}
[CommandName("index delete")]
[CommandHelp("index delete /ContentItem:<content item id>\r\n\t" + "Deletes the specifed <content item id> from the index")]
[CommandHelp("index delete /ContentItem:<content item id>\r\n\t" + "Deletes the specified <content item id> from the index")]
[OrchardSwitches("ContentItem")]
public void Delete() {
int contentItemId;
if(!int.TryParse(ContentItem, out contentItemId)) {
if (!int.TryParse(ContentItem, out int contentItemId)) {
Context.Output.WriteLine(T("Invalid content item id. Not an integer."));
return;
}
var contentItem = _contentManager.Get(contentItemId);
_indexingTaskManager.CreateDeleteIndexTask(contentItem);

View File

@@ -2,12 +2,12 @@
using System.Linq;
using System.Web.Mvc;
using Orchard.Indexing.Services;
using Orchard.Indexing.ViewModels;
using Orchard.Localization;
using Orchard.Logging;
using Orchard.Security;
using Orchard.Indexing.ViewModels;
using Orchard.UI.Notify;
using Orchard.Utility.Extensions;
using static Orchard.Indexing.Helpers.IndexingHelpers;
namespace Orchard.Indexing.Controllers {
public class AdminController : Controller {
@@ -15,7 +15,7 @@ namespace Orchard.Indexing.Controllers {
private readonly IIndexManager _indexManager;
public AdminController(
IIndexingService indexingService,
IIndexingService indexingService,
IOrchardServices services,
IIndexManager indexManager) {
_indexingService = indexingService;
@@ -34,23 +34,21 @@ namespace Orchard.Indexing.Controllers {
IndexEntries = Enumerable.Empty<IndexEntry>(),
IndexProvider = _indexManager.GetSearchIndexProvider()
};
if (_indexManager.HasIndexProvider()) {
viewModel.IndexEntries = _indexManager.GetSearchIndexProvider().List().Select(x => {
try {
return _indexingService.GetIndexEntry(x);
}
catch(Exception e) {
catch (Exception e) {
Logger.Error(e, "Index couldn't be read: " + x);
return new IndexEntry {
return new IndexEntry {
IndexName = x,
IndexingStatus = IndexingStatus.Unavailable
};
}
});
}
// Services.Notifier.Information(T("The index might be corrupted. If you can't recover click on Rebuild."));
return View(viewModel);
}
@@ -59,7 +57,7 @@ namespace Orchard.Indexing.Controllers {
if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not allowed to manage the search index.")))
return new HttpUnauthorizedResult();
return View("Create", String.Empty);
return View("Create");
}
[HttpPost, ActionName("Create")]
@@ -68,7 +66,7 @@ namespace Orchard.Indexing.Controllers {
return new HttpUnauthorizedResult();
var provider = _indexManager.GetSearchIndexProvider();
if (String.IsNullOrWhiteSpace(id) || id.ToSafeName() != id) {
if (!IsValidIndexName(id)) {
Services.Notifier.Error(T("Invalid index name."));
return View("Create", id);
}
@@ -82,9 +80,9 @@ namespace Orchard.Indexing.Controllers {
provider.CreateIndex(id);
Services.Notifier.Success(T("Index named {0} created successfully", id));
}
catch(Exception e) {
catch (Exception e) {
Services.Notifier.Error(T("An error occurred while creating the index: {0}", id));
Logger.Error("An error occurred while creatign the index " + id, e);
Logger.Error("An error occurred while creating the index " + id, e);
return View("Create", id);
}
@@ -96,7 +94,12 @@ namespace Orchard.Indexing.Controllers {
if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not allowed to manage the search index.")))
return new HttpUnauthorizedResult();
_indexingService.UpdateIndex(id);
if (IsValidIndexName(id)) {
_indexingService.UpdateIndex(id);
}
else {
Services.Notifier.Error(T("Invalid index name."));
}
return RedirectToAction("Index");
}
@@ -106,7 +109,12 @@ namespace Orchard.Indexing.Controllers {
if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not allowed to manage the search index.")))
return new HttpUnauthorizedResult();
_indexingService.RebuildIndex(id);
if (IsValidIndexName(id)) {
_indexingService.RebuildIndex(id);
}
else {
Services.Notifier.Error(T("Invalid index name."));
}
return RedirectToAction("Index");
}
@@ -116,7 +124,12 @@ namespace Orchard.Indexing.Controllers {
if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not allowed to manage the search index.")))
return new HttpUnauthorizedResult();
_indexingService.DeleteIndex(id);
if (IsValidIndexName(id)) {
_indexingService.DeleteIndex(id);
}
else {
Services.Notifier.Error(T("Invalid index name."));
}
return RedirectToAction("Index");
}

View File

@@ -0,0 +1,8 @@
using Orchard.Utility.Extensions;
namespace Orchard.Indexing.Helpers {
public static class IndexingHelpers {
public static bool IsValidIndexName(string name) =>
!string.IsNullOrWhiteSpace(name) && name.ToSafeName() == name;
}
}

View File

@@ -95,6 +95,7 @@
<Compile Include="AdminMenu.cs" />
<Compile Include="Commands\IndexingCommands.cs" />
<Compile Include="Controllers\AdminController.cs" />
<Compile Include="Helpers\IndexingHelpers.cs" />
<Compile Include="Migrations.cs" />
<Compile Include="Handlers\CreateIndexingTaskHandler.cs" />
<Compile Include="Handlers\InfosetFieldIndexingHandler.cs" />
@@ -181,4 +182,4 @@
</FlavorProperties>
</VisualStudio>
</ProjectExtensions>
</Project>
</Project>

View File

@@ -228,8 +228,8 @@
return $(e).height();
}));
for (i = 1; i <= 12; i++)
ui.placeholder.removeClass("col-xs-" + i);
ui.placeholder.addClass("col-xs-" + receivedColumn.width);
ui.placeholder.removeClass("col-" + i);
ui.placeholder.addClass("col-" + receivedColumn.width);
if (maxHeight > 0) {
ui.placeholder.height(maxHeight);
ui.placeholder.css("min-height", 0);
@@ -321,8 +321,8 @@
result.push("layout-row-full");
}
if (child.type == "Column") {
result.push("col-xs-" + child.width);
result.push("col-xs-offset-" + child.offset);
result.push("col-" + child.width);
result.push("col-offset-" + child.offset);
}
if (child.type == "Content")
result.push("layout-content-" + child.contentTypeClass);

View File

@@ -17,5 +17,14 @@
}
}
}
> div > .layout-children {
display: flex;
flex-direction: row;
}
}
.layout-column > div > .layout-children {
flex-direction: column;
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long