parent
671fb9b024
commit
ace61f2a07
@ -0,0 +1,12 @@ |
|||||||
|
.PHONY: build dev watch prod ana |
||||||
|
|
||||||
|
build: dev |
||||||
|
|
||||||
|
dev: |
||||||
|
npm run dev
|
||||||
|
watch: |
||||||
|
npm run watch
|
||||||
|
ana: |
||||||
|
npm run dev-analyze
|
||||||
|
prod: |
||||||
|
npm run prod
|
@ -0,0 +1,76 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
|
||||||
|
namespace App\Tables; |
||||||
|
|
||||||
|
|
||||||
|
abstract class BaseNumerator |
||||||
|
{ |
||||||
|
/** @var int */ |
||||||
|
protected $next; |
||||||
|
|
||||||
|
/** @var int */ |
||||||
|
protected $last; |
||||||
|
|
||||||
|
/** |
||||||
|
* BaseNumerator constructor. |
||||||
|
* |
||||||
|
* @param int|int[] $first - first index, or [first, last] |
||||||
|
* @param int|null $last - last index, or null |
||||||
|
*/ |
||||||
|
public function __construct($first, $last = null) |
||||||
|
{ |
||||||
|
if (is_array($first) && $last === null) { |
||||||
|
list($first, $last) = $first; |
||||||
|
} |
||||||
|
|
||||||
|
$this->next = $first; |
||||||
|
$this->last = $last; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get next key, incrementing the internal state |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function next() |
||||||
|
{ |
||||||
|
if (!$this->hasMore()) |
||||||
|
throw new \OutOfBoundsException("Column numerator has run out of allocated GCID slots"); |
||||||
|
|
||||||
|
$key = $this->getKey($this->next); |
||||||
|
$this->next++; |
||||||
|
return $key; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Convert numeric index to a key |
||||||
|
* |
||||||
|
* @param int $index |
||||||
|
* @return mixed |
||||||
|
*/ |
||||||
|
protected function getKey($index) |
||||||
|
{ |
||||||
|
return $index; // simple default |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @return bool - true iof there are more keys available |
||||||
|
*/ |
||||||
|
protected function hasMore() |
||||||
|
{ |
||||||
|
return $this->next <= $this->last; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Generate all keys |
||||||
|
* |
||||||
|
* @return \Generator |
||||||
|
*/ |
||||||
|
public function generate() |
||||||
|
{ |
||||||
|
while ($this->hasMore()) { |
||||||
|
yield $this->next(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,201 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
return [ |
||||||
|
|
||||||
|
/* |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| Debugbar Settings |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| |
||||||
|
| Debugbar is enabled by default, when debug is set to true in app.php. |
||||||
|
| You can override the value by setting enable to true or false instead of null. |
||||||
|
| |
||||||
|
| You can provide an array of URI's that must be ignored (eg. 'api/*') |
||||||
|
| |
||||||
|
*/ |
||||||
|
|
||||||
|
'enabled' => env('DEBUGBAR_ENABLED', null), |
||||||
|
'except' => [ |
||||||
|
// |
||||||
|
], |
||||||
|
|
||||||
|
/* |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| Storage settings |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| |
||||||
|
| DebugBar stores data for session/ajax requests. |
||||||
|
| You can disable this, so the debugbar stores data in headers/session, |
||||||
|
| but this can cause problems with large data collectors. |
||||||
|
| By default, file storage (in the storage folder) is used. Redis and PDO |
||||||
|
| can also be used. For PDO, run the package migrations first. |
||||||
|
| |
||||||
|
*/ |
||||||
|
'storage' => [ |
||||||
|
'enabled' => true, |
||||||
|
'driver' => 'file', // redis, file, pdo, custom |
||||||
|
'path' => storage_path('debugbar'), // For file driver |
||||||
|
'connection' => null, // Leave null for default connection (Redis/PDO) |
||||||
|
'provider' => '' // Instance of StorageInterface for custom driver |
||||||
|
], |
||||||
|
|
||||||
|
/* |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| Vendors |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| |
||||||
|
| Vendor files are included by default, but can be set to false. |
||||||
|
| This can also be set to 'js' or 'css', to only include javascript or css vendor files. |
||||||
|
| Vendor files are for css: font-awesome (including fonts) and highlight.js (css files) |
||||||
|
| and for js: jquery and and highlight.js |
||||||
|
| So if you want syntax highlighting, set it to true. |
||||||
|
| jQuery is set to not conflict with existing jQuery scripts. |
||||||
|
| |
||||||
|
*/ |
||||||
|
|
||||||
|
'include_vendors' => true, |
||||||
|
|
||||||
|
/* |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| Capture Ajax Requests |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| |
||||||
|
| The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors), |
||||||
|
| you can use this option to disable sending the data through the headers. |
||||||
|
| |
||||||
|
| Optionally, you can also send ServerTiming headers on ajax requests for the Chrome DevTools. |
||||||
|
*/ |
||||||
|
|
||||||
|
'capture_ajax' => true, |
||||||
|
'add_ajax_timing' => false, |
||||||
|
|
||||||
|
/* |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| Custom Error Handler for Deprecated warnings |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| |
||||||
|
| When enabled, the Debugbar shows deprecated warnings for Symfony components |
||||||
|
| in the Messages tab. |
||||||
|
| |
||||||
|
*/ |
||||||
|
'error_handler' => false, |
||||||
|
|
||||||
|
/* |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| Clockwork integration |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| |
||||||
|
| The Debugbar can emulate the Clockwork headers, so you can use the Chrome |
||||||
|
| Extension, without the server-side code. It uses Debugbar collectors instead. |
||||||
|
| |
||||||
|
*/ |
||||||
|
'clockwork' => false, |
||||||
|
|
||||||
|
/* |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| DataCollectors |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| |
||||||
|
| Enable/disable DataCollectors |
||||||
|
| |
||||||
|
*/ |
||||||
|
|
||||||
|
'collectors' => [ |
||||||
|
'phpinfo' => true, // Php version |
||||||
|
'messages' => true, // Messages |
||||||
|
'time' => true, // Time Datalogger |
||||||
|
'memory' => true, // Memory usage |
||||||
|
'exceptions' => true, // Exception displayer |
||||||
|
'log' => true, // Logs from Monolog (merged in messages if enabled) |
||||||
|
'db' => true, // Show database (PDO) queries and bindings |
||||||
|
'views' => true, // Views with their data |
||||||
|
'route' => true, // Current route information |
||||||
|
'auth' => true, // Display Laravel authentication status |
||||||
|
'gate' => true, // Display Laravel Gate checks |
||||||
|
'session' => true, // Display session data |
||||||
|
'symfony_request' => true, // Only one can be enabled.. |
||||||
|
'mail' => true, // Catch mail messages |
||||||
|
'laravel' => false, // Laravel version and environment |
||||||
|
'events' => false, // All events fired |
||||||
|
'default_request' => false, // Regular or special Symfony request logger |
||||||
|
'logs' => false, // Add the latest log messages |
||||||
|
'files' => false, // Show the included files |
||||||
|
'config' => false, // Display config settings |
||||||
|
'cache' => false, // Display cache events |
||||||
|
], |
||||||
|
|
||||||
|
/* |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| Extra options |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| |
||||||
|
| Configure some DataCollectors |
||||||
|
| |
||||||
|
*/ |
||||||
|
|
||||||
|
'options' => [ |
||||||
|
'auth' => [ |
||||||
|
'show_name' => true, // Also show the users name/email in the debugbar |
||||||
|
], |
||||||
|
'db' => [ |
||||||
|
'with_params' => true, // Render SQL with the parameters substituted |
||||||
|
'backtrace' => true, // Use a backtrace to find the origin of the query in your files. |
||||||
|
'timeline' => false, // Add the queries to the timeline |
||||||
|
'explain' => [ // Show EXPLAIN output on queries |
||||||
|
'enabled' => false, |
||||||
|
'types' => ['SELECT'], // ['SELECT', 'INSERT', 'UPDATE', 'DELETE']; for MySQL 5.6.3+ |
||||||
|
], |
||||||
|
'hints' => true, // Show hints for common mistakes |
||||||
|
], |
||||||
|
'mail' => [ |
||||||
|
'full_log' => false |
||||||
|
], |
||||||
|
'views' => [ |
||||||
|
'data' => false, //Note: Can slow down the application, because the data can be quite large.. |
||||||
|
], |
||||||
|
'route' => [ |
||||||
|
'label' => true // show complete route on bar |
||||||
|
], |
||||||
|
'logs' => [ |
||||||
|
'file' => null |
||||||
|
], |
||||||
|
'cache' => [ |
||||||
|
'values' => true // collect cache values |
||||||
|
], |
||||||
|
], |
||||||
|
|
||||||
|
/* |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| Inject Debugbar in Response |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| |
||||||
|
| Usually, the debugbar is added just before </body>, by listening to the |
||||||
|
| Response after the App is done. If you disable this, you have to add them |
||||||
|
| in your template yourself. See http://phpdebugbar.com/docs/rendering.html |
||||||
|
| |
||||||
|
*/ |
||||||
|
|
||||||
|
'inject' => true, |
||||||
|
|
||||||
|
/* |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| DebugBar route prefix |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| |
||||||
|
| Sometimes you want to set route prefix to be used by DebugBar to load |
||||||
|
| its resources from. Usually the need comes from misconfigured web server or |
||||||
|
| from trying to overcome bugs like this: http://trac.nginx.org/nginx/ticket/97 |
||||||
|
| |
||||||
|
*/ |
||||||
|
'route_prefix' => '_debugbar', |
||||||
|
|
||||||
|
/* |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| DebugBar route domain |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| |
||||||
|
| By default DebugBar route served from the same domain that request served. |
||||||
|
| To override default domain, specify it as a non-empty value. |
||||||
|
*/ |
||||||
|
'route_domain' => null, |
||||||
|
]; |
@ -1,5 +1,12 @@ |
|||||||
// subset of used lodash modules
|
// subset of used lodash modules
|
||||||
|
|
||||||
export { default as each } from 'lodash/each'; |
export { default as each } from 'lodash/each' |
||||||
export { default as isUndefined } from 'lodash/isUndefined'; |
export { default as isUndefined } from 'lodash/isUndefined' |
||||||
export { default as merge } from 'lodash/merge'; |
export { default as merge } from 'lodash/merge' |
||||||
|
export { default as unset } from 'lodash/unset' |
||||||
|
export { default as isEmpty } from 'lodash/isEmpty' |
||||||
|
|
||||||
|
function isDefined(x) { |
||||||
|
return typeof(x) !== 'undefined'; |
||||||
|
} |
||||||
|
export { isDefined } |
||||||
|
@ -1,9 +1,27 @@ |
|||||||
window.Vue = require('vue'); |
window.Vue = require('vue'); |
||||||
|
|
||||||
Vue.component('column-editor', require('./components/ColumnEditor.vue')); |
const ColumnEditorCtor = Vue.component('column-editor', require('./components/ColumnEditor.vue')); |
||||||
Vue.component('row-editor', require('./components/RowEditor.vue')); |
const RowsEditorCtor = Vue.component('rows-editor', require('./components/RowsEditor.vue')); |
||||||
Vue.component('v-icon', require('./components/Icon.vue')); |
const IconCtor = Vue.component('v-icon', require('./components/Icon.vue')); |
||||||
|
|
||||||
const app = new Vue({ |
// const app = new Vue({
|
||||||
el: '#app' |
// el: '#app'
|
||||||
}); |
// });
|
||||||
|
|
||||||
|
window.app = { |
||||||
|
ColumnEditor: function(selector, data) { |
||||||
|
new ColumnEditorCtor({ |
||||||
|
propsData: data |
||||||
|
}).$mount(selector); |
||||||
|
}, |
||||||
|
RowsEditor: function(selector, data) { |
||||||
|
new RowsEditorCtor({ |
||||||
|
propsData: data |
||||||
|
}).$mount(selector); |
||||||
|
}, |
||||||
|
Icon: function(selector, data) { |
||||||
|
new IconCtor({ |
||||||
|
propsData: data |
||||||
|
}).$mount(selector); |
||||||
|
} |
||||||
|
} |
||||||
|
@ -1,6 +1,52 @@ |
|||||||
@php($tab='add-rows') |
@php |
||||||
@extends('table.propose.layout') |
$tab = 'add-rows'; |
||||||
|
/** @var \App\Tables\Column[] $columns */ |
||||||
|
/** @var \App\Tables\Changeset $changeset */ |
||||||
|
/** @var \App\Models\Row[]|Illuminate\Pagination\Paginator $rows */ |
||||||
|
/** @var \App\Models\Table $table */ |
||||||
|
@endphp |
||||||
|
@extends('table.propose.layout-row-pagination') |
||||||
|
|
||||||
@section('tab-content') |
@section('header') |
||||||
... |
<div class="form-inline py-2 px-1 border-bottom mb-3"> |
||||||
|
{{-- TODO improve layout --}} |
||||||
|
<form action="{{$table->draftUpdateRoute}}" method="POST" class="form-inline"> |
||||||
|
@csrf |
||||||
|
<input type="hidden" name="action" value="rows.add-csv"> |
||||||
|
<input type="hidden" name="redirect" value="{{request()->fullUrl()}}"> |
||||||
|
<label class="pr-2" for="csv-data">Add CSV:</label> |
||||||
|
<textarea name="data" id="csv-data" |
||||||
|
title="{{$errors->has('data') ? $errors->first('data') : ''}}" |
||||||
|
class="form-control mr-1 {{ $errors->has('data')?'is-invalid':'' }}" |
||||||
|
style="width:30em; height:10em">{{old('data')}}</textarea> |
||||||
|
<button class="btn btn-outline-success">Append</button> |
||||||
|
</form> |
||||||
|
|
||||||
|
<div class="flex-grow-1"></div> |
||||||
|
|
||||||
|
<form action="{{$table->draftUpdateRoute}}" method="POST"> |
||||||
|
@csrf |
||||||
|
<input type="hidden" name="action" value="rows.add"> |
||||||
|
<input type="hidden" name="redirect" value="{{request()->fullUrl()}}"> |
||||||
|
<label class="form-inline pr-2" for="newrow-count">Add Empty Rows:</label> |
||||||
|
<input name="count" id="newrow-count" type="number" min=1 step=1 value=1 class="form-control mr-1" style="width:10em"> |
||||||
|
<button class="btn btn-outline-success">Add</button> |
||||||
|
</form> |
||||||
|
</div> |
||||||
@stop |
@stop |
||||||
|
|
||||||
|
@section('rows') |
||||||
|
<div id="rows-editor"></div> |
||||||
|
@stop |
||||||
|
|
||||||
|
@push('scripts') |
||||||
|
<script> |
||||||
|
ready(function() { |
||||||
|
app.RowsEditor('#rows-editor', { |
||||||
|
route: {!! toJSON($table->draftUpdateRoute) !!}, |
||||||
|
columns: {!! toJSON($columns) !!}, |
||||||
|
xRows: {!! toJSON($rows->keyBy('_id'), true) !!}, |
||||||
|
}) |
||||||
|
}); |
||||||
|
</script> |
||||||
|
@endpush |
||||||
|
Loading…
Reference in new issue