Route::match(['get'], $segment . '/{id}/edit/links', $controller . '@links');
Route::match(['get'], $segment . '/{id}/edit/links/versions', $controller . '@getLinkVersions');
Route::match(['get'], $segment . '/{id}/edit/links/versions/export/{version}', $controller . '@exportLinks');
+ Route::match(['post'], $segment . '/{id}/edit/links/import/merge', $controller . '@importLinksMerge');
+ Route::match(['post'], $segment . '/{id}/edit/links/import/replace', $controller . '@importLinks');
Route::match(['get'], $segment . '/{id}/edit/links/versions/restore/{version}', $controller . '@restoreLinks');
Route::put($segment . '/{id}/save/links', $controller . '@saveLinks');
Route::get($segment . '/{id}/edit/{type}_{page}.{format}', $controller . '@getLinkPage')
FluidbookLinks::saveLinksInFile($fluidbook_id, backpack_user()->id, $comments, $links, $rulers, [], []);
}
+
+ protected function importLinks($fluidbook_id)
+ {
+ if (!FluidbookPublication::hasPermission($fluidbook_id)) {
+ abort(401);
+ }
+ FluidbookLinks::getLinksAndRulersFromExcelFile(request()->file('file')->getPathname(), $links, $rulers);
+ FluidbookLinks::saveLinksInFile($fluidbook_id, backpack_user()->id, 'Replace links from excel', $links, $rulers, [], []);
+ }
+
+ protected function importLinksMerge($fluidbook_id)
+ {
+ if (!FluidbookPublication::hasPermission($fluidbook_id)) {
+ abort(401);
+ }
+
+ FluidbookLinks::getLinksAndRulers($fluidbook_id, $merged_links, $merged_rulers);
+ FluidbookLinks::getLinksAndRulersFromExcelFile(request()->file('file')->getPathname(), $links, $rulers);
+ $existing_uids = [];
+ foreach ($merged_links as $merged_link) {
+ $existing_uids[$merged_link['uid']] = true;
+ }
+
+ foreach ($links as $link) {
+ if (isset($existing_uids[$link['uid']])) {
+ $link['uid'] = FluidbookLinks::generateUID();
+ $existing_uids[$link['uid']] = true;
+ }
+ $merged_links[] = $link;
+ }
+
+ $merged_rulers = array_merge($merged_rulers, $rulers);
+
+ FluidbookLinks::saveLinksInFile($fluidbook_id, backpack_user()->id, 'Merge existing links with excel', $merged_links, $merged_rulers, [], []);
+ }
+
// protected function getThumb($doc_id, $doc_page)
// {
//
namespace App\Util;
+use App\Models\FluidbookPublication;
use App\Models\User;
use Cubist\Util\ArrayUtil;
use Cubist\Util\Crypt;
self::saveLinksInFile($book_id, $core->user->utilisateur_id, 'Links imported from PDF', $links, []);
}
+
+ public static function getLinksAndRulersFromExcelFile($path, &$links, &$rulers)
+ {
+ $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
+ $xls = $reader->load($path);
+ FluidbookLinks::getLinksFromExcel($xls, $links, $rulers);
+ }
+
+ public static function generateUID()
+ {
+ $characters = '0123456789abcdefghijklmnopqrstuvwxyz';
+ $randstring = '';
+ for ($i = 0; $i < 12; $i++) {
+ $randstring = $characters[rand(0, 35)];
+ }
+ return $randstring;
+ }
}
}
},
+ saveIfUnsavedChanges: function (message, notify, callback) {
+ if (this.unsavedChanges) {
+ this.save(message, false, function () {
+ setTimeout(function () {
+ callback();
+ }, 1000);
+ });
+ } else {
+ callback();
+ }
+ },
+
save: function (message, notify, callback) {
if (notify === undefined) {
notify = true;
return false;
});
+ $(document).on('change', '.importExcel input', function () {
+ var e = $(this);
+ var callback = function () {
+ var form = $(e).closest('form');
+ var f = $(form).ajaxSubmit({dataType: 'json'});
+ var xhr = f.data('jqxhr');
+ xhr.done(function (data) {
+ setTimeout(function () {
+ console.log('reload');
+ window.location.reload();
+ }, 1000);
+ });
+ }
+ $this.linkeditor.save.saveIfUnsavedChanges('Sauvegarde before excel import', false, callback);
+ });
+
this.linkeditor.initTooltips();
},
};
}
//Restore links from 2022-12-07 13:37:15
- if (this.linkeditor.save.unsavedChanges) {
- console.log('save save save');
- this.linkeditor.save.save('Save before restoring links', false, function () {
- setTimeout(function () {
- callback();
- }, 1000);
- });
- } else {
- callback();
- }
+ this.linkeditor.save.saveIfUnsavedChanges('Save before restoring links',false,callback);
},
_restoreVersion(timestamp) {
margin: 0 2px
border-left: 1px solid $toolbar-color
+ div[data-icon]
+ position: relative
+ cursor: pointer
+
+ form.importExcel
+ input
+ position: absolute
+ opacity: 0
+ width: 100%
+ height: 100%
+ z-index: 1
+ cursor: pointer
+ top: 0
+ left: 0
+
#linkeditor-page-field
padding: 2px 10px
background-color: #fff
<a href="#" data-action="zoom.reset" data-icon="zoom-reset"
data-tooltip="{{__('Réinitialiser le zoom')}} (Esc)" data-key="esc, ctrl+0, ctrl+numpad0"></a>
<div class="separator"></div>
- <a href="#" data-action="importExcel" data-icon="import-links"
- data-tooltip="{{__('Importer les liens (Remplacer)')}}"></a>
- <a href="#" data-action="mergeExcel" data-icon="merge-links"
- data-tooltip="{{__('Importer les liens (Ajouter)')}}"></a>
+ <div data-icon="import-links"
+ data-tooltip="{{__('Importer les liens (Remplacer)')}}">
+ <form class="importExcel"
+ action="/fluidbook-publication/{{$fbdata['id']}}/edit/links/import/replace" method="post"
+ enctype="multipart/form-data">
+ <input type="file"
+ accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+ name="file"/>
+ </form>
+ </div>
+ <div data-icon="merge-links"
+ data-tooltip="{{__('Importer les liens (Ajouter)')}}">
+ <form class="importExcel"
+ action="/fluidbook-publication/{{$fbdata['id']}}/edit/links/import/merge" method="post"
+ enctype="multipart/form-data">
+ <input type="file"
+ accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+ name="file"/>
+ </form>
+ </div>
<a download="links_{{$fbdata['id']}}.xlsx"
href="/fluidbook-publication/{{$fbdata['id']}}/edit/links/versions/export/latest"
data-icon="export-links" data-tooltip="Exporter les liens"></a>