├── .github ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── FUNDING.yml ├── SECURITY.md ├── renovate.json └── workflows │ ├── ci.yaml │ └── stale.yml ├── .gitignore ├── .php-cs-fixer.php ├── CHANGELOG.md ├── LICENSE ├── README.md ├── bin ├── prepare-commit └── update-translations ├── composer.json ├── docs ├── .gitignore ├── README.md ├── config.rb ├── deploy.sh ├── font-selection.json ├── lib │ ├── multilang.rb │ ├── nesting_unique_head.rb │ ├── toc_data.rb │ └── unique_head.rb └── source │ ├── fonts │ ├── slate.eot │ ├── slate.svg │ ├── slate.ttf │ ├── slate.woff │ └── slate.woff2 │ ├── images │ ├── logo.png │ └── navbar.png │ ├── includes │ └── _errors.md │ ├── index.html.md │ ├── javascripts │ ├── all.js │ ├── all_nosearch.js │ ├── app │ │ ├── _lang.js │ │ ├── _search.js │ │ └── _toc.js │ └── lib │ │ ├── _energize.js │ │ ├── _imagesloaded.min.js │ │ ├── _jquery.highlight.js │ │ ├── _jquery.js │ │ └── _lunr.js │ ├── layouts │ └── layout.erb │ └── stylesheets │ ├── _icon-font.scss │ ├── _normalize.scss │ ├── _rtl.scss │ ├── _variables.scss │ ├── print.css.scss │ └── screen.css.scss ├── phpstan.neon ├── phpunit.xml.dist ├── src ├── Adapter │ ├── AbstractAdapter.php │ ├── AdapterInterface.php │ ├── AdapterQuery.php │ ├── ArrayAdapter.php │ ├── Doctrine │ │ ├── Event │ │ │ └── ORMAdapterQueryEvent.php │ │ ├── FetchJoinORMAdapter.php │ │ ├── ORM │ │ │ ├── AutomaticQueryBuilder.php │ │ │ ├── QueryBuilderProcessorInterface.php │ │ │ └── SearchCriteriaProvider.php │ │ ├── ORMAdapter.php │ │ └── ORMAdapterEvents.php │ ├── Elasticsearch │ │ └── ElasticaAdapter.php │ ├── MongoDB │ │ └── MongoDBAdapter.php │ ├── ResultSet.php │ └── ResultSetInterface.php ├── Column │ ├── AbstractColumn.php │ ├── BoolColumn.php │ ├── DateTimeColumn.php │ ├── MapColumn.php │ ├── NumberColumn.php │ ├── TextColumn.php │ ├── TwigColumn.php │ └── TwigStringColumn.php ├── DataTable.php ├── DataTableEvents.php ├── DataTableFactory.php ├── DataTableRendererInterface.php ├── DataTableState.php ├── DataTableTypeInterface.php ├── DataTablesBundle.php ├── DependencyInjection │ ├── Compiler │ │ └── LocatorRegistrationPass.php │ ├── Configuration.php │ ├── DataTablesExtension.php │ └── Instantiator.php ├── Event │ ├── DataTableEvent.php │ ├── DataTablePostResponseEvent.php │ ├── DataTablePreResponseEvent.php │ └── DataTableResponseEvent.php ├── Exception │ ├── InvalidArgumentException.php │ ├── InvalidConfigurationException.php │ ├── InvalidStateException.php │ ├── MissingDependencyException.php │ └── UnknownDataTableExporterException.php ├── Exporter │ ├── AbstractDataTableExporter.php │ ├── Csv │ │ └── CsvExporter.php │ ├── DataTableExporterCollection.php │ ├── DataTableExporterEvents.php │ ├── DataTableExporterInterface.php │ ├── DataTableExporterManager.php │ ├── Event │ │ └── DataTableExporterResponseEvent.php │ └── Excel │ │ ├── ExcelExporter.php │ │ └── ExcelOpenSpoutExporter.php ├── Filter │ ├── AbstractFilter.php │ ├── ChoiceFilter.php │ └── TextFilter.php ├── Resources │ ├── config │ │ └── services.xml │ ├── public │ │ └── js │ │ │ └── datatables.js │ ├── translations │ │ ├── DataTablesCDN.af.yml │ │ ├── DataTablesCDN.ar.yml │ │ ├── DataTablesCDN.az.yml │ │ ├── DataTablesCDN.be.yml │ │ ├── DataTablesCDN.bg.yml │ │ ├── DataTablesCDN.bn.yml │ │ ├── DataTablesCDN.ca.yml │ │ ├── DataTablesCDN.cs.yml │ │ ├── DataTablesCDN.cy.yml │ │ ├── DataTablesCDN.da.yml │ │ ├── DataTablesCDN.de.yml │ │ ├── DataTablesCDN.el.yml │ │ ├── DataTablesCDN.en.yml │ │ ├── DataTablesCDN.es.yml │ │ ├── DataTablesCDN.et.yml │ │ ├── DataTablesCDN.eu.yml │ │ ├── DataTablesCDN.fa.yml │ │ ├── DataTablesCDN.fi.yml │ │ ├── DataTablesCDN.fr.yml │ │ ├── DataTablesCDN.ga.yml │ │ ├── DataTablesCDN.gl.yml │ │ ├── DataTablesCDN.gu.yml │ │ ├── DataTablesCDN.he.yml │ │ ├── DataTablesCDN.hi.yml │ │ ├── DataTablesCDN.hr.yml │ │ ├── DataTablesCDN.hu.yml │ │ ├── DataTablesCDN.hy.yml │ │ ├── DataTablesCDN.id.yml │ │ ├── DataTablesCDN.is.yml │ │ ├── DataTablesCDN.it.yml │ │ ├── DataTablesCDN.ja.yml │ │ ├── DataTablesCDN.ka.yml │ │ ├── DataTablesCDN.ko.yml │ │ ├── DataTablesCDN.lt.yml │ │ ├── DataTablesCDN.lv.yml │ │ ├── DataTablesCDN.mk.yml │ │ ├── DataTablesCDN.mn.yml │ │ ├── DataTablesCDN.ms.yml │ │ ├── DataTablesCDN.nb.yml │ │ ├── DataTablesCDN.ne.yml │ │ ├── DataTablesCDN.nl.yml │ │ ├── DataTablesCDN.nn.yml │ │ ├── DataTablesCDN.pl.yml │ │ ├── DataTablesCDN.ps.yml │ │ ├── DataTablesCDN.pt.yml │ │ ├── DataTablesCDN.ro.yml │ │ ├── DataTablesCDN.ru.yml │ │ ├── DataTablesCDN.si.yml │ │ ├── DataTablesCDN.sk.yml │ │ ├── DataTablesCDN.sl.yml │ │ ├── DataTablesCDN.sq.yml │ │ ├── DataTablesCDN.sr.yml │ │ ├── DataTablesCDN.sv.yml │ │ ├── DataTablesCDN.sw.yml │ │ ├── DataTablesCDN.ta.yml │ │ ├── DataTablesCDN.te.yml │ │ ├── DataTablesCDN.th.yml │ │ ├── DataTablesCDN.tr.yml │ │ ├── DataTablesCDN.uk.yml │ │ ├── DataTablesCDN.ur.yml │ │ ├── DataTablesCDN.uz.yml │ │ ├── DataTablesCDN.vi.yml │ │ ├── DataTablesCDN.zh.yml │ │ ├── messages.af.yml │ │ ├── messages.am.yml │ │ ├── messages.ar.yml │ │ ├── messages.az.yml │ │ ├── messages.be.yml │ │ ├── messages.bg.yml │ │ ├── messages.bn.yml │ │ ├── messages.ca.yml │ │ ├── messages.cn.yml │ │ ├── messages.cs.yml │ │ ├── messages.cy.yml │ │ ├── messages.da.yml │ │ ├── messages.de.yml │ │ ├── messages.el.yml │ │ ├── messages.en.yml │ │ ├── messages.eo.yml │ │ ├── messages.es.yml │ │ ├── messages.et.yml │ │ ├── messages.eu.yml │ │ ├── messages.fa.yml │ │ ├── messages.fr.yml │ │ ├── messages.ga.yml │ │ ├── messages.gl.yml │ │ ├── messages.gu.yml │ │ ├── messages.he.yml │ │ ├── messages.hi.yml │ │ ├── messages.hr.yml │ │ ├── messages.hy.yml │ │ ├── messages.id.yml │ │ ├── messages.is.yml │ │ ├── messages.it.yml │ │ ├── messages.ja.yml │ │ ├── messages.ka.yml │ │ ├── messages.kk.yml │ │ ├── messages.km.yml │ │ ├── messages.ko.yml │ │ ├── messages.ku.yml │ │ ├── messages.ky.yml │ │ ├── messages.lo.yml │ │ ├── messages.lt.yml │ │ ├── messages.lv.yml │ │ ├── messages.mk.yml │ │ ├── messages.mn.yml │ │ ├── messages.ms.yml │ │ ├── messages.nb.yml │ │ ├── messages.ne.yml │ │ ├── messages.nl.yml │ │ ├── messages.nn.yml │ │ ├── messages.pl.yml │ │ ├── messages.ps.yml │ │ ├── messages.pt.yml │ │ ├── messages.ro.yml │ │ ├── messages.ru.yml │ │ ├── messages.si.yml │ │ ├── messages.sk.yml │ │ ├── messages.sl.yml │ │ ├── messages.sq.yml │ │ ├── messages.sr.yml │ │ ├── messages.sr_Latn.yml │ │ ├── messages.sv.yml │ │ ├── messages.sw.yml │ │ ├── messages.ta.yml │ │ ├── messages.te.yml │ │ ├── messages.th.yml │ │ ├── messages.tr.yml │ │ ├── messages.ua.yml │ │ ├── messages.uk.yml │ │ ├── messages.ur.yml │ │ ├── messages.uz.yml │ │ ├── messages.vi.yml │ │ └── messages.zh.yml │ └── views │ │ ├── Column │ │ └── twig_string.html.twig │ │ ├── Filter │ │ ├── select.html.twig │ │ ├── select.js.twig │ │ ├── text.html.twig │ │ └── text.js.twig │ │ ├── datatable_html.html.twig │ │ └── datatable_js.html.twig └── Twig │ ├── DataTablesExtension.php │ └── TwigRenderer.php └── tests ├── Fixtures ├── .gitignore ├── AppBundle │ ├── AppBundle.php │ ├── Controller │ │ ├── CustomQueryController.php │ │ ├── ExporterController.php │ │ ├── GroupedController.php │ │ ├── HomeController.php │ │ ├── ORMAdapterEventsController.php │ │ ├── PlainController.php │ │ ├── ServiceController.php │ │ ├── TranslationController.php │ │ └── TypeController.php │ ├── DataTable │ │ ├── Adapter │ │ │ └── CustomORMAdapter.php │ │ ├── Exporter │ │ │ └── TxtExporter.php │ │ └── Type │ │ │ ├── CustomQueryTableType.php │ │ │ ├── Grouped2TableType.php │ │ │ ├── GroupedTableType.php │ │ │ ├── RegularPersonTableType.php │ │ │ └── ServicePersonTableType.php │ ├── Entity │ │ ├── Company.php │ │ ├── Employee.php │ │ └── Person.php │ └── Resources │ │ └── views │ │ ├── buttons.html.twig │ │ ├── exporter.html.twig │ │ ├── home.html.twig │ │ ├── lastname_cell.html.twig │ │ └── table.html.twig ├── AppKernel.php ├── config.yml ├── routing.yml └── services.yml ├── Functional ├── Adapter │ └── Doctrine │ │ └── ORMAdapterEventsTest.php ├── Exporter │ ├── Csv │ │ └── CsvExporterTest.php │ ├── Event │ │ └── DataTableExporterResponseEventTest.php │ └── Excel │ │ ├── ExcelExporterTest.php │ │ └── ExcelOpenSpoutExporterTest.php └── FunctionalTest.php ├── Unit ├── Adapter │ ├── DoctrineTest.php │ ├── ElasticaTest.php │ └── ORMAdapterTest.php ├── AdapterTest.php ├── ColumnTest.php ├── DataTableTest.php ├── DependencyInjectionTest.php ├── Exporter │ ├── DataTableExporterCollectionTest.php │ ├── DataTableExporterManagerTest.php │ ├── ExcelExporterTest.php │ └── ExcelOpenSpoutExporterTest.php ├── FilterTest.php ├── Helper │ └── InvalidEvent.php └── TwigTest.php ├── known-deprecations └── phpunit-bootstrap.php /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Contributions are **welcome** and will be credited. 4 | 5 | We accept contributions via Pull Requests on [Github](https://github.com/omines/datatables-bundle). 6 | Follow [good standards](http://www.phptherightway.com/), include tests with proper coverage, and run 7 | `vendor/bin/php-cs-fixer fix` before committing. 8 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: curry684 4 | 5 | # patreon: # Replace with a single Patreon username 6 | # open_collective: # Replace with a single Open Collective username 7 | # ko_fi: # Replace with a single Ko-fi username 8 | # tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 9 | # community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 10 | # liberapay: # Replace with a single Liberapay username 11 | # issuehunt: # Replace with a single IssueHunt username 12 | # otechie: # Replace with a single Otechie username 13 | # lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 14 | # custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 15 | -------------------------------------------------------------------------------- /.github/SECURITY.md: -------------------------------------------------------------------------------- 1 | # Reporting Security Issues 2 | 3 | To report a security issue, please use the GitHub Security Advisory ["Report a Vulnerability"](https://github.com/omines/datatables-bundle/security/advisories/new) tab. 4 | 5 | The team will send a response indicating the next steps in handling your report. After the initial reply to your report, the security team will keep you informed of the progress towards a fix and full announcement, and may ask for additional information or guidance. 6 | 7 | Report security bugs in third-party modules to the person or team maintaining the module. 8 | -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "config:base", 4 | "schedule:monthly", 5 | ":preserveSemverRanges" 6 | ], 7 | "bundler": { 8 | "enabled": false 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /.github/workflows/stale.yml: -------------------------------------------------------------------------------- 1 | # This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time. 2 | # 3 | # You can adjust the behavior by modifying this file. 4 | # For more information, see: 5 | # https://github.com/actions/stale 6 | name: Mark stale issues and pull requests 7 | 8 | on: 9 | schedule: 10 | - cron: '43 22 * * *' 11 | 12 | jobs: 13 | stale: 14 | 15 | runs-on: ubuntu-latest 16 | permissions: 17 | issues: write 18 | pull-requests: write 19 | 20 | steps: 21 | - uses: actions/stale@v9 22 | with: 23 | repo-token: ${{ secrets.GITHUB_TOKEN }} 24 | stale-issue-message: 'Stale issue message' 25 | stale-pr-message: 'Stale pull request message' 26 | stale-issue-label: 'no-issue-activity' 27 | stale-pr-label: 'no-pr-activity' 28 | days-before-stale: 90 29 | days-before-close: 30 30 | 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.*.cache 2 | /.idea 3 | /build 4 | /composer.lock 5 | /tmp 6 | /vendor 7 | /tests/Fixtures/var/ 8 | *~ 9 | -------------------------------------------------------------------------------- /.php-cs-fixer.php: -------------------------------------------------------------------------------- 1 | files() 13 | ->name('*.php') 14 | ->in(__DIR__.'/src') 15 | ->in(__DIR__.'/tests')->exclude('Fixtures/var') 16 | ; 17 | 18 | $config = new PhpCsFixer\Config(); 19 | return $config 20 | ->setRiskyAllowed(true) 21 | ->setRules([ 22 | '@Symfony' => true, 23 | 24 | 'declare_strict_types' => true, 25 | 'strict_param' => true, 26 | 'strict_comparison' => true, 27 | 'array_syntax' => ['syntax' => 'short'], 28 | 'concat_space' => ['spacing' => 'one'], 29 | 'header_comment' => ['header' => $header, 'location' => 'after_open'], 30 | 31 | 'mb_str_functions' => true, 32 | //'ordered_class_elements' => true, 33 | 'ordered_imports' => true, 34 | 'phpdoc_align' => false, 35 | 'phpdoc_separation' => false, 36 | 'phpdoc_var_without_name' => false, 37 | ]) 38 | ->setFinder($finder) 39 | ; 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 and beyond, Omines Internetbureau B.V. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /bin/prepare-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | cd $(dirname $0)/.. 4 | 5 | export APP_ENV=test 6 | export APP_DEBUG=1 7 | export PHP_CS_FIXER_IGNORE_ENV=true 8 | export XDEBUG_MODE=coverage 9 | 10 | vendor/bin/php-cs-fixer fix 11 | vendor/bin/phpstan 12 | 13 | # Clear cache manually to avoid locking up with corrupted container 14 | rm -rf tests/Fixtures/var/cache/test 15 | php -d "zend.assertions=1" vendor/bin/phpunit --testdox --coverage-text \ 16 | --coverage-xml=build/coverage/coverage-xml --log-junit=build/coverage/junit.xml 17 | 18 | echo "All good, ready for commit!" 19 | -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | *.gem 2 | *.rbc 3 | .bundle 4 | .config 5 | coverage 6 | InstalledFiles 7 | lib/bundler/man 8 | pkg 9 | rdoc 10 | spec/reports 11 | test/tmp 12 | test/version_tmp 13 | tmp 14 | *.DS_STORE 15 | build/ 16 | .cache 17 | .vagrant 18 | .sass-cache 19 | 20 | # YARD artifacts 21 | .yardoc 22 | _yardoc 23 | doc/ 24 | .idea/ 25 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | Maintainers with push privileges on `gh-pages` branch can update the 2 | documentation by running: 3 | ``` 4 | ./deploy.sh 5 | ``` 6 | -------------------------------------------------------------------------------- /docs/config.rb: -------------------------------------------------------------------------------- 1 | # Unique header generation 2 | require './lib/unique_head.rb' 3 | 4 | # Markdown 5 | set :markdown_engine, :redcarpet 6 | set :markdown, 7 | fenced_code_blocks: true, 8 | smartypants: true, 9 | disable_indented_code_blocks: true, 10 | prettify: true, 11 | strikethrough: true, 12 | tables: true, 13 | with_toc_data: true, 14 | no_intra_emphasis: true, 15 | renderer: UniqueHeadCounter 16 | 17 | # Assets 18 | set :css_dir, 'stylesheets' 19 | set :js_dir, 'javascripts' 20 | set :images_dir, 'images' 21 | set :fonts_dir, 'fonts' 22 | 23 | # Activate the syntax highlighter 24 | activate :syntax 25 | ready do 26 | require './lib/multilang.rb' 27 | end 28 | 29 | activate :sprockets 30 | 31 | activate :autoprefixer do |config| 32 | config.browsers = ['last 2 version', 'Firefox ESR'] 33 | config.cascade = false 34 | config.inline = true 35 | end 36 | 37 | # Github pages require relative links 38 | activate :relative_assets 39 | set :relative_links, true 40 | 41 | # Build Configuration 42 | configure :build do 43 | activate :asset_hash 44 | # If you're having trouble with Middleman hanging, commenting 45 | # out the following two lines has been known to help 46 | activate :minify_css 47 | activate :minify_javascript 48 | # activate :relative_assets 49 | # activate :asset_hash 50 | # activate :gzip 51 | end 52 | 53 | # Deploy Configuration 54 | # If you want Middleman to listen on a different port, you can set that below 55 | set :port, 4567 56 | 57 | helpers do 58 | require './lib/toc_data.rb' 59 | end 60 | -------------------------------------------------------------------------------- /docs/lib/multilang.rb: -------------------------------------------------------------------------------- 1 | module Multilang 2 | def block_code(code, full_lang_name) 3 | if full_lang_name 4 | parts = full_lang_name.split('--') 5 | rouge_lang_name = (parts) ? parts[0] : "" # just parts[0] here causes null ref exception when no language specified 6 | super(code, rouge_lang_name).sub("highlight #{rouge_lang_name}") do |match| 7 | match + " tab-" + full_lang_name 8 | end 9 | else 10 | super(code, full_lang_name) 11 | end 12 | end 13 | end 14 | 15 | require 'middleman-core/renderers/redcarpet' 16 | Middleman::Renderers::MiddlemanRedcarpetHTML.send :include, Multilang 17 | -------------------------------------------------------------------------------- /docs/lib/nesting_unique_head.rb: -------------------------------------------------------------------------------- 1 | # Nested unique header generation 2 | require 'middleman-core/renderers/redcarpet' 3 | 4 | class NestingUniqueHeadCounter < Middleman::Renderers::MiddlemanRedcarpetHTML 5 | def initialize 6 | super 7 | @@headers_history = {} if !defined?(@@headers_history) 8 | end 9 | 10 | def header(text, header_level) 11 | friendly_text = text.gsub(/<[^>]*>/,"").parameterize 12 | @@headers_history[header_level] = text.parameterize 13 | 14 | if header_level > 1 15 | for i in (header_level - 1).downto(1) 16 | friendly_text.prepend("#{@@headers_history[i]}-") if @@headers_history.key?(i) 17 | end 18 | end 19 | 20 | return "#{text}" 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /docs/lib/toc_data.rb: -------------------------------------------------------------------------------- 1 | require 'nokogiri' 2 | 3 | def toc_data(page_content) 4 | html_doc = Nokogiri::HTML::DocumentFragment.parse(page_content) 5 | 6 | # get a flat list of headers 7 | headers = [] 8 | html_doc.css('h1, h2, h3').each do |header| 9 | headers.push({ 10 | id: header.attribute('id').to_s, 11 | content: header.children, 12 | title: header.children.to_s.gsub(/<[^>]*>/, ''), 13 | level: header.name[1].to_i, 14 | children: [] 15 | }) 16 | end 17 | 18 | [3,2].each do |header_level| 19 | header_to_nest = nil 20 | headers = headers.reject do |header| 21 | if header[:level] == header_level 22 | header_to_nest[:children].push header if header_to_nest 23 | true 24 | else 25 | header_to_nest = header if header[:level] < header_level 26 | false 27 | end 28 | end 29 | end 30 | headers 31 | end 32 | -------------------------------------------------------------------------------- /docs/lib/unique_head.rb: -------------------------------------------------------------------------------- 1 | # Unique header generation 2 | require 'middleman-core/renderers/redcarpet' 3 | require 'digest' 4 | class UniqueHeadCounter < Middleman::Renderers::MiddlemanRedcarpetHTML 5 | def initialize 6 | super 7 | @head_count = {} 8 | end 9 | def header(text, header_level) 10 | friendly_text = text.gsub(/<[^>]*>/,"").parameterize 11 | if friendly_text.strip.length == 0 12 | # Looks like parameterize removed the whole thing! It removes many unicode 13 | # characters like Chinese and Russian. To get a unique URL, let's just 14 | # URI escape the whole header 15 | friendly_text = Digest::SHA1.hexdigest(text)[0,10] 16 | end 17 | @head_count[friendly_text] ||= 0 18 | @head_count[friendly_text] += 1 19 | if @head_count[friendly_text] > 1 20 | friendly_text += "-#{@head_count[friendly_text]}" 21 | end 22 | return "#{text}" 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /docs/source/fonts/slate.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omines/datatables-bundle/9cce090d8b85def6a9ffb84273eff39ca21e00ce/docs/source/fonts/slate.eot -------------------------------------------------------------------------------- /docs/source/fonts/slate.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omines/datatables-bundle/9cce090d8b85def6a9ffb84273eff39ca21e00ce/docs/source/fonts/slate.ttf -------------------------------------------------------------------------------- /docs/source/fonts/slate.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omines/datatables-bundle/9cce090d8b85def6a9ffb84273eff39ca21e00ce/docs/source/fonts/slate.woff -------------------------------------------------------------------------------- /docs/source/fonts/slate.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omines/datatables-bundle/9cce090d8b85def6a9ffb84273eff39ca21e00ce/docs/source/fonts/slate.woff2 -------------------------------------------------------------------------------- /docs/source/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omines/datatables-bundle/9cce090d8b85def6a9ffb84273eff39ca21e00ce/docs/source/images/logo.png -------------------------------------------------------------------------------- /docs/source/images/navbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omines/datatables-bundle/9cce090d8b85def6a9ffb84273eff39ca21e00ce/docs/source/images/navbar.png -------------------------------------------------------------------------------- /docs/source/includes/_errors.md: -------------------------------------------------------------------------------- 1 | # Errors 2 | 3 | 6 | 7 | The Kittn API uses the following error codes: 8 | 9 | 10 | Error Code | Meaning 11 | ---------- | ------- 12 | 400 | Bad Request -- Your request is invalid. 13 | 401 | Unauthorized -- Your API key is wrong. 14 | 403 | Forbidden -- The kitten requested is hidden for administrators only. 15 | 404 | Not Found -- The specified kitten could not be found. 16 | 405 | Method Not Allowed -- You tried to access a kitten with an invalid method. 17 | 406 | Not Acceptable -- You requested a format that isn't json. 18 | 410 | Gone -- The kitten requested has been removed from our servers. 19 | 418 | I'm a teapot. 20 | 429 | Too Many Requests -- You're requesting too many kittens! Slow down! 21 | 500 | Internal Server Error -- We had a problem with our server. Try again later. 22 | 503 | Service Unavailable -- We're temporarily offline for maintenance. Please try again later. 23 | -------------------------------------------------------------------------------- /docs/source/javascripts/all.js: -------------------------------------------------------------------------------- 1 | //= require ./all_nosearch 2 | //= require ./app/_search 3 | -------------------------------------------------------------------------------- /docs/source/javascripts/all_nosearch.js: -------------------------------------------------------------------------------- 1 | //= require ./lib/_energize 2 | //= require ./app/_toc 3 | //= require ./app/_lang 4 | 5 | $(function() { 6 | loadToc($('#toc'), '.toc-link', '.toc-list-h2', 10); 7 | setupLanguages($('body').data('languages')); 8 | $('.content').imagesLoaded( function() { 9 | window.recacheHeights(); 10 | window.refreshToc(); 11 | }); 12 | }); 13 | 14 | window.onpopstate = function() { 15 | activateLanguage(getLanguageFromQueryString()); 16 | }; 17 | -------------------------------------------------------------------------------- /docs/source/stylesheets/_icon-font.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'slate'; 3 | src:font-url('slate.eot?-syv14m'); 4 | src:font-url('slate.eot?#iefix-syv14m') format('embedded-opentype'), 5 | font-url('slate.woff2?-syv14m') format('woff2'), 6 | font-url('slate.woff?-syv14m') format('woff'), 7 | font-url('slate.ttf?-syv14m') format('truetype'), 8 | font-url('slate.svg?-syv14m#slate') format('svg'); 9 | font-weight: normal; 10 | font-style: normal; 11 | } 12 | 13 | %icon { 14 | font-family: 'slate'; 15 | speak: none; 16 | font-style: normal; 17 | font-weight: normal; 18 | font-variant: normal; 19 | text-transform: none; 20 | line-height: 1; 21 | } 22 | 23 | %icon-exclamation-sign { 24 | @extend %icon; 25 | content: "\e600"; 26 | } 27 | %icon-info-sign { 28 | @extend %icon; 29 | content: "\e602"; 30 | } 31 | %icon-ok-sign { 32 | @extend %icon; 33 | content: "\e606"; 34 | } 35 | %icon-search { 36 | @extend %icon; 37 | content: "\e607"; 38 | } 39 | -------------------------------------------------------------------------------- /phpstan.neon: -------------------------------------------------------------------------------- 1 | parameters: 2 | level: 8 3 | paths: 4 | - src 5 | ignoreErrors: 6 | - '#FetchJoinORMOptions contains unresolvable type#' 7 | 8 | # New PHPStan 2 errors 9 | - { identifier: missingType.generics } 10 | excludePaths: 11 | # We're not really testing these 2 barely supported adapters 12 | - src/Adapter/Elasticsearch 13 | - src/Adapter/MongoDB 14 | 15 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | ./tests/ 17 | 18 | 19 | 20 | 21 | ./src/ 22 | 23 | 24 | ./src/Adapter/MongoDB 25 | ./src/Adapter/Elasticsearch 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/Adapter/AdapterInterface.php: -------------------------------------------------------------------------------- 1 | 21 | */ 22 | interface AdapterInterface 23 | { 24 | /** 25 | * Provides initial configuration to the adapter. 26 | * 27 | * @param array $options Adapter specific options array 28 | */ 29 | public function configure(array $options): void; 30 | 31 | /** 32 | * Processes a datatable's state into a result set fit for further processing. 33 | */ 34 | public function getData(DataTableState $state, bool $raw = false): ResultSetInterface; 35 | } 36 | -------------------------------------------------------------------------------- /src/Adapter/AdapterQuery.php: -------------------------------------------------------------------------------- 1 | 22 | */ 23 | class AdapterQuery 24 | { 25 | private ?int $totalRows; 26 | private ?int $filteredRows; 27 | private ?string $identifierPropertyPath = null; 28 | 29 | /** @var array */ 30 | private array $data; 31 | 32 | public function __construct(private readonly DataTableState $state) 33 | { 34 | } 35 | 36 | public function getState(): DataTableState 37 | { 38 | return $this->state; 39 | } 40 | 41 | public function getTotalRows(): ?int 42 | { 43 | return $this->totalRows; 44 | } 45 | 46 | public function setTotalRows(?int $totalRows): static 47 | { 48 | $this->totalRows = $totalRows; 49 | 50 | return $this; 51 | } 52 | 53 | public function getFilteredRows(): ?int 54 | { 55 | return $this->filteredRows; 56 | } 57 | 58 | public function setFilteredRows(?int $filteredRows): static 59 | { 60 | $this->filteredRows = $filteredRows; 61 | 62 | return $this; 63 | } 64 | 65 | public function getIdentifierPropertyPath(): ?string 66 | { 67 | return $this->identifierPropertyPath; 68 | } 69 | 70 | public function setIdentifierPropertyPath(?string $identifierPropertyPath): static 71 | { 72 | $this->identifierPropertyPath = $identifierPropertyPath; 73 | 74 | return $this; 75 | } 76 | 77 | /** 78 | * @template T 79 | * @param T $default 80 | * @return T|mixed 81 | */ 82 | public function get(string $key, mixed $default = null): mixed 83 | { 84 | return $this->data[$key] ?? $default; 85 | } 86 | 87 | public function set(string $key, mixed $value): void 88 | { 89 | $this->data[$key] = $value; 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /src/Adapter/Doctrine/Event/ORMAdapterQueryEvent.php: -------------------------------------------------------------------------------- 1 | 20 | */ 21 | class ORMAdapterQueryEvent extends Event 22 | { 23 | protected Query $query; 24 | 25 | public function __construct(Query $query) 26 | { 27 | $this->query = $query; 28 | } 29 | 30 | public function getQuery(): Query 31 | { 32 | return $this->query; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/Adapter/Doctrine/ORM/QueryBuilderProcessorInterface.php: -------------------------------------------------------------------------------- 1 | 22 | */ 23 | interface QueryBuilderProcessorInterface 24 | { 25 | public function process(QueryBuilder $queryBuilder, DataTableState $state): void; 26 | } 27 | -------------------------------------------------------------------------------- /src/Adapter/Doctrine/ORMAdapterEvents.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | final class ORMAdapterEvents 21 | { 22 | /** 23 | * The PRE_QUERY event is dispatched after the QueryBuilder 24 | * built the Query and before the iteration starts. 25 | * 26 | * It can be useful to configure the cache. 27 | * 28 | * @Event("Omines\DataTablesBundle\Adapter\Doctrine\Event\ORMAdapterQueryEvent") 29 | */ 30 | public const PRE_QUERY = 'omines_datatables.ormadapter.pre_query'; 31 | } 32 | -------------------------------------------------------------------------------- /src/Adapter/ResultSet.php: -------------------------------------------------------------------------------- 1 | 17 | * 18 | * @phpstan-type Row array<(int|string), mixed> 19 | * 20 | * (Note: when using ArrayAdapter, the Row keys may be integers instead of strings.) 21 | */ 22 | class ResultSet implements ResultSetInterface 23 | { 24 | /** 25 | * @param \Iterator $data 26 | */ 27 | public function __construct( 28 | private readonly \Iterator $data, 29 | private readonly int $totalRows, 30 | private readonly int $totalFilteredRows, 31 | ) { 32 | } 33 | 34 | public function getTotalRecords(): int 35 | { 36 | return $this->totalRows; 37 | } 38 | 39 | public function getTotalDisplayRecords(): int 40 | { 41 | return $this->totalFilteredRows; 42 | } 43 | 44 | public function getData(): \Iterator 45 | { 46 | return $this->data; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/Adapter/ResultSetInterface.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | interface ResultSetInterface 21 | { 22 | /** 23 | * Retrieves the total number of accessible records in the original data. 24 | */ 25 | public function getTotalRecords(): int; 26 | 27 | /** 28 | * Retrieves the number of records available after applying filters. 29 | */ 30 | public function getTotalDisplayRecords(): int; 31 | 32 | /** 33 | * Returns the raw data in the result set. 34 | */ 35 | public function getData(): \Iterator; 36 | } 37 | -------------------------------------------------------------------------------- /src/Column/BoolColumn.php: -------------------------------------------------------------------------------- 1 | 21 | */ 22 | class BoolColumn extends AbstractColumn 23 | { 24 | public function normalize(mixed $value): string 25 | { 26 | if (null === $value) { 27 | return $this->getNullValue(); 28 | } 29 | 30 | return ((bool) $value) ? $this->getTrueValue() : $this->getFalseValue(); 31 | } 32 | 33 | protected function configureOptions(OptionsResolver $resolver): static 34 | { 35 | parent::configureOptions($resolver); 36 | 37 | $resolver 38 | ->setDefault( 39 | 'rightExpr', 40 | function ($value) { 41 | return mb_trim(mb_strtolower($value)) === $this->getTrueValue(); 42 | } 43 | ); 44 | 45 | $resolver 46 | ->setDefault('trueValue', 'true') 47 | ->setDefault('falseValue', 'false') 48 | ->setDefault('nullValue', 'null') 49 | ->setAllowedTypes('trueValue', 'string') 50 | ->setAllowedTypes('falseValue', 'string') 51 | ->setAllowedTypes('nullValue', 'string') 52 | ; 53 | 54 | return $this; 55 | } 56 | 57 | public function getTrueValue(): string 58 | { 59 | return $this->options['trueValue']; 60 | } 61 | 62 | public function getFalseValue(): string 63 | { 64 | return $this->options['falseValue']; 65 | } 66 | 67 | public function getNullValue(): string 68 | { 69 | return $this->options['nullValue']; 70 | } 71 | 72 | public function isValidForSearch(mixed $value): bool 73 | { 74 | $value = mb_trim(mb_strtolower($value)); 75 | 76 | return ($value === $this->getTrueValue()) || ($value === $this->getFalseValue()); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/Column/DateTimeColumn.php: -------------------------------------------------------------------------------- 1 | 21 | */ 22 | class DateTimeColumn extends AbstractColumn 23 | { 24 | public function normalize(mixed $value): mixed 25 | { 26 | if (null === $value) { 27 | return $this->options['nullValue']; 28 | } 29 | 30 | if (!$value instanceof \DateTimeInterface) { 31 | if (!empty($this->options['createFromFormat'])) { 32 | $value = \DateTime::createFromFormat($this->options['createFromFormat'], (string) $value); 33 | if (false === $value) { 34 | $errors = \DateTime::getLastErrors(); 35 | throw new \RuntimeException($errors ? implode(', ', $errors['errors'] ?: $errors['warnings']) : 'DateTime conversion failed for unknown reasons'); 36 | } 37 | } else { 38 | $value = new \DateTime((string) $value); 39 | } 40 | } 41 | 42 | return $value->format($this->options['format']); 43 | } 44 | 45 | protected function configureOptions(OptionsResolver $resolver): static 46 | { 47 | parent::configureOptions($resolver); 48 | 49 | $resolver 50 | ->setDefaults([ 51 | 'createFromFormat' => '', 52 | 'format' => 'c', 53 | 'nullValue' => '', 54 | ]) 55 | ->setAllowedTypes('createFromFormat', 'string') 56 | ->setAllowedTypes('format', 'string') 57 | ->setAllowedTypes('nullValue', 'string') 58 | ; 59 | 60 | return $this; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/Column/MapColumn.php: -------------------------------------------------------------------------------- 1 | 21 | */ 22 | class MapColumn extends TextColumn 23 | { 24 | public function normalize(mixed $value): string 25 | { 26 | return parent::normalize($this->options['map'][$value] ?? $this->options['default'] ?? $value); 27 | } 28 | 29 | protected function configureOptions(OptionsResolver $resolver): static 30 | { 31 | parent::configureOptions($resolver); 32 | 33 | $resolver 34 | ->setDefaults([ 35 | 'default' => null, 36 | 'map' => null, 37 | ]) 38 | ->setAllowedTypes('default', ['null', 'string']) 39 | ->setAllowedTypes('map', 'array') 40 | ->setRequired('map') 41 | ; 42 | 43 | return $this; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/Column/NumberColumn.php: -------------------------------------------------------------------------------- 1 | 21 | */ 22 | class NumberColumn extends AbstractColumn 23 | { 24 | public function normalize(mixed $value): string 25 | { 26 | $value = (string) $value; 27 | if (is_numeric($value)) { 28 | return $value; 29 | } 30 | 31 | return $this->isRaw() ? $value : (string) floatval($value); 32 | } 33 | 34 | protected function configureOptions(OptionsResolver $resolver): static 35 | { 36 | parent::configureOptions($resolver); 37 | 38 | $resolver 39 | ->setDefault('raw', false) 40 | ->setAllowedTypes('raw', 'bool') 41 | ; 42 | 43 | return $this; 44 | } 45 | 46 | public function isRaw(): bool 47 | { 48 | return $this->options['raw']; 49 | } 50 | 51 | public function isValidForSearch(mixed $value): bool 52 | { 53 | return is_numeric($value); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/Column/TextColumn.php: -------------------------------------------------------------------------------- 1 | 21 | */ 22 | class TextColumn extends AbstractColumn 23 | { 24 | public function normalize(mixed $value): string 25 | { 26 | $value = (string) $value; 27 | 28 | return $this->isRaw() ? $value : htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE); 29 | } 30 | 31 | protected function configureOptions(OptionsResolver $resolver): static 32 | { 33 | parent::configureOptions($resolver); 34 | 35 | $resolver 36 | ->setDefault('operator', 'LIKE') 37 | ->setDefault( 38 | 'rightExpr', 39 | function ($value) { 40 | return '%' . $value . '%'; 41 | } 42 | ); 43 | 44 | $resolver 45 | ->setDefault('raw', false) 46 | ->setAllowedTypes('raw', 'bool') 47 | ; 48 | 49 | return $this; 50 | } 51 | 52 | public function isRaw(): bool 53 | { 54 | return $this->options['raw']; 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/Column/TwigColumn.php: -------------------------------------------------------------------------------- 1 | 23 | */ 24 | class TwigColumn extends AbstractColumn 25 | { 26 | protected readonly Environment $twig; 27 | 28 | public function __construct(?Environment $twig = null) 29 | { 30 | if (null === $twig) { 31 | throw new MissingDependencyException('You must have TwigBundle installed to use ' . static::class); 32 | } 33 | $this->twig = $twig; 34 | } 35 | 36 | protected function render($value, $context): mixed 37 | { 38 | return $this->twig->render($this->getTemplate(), [ 39 | 'row' => $context, 40 | 'value' => $value, 41 | 'column' => $this, 42 | ]); 43 | } 44 | 45 | public function normalize(mixed $value): mixed 46 | { 47 | return $value; 48 | } 49 | 50 | protected function configureOptions(OptionsResolver $resolver): static 51 | { 52 | parent::configureOptions($resolver); 53 | 54 | $resolver 55 | ->setRequired('template') 56 | ->setAllowedTypes('template', 'string') 57 | ->setDefault('operator', 'LIKE') 58 | ->setDefault( 59 | 'rightExpr', 60 | function ($value) { 61 | return '%' . $value . '%'; 62 | } 63 | ); 64 | 65 | return $this; 66 | } 67 | 68 | public function getTemplate(): string 69 | { 70 | return $this->options['template']; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/Column/TwigStringColumn.php: -------------------------------------------------------------------------------- 1 | 23 | */ 24 | class TwigStringColumn extends TwigColumn 25 | { 26 | public function __construct(?Environment $twig = null) 27 | { 28 | parent::__construct($twig); 29 | 30 | if (!$this->twig->hasExtension(StringLoaderExtension::class)) { 31 | throw new MissingDependencyException('You must have StringLoaderExtension enabled to use ' . self::class); 32 | } 33 | } 34 | 35 | protected function render($value, $context): mixed 36 | { 37 | return $this->twig->render('@DataTables/Column/twig_string.html.twig', [ 38 | 'column' => $this, 39 | 'column_template' => $this->getTemplate(), 40 | 'row' => $context, 41 | 'value' => $value, 42 | ]); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/DataTableEvents.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | final class DataTableEvents 21 | { 22 | /** 23 | * The PRE_RESPONSE event is dispatched right before the response 24 | * is generated to allow any last-minute changes based on the table state. 25 | * 26 | * @Event("Omines\DataTablesBundle\Event\DataTablePreResponseEvent") 27 | */ 28 | public const PRE_RESPONSE = 'omines_datatables.pre_response'; 29 | 30 | /** 31 | * The POST_RESPONSE event is dispatched right after the response 32 | * is generated but before it is returned. 33 | * 34 | * @Event("Omines\DataTablesBundle\Event\DataTablePostResponseEvent") 35 | */ 36 | public const POST_RESPONSE = 'omines_datatables.post_response'; 37 | } 38 | -------------------------------------------------------------------------------- /src/DataTableRendererInterface.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | interface DataTableRendererInterface 21 | { 22 | /** 23 | * Provides the HTML layout of the configured datatable. 24 | * 25 | * @param array $parameters 26 | */ 27 | public function renderDataTable(DataTable $dataTable, string $template, array $parameters): string; 28 | } 29 | -------------------------------------------------------------------------------- /src/DataTableTypeInterface.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | interface DataTableTypeInterface 21 | { 22 | /** 23 | * @param array $options 24 | */ 25 | public function configure(DataTable $dataTable, array $options): void; 26 | } 27 | -------------------------------------------------------------------------------- /src/DataTablesBundle.php: -------------------------------------------------------------------------------- 1 | 25 | */ 26 | class DataTablesBundle extends Bundle 27 | { 28 | public function build(ContainerBuilder $container): void 29 | { 30 | parent::build($container); 31 | 32 | $container->addCompilerPass(new LocatorRegistrationPass()); 33 | } 34 | 35 | public function getContainerExtension(): ?ExtensionInterface 36 | { 37 | return new DataTablesExtension(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/DependencyInjection/Compiler/LocatorRegistrationPass.php: -------------------------------------------------------------------------------- 1 | 30 | */ 31 | class LocatorRegistrationPass implements CompilerPassInterface 32 | { 33 | public function process(ContainerBuilder $container): void 34 | { 35 | $container->getDefinition(Instantiator::class) 36 | ->setArguments([[ 37 | AdapterInterface::class => $this->registerLocator($container, 'adapter'), 38 | AbstractColumn::class => $this->registerLocator($container, 'column'), 39 | DataTableTypeInterface::class => $this->registerLocator($container, 'type'), 40 | DataTableExporterInterface::class => $this->registerLocator($container, 'exporter'), 41 | ]]); 42 | } 43 | 44 | private function registerLocator(ContainerBuilder $container, string $baseTag): Definition 45 | { 46 | $types = []; 47 | foreach ($container->findTaggedServiceIds("datatables.{$baseTag}") as $serviceId => $tag) { 48 | $types[$serviceId] = new Reference($serviceId); 49 | } 50 | 51 | return $container 52 | ->register("datatables.{$baseTag}_locator", ServiceLocator::class) 53 | ->addTag('container.service_locator') 54 | ->setPublic(false) 55 | ->setArguments([$types]) 56 | ; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/DependencyInjection/DataTablesExtension.php: -------------------------------------------------------------------------------- 1 | 29 | */ 30 | class DataTablesExtension extends Extension 31 | { 32 | public function load(array $configs, ContainerBuilder $container): void 33 | { 34 | $configuration = new Configuration(); 35 | $config = $this->processConfiguration($configuration, $configs); 36 | 37 | $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); 38 | $loader->load('services.xml'); 39 | 40 | $container->setAlias('datatables.renderer', $config['renderer']); 41 | unset($config['renderer']); 42 | 43 | $container->setParameter('datatables.config', $config); 44 | 45 | $container->registerForAutoconfiguration(AbstractColumn::class) 46 | ->addTag('datatables.column') 47 | ->setShared(false); 48 | $container->registerForAutoconfiguration(AbstractFilter::class) 49 | ->addTag('datatables.filter') 50 | ->setShared(false); 51 | $container->registerForAutoconfiguration(AdapterInterface::class) 52 | ->addTag('datatables.adapter') 53 | ->setShared(false); 54 | $container->registerForAutoconfiguration(DataTableTypeInterface::class) 55 | ->addTag('datatables.type'); 56 | $container->registerForAutoconfiguration(DataTableExporterInterface::class) 57 | ->addTag('datatables.exporter'); 58 | } 59 | 60 | public function getAlias(): string 61 | { 62 | // Default would underscore the camelcase unintuitively 63 | return 'datatables'; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/Event/DataTableEvent.php: -------------------------------------------------------------------------------- 1 | 22 | */ 23 | abstract class DataTableEvent extends Event 24 | { 25 | /** 26 | * DataTableEvent constructor. 27 | */ 28 | public function __construct( 29 | protected readonly DataTable $table, 30 | ) { 31 | } 32 | 33 | public function getTable(): DataTable 34 | { 35 | return $this->table; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/Event/DataTablePostResponseEvent.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | class DataTablePostResponseEvent extends DataTableResponseEvent 21 | { 22 | } 23 | -------------------------------------------------------------------------------- /src/Event/DataTablePreResponseEvent.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | class DataTablePreResponseEvent extends DataTableResponseEvent 21 | { 22 | } 23 | -------------------------------------------------------------------------------- /src/Event/DataTableResponseEvent.php: -------------------------------------------------------------------------------- 1 | 21 | */ 22 | abstract class DataTableResponseEvent extends DataTableEvent 23 | { 24 | public function getResponse(): Response 25 | { 26 | return $this->table->getResponse(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/Exception/InvalidArgumentException.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | class InvalidArgumentException extends \InvalidArgumentException 21 | { 22 | } 23 | -------------------------------------------------------------------------------- /src/Exception/InvalidConfigurationException.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | class InvalidConfigurationException extends \RuntimeException 21 | { 22 | } 23 | -------------------------------------------------------------------------------- /src/Exception/InvalidStateException.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | class InvalidStateException extends \RuntimeException 21 | { 22 | } 23 | -------------------------------------------------------------------------------- /src/Exception/MissingDependencyException.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | class MissingDependencyException extends \LogicException 21 | { 22 | } 23 | -------------------------------------------------------------------------------- /src/Exception/UnknownDataTableExporterException.php: -------------------------------------------------------------------------------- 1 | 21 | */ 22 | class UnknownDataTableExporterException extends \Exception 23 | { 24 | /** 25 | * UnknownDataTableExporterException constructor. 26 | * 27 | * @param string $name The name of the DataTable exporter that cannot be found 28 | * @param \Traversable $referencedExporters Available DataTable exporters 29 | */ 30 | public function __construct(string $name, \Traversable $referencedExporters) 31 | { 32 | $format = <<formatReferencedExporters($referencedExporters))); 39 | } 40 | 41 | /** 42 | * @param \Traversable $referencedExporters 43 | */ 44 | private function formatReferencedExporters(\Traversable $referencedExporters): string 45 | { 46 | $names = []; 47 | 48 | /** @var DataTableExporterInterface $exporter */ 49 | foreach ($referencedExporters as $exporter) { 50 | $names[] = sprintf('"%s"', $exporter->getName()); 51 | } 52 | 53 | return implode(', ', $names); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/Exporter/AbstractDataTableExporter.php: -------------------------------------------------------------------------------- 1 | 21 | */ 22 | class CsvExporter extends AbstractDataTableExporter 23 | { 24 | #[\Override] 25 | public function export(array $columnNames, \Iterator $data, array $columnOptions): \SplFileInfo 26 | { 27 | $filePath = sys_get_temp_dir() . '/' . uniqid('dt') . '.csv'; 28 | 29 | if (false === ($file = fopen($filePath, 'w'))) { 30 | throw new \RuntimeException('Failed to create temporary file at ' . $filePath); // @codeCoverageIgnore 31 | } 32 | 33 | fputcsv($file, $columnNames, escape: '\\'); 34 | 35 | foreach ($data as $row) { 36 | fputcsv($file, array_map('strip_tags', $row), escape: '\\'); 37 | } 38 | 39 | fclose($file); 40 | 41 | return new \SplFileInfo($filePath); 42 | } 43 | 44 | public function getMimeType(): string 45 | { 46 | return 'text/csv'; 47 | } 48 | 49 | public function getName(): string 50 | { 51 | return 'csv'; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/Exporter/DataTableExporterCollection.php: -------------------------------------------------------------------------------- 1 | 22 | */ 23 | class DataTableExporterCollection 24 | { 25 | /** @var \Traversable */ 26 | private \Traversable $exporters; 27 | 28 | /** 29 | * @param \Traversable $exporters 30 | */ 31 | public function __construct(\Traversable $exporters) 32 | { 33 | $this->exporters = $exporters; 34 | } 35 | 36 | /** 37 | * Finds a DataTable exporter that matches the given name. 38 | * 39 | * @throws UnknownDataTableExporterException when the exporter with the given name cannot be found 40 | */ 41 | public function getByName(string $name): DataTableExporterInterface 42 | { 43 | foreach ($this->exporters as $exporter) { 44 | if ($exporter->getName() === $name) { 45 | return $exporter; 46 | } 47 | } 48 | 49 | throw new UnknownDataTableExporterException($name, $this->exporters); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/Exporter/DataTableExporterEvents.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | final class DataTableExporterEvents 21 | { 22 | /** 23 | * The PRE_RESPONSE event is dispatched before sending 24 | * the BinaryFileResponse to the user. 25 | * 26 | * Note that the file is accessible through the Response object. 27 | * Both the file and the Response can be modified before being sent. 28 | * 29 | * @Event("Omines\DataTablesBundle\Exporter\Event\DataTableExporterResponseEvent") 30 | */ 31 | public const PRE_RESPONSE = 'omines_datatables.exporter.pre_response'; 32 | } 33 | -------------------------------------------------------------------------------- /src/Exporter/DataTableExporterInterface.php: -------------------------------------------------------------------------------- 1 | 21 | */ 22 | interface DataTableExporterInterface 23 | { 24 | /** 25 | * Exports the data from the DataTable to a file. 26 | * 27 | * @param list $columnNames 28 | * @param list> $columnOptions the parsed options for each column 29 | */ 30 | public function export(array $columnNames, \Iterator $data, array $columnOptions): \SplFileInfo; 31 | 32 | /** 33 | * The MIME type of the exported file. 34 | */ 35 | public function getMimeType(): string; 36 | 37 | /** 38 | * A unique name to identify the exporter. 39 | */ 40 | public function getName(): string; 41 | 42 | /** 43 | * Configures the per-column options available for the exporter. 44 | * 45 | * The manager will resolve the options using the options array set in 46 | * `exporterOptions` of AbstractColumn. 47 | */ 48 | public function configureColumnOptions(OptionsResolver $resolver): void; 49 | 50 | /** 51 | * Returns whether the exporter supports non-string data. 52 | * 53 | * The exporter should convert input types to the appropriate output types (e.g. an 54 | * int becomes a number type in Excel). Non-supported types should be cast to a 55 | * string. 56 | * 57 | * When this is true, `AbstractColumn::normalize()` and `AbstractColumn::render()` 58 | * will not be called. 59 | */ 60 | public function supportsRawData(): bool; 61 | } 62 | -------------------------------------------------------------------------------- /src/Exporter/Event/DataTableExporterResponseEvent.php: -------------------------------------------------------------------------------- 1 | 22 | */ 23 | class DataTableExporterResponseEvent extends Event 24 | { 25 | /** @var BinaryFileResponse */ 26 | private $response; 27 | 28 | /** 29 | * DataTableExporterResponseEvent constructor. 30 | */ 31 | public function __construct(BinaryFileResponse $response) 32 | { 33 | $this->response = $response; 34 | } 35 | 36 | public function getResponse(): BinaryFileResponse 37 | { 38 | return $this->response; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/Filter/AbstractFilter.php: -------------------------------------------------------------------------------- 1 | 21 | */ 22 | protected array $options = []; 23 | 24 | public function __construct() 25 | { 26 | // Initialize the options with the default values set on the OptionsResolver 27 | $this->set([]); 28 | } 29 | 30 | /** 31 | * @param array $options 32 | */ 33 | public function set(array $options): static 34 | { 35 | $resolver = new OptionsResolver(); 36 | $this->configureOptions($resolver); 37 | $this->options = $resolver->resolve($options); 38 | 39 | return $this; 40 | } 41 | 42 | protected function configureOptions(OptionsResolver $resolver): static 43 | { 44 | $resolver->setRequired([ 45 | 'template_html', 46 | 'template_js', 47 | ]); 48 | 49 | return $this; 50 | } 51 | 52 | public function getTemplateHtml(): string 53 | { 54 | return $this->options['template_html']; 55 | } 56 | 57 | public function getTemplateJs(): string 58 | { 59 | return $this->options['template_js']; 60 | } 61 | 62 | abstract public function isValidValue(mixed $value): bool; 63 | } 64 | -------------------------------------------------------------------------------- /src/Filter/ChoiceFilter.php: -------------------------------------------------------------------------------- 1 | setDefaults([ 25 | 'template_html' => '@DataTables/Filter/select.html.twig', 26 | 'template_js' => '@DataTables/Filter/select.js.twig', 27 | 'placeholder' => null, 28 | 'choices' => [], 29 | ]) 30 | ->setAllowedTypes('placeholder', ['null', 'string']) 31 | ->setAllowedTypes('choices', ['array']); 32 | 33 | return $this; 34 | } 35 | 36 | public function getPlaceholder(): ?string 37 | { 38 | return $this->options['placeholder']; 39 | } 40 | 41 | /** 42 | * @return string[] 43 | */ 44 | public function getChoices(): array 45 | { 46 | return $this->options['choices']; 47 | } 48 | 49 | public function isValidValue(mixed $value): bool 50 | { 51 | return array_key_exists($value, $this->getChoices()); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/Filter/TextFilter.php: -------------------------------------------------------------------------------- 1 | setDefaults([ 25 | 'template_html' => '@DataTables/Filter/text.html.twig', 26 | 'template_js' => '@DataTables/Filter/text.js.twig', 27 | 'placeholder' => null, 28 | ]) 29 | ->setAllowedTypes('placeholder', ['null', 'string']); 30 | 31 | return $this; 32 | } 33 | 34 | public function getPlaceholder(): ?string 35 | { 36 | return $this->options['placeholder']; 37 | } 38 | 39 | public function isValidValue(mixed $value): bool 40 | { 41 | return true; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.af.yml: -------------------------------------------------------------------------------- 1 | file: Afrikaans.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.ar.yml: -------------------------------------------------------------------------------- 1 | file: Arabic.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.az.yml: -------------------------------------------------------------------------------- 1 | file: Azerbaijan.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.be.yml: -------------------------------------------------------------------------------- 1 | file: Belarusian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.bg.yml: -------------------------------------------------------------------------------- 1 | file: Bulgarian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.bn.yml: -------------------------------------------------------------------------------- 1 | file: Bangla.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.ca.yml: -------------------------------------------------------------------------------- 1 | file: Catalan.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.cs.yml: -------------------------------------------------------------------------------- 1 | file: Czech.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.cy.yml: -------------------------------------------------------------------------------- 1 | file: Welsh.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.da.yml: -------------------------------------------------------------------------------- 1 | file: Danish.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.de.yml: -------------------------------------------------------------------------------- 1 | file: German.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.el.yml: -------------------------------------------------------------------------------- 1 | file: Greek.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.en.yml: -------------------------------------------------------------------------------- 1 | file: English.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.es.yml: -------------------------------------------------------------------------------- 1 | file: Spanish.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.et.yml: -------------------------------------------------------------------------------- 1 | file: Estonian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.eu.yml: -------------------------------------------------------------------------------- 1 | file: Basque.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.fa.yml: -------------------------------------------------------------------------------- 1 | file: Persian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.fi.yml: -------------------------------------------------------------------------------- 1 | file: Finnish.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.fr.yml: -------------------------------------------------------------------------------- 1 | file: French.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.ga.yml: -------------------------------------------------------------------------------- 1 | file: Irish.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.gl.yml: -------------------------------------------------------------------------------- 1 | file: Galician.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.gu.yml: -------------------------------------------------------------------------------- 1 | file: Gujarati.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.he.yml: -------------------------------------------------------------------------------- 1 | file: Hebrew.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.hi.yml: -------------------------------------------------------------------------------- 1 | file: Hindi.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.hr.yml: -------------------------------------------------------------------------------- 1 | file: Croatian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.hu.yml: -------------------------------------------------------------------------------- 1 | file: Hungarian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.hy.yml: -------------------------------------------------------------------------------- 1 | file: Armenian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.id.yml: -------------------------------------------------------------------------------- 1 | file: Indonesian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.is.yml: -------------------------------------------------------------------------------- 1 | file: Icelandic.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.it.yml: -------------------------------------------------------------------------------- 1 | file: Italian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.ja.yml: -------------------------------------------------------------------------------- 1 | file: Japanese.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.ka.yml: -------------------------------------------------------------------------------- 1 | file: Georgian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.ko.yml: -------------------------------------------------------------------------------- 1 | file: Korean.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.lt.yml: -------------------------------------------------------------------------------- 1 | file: Lithuanian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.lv.yml: -------------------------------------------------------------------------------- 1 | file: Latvian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.mk.yml: -------------------------------------------------------------------------------- 1 | file: Macedonian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.mn.yml: -------------------------------------------------------------------------------- 1 | file: Mongolian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.ms.yml: -------------------------------------------------------------------------------- 1 | file: Malay.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.nb.yml: -------------------------------------------------------------------------------- 1 | file: Norwegian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.ne.yml: -------------------------------------------------------------------------------- 1 | file: Nepali.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.nl.yml: -------------------------------------------------------------------------------- 1 | file: Dutch.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.nn.yml: -------------------------------------------------------------------------------- 1 | file: Norwegian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.pl.yml: -------------------------------------------------------------------------------- 1 | file: Polish.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.ps.yml: -------------------------------------------------------------------------------- 1 | file: Pashto.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.pt.yml: -------------------------------------------------------------------------------- 1 | file: Portuguese.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.ro.yml: -------------------------------------------------------------------------------- 1 | file: Romanian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.ru.yml: -------------------------------------------------------------------------------- 1 | file: Russian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.si.yml: -------------------------------------------------------------------------------- 1 | file: Sinhala.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.sk.yml: -------------------------------------------------------------------------------- 1 | file: Slovak.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.sl.yml: -------------------------------------------------------------------------------- 1 | file: Slovenian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.sq.yml: -------------------------------------------------------------------------------- 1 | file: Albanian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.sr.yml: -------------------------------------------------------------------------------- 1 | file: Serbian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.sv.yml: -------------------------------------------------------------------------------- 1 | file: Swedish.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.sw.yml: -------------------------------------------------------------------------------- 1 | file: Swahili.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.ta.yml: -------------------------------------------------------------------------------- 1 | file: Tamil.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.te.yml: -------------------------------------------------------------------------------- 1 | file: Telugu.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.th.yml: -------------------------------------------------------------------------------- 1 | file: Thai.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.tr.yml: -------------------------------------------------------------------------------- 1 | file: Turkish.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.uk.yml: -------------------------------------------------------------------------------- 1 | file: Ukranian.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.ur.yml: -------------------------------------------------------------------------------- 1 | file: Urdu.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.uz.yml: -------------------------------------------------------------------------------- 1 | file: Uzbek.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.vi.yml: -------------------------------------------------------------------------------- 1 | file: Vietnamese.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/DataTablesCDN.zh.yml: -------------------------------------------------------------------------------- 1 | file: Chinese.json 2 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.af.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Geen data beskikbaar in tabel' 6 | info: 'uitstalling _START_ to _END_ of _TOTAL_ inskrywings' 7 | infoEmpty: 'uitstalling 0 to 0 of 0 inskrywings' 8 | infoFiltered: '(gefiltreer uit _MAX_ totaal inskrywings)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: 'uitstal _MENU_ inskrywings' 12 | loadingRecords: laai... 13 | processing: verwerking... 14 | search: 'soektog:' 15 | zeroRecords: 'Geen treffers gevind' 16 | paginate: 17 | first: eerste 18 | last: laaste 19 | next: volgende 20 | previous: vorige 21 | aria: 22 | sortAscending: ': aktiveer kolom stygende te sorteer' 23 | sortDescending: ': aktiveer kolom orde te sorteer' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.am.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'ባዶ ሰንጠረዥ' 6 | info: 'ከጠቅላላው _TOTAL_ ዝርዝሮች ውስጥ ከ _START_ እስከ _END_ ያሉት ዝርዝር' 7 | infoEmpty: 'ከጠቅላላው 0 ዝርዝሮች ውስጥ ከ 0 እስከ 0 ያሉት ዝርዝር' 8 | infoFiltered: '(ከጠቅላላው _MAX_ የተመረጡ ዝርዝሮች)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: 'የዝርዝሮች ብዛት _MENU_' 12 | loadingRecords: 'በማቅረብ ላይ...' 13 | processing: 'በማቀናበር ላይ...' 14 | search: 'ፈልግ:' 15 | zeroRecords: 'ከሚፈለገው ጋር የሚሚሳሰል ዝርዝር አልተገኘም' 16 | paginate: 17 | first: መጀመሪያ 18 | last: መጨረሻ 19 | next: ቀጣዩ 20 | previous: የበፊቱ 21 | aria: 22 | sortAscending: ': ከመጀመሪያ ወደ መጨረሻ(ወጪ) አደራደር' 23 | sortDescending: ': ከመጨረሻ ወደ መጀመሪያ(ወራጅ) አደራደር' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.ar.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: 3 | are_you_sure: 'هل أنت متأكد ؟' 4 | you_need_to_select_at_least_one_element: 'تحتاج إلى تحديد عنصر واحد على الأقل.' 5 | search: بحث 6 | execute: تنفيذ 7 | ok: حسنا 8 | datatable: 9 | searchPlaceholder: '' 10 | processing: 'جارٍ التحميل...' 11 | lengthMenu: 'أظهر _MENU_ مدخلات' 12 | zeroRecords: 'لم يعثر على أية سجلات' 13 | info: 'إظهار _START_ إلى _END_ من أصل _TOTAL_ مدخل' 14 | infoEmpty: 'يعرض 0 إلى 0 من أصل 0 سجل' 15 | infoFiltered: '(منتقاة من مجموع _MAX_ مُدخل)' 16 | infoPostFix: '' 17 | search: 'ابحث:' 18 | paginate: 19 | first: الأول 20 | previous: السابق 21 | next: التالي 22 | last: الأخير 23 | aria: 24 | sortAscending: ': تفعيل لترتيب العمود تصاعدياً' 25 | sortDescending: ': تفعيل لترتيب العمود تنازلياً' 26 | emptyTable: 'ليست هناك بيانات متاحة في الجدول' 27 | loadingRecords: 'جارٍ التحميل...' 28 | url: '' 29 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.az.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Cədvəldə heç bir məlumat yoxdur' 6 | info: ' _TOTAL_ Nəticədən _START_ - _END_ Arası Nəticələr' 7 | infoEmpty: 'Nəticə Yoxdur' 8 | infoFiltered: '( _MAX_ Nəticə İçindən Tapılanlar)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: 'Səhifədə _MENU_ Nəticə Göstər' 12 | loadingRecords: Yüklənir... 13 | processing: Gözləyin... 14 | search: 'Axtarış:' 15 | zeroRecords: 'Nəticə Tapılmadı.' 16 | paginate: 17 | first: İlk 18 | last: Axırıncı 19 | next: Sonraki 20 | previous: Öncəki 21 | aria: 22 | sortAscending: ': sütunu artma sırası üzərə aktiv etmək' 23 | sortDescending: ': sütunu azalma sırası üzərə aktiv etmək' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.be.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: Пачакайце... 6 | lengthMenu: 'Паказваць _MENU_ запісаў' 7 | zeroRecords: 'Запісы адсутнічаюць.' 8 | info: 'Запісы з _START_ па _END_ з _TOTAL_ запісаў' 9 | infoEmpty: 'Запісы з 0 па 0 з 0 запісаў' 10 | infoFiltered: '(адфільтравана з _MAX_ запісаў)' 11 | infoPostFix: '' 12 | search: 'Пошук:' 13 | url: '' 14 | paginate: 15 | first: Першая 16 | previous: Папярэдняя 17 | next: Наступная 18 | last: Апошняя 19 | aria: 20 | sortAscending: ': актываваць для сартавання слупка па ўзрастанні' 21 | sortDescending: ': актываваць для сартавання слупка па змяншэнні' 22 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.bg.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: 'Обработка на резултатите...' 6 | lengthMenu: 'Показване на _MENU_ резултата' 7 | zeroRecords: 'Няма намерени резултати' 8 | info: 'Показване на резултати от _START_ до _END_ от общо _TOTAL_' 9 | infoEmpty: 'Показване на резултати от 0 до 0 от общо 0' 10 | infoFiltered: '(филтрирани от общо _MAX_ резултата)' 11 | infoPostFix: '' 12 | search: 'Търсене:' 13 | url: '' 14 | paginate: 15 | first: Първа 16 | previous: Предишна 17 | next: Следваща 18 | last: Последна 19 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.bn.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: 'প্রসেসিং হচ্ছে...' 6 | lengthMenu: '_MENU_ টা এন্ট্রি দেখাও' 7 | zeroRecords: 'আপনি যা অনুসন্ধান করেছেন তার সাথে মিলে যাওয়া কোন রেকর্ড খুঁজে পাওয়া যায় নাই' 8 | info: '_TOTAL_ টা এন্ট্রির মধ্যে _START_ থেকে _END_ পর্যন্ত দেখানো হচ্ছে' 9 | infoEmpty: 'কোন এন্ট্রি খুঁজে পাওয়া যায় নাই' 10 | infoFiltered: '(মোট _MAX_ টা এন্ট্রির মধ্যে থেকে বাছাইকৃত)' 11 | infoPostFix: '' 12 | search: 'অনুসন্ধান:' 13 | url: '' 14 | paginate: 15 | first: প্রথমটা 16 | previous: আগেরটা 17 | next: পরবর্তীটা 18 | last: শেষেরটা 19 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.ca.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: Processant... 6 | lengthMenu: 'Mostra _MENU_ registres' 7 | zeroRecords: 'No s''han trobat registres.' 8 | info: 'Mostrant de _START_ a _END_ de _TOTAL_ registres' 9 | infoEmpty: 'Mostrant de 0 a 0 de 0 registres' 10 | infoFiltered: '(filtrat de _MAX_ total registres)' 11 | infoPostFix: '' 12 | search: 'Filtrar:' 13 | url: '' 14 | paginate: 15 | first: Primer 16 | previous: Anterior 17 | next: Següent 18 | last: Últim 19 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.cn.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: 3 | are_you_sure: "你确定吗 ?" 4 | you_need_to_select_at_least_one_element: "您需要至少选择一个元素" 5 | search: "搜索" 6 | execute: "执" 7 | ok: "OK" 8 | datatable: 9 | searchPlaceholder: "" 10 | emptyTable: "表中数据为空" 11 | info: "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项" 12 | infoEmpty: "显示第 0 至 0 项结果,共 0 项" 13 | infoFiltered: "(由 _MAX_ 项结果过滤)" 14 | infoPostFix: "" 15 | infoThousands: "," 16 | lengthMenu: "显示 _MENU_ 项结果" 17 | loadingRecords: "载入中..." 18 | processing: "处理中..." 19 | search: "搜索:" 20 | zeroRecords: "没有匹配结果" 21 | paginate: 22 | first: "首页" 23 | last: "末页" 24 | next: "下页" 25 | previous: "上页" 26 | aria: 27 | sortAscending: ": 以升序排列此列" 28 | sortDescending: ": 以降序排列此列" 29 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.cs.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: 3 | are_you_sure: 'Jste si jisti?' 4 | you_need_to_select_at_least_one_element: 'Musíte vybrat alespoň jeden prvek.' 5 | search: Hledat 6 | execute: Vykonat 7 | ok: OK 8 | datatable: 9 | searchPlaceholder: '' 10 | emptyTable: 'Tabulka neobsahuje žádná data' 11 | info: 'Zobrazuji _START_ až _END_ z celkem _TOTAL_ záznamů' 12 | infoEmpty: 'Zobrazuji 0 až 0 z 0 záznamů' 13 | infoFiltered: '(filtrováno z celkem _MAX_ záznamů)' 14 | infoPostFix: '' 15 | infoThousands: ' ' 16 | lengthMenu: 'Zobraz záznamů _MENU_' 17 | loadingRecords: Načítám... 18 | processing: Provádím... 19 | search: 'Hledat:' 20 | zeroRecords: 'Žádné záznamy nebyly nalezeny' 21 | paginate: 22 | first: První 23 | last: Poslední 24 | next: Další 25 | previous: Předchozí 26 | aria: 27 | sortAscending: ': aktivujte pro řazení sloupce vzestupně' 28 | sortDescending: ': aktivujte pro řazení sloupce sestupně' 29 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.cy.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Dim data ar gael yn y tabl' 6 | info: 'Dangos _START_ i _END_ o _TOTAL_ cofnod' 7 | infoEmpty: 'Dangos 0 i 0 o 0 cofnod' 8 | infoFiltered: '(wedi hidlo o gyfanswm o _MAX_ cofnod)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: 'Dangos _MENU_ cofnod' 12 | loadingRecords: 'Wrthi''n llwytho...' 13 | processing: 'Wrthi''n prosesu...' 14 | search: 'Chwilio:' 15 | zeroRecords: 'Heb ddod o hyd i gofnodion sy''n cyfateb' 16 | paginate: 17 | first: Cyntaf 18 | last: Olaf 19 | next: Nesaf 20 | previous: Blaenorol 21 | aria: 22 | sortAscending: ': rhoi ar waith i drefnu colofnau o''r lleiaf i''r mwyaf' 23 | sortDescending: ': rhoi ar waith i drefnu colofnau o''r mwyaf i''r lleiaf' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.da.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: Henter... 6 | lengthMenu: 'Vis _MENU_ linjer' 7 | zeroRecords: 'Ingen linjer matcher søgningen' 8 | info: 'Viser _START_ til _END_ af _TOTAL_ linjer' 9 | infoEmpty: 'Viser 0 til 0 af 0 linjer' 10 | infoFiltered: '(filtreret fra _MAX_ linjer)' 11 | infoPostFix: '' 12 | search: 'Søg:' 13 | url: '' 14 | paginate: 15 | first: 'Første' 16 | previous: Forrige 17 | next: 'Næste' 18 | last: Sidste 19 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.de.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: 3 | are_you_sure: "Bist du sicher?" 4 | you_need_to_select_at_least_one_element: "Sie müssen mindestens ein Element auswählen." 5 | search: Suchen 6 | execute: "Ausführen" 7 | ok: "OK" 8 | datatable: 9 | searchPlaceholder: "" 10 | emptyTable: "Keine Daten in der Tabelle vorhanden" 11 | info: "_START_ bis _END_ von _TOTAL_ Einträgen" 12 | infoEmpty: "0 bis 0 von 0 Einträgen" 13 | infoFiltered: " (gefiltert von _MAX_ Einträgen)" 14 | infoPostFix: "" 15 | infoThousands: "." 16 | lengthMenu: "_MENU_ Einträge anzeigen" 17 | loadingRecords: "Wird geladen..." 18 | processing: "Bitte warten..." 19 | search: "Suchen" 20 | zeroRecords: "Keine Einträge vorhanden." 21 | paginate: 22 | first: "Erste" 23 | last: "Letzte" 24 | next: "Nächste" 25 | previous: "Vorherige" 26 | aria: 27 | sortAscending: ": zu aktivieren, um Spalte aufsteigend zu sortieren" 28 | sortDescending: ": zu aktivieren, um Spalte absteigend sortieren" 29 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.el.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: Αναζήτηση 5 | decimal: ',' 6 | emptyTable: 'Δεν υπάρχουν δεδομένα στον πίνακα' 7 | info: 'Εμφανίζονται _START_ έως _END_ από _TOTAL_ εγγραφές' 8 | infoEmpty: 'Εμφανίζονται 0 έως 0 από 0 εγγραφές' 9 | infoFiltered: '(φιλτραρισμένες από _MAX_ συνολικά εγγραφές)' 10 | infoPostFix: '' 11 | infoThousands: . 12 | lengthMenu: 'Δείξε _MENU_ εγγραφές' 13 | loadingRecords: Φόρτωση... 14 | processing: Επεξεργασία... 15 | search: 'Αναζήτηση:' 16 | thousands: . 17 | url: '' 18 | zeroRecords: 'Δεν βρέθηκαν εγγραφές που να ταιριάζουν' 19 | paginate: 20 | first: Πρώτη 21 | previous: Προηγούμενη 22 | next: Επόμενη 23 | last: Τελευταία 24 | aria: 25 | sortAscending: ': ενεργοποιήστε για αύξουσα ταξινόμηση της στήλης' 26 | sortDescending: ': ενεργοποιήστε για φθίνουσα ταξινόμηση της στήλης' 27 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.en.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: 3 | are_you_sure: 'Are you sure ?' 4 | you_need_to_select_at_least_one_element: 'You need to select at least one element.' 5 | search: Search 6 | execute: Execute 7 | ok: OK 8 | datatable: 9 | searchPlaceholder: '' 10 | emptyTable: 'No data available in table' 11 | info: 'Showing _START_ to _END_ of _TOTAL_ entries' 12 | infoEmpty: 'Showing 0 to 0 of 0 entries' 13 | infoFiltered: '(filtered from _MAX_ total entries)' 14 | infoPostFix: '' 15 | infoThousands: ',' 16 | lengthMenu: 'Show _MENU_ entries' 17 | loadingRecords: Loading... 18 | processing: Processing... 19 | search: 'Search:' 20 | zeroRecords: 'No matching records found' 21 | paginate: 22 | first: First 23 | last: Last 24 | next: Next 25 | previous: Previous 26 | aria: 27 | sortAscending: ': activate to sort column ascending' 28 | sortDescending: ': activate to sort column descending' 29 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.eo.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Neniuj datumoj en tabelo' 6 | info: 'Montras _START_ ĝis _END_ el _TOTAL_ vicoj' 7 | infoEmpty: 'Montras 0 ĝis 0 el 0 vicoj' 8 | infoFiltered: '(filtrita el entute _MAX_ vicoj)' 9 | infoPostFix: '' 10 | infoThousands: . 11 | lengthMenu: 'Montri _MENU_ vicojn' 12 | loadingRecords: 'Ŝarĝas ...' 13 | processing: 'Pretigas ...' 14 | search: 'Serĉi:' 15 | zeroRecords: 'Neniuj rezultoj trovitaj' 16 | paginate: 17 | first: Unua 18 | last: Lasta 19 | next: Venonta 20 | previous: Antaŭa 21 | aria: 22 | sortAscending: ': aktivigi por filtri kolumnon kreskante' 23 | sortDescending: ': aktivigi por filtri kolumnon malkreskante' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.es.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: 3 | are_you_sure: 'Estas seguro ?' 4 | you_need_to_select_at_least_one_element: 'Debe seleccionar al menos un elemento.' 5 | search: Buscar 6 | execute: '' 7 | ok: OK 8 | datatable: 9 | searchPlaceholder: '' 10 | emptyTable: 'Ningún dato disponible en esta tabla' 11 | info: 'Mostrando registros del _START_ al _END_ de un total de _TOTAL_ registros' 12 | infoEmpty: 'Mostrando registros del 0 al 0 de un total de 0 registros' 13 | infoFiltered: '(filtrado de un total de _MAX_ registros)' 14 | infoPostFix: '' 15 | infoThousands: ',' 16 | lengthMenu: 'Mostrar _MENU_ registros' 17 | loadingRecords: Cargando... 18 | processing: Procesando... 19 | search: 'Buscar:' 20 | zeroRecords: 'No se encontraron resultados' 21 | paginate: 22 | first: Primero 23 | last: Último 24 | next: Siguiente 25 | previous: Anterior 26 | aria: 27 | sortAscending: ': Activar para ordenar la columna de manera ascendente' 28 | sortDescending: ': Activar para ordenar la columna de manera descendente' 29 | url: '' 30 | buttons: 31 | copy: Copiar 32 | colvis: Visibilidad 33 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.et.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: 'Palun oodake, koostan kuvamiseks nimekirja!' 6 | lengthMenu: 'Näita kirjeid _MENU_ kaupa' 7 | zeroRecords: 'Otsitavat vastet ei leitud.' 8 | info: 'Kuvatud: _TOTAL_ kirjet (_START_-_END_)' 9 | infoEmpty: 'Otsinguvasteid ei leitud' 10 | infoFiltered: ' - filteeritud _MAX_ kirje seast.' 11 | infoPostFix: 'Kõik kuvatud kirjed põhinevad reaalsetel tulemustel.' 12 | search: 'Otsi kõikide tulemuste seast:' 13 | paginate: 14 | first: Algus 15 | previous: Eelmine 16 | next: 'Järgmine' 17 | last: Viimane 18 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.eu.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: Prozesatzen... 6 | lengthMenu: 'Erakutsi _MENU_ erregistro' 7 | zeroRecords: 'Ez da emaitzarik aurkitu' 8 | emptyTable: 'Taula hontan ez dago inongo datu erabilgarririk' 9 | info: '_START_ -etik _END_ -erako erregistroak erakusten, guztira _TOTAL_ erregistro' 10 | infoEmpty: '0tik 0rako erregistroak erakusten, guztira 0 erregistro' 11 | infoFiltered: '(guztira _MAX_ erregistro iragazten)' 12 | infoPostFix: '' 13 | search: 'Aurkitu:' 14 | url: '' 15 | infoThousands: ',' 16 | loadingRecords: Abiarazten... 17 | paginate: 18 | first: Lehena 19 | last: Azkena 20 | next: Hurrengoa 21 | previous: Aurrekoa 22 | aria: 23 | sortAscending: ': Zutabea goranzko eran ordenatzeko aktibatu ' 24 | sortDescending: ': Zutabea beheranzko eran ordenatzeko aktibatu' 25 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.fa.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'هیچ داده‌ای در جدول وجود ندارد' 6 | info: 'نمایش _START_ تا _END_ از _TOTAL_ ردیف' 7 | infoEmpty: 'نمایش 0 تا 0 از 0 ردیف' 8 | infoFiltered: '(فیلتر شده از _MAX_ ردیف)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: 'نمایش _MENU_ ردیف' 12 | loadingRecords: 'در حال بارگزاری...' 13 | processing: 'در حال پردازش...' 14 | search: 'جستجو:' 15 | zeroRecords: 'رکوردی با این مشخصات پیدا نشد' 16 | paginate: 17 | first: 'برگه‌ی نخست' 18 | last: 'برگه‌ی آخر' 19 | next: بعدی 20 | previous: قبلی 21 | aria: 22 | sortAscending: ': فعال سازی نمایش به صورت صعودی' 23 | sortDescending: ': فعال سازی نمایش به صورت نزولی' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.fr.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: 3 | are_you_sure: Êtes-vous sûr ? 4 | you_need_to_select_at_least_one_element: Vous devez sélectionner au moins un élément. 5 | search: Rechercher 6 | execute: Exécuter 7 | ok: OK 8 | datatable: 9 | searchPlaceholder: "" 10 | processing: "Traitement en cours..." 11 | search: "Rechercher :" 12 | lengthMenu: "Afficher _MENU_ éléments" 13 | info: "Affichage de l'élément _START_ à _END_ sur _TOTAL_ éléments" 14 | infoEmpty: "Affichage de l'élément 0 à 0 sur 0 éléments" 15 | infoFiltered: "(filtré de _MAX_ éléments au total)" 16 | infoPostFix: "" 17 | infoThousands: "." 18 | loadingRecords: "Chargement en cours..." 19 | zeroRecords: "Aucun élément à afficher" 20 | emptyTable: "Aucune donnée disponible dans le tableau" 21 | paginate: 22 | first: "Premier" 23 | previous: "Précédent" 24 | next: "Suivant" 25 | last: "Dernier" 26 | aria: 27 | sortAscending: ": activer pour trier la colonne par ordre croissant" 28 | sortDescending: ": activer pour trier la colonne par ordre décroissant" 29 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.ga.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: Próiseáil... 6 | lengthMenu: 'Taispeáin iontrálacha _MENU_' 7 | zeroRecords: 'Gan aon taifead meaitseáil aimsithe' 8 | info: '_START_ Showing a _END_ na n-iontrálacha _TOTAL_' 9 | infoEmpty: 'Showing 0-0 na n-iontrálacha 0' 10 | infoFiltered: '(scagtha ó _MAX_ iontrálacha iomlán)' 11 | infoPostFix: '' 12 | search: 'Cuardaigh:' 13 | url: '' 14 | paginate: 15 | first: 'An Chéad' 16 | previous: 'Roimhe Seo' 17 | next: 'Ar Aghaidh' 18 | last: Last 19 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.gl.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: Procesando... 6 | lengthMenu: 'Mostrar _MENU_ rexistros' 7 | zeroRecords: 'Non se atoparon resultados' 8 | emptyTable: 'Ningún dato dispoñible nesta táboa' 9 | info: 'Mostrando rexistros do _START_ ao _END_ dun total de _TOTAL_ rexistros' 10 | infoEmpty: 'Mostrando rexistros do 0 ao 0 dun total de 0 rexistros' 11 | infoFiltered: '(filtrado dun total de _MAX_ rexistros)' 12 | infoPostFix: '' 13 | search: 'Buscar:' 14 | url: '' 15 | infoThousands: ',' 16 | loadingRecords: Cargando... 17 | paginate: 18 | first: Primeiro 19 | last: Último 20 | next: Seguinte 21 | previous: Anterior 22 | aria: 23 | sortAscending: ': Activar para ordenar a columna de maneira ascendente' 24 | sortDescending: ': Activar para ordenar a columna de maneira descendente' 25 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.gu.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'કોષ્ટકમાં કોઈ ડેટા ઉપલબ્ધ નથી' 6 | info: 'કુલ _TOTAL_ માંથી _START_ થી _END_ પ્રવેશો દર્શાવે છે' 7 | infoEmpty: 'કુલ 0 પ્રવેશ માંથી 0 થી 0 બતાવી રહ્યું છે' 8 | infoFiltered: '(_MAX_ કુલ પ્રવેશો માંથી ફિલ્ટર)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: 'બતાવો _MENU_ પ્રવેશો' 12 | loadingRecords: 'લોડ કરી રહ્યું છે ...' 13 | processing: 'પ્રક્રિયા ...' 14 | search: 'શોધો:' 15 | zeroRecords: 'કોઈ મેળ ખાતા રેકોર્ડ મળ્યા નથી ' 16 | paginate: 17 | first: પ્રથમ 18 | last: અંતિમ 19 | next: આગામી 20 | previous: ગત 21 | aria: 22 | sortAscending: ': સ્તંભ ચડતા ક્રમમાં ગોઠવવા માટે સક્રિય' 23 | sortDescending: ': કૉલમ ઉતરતા ક્રમમાં ગોઠવવા માટે સક્રિય' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.he.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: מעבד... 6 | lengthMenu: 'הצג _MENU_ פריטים' 7 | zeroRecords: 'לא נמצאו רשומות מתאימות' 8 | emptyTable: 'לא נמצאו רשומות מתאימות' 9 | info: '_START_ עד _END_ מתוך _TOTAL_ רשומות' 10 | infoEmpty: '0 עד 0 מתוך 0 רשומות' 11 | infoFiltered: '(מסונן מסך _MAX_ רשומות)' 12 | infoPostFix: '' 13 | earch: 'חפש:' 14 | url: '' 15 | paginate: 16 | first: ראשון 17 | previous: קודם 18 | next: הבא 19 | last: אחרון 20 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.hi.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: 'प्रगति पे हैं ...' 6 | lengthMenu: ' _MENU_ प्रविष्टियां दिखाएं ' 7 | zeroRecords: 'रिकॉर्ड्स का मेल नहीं मिला' 8 | info: '_START_ to _END_ of _TOTAL_ प्रविष्टियां दिखा रहे हैं' 9 | infoEmpty: '0 में से 0 से 0 प्रविष्टियां दिखा रहे हैं' 10 | infoFiltered: '(_MAX_ कुल प्रविष्टियों में से छठा हुआ)' 11 | infoPostFix: '' 12 | search: 'खोजें:' 13 | url: '' 14 | paginate: 15 | first: प्रथम 16 | previous: पिछला 17 | next: अगला 18 | last: अंतिम 19 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.hr.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Nema podataka u tablici' 6 | info: 'Prikazano _START_ do _END_ od _TOTAL_ rezultata' 7 | infoEmpty: 'Prikazano 0 do 0 od 0 rezultata' 8 | infoFiltered: '(filtrirano iz _MAX_ ukupnih rezultata)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: 'Prikaži _MENU_ rezultata po stranici' 12 | loadingRecords: Dohvaćam... 13 | processing: Obrađujem... 14 | search: 'Pretraži:' 15 | zeroRecords: 'Ništa nije pronađeno' 16 | paginate: 17 | first: Prva 18 | previous: Nazad 19 | next: Naprijed 20 | last: Zadnja 21 | aria: 22 | sortAscending: ': aktiviraj za rastući poredak' 23 | sortDescending: ': aktiviraj za padajući poredak' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.hy.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Տվյալները բացակայում են' 6 | processing: 'Կատարվում է...' 7 | infoThousands: ',' 8 | lengthMenu: 'Ցուցադրել _MENU_ արդյունքներ մեկ էջում' 9 | loadingRecords: 'Բեռնվում է ...' 10 | zeroRecords: 'Հարցմանը համապատասխանող արդյունքներ չկան' 11 | info: 'Ցուցադրված են _START_-ից _END_ արդյունքները ընդհանուր _TOTAL_-ից' 12 | infoEmpty: 'Արդյունքներ գտնված չեն' 13 | infoFiltered: '(ֆիլտրվել է ընդհանուր _MAX_ արդյունքներից)' 14 | infoPostFix: '' 15 | search: Փնտրել 16 | paginate: 17 | first: 'Առաջին էջ' 18 | previous: 'Նախորդ էջ' 19 | next: 'Հաջորդ էջ' 20 | last: 'Վերջին էջ' 21 | aria: 22 | sortAscending: ': ակտիվացրեք աճման կարգով դասավորելու համար' 23 | sortDescending: ': ակտիվացրեք նվազման կարգով դասավորելու համար' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.id.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Tidak ada data yang tersedia pada tabel ini' 6 | processing: 'Sedang memproses...' 7 | lengthMenu: 'Tampilkan _MENU_ entri' 8 | zeroRecords: 'Tidak ditemukan data yang sesuai' 9 | info: 'Menampilkan _START_ sampai _END_ dari _TOTAL_ entri' 10 | infoEmpty: 'Menampilkan 0 sampai 0 dari 0 entri' 11 | infoFiltered: '(disaring dari _MAX_ entri keseluruhan)' 12 | infoPostFix: '' 13 | search: 'Cari:' 14 | url: '' 15 | paginate: 16 | first: Pertama 17 | previous: Sebelumnya 18 | next: Selanjutnya 19 | last: Terakhir 20 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.is.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Engin gögn eru í þessari töflu' 6 | info: 'Sýni _START_ til _END_ af _TOTAL_ færslum' 7 | infoEmpty: 'Sýni 0 til 0 af 0 færslum' 8 | infoFiltered: '(síað út frá _MAX_ færslum)' 9 | infoPostFix: '' 10 | infoThousands: . 11 | lengthMenu: 'Sýna _MENU_ færslur' 12 | loadingRecords: Hleð... 13 | processing: Úrvinnsla... 14 | search: 'Leita:' 15 | zeroRecords: 'Engar færslur fundust' 16 | paginate: 17 | first: Fyrsta 18 | last: Síðasta 19 | next: Næsta 20 | previous: Fyrri 21 | aria: 22 | sortAscending: ': virkja til að raða dálki í hækkandi röð' 23 | sortDescending: ': virkja til að raða dálki lækkandi í röð' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.it.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: 3 | are_you_sure: 'Sei sicuro ?' 4 | you_need_to_select_at_least_one_element: 'È necessario selezionare almeno un elemento.' 5 | search: Cerca 6 | execute: Eseguire 7 | ok: OK 8 | datatable: 9 | searchPlaceholder: '' 10 | emptyTable: 'Nessun dato presente nella tabella' 11 | info: 'Vista da _START_ a _END_ di _TOTAL_ elementi' 12 | infoEmpty: 'Vista da 0 a 0 di 0 elementi' 13 | infoFiltered: '(filtrati da _MAX_ elementi totali)' 14 | infoPostFix: '' 15 | infoThousands: . 16 | lengthMenu: 'Visualizza _MENU_ elementi' 17 | loadingRecords: Caricamento... 18 | processing: Elaborazione... 19 | search: 'Cerca:' 20 | zeroRecords: 'La ricerca non ha portato alcun risultato.' 21 | paginate: 22 | first: Inizio 23 | last: Fine 24 | next: Successivo 25 | previous: Precedente 26 | aria: 27 | sortAscending: ': attiva per ordinare la colonna in ordine crescente' 28 | sortDescending: ': attiva per ordinare la colonna in ordine decrescente' 29 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.ja.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: テーブルにデータがありません 6 | info: ' _TOTAL_ 件中 _START_ から _END_ まで表示' 7 | infoEmpty: ' 0 件中 0 から 0 まで表示' 8 | infoFiltered: '(全 _MAX_ 件より抽出)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: '_MENU_ 件表示' 12 | loadingRecords: 読み込み中... 13 | processing: 処理中... 14 | search: '検索:' 15 | zeroRecords: 一致するレコードがありません 16 | paginate: 17 | first: 先頭 18 | last: 最終 19 | next: 次 20 | previous: 前 21 | aria: 22 | sortAscending: ': 列を昇順に並べ替えるにはアクティブにする' 23 | sortDescending: ': 列を降順に並べ替えるにはアクティブにする' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.ka.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'ცხრილში არ არის მონაცემები' 6 | info: 'ნაჩვენებია ჩანაწერები _START_–დან _END_–მდე, _TOTAL_ ჩანაწერიდან' 7 | infoEmpty: 'ნაჩვენებია ჩანაწერები 0–დან 0–მდე, 0 ჩანაწერიდან' 8 | infoFiltered: '(გაფილტრული შედეგი _MAX_ ჩანაწერიდან)' 9 | infoPostFix: '' 10 | infoThousands: . 11 | lengthMenu: 'აჩვენე _MENU_ ჩანაწერი' 12 | loadingRecords: იტვირთება... 13 | processing: მუშავდება... 14 | search: 'ძიება:' 15 | zeroRecords: 'არაფერი მოიძებნა' 16 | paginate: 17 | first: პირველი 18 | last: ბოლო 19 | next: შემდეგი 20 | previous: წინა 21 | aria: 22 | sortAscending: ': სვეტის დალაგება ზრდის მიხედვით' 23 | sortDescending: ': სვეტის დალაგება კლების მიხედვით' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.kk.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: 'Күте тұрыңыз...' 6 | earch: 'Іздеу:' 7 | lengthMenu: 'Жазбалар _MENU_ көрсету' 8 | info: '_TOTAL_ жазбалары бойынша _START_ бастап _END_ дейінгі жазбалар' 9 | infoEmpty: '0 жазбалары бойынша 0 бастап 0 дейінгі жазбалар' 10 | infoFiltered: '(_MAX_ жазбасынан сұрыпталды)' 11 | infoPostFix: '' 12 | loadingRecords: 'Жазбалар жүктемесі...' 13 | zeroRecords: 'Жазбалар жоқ' 14 | emptyTable: 'Кестеде деректер жоқ' 15 | paginate: 16 | first: Бірінші 17 | previous: Алдыңғысы 18 | next: Келесі 19 | last: Соңғы 20 | aria: 21 | ortAscending: ': өсімі бойынша бағанды сұрыптау үшін активациялау' 22 | ortDescending: ': кемуі бойынша бағанды сұрыптау үшін активациялау' 23 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.km.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: មិនមានទិន្នន័យក្នុងតារាងនេះទេ 6 | info: 'បង្ហាញជួរទី _START_ ដល់ទី _END_ ក្នុងចំណោម _TOTAL_ ជួរ' 7 | infoEmpty: 'បង្ហាញជួរទី 0 ដល់ទី 0 ក្នុងចំណោម 0 ជួរ' 8 | infoFiltered: '(បានចម្រាញ់ចេញពីទិន្នន័យសរុប _MAX_ ជួរ)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: 'បង្ហាញ _MENU_ ជួរ' 12 | loadingRecords: កំពុងផ្ទុក... 13 | processing: កំពុងដំណើរការ... 14 | search: 'ស្វែងរក:' 15 | zeroRecords: មិនមានទិន្នន័យត្រូវតាមលក្ខខណ្ឌស្វែងរកទេ 16 | paginate: 17 | first: ដំបូងគេ 18 | last: ចុងក្រោយ 19 | next: បន្ទាប់ 20 | previous: ក្រោយ 21 | aria: 22 | sortAscending: ': ចុចដើម្បីរៀបជួរឈរនេះតាមលំដាប់ឡើង' 23 | sortDescending: ': ចុចដើម្បីរៀបជួរឈរនេះតាមលំដាប់ចុះ' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.ko.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: '데이터가 없습니다' 6 | info: '_START_ - _END_ / _TOTAL_' 7 | infoEmpty: '0 - 0 / 0' 8 | infoFiltered: '(총 _MAX_ 개)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: '페이지당 줄수 _MENU_' 12 | loadingRecords: 읽는중... 13 | processing: 처리중... 14 | search: '검색:' 15 | zeroRecords: '검색 결과가 없습니다' 16 | paginate: 17 | first: 처음 18 | last: 마지막 19 | next: 다음 20 | previous: 이전 21 | aria: 22 | sortAscending: ': 오름차순 정렬' 23 | sortDescending: ': 내림차순 정렬' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.ku.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'هیچ تۆمارێک نەدۆزرایەوە' 6 | loadingRecords: 'گەراندنەوەی تۆمارەکان...' 7 | processing: 'تکایە چاوەرێکە...' 8 | lengthMenu: 'نیشانبدە _MENU_ تۆمارەکان' 9 | zeroRecords: 'هیچ تۆمارێک نەدۆزرایەوە' 10 | info: 'نیشاندانی _START_ لە _END_ کۆی _TOTAL_ تۆمار' 11 | infoEmpty: 'نیشاندانی 0 لە 0 لە کۆی 0 تۆمار' 12 | infoFiltered: '(پاڵێوراوە لە کۆی _MAX_ تۆمار)' 13 | infoPostFix: '' 14 | search: 'گەران:' 15 | url: '' 16 | paginate: 17 | first: یەکەم 18 | previous: پێشوو 19 | next: داهاتوو 20 | last: کۆتایی 21 | aria: 22 | sortAscending: ': چاڵاککردن بۆ ریزکردنی سەر بەرەو ژوور' 23 | sortDescending: ': چاڵاککردن بۆ ریزکردنی سەر بەرەو خوار' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.ky.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Таблицада эч кандай берилиш жок' 6 | info: 'Жалпы _TOTAL_ саптын ичинен _START_-саптан _END_-сапка чейинкилер' 7 | infoEmpty: 'Жалпы 0 саптын ичинен 0-саптан 0-сапка чейинкилер' 8 | infoFiltered: '(жалпы _MAX_ саптан фильтрленди)' 9 | infoPostFix: '' 10 | infoThousands: ' ' 11 | lengthMenu: '_MENU_ саптан көрсөт' 12 | loadingRecords: Жүктөлүүдө... 13 | processing: 'Иштеп жатат...' 14 | search: 'Издөө:' 15 | zeroRecords: 'Туура келген бир да сап жок' 16 | paginate: 17 | first: Биринчи 18 | last: Акыркы 19 | next: Кийинки 20 | previous: Мурунку 21 | aria: 22 | sortAscending: ': иретте' 23 | sortDescending: ': тескери иретте' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.lo.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: ບໍ່ພົບຂໍ້ມູນໃນຕາຕະລາງ 6 | info: 'ສະແດງ _START_ ເຖິງ _END_ ຈາກ _TOTAL_ ແຖວ' 7 | infoEmpty: 'ສະແດງ 0 ເຖິງ 0 ຈາກ 0 ແຖວ' 8 | infoFiltered: '(ກັ່ນຕອງຂໍ້ມູນ _MAX_ ທຸກແຖວ)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: 'ສະແດງ _MENU_ ແຖວ' 12 | loadingRecords: ກຳລັງໂຫຼດຂໍ້ມູນ... 13 | processing: ກຳລັງດຳເນີນການ... 14 | search: 'ຄົ້ນຫາ: ' 15 | zeroRecords: ບໍ່ພົບຂໍ້ມູນ 16 | paginate: 17 | first: ໜ້າທຳອິດ 18 | previous: ກ່ອນໜ້ານີ້ 19 | next: ໜ້າຕໍ່ໄປ 20 | last: ໜ້າສຸດທ້າຍ 21 | aria: 22 | sortAscending: ': ເປີດໃຊ້ການຈັດລຽງຂໍ້ມູນແຕ່ນ້ອຍຫາໃຫຍ່' 23 | sortDescending: ': ເປີດໃຊ້ການຈັດລຽງຂໍ້ມູນແຕ່ໃຫຍ່ຫານ້ອຍ' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.lt.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Lentelėje nėra duomenų' 6 | info: 'Rodomi įrašai nuo _START_ iki _END_ iš _TOTAL_ įrašų' 7 | infoEmpty: 'Rodomi įrašai nuo 0 iki 0 iš 0' 8 | infoFiltered: '(atrinkta iš _MAX_ įrašų)' 9 | infoPostFix: '' 10 | infoThousands: ' ' 11 | lengthMenu: 'Rodyti _MENU_ įrašus' 12 | loadingRecords: Įkeliama... 13 | processing: Apdorojama... 14 | search: 'Ieškoti:' 15 | thousands: ' ' 16 | url: '' 17 | zeroRecords: 'Įrašų nerasta' 18 | paginate: 19 | first: Pirmas 20 | previous: Ankstesnis 21 | next: Tolimesnis 22 | last: Paskutinis 23 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.lv.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: 'Uzgaidiet ...' 6 | earch: 'Meklēt:' 7 | lengthMenu: 'Rādīt _MENU_ ierakstus' 8 | info: 'Parādīti _START_ līdz _END_ no _TOTAL_ ierakstiem' 9 | infoEmpty: 'Nav ierakstu' 10 | infoFiltered: '(atlasīts no pavisam _MAX_ ierakstiem)' 11 | infoPostFix: '' 12 | loadingRecords: 'Notiek ielāde ...' 13 | zeroRecords: 'Nav atrasti vaicājumam atbilstoši ieraksti' 14 | emptyTable: 'Tabulā nav datu' 15 | paginate: 16 | first: Pirmā 17 | previous: Iepriekšējā 18 | next: Nākošā 19 | last: Pēdējā 20 | aria: 21 | ortAscending: ': aktivizēt kolonnu, lai kārtotu augoši' 22 | ortDescending: ': aktivizēt kolonnu, lai kārtotu dilstoši' 23 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.mk.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: Процесирање... 6 | lengthMenu: 'Прикажи _MENU_ записи' 7 | zeroRecords: 'Не се пронајдени записи' 8 | emptyTable: 'Нема податоци во табелата' 9 | loadingRecords: Вчитување... 10 | info: 'Прикажани _START_ до _END_ од _TOTAL_ записи' 11 | infoEmpty: 'Прикажани 0 до 0 од 0 записи' 12 | infoFiltered: '(филтрирано од вкупно _MAX_ записи)' 13 | infoPostFix: '' 14 | search: Барај 15 | url: '' 16 | paginate: 17 | first: Почетна 18 | previous: Претходна 19 | next: Следна 20 | last: Последна 21 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.mn.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Хүснэгт хоосон байна' 6 | info: 'Нийт _TOTAL_ бичлэгээс _START_ - _END_ харуулж байна' 7 | infoEmpty: 'Тохирох үр дүн алга' 8 | infoFiltered: '(нийт _MAX_ бичлэгээс шүүв)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: 'Дэлгэцэд _MENU_ бичлэг харуулна' 12 | loadingRecords: 'Ачааллаж байна...' 13 | processing: 'Боловсруулж байна...' 14 | search: 'Хайлт:' 15 | zeroRecords: 'Тохирох бичлэг олдсонгүй' 16 | paginate: 17 | first: Эхнийх 18 | last: Сүүлийнх 19 | next: Өмнөх 20 | previous: Дараах 21 | aria: 22 | sortAscending: ': цагаан толгойн дарааллаар эрэмбэлэх' 23 | sortDescending: ': цагаан толгойн эсрэг дарааллаар эрэмбэлэх' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.ms.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Tiada data' 6 | info: 'Paparan dari _START_ hingga _END_ dari _TOTAL_ rekod' 7 | infoEmpty: 'Paparan 0 hingga 0 dari 0 rekod' 8 | infoFiltered: '(Ditapis dari jumlah _MAX_ rekod)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: 'Papar _MENU_ rekod' 12 | loadingRecords: Diproses... 13 | processing: 'Sedang diproses...' 14 | search: 'Carian:' 15 | zeroRecords: 'Tiada padanan rekod yang dijumpai.' 16 | paginate: 17 | first: Pertama 18 | previous: Sebelum 19 | next: Seterusnya 20 | last: Akhir 21 | aria: 22 | sortAscending: ': diaktifkan kepada susunan lajur menaik' 23 | sortDescending: ': diaktifkan kepada susunan lajur menurun' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.nb.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Ingen data tilgjengelig i tabellen' 6 | info: 'Viser _START_ til _END_ av _TOTAL_ linjer' 7 | infoEmpty: 'Viser 0 til 0 av 0 linjer' 8 | infoFiltered: '(filtrert fra _MAX_ totalt antall linjer)' 9 | infoPostFix: '' 10 | infoThousands: ' ' 11 | loadingRecords: Laster... 12 | lengthMenu: 'Vis _MENU_ linjer' 13 | processing: Laster... 14 | search: 'Søk:' 15 | url: '' 16 | zeroRecords: 'Ingen linjer matcher søket' 17 | paginate: 18 | first: 'Første' 19 | previous: Forrige 20 | next: Neste 21 | last: Siste 22 | aria: 23 | sortAscending: ': aktiver for å sortere kolonnen stigende' 24 | sortDescending: ': aktiver for å sortere kolonnen synkende' 25 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.ne.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'टेबलमा डाटा उपलब्ध भएन' 6 | info: '_TOTAL_ रेकर्ड मध्य _START_ देखि _END_ रेकर्ड देखाउंदै' 7 | infoEmpty: '0 मध्य 0 देखि 0 रेकर्ड देखाउंदै' 8 | infoFiltered: '(_MAX_ कुल रेकर्डबाट छनौट गरिएको)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: ' _MENU_ रेकर्ड देखाउने ' 12 | loadingRecords: 'लोड हुँदैछ...' 13 | processing: 'प्रगति हुदैंछ ...' 14 | search: 'खोजी:' 15 | url: '' 16 | zeroRecords: 'कुनै मिल्ने रेकर्ड फेला परेन' 17 | paginate: 18 | first: प्रथम 19 | previous: पछिल्लो 20 | next: अघिल्लो 21 | last: अन्तिम 22 | aria: 23 | sortAscending: ': अगाडिबाट अक्षरात्मक रूपमा क्रमबद्ध गराउने' 24 | sortDescending: ': पछाडिबाट अक्षरात्मक रूपमा क्रमबद्ध गराउने' 25 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.nl.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: Bezig... 6 | lengthMenu: '_MENU_ resultaten weergeven' 7 | zeroRecords: 'Geen resultaten gevonden' 8 | info: '_START_ tot _END_ van _TOTAL_ resultaten' 9 | infoEmpty: 'Geen resultaten om weer te geven' 10 | infoFiltered: ' (gefilterd uit _MAX_ resultaten)' 11 | infoPostFix: '' 12 | search: 'Zoeken:' 13 | emptyTable: 'Geen resultaten aanwezig in de tabel' 14 | infoThousands: . 15 | loadingRecords: 'Een moment geduld aub - bezig met laden...' 16 | paginate: 17 | first: Eerste 18 | last: Laatste 19 | next: Volgende 20 | previous: Vorige 21 | aria: 22 | sortAscending: ': activeer om kolom oplopend te sorteren' 23 | sortDescending: ': activeer om kolom aflopend te sorteren' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.nn.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Inga data tilgjengeleg i tabellen' 6 | info: 'Syner _START_ til _END_ av _TOTAL_ linjer' 7 | infoEmpty: 'Syner 0 til 0 av 0 linjer' 8 | infoFiltered: '(filtrert frå _MAX_ totalt antal linjer)' 9 | infoPostFix: '' 10 | infoThousands: ' ' 11 | loadingRecords: Lastar... 12 | lengthMenu: 'Syn _MENU_ linjer' 13 | processing: Lastar... 14 | search: 'Søk:' 15 | url: '' 16 | zeroRecords: 'Inga linjer treff på søket' 17 | paginate: 18 | first: Fyrste 19 | previous: Forrige 20 | next: Neste 21 | last: Siste 22 | aria: 23 | sortAscending: ': aktiver for å sortere kolonna stigande' 24 | sortDescending: ': aktiver for å sortere kolonna synkande' 25 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.pl.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: 3 | are_you_sure: 'Jesteś pewny ?' 4 | you_need_to_select_at_least_one_element: 'Musisz wybrać co najmniej jeden element.' 5 | search: Szukaj 6 | execute: Wykonać 7 | ok: OK 8 | datatable: 9 | searchPlaceholder: '' 10 | emptyTable: 'Brak danych' 11 | info: 'Pozycje od _START_ do _END_ z _TOTAL_ łącznie' 12 | infoEmpty: 'Pozycji 0 z 0 dostępnych' 13 | infoFiltered: '(filtrowanie spośród _MAX_ dostępnych pozycji)' 14 | infoPostFix: '' 15 | infoThousands: ' ' 16 | lengthMenu: 'Pokaż _MENU_ pozycji' 17 | loadingRecords: Wczytywanie... 18 | processing: Przetwarzanie... 19 | search: 'Szukaj:' 20 | zeroRecords: 'Nie znaleziono pasujących pozycji' 21 | paginate: 22 | first: Pierwsza 23 | last: Ostatnia 24 | next: Następna 25 | previous: Poprzednia 26 | aria: 27 | sortAscending: ': aktywuj, by posortować kolumnę rosnąco' 28 | sortDescending: ': aktywuj, by posortować kolumnę malejąco' 29 | ortAscending: ': aktywuj, by posortować kolumnę rosnąco' 30 | ortDescending: ': aktywuj, by posortować kolumnę malejąco' 31 | earch: 'Szukaj:' 32 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.ps.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'جدول خالي دی' 6 | info: 'د _START_ څخه تر _END_ پوري، له ټولو _TOTAL_ څخه' 7 | infoEmpty: 'د 0 څخه تر 0 پوري، له ټولو 0 څخه' 8 | infoFiltered: '(لټول سوي له ټولو _MAX_ څخه)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: '_MENU_ کتاره وښايه' 12 | loadingRecords: 'منتظر اوسئ...' 13 | processing: 'منتظر اوسئ...' 14 | search: 'لټون:' 15 | zeroRecords: 'د لټون مطابق معلومات و نه موندل سول' 16 | paginate: 17 | first: لومړۍ 18 | last: وروستۍ 19 | next: بله 20 | previous: شاته 21 | aria: 22 | sortAscending: ': په صعودي ډول مرتبول' 23 | sortDescending: ': په نزولي ډول مرتبول' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.pt.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Não foi encontrado nenhum registro' 6 | loadingRecords: 'A carregar...' 7 | processing: 'A processar...' 8 | lengthMenu: 'Mostrar _MENU_ registros' 9 | zeroRecords: 'Não foram encontrados resultados' 10 | info: 'Mostrando de _START_ até _END_ de _TOTAL_ registros' 11 | infoEmpty: 'Mostrando de 0 até 0 de 0 registros' 12 | infoFiltered: '(filtrado de _MAX_ registros no total)' 13 | infoPostFix: '' 14 | search: 'Procurar:' 15 | url: '' 16 | paginate: 17 | first: Primeiro 18 | previous: Anterior 19 | next: Seguinte 20 | last: Último 21 | aria: 22 | sortAscending: ': Ordenar colunas de forma ascendente' 23 | sortDescending: ': Ordenar colunas de forma descendente' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.ro.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: Procesează... 6 | lengthMenu: 'Afișează _MENU_ înregistrări pe pagină' 7 | zeroRecords: 'Nu am găsit nimic - ne pare rău' 8 | info: 'Afișate de la _START_ la _END_ din _TOTAL_ înregistrări' 9 | infoEmpty: 'Afișate de la 0 la 0 din 0 înregistrări' 10 | infoFiltered: '(filtrate dintr-un total de _MAX_ înregistrări)' 11 | infoPostFix: '' 12 | search: 'Caută:' 13 | url: '' 14 | paginate: 15 | first: Prima 16 | previous: Precedenta 17 | next: Următoarea 18 | last: Ultima 19 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.ru.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: 3 | are_you_sure: Вы уверены ? 4 | you_need_to_select_at_least_one_element: Вы должны выбрать хотя бы один элемент. 5 | search: Поиск 6 | execute: "выполнять" 7 | ok: "OK" 8 | datatable: 9 | searchPlaceholder: "" 10 | emptyTable: "В таблице отсутствуют данные" 11 | info: "Записи с _START_ до _END_ из _TOTAL_ записей" 12 | infoEmpty: "Записи с 0 до 0 из 0 записей" 13 | infoFiltered: "(отфильтровано из _MAX_ записей)" 14 | infoPostFix: "" 15 | infoThousands: "," 16 | lengthMenu: "Показать _MENU_ записей" 17 | loadingRecords: "Загрузка записей..." 18 | processing: "Подождите..." 19 | search: "Поиск:" 20 | zeroRecords: "Записи отсутствуют." 21 | paginate: 22 | first: "Первая" 23 | last: "Последняя" 24 | next: "Следующая" 25 | previous: "Предыдущая" 26 | aria: 27 | sortAscending: ": активировать для сортировки столбца по возрастанию" 28 | sortDescending: ": активировать для сортировки столбца по убыванию" 29 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.si.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'වගුවේ දත්ත කිසිවක් නොමැත' 6 | info: '_TOTAL_ න් _START_ සිට _END_ දක්වා' 7 | infoEmpty: '0 න් 0 සිට 0 දක්වා' 8 | infoFiltered: '(_MAX_ න් තෝරාගත් )' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: '_MENU_ ක් පෙන්වන්න' 12 | loadingRecords: 'පූරණය වෙමින් පවතී...' 13 | processing: 'සැකසෙමින් පවතී...' 14 | search: 'සොයන්න :' 15 | zeroRecords: 'ගැලපෙන වාර්තා නොමැත.' 16 | paginate: 17 | first: පළමු 18 | last: අන්තිම 19 | next: ඊළග 20 | previous: පසුගිය 21 | aria: 22 | sortAscending: ': තීරුව ආරෝහනව තෝරන්න' 23 | sortDescending: ': තීරුව අවරෝහනව තෝරන්න' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.sk.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: 3 | are_you_sure: 'Ste si istý?' 4 | you_need_to_select_at_least_one_element: 'Musíte vybrať aspoň jeden prvok.' 5 | search: Hľadať 6 | execute: Vykonať 7 | ok: OK 8 | datatable: 9 | searchPlaceholder: '' 10 | emptyTable: 'Nie sú k dispozícii žiadne dáta' 11 | info: 'Záznamy _START_ až _END_ z celkom _TOTAL_' 12 | infoEmpty: 'Záznamy 0 až 0 z celkom 0 ' 13 | infoFiltered: '(vyfiltrované spomedzi _MAX_ záznamov)' 14 | infoPostFix: '' 15 | infoThousands: ',' 16 | lengthMenu: 'Zobraz _MENU_ záznamov' 17 | loadingRecords: Načítavam... 18 | processing: Spracúvam... 19 | search: 'Hľadať:' 20 | zeroRecords: 'Nenašli sa žiadne vyhovujúce záznamy' 21 | paginate: 22 | first: Prvá 23 | last: Posledná 24 | next: Nasledujúca 25 | previous: Predchádzajúca 26 | aria: 27 | sortAscending: ': aktivujte na zoradenie stĺpca vzostupne' 28 | sortDescending: ': aktivujte na zoradenie stĺpca zostupne' 29 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.sl.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Nobenih podatkov ni na voljo' 6 | info: 'Prikazujem _START_ do _END_ od _TOTAL_ zapisov' 7 | infoEmpty: 'Prikazujem 0 do 0 od 0 zapisov' 8 | infoFiltered: '(filtrirano od _MAX_ vseh zapisov)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: 'Prikaži _MENU_ zapisov' 12 | loadingRecords: Nalagam... 13 | processing: Obdelujem... 14 | search: 'Išči:' 15 | zeroRecords: 'Nobeden zapis ne ustreza' 16 | paginate: 17 | first: Prvi 18 | last: Zadnji 19 | next: Nasl. 20 | previous: Pred. 21 | aria: 22 | sortAscending: ': vključite za naraščujoči sort' 23 | sortDescending: ': vključite za padajoči sort' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.sq.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Nuk ka asnjë të dhënë në tabele' 6 | info: 'Duke treguar _START_ deri _END_ prej _TOTAL_ reshtave' 7 | infoEmpty: 'Duke treguar 0 deri 0 prej 0 reshtave' 8 | infoFiltered: '(të filtruara nga gjithësej _MAX_ reshtave)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: 'Shiko _MENU_ reshta' 12 | loadingRecords: 'Duke punuar...' 13 | processing: 'Duke procesuar...' 14 | search: 'Kërkoni:' 15 | zeroRecords: 'Asnjë e dhënë nuk u gjet' 16 | paginate: 17 | first: 'E para' 18 | last: 'E Fundit' 19 | next: Tjetra 20 | previous: 'E Kaluara' 21 | aria: 22 | sortAscending: ': aktivizo për të sortuar kolumnin me vlera në ngritje' 23 | sortDescending: ': aktivizo për të sortuar kolumnin me vlera në zbritje' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.sr.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Нема података у табели' 6 | info: 'Приказ _START_ до _END_ од укупно _TOTAL_ записа' 7 | infoEmpty: 'Приказ 0 до 0 од укупно 0 записа' 8 | infoFiltered: '(филтрирано од укупно _MAX_ записа)' 9 | infoPostFix: '' 10 | infoThousands: . 11 | lengthMenu: 'Прикажи _MENU_ записа' 12 | loadingRecords: Учитавање... 13 | processing: Обрада... 14 | search: 'Претрага:' 15 | zeroRecords: 'Нису пронађени одговарајући записи' 16 | paginate: 17 | first: Почетна 18 | last: Последња 19 | next: Следећа 20 | previous: Предходна 21 | aria: 22 | sortAscending: ': активирајте да сортирате колону узлазно' 23 | sortDescending: ': активирајте да сортирате колону силазно' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.sr_Latn.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Nema podataka u tabeli' 6 | info: 'Prikaz _START_ do _END_ od ukupno _TOTAL_ zapisa' 7 | infoEmpty: 'Prikaz 0 do 0 od ukupno 0 zapisa' 8 | infoFiltered: '(filtrirano od ukupno _MAX_ zapisa)' 9 | infoPostFix: '' 10 | infoThousands: . 11 | lengthMenu: 'Prikaži _MENU_ zapisa' 12 | loadingRecords: Učitavanje... 13 | processing: Obrada... 14 | search: 'Pretraga:' 15 | zeroRecords: 'Nisu pronađeni odgovarajući zapisi' 16 | paginate: 17 | first: Početna 18 | last: Poslednja 19 | next: Sledeća 20 | previous: Predhodna 21 | aria: 22 | sortAscending: ': aktivirajte da sortirate kolonu uzlazno' 23 | sortDescending: ': aktivirajte da sortirate kolonu silazno' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.sv.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Tabellen innehåller ingen data' 6 | info: 'Visar _START_ till _END_ av totalt _TOTAL_ rader' 7 | infoEmpty: 'Visar 0 till 0 av totalt 0 rader' 8 | infoFiltered: '(filtrerade från totalt _MAX_ rader)' 9 | infoPostFix: '' 10 | infoThousands: ' ' 11 | lengthMenu: 'Visa _MENU_ rader' 12 | loadingRecords: Laddar... 13 | processing: Bearbetar... 14 | search: 'Sök:' 15 | zeroRecords: 'Hittade inga matchande resultat' 16 | paginate: 17 | first: Första 18 | last: Sista 19 | next: Nästa 20 | previous: Föregående 21 | aria: 22 | sortAscending: ': aktivera för att sortera kolumnen i stigande ordning' 23 | sortDescending: ': aktivera för att sortera kolumnen i fallande ordning' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.sw.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Hakuna data iliyo patikana' 6 | info: 'Inaonyesha _START_ mpaka _END_ ya matokeo _TOTAL_' 7 | infoEmpty: 'Inaonyesha 0 hadi 0 ya matokeo 0' 8 | infoFiltered: '(uschujo kutoka matokeo idadi _MAX_)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: 'Onyesha _MENU_ matokeo' 12 | loadingRecords: Inapakia... 13 | processing: Processing... 14 | search: 'Tafuta:' 15 | zeroRecords: 'Rekodi vinavyolingana haziku patikana' 16 | paginate: 17 | first: Mwanzo 18 | last: Mwisho 19 | next: Ijayo 20 | previous: Kabla 21 | aria: 22 | sortAscending: ': seti kulainisha sanjari kwa mtindo wa upandaji' 23 | sortDescending: ': seti kulainisha sanjari kwa mtindo wa mteremko' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.ta.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'அட்டவணையில் தரவு கிடைக்கவில்லை' 6 | info: 'உள்ளீடுகளை் _START_ முதல _END_ உள்ள _TOTAL_ காட்டும்' 7 | infoEmpty: '0 உள்ளீடுகளை 0 0 காட்டும்' 8 | infoFiltered: '(_MAX_ மொத்த உள்ளீடுகளை இருந்து வடிகட்டி)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: '_MENU_ காண்பி' 12 | loadingRecords: 'ஏற்றுகிறது ...' 13 | processing: 'செயலாக்க ...' 14 | search: 'தேடல்:' 15 | zeroRecords: 'பொருத்தமான பதிவுகள் இல்லை' 16 | paginate: 17 | first: முதல் 18 | last: இறுதி 19 | next: அடுத்து 20 | previous: முந்தைய 21 | aria: 22 | sortAscending: ': நிரலை ஏறுவரிசையில் வரிசைப்படுத்த செயல்படுத்த' 23 | sortDescending: ': நிரலை இறங்கு வரிசைப்படுத்த செயல்படுத்த' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.te.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'పట్టికలో డేటా లేదు.' 6 | info: 'మొత్తం _TOTAL_ ఎంట్రీలులో _START_ నుండి _END_ వరకు చూపిస్తున్నాం' 7 | infoEmpty: 'చూపిస్తున్నాం 0 నుండి 0 వరకు 0 ఎంట్రీలు లో' 8 | infoFiltered: '( _MAX_ ఎంట్రీలులో నుండి వడపోయాబడినవి)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: ' _MENU_ ఎంట్రీలు చూపించు' 12 | loadingRecords: 'లోడ్ అవుతుంది ...' 13 | processing: 'ప్రాసెస్ చేయబడుతుంది...' 14 | search: 'వెతుకు:' 15 | zeroRecords: 'మ్యాచింగ్ రికార్డులు లేవు' 16 | paginate: 17 | first: మొదటి 18 | last: చివరి 19 | next: తర్వాత 20 | previous: మునుపటి 21 | aria: 22 | sortAscending: ': నిలువరుసను ఆరోహణ క్రమం అమర్చండి' 23 | sortDescending: ': నిలువరుసను అవరోహణ క్రమం అమర్చండి' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.th.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: ไม่มีข้อมูลในตาราง 6 | info: 'แสดง _START_ ถึง _END_ จาก _TOTAL_ แถว' 7 | infoEmpty: 'แสดง 0 ถึง 0 จาก 0 แถว' 8 | infoFiltered: '(กรองข้อมูล _MAX_ ทุกแถว)' 9 | infoPostFix: '' 10 | infoThousands: ',' 11 | lengthMenu: 'แสดง _MENU_ แถว' 12 | loadingRecords: กำลังโหลดข้อมูล... 13 | processing: กำลังดำเนินการ... 14 | search: 'ค้นหา: ' 15 | zeroRecords: ไม่พบข้อมูล 16 | paginate: 17 | first: หน้าแรก 18 | previous: ก่อนหน้า 19 | next: ถัดไป 20 | last: หน้าสุดท้าย 21 | aria: 22 | sortAscending: ': เปิดใช้งานการเรียงข้อมูลจากน้อยไปมาก' 23 | sortDescending: ': เปิดใช้งานการเรียงข้อมูลจากมากไปน้อย' 24 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.tr.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: 3 | are_you_sure: Emin misiniz 4 | you_need_to_select_at_least_one_element: En az bir eleman seçmeniz gerekir. 5 | search: Bul 6 | execute: "Yürütme" 7 | ok: "OK" 8 | datatable: 9 | searchPlaceholder: "" 10 | emptyTable: "" 11 | info: " _TOTAL_ Kayıttan _START_ - _END_ Arası Kayıtlar" 12 | infoEmpty: "Kayıt Yok" 13 | infoFiltered: "( _MAX_ Kayıt İçerisinden Bulunan)" 14 | infoPostFix: "" 15 | infoThousands: "," 16 | lengthMenu: "Sayfada _MENU_ Kayıt Göster" 17 | loadingRecords: "" 18 | processing: "İşleniyor..." 19 | search: "Bul:" 20 | zeroRecords: "Eşleşen Kayıt Bulunmadı" 21 | paginate: 22 | first: "İlk" 23 | last: "Son" 24 | next: "Sonraki" 25 | previous: "Önceki" 26 | aria: 27 | sortAscending: ": activate to sort column ascending" 28 | sortDescending: ": activate to sort column descending" 29 | 30 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.ua.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: 3 | are_you_sure: Ти впевнений ? 4 | you_need_to_select_at_least_one_element: Ви повинні вибрати хоча б один елемент. 5 | search: Пошук 6 | execute: "виконувати" 7 | ok: "OK" 8 | datatable: 9 | searchPlaceholder: "" 10 | emptyTable: "" 11 | info: "Записи з _START_ по _END_ із _TOTAL_ записів" 12 | infoEmpty: "Записи з 0 по 0 із 0 записів" 13 | infoFiltered: "(відфільтровано з _MAX_ записів)" 14 | infoPostFix: "" 15 | infoThousands: "," 16 | lengthMenu: "Показати _MENU_ записів" 17 | loadingRecords: "" 18 | processing: "Зачекайте..." 19 | search: "Пошук:" 20 | zeroRecords: "Записи відсутні." 21 | paginate: 22 | first: "Перша" 23 | last: "Остання" 24 | next: "Наступна" 25 | previous: "Попередня" 26 | aria: 27 | sortAscending: ": активувати для сортування стовпців за зростанням" 28 | sortDescending: ": активувати для сортування стовпців за спаданням" 29 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.uk.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: Зачекайте... 6 | lengthMenu: 'Показати _MENU_ записів' 7 | zeroRecords: 'Записи відсутні.' 8 | info: 'Записи з _START_ по _END_ із _TOTAL_ записів' 9 | infoEmpty: 'Записи з 0 по 0 із 0 записів' 10 | infoFiltered: '(відфільтровано з _MAX_ записів)' 11 | infoPostFix: '' 12 | search: 'Пошук:' 13 | url: '' 14 | paginate: 15 | first: Перша 16 | previous: Попередня 17 | next: Наступна 18 | last: Остання 19 | aria: 20 | sortAscending: ': активувати для сортування стовпців за зростанням' 21 | sortDescending: ': активувати для сортування стовпців за спаданням' 22 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.ur.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: 'ہے جاري عملدرامد...' 6 | lengthMenu: 'دکہائين شقيں کي (_MENU_) فہرست' 7 | zeroRecords: 'ملے نہيں مفروضات جلتے ملتے کوئ' 8 | info: 'فہرست کي تک _END_ سے _START_ سے ميں _TOTAL_ فہرست پوري ہے نظر پيش' 9 | infoEmpty: 'فہرست کي تک 0 سے 0 سے ميں 0 قل ہے نظر پيشّ' 10 | infoFiltered: '(فہرست ہوئ چھني سے ميں _MAX_ قل)' 11 | infoPostFix: '' 12 | search: 'کرو تلاش:' 13 | url: '' 14 | paginate: 15 | first: پہلا 16 | previous: پچہلا 17 | next: اگلا 18 | last: آخري 19 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.uz.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | emptyTable: 'Ma''lumot yo''q' 6 | info: 'Umumiy _TOTAL_ yozuvlarlardan _START_ dan _END_ gachasi ko''rsatilmoqda' 7 | infoEmpty: 'Umumiy 0 yozuvlardan 0 dan 0 gachasi ko''rsatilmoqda' 8 | infoFiltered: '(_MAX_ yozuvlardan filtrlandi)' 9 | infoPostFix: '' 10 | lengthMenu: '_MENU_ ta yozuvlarni ko''rsat' 11 | loadingRecords: 'Yozuvlar yuklanmoqda...' 12 | processing: Ishlayapman... 13 | search: 'Izlash:' 14 | zeroRecords: 'Ma''lumot yo''q.' 15 | paginate: 16 | first: Birinchi 17 | previous: Avvalgi 18 | next: Keyingi 19 | last: 'Son''ggi' 20 | aria: 21 | sortAscending: ': to''g''ri tartiblash' 22 | sortDescending: ': teskari tartiblash' 23 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.vi.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: 'Đang xử lý...' 6 | lengthMenu: 'Xem _MENU_ mục' 7 | zeroRecords: 'Không tìm thấy dòng nào phù hợp' 8 | info: 'Đang xem _START_ đến _END_ trong tổng số _TOTAL_ mục' 9 | infoEmpty: 'Đang xem 0 đến 0 trong tổng số 0 mục' 10 | infoFiltered: '(được lọc từ _MAX_ mục)' 11 | infoPostFix: '' 12 | search: 'Tìm:' 13 | url: '' 14 | paginate: 15 | first: Đầu 16 | previous: Trước 17 | next: Tiếp 18 | last: Cuối 19 | -------------------------------------------------------------------------------- /src/Resources/translations/messages.zh.yml: -------------------------------------------------------------------------------- 1 | datatable: 2 | common: [] 3 | datatable: 4 | searchPlaceholder: '' 5 | processing: 处理中... 6 | lengthMenu: '显示 _MENU_ 项结果' 7 | zeroRecords: 没有匹配结果 8 | info: '显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项' 9 | infoEmpty: '显示第 0 至 0 项结果,共 0 项' 10 | infoFiltered: '(由 _MAX_ 项结果过滤)' 11 | infoPostFix: '' 12 | search: '搜索:' 13 | url: '' 14 | emptyTable: 表中数据为空 15 | loadingRecords: 载入中... 16 | infoThousands: ',' 17 | paginate: 18 | first: 首页 19 | previous: 上页 20 | next: 下页 21 | last: 末页 22 | aria: 23 | sortAscending: ': 以升序排列此列' 24 | sortDescending: ': 以降序排列此列' 25 | -------------------------------------------------------------------------------- /src/Resources/views/Column/twig_string.html.twig: -------------------------------------------------------------------------------- 1 | {{- include(template_from_string(column_template)) -}} 2 | -------------------------------------------------------------------------------- /src/Resources/views/Filter/select.html.twig: -------------------------------------------------------------------------------- 1 | 11 | -------------------------------------------------------------------------------- /src/Resources/views/Filter/select.js.twig: -------------------------------------------------------------------------------- 1 | $('#{{ datatable.name }}').on('stateLoaded.dt', function (e, settings, data) { 2 | $('#{{ datatable.name }}-column-{{ column.index }}').val(data.columns[{{ column.index }}].search.search); 3 | }); 4 | -------------------------------------------------------------------------------- /src/Resources/views/Filter/text.html.twig: -------------------------------------------------------------------------------- 1 | 9 | -------------------------------------------------------------------------------- /src/Resources/views/Filter/text.js.twig: -------------------------------------------------------------------------------- 1 | $('#{{ datatable.name }}').on('stateLoaded.dt', function (e, settings, data) { 2 | $('#{{ datatable.name }}-column-{{ column.index }}').val(data.columns[{{ column.index }}].search.search); 3 | }); 4 | -------------------------------------------------------------------------------- /src/Twig/TwigRenderer.php: -------------------------------------------------------------------------------- 1 | 24 | */ 25 | class TwigRenderer implements DataTableRendererInterface 26 | { 27 | private readonly Environment $twig; 28 | 29 | public function __construct(?Environment $twig = null) 30 | { 31 | if (null === $twig) { 32 | throw new MissingDependencyException('You must have symfony/twig-bundle installed to use the default Twig based DataTables rendering'); 33 | } 34 | $this->twig = $twig; 35 | } 36 | 37 | /** 38 | * @param array $parameters 39 | */ 40 | public function renderDataTable(DataTable $dataTable, string $template, array $parameters): string 41 | { 42 | $parameters['datatable'] = $dataTable; 43 | 44 | return $this->twig->render($template, $parameters); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /tests/Fixtures/.gitignore: -------------------------------------------------------------------------------- 1 | /data.sqlite 2 | /var 3 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/AppBundle.php: -------------------------------------------------------------------------------- 1 | 25 | */ 26 | class CustomQueryController extends AbstractController 27 | { 28 | public function tableAction(Request $request, DataTableFactory $dataTableFactory) 29 | { 30 | $datatable = $dataTableFactory->createFromType(CustomQueryTableType::class) 31 | ->setMethod(Request::METHOD_GET); 32 | if ($datatable->handleRequest($request)->isCallback()) { 33 | return $datatable->getResponse(); 34 | } 35 | 36 | throw new NotFoundHttpException('This exception must never be triggered'); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/Controller/GroupedController.php: -------------------------------------------------------------------------------- 1 | 26 | */ 27 | class GroupedController extends AbstractController 28 | { 29 | public function tableAction(Request $request, DataTableFactory $dataTableFactory): Response 30 | { 31 | $datatable = $dataTableFactory->createFromType(GroupedTableType::class) 32 | ->setName('companies') 33 | ->setMethod(Request::METHOD_GET) 34 | ; 35 | 36 | return $datatable->handleRequest($request)->getResponse(); 37 | } 38 | 39 | public function table2Action(Request $request, DataTableFactory $dataTableFactory): Response 40 | { 41 | $datatable = $dataTableFactory->createFromType(Grouped2TableType::class) 42 | ->setName('companies2') 43 | ->setMethod(Request::METHOD_GET) 44 | ; 45 | 46 | return $datatable->handleRequest($request)->getResponse(); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/Controller/HomeController.php: -------------------------------------------------------------------------------- 1 | 26 | */ 27 | class HomeController extends AbstractController 28 | { 29 | public function showAction(Request $request, DataTableFactory $dataTableFactory): Response 30 | { 31 | $datatable1 = $dataTableFactory->create(); 32 | $datatable1 33 | ->add('col1', TextColumn::class, ['label' => 'foo', 'field' => 'bar']) 34 | ->add('col2', TextColumn::class, ['label' => 'bar', 'field' => 'foo']) 35 | ; 36 | 37 | $datatable2 = $dataTableFactory->create(); 38 | $datatable2 39 | ->setName('noCDN') 40 | ->setMethod(Request::METHOD_GET) 41 | ->setLanguageFromCDN(false) 42 | ->add('col3', TextColumn::class, ['label' => 'foo', 'field' => 'bar']) 43 | ->add('col4', TextColumn::class, ['label' => 'bar', 'field' => 'foo']) 44 | ->createAdapter(ArrayAdapter::class) 45 | ; 46 | 47 | if ($datatable2->handleRequest($request)->isCallback()) { 48 | return $datatable2->getResponse(); 49 | } 50 | 51 | return $this->render('@App/home.html.twig', [ 52 | 'datatable1' => $datatable1, 53 | 'datatable2' => $datatable2, 54 | ]); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/Controller/ORMAdapterEventsController.php: -------------------------------------------------------------------------------- 1 | 27 | */ 28 | class ORMAdapterEventsController extends AbstractController 29 | { 30 | public const PRE_QUERY_RESULT_CACHE_ID = 'datatable_result_cache'; 31 | 32 | public function preQueryAction(Request $request, DataTableFactory $dataTableFactory): Response 33 | { 34 | $datatable = $dataTableFactory->create() 35 | ->add('firstName', TextColumn::class) 36 | ->add('lastName', TextColumn::class) 37 | ->add('company', TextColumn::class, ['field' => 'company.name']) 38 | ->createAdapter(ORMAdapter::class, [ 39 | 'entity' => Employee::class, 40 | ]) 41 | ->addEventListener(ORMAdapterEvents::PRE_QUERY, function (ORMAdapterQueryEvent $event) { 42 | $event->getQuery()->useResultCache(true, 0, self::PRE_QUERY_RESULT_CACHE_ID); 43 | }); 44 | 45 | return $datatable->handleRequest($request)->getResponse(); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/Controller/ServiceController.php: -------------------------------------------------------------------------------- 1 | 25 | */ 26 | class ServiceController extends AbstractController 27 | { 28 | public function tableAction(Request $request, DataTableFactory $dataTableFactory): Response 29 | { 30 | $datatable = $dataTableFactory->createFromType(ServicePersonTableType::class, [], ['order' => [[1, 'asc']]]) 31 | ->setName('persons') 32 | ->setMethod(Request::METHOD_GET) 33 | ; 34 | 35 | return $datatable->handleRequest($request)->getResponse(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/Controller/TranslationController.php: -------------------------------------------------------------------------------- 1 | setFallbackLocales([$request->getLocale()]); 32 | 33 | $datatable = $dataTableFactory->create(); 34 | $datatable 35 | ->setName($request->query->has('cdn') ? 'CDN' : 'noCDN') 36 | ->setMethod(Request::METHOD_GET) 37 | ->setLanguageFromCDN($request->query->has('cdn')) 38 | ->add('col3', TextColumn::class, ['label' => 'foo', 'field' => 'bar']) 39 | ->add('col4', TextColumn::class, ['label' => 'bar', 'field' => 'foo']) 40 | ->createAdapter(ArrayAdapter::class) 41 | ; 42 | 43 | if ($datatable->handleRequest($request)->isCallback()) { 44 | return $datatable->getResponse(); 45 | } 46 | 47 | return $this->render('@App/table.html.twig', [ 48 | 'datatable' => $datatable, 49 | ]); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/Controller/TypeController.php: -------------------------------------------------------------------------------- 1 | 26 | */ 27 | class TypeController extends AbstractController 28 | { 29 | public function tableAction(Request $request, DataTableFactory $dataTableFactory): Response 30 | { 31 | $datatable = $dataTableFactory->createFromType(RegularPersonTableType::class) 32 | ->setName('persons') 33 | ->setMethod(Request::METHOD_GET) 34 | ->addOrderBy(1, DataTable::SORT_ASCENDING) 35 | ; 36 | 37 | return $datatable->handleRequest($request)->getResponse(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/DataTable/Adapter/CustomORMAdapter.php: -------------------------------------------------------------------------------- 1 | setIdentifierPropertyPath(null); 28 | } 29 | 30 | protected function getResults(AdapterQuery $query): \Traversable 31 | { 32 | /** @var QueryBuilder $builder */ 33 | $builder = $query->get('qb'); 34 | $state = $query->getState(); 35 | 36 | // Apply definitive view state for current 'page' of the table 37 | foreach ($state->getOrderBy() as list($column, $direction)) { 38 | /** @var AbstractColumn $column */ 39 | if ($column->isOrderable()) { 40 | $builder->addOrderBy($column->getOrderField(), $direction); 41 | } 42 | } 43 | if (null !== $state->getLength()) { 44 | $builder 45 | ->setFirstResult($state->getStart()) 46 | ->setMaxResults($state->getLength()); 47 | } 48 | 49 | /* 50 | * Use foreach instead of iterate to prevent group by from crashing 51 | */ 52 | foreach ($builder->getQuery()->getResult($this->hydrationMode) as $result) { 53 | /* 54 | * Return everything instead of first element 55 | */ 56 | yield $result; 57 | } 58 | } 59 | 60 | protected function afterConfiguration(array $options): void 61 | { 62 | parent::afterConfiguration($options); 63 | 64 | $this->hydrationMode = $options['hydrate']; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/DataTable/Exporter/TxtExporter.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | class TxtExporter extends AbstractDataTableExporter 21 | { 22 | #[\Override] 23 | public function export(array $columnNames, \Iterator $data, array $columnOptions): \SplFileInfo 24 | { 25 | $filename = sys_get_temp_dir() . '/dt.txt'; 26 | $handle = fopen($filename, 'w'); 27 | 28 | fwrite($handle, implode(' ', $columnNames) . "\n"); 29 | 30 | foreach ($data as $datum) { 31 | fwrite($handle, implode(' ', $datum) . "\n"); 32 | } 33 | 34 | fclose($handle); 35 | 36 | return new \SplFileInfo($filename); 37 | } 38 | 39 | public function getMimeType(): string 40 | { 41 | return 'text/plain'; 42 | } 43 | 44 | public function getName(): string 45 | { 46 | return 'txt'; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/DataTable/Type/CustomQueryTableType.php: -------------------------------------------------------------------------------- 1 | 30 | */ 31 | class CustomQueryTableType implements DataTableTypeInterface 32 | { 33 | public function configure(DataTable $dataTable, array $options): void 34 | { 35 | $dataTable 36 | ->add('firstName', TextColumn::class) 37 | ->add('lastName', TwigColumn::class, ['template' => '@App/lastname_cell.html.twig']) 38 | ->add('fullName', TextColumn::class) 39 | ->add('company', TextColumn::class, ['field' => 'c.name']) 40 | ->createAdapter(ORMAdapter::class, [ 41 | 'entity' => Person::class, 42 | 'query' => function (QueryBuilder $builder) { 43 | $builder 44 | ->select('e') 45 | ->addSelect('c') 46 | ->from(Employee::class, 'e') 47 | ->leftJoin('e.company', 'c') 48 | ; 49 | }, 50 | 'criteria' => function (QueryBuilder $builder) { 51 | $builder->andWhere($builder->expr()->like('c.name', ':test'))->setParameter('test', '%ny 2%'); 52 | // $builder->addCriteria(Criteria::create()->andWhere(new Comparison('c.name', Comparison::CONTAINS, 'ny 2'))); 53 | }, 54 | ]) 55 | ; 56 | 57 | /** @var ORMAdapter $adapter */ 58 | $adapter = $dataTable->getAdapter(); 59 | $adapter->addCriteriaProcessor(function () { return Criteria::create()->where(new Comparison('firstName', Comparison::CONTAINS, '3')); }); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/DataTable/Type/Grouped2TableType.php: -------------------------------------------------------------------------------- 1 | 27 | */ 28 | class Grouped2TableType implements DataTableTypeInterface 29 | { 30 | public function configure(DataTable $dataTable, array $options): void 31 | { 32 | $dataTable 33 | ->add('company', TextColumn::class, ['propertyPath' => '[0][name]']) 34 | ->add('employeeCount', TextColumn::class, ['propertyPath' => '[employeeCount]']) 35 | ->createAdapter(CustomORMAdapter::class, [ 36 | 'entity' => Company::class, 37 | 'hydrate' => Query::HYDRATE_ARRAY, 38 | 'query' => function (QueryBuilder $builder) { 39 | $builder 40 | ->select('c') 41 | ->addSelect('count(e) AS employeeCount') 42 | ->from(Company::class, 'c') 43 | ->leftJoin('c.employees', 'e') 44 | ->groupBy('c.id') 45 | ; 46 | }, 47 | ]) 48 | ; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/DataTable/Type/GroupedTableType.php: -------------------------------------------------------------------------------- 1 | 27 | */ 28 | class GroupedTableType implements DataTableTypeInterface 29 | { 30 | public function configure(DataTable $dataTable, array $options): void 31 | { 32 | $dataTable 33 | ->add('name', TextColumn::class, ['field' => 'c.name']) 34 | ->add('employeeCount', TextColumn::class) 35 | ->createAdapter(ORMAdapter::class, [ 36 | 'entity' => Company::class, 37 | 'hydrate' => Query::HYDRATE_ARRAY, 38 | 'query' => function (QueryBuilder $builder) { 39 | $builder 40 | ->select('c') 41 | ->addSelect('count(e) AS employeeCount') 42 | ->from(Company::class, 'c') 43 | ->leftJoin('c.employees', 'e') 44 | ->groupBy('c.id') 45 | ; 46 | }, 47 | ]) 48 | ; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/DataTable/Type/ServicePersonTableType.php: -------------------------------------------------------------------------------- 1 | 28 | */ 29 | class ServicePersonTableType implements DataTableTypeInterface 30 | { 31 | /** @var RouterInterface */ 32 | private $router; 33 | 34 | /** 35 | * ServicePersonTableType constructor. 36 | */ 37 | public function __construct(RouterInterface $router) 38 | { 39 | $this->router = $router; 40 | } 41 | 42 | public function configure(DataTable $dataTable, array $options): void 43 | { 44 | $dataTable 45 | ->add('id', TextColumn::class, ['globalSearchable' => false]) 46 | ->add('firstName', TextColumn::class, ['label' => 'name']) 47 | ->add('lastName', TextColumn::class) 48 | ->add('fullName', TextColumn::class, ['label' => 'fullName']) 49 | ->add('company', TextColumn::class, ['label' => 'employer', 'field' => 'company.name']) 50 | ->add('link', TextColumn::class, [ 51 | 'data' => function (Person $person) { 52 | return sprintf('%s, %s', $this->router->generate('home'), $person->getLastName(), $person->getFirstName()); 53 | }, 54 | ]) 55 | ->setTransformer(function ($row, Employee $employee) { 56 | $row['fullName'] = sprintf('%s (%s)', $employee->getLastName(), $employee->getCompany()->getName()); 57 | 58 | return $row; 59 | }) 60 | ->createAdapter(ORMAdapter::class, [ 61 | 'entity' => Employee::class, 62 | 'criteria' => [ 63 | new SearchCriteriaProvider(), 64 | ], 65 | ]) 66 | ; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/Entity/Company.php: -------------------------------------------------------------------------------- 1 | */ 33 | #[OneToMany(mappedBy: 'company', targetEntity: Employee::class)] 34 | private Collection $employees; 35 | 36 | public function __construct(string $name) 37 | { 38 | $this->name = $name; 39 | $this->employees = new ArrayCollection(); 40 | } 41 | 42 | public function getId(): int 43 | { 44 | return $this->id; 45 | } 46 | 47 | public function getName(): string 48 | { 49 | return $this->name; 50 | } 51 | 52 | /** 53 | * @return Collection 54 | */ 55 | public function getEmployees(): Collection 56 | { 57 | return $this->employees; 58 | } 59 | 60 | public function setName(string $name): static 61 | { 62 | $this->name = $name; 63 | 64 | return $this; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/Entity/Employee.php: -------------------------------------------------------------------------------- 1 | company = $company; 34 | $this->employedSince = $employedSince; 35 | } 36 | 37 | public function getEmployedSince(): \DateTime 38 | { 39 | return $this->employedSince; 40 | } 41 | 42 | public function getCompany(): Company 43 | { 44 | return $this->company; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/Entity/Person.php: -------------------------------------------------------------------------------- 1 | firstName = $firstName; 36 | $this->lastName = $lastName; 37 | } 38 | 39 | public function getId(): int 40 | { 41 | return $this->id; 42 | } 43 | 44 | public function getFirstName(): string 45 | { 46 | return $this->firstName; 47 | } 48 | 49 | public function getLastName(): string 50 | { 51 | return $this->lastName; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/Resources/views/buttons.html.twig: -------------------------------------------------------------------------------- 1 | Edit 2 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/Resources/views/exporter.html.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Test server-side export 5 | 6 | 7 |
8 | 9 | 10 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/Resources/views/home.html.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Testpage 5 | 6 | 7 |

Table 1

8 |
9 |

Table 2

10 |
11 | 12 | 13 | 40 | 41 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/Resources/views/lastname_cell.html.twig: -------------------------------------------------------------------------------- 1 | {{ value }} 2 | -------------------------------------------------------------------------------- /tests/Fixtures/AppBundle/Resources/views/table.html.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Testpage 5 | 6 | 7 |

Table

8 |
9 | 10 | 11 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /tests/Fixtures/AppKernel.php: -------------------------------------------------------------------------------- 1 | 22 | */ 23 | class AppKernel extends Kernel 24 | { 25 | public function registerBundles(): array 26 | { 27 | return [ 28 | new \Symfony\Bundle\FrameworkBundle\FrameworkBundle(), 29 | new \Symfony\Bundle\TwigBundle\TwigBundle(), 30 | new \Doctrine\Bundle\DoctrineBundle\DoctrineBundle(), 31 | new \Omines\DataTablesBundle\DataTablesBundle(), 32 | new AppBundle\AppBundle(), 33 | ]; 34 | } 35 | 36 | public function registerContainerConfiguration(LoaderInterface $loader): void 37 | { 38 | $loader->load(__DIR__ . '/config.yml'); 39 | } 40 | 41 | public function getRootDir(): string 42 | { 43 | return __DIR__ . '/../../tmp'; 44 | } 45 | 46 | public function getProjectDir(): string 47 | { 48 | return __DIR__; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /tests/Fixtures/config.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: services.yml } 3 | 4 | framework: 5 | php_errors: 6 | log: true 7 | handle_all_throwables: true 8 | 9 | secret: '1234567890' 10 | router: 11 | utf8: true 12 | resource: '%kernel.project_dir%/routing.yml' 13 | strict_requirements: ~ 14 | default_locale: 'en' 15 | fragments: ~ 16 | translator: { fallbacks: [] } 17 | http_method_override: true 18 | test: ~ 19 | profiler: 20 | collect: false 21 | cache: 22 | pools: 23 | doctrine.result_cache_pool: 24 | adapter: cache.app 25 | doctrine.system_cache_pool: 26 | adapter: cache.system 27 | 28 | doctrine: 29 | dbal: 30 | driver: pdo_sqlite 31 | path: '%kernel.project_dir%/data.sqlite' 32 | 33 | orm: 34 | auto_generate_proxy_classes: '%kernel.debug%' 35 | naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware 36 | enable_lazy_ghost_objects: true 37 | 38 | auto_mapping: true 39 | report_fields_where_declared: true 40 | query_cache_driver: 41 | type: pool 42 | pool: doctrine.system_cache_pool 43 | result_cache_driver: 44 | type: pool 45 | pool: doctrine.result_cache_pool 46 | 47 | mappings: 48 | AppBundle: 49 | type: attribute 50 | 51 | controller_resolver: 52 | auto_mapping: true 53 | 54 | twig: 55 | debug: '%kernel.debug%' 56 | strict_variables: '%kernel.debug%' 57 | exception_controller: null 58 | 59 | datatables: 60 | options: 61 | pagingType: 'simple_numbers' 62 | lengthMenu : [10, 25, 50, 100, 250, 500, 1000, 2500, -1] 63 | pageLength: 50 64 | dom: "<'row' <'col-sm-12' tr>><'row' <'col-sm-6'l><'col-sm-6 text-right'pi>>" 65 | 66 | template_parameters: 67 | class_name: 'table table-striped data-table' 68 | -------------------------------------------------------------------------------- /tests/Fixtures/routing.yml: -------------------------------------------------------------------------------- 1 | home: 2 | path: / 3 | controller: Tests\Fixtures\AppBundle\Controller\HomeController::showAction 4 | 5 | plain: 6 | path: /plain 7 | controller: Tests\Fixtures\AppBundle\Controller\PlainController::tableAction 8 | 9 | type: 10 | path: /type 11 | controller: Tests\Fixtures\AppBundle\Controller\TypeController::tableAction 12 | 13 | service: 14 | path: /service 15 | controller: Tests\Fixtures\AppBundle\Controller\ServiceController::tableAction 16 | 17 | custom: 18 | path: /custom 19 | controller: Tests\Fixtures\AppBundle\Controller\CustomQueryController::tableAction 20 | 21 | grouped: 22 | path: /grouped 23 | controller: Tests\Fixtures\AppBundle\Controller\GroupedController::tableAction 24 | 25 | grouped2: 26 | path: /grouped2 27 | controller: Tests\Fixtures\AppBundle\Controller\GroupedController::table2Action 28 | 29 | employee.edit: 30 | path: /employee/{id} 31 | 32 | translation: 33 | path: /{_locale}/translation 34 | controller: Tests\Fixtures\AppBundle\Controller\TranslationController::tableAction 35 | 36 | orm_adapter_events.pre_query: 37 | path: /orm-adapter-events/pre-query 38 | controller: Tests\Fixtures\AppBundle\Controller\ORMAdapterEventsController::preQueryAction 39 | 40 | exporter: 41 | path: /exporter 42 | controller: Tests\Fixtures\AppBundle\Controller\ExporterController::exportAction 43 | 44 | exporter_empty_datatable: 45 | path: /exporter-empty-datatable 46 | controller: Tests\Fixtures\AppBundle\Controller\ExporterController::exportEmptyDataTableAction 47 | 48 | exporter_long_text: 49 | path: /exporter-long-text 50 | controller: Tests\Fixtures\AppBundle\Controller\ExporterController::exportLongText 51 | 52 | exporter_special_chars: 53 | path: /exporter-special-chars 54 | controller: Tests\Fixtures\AppBundle\Controller\ExporterController::exportSpecialChars 55 | 56 | exporter_with_types: 57 | path: /exporter-with-types 58 | controller: Tests\Fixtures\AppBundle\Controller\ExporterController::exportWithTypes 59 | -------------------------------------------------------------------------------- /tests/Fixtures/services.yml: -------------------------------------------------------------------------------- 1 | services: 2 | _defaults: 3 | autowire: true 4 | autoconfigure: true 5 | public: false 6 | 7 | Tests\Fixtures\AppBundle\: 8 | resource: 'AppBundle/{DataTable}' 9 | 10 | Tests\Fixtures\AppBundle\Controller\: 11 | resource: 'AppBundle/Controller' 12 | tags: ['controller.service_arguments'] 13 | 14 | twig.extension.string_loader: 15 | class: Twig\Extension\StringLoaderExtension 16 | tags: 17 | - { name: twig.extension } 18 | 19 | test.Omines\DataTablesBundle\Exporter\DataTableExporterCollection: '@Omines\DataTablesBundle\Exporter\DataTableExporterCollection' 20 | 21 | Tests\Fixtures\AppBundle\DataTable\Exporter\TxtExporter: 22 | tags: 23 | - datatables.exporter 24 | -------------------------------------------------------------------------------- /tests/Functional/Adapter/Doctrine/ORMAdapterEventsTest.php: -------------------------------------------------------------------------------- 1 | 23 | */ 24 | class ORMAdapterEventsTest extends WebTestCase 25 | { 26 | public function testPreQueryEvent(): void 27 | { 28 | $this->markTestSkipped('This test appears broken, likely due to Doctrine configuration'); 29 | 30 | $client = self::createClient(); 31 | 32 | /** @var DoctrineProvider $doctrineProvider */ 33 | $doctrineProvider = self::$kernel->getContainer()->get('doctrine')->getManager()->getConfiguration()->getResultCacheImpl(); 34 | $doctrineProvider->delete(ORMAdapterEventsController::PRE_QUERY_RESULT_CACHE_ID); 35 | 36 | $client->request('POST', '/orm-adapter-events/pre-query', ['_dt' => 'dt', '_init' => true]); 37 | 38 | static::assertTrue($doctrineProvider->contains(ORMAdapterEventsController::PRE_QUERY_RESULT_CACHE_ID)); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /tests/Functional/Exporter/Csv/CsvExporterTest.php: -------------------------------------------------------------------------------- 1 | 23 | */ 24 | class CsvExporterTest extends WebTestCase 25 | { 26 | private KernelBrowser $client; 27 | 28 | protected function setUp(): void 29 | { 30 | self::ensureKernelShutdown(); 31 | $this->client = self::createClient(); 32 | } 33 | 34 | public function testExport(): void 35 | { 36 | $this->client->request('POST', '/exporter', ['_dt' => 'dt', '_exporter' => 'csv']); 37 | 38 | /** @var BinaryFileResponse $response */ 39 | $response = $this->client->getResponse(); 40 | 41 | $csvFile = fopen($response->getFile()->getPathname(), 'r'); 42 | 43 | self::assertEquals(['dt.columns.firstName', 'dt.columns.lastName'], fgetcsv($csvFile, escape: '\\')); 44 | 45 | $i = 0; 46 | while (false !== ($row = fgetcsv($csvFile, escape: '\\'))) { 47 | self::assertEquals(['FirstName' . $i, 'LastName' . $i], $row); 48 | ++$i; 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /tests/Functional/Exporter/Event/DataTableExporterResponseEventTest.php: -------------------------------------------------------------------------------- 1 | 22 | */ 23 | class DataTableExporterResponseEventTest extends WebTestCase 24 | { 25 | /** @var KernelBrowser */ 26 | private $client; 27 | 28 | protected function setUp(): void 29 | { 30 | self::ensureKernelShutdown(); 31 | $this->client = self::createClient(); 32 | } 33 | 34 | #[DataProvider('exporterNameProvider')] 35 | public function testPreResponseEvent(string $exporterName, string $ext): void 36 | { 37 | $this->client->request('POST', '/exporter', ['_dt' => 'dt', '_exporter' => $exporterName]); 38 | 39 | /** @var BinaryFileResponse $response */ 40 | $response = $this->client->getResponse(); 41 | 42 | static::assertStringContainsString($response->headers->get('content-disposition'), sprintf('attachment; filename=custom_filename.%s', $ext)); 43 | } 44 | 45 | public static function exporterNameProvider(): array 46 | { 47 | return [ 48 | ['excel', 'xlsx'], 49 | ['txt', 'txt'], 50 | ]; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /tests/Unit/AdapterTest.php: -------------------------------------------------------------------------------- 1 | 24 | */ 25 | class AdapterTest extends KernelTestCase 26 | { 27 | public function testInvalidEntity(): void 28 | { 29 | $this->expectException(InvalidConfigurationException::class); 30 | $this->expectExceptionMessage('Doctrine has no valid entity manager for entity "foobar"'); 31 | 32 | /** @var Registry $registryMock */ 33 | $registryMock = $this->createMock(Registry::class); 34 | $adapter = new ORMAdapter($registryMock); 35 | $adapter->configure([ 36 | 'entity' => 'foobar', 37 | ]); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /tests/Unit/DependencyInjectionTest.php: -------------------------------------------------------------------------------- 1 | 28 | */ 29 | class DependencyInjectionTest extends TestCase 30 | { 31 | public function testConfiguration(): void 32 | { 33 | $config = new Configuration(); 34 | $tree = $config->getConfigTreeBuilder()->buildTree(); 35 | 36 | $this->assertInstanceOf(ArrayNode::class, $tree); 37 | } 38 | 39 | public function testExtension(): void 40 | { 41 | $bundle = new DataTablesBundle(); 42 | $extension = $bundle->getContainerExtension(); 43 | $this->assertSame('datatables', $extension->getAlias()); 44 | 45 | $container = new ContainerBuilder(); 46 | $extension->load([], $container); 47 | 48 | // Verify default config, options should be empty 49 | $config = $container->getParameter('datatables.config'); 50 | $this->assertTrue($config['language_from_cdn']); 51 | $this->assertEmpty($config['options']); 52 | } 53 | 54 | public function testInstantiatorTypeChecks(): void 55 | { 56 | $this->expectException(InvalidArgumentException::class); 57 | $this->expectExceptionMessage('must implement/extend ' . AdapterInterface::class); 58 | 59 | $instantiator = new Instantiator(); 60 | $instantiator->getAdapter(\DateTimeImmutable::class); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /tests/Unit/Exporter/DataTableExporterCollectionTest.php: -------------------------------------------------------------------------------- 1 | 22 | */ 23 | class DataTableExporterCollectionTest extends KernelTestCase 24 | { 25 | protected function setUp(): void 26 | { 27 | static::bootKernel(); 28 | } 29 | 30 | public function testUnknownExporter(): void 31 | { 32 | $this->expectException(UnknownDataTableExporterException::class); 33 | $this->getContainer() 34 | ->get('Omines\DataTablesBundle\Exporter\DataTableExporterCollection') 35 | ->getByName('unknown-exporter') 36 | ; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /tests/Unit/Exporter/DataTableExporterManagerTest.php: -------------------------------------------------------------------------------- 1 | 26 | */ 27 | class DataTableExporterManagerTest extends TestCase 28 | { 29 | public function testTranslatorInjection(): void 30 | { 31 | $exporterCollectionMock = $this->createMock(DataTableExporterCollection::class); 32 | 33 | static::expectException(\TypeError::class); 34 | new DataTableExporterManager($exporterCollectionMock, null); 35 | 36 | static::expectException(InvalidArgumentException::class); 37 | new DataTableExporterManager($exporterCollectionMock, $this->createMock(DataCollectorTranslator::class)); 38 | 39 | static::assertInstanceOf(DataTableExporterManager::class, new DataTableExporterManager($exporterCollectionMock, $this->createMock(TranslatorInterface::class))); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /tests/Unit/Exporter/ExcelExporterTest.php: -------------------------------------------------------------------------------- 1 | 23 | */ 24 | class ExcelExporterTest extends KernelTestCase 25 | { 26 | /** @var DataTableExporterCollection */ 27 | private $exporterCollection; 28 | 29 | protected function setUp(): void 30 | { 31 | $this->bootKernel(); 32 | 33 | $this->exporterCollection = $this->getContainer()->get(DataTableExporterCollection::class); 34 | } 35 | 36 | public function testTag(): void 37 | { 38 | $this->assertInstanceOf(ExcelExporter::class, $this->exporterCollection->getByName('excel')); 39 | } 40 | 41 | public function testName(): void 42 | { 43 | $this->assertSame('excel', $this->exporterCollection->getByName('excel')->getName()); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /tests/Unit/Exporter/ExcelOpenSpoutExporterTest.php: -------------------------------------------------------------------------------- 1 | bootKernel(); 27 | 28 | $this->exporterCollection = $this->getContainer()->get(DataTableExporterCollection::class); 29 | } 30 | 31 | public function testTag(): void 32 | { 33 | $this->assertInstanceOf(ExcelOpenSpoutExporter::class, $this->exporterCollection->getByName('excel-openspout')); 34 | } 35 | 36 | public function testName(): void 37 | { 38 | $this->assertSame('excel-openspout', $this->exporterCollection->getByName('excel-openspout')->getName()); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /tests/Unit/FilterTest.php: -------------------------------------------------------------------------------- 1 | 23 | */ 24 | class FilterTest extends TestCase 25 | { 26 | public function testChoiceFilter(): void 27 | { 28 | $filter = new ChoiceFilter(); 29 | 30 | // Test defaults 31 | $this->assertEmpty($filter->getChoices()); 32 | $this->assertNull($filter->getPlaceholder()); 33 | 34 | $filter->set([ 35 | 'choices' => ['foo' => 'bar', 'bar' => 'baz'], 36 | 'placeholder' => 'foobar', 37 | 'template_html' => 'foobar.html', 38 | ]); 39 | 40 | $this->assertTrue($filter->isValidValue('foo')); 41 | $this->assertFalse($filter->isValidValue('baz')); 42 | $this->assertCount(2, $filter->getChoices()); 43 | $this->assertSame('foobar', $filter->getPlaceholder()); 44 | $this->assertSame('foobar.html', $filter->getTemplateHtml()); 45 | $this->assertSame('@DataTables/Filter/select.js.twig', $filter->getTemplateJs()); 46 | } 47 | 48 | public function testTextFilter(): void 49 | { 50 | $filter = new TextFilter(); 51 | 52 | // Test defaults 53 | $this->assertNull($filter->getPlaceholder()); 54 | $this->assertTrue($filter->isValidValue('foo')); 55 | 56 | $filter->set([ 57 | 'template_js' => 'foobar.js', 58 | 'placeholder' => 'baz', 59 | ]); 60 | $this->assertSame('@DataTables/Filter/text.html.twig', $filter->getTemplateHtml()); 61 | $this->assertSame('foobar.js', $filter->getTemplateJs()); 62 | $this->assertSame('baz', $filter->getPlaceholder()); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /tests/Unit/Helper/InvalidEvent.php: -------------------------------------------------------------------------------- 1 | 21 | */ 22 | class InvalidEvent extends AbstractEvent 23 | { 24 | } 25 | -------------------------------------------------------------------------------- /tests/Unit/TwigTest.php: -------------------------------------------------------------------------------- 1 | 26 | */ 27 | class TwigTest extends TestCase 28 | { 29 | public function testExtensionName(): void 30 | { 31 | /** @var TranslatorInterface $translator */ 32 | $translator = $this->createMock(Translator::class); 33 | 34 | $twig = new DataTablesExtension($translator); 35 | $this->assertSame('DataTablesBundle', $twig->getName()); 36 | } 37 | 38 | public function testMissingTwigBundleThrows(): void 39 | { 40 | $this->expectException(MissingDependencyException::class); 41 | $this->expectExceptionMessage('You must have symfony/twig-bundle installed'); 42 | 43 | new TwigRenderer(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /tests/known-deprecations: -------------------------------------------------------------------------------- 1 | # Internal deprecations 2 | %Passing a negative value to the.*setStart% 3 | %with a length less than 1 is deprecated% 4 | -------------------------------------------------------------------------------- /tests/phpunit-bootstrap.php: -------------------------------------------------------------------------------- 1 | get('doctrine:schema:drop')->run(new StringInput('--force --quiet'), $output); 31 | $application->get('doctrine:schema:create')->run(new StringInput('--quiet'), $output); 32 | 33 | // Fill some basic fixtures 34 | $em = $kernel->getContainer()->get('doctrine')->getManager(); 35 | $companies = []; 36 | for ($i = 0; 5 !== $i; ++$i) { 37 | $companies[] = $company = new Company('Company ' . $i); 38 | $em->persist($company); 39 | } 40 | $date = new DateTime('2017-05-03 12:34:56'); 41 | for ($i = 0; 125 !== $i; ++$i) { 42 | $date->sub(new DateInterval('P3DT5H27M')); 43 | $em->persist(new Employee('FirstName' . $i, 'LastName' . $i, $i % 2 ? clone $date : null, $companies[$i % count($companies)])); 44 | } 45 | $em->flush(); 46 | --------------------------------------------------------------------------------