diff --git a/build/webpack.config.js b/build/webpack.config.js index ed9003c..2e434f5 100644 --- a/build/webpack.config.js +++ b/build/webpack.config.js @@ -24,7 +24,7 @@ module.exports = (env, argv) => { filename: isDev ? 'assets/[name].js' : 'assets/[name].[contenthash:8].js', chunkFilename: isDev ? 'assets/[name].js' : 'assets/[name].[contenthash:8].js', publicPath: './', - clean: { + clean: isDev ? false : { keep: /^(index\.php|files|geo|images\/icons)(\/.*)?$/ } }, @@ -92,7 +92,7 @@ module.exports = (env, argv) => { } }, generator: { - filename: 'assets/images/[name].[contenthash:8][ext]' + filename: isDev ? 'assets/images/[name][ext]' : 'assets/images/[name].[contenthash:8][ext]' } }] }, @@ -115,8 +115,12 @@ module.exports = (env, argv) => { chunkGroups: mapChunkGroups(stats.compilation.chunkGroups) }; - fs.mkdirSync(path.resolve(PUBLIC, 'assets'), { recursive: true }); - fs.writeFileSync(path.resolve(PUBLIC, 'assets', 'entrypoints.json'), JSON.stringify(manifest, null, '\t')); + const manifestPath = path.resolve(PUBLIC, 'assets', 'entrypoints.json'); + const tmpManifestPath = `${manifestPath}.tmp`; + + fs.mkdirSync(path.dirname(manifestPath), { recursive: true }); + fs.writeFileSync(tmpManifestPath, JSON.stringify(manifest, null, '\t')); + fs.renameSync(tmpManifestPath, manifestPath); }); } }, diff --git a/lib/Spot.php b/lib/Spot.php index c563a00..7fb4bf6 100755 --- a/lib/Spot.php +++ b/lib/Spot.php @@ -296,8 +296,8 @@ class Spot extends Main //Assign medias to closest message if(!empty($asMessages)) { - usort($asMessages, function($a, $b){return $a['unix_time'] > $b['unix_time'];}); - usort($asMedias, function($a, $b){return $a['unix_time'] > $b['unix_time'];}); + usort($asMessages, function($a, $b){return (int) $a['unix_time'] <=> (int) $b['unix_time'];}); + usort($asMedias, function($a, $b){return (int) $a['unix_time'] <=> (int) $b['unix_time'];}); $iIndex = 0; $iMaxIndex = count($asMessages) - 1; @@ -318,7 +318,7 @@ class Spot extends Main //Combine markers $asMarkers = [...$asMessages, ...$asGeoMedias]; - usort($asMarkers, function($a, $b){return $a['unix_time'] > $b['unix_time'];}); + usort($asMarkers, function($a, $b){return (int) $a['unix_time'] <=> (int) $b['unix_time'];}); $asResult = array( 'markers' => $asMarkers, diff --git a/src/components/project.vue b/src/components/project.vue index d083885..6d15492 100644 --- a/src/components/project.vue +++ b/src/components/project.vue @@ -469,17 +469,18 @@ export default { )) || null; } - if(oHashMarker) { //Direct link to marker + //Direct link to marker + if(oHashMarker) { oBounds.extend(new LngLat(oHashMarker.longitude, oHashMarker.latitude)); } - else if( //Blog Mode: Fit to last message - this.project.mode == this.consts.modes.blog && - this.markers.length > 0 - ) { - let oLastMsg = this.markers.at(-1); - oBounds.extend(new LngLat(oLastMsg.longitude, oLastMsg.latitude)); + //Blog Mode: Fit to last marker + else if(this.project.mode == this.consts.modes.blog && this.markers.length > 0) { + let oLastMarker = this.markers.at(-1); + if(oLastMarker) oBounds.extend(new LngLat(oLastMarker.longitude, oLastMarker.latitude)); } - else { //Pre/Histo Mode: Fit to track + + //Pre Mode, Histo Mode, Blog Mode without markers or missing direct link marker: Fit to track + if(oBounds.isEmpty()) { for(const iFeatureId in this.track.features) { oBounds = this.track.features[iFeatureId].geometry.coordinates.reduce( (bounds, coord) => bounds.extend(coord),