Skip to content

Commit e6289d6

Browse files
author
Luke Towers
committed
Merge branch 'master' into wip/l6-changes
# Conflicts: # tests/unit/classes/FilesystemGeneratorTest.php
2 parents dc23fc1 + fc23104 commit e6289d6

File tree

89 files changed

+1762
-487
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

89 files changed

+1762
-487
lines changed

.travis.yml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
language: php
2+
3+
php:
4+
- 7.0
5+
- 7.1
6+
- 7.2
7+
- 7.3
8+
- nightly
9+
10+
matrix:
11+
allow_failures:
12+
- php: nightly
13+
14+
sudo: false
15+
16+
if: type = pull_request OR (type = push AND (branch = develop OR branch = master))
17+
18+
cache:
19+
directories:
20+
- $HOME/.composer/cache/files
21+
22+
install:
23+
- wget https://github.com/octobercms/october/archive/develop.zip
24+
- unzip develop.zip && rm develop.zip
25+
- mv october-develop october
26+
- mkdir -p ./october/plugins/rainlab/builder
27+
- mv !(october) october/plugins/rainlab/builder
28+
- mv .travis.yml october/plugins/rainlab/builder
29+
- cd october
30+
- composer install --no-interaction --no-progress --no-suggest
31+
- cp config/cms.php config/testing/cms.php
32+
33+
before_script:
34+
- cd ./plugins/rainlab/builder
35+
36+
script:
37+
- ../../../vendor/bin/parallel-lint .
38+
- ../../../vendor/bin/phpunit
39+
40+
jobs:
41+
include:
42+
- stage: code quality
43+
if: type = pull_request
44+
php: 7.1
45+
script:
46+
- git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" && git fetch
47+
- ../../../vendor/bin/phpcs --colors -nq --report="full" --extensions="php" $(git diff --name-only HEAD origin/$TRAVIS_BRANCH)
48+
- stage: code quality
49+
if: type = push AND (branch = develop OR branch = master)
50+
php: 7.1
51+
script: ../../../vendor/bin/phpcs --colors -nq --report="full" --extensions="php" $(git show --name-only --pretty="" $TRAVIS_COMMIT)

Plugin.php

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
<?php namespace RainLab\Builder;
22

33
use Event;
4+
use Lang;
45
use Backend;
56
use System\Classes\PluginBase;
67
use System\Classes\CombineAssets;
78
use RainLab\Builder\Classes\StandardControlsRegistry;
89
use RainLab\Builder\Classes\StandardBehaviorsRegistry;
10+
use Illuminate\Support\Facades\Validator;
11+
use RainLab\Builder\Rules\Reserved;
912

1013
class Plugin extends PluginBase
1114
{
@@ -120,13 +123,26 @@ public function registerSettings()
120123

121124
public function boot()
122125
{
123-
Event::listen('pages.builder.registerControls', function($controlLibrary) {
126+
Event::listen('pages.builder.registerControls', function ($controlLibrary) {
124127
new StandardControlsRegistry($controlLibrary);
125128
});
126129

127-
Event::listen('pages.builder.registerControllerBehaviors', function($behaviorLibrary) {
130+
Event::listen('pages.builder.registerControllerBehaviors', function ($behaviorLibrary) {
128131
new StandardBehaviorsRegistry($behaviorLibrary);
129132
});
133+
134+
// Register reserved keyword validation
135+
Event::listen('translator.beforeResolve', function ($key, $replaces, $locale) {
136+
if ($key === 'validation.reserved') {
137+
return Lang::get('rainlab.builder::lang.validation.reserved');
138+
}
139+
});
140+
141+
Validator::extend('reserved', Reserved::class);
142+
Validator::replacer('reserved', function ($message, $attribute, $rule, $parameters) {
143+
// Fixes lowercase attribute names in the new plugin modal form
144+
return ucfirst($message);
145+
});
130146
}
131147

132148
public function register()

assets/js/build-min.js

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ DatabaseTable.prototype.cmdDeleteTable=function(ev){var $target=$(ev.currentTarg
119119
$.oc.confirm($target.data('confirm'),this.proxy(this.deleteConfirmed))}
120120
DatabaseTable.prototype.cmdUnModifyForm=function(){var $masterTabPane=this.getMasterTabsActivePane()
121121
this.unmodifyTab($masterTabPane)}
122+
DatabaseTable.prototype.cmdAddIdColumn=function(ev){var $target=$(ev.currentTarget),added=this.addIdColumn($target)
123+
if(!added){alert($target.closest('form').attr('data-lang-id-exists'))}}
122124
DatabaseTable.prototype.cmdAddTimestamps=function(ev){var $target=$(ev.currentTarget),added=this.addTimeStampColumns($target,['created_at','updated_at'])
123125
if(!added){alert($target.closest('form').attr('data-lang-timestamps-exist'))}}
124126
DatabaseTable.prototype.cmdAddSoftDelete=function(ev){var $target=$(ev.currentTarget),added=this.addTimeStampColumns($target,['deleted_at'])
@@ -135,10 +137,10 @@ if(column=='allow_null'&&value){updatedRow.primary_key=0}
135137
if(column=='primary_key'&&!value){updatedRow.auto_increment=0}
136138
$target.table('setRowValues',rowIndex,updatedRow)}
137139
DatabaseTable.prototype.onTableLoaded=function(){$(document).trigger('render')
138-
var $masterTabPane=this.getMasterTabsActivePane(),$form=$masterTabPane.find('form'),$toolbar=$masterTabPane.find('div[data-control=table] div.toolbar'),$button=$('<a class="btn oc-icon-clock-o builder-custom-table-button" data-builder-command="databaseTable:cmdAddTimestamps"></a>')
139-
$button.text($form.attr('data-lang-add-timestamps'));$toolbar.append($button)
140-
$button=$('<a class="btn oc-icon-refresh builder-custom-table-button" data-builder-command="databaseTable:cmdAddSoftDelete"></a>')
141-
$button.text($form.attr('data-lang-add-soft-delete'));$toolbar.append($button)}
140+
var $masterTabPane=this.getMasterTabsActivePane(),$form=$masterTabPane.find('form'),$toolbar=$masterTabPane.find('div[data-control=table] div.toolbar'),$addIdButton=$('<a class="btn oc-icon-hashtag builder-custom-table-button" data-builder-command="databaseTable:cmdAddIdColumn"></a>'),$addTimestampsButton=$('<a class="btn oc-icon-clock-o builder-custom-table-button" data-builder-command="databaseTable:cmdAddTimestamps"></a>'),$addSoftDeleteButton=$('<a class="btn oc-icon-refresh builder-custom-table-button" data-builder-command="databaseTable:cmdAddSoftDelete"></a>')
141+
$addIdButton.text($form.attr('data-lang-add-id'));$toolbar.append($addIdButton)
142+
$addTimestampsButton.text($form.attr('data-lang-add-timestamps'));$toolbar.append($addTimestampsButton)
143+
$addSoftDeleteButton.text($form.attr('data-lang-add-soft-delete'));$toolbar.append($addSoftDeleteButton)}
142144
DatabaseTable.prototype.registerHandlers=function(){this.indexController.$masterTabs.on('oc.tableCellChanged',this.proxy(this.onTableCellChanged))}
143145
DatabaseTable.prototype.validateTable=function($target){var tableObj=this.getTableControlObject($target)
144146
tableObj.unfocusTable()
@@ -155,7 +157,8 @@ if(data.builderResponseData.operation!='delete'){$masterTabPane.find('input[name
155157
this.updateMasterTabIdAndTitle($masterTabPane,data.builderResponseData)
156158
this.unhideFormDeleteButton($masterTabPane)
157159
this.getTableList().fileList('markActive',data.builderResponseData.tabId)
158-
this.getIndexController().unchangeTab($masterTabPane)}
160+
this.getIndexController().unchangeTab($masterTabPane)
161+
this.updateTable(data.builderResponseData)}
159162
else{this.forceCloseTab($masterTabPane)}
160163
$.oc.builder.dataRegistry.clearCache(data.builderResponseData.pluginCode,'model-columns')}
161164
DatabaseTable.prototype.getTableList=function(){return $('#layout-side-panel form[data-content-id=database] [data-control=filelist]')}
@@ -166,10 +169,19 @@ tableObj.unfocusTable()
166169
var data=this.getTableData($target),result=[]
167170
for(var index in data){if(data[index].name!==undefined){result.push($.trim(data[index].name))}}
168171
return result}
172+
DatabaseTable.prototype.addIdColumn=function($target){var existingColumns=this.getColumnNames($target),added=false
173+
if(existingColumns.indexOf('id')===-1){var tableObj=this.getTableControlObject($target),currentData=this.getTableData($target),rowData={name:'id',type:'integer',unsigned:true,auto_increment:true,primary_key:true,}
174+
if(currentData.length-1||currentData[0].name||currentData[0].type||currentData[0].length||currentData[0].unsigned||currentData[0].nullable||currentData[0].auto_increment||currentData[0].primary_key||currentData[0].default){tableObj.addRecord('bottom',true)}
175+
tableObj.setRowValues(currentData.length-1,rowData)
176+
tableObj.addRecord('bottom',false)
177+
tableObj.deleteRecord()
178+
added=true}
179+
if(added){$target.trigger('change')}
180+
return added}
169181
DatabaseTable.prototype.addTimeStampColumns=function($target,columns)
170182
{var existingColumns=this.getColumnNames($target),added=false
171183
for(var index in columns){var column=columns[index]
172-
if($.inArray(column,existingColumns)==-1){this.addTimeStampColumn($target,column)
184+
if(existingColumns.indexOf(column)===-1){this.addTimeStampColumn($target,column)
173185
added=true}}
174186
if(added){$target.trigger('change')}
175187
return added}
@@ -178,6 +190,9 @@ tableObj.addRecord('bottom',true)
178190
tableObj.setRowValues(currentData.length-1,rowData)
179191
tableObj.addRecord('bottom',false)
180192
tableObj.deleteRecord()}
193+
DatabaseTable.prototype.updateTable=function(data){var tabsObject=this.getMasterTabsObject(),tabs=$('#builder-master-tabs').data('oc.tab'),tab=tabs.findByIdentifier(data.tabId)
194+
tabsObject.updateTab(tab,data.tableName,data.tab)
195+
this.onTableLoaded()}
181196
$.oc.builder.entityControllers.databaseTable=DatabaseTable;}(window.jQuery);+function($){"use strict";if($.oc.builder===undefined)
182197
$.oc.builder={}
183198
if($.oc.builder.entityControllers===undefined)
@@ -806,4 +821,4 @@ return $input.val()}
806821
LocalizationProcessor.prototype.removeLocalizationInput=function(){if(!this.localizationInput){return}
807822
this.localizationInput.dispose()
808823
this.localizationInput=null}
809-
$.oc.table.processor.builderLocalization=LocalizationProcessor;}(window.jQuery);
824+
$.oc.table.processor.builderLocalization=LocalizationProcessor;}(window.jQuery);

assets/js/builder.index.entity.databasetable.js

Lines changed: 69 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,15 @@
8686
this.unmodifyTab($masterTabPane)
8787
}
8888

89+
DatabaseTable.prototype.cmdAddIdColumn = function(ev) {
90+
var $target = $(ev.currentTarget),
91+
added = this.addIdColumn($target)
92+
93+
if (!added) {
94+
alert($target.closest('form').attr('data-lang-id-exists'))
95+
}
96+
}
97+
8998
DatabaseTable.prototype.cmdAddTimestamps = function(ev) {
9099
var $target = $(ev.currentTarget),
91100
added = this.addTimeStampColumns($target, ['created_at', 'updated_at'])
@@ -159,14 +168,18 @@
159168
var $masterTabPane = this.getMasterTabsActivePane(),
160169
$form = $masterTabPane.find('form'),
161170
$toolbar = $masterTabPane.find('div[data-control=table] div.toolbar'),
162-
$button = $('<a class="btn oc-icon-clock-o builder-custom-table-button" data-builder-command="databaseTable:cmdAddTimestamps"></a>')
171+
$addIdButton = $('<a class="btn oc-icon-hashtag builder-custom-table-button" data-builder-command="databaseTable:cmdAddIdColumn"></a>'),
172+
$addTimestampsButton = $('<a class="btn oc-icon-clock-o builder-custom-table-button" data-builder-command="databaseTable:cmdAddTimestamps"></a>'),
173+
$addSoftDeleteButton = $('<a class="btn oc-icon-refresh builder-custom-table-button" data-builder-command="databaseTable:cmdAddSoftDelete"></a>')
174+
175+
$addIdButton.text($form.attr('data-lang-add-id'));
176+
$toolbar.append($addIdButton)
163177

164-
$button.text($form.attr('data-lang-add-timestamps'));
165-
$toolbar.append($button)
178+
$addTimestampsButton.text($form.attr('data-lang-add-timestamps'));
179+
$toolbar.append($addTimestampsButton)
166180

167-
$button = $('<a class="btn oc-icon-refresh builder-custom-table-button" data-builder-command="databaseTable:cmdAddSoftDelete"></a>')
168-
$button.text($form.attr('data-lang-add-soft-delete'));
169-
$toolbar.append($button)
181+
$addSoftDeleteButton.text($form.attr('data-lang-add-soft-delete'));
182+
$toolbar.append($addSoftDeleteButton)
170183
}
171184

172185
// INTERNAL METHODS
@@ -218,6 +231,8 @@
218231

219232
this.getTableList().fileList('markActive', data.builderResponseData.tabId)
220233
this.getIndexController().unchangeTab($masterTabPane)
234+
235+
this.updateTable(data.builderResponseData)
221236
}
222237
else {
223238
this.forceCloseTab($masterTabPane)
@@ -255,6 +270,42 @@
255270
return result
256271
}
257272

273+
DatabaseTable.prototype.addIdColumn = function($target) {
274+
var existingColumns = this.getColumnNames($target),
275+
added = false
276+
277+
if (existingColumns.indexOf('id') === -1) {
278+
var tableObj = this.getTableControlObject($target),
279+
currentData = this.getTableData($target),
280+
rowData = {
281+
name: 'id',
282+
type: 'integer',
283+
unsigned: true,
284+
auto_increment: true,
285+
primary_key: true,
286+
}
287+
288+
if (currentData.length - 1 || currentData[0].name || currentData[0].type || currentData[0].length || currentData[0].unsigned || currentData[0].nullable || currentData[0].auto_increment || currentData[0].primary_key || currentData[0].default) {
289+
tableObj.addRecord('bottom', true)
290+
}
291+
292+
tableObj.setRowValues(currentData.length - 1, rowData)
293+
294+
// Forces the table to apply values
295+
// from the data source
296+
tableObj.addRecord('bottom', false)
297+
tableObj.deleteRecord()
298+
299+
added = true
300+
}
301+
302+
if (added) {
303+
$target.trigger('change')
304+
}
305+
306+
return added
307+
}
308+
258309
DatabaseTable.prototype.addTimeStampColumns = function($target, columns)
259310
{
260311
var existingColumns = this.getColumnNames($target),
@@ -263,7 +314,7 @@
263314
for (var index in columns) {
264315
var column = columns[index]
265316

266-
if ($.inArray(column, existingColumns) == -1) {
317+
if (existingColumns.indexOf(column) === -1) {
267318
this.addTimeStampColumn($target, column)
268319
added = true
269320
}
@@ -287,17 +338,26 @@
287338
}
288339

289340
tableObj.addRecord('bottom', true)
290-
tableObj.setRowValues(currentData.length-1, rowData)
341+
tableObj.setRowValues(currentData.length - 1, rowData)
291342

292343
// Forces the table to apply values
293344
// from the data source
294345
tableObj.addRecord('bottom', false)
295346
tableObj.deleteRecord()
296347
}
297348

349+
DatabaseTable.prototype.updateTable = function(data) {
350+
var tabsObject = this.getMasterTabsObject(),
351+
tabs = $('#builder-master-tabs').data('oc.tab'),
352+
tab = tabs.findByIdentifier(data.tabId)
353+
354+
tabsObject.updateTab(tab, data.tableName, data.tab)
355+
this.onTableLoaded()
356+
}
357+
298358
// REGISTRATION
299359
// ============================
300360

301361
$.oc.builder.entityControllers.databaseTable = DatabaseTable;
302362

303-
}(window.jQuery);
363+
}(window.jQuery);

assets/less/builder.less

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,4 +195,4 @@ div.control-table .toolbar a.builder-custom-table-button {
195195
background: white;
196196
}
197197
}
198-
}
198+
}

behaviors/IndexControllerOperations.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public function onControllerCreate()
6262
$result = $this->controller->widget->controllerList->updateList();
6363

6464
if ($model->behaviors) {
65-
// Create a new tab only for controllers
65+
// Create a new tab only for controllers
6666
// with behaviors.
6767

6868
$widget = $this->makeBaseFormWidget($model->controller, $options);
@@ -169,4 +169,4 @@ protected function mergeRegistryDataIntoResult(&$result, $pluginCodeObj)
169169
'pluginCode' => $pluginCode
170170
];
171171
}
172-
}
172+
}

behaviors/IndexDataRegistry.php

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,34 +33,34 @@ public function onPluginDataRegistryGetData()
3333
$result = null;
3434

3535
switch ($type) {
36-
case 'localization':
36+
case 'localization':
3737
$result = LocalizationModel::getPluginRegistryData($code, $subtype);
3838
break;
3939
case 'model-classes':
4040
$result = ModelModel::getPluginRegistryData($code, $subtype);
4141
break;
42-
case 'model-forms' :
42+
case 'model-forms':
4343
$result = ModelFormModel::getPluginRegistryData($code, $subtype);
4444
break;
45-
case 'model-lists' :
45+
case 'model-lists':
4646
$result = ModelListModel::getPluginRegistryData($code, $subtype);
4747
break;
48-
case 'controller-urls' :
48+
case 'controller-urls':
4949
$result = ControllerModel::getPluginRegistryData($code, $subtype);
5050
break;
51-
case 'model-columns' :
51+
case 'model-columns':
5252
$result = ModelModel::getPluginRegistryDataColumns($code, $subtype);
5353
break;
54-
case 'plugin-lists' :
54+
case 'plugin-lists':
5555
$result = ModelListModel::getPluginRegistryDataAllRecords($code);
5656
break;
57-
case 'permissions' :
57+
case 'permissions':
5858
$result = PermissionsModel::getPluginRegistryData($code);
5959
break;
60-
default:
60+
default:
6161
throw new SystemException('Unknown plugin registry data type requested.');
6262
}
6363

6464
return ['registryData' => $result];
6565
}
66-
}
66+
}

0 commit comments

Comments
 (0)