fix: many bug fixes - #20

This commit is contained in:
Noah Lancien 2025-03-25 11:00:14 +01:00
parent 764044384a
commit caa7189cc3
13 changed files with 170 additions and 91 deletions

View file

@ -39,7 +39,8 @@ class CommonController extends Controller
})->with('sujet')->get();
return view('home')->with([
'sujets' => $sujets, 'recherches' => $recherches,
'sujets' => $sujets,
'recherches' => $recherches,
'dossiers' => $dossiers
]);
}
@ -54,8 +55,10 @@ class CommonController extends Controller
{
/** @var \App\Models\User $user */
$user = auth()->user();
Mail::to(env('MAIL_ADMIN_ADDRESS', "informatique.internet@ldc.fr"))
->send(new ContactMail(ContactType::from($request->type), $request->url, $request->message, $user));
foreach (config('mail.contactsList.admin') as $mail) {
Mail::to($mail)
->send(new ContactMail(ContactType::from($request->type), $request->url, $request->message, $user));
}
return response()->json(['status' => 'OK']);
}

View file

@ -102,7 +102,7 @@ class MediaController extends Controller
$textSearch,
$filters,
intval(Dossier::where('id', $dossier_id)->exists() ?
$dossier_id : (in_array($dossier_id, [-1, 0]) ? $dossier_id : -1))
$dossier_id : (in_array($dossier_id, [-1, 0]) ? $dossier_id : -1))
);
}
@ -124,7 +124,7 @@ class MediaController extends Controller
'etiquettes' => $etiquettes,
'societes' => $societes,
'marques' => $marques,
'currentFolder' => $dossier_id,
'currentFolder' => Dossier::query()->where('id', $dossier_id)->first() ?? $dossier_id,
'currentSujet' => optional($sujet)->codeSujet ?? \optional($sujets->first())->codeSujet,
'currentFilters' => json_encode($filters),
'paniers' => $paniers,
@ -236,8 +236,8 @@ class MediaController extends Controller
$response['isDepot'] = $isDepot;
$response['isCAQuery'] = $searchText &&
strpos($searchText, '=') !== false &&
\strval(collect(explode('=', $searchText))->get(0)) === 'ca';
strpos($searchText, '=') !== false &&
\strval(collect(explode('=', $searchText))->get(0)) === 'ca';
$response['role'] = $user->role;
@ -262,7 +262,7 @@ class MediaController extends Controller
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Media> */
$mediaList = Media::whereIn('id', collect($request->mediaList)->pluck('id'))
->where('isLocked', false)->get();
->where('isLocked', false)->get();
$destinationDossierId = \intval($request->dossier_id);
@ -346,7 +346,7 @@ class MediaController extends Controller
});
} catch (ModelNotFoundException | \RuntimeException $e) {
return response()->json($e->getMessage(), 500);
}//end try
} //end try
}
/**
@ -416,7 +416,7 @@ class MediaController extends Controller
'status' => false,
'error' => trans('Une erreur est survenue veuillez réessayer')
]);
}//end try
} //end try
}
/**
@ -446,19 +446,6 @@ class MediaController extends Controller
$clonedMedia = $media->replicate();
$media->articles->map(function (Article $article) use ($clonedMedia) {
$clonedMedia->articles()->attach($article);
});
$media->marques->map(function (Marque $marque) use ($clonedMedia) {
$clonedMedia->marques()->attach($marque);
});
$media->societes->map(function (Societe $societe) use ($clonedMedia) {
$clonedMedia->societes()->attach($societe);
});
$media->tags->map(function (Tag $tag) use ($clonedMedia) {
$clonedMedia->tags()->attach($tag);
});
/** @var \Illuminate\Filesystem\FilesystemAdapter */
$storage = Storage::disk('media');
@ -498,11 +485,27 @@ class MediaController extends Controller
// ---- Creation des vignettes en lien avec le sujet du média
$clonedMedia->createSubjectThumbnails();
$clonedMedia->isDuplicate = true;
$clonedMedia->saveOrFail();
// Manage relations after the model has been saved.
$media->articles->map(function (Article $article) use ($clonedMedia) {
$clonedMedia->articles()->attach($article);
});
$media->marques->map(function (Marque $marque) use ($clonedMedia) {
$clonedMedia->marques()->attach($marque);
});
$media->societes->map(function (Societe $societe) use ($clonedMedia) {
$clonedMedia->societes()->attach($societe);
});
$media->tags->map(function (Tag $tag) use ($clonedMedia) {
$clonedMedia->tags()->attach($tag);
});
/** @throws \RuntimeException */
$clonedMedia->addToElasticSearch();
$clonedMedia->addToIndex();
// * Get props inserted by DB.
$clonedMedia->refresh();
@ -751,8 +754,8 @@ class MediaController extends Controller
$history = Historique::whereHas('media', function ($q) use ($media) {
$q->whereId($media->id);
})->with('user')
->orderBy('created_date', 'DESC')
->get();
->orderBy('created_date', 'DESC')
->get();
return \response()->json([
'history' => $history,
'vignettes' => $this->getVignettesByMedia($media)
@ -1062,9 +1065,9 @@ class MediaController extends Controller
];
$sys_extension = in_array($media->extension, [
MediaExtension::pdf,
MediaExtension::ai,
MediaExtension::psd
MediaExtension::pdf,
MediaExtension::ai,
MediaExtension::psd
]) ? MediaExtension::png : $media->extension->value;
$vignettes['preview'] = [

View file

@ -68,6 +68,8 @@ class PanierController extends Controller
$request->mediaList
));
Media::flushQueryCache();
return response()->json();
}
@ -151,7 +153,7 @@ class PanierController extends Controller
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Format> $formats */
$formats = Format::withoutGlobalScope('App\Scopes\SystemScope')
->where('system', true)->get();
->where('system', true)->get();
return view('panier.show')->with([
'panier' => $panier,
'formats' => $formats,

View file

@ -15,6 +15,7 @@ use App\Models\Sujet;
use App\Models\TypeMedia;
use App\Models\User;
use App\Traits\Http\HandlesMedia;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile;
@ -97,7 +98,7 @@ class UploadController extends Controller
// 400 instead of 422 is for resumablejs to handle properly.
return \response()->json($e->errors(), 400);
}
}//end if
} //end if
// We are in chunk mode, lets send the current progress.
/** @var AbstractHandler $handler */
@ -143,9 +144,9 @@ class UploadController extends Controller
$this->validateUploadedFile($uplodedFile);
/** @var \App\Models\Media */
$media = Media::whereId($request->media_id)
->whereHas('sujet', function ($q) use ($sujet) {
$q->whereId($sujet->id);
$media = Media::query()->whereId($request->media_id)
->whereHas('sujet', function (Builder $q) use ($sujet) {
$q->where('codeSujet', $sujet->codeSujet);
})->whereHas('dossier', function ($q) use ($dossier) {
$q->whereId($dossier->id);
})->firstOrNew();
@ -156,7 +157,7 @@ class UploadController extends Controller
// 400 instead of 422 is for resumablejs to handle properly.
return \response()->json($e->errors(), 400);
}
}//end if
} //end if
// We are in chunk mode, lets send the current progress.
/** @var AbstractHandler $handler */
@ -341,6 +342,8 @@ class UploadController extends Controller
$media->saveOrFail();
Media::flushQueryCache();
// * Get props inserted by DB.
return response()->json($media->refresh());
});

View file

@ -39,14 +39,27 @@ class Media extends Model
*/
public $cacheDriver = 'redis';
/**
* Is the model a duplicate of another (only true before we save it in database)
*
* @var boolean
*/
public $isDuplicate = false;
/**
* The relations to eager load on every query.
*
* @var array
*/
protected $with = [
'owner', 'tags', 'etiquette', 'articles', 'sujet',
'typeMedia', 'societes', 'marques'
'owner',
'tags',
'etiquette',
'articles',
'sujet',
'typeMedia',
'societes',
'marques'
];
/**
@ -209,8 +222,10 @@ class Media extends Model
$user = auth()->user();
MediaCreated::dispatch($user, $model);
/** @throws \RuntimeException */
$model->addToElasticSearch();
if (empty($model->isDuplicate)) {
/** @throws \RuntimeException */
$model->addToElasticSearch();
}
});
static::updating(function (self $model) {
if ($model->statut === MediaStatut::brouillon and $model->arcadia_id) {
@ -723,7 +738,7 @@ class Media extends Model
// * create preview
/** @var \App\Models\Format $format */
$format = Format::withoutGlobalScope('App\Scopes\SystemScope')
->where('libelle', '=', 'preview')->firstOrFail();
->where('libelle', '=', 'preview')->firstOrFail();
if ($this->extension == MediaExtension::gif) {
if ($this->largeur >= $format->largeur || $this->hauteur >= $format->hauteur || $this->largeur == "") {
@ -753,7 +768,7 @@ class Media extends Model
// * create thumb
/** @var \App\Models\Format $format */
$format = Format::withoutGlobalScope('App\Scopes\SystemScope')
->where('libelle', '=', 'thumb')->firstOrFail();
->where('libelle', '=', 'thumb')->firstOrFail();
if ($this->extension != MediaExtension::png) {
$im->setImageBackgroundColor('#ffffff');
$im->setImageAlphaChannel(\Imagick::ALPHACHANNEL_REMOVE);

View file

@ -118,7 +118,8 @@ return [
// * Contacts List
'contactsList' => [
'invalidXml' => preg_split('/(\s*,*\s*)*,+(\s*,*\s*)*/', env('MAIL_LIST_INVALID_XML', 'equipe.web@ldc.fr')),
'serviceweb' => preg_split('/(\s*,*\s*)*,+(\s*,*\s*)*/', env('MAIL_LIST_SERVICEWEB', 'equipe.web@ldc.fr'))
'serviceweb' => preg_split('/(\s*,*\s*)*,+(\s*,*\s*)*/', env('MAIL_LIST_SERVICEWEB', 'equipe.web@ldc.fr')),
'admin' => explode(',', env('MAIL_ADMIN')),
],
];

View file

@ -163,8 +163,8 @@
</template>
<script>
import Resumable from "resumablejs";
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
import Resumable from "resumablejs";
export default {
name: "MmActionsComponent",
@ -224,7 +224,7 @@ export default {
} else {
this.$loading.show({ delay: 0 });
axios
.post(`/ajax/media/${this.storeGrabbed[0].id}/duplicate`)
.post(`/ajax/media/${this.storeGrabbed[0].uid}/duplicate`)
.then((response) => {
this.$loading.hide();
if (response.data.status === true) {
@ -489,6 +489,9 @@ export default {
.querySelector('meta[name="csrf-token"]')
.getAttribute("content"),
},
query: {
media_id: this.storeMedia.id
}
});
this.resumable.on("fileAdded", this.uploadFileAdded);

View file

@ -167,6 +167,7 @@ export default {
},
mounted() {
this.resetInfiniteScroll();
this.init();
},
data: function () {
return {
@ -221,6 +222,10 @@ export default {
type: "updateGrabbed",
grabbed: [],
});
this.$store.commit({
type: "updateFolder",
folder: this.storeFolder,
});
this.loadMediaList();
//set dateSorted
this.dateSorted = false;

View file

@ -126,6 +126,7 @@ export default {
components: { FontAwesomeIcon },
mounted() {
const data = JSON.parse(this.$parent.$options.json);
this.selectedFolder = data.selectedFolder;
this.textsearch = data.textsearch ? String(data.textsearch) : "";
this.oTypesmedia = data.typesmedia;
this.oEtiquettes = data.etiquettes;
@ -152,6 +153,7 @@ export default {
sReferentiel: [],
sTexte: "",
initText: 0,
selectedFolder: {},
};
},
watch: {
@ -304,15 +306,23 @@ export default {
}
},
reset() {
this.resetFolder();
// this.resetFolder();
this.sTypevue = [];
this.sTypemedias = [];
this.sEtiquettes = [];
this.sReferentiel = [];
this.sTexte = "";
const filters = this.selectedFolder ? [{
type: "dossier_id",
legend: "Dossier : ",
value: this.selectedFolder.id,
libelle: this.selectedFolder.libelle,
}] : [];
this.resetFolder();
this.selectedFolder = null;
this.$store.commit({
type: "updateFilters",
filters: [],
filters: filters,
});
if (this.textsearch.length && this.initText === 0) {
this.addText(this.textsearch);

View file

@ -182,6 +182,18 @@ export default {
return this.$store.state.reload;
},
},
mounted() {
const data = JSON.parse(this.$parent.$options.json);
if (data.selectedFolder) {
this.selectedFolder = data.selectedFolder;
this.selectFolder(data.selectedFolder);
this.$store.commit({
type: "updateFolder",
folder: data.selectedFolder.id ?? -1,
});
this.storeFolder = data.selectedFolder.id;
}
},
data() {
return {
selectedFolder: false,
@ -193,7 +205,8 @@ export default {
},
watch: {
storeSujet() {
this.initFolders();
this.initFolders(this.selectedFolder);
this.selectedFolder = null;
},
storeReload() {
this.reload();

View file

@ -100,12 +100,12 @@
<script>
// ResumableJs
import Resumable from "resumablejs";
import MePreviewComponent from "./tabs/MePreviewComponent.vue";
import MeEditComponent from "./tabs/MeEditComponent.vue";
import MeLinksComponent from "./tabs/MeLinksComponent.vue";
import MeHistoryComponent from "./tabs/MeHistoryComponent.vue";
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
import Resumable from "resumablejs";
import MeEditComponent from "./tabs/MeEditComponent.vue";
import MeHistoryComponent from "./tabs/MeHistoryComponent.vue";
import MeLinksComponent from "./tabs/MeLinksComponent.vue";
import MePreviewComponent from "./tabs/MePreviewComponent.vue";
export default {
name: "MmEditComponent",
@ -180,7 +180,7 @@ export default {
var query = {
sujet_id: this.storeMedia.sujet_id,
dossier_id: this.storeMedia.dossier_id,
replaceMediaId: this.storeMedia.id,
media_id: this.storeMedia.id,
};
this.r.updateQuery(query);
} else {

View file

@ -73,7 +73,7 @@
required
v-model="oMedia.type_vue_id"
:disabled="oMedia.isLocked || oMedia.arcadia_id !== null"
@change="oMedia.variante_id = null"
@change="updateVariantes"
>
<option :value="null" selected disabled>Sélectionnez un type de vue</option>
<option v-for="item in storeTypesvue" :value="item.codeTypevue">
@ -93,7 +93,7 @@
<option :value="null" selected disabled>
Sélectionnez un type de variante
</option>
<option v-for="item in storeTypesvariante" :value="item.codeVariante">
<option v-for="item in availableVariantes" :value="item.codeVariante">
{{ item.libelle }}
</option>
</select>
@ -395,6 +395,11 @@ export default {
return this.$store.state.role;
},
},
mounted() {
this.$nextTick(() => {
this.availableVariantes = this.storeTypesvariante;
})
},
watch: {
marques() {
this.oMarques = this.marques;
@ -439,9 +444,14 @@ export default {
selectedSocietes: [],
searchMarques: "",
searchSocietes: "",
availableVariantes: [],
};
},
methods: {
updateVariantes(evt) {
this.oMedia.variante_id = null;
this.availableVariantes = this.storeTypesvariante.filter(e => e.typevue_id === this.oMedia.type_vue_id);
},
ArcadiaLink() {
if (this.oMedia.isDefault) {
$.fancyMessage({

View file

@ -2,55 +2,66 @@
@include('layouts.header')
@include('layouts.media_edit')
@section('content')
<main class="media_manager template_2col">
<div class="side_menu">
@php
$dataVue = [
'sujets' => $sujets,
'current' => $currentSujet,
];
@endphp
<div id="mm-side-header" data-json='@json($dataVue)'></div>
<div id="mm-folder" data-json='{}'></div>
</div>
<div class="main_content">
<header>
@php
<main class="media_manager template_2col">
<div class="side_menu">
@php
$dataVue = [
'textsearch' => $textSearch,
'typesmedia' => $typesmedia,
'etiquettes' => $etiquettes,
'sujets' => $sujets,
'current' => $currentSujet,
];
@endphp
<div id="mm-side-header" data-json='@json($dataVue)'></div>
@php
$dataVue = [
'selectedFolder' => $currentFolder,
'selectedSubject' => $currentSujet,
];
@endphp
<div id="mm-folder" data-json='@json($dataVue)'></div>
</div>
<div class="main_content">
<header>
@php
$dataVue = [
'textsearch' => $textSearch,
'typesmedia' => $typesmedia,
'etiquettes' => $etiquettes,
'selectedFolder' => $currentFolder,
];
@endphp
<div id="mm-filters" data-json='@json($dataVue)'></div>
<div class="action_wrapper group">
<div class="action_wrapper group">
<div id="actionsBar">
@php
$dataVue = [
'csrf' => csrf_token(),
'etiquettes' => $etiquettes,
];
$dataVue = [
'csrf' => csrf_token(),
'etiquettes' => $etiquettes,
];
@endphp
<div id="mm-actions" data-json='@json($dataVue)'></div>
</div>
<div class="display">
<div class="display">
<button><i class="fa fa-calendar-check selected"></i></button>
<button><i class="fa fa-table-cells selected"></i></button>
<button><i class="fa fa-table-list"></i></button>
</div>
<button><i class="fa fa-table-cells selected"></i></button>
<button><i class="fa fa-table-list"></i></button>
</div>
<div id="mm-sorter" data-json='{}'></div>
</div>
</header>
<div id="mm-display" data-json='{}'></div>
</div>
</div>
</header>
@php
$dataVue = [
'selectedFolder' => $currentFolder,
];
@endphp
<div id="mm-display" data-json='@json($dataVue)'></div>
</div>
<div id="mm-basket" data-json='{}'></div>
</main>
</main>
@endsection
@section('scripts')
<!-- TODO : Faire le tri des js ci-dessous -->
<script src="{{ mix('js/jquery.nestable.min.js') }}" defer></script>
<script src="{{ mix('js/fabric.js') }}"></script>
<script src="{{ mix('js/darkroom.js') }}"></script>
<script src="{{ mix('js/jquery.caret.min.js') }}"></script>
<script src="{{ mix('js/jquery.nestable.min.js') }}" defer></script>
<script src="{{ mix('js/fabric.js') }}"></script>
<script src="{{ mix('js/darkroom.js') }}"></script>
<script src="{{ mix('js/jquery.caret.min.js') }}"></script>
@endsection