mohamed7sameer / tincymicy-field
A Laravel Nova field.
Installs: 6
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Language:Vue
pkg:composer/mohamed7sameer/tincymicy-field
Requires
- php: ^7.3|^8.0
README
composer require mohamed7sameer/tincymicy-field
php artisan nova:field mohammed2617/tincyeditor
cd nova-components/Tincyeditor
npm run watch
Edit resources/js/components/FromField.js
<template>
<DefaultField
:field="field"
:errors="errors"
:show-help-text="showHelpText"
:full-width-content="fullWidthContent"
>
<template #field>
<textarea
:id="field.attribute"
type="text"
:class="errorClasses"
:placeholder="field.name"
v-model="value"
></textarea>
</template>
</DefaultField>
</template>
<script>
import { FormField, HandlesValidationErrors } from 'laravel-nova'
export default {
mixins: [FormField, HandlesValidationErrors],
props: ['resourceName', 'resourceId', 'field'],
created () {},
beforeMount () {},
mounted () {
this.$nextTick(()=>{
this.setEditor();
});
},
beforeUpdate () {},
updated () {},
beforeUnmount () {
tinymce.remove("#" + this.field.attribute);
},
unmounted () {},
errorCaptured () {},
activated () {},
deactivated () {},
serverPrefetch () {},
methods: {
/*
* Set the initial, internal value for the field.
*/
setInitialValue() {
this.value = this.field.value || ''
},
setEditor () {
const useDarkMode = false ;
tinymce.init({
"selector": "#" + this.field.attribute,
plugins: 'preview importcss searchreplace autolink autosave save directionality code visualblocks visualchars fullscreen image link media codesample table charmap pagebreak nonbreaking anchor insertdatetime advlist lists wordcount help charmap quickbars emoticons accordion',
menubar: 'file edit view insert format tools table help',
toolbar: "undo redo | accordion accordionremove | blocks fontfamily fontsize | bold italic underline strikethrough | align numlist bullist | link image | table media | lineheight outdent indent| forecolor backcolor removeformat | charmap emoticons | code fullscreen preview | save print | pagebreak anchor codesample | ltr rtl",
autosave_ask_before_unload: true,
autosave_interval: '30s',
autosave_prefix: '{path}{query}-{id}-',
autosave_restore_when_empty: false,
autosave_retention: '2m',
image_advtab: true,
importcss_append: true,
height: 600,
image_caption: true,
quickbars_selection_toolbar: 'bold italic | quicklink h2 h3 blockquote quickimage quicktable',
noneditable_class: 'mceNonEditable',
toolbar_mode: 'sliding',
contextmenu: 'link image table',
skin: useDarkMode ? 'oxide-dark' : 'oxide',
content_css: useDarkMode ? 'dark' : 'default',
images_upload_url: '/api/upload_tinymce_image',
automatic_uploads: true,
setup: (editor)=> {
editor.on('change', ()=> {
// console.log(editor.getContent())
editor.save();
// this.value = editor.getContent();
this.value = this.field.value = editor.getContent();
// get the editor value and set it in this.value
});
}
});
},
/**
* Fill the given FormData object with the field's internal value.
*/
fill(formData) {
formData.append(this.fieldAttribute, this.value || '')
},
},
}
</script>
npm run prod cd .. cd .. php artisan install:api # cd .. # cd .. # cd public_html cd public mkdir admin cd admin git clone https://github.com/mohamed7sameer/tinymce
namespace App\Providers; class NovaServiceProvider extends NovaApplicationServiceProvider { public function boot() { parent::boot(); Nova::remoteScript(asset('admin/tinymce/tinymce.min.js')); } }
<?php namespace App\Helper; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; use Intervention\Image\Laravel\Facades\Image; class MoHelper { public static function ConvetToWebp($request,$name = 'image',$disk="public",$path="tiny"){ $file = $request->file($name); $filename = 'image_' . time() . '_' . Str::random(10) . '.webp'; $image = Image::read($file->getRealPath()); Storage::disk($disk)->put($path . '/' .$filename, $image->toWebp(60)); return $filename ; } public static function slug($slug,$model,$id=null) { $exists = $model->where('slug', $slug)->when($id, function ($query, $id) { return $query->where('id', '!=', $id); }) ->exists(); if ($exists) { $slug = $slug . '-1'; return MoHelper::slug($slug, $model, $id); } return $slug ; } public static function initSlug($request,$model,$attribute,$t) { /********************* * Insert It Into Laravel Nova Field ->fillUsing( function ($request, $model, $attribute, $requestAttribute) { MoHelper::initSlug($request,$model,$attribute,$this); } ), **********************/ if (!$request->slug) { $slug = Str::slug($request->title); $val = MoHelper::slug($slug, $model,$t->getKey()); }else{ $slug = Str::slug($request->slug); $val = MoHelper::slug($slug, $model,$t->getKey()); } return $model->{$attribute} = $val; } public static function storTinymceImage($request) { $request->validate([ 'file' => [ 'required', 'image', 'mimes:jpeg,png,jpg,gif,svg', 'max:10240', ] ]); if (!$request->hasFile('file')) { return response()->json(['error' => 'No file uploaded.'], 400); } $file = $request->file('file'); $path = $file->store('/', 'tinymce'); $filename = MoHelper::ConvetToWebp($request,'file','tinymce','tiny'); return response()->json(['location' => app('filesystem')->disk('tinymce')->url($filename)]); } }
return [ 'disks' => [ 'tinymce' => [ 'driver' => 'local', 'root' => env('MO_STORAGE_FOLDER_TINYMCE'), 'url' => env('APP_URL').'/mo/storage/image_e/tiny', 'visibility' => 'public', 'throw' => false, ], ]; ];
MO_STORAGE_FOLDER_TINYMCE="C:/laragon/www/cesr/public/mo/storage/image_e"
Route::post('/upload_tinymce_image', function(Request $request){ return MoHelper::storTinymceImage($request); });
hello
Tincyeditor::make('description')->hideFromIndex(),
php artisan optimize:clear
npm Share host
https://github.com/mohamed7sameer/senior_laravel/blob/main/1-laravel_a.md https://nodejs.org/dist/
wget https://nodejs.org/dist/v23.3.0/node-v23.3.0-linux-x64.tar.gz
extract it before public rename it to libraries/npm
echo 'export PATH=libraries/npm/bin' >> ~.bashrc node -v npm -v