diff --git a/composer.json b/composer.json index ecd5236..9b94e5e 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,10 @@ "name": "laravel/laravel", "type": "project", "description": "The Laravel Framework.", - "keywords": ["framework", "laravel"], + "keywords": [ + "framework", + "laravel" + ], "license": "MIT", "require": { "php": "^7.3|^8.0", @@ -18,7 +21,6 @@ "laravel/tinker": "^2.5", "laravel/ui": "^3.4", "mews/purifier": "^3.3", - "slevomat/coding-standard": "^7.2", "spatie/laravel-mix-preload": "^1.3" }, "require-dev": { @@ -27,7 +29,8 @@ "laravel/sail": "^1.0.1", "mockery/mockery": "^1.4.4", "nunomaduro/collision": "^5.10", - "phpunit/phpunit": "^9.5.10" + "phpunit/phpunit": "^9.5.10", + "slevomat/coding-standard": "^7.2" }, "autoload": { "psr-4": { diff --git a/resources/ts/back/CkUploadAdaptater.ts b/resources/ts/back/CkUploadAdaptater.ts new file mode 100644 index 0000000..3661758 --- /dev/null +++ b/resources/ts/back/CkUploadAdaptater.ts @@ -0,0 +1,82 @@ +import axios, { CancelTokenSource } from "axios"; +import route from "../modules/route"; + +class CKUploadAdaptater { + route: string | null = ""; + cancel: CancelTokenSource | null = null; + + // @ts-ignore + constructor(loader) { + // The file loader instance to use during the upload. + // @ts-ignore + this.loader = loader; + this.cancel = axios.CancelToken.source(); + } + + // Starts the upload process. + upload() { + // @ts-ignore + return this.loader.file.then( + (file: File) => + new Promise((resolve, reject) => { + this._initRequest(); + this._sendRequest(file, resolve, reject); + }) + ); + } + + // Aborts the upload process. + abort() { + if (this.cancel) { + this.cancel.cancel(); + } + } + + // Initializes the XMLHttpRequest object using the URL passed to the constructor. + _initRequest() { + this.route = route.methods.route("crud-policies.upload"); + } + + // Prepares the data and sends the request. + _sendRequest( + file: File, + resolve: (value: unknown) => void, + reject: (reason?: any) => void + ) { + // Prepare the form data. + const data = new FormData(); + data.append("upload", file); + const headers = Object.assign( + {}, + window.axios ? window.axios.defaults.headers.common : {} + ); + headers["Content-Type"] = "multipart/form-data"; + + if (!this.route) { + throw new Error("Route is not set"); + } + + axios + .post(this.route, data, { + withCredentials: true, + headers: headers, + onUploadProgress: (evt) => { + // @ts-ignore + this.loader.uploadTotal = evt.total; + // @ts-ignore + this.loader.uploaded = evt.loaded; + }, + }) + .then((response) => { + resolve({ + default: response.data.url, + }); + }) + .catch((error) => { + console.error(error); + reject("Le fichier à été marbré"); + }); + } +} + +export { CKUploadAdaptater }; diff --git a/resources/ts/components/bo/CkEditorBoComponent.vue b/resources/ts/components/bo/CkEditorBoComponent.vue index 6cb5054..7455d2a 100644 --- a/resources/ts/components/bo/CkEditorBoComponent.vue +++ b/resources/ts/components/bo/CkEditorBoComponent.vue @@ -17,6 +17,7 @@ import { defineComponent, ref } from "vue"; import trans from "../../modules/trans"; import "./../../../js/vendor/ckeditor/build/ckeditor"; +import { CKUploadAdaptater } from "../../back/CkUploadAdaptater"; export default defineComponent({ mixins: [trans], @@ -71,6 +72,16 @@ export default defineComponent({ wordCounter = this.$refs.wordCounter as HTMLElement; // @ts-ignore ClassicEditor.create(ckeditor, { + extraPlugins: [ + // @ts-ignore + (editor) => { + // @ts-ignore + editor.plugins.get("FileRepository").createUploadAdapter = (loader) => { + // Configure the URL to the upload script in your back-end here! + return new CKUploadAdaptater(loader); + }; + }, + ], wordCount: { container: wordCounter, // @ts-ignore @@ -125,7 +136,7 @@ export default defineComponent({ "undo", "redo", "|", - "laravelFileManager", + "insertImage", "mediaEmbed", "blockQuote", "|", diff --git a/resources/ts/components/bo/ImageInputComponent.vue b/resources/ts/components/bo/ImageInputComponent.vue index a64854a..5b9f732 100644 --- a/resources/ts/components/bo/ImageInputComponent.vue +++ b/resources/ts/components/bo/ImageInputComponent.vue @@ -89,7 +89,10 @@ v-if="_value" :id="`PreviewHelp${_id}`" class="form-text text-muted d-block" - >{{ __("Prévisualisation de l'image") }}{{ __("Prévisualisation de l'image") + }} {{ humanFileSize(_originalFile.size) }}  = BYTES_PER_KB && u < UNITS.length - 1) { + size /= BYTES_PER_KB; + ++u; + } + + return new Intl.NumberFormat([], { + style: "unit", + unit: UNITS[u], + unitDisplay: "short", + maximumFractionDigits: 1, + }).format(size); + }, }, }); @@ -743,12 +768,6 @@ export default defineComponent({ left: 50%; transform: translateX(-50%) translateY(-50%); } - - @include media-breakpoint-up(md) { - & > div { - position: absolute; - } - } } input.rightAligned { direction: ltr !important; diff --git a/resources/ts/index.d.ts b/resources/ts/index.d.ts index e97ee8b..640ff80 100644 --- a/resources/ts/index.d.ts +++ b/resources/ts/index.d.ts @@ -26,7 +26,7 @@ type Model = Record< interface NestedModelInterface extends Model {} type NestedStringList = NestedStringListInterface | StringList | string; -type NestedNumberList = NestedStringListInterface | NumberList | number; +type NestedNumberList = NestedNumberListInterface | NumberList | number; type ModelList = Array; declare global { diff --git a/webpack.mix.js b/webpack.mix.js index 222f6a1..36efb78 100644 --- a/webpack.mix.js +++ b/webpack.mix.js @@ -4,8 +4,8 @@ const mix = require('laravel-mix') require('laravel-mix-polyfill') require('laravel-mix-clean') -let assetDir = 'assets' -let polyfill = { +const assetDir = 'assets' +const polyfill = { enabled: true, bugfixes: true, useBuiltIns: "usage",