dimti
4 years ago
commit
2948e85088
10 changed files with 355 additions and 0 deletions
-
1.gitignore
-
21listswitch/LICENSE
-
137listswitch/ListSwitchField.php
-
94listswitch/Plugin.php
-
39listswitch/README.md
-
14listswitch/lang/en/lang.php
-
14listswitch/lang/fr/lang.php
-
14listswitch/lang/hu/lang.php
-
14listswitch/lang/ru/lang.php
-
7listswitch/updates/version.yaml
@ -0,0 +1 @@ |
|||||
|
/.idea |
@ -0,0 +1,21 @@ |
|||||
|
MIT License |
||||
|
|
||||
|
Copyright (c) 2017 inetis.ch |
||||
|
|
||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
|
of this software and associated documentation files (the "Software"), to deal |
||||
|
in the Software without restriction, including without limitation the rights |
||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
|
copies of the Software, and to permit persons to whom the Software is |
||||
|
furnished to do so, subject to the following conditions: |
||||
|
|
||||
|
The above copyright notice and this permission notice shall be included in all |
||||
|
copies or substantial portions of the Software. |
||||
|
|
||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||
|
SOFTWARE. |
@ -0,0 +1,137 @@ |
|||||
|
<?php namespace Inetis\ListSwitch; |
||||
|
|
||||
|
use Backend\Classes\ListColumn; |
||||
|
use Lang; |
||||
|
use Model; |
||||
|
|
||||
|
class ListSwitchField |
||||
|
{ |
||||
|
/** |
||||
|
* Default field configuration |
||||
|
* all these params can be overrided by column config |
||||
|
* @var array |
||||
|
*/ |
||||
|
private static $defaultFieldConfig = [ |
||||
|
'icon' => true, |
||||
|
'titleTrue' => 'inetis.listswitch::lang.inetis.listswitch.title_true', |
||||
|
'titleFalse' => 'inetis.listswitch::lang.inetis.listswitch.title_false', |
||||
|
'textTrue' => 'inetis.listswitch::lang.inetis.listswitch.text_true', |
||||
|
'textFalse' => 'inetis.listswitch::lang.inetis.listswitch.text_false', |
||||
|
'request' => 'onSwitchInetisListField' |
||||
|
]; |
||||
|
|
||||
|
private static $listConfig = []; |
||||
|
|
||||
|
/** |
||||
|
* @param $field |
||||
|
* @param array $config |
||||
|
* |
||||
|
* @internal param $name |
||||
|
*/ |
||||
|
public static function storeFieldConfig($field, array $config) |
||||
|
{ |
||||
|
self::$listConfig[$field] = array_merge(self::$defaultFieldConfig, $config, ['name' => $field]); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @param $value |
||||
|
* @param ListColumn $column |
||||
|
* @param Model $record |
||||
|
* |
||||
|
* @return string HTML |
||||
|
*/ |
||||
|
public static function render($value, ListColumn $column, Model $record) |
||||
|
{ |
||||
|
$field = new self($value, $column, $record); |
||||
|
$config = $field->getConfig(); |
||||
|
|
||||
|
return ' |
||||
|
<a href="javascript:;" |
||||
|
data-request="' . $config['request'] . '" |
||||
|
data-request-data="' . $field->getRequestData() . '" |
||||
|
data-stripe-load-indicator |
||||
|
title="' . $field->getButtonTitle() . '"> |
||||
|
' . $field->getButtonValue() . ' |
||||
|
</a> |
||||
|
'; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* ListSwitchField constructor. |
||||
|
* |
||||
|
* @param $value |
||||
|
* @param ListColumn $column |
||||
|
* @param Model $record |
||||
|
*/ |
||||
|
public function __construct($value, ListColumn $column, Model $record) |
||||
|
{ |
||||
|
$this->name = $column->columnName; |
||||
|
$this->value = $value; |
||||
|
$this->column = $column; |
||||
|
$this->record = $record; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @param $config |
||||
|
* |
||||
|
* @return mixed |
||||
|
*/ |
||||
|
private function getConfig($config = null) |
||||
|
{ |
||||
|
if (is_null($config)) { |
||||
|
return self::$listConfig[$this->name]; |
||||
|
} |
||||
|
|
||||
|
return self::$listConfig[$this->name][$config]; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Return data-request-data params for the switch button |
||||
|
* |
||||
|
* @return string |
||||
|
*/ |
||||
|
public function getRequestData() |
||||
|
{ |
||||
|
$modelClass = str_replace('\\', '\\\\', get_class($this->record)); |
||||
|
|
||||
|
$data = [ |
||||
|
"id: {$this->record->{$this->record->getKeyName()}}", |
||||
|
"field: '$this->name'", |
||||
|
"model: '$modelClass'" |
||||
|
]; |
||||
|
|
||||
|
if (post('page')) { |
||||
|
$data[] = "page: " . post('page'); |
||||
|
} |
||||
|
|
||||
|
return implode(', ', $data); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Return button text or icon |
||||
|
* |
||||
|
* @return string |
||||
|
*/ |
||||
|
public function getButtonValue() |
||||
|
{ |
||||
|
if (!$this->getConfig('icon')) { |
||||
|
return Lang::get($this->getConfig($this->value ? 'textTrue' : 'textFalse')); |
||||
|
} |
||||
|
|
||||
|
if ($this->value) { |
||||
|
return '<i class="oc-icon-check"></i>'; |
||||
|
} |
||||
|
|
||||
|
return '<i class="oc-icon-times"></i>'; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Return button hover title |
||||
|
* |
||||
|
* @return string |
||||
|
*/ |
||||
|
public function getButtonTitle() |
||||
|
{ |
||||
|
return Lang::get($this->getConfig($this->value ? 'titleTrue' : 'titleFalse')); |
||||
|
} |
||||
|
} |
@ -0,0 +1,94 @@ |
|||||
|
<?php namespace Inetis\ListSwitch; |
||||
|
|
||||
|
use Backend\Classes\Controller; |
||||
|
use Event; |
||||
|
use Flash; |
||||
|
use System\Classes\PluginBase; |
||||
|
|
||||
|
/** |
||||
|
* listSwitch Plugin Information File |
||||
|
*/ |
||||
|
class Plugin extends PluginBase |
||||
|
{ |
||||
|
/** |
||||
|
* Returns information about this plugin. |
||||
|
* |
||||
|
* @return array |
||||
|
*/ |
||||
|
public function pluginDetails() |
||||
|
{ |
||||
|
return [ |
||||
|
'name' => 'inetis.listswitch::lang.inetis.plugin.name', |
||||
|
'description' => 'inetis.listswitch::lang.inetis.plugin.description', |
||||
|
'author' => 'inetis', |
||||
|
'icon' => 'icon-toggle-on', |
||||
|
'homepage' => 'https://github.com/inetis-ch/oc-ListSwitch', |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Register custom list type |
||||
|
* |
||||
|
* @return array |
||||
|
*/ |
||||
|
public function registerListColumnTypes() |
||||
|
{ |
||||
|
return [ |
||||
|
'inetis-list-switch' => [ListSwitchField::class, 'render'], |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Boot method, called right before the request route. |
||||
|
* |
||||
|
* @return array |
||||
|
*/ |
||||
|
public function boot() |
||||
|
{ |
||||
|
Event::listen('backend.list.extendColumns', function ($widget) { |
||||
|
/** @var \Backend\Widgets\Lists $widget */ |
||||
|
foreach ($widget->config->columns as $name => $config) { |
||||
|
if (empty($config['type']) || $config['type'] !== 'inetis-list-switch') { |
||||
|
continue; |
||||
|
} |
||||
|
|
||||
|
// Store field config here, before that unofficial fields was removed
|
||||
|
ListSwitchField::storeFieldConfig($name, $config); |
||||
|
|
||||
|
$widget->addColumns([ |
||||
|
$name => array_merge($config, [ |
||||
|
'clickable' => false, |
||||
|
]), |
||||
|
]); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
/** |
||||
|
* Switch a boolean value of a model field |
||||
|
* @return void |
||||
|
*/ |
||||
|
Controller::extend(function ($controller) { |
||||
|
/** @var Controller $controller */ |
||||
|
$controller->addDynamicMethod('index_onSwitchInetisListField', function () use ($controller) { |
||||
|
|
||||
|
$field = post('field'); |
||||
|
$id = post('id'); |
||||
|
$modelClass = post('model'); |
||||
|
|
||||
|
if (empty($field) || empty($id) || empty($modelClass)) { |
||||
|
Flash::error('Following parameters are required : id, field, model'); |
||||
|
|
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
$model = new $modelClass; |
||||
|
$item = $model::find($id); |
||||
|
$item->{$field} = !$item->{$field}; |
||||
|
|
||||
|
$item->save(); |
||||
|
|
||||
|
return $controller->listRefresh($controller->primaryDefinition); |
||||
|
}); |
||||
|
}); |
||||
|
} |
||||
|
} |
@ -0,0 +1,39 @@ |
|||||
|
# About |
||||
|
OctoberCMS plugin to add a toggleable switch as a column type to the backend. |
||||
|
|
||||
|
## Usage |
||||
|
|
||||
|
To add a switch column to a list; set the `type` of the column to `inetis-list-switch`. |
||||
|
|
||||
|
Example: |
||||
|
```yaml |
||||
|
your_column: |
||||
|
label: 'Your Label' |
||||
|
# Define the type as "inetis-list-switch" to enable this functionality |
||||
|
type: inetis-list-switch |
||||
|
|
||||
|
# Whether to use ✓/✗ icons to replace the Yes/No text (default: true) |
||||
|
icon: true |
||||
|
|
||||
|
# Overrides the title displayed on hover over the column |
||||
|
titleTrue: 'Unpublish item' # (default: 'inetis.listswitch::lang.inetis.listswitch.title_true') |
||||
|
titleFalse: 'Publish item' # (default: 'inetis.listswitch::lang.inetis.listswitch.title_false') |
||||
|
|
||||
|
# Overrides the text displayed on the button |
||||
|
textTrue: 'Published' # (default: 'inetis.listswitch::lang.inetis.listswitch.text_true') |
||||
|
textFalse: 'Unpublished' #(default: 'inetis.listswitch::lang.inetis.listswitch.text_false') |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
## Demo |
||||
|
*Default behavior* |
||||
|
![switch-icon](https://cloud.githubusercontent.com/assets/12028540/23846134/2e0245c8-07cc-11e7-82a6-c5c0c940b453.gif) |
||||
|
|
||||
|
*Behavior with ` icon: false`* |
||||
|
![switch-text](https://cloud.githubusercontent.com/assets/12028540/23846200/a88ac8c4-07cc-11e7-89fd-ccb61a701b82.gif) |
||||
|
|
||||
|
*With custom titles* |
||||
|
![switch-icon-custom-titles](https://cloud.githubusercontent.com/assets/12028540/23846367/69e1f89e-07cd-11e7-9f8b-943aa9301464.gif) |
||||
|
|
||||
|
## Author |
||||
|
inetis is a webdesign agency in Vufflens-la-Ville, Switzerland. We love coding and creating powerful apps and sites [see our website](https://inetis.ch). |
@ -0,0 +1,14 @@ |
|||||
|
<?php return [ |
||||
|
'inetis' => [ |
||||
|
'plugin' => [ |
||||
|
'name' => 'List Switch', |
||||
|
'description' => 'Add the possibility to create buttons in backend lists that toggle a model property.', |
||||
|
], |
||||
|
'listswitch' => [ |
||||
|
'title_true' => 'Click to switch to No', |
||||
|
'title_false' => 'Click to switch to Yes', |
||||
|
'text_true' => 'Yes', |
||||
|
'text_false' => 'No', |
||||
|
], |
||||
|
], |
||||
|
]; |
@ -0,0 +1,14 @@ |
|||||
|
<?php return [ |
||||
|
'inetis' => [ |
||||
|
'plugin' => [ |
||||
|
'name' => 'Liste Switch', |
||||
|
'description' => "Ajoute la possibilité de créer des boutons dans les listes de l'administration qui inversent la valeur d'un champ.", |
||||
|
], |
||||
|
'listswitch' => [ |
||||
|
'title_true' => 'Cliquez pour passer le statut à Non', |
||||
|
'title_false' => 'Cliquez pour passer le statut à Oui', |
||||
|
'text_true' => 'Oui', |
||||
|
'text_false' => 'Non', |
||||
|
], |
||||
|
], |
||||
|
]; |
@ -0,0 +1,14 @@ |
|||||
|
<?php return [ |
||||
|
'inetis' => [ |
||||
|
'plugin' => [ |
||||
|
'name' => 'Gyorskapcsoló listákhoz', |
||||
|
'description' => 'Kattintható mező lehetőség hozzádása az admin listákhoz.', |
||||
|
], |
||||
|
'listswitch' => [ |
||||
|
'title_true' => 'Váltás erre: Nem', |
||||
|
'title_false' => 'Váltás erre: Igen', |
||||
|
'text_true' => 'Igen', |
||||
|
'text_false' => 'Nem', |
||||
|
], |
||||
|
], |
||||
|
]; |
@ -0,0 +1,14 @@ |
|||||
|
<?php return [ |
||||
|
'inetis' => [ |
||||
|
'plugin' => [ |
||||
|
'name' => 'List Switch', |
||||
|
'description' => 'Добавьте возможность создавать кнопки в бэкэнд-списках, которые переключают свойство модели.', |
||||
|
], |
||||
|
'listswitch' => [ |
||||
|
'title_true' => 'Нажмите чтобы переключить на Нет', |
||||
|
'title_false' => 'Нажмите чтобы переключить на Да', |
||||
|
'text_true' => 'Да', |
||||
|
'text_false' => 'Нет', |
||||
|
], |
||||
|
], |
||||
|
]; |
@ -0,0 +1,7 @@ |
|||||
|
1.0.1: First version of listSwitch |
||||
|
1.0.2: |
||||
|
- Display correctly the column label |
||||
|
- Add Hungarian translation |
||||
|
1.0.3: |
||||
|
- Preserve column configs |
||||
|
- Add Russian translation |
Write
Preview
Loading…
Cancel
Save
Reference in new issue