├── .babelrc ├── .gitignore ├── README.md ├── composer.json ├── dist └── nova-element-ui.js ├── fonts └── vendor │ └── element-ui │ └── lib │ └── theme-chalk │ ├── element-icons.ttf │ └── element-icons.woff ├── mix-manifest.json ├── package.json ├── resources └── js │ └── nova-element-ui.js ├── src ├── Fields │ ├── ElementAutocomplete │ │ ├── ElementAutocomplete.php │ │ ├── FieldServiceProvider.php │ │ └── assets │ │ │ ├── css │ │ │ └── field.css │ │ │ └── js │ │ │ └── field.js │ ├── ElementCheckbox │ │ ├── ElementCheckbox.php │ │ ├── FieldServiceProvider.php │ │ └── assets │ │ │ ├── css │ │ │ └── field.css │ │ │ └── js │ │ │ └── field.js │ ├── ElementInput │ │ ├── .gitignore │ │ ├── ElementInput.php │ │ ├── FieldServiceProvider.php │ │ └── assets │ │ │ ├── css │ │ │ └── field.css │ │ │ └── js │ │ │ └── field.js │ ├── ElementNumber │ │ ├── .gitignore │ │ ├── ElementNumber.php │ │ ├── FieldServiceProvider.php │ │ └── assets │ │ │ ├── css │ │ │ └── field.css │ │ │ └── js │ │ │ └── field.js │ ├── ElementPassword │ │ └── ElementPassword.php │ ├── ElementRadio │ │ ├── ElementRadio.php │ │ ├── FieldServiceProvider.php │ │ └── assets │ │ │ ├── css │ │ │ └── field.css │ │ │ └── js │ │ │ └── field.js │ ├── ElementSelect │ │ ├── .gitignore │ │ ├── ElementSelect.php │ │ ├── FieldServiceProvider.php │ │ └── assets │ │ │ ├── css │ │ │ └── field.css │ │ │ └── js │ │ │ └── field.js │ ├── ElementSwitch │ │ ├── .gitignore │ │ └── ElementSwitch.php │ ├── ElementTabs │ │ ├── .gitignore │ │ ├── ElementTabsRelations.php │ │ ├── FieldServiceProvider.php │ │ ├── assets │ │ │ ├── css │ │ │ │ └── field.css │ │ │ └── js │ │ │ │ └── field.js │ │ ├── package.json │ │ ├── resources │ │ │ ├── js │ │ │ │ ├── components │ │ │ │ │ └── DetailField.vue │ │ │ │ └── field.js │ │ │ └── sass │ │ │ │ └── field.scss │ │ ├── webpack.mix.js │ │ └── yarn.lock │ ├── ElementTimezoneAutocomplete │ │ ├── .gitignore │ │ └── ElementTimezoneAutocomplete.php │ └── ElementTimezoneSelect │ │ ├── .gitignore │ │ └── ElementTimezoneSelect.php └── NovaElementsServiceProvider.php ├── vendor └── nova-element-ui │ ├── dist │ └── nova-element-ui.js │ ├── fonts │ └── vendor │ │ └── element-ui │ │ └── lib │ │ └── theme-chalk │ │ ├── element-icons.ttf │ │ └── element-icons.woff │ └── mix-manifest.json ├── webpack.mix.js └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "transform-runtime", 4 | "transform-object-rest-spread", 5 | [ 6 | "component", 7 | { 8 | "libraryName": "element-ui", 9 | "styleLibraryName": "theme-chalk" 10 | } 11 | ] 12 | ], 13 | "presets": [["env"]], 14 | "env": { 15 | "test": { 16 | "presets": [["env", { "targets": { "node": "current" } }]] 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /components -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Nova + Element UI 2 | 3 | This is a set of component Element UI for Laravel Nova 4 | 5 | ## Installation 6 | 7 | 1) ```composer require nightkit/nova-element-ui``` 8 | 2) Add ```NightKit\NovaElements\NovaElementsServiceProvider::class``` to your ```config/app.php``` in providers section 9 | 3) ``` php artisan vendor:publish --provider="NightKit\NovaElements\NovaElementsServiceProvider" --tag="public" ``` 10 | 11 | ### Components 12 | 13 | This is available component for this time. 14 | 15 | ```php 16 | use NightKit\NovaElements\Fields\ElementInput\ElementInput; 17 | use NightKit\NovaElements\Fields\ElementPassword\ElementPassword; 18 | use NightKit\NovaElements\Fields\ElementSelect\ElementSelect; 19 | use NightKit\NovaElements\Fields\ElementCheckbox\ElementCheckbox; 20 | use NightKit\NovaElements\Fields\ElementRadio\ElementRadio; 21 | use NightKit\NovaElements\Fields\ElementSwitch\ElementSwitch; 22 | use NightKit\NovaElements\Fields\ElementAutocomplete\ElementAutocomplete; 23 | use NightKit\NovaElements\Fields\ElementNumber\ElementNumber; 24 | use NightKit\NovaElements\Fields\ElementTimezoneAutocomplete\ElementTimezoneAutocomplete; 25 | use NightKit\NovaElements\Fields\ElementTimezoneSelect\ElementTimezoneSelect; 26 | use NightKit\NovaElements\Fields\ElementTabs\ElementTabsRelations; 27 | 28 | ``` 29 | 30 | 31 | #### ElementTabsRelations 32 | 33 | ElementTabsRelations it's tabs component to split relation lists view between tabs 34 | Supported relation fields: HasMany, BelongsTany, OneToMany, MorphToMany 35 | 36 | ```php 37 | public function fields(Request $request) 38 | { 39 | ElementTabsRelations::make('Tabs') 40 | ->addTab('Levels', HasMany::make('Level', 'levels')) 41 | ->addTab('Setting', HasMany::make('Setting', 'settings')) 42 | ->activeTab('levels') 43 | ->borderCard() // border card style for tabs 44 | } 45 | ``` 46 | ![](https://monosnap.com/image/EgJu0FSuUETEru65djCH8cJrkGTZny.png) 47 | 48 | 49 | #### ElementInput 50 | 51 | ElementInput is just simple input element with couple of cool features 52 | 53 | You can add it like that 54 | ```php 55 | public function fields(Request $request) 56 | { 57 | return [ 58 | ID::make()->sortable(), 59 | ElementInput::make('String') 60 | ]; 61 | } 62 | ``` 63 | ![](https://monosnap.com/image/al5xWRSlA5c4SrMjwS86oFQhrWKr5x.png) 64 | 65 | To make this input with clear action just add ```clearable()``` 66 | 67 | ```php 68 | public function fields(Request $request) 69 | { 70 | return [ 71 | ID::make()->sortable(), 72 | ElementInput::make('String') 73 | ->clearable() 74 | ]; 75 | } 76 | ``` 77 | ![](https://monosnap.com/image/MmzHgs3lz9BgAX36cH8a2blanheilv.png) 78 | 79 | You can also add prefix or suffix icon with ```prefixIcon()``` and```suffixIcon()``` 80 | 81 | ```php 82 | public function fields(Request $request) 83 | { 84 | return [ 85 | ID::make()->sortable(), 86 | ElementInput::make('String') 87 | ->clearable() 88 | ->prefixIcon('el-icon-date') //icon css class 89 | ]; 90 | } 91 | ``` 92 | ![](https://monosnap.com/image/1nZ6gp80L3rbcRmLwBu8eRwPuvDWWa.png) 93 | 94 | If you need a textarea you can simple make it by ```textarea()``` 95 | 96 | ```php 97 | public function fields(Request $request) 98 | { 99 | return [ 100 | ID::make()->sortable(), 101 | ElementInput::make('String') 102 | ->textarea(4, true) 103 | ]; 104 | } 105 | ``` 106 | ![](https://monosnap.com/image/pRZNWMTAZsdKDsibDLtGoQwBzvz2VW.png) 107 | 108 | Textarea accepts several parameters, number of rows and autosize 109 | 110 | #### ElementAutocomplete 111 | 112 | ElementAutocomplete looks like a input but is used if you need autocomplete 113 | 114 | ```php 115 | return [ 116 | ID::make()->sortable(), 117 | ElementAutocomplete::make('String') 118 | ->suggestions(['vue', 'laravel', 'nova']) 119 | ]; 120 | ``` 121 | ![](https://monosnap.com/image/ome1YEsDkQCKoN28Jgd8ymavvccA2u.png) 122 | 123 | This field has a few method 124 | 125 | ```placement() @string``` 126 | Placement of the popup menu (top / top-start / top-end / bottom / bottom-start / bottom-end) default bottom-start 127 | 128 | ```triggerOnFocus @bool``` 129 | Whether show suggestions when input focus (default true) 130 | 131 | ```debounce() @int``` 132 | Debounce delay when typing, in milliseconds (default 300) 133 | 134 | 135 | #### ElementSelect 136 | 137 | It's just simple select field with more beautiful design 138 | 139 | ```php 140 | public function fields(Request $request) 141 | { 142 | return [ 143 | ID::make()->sortable(), 144 | ElementSelect::make('String') 145 | ->options(['vue', 'laravel', 'nova']) 146 | ]; 147 | } 148 | ``` 149 | ![](https://monosnap.com/image/IyMTHL59vtmdHDF8k8n1TzeXL7hRfx.png) 150 | 151 | 152 | #### ElementTimezoneSelect and ElementTimezoneAutocomplete 153 | 154 | This two fields depend on ElementSelect and ElementAutocompele to coose timezones more simple 155 | 156 | ```php 157 | public function fields(Request $request) 158 | { 159 | return [ 160 | ID::make()->sortable(), 161 | ElementTimezoneAutocomplete::make('String'), 162 | ElementTimezoneSelect::make('String') 163 | ]; 164 | } 165 | ``` 166 | ![](https://monosnap.com/image/FSEK0ug9mj6pjIwMHTPpqcLuf4LqNc.png) 167 | 168 | #### ElementNumber 169 | 170 | The number input field on steroids:) 171 | 172 | It's depend on Nova native Number field and support all its functions 173 | 174 | ```php 175 | public function fields(Request $request) 176 | { 177 | return [ 178 | ID::make()->sortable(), 179 | ElementNumber::make('Number') 180 | ->min(2) 181 | ->max(6) 182 | ->step(2) 183 | ]; 184 | } 185 | ``` 186 | ![](https://monosnap.com/image/2QlWiG1ymMfJkL9mr2xvB7CYefvg33.png) 187 | 188 | Also this field provide several methods 189 | 190 | ```precision() @int``` 191 | Precision of input value 192 | 193 | ```showControls() @bool``` 194 | whether to enable the control buttons 195 | 196 | ```rightControls()``` 197 | Move the control buttons to the right 198 | 199 | #### ElementRadio 200 | 201 | Radio element 202 | 203 | ```php 204 | public function fields(Request $request) 205 | { 206 | return [ 207 | ID::make()->sortable(), 208 | ElementRadio::make('String') 209 | ->options([ 210 | ['value' => '1', 'label' => 'vue'], 211 | ['value' => '2', 'label' => 'laravel'], 212 | ['value' => '3', 'label' => 'nova'], 213 | ]) 214 | ]; 215 | } 216 | ``` 217 | ![](https://monosnap.com/image/SHR9Ae2SXmXQ8fezBwhx7mw24m9kox.png) 218 | 219 | If you want button style radio just use ```buttons()``` method 220 | 221 | ```php 222 | public function fields(Request $request) 223 | { 224 | return [ 225 | ID::make()->sortable(), 226 | ElementRadio::make('String') 227 | ->options([ 228 | ['value' => '1', 'label' => 'vue'], 229 | ['value' => '2', 'label' => 'laravel'], 230 | ['value' => '3', 'label' => 'nova'], 231 | ])->buttons() 232 | ]; 233 | } 234 | ``` 235 | ![](https://monosnap.com/image/UXfvA05m2WxZa7bUvHnEivoRCWuuKq.png) 236 | 237 | Or bordered style with ```bordered()``` 238 | 239 | ```php 240 | public function fields(Request $request) 241 | { 242 | return [ 243 | ID::make()->sortable(), 244 | ElementRadio::make('String') 245 | ->options([ 246 | ['value' => '1', 'label' => 'vue'], 247 | ['value' => '2', 'label' => 'laravel'], 248 | ['value' => '3', 'label' => 'nova'], 249 | ])->bordered() 250 | ]; 251 | } 252 | ``` 253 | ![](https://monosnap.com/image/B3KDCNl8sOYb04P6KFI2xHOUAifhpO.png) 254 | 255 | 256 | #### ElementCheckbox 257 | 258 | ElementCheckbox depends on native Nova Boolean field with couple cool features 259 | 260 | ```php 261 | public function fields(Request $request) 262 | { 263 | return [ 264 | ID::make()->sortable(), 265 | ElementCheckbox::make('Boolean') 266 | ]; 267 | } 268 | ``` 269 | ![](https://monosnap.com/image/wixlJiNHNGLE3fnbp6pH7hvzQcOMb0.png) 270 | 271 | On detail page and index it's cool looks with el-tag element 272 | 273 | ![](https://monosnap.com/image/byme5QgvZ5nCAIqg6lsbbB1pbkXiTy.png) 274 | 275 | Of course you can change standard 'True' 'False' labels on what want to 276 | 277 | ```php 278 | public function fields(Request $request) 279 | { 280 | return [ 281 | ID::make()->sortable(), 282 | ElementCheckbox::make('Boolean') 283 | ->falseLabel('Off') 284 | ->trueLabel('On') 285 | ]; 286 | } 287 | ``` 288 | ![](https://monosnap.com/image/MzKADrRMR4XBQ04mYBwJ275LOi02gG.png) 289 | 290 | If you d'not want to be displayed el-tag you can hide it with ```showTagOnIndex()``` ```showTagOnDetail()``` 291 | 292 | ```php 293 | public function fields(Request $request) 294 | { 295 | return [ 296 | ID::make()->sortable(), 297 | ElementCheckbox::make('Boolean') 298 | ->falseLabel('Off') 299 | ->trueLabel('On') 300 | ->showTagOnDetail(false) 301 | ->showTagOnIndex(false) 302 | ]; 303 | } 304 | ``` 305 | 306 | When you just see only label 307 | 308 | #### ElementSwitch 309 | 310 | ElementSwitch is depends on ElementCheckbox 311 | 312 | ```php 313 | public function fields(Request $request) 314 | { 315 | return [ 316 | ID::make()->sortable(), 317 | ElementSwitch::make('Boolean') 318 | ->falseLabel('Off') 319 | ->trueLabel('On') 320 | ]; 321 | } 322 | ``` 323 | 324 | ![](https://monosnap.com/image/uc3G1XdWqV1Hr9GL2VYEwDnLWVHCJb.png) 325 | 326 | If you want to show your labels on switch use ```showLabels()``` method 327 | 328 | ```php 329 | public function fields(Request $request) 330 | { 331 | return [ 332 | ID::make()->sortable(), 333 | ElementSwitch::make('Boolean') 334 | ->falseLabel('Off') 335 | ->trueLabel('On') 336 | ->showLabels() 337 | ]; 338 | } 339 | ``` 340 | ![](https://monosnap.com/image/6QqnKDRd2jEGjt2zVZmXDLqeDpiXJx.png) 341 | 342 | Also you can change active/inactive colors on switch 343 | 344 | ```php 345 | public function fields(Request $request) 346 | { 347 | return [ 348 | ID::make()->sortable(), 349 | ElementSwitch::make('Boolean') 350 | ->falseLabel('Off') 351 | ->trueLabel('On') 352 | ->showLabels() 353 | ->activeColor('#13ce66') 354 | ->inactiveColor('#ff4949') 355 | ]; 356 | } 357 | ``` 358 | 359 | ![](https://monosnap.com/image/VErv5TqmJKCnqOHtDnXOLKYgvwzCCS.png) 360 | 361 | 362 | ## Components in progress 363 | 364 | * ~~Input~~ 365 | * ~~Number~~ 366 | * ~~Select~~ 367 | * ~~Autocomplete~~ 368 | * ~~Checkbox~~ 369 | * ~~Radio~~ 370 | * ~~Switch~~ 371 | * Date 372 | * Time 373 | * DateTime 374 | * DataTimeRange 375 | * Tabs 376 | * Upload 377 | * Slider 378 | * Cascader 379 | * Upload 380 | * Transfer 381 | 382 | ## Built With 383 | 384 | * [Laravel Nova](http://nova.laravel.com) - The best admin panel for Laravel 385 | * [Element UI](http://element.eleme.io/#/en-US/) - The best set of components for Vue.js 386 | 387 | ## License 388 | 389 | This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details 390 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nightkit/nova-element-ui", 3 | "version": "0.8.0", 4 | "description": "Element UI components for Laravel Nova", 5 | "type": "library", 6 | "license": "MIT", 7 | "authors": [ 8 | { 9 | "name": "Ilya Glinsky", 10 | "email": "fat4lix@gmail.com" 11 | } 12 | ], 13 | "minimum-stability": "dev", 14 | "require": { 15 | "laravel/nova": "*" 16 | }, 17 | "autoload": { 18 | "psr-4": { 19 | "NightKit\\NovaElements\\": "src" 20 | } 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /fonts/vendor/element-ui/lib/theme-chalk/element-icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fat4lix/nova-element-ui/0498a17e1d46b2ef672a361ccf97944adc36f112/fonts/vendor/element-ui/lib/theme-chalk/element-icons.ttf -------------------------------------------------------------------------------- /fonts/vendor/element-ui/lib/theme-chalk/element-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fat4lix/nova-element-ui/0498a17e1d46b2ef672a361ccf97944adc36f112/fonts/vendor/element-ui/lib/theme-chalk/element-icons.woff -------------------------------------------------------------------------------- /mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/dist/nova-element-ui.js": "/dist/nova-element-ui.js" 3 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "prod": "npm run production", 5 | "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" 6 | }, 7 | "dependencies": { 8 | "element-ui": "^2.4.6", 9 | "vue": "^2.5.17" 10 | }, 11 | "devDependencies": { 12 | "babel-plugin-component": "^1.1.1", 13 | "babel-plugin-syntax-dynamic-import": "^6.18.0", 14 | "babel-plugin-syntax-jsx": "^6.18.0", 15 | "babel-plugin-transform-vue-jsx": "^3.7.0", 16 | "babel-preset-env": "^1.6.1", 17 | "cross-env": "^5.2.0", 18 | "laravel-mix": "^1.0" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /resources/js/nova-element-ui.js: -------------------------------------------------------------------------------- 1 | import locale from 'element-ui/lib/locale'; 2 | const mapLocales = { 3 | 'af-ZA': require('element-ui/lib/locale/lang/af-ZA'), 4 | 'ar': require('element-ui/lib/locale/lang/ar'), 5 | 'bg': require('element-ui/lib/locale/lang/bg'), 6 | 'ca': require('element-ui/lib/locale/lang/ca'), 7 | 'cs-CZ': require('element-ui/lib/locale/lang/cs-CZ'), 8 | 'da': require('element-ui/lib/locale/lang/da'), 9 | 'de': require('element-ui/lib/locale/lang/de'), 10 | 'ee': require('element-ui/lib/locale/lang/ee'), 11 | 'el': require('element-ui/lib/locale/lang/el'), 12 | 'en': require('element-ui/lib/locale/lang/en'), 13 | 'es': require('element-ui/lib/locale/lang/es'), 14 | 'fa': require('element-ui/lib/locale/lang/fa'), 15 | 'fi': require('element-ui/lib/locale/lang/fi'), 16 | 'fr': require('element-ui/lib/locale/lang/fr'), 17 | 'he': require('element-ui/lib/locale/lang/he'), 18 | 'hu': require('element-ui/lib/locale/lang/hu'), 19 | 'id': require('element-ui/lib/locale/lang/id'), 20 | 'it': require('element-ui/lib/locale/lang/it'), 21 | 'ja': require('element-ui/lib/locale/lang/ja'), 22 | 'km': require('element-ui/lib/locale/lang/km'), 23 | 'ko': require('element-ui/lib/locale/lang/ko'), 24 | 'ku': require('element-ui/lib/locale/lang/ku'), 25 | 'kz': require('element-ui/lib/locale/lang/kz'), 26 | 'lt': require('element-ui/lib/locale/lang/lt'), 27 | 'lv': require('element-ui/lib/locale/lang/lv'), 28 | 'mn': require('element-ui/lib/locale/lang/mn'), 29 | 'nb': require('element-ui/lib/locale/lang/nb-NO'), 30 | 'nl': require('element-ui/lib/locale/lang/nl'), 31 | 'pl': require('element-ui/lib/locale/lang/pl'), 32 | 'pt': require('element-ui/lib/locale/lang/pt'), 33 | 'pt-br': require('element-ui/lib/locale/lang/pt-br'), 34 | 'ro': require('element-ui/lib/locale/lang/ro'), 35 | 'ru-RU': require('element-ui/lib/locale/lang/ru-RU'), 36 | 'sk': require('element-ui/lib/locale/lang/sk'), 37 | 'sl': require('element-ui/lib/locale/lang/sl'), 38 | 'sv-SE': require('element-ui/lib/locale/lang/sv-SE'), 39 | 'ta': require('element-ui/lib/locale/lang/ta'), 40 | 'th': require('element-ui/lib/locale/lang/th'), 41 | 'tk': require('element-ui/lib/locale/lang/tk'), 42 | 'tr-TR': require('element-ui/lib/locale/lang/tr-TR'), 43 | 'ua': require('element-ui/lib/locale/lang/ua'), 44 | 'ug-CN': require('element-ui/lib/locale/lang/ug-CN'), 45 | 'vi': require('element-ui/lib/locale/lang/vi'), 46 | 'zh-CH': require('element-ui/lib/locale/lang/zh-CN'), 47 | 'zh-TW': require('element-ui/lib/locale/lang/zh-TW') 48 | } 49 | 50 | import { 51 | Select, 52 | Option, 53 | Input, 54 | Autocomplete, 55 | InputNumber, 56 | Radio, 57 | RadioButton, 58 | RadioGroup, 59 | Checkbox, 60 | CheckboxButton, 61 | CheckboxGroup, 62 | ColorPicker, 63 | Switch, 64 | Tag, 65 | Tabs, 66 | TabPane 67 | } from 'element-ui'; 68 | 69 | Nova.booting(function(Vue, router) { 70 | locale.use(mapLocales[Nova.config.locale] || mapLocales['en']); 71 | Vue.use(Select); 72 | Vue.use(Option); 73 | Vue.use(Input); 74 | Vue.use(Autocomplete); 75 | Vue.use(InputNumber); 76 | Vue.use(Radio); 77 | Vue.use(RadioButton); 78 | Vue.use(RadioGroup); 79 | Vue.use(Checkbox); 80 | Vue.use(CheckboxButton); 81 | Vue.use(CheckboxGroup); 82 | Vue.use(ColorPicker); 83 | Vue.use(Tag); 84 | Vue.use(Switch); 85 | Vue.use(TabPane); 86 | Vue.use(Tabs); 87 | }) -------------------------------------------------------------------------------- /src/Fields/ElementAutocomplete/ElementAutocomplete.php: -------------------------------------------------------------------------------- 1 | placement = $value; 56 | return $this; 57 | } 58 | 59 | /** 60 | * Set triger-on-focus value 61 | * @param bool $bool 62 | * @return $this 63 | */ 64 | public function triggerOnFocus($bool = true) 65 | { 66 | $this->triggerOnFocus = $bool; 67 | return $this; 68 | } 69 | 70 | /** 71 | * Set debounce value 72 | * @param int 73 | * @return $this 74 | */ 75 | public function debounce($int) { 76 | $this->debounce = $int; 77 | return $this; 78 | } 79 | 80 | public function suggestions($array) 81 | { 82 | 83 | if ($this->isSimpleArray($array)) { 84 | $this->suggestions = $this->transformToMulti($array); 85 | } else { 86 | $this->suggestions = $array; 87 | } 88 | return $this; 89 | } 90 | 91 | /** 92 | * Suggestions list for field 93 | * @param array 94 | * @return array 95 | */ 96 | private function transformToMulti($array) { 97 | $multi = []; 98 | foreach ($array as $value) { 99 | $multi[] = ['value' => $value]; 100 | } 101 | return $multi; 102 | } 103 | 104 | /** 105 | * Check is multidimension array 106 | * @param array 107 | * @return bool 108 | */ 109 | private function isSimpleArray($array) { 110 | $rv = array_filter($array, 'is_array'); 111 | if(count($rv) > 0) return false; 112 | return true; 113 | } 114 | 115 | public function meta() 116 | { 117 | return array_merge([ 118 | 'suggestions' => $this->suggestions, 119 | 'placement' => $this->placement, 120 | 'triggerOnFocus' => $this->triggerOnFocus, 121 | 'debounce' => $this->debounce 122 | ], $this->meta); 123 | } 124 | 125 | } 126 | -------------------------------------------------------------------------------- /src/Fields/ElementAutocomplete/FieldServiceProvider.php: -------------------------------------------------------------------------------- 1 | trueLabel = $string; 58 | return $this; 59 | } 60 | /** 61 | * Set custom false label 62 | * @param string $string 63 | * @return $this 64 | */ 65 | public function falseLabel($string) { 66 | $this->falseLabel = $string; 67 | return $this; 68 | } 69 | 70 | public function showTagOnIndex($value) { 71 | $this->showTagOnIndex = $value; 72 | return $this; 73 | } 74 | 75 | public function showTagOnDetail($value) { 76 | $this->showTagOnDetail = $value; 77 | return $this; 78 | } 79 | 80 | public function meta() 81 | { 82 | return array_merge([ 83 | 'trueLabel' => $this->trueLabel, 84 | 'falseLabel' => $this->falseLabel, 85 | 'showTagOnDetail' => $this->showTagOnDetail, 86 | 'showTagOnIndex' => $this->showTagOnIndex, 87 | 'checkboxType' => $this->checkboxType 88 | ], $this->meta); 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /src/Fields/ElementCheckbox/FieldServiceProvider.php: -------------------------------------------------------------------------------- 1 | clearable = true; 63 | 64 | return $this; 65 | } 66 | 67 | /** 68 | * Set suffix icon 69 | * @param string 70 | * @return $this 71 | */ 72 | public function suffixIcon($iconClass) 73 | { 74 | $this->suffixIcon = $iconClass; 75 | 76 | return $this; 77 | } 78 | 79 | /** 80 | * Set prefix icon 81 | * @param string 82 | * @return $this 83 | */ 84 | public function prefixIcon($iconClass) 85 | { 86 | $this->prefixIcon = $iconClass; 87 | 88 | return $this; 89 | } 90 | 91 | /** 92 | * Set prefix icon 93 | * @param string 94 | * @return $this 95 | */ 96 | public function textarea($rows = 2, $autosize = false) 97 | { 98 | $this->textarea = true; 99 | $this->rows = $rows; 100 | $this->autosizeTextarea = $autosize; 101 | 102 | return $this; 103 | } 104 | 105 | 106 | /** 107 | * Get additional meta information to merge with the field payload. 108 | * 109 | * @return array 110 | */ 111 | public function meta() 112 | { 113 | return array_merge([ 114 | 'clearable' => $this->clearable, 115 | 'prefixIcon' => $this->prefixIcon, 116 | 'suffixIcon' => $this->suffixIcon, 117 | 'textarea' => $this->textarea, 118 | 'rows' => $this->rows, 119 | 'autosizeTextarea' => $this->autosizeTextarea 120 | ], $this->meta); 121 | } 122 | 123 | } 124 | -------------------------------------------------------------------------------- /src/Fields/ElementInput/FieldServiceProvider.php: -------------------------------------------------------------------------------- 1 | withMeta(['precision' => $number]); 25 | } 26 | 27 | /** 28 | * Position of the control buttons 29 | * @return $this 30 | */ 31 | public function rightControls() 32 | { 33 | return $this->withMeta(['controlsPosition' => 'right']); 34 | } 35 | 36 | /** 37 | * The step size the field will increment and decrement by. 38 | * 39 | * @param bool $value 40 | * @return $this 41 | */ 42 | public function showControls($value) 43 | { 44 | return $this->withMeta(['showControls' => $value]); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/Fields/ElementNumber/FieldServiceProvider.php: -------------------------------------------------------------------------------- 1 | =200&&e<300}};a.headers={common:{Accept:"application/json, text/plain, */*"}},n.forEach(["delete","get","head"],function(e){a.headers[e]={}}),n.forEach(["post","put","patch"],function(e){a.headers[e]=n.merge(i)}),e.exports=a}).call(t,r(73))},function(e,t,r){"use strict";t.__esModule=!0;var n,o=r(112),i=(n=o)&&n.__esModule?n:{default:n};t.default=function(e,t,r){return t in e?(0,i.default)(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,r){var n=r(9),o=r(1).document,i=n(o)&&n(o.createElement);e.exports=function(e){return i?o.createElement(e):{}}},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t){e.exports=!0},function(e,t,r){"use strict";var n=r(14);e.exports.f=function(e){return new function(e){var t,r;this.promise=new e(function(e,n){if(void 0!==t||void 0!==r)throw TypeError("Bad Promise constructor");t=e,r=n}),this.resolve=n(t),this.reject=n(r)}(e)}},function(e,t,r){var n=r(11).f,o=r(17),i=r(2)("toStringTag");e.exports=function(e,t,r){e&&!o(e=r?e:e.prototype,i)&&n(e,i,{configurable:!0,value:t})}},function(e,t,r){var n=r(58)("keys"),o=r(63);e.exports=function(e){return n[e]||(n[e]=o(e))}},function(e,t){var r=Math.ceil,n=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?n:r)(e)}},function(e,t,r){var n=r(52),o=r(27);e.exports=function(e){return n(o(e))}},function(e,t,r){var n=r(12).Symbol;e.exports=n},function(e,t,r){var n=r(172),o=r(191);e.exports=function(e,t){var r=o(e,t);return n(r)?r:void 0}},function(e,t){e.exports=function(e,t){return e===t||e!=e&&t!=t}},function(e,t){e.exports=function(e){return e}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=["1/2","1/3","2/3","1/4","3/4","1/5","2/5","3/5","4/5","1/6","5/6"]},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(156);Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i(n).default}}),Object.defineProperty(t,"Form",{enumerable:!0,get:function(){return i(n).default}});var o=r(64);function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"Errors",{enumerable:!0,get:function(){return i(o).default}})},function(e,t,r){"use strict";(function(t){var n=r(0),o=r(99),i=r(102),u=r(108),s=r(106),a=r(45),c="undefined"!=typeof window&&window.btoa&&window.btoa.bind(window)||r(101);e.exports=function(e){return new Promise(function(f,l){var p=e.data,h=e.headers;n.isFormData(p)&&delete h["Content-Type"];var d=new XMLHttpRequest,v="onreadystatechange",y=!1;if("test"===t.env.NODE_ENV||"undefined"==typeof window||!window.XDomainRequest||"withCredentials"in d||s(e.url)||(d=new window.XDomainRequest,v="onload",y=!0,d.onprogress=function(){},d.ontimeout=function(){}),e.auth){var g=e.auth.username||"",m=e.auth.password||"";h.Authorization="Basic "+c(g+":"+m)}if(d.open(e.method.toUpperCase(),i(e.url,e.params,e.paramsSerializer),!0),d.timeout=e.timeout,d[v]=function(){if(d&&(4===d.readyState||y)&&(0!==d.status||d.responseURL&&0===d.responseURL.indexOf("file:"))){var t="getAllResponseHeaders"in d?u(d.getAllResponseHeaders()):null,r={data:e.responseType&&"text"!==e.responseType?d.response:d.responseText,status:1223===d.status?204:d.status,statusText:1223===d.status?"No Content":d.statusText,headers:t,config:e,request:d};o(f,l,r),d=null}},d.onerror=function(){l(a("Network Error",e,null,d)),d=null},d.ontimeout=function(){l(a("timeout of "+e.timeout+"ms exceeded",e,"ECONNABORTED",d)),d=null},n.isStandardBrowserEnv()){var x=r(104),b=(e.withCredentials||s(e.url))&&e.xsrfCookieName?x.read(e.xsrfCookieName):void 0;b&&(h[e.xsrfHeaderName]=b)}if("setRequestHeader"in d&&n.forEach(h,function(e,t){void 0===p&&"content-type"===t.toLowerCase()?delete h[t]:d.setRequestHeader(t,e)}),e.withCredentials&&(d.withCredentials=!0),e.responseType)try{d.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&d.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&d.upload&&d.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then(function(e){d&&(d.abort(),l(e),d=null)}),void 0===p&&(p=null),d.send(p)})}}).call(t,r(73))},function(e,t,r){"use strict";function n(e){this.message=e}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,e.exports=n},function(e,t,r){"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},function(e,t,r){"use strict";var n=r(98);e.exports=function(e,t,r,o,i){var u=new Error(e);return n(u,t,r,o,i)}},function(e,t,r){"use strict";e.exports=function(e,t){return function(){for(var r=new Array(arguments.length),n=0;nr;)t.push(arguments[r++]);return g[++y]=function(){s("function"==typeof e?e:Function(e),t)},n(y),y},h=function(e){delete g[e]},"process"==r(15)(l)?n=function(e){l.nextTick(u(m,e,1))}:v&&v.now?n=function(e){v.now(u(m,e,1))}:d?(i=(o=new d).port2,o.port1.onmessage=x,n=u(i.postMessage,i,1)):f.addEventListener&&"function"==typeof postMessage&&!f.importScripts?(n=function(e){f.postMessage(e+"","*")},f.addEventListener("message",x,!1)):n="onreadystatechange"in c("script")?function(e){a.appendChild(c("script")).onreadystatechange=function(){a.removeChild(this),m.call(e)}}:function(e){setTimeout(u(m,e,1),0)}),e.exports={set:p,clear:h}},function(e,t,r){var n=r(34),o=Math.min;e.exports=function(e){return e>0?o(n(e),9007199254740991):0}},function(e,t,r){var n=r(27);e.exports=function(e){return Object(n(e))}},function(e,t){var r=0,n=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++r+n).toString(36))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:{};!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.record(t)}return n(e,[{key:"all",value:function(){return this.errors}},{key:"has",value:function(e){var t=this.errors.hasOwnProperty(e);t||(t=Object.keys(this.errors).filter(function(t){return t.startsWith(e+".")||t.startsWith(e+"[")}).length>0);return t}},{key:"first",value:function(e){return this.get(e)[0]}},{key:"get",value:function(e){return this.errors[e]||[]}},{key:"any",value:function(){return Object.keys(this.errors).length>0}},{key:"record",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.errors=e}},{key:"clear",value:function(e){if(e){var t=Object.assign({},this.errors);Object.keys(t).filter(function(t){return t===e||t.startsWith(e+".")||t.startsWith(e+"[")}).forEach(function(e){return delete t[e]}),this.errors=t}else this.errors={}}}]),e}();t.default=o},function(e,t,r){var n=r(179),o=r(231),i=r(13),u=r(232),s=r(68),a=r(233),c=Object.prototype.hasOwnProperty;e.exports=function(e,t){var r=i(e),f=!r&&o(e),l=!r&&!f&&u(e),p=!r&&!f&&!l&&a(e),h=r||f||l||p,d=h?n(e.length,String):[],v=d.length;for(var y in e)!t&&!c.call(e,y)||h&&("length"==y||l&&("offset"==y||"parent"==y)||p&&("buffer"==y||"byteLength"==y||"byteOffset"==y)||s(y,v))||d.push(y);return d}},function(e,t,r){(function(t){var r="object"==typeof t&&t&&t.Object===Object&&t;e.exports=r}).call(t,r(243))},function(e,t){var r=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");e.exports=function(e){return r.test(e)}},function(e,t){var r=9007199254740991,n=/^(?:0|[1-9]\d*)$/;e.exports=function(e,t){var o=typeof e;return!!(t=null==t?r:t)&&("number"==o||"symbol"!=o&&n.test(e))&&e>-1&&e%1==0&&e-1&&e%1==0&&e<=r}},function(e,t,r){var n=r(180);e.exports=function(e){return null==e?"":n(e)}},function(e,t){var r,n,o=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function u(){throw new Error("clearTimeout has not been defined")}function s(e){if(r===setTimeout)return setTimeout(e,0);if((r===i||!r)&&setTimeout)return r=setTimeout,setTimeout(e,0);try{return r(e,0)}catch(t){try{return r.call(null,e,0)}catch(t){return r.call(this,e,0)}}}!function(){try{r="function"==typeof setTimeout?setTimeout:i}catch(e){r=i}try{n="function"==typeof clearTimeout?clearTimeout:u}catch(e){n=u}}();var a,c=[],f=!1,l=-1;function p(){f&&a&&(f=!1,a.length?c=a.concat(c):l=-1,c.length&&h())}function h(){if(!f){var e=s(p);f=!0;for(var t=c.length;t;){for(a=c,c=[];++l1)for(var r=1;r1&&void 0!==arguments[1]?arguments[1]:null;return this.viaManyToMany?this.detachResources(e):Nova.request({url:"/nova-api/"+this.resourceName,method:"delete",params:(0,i.default)({},this.queryString,{resources:u(e)})}).then(r||function(){t.deleteModalOpen=!1,t.getResources()})},deleteSelectedResources:function(){this.deleteResources(this.selectedResources)},deleteAllMatchingResources:function(){var e=this;return this.viaManyToMany?this.detachAllMatchingResources():Nova.request({url:this.deleteAllMatchingResourcesEndpoint,method:"delete",params:(0,i.default)({},this.queryString,{resources:"all"})}).then(function(){e.deleteModalOpen=!1,e.getResources()})},detachResources:function(e){var t=this;return Nova.request({url:"/nova-api/"+this.resourceName+"/detach",method:"delete",params:(0,i.default)({},this.queryString,{resources:u(e)})}).then(function(){t.deleteModalOpen=!1,t.getResources()})},detachAllMatchingResources:function(){var e=this;return Nova.request({url:"/nova-api/"+this.resourceName+"/detach",method:"delete",params:(0,i.default)({},this.queryString,{resources:"all"})}).then(function(){e.deleteModalOpen=!1,e.getResources()})},forceDeleteResources:function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return Nova.request({url:"/nova-api/"+this.resourceName+"/force",method:"delete",params:(0,i.default)({},this.queryString,{resources:u(e)})}).then(r||function(){t.deleteModalOpen=!1,t.getResources()})},forceDeleteSelectedResources:function(){this.forceDeleteResources(this.selectedResources)},forceDeleteAllMatchingResources:function(){var e=this;return Nova.request({url:this.forceDeleteSelectedResourcesEndpoint,method:"delete",params:(0,i.default)({},this.queryString,{resources:"all"})}).then(function(){e.deleteModalOpen=!1,e.getResources()})},restoreResources:function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return Nova.request({url:"/nova-api/"+this.resourceName+"/restore",method:"put",params:(0,i.default)({},this.queryString,{resources:u(e)})}).then(r||function(){t.restoreModalOpen=!1,t.getResources()})},restoreSelectedResources:function(){this.restoreResources(this.selectedResources)},restoreAllMatchingResources:function(){var e=this;return Nova.request({url:this.restoreAllMatchingResourcesEndpoint,method:"put",params:(0,i.default)({},this.queryString,{resources:"all"})}).then(function(){e.restoreModalOpen=!1,e.getResources()})}},computed:{deleteAllMatchingResourcesEndpoint:function(){return this.lens?"/nova-api/"+this.resourceName+"/lens/"+this.lens:"/nova-api/"+this.resourceName},forceDeleteSelectedResourcesEndpoint:function(){return this.lens?"/nova-api/"+this.resourceName+"/lens/"+this.lens+"/force":"/nova-api/"+this.resourceName+"/force"},restoreAllMatchingResourcesEndpoint:function(){return this.lens?"/nova-api/"+this.resourceName+"/lens/"+this.lens+"/restore":"/nova-api/"+this.resourceName+"/restore"},queryString:function(){return{search:this.currentSearch,filters:this.encodedFilters,trashed:this.currentTrashed,viaResource:this.viaResource,viaResourceId:this.viaResourceId,viaRelationship:this.viaRelationship}}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=s(r(26)),o=s(r(110)),i=s(r(228)),u=s(r(230));function s(e){return e&&e.__esModule?e:{default:e}}t.default={data:function(){return{filters:[],currentFilters:[]}},methods:{initializeFilterValuesFromQueryString:function(){this.clearAllFilters(),this.encodedFilters&&(this.currentFilters=JSON.parse(atob(this.encodedFilters)),this.syncFilterValues())},clearAllFilters:function(){this.currentFilters=[],(0,i.default)(this.filters,function(e){e.currentValue=""})},syncFilterValues:function(){var e=this;(0,i.default)(this.filters,function(t){t.currentValue=(0,u.default)(_(e.currentFilters).find(function(e){return t.class==e.class}),"value",t.currentValue)})},filterChanged:function(){var e;this.updateQueryString((e={},(0,n.default)(e,this.pageParameter,1),(0,n.default)(e,this.filterParameter,btoa((0,o.default)(this.currentFilters))),e))}},computed:{encodedFilters:function(){return this.$route.query[this.filterParameter]||""}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={props:{resourceName:{},field:{}},data:function(){return{value:""}},mounted:function(){var e=this;this.setInitialValue(),this.field.fill=this.fill,Nova.$on(this.field.attribute+"-value",function(t){e.value=t})},destroyed:function(){Nova.$off(this.field.attribute+"-value")},methods:{setInitialValue:function(){this.value=this.field.value||""},fill:function(e){e.append(this.field.attribute,this.value||"")},handleChange:function(e){this.value=e}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(41);t.default={props:{errors:{default:function(){return new n.Errors}}},data:function(){return{errorClass:"border-danger"}},computed:{errorClasses:function(){return this.hasError?[this.errorClass]:[]},fieldAttribute:function(){return this.field.attribute},hasError:function(){return this.errors.has(this.fieldAttribute)},firstError:function(){if(this.hasError)return this.errors.first(this.fieldAttribute)}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=u(r(115)),o=u(r(113)),i=u(r(40));function u(e){return e&&e.__esModule?e:{default:e}}t.default={props:{loadCards:{type:Boolean,default:!0}},data:function(){return{cards:[]}},created:function(){this.fetchCards()},methods:{fetchCards:function(){var e=(0,o.default)(n.default.mark(function e(){var t,r;return n.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!this.loadCards){e.next=6;break}return e.next=3,Nova.request().get(this.cardsEndpoint);case 3:t=e.sent,r=t.data,this.cards=r;case 6:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()},computed:{shouldShowCards:function(){return this.cards.length>0},smallCards:function(){return _.filter(this.cards,function(e){return-1!==i.default.indexOf(e.width)})},largeCards:function(){return _.filter(this.cards,function(e){return"full"==e.width})}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={methods:{toAppTimezone:function(e){return e?moment.tz(e,this.userTimezone).clone().tz(Nova.config.timezone).format("YYYY-MM-DD kk:mm:ss"):e},fromAppTimezone:function(e){return e?moment.tz(e,Nova.config.timezone).clone().tz(this.userTimezone).format("YYYY-MM-DD kk:mm:ss"):e},localizeDateTimeField:function(e){if(!e.value)return e.value;var t=moment.tz(e.value,Nova.config.timezone).clone().tz(this.userTimezone);return e.format?t.format(e.format):this.usesTwelveHourTime?t.format("YYYY-MM-DD h:mm:ss A"):t.format("YYYY-MM-DD kk:mm:ss")},localizeDateField:function(e){if(!e.value)return e.value;var t=moment.tz(e.value,Nova.config.timezone).clone().tz(this.userTimezone);return e.format?t.format(e.format):t.format("YYYY-MM-DD")}},computed:{userTimezone:function(){return Nova.config.userTimezone?Nova.config.userTimezone:moment.tz.guess()},usesTwelveHourTime:function(){return _.endsWith((new Date).toLocaleString(),"AM")||_.endsWith((new Date).toLocaleString(),"PM")}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,o=r(227),i=(n=o)&&n.__esModule?n:{default:n};t.default={methods:{updateQueryString:function(e){this.$router.push({query:(0,i.default)(e,this.$route.query)})}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={computed:{resourceInformation:function(){var e=this;return _.find(Nova.config.resources,function(t){return t.uriKey==e.resourceName})},viaResourceInformation:function(){var e=this;if(this.viaResource)return _.find(Nova.config.resources,function(t){return t.uriKey==e.viaResource})},authorizedToCreate:function(){return this.resourceInformation.authorizedToCreate}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,o=r(26),i=(n=o)&&n.__esModule?n:{default:n};t.default={methods:{selectPreviousPage:function(){this.updateQueryString((0,i.default)({},this.pageParameter,this.currentPage-1))},selectNextPage:function(){this.updateQueryString((0,i.default)({},this.pageParameter,this.currentPage+1))}},computed:{currentPage:function(){return parseInt(this.$route.query[this.pageParameter]||1)}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,o=r(26),i=(n=o)&&n.__esModule?n:{default:n};t.default={data:function(){return{perPage:25}},methods:{initializePerPageFromQueryString:function(){this.perPage=this.currentPerPage},perPageChanged:function(){this.updateQueryString((0,i.default)({},this.perPageParameter,this.perPage))}},computed:{currentPerPage:function(){return this.$route.query[this.perPageParameter]||25}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,o=r(226),i=(n=o)&&n.__esModule?n:{default:n};t.default={data:function(){return{search:"",selectedResource:"",availableResources:[]}},methods:{selectResource:function(e){this.selectedResource=e},handleSearchCleared:function(){this.availableResources=[]},clearSelection:function(){this.selectedResource="",this.availableResources=[]},performSearch:function(e){var t=this;this.search=e;var r=e.trim();""!=r?this.debouncer(function(){t.selectedResource="",t.getAvailableResources(r)},500):this.clearSelection()},debouncer:(0,i.default)(function(e){return e()},500)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={data:function(){return{withTrashed:!1}},methods:{toggleWithTrashed:function(){this.withTrashed=!this.withTrashed},enableWithTrashed:function(){this.withTrashed=!0},disableWithTrashed:function(){this.withTrashed=!1}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return(0,i.default)(e)};var n,o=r(240),i=(n=o)&&n.__esModule?n:{default:n}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,o=r(48),i=(n=o)&&n.__esModule?n:{default:n};t.default=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:100;return i.default.all([e,new i.default(function(e){setTimeout(function(){return e()},t)})]).then(function(e){return e[0]})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){return e>1||0==e?n.Inflector.pluralize(t):n.Inflector.singularize(t)};var n=r(47)},function(e,t,r){"use strict";var n={uncountableWords:["equipment","information","rice","money","species","series","fish","sheep","moose","deer","news"],pluralRules:[[new RegExp("(m)an$","gi"),"$1en"],[new RegExp("(pe)rson$","gi"),"$1ople"],[new RegExp("(child)$","gi"),"$1ren"],[new RegExp("^(ox)$","gi"),"$1en"],[new RegExp("(ax|test)is$","gi"),"$1es"],[new RegExp("(octop|vir)us$","gi"),"$1i"],[new RegExp("(alias|status)$","gi"),"$1es"],[new RegExp("(bu)s$","gi"),"$1ses"],[new RegExp("(buffal|tomat|potat)o$","gi"),"$1oes"],[new RegExp("([ti])um$","gi"),"$1a"],[new RegExp("sis$","gi"),"ses"],[new RegExp("(?:([^f])fe|([lr])f)$","gi"),"$1$2ves"],[new RegExp("(hive)$","gi"),"$1s"],[new RegExp("([^aeiouy]|qu)y$","gi"),"$1ies"],[new RegExp("(x|ch|ss|sh)$","gi"),"$1es"],[new RegExp("(matr|vert|ind)ix|ex$","gi"),"$1ices"],[new RegExp("([m|l])ouse$","gi"),"$1ice"],[new RegExp("(quiz)$","gi"),"$1zes"],[new RegExp("s$","gi"),"s"],[new RegExp("$","gi"),"s"]],singularRules:[[new RegExp("(m)en$","gi"),"$1an"],[new RegExp("(pe)ople$","gi"),"$1rson"],[new RegExp("(child)ren$","gi"),"$1"],[new RegExp("([ti])a$","gi"),"$1um"],[new RegExp("((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$","gi"),"$1$2sis"],[new RegExp("(hive)s$","gi"),"$1"],[new RegExp("(tive)s$","gi"),"$1"],[new RegExp("(curve)s$","gi"),"$1"],[new RegExp("([lr])ves$","gi"),"$1f"],[new RegExp("([^fo])ves$","gi"),"$1fe"],[new RegExp("([^aeiouy]|qu)ies$","gi"),"$1y"],[new RegExp("(s)eries$","gi"),"$1eries"],[new RegExp("(m)ovies$","gi"),"$1ovie"],[new RegExp("(x|ch|ss|sh)es$","gi"),"$1"],[new RegExp("([m|l])ice$","gi"),"$1ouse"],[new RegExp("(bus)es$","gi"),"$1"],[new RegExp("(o)es$","gi"),"$1"],[new RegExp("(shoe)s$","gi"),"$1"],[new RegExp("(cris|ax|test)es$","gi"),"$1is"],[new RegExp("(octop|vir)i$","gi"),"$1us"],[new RegExp("(alias|status)es$","gi"),"$1"],[new RegExp("^(ox)en","gi"),"$1"],[new RegExp("(vert|ind)ices$","gi"),"$1ex"],[new RegExp("(matr)ices$","gi"),"$1ix"],[new RegExp("(quiz)zes$","gi"),"$1"],[new RegExp("s$","gi"),""]],nonTitlecasedWords:["and","or","nor","a","an","the","so","but","to","of","at","by","from","into","on","onto","off","out","in","over","with","for"],idSuffix:new RegExp("(_ids|_id)$","g"),underbar:new RegExp("_","g"),spaceOrUnderbar:new RegExp("[ _]","g"),uppercase:new RegExp("([A-Z])","g"),underbarPrefix:new RegExp("^_"),applyRules:function(e,t,r,n){if(n)e=n;else if(!(r.indexOf(e.toLowerCase())>-1))for(var o=0;o>8-s%1*8)){if((r=i.charCodeAt(s+=.75))>255)throw new o;t=t<<8|r}return u}},function(e,t,r){"use strict";var n=r(0);function o(e){return encodeURIComponent(e).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,r){if(!t)return e;var i;if(r)i=r(t);else if(n.isURLSearchParams(t))i=t.toString();else{var u=[];n.forEach(t,function(e,t){null!==e&&void 0!==e&&(n.isArray(e)?t+="[]":e=[e],n.forEach(e,function(e){n.isDate(e)?e=e.toISOString():n.isObject(e)&&(e=JSON.stringify(e)),u.push(o(t)+"="+o(e))}))}),i=u.join("&")}return i&&(e+=(-1===e.indexOf("?")?"?":"&")+i),e}},function(e,t,r){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,r){"use strict";var n=r(0);e.exports=n.isStandardBrowserEnv()?{write:function(e,t,r,o,i,u){var s=[];s.push(e+"="+encodeURIComponent(t)),n.isNumber(r)&&s.push("expires="+new Date(r).toGMTString()),n.isString(o)&&s.push("path="+o),n.isString(i)&&s.push("domain="+i),!0===u&&s.push("secure"),document.cookie=s.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},function(e,t,r){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t,r){"use strict";var n=r(0);e.exports=n.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),r=document.createElement("a");function o(e){var n=e;return t&&(r.setAttribute("href",n),n=r.href),r.setAttribute("href",n),{href:r.href,protocol:r.protocol?r.protocol.replace(/:$/,""):"",host:r.host,search:r.search?r.search.replace(/^\?/,""):"",hash:r.hash?r.hash.replace(/^#/,""):"",hostname:r.hostname,port:r.port,pathname:"/"===r.pathname.charAt(0)?r.pathname:"/"+r.pathname}}return e=o(window.location.href),function(t){var r=n.isString(t)?o(t):t;return r.protocol===e.protocol&&r.host===e.host}}():function(){return!0}},function(e,t,r){"use strict";var n=r(0);e.exports=function(e,t){n.forEach(e,function(r,n){n!==t&&n.toUpperCase()===t.toUpperCase()&&(e[t]=r,delete e[n])})}},function(e,t,r){"use strict";var n=r(0),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,r,i,u={};return e?(n.forEach(e.split("\n"),function(e){if(i=e.indexOf(":"),t=n.trim(e.substr(0,i)).toLowerCase(),r=n.trim(e.substr(i+1)),t){if(u[t]&&o.indexOf(t)>=0)return;u[t]="set-cookie"===t?(u[t]?u[t]:[]).concat([r]):u[t]?u[t]+", "+r:r}}),u):u}},function(e,t,r){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},function(e,t,r){e.exports={default:r(116),__esModule:!0}},function(e,t,r){e.exports={default:r(117),__esModule:!0}},function(e,t,r){e.exports={default:r(118),__esModule:!0}},function(e,t,r){"use strict";t.__esModule=!0;var n,o=r(48),i=(n=o)&&n.__esModule?n:{default:n};t.default=function(e){return function(){var t=e.apply(this,arguments);return new i.default(function(e,r){return function n(o,u){try{var s=t[o](u),a=s.value}catch(e){return void r(e)}if(!s.done)return i.default.resolve(a).then(function(e){n("next",e)},function(e){n("throw",e)});e(a)}("next")})}}},function(e,t,r){"use strict";t.__esModule=!0;var n,o=r(111),i=(n=o)&&n.__esModule?n:{default:n};t.default=i.default||function(e){for(var t=1;tf;)if((s=a[f++])!=s)return!0}else for(;c>f;f++)if((e||f in a)&&a[f]===r)return e||f||0;return!e&&-1}}},function(e,t,r){var n=r(16),o=r(127),i=r(126),u=r(4),s=r(61),a=r(146),c={},f={};(t=e.exports=function(e,t,r,l,p){var h,d,v,y,g=p?function(){return e}:a(e),m=n(r,l,t?2:1),x=0;if("function"!=typeof g)throw TypeError(e+" is not iterable!");if(i(g)){for(h=s(e.length);h>x;x++)if((y=t?m(u(d=e[x])[0],d[1]):m(e[x]))===c||y===f)return y}else for(v=g.call(e);!(d=v.next()).done;)if((y=o(v,m,d.value,t))===c||y===f)return y}).BREAK=c,t.RETURN=f},function(e,t,r){e.exports=!r(5)&&!r(29)(function(){return 7!=Object.defineProperty(r(28)("div"),"a",{get:function(){return 7}}).a})},function(e,t){e.exports=function(e,t,r){var n=void 0===r;switch(t.length){case 0:return n?e():e.call(r);case 1:return n?e(t[0]):e.call(r,t[0]);case 2:return n?e(t[0],t[1]):e.call(r,t[0],t[1]);case 3:return n?e(t[0],t[1],t[2]):e.call(r,t[0],t[1],t[2]);case 4:return n?e(t[0],t[1],t[2],t[3]):e.call(r,t[0],t[1],t[2],t[3])}return e.apply(r,t)}},function(e,t,r){var n=r(10),o=r(2)("iterator"),i=Array.prototype;e.exports=function(e){return void 0!==e&&(n.Array===e||i[o]===e)}},function(e,t,r){var n=r(4);e.exports=function(e,t,r,o){try{return o?t(n(r)[0],r[1]):t(r)}catch(t){var i=e.return;throw void 0!==i&&n(i.call(e)),t}}},function(e,t,r){"use strict";var n=r(133),o=r(57),i=r(32),u={};r(7)(u,r(2)("iterator"),function(){return this}),e.exports=function(e,t,r){e.prototype=n(u,{next:o(1,r)}),i(e,t+" Iterator")}},function(e,t,r){var n=r(2)("iterator"),o=!1;try{var i=[7][n]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!o)return!1;var r=!1;try{var i=[7],u=i[n]();u.next=function(){return{done:r=!0}},i[n]=function(){return u},e(i)}catch(e){}return r}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,r){var n=r(1),o=r(60).set,i=n.MutationObserver||n.WebKitMutationObserver,u=n.process,s=n.Promise,a="process"==r(15)(u);e.exports=function(){var e,t,r,c=function(){var n,o;for(a&&(n=u.domain)&&n.exit();e;){o=e.fn,e=e.next;try{o()}catch(n){throw e?r():t=void 0,n}}t=void 0,n&&n.enter()};if(a)r=function(){u.nextTick(c)};else if(!i||n.navigator&&n.navigator.standalone)if(s&&s.resolve){var f=s.resolve(void 0);r=function(){f.then(c)}}else r=function(){o.call(n,c)};else{var l=!0,p=document.createTextNode("");new i(c).observe(p,{characterData:!0}),r=function(){p.data=l=!l}}return function(n){var o={fn:n,next:void 0};t&&(t.next=o),e||(e=o,r()),t=o}}},function(e,t,r){"use strict";var n=r(54),o=r(135),i=r(138),u=r(62),s=r(52),a=Object.assign;e.exports=!a||r(29)(function(){var e={},t={},r=Symbol(),n="abcdefghijklmnopqrst";return e[r]=7,n.split("").forEach(function(e){t[e]=e}),7!=a({},e)[r]||Object.keys(a({},t)).join("")!=n})?function(e,t){for(var r=u(e),a=arguments.length,c=1,f=o.f,l=i.f;a>c;)for(var p,h=s(arguments[c++]),d=f?n(h).concat(f(h)):n(h),v=d.length,y=0;v>y;)l.call(h,p=d[y++])&&(r[p]=h[p]);return r}:a},function(e,t,r){var n=r(4),o=r(134),i=r(50),u=r(33)("IE_PROTO"),s=function(){},a=function(){var e,t=r(28)("iframe"),n=i.length;for(t.style.display="none",r(51).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write(" 55 | -------------------------------------------------------------------------------- /src/Fields/ElementTabs/resources/js/field.js: -------------------------------------------------------------------------------- 1 | Nova.booting((Vue, router) => { 2 | Vue.component('detail-element-tabs', require('./components/DetailField')); 3 | }) 4 | -------------------------------------------------------------------------------- /src/Fields/ElementTabs/resources/sass/field.scss: -------------------------------------------------------------------------------- 1 | // Nova Tool CSS 2 | 3 | .detail-tabs-holder { 4 | margin-top: 30px; 5 | 6 | .el-tabs--border-card { 7 | background: #fafafa; 8 | } 9 | .el-tabs--border-card > .el-tabs__header .el-tabs__item.is-active { 10 | background-color: #fafafa; 11 | } 12 | .el-tabs--border-card>.el-tabs__content { 13 | padding: 20px; 14 | } 15 | } 16 | .resource-index-holder { 17 | margin-top: 20px; 18 | } 19 | -------------------------------------------------------------------------------- /src/Fields/ElementTabs/webpack.mix.js: -------------------------------------------------------------------------------- 1 | let mix = require('laravel-mix') 2 | 3 | mix.js('resources/js/field.js', 'assets/js') 4 | .sass('resources/sass/field.scss', 'assets/css') 5 | .webpackConfig({ 6 | resolve: { 7 | symlinks: false 8 | } 9 | }) 10 | -------------------------------------------------------------------------------- /src/Fields/ElementTimezoneAutocomplete/.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | /.idea 3 | /vendor 4 | /node_modules 5 | package-lock.json 6 | composer.phar 7 | composer.lock 8 | phpunit.xml 9 | .phpunit.result.cache 10 | .DS_Store 11 | Thumbs.db 12 | -------------------------------------------------------------------------------- /src/Fields/ElementTimezoneAutocomplete/ElementTimezoneAutocomplete.php: -------------------------------------------------------------------------------- 1 | suggestions(collect(DateTimeZone::listIdentifiers(DateTimeZone::ALL))->mapWithKeys(function ($timezone) { 33 | return [$timezone => $timezone]; 34 | })->all()); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/Fields/ElementTimezoneSelect/.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | /.idea 3 | /vendor 4 | /node_modules 5 | package-lock.json 6 | composer.phar 7 | composer.lock 8 | phpunit.xml 9 | .phpunit.result.cache 10 | .DS_Store 11 | Thumbs.db 12 | -------------------------------------------------------------------------------- /src/Fields/ElementTimezoneSelect/ElementTimezoneSelect.php: -------------------------------------------------------------------------------- 1 | options(collect(DateTimeZone::listIdentifiers(DateTimeZone::ALL))->mapWithKeys(function ($timezone) { 30 | return [$timezone => $timezone]; 31 | })->all()); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/NovaElementsServiceProvider.php: -------------------------------------------------------------------------------- 1 | app->runningInConsole()) { 13 | $this->publishes([ 14 | __DIR__.'/../dist' => public_path('vendor/nova-element-ui'), 15 | ], 'public'); 16 | $this->publishes([ 17 | __DIR__.'/../fonts' => public_path('fonts'), 18 | ], 'public'); 19 | } 20 | 21 | Nova::serving(function ($event) { 22 | Nova::script('nova-element-ui', 'vendor/nova-element-ui/nova-element-ui.js'); 23 | }); 24 | 25 | } 26 | 27 | public function register() 28 | { 29 | $this->app->register('NightKit\NovaElements\Fields\ElementAutocomplete\FieldServiceProvider'); 30 | $this->app->register('NightKit\NovaElements\Fields\ElementCheckbox\FieldServiceProvider'); 31 | $this->app->register('NightKit\NovaElements\Fields\ElementInput\FieldServiceProvider'); 32 | $this->app->register('NightKit\NovaElements\Fields\ElementNumber\FieldServiceProvider'); 33 | $this->app->register('NightKit\NovaElements\Fields\ElementRadio\FieldServiceProvider'); 34 | $this->app->register('NightKit\NovaElements\Fields\ElementSelect\FieldServiceProvider'); 35 | $this->app->register('NightKit\NovaElements\Fields\ElementTabs\FieldServiceProvider'); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /vendor/nova-element-ui/fonts/vendor/element-ui/lib/theme-chalk/element-icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fat4lix/nova-element-ui/0498a17e1d46b2ef672a361ccf97944adc36f112/vendor/nova-element-ui/fonts/vendor/element-ui/lib/theme-chalk/element-icons.ttf -------------------------------------------------------------------------------- /vendor/nova-element-ui/fonts/vendor/element-ui/lib/theme-chalk/element-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fat4lix/nova-element-ui/0498a17e1d46b2ef672a361ccf97944adc36f112/vendor/nova-element-ui/fonts/vendor/element-ui/lib/theme-chalk/element-icons.woff -------------------------------------------------------------------------------- /vendor/nova-element-ui/mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/dist/nova-element-ui.js": "/dist/nova-element-ui.js" 3 | } -------------------------------------------------------------------------------- /webpack.mix.js: -------------------------------------------------------------------------------- 1 | 2 | let mix = require('laravel-mix') 3 | 4 | mix 5 | .js('./resources/js/nova-element-ui.js', 'dist') 6 | .setPublicPath('vendor/nova-element-ui') 7 | 8 | --------------------------------------------------------------------------------