Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
069f31d
Added support for pre/post appending view paths
jaxwilko Feb 17, 2025
f3706b8
Added default view files for forms and lists behaviours
jaxwilko Feb 17, 2025
67ef0eb
Added --stubs option to create controller command
jaxwilko Feb 17, 2025
22d04ef
Added code styling fixes
jaxwilko Feb 17, 2025
3feecb6
Added fix for hardcoded link
jaxwilko Feb 17, 2025
8b65ce0
Update modules/backend/behaviors/listcontroller/_list_toolbar.php
LukeTowers Feb 17, 2025
41f1fb5
Added support for default reorder views
jaxwilko Feb 17, 2025
4a2760b
Merge branch 'wip/behaviour-default-views' of github.com:wintercms/wi…
jaxwilko Feb 17, 2025
8f216a2
Added support for import export behaviour defaults
jaxwilko Feb 18, 2025
fe85e22
Added default value for bodyClass
jaxwilko Feb 18, 2025
b77d283
Added self generating breadcrumb partial
jaxwilko Feb 18, 2025
b0bbed0
Added default partials for behaviours
jaxwilko Feb 18, 2025
0807dd4
Added self generating breadcumb for controller stubs
jaxwilko Feb 18, 2025
cae7704
Added import export lang keys
jaxwilko Feb 18, 2025
2a13527
Added fix for code styling
jaxwilko Feb 18, 2025
2f616e0
Added fixes for reorder partials
jaxwilko Feb 18, 2025
5102170
Move controllerbehavior default views to /views
LukeTowers Feb 21, 2025
606fe64
Merge branch 'develop' into wip/behaviour-default-views
LukeTowers Feb 26, 2025
3fe07ef
Update modules/backend/behaviors/reordercontroller/views/reorder.php
LukeTowers Feb 26, 2025
41f643b
Switch to new prependViewPath() method
LukeTowers Feb 26, 2025
5d0b9ca
Automatically set BackendMenu context from controller path
LukeTowers Feb 26, 2025
e0e6cb9
Tweaks to the default views based on migrating Winter.Blog
LukeTowers Feb 27, 2025
d6449e8
Improve breadcrumb generation logic to take into account settings con…
LukeTowers Mar 5, 2025
b4c66d6
Update the changemonitor status after the AJAX requests complete
LukeTowers Mar 5, 2025
143dfe4
Add top padding to form buttons container & remove buttons from the s…
LukeTowers Mar 5, 2025
fced797
Remove unnecessary backend controller views
LukeTowers Mar 5, 2025
ce48714
Add localized "or" string
LukeTowers Mar 5, 2025
8689e40
Add data-browser-validate to all form saving buttons
LukeTowers Mar 5, 2025
5de7bd7
add missing delete button to sidebar layout update view
mjauvin Mar 15, 2025
bc7e493
no need for two links with the same url
mjauvin Mar 15, 2025
3d77eaf
Merge branch 'develop' into wip/behaviour-default-views
mjauvin May 1, 2025
077d4c4
do not show "delete selected" button if the list does not show the re…
mjauvin May 6, 2025
acc69e8
add cancel button in default fancy toolbar
mjauvin May 6, 2025
e7032e8
remove extra space after closing parenthesis
mjauvin May 6, 2025
fe0abe7
Update modules/backend/behaviors/listcontroller/views/_list_toolbar.php
LukeTowers May 6, 2025
0512f13
Merge branch 'develop' into wip/behaviour-default-views
mjauvin May 9, 2025
f511992
Merge branch 'develop' into wip/behaviour-default-views
LukeTowers May 9, 2025
8ec2466
Merge branch 'develop' into wip/behaviour-default-views
LukeTowers May 10, 2025
a36b3e0
Extract create/update form buttons into their own partials (#1352)
mjauvin May 10, 2025
451f4f9
Use toolbar partial
LukeTowers May 10, 2025
22ab21e
Update update.stub
LukeTowers May 10, 2025
3732260
Update create.stub
LukeTowers May 10, 2025
76b833c
Update update.stub
LukeTowers May 10, 2025
9bbdfa5
add reorder button on default list toolbar
mjauvin May 10, 2025
33e1d3b
fix icon class
mjauvin May 10, 2025
3cff2dc
only add create button if FormController is used
mjauvin May 10, 2025
777a556
use more appropriate reorder icon
mjauvin May 10, 2025
0776b98
use arrows-up-down icon for reorder action
mjauvin May 10, 2025
ee943fd
Merge branch 'develop' into wip/behaviour-default-views
mjauvin May 19, 2025
a735dce
Merge branch 'develop' into wip/behaviour-default-views
mjauvin May 19, 2025
606bf14
Merge branch 'develop' into wip/behaviour-default-views
LukeTowers May 28, 2025
c5fc31b
Add buttons for import export behavior to list default toolbar when b…
LukeTowers May 28, 2025
0d7e874
Add support for abort(403) in the backend
LukeTowers May 28, 2025
e24f395
Improve abort(404) handling in the backend
LukeTowers May 28, 2025
8eb44e9
Add icons to the default form buttons
LukeTowers Jun 18, 2025
4993443
Merge branch 'develop' into wip/behaviour-default-views
LukeTowers Jun 18, 2025
fe10d42
Add missing buttons and icons to the form fancy toolbars
LukeTowers Jun 18, 2025
8d6bd7b
Fix disabled styling for outside tab fields in the fancy form layout
LukeTowers Jun 18, 2025
ddf26db
Improve handling of layouts in the controller scaffolding command
LukeTowers Jun 18, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 28 additions & 27 deletions modules/backend/assets/css/winter.css

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions modules/backend/assets/less/layout/fancylayout.less
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,10 @@ body.fancy-layout .master-tabs.control-tabs,
margin-bottom: 0;
}

.form-control[disabled] {
background-color: rgba(29, 29, 29, 0.11) !important;
}

input[type=text] {
background: transparent;
border: none;
Expand Down
22 changes: 22 additions & 0 deletions modules/backend/behaviors/FormController.php
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,9 @@ public function initForm($model, $context = null)
protected function prepareVars($model)
{
$this->controller->vars['formModel'] = $model;
$this->controller->vars['formConfig'] = $this->getConfig();
$this->controller->vars['formContext'] = $this->formGetContext();
$this->controller->vars['formController'] = $this;
$this->controller->vars['formRecordName'] = Lang::get($this->getConfig('name', 'backend::lang.model.name'));
}

Expand Down Expand Up @@ -473,6 +475,10 @@ public function makeRedirect($context = null, $model = null)
return Redirect::refresh();
}

if (post('new', false)) {
return Redirect::to($this->controller->actionUrl('create'));
}

if (post('redirect', true)) {
$redirectUrl = $this->controller->formGetRedirectUrl($context, $model);
}
Expand Down Expand Up @@ -882,4 +888,20 @@ public static function extendFormFields($callback)
call_user_func_array($callback, [$widget, $widget->model, $widget->getContext()]);
});
}

/**
* Controller accessor for making partials within this behavior.
*/
public function formMakePartial(string $partial, array $params = []): string
{
$contents = $this->controller->makePartial('form_' . $this->context . '_' . $partial, $params + $this->vars, false);
if (!$contents) {
$contents = $this->controller->makePartial('form_' . $partial, $params + $this->vars, false);
}
if (!$contents) {
$contents = $this->makePartial($partial, $params);
}

return $contents;
}
}
45 changes: 23 additions & 22 deletions modules/backend/behaviors/ImportExportController.php
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
<?php namespace Backend\Behaviors;

use Str;
use Lang;
use View;
use Response;
use Backend;
use BackendAuth;
use Backend\Classes\ControllerBehavior;
<?php

namespace Backend\Behaviors;

use Backend\Behaviors\ImportExportController\TranscodeFilter;
use Backend\Classes\ControllerBehavior;
use Backend\Facades\Backend;
use Backend\Facades\BackendAuth;
use Exception;
use Illuminate\Database\Eloquent\MassAssignmentException;
use League\Csv\Reader as CsvReader;
use League\Csv\Writer as CsvWriter;
use Illuminate\Support\Facades\Lang;
use Illuminate\Support\Facades\Response;
use League\Csv\EscapeFormula as CsvEscapeFormula;
use League\Csv\Reader as CsvReader;
use League\Csv\Statement as CsvStatement;
use ApplicationException;
use League\Csv\Writer as CsvWriter;
use SplTempFileObject;
use Exception;
use Winter\Storm\Exception\ApplicationException;
use Winter\Storm\Support\Str;

/**
* Adds features for importing and exporting data.
Expand Down Expand Up @@ -146,8 +147,8 @@ public function __construct($controller)

public function import()
{
if ($response = $this->checkPermissionsForType('import')) {
return $response;
if (!$this->userHasAccess('import')) {
abort(403);
}

$this->addJs('js/winter.import.js', 'core');
Expand All @@ -161,8 +162,8 @@ public function import()

public function export()
{
if ($response = $this->checkPermissionsForType('export')) {
return $response;
if (!$this->userHasAccess('export')) {
abort(403);
}

if ($response = $this->checkUseListExportMode()) {
Expand Down Expand Up @@ -697,18 +698,18 @@ public function importExportMakePartial($partial, $params = [])
}

/**
* Checks to see if the import/export is controlled by permissions
* and if the logged in user has permissions.
* @return \View
* Check if the current user has access to the provided import/export action
*/
protected function checkPermissionsForType($type)
public function userHasAccess(string $type): bool
{
if (
($permissions = $this->getConfig($type.'[permissions]')) &&
(!BackendAuth::getUser()->hasAnyAccess((array) $permissions))
) {
return Response::make(View::make('backend::access_denied'), 403);
return false;
}

return true;
}

protected function makeOptionsFormWidgetForType($type)
Expand Down
81 changes: 81 additions & 0 deletions modules/backend/behaviors/formcontroller/partials/_toolbar.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
<?php
$modelName = $formConfig->name ?? '';
?>
<?php if ($formContext === 'create'): ?>
<div class="loading-indicator-container">
<button
type="submit"
data-request="onSave"
data-request-data="new:1"
data-browser-validate
data-hotkey="ctrl+shift+s, cmd+shift+s"
data-load-indicator="<?= e(trans('backend::lang.form.creating_name', ['name' => trans($modelName)])); ?>"
data-request-before-update="$el.trigger('unchange.oc.changeMonitor')"
class="btn btn-primary wn-icon-plus">
<?= e(trans('backend::lang.form.create_and_new')); ?>
</button>
<button
type="button"
data-request="onSave"
data-browser-validate
data-hotkey="ctrl+s, cmd+s"
data-load-indicator="<?= e(trans('backend::lang.form.creating_name', ['name' => trans($modelName)])); ?>"
data-request-before-update="$el.trigger('unchange.oc.changeMonitor')"
class="btn btn-primary wn-icon-save">
<?= e(trans('backend::lang.form.create')); ?>
</button>
<button
type="button"
data-request="onSave"
data-browser-validate
data-request-data="close:1"
data-hotkey="ctrl+enter, cmd+enter"
data-load-indicator="<?= e(trans('backend::lang.form.creating_name', ['name' => trans($modelName)])); ?>"
data-request-before-update="$el.trigger('unchange.oc.changeMonitor')"
class="btn btn-default wn-icon-check">
<?= e(trans('backend::lang.form.create_and_close')); ?>
</button>
<span class="btn-text">
<?= e(trans('backend::lang.form.or')) ?> <a href="<?= Backend::url($formConfig->defaultRedirect) ?>"><?= e(trans('backend::lang.form.cancel')); ?></a>
</span>
</div>
<?php elseif ($formContext === 'update'): ?>
<div class="loading-indicator-container">
<button
type="button"
data-request="onSave"
data-browser-validate
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
data-request-before-update="$el.trigger('unchange.oc.changeMonitor')"
data-request-data="redirect:0"
data-hotkey="ctrl+s, cmd+s"
class="btn btn-primary wn-icon-save"
>
<?= e(trans('backend::lang.form.save')); ?>
</button>
<button
type="button"
data-request="onSave"
data-browser-validate
data-request-data="close:1"
data-hotkey="ctrl+enter, cmd+enter"
data-load-indicator="<?= e(trans('backend::lang.form.saving')); ?>"
data-request-before-update="$el.trigger('unchange.oc.changeMonitor')"
class="btn btn-default wn-icon-check"
>
<?= e(trans('backend::lang.form.save_and_close')); ?>
</button>
<button
type="button"
data-request="onDelete"
data-load-indicator="<?= e(trans('backend::lang.form.deleting_name', ['name' => trans($modelName)])); ?>"
data-request-before-update="$el.trigger('unchange.oc.changeMonitor')"
data-request-confirm="<?= e(trans('backend::lang.form.confirm_delete')); ?>"
class="wn-icon-trash-o btn-icon danger pull-right"
>
</button>
<span class="btn-text">
<?= e(trans('backend::lang.form.or')) ?> <a href="<?= Backend::url($formConfig->defaultRedirect) ?>"><?= e(trans('backend::lang.form.cancel')); ?></a>
</span>
</div>
<?php endif ?>
20 changes: 20 additions & 0 deletions modules/backend/behaviors/formcontroller/views/create.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

// Decide which layout we should be rendering
$layout = $this->formLayout ?? $formConfig->formLayout ?? null;
if (!in_array($layout, ['standard', 'sidebar', 'fancy'])) {
$layout = 'standard';
}

// If required, set the appropriate body classes
$this->bodyClass = match ($layout) {
'fancy' => 'fancy-layout compact-container breadcrumb-flush breadcrumb-fancy',
'sidebar' => 'compact-container',
default => '',
};

// Define layout mode view path for inclusion
$this->appendViewPath(sprintf('%s/create/%s', __DIR__, $layout));

// Render the form layout
echo $this->makePartial(sprintf('create/%s.php', $layout));
20 changes: 20 additions & 0 deletions modules/backend/behaviors/formcontroller/views/create/_fancy.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php Block::put('breadcrumb') ?>
<?= $this->makeLayoutPartial('breadcrumb') ?>
<?php Block::endPut() ?>

<?php if (!$this->fatalError): ?>
<div class="layout fancy-layout">
<?= Form::open([
'class' => 'layout',
'data-change-monitor' => 'true',
'data-window-close-confirm' => 'true',
]) ?>
<div class="layout-row">
<?= $this->formRender() ?>
</div>
<?= Form::close() ?>
</div>
<?php else: ?>
<p class="flash-message static error"><?= e($this->fatalError) ?></p>
<p><a href="<?= Backend::url($formConfig->defaultRedirect) ?>" class="btn btn-default"><?= e(trans('backend::lang.form.return_to_list')); ?></a></p>
<?php endif ?>
40 changes: 40 additions & 0 deletions modules/backend/behaviors/formcontroller/views/create/_sidebar.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php Block::put('breadcrumb') ?>
<?= $this->makeLayoutPartial('breadcrumb') ?>
<?php Block::endPut() ?>

<?php if (!$this->fatalError): ?>
<?php Block::put('form-contents') ?>
<div class="layout">
<div class="layout-row">
<?= $this->formRenderOutsideFields() ?>
<?= $this->formRenderPrimaryTabs() ?>
</div>

<div class="form-buttons p-t">
<?= $this->formMakePartial('toolbar') ?>
</div>
</div>
<?php Block::endPut() ?>

<?php Block::put('form-sidebar') ?>
<div class="hide-tabs"><?= $this->formRenderSecondaryTabs() ?></div>
<?php Block::endPut() ?>

<?php Block::put('body') ?>
<?= Form::open([
'class' => 'layout stretch',
'data-change-monitor' => 'true',
'data-window-close-confirm' => 'true',
]) ?>
<?= $this->makeLayout('form-with-sidebar') ?>
<?= Form::close() ?>
<?php Block::endPut() ?>
<?php else: ?>
<div class="control-breadcrumb">
<?= Block::placeholder('breadcrumb') ?>
</div>
<div class="padded-container">
<p class="flash-message static error"><?= e(trans($this->fatalError)) ?></p>
<p><a href="<?= Backend::url($formConfig->defaultRedirect) ?>" class="btn btn-default"><?= e(trans('backend::lang.form.return_to_list')); ?></a></p>
</div>
<?php endif ?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php Block::put('breadcrumb') ?>
<?= $this->makeLayoutPartial('breadcrumb') ?>
<?php Block::endPut() ?>

<?php if (!$this->fatalError): ?>
<?= Form::open([
'class' => 'layout',
'data-change-monitor' => 'true',
'data-window-close-confirm' => 'true',
]) ?>
<div class="layout-row">
<?= $this->formRender() ?>
</div>

<div class="form-buttons p-t">
<?= $this->formMakePartial('toolbar') ?>
</div>
<?= Form::close() ?>
<?php else: ?>
<p class="flash-message static error"><?= e($this->fatalError) ?></p>
<p><a href="<?= Backend::url($formConfig->defaultRedirect) ?>" class="btn btn-default"><?= e(trans('backend::lang.form.return_to_list')); ?></a></p>
<?php endif ?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<div class="form-buttons loading-indicator-container">
<button
type="submit"
data-request="onSave"
data-request-data="new:1"
data-browser-validate
data-hotkey="ctrl+shift+s, cmd+shift+s"
data-load-indicator="<?= e(trans('backend::lang.form.creating')); ?>"
data-request-before-update="$el.trigger('unchange.oc.changeMonitor')"
class="btn btn-primary wn-icon-plus">
<?= e(trans('backend::lang.form.create_and_new')); ?>
</button>
<button
type="button"
data-request="onSave"
data-browser-validate
data-hotkey="ctrl+s, cmd+s"
data-load-indicator="<?= e(trans('backend::lang.form.creating')); ?>"
data-request-before-update="$el.trigger('unchange.oc.changeMonitor')"
class="btn btn-primary wn-icon-save">
<?= e(trans('backend::lang.form.create')); ?>
</button>
<button
type="button"
data-request="onSave"
data-browser-validate
data-request-data="close:1"
data-hotkey="ctrl+enter, cmd+enter"
data-load-indicator="<?= e(trans('backend::lang.form.creating')); ?>"
data-request-before-update="$el.trigger('unchange.oc.changeMonitor')"
class="btn btn-default wn-icon-check">
<?= e(trans('backend::lang.form.create_and_close')); ?>
</button>

<a class="btn btn-default wn-icon-ban" href="<?= $this->actionUrl('') ?>"><?= e(trans('backend::lang.form.cancel')); ?></a>
</div>
21 changes: 21 additions & 0 deletions modules/backend/behaviors/formcontroller/views/preview.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php


// Decide which layout we should be rendering
$layout = $this->formLayout ?? $formConfig->formLayout ?? null;
if (!in_array($layout, ['standard', 'sidebar', 'fancy'])) {
$layout = 'standard';
}

// If required, set the appropriate body classes
$this->bodyClass = match ($layout) {
'fancy' => 'fancy-layout compact-container breadcrumb-flush breadcrumb-fancy',
'sidebar' => 'compact-container',
default => '',
};

// Define layout mode view path for inclusion
$this->appendViewPath(sprintf('%s/preview/%s', __DIR__, $layout));

// Render the form layout
echo $this->makePartial(sprintf('preview/%s.php', $layout));
14 changes: 14 additions & 0 deletions modules/backend/behaviors/formcontroller/views/preview/_fancy.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php Block::put('breadcrumb') ?>
<?= $this->makeLayoutPartial('breadcrumb') ?>
<?php Block::endPut() ?>

<?php if (!$this->fatalError): ?>
<?= Form::open(['class' => 'layout']) ?>
<div class="layout-row form-preview">
<?= $this->formRenderPreview() ?>
</div>
<?= Form::close() ?>
<?php else: ?>
<p class="flash-message static error"><?= e($this->fatalError) ?></p>
<p><a href="<?= Backend::url($formConfig->defaultRedirect) ?>" class="btn btn-default"><?= e(trans('backend::lang.form.return_to_list')); ?></a></p>
<?php endif ?>
Loading
Loading