decidim-participatory_documents 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.erb-lint.yml +30 -0
- data/.eslintignore +3 -0
- data/.eslintrc.json +3 -0
- data/.github/workflows/lint.yml +43 -0
- data/.github/workflows/test.yml +60 -0
- data/.gitignore +27 -0
- data/.rspec +3 -0
- data/.rubocop-disabled.yml +11 -0
- data/.rubocop.yml +4 -0
- data/.rubocop_rails.yml +91 -0
- data/.rubocop_ruby.yml +1768 -0
- data/.ruby-version +1 -0
- data/.simplecov +13 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +39 -0
- data/Gemfile.lock +817 -0
- data/LICENSE-AGPLv3.txt +661 -0
- data/README.md +166 -0
- data/Rakefile +44 -0
- data/app/cells/decidim/participatory_documents/edit_suggestion_note_modal/show.erb +20 -0
- data/app/cells/decidim/participatory_documents/edit_suggestion_note_modal_cell.rb +35 -0
- data/app/cells/decidim/participatory_documents/suggestion/admin_answer.erb +7 -0
- data/app/cells/decidim/participatory_documents/suggestion/show.erb +11 -0
- data/app/cells/decidim/participatory_documents/suggestion_author/avatar.erb +3 -0
- data/app/cells/decidim/participatory_documents/suggestion_author/date.erb +1 -0
- data/app/cells/decidim/participatory_documents/suggestion_author/name.erb +3 -0
- data/app/cells/decidim/participatory_documents/suggestion_author/show.erb +9 -0
- data/app/cells/decidim/participatory_documents/suggestion_author_cell.rb +50 -0
- data/app/cells/decidim/participatory_documents/suggestion_cell.rb +41 -0
- data/app/commands/decidim/participatory_documents/admin/answer_suggestion.rb +62 -0
- data/app/commands/decidim/participatory_documents/admin/assign_suggestions_to_valuator.rb +59 -0
- data/app/commands/decidim/participatory_documents/admin/create_document.rb +55 -0
- data/app/commands/decidim/participatory_documents/admin/create_suggestion_note.rb +49 -0
- data/app/commands/decidim/participatory_documents/admin/destroy_annotation.rb +67 -0
- data/app/commands/decidim/participatory_documents/admin/notify_suggestion_answer.rb +52 -0
- data/app/commands/decidim/participatory_documents/admin/publish_answers.rb +59 -0
- data/app/commands/decidim/participatory_documents/admin/publish_document.rb +26 -0
- data/app/commands/decidim/participatory_documents/admin/unassign_suggestions_from_valuator.rb +60 -0
- data/app/commands/decidim/participatory_documents/admin/update_document.rb +85 -0
- data/app/commands/decidim/participatory_documents/admin/update_or_create_annotation.rb +98 -0
- data/app/commands/decidim/participatory_documents/admin/update_section.rb +52 -0
- data/app/commands/decidim/participatory_documents/admin/update_suggestion_note.rb +36 -0
- data/app/commands/decidim/participatory_documents/create_suggestion.rb +65 -0
- data/app/controllers/concerns/decidim/participatory_documents/admin/needs_admin_snippets.rb +25 -0
- data/app/controllers/concerns/decidim/participatory_documents/needs_pdf_document.rb +105 -0
- data/app/controllers/decidim/participatory_documents/admin/annotations_controller.rb +51 -0
- data/app/controllers/decidim/participatory_documents/admin/application_controller.rb +18 -0
- data/app/controllers/decidim/participatory_documents/admin/documents_controller.rb +104 -0
- data/app/controllers/decidim/participatory_documents/admin/sections_controller.rb +39 -0
- data/app/controllers/decidim/participatory_documents/admin/suggestion_notes_controller.rb +59 -0
- data/app/controllers/decidim/participatory_documents/admin/suggestions_controller.rb +160 -0
- data/app/controllers/decidim/participatory_documents/admin/valuation_assignments_controller.rb +58 -0
- data/app/controllers/decidim/participatory_documents/application_controller.rb +14 -0
- data/app/controllers/decidim/participatory_documents/document_suggestions_controller.rb +40 -0
- data/app/controllers/decidim/participatory_documents/documents_controller.rb +18 -0
- data/app/controllers/decidim/participatory_documents/section_suggestions_controller.rb +40 -0
- data/app/events/decidim/participatory_documents/suggestion_answer_event.rb +43 -0
- data/app/forms/decidim/participatory_documents/admin/annotation_form.rb +26 -0
- data/app/forms/decidim/participatory_documents/admin/answer_suggestion_form.rb +21 -0
- data/app/forms/decidim/participatory_documents/admin/document_form.rb +29 -0
- data/app/forms/decidim/participatory_documents/admin/section_form.rb +17 -0
- data/app/forms/decidim/participatory_documents/admin/suggestion_note_form.rb +15 -0
- data/app/forms/decidim/participatory_documents/admin/valuation_assignment_form.rb +38 -0
- data/app/forms/decidim/participatory_documents/suggestion_form.rb +39 -0
- data/app/helpers/decidim/participatory_documents/admin/button_helper.rb +17 -0
- data/app/helpers/decidim/participatory_documents/admin/documents_helper.rb +71 -0
- data/app/helpers/decidim/participatory_documents/admin/suggestion_helper.rb +54 -0
- data/app/helpers/decidim/participatory_documents/documents_helper.rb +41 -0
- data/app/models/concerns/decidim/participatory_documents/participatory_space_user_role_override.rb +19 -0
- data/app/models/concerns/decidim/participatory_documents/valuator_override.rb +18 -0
- data/app/models/decidim/participatory_documents/annotation.rb +28 -0
- data/app/models/decidim/participatory_documents/application_record.rb +10 -0
- data/app/models/decidim/participatory_documents/document.rb +67 -0
- data/app/models/decidim/participatory_documents/section.rb +44 -0
- data/app/models/decidim/participatory_documents/suggestion.rb +167 -0
- data/app/models/decidim/participatory_documents/suggestion_note.rb +18 -0
- data/app/models/decidim/participatory_documents/valuation_assignment.rb +21 -0
- data/app/packs/entrypoints/decidim_participatory_documents.js +6 -0
- data/app/packs/entrypoints/decidim_participatory_documents.scss +18 -0
- data/app/packs/entrypoints/decidim_participatory_documents_admin.js +7 -0
- data/app/packs/entrypoints/decidim_participatory_documents_admin.scss +69 -0
- data/app/packs/entrypoints/decidim_participatory_documents_editor.js +12 -0
- data/app/packs/entrypoints/decidim_participatory_documents_editor.scss +33 -0
- data/app/packs/entrypoints/decidim_participatory_documents_viewer.js +6 -0
- data/app/packs/entrypoints/decidim_participatory_documents_viewer.scss +11 -0
- data/app/packs/images/.keep +0 -0
- data/app/packs/images/badge.svg +6 -0
- data/app/packs/images/fullscreen.svg +6 -0
- data/app/packs/images/fullscreen_exit.svg +14 -0
- data/app/packs/images/group.svg +1 -0
- data/app/packs/images/move.svg +49 -0
- data/app/packs/images/participatory_documents.svg +14 -0
- data/app/packs/src/decidim/participatory_documents/admin/manage_bulk_suggestions.js +133 -0
- data/app/packs/src/decidim/participatory_documents/admin/preview_box_color.js +14 -0
- data/app/packs/src/decidim/participatory_documents/global.js +22 -0
- data/app/packs/src/decidim/participatory_documents/pdf/box.js +234 -0
- data/app/packs/src/decidim/participatory_documents/pdf/box_control_group.js +80 -0
- data/app/packs/src/decidim/participatory_documents/pdf/box_control_move.js +55 -0
- data/app/packs/src/decidim/participatory_documents/pdf/box_controls.js +18 -0
- data/app/packs/src/decidim/participatory_documents/pdf/pdf_modal_manager.js +129 -0
- data/app/packs/src/decidim/participatory_documents/pdf/pdf_state_manager.js +141 -0
- data/app/packs/src/decidim/participatory_documents/pdf/polygon_editor.js +99 -0
- data/app/packs/src/decidim/participatory_documents/pdf/polygon_viewer.js +55 -0
- data/app/packs/src/decidim/participatory_documents/pdf/suggestion_form.js +142 -0
- data/app/packs/src/decidim/participatory_documents/pdf.js +37 -0
- data/app/packs/src/decidim/participatory_documents/pdf_admin.js +60 -0
- data/app/packs/src/decidim/participatory_documents/pdf_notifications.js +20 -0
- data/app/packs/src/decidim/participatory_documents/skip_cookie_warning.js +10 -0
- data/app/packs/stylesheets/decidim/participatory_documents/decidim_admin_classes.scss +13 -0
- data/app/packs/stylesheets/decidim/participatory_documents/pdf/admin_modals.scss +41 -0
- data/app/packs/stylesheets/decidim/participatory_documents/pdf/admin_polygons.scss +131 -0
- data/app/packs/stylesheets/decidim/participatory_documents/pdf/admin_tweaks.scss +44 -0
- data/app/packs/stylesheets/decidim/participatory_documents/pdf/defaults.scss +7 -0
- data/app/packs/stylesheets/decidim/participatory_documents/pdf/document.scss +7 -0
- data/app/packs/stylesheets/decidim/participatory_documents/pdf/modals.scss +152 -0
- data/app/packs/stylesheets/decidim/participatory_documents/pdf/notifications.scss +31 -0
- data/app/packs/stylesheets/decidim/participatory_documents/pdf/polygons.scss +80 -0
- data/app/packs/stylesheets/decidim/participatory_documents/pdf/tweaks.scss +147 -0
- data/app/permissions/decidim/participatory_documents/admin/permissions.rb +118 -0
- data/app/permissions/decidim/participatory_documents/permissions.rb +16 -0
- data/app/presenters/decidim/participatory_documents/admin_log/annotation_presenter.rb +25 -0
- data/app/presenters/decidim/participatory_documents/admin_log/document_presenter.rb +13 -0
- data/app/presenters/decidim/participatory_documents/admin_log/section_presenter.rb +25 -0
- data/app/presenters/decidim/participatory_documents/admin_log/suggestion_note_presenter.rb +49 -0
- data/app/serializers/decidim/participatory_documents/suggestion_serializer.rb +67 -0
- data/app/uploaders/decidim/participatory_documents/pdf_document_uploader.rb +11 -0
- data/app/views/decidim/admin/exports/_dropdown.html.erb +16 -0
- data/app/views/decidim/participatory_documents/admin/documents/_editor_modal.html.erb +3 -0
- data/app/views/decidim/participatory_documents/admin/documents/_form.html.erb +39 -0
- data/app/views/decidim/participatory_documents/admin/documents/_title.html.erb +7 -0
- data/app/views/decidim/participatory_documents/admin/documents/edit.html.erb +18 -0
- data/app/views/decidim/participatory_documents/admin/documents/edit_pdf.html.erb +15 -0
- data/app/views/decidim/participatory_documents/admin/documents/index.html.erb +11 -0
- data/app/views/decidim/participatory_documents/admin/documents/new.html.erb +17 -0
- data/app/views/decidim/participatory_documents/admin/documents/pdf_viewer.html.erb +105 -0
- data/app/views/decidim/participatory_documents/admin/sections/_form.html.erb +24 -0
- data/app/views/decidim/participatory_documents/admin/suggestion_notes/_editing_suggestion_note.html.erb +18 -0
- data/app/views/decidim/participatory_documents/admin/suggestion_notes/_form.html.erb +8 -0
- data/app/views/decidim/participatory_documents/admin/suggestion_notes/_suggestion_notes.html.erb +46 -0
- data/app/views/decidim/participatory_documents/admin/suggestions/_add_valuators.html.erb +17 -0
- data/app/views/decidim/participatory_documents/admin/suggestions/_bulk-actions.html.erb +7 -0
- data/app/views/decidim/participatory_documents/admin/suggestions/_form.html.erb +30 -0
- data/app/views/decidim/participatory_documents/admin/suggestions/_js-callout.html.erb +6 -0
- data/app/views/decidim/participatory_documents/admin/suggestions/_suggestion.html.erb +33 -0
- data/app/views/decidim/participatory_documents/admin/suggestions/_valuators.html.erb +43 -0
- data/app/views/decidim/participatory_documents/admin/suggestions/bulk_actions/_assign_to_valuator.html.erb +15 -0
- data/app/views/decidim/participatory_documents/admin/suggestions/bulk_actions/_dropdown.html.erb +36 -0
- data/app/views/decidim/participatory_documents/admin/suggestions/bulk_actions/_publish_answers.html.erb +14 -0
- data/app/views/decidim/participatory_documents/admin/suggestions/bulk_actions/_unassign_from_valuator.html.erb +15 -0
- data/app/views/decidim/participatory_documents/admin/suggestions/index.html.erb +45 -0
- data/app/views/decidim/participatory_documents/admin/suggestions/publish_answers.js.erb +17 -0
- data/app/views/decidim/participatory_documents/admin/suggestions/show.html.erb +55 -0
- data/app/views/decidim/participatory_documents/document_suggestions/_form.html.erb +29 -0
- data/app/views/decidim/participatory_documents/document_suggestions/index.html.erb +14 -0
- data/app/views/decidim/participatory_documents/documents/_pdfjs_base.html.erb +428 -0
- data/app/views/decidim/participatory_documents/documents/index.html.erb +27 -0
- data/app/views/decidim/participatory_documents/documents/pdf_viewer.html.erb +63 -0
- data/app/views/decidim/participatory_documents/section_suggestions/_form.html.erb +8 -0
- data/app/views/decidim/participatory_documents/section_suggestions/index.html.erb +14 -0
- data/babel.config.json +25 -0
- data/bin/bundle +62 -0
- data/bin/rails +6 -0
- data/bin/webpack-dev-server +6 -0
- data/codecov.yml +11 -0
- data/config/assets.rb +11 -0
- data/config/i18n-tasks.yml +12 -0
- data/config/locales/en.yml +266 -0
- data/crowdin.yml +45 -0
- data/db/migrate/20221018112720_create_decidim_participatory_documents_document.rb +17 -0
- data/db/migrate/20221115233021_create_decidim_participatory_documents_participation_sections.rb +12 -0
- data/db/migrate/20221115233022_create_decidim_participatory_documents_annotations.rb +13 -0
- data/db/migrate/20221115233023_create_decidim_participatory_documents_suggestions.rb +17 -0
- data/db/migrate/20221115233024_create_decidim_participatory_documents_suggestion_notes.rb +15 -0
- data/db/migrate/20221115233024_create_decidim_participatory_documents_valuation_assignments.rb +12 -0
- data/db/migrate/20230616100340_add_published_at_to_decidim_participatory_documents_documents.rb +8 -0
- data/db/migrate/20230622081831_add_decidim_participatory_documents_box_positions.rb +37 -0
- data/decidim-participatory_documents.gemspec +30 -0
- data/lib/decidim/participatory_documents/admin.rb +8 -0
- data/lib/decidim/participatory_documents/admin_engine.rb +45 -0
- data/lib/decidim/participatory_documents/component.rb +202 -0
- data/lib/decidim/participatory_documents/engine.rb +46 -0
- data/lib/decidim/participatory_documents/seeds/Exampledocument.pdf +0 -0
- data/lib/decidim/participatory_documents/test/factories.rb +144 -0
- data/lib/decidim/participatory_documents/version.rb +9 -0
- data/lib/decidim/participatory_documents.rb +29 -0
- data/lib/tasks/decidim_participatory_documents.rake +27 -0
- data/package-lock.json +12687 -0
- data/package.json +52 -0
- data/pdfjs/LICENSE +177 -0
- data/pdfjs/README.md +12 -0
- data/pdfjs/build/pdf.js +15629 -0
- data/pdfjs/build/pdf.js.map +1 -0
- data/pdfjs/build/pdf.sandbox.js +280 -0
- data/pdfjs/build/pdf.sandbox.js.map +1 -0
- data/pdfjs/build/pdf.worker.js +64496 -0
- data/pdfjs/build/pdf.worker.js.map +1 -0
- data/pdfjs/web/cmaps/78-EUC-H.bcmap +0 -0
- data/pdfjs/web/cmaps/78-EUC-V.bcmap +0 -0
- data/pdfjs/web/cmaps/78-H.bcmap +0 -0
- data/pdfjs/web/cmaps/78-RKSJ-H.bcmap +0 -0
- data/pdfjs/web/cmaps/78-RKSJ-V.bcmap +0 -0
- data/pdfjs/web/cmaps/78-V.bcmap +0 -0
- data/pdfjs/web/cmaps/78ms-RKSJ-H.bcmap +0 -0
- data/pdfjs/web/cmaps/78ms-RKSJ-V.bcmap +0 -0
- data/pdfjs/web/cmaps/83pv-RKSJ-H.bcmap +0 -0
- data/pdfjs/web/cmaps/90ms-RKSJ-H.bcmap +0 -0
- data/pdfjs/web/cmaps/90ms-RKSJ-V.bcmap +0 -0
- data/pdfjs/web/cmaps/90msp-RKSJ-H.bcmap +0 -0
- data/pdfjs/web/cmaps/90msp-RKSJ-V.bcmap +0 -0
- data/pdfjs/web/cmaps/90pv-RKSJ-H.bcmap +0 -0
- data/pdfjs/web/cmaps/90pv-RKSJ-V.bcmap +0 -0
- data/pdfjs/web/cmaps/Add-H.bcmap +0 -0
- data/pdfjs/web/cmaps/Add-RKSJ-H.bcmap +0 -0
- data/pdfjs/web/cmaps/Add-RKSJ-V.bcmap +0 -0
- data/pdfjs/web/cmaps/Add-V.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-CNS1-0.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-CNS1-1.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-CNS1-2.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-CNS1-3.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-CNS1-4.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-CNS1-5.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-CNS1-6.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-GB1-0.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-GB1-1.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-GB1-2.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-GB1-3.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-GB1-4.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-GB1-5.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-Japan1-0.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-Japan1-1.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-Japan1-2.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-Japan1-3.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-Japan1-4.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-Japan1-5.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-Japan1-6.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-Korea1-0.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-Korea1-1.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-Korea1-2.bcmap +0 -0
- data/pdfjs/web/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
- data/pdfjs/web/cmaps/B5-H.bcmap +0 -0
- data/pdfjs/web/cmaps/B5-V.bcmap +0 -0
- data/pdfjs/web/cmaps/B5pc-H.bcmap +0 -0
- data/pdfjs/web/cmaps/B5pc-V.bcmap +0 -0
- data/pdfjs/web/cmaps/CNS-EUC-H.bcmap +0 -0
- data/pdfjs/web/cmaps/CNS-EUC-V.bcmap +0 -0
- data/pdfjs/web/cmaps/CNS1-H.bcmap +0 -0
- data/pdfjs/web/cmaps/CNS1-V.bcmap +0 -0
- data/pdfjs/web/cmaps/CNS2-H.bcmap +0 -0
- data/pdfjs/web/cmaps/CNS2-V.bcmap +3 -0
- data/pdfjs/web/cmaps/ETHK-B5-H.bcmap +0 -0
- data/pdfjs/web/cmaps/ETHK-B5-V.bcmap +0 -0
- data/pdfjs/web/cmaps/ETen-B5-H.bcmap +0 -0
- data/pdfjs/web/cmaps/ETen-B5-V.bcmap +0 -0
- data/pdfjs/web/cmaps/ETenms-B5-H.bcmap +3 -0
- data/pdfjs/web/cmaps/ETenms-B5-V.bcmap +0 -0
- data/pdfjs/web/cmaps/EUC-H.bcmap +0 -0
- data/pdfjs/web/cmaps/EUC-V.bcmap +0 -0
- data/pdfjs/web/cmaps/Ext-H.bcmap +0 -0
- data/pdfjs/web/cmaps/Ext-RKSJ-H.bcmap +0 -0
- data/pdfjs/web/cmaps/Ext-RKSJ-V.bcmap +0 -0
- data/pdfjs/web/cmaps/Ext-V.bcmap +0 -0
- data/pdfjs/web/cmaps/GB-EUC-H.bcmap +0 -0
- data/pdfjs/web/cmaps/GB-EUC-V.bcmap +0 -0
- data/pdfjs/web/cmaps/GB-H.bcmap +4 -0
- data/pdfjs/web/cmaps/GB-V.bcmap +0 -0
- data/pdfjs/web/cmaps/GBK-EUC-H.bcmap +0 -0
- data/pdfjs/web/cmaps/GBK-EUC-V.bcmap +0 -0
- data/pdfjs/web/cmaps/GBK2K-H.bcmap +0 -0
- data/pdfjs/web/cmaps/GBK2K-V.bcmap +0 -0
- data/pdfjs/web/cmaps/GBKp-EUC-H.bcmap +0 -0
- data/pdfjs/web/cmaps/GBKp-EUC-V.bcmap +0 -0
- data/pdfjs/web/cmaps/GBT-EUC-H.bcmap +0 -0
- data/pdfjs/web/cmaps/GBT-EUC-V.bcmap +0 -0
- data/pdfjs/web/cmaps/GBT-H.bcmap +0 -0
- data/pdfjs/web/cmaps/GBT-V.bcmap +0 -0
- data/pdfjs/web/cmaps/GBTpc-EUC-H.bcmap +0 -0
- data/pdfjs/web/cmaps/GBTpc-EUC-V.bcmap +0 -0
- data/pdfjs/web/cmaps/GBpc-EUC-H.bcmap +0 -0
- data/pdfjs/web/cmaps/GBpc-EUC-V.bcmap +0 -0
- data/pdfjs/web/cmaps/H.bcmap +0 -0
- data/pdfjs/web/cmaps/HKdla-B5-H.bcmap +0 -0
- data/pdfjs/web/cmaps/HKdla-B5-V.bcmap +0 -0
- data/pdfjs/web/cmaps/HKdlb-B5-H.bcmap +0 -0
- data/pdfjs/web/cmaps/HKdlb-B5-V.bcmap +0 -0
- data/pdfjs/web/cmaps/HKgccs-B5-H.bcmap +0 -0
- data/pdfjs/web/cmaps/HKgccs-B5-V.bcmap +0 -0
- data/pdfjs/web/cmaps/HKm314-B5-H.bcmap +0 -0
- data/pdfjs/web/cmaps/HKm314-B5-V.bcmap +0 -0
- data/pdfjs/web/cmaps/HKm471-B5-H.bcmap +0 -0
- data/pdfjs/web/cmaps/HKm471-B5-V.bcmap +0 -0
- data/pdfjs/web/cmaps/HKscs-B5-H.bcmap +0 -0
- data/pdfjs/web/cmaps/HKscs-B5-V.bcmap +0 -0
- data/pdfjs/web/cmaps/Hankaku.bcmap +0 -0
- data/pdfjs/web/cmaps/Hiragana.bcmap +0 -0
- data/pdfjs/web/cmaps/KSC-EUC-H.bcmap +0 -0
- data/pdfjs/web/cmaps/KSC-EUC-V.bcmap +0 -0
- data/pdfjs/web/cmaps/KSC-H.bcmap +0 -0
- data/pdfjs/web/cmaps/KSC-Johab-H.bcmap +0 -0
- data/pdfjs/web/cmaps/KSC-Johab-V.bcmap +0 -0
- data/pdfjs/web/cmaps/KSC-V.bcmap +0 -0
- data/pdfjs/web/cmaps/KSCms-UHC-H.bcmap +0 -0
- data/pdfjs/web/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
- data/pdfjs/web/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
- data/pdfjs/web/cmaps/KSCms-UHC-V.bcmap +0 -0
- data/pdfjs/web/cmaps/KSCpc-EUC-H.bcmap +0 -0
- data/pdfjs/web/cmaps/KSCpc-EUC-V.bcmap +0 -0
- data/pdfjs/web/cmaps/Katakana.bcmap +0 -0
- data/pdfjs/web/cmaps/LICENSE +36 -0
- data/pdfjs/web/cmaps/NWP-H.bcmap +0 -0
- data/pdfjs/web/cmaps/NWP-V.bcmap +0 -0
- data/pdfjs/web/cmaps/RKSJ-H.bcmap +0 -0
- data/pdfjs/web/cmaps/RKSJ-V.bcmap +0 -0
- data/pdfjs/web/cmaps/Roman.bcmap +0 -0
- data/pdfjs/web/cmaps/UniCNS-UCS2-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniCNS-UCS2-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniCNS-UTF16-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniCNS-UTF16-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniCNS-UTF32-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniCNS-UTF32-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniCNS-UTF8-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniCNS-UTF8-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniGB-UCS2-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniGB-UCS2-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniGB-UTF16-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniGB-UTF16-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniGB-UTF32-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniGB-UTF32-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniGB-UTF8-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniGB-UTF8-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJIS-UCS2-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJIS-UCS2-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJIS-UTF16-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJIS-UTF16-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJIS-UTF32-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJIS-UTF32-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJIS-UTF8-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJIS-UTF8-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniKS-UCS2-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniKS-UCS2-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniKS-UTF16-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniKS-UTF16-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniKS-UTF32-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniKS-UTF32-V.bcmap +0 -0
- data/pdfjs/web/cmaps/UniKS-UTF8-H.bcmap +0 -0
- data/pdfjs/web/cmaps/UniKS-UTF8-V.bcmap +0 -0
- data/pdfjs/web/cmaps/V.bcmap +0 -0
- data/pdfjs/web/cmaps/WP-Symbol.bcmap +0 -0
- data/pdfjs/web/compressed.tracemonkey-pldi-09.pdf +0 -0
- data/pdfjs/web/debugger.css +113 -0
- data/pdfjs/web/debugger.js +612 -0
- data/pdfjs/web/images/annotation-check.svg +11 -0
- data/pdfjs/web/images/annotation-comment.svg +16 -0
- data/pdfjs/web/images/annotation-help.svg +26 -0
- data/pdfjs/web/images/annotation-insert.svg +10 -0
- data/pdfjs/web/images/annotation-key.svg +11 -0
- data/pdfjs/web/images/annotation-newparagraph.svg +11 -0
- data/pdfjs/web/images/annotation-noicon.svg +7 -0
- data/pdfjs/web/images/annotation-note.svg +42 -0
- data/pdfjs/web/images/annotation-paperclip.svg +6 -0
- data/pdfjs/web/images/annotation-paragraph.svg +16 -0
- data/pdfjs/web/images/annotation-pushpin.svg +7 -0
- data/pdfjs/web/images/cursor-editorFreeText.svg +3 -0
- data/pdfjs/web/images/cursor-editorInk.svg +4 -0
- data/pdfjs/web/images/findbarButton-next.svg +3 -0
- data/pdfjs/web/images/findbarButton-previous.svg +3 -0
- data/pdfjs/web/images/loading-dark.svg +24 -0
- data/pdfjs/web/images/loading-icon.gif +0 -0
- data/pdfjs/web/images/loading.svg +1 -0
- data/pdfjs/web/images/secondaryToolbarButton-documentProperties.svg +3 -0
- data/pdfjs/web/images/secondaryToolbarButton-firstPage.svg +3 -0
- data/pdfjs/web/images/secondaryToolbarButton-handTool.svg +3 -0
- data/pdfjs/web/images/secondaryToolbarButton-lastPage.svg +3 -0
- data/pdfjs/web/images/secondaryToolbarButton-rotateCcw.svg +3 -0
- data/pdfjs/web/images/secondaryToolbarButton-rotateCw.svg +3 -0
- data/pdfjs/web/images/secondaryToolbarButton-scrollHorizontal.svg +3 -0
- data/pdfjs/web/images/secondaryToolbarButton-scrollPage.svg +3 -0
- data/pdfjs/web/images/secondaryToolbarButton-scrollVertical.svg +3 -0
- data/pdfjs/web/images/secondaryToolbarButton-scrollWrapped.svg +3 -0
- data/pdfjs/web/images/secondaryToolbarButton-selectTool.svg +3 -0
- data/pdfjs/web/images/secondaryToolbarButton-spreadEven.svg +3 -0
- data/pdfjs/web/images/secondaryToolbarButton-spreadNone.svg +3 -0
- data/pdfjs/web/images/secondaryToolbarButton-spreadOdd.svg +3 -0
- data/pdfjs/web/images/shadow.png +0 -0
- data/pdfjs/web/images/toolbarButton-bookmark.svg +3 -0
- data/pdfjs/web/images/toolbarButton-currentOutlineItem.svg +3 -0
- data/pdfjs/web/images/toolbarButton-download.svg +4 -0
- data/pdfjs/web/images/toolbarButton-editorFreeText.svg +3 -0
- data/pdfjs/web/images/toolbarButton-editorInk.svg +4 -0
- data/pdfjs/web/images/toolbarButton-menuArrow.svg +3 -0
- data/pdfjs/web/images/toolbarButton-openFile.svg +3 -0
- data/pdfjs/web/images/toolbarButton-pageDown.svg +3 -0
- data/pdfjs/web/images/toolbarButton-pageUp.svg +3 -0
- data/pdfjs/web/images/toolbarButton-presentationMode.svg +3 -0
- data/pdfjs/web/images/toolbarButton-print.svg +3 -0
- data/pdfjs/web/images/toolbarButton-search.svg +3 -0
- data/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.svg +3 -0
- data/pdfjs/web/images/toolbarButton-sidebarToggle.svg +3 -0
- data/pdfjs/web/images/toolbarButton-viewAttachments.svg +3 -0
- data/pdfjs/web/images/toolbarButton-viewLayers.svg +3 -0
- data/pdfjs/web/images/toolbarButton-viewOutline.svg +3 -0
- data/pdfjs/web/images/toolbarButton-viewThumbnail.svg +3 -0
- data/pdfjs/web/images/toolbarButton-zoomIn.svg +3 -0
- data/pdfjs/web/images/toolbarButton-zoomOut.svg +3 -0
- data/pdfjs/web/images/treeitem-collapsed.svg +1 -0
- data/pdfjs/web/images/treeitem-expanded.svg +1 -0
- data/pdfjs/web/locale/ach/viewer.properties +200 -0
- data/pdfjs/web/locale/af/viewer.properties +177 -0
- data/pdfjs/web/locale/an/viewer.properties +243 -0
- data/pdfjs/web/locale/ar/viewer.properties +247 -0
- data/pdfjs/web/locale/ast/viewer.properties +207 -0
- data/pdfjs/web/locale/az/viewer.properties +243 -0
- data/pdfjs/web/locale/be/viewer.properties +274 -0
- data/pdfjs/web/locale/bg/viewer.properties +235 -0
- data/pdfjs/web/locale/bn/viewer.properties +239 -0
- data/pdfjs/web/locale/bo/viewer.properties +238 -0
- data/pdfjs/web/locale/br/viewer.properties +247 -0
- data/pdfjs/web/locale/brx/viewer.properties +205 -0
- data/pdfjs/web/locale/bs/viewer.properties +194 -0
- data/pdfjs/web/locale/ca/viewer.properties +251 -0
- data/pdfjs/web/locale/cak/viewer.properties +249 -0
- data/pdfjs/web/locale/ckb/viewer.properties +234 -0
- data/pdfjs/web/locale/cs/viewer.properties +274 -0
- data/pdfjs/web/locale/cy/viewer.properties +274 -0
- data/pdfjs/web/locale/da/viewer.properties +274 -0
- data/pdfjs/web/locale/de/viewer.properties +274 -0
- data/pdfjs/web/locale/dsb/viewer.properties +274 -0
- data/pdfjs/web/locale/el/viewer.properties +274 -0
- data/pdfjs/web/locale/en-CA/viewer.properties +274 -0
- data/pdfjs/web/locale/en-GB/viewer.properties +274 -0
- data/pdfjs/web/locale/en-US/viewer.properties +253 -0
- data/pdfjs/web/locale/eo/viewer.properties +274 -0
- data/pdfjs/web/locale/es-AR/viewer.properties +274 -0
- data/pdfjs/web/locale/es-CL/viewer.properties +274 -0
- data/pdfjs/web/locale/es-ES/viewer.properties +274 -0
- data/pdfjs/web/locale/es-MX/viewer.properties +274 -0
- data/pdfjs/web/locale/et/viewer.properties +262 -0
- data/pdfjs/web/locale/eu/viewer.properties +272 -0
- data/pdfjs/web/locale/fa/viewer.properties +216 -0
- data/pdfjs/web/locale/ff/viewer.properties +235 -0
- data/pdfjs/web/locale/fi/viewer.properties +274 -0
- data/pdfjs/web/locale/fr/viewer.properties +274 -0
- data/pdfjs/web/locale/fy-NL/viewer.properties +274 -0
- data/pdfjs/web/locale/ga-IE/viewer.properties +202 -0
- data/pdfjs/web/locale/gd/viewer.properties +249 -0
- data/pdfjs/web/locale/gl/viewer.properties +249 -0
- data/pdfjs/web/locale/gn/viewer.properties +274 -0
- data/pdfjs/web/locale/gu-IN/viewer.properties +235 -0
- data/pdfjs/web/locale/he/viewer.properties +274 -0
- data/pdfjs/web/locale/hi-IN/viewer.properties +235 -0
- data/pdfjs/web/locale/hr/viewer.properties +249 -0
- data/pdfjs/web/locale/hsb/viewer.properties +274 -0
- data/pdfjs/web/locale/hu/viewer.properties +274 -0
- data/pdfjs/web/locale/hy-AM/viewer.properties +239 -0
- data/pdfjs/web/locale/hye/viewer.properties +252 -0
- data/pdfjs/web/locale/ia/viewer.properties +274 -0
- data/pdfjs/web/locale/id/viewer.properties +274 -0
- data/pdfjs/web/locale/is/viewer.properties +274 -0
- data/pdfjs/web/locale/it/viewer.properties +215 -0
- data/pdfjs/web/locale/ja/viewer.properties +274 -0
- data/pdfjs/web/locale/ka/viewer.properties +274 -0
- data/pdfjs/web/locale/kab/viewer.properties +274 -0
- data/pdfjs/web/locale/kk/viewer.properties +274 -0
- data/pdfjs/web/locale/km/viewer.properties +210 -0
- data/pdfjs/web/locale/kn/viewer.properties +187 -0
- data/pdfjs/web/locale/ko/viewer.properties +274 -0
- data/pdfjs/web/locale/lij/viewer.properties +235 -0
- data/pdfjs/web/locale/lo/viewer.properties +145 -0
- data/pdfjs/web/locale/locale.properties +327 -0
- data/pdfjs/web/locale/lt/viewer.properties +260 -0
- data/pdfjs/web/locale/ltg/viewer.properties +213 -0
- data/pdfjs/web/locale/lv/viewer.properties +235 -0
- data/pdfjs/web/locale/meh/viewer.properties +111 -0
- data/pdfjs/web/locale/mk/viewer.properties +139 -0
- data/pdfjs/web/locale/mr/viewer.properties +231 -0
- data/pdfjs/web/locale/ms/viewer.properties +235 -0
- data/pdfjs/web/locale/my/viewer.properties +191 -0
- data/pdfjs/web/locale/nb-NO/viewer.properties +274 -0
- data/pdfjs/web/locale/ne-NP/viewer.properties +218 -0
- data/pdfjs/web/locale/nl/viewer.properties +274 -0
- data/pdfjs/web/locale/nn-NO/viewer.properties +274 -0
- data/pdfjs/web/locale/oc/viewer.properties +274 -0
- data/pdfjs/web/locale/pa-IN/viewer.properties +285 -0
- data/pdfjs/web/locale/pl/viewer.properties +274 -0
- data/pdfjs/web/locale/pt-BR/viewer.properties +274 -0
- data/pdfjs/web/locale/pt-PT/viewer.properties +274 -0
- data/pdfjs/web/locale/rm/viewer.properties +274 -0
- data/pdfjs/web/locale/ro/viewer.properties +241 -0
- data/pdfjs/web/locale/ru/viewer.properties +274 -0
- data/pdfjs/web/locale/sat/viewer.properties +198 -0
- data/pdfjs/web/locale/sc/viewer.properties +240 -0
- data/pdfjs/web/locale/scn/viewer.properties +101 -0
- data/pdfjs/web/locale/sco/viewer.properties +249 -0
- data/pdfjs/web/locale/si/viewer.properties +237 -0
- data/pdfjs/web/locale/sk/viewer.properties +274 -0
- data/pdfjs/web/locale/sl/viewer.properties +274 -0
- data/pdfjs/web/locale/son/viewer.properties +173 -0
- data/pdfjs/web/locale/sq/viewer.properties +267 -0
- data/pdfjs/web/locale/sr/viewer.properties +253 -0
- data/pdfjs/web/locale/sv-SE/viewer.properties +274 -0
- data/pdfjs/web/locale/szl/viewer.properties +245 -0
- data/pdfjs/web/locale/ta/viewer.properties +194 -0
- data/pdfjs/web/locale/te/viewer.properties +237 -0
- data/pdfjs/web/locale/tg/viewer.properties +274 -0
- data/pdfjs/web/locale/th/viewer.properties +274 -0
- data/pdfjs/web/locale/tl/viewer.properties +243 -0
- data/pdfjs/web/locale/tr/viewer.properties +274 -0
- data/pdfjs/web/locale/trs/viewer.properties +206 -0
- data/pdfjs/web/locale/uk/viewer.properties +274 -0
- data/pdfjs/web/locale/ur/viewer.properties +239 -0
- data/pdfjs/web/locale/uz/viewer.properties +163 -0
- data/pdfjs/web/locale/vi/viewer.properties +274 -0
- data/pdfjs/web/locale/wo/viewer.properties +123 -0
- data/pdfjs/web/locale/xh/viewer.properties +177 -0
- data/pdfjs/web/locale/zh-CN/viewer.properties +274 -0
- data/pdfjs/web/locale/zh-TW/viewer.properties +274 -0
- data/pdfjs/web/standard_fonts/FoxitDingbats.pfb +0 -0
- data/pdfjs/web/standard_fonts/FoxitFixed.pfb +0 -0
- data/pdfjs/web/standard_fonts/FoxitFixedBold.pfb +0 -0
- data/pdfjs/web/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
- data/pdfjs/web/standard_fonts/FoxitFixedItalic.pfb +0 -0
- data/pdfjs/web/standard_fonts/FoxitSans.pfb +0 -0
- data/pdfjs/web/standard_fonts/FoxitSansBold.pfb +0 -0
- data/pdfjs/web/standard_fonts/FoxitSansBoldItalic.pfb +0 -0
- data/pdfjs/web/standard_fonts/FoxitSansItalic.pfb +0 -0
- data/pdfjs/web/standard_fonts/FoxitSerif.pfb +0 -0
- data/pdfjs/web/standard_fonts/FoxitSerifBold.pfb +0 -0
- data/pdfjs/web/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
- data/pdfjs/web/standard_fonts/FoxitSerifItalic.pfb +0 -0
- data/pdfjs/web/standard_fonts/FoxitSymbol.pfb +0 -0
- data/pdfjs/web/standard_fonts/LICENSE_FOXIT +27 -0
- data/pdfjs/web/standard_fonts/LICENSE_LIBERATION +102 -0
- data/pdfjs/web/standard_fonts/LiberationSans-Bold.ttf +0 -0
- data/pdfjs/web/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
- data/pdfjs/web/standard_fonts/LiberationSans-Italic.ttf +0 -0
- data/pdfjs/web/standard_fonts/LiberationSans-Regular.ttf +0 -0
- data/pdfjs/web/viewer.css +3029 -0
- data/pdfjs/web/viewer.html +433 -0
- data/pdfjs/web/viewer.js +13566 -0
- data/pdfjs/web/viewer.js.map +1 -0
- metadata +643 -0
@@ -0,0 +1,234 @@
|
|
1
|
+
import BoxControls from "./box_controls";
|
2
|
+
|
3
|
+
export default class Box {
|
4
|
+
constructor(layer, json) {
|
5
|
+
this.layer = layer;
|
6
|
+
this.json = json || { rect: {} };
|
7
|
+
this.id = this.json.id || -Object.keys(layer.boxes).length;
|
8
|
+
this.section = this.json.section || 0;
|
9
|
+
this.sectionNumber = this.json.section_number || 0;
|
10
|
+
this.createBox(this.id, this.json.position, this.json.rect);
|
11
|
+
this.setInfo();
|
12
|
+
this._bindEvents();
|
13
|
+
// console.log("box constructor", this);
|
14
|
+
// events
|
15
|
+
this.onClick = () => {};
|
16
|
+
this.onBlur = () => {};
|
17
|
+
this.onEnter = () => {};
|
18
|
+
this.onLeave = () => {};
|
19
|
+
this.onDestroy = () => {};
|
20
|
+
this.onChange = () => {};
|
21
|
+
}
|
22
|
+
|
23
|
+
// Creates a box using percentanges, with and height are optional
|
24
|
+
createBox(id, position, {left, top, width, height}) {
|
25
|
+
this.div = document.createElement("div");
|
26
|
+
this.div.draggable = false;
|
27
|
+
this.div.id = `box-${id || Date.now()}`;
|
28
|
+
this.div.dataset.position = position || this._getNextPosition();
|
29
|
+
this.setSection(this.section, this.sectionNumber);
|
30
|
+
this.div.classList.add("box");
|
31
|
+
this.div.style.left = `${this._sanitizePercent(left)}%`;
|
32
|
+
this.div.style.top = `${this._sanitizePercent(top)}%`;
|
33
|
+
// if width is not defined will use 15%
|
34
|
+
this.div.style.width = `${this._sanitizePercent(width, 0, 100 - parseFloat(left)) || 15}%`;
|
35
|
+
this.div.style.height = `${this._sanitizePercent(height, 0, 100 - parseFloat(top)) || 15}%`;
|
36
|
+
// as the parent layer might have pointerEvents disabled we make sure in the box are enabled
|
37
|
+
this.div.style.pointerEvents = "auto";
|
38
|
+
|
39
|
+
// add the number of the box in the middle
|
40
|
+
let span = document.createElement("span");
|
41
|
+
span.innerHTML = this.div.dataset.position;
|
42
|
+
this.div.appendChild(span)
|
43
|
+
this.layer.div.appendChild(this.div);
|
44
|
+
}
|
45
|
+
|
46
|
+
setSection(section, sectionNumber) {
|
47
|
+
if (section) {
|
48
|
+
this.div.dataset.sectionNumber = sectionNumber || this._getNextSectionNumber();
|
49
|
+
this.div.dataset.section = section;
|
50
|
+
} else {
|
51
|
+
// ensure a new section will be created in the next save
|
52
|
+
this.div.dataset.sectionNumber = this.sectionNumber || this._getNextSectionNumber();
|
53
|
+
this.div.dataset.section = this.section;
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
createControls() {
|
58
|
+
this.controls = new BoxControls(this);
|
59
|
+
this.resize = new ResizeObserver(this._resize.bind(this));
|
60
|
+
this.resize.observe(this.div);
|
61
|
+
}
|
62
|
+
|
63
|
+
getRect() {
|
64
|
+
return {
|
65
|
+
left: parseFloat(this.div.style.left) || 0,
|
66
|
+
top: parseFloat(this.div.style.top) || 0,
|
67
|
+
width: this._ensureCssPercent(this.div.style.width, this.div.ClientWidth),
|
68
|
+
height: this._ensureCssPercent(this.div.style.height, this.div.ClientHeight)
|
69
|
+
}
|
70
|
+
}
|
71
|
+
|
72
|
+
getInfo() {
|
73
|
+
return {
|
74
|
+
id: this.id,
|
75
|
+
// Section in the dataset can be manipulated by the group editor
|
76
|
+
// this.section is always the original
|
77
|
+
section: this.div.dataset.section,
|
78
|
+
rect: this.getRect()
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
setInfo(data) {
|
83
|
+
if (data) {
|
84
|
+
if (data.id) {
|
85
|
+
this.layer.removeBox(this)
|
86
|
+
this.id = data.id;
|
87
|
+
this.layer.addBox(this)
|
88
|
+
}
|
89
|
+
this.section = data.section || this.section;
|
90
|
+
this.div.dataset.section = this.section;
|
91
|
+
}
|
92
|
+
if (this.isPersisted()) {
|
93
|
+
this.div.classList.add("persisted");
|
94
|
+
}
|
95
|
+
this.previousInfo = this.getInfo();
|
96
|
+
}
|
97
|
+
|
98
|
+
isPersisted() {
|
99
|
+
return this.id && this.id > 0;
|
100
|
+
}
|
101
|
+
|
102
|
+
isMoving() {
|
103
|
+
return this.div.classList.contains("moving");
|
104
|
+
}
|
105
|
+
|
106
|
+
isGrouping() {
|
107
|
+
return document.querySelectorAll(".polygon-ready .box.grouping").length;
|
108
|
+
}
|
109
|
+
|
110
|
+
isResizing() {
|
111
|
+
return this.div.classList.contains("resizing");
|
112
|
+
}
|
113
|
+
|
114
|
+
_getNextPosition() {
|
115
|
+
return document.querySelectorAll(".polygon-ready .box").length + 1;
|
116
|
+
}
|
117
|
+
|
118
|
+
_getNextSectionNumber() {
|
119
|
+
let positions = new Set();
|
120
|
+
document.querySelectorAll(".polygon-ready .box").forEach((div) => positions.add(div.dataset.sectionNumber));
|
121
|
+
return positions.size + 1;
|
122
|
+
}
|
123
|
+
|
124
|
+
_ensureCssPercent(num, max) {
|
125
|
+
if (num.indexOf("%") !== -1) {
|
126
|
+
return parseFloat(num);
|
127
|
+
}
|
128
|
+
return this._sanitizePercent(100 * parseFloat(num) / max);
|
129
|
+
|
130
|
+
}
|
131
|
+
|
132
|
+
_sanitizePercent(num, min = 0, max = 100) {
|
133
|
+
return Math.min(Math.max(parseFloat(num), min), max);
|
134
|
+
}
|
135
|
+
|
136
|
+
_bindEvents() {
|
137
|
+
this.div.addEventListener("mouseenter", this._mouseEnter.bind(this));
|
138
|
+
this.div.addEventListener("mouseleave", this._mouseLeave.bind(this));
|
139
|
+
this.div.addEventListener("mouseup", this._mouseUp.bind(this));
|
140
|
+
this.div.addEventListener("click", this._click.bind(this));
|
141
|
+
}
|
142
|
+
|
143
|
+
_click(evt) {
|
144
|
+
if (!this.layer.creating && !this.isMoving() && !this.isGrouping() && !this.isResizing()) {
|
145
|
+
// console.log("box click", evt, this);
|
146
|
+
evt.stopPropagation();
|
147
|
+
this.onClick(evt);
|
148
|
+
window.addEventListener("click", this._blur.bind(this), { once: true });
|
149
|
+
}
|
150
|
+
}
|
151
|
+
|
152
|
+
_blur(evt) {
|
153
|
+
if (!this.layer.creating) {
|
154
|
+
this.onBlur(evt);
|
155
|
+
}
|
156
|
+
}
|
157
|
+
|
158
|
+
_mouseEnter(evt) {
|
159
|
+
if (!this.layer.creating && !this.isGrouping()) {
|
160
|
+
this.blockSibilings();
|
161
|
+
this.div.classList.add("hover");
|
162
|
+
this.focusGroup();
|
163
|
+
this.onEnter(evt);
|
164
|
+
// console.log("box mousenter", evt, "widht/height", this.div.style.width, this.div.style.height);
|
165
|
+
}
|
166
|
+
}
|
167
|
+
|
168
|
+
_mouseLeave(evt) {
|
169
|
+
if (!this.layer.creating && !this.isGrouping()) {
|
170
|
+
this.div.classList.remove("hover", "resizing");
|
171
|
+
this.blurGroup()
|
172
|
+
this.unBlockSibilings();
|
173
|
+
this.onLeave(evt);
|
174
|
+
// console.log("box mouseleave", evt);
|
175
|
+
}
|
176
|
+
}
|
177
|
+
|
178
|
+
_mouseUp() {
|
179
|
+
if (!this.layer.creating) {
|
180
|
+
console.log("mouseup", this.hasChanged())
|
181
|
+
// delay changing resizing status to avoid triggering the click event in the box
|
182
|
+
setTimeout(() => this.div.classList.remove("resizing"), 100);
|
183
|
+
if (this.hasChanged()) {
|
184
|
+
this.setInfo();
|
185
|
+
this.onChange();
|
186
|
+
}
|
187
|
+
}
|
188
|
+
}
|
189
|
+
|
190
|
+
_resize(entries) {
|
191
|
+
if (!this.layer.creating && this.div.classList.contains("hover")) {
|
192
|
+
this.div.classList.add("resizing")
|
193
|
+
let width = `${100 * entries[0].contentRect.width / this.layer.div.clientWidth}%`;
|
194
|
+
let height = `${100 * entries[0].contentRect.height / this.layer.div.clientHeight}%`;
|
195
|
+
// console.log("box resize", entries, this.div.style.width, this.div.style.height, "calculated", width, height);
|
196
|
+
this.div.style.width = width;
|
197
|
+
this.div.style.height = height;
|
198
|
+
}
|
199
|
+
}
|
200
|
+
|
201
|
+
|
202
|
+
hasChanged() {
|
203
|
+
return JSON.stringify(this.getInfo()) !== JSON.stringify(this.previousInfo);
|
204
|
+
}
|
205
|
+
|
206
|
+
// Not using getNodes because groups can span across layers
|
207
|
+
focusGroup() {
|
208
|
+
document.querySelectorAll(".polygon-ready .box").forEach((div) => div.dataset.sectionNumber === this.div.dataset.sectionNumber && div.classList.add("focus"));
|
209
|
+
}
|
210
|
+
|
211
|
+
blurGroup() {
|
212
|
+
document.querySelectorAll(".polygon-ready .box").forEach((div) => div.classList.remove("focus"));
|
213
|
+
}
|
214
|
+
|
215
|
+
blockSibilings() {
|
216
|
+
document.querySelectorAll(".polygon-ready").forEach((layer) => {
|
217
|
+
layer.classList.add("blocked");
|
218
|
+
layer.querySelectorAll(".box").forEach((div) => div.id !== this.div.id && div.classList.add("blocked"));
|
219
|
+
});
|
220
|
+
}
|
221
|
+
|
222
|
+
unBlockSibilings() {
|
223
|
+
document.querySelectorAll(".polygon-ready").forEach((layer) => {
|
224
|
+
layer.classList.remove("blocked");
|
225
|
+
layer.querySelectorAll(".box").forEach((div) => div.classList.remove("blocked"));
|
226
|
+
});
|
227
|
+
}
|
228
|
+
|
229
|
+
destroy() {
|
230
|
+
this.div.remove();
|
231
|
+
this.resize.disconnect();
|
232
|
+
this.onDestroy();
|
233
|
+
}
|
234
|
+
}
|
@@ -0,0 +1,80 @@
|
|
1
|
+
export default class BoxControlGroup {
|
2
|
+
constructor(control) {
|
3
|
+
this.control = control;
|
4
|
+
this.box = control.box;
|
5
|
+
this.layer = control.box.layer;
|
6
|
+
this.div = document.createElement("div");
|
7
|
+
this.div.classList.add("control", "group");
|
8
|
+
this.div.title = this.layer.i18n.group;
|
9
|
+
this.control.div.appendChild(this.div);
|
10
|
+
this._bindEvents();
|
11
|
+
}
|
12
|
+
|
13
|
+
_bindEvents() {
|
14
|
+
this.div.addEventListener("click", this._startGrouping.bind(this));
|
15
|
+
this.groupBoxHandler = this._groupBox.bind(this);
|
16
|
+
this.box.div.addEventListener("click", this.groupBoxHandler);
|
17
|
+
}
|
18
|
+
|
19
|
+
_startGrouping(evt) {
|
20
|
+
evt.stopPropagation();
|
21
|
+
if (this.box.div.classList.contains("grouping")) {
|
22
|
+
this._stopGrouping(evt);
|
23
|
+
return;
|
24
|
+
}
|
25
|
+
this.box.div.classList.add("grouping");
|
26
|
+
document.querySelectorAll(".polygon-ready .box").forEach((div) => {
|
27
|
+
// just in case
|
28
|
+
if (div.id !== this.box.div.id) {
|
29
|
+
div.classList.remove("grouping", "mark-group", "focus");
|
30
|
+
}
|
31
|
+
if (div.dataset.sectionNumber === this.box.div.dataset.sectionNumber) {
|
32
|
+
div.classList.add("mark-group");
|
33
|
+
}
|
34
|
+
});
|
35
|
+
// Set all layers with the grouping property so we can join boxes in different layers
|
36
|
+
document.querySelectorAll(".polygon-ready").forEach((div) => {
|
37
|
+
div.classList.add("grouping");
|
38
|
+
div.dataset.groupBoxId = this.box.div.id;
|
39
|
+
div.dataset.groupBoxSection = this.box.div.dataset.section;
|
40
|
+
div.dataset.groupBoxNumber = this.box.div.dataset.sectionNumber;
|
41
|
+
});
|
42
|
+
window.addEventListener("click", this._stopGrouping.bind(this), { once: true });
|
43
|
+
window.addEventListener("keydown", (keyEvent) => {
|
44
|
+
if (keyEvent.key === "Escape" || keyEvent.keyCode === 27) {
|
45
|
+
this._stopGrouping(keyEvent);
|
46
|
+
}
|
47
|
+
}, { once: true });
|
48
|
+
console.log("start grouping", evt, this);
|
49
|
+
}
|
50
|
+
|
51
|
+
_stopGrouping(evt) {
|
52
|
+
evt.stopPropagation();
|
53
|
+
this.box.div.removeEventListener("click", this.groupBoxHandler);
|
54
|
+
document.querySelectorAll(".polygon-ready .box").forEach((div) => div.classList.remove("mark-group", "hover", "blocked", "grouping", "focus"));
|
55
|
+
document.querySelectorAll(".polygon-ready").forEach((div) => div.classList.remove("grouping"));
|
56
|
+
console.log("stop grouping", evt, this);
|
57
|
+
}
|
58
|
+
|
59
|
+
_groupBox(evt) {
|
60
|
+
console.log("group box", this)
|
61
|
+
evt.stopPropagation();
|
62
|
+
if (this.box.isGrouping() && this.layer.div.dataset.groupBoxId !== this.box.div.id) {
|
63
|
+
if (this.box.div.dataset.sectionNumber === this.layer.div.dataset.groupBoxNumber) {
|
64
|
+
this.box.div.classList.remove("mark-group");
|
65
|
+
if (this.box.sectionNumber === parseInt(this.layer.div.dataset.groupBoxNumber, 10)) {
|
66
|
+
console.log("reset to original", this.box)
|
67
|
+
// reset section to the original
|
68
|
+
this.box.setSection(-1);
|
69
|
+
} else {
|
70
|
+
this.box.setSection(this.box.section, this.box.sectionNumber);
|
71
|
+
}
|
72
|
+
} else {
|
73
|
+
this.box.div.classList.add("mark-group");
|
74
|
+
this.box.setSection(this.layer.div.dataset.groupBoxSection, this.layer.div.dataset.groupBoxNumber);
|
75
|
+
}
|
76
|
+
this.box.onChange();
|
77
|
+
// console.log("group this", this.layer.div.dataset.groupBoxId, this.box.div.id, evt, this.box.div.dataset.sectionNumber);
|
78
|
+
}
|
79
|
+
}
|
80
|
+
}
|
@@ -0,0 +1,55 @@
|
|
1
|
+
export default class BoxControlMove {
|
2
|
+
constructor(control) {
|
3
|
+
this.control = control;
|
4
|
+
this.box = control.box;
|
5
|
+
this.layer = control.box.layer;
|
6
|
+
this.left = 0;
|
7
|
+
this.top = 0;
|
8
|
+
this.div = document.createElement("div");
|
9
|
+
this.div.classList.add("control", "move");
|
10
|
+
this.div.title = this.layer.i18n.move;
|
11
|
+
this.control.div.appendChild(this.div);
|
12
|
+
this._bindEvents();
|
13
|
+
}
|
14
|
+
|
15
|
+
_bindEvents() {
|
16
|
+
this.div.addEventListener("mousedown", this._startMoving.bind(this));
|
17
|
+
}
|
18
|
+
|
19
|
+
_startMoving(evt) {
|
20
|
+
evt.stopPropagation();
|
21
|
+
this.box.div.classList.add("moving");
|
22
|
+
this.left = this.layer.div.getBoundingClientRect().x + evt.layerX;
|
23
|
+
// We need to substract the controls height because is aligned at the bottom
|
24
|
+
this.top = this.layer.div.getBoundingClientRect().y + this.box.div.clientHeight - this.div.clientHeight + evt.layerY;
|
25
|
+
// Binding mouseup and mousemove to the entire window so it works even if the mouse is outside the box
|
26
|
+
window.addEventListener("mouseup", this._stopMoving.bind(this), { once: true });
|
27
|
+
this.moveHandler = this._move.bind(this);
|
28
|
+
window.addEventListener("mousemove", this.moveHandler);
|
29
|
+
// console.log("start moving", evt, this.box.div.style.left, this.box.div.style.top, this);
|
30
|
+
}
|
31
|
+
|
32
|
+
_stopMoving(evt) {
|
33
|
+
evt.stopPropagation();
|
34
|
+
window.removeEventListener("mousemove", this.moveHandler);
|
35
|
+
// delay removing the moving class to avoid triggering the click event in the box
|
36
|
+
setTimeout(() => {
|
37
|
+
this.box.setInfo();
|
38
|
+
this.box.div.classList.remove("moving")
|
39
|
+
}, 100);
|
40
|
+
// console.log("stop moving", evt, this);
|
41
|
+
}
|
42
|
+
|
43
|
+
_move(evt) {
|
44
|
+
if (this.box.isMoving()) {
|
45
|
+
evt.stopPropagation();
|
46
|
+
let width = evt.clientX - this.left;
|
47
|
+
let height = evt.clientY - this.top;
|
48
|
+
let mousePercentLeft = (100 * width / this.layer.div.clientWidth)
|
49
|
+
let mousePercentTop = (100 * height / this.layer.div.clientHeight)
|
50
|
+
this.box.div.style.left = `${mousePercentLeft}%`;
|
51
|
+
this.box.div.style.top = `${mousePercentTop}%`;
|
52
|
+
// console.log("moving", evt, mousePercentLeft, mousePercentTop, this);
|
53
|
+
}
|
54
|
+
}
|
55
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import BoxControlMove from "./box_control_move";
|
2
|
+
import BoxControlGroup from "./box_control_group";
|
3
|
+
|
4
|
+
export default class BoxControls {
|
5
|
+
constructor(box) {
|
6
|
+
this.box = box;
|
7
|
+
this.createControls();
|
8
|
+
}
|
9
|
+
|
10
|
+
createControls() {
|
11
|
+
this.div = document.createElement("div");
|
12
|
+
this.div.classList.add("box-controls");
|
13
|
+
this.box.div.appendChild(this.div);
|
14
|
+
this.box.div.classList.add("admin")
|
15
|
+
this.mover = new BoxControlMove(this);
|
16
|
+
this.grouper = new BoxControlGroup(this);
|
17
|
+
}
|
18
|
+
}
|
@@ -0,0 +1,129 @@
|
|
1
|
+
/* eslint-disable no-alert */
|
2
|
+
export default class PdfModalManager {
|
3
|
+
constructor(options) {
|
4
|
+
this.i18n = options.i18n;
|
5
|
+
this.editSectionPath = options.editSectionPath;
|
6
|
+
this.annotationsPath = options.annotationsPath;
|
7
|
+
this.pdfViewer = options.pdfViewer;
|
8
|
+
this.csrfToken = options.csrfToken;
|
9
|
+
// UI
|
10
|
+
this.modalLayout = document.getElementById("decidim");
|
11
|
+
// events
|
12
|
+
this.onSave = () => {};
|
13
|
+
this.onDestroy = () => {};
|
14
|
+
this.onError = () => {};
|
15
|
+
this.onCancel = () => {};
|
16
|
+
}
|
17
|
+
|
18
|
+
loadBoxModal(box) {
|
19
|
+
$.ajax({
|
20
|
+
url: this.editSectionPath(box.section),
|
21
|
+
type: "GET"
|
22
|
+
}).done((data) => this.populateModal(data, box)).
|
23
|
+
fail((error) => this.onError(box, error));
|
24
|
+
}
|
25
|
+
|
26
|
+
populateModal(data, box) {
|
27
|
+
this.modalLayout.innerHTML = data;
|
28
|
+
this.displayModal(box);
|
29
|
+
}
|
30
|
+
|
31
|
+
displayModal(box) {
|
32
|
+
const uiSave = document.getElementById("editor-modal-save");
|
33
|
+
const uiClose = document.getElementById("editor-modal-close");
|
34
|
+
const uiTitle = document.getElementById("editor-modal-title");
|
35
|
+
const uiRemove = document.getElementById("editor-modal-remove");
|
36
|
+
uiTitle.innerHTML = this.i18n.modalTitle.replace("%{box}", box.div.dataset.position).replace("%{section}", box.sectionNumber);
|
37
|
+
|
38
|
+
this.modalLayout.classList.add("show");
|
39
|
+
$(this.modalLayout).foundation();
|
40
|
+
|
41
|
+
uiClose.addEventListener("click", this._closeHandler.bind(this), { once: true });
|
42
|
+
uiRemove.addEventListener("click", (evt) => this._removeHandler(box, evt), { once: true });
|
43
|
+
uiSave.addEventListener("click", (evt) => this._saveHandler(box, evt), { once: true });
|
44
|
+
}
|
45
|
+
|
46
|
+
createBox(box, page) {
|
47
|
+
let body = box.getInfo();
|
48
|
+
body.pageNumber = page;
|
49
|
+
|
50
|
+
fetch(this.annotationsPath, {
|
51
|
+
method: "POST",
|
52
|
+
headers: {
|
53
|
+
"Content-Type": "application/json",
|
54
|
+
"Accept": "application/json",
|
55
|
+
"X-CSRF-Token": this.csrfToken
|
56
|
+
},
|
57
|
+
credentials: "include",
|
58
|
+
body: JSON.stringify(body)
|
59
|
+
}).
|
60
|
+
then((response) => {
|
61
|
+
if (response.ok) {
|
62
|
+
return response.json();
|
63
|
+
}
|
64
|
+
throw new Error(" ");
|
65
|
+
}).
|
66
|
+
then((resp) => {
|
67
|
+
box.setInfo();
|
68
|
+
this.onSave(box, resp.data);
|
69
|
+
}).
|
70
|
+
catch((error) => {
|
71
|
+
console.error("Error creating box, removing it from the UI", error);
|
72
|
+
box.destroy();
|
73
|
+
this.onError(box, error);
|
74
|
+
});
|
75
|
+
}
|
76
|
+
|
77
|
+
_saveHandler(box, evt) {
|
78
|
+
evt.stopPropagation();
|
79
|
+
let $form = $(this.modalLayout).find("form");
|
80
|
+
|
81
|
+
$.ajax({
|
82
|
+
type: $form.attr("method"),
|
83
|
+
url: $form.attr("action"),
|
84
|
+
data: $form.serialize()
|
85
|
+
}).done(() => {
|
86
|
+
this.modalLayout.classList.remove("show");
|
87
|
+
this.createBox(box, this.pdfViewer.currentPageNumber);
|
88
|
+
}).
|
89
|
+
fail((data) => this.populateModal(data.responseText, box));
|
90
|
+
}
|
91
|
+
|
92
|
+
_removeHandler(box, evt) {
|
93
|
+
evt.stopPropagation();
|
94
|
+
|
95
|
+
if (confirm(this.i18n.removeBoxConfirm)) {
|
96
|
+
// Do not call ajax if not persisted
|
97
|
+
if (box.isPersisted()) {
|
98
|
+
fetch(`${this.annotationsPath}/${box.id}`, {
|
99
|
+
method: "DELETE",
|
100
|
+
headers: {
|
101
|
+
"X-CSRF-Token": this.csrfToken
|
102
|
+
},
|
103
|
+
credentials: "include"
|
104
|
+
}).
|
105
|
+
then((response) => {
|
106
|
+
if (response.ok) {
|
107
|
+
return response.json();
|
108
|
+
}
|
109
|
+
throw new Error(" ");
|
110
|
+
}).
|
111
|
+
then(() => {
|
112
|
+
box.destroy();
|
113
|
+
this.onDestroy(box);
|
114
|
+
}).
|
115
|
+
catch((error) => {
|
116
|
+
this.onError(box, error);
|
117
|
+
});
|
118
|
+
} else {
|
119
|
+
box.destroy();
|
120
|
+
}
|
121
|
+
this.modalLayout.classList.remove("show");
|
122
|
+
}
|
123
|
+
}
|
124
|
+
|
125
|
+
_closeHandler(evt) {
|
126
|
+
evt.stopPropagation();
|
127
|
+
this.modalLayout.classList.remove("show");
|
128
|
+
}
|
129
|
+
}
|
@@ -0,0 +1,141 @@
|
|
1
|
+
/*
|
2
|
+
* This class handles the global state of the PDF document while it is being edited.
|
3
|
+
* It keeps track of the boxes that have been modified and it changes some UI classes
|
4
|
+
* */
|
5
|
+
export default class PdfStateManager {
|
6
|
+
constructor(options) {
|
7
|
+
this.changes = [];
|
8
|
+
this.element = options.saveButton;
|
9
|
+
this.i18n = options.i18n;
|
10
|
+
this.csrfToken = options.csrfToken;
|
11
|
+
this.pdfViewer = options.pdfViewer;
|
12
|
+
this.annotationsPath = options.annotationsPath;
|
13
|
+
this.bindEvents();
|
14
|
+
// events
|
15
|
+
this.onSave = () => {};
|
16
|
+
this.onError = () => {};
|
17
|
+
}
|
18
|
+
|
19
|
+
add(box) {
|
20
|
+
let index = this.changes.indexOf(box.id);
|
21
|
+
if (index === -1) {
|
22
|
+
this.changes.push(box.id);
|
23
|
+
this.setDirty();
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
remove(box) {
|
28
|
+
let index = this.changes.indexOf(box.id);
|
29
|
+
if (index >= 0) {
|
30
|
+
this.changes.splice(index, 1);
|
31
|
+
if (this.isEmpty()) {
|
32
|
+
this.reset();
|
33
|
+
}
|
34
|
+
}
|
35
|
+
console.log(this.pdfViewer._pages)
|
36
|
+
this.pdfViewer._pages.
|
37
|
+
filter((page) => page.boxEditor).
|
38
|
+
filter((page) => page.boxEditor.removeBox(box));
|
39
|
+
}
|
40
|
+
|
41
|
+
isEmpty() {
|
42
|
+
return this.changes.length === 0;
|
43
|
+
}
|
44
|
+
|
45
|
+
bindEvents() {
|
46
|
+
this.element.addEventListener("click", this._saveHandler.bind(this));
|
47
|
+
}
|
48
|
+
|
49
|
+
setDirty() {
|
50
|
+
// console.log("setDirty", this)
|
51
|
+
if (this.element) {
|
52
|
+
this.element.classList.add("alert");
|
53
|
+
}
|
54
|
+
if (!this.beforeUnloadHandler) {
|
55
|
+
// create a global reference to ensure the method is the same on adding and removing
|
56
|
+
this.beforeUnloadHandler = this._beforeUnload.bind(this);
|
57
|
+
window.addEventListener("beforeunload", this.beforeUnloadHandler, { capture: true });
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
reset() {
|
62
|
+
this.changes = [];
|
63
|
+
if (this.element) {
|
64
|
+
this.element.classList.remove("alert");
|
65
|
+
this.element.classList.remove("loading");
|
66
|
+
}
|
67
|
+
|
68
|
+
window.removeEventListener("beforeunload", this.beforeUnloadHandler, { capture: true });
|
69
|
+
this.beforeUnloadHandler = null;
|
70
|
+
}
|
71
|
+
|
72
|
+
|
73
|
+
_beforeUnload(evt) {
|
74
|
+
if (!this.isEmpty()) {
|
75
|
+
evt.returnValue = this.i18n.confirmExit;
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
_saveHandler(evt) {
|
80
|
+
evt.preventDefault();
|
81
|
+
if (this.element.classList.contains("loading")) {
|
82
|
+
return;
|
83
|
+
}
|
84
|
+
this.element.classList.add("loading");
|
85
|
+
this.processed = {};
|
86
|
+
this.errors = {};
|
87
|
+
this.totalBoxes = 0;
|
88
|
+
this.pdfViewer._pages.
|
89
|
+
filter((page) => page.boxEditor).
|
90
|
+
filter((page) => Object.keys(page.boxEditor.boxes).length > 0).
|
91
|
+
forEach((page) => Object.values(page.boxEditor.boxes).map((box) => this._updateOrCreateBox(box, page.id)));
|
92
|
+
}
|
93
|
+
|
94
|
+
_updateOrCreateBox(box, page) {
|
95
|
+
let body = box.getInfo();
|
96
|
+
body.page_number = page; // eslint-disable-line camelcase
|
97
|
+
this.totalBoxes += 1;
|
98
|
+
|
99
|
+
fetch(this.annotationsPath, {
|
100
|
+
method: "POST",
|
101
|
+
headers: {
|
102
|
+
"Content-Type": "application/json",
|
103
|
+
"Accept": "application/json",
|
104
|
+
"X-CSRF-Token": this.csrfToken
|
105
|
+
},
|
106
|
+
credentials: "include",
|
107
|
+
body: JSON.stringify(body)
|
108
|
+
}).
|
109
|
+
then((response) => {
|
110
|
+
if (response.ok) {
|
111
|
+
return response.json();
|
112
|
+
}
|
113
|
+
|
114
|
+
throw new Error(" ");
|
115
|
+
}).
|
116
|
+
then((resp) => {
|
117
|
+
box.setInfo(resp.data);
|
118
|
+
this._setProcessed(box, resp.data);
|
119
|
+
}).
|
120
|
+
catch((error) => {
|
121
|
+
this._setProcessed(box, null, error);
|
122
|
+
});
|
123
|
+
}
|
124
|
+
|
125
|
+
_setProcessed(box, data, error) {
|
126
|
+
if (data) {
|
127
|
+
this.processed[box.id] = data;
|
128
|
+
} else {
|
129
|
+
this.errors[box.id] = error;
|
130
|
+
}
|
131
|
+
|
132
|
+
if (Object.keys(this.processed).length + Object.keys(this.errors).length === this.totalBoxes) {
|
133
|
+
this.reset();
|
134
|
+
if (Object.keys(this.errors).length > 0) {
|
135
|
+
this.onError(this.errors);
|
136
|
+
} else {
|
137
|
+
this.onSave(this.processed);
|
138
|
+
}
|
139
|
+
}
|
140
|
+
}
|
141
|
+
}
|