diff --git a/plugins/easy_gantt/Gemfile b/plugins/easy_gantt/Gemfile deleted file mode 100644 index 772940c268343a35ecb97816c338df3dec60a5f4..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/Gemfile +++ /dev/null @@ -1 +0,0 @@ -gem 'redmine_extensions' unless Dir.exist?(File.expand_path('../../easyproject', __FILE__)) diff --git a/plugins/easy_gantt/LICENSE b/plugins/easy_gantt/LICENSE deleted file mode 100644 index 1255e47665f3a5cbb114d8ef964a1a6fc32b09f3..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/LICENSE +++ /dev/null @@ -1,60 +0,0 @@ -LICENCE - -All Easy Redmine Extensions are distributed under GNU/GPL 2 license (see below). -If not otherwise stated, all images, cascading style sheets, and included JavaScript are NOT GPL, and are released under the Easy Redmine Commercial Use License (see below). - -GNU GENERAL PUBLIC LICENSE -Version 2, June 1991 -Copyright (C) 1989, 1991 Free Software Foundation, Inc. -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - -Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - -Preamble -The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. -When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. -To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. -For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. -We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. -Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. -Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. -The precise terms and conditions for copying, distribution and modification follow. - -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". -Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. -1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. -You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. -2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: -a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. -b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. -c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) -These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. -Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. -In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. -3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: -a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, -b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, -c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) -The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. -If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. -4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. -5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. -6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. -7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. -If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. -It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. -This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. -8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. -9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. -Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. -10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. -NO WARRANTY -11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. -12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -END OF TERMS AND CONDITIONS - -EASY REDMINE COMMERCIAL USE LICENSE -The Easy Redmine Commercial Use License is a GPL compatible license that pertains only to the images, cascading style sheets and JavaScript elements of Easy Redmine Themes and Styles produced by Easy Software Ltd. As stated by the GPL version 2.0 license, these elements of product that are not compiled together but are sent independently of GPL code, and combined in a client's browser, do not have to be GPL themselves. These images, cascading style sheets and JavaScript elements are copyright Easy Software Ltd. and can be used and manipulated for your own or if you have signed Easy Redmine Partner Agreement for your clients purposes. You cannot redistribute these files as your own, or include them in any package or extension of your own without prior consent of Easy Software Ltd. -Unauthorised distribution or making it accessible to a third party without prior Easy Software Ltd. consent, authorizes Easy Software Ltd. to invoice contractual penalty in the amount of 10 000 EUR for any breach of the this License. - diff --git a/plugins/easy_gantt/README.md b/plugins/easy_gantt/README.md deleted file mode 100644 index 93b6f5ae664efd22590aaf3ed0c341a7394a1bff..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Easy Gantt - -For documentation and requirements, go to https://www.easyredmine.com/redmine-gantt-plugin diff --git a/plugins/easy_gantt/after_init.rb b/plugins/easy_gantt/after_init.rb deleted file mode 100644 index 9d642986732bbf1229928549b0b8f190ede372d2..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/after_init.rb +++ /dev/null @@ -1,182 +0,0 @@ -easy_extensions = Redmine::Plugin.installed?(:easy_extensions) -app_dir = File.join(File.dirname(__FILE__), 'app') -lib_dir = File.join(File.dirname(__FILE__), 'lib', 'easy_gantt') - -# Redmine patches -patch_path = File.join(lib_dir, 'redmine_patch', '**', '*.rb') -Dir.glob(patch_path).each do |file| - require file -end - -ActiveSupport::Dependencies.autoload_paths << File.join(app_dir, 'models', 'queries') - -if easy_extensions - ActiveSupport::Dependencies.autoload_paths << File.join(app_dir, 'models', 'easy_queries') - EasyQuery.register(EasyGanttEasyIssueQuery) - EasyQuery.register(EasyGanttEasyProjectQuery) - - # RedmineExtensions::QueryOutput.whitelist_outputs_for_query 'EasyGanttEasyIssueQuery', 'list' - # RedmineExtensions::QueryOutput.whitelist_outputs_for_query 'EasyGanttEasyProjectQuery', 'list' - - Rails.application.configure do - config.assets.precompile.concat [ - proc { |logical_path, filename| - if logical_path.start_with?('easy_gantt/') - basename = File.basename(logical_path) - if basename.start_with?('_') - false - else - true - end - end - } - ] - end -end - -# this block is called every time rails are reloading code -# in development it means after each change in observed file -# in production it means once just after server has started -# in this block should be used require_dependency, but only if necessary. -# better is to place a class in file named by rails naming convency and let it be loaded automatically -# Here goes query registering, custom fields registering and so on -RedmineExtensions::Reloader.to_prepare do - require 'easy_gantt/easy_gantt' - require 'easy_gantt/hooks' - - RedmineExtensions::EasySettingPresenter.boolean_keys << :easy_gantt_show_holidays << :easy_gantt_show_project_progress << :easy_gantt_show_lowest_progress_tasks << :easy_gantt_show_task_soonest_start << :easy_gantt_relation_delay_in_workdays << :easy_gantt_fixed_delay -end - - -Redmine::MenuManager.map :top_menu do |menu| - menu.push(:easy_gantt, { controller: 'easy_gantt', action: 'index', set_filter: 0 }, - caption: :label_easy_gantt, - after: :documents, - html: { class: 'icon icon-stats' }, - if: proc { User.current.allowed_to_globally?(:view_global_easy_gantt) }) -end - -Redmine::MenuManager.map :project_menu do |menu| - menu.push(:easy_gantt, { controller: 'easy_gantt', action: 'index' }, - param: :project_id, - caption: :button_project_menu_easy_gantt, - if: proc { |p| User.current.allowed_to?(:view_easy_gantt, p) }) -end - -Redmine::MenuManager.map :easy_gantt_tools do |menu| - menu.push(:back, 'javascript:void(0)', - param: :project_id, - caption: :button_back, - html: { icon: 'icon-back' }) - - menu.push(:task_control, 'javascript:void(0)', - param: :project_id, - caption: :button_edit, - html: { icon: 'icon-edit' }) - - menu.push(:add_task, 'javascript:void(0)', - param: :project_id, - caption: :label_new, - html: { trial: true, icon: 'icon-add' }, - if: proc { |p| p.present? }) - - menu.push(:critical, 'javascript:void(0)', - param: :project_id, - caption: :'easy_gantt.button.critical_path', - html: { trial: true, icon: 'icon-summary' }, - if: proc { |p| p.present? }) - - menu.push(:baseline, 'javascript:void(0)', - param: :project_id, - caption: :'easy_gantt.button.create_baseline', - html: { trial: true, icon: 'icon-projects icon-project' }, - if: proc { |p| p.present? }) - - menu.push(:resource, proc { |project| defined?(EasyUserAllocations) ? { controller: 'user_allocation_gantt', project_id: project } : nil }, - param: :project_id, - caption: :'easy_gantt.button.resource_management', - html: { trial: true, icon: 'icon-stats', easy_text: defined?(EasyExtensions) }, - if: proc { |p| p.present? }) - -end - - -# this block is executed once just after Redmine is started -# means after all plugins are initialized -# it is place for plain requires, not require_dependency -# it should contain hooks, permissions - base class in Redmine is required thus is not reloaded -ActiveSupport.on_load(:easyproject, yield: true) do - - if easy_extensions - Redmine::MenuManager.map :projects_easy_page_layout_service_box do |menu| - menu.push(:project_easy_gantt, :easy_gantt_path, - caption: :label_easy_gantt, - html: { class: 'icon icon-stats button button-2' }, - if: proc { User.current.allowed_to_globally?(:view_global_easy_gantt) }) - end - - Redmine::MenuManager.map :easy_quick_top_menu do |menu| - menu.push(:project_easy_gantt, { controller: 'easy_gantt', action: 'index', id: nil, set_filter: 0 }, - caption: :label_easy_gantt, - parent: :projects, - html: { class: 'icon icon-stats' }, - if: proc { User.current.allowed_to_globally?(:view_global_easy_gantt) }) - - menu.push(:issues_easy_gantt, { controller: 'easy_gantt', action: 'index', id: nil, set_filter: 0 }, - caption: :label_easy_gantt, - parent: :issues, - html: { class: 'icon icon-stats project-gantt' }, - if: proc { User.current.allowed_to_globally?(:view_global_easy_gantt) }) - end - end - -end - -RedmineExtensions::Reloader.to_prepare do - - Redmine::AccessControl.map do |map| - map.project_module :easy_gantt do |pmap| - # View project level - pmap.permission(:view_easy_gantt, { - easy_gantt: [:index, :issues, :projects], - easy_gantt_pro: [:lowest_progress_tasks, :cashflow_data], - easy_gantt_resources: [:index, :project_data, :users_sums, :projects_sums, :allocated_issues], - easy_resource_limits: [:index] - }, read: true) - - # Edit project level - pmap.permission(:edit_easy_gantt, { - easy_gantt: [:change_issue_relation_delay, :reschedule_project], - easy_gantt_resources: [:bulk_update_or_create], - easy_resource_limits: [:new, :create, :edit, :update, :destroy] - }, require: :member) - - # View global level - pmap.permission(:view_global_easy_gantt, { - easy_gantt: [:index, :issues, :projects, :project_issues], - easy_gantt_pro: [:lowest_progress_tasks, :cashflow_data], - easy_gantt_resources: [:index, :project_data, :global_data, :projects_sums, :allocated_issues], - easy_resource_limits: [:index] - }, global: true, read: true) - - # Edit global level - pmap.permission(:edit_global_easy_gantt, { - easy_gantt_resources: [:bulk_update_or_create], - easy_resource_limits: [:new, :create, :edit, :update, :destroy] - }, global: true, require: :loggedin) - - # View personal level - # pmap.permission(:view_personal_easy_gantt, { - # easy_gantt_resources: [:global_data], - # easy_resource_limits: [:index] - # }, global: true, read: true) - - # Edit personal level - pmap.permission(:edit_personal_easy_gantt, { - easy_gantt_resources: [:bulk_update_or_create], - easy_resource_limits: [:new, :create, :edit, :update, :destroy] - }, global: true, require: :loggedin) - end - end - -end diff --git a/plugins/easy_gantt/app/controllers/easy_gantt_controller.rb b/plugins/easy_gantt/app/controllers/easy_gantt_controller.rb deleted file mode 100644 index 61cb0235e01d67db32e812b2c82fe393b375079b..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/app/controllers/easy_gantt_controller.rb +++ /dev/null @@ -1,267 +0,0 @@ -class EasyGanttController < ApplicationController - accept_api_auth :index, :issues, :projects, :project_issues, :change_issue_relation_delay, :reschedule_project - menu_item :easy_gantt - - RELATION_TYPES_TO_LOAD = ['relates', 'blocks', 'blocked', 'precedes', 'follows', 'start_to_start', 'finish_to_finish', 'start_to_finish'] - - before_action :find_optional_project, except: [:reschedule_project, :project_issues] - before_action :find_opened_project, except: [:reschedule_project] - - before_action :authorize, if: proc { @project.present? } - before_action :authorize_global, if: proc { @project.nil? } - - before_action :check_rest_api_enabled, only: [:index] - before_action :find_relation, only: [:change_issue_relation_delay] - - include_query_helpers - helper :custom_fields - - def index - retrieve_query - end - - # Data retrieve method - def issues - retrieve_query - - load_projects - load_issues - load_versions - load_relations - build_dates @issues, :start_date, :due_date - end - - # Data retrieve method - def projects - retrieve_query - - load_projects - build_dates @projects, :gantt_start_date, :gantt_due_date - - @projects_issues_counts = Issue.visible.gantt_opened.where(project_id: @projects).group(:project_id).count(:id) - end - - def project_issues - # TODO: Global route to skip rights - @issues = Issue.visible.gantt_opened.where(project_id: params[:project_id]).order(:start_date) - @issue_ids = @issues.map(&:id) - load_relations - - version_ids = @issues.map(&:fixed_version_id).uniq.compact - @versions = Version.open.where('id IN (?) OR project_id = ?', version_ids, params[:project_id]).sorted - end - - def change_issue_relation_delay - if !User.current.allowed_to?(:manage_issue_relations, @project) - return render_403 - end - - @relation.update_column(:delay, params[:delay].to_i) - - respond_to do |format| - format.api { render_api_ok } - end - end - - # You cannot use issue.reschedule_on because it will - # also set start_date which is not desirable !!! - def reschedule_project - begin - # Do not used callback `find_project` because it will test access rights - # to project context. Method wont work if project does not have gantt enabled. - project = Project.find(params[:id]) - rescue ActiveRecord::RecordNotFound - render_404 - return - end - - project.gantt_reschedule(params[:days].to_i) - - respond_to do |format| - format.api { render_api_ok } - end - end - - def current_menu_item - @current_menu_item ||= if params[:gantt_type] == 'rm' - :resource - else - :easy_gantt - end - end - - private - - def check_rest_api_enabled - if Setting.rest_api_enabled != '1' - render_error message: l('easy_gantt.errors.no_rest_api') - return false - end - end - - def find_relation - @relation = IssueRelation.find(params[:id]) - rescue ActiveRecord::RecordNotFound - render_404 - end - - def query_class - if EasyGantt.easy_extensions? - @project ? EasyGanttEasyIssueQuery : EasyGanttEasyProjectQuery - else - @project ? EasyGantt::EasyGanttIssueQuery : EasyGanttProjectQuery - end - end - - def retrieve_query - if params[:query_id].present? - cond = 'project_id IS NULL' - - if @project - cond << " OR project_id = #{@project.id}" - - # In Easy Project query can be defined for subprojects - if !@project.root? && EasyGantt.easy_extensions? - ancestors = @project.ancestors.select(:id).to_sql - cond << " OR (is_for_subprojects = #{Project.connection.quoted_true} AND project_id IN (#{ancestors}))" - end - end - - @query = query_class.where(cond).find_by(id: params[:query_id]) - raise ActiveRecord::RecordNotFound if @query.nil? - raise Unauthorized unless @query.visible? - - @query.project = @project - sort_clear - else - @query = query_class.new(name: '_') - @query.project = @project - @query.from_params(params) - end - - if @opened_project - @query.opened_project = @opened_project - end - end - - # Load version from loaded task and from opened projects - # TO_CONSIDER: Send versions if there is no tasks? - def load_versions - version_ids = @issues.map(&:fixed_version_id).uniq.compact - @versions = Version.open.where("id IN (?) OR project_id = ?", version_ids, @opened_project.id).sorted - end - - # Load subproject of opened project which contains filtered tasks - # - # Project 1 - # |-- Project 1.1 - # | `-- Project 1.1.1 - # | |-- Task 1 - # | `-- Task 2 - # `-- Project 1.2 - # - # If Project 1 is opened, Project 1.1 must be send even if there is no task - # - # TO_CONSIDER: Send full tree and load only opened_project's issues - # - def load_projects - p_table = Project.table_name - - @projects = [] - - # Project gantt is opened, normally only subprojects will be sent - # but there is not any root project yet - if @project && @opened_project == @project - @projects << @project - end - - projects = @query.without_opened_project { |q| - scope = q.create_entity_scope - - # Not necessary, will take only subprojects - if @opened_project - scope = scope.where("#{p_table}.lft >= ? AND #{p_table}.rgt <= ?", @opened_project.lft, @opened_project.rgt) - end - - scope.distinct.pluck("#{p_table}.lft, #{p_table}.rgt, #{p_table}.parent_id") - } - - if projects.blank? - return - end - - # All ancestors conditions - tree_conditions = [] - projects.each do |lft, rgt| - tree_conditions << "(lft <= #{lft} AND rgt >= #{rgt})" - end - tree_conditions = tree_conditions.join(' OR ') - - @parent_ids = projects.map(&:last) - - # From ancestors take only current opened level - @projects.concat Project.where(tree_conditions).where(parent_id: @opened_project.try(:id)).to_a - - Project.load_gantt_dates(@projects) - if EasySetting.value(:easy_gantt_show_project_progress) - Project.load_gantt_completed_percent(@projects) - end - end - - # Only between loaded tasks - def load_relations - if @issue_ids.empty? - @relations = [] - else - @relations = IssueRelation.where('issue_from_id IN (?) OR issue_to_id IN (?)', @issue_ids, @issue_ids). - where(relation_type: RELATION_TYPES_TO_LOAD) - end - end - - def load_issues - preloads = [:project, :author, :assigned_to, :relations_to] - - if EasySetting.value(:easy_gantt_show_task_soonest_start) - preloads << :parent - preloads << { relations_to: :issue_from } - else - preloads << :relations_to - end - - @issues = @query.entities( - includes: [:project, :status, :assigned_to, :fixed_version, :tracker, :priority, :custom_values], - preload: preloads, - order: "#{Issue.table_name}.start_date, #{Issue.table_name}.id" - ) - - @issue_ids = @issues.map(&:id) - end - - def build_dates(data, starts, ends) - starts = data.map(&starts).compact - ends = data.map(&ends).compact - - @start_date = (starts.min || ends.min || Date.today) - 1.day - @end_date = (ends.max || starts.max || Date.today) + 1.day - end - - def find_optional_project - # Easy query workaround - if params[:set_filter] == '1' && params[:project_id].present? && params[:project_id].start_with?('=', '!*', '*') - return - end - - super - end - - def find_opened_project - if params[:opened_project_id].present? - @opened_project = Project.find(params[:opened_project_id]) - else - @opened_project = @project - end - rescue ActiveRecord::RecordNotFound - render_404 - end - -end diff --git a/plugins/easy_gantt/app/helpers/easy_gantt_helper.rb b/plugins/easy_gantt/app/helpers/easy_gantt_helper.rb deleted file mode 100644 index 86c5ece6f4dad4ce0fbd54a2cbd6fc2295879a16..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/app/helpers/easy_gantt_helper.rb +++ /dev/null @@ -1,267 +0,0 @@ -module EasyGanttHelper - - def easy_gantt_include_js(*javascripts, from_plugin: 'easy_gantt') - plugin = (EasyGantt.easy_extensions? ? nil : from_plugin) - - result = '' - javascripts.flatten! - javascripts.compact! - javascripts.each do |javascript| - result << javascript_include_tag("#{from_plugin}/#{javascript}", plugin: plugin) - end - result.html_safe - end - - def easy_gantt_include_css(*stylesheets, media: 'screen', from_plugin: 'easy_gantt') - plugin = (EasyGantt.easy_extensions? ? nil : from_plugin) - - result = '' - stylesheets.flatten! - stylesheets.compact! - stylesheets.each do |stylesheet| - result << stylesheet_link_tag("#{from_plugin}/#{stylesheet}", plugin: plugin, media: media) - end - result.html_safe - end - - def easy_gantt_js_button(text, options={}) - if text.is_a?(Symbol) - lang_key = text - text = l(lang_key, scope: [:easy_gantt, :button]) - options[:title] ||= l(lang_key, scope: [:easy_gantt, :title], default: text) - end - options[:class] = "gantt-menu-button #{options[:class]}" - options[:class] << ' button' unless options.delete(:no_button) - if (icon = options.delete(:icon)) - options[:class] << " icon #{icon}" - end - link_to(text, options[:url] || 'javascript:void(0)', options) - end - - def easy_gantt_help_button(*args) - options = args.extract_options! - feature = args.shift - text = args.shift - - options[:class] = "gantt-menu-help-button #{options[:class]}" - options[:icon] ||= 'icon-help' - options[:id] = 'button_' + feature.to_s + '_help' - - help_text = raw l(options.delete(:easy_text) ? :easy_text : :text, scope: [:easy_gantt, :popup, feature]) - - easy_gantt_js_button(text || '​'.html_safe, options) + %Q( - <div id="#{feature}_help_modal" style="display:none"> - <h3 class="title">#{raw l(:heading, scope: [:easy_gantt, :popup, feature]) }</h3> - <p>#{help_text}</p> - </div> - ).html_safe - end - - def api_render_versions(api, versions) - return if versions.blank? - - api.array :versions do - versions.each do |version| - api.version do - api.id version.id - api.name version.name - api.start_date version.effective_date - api.project_id version.project_id - api.permissions do - api.editable version.gantt_editable? - end - end - end - end - - end - - def api_render_columns(api, query) - api.array :columns do - query.columns.each do |c| - api.column do - api.name c.name - api.title c.caption - end - end - end - end - - def api_render_scheme(api, table) - if table.is_a?(Symbol) - if Object.const_defined?(table) - table = Object.const_get(table) - else - return - end - end - - return unless table.column_names.include?('easy_color_scheme') - - col = table.arel_table[:easy_color_scheme] - records = table.where(col.not_eq(nil).and(col.not_eq(''))).pluck(:id, :easy_color_scheme) - - api.array table.to_s do - records.each do |id, scheme| - api.entity do - api.id id - api.scheme scheme - end - end - end - end - - def api_render_holidays(api, startdt, enddt) - wc = User.current.try(:current_working_time_calendar) - return if wc.nil? - - api.array :holidays do - startdt.upto(enddt) do |date| - api.date date if wc.holiday?(date) - end - end - - end - - def api_render_issues(api, issues, with_columns: false) - api.array :issues do - issues.each do |issue| - api.issue do - api.id issue.id - api.name issue.subject - api.start_date issue.start_date - api.due_date issue.due_date - api.estimated_hours issue.estimated_hours - api.done_ratio issue.done_ratio - api.closed issue.closed? - api.fixed_version_id issue.fixed_version_id - api.overdue issue.overdue? - api.parent_issue_id issue.parent_id - api.project_id issue.project_id - api.tracker_id issue.tracker_id - api.priority_id issue.priority_id - api.status_id issue.status_id - api.assigned_to_id issue.assigned_to_id - - if EasySetting.value(:easy_gantt_show_task_soonest_start) && @project.nil? - api.soonest_start issue.soonest_start - end - if EasySetting.value(:easy_gantt_show_task_latest_due) && @project.nil? - api.latest_due issue.latest_due - end - - api.is_planned !!issue.project.try(:is_planned) - - api.permissions do - api.editable issue.gantt_editable? - end - - if with_columns - api.array :columns do - @query.columns.each do |c| - api.column do - api.name c.name - api.value gantt_format_column(issue, c, c.value(issue)) - end - end - end - end - - end - end - end - end - - def api_render_relations(api, relations) - api.array :relations do - relations.each do |rel| - api.relation do - api.id rel.id - api.source_id rel.issue_from_id - api.target_id rel.issue_to_id - api.type rel.relation_type - api.delay rel.delay.to_i - end - end - end - end - - def api_render_projects(api, projects, with_columns: false) - api.array :projects do - projects.each do |project| - api.project do - api.id project.id - api.name project.name - api.start_date project.gantt_start_date || Date.today - api.due_date project.gantt_due_date || Date.today - api.parent_id project.parent_id - api.is_baseline project.try(:easy_baseline_for_id?) - - # Schema - api.status_id project.status - api.priority_id project.try(:easy_priority_id) - - api.permissions do - api.editable project.gantt_editable? - end - - if EasySetting.value(:easy_gantt_show_project_progress) - api.done_ratio project.gantt_completed_percent - end - - if @projects_issues_counts && @projects_issues_counts.has_key?(project.id) - api.issues_count @projects_issues_counts[project.id] - end - - if @parent_ids && @parent_ids.include?(project.id) - api.has_subprojects true - end - - if with_columns - api.array :columns do - @query.columns.each do |c| - api.column do - api.name c.name - api.value gantt_format_column(project, c, c.value(project)) - end - end - end - end - - end - end - end - end - - # This method exist because - # 1. EntityAttributeHelper is for complex html formating - # 2. Redmine doest not have it - # Gantt should show light and non-html values - def gantt_format_column(entity, column, value) - if entity.is_a?(Project) && column.name == :status && respond_to?(:format_project_attribute) - format_project_attribute(Project, column, value) - elsif value.is_a?(Float) - locale = User.current.language.presence || ::I18n.locale - number_with_precision(value, locale: locale).to_s - elsif value.is_a?(Array) - value.join(', ') - else - value.to_s - end - end - - def prepare_test_includes(tests) - includes = [] - tests.each do |test_file| - plugin = 'easy_gantt' - if test_file.include?('/') - split = test_file.split('/') - plugin = split[0] - test_file = split[1] - end - includes << [test_file, plugin] - end - includes - end - -end diff --git a/plugins/easy_gantt/app/models/easy_gantt/easy_gantt_issue_query.rb b/plugins/easy_gantt/app/models/easy_gantt/easy_gantt_issue_query.rb deleted file mode 100644 index 580a954f48580468b2a7457bf42b34a948289cb0..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/app/models/easy_gantt/easy_gantt_issue_query.rb +++ /dev/null @@ -1,82 +0,0 @@ -module EasyGantt - class EasyGanttIssueQuery < IssueQuery - - attr_accessor :entity_scope - attr_accessor :opened_project - - def default_columns_names - [:subject, :priority, :assigned_to] - end - - def entity - Issue - end - - def from_params(params) - build_from_params(params) - end - - def to_params - params = { set_filter: 1, type: self.class.name, f: [], op: {}, v: {} } - - filters.each do |filter_name, opts| - params[:f] << filter_name - params[:op][filter_name] = opts[:operator] - params[:v][filter_name] = opts[:values] - end - - params[:c] = column_names - params - end - - def to_partial_path - 'easy_gantt/easy_queries/show' - end - - def initialize_available_filters - super - @available_filters.delete('subproject_id') - end - - def entity_scope - @entity_scope ||= begin - scope = Issue.visible - if Project.column_names.include? 'easy_baseline_for_id' - scope = scope.where(Project.table_name => {easy_baseline_for_id: nil}) - end - scope - end - end - - def create_entity_scope(options={}) - entity_scope.includes(options[:includes]). - references(options[:includes]). - preload(options[:preload]). - where(statement). - where(options[:conditions]) - end - - def entities(options={}) - create_entity_scope(options).order(options[:order]) - end - - def project_statement - p_table = Project.table_name - - conditions = "#{p_table}.status = #{Project::STATUS_ACTIVE}" - if opened_project - conditions = "#{conditions} AND #{Project.table_name}.id = #{opened_project.id}" - end - conditions - end - - def without_opened_project - _opened_project = opened_project - self.opened_project = nil - yield self - ensure - self.opened_project = _opened_project - end - - end -end diff --git a/plugins/easy_gantt/app/models/queries/easy_gantt_project_query.rb b/plugins/easy_gantt/app/models/queries/easy_gantt_project_query.rb deleted file mode 100644 index 8ebf9decbf59393bb6de3da29b07d5cf73fa882a..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/app/models/queries/easy_gantt_project_query.rb +++ /dev/null @@ -1,90 +0,0 @@ -class EasyGanttProjectQuery < Query - - attr_accessor :opened_project - - self.queried_class = Project - - self.available_columns = [ - QueryColumn.new(:name, sortable: "#{Project.table_name}.name"), - QueryColumn.new(:created_on, sortable: "#{Project.table_name}.created_on"), - QueryColumn.new(:updated_on, sortable: "#{Project.table_name}.updated_on"), - ] - - def initialize(*args) - super - self.filters ||= {} - end - - def default_columns_names - [:name] - end - - def initialize_available_filters - add_available_filter 'name', type: :text - add_available_filter 'created_on', type: :date_past - add_available_filter 'updated_on', type: :date_past - end - - def from_params(params) - build_from_params(params) - end - - def to_params - params = { set_filter: 1, type: self.class.name, f: [], op: {}, v: {} } - - filters.each do |filter_name, opts| - params[:f] << filter_name - params[:op][filter_name] = opts[:operator] - params[:v][filter_name] = opts[:values] - end - - params[:c] = column_names - params - end - - def to_partial_path - 'easy_gantt/easy_queries/show' - end - - def entities(options={}) - scope = Project.active.visible - - if Project.column_names.include?('easy_baseline_for_id') - scope = scope.where(Project.table_name => { easy_baseline_for_id: nil }) - end - - scope = scope.includes(options[:includes]). - references(options[:includes]). - preload(options[:preload]). - where(statement). - where(options[:conditions]). - order(options[:order]) - - if opened_project - scope = scope(projects: { id: opened_project.id }) - end - - scope.to_a - end - - def entity_scope - Project.visible - end - - def create_entity_scope(options={}) - entity_scope.includes(options[:includes]). - references(options[:includes]). - preload(options[:preload]). - where(statement). - where(options[:conditions]) - end - - def without_opened_project - _opened_project = opened_project - self.opened_project = nil - yield self - ensure - self.opened_project = _opened_project - end - -end diff --git a/plugins/easy_gantt/app/views/easy_gantt/_already_active_error.html.erb b/plugins/easy_gantt/app/views/easy_gantt/_already_active_error.html.erb deleted file mode 100644 index e2180455978b70c27c9b4a0036e96ad277b281e5..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/app/views/easy_gantt/_already_active_error.html.erb +++ /dev/null @@ -1,3 +0,0 @@ -<p class="error"> - <%= l(:error_epm_easy_gantt_already_active) %> -</p> diff --git a/plugins/easy_gantt/app/views/easy_gantt/_includes.html.erb b/plugins/easy_gantt/app/views/easy_gantt/_includes.html.erb deleted file mode 100644 index 0a5f22e45f534e2b591fcc40b614f38dab031ca9..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/app/views/easy_gantt/_includes.html.erb +++ /dev/null @@ -1,56 +0,0 @@ -<% - heads_for_wiki_formatter - - if EasyGantt.easy_extensions? - main_css = 'easy_gantt' - else - main_css = 'generated/easy_gantt' - end -%> - -<%= content_for :header_tags do %> - <%= easy_gantt_include_css(main_css, media: 'all') %> - <% if EasyGantt.combine_by_pipeline?(params) %> - <%= javascript_include_tag('easy_gantt/easy_gantt') %> - <% else %> - <%= easy_gantt_include_js( - 'utils', - 'dhtmlxgantt', - 'dhtmlxgantt_marker', - 'main', - 'data', - 'loader', - 'saver', - 'logger', - 'widget', - 'panel_widget', - 'gantt_widget', - 'view', - 'history', - 'dhtml_modif', - 'dhtml_addons', - 'dhtml_rewrite', - ('dhtml_relations' if Setting.parent_issue_dates === "derived"), - 'background', - 'pro_manager', - 'storage', - 'tooltip', - 'toolpanel', - 'print', - 'left_grid', - 'sumrow', - 'bars', - 'problem_finder', - 'collapsor', - 'libs/libs', - 'libs/svg.min', - ) %> - <% end %> - <%= easy_gantt_include_js( - ('sample' unless EasyGantt.easy_gantt_pro?), - ('libs/moment' unless EasyGantt.easy_extensions?) - ) %> - <script type="application/javascript"> - $(ysy.initGantt); - </script> -<% end %> diff --git a/plugins/easy_gantt/app/views/easy_gantt/_js_prepare.html.erb b/plugins/easy_gantt/app/views/easy_gantt/_js_prepare.html.erb deleted file mode 100644 index c46c3f10ec3445bc268e0f7c534e50120ef13501..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/app/views/easy_gantt/_js_prepare.html.erb +++ /dev/null @@ -1,149 +0,0 @@ -<%= content_for :header_tags do %> - <script type="text/javascript"> - window.ysy = window.ysy || {}; - ysy.settings = ysy.settings || {}; - $.extend(true, ysy.settings, <%= { - platform: EasyGantt.platform, - easyRedmine: EasyGantt.easy_extensions?, - isGantt: (params[:controller] == 'easy_gantt'), - language: I18n.locale.to_s, - project: ({ id: @project.id, name: @project.name } if @project), - dateFormat: (Setting.date_format.presence || I18n.t('date.formats.default')), - nonWorkingWeekDays: EasyGantt.non_working_week_days, - holidays: [], - milestonePush: ((EasyGantt.easy_extensions? && !EasySetting.value('milestone_effective_date_from_issue_due_date')) ? true : false), - workDayDelays: EasySetting.value(:easy_gantt_relation_delay_in_workdays), - fixedRelations: false && EasySetting.value(:easy_gantt_fixed_delay), - defaultZoom: EasySetting.value(:easy_gantt_default_zoom), - paths: { - rootPath: home_path - }, - labels: { - buttons: { - button_delete: l(:button_delete), - button_submit: l(:button_submit), - button_yes: l(:general_text_Yes), - button_no: l(:general_text_No), - button_cancel: l(:button_cancel), - button_reload: l('easy_gantt.button.reload'), - button_save: l(:button_save) - }, - sample_text: l('easy_gantt.sample.text').html_safe, - sample_global_free_text: l('easy_gantt.sample_global_free.text').html_safe, - date: { - month_full: Array(l('date.month_names')).compact, - month_short: Array(l('date.abbr_month_names')).compact, - day_full: Array(l('date.day_names')).compact, - day_short: Array(l('date.abbr_day_names')).compact - }, - types: { - project: l(:field_project), - issue: l(:field_issue), - milestone: l(:field_version), - relation: l(:field_relation) - }, - errors: Array(l('activerecord.errors.messages')).compact, - errors2: { - unsaved_parent: l('easy_gantt.errors.unsaved_parent') - }, - problems: { - overMilestone: l('easy_gantt.errors.overmile'), - too_short: l('easy_gantt.errors.too_short'), - overdue: l('easy_gantt.errors.overdue'), - progressDateOverdue: l('easy_gantt.errors.progress_date_overdue'), - shortDelay: l('easy_gantt.errors.short_delay') - }, - gateway: { - sendFailed: l('easy_gantt.gateway.send_failed'), - entitySaveFailed: l('easy_gantt.gateway.entity_save_failed'), - allSended: l(:notice_successful_update) - }, - titles: { - easyGantt: l(:heading_easy_gantts_issues) - } - }, - styles: { - backgrounds:{ - selected: '#fff3a1', - line: 'rgba(200,200,200,0.5)', - line_month: '#aaaaff' - } - } - }.to_json.html_safe %>) - - ysy.view = ysy.view || {}; - ysy.view.templates = $.extend(ysy.view.templates, <%= { - TaskTooltip: %{ - <h3 class="gantt-tooltip-header">{{name}}</h3> - {{#start_date}} - <div class="gantt-tooltip-start_date"><span class="gantt-tooltip-label">#{l(:field_start_date)}:</span> {{start_date}}</div> - {{/start_date}} - {{#end_date}} - <div class="gantt-tooltip-end_date"><span class="gantt-tooltip-label">#{l(:field_due_date)}:</span> {{end_date}}</div> - {{/end_date}} - {{#milestone}} - <div class="gantt-tooltip-milestone"><span class="gantt-tooltip-label">#{l(:field_version)}:</span> {{milestone.name}}</div> - {{/milestone}} - {{#columns}} - <div class="gantt-tooltip-column-{{name}}"><span class="gantt-tooltip-label">{{label}}:</span> {{value}}</div> - {{/columns}} - {{#problems}} - <div class="gantt-tooltip-problem">{{.}}</div> - {{/problems}} - }, - Button: %{ - <span class="button {{active}}" title="{{title}}"> - <a id="{{elid}}_button_in" class="gantt_button{{icon}}" href="javascript:void(0)">{{name}}</a> - </span> - }, - LinkButton: %{ - <a class="{{css}}" title="{{title}}" href="javascript:void(0)">{{name}}</a> - }, - SuperPanel: %{}, - # reloadModal: %{ - # <h3 class="title">#{l('easy_gantt.reload_modal.title')}</h3> - # <h4>#{l('easy_gantt.reload_modal.label_errors')}:</h4> - # <ul class="gantt-reload-modal-errors"> - # {{#errors}} - # <li class="gantt-reload-model-error">{{.}}</li> - # {{/errors}} - # </ul> - # <p>#{l('easy_gantt.reload_modal.text_reload_appeal')}</p> - # }, - preBlocker: %{ - <div style="left:{{pos_x}}px" class="gantt_task_relation_stop gantt_task_relation_stop_left" title="#{l('easy_gantt.text_blocker_move_pre')}"> - </div> - }, - endBlocker: %{ - <div style="left:{{pos_x}}px" class="gantt_task_relation_stop gantt_task_relation_stop_right" title="#{l('easy_gantt.text_blocker_move_end')}"> - </div> - }, - ProblemFinder: %{ - #{l('easy_gantt.button.problem_finder')}: - <span class="gantt-menu-problems-count{{#count}} gantt-with-problems{{/count}}">{{count}}</span> - }, - ProblemFinderList: %{ - <ol> - {{#entities}} - <li> - <a href="javascript:ysy.pro.problemFinder.scrollToEntity('{{entityId}}')"> - {{#isProject}}#{l(:field_project)}{{/isProject}}{{^isProject}}#{l(:field_issue)}{{/isProject}}: <strong>{{name}}</strong> - <br> - <span class="gantt-menu-problems-reason">{{text}}</span> - </a> - </li> - {{/entities}} - {{#relations}} - <li> - <a href="javascript:ysy.pro.problemFinder.scrollToEntity('{{entityId}}')"> - #{l(:field_relation)}: <strong>{{sourceName}}</strong> - <strong>{{targetName}}</strong> - <br> - <span class="gantt-menu-problems-reason">{{text}}</span> - </a> - </li> - {{/relations}} - </ol> - } - }.to_json.html_safe %>) - </script> -<% end %> diff --git a/plugins/easy_gantt/app/views/easy_gantt/_menu_graph.html.erb b/plugins/easy_gantt/app/views/easy_gantt/_menu_graph.html.erb deleted file mode 100644 index d70895166d17ccd0301fedc97e39a18fc912e6f3..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/app/views/easy_gantt/_menu_graph.html.erb +++ /dev/null @@ -1,70 +0,0 @@ -<% - unless defined?(show_menu_items) - show_menu_items = true - end - - zooms = { 'day' => 'calendar-day', 'week' => 'calendar-week', 'month' => 'calendar-month' } -%> -<span id="close_all_something"> - <a id="button_close_all_projects" title="<%= l(:close_all, scope: [:easy_gantt, :button])+' '+l(:label_project_plural) %>" class="gantt-button-symbol icon-folder" href="javascript:void(0)"></a> - <a id="button_close_all_milestones" title="<%= l(:close_all, scope: [:easy_gantt, :button])+' '+l(:label_version_plural) %>" class="gantt-button-symbol gantt-icon-milestone" href="javascript:void(0)"></a> - <a id="button_close_all_parent_issues" title="<%= l(:close_all, scope: [:easy_gantt, :button])+' '+l(:label_parent_issue_plural) %>" class="gantt-button-symbol gantt-icon-parent-issue" href="javascript:void(0)"></a> -</span> -<div id="supertop_panel" class="gantt-supertop-panel easy-gantt__supertop-panel clear"></div> -<div id="easy_gantt_menu" class="easy-gantt__menu clear"> - <div class="push-left"> - <% if Rails.env.development? %> - <%= easy_gantt_js_button l(:button_test), id: 'button_test' %> - <% end %> - - <%= easy_gantt_js_button('​'.html_safe, id: 'button_jump_today', title: l(:jump_today, scope: [:easy_gantt, :title]), icon: 'icon-calendar') %> - - <% zooms.each do |name, icon| %> - <%= easy_gantt_js_button(:"#{name}_zoom", id: "button_#{name}_zoom", icon: "icon-#{icon}") %> - <% end %> - </div> - - <div class="push-right"> - <% if show_menu_items %> - <%= easy_gantt_js_button(:problem_finder, { - url: 'javascript:void(0)', - id: 'button_problem_finder', - class: 'problem-finder', - no_button: true - }) %> - <div class="easy-gantt__menu-group easy-gantt__menu-group--tooltiped easy-gantt__menu-tools"> - <a href="javascript:void(0)" class="button gantt-menu-button icon icon-settings easy-gantt__menu-tools-button"><%= l(:tool_panel, :scope => [:easy_gantt, :button]) %></a> - <ul id="easy_gantt_tool_panel" class="easy-gantt__menu-item"> - <% menu_items_for(:easy_gantt_tools, @project) do |node| %> - <li> - <% - opts = node.html_options.dup - opts[:url] = (node.url.is_a?(Proc) ? node.url.call(@project) : node.url) - opts[:id] = "button_#{node.name}" - opts[:no_button] = 'true' - - caption = opts[:caption].is_a?(Proc) ? opts[:caption].call(params[:gantt_type]) : node.caption - %> - <% if opts.delete(:trial) %> - <%= easy_gantt_help_button(node.name, caption, opts) %> - <% else %> - <%= easy_gantt_js_button(caption, opts) %> - <% end %> - </li> - <% end %> - </ul> - </div> - <%= easy_gantt_js_button(l(:button_save), { - url: 'javascript:void(0)', - id: 'button_save', - no_button: true, - class: 'button-positive button-1 icon icon-save' - }) %> - <% end %> - </div> - <%= call_hook(:view_easy_gantts_issues_toolbars, project: @project) %> -</div> - -<!-- This is container for gantt --> -<div id="gantt_cont" style="width: 100%;" class="clear"></div> -<!-- End container for gantt --> diff --git a/plugins/easy_gantt/app/views/easy_gantt/_test_includes.html.erb b/plugins/easy_gantt/app/views/easy_gantt/_test_includes.html.erb deleted file mode 100644 index cac236d9a5b30bccb1179245a3d79f1d204b411e..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/app/views/easy_gantt/_test_includes.html.erb +++ /dev/null @@ -1,33 +0,0 @@ -<%= - easy_gantt_include_js( - # test framework - 'jasmine/helpers/test', - 'jasmine/jasmine_lib/jasmine', - 'jasmine/jasmine_lib/jasmine-html', - 'jasmine/jasmine_lib/boot', - - # common tests - 'jasmine/main', - 'jasmine/loader', - 'jasmine/working_helper', - 'jasmine/working_helper_add', - 'jasmine/pos_date', - 'jasmine/history', - 'jasmine/model_relations', - 'jasmine/load_reorder' - ) -%> -<% extra_test_names = params[:run_jasmine_tests] - if extra_test_names != 'true' - if extra_test_names.is_a?(String) - extra_tests = prepare_test_includes([extra_test_names]) - elsif extra_test_names.is_a?(Array) - extra_tests = prepare_test_includes(extra_test_names) - else - extra_tests = [] - end - extra_tests.each do |test, plugin| %> - <%= easy_gantt_include_js("jasmine/#{test}", from_plugin: plugin) %> - <% end %> -<% end %> -<%= easy_gantt_include_css('jasmine', media: 'all') %> diff --git a/plugins/easy_gantt/app/views/easy_gantt/easy_queries/_show.html.erb b/plugins/easy_gantt/app/views/easy_gantt/easy_queries/_show.html.erb deleted file mode 100644 index 21c882df2e1e7b816e0ef7c057cf70bc4798f8de..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/app/views/easy_gantt/easy_queries/_show.html.erb +++ /dev/null @@ -1,66 +0,0 @@ -<% - unless defined?(form_options) - form_options = {} - end - - query ||= @query - form_path ||= easy_gantt_path(@project) - form_options[:additional_elements_to_serialize] ||= 'null' -%> - -<div class="content-title"><%= title(easy_query_name) %></div> - -<%= form_tag(form_path, method: :get, id: 'query_form') do %> - <div id="query_form_with_buttons" class="hide-when-print"> - <%= hidden_field_tag 'set_filter', '1' %> - - <div id="query_form_content"> - <fieldset id="filters" class="collapsible <%= @query.new_record? ? "" : "collapsed" %>"> - <legend onclick="toggleFieldset(this);" class="icon icon-<%= @query.new_record? ? "expended" : "collapsed" %>"><%= l(:label_filter_plural) %></legend> - <div style="<%= @query.new_record? ? "" : "display: none;" %>"> - <%= render 'queries/filters', query: query %> - </div> - </fieldset> - - <fieldset class="collapsible collapsed"> - <legend onclick="toggleFieldset(this);" class="icon icon-collapsed"><%= l(:label_options) %></legend> - <div style="display: none;"> - <table> - <tr> - <td><%= l(:field_column_names) %></td> - <td><%= render_query_columns_selection(query) %></td> - </tr> - </table> - </div> - </fieldset> - </div> - - <p class="buttons"> - <%= link_to_function l(:button_apply), 'applyEasyGanttQuery()', class: 'icon icon-checked' %> - <%= link_to l(:button_clear), { set_filter: 1, project_id: @project }, class: 'icon icon-reload' %> - </p> - </div> -<% end %> - -<script> - var additionalElementsToSerialize; - - $(document).ready(function(){ - additionalElementsToSerialize = <%=raw form_options[:additional_elements_to_serialize] %>; - }); - - function applyEasyGanttQuery(){ - if (additionalElementsToSerialize) { - var data = additionalElementsToSerialize.serializeArray()[0]; - if (data) { - var newInput = $("<input />").attr("type", "hidden") - .attr("name", data.name) - .attr("value", data.value); - - newInput.appendTo("#query_form"); - } - } - - $("#query_form").submit(); - } -</script> diff --git a/plugins/easy_gantt/app/views/easy_gantt/index.html.erb b/plugins/easy_gantt/app/views/easy_gantt/index.html.erb deleted file mode 100644 index 03e9613ee5fb4648de8bc8884f2bdc931041c626..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/app/views/easy_gantt/index.html.erb +++ /dev/null @@ -1,236 +0,0 @@ -<% - plugin = Redmine::Plugin.find('easy_gantt') - easy_extensions = EasyGantt.easy_extensions? - query ||= @query - - main_gantt_params = query.to_params.merge(key: User.current.api_key, format: 'json') - main_gantt_path = if @project - issues_easy_gantt_path(@project, main_gantt_params) - else - projects_easy_gantt_path(main_gantt_params) - end - - unless defined?(show_query) - show_query = true - end - - if EasyGantt.easy_gantt_pro? - sample_path = '' - # elsif easy_extensions - # sample_path = "#{home_path}assets/easy_gantt/sample_{{version}}.json" - else - sample_path = "#{home_path}plugin_assets/easy_gantt/data/sample_{{version}}.json" - end - - back_url = URI.unescape(request.fullpath) -%> - -<div id="easy_gantt" class="<%= easy_extensions ? 'easy' : 'redmine' %> gantt clear"> - <% if show_query %> - <% if User.current.admin? && @project.nil? %> - <div class="contextual settings"> - <% # Easy is called URI.escape before redirect to back - # So a%7Cb" is transformed into "a%257Cb" (original "a|b") %> - <%= link_to '', plugin_settings_path(plugin, back_url: back_url), class: 'icon icon-settings', title: l(:label_easy_gantt_settings)%> - </div> - <% end %> - - <%= render query, easy_query_name: l(:heading_easy_gantts_issues), - wrapper_class: '', - form_options: { additional_elements_to_serialize: '$("input#easy_gantt_type")' }, - options: { show_free_search: false, - show_custom_formatting: false, - additional_tagged_url_options: { gantt_type: params[:gantt_type] } } %> - <% end %> - - <%= hidden_field_tag 'gantt_type', '', id: 'easy_gantt_type' %> - - <%= render 'easy_gantt/menu_graph' %> - - <div id="easy_gantt_footer" class="gantt-footer"> - <div id="easy_gantt_footer_legend" class="gantt-footer-legend"></div> - <div id="gantt_footer_buttons" class="gantt-footer-menu"> - <% # Print doesn't work on RM but be carefull of page modules %> - <% if EasyGantt.easy_printable_templates? && !params[:gantt_type].present? %> - <% - # Prepare options for selection - # - easy_gantt category should be first - # - select first option on easy_gantt category if this category contains only one option - gantt_category = EasyPrintableTemplate.category_caption('easy_gantt') - options = { gantt_category => [] } - print_template_url = preview_easy_printable_template_path(':id', entity_type: 'Project', entity_id: @project.try(:id), back_url: back_url); - - templates = EasyPrintableTemplate.pluck(:name, :category, :id) - templates.each do |name, category, id| - key = EasyPrintableTemplate.category_caption(category) - options[key] ||= [] - options[key] << [name, id] - end - - if options[gantt_category].size == 1 - selected_key = options[gantt_category].first - prompt = false - else - prompt = true - end - %> - - <%= select_tag :print, grouped_options_for_select(options, selected_key, prompt: prompt), id: 'easy-printable-templates', style: 'width: auto' %> - <%= link_to_function l(:button_print), 'printableTemplatePrint()', class: 'button button-2 icon icon-print' %> - - <label title="<%= l('easy_gantt.title.print_fit') %>"> - <%= l('easy_gantt.button.print_fit') %> - <input type="checkbox" id="easy_gantt_print_fit_checkbox" checked> - </label> - <% else %> - <%= easy_gantt_js_button(l(:button_print), icon: 'icon-print', id: 'button_print') %> - <% end %> - - <% unless EasyGantt.easy_gantt_pro? %> - <%= easy_gantt_js_button(:load_sample_data, id: 'button_sample') %> - <% end %> - </div> - - <% unless EasyGantt.easy_extensions? %> - <p><%= link_to l(:text_easy_gantt_footer), l(:link_easy_gantt_plugin), target: '_blank' %></p> - <% end %> - </div> -</div> - -<%= render 'easy_gantt/includes' %> -<%= render 'easy_gantt/test_includes' if params[:run_jasmine_tests] || params[:spec] %> -<%= render 'easy_gantt/js_prepare' %> - -<%= content_for :header_tags do %> - <script type="text/javascript"> - window.ysy = window.ysy || {}; - ysy.settings = ysy.settings || {}; - ysy.view = ysy.view || {}; - - $.extend(true, ysy.settings, <%= { - hoursPerDay: 8, - parentIssueDates: (Setting.parent_issue_dates == 'derived'), - schemeBy: (@project ? EasySetting.value('issue_color_scheme_for') : 'project_priority'), - paths: { - mainGantt: main_gantt_path.html_safe, - issuePOST: issues_path(format: 'json', key: User.current.api_key), - issuePUT: issue_path(':issueID', format: 'json', key: User.current.api_key), - issueDELETE: issue_path(':issueID', format: 'json', key: User.current.api_key), - relationPOST: issue_relations_path(':issueID', format: 'json', key: User.current.api_key), - relationPUT: relation_easy_gantt_path(':projectID', ':relaID', format: 'json', key: User.current.api_key), - relationDELETE: relation_path(':relaID', format: 'json', key: User.current.api_key), - versionPOST: project_versions_path(':projectID', format: 'json', key: User.current.api_key), - versionPUT: version_path(':versionID', format: 'json', key: User.current.api_key), - sample_data: sample_path - }, - labels: { - links: { - start_to_start: l(:label_start_to_start), - start_to_finish: l(:label_start_to_finish), - finish_to_finish: l(:label_finish_to_finish), - precedes: l(:label_precedes), - relates: l(:label_relates_to), - copied_to: l(:label_copied_to), - blocks: l(:label_blocks), - duplicates: l(:label_duplicates) - }, - errors2:{ - loop_link: l('easy_gantt.errors.loop_link'), - link_target_new: l('easy_gantt.errors.link_target_new'), - link_target_readonly: l('easy_gantt.errors.link_target_readonly'), - unsupported_link_type: l('easy_gantt.errors.unsupported_link_type'), - duplicate_link: l('easy_gantt.errors.duplicate_link') - } - } - }.to_json.html_safe %>); - - ysy.view.templates = $.extend(ysy.view.templates, <%= { - LinkConfigPopup: %{ - <h3 class='title'>#{l(:heading_delay_popup)}</h3> - <label for='link_delay_input'>#{l(:field_delay)}:</label> - <span style="width:100px;display:inline-block;"></span> - <input id='link_delay_input' type='number' min='{{minimal}}' value='{{delay}}' size='3'> - <!--<a id='link_fix_actual' class='button icon icon-link' href='javascript:void(0)'>#{l(:button_use_actual_delay)}</a>--> - <!--<a id='link_remove_delay' class='button icon icon-link' href='javascript:void(0)' >#{l('easy_gantt.button.remove_delay')}</a>--> - <div id='link_popup_button_cont' > - <hr> - <a id='link_delete' class='icon icon-unlink button' href='javascript:void(0)'>#{l(:button_delete)}</a> - <a id='link_close' class='icon icon-save button-positive' href='javascript:void(0)' style='float:right'>#{l(:button_submit)}</a> - </div> - }, - SuperPanel: %{ - {{#sample}} - <div id="sample_cont" class="flash notice gantt-sample-flash"> - <h2 id="sample_label">#{l('easy_gantt.sample.header')}</h2> - <p>{{{text}}}</p> - <p class="" style="text-align:center"> - <a id="sample_video_button" class="icon icon-youtube" href="javascript:void(0)">#{l('easy_gantt.sample.video_label')}</a> - {{^global_free}} - <a id="sample_close_button" class="gantt-sample-close-button button button-important" href="javascript:void(0)" title="#{l('easy_gantt.sample.close_label')}">#{l('easy_gantt.sample.close_label')}</a> - {{/global_free}} - {{#global_free}} - <a id="sample_upgrade_button" class="button button-positive" href="#{l(:link_easy_gantt_plugin)}" target="_blank" title="#{l('easy_gantt.label_pro_upgrade')}">#{l('easy_gantt.label_pro_upgrade')}</a> - {{/global_free}} - </p> - <div class="clear"></div> - </div> - {{/sample}} - }, - easy_unimplemented: %{ - <h3 class="title">{{modal.title}}</h3><span>{{{modal.text}}}</span> - }, - video_modal: %{ - <h3 class="title">#{l('easy_gantt.sample.video.title')}</h3> - <iframe class="gantt-modal-video" width="800" height="450" src="//www.youtube.com/embed/#{l('easy_gantt.sample.video.video_id')}?autoplay=1"> - </iframe> - <p>#{l('easy_gantt.sample.video.text')}</p> - }, - video_modal_global: %{ - <h3 class="title">#{l('easy_gantt.sample_global_free.video.title')}</h3> - <iframe class="gantt-modal-video" width="800" height="450" src="//www.youtube.com/embed/#{l('easy_gantt.sample_global_free.video.video_id')}?autoplay=1"> - </iframe> - <p>#{l('easy_gantt.sample_global_free.video.text')}</p> - }, - legend: %{ - {{text}} - }, - linkDragModal: %{ - {{#errorReason}} - <b>{{errorReason}}</b> - {{/errorReason}} - {{^errorReason}} - #{l(:label_relation_new)}{{#type}} <b>{{type}}</b>{{/type}}<br> - <b>{{from}}</b> #{l('easy_gantt.link_dir.link_end')}<br> - {{#to}}<b>{{to}}</b> #{l('easy_gantt.link_dir.link_start')}{{/to}} - {{/errorReason}} - }, - printIncludes: %{ - #{easy_gantt_include_css('dhtmlxgantt', media: 'all')} - #{easy_gantt_include_css('easy_gantt', media: 'all')} - } - }.to_json.html_safe %>); - - function printableTemplatePrint(){ - var $select = $("#easy-printable-templates"); - var value = $select.val(); - - if (value === "") { - // $select.css({border: "1px solid red"}) - return false - } - var url = "<%= print_template_url %>"; - url = url.replace(":id", value); - - easyModel.print.preview({href: url}) - } - </script> -<% end %> - -<%= call_hook(:view_easy_gantt_index_bottom, project: @project, query: query) %> - -<% content_for :sidebar do %> - <%= call_hook(:view_easy_gantt_index_sidebar, project: @project, query: query, gantt_type: params[:gantt_type]) %> - - <% # DEPRECATED %> - <%= call_hook(:view_easy_gantts_issues_sidebar, project: @project, query: query) %> -<% end %> diff --git a/plugins/easy_gantt/app/views/easy_gantt/issues.api.rsb b/plugins/easy_gantt/app/views/easy_gantt/issues.api.rsb deleted file mode 100644 index 7a0454dfcc204c679db2aa1aff9d7bfd2c13be4b..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/app/views/easy_gantt/issues.api.rsb +++ /dev/null @@ -1,26 +0,0 @@ -api.easy_gantt_data do - api.start_date @start_date - api.end_date @end_date - - api_render_columns(api, @query) - api_render_projects(api, @projects) - api_render_issues(api, @issues, with_columns: true) - - api_render_relations(api, @relations) - - api_render_versions(api, @versions) - - if EasySetting.value(:easy_gantt_show_holidays) && params[:subproject_loading].blank? - api_render_holidays(api, @start_date - 1.month, @end_date + 1.month) - end - - # Load only on first request - if params[:subproject_loading].nil? - api.schemes do - api_render_scheme(api, IssuePriority) - api_render_scheme(api, IssueStatus) - api_render_scheme(api, Tracker) - end - end - -end diff --git a/plugins/easy_gantt/app/views/easy_gantt/printable_templates/_token_list.html.erb b/plugins/easy_gantt/app/views/easy_gantt/printable_templates/_token_list.html.erb deleted file mode 100644 index 0b0bf004ecf7d15f719fc2b04aebf5fbdae6bcb0..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/app/views/easy_gantt/printable_templates/_token_list.html.erb +++ /dev/null @@ -1,11 +0,0 @@ -<tr> - <td colspan="2"><%= l(:label_easy_gantt) %>:</td> -</tr> -<tr> - <td> - <%= easy_printable_template_link_to_add_token('%easy_gantt_current%', f, l(:label_easy_gantt)) %> - </td> - <td> - <%= l(:text_easy_gantt_print_easy_gantt_current) %> - </td> -</tr> diff --git a/plugins/easy_gantt/app/views/easy_gantt/printable_templates/default.html b/plugins/easy_gantt/app/views/easy_gantt/printable_templates/default.html deleted file mode 100644 index 54c1d1172cac79c786ceb351e5162da85a06fff1..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/app/views/easy_gantt/printable_templates/default.html +++ /dev/null @@ -1,33 +0,0 @@ -<div style="background: #009ee0; width: 100%; height: 5px"> </div> - -<p> </p> - -<table border="0" cellpadding="1" cellspacing="1" style="width:500px"> - <tbody> - <tr> - <td style="width: 100px"><img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QINEAYbWX8kIAAADbFJREFUaN7tW3l0W9WZ/9339LRatmzL+yLJVuIkwg2JszlxFoJDIQEOZJi2UELpciiUgTIlbTkwk87QaaeFDrMwwDktdEiTNocZpimUQgohp4lJnMSO0ySOY8dWLMXyEnmVtdiS3nt3/ugAetZ98iraOdP7n+697737u/dbft/3XQH/zxpJ14tramqEwODgYpmQKo6QKgpYAFgIRQYFDRNKwpTQIKFcp8Sjg+f59q6urvH/U4ArSyud4KSdALZSgjoCmGbxuATQsyDkCEfIbzq7uxsA0D85wE6nU4d4/F4K7osAXb9Qm0iBbo5gnwi85PF4Bv7ogO12u54DHiQUuwGUpFEKJwD6Ci9JP7js8/X+UQBX2mxbCcgLFFjyCdqbCCF4Vmcyff/ixYuxTwSw0+nMRFx8iQL3zPF7kyBkEjI0IDRjjiu+QGT5c11Xr7alFbDTZltBKXkNBItmMD0mGzPbJxavGQkv2WSK2lx5cWt5KeU1msRJmtGBazrfpX5DV1PA1HpMrxnrqwKllpmcNggedns8r6YFcKXdfjOleH06qytrje3B2p3+kW1frpaNluxZL0YW4+bTb53Nfu9lqhntXQ2AS2nYKP7xylXPU7Ox5tMCrrDb7yYUewEIqh/WmS4O3vXkRLBm+6qFUljtQGd3wb4n+7T9XbWpgFOQV654ux8AIM8bsLPMcTvl5P8GiIb9NBkdrf9K68jND24A4bh0WCpjR2NrwX98Q+Bik1UpQL94xdv98LwAV5RX1BEivwvAwBRfo/l8z+OvWcXsouJUH9AQYJVF01eTIwzka2ncquVohkBjWQKne+z8RLUnLBunXaQkxop//FCjvrN5k/qayR63t/u7cwLscDgKOJn+HkAhazxatqyh99G9tVON0IdtpUXj/7pT676lQNBadcROgFzWvM3HgiPHhqScD3/X5mr6Tg6LxWoKaTm670TuG8+tAqBlqzS99YrX+3YqwCwx5DhZ3q8GNrKs7qjvsf11LLB3FAudPbeYT57ZmpF1X7m2Nk9HatTAstrr60z9gdssl3cv0rayTmJs8671A7t+2AogwlQwYK+zxFk6K8CVNsfXAFLPPFn78ob+rzy/GYQo1lNh5IZa680NB9eZ7KUGfh0A3ZwUVqYwC1j8bLXxur4dWS012Xz/1CnhFTet9H/u6VaAigzMVsqLL88YsMPhKAAoUw/i2YWnfY/8dMPU/r8oEc61f9occWXyG1NZ8tm2Qh1Z2XyDWf+jan3j1LHgmtvWBLZ84YSKkn660ma7c0aAiYzv4Q9h3JSX8L2+bxxwTrXEf7dE3/T6WlOlQEh5muhk9uOL9OtObDGf4InS7Qzd/teb4vn2RhXT9M8ul0ubErDD4bAR0PtYkwbu/6FfNllyEvv2LNEf/84yfTWADKS3kdocfv25+oyTU0H7vv4zFzjOz3jGFg2FdqUETGR8kyWS8YKKE+HqG1ck9v1lqdD298v0KwDop1ttVMYViVLffFG7zJr1hzaYTilU3mDOHN7+V50q4eUTAHgm4OLiYqPK6cb7vvwvtsSOIh0Z+flqkx5AKv8peSK05Z6miNv4xliFf1KeUTxLpyFC9fnC2j1L9c0Ky731i+tlnfESQzCcTru9ngnYqNHtBGBOigBKqk6J1jJFrPv2BlO7QFChGg5J1HPv6UiP41Bg5YGeWKU8i5zFjsZI8bWo3JrKyO5Zoi+tMHLBRGQjOx4JsHeQ7GICpoTezZo/uPPb1sTf2wqE9ustmhq11fRE5FbHu8HCn/ti9rmI7bkxsbD8nXHXyWHxrNocnqBw72rjhcS+wIbPrKEc158sMfTO0tJSBVPkXC6XlgKbkyYL+q5JxwpFgP/icuOYmo/ti+L80sPBpQMTsn4+uhqTQTYcC61oHlUHXZerqV6UwX98qoTjJqrWXWZRcS2nVbhSbiI4sYYV9kVcdQpD4zDx15wZ5Dr2ImnfqiPjFWGR8gthlmUKbGkIf2o0JqsF+ea/qdK1J3aM3nC/VeVtWxWACeT1rGnBVbcr4tlvLdZdUXNBz3XFxvon5AV1T2GR8p9viugBiKzx24sFhSRNVqxcAkICDL65XgmYgBF2UTGyeK1CnG8pEGQVt+N7+tLE0nQ44HeuiRUDUco8ZYtAFhfquY85NcfzotnKclEKHBwrEUd5rY9qtLrEkKrMwGZT7/njvgkpfQn9Az1xSWXIUJ/PX1GoVr6DFVQU2O12S6KVTkqxyubcQYXvNXCDHAEz7v11XzwznTTrrf54mdrY9Vn82JSwlR2Ty3JJgg4n+1/JkKFIgy7P0gRYrAUA2oJyXjoBHx+OWyk7HESRgVeomWSxsoMXjjMninSSsZF0JoUY5Qg0qrag0ThN6wlHZUCSMcrUY43SoMmGbK1KKiozVQKAMZ9Iqsk2wraiU3Z4fjpOVKkonTKPyesk6eN+jgChJDYTDSvENxiXVQP6AgMXSOcJazmABztpHxaVW8FFRuNMdsbRYKJIJ5Uo+YlxhWicDdBMAMxTXpHJDM9mnQ5Wazfma/oIIVmsse6IpFgnPzYYZ3MPOZgg0iSpQMUFRxWG6GpEKqRAP5MAFAmTM4iD5gz4rmKtagGtdVxW2A99zyXmPJHjehNEmnYkp0VjpUSMJgIhfZPUy3rZmlxNhVVPUoLmydxT1neVCGpGMfRWX0wRtQn+blbIOuDxeMYSRJq0MyRQY+w4pdiI966JUZUMQv6zLkNbOvT3AbvQmSmQxayx4RjtHBM/9jBEEkVNcIg1t0O5Xioxk2HmpjcVruCZyxOLAIRZc79g09quy+KvqUv07EXarCHxf6o2EjX9/1W/qJAqQ3dLByjLRZLjCsCWvLzTAE2y1MZLHygYzqWgXOadoM0qFin36MaMoSwtW7TpHHT4yCbThQyBOFXc0ch3LkYU/D3r/VeH2HstHVEAPnPmTBzgjiaBiEcr9e4WhRV4qCWcA4AJKkdLXB3bMjsK9CTC8OMzBsoT4P2NGU2rLJqVanPeHYi39U4mlFVlSTJ0nq5ibEw4JssnkjMekH/BenHeL38wPCV6qT4XkI6r+mQdWe65OXPgjhJt95QvzwjxIjM3dvmmzJateZrVqskywHtvc+R6xek2vNZEZIlRKaEHfT7fRBLgmCQdBJBEILT9nbVav0eRCLitMXy9ROFRW5CeIxUH1xrL2m/KbNleJPQCgIakrkSUGkjotTWmkx3bMmMVJm5lqoTIg2ciw0OxBCJCKc19+/kcNsHj9qkSgkqb7d8A8khS2jK/vPHqE2/UJvbdVChc+O16UzGmrxvRkIjLRh6FHEESefjttXjTUjPPlRu5RQCm5eT/1Rv/3WdOhbck9mUffvmDnLdfqGMoeqf7qmfpVML0EYXMsVpbIdOHp0ZFfDhQFsuvaIkXVRZ92OcOyQXDMXphe6GQDXYl76MN1XKwEsLOXzsz+JIsgRRj+loUPT4s/u6W4+EtiYfEhQNjxT9+JAegxmSqQ781Ggi0MLOWAOB2u3tA8Crra4X7nyzkQ2MjiX3/7o6uvb85ch7Agt2hUlPb3/TH3687Gto81UWV/Ou97YBsZRir7myrdZ8Kb0g8Tv5vAUYoRqXisuc+64YsKcRj79VY7baG0EiMwp0OpBTwf7dj8sStjeH6qWu1HnzmqHbIt44JSiaP/cH7TAPY7Xb7KcFTTHcx5l9d+vz9SSTl8KC4LO/NMWvjiHRIzWXNBWvfJG1c/v54eM/FyY1TBzNP/upUVsMvNqg8e6irp/tNVbeXFNCPjbVkZ1lqCUFlUqok4LfpPeePhmq22xKda5RC/4on5mwaFTs3WPk2i8DlY26l0/hgjJ7afWHCf8/pyFp/lCbdBDK3vNOcf2BPNUBYej/IS+KO4fHx4KzCtsrKynyI0lmAnceKFVV94Ht8/1rKaZigrsvkrzy9TO+7MV8wZGqwFKkrjJGQSC+dGBZD3+uI5h8bElUzoP9rkdeqbKYMgh1uj+fQnOJUp81WS0EOQ6VoJulMF327D1jE3LKU9yxzBARvLtT2lBq54XwB8SyBcBEZoj9Ktd6InH34mlg8EJVTujciRieLXvzqaYPn3CZ1IPSpLq/3+/MKzCvKK24lRDqY4tpSYHTLfedGbn20Lm3Xltoazhfu3W0k8Zgzhco/7/Z6H51HtihBvO32z4LiZ6n8rawztg/f8e3x8TW3rZ4VcU7RdL3t7oJ9T1wT/N7a1OukP3F7vQ9iIS6mfdgc5Y5tHJF/CZCU5RQq6C+Pr7uzf7T+Sy7JbLXOOlcnxqLmU2+ctRz5KSeMDqyaPslI/8Ht9e7BQl49/Ai0w/EpTqb/CaBqBl5FlA2Z7ROVNUORZRsNk7bqvHierSSxmgEqy5rR/gFdT9uAsbMpaGo7auTHBpcA1DyD94cI5R7qutq9f4ESoOzmynNlTBpDLwJk1xwlNQZCIpRSYZZ/D0gkI7+XCe72eDztC5jxnUavbbYbAPICgLQU0dTc1yd+QVzhtpxOHY1JDwD0myAoSydQEPxEI0nPdPT09M33ZfO2qC6XSzsZDt8D4EugqMPC/VPGTSn2EYF/ye12+xdq9xa0zFllszlEYCdAtgJ003RWfSqXoUAzKI4QQt9ye72N+FP8G49a2wJoem22RTKwhFKymOOQTYFsQpFBCUKUkhBHaEim9DJkvkMwCh0dHR1B/LktbPsfTqw3z5AwTsEAAAAASUVORK5CYII=" style="border:0px solid black; height:60px; margin-bottom:0px; margin-left:0px; margin-right:0px; margin-top:0px; width:60px" /></td> - <td> - <p> <span style="font-size:28px"><strong>EasyGantt</strong></span></p> - </td> - </tr> - </tbody> -</table> - -<h1> </h1> - -<h1>%project_name%</h1> - -<table border="0" cellpadding="2" cellspacing="2" style="width:500px"> - <tbody> - <tr> - <td style="width: 150px"><strong>Start date:</strong></td> - <td>%project_start_date%</td> - </tr> - <tr> - <td style="width: 150px"><strong>Due date:</strong></td> - <td>%project_due_date%</td> - </tr> - </tbody> -</table> - -<p>%easy_gantt_current%</p> diff --git a/plugins/easy_gantt/app/views/easy_gantt/project_issues.api.rsb b/plugins/easy_gantt/app/views/easy_gantt/project_issues.api.rsb deleted file mode 100644 index df7ebb4408e3bf0da625dc06b5ee48747e10de6a..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/app/views/easy_gantt/project_issues.api.rsb +++ /dev/null @@ -1,5 +0,0 @@ -api.easy_gantt_data do - api_render_issues(api, @issues) - api_render_relations(api, @relations) - api_render_versions(api, @versions) -end diff --git a/plugins/easy_gantt/app/views/easy_gantt/projects.api.rsb b/plugins/easy_gantt/app/views/easy_gantt/projects.api.rsb deleted file mode 100644 index edbf2ebc37184e4cf337636d72e21e47624e1de4..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/app/views/easy_gantt/projects.api.rsb +++ /dev/null @@ -1,18 +0,0 @@ -api.easy_gantt_data do - api.start_date @start_date - api.end_date @end_date - - api_render_columns(api, @query) - api_render_projects(api, @projects, with_columns: true) - - if EasySetting.value(:easy_gantt_show_holidays) - api_render_holidays(api, @start_date - 1.month, @end_date + 1.month) - end - - # Load only on first request - if params[:subproject_loading].nil? - api.schemes do - api_render_scheme(api, :EasyProjectPriority) - end - end -end diff --git a/plugins/easy_gantt/app/views/easy_gantt_easy_issue_queries/_filters_custom_formatting.html.erb b/plugins/easy_gantt/app/views/easy_gantt_easy_issue_queries/_filters_custom_formatting.html.erb deleted file mode 100644 index 7876c5a46327c1371b6b1c5ab6864a7d2ce9dbcf..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/app/views/easy_gantt_easy_issue_queries/_filters_custom_formatting.html.erb +++ /dev/null @@ -1,5 +0,0 @@ -<% # Just for hiding %> - -<script> - $("#custom_formatting").remove(); -</script> diff --git a/plugins/easy_gantt/app/views/easy_settings/_easy_gantt.html.erb b/plugins/easy_gantt/app/views/easy_settings/_easy_gantt.html.erb deleted file mode 100644 index 72be94005c6e8575490db438e72922c3f8d21204..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/app/views/easy_settings/_easy_gantt.html.erb +++ /dev/null @@ -1,42 +0,0 @@ -<% - default_zoom_options = [ - [l('easy_gantt.button.day_zoom'), 'day'], - [l('easy_gantt.button.week_zoom'), 'week'], - [l('easy_gantt.button.month_zoom'), 'month'] - ] -%> - -<%= title l(:title_easy_gantt_settings) %> - -<div class="box tabular"> - <p> - <%= form.label :show_holidays, l(:field_easy_gantt_show_holidays) %> - <%= form.check_box :show_holidays %> - <em class="small"><%= l(:text_easy_gantt_show_holidays) %></em> - </p> - - <p> - <%= form.label :relation_delay_in_workdays, l(:field_easy_gantt_relation_delay_in_workdays) %> - <%= form.check_box :relation_delay_in_workdays %> - <em class="small"><%= l(:text_easy_gantt_relation_delay_in_workdays) %></em> - </p> - - <p> - <%= form.label :show_project_progress, l(:field_easy_gantt_show_project_progress) %> - <%= form.check_box :show_project_progress %> - <em class="small"><%= l(:text_easy_gantt_show_project_progress) %></em> - </p> - - <p> - <%= form.label :show_task_soonest_start, l(:field_easy_gantt_show_task_soonest_start) %> - <%= form.check_box :show_task_soonest_start %> - <em class="small"><%= l(:text_easy_gantt_show_task_soonest_start) %></em> - </p> - - <p> - <%= form.label :default_zoom, l(:field_easy_gantt_default_zoom) %> - <%= form.select :default_zoom, options_for_select(default_zoom_options, form.object.default_zoom) %> - </p> - - <%= call_hook :view_easy_gantt_settings, form: form %> -</div> diff --git a/plugins/easy_gantt/assets/data/gantt.json b/plugins/easy_gantt/assets/data/gantt.json deleted file mode 100644 index 25966488a82fb7bc8eeb9c81c86302bb115bf23d..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/data/gantt.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "start_date": "yyyy-mm-dd", - "due_date":"yyyy-mm-dd", - "columns": [ - { - "name": "name", - "title": "Jméno", - "mapped":true, - "type":"text" - }, - { - "name":"start_date", - "title":"Počátek", - "mapped":true - }, - { - "name":"end_date", - "title":"Konec", - "mapped":true - }, - { - "name": "assignee", - "title": "Přirazeno", - "mapped":true, - "type":"select", - "completes":"/easy_auto_completer/assignable_users" - }, - { - "name": "address", - "title": "Adresa", - "type":"text" - }, - { - "name": "priority", - "title": "Priorita", - "type":"select", - "completes":"/easy_auto_completer/issue_priorities" - }, - { - "name":"estimated", - "title":"Odhad", - "type":"text" - } - ], - "issues": [ - { - "id": 0, - "name": "název úkolu", - "start_date": "yyyy-mm-dd", - "end_date": "yyyy-mm-dd", - "estimated": 25, - "progress": 0.10, - "css": "issue-open project-35 tracker-5 status-1", - "assignee": {"id": 65, "name": "lukas"}, - "version":65, - - "columns": { - "address":"Levá 5, Horní Dolní", - "priority":"Vysoká", - "estimated":256 - } - } - ], - "projects":[], - "versions":[ - { - "id": 65, - "name": "název milníku", - "start_date": "yyyy-mm-dd", - "css": "issue-open project-35 tracker-5 status-1", - "milestone":true - } - - ], - "relations": [ - { - "id": 5, - "source": 6, - "target": 7, - "type": "precedes", - "delay": 0 - } - ] -} diff --git a/plugins/easy_gantt/assets/data/sample_1.json b/plugins/easy_gantt/assets/data/sample_1.json deleted file mode 100644 index 6f78b52ad37e56ebb1882f313beeb09ca11eefc6..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/data/sample_1.json +++ /dev/null @@ -1,681 +0,0 @@ -{ - "easy_gantt_data": { - "start_date": "2016-03-28", - "end_date": "2016-06-08", - "columns": [ - { - "name": "subject", - "title": "Subject" - }, - { - "name": "assigned_to", - "title": "Assignee" - } - ], - "projects": [], - "issues": [ - { - "id": 371, - "name": "Features Specification", - "start_date": "2016-03-29", - "due_date": "2016-03-29", - "estimated_hours": 1.0, - "done_ratio": 0, - "fixed_version_id": 58, - "overdue": true, - "project_id": 41, - "tracker_id": 5, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Features Specification" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 372, - "name": "Creative brief", - "start_date": "2016-04-04", - "due_date": "2016-04-08", - "estimated_hours": 1.0, - "done_ratio": 0, - "fixed_version_id": 58, - "overdue": true, - "project_id": 41, - "tracker_id": 5, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Creative brief" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 373, - "name": "Marketing brief", - "start_date": "2016-04-04", - "due_date": "2016-04-04", - "estimated_hours": 1.0, - "done_ratio": 0, - "fixed_version_id": 58, - "overdue": true, - "project_id": 41, - "tracker_id": 5, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Marketing brief" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 374, - "name": "Wireframes", - "start_date": "2016-04-11", - "due_date": "2016-04-11", - "estimated_hours": 8.0, - "done_ratio": 0, - "fixed_version_id": 57, - "overdue": true, - "project_id": 41, - "tracker_id": 3, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Wireframes" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 375, - "name": "Graphics", - "start_date": "2016-04-15", - "due_date": "2016-04-18", - "estimated_hours": 16.0, - "done_ratio": 0, - "fixed_version_id": 57, - "overdue": true, - "project_id": 41, - "tracker_id": 3, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Graphics" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 376, - "name": "XHTML + CSS coding", - "start_date": "2016-04-25", - "due_date": "2016-05-02", - "estimated_hours": 15.0, - "done_ratio": 0, - "fixed_version_id": 57, - "overdue": true, - "project_id": 41, - "tracker_id": 3, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "XHTML + CSS coding" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 378, - "name": "VirtueMart implementation", - "start_date": "2016-05-03", - "due_date": "2016-05-03", - "estimated_hours": 5.0, - "done_ratio": 0, - "fixed_version_id": 56, - "overdue": true, - "project_id": 41, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "VirtueMart implementation" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 383, - "name": "On-line payments", - "start_date": "2016-05-09", - "due_date": "2016-05-10", - "estimated_hours": 10.0, - "done_ratio": 0, - "fixed_version_id": 56, - "overdue": true, - "project_id": 41, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "On-line payments" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 379, - "name": "Web structure", - "start_date": "2016-05-11", - "due_date": "2016-05-11", - "estimated_hours": 5.0, - "done_ratio": 0, - "fixed_version_id": 55, - "overdue": true, - "project_id": 41, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Web structure" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 377, - "name": "CMS - implementation + setting", - "start_date": "2016-05-12", - "due_date": "2016-05-12", - "estimated_hours": 5.0, - "done_ratio": 0, - "fixed_version_id": 56, - "overdue": true, - "project_id": 41, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "CMS - implementation + setting" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 380, - "name": "Products", - "start_date": "2016-05-16", - "due_date": "2016-05-17", - "estimated_hours": 10.0, - "done_ratio": 0, - "fixed_version_id": 55, - "overdue": true, - "project_id": 41, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Products" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 381, - "name": "Specific features", - "start_date": "2016-05-18", - "due_date": "2016-05-18", - "estimated_hours": 10.0, - "done_ratio": 0, - "fixed_version_id": 54, - "overdue": true, - "project_id": 41, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Specific features" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 382, - "name": "Easy Redmine Integration", - "start_date": "2016-05-23", - "due_date": "2016-05-23", - "estimated_hours": 5.0, - "done_ratio": 0, - "fixed_version_id": 54, - "overdue": true, - "project_id": 41, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Easy Redmine Integration" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 384, - "name": "Google Analytics", - "start_date": "2016-05-25", - "due_date": "2016-05-30", - "estimated_hours": 3.0, - "done_ratio": 0, - "fixed_version_id": 53, - "overdue": true, - "project_id": 41, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Google Analytics" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 385, - "name": "Testing ", - "start_date": "2016-05-30", - "due_date": "2016-05-31", - "estimated_hours": 10.0, - "done_ratio": 0, - "fixed_version_id": 53, - "overdue": true, - "project_id": 41, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Testing " - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 386, - "name": "Debug", - "start_date": "2016-06-02", - "due_date": "2016-06-07", - "estimated_hours": 10.0, - "done_ratio": 0, - "fixed_version_id": 53, - "overdue": true, - "project_id": 41, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 21, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Debug" - }, - { - "name": "assigned_to", - "value": "Ondrej Ezr" - } - ] - }, - { - "id": 387, - "name": "Training", - "start_date": "2016-06-06", - "due_date": "2016-06-07", - "estimated_hours": 4.0, - "done_ratio": 0, - "fixed_version_id": 53, - "overdue": true, - "project_id": 41, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Training" - }, - { - "name": "assigned_to", - "value": "" - } - ] - } - ], - "relations": [ - { - "id": 27, - "source_id": 374, - "target_id": 375, - "type": "precedes", - "delay": 3 - }, - { - "id": 28, - "source_id": 375, - "target_id": 376, - "type": "precedes", - "delay": 4 - }, - { - "id": 29, - "source_id": 376, - "target_id": 377, - "type": "precedes", - "delay": 7 - }, - { - "id": 30, - "source_id": 385, - "target_id": 386, - "type": "precedes", - "delay": 1 - } - ], - "versions": [ - { - "id": 58, - "name": "Analysis", - "start_date": "2016-04-04", - "project_id": 41, - "permissions": { - "editable": true - } - }, - { - "id": 57, - "name": "Design", - "start_date": "2016-05-02", - "project_id": 41, - "permissions": { - "editable": true - } - }, - { - "id": 56, - "name": "CMS + E-commerce platform", - "start_date": "2016-05-13", - "project_id": 41, - "permissions": { - "editable": true - } - }, - { - "id": 55, - "name": "Content + Products", - "start_date": "2016-05-17", - "project_id": 41, - "permissions": { - "editable": true - } - }, - { - "id": 54, - "name": "Easy Redmine integration", - "start_date": "2016-05-23", - "project_id": 41, - "permissions": { - "editable": true - } - }, - { - "id": 53, - "name": "Public Launch", - "start_date": "2016-06-10", - "project_id": 41, - "permissions": { - "editable": true - } - } - ], - "schemes": { - "IssuePriority": [ - { - "id": 8, - "scheme": "scheme-5" - }, - { - "id": 11, - "scheme": "scheme-2" - }, - { - "id": 10, - "scheme": "scheme-0" - }, - { - "id": 15, - "scheme": "scheme-1" - } - ], - "IssueStatus": [ - { - "id": 2, - "scheme": "scheme-4" - }, - { - "id": 3, - "scheme": "scheme-5" - }, - { - "id": 4, - "scheme": "scheme-1" - }, - { - "id": 5, - "scheme": "scheme-7" - }, - { - "id": 6, - "scheme": "scheme-6" - }, - { - "id": 7, - "scheme": "scheme-7" - }, - { - "id": 8, - "scheme": "scheme-7" - }, - { - "id": 9, - "scheme": "scheme-3" - }, - { - "id": 10, - "scheme": "scheme-2" - } - ], - "Tracker": [ - { - "id": 1, - "scheme": "scheme-6" - }, - { - "id": 3, - "scheme": "scheme-4" - }, - { - "id": 4, - "scheme": "scheme-3" - }, - { - "id": 5, - "scheme": "scheme-2" - }, - { - "id": 6, - "scheme": "scheme-5" - }, - { - "id": 13, - "scheme": "scheme-1" - }, - { - "id": 14, - "scheme": "scheme-1" - }, - { - "id": 15, - "scheme": "scheme-6" - }, - { - "id": 16, - "scheme": "scheme-0" - }, - { - "id": 17, - "scheme": "scheme-1" - }, - { - "id": 18, - "scheme": "scheme-7" - }, - { - "id": 19, - "scheme": "scheme-3" - }, - { - "id": 31, - "scheme": "scheme-2" - }, - { - "id": 33, - "scheme": "scheme-7" - } - ] - } - } -} \ No newline at end of file diff --git a/plugins/easy_gantt/assets/data/sample_global.json b/plugins/easy_gantt/assets/data/sample_global.json deleted file mode 100644 index 248c8b52cc631d0bf5c997d023b832bd47aae6b3..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/data/sample_global.json +++ /dev/null @@ -1,9666 +0,0 @@ -{ - "easy_gantt_data": { - "start_date": "2016-03-28", - "end_date": "2016-12-25", - "columns": [ - { - "name": "subject", - "title": "Subject" - }, - { - "name": "status", - "title": "Status" - }, - { - "name": "priority", - "title": "Priority" - }, - { - "name": "assigned_to", - "title": "Assignee" - } - ], - "projects": [ - { - "id": 3, - "name": "3. IT Projects", - "start_date": "2016-03-29", - "due_date": "2016-11-01", - "status_id": 1, - "permissions": { - "editable": true - }, - "done_ratio": 4.335324043353241 - }, - { - "id": 62, - "name": "4. Product Development", - "start_date": "2016-06-20", - "due_date": "2016-07-04", - "status_id": 1, - "permissions": { - "editable": true - }, - "done_ratio": 100.0 - }, - { - "id": 63, - "name": "1. Administrative Projects", - "start_date": "2016-06-27", - "due_date": "2016-07-13", - "status_id": 15, - "permissions": { - "editable": true - }, - "done_ratio": 100.0 - }, - { - "id": 77, - "name": "2. HR Projects", - "start_date": "2016-05-05", - "due_date": "2016-09-14", - "status_id": 1, - "permissions": { - "editable": true - }, - "done_ratio": 4.366107838695061 - }, - { - "id": 10, - "name": "Client Project", - "start_date": "2016-05-30", - "due_date": "2016-11-01", - "parent_id": 3, - "status_id": 1, - "permissions": { - "editable": true - }, - "done_ratio": 32.664756446991404 - }, - { - "id": 28, - "name": "Continuous Software Development", - "start_date": "2016-06-06", - "due_date": "2016-09-21", - "parent_id": 3, - "status_id": 1, - "permissions": { - "editable": true - }, - "done_ratio": 0.0 - }, - { - "id": 40, - "name": "Implementation of IS", - "start_date": "2016-06-01", - "due_date": "2016-08-27", - "parent_id": 3, - "status_id": 1, - "permissions": { - "editable": true - }, - "done_ratio": 14.07035175879397 - }, - { - "id": 41, - "name": "E-commerce Project Implementation", - "start_date": "2016-03-29", - "due_date": "2016-06-07", - "parent_id": 3, - "status_id": 1, - "permissions": { - "editable": true - }, - "done_ratio": 0.0 - }, - { - "id": 88, - "name": "Trainings", - "start_date": "2016-06-16", - "due_date": "2016-08-27", - "parent_id": 77, - "status_id": 15, - "permissions": { - "editable": true - }, - "done_ratio": 0.0 - }, - { - "id": 106, - "name": "Design to Schedule Model", - "start_date": "2016-06-20", - "due_date": "2016-07-04", - "parent_id": 62, - "status_id": 1, - "permissions": { - "editable": true - }, - "done_ratio": 100.0 - } - ], - "issues": [ - { - "id": 741, - "name": "Managing projects", - "start_date": "2016-06-27", - "due_date": "2016-09-12", - "estimated_hours": 400.0, - "done_ratio": 0, - "project_id": 3, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 31, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Managing projects" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Project Manager" - } - ] - }, - { - "id": 415, - "name": "Subtask for Doc", - "start_date": "2016-05-30", - "due_date": "2016-05-30", - "estimated_hours": 20.0, - "done_ratio": 0, - "fixed_version_id": 10, - "overdue": true, - "parent_issue_id": 38, - "project_id": 10, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Subtask for Doc" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 416, - "name": "subtask", - "start_date": "2016-06-14", - "due_date": "2016-06-14", - "estimated_hours": 10.0, - "done_ratio": 0, - "fixed_version_id": 9, - "overdue": true, - "parent_issue_id": 36, - "project_id": 10, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "subtask" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 36, - "name": "Documentation for Block no 2", - "start_date": "2016-06-22", - "due_date": "2016-06-22", - "estimated_hours": 5.0, - "done_ratio": 0, - "fixed_version_id": 9, - "overdue": true, - "project_id": 10, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 9, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Documentation for Block no 2" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Robert Kovacik" - } - ] - }, - { - "id": 38, - "name": "Planning phase review", - "start_date": "2016-06-29", - "due_date": "2016-06-29", - "estimated_hours": 0.0, - "done_ratio": 100, - "fixed_version_id": 10, - "project_id": 10, - "tracker_id": 1, - "priority_id": 9, - "status_id": 2, - "assigned_to_id": 5, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Planning phase review" - }, - { - "name": "status", - "value": "Realisation" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Manager Manager" - } - ] - }, - { - "id": 488, - "name": "Review meeting", - "start_date": "2016-07-01", - "due_date": "2016-07-02", - "estimated_hours": 0.0, - "done_ratio": 0, - "fixed_version_id": 10, - "project_id": 10, - "tracker_id": 1, - "priority_id": 9, - "status_id": 2, - "assigned_to_id": 5, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Review meeting" - }, - { - "name": "status", - "value": "Realisation" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Manager Manager" - } - ] - }, - { - "id": 33, - "name": "Block no 2 constructing", - "start_date": "2016-07-15", - "due_date": "2016-07-17", - "estimated_hours": 20.0, - "done_ratio": 0, - "fixed_version_id": 8, - "project_id": 10, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 8, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Block no 2 constructing" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Dominka Support Operative" - } - ] - }, - { - "id": 37, - "name": "Documentation for Block no 1", - "start_date": "2016-07-16", - "due_date": "2016-07-23", - "estimated_hours": 50.0, - "done_ratio": 0, - "fixed_version_id": 9, - "project_id": 10, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 9, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Documentation for Block no 1" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Robert Kovacik" - } - ] - }, - { - "id": 32, - "name": "Block no 3 constructing", - "start_date": "2016-07-17", - "due_date": "2016-07-25", - "estimated_hours": 40.0, - "done_ratio": 0, - "fixed_version_id": 8, - "project_id": 10, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 8, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Block no 3 constructing" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Dominka Support Operative" - } - ] - }, - { - "id": 34, - "name": "Block no 1 constructing", - "start_date": "2016-07-25", - "due_date": "2016-07-25", - "estimated_hours": 24.0, - "done_ratio": 0, - "fixed_version_id": 8, - "project_id": 10, - "tracker_id": 1, - "priority_id": 9, - "status_id": 2, - "assigned_to_id": 5, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Block no 1 constructing" - }, - { - "name": "status", - "value": "Realisation" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Manager Manager" - } - ] - }, - { - "id": 35, - "name": "Documentation for Block no 3", - "start_date": "2016-07-26", - "due_date": "2016-07-26", - "estimated_hours": 0.0, - "done_ratio": 0, - "fixed_version_id": 9, - "project_id": 10, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 6, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Documentation for Block no 3" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Peter Project Man" - } - ] - }, - { - "id": 39, - "name": "Review meeting", - "start_date": "2016-08-24", - "due_date": "2016-10-03", - "estimated_hours": 90.0, - "done_ratio": 70, - "fixed_version_id": 10, - "project_id": 10, - "tracker_id": 1, - "priority_id": 11, - "status_id": 2, - "assigned_to_id": 16, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Review meeting" - }, - { - "name": "status", - "value": "Realisation" - }, - { - "name": "priority", - "value": "Easy task" - }, - { - "name": "assigned_to", - "value": "Manager Française " - } - ] - }, - { - "id": 31, - "name": "Testing", - "start_date": "2016-08-29", - "due_date": "2016-09-12", - "estimated_hours": 50.0, - "done_ratio": 30, - "fixed_version_id": 7, - "project_id": 10, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 9, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Testing" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Robert Kovacik" - } - ] - }, - { - "id": 40, - "name": "Evaluation of draft documentation", - "start_date": "2016-10-09", - "due_date": "2016-10-10", - "estimated_hours": 40.0, - "done_ratio": 90, - "fixed_version_id": 10, - "project_id": 10, - "tracker_id": 1, - "priority_id": 10, - "status_id": 1, - "assigned_to_id": 9, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Evaluation of draft documentation" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "High" - }, - { - "name": "assigned_to", - "value": "Robert Kovacik" - } - ] - }, - { - "id": 30, - "name": "Installation of new products - prepare \"Instal team\"", - "start_date": "2016-10-13", - "due_date": "2016-11-01", - "done_ratio": 30, - "css": " closed", - "fixed_version_id": 6, - "project_id": 10, - "tracker_id": 1, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 9, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Installation of new products - prepare \"Instal team\"" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Robert Kovacik" - } - ] - }, - { - "id": 330, - "name": "Data templates do not import estimated time", - "start_date": "2016-06-06", - "due_date": "2016-07-25", - "estimated_hours": 200.0, - "done_ratio": 0, - "css": " closed", - "fixed_version_id": 39, - "project_id": 28, - "tracker_id": 14, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 20, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Data templates do not import estimated time" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Pavel Rosicky" - } - ] - }, - { - "id": 159, - "name": "Workshop with client", - "start_date": "2016-06-11", - "done_ratio": 0, - "css": " closed", - "project_id": 28, - "tracker_id": 1, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 7, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Workshop with client" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Ricky Account Manager" - } - ] - }, - { - "id": 160, - "name": "Business Analysis", - "start_date": "2016-06-11", - "done_ratio": 0, - "css": " closed", - "project_id": 28, - "tracker_id": 1, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 6, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Business Analysis" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Peter Project Man" - } - ] - }, - { - "id": 161, - "name": "Target Group", - "start_date": "2016-06-11", - "done_ratio": 0, - "css": " closed", - "project_id": 28, - "tracker_id": 1, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 6, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Target Group" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Peter Project Man" - } - ] - }, - { - "id": 303, - "name": "Gantt Chart - new task from context menu", - "start_date": "2016-06-14", - "due_date": "2016-06-21", - "estimated_hours": 1.0, - "done_ratio": 0, - "css": " closed", - "fixed_version_id": 39, - "project_id": 28, - "tracker_id": 13, - "priority_id": 10, - "status_id": 6, - "assigned_to_id": 14, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Gantt Chart - new task from context menu" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "High" - }, - { - "name": "assigned_to", - "value": "Alena Staffer" - } - ] - }, - { - "id": 324, - "name": "Task list loading - ", - "start_date": "2016-06-14", - "due_date": "2016-06-21", - "estimated_hours": 1.0, - "done_ratio": 0, - "fixed_version_id": 51, - "overdue": true, - "project_id": 28, - "tracker_id": 14, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 19, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Task list loading - " - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Ondrej Moravcik" - } - ] - }, - { - "id": 329, - "name": "Timer bug", - "start_date": "2016-06-14", - "due_date": "2016-06-21", - "estimated_hours": 1.0, - "done_ratio": 0, - "css": " closed", - "fixed_version_id": 39, - "project_id": 28, - "tracker_id": 14, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 5, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Timer bug" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Manager Manager" - } - ] - }, - { - "id": 154, - "name": "Backend environment setup", - "start_date": "2016-06-27", - "due_date": "2016-07-03", - "estimated_hours": 35.0, - "done_ratio": 0, - "css": " closed", - "project_id": 28, - "tracker_id": 1, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 8, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Backend environment setup" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Dominka Support Operative" - } - ] - }, - { - "id": 745, - "name": "Complete refactor of query system", - "start_date": "2016-06-27", - "due_date": "2016-09-10", - "estimated_hours": 400.0, - "done_ratio": 0, - "project_id": 28, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 21, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Complete refactor of query system" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Ondrej Ezr" - } - ] - }, - { - "id": 746, - "name": "Complete documentation of the software", - "start_date": "2016-06-27", - "due_date": "2016-09-10", - "estimated_hours": 400.0, - "done_ratio": 0, - "project_id": 28, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 15, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Complete documentation of the software" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Pavel Kucera" - } - ] - }, - { - "id": 162, - "name": "Backend features", - "start_date": "2016-06-28", - "done_ratio": 0, - "css": " closed", - "project_id": 28, - "tracker_id": 1, - "priority_id": 9, - "status_id": 6, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Backend features" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 163, - "name": "Backend testing", - "start_date": "2016-06-28", - "done_ratio": 0, - "css": " closed", - "project_id": 28, - "tracker_id": 1, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 6, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Backend testing" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Peter Project Man" - } - ] - }, - { - "id": 164, - "name": "Ecommerce platform", - "start_date": "2016-06-28", - "done_ratio": 0, - "css": " closed", - "project_id": 28, - "tracker_id": 1, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 7, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Ecommerce platform" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Ricky Account Manager" - } - ] - }, - { - "id": 165, - "name": "Payment gateways", - "start_date": "2016-06-28", - "done_ratio": 0, - "css": " closed", - "project_id": 28, - "tracker_id": 1, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 8, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Payment gateways" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Dominka Support Operative" - } - ] - }, - { - "id": 166, - "name": "Shippment methods", - "start_date": "2016-06-28", - "done_ratio": 0, - "css": " closed", - "project_id": 28, - "tracker_id": 1, - "priority_id": 9, - "status_id": 6, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Shippment methods" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 292, - "name": "CRM - sales plans", - "start_date": "2016-07-11", - "due_date": "2016-07-11", - "estimated_hours": 8.0, - "done_ratio": 0, - "fixed_version_id": 41, - "project_id": 28, - "tracker_id": 13, - "priority_id": 11, - "status_id": 1, - "assigned_to_id": 18, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "CRM - sales plans" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Easy task" - }, - { - "name": "assigned_to", - "value": "Lukas Developer" - } - ] - }, - { - "id": 293, - "name": "Meeting Planner tweaks", - "start_date": "2016-07-11", - "due_date": "2016-08-09", - "estimated_hours": 4.0, - "done_ratio": 0, - "fixed_version_id": 40, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 5, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Meeting Planner tweaks" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Manager Manager" - } - ] - }, - { - "id": 299, - "name": "Computed custom field - recalculation", - "start_date": "2016-07-11", - "due_date": "2016-07-11", - "estimated_hours": 3.0, - "done_ratio": 0, - "fixed_version_id": 39, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 14, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Computed custom field - recalculation" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Alena Staffer" - } - ] - }, - { - "id": 301, - "name": "Help Desk - automatically enters external emails", - "start_date": "2016-07-11", - "due_date": "2016-08-23", - "estimated_hours": 1.0, - "done_ratio": 0, - "fixed_version_id": 41, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Help Desk - automatically enters external emails" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 302, - "name": "Bulk time entries - save and go back", - "start_date": "2016-07-11", - "due_date": "2016-08-23", - "estimated_hours": 2.0, - "done_ratio": 0, - "fixed_version_id": 41, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 6, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Bulk time entries - save and go back" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Peter Project Man" - } - ] - }, - { - "id": 310, - "name": "Issues filter - project is not planned", - "start_date": "2016-07-11", - "due_date": "2016-08-23", - "estimated_hours": 1.0, - "done_ratio": 0, - "fixed_version_id": 41, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Issues filter - project is not planned" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 311, - "name": "Agile board - display custom fields", - "start_date": "2016-07-11", - "due_date": "2016-09-05", - "estimated_hours": 2.0, - "done_ratio": 0, - "fixed_version_id": 42, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Agile board - display custom fields" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 312, - "name": "Help Desk - ticket to group", - "start_date": "2016-07-11", - "due_date": "2016-08-09", - "estimated_hours": 3.0, - "done_ratio": 0, - "fixed_version_id": 40, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Help Desk - ticket to group" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 319, - "name": "Gantt - default filters", - "start_date": "2016-07-11", - "due_date": "2016-08-09", - "estimated_hours": 2.0, - "done_ratio": 0, - "fixed_version_id": 40, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Gantt - default filters" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 325, - "name": "Meeting - repeating does not work", - "start_date": "2016-07-11", - "due_date": "2016-07-30", - "estimated_hours": 20.0, - "done_ratio": 0, - "fixed_version_id": 39, - "project_id": 28, - "tracker_id": 14, - "priority_id": 9, - "status_id": 2, - "assigned_to_id": 14, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Meeting - repeating does not work" - }, - { - "name": "status", - "value": "Realisation" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Alena Staffer" - } - ] - }, - { - "id": 326, - "name": "Document inserts 2x", - "start_date": "2016-07-11", - "due_date": "2016-07-18", - "estimated_hours": 1.0, - "done_ratio": 0, - "fixed_version_id": 42, - "project_id": 28, - "tracker_id": 14, - "priority_id": 11, - "status_id": 2, - "assigned_to_id": 14, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Document inserts 2x" - }, - { - "name": "status", - "value": "Realisation" - }, - { - "name": "priority", - "value": "Easy task" - }, - { - "name": "assigned_to", - "value": "Alena Staffer" - } - ] - }, - { - "id": 295, - "name": "Agile Board - Fixed Backlog", - "start_date": "2016-07-13", - "due_date": "2016-07-14", - "estimated_hours": 2.0, - "done_ratio": 0, - "fixed_version_id": 39, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 5, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Agile Board - Fixed Backlog" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Manager Manager" - } - ] - }, - { - "id": 327, - "name": "User edit - apply from template", - "start_date": "2016-07-13", - "due_date": "2016-07-14", - "estimated_hours": 1.0, - "done_ratio": 0, - "fixed_version_id": 39, - "project_id": 28, - "tracker_id": 14, - "priority_id": 9, - "status_id": 3, - "assigned_to_id": 5, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "User edit - apply from template" - }, - { - "name": "status", - "value": "Consultation" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Manager Manager" - } - ] - }, - { - "id": 296, - "name": "Custom fields - confirmation", - "start_date": "2016-07-18", - "due_date": "2016-07-18", - "estimated_hours": 2.0, - "done_ratio": 0, - "fixed_version_id": 42, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 3, - "assigned_to_id": 18, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Custom fields - confirmation" - }, - { - "name": "status", - "value": "Consultation" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Lukas Developer" - } - ] - }, - { - "id": 297, - "name": "Booking calendar - permissions", - "start_date": "2016-07-18", - "due_date": "2016-07-18", - "estimated_hours": 2.0, - "done_ratio": 0, - "fixed_version_id": 39, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 19, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Booking calendar - permissions" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Ondrej Moravcik" - } - ] - }, - { - "id": 298, - "name": "Meetings for others", - "start_date": "2016-07-18", - "due_date": "2016-08-05", - "estimated_hours": 70.0, - "done_ratio": 0, - "fixed_version_id": 42, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 8, - "assigned_to_id": 14, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Meetings for others" - }, - { - "name": "status", - "value": "Sequence pending" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Alena Staffer" - } - ] - }, - { - "id": 305, - "name": "Log time on task from more menu - modal window", - "start_date": "2016-07-18", - "due_date": "2016-07-18", - "estimated_hours": 3.0, - "done_ratio": 0, - "fixed_version_id": 42, - "project_id": 28, - "tracker_id": 13, - "priority_id": 10, - "status_id": 3, - "assigned_to_id": 14, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Log time on task from more menu - modal window" - }, - { - "name": "status", - "value": "Consultation" - }, - { - "name": "priority", - "value": "High" - }, - { - "name": "assigned_to", - "value": "Alena Staffer" - } - ] - }, - { - "id": 328, - "name": "Booking callendar - 25 hours per day", - "start_date": "2016-07-18", - "due_date": "2016-07-18", - "estimated_hours": 1.0, - "done_ratio": 0, - "fixed_version_id": 39, - "project_id": 28, - "tracker_id": 14, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 20, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Booking callendar - 25 hours per day" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Pavel Rosicky" - } - ] - }, - { - "id": 322, - "name": "Printable templates - project fileds not visible", - "start_date": "2016-07-21", - "due_date": "2016-07-22", - "estimated_hours": 4.0, - "done_ratio": 0, - "fixed_version_id": 39, - "project_id": 28, - "tracker_id": 14, - "priority_id": 10, - "status_id": 3, - "assigned_to_id": 18, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Printable templates - project fileds not visible" - }, - { - "name": "status", - "value": "Consultation" - }, - { - "name": "priority", - "value": "High" - }, - { - "name": "assigned_to", - "value": "Lukas Developer" - } - ] - }, - { - "id": 331, - "name": "Gantt view - tasks do not line-up ", - "start_date": "2016-07-23", - "due_date": "2016-07-23", - "estimated_hours": 5.0, - "done_ratio": 0, - "fixed_version_id": 39, - "project_id": 28, - "tracker_id": 14, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 19, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Gantt view - tasks do not line-up " - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Ondrej Moravcik" - } - ] - }, - { - "id": 158, - "name": "Current state evaluation", - "start_date": "2016-07-23", - "due_date": "2016-07-30", - "estimated_hours": 40.0, - "done_ratio": 0, - "css": " closed", - "project_id": 28, - "tracker_id": 1, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 7, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Current state evaluation" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Ricky Account Manager" - } - ] - }, - { - "id": 294, - "name": "Personal Page Modul - Activity on my tasks/projects", - "start_date": "2016-07-25", - "due_date": "2016-08-10", - "estimated_hours": 80.0, - "done_ratio": 0, - "fixed_version_id": 41, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 19, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Personal Page Modul - Activity on my tasks/projects" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Ondrej Moravcik" - } - ] - }, - { - "id": 321, - "name": "Social Wall tweaking", - "start_date": "2016-07-26", - "due_date": "2016-07-26", - "estimated_hours": 3.0, - "done_ratio": 0, - "fixed_version_id": 39, - "project_id": 28, - "tracker_id": 14, - "priority_id": 10, - "status_id": 2, - "assigned_to_id": 19, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Social Wall tweaking" - }, - { - "name": "status", - "value": "Realisation" - }, - { - "name": "priority", - "value": "High" - }, - { - "name": "assigned_to", - "value": "Ondrej Moravcik" - } - ] - }, - { - "id": 320, - "name": "Invoicing - default invoice template", - "start_date": "2016-07-31", - "due_date": "2016-07-31", - "estimated_hours": 8.0, - "done_ratio": 0, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 18, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Invoicing - default invoice template" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Lukas Developer" - } - ] - }, - { - "id": 300, - "name": "Restrict roles creation of issues in certain trackers", - "start_date": "2016-08-02", - "due_date": "2016-08-02", - "estimated_hours": 4.0, - "done_ratio": 0, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 18, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Restrict roles creation of issues in certain trackers" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Lukas Developer" - } - ] - }, - { - "id": 309, - "name": "Resource Management Setting in tab", - "start_date": "2016-08-02", - "due_date": "2016-08-02", - "estimated_hours": 2.0, - "done_ratio": 0, - "project_id": 28, - "tracker_id": 13, - "priority_id": 10, - "status_id": 2, - "assigned_to_id": 14, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Resource Management Setting in tab" - }, - { - "name": "status", - "value": "Realisation" - }, - { - "name": "priority", - "value": "High" - }, - { - "name": "assigned_to", - "value": "Alena Staffer" - } - ] - }, - { - "id": 304, - "name": "Advanced calendar on personal page - Ajax", - "start_date": "2016-08-07", - "due_date": "2016-08-07", - "estimated_hours": 8.0, - "done_ratio": 0, - "project_id": 28, - "tracker_id": 13, - "priority_id": 10, - "status_id": 1, - "assigned_to_id": 18, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Advanced calendar on personal page - Ajax" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "High" - }, - { - "name": "assigned_to", - "value": "Lukas Developer" - } - ] - }, - { - "id": 313, - "name": "CRM features - Accounts", - "start_date": "2016-08-07", - "due_date": "2016-08-07", - "estimated_hours": 5.0, - "done_ratio": 0, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 18, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "CRM features - Accounts" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Lukas Developer" - } - ] - }, - { - "id": 314, - "name": "Help Desk - SMS notify", - "start_date": "2016-08-07", - "due_date": "2016-08-07", - "estimated_hours": 3.0, - "done_ratio": 0, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 18, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Help Desk - SMS notify" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Lukas Developer" - } - ] - }, - { - "id": 307, - "name": "Long running operation to cron", - "start_date": "2016-08-08", - "due_date": "2016-08-08", - "estimated_hours": 5.0, - "done_ratio": 0, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 8, - "assigned_to_id": 18, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Long running operation to cron" - }, - { - "name": "status", - "value": "Sequence pending" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Lukas Developer" - } - ] - }, - { - "id": 317, - "name": "Gantt Relations - follows ", - "start_date": "2016-08-09", - "due_date": "2016-08-09", - "estimated_hours": 4.0, - "done_ratio": 0, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 18, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Gantt Relations - follows " - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Lukas Developer" - } - ] - }, - { - "id": 323, - "name": "Sequnces - blank page", - "start_date": "2016-08-10", - "due_date": "2016-08-10", - "estimated_hours": 5.0, - "done_ratio": 0, - "project_id": 28, - "tracker_id": 14, - "priority_id": 9, - "status_id": 3, - "assigned_to_id": 18, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Sequnces - blank page" - }, - { - "name": "status", - "value": "Consultation" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Lukas Developer" - } - ] - }, - { - "id": 315, - "name": "Redmine 3.0 mearge", - "start_date": "2016-08-14", - "due_date": "2016-08-30", - "estimated_hours": 30.0, - "done_ratio": 0, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 18, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Redmine 3.0 mearge" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Lukas Developer" - } - ] - }, - { - "id": 308, - "name": "Agile - Sprint - Milestone", - "start_date": "2016-08-21", - "due_date": "2016-08-24", - "estimated_hours": 4.0, - "done_ratio": 0, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 18, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Agile - Sprint - Milestone" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Lukas Developer" - } - ] - }, - { - "id": 316, - "name": "Attendance REST API", - "start_date": "2016-08-21", - "due_date": "2016-08-21", - "estimated_hours": 8.0, - "done_ratio": 0, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 18, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Attendance REST API" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Lukas Developer" - } - ] - }, - { - "id": 318, - "name": "Attendance monitoring - remaining days of vacation", - "start_date": "2016-08-21", - "due_date": "2016-08-22", - "estimated_hours": 4.0, - "done_ratio": 0, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 18, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Attendance monitoring - remaining days of vacation" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Lukas Developer" - } - ] - }, - { - "id": 291, - "name": "GitLab integration", - "start_date": "2016-08-25", - "due_date": "2016-09-21", - "estimated_hours": 60.0, - "done_ratio": 0, - "fixed_version_id": 41, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 2, - "assigned_to_id": 5, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "GitLab integration" - }, - { - "name": "status", - "value": "Realisation" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Manager Manager" - } - ] - }, - { - "id": 306, - "name": "Invocing 1", - "start_date": "2016-08-27", - "due_date": "2016-08-31", - "estimated_hours": 10.0, - "done_ratio": 0, - "project_id": 28, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 18, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Invocing 1" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Lukas Developer" - } - ] - }, - { - "id": 371, - "name": "Features Specification", - "start_date": "2016-03-29", - "due_date": "2016-03-29", - "estimated_hours": 1.0, - "done_ratio": 0, - "fixed_version_id": 58, - "overdue": true, - "project_id": 41, - "tracker_id": 5, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Features Specification" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 372, - "name": "Creative brief", - "start_date": "2016-04-04", - "due_date": "2016-04-08", - "estimated_hours": 1.0, - "done_ratio": 0, - "fixed_version_id": 58, - "overdue": true, - "project_id": 41, - "tracker_id": 5, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Creative brief" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 373, - "name": "Marketing brief", - "start_date": "2016-04-04", - "due_date": "2016-04-04", - "estimated_hours": 1.0, - "done_ratio": 0, - "fixed_version_id": 58, - "overdue": true, - "project_id": 41, - "tracker_id": 5, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Marketing brief" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 374, - "name": "Wireframes", - "start_date": "2016-04-11", - "due_date": "2016-04-11", - "estimated_hours": 8.0, - "done_ratio": 0, - "fixed_version_id": 57, - "overdue": true, - "project_id": 41, - "tracker_id": 3, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Wireframes" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 375, - "name": "Graphics", - "start_date": "2016-04-15", - "due_date": "2016-04-18", - "estimated_hours": 16.0, - "done_ratio": 0, - "fixed_version_id": 57, - "overdue": true, - "project_id": 41, - "tracker_id": 3, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Graphics" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 376, - "name": "XHTML + CSS coding", - "start_date": "2016-04-25", - "due_date": "2016-05-02", - "estimated_hours": 15.0, - "done_ratio": 0, - "fixed_version_id": 57, - "overdue": true, - "project_id": 41, - "tracker_id": 3, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "XHTML + CSS coding" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 378, - "name": "VirtueMart implementation", - "start_date": "2016-05-03", - "due_date": "2016-05-03", - "estimated_hours": 5.0, - "done_ratio": 0, - "fixed_version_id": 56, - "overdue": true, - "project_id": 41, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "VirtueMart implementation" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 383, - "name": "On-line payments", - "start_date": "2016-05-09", - "due_date": "2016-05-10", - "estimated_hours": 10.0, - "done_ratio": 0, - "fixed_version_id": 56, - "overdue": true, - "project_id": 41, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "On-line payments" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 379, - "name": "Web structure", - "start_date": "2016-05-11", - "due_date": "2016-05-11", - "estimated_hours": 5.0, - "done_ratio": 0, - "fixed_version_id": 55, - "overdue": true, - "project_id": 41, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Web structure" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 377, - "name": "CMS - implementation + setting", - "start_date": "2016-05-13", - "due_date": "2016-05-13", - "estimated_hours": 5.0, - "done_ratio": 0, - "fixed_version_id": 56, - "overdue": true, - "project_id": 41, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "CMS - implementation + setting" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 380, - "name": "Products", - "start_date": "2016-05-16", - "due_date": "2016-05-17", - "estimated_hours": 10.0, - "done_ratio": 0, - "fixed_version_id": 55, - "overdue": true, - "project_id": 41, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Products" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 381, - "name": "Specific features", - "start_date": "2016-05-18", - "due_date": "2016-05-18", - "estimated_hours": 10.0, - "done_ratio": 0, - "fixed_version_id": 54, - "overdue": true, - "project_id": 41, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Specific features" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 382, - "name": "Easy Redmine Integration", - "start_date": "2016-05-23", - "due_date": "2016-05-23", - "estimated_hours": 5.0, - "done_ratio": 0, - "fixed_version_id": 54, - "overdue": true, - "project_id": 41, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Easy Redmine Integration" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 384, - "name": "Google Analytics", - "start_date": "2016-05-25", - "due_date": "2016-05-30", - "estimated_hours": 3.0, - "done_ratio": 0, - "fixed_version_id": 53, - "overdue": true, - "project_id": 41, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Google Analytics" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 385, - "name": "Testing ", - "start_date": "2016-05-30", - "due_date": "2016-05-31", - "estimated_hours": 10.0, - "done_ratio": 0, - "fixed_version_id": 53, - "overdue": true, - "project_id": 41, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Testing " - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 386, - "name": "Debug", - "start_date": "2016-06-02", - "due_date": "2016-06-07", - "estimated_hours": 10.0, - "done_ratio": 0, - "fixed_version_id": 53, - "overdue": true, - "project_id": 41, - "tracker_id": 13, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 21, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Debug" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Ondrej Ezr" - } - ] - }, - { - "id": 387, - "name": "Training", - "start_date": "2016-06-06", - "due_date": "2016-06-07", - "estimated_hours": 4.0, - "done_ratio": 0, - "fixed_version_id": 53, - "overdue": true, - "project_id": 41, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Training" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 748, - "name": "task 1", - "start_date": "2016-06-27", - "due_date": "2016-06-28", - "estimated_hours": 0.0, - "done_ratio": 100, - "fixed_version_id": 116, - "project_id": 63, - "tracker_id": 6, - "priority_id": 9, - "status_id": 4, - "assigned_to_id": 14, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "task 1" - }, - { - "name": "status", - "value": "To check" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Alena Staffer" - } - ] - }, - { - "id": 749, - "name": "task 2", - "start_date": "2016-06-27", - "due_date": "2016-06-28", - "estimated_hours": 0.0, - "done_ratio": 0, - "fixed_version_id": 116, - "project_id": 63, - "tracker_id": 6, - "priority_id": 9, - "status_id": 2, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "task 2" - }, - { - "name": "status", - "value": "Realisation" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 750, - "name": "task 3", - "start_date": "2016-06-27", - "due_date": "2016-06-28", - "estimated_hours": 0.0, - "done_ratio": 0, - "fixed_version_id": 116, - "project_id": 63, - "tracker_id": 1, - "priority_id": 11, - "status_id": 4, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "task 3" - }, - { - "name": "status", - "value": "To check" - }, - { - "name": "priority", - "value": "Easy task" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 751, - "name": "task 4", - "start_date": "2016-06-27", - "due_date": "2016-06-28", - "estimated_hours": 0.0, - "done_ratio": 0, - "fixed_version_id": 116, - "project_id": 63, - "tracker_id": 4, - "priority_id": 8, - "status_id": 3, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "task 4" - }, - { - "name": "status", - "value": "Consultation" - }, - { - "name": "priority", - "value": "Low" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 752, - "name": "task 5", - "start_date": "2016-06-27", - "due_date": "2016-06-28", - "estimated_hours": 0.0, - "done_ratio": 0, - "fixed_version_id": 116, - "project_id": 63, - "tracker_id": 13, - "priority_id": 10, - "status_id": 10, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "task 5" - }, - { - "name": "status", - "value": "Approved" - }, - { - "name": "priority", - "value": "High" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 755, - "name": "task 8", - "start_date": "2016-07-03", - "due_date": "2016-07-04", - "estimated_hours": 0.0, - "done_ratio": 0, - "fixed_version_id": 117, - "project_id": 63, - "tracker_id": 5, - "priority_id": 10, - "status_id": 8, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "task 8" - }, - { - "name": "status", - "value": "Sequence pending" - }, - { - "name": "priority", - "value": "High" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 753, - "name": "task 6", - "start_date": "2016-07-04", - "due_date": "2016-07-05", - "estimated_hours": 0.0, - "done_ratio": 0, - "fixed_version_id": 117, - "project_id": 63, - "tracker_id": 3, - "priority_id": 9, - "status_id": 2, - "assigned_to_id": 5, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "task 6" - }, - { - "name": "status", - "value": "Realisation" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Manager Manager" - } - ] - }, - { - "id": 754, - "name": "task 7", - "start_date": "2016-07-04", - "due_date": "2016-07-05", - "estimated_hours": 0.0, - "done_ratio": 0, - "fixed_version_id": 117, - "project_id": 63, - "tracker_id": 1, - "priority_id": 11, - "status_id": 4, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "task 7" - }, - { - "name": "status", - "value": "To check" - }, - { - "name": "priority", - "value": "Easy task" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 758, - "name": "task 11", - "start_date": "2016-07-10", - "due_date": "2016-07-11", - "estimated_hours": 0.0, - "done_ratio": 0, - "fixed_version_id": 117, - "project_id": 63, - "tracker_id": 15, - "priority_id": 11, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "task 11" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Easy task" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 756, - "name": "task 9", - "start_date": "2016-07-12", - "due_date": "2016-07-13", - "estimated_hours": 0.0, - "done_ratio": 0, - "fixed_version_id": 117, - "project_id": 63, - "tracker_id": 4, - "priority_id": 10, - "status_id": 2, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "task 9" - }, - { - "name": "status", - "value": "Realisation" - }, - { - "name": "priority", - "value": "High" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 757, - "name": "task 10", - "start_date": "2016-07-12", - "due_date": "2016-07-13", - "estimated_hours": 0.0, - "done_ratio": 0, - "parent_issue_id": 756, - "project_id": 63, - "tracker_id": 16, - "priority_id": 15, - "status_id": 3, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "task 10" - }, - { - "name": "status", - "value": "Consultation" - }, - { - "name": "priority", - "value": "Critical" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2653, - "name": "Venue", - "start_date": "2016-06-16", - "due_date": "2016-08-27", - "done_ratio": 0, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Venue" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2654, - "name": "Space", - "start_date": "2016-06-16", - "due_date": "2016-08-06", - "done_ratio": 0, - "parent_issue_id": 2653, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Space" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2655, - "name": "List suitable possibilities according to size", - "start_date": "2016-06-16", - "due_date": "2016-06-20", - "estimated_hours": 10.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2654, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "List suitable possibilities according to size" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2699, - "name": "Venue booking", - "start_date": "2016-06-16", - "due_date": "2016-08-27", - "done_ratio": 0, - "parent_issue_id": 2653, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Venue booking" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2700, - "name": "List suitable possibilities according to type", - "start_date": "2016-06-16", - "due_date": "2016-06-20", - "estimated_hours": 10.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2699, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "List suitable possibilities according to type" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2701, - "name": "List suitable possibilities according to location", - "start_date": "2016-06-16", - "due_date": "2016-06-20", - "estimated_hours": 10.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2699, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "List suitable possibilities according to location" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2707, - "name": "Programme", - "start_date": "2016-06-16", - "due_date": "2016-08-18", - "done_ratio": 0, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Programme" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2708, - "name": "Official", - "start_date": "2016-06-16", - "due_date": "2016-08-18", - "done_ratio": 0, - "parent_issue_id": 2707, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Official" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2709, - "name": "Main programme", - "start_date": "2016-06-16", - "due_date": "2016-08-18", - "done_ratio": 0, - "parent_issue_id": 2708, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Main programme" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2710, - "name": "Define purpose of the event", - "start_date": "2016-06-16", - "due_date": "2016-06-17", - "estimated_hours": 4.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2709, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Define purpose of the event" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2715, - "name": "Secondary activities", - "start_date": "2016-06-16", - "due_date": "2016-06-26", - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2708, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Secondary activities" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2717, - "name": "Find how the main activities can be supported", - "start_date": "2016-06-16", - "due_date": "2016-06-16", - "estimated_hours": 8.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2715, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Find how the main activities can be supported" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2720, - "name": "Workshops", - "start_date": "2016-06-16", - "due_date": "2016-07-03", - "done_ratio": 0, - "parent_issue_id": 2708, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Workshops" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2721, - "name": "Create a list of most suitable workshops", - "start_date": "2016-06-16", - "due_date": "2016-06-27", - "estimated_hours": 10.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2720, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Create a list of most suitable workshops" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2744, - "name": "People", - "start_date": "2016-06-16", - "due_date": "2016-08-01", - "done_ratio": 0, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "People" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2745, - "name": "Guests", - "start_date": "2016-06-16", - "due_date": "2016-08-01", - "done_ratio": 0, - "parent_issue_id": 2744, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Guests" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2749, - "name": "Estimate attendance", - "start_date": "2016-06-16", - "due_date": "2016-06-17", - "estimated_hours": 2.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2745, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Estimate attendance" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2711, - "name": "Define desired outcomes of the event", - "start_date": "2016-06-17", - "due_date": "2016-06-18", - "estimated_hours": 8.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2709, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Define desired outcomes of the event" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2746, - "name": "Prepare online ticket/registration", - "start_date": "2016-06-17", - "due_date": "2016-06-30", - "estimated_hours": 30.0, - "done_ratio": 0, - "parent_issue_id": 2745, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Prepare online ticket/registration" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2751, - "name": "Invite guests", - "start_date": "2016-06-17", - "due_date": "2016-07-21", - "estimated_hours": 15.0, - "done_ratio": 0, - "parent_issue_id": 2745, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Invite guests" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2752, - "name": "Speakers", - "start_date": "2016-06-17", - "due_date": "2016-07-04", - "done_ratio": 0, - "parent_issue_id": 2744, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Speakers" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2753, - "name": "Put together a list of desired speakers", - "start_date": "2016-06-17", - "due_date": "2016-06-24", - "estimated_hours": 4.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2752, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Put together a list of desired speakers" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2756, - "name": "Staff", - "start_date": "2016-06-17", - "due_date": "2016-07-04", - "done_ratio": 0, - "parent_issue_id": 2744, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Staff" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2757, - "name": "Plan required capacities", - "start_date": "2016-06-17", - "due_date": "2016-06-23", - "estimated_hours": 8.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2756, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Plan required capacities" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2760, - "name": "Entertainers", - "start_date": "2016-06-17", - "due_date": "2016-07-04", - "done_ratio": 0, - "parent_issue_id": 2744, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Entertainers" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2761, - "name": "Put together list of desired entertainers", - "start_date": "2016-06-17", - "due_date": "2016-06-24", - "estimated_hours": 4.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2760, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Put together list of desired entertainers" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2712, - "name": "List activities leading to succeed in the purpose", - "start_date": "2016-06-18", - "due_date": "2016-06-23", - "estimated_hours": 30.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2709, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "List activities leading to succeed in the purpose" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2764, - "name": "Budget", - "start_date": "2016-06-18", - "due_date": "2016-07-22", - "done_ratio": 0, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Budget" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2765, - "name": "Budget for venue", - "start_date": "2016-06-18", - "due_date": "2016-07-22", - "done_ratio": 0, - "parent_issue_id": 2764, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Budget for venue" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2766, - "name": "Compile 1st venue budget estimate", - "start_date": "2016-06-18", - "due_date": "2016-06-20", - "estimated_hours": 4.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2765, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Compile 1st venue budget estimate" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2769, - "name": "Budget for activities", - "start_date": "2016-06-18", - "due_date": "2016-07-22", - "done_ratio": 0, - "parent_issue_id": 2764, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Budget for activities" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2770, - "name": "Compile 1st programme budget estimate", - "start_date": "2016-06-18", - "due_date": "2016-06-20", - "estimated_hours": 4.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2769, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Compile 1st programme budget estimate" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2773, - "name": "Budget for people", - "start_date": "2016-06-18", - "due_date": "2016-07-22", - "done_ratio": 0, - "parent_issue_id": 2764, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Budget for people" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2774, - "name": "Compile 1st personal budget estimate", - "start_date": "2016-06-18", - "due_date": "2016-06-20", - "estimated_hours": 4.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2773, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Compile 1st personal budget estimate" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2702, - "name": "Contact venues for quotations", - "start_date": "2016-06-19", - "due_date": "2016-06-25", - "estimated_hours": 24.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2699, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Contact venues for quotations" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2716, - "name": "Define supporting activities ", - "start_date": "2016-06-19", - "due_date": "2016-06-20", - "estimated_hours": 12.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2715, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Define supporting activities " - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2723, - "name": "Entertainment", - "start_date": "2016-06-19", - "due_date": "2016-07-02", - "done_ratio": 0, - "parent_issue_id": 2707, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Entertainment" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2724, - "name": "Music", - "start_date": "2016-06-19", - "due_date": "2016-06-23", - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2723, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Music" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2725, - "name": "List suitable genres", - "start_date": "2016-06-19", - "due_date": "2016-06-19", - "estimated_hours": 2.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2724, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "List suitable genres" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2718, - "name": "Gather equipment requirements for secondary activities", - "start_date": "2016-06-20", - "due_date": "2016-06-23", - "estimated_hours": 10.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2715, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Gather equipment requirements for secondary activities" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2727, - "name": "Design form of music entertainment", - "start_date": "2016-06-20", - "due_date": "2016-06-21", - "estimated_hours": 8.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2724, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Design form of music entertainment" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2719, - "name": "Book sufficient equipment", - "start_date": "2016-06-22", - "due_date": "2016-06-26", - "estimated_hours": 10.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2715, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Book sufficient equipment" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2713, - "name": "Gather equipment requirements for main activities", - "start_date": "2016-06-23", - "due_date": "2016-07-02", - "estimated_hours": 16.0, - "done_ratio": 0, - "parent_issue_id": 2709, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Gather equipment requirements for main activities" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2726, - "name": "Finalize music programme", - "start_date": "2016-06-23", - "due_date": "2016-06-23", - "estimated_hours": 5.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2724, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Finalize music programme" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2728, - "name": "Performance", - "start_date": "2016-06-23", - "due_date": "2016-06-24", - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2723, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Performance" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2729, - "name": "Compile a list of suitable performance forms", - "start_date": "2016-06-23", - "due_date": "2016-06-23", - "estimated_hours": 4.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2728, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Compile a list of suitable performance forms" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2730, - "name": "Finalize performance programme", - "start_date": "2016-06-23", - "due_date": "2016-06-24", - "estimated_hours": 4.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2728, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Finalize performance programme" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2731, - "name": "Shops/Booths", - "start_date": "2016-06-23", - "due_date": "2016-07-02", - "done_ratio": 0, - "parent_issue_id": 2723, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Shops/Booths" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2732, - "name": "List relevant merchandise", - "start_date": "2016-06-23", - "due_date": "2016-06-27", - "estimated_hours": 5.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2731, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "List relevant merchandise" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2734, - "name": "Interactive", - "start_date": "2016-06-23", - "due_date": "2016-06-25", - "estimated_hours": 0.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2723, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Interactive" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2735, - "name": "Find relevant interactive activites", - "start_date": "2016-06-23", - "due_date": "2016-06-24", - "estimated_hours": 6.0, - "done_ratio": 0, - "fixed_version_id": 0, - "overdue": true, - "parent_issue_id": 2734, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Find relevant interactive activites" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2736, - "name": "Finalize list of interactive activities", - "start_date": "2016-06-23", - "due_date": "2016-06-25", - "estimated_hours": 4.0, - "done_ratio": 0, - "fixed_version_id": 0, - "overdue": true, - "parent_issue_id": 2734, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Finalize list of interactive activities" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2737, - "name": "Schedule", - "start_date": "2016-06-23", - "due_date": "2016-07-25", - "done_ratio": 0, - "parent_issue_id": 2707, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Schedule" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2738, - "name": "Compile main programme timetable", - "start_date": "2016-06-23", - "due_date": "2016-07-08", - "estimated_hours": 15.0, - "done_ratio": 0, - "parent_issue_id": 2737, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Compile main programme timetable" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2758, - "name": "Find personal agency", - "start_date": "2016-06-23", - "due_date": "2016-06-26", - "estimated_hours": 5.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 2756, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Find personal agency" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2767, - "name": "Continuously precise venue budget according known data", - "start_date": "2016-06-23", - "due_date": "2016-07-18", - "estimated_hours": 25.0, - "done_ratio": 0, - "parent_issue_id": 2765, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Continuously precise venue budget according known data" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2771, - "name": "Continuously precise programme budget according to known data", - "start_date": "2016-06-23", - "due_date": "2016-07-18", - "estimated_hours": 25.0, - "done_ratio": 0, - "parent_issue_id": 2769, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Continuously precise programme budget according to known data" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2775, - "name": "Continuously precise personal budget according to known data", - "start_date": "2016-06-23", - "due_date": "2016-07-18", - "estimated_hours": 25.0, - "done_ratio": 0, - "parent_issue_id": 2773, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Continuously precise personal budget according to known data" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2739, - "name": "Compile secondary activities timetable", - "start_date": "2016-06-24", - "due_date": "2016-06-30", - "estimated_hours": 5.0, - "done_ratio": 0, - "parent_issue_id": 2737, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Compile secondary activities timetable" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2722, - "name": "Finalize list of approved workshops", - "start_date": "2016-06-25", - "due_date": "2016-07-03", - "estimated_hours": 4.0, - "done_ratio": 0, - "parent_issue_id": 2720, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Finalize list of approved workshops" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2740, - "name": "Compile workshops timetable", - "start_date": "2016-06-25", - "due_date": "2016-07-01", - "estimated_hours": 10.0, - "done_ratio": 0, - "parent_issue_id": 2737, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Compile workshops timetable" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2741, - "name": "Compile entertainment timetable", - "start_date": "2016-06-25", - "due_date": "2016-07-09", - "estimated_hours": 10.0, - "done_ratio": 0, - "parent_issue_id": 2737, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Compile entertainment timetable" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2742, - "name": "Set catering schedule", - "start_date": "2016-06-25", - "due_date": "2016-07-01", - "estimated_hours": 5.0, - "done_ratio": 0, - "parent_issue_id": 2737, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Set catering schedule" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2754, - "name": "Invite speakers from list", - "start_date": "2016-06-25", - "due_date": "2016-07-01", - "estimated_hours": 5.0, - "done_ratio": 0, - "parent_issue_id": 2752, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Invite speakers from list" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2762, - "name": "Invite entertainers from list", - "start_date": "2016-06-25", - "due_date": "2016-07-01", - "estimated_hours": 5.0, - "done_ratio": 0, - "parent_issue_id": 2760, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Invite entertainers from list" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2704, - "name": "Decide on the best offer", - "start_date": "2016-06-26", - "due_date": "2016-06-30", - "estimated_hours": 4.0, - "done_ratio": 0, - "parent_issue_id": 2699, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Decide on the best offer" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2733, - "name": "Finalize list of shops", - "start_date": "2016-06-26", - "due_date": "2016-07-02", - "estimated_hours": 8.0, - "done_ratio": 0, - "parent_issue_id": 2731, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Finalize list of shops" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2686, - "name": "Transport", - "start_date": "2016-06-27", - "due_date": "2016-08-19", - "done_ratio": 0, - "parent_issue_id": 2653, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Transport" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2694, - "name": "Transport of staff", - "start_date": "2016-06-27", - "due_date": "2016-07-22", - "done_ratio": 0, - "parent_issue_id": 2686, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Transport of staff" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2696, - "name": "Plan capacity of staff transport", - "start_date": "2016-06-27", - "due_date": "2016-07-11", - "estimated_hours": 15.0, - "done_ratio": 0, - "parent_issue_id": 2694, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Plan capacity of staff transport" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2759, - "name": "Acquire suitable capacities", - "start_date": "2016-06-27", - "due_date": "2016-07-04", - "estimated_hours": 10.0, - "done_ratio": 0, - "parent_issue_id": 2756, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Acquire suitable capacities" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2687, - "name": "Transport of guests", - "start_date": "2016-06-30", - "due_date": "2016-08-12", - "done_ratio": 0, - "parent_issue_id": 2686, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Transport of guests" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2688, - "name": "Plan capacity of guest transport", - "start_date": "2016-06-30", - "due_date": "2016-07-22", - "estimated_hours": 16.0, - "done_ratio": 0, - "parent_issue_id": 2687, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Plan capacity of guest transport" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2703, - "name": "Book selected venue", - "start_date": "2016-06-30", - "due_date": "2016-06-30", - "estimated_hours": 2.0, - "done_ratio": 0, - "parent_issue_id": 2699, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Book selected venue" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2706, - "name": "Agree on booking conditions", - "start_date": "2016-06-30", - "due_date": "2016-07-01", - "estimated_hours": 2.0, - "done_ratio": 0, - "parent_issue_id": 2699, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Agree on booking conditions" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2714, - "name": "Book sufficient equipment", - "start_date": "2016-06-30", - "due_date": "2016-08-18", - "estimated_hours": 30.0, - "done_ratio": 0, - "parent_issue_id": 2709, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Book sufficient equipment" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2755, - "name": "Finalize approved speakers list", - "start_date": "2016-06-30", - "due_date": "2016-07-04", - "estimated_hours": 2.0, - "done_ratio": 0, - "parent_issue_id": 2752, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Finalize approved speakers list" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2763, - "name": "Finalize approved entertainers", - "start_date": "2016-06-30", - "due_date": "2016-07-04", - "estimated_hours": 2.0, - "done_ratio": 0, - "parent_issue_id": 2760, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Finalize approved entertainers" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2743, - "name": "Aggregate complete schedule", - "start_date": "2016-07-01", - "due_date": "2016-07-25", - "estimated_hours": 15.0, - "done_ratio": 0, - "parent_issue_id": 2737, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Aggregate complete schedule" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2750, - "name": "Launch online registration", - "start_date": "2016-07-01", - "due_date": "2016-07-03", - "estimated_hours": 4.0, - "done_ratio": 0, - "parent_issue_id": 2745, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Launch online registration" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2658, - "name": "Services", - "start_date": "2016-07-04", - "due_date": "2016-08-20", - "done_ratio": 0, - "parent_issue_id": 2653, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Services" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2659, - "name": "Accommodation", - "start_date": "2016-07-04", - "due_date": "2016-08-20", - "done_ratio": 0, - "parent_issue_id": 2658, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Accommodation" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2660, - "name": "Verify capacity", - "start_date": "2016-07-04", - "due_date": "2016-08-01", - "estimated_hours": 12.0, - "done_ratio": 0, - "parent_issue_id": 2659, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Verify capacity" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2748, - "name": "Plan reserve for unregistered guests", - "start_date": "2016-07-04", - "due_date": "2016-07-23", - "estimated_hours": 16.0, - "done_ratio": 0, - "parent_issue_id": 2745, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Plan reserve for unregistered guests" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2665, - "name": "Catering", - "start_date": "2016-07-07", - "due_date": "2016-08-15", - "done_ratio": 0, - "parent_issue_id": 2658, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Catering" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2668, - "name": "Decide on the form of catering", - "start_date": "2016-07-07", - "due_date": "2016-07-15", - "estimated_hours": 5.0, - "done_ratio": 0, - "parent_issue_id": 2665, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Decide on the form of catering" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2695, - "name": "Book transport service for staff", - "start_date": "2016-07-07", - "due_date": "2016-07-22", - "estimated_hours": 6.0, - "done_ratio": 0, - "parent_issue_id": 2694, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Book transport service for staff" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2690, - "name": "Transport of speakers", - "start_date": "2016-07-08", - "due_date": "2016-07-16", - "done_ratio": 0, - "parent_issue_id": 2686, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Transport of speakers" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2691, - "name": "Book transport service for speakers", - "start_date": "2016-07-08", - "due_date": "2016-07-16", - "estimated_hours": 4.0, - "done_ratio": 0, - "parent_issue_id": 2690, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Book transport service for speakers" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2692, - "name": "Transport of entertainers", - "start_date": "2016-07-08", - "due_date": "2016-07-16", - "done_ratio": 0, - "parent_issue_id": 2686, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Transport of entertainers" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2693, - "name": "Book transport service for entertainers", - "start_date": "2016-07-08", - "due_date": "2016-07-16", - "estimated_hours": 4.0, - "done_ratio": 0, - "parent_issue_id": 2692, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Book transport service for entertainers" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2669, - "name": "Prepare menu", - "start_date": "2016-07-09", - "due_date": "2016-08-04", - "done_ratio": 0, - "parent_issue_id": 2665, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Prepare menu" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2670, - "name": "Find out client's preference ", - "start_date": "2016-07-09", - "due_date": "2016-08-01", - "estimated_hours": 0.0, - "done_ratio": 0, - "parent_issue_id": 2669, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Find out client's preference " - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2656, - "name": "Prepare spacial layout for ALL activities", - "start_date": "2016-07-14", - "due_date": "2016-07-29", - "estimated_hours": 30.0, - "done_ratio": 0, - "parent_issue_id": 2654, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Prepare spacial layout for ALL activities" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2662, - "name": "Assign rooms to entertainers", - "start_date": "2016-07-14", - "due_date": "2016-08-11", - "estimated_hours": 5.0, - "done_ratio": 0, - "parent_issue_id": 2659, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Assign rooms to entertainers" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2663, - "name": "Assign rooms to speakers", - "start_date": "2016-07-14", - "due_date": "2016-08-11", - "estimated_hours": 5.0, - "done_ratio": 0, - "parent_issue_id": 2659, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Assign rooms to speakers" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2664, - "name": "Assign rooms to staff", - "start_date": "2016-07-14", - "due_date": "2016-08-11", - "estimated_hours": 10.0, - "done_ratio": 0, - "parent_issue_id": 2659, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Assign rooms to staff" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2666, - "name": "Plan number of meals", - "start_date": "2016-07-14", - "due_date": "2016-08-06", - "estimated_hours": 15.0, - "done_ratio": 0, - "parent_issue_id": 2665, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Plan number of meals" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2689, - "name": "Book transport service for guests", - "start_date": "2016-07-21", - "due_date": "2016-08-12", - "estimated_hours": 10.0, - "done_ratio": 0, - "parent_issue_id": 2687, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Book transport service for guests" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2768, - "name": "Finalize venue budget", - "start_date": "2016-07-21", - "due_date": "2016-07-22", - "estimated_hours": 4.0, - "done_ratio": 0, - "parent_issue_id": 2765, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Finalize venue budget" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2772, - "name": "Finalize programme budget", - "start_date": "2016-07-21", - "due_date": "2016-07-22", - "estimated_hours": 4.0, - "done_ratio": 0, - "parent_issue_id": 2769, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Finalize programme budget" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2776, - "name": "Finalize personal budget", - "start_date": "2016-07-21", - "due_date": "2016-07-22", - "estimated_hours": 4.0, - "done_ratio": 0, - "parent_issue_id": 2773, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Finalize personal budget" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2675, - "name": "Reception", - "start_date": "2016-07-23", - "due_date": "2016-08-05", - "done_ratio": 0, - "parent_issue_id": 2658, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Reception" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2676, - "name": "Arrange ticket office for new guests", - "start_date": "2016-07-23", - "due_date": "2016-08-01", - "estimated_hours": 25.0, - "done_ratio": 0, - "parent_issue_id": 2675, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Arrange ticket office for new guests" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2678, - "name": "Arrange guest registration", - "start_date": "2016-07-25", - "due_date": "2016-07-31", - "estimated_hours": 16.0, - "done_ratio": 0, - "parent_issue_id": 2675, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Arrange guest registration" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2747, - "name": "Finalize approved guestlist", - "start_date": "2016-07-25", - "due_date": "2016-08-01", - "estimated_hours": 5.0, - "done_ratio": 0, - "parent_issue_id": 2745, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Finalize approved guestlist" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2657, - "name": "Finalize spacial layout", - "start_date": "2016-07-28", - "due_date": "2016-08-06", - "estimated_hours": 15.0, - "done_ratio": 0, - "parent_issue_id": 2654, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Finalize spacial layout" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2679, - "name": "Prepare capacity of cloakroom", - "start_date": "2016-07-28", - "due_date": "2016-07-31", - "estimated_hours": 3.0, - "done_ratio": 0, - "parent_issue_id": 2675, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Prepare capacity of cloakroom" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2680, - "name": "Child care", - "start_date": "2016-07-28", - "due_date": "2016-08-18", - "done_ratio": 0, - "parent_issue_id": 2658, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Child care" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2681, - "name": "Plan child care capacity", - "start_date": "2016-07-28", - "due_date": "2016-08-14", - "estimated_hours": 4.0, - "done_ratio": 0, - "parent_issue_id": 2680, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Plan child care capacity" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2671, - "name": "Prepare meal menu", - "start_date": "2016-07-29", - "due_date": "2016-08-04", - "estimated_hours": 10.0, - "done_ratio": 0, - "fixed_version_id": 0, - "parent_issue_id": 2669, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Prepare meal menu" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2661, - "name": "Assign rooms to guests", - "start_date": "2016-07-31", - "due_date": "2016-08-20", - "estimated_hours": 25.0, - "done_ratio": 0, - "parent_issue_id": 2659, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Assign rooms to guests" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2667, - "name": "Arrange seating order", - "start_date": "2016-07-31", - "due_date": "2016-08-15", - "estimated_hours": 12.0, - "done_ratio": 0, - "parent_issue_id": 2665, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Arrange seating order" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2677, - "name": "Arrange guest welcoming", - "start_date": "2016-07-31", - "due_date": "2016-08-05", - "estimated_hours": 20.0, - "done_ratio": 0, - "parent_issue_id": 2675, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Arrange guest welcoming" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2697, - "name": "Transport of equipment", - "start_date": "2016-07-31", - "due_date": "2016-08-19", - "done_ratio": 0, - "parent_issue_id": 2686, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Transport of equipment" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2698, - "name": "Arrange transport of equipment", - "start_date": "2016-07-31", - "due_date": "2016-08-19", - "estimated_hours": 30.0, - "done_ratio": 0, - "parent_issue_id": 2697, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Arrange transport of equipment" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2672, - "name": "Prepare drink menu and volume", - "start_date": "2016-08-01", - "due_date": "2016-08-07", - "estimated_hours": 20.0, - "done_ratio": 0, - "parent_issue_id": 2665, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Prepare drink menu and volume" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2673, - "name": "Valet", - "start_date": "2016-08-05", - "due_date": "2016-08-13", - "done_ratio": 0, - "parent_issue_id": 2658, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Valet" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2674, - "name": "Plan valet capacity", - "start_date": "2016-08-05", - "due_date": "2016-08-13", - "estimated_hours": 4.0, - "done_ratio": 0, - "parent_issue_id": 2673, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Plan valet capacity" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2682, - "name": "Find suitable space", - "start_date": "2016-08-08", - "due_date": "2016-08-18", - "estimated_hours": 2.0, - "done_ratio": 0, - "parent_issue_id": 2680, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Find suitable space" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2683, - "name": "Hygiene", - "start_date": "2016-08-11", - "due_date": "2016-08-19", - "done_ratio": 0, - "parent_issue_id": 2658, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Hygiene" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2684, - "name": "Plan capacity of portables", - "start_date": "2016-08-11", - "due_date": "2016-08-18", - "estimated_hours": 4.0, - "done_ratio": 0, - "parent_issue_id": 2683, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Plan capacity of portables" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2685, - "name": "Aqcuire portables", - "start_date": "2016-08-14", - "due_date": "2016-08-19", - "estimated_hours": 16.0, - "done_ratio": 0, - "parent_issue_id": 2683, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Aqcuire portables" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2705, - "name": "Make the payment", - "start_date": "2016-08-25", - "due_date": "2016-08-27", - "estimated_hours": 1.0, - "done_ratio": 0, - "parent_issue_id": 2699, - "project_id": 88, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Make the payment" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 2777, - "name": "Event", - "start_date": "2016-08-25", - "due_date": "2016-08-27", - "estimated_hours": 0.0, - "done_ratio": 0, - "project_id": 88, - "tracker_id": 19, - "priority_id": 9, - "status_id": 1, - "is_planned": true, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Event" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 702, - "name": "Analysis", - "start_date": "2016-06-20", - "done_ratio": 0, - "project_id": 62, - "tracker_id": 1, - "priority_id": 11, - "status_id": 2, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Analysis" - }, - { - "name": "status", - "value": "Realisation" - }, - { - "name": "priority", - "value": "Easy task" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 707, - "name": "Testing", - "start_date": "2016-06-20", - "done_ratio": 0, - "project_id": 62, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Testing" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 712, - "name": "fefe", - "start_date": "2016-06-20", - "done_ratio": 0, - "parent_issue_id": 705, - "project_id": 62, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "fefe" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 714, - "name": "fefe", - "start_date": "2016-06-20", - "done_ratio": 0, - "parent_issue_id": 705, - "project_id": 62, - "tracker_id": 17, - "priority_id": 15, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "fefe" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Critical" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 708, - "name": "analyse client needs", - "start_date": "2016-06-23", - "due_date": "2016-06-23", - "estimated_hours": 0.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 702, - "project_id": 62, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "analyse client needs" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 709, - "name": "fefe", - "start_date": "2016-06-24", - "due_date": "2016-06-24", - "estimated_hours": 0.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 702, - "project_id": 62, - "tracker_id": 1, - "priority_id": 8, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "fefe" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Low" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 703, - "name": "Launch to production", - "start_date": "2016-06-25", - "due_date": "2016-06-25", - "estimated_hours": 0.0, - "done_ratio": 0, - "overdue": true, - "project_id": 62, - "tracker_id": 1, - "priority_id": 10, - "status_id": 9, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Launch to production" - }, - { - "name": "status", - "value": "Estimated" - }, - { - "name": "priority", - "value": "High" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 711, - "name": "fefe", - "start_date": "2016-06-25", - "due_date": "2016-06-25", - "estimated_hours": 0.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 702, - "project_id": 62, - "tracker_id": 1, - "priority_id": 11, - "status_id": 3, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "fefe" - }, - { - "name": "status", - "value": "Consultation" - }, - { - "name": "priority", - "value": "Easy task" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 713, - "name": "fefe", - "start_date": "2016-06-25", - "due_date": "2016-06-25", - "estimated_hours": 0.0, - "done_ratio": 0, - "overdue": true, - "parent_issue_id": 702, - "project_id": 62, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "fefe" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 704, - "name": "Design", - "start_date": "2016-06-26", - "due_date": "2016-06-26", - "estimated_hours": 0.0, - "done_ratio": 0, - "overdue": true, - "project_id": 62, - "tracker_id": 1, - "priority_id": 11, - "status_id": 4, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Design" - }, - { - "name": "status", - "value": "To check" - }, - { - "name": "priority", - "value": "Easy task" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 705, - "name": "Front End Implementation", - "start_date": "2016-06-26", - "due_date": "2016-06-26", - "estimated_hours": 0.0, - "done_ratio": 0, - "overdue": true, - "project_id": 62, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Front End Implementation" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 706, - "name": "Back End", - "start_date": "2016-06-26", - "due_date": "2016-06-26", - "estimated_hours": 0.0, - "done_ratio": 0, - "overdue": true, - "project_id": 62, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Back End" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 710, - "name": "fefe", - "start_date": "2016-06-27", - "due_date": "2016-06-27", - "estimated_hours": 0.0, - "done_ratio": 0, - "fixed_version_id": 0, - "overdue": true, - "parent_issue_id": 705, - "project_id": 62, - "tracker_id": 1, - "priority_id": 10, - "status_id": 10, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "fefe" - }, - { - "name": "status", - "value": "Approved" - }, - { - "name": "priority", - "value": "High" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 3194, - "name": "Concept Creation and Requirement Gathering:", - "start_date": "2016-06-20", - "due_date": "2016-06-21", - "done_ratio": 0, - "overdue": true, - "project_id": 106, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Concept Creation and Requirement Gathering:" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 3195, - "name": "Planning and Designing", - "start_date": "2016-06-23", - "due_date": "2016-06-24", - "estimated_hours": 0.0, - "done_ratio": 0, - "overdue": true, - "project_id": 106, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Planning and Designing" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 3196, - "name": "Implementation:", - "start_date": "2016-06-26", - "due_date": "2016-06-30", - "estimated_hours": 0.0, - "done_ratio": 0, - "project_id": 106, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Implementation:" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 3197, - "name": "Evaluation", - "start_date": "2016-07-02", - "due_date": "2016-07-04", - "estimated_hours": 0.0, - "done_ratio": 0, - "project_id": 106, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Evaluation" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "" - } - ] - }, - { - "id": 352, - "name": "Areas of usage", - "start_date": "2016-06-01", - "due_date": "2016-06-02", - "estimated_hours": 3.0, - "done_ratio": 100, - "css": " closed", - "fixed_version_id": 52, - "project_id": 40, - "tracker_id": 5, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 6, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Areas of usage" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Peter Project Man" - } - ] - }, - { - "id": 353, - "name": "Trackers and statuses", - "start_date": "2016-06-03", - "due_date": "2016-06-03", - "estimated_hours": 1.0, - "done_ratio": 100, - "css": " closed", - "fixed_version_id": 52, - "parent_issue_id": 352, - "project_id": 40, - "tracker_id": 5, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 6, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Trackers and statuses" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Peter Project Man" - } - ] - }, - { - "id": 351, - "name": "Project templates", - "start_date": "2016-06-10", - "due_date": "2016-06-10", - "estimated_hours": 1.0, - "done_ratio": 100, - "css": " closed", - "fixed_version_id": 52, - "parent_issue_id": 350, - "project_id": 40, - "tracker_id": 5, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 6, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Project templates" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Peter Project Man" - } - ] - }, - { - "id": 701, - "name": "dwdw", - "start_date": "2016-06-19", - "due_date": "2016-06-26", - "estimated_hours": 20.0, - "done_ratio": 0, - "css": " closed", - "fixed_version_id": 52, - "parent_issue_id": 349, - "project_id": 40, - "tracker_id": 1, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 22, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "dwdw" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Client *" - } - ] - }, - { - "id": 350, - "name": "Project structure definition", - "start_date": "2016-06-23", - "due_date": "2016-06-23", - "estimated_hours": 1.0, - "done_ratio": 100, - "css": " closed", - "fixed_version_id": 52, - "project_id": 40, - "tracker_id": 5, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 14, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Project structure definition" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Alena Staffer" - } - ] - }, - { - "id": 349, - "name": "User roles and personal pages", - "start_date": "2016-06-25", - "due_date": "2016-07-04", - "estimated_hours": 10.0, - "done_ratio": 80, - "css": " closed", - "fixed_version_id": 52, - "parent_issue_id": 354, - "project_id": 40, - "tracker_id": 5, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 14, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "User roles and personal pages" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Alena Staffer" - } - ] - }, - { - "id": 354, - "name": "Users and groups", - "start_date": "2016-06-26", - "due_date": "2016-07-10", - "estimated_hours": 10.0, - "done_ratio": 100, - "css": " closed", - "fixed_version_id": 52, - "project_id": 40, - "tracker_id": 5, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 14, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Users and groups" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Alena Staffer" - } - ] - }, - { - "id": 360, - "name": "Personal Pages Templates", - "start_date": "2016-06-29", - "due_date": "2016-06-29", - "estimated_hours": 4.0, - "done_ratio": 100, - "css": " closed", - "parent_issue_id": 354, - "project_id": 40, - "tracker_id": 4, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 9, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Personal Pages Templates" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Robert Kovacik" - } - ] - }, - { - "id": 699, - "name": "second analysis", - "start_date": "2016-07-02", - "due_date": "2016-07-02", - "estimated_hours": 10.0, - "done_ratio": 0, - "fixed_version_id": 50, - "project_id": 40, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 14, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "second analysis" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Alena Staffer" - } - ] - }, - { - "id": 358, - "name": "Extensions uninstall", - "start_date": "2016-07-09", - "due_date": "2016-07-09", - "estimated_hours": 4.0, - "done_ratio": 0, - "fixed_version_id": 52, - "parent_issue_id": 352, - "project_id": 40, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 7, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Extensions uninstall" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Ricky Account Manager" - } - ] - }, - { - "id": 355, - "name": "Desired Outputs", - "start_date": "2016-07-10", - "due_date": "2016-07-12", - "estimated_hours": 10.0, - "done_ratio": 0, - "css": " closed", - "parent_issue_id": 352, - "project_id": 40, - "tracker_id": 5, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 14, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Desired Outputs" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Alena Staffer" - } - ] - }, - { - "id": 361, - "name": "Users \u0026 groups", - "start_date": "2016-07-12", - "due_date": "2016-07-12", - "estimated_hours": 4.0, - "done_ratio": 0, - "css": " closed", - "fixed_version_id": 52, - "parent_issue_id": 354, - "project_id": 40, - "tracker_id": 4, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 7, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Users \u0026 groups" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Ricky Account Manager" - } - ] - }, - { - "id": 357, - "name": "Roles, Trackers, Statuses, Custom Fields", - "start_date": "2016-07-13", - "due_date": "2016-07-17", - "estimated_hours": 10.0, - "done_ratio": 0, - "css": " closed", - "parent_issue_id": 354, - "project_id": 40, - "tracker_id": 4, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 6, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Roles, Trackers, Statuses, Custom Fields" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Peter Project Man" - } - ] - }, - { - "id": 366, - "name": "Deployment into Production", - "start_date": "2016-07-17", - "due_date": "2016-07-19", - "estimated_hours": 20.0, - "done_ratio": 0, - "fixed_version_id": 50, - "project_id": 40, - "tracker_id": 6, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 19, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Deployment into Production" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Ondrej Moravcik" - } - ] - }, - { - "id": 359, - "name": "Projects Structure + Templates", - "start_date": "2016-07-18", - "due_date": "2016-07-18", - "estimated_hours": 10.0, - "done_ratio": 0, - "css": " closed", - "parent_issue_id": 350, - "project_id": 40, - "tracker_id": 4, - "priority_id": 9, - "status_id": 6, - "assigned_to_id": 9, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Projects Structure + Templates" - }, - { - "name": "status", - "value": "Done" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Robert Kovacik" - } - ] - }, - { - "id": 362, - "name": "E-learning for Admins", - "start_date": "2016-07-23", - "due_date": "2016-07-24", - "estimated_hours": 15.0, - "done_ratio": 0, - "fixed_version_id": 51, - "project_id": 40, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 22, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "E-learning for Admins" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Client *" - } - ] - }, - { - "id": 363, - "name": "E-learning for users", - "start_date": "2016-07-23", - "due_date": "2016-07-27", - "estimated_hours": 10.0, - "done_ratio": 0, - "fixed_version_id": 51, - "project_id": 40, - "tracker_id": 4, - "priority_id": 9, - "status_id": 10, - "assigned_to_id": 22, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "E-learning for users" - }, - { - "name": "status", - "value": "Approved" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Client *" - } - ] - }, - { - "id": 367, - "name": "Testing in production", - "start_date": "2016-07-23", - "due_date": "2016-08-15", - "estimated_hours": 15.0, - "done_ratio": 0, - "fixed_version_id": 50, - "project_id": 40, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 14, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Testing in production" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Alena Staffer" - } - ] - }, - { - "id": 369, - "name": "Review Meeting ", - "start_date": "2016-07-23", - "due_date": "2016-07-26", - "estimated_hours": 5.0, - "done_ratio": 0, - "fixed_version_id": 49, - "project_id": 40, - "tracker_id": 4, - "priority_id": 9, - "status_id": 2, - "assigned_to_id": 20, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Review Meeting " - }, - { - "name": "status", - "value": "Realisation" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Pavel Rosicky" - } - ] - }, - { - "id": 364, - "name": "Admin Training", - "start_date": "2016-07-26", - "due_date": "2016-07-26", - "estimated_hours": 2.0, - "done_ratio": 0, - "fixed_version_id": 51, - "project_id": 40, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 9, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Admin Training" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Robert Kovacik" - } - ] - }, - { - "id": 370, - "name": "Re-Set Up", - "start_date": "2016-07-28", - "due_date": "2016-07-29", - "estimated_hours": 10.0, - "done_ratio": 0, - "fixed_version_id": 50, - "parent_issue_id": 366, - "project_id": 40, - "tracker_id": 4, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 7, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Re-Set Up" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Ricky Account Manager" - } - ] - }, - { - "id": 365, - "name": "Training for users", - "start_date": "2016-07-30", - "due_date": "2016-07-30", - "estimated_hours": 10.0, - "done_ratio": 0, - "fixed_version_id": 51, - "project_id": 40, - "tracker_id": 4, - "priority_id": 9, - "status_id": 9, - "assigned_to_id": 31, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Training for users" - }, - { - "name": "status", - "value": "Estimated" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Project Manager" - } - ] - }, - { - "id": 558, - "name": "Final check", - "start_date": "2016-08-20", - "due_date": "2016-08-20", - "estimated_hours": 10.0, - "done_ratio": 0, - "fixed_version_id": 50, - "parent_issue_id": 367, - "project_id": 40, - "tracker_id": 1, - "priority_id": 9, - "status_id": 1, - "assigned_to_id": 15, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Final check" - }, - { - "name": "status", - "value": "New" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Pavel Kucera" - } - ] - }, - { - "id": 368, - "name": "Help Desk Set-up", - "start_date": "2016-08-20", - "due_date": "2016-08-20", - "estimated_hours": 4.0, - "done_ratio": 0, - "fixed_version_id": 50, - "project_id": 40, - "tracker_id": 4, - "priority_id": 9, - "status_id": 2, - "assigned_to_id": 15, - "permissions": { - "editable": true - }, - "columns": [ - { - "name": "subject", - "value": "Help Desk Set-up" - }, - { - "name": "status", - "value": "Realisation" - }, - { - "name": "priority", - "value": "Normal" - }, - { - "name": "assigned_to", - "value": "Pavel Kucera" - } - ] - } - ], - "relations": [ - { - "id": 10, - "source_id": 39, - "target_id": 40, - "type": "precedes", - "delay": 5 - }, - { - "id": 65, - "source_id": 37, - "target_id": 40, - "type": "copied_to", - "delay": 0 - }, - { - "id": 66, - "source_id": 321, - "target_id": 304, - "type": "relates", - "delay": 0 - }, - { - "id": 27, - "source_id": 374, - "target_id": 375, - "type": "precedes", - "delay": 3 - }, - { - "id": 28, - "source_id": 375, - "target_id": 376, - "type": "precedes", - "delay": 4 - }, - { - "id": 29, - "source_id": 376, - "target_id": 377, - "type": "precedes", - "delay": 10 - }, - { - "id": 30, - "source_id": 385, - "target_id": 386, - "type": "precedes", - "delay": 1 - }, - { - "id": 136, - "source_id": 754, - "target_id": 757, - "type": "precedes", - "delay": 0 - }, - { - "id": 135, - "source_id": 755, - "target_id": 756, - "type": "precedes", - "delay": 0 - }, - { - "id": 109, - "source_id": 708, - "target_id": 709, - "type": "precedes", - "delay": 0 - }, - { - "id": 110, - "source_id": 709, - "target_id": 713, - "type": "precedes", - "delay": 0 - }, - { - "id": 111, - "source_id": 713, - "target_id": 706, - "type": "precedes", - "delay": 0 - }, - { - "id": 205, - "source_id": 3194, - "target_id": 3195, - "type": "precedes", - "delay": 0 - }, - { - "id": 206, - "source_id": 3195, - "target_id": 3196, - "type": "precedes", - "delay": 0 - }, - { - "id": 207, - "source_id": 3196, - "target_id": 3197, - "type": "precedes", - "delay": 0 - }, - { - "id": 22, - "source_id": 358, - "target_id": 357, - "type": "precedes", - "delay": 3 - }, - { - "id": 23, - "source_id": 362, - "target_id": 364, - "type": "precedes", - "delay": 1 - }, - { - "id": 24, - "source_id": 363, - "target_id": 365, - "type": "precedes", - "delay": 1 - }, - { - "id": 25, - "source_id": 366, - "target_id": 367, - "type": "precedes", - "delay": 1 - }, - { - "id": 26, - "source_id": 369, - "target_id": 370, - "type": "precedes", - "delay": 1 - }, - { - "id": 31, - "source_id": 361, - "target_id": 366, - "type": "precedes", - "delay": 4 - }, - { - "id": 32, - "source_id": 355, - "target_id": 362, - "type": "precedes", - "delay": 10 - }, - { - "id": 33, - "source_id": 367, - "target_id": 368, - "type": "precedes", - "delay": 2 - }, - { - "id": 35, - "source_id": 360, - "target_id": 364, - "type": "precedes", - "delay": 2 - }, - { - "id": 93, - "source_id": 350, - "target_id": 349, - "type": "precedes", - "delay": 0 - }, - { - "id": 105, - "source_id": 364, - "target_id": 365, - "type": "precedes", - "delay": 0 - }, - { - "id": 107, - "source_id": 357, - "target_id": 359, - "type": "precedes", - "delay": 0 - }, - { - "id": 108, - "source_id": 360, - "target_id": 699, - "type": "precedes", - "delay": 0 - } - ], - "versions": [ - { - "id": 9, - "name": "Phase 1. - Development", - "start_date": "2016-07-26", - "project_id": 10, - "permissions": { - "editable": true - } - }, - { - "id": 8, - "name": "Phase 2. - Construction", - "start_date": "2016-08-28", - "project_id": 10, - "permissions": { - "editable": true - } - }, - { - "id": 7, - "name": "Phase 3. - Testing", - "start_date": "2016-09-12", - "project_id": 10, - "permissions": { - "editable": true - } - }, - { - "id": 6, - "name": "Phase 4. - Installation", - "start_date": "2016-09-19", - "project_id": 10, - "permissions": { - "editable": true - } - }, - { - "id": 10, - "name": "Phase 0. Planning - Analysis", - "start_date": "2016-10-10", - "project_id": 10, - "permissions": { - "editable": true - } - }, - { - "id": 39, - "name": "Easy Redmine 2014 - Minor 3.1 (2014-08-14)", - "start_date": "2016-07-30", - "project_id": 28, - "permissions": { - "editable": true - } - }, - { - "id": 51, - "name": "Settings \u0026 Training", - "start_date": "2016-08-02", - "project_id": 40, - "permissions": { - "editable": true - } - }, - { - "id": 40, - "name": "Easy Redmine 2014 - Minor 3.2. (2014-09-04)", - "start_date": "2016-08-20", - "project_id": 28, - "permissions": { - "editable": true - } - }, - { - "id": 42, - "name": "Easy Redmine 2014 - Major 4.0 (2014-10-01)", - "start_date": "2016-09-05", - "project_id": 28, - "permissions": { - "editable": true - } - }, - { - "id": 41, - "name": "Easy Redmine 2014 - Minor 3.3. (2014-09-18)", - "start_date": "2016-09-21", - "project_id": 28, - "permissions": { - "editable": true - } - }, - { - "id": 58, - "name": "Analysis", - "start_date": "2016-04-04", - "project_id": 41, - "permissions": { - "editable": true - } - }, - { - "id": 57, - "name": "Design", - "start_date": "2016-05-02", - "project_id": 41, - "permissions": { - "editable": true - } - }, - { - "id": 53, - "name": "Public Launch", - "start_date": "2016-05-10", - "project_id": 41, - "permissions": { - "editable": true - } - }, - { - "id": 56, - "name": "CMS + E-commerce platform", - "start_date": "2016-05-13", - "project_id": 41, - "permissions": { - "editable": true - } - }, - { - "id": 55, - "name": "Content + Products", - "start_date": "2016-05-17", - "project_id": 41, - "permissions": { - "editable": true - } - }, - { - "id": 54, - "name": "Easy Redmine integration", - "start_date": "2016-05-23", - "project_id": 41, - "permissions": { - "editable": true - } - }, - { - "id": 116, - "name": "Milestone 2", - "start_date": "2016-06-28", - "project_id": 63, - "permissions": { - "editable": true - } - }, - { - "id": 117, - "name": "Milestone 1", - "start_date": "2016-07-13", - "project_id": 63, - "permissions": { - "editable": true - } - }, - { - "id": 52, - "name": "Analysis", - "start_date": "2016-07-12", - "project_id": 40, - "permissions": { - "editable": true - } - }, - { - "id": 49, - "name": "Review", - "start_date": "2016-07-26", - "project_id": 40, - "permissions": { - "editable": true - } - }, - { - "id": 50, - "name": "Deployment", - "start_date": "2016-08-27", - "project_id": 40, - "permissions": { - "editable": true - } - } - ], - "schemes": { - "EasyProjectPriority": [] - } - } -} \ No newline at end of file diff --git a/plugins/easy_gantt/assets/fonts/EasyMaterialIcons-Regular.eot b/plugins/easy_gantt/assets/fonts/EasyMaterialIcons-Regular.eot deleted file mode 100644 index c1cc0f7fd9a9233ce0235a17d8761f224c1b2aea..0000000000000000000000000000000000000000 Binary files a/plugins/easy_gantt/assets/fonts/EasyMaterialIcons-Regular.eot and /dev/null differ diff --git a/plugins/easy_gantt/assets/fonts/EasyMaterialIcons-Regular.otf b/plugins/easy_gantt/assets/fonts/EasyMaterialIcons-Regular.otf deleted file mode 100644 index f8500754524df47597aace5f694a24f3125e129b..0000000000000000000000000000000000000000 Binary files a/plugins/easy_gantt/assets/fonts/EasyMaterialIcons-Regular.otf and /dev/null differ diff --git a/plugins/easy_gantt/assets/fonts/EasyMaterialIcons-Regular.svg b/plugins/easy_gantt/assets/fonts/EasyMaterialIcons-Regular.svg deleted file mode 100644 index b46f165d8b9fb8f172ddcc20456e072546e4188a..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/fonts/EasyMaterialIcons-Regular.svg +++ /dev/null @@ -1,2411 +0,0 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"> -<metadata> -Created by FontForge 20161004 at Mon Feb 06 14:01:27 2017 - By milos -Copyright 2015 Google, Inc. All Rights Reserved. -</metadata> -<defs> -<font id="MaterialIcons-Regular" horiz-adv-x="512" > - <font-face - font-family="Material Icons" - font-weight="400" - font-stretch="normal" - units-per-em="512" - panose-1="2 0 5 3 0 0 0 0 0 0" - ascent="512" - descent="0" - bbox="0 0 512 512.5" - underline-thickness="50" - underline-position="-200" - unicode-range="U+0030-10FFFD" - /> -<missing-glyph -d="M17 0v341h136v-341h-136zM34 17h102v307h-102v-307z" /> - <glyph glyph-name="uniE000" unicode="error" -d="M277 235v128h-42v-128h42zM277 149v43h-42v-43h42zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE001" unicode="error_outline" -d="M256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5zM235 363h42v-128h-42v128z -M235 192h42v-43h-42v43z" /> - <glyph glyph-name="uniE002" unicode="warning" -d="M277 213v86h-42v-86h42zM277 128v43h-42v-43h42zM21 64l235 405l235 -405h-470z" /> - <glyph glyph-name="uniE003" unicode="add_alert" -d="M341 234v43h-64v64h-42v-64h-64v-43h64v-64h42v64h64zM403 153l45 -45v-23h-384v23l45 45v124q0 51 32 91.5t81 51.5v15q0 14 10 24t24 10t24 -10t10 -24v-15q49 -11 81 -51.5t32 -91.5v-124zM214 64h84q0 -17 -12.5 -30t-29.5 -13t-29.5 13t-12.5 30z" /> - <glyph glyph-name="uniE019" unicode="album" -d="M256 277q9 0 15 -6t6 -15t-6 -15t-15 -6t-15 6t-6 15t6 15t15 6zM256 160q40 0 68 28t28 68t-28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE01B" unicode="av_timer" -d="M128 256q0 9 6 15t15 6t15.5 -6t6.5 -15t-6.5 -15t-15.5 -6t-15 6t-6 15zM384 256q0 -9 -6 -15t-15 -6t-15.5 6t-6.5 15t6.5 15t15.5 6t15 -6t6 -15zM235 448h21q80 0 136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136q0 96 77 153v1l145 -145l-30 -30l-116 115 -q-33 -41 -33 -94q0 -62 43.5 -105.5t105.5 -43.5t105.5 43.5t43.5 105.5q0 56 -37 98t-91 50v-41h-42v85zM235 149q0 9 6 15.5t15 6.5t15 -6.5t6 -15.5t-6 -15t-15 -6t-15 6t-6 15z" /> - <glyph glyph-name="uniE01C" unicode="closed_caption" -d="M384 277v22q0 9 -6 15t-15 6h-64q-9 0 -15.5 -6t-6.5 -15v-86q0 -9 6.5 -15t15.5 -6h64q9 0 15 6t6 15v22h-32v-11h-43v64h43v-11h32zM235 277v22q0 9 -6.5 15t-15.5 6h-64q-9 0 -15 -6t-6 -15v-86q0 -9 6 -15t15 -6h64q9 0 15.5 6t6.5 15v22h-32v-11h-43v64h43v-11h32z -M405 427q17 0 30 -13t13 -30v-256q0 -17 -13 -30t-30 -13h-298q-18 0 -30.5 13t-12.5 30v256q0 17 12.5 30t30.5 13h298z" /> - <glyph glyph-name="uniE01D" unicode="equalizer" -d="M341 320h86v-235h-86v235zM85 85v171h86v-171h-86zM213 85v342h86v-342h-86z" /> - <glyph glyph-name="uniE01E" unicode="explicit" -d="M320 320v43h-128v-214h128v43h-85v43h85v42h-85v43h85zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniE01F" unicode="fast_forward" -d="M277 384l182 -128l-182 -128v256zM85 128v256l182 -128z" /> - <glyph glyph-name="uniE020" unicode="fast_rewind" -d="M245 256l182 128v-256zM235 128l-182 128l182 128v-256z" /> - <glyph glyph-name="uniE021" unicode="games" -d="M352 320h117v-128h-117l-64 64zM192 160l64 64l64 -64v-117h-128v117zM160 320l64 -64l-64 -64h-117v128h117zM320 352l-64 -64l-64 64v117h128v-117z" /> - <glyph glyph-name="uniE023" unicode="hearing" -d="M245 320q0 22 16 37.5t38 15.5t37.5 -15.5t15.5 -37.5t-15.5 -37.5t-37.5 -15.5t-38 15.5t-16 37.5zM163 456q-56 -56 -56 -136t56 -136l-30 -30q-69 69 -69 166t69 166zM363 85q17 0 29.5 13t12.5 30h43q0 -35 -25 -60t-60 -25q-20 0 -35 7q-41 21 -59 76q-7 22 -36 44 -q-41 30 -61 67q-23 41 -23 83q0 63 43.5 106t106.5 43t106 -43t43 -106h-43q0 45 -30.5 76t-75.5 31t-76 -31t-31 -76q0 -32 17 -63q14 -27 50 -54q40 -30 51 -64q13 -38 36 -50q8 -4 17 -4z" /> - <glyph glyph-name="uniE024" unicode="high_quality" -d="M309 224v64h43v-64h-43zM384 213v86q0 9 -6 15t-15 6h-64q-9 0 -15.5 -6t-6.5 -15v-86q0 -9 6.5 -15t15.5 -6h16v-32h32v32h16q9 0 15 6t6 15zM235 192v128h-32v-53h-43v53h-32v-128h32v43h43v-43h32zM405 427q17 0 30 -13t13 -30v-256q0 -17 -13 -30t-30 -13h-298 -q-18 0 -30.5 13t-12.5 30v256q0 17 12.5 30t30.5 13h298z" /> - <glyph glyph-name="uniE028" unicode="loop" -d="M256 128v64l85 -85l-85 -86v64q-70 0 -120.5 50.5t-50.5 120.5q0 50 27 91l31 -31q-15 -27 -15 -60q0 -53 37.5 -90.5t90.5 -37.5zM256 427q70 0 120.5 -50.5t50.5 -120.5q0 -50 -27 -91l-31 31q15 27 15 60q0 53 -37.5 90.5t-90.5 37.5v-64l-85 85l85 86v-64z" /> - <glyph glyph-name="uniE029" unicode="mic" -d="M369 277h36q0 -54 -37.5 -94.5t-90.5 -48.5v-70h-42v70q-53 8 -90.5 48.5t-37.5 94.5h36q0 -47 33.5 -77.5t79.5 -30.5t79.5 30.5t33.5 77.5zM256 213q-26 0 -45 19t-19 45v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -26 -19 -45t-45 -19z" /> - <glyph glyph-name="uniE02A" unicode="mic_none" -d="M369 277h36q0 -54 -37.5 -94.5t-90.5 -48.5v-70h-42v70q-53 8 -90.5 48.5t-37.5 94.5h36q0 -47 33.5 -77.5t79.5 -30.5t79.5 30.5t33.5 77.5zM230 407v-132q0 -10 7.5 -17.5t18.5 -7.5q10 0 17.5 7t7.5 18l1 132q0 11 -8 18.5t-18 7.5t-18 -7.5t-8 -18.5zM256 213 -q-26 0 -45 19t-19 45v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -26 -19 -45t-45 -19z" /> - <glyph glyph-name="uniE02B" unicode="mic_off" -d="M91 448l357 -357l-27 -27l-89 89q-22 -14 -55 -19v-70h-42v70q-53 8 -90.5 48.5t-37.5 94.5h36q0 -47 33.5 -77.5t79.5 -30.5q25 0 49 11l-35 35q-8 -2 -14 -2q-26 0 -45 19t-19 45v16l-128 128zM320 274l-128 127v4q0 26 19 45t45 19t45 -19t19 -45v-131zM405 277 -q0 -37 -19 -70l-26 27q9 20 9 43h36z" /> - <glyph glyph-name="uniE02C" unicode="movie" -d="M384 427h85v-299q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h22l42 -86h64l-42 86h42l43 -86h64l-43 86h43l43 -86h64z" /> - <glyph glyph-name="uniE02E" unicode="library_add" -d="M405 277v43h-85v85h-43v-85h-85v-43h85v-85h43v85h85zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-256q-17 0 -30 13t-13 30v256q0 17 13 29.5t30 12.5h256zM85 384v-299h299v-42h-299q-17 0 -29.5 12.5t-12.5 29.5v299h42z" /> - <glyph glyph-name="uniE02F" unicode="library_books" -d="M405 363v42h-213v-42h213zM320 192v43h-128v-43h128zM405 277v43h-213v-43h213zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-256q-17 0 -30 13t-13 30v256q0 17 13 29.5t30 12.5h256zM85 384v-299h299v-42h-299q-17 0 -29.5 12.5t-12.5 29.5 -v299h42z" /> - <glyph glyph-name="uniE030" unicode="library_music" -d="M85 384v-299h299v-42h-299q-17 0 -29.5 12.5t-12.5 29.5v299h42zM384 363v42h-85v-117q-14 11 -32 11q-22 0 -38 -16t-16 -38t16 -37.5t38 -15.5t37.5 15.5t15.5 37.5v118h64zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-256q-17 0 -30 13 -t-13 30v256q0 17 13 29.5t30 12.5h256z" /> - <glyph glyph-name="uniE031" unicode="new_releases" -d="M277 235v128h-42v-128h42zM277 149v43h-42v-43h42zM491 256l-52 -59l7 -79l-77 -17l-40 -68l-73 31l-73 -31l-40 67l-77 18l7 79l-52 59l52 60l-7 78l77 17l40 68l73 -31l73 31l40 -68l77 -17l-7 -79z" /> - <glyph glyph-name="uniE033" unicode="not_interested" -d="M391 151q36 45 36 105q0 70 -50.5 120.5t-120.5 50.5q-60 0 -105 -36zM256 85q60 0 105 36l-240 240q-36 -45 -36 -105q0 -70 50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5 -z" /> - <glyph glyph-name="uniE034" unicode="pause" -d="M299 405h85v-298h-85v298zM128 107v298h85v-298h-85z" /> - <glyph glyph-name="uniE035" unicode="pause_circle_filled" -d="M320 171v170h-43v-170h43zM235 171v170h-43v-170h43zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE036" unicode="pause_circle_outline" -d="M277 171v170h43v-170h-43zM256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z -M192 171v170h43v-170h-43z" /> - <glyph glyph-name="uniE037" unicode="play_arrow" -d="M171 405l234 -149l-234 -149v298z" /> - <glyph glyph-name="uniE038" unicode="play_circle_filled" -d="M213 160l128 96l-128 96v-192zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE039" unicode="play_circle_outline" -d="M256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5zM213 160v192l128 -96z" /> - <glyph glyph-name="uniE03B" unicode="playlist_add" -d="M43 171v42h170v-42h-170zM384 213h85v-42h-85v-86h-43v86h-85v42h85v86h43v-86zM299 384v-43h-256v43h256zM299 299v-43h-256v43h256z" /> - <glyph glyph-name="uniE03C" unicode="queue" -d="M405 277v43h-85v85h-43v-85h-85v-43h85v-85h43v85h85zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-256q-17 0 -30 13t-13 30v256q0 17 13 29.5t30 12.5h256zM85 384v-299h299v-42h-299q-17 0 -29.5 12.5t-12.5 29.5v299h42z" /> - <glyph glyph-name="uniE03D" unicode="queue_music" -d="M363 384h106v-43h-64v-192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19q8 0 22 -4v175zM64 171v42h171v-42h-171zM320 299v-43h-256v43h256zM320 384v-43h-256v43h256z" /> - <glyph glyph-name="uniE03E" unicode="radio" -d="M427 256v85h-342v-85h256v43h43v-43h43zM149 85q26 0 45 19t19 45t-19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19zM69 381l270 110l14 -36l-176 -71h250q18 0 30 -12.5t12 -30.5v-256q0 -17 -12 -29.5t-30 -12.5h-342q-18 0 -30 12.5t-12 29.5v256q0 30 26 40z" /> - <glyph glyph-name="uniE03F" unicode="recent_actors" -d="M267 149v16q0 22 -33 35t-63 13t-63 -13t-33 -35v-16h192zM171 347q-19 0 -33.5 -14.5t-14.5 -33.5t14.5 -33.5t33.5 -14.5t33.5 14.5t14.5 33.5t-14.5 33.5t-33.5 14.5zM299 405q9 0 15 -6t6 -15v-256q0 -9 -6 -15t-15 -6h-256q-9 0 -15.5 6t-6.5 15v256q0 9 6.5 15 -t15.5 6h256zM363 107v298h42v-298h-42zM448 405h43v-298h-43v298z" /> - <glyph glyph-name="uniE040" unicode="repeat" -d="M363 149v86h42v-128h-256v-64l-85 85l85 85v-64h214zM149 363v-86h-42v128h256v64l85 -85l-85 -85v64h-214z" /> - <glyph glyph-name="uniE041" unicode="repeat_one" -d="M277 192h-32v85h-32v22l43 21h21v-128zM363 149v86h42v-128h-256v-64l-85 85l85 85v-64h214zM149 363v-86h-42v128h256v64l85 -85l-85 -85v64h-214z" /> - <glyph glyph-name="uniE042" unicode="replay" -d="M256 405q71 0 121 -50t50 -120q0 -71 -50.5 -121t-120.5 -50t-120.5 50t-50.5 121h43q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5v-86l-107 107l107 107v-86z" /> - <glyph glyph-name="uniE043" unicode="shuffle" -d="M316 226l67 -67l44 44v-118h-118l44 44l-67 67zM309 427h118v-118l-44 44l-268 -268l-30 30l268 268zM226 316l-30 -30l-111 111l30 30z" /> - <glyph glyph-name="uniE044" unicode="skip_next" -d="M341 384h43v-256h-43v256zM128 128v256l181 -128z" /> - <glyph glyph-name="uniE045" unicode="skip_previous" -d="M203 256l181 128v-256zM128 384h43v-256h-43v256z" /> - <glyph glyph-name="uniE046" unicode="snooze" -d="M192 277v43h128v-38l-77 -90h77v-43h-128v39l77 89h-77zM256 85q62 0 105.5 44t43.5 106t-43.5 105.5t-105.5 43.5t-105.5 -43.5t-43.5 -105.5t43.5 -106t105.5 -44zM256 427q80 0 136 -56.5t56 -135.5t-56 -135.5t-136 -56.5t-136 56.5t-56 135.5t56 135.5t136 56.5z -M469 390l-27 -33l-98 83l27 32zM168 440l-98 -82l-27 32l98 82z" /> - <glyph glyph-name="uniE047" unicode="stop" -d="M128 384h256v-256h-256v256z" /> - <glyph glyph-name="uniE048" unicode="subtitles" -d="M427 213v43h-214v-43h214zM427 128v43h-86v-43h86zM299 128v43h-214v-43h214zM85 256v-43h86v43h-86zM427 427q17 0 29.5 -13t12.5 -30v-256q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h342z" /> - <glyph glyph-name="uniE049" unicode="surround_sound" -d="M256 299q17 0 30 -13t13 -30t-13 -30t-30 -13t-30 13t-13 30t13 30t30 13zM377 135q50 50 50 121t-50 121l-31 -31q38 -38 38 -90q0 -54 -37 -91zM256 171q35 0 60 25t25 60t-25 60t-60 25t-60 -25t-25 -60t25 -60t60 -25zM166 166q-38 38 -38 90q0 54 37 91l-30 30 -q-50 -50 -50 -121t50 -121zM427 427q17 0 29.5 -13t12.5 -30v-256q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h342z" /> - <glyph glyph-name="uniE04A" unicode="video_collection" -d="M256 203l128 96l-128 96v-192zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-256q-17 0 -30 13t-13 30v256q0 17 13 29.5t30 12.5h256zM85 384v-299h299v-42h-299q-17 0 -29.5 12.5t-12.5 29.5v299h42z" /> - <glyph glyph-name="uniE04B" unicode="videocam" -d="M363 288l85 85v-234l-85 85v-75q0 -9 -6.5 -15t-15.5 -6h-256q-9 0 -15 6t-6 15v214q0 9 6 15t15 6h256q9 0 15.5 -6t6.5 -15v-75z" /> - <glyph glyph-name="uniE04C" unicode="videocam_off" -d="M70 469l378 -378l-27 -27l-68 68q-6 -4 -12 -4h-256q-9 0 -15 6t-6 15v214q0 9 6 15t15 6h16l-58 58zM448 373v-228l-239 239h132q9 0 15.5 -6t6.5 -15v-75z" /> - <glyph glyph-name="uniE04D" unicode="volume_down" -d="M107 320h85l107 107v-342l-107 107h-85v128zM395 256q0 -59 -54 -86v172q54 -27 54 -86z" /> - <glyph glyph-name="uniE04E" unicode="volume_mute" -d="M149 320h86l106 107v-342l-106 107h-86v128z" /> - <glyph glyph-name="uniE04F" unicode="volume_off" -d="M256 427v-90l-45 45zM91 448l357 -357l-27 -27l-44 44q-37 -29 -78 -39v44q25 7 48 25l-91 91v-144l-107 107h-85v128h101l-101 101zM405 256q0 51 -29.5 90t-76.5 53v44q65 -14 107 -66.5t42 -120.5q0 -48 -22 -89l-32 33q11 27 11 56zM352 256q0 -9 -1 -13l-52 52v47 -q53 -26 53 -86z" /> - <glyph glyph-name="uniE050" unicode="volume_up" -d="M299 443q65 -14 107 -66.5t42 -120.5t-42 -120.5t-107 -66.5v44q47 14 76.5 53t29.5 90t-29.5 90t-76.5 53v44zM352 256q0 -60 -53 -86v172q53 -26 53 -86zM64 320h85l107 107v-342l-107 107h-85v128z" /> - <glyph glyph-name="uniE051" unicode="web" -d="M427 128v192h-86v-192h86zM320 235v85h-235v-85h235zM320 128v85h-235v-85h235zM427 427q17 0 29.5 -13t12.5 -30v-256q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h342z" /> - <glyph glyph-name="uniE052" unicode="hd" -d="M309 224v64h43v-64h-43zM277 320v-128h86q9 0 15 6t6 15v86q0 9 -6 15t-15 6h-86zM235 192v128h-32v-53h-43v53h-32v-128h32v43h43v-43h32zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-18 0 -30.5 13t-12.5 30v298q0 17 12.5 30t30.5 13h298z" /> - <glyph glyph-name="uniE053" unicode="sort_by_alpha" -d="M336 168h130v-34h-182v27l126 183h-125v34h177v-27zM106 221h83l-42 111zM130 378h35l96 -244h-39l-20 52h-109l-20 -52h-39zM219 99h99l-50 -50zM319 413h-101l50 50z" /> - <glyph glyph-name="uniE055" unicode="airplay" -d="M448 448q17 0 30 -13t13 -30v-256q0 -17 -13 -29.5t-30 -12.5h-85v42h85v256h-384v-256h85v-42h-85q-17 0 -30 12.5t-13 29.5v256q0 17 13 30t30 13h384zM128 43l128 128l128 -128h-256z" /> - <glyph glyph-name="uniE056" unicode="forward_10" -d="M282 188q0 -7 10 -7q5 0 7 2l4 5q2 4 2 6v43q-2 4 -2 6t-4.5 4.5t-6.5 2.5q-3 0 -6 -3l-4 -4q-3 -4 -3 -6v-43q3 -4 3 -6zM322 209q0 -13 -2 -17l-6 -13q-7 -6 -11 -6q-2 0 -6.5 -1t-6.5 -1q-9 0 -13 2q-2 1 -5 3t-5 3q-9 5 -9 30v15q0 13 2 17l7 13q6 6 10 6q2 0 6.5 1 -t6.5 1q9 0 13 -2q2 -1 5.5 -3t5.5 -3t6 -13q2 -6 2 -17v-15zM233 171h-20v70l-21 -6v15l38 12h3v-91zM85 235q0 70 50 120t121 50v86l107 -107l-107 -107v86q-52 0 -90 -37.5t-38 -90.5t38 -90.5t90 -37.5t90 37.5t38 90.5h43q0 -71 -50.5 -121t-120.5 -50t-120.5 50 -t-50.5 121z" /> - <glyph glyph-name="uniE057" unicode="forward_30" -d="M85 235q0 70 50 120t121 50v86l107 -107l-107 -107v86q-52 0 -90 -37.5t-38 -90.5t38 -90.5t90 -37.5t90 37.5t38 90.5h43q0 -71 -50.5 -121t-120.5 -50t-120.5 50t-50.5 121zM284 188q0 -7 10 -7q5 0 7 2l4 5q2 4 2 6v43q-2 4 -2 6t-4.5 4.5t-6.5 2.5q-3 0 -6 -3l-4 -4 -q-2 -4 -2 -6v-43q2 -4 2 -6zM326 209q0 -13 -2 -17l-6 -13q-7 -6 -11 -6q-2 0 -6.5 -1t-6.5 -1q-7 0 -23 8q-2 1 -6 13q-3 9 -3 17v15q0 11 3 17l6 13q7 6 11 6q2 0 6 1t6 1q9 0 13 -2q2 -1 5.5 -3t5.5 -3t6 -13q2 -6 2 -17v-15zM213 224q15 0 15 13v4q-2 2 -2 4t-4 2h-11 -q-2 -2 -4 -2t-2 -4v-4h-22q0 8 5.5 15.5t12.5 7.5q1 0 5 1t5 1q12 0 24 -6q8 -4 8 -19v-7q-2 -4 -2 -6q0 -4 -4 -4q-2 0 -7 -5q9 -5 11 -8q4 -8 4 -13q0 -9 -2 -11q-1 -1 -3 -4t-3 -4q-4 -4 -11 -4q-2 0 -6.5 -1t-6.5 -1q-8 0 -10 2q-1 1 -5 2t-6 2q-9 5 -9 21h18v-4 -q2 -2 2 -4t4 -2h11q2 2 4 2t2 4v11q-2 2 -2 4t-4 2h-13v15h8z" /> - <glyph glyph-name="uniE058" unicode="forward_5" -d="M250 222q-7 -3 -7 -4l-2 -3h-13l5 47h51v-15h-37l-2 -19q2 0 2 2q0 1 1.5 1.5t1.5 1.5h4h4q8 0 11 -3q1 -1 4 -3t4 -3q9 -9 9 -23q0 -9 -2 -11q-1 -1 -3 -5t-4 -6q-8 -8 -23 -8q-9 0 -11 2q-1 1 -4.5 2t-5.5 2q-9 5 -9 19h17q0 -10 13 -10q4 0 6 2l5 4q2 4 2 6v13l-2 4 -l-5 5q-4 2 -6 2h-4zM85 235q0 70 50 120t121 50v86l107 -107l-107 -107v86q-52 0 -90 -37.5t-38 -90.5t38 -90.5t90 -37.5t90 37.5t38 90.5h43q0 -71 -50.5 -121t-120.5 -50t-120.5 50t-50.5 121z" /> - <glyph glyph-name="uniE059" unicode="replay_10" -d="M282 188q0 -7 10 -7q5 0 7 2l4 5q2 4 2 6v43q-2 4 -2 6t-4.5 4.5t-6.5 2.5q-3 0 -6 -3l-4 -4q-3 -4 -3 -6v-43q3 -4 3 -6zM324 209q0 -13 -2 -17l-6 -13q-7 -6 -11 -6q-2 0 -6.5 -1t-6.5 -1q-9 0 -13 2q-2 1 -5 3t-5 3q-9 5 -9 30v15q0 13 2 17l7 13q6 6 10 6q2 0 6.5 1 -t6.5 1q9 0 13 -2q2 -1 5.5 -3t5.5 -3t6 -13q2 -6 2 -17v-15zM233 171h-20v70l-21 -6v15l38 12h3v-91zM256 405q71 0 121 -50t50 -120q0 -71 -50.5 -121t-120.5 -50t-120.5 50t-50.5 121h43q0 -53 38 -90.5t90 -37.5t90 37.5t38 90.5t-38 90.5t-90 37.5v-86l-107 107l107 107 -v-86z" /> - <glyph glyph-name="uniE05A" unicode="replay_30" -d="M286 188q0 -7 11 -7q4 0 6 2l4 5q2 4 2 6v43q0 1 -1 3t-1 3q0 2 -4 4.5t-6 2.5q-4 0 -7 -3l-4 -4q-2 -4 -2 -6v-43q2 -4 2 -6zM326 209q0 -13 -2 -17l-6 -13q-7 -6 -11 -6q-2 0 -6.5 -1t-6.5 -1q-7 0 -23 8q-2 1 -6 13q-3 9 -3 17v15q0 11 3 17l6 13q7 6 11 6q2 0 6 1 -t6 1q9 0 13 -2q2 -1 5.5 -3t5.5 -3t6 -13q2 -6 2 -17v-15zM213 224q15 0 15 13v4q-2 2 -2 4t-4 2h-11q-2 -2 -4 -2t-2 -4v-4h-22q0 8 5.5 15.5t12.5 7.5q1 0 5 1t5 1q12 0 24 -6q8 -4 8 -19v-7q-2 -4 -2 -6q0 -4 -4 -4q-2 0 -7 -5q9 -5 11 -8q4 -8 4 -13q0 -9 -2 -11 -q-1 -1 -3 -4t-3 -4q-4 -4 -11 -4q-2 0 -6.5 -1t-6.5 -1q-8 0 -10 2q-1 1 -5 2t-6 2q-9 5 -9 21h18v-4q2 -2 2 -4t4 -2h11q2 2 4 2t2 4v11q-2 2 -2 4t-4 2h-13v15h8zM256 405q71 0 121 -50t50 -120q0 -71 -50.5 -121t-120.5 -50t-120.5 50t-50.5 121h43q0 -53 38 -90.5 -t90 -37.5t90 37.5t38 90.5t-38 90.5t-90 37.5v-86l-107 107l107 107v-86z" /> - <glyph glyph-name="uniE05B" unicode="replay_5" -d="M252 222q-7 -3 -7 -4l-2 -3h-15l5 47h51v-15h-37l-2 -19q2 0 2 2q0 1 1.5 1.5t1.5 1.5h4h4q8 0 11 -3q1 -1 4 -3t4 -3q9 -9 9 -23q0 -9 -2 -11q-1 -1 -3 -5t-4 -6t-4.5 -3.5t-3.5 -2.5q-2 -2 -13 -2q-9 0 -11 2q-1 1 -4.5 2t-5.5 2q-9 5 -9 19h17q0 -10 13 -10q4 0 6 2 -l5 4q2 4 2 6v13l-2 4l-5 5q-4 2 -6 2h-4zM256 405q71 0 121 -50t50 -120q0 -71 -50.5 -121t-120.5 -50t-120.5 50t-50.5 121h43q0 -53 38 -90.5t90 -37.5t90 37.5t38 90.5t-38 90.5t-90 37.5v-86l-107 107l107 107v-86z" /> - <glyph glyph-name="uniE05C" unicode="add_to_queue" -d="M341 299v-43h-64v-64h-42v64h-64v43h64v64h42v-64h64zM448 149v256h-384v-256h384zM448 448q17 0 30 -12.5t13 -30.5l-1 -256q0 -17 -12.5 -29.5t-29.5 -12.5h-107v-43h-170v43h-107q-18 0 -30.5 12.5t-12.5 29.5v256q0 18 12.5 30.5t30.5 12.5h384z" /> - <glyph glyph-name="uniE05D" unicode="fiber_dvr" -d="M448 267v21q0 14 -9 23t-23 9h-75v-128h32v43h25l18 -43h32l-19 45q19 9 19 30zM269 192l38 128h-32l-22 -73l-21 73h-32l37 -128h32zM171 224v64q0 14 -9.5 23t-22.5 9h-75v-128h75q13 0 22.5 9t9.5 23zM448 448q18 0 30.5 -12.5t12.5 -30.5v-298q0 -17 -12.5 -30 -t-30.5 -13h-384q-18 0 -30.5 13t-12.5 30v298q0 18 12.5 30.5t30.5 12.5h384zM96 288h43v-64h-43v64zM373 288h43v-21h-43v21z" /> - <glyph glyph-name="uniE05E" unicode="fiber_new" -d="M437 213v107h-26v-96h-24v75h-27v-75h-24v96h-27v-107q0 -9 6.5 -15t15.5 -6h85q9 0 15 6t6 15zM288 293v27h-85v-128h85v27h-53v23h53v27h-53v24h53zM181 192v128h-26v-75l-54 75h-26v-128h26v75l55 -75h25zM427 427q18 0 30 -12.5t12 -30.5v-256q0 -18 -12 -30.5 -t-30 -12.5h-342q-18 0 -30 12.5t-12 30.5v256q0 18 12 30.5t30 12.5h342z" /> - <glyph glyph-name="uniE05F" unicode="playlist_play" -d="M363 235l106 -64l-106 -64v128zM43 192v43h277v-43h-277zM405 405v-42h-362v42h362zM405 320v-43h-362v43h362z" /> - <glyph glyph-name="uniE060" unicode="art_track" -d="M224 192l-48 64l-37 -48l-27 32l-37 -48h149zM256 320v-128q0 -17 -13 -30t-30 -13h-128q-17 0 -29.5 13t-12.5 30v128q0 17 12.5 30t29.5 13h128q17 0 30 -13t13 -30zM299 149v43h170v-43h-170zM469 363v-43h-170v43h170zM469 235h-170v42h170v-42z" /> - <glyph glyph-name="uniE061" unicode="fiber_manual_record" -d="M85 256q0 70 50.5 120.5t120.5 50.5t120.5 -50.5t50.5 -120.5t-50.5 -120.5t-120.5 -50.5t-120.5 50.5t-50.5 120.5z" /> - <glyph glyph-name="uniE062" unicode="fiber_smart_record" -d="M363 421q56 -14 92 -60t36 -105t-36 -105t-92 -60v44q38 13 61.5 46t23.5 75t-23.5 75t-61.5 46v44zM21 256q0 70 50.5 120.5t120.5 50.5t120.5 -50.5t50.5 -120.5t-50.5 -120.5t-120.5 -50.5t-120.5 50.5t-50.5 120.5z" /> - <glyph glyph-name="uniE063" unicode="music_video" -d="M171 192q0 26 19 45t45 19q7 0 21 -4v132h107v-43h-64v-150q0 -26 -19 -44.5t-45 -18.5t-45 19t-19 45zM448 107v298h-384v-298h384zM448 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-384q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h384z" /> - <glyph glyph-name="uniE064" unicode="subscriptions" -d="M341 171l-128 69v-139zM469 256v-171q0 -17 -12.5 -29.5t-29.5 -12.5h-342q-17 0 -29.5 12.5t-12.5 29.5v171q0 17 12.5 30t29.5 13h342q17 0 29.5 -13t12.5 -30zM384 469v-42h-256v42h256zM427 341h-342v43h342v-43z" /> - <glyph glyph-name="uniE065" unicode="playlist_add_check" -d="M459 267l32 -32l-149 -150l-97 96l32 32l65 -64zM43 171v42h170v-42h-170zM299 384v-43h-256v43h256zM299 299v-43h-256v43h256z" /> - <glyph glyph-name="uniE066" unicode="queue_play_next" -d="M512 128l-96 -96l-32 32l64 64l-64 64l32 32zM277 299h64v-43h-64v-64h-42v64h-64v43h64v64h42v-64zM448 448q17 0 30 -12.5t13 -30.5v-170h-43v170h-384v-256h320v-42h-43v-43h-170v43h-107q-18 0 -30.5 12.5t-12.5 29.5v256q0 18 12.5 30.5t30.5 12.5h384z" /> - <glyph glyph-name="uniE067" unicode="remove_from_queue" -d="M341 299v-43h-170v43h170zM448 149v256h-384v-256h384zM448 448q17 0 30 -12.5t13 -30.5l-1 -256q0 -17 -12.5 -29.5t-29.5 -12.5h-107v-43h-170v43h-107q-18 0 -30.5 12.5t-12.5 29.5v256q0 18 12.5 30.5t30.5 12.5h384z" /> - <glyph glyph-name="uniE068" unicode="slow_motion_video" -d="M469 256q0 -82 -55 -143t-136 -69v43q63 8 106 56.5t43 112.5t-43 112.5t-106 56.5v43q81 -8 136 -69t55 -143zM121 91l30 30q37 -28 84 -34v-43q-63 6 -114 47zM87 235q6 -47 34 -83l-30 -31q-41 51 -47 114h43zM121 361q-28 -37 -34 -84h-43q6 63 47 114zM235 425 -q-47 -6 -84 -34l-30 30q51 41 114 47v-43zM278 303l63 -47q-63 -47 -128 -96z" /> - <glyph glyph-name="uniE069" unicode="web_asset" -d="M405 128v213h-298v-213h298zM405 427q18 0 30.5 -13t12.5 -30v-256q0 -17 -13 -30t-30 -13h-298q-18 0 -30.5 13t-12.5 30v256q0 17 12.5 30t30.5 13h298z" /> - <glyph glyph-name="uniE06A" unicode="fiber_pin" -d="M427 192v128h-27v-75l-53 75h-27v-128h27v75l54 -75h26zM267 192v128h-32v-128h32zM192 267v21q0 14 -9 23t-23 9h-75v-128h32v43h43q14 0 23 9.5t9 22.5zM427 427q18 0 30 -12.5t12 -30.5v-256q0 -18 -12 -30.5t-30 -12.5h-342q-18 0 -30 12.5t-12 30.5v256 -q0 18 12 30.5t30 12.5h342zM117 288h43v-21h-43v21z" /> - <glyph glyph-name="uniE06B" unicode="branding_watermark" -d="M448 107v128h-192v-128h192zM448 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-384q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h384z" /> - <glyph glyph-name="uniE06C" unicode="call_to_action" -d="M448 107v64h-384v-64h384zM448 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-384q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h384z" /> - <glyph glyph-name="uniE06D" unicode="featured_play_list" -d="M256 363v42h-192v-42h192zM256 277v43h-192v-43h192zM448 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-384q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h384z" /> - <glyph glyph-name="uniE06E" unicode="featured_video" -d="M256 256v149h-192v-149h192zM448 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-384q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h384z" /> - <glyph glyph-name="uniE06F" unicode="note" -d="M320 395v-118h117zM469 299v-171q0 -17 -12.5 -29.5t-29.5 -12.5l-342 -1q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h256z" /> - <glyph glyph-name="uniE070" unicode="video_call" -d="M299 235v42h-64v64h-43v-64h-64v-42h64v-64h43v64h64zM363 288l85 85v-234l-85 85v-75q0 -9 -6.5 -15t-15.5 -6h-256q-9 0 -15 6t-6 15v214q0 9 6 15t15 6h256q9 0 15.5 -6t6.5 -15v-75z" /> - <glyph glyph-name="uniE071" unicode="video_label" -d="M448 171v234h-384v-234h384zM448 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-384q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h384z" /> - <glyph glyph-name="uniE0AF" unicode="business" -d="M384 192v-43h-43v43h43zM384 277v-42h-43v42h43zM427 107v213h-171v-43h43v-42h-43v-43h43v-43h-43v-42h171zM213 363v42h-42v-42h42zM213 277v43h-42v-43h42zM213 192v43h-42v-43h42zM213 107v42h-42v-42h42zM128 363v42h-43v-42h43zM128 277v43h-43v-43h43zM128 192v43 -h-43v-43h43zM128 107v42h-43v-42h43zM256 363h213v-299h-426v384h213v-85z" /> - <glyph glyph-name="uniE0B0" unicode="call" -d="M141 282q48 -93 141 -141l47 47q6.66667 6.66667 14.2222 6.66667q3.77778 0 7.77778 -1.66667q36 -12 76 -12q9 0 15 -6t6 -15v-75q0 -9 -6 -15t-15 -6q-150 0 -256.5 106.5t-106.5 256.5q0 9 6 15t15 6h75q9 0 15 -6t6 -15q0 -40 12 -76q1.23077 -4 1.23077 -7.6213 -q0 -8.14793 -6.23077 -14.3787z" /> - <glyph glyph-name="uniE0B1" unicode="call_end" -d="M256 320q-52 0 -98 -15v-66q0 -15 -12 -20q-32 -15 -57 -39q-6 -6 -15 -6t-15 6l-53 53q-6 6 -6 15t6 15q105 100 250 100t250 -100q6 -6 6 -15t-6 -15l-53 -53q-6 -6 -15 -6t-15 6q-25 24 -57 39q-12 5 -12 19v66q-50 16 -98 16z" /> - <glyph glyph-name="uniE0B2" unicode="call_made" -d="M192 405h213v-213h-42v141l-248 -248l-30 30l248 248h-141v42z" /> - <glyph glyph-name="uniE0B3" unicode="call_merge" -d="M160 341l96 96l96 -96h-75v-136l-128 -128l-30 30l116 115v119h-75zM363 77l-73 72l30 30l73 -72z" /> - <glyph glyph-name="uniE0B4" unicode="call_missed" -d="M418 363l30 -30l-192 -192l-149 149v-98h-43v171h171v-43h-98l119 -119z" /> - <glyph glyph-name="uniE0B5" unicode="call_received" -d="M427 397l-248 -248h141v-42h-213v213h42v-141l248 248z" /> - <glyph glyph-name="uniE0B6" unicode="call_split" -d="M213 427l-49 -49l113 -113v-180h-42v162l-101 101l-49 -49v128h128zM299 427h128v-128l-49 49l-62 -62l-30 30l62 62z" /> - <glyph glyph-name="uniE0B7" unicode="chat" -d="M384 341v43h-256v-43h256zM299 213v43h-171v-43h171zM128 320v-43h256v43h-256zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-299l-85 -85v384q0 17 12.5 29.5t29.5 12.5h342z" /> - <glyph glyph-name="uniE0B8" unicode="clear_all" -d="M149 363h299v-43h-299v43zM64 149v43h299v-43h-299zM107 235v42h298v-42h-298z" /> - <glyph glyph-name="uniE0B9" unicode="comment" -d="M384 341v43h-256v-43h256zM384 277v43h-256v-43h256zM384 213v43h-256v-43h256zM469 427v-384l-85 85h-299q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 29.5t29.5 12.5h342q17 0 29.5 -12.5t12.5 -29.5z" /> - <glyph glyph-name="uniE0BA" unicode="contacts" -d="M363 149v32q0 24 -36.5 39t-70.5 15t-70.5 -15t-36.5 -39v-32h214zM256 368q-20 0 -34 -14t-14 -34t14 -34t34 -14t34 14t14 34t-14 34t-34 14zM427 427q17 0 29.5 -13t12.5 -30v-256q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13 -h342zM85 0v43h342v-43h-342zM427 512v-43h-342v43h342z" /> - <glyph glyph-name="uniE0BB" unicode="dialer_sip" -d="M427 181q9 0 15 -6t6 -15v-75q0 -9 -6 -15t-15 -6q-150 0 -256.5 106.5t-106.5 256.5q0 9 6 15t15 6h75q9 0 15 -6t6 -15q0 -40 12 -76q4 -13 -5 -22l-47 -47q47 -92 141 -141l47 47q9 9 22 5q36 -12 76 -12zM427 405v22h-22v-22h22zM384 448h64v-64h-43v-43h-21v107z -M320 405v-64h-64v22h43v21h-43v64h64v-21h-43v-22h43zM363 448v-107h-22v107h22z" /> - <glyph glyph-name="uniE0BC" unicode="dialpad" -d="M256 491q17 0 30 -13t13 -30t-13 -30t-30 -13t-30 13t-13 30t13 30t30 13zM256 363q17 0 30 -13t13 -30t-13 -30t-30 -13t-30 13t-13 30t13 30t30 13zM384 363q17 0 30 -13t13 -30t-13 -30t-30 -13t-30 13t-13 30t13 30t30 13zM384 235q17 0 30 -13t13 -30t-13 -30 -t-30 -13t-30 13t-13 30t13 30t30 13zM256 235q17 0 30 -13t13 -30t-13 -30t-30 -13t-30 13t-13 30t13 30t30 13zM384 405q-17 0 -30 13t-13 30t13 30t30 13t30 -13t13 -30t-13 -30t-30 -13zM128 235q17 0 30 -13t13 -30t-13 -30t-30 -13t-30 13t-13 30t13 30t30 13zM128 363 -q17 0 30 -13t13 -30t-13 -30t-30 -13t-30 13t-13 30t13 30t30 13zM128 491q17 0 30 -13t13 -30t-13 -30t-30 -13t-30 13t-13 30t13 30t30 13zM256 107q17 0 30 -13t13 -30t-13 -30t-30 -13t-30 13t-13 30t13 30t30 13z" /> - <glyph glyph-name="uniE0BE" unicode="email" -d="M427 341v43l-171 -107l-171 107v-43l171 -106zM427 427q17 0 29.5 -13t12.5 -30v-256q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h342z" /> - <glyph glyph-name="uniE0BF" unicode="forum" -d="M363 256q0 -9 -6.5 -15t-15.5 -6h-213l-85 -86v299q0 9 6 15t15 6h277q9 0 15.5 -6t6.5 -15v-192zM448 384q9 0 15 -6t6 -15v-320l-85 85h-235q-9 0 -15 6t-6 15v43h277v192h43z" /> - <glyph glyph-name="uniE0C3" unicode="import_export" -d="M341 149h64l-85 -85l-85 85h64v150h42v-150zM192 448l85 -85h-64v-150h-42v150h-64z" /> - <glyph glyph-name="uniE0C4" unicode="invert_colors_off" -d="M256 403l-49 -48l-30 30l79 79l121 -121q38 -38 47 -91.5t-13 -100.5l-155 154v98zM256 94v103l-102 102q-26 -34 -26 -77q0 -52 38 -90t90 -38zM441 67l7 -8l-27 -27l-58 58q-47 -38 -107 -38q-71 0 -121 50q-46 47 -49.5 112.5t37.5 115.5l-59 59l27 27 -q299 -299 350 -349z" /> - <glyph glyph-name="uniE0C6" unicode="live_help" -d="M321 293q20 20 20 48q0 35 -25 60.5t-60 25.5t-60 -25.5t-25 -60.5h42q0 17 13 30t30 13t30 -13t13 -30t-13 -30l-26 -27q-25 -27 -25 -60v-11h42q0 34 25 61zM277 128v43h-42v-43h42zM405 469q17 0 30 -12.5t13 -29.5v-299q0 -17 -13 -30t-30 -13h-85l-64 -64l-64 64 -h-85q-18 0 -30.5 13t-12.5 30v299q0 17 12.5 29.5t30.5 12.5h298z" /> - <glyph glyph-name="uniE0C7" unicode="location_off" -d="M250 267q109 -108 177 -176l-27 -27l-72 71q-16 -24 -34 -47t-28 -34l-10 -11q-6 7 -16 18.5t-36 46t-45.5 67t-35.5 73.5t-16 72q0 11 4 33l-68 68l27 27l178 -178zM256 373q-23 0 -39 -18l-69 68q44 46 108 46q62 0 105.5 -43.5t43.5 -105.5q0 -48 -36 -117l-77 78 -q17 15 17 39q0 22 -15.5 37.5t-37.5 15.5z" /> - <glyph glyph-name="uniE0C8" unicode="location_on" -d="M256 267q22 0 37.5 15.5t15.5 37.5t-15.5 37.5t-37.5 15.5t-37.5 -15.5t-15.5 -37.5t15.5 -37.5t37.5 -15.5zM256 469q62 0 105.5 -43.5t43.5 -105.5q0 -31 -15.5 -71t-37.5 -75t-43.5 -65.5t-36.5 -48.5l-16 -17q-6 7 -16 18.5t-36 46t-45.5 67t-35.5 73.5t-16 72 -q0 62 43.5 105.5t105.5 43.5z" /> - <glyph glyph-name="uniE0C9" unicode="message" -d="M384 341v43h-256v-43h256zM384 277v43h-256v-43h256zM384 213v43h-256v-43h256zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-299l-85 -85v384q0 17 12.5 29.5t29.5 12.5h342z" /> - <glyph glyph-name="uniE0CA" unicode="chat_bubble" -d="M427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-299l-85 -85v384q0 17 12.5 29.5t29.5 12.5h342z" /> - <glyph glyph-name="uniE0CB" unicode="chat_bubble_outline" -d="M427 171v256h-342v-299l43 43h299zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-299l-85 -85v384q0 17 12.5 29.5t29.5 12.5h342z" /> - <glyph glyph-name="uniE0CC" unicode="no_sim" -d="M78 429l373 -372l-28 -28l-40 41q-12 -6 -20 -6h-214q-17 0 -29.5 13t-12.5 30v239l-56 56zM405 405v-249l-242 242l50 50h150q17 0 29.5 -13t12.5 -30z" /> - <glyph glyph-name="uniE0CD" unicode="phone" -d="M141 282q48 -93 141 -141l47 47q10 10 22 5q36 -12 76 -12q9 0 15 -6t6 -15v-75q0 -9 -6 -15t-15 -6q-150 0 -256.5 106.5t-106.5 256.5q0 9 6 15t15 6h75q9 0 15 -6t6 -15q0 -40 12 -76q4 -13 -5 -22z" /> - <glyph glyph-name="uniE0CE" unicode="portable_wifi_off" -d="M70 459l21 -22l357 -357l-27 -27l-160 161h-1l-4 -1q-17 0 -30 13t-13 30l1 4l-34 34q-9 -18 -9 -38q0 -49 42 -74l-21 -37q-29 17 -46.5 46.5t-17.5 64.5q0 38 20 69l-30 31q-33 -46 -33 -100q0 -46 23 -85.5t62 -62.5l-21 -37q-49 28 -77.5 77.5t-28.5 107.5 -q0 74 44 131l-44 45zM256 427q-43 0 -80 -20l-31 31q50 31 111 31q88 0 150.5 -62.5t62.5 -150.5q0 -61 -31 -111l-32 31q21 39 21 80q0 70 -50.5 120.5t-120.5 50.5zM375 208l-35 35q1 4 1 13q0 35 -25 60t-60 25q-9 0 -13 -1l-35 35q22 9 48 9q53 0 90.5 -37.5t37.5 -90.5 -q0 -26 -9 -48z" /> - <glyph glyph-name="uniE0CF" unicode="contact_phone" -d="M381 213q-8 21 -8 43t8 43h35l32 42l-42 43q-44 -33 -59 -85q-6 -21 -6 -43t6 -43q15 -52 59 -85l42 43l-32 42h-35zM299 128v21q0 29 -44 47.5t-84 18.5t-84 -18.5t-44 -47.5v-21h256zM171 384q-26 0 -45 -19t-19 -45t19 -45t45 -19t45 19t19 45t-19 45t-45 19zM469 448 -q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-426q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h426z" /> - <glyph glyph-name="uniE0D0" unicode="contact_mail" -d="M469 256v128h-170v-128h170zM299 128v21q0 29 -44 47.5t-84 18.5t-84 -18.5t-44 -47.5v-21h256zM171 384q-26 0 -45 -19t-19 -45t19 -45t45 -19t45 19t19 45t-19 45t-45 19zM469 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-426q-17 0 -30 13t-13 30v298 -q0 17 13 30t30 13h426zM448 341l-64 -42l-64 42v22l64 -43l64 43v-22z" /> - <glyph glyph-name="uniE0D1" unicode="ring_volume" -d="M137 303q-74 74 -76 75l30 31l76 -76zM277 469v-106h-42v106h42zM451 378l-76 -75l-30 30l76 76zM506 156q6 -6 6 -15t-6 -15l-53 -53q-6 -6 -15 -6t-15 6q-28 26 -57 40q-12 5 -12 19v66q-46 15 -98 15t-98 -15v-66q0 -15 -12 -20q-32 -15 -57 -39q-6 -6 -15 -6t-15 6 -l-53 53q-6 6 -6 15t6 15q105 100 250 100t250 -100z" /> - <glyph glyph-name="uniE0D2" unicode="speaker_phone" -d="M320 85v171h-128v-171h128zM317 298q10 0 17 -7t7 -17v-207q0 -10 -7 -17t-17 -7h-122q-10 0 -17 7t-7 17v207q0 10 7 17.5t17 7.5zM256 491q96 0 165 -69l-30 -30q-56 56 -135 56t-135 -56l-30 30q69 69 165 69zM149 361q44 44 107 44t107 -44l-31 -30q-31 31 -76 31 -t-76 -31z" /> - <glyph glyph-name="uniE0D3" unicode="stay_current_landscape" -d="M405 363h-298v-214h298v214zM22 363q0 17 12.5 29.5t29.5 12.5h384q17 0 30 -12.5t13 -29.5v-214q0 -17 -13 -29.5t-30 -12.5h-384q-17 0 -30 12.5t-13 29.5z" /> - <glyph glyph-name="uniE0D4" unicode="stay_current_portrait" -d="M363 107v298h-214v-298h214zM363 490q17 0 29.5 -12.5t12.5 -29.5v-384q0 -17 -12.5 -30t-29.5 -13h-214q-17 0 -29.5 13t-12.5 30v384q0 17 12.5 30t29.5 13z" /> - <glyph glyph-name="uniE0D5" unicode="stay_primary_landscape" -d="M405 363h-298v-214h298v214zM22 363q0 17 12.5 29.5t29.5 12.5h384q17 0 30 -12.5t13 -29.5v-214q0 -17 -13 -29.5t-30 -12.5h-384q-17 0 -30 12.5t-13 29.5z" /> - <glyph glyph-name="uniE0D6" unicode="stay_primary_portrait" -d="M363 107v298h-214v-298h214zM363 490q17 0 29.5 -12.5t12.5 -29.5v-384q0 -17 -12.5 -30t-29.5 -13h-214q-17 0 -29.5 13t-12.5 30v384q0 17 12.5 30t29.5 13z" /> - <glyph glyph-name="uniE0D7" unicode="swap_calls" -d="M384 427l85 -86h-64v-149q0 -35 -25 -60t-60 -25t-60 25t-25 60v149q0 17 -13 30t-30 13t-30 -13t-13 -30v-149h64l-85 -85l-85 85h64v149q0 35 25 60.5t60 25.5t60 -25.5t25 -60.5v-149q0 -17 13 -30t30 -13t30 13t13 30v149h-64z" /> - <glyph glyph-name="uniE0D8" unicode="textsms" -d="M363 277v43h-43v-43h43zM277 277v43h-42v-43h42zM192 277v43h-43v-43h43zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-299l-85 -85v384q0 17 12.5 29.5t29.5 12.5h342z" /> - <glyph glyph-name="uniE0D9" unicode="voicemail" -d="M395 192q31 0 52.5 22t21.5 53t-21.5 52.5t-52.5 21.5t-53 -21.5t-22 -52.5t22 -53t53 -22zM117 192q31 0 53 22t22 53t-22 52.5t-53 21.5t-52.5 -21.5t-21.5 -52.5t21.5 -53t52.5 -22zM395 384q49 0 83 -34t34 -83t-34 -83.5t-83 -34.5h-278q-49 0 -83 34.5t-34 83.5 -t34 83t83 34t83.5 -34t34.5 -83q0 -43 -27 -75h96q-27 32 -27 75q0 49 34.5 83t83.5 34z" /> - <glyph glyph-name="uniE0DA" unicode="vpn_key" -d="M149 213q17 0 30 13t13 30t-13 30t-30 13t-29.5 -13t-12.5 -30t12.5 -30t29.5 -13zM270 299h221v-86h-43v-85h-85v85h-93q-13 -38 -46 -61.5t-75 -23.5q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q42 0 75 -23.5t46 -61.5z" /> - <glyph glyph-name="uniE0DB" unicode="phonelink_erase" -d="M405 491q17 0 30 -13t13 -30v-384q0 -17 -13 -30t-30 -13h-213q-17 0 -30 13t-13 30v64h43v-43h213v342h-213v-43h-43v64q0 17 13 30t30 13h213zM277 337l-85 -85l85 -86l-21 -21l-85 85l-86 -85l-21 21l85 86l-85 85l21 21l86 -85l85 85z" /> - <glyph glyph-name="uniE0DC" unicode="phonelink_lock" -d="M203 277v32q0 12 -9.5 20t-22.5 8t-22.5 -8t-9.5 -20v-32h64zM230 277q10 0 18 -8t8 -19v-75q0 -10 -8.5 -18t-19.5 -8h-117q-10 0 -18 8.5t-8 19.5v75q0 10 8 17.5t18 7.5v32q0 22 18.5 38t41.5 16t41 -16t18 -38v-32zM405 491q17 0 30 -13t13 -30v-384q0 -17 -13 -30 -t-30 -13h-213q-17 0 -30 13t-13 30v64h43v-43h213v342h-213v-43h-43v64q0 17 13 30t30 13h213z" /> - <glyph glyph-name="uniE0DD" unicode="phonelink_ring" -d="M299 85v342h-214v-342h214zM299 491q17 0 29.5 -13t12.5 -30v-384q0 -17 -12.5 -30t-29.5 -13h-214q-17 0 -29.5 13t-12.5 30v384q0 17 12.5 30t29.5 13h214zM384 303q20 -21 20 -47t-20 -45l-21 22q18 25 0 49zM429 348q40 -38 40 -91.5t-40 -90.5l-22 22q29 31 29 70.5 -t-29 67.5z" /> - <glyph glyph-name="uniE0DE" unicode="phonelink_setup" -d="M405 491q17 0 30 -13t13 -30v-384q0 -17 -13 -30t-30 -13h-213q-17 0 -30 13t-13 30v64h43v-43h213v342h-213v-43h-43v64q0 17 13 30t30 13h213zM171 213q17 0 29.5 13t12.5 30t-12.5 30t-29.5 13t-30 -13t-13 -30t13 -30t30 -13zM252 245l23 -19q4 -4 2 -6l-21 -37 -q-2 -2 -6 -2l-28 11q-14 -9 -19 -11l-5 -27q-5 -5 -6 -5h-43q-2 0 -3.5 2t-0.5 3l-4 27q-5 2 -19 11l-30 -9q-2 -2 -7 3l-21 36q0 4 2 8l24 17v22l-24 17q-4 4 -2 6l21 37q2 2 7 2l27 -11q13 9 20 11l4 27q5 5 6 5h43q6 0 6 -5l5 -27q5 -2 19 -11l28 9q2 1 6 -3l21 -36 -q0 -4 -2 -6l-23 -17v-22z" /> - <glyph glyph-name="uniE0DF" unicode="present_to_all" -d="M213 256h-42l85 85l85 -85h-42v-85h-86v85zM448 106v300h-384v-300h384zM448 448q18 0 30.5 -12.5t12.5 -30.5v-298q0 -18 -12.5 -30.5t-30.5 -12.5h-384q-18 0 -30.5 12.5t-12.5 30.5v298q0 18 12.5 30.5t30.5 12.5h384z" /> - <glyph glyph-name="uniE0E0" unicode="import_contacts" -d="M448 117v246q-33 10 -75 10q-65 0 -117 -32v-245q52 32 117 32q39 0 75 -11zM373 416q76 0 118 -32v-311q0 -4 -3.5 -7.5t-7.5 -3.5q-3 0 -5 1q-41 22 -102 22q-65 0 -117 -32q-43 32 -117 32q-54 0 -102 -23q-1 0 -2.5 -0.5t-2.5 -0.5q-4 0 -7.5 3t-3.5 7v313 -q43 32 118 32q74 0 117 -32q43 32 117 32z" /> - <glyph glyph-name="uniE0E1" unicode="mail_outline" -d="M256 277l171 107h-342zM427 128v213l-171 -106l-171 106v-213h342zM427 427q17 0 29.5 -13t12.5 -30v-256q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h342z" /> - <glyph glyph-name="uniE0E2" unicode="screen_share" -d="M277 203l86 80l-86 80v-46q-105 -15 -128 -125q43 58 128 58v-47zM427 128h85v-43h-512v43h85q-18 0 -30 12.5t-12 30.5v213q0 18 12 30.5t30 12.5h342q17 0 29.5 -12.5t12.5 -30.5v-213q0 -17 -12.5 -30t-29.5 -13z" /> - <glyph glyph-name="uniE0E3" unicode="stop_screen_share" -d="M149 192q29 40 78 52l-34 34q-32 -31 -44 -86zM51 475l421 -421l-27 -27l-58 58h-387v43h85q-18 0 -30 12.5t-12 29.5v214q0 19 14 31l-33 33zM469 170q0 -25 -22 -37l-118 118l34 32l-86 79v-45q-2 -1 -5.5 -1t-5.5 -1l-112 111h273q17 0 29.5 -12t12.5 -30v-214z -M453 128h59v-43h-17z" /> - <glyph glyph-name="uniE0E4" unicode="call_missed_outgoing" -d="M64 333l30 30l162 -162l119 119h-98v43h171v-171h-43v98l-149 -149z" /> - <glyph glyph-name="uniE0E5" unicode="rss_feed" -d="M85 297q88 0 150 -62t62 -150h-61q0 62 -44.5 106.5t-106.5 44.5v61zM85 417q137 0 234.5 -97.5t97.5 -234.5h-60q0 113 -79.5 192.5t-192.5 79.5v60zM85 132q0 19 13.5 32.5t33.5 13.5t33 -13t13 -33t-13.5 -33.5t-32.5 -13.5q-20 0 -33.5 13.5t-13.5 33.5z" /> - <glyph glyph-name="uniE145" unicode="add" -d="M405 235h-128v-128h-42v128h-128v42h128v128h42v-128h128v-42z" /> - <glyph glyph-name="uniE146" unicode="add_box" -d="M363 235v42h-86v86h-42v-86h-86v-42h86v-86h42v86h86zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-18 0 -30.5 13t-12.5 30v298q0 17 12.5 30t30.5 13h298z" /> - <glyph glyph-name="uniE147" unicode="add_circle" -d="M363 235v42h-86v86h-42v-86h-86v-42h86v-86h42v86h86zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE148" unicode="add_circle_outline" -d="M256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5zM277 363v-86h86v-42h-86v-86h-42 -v86h-86v42h86v86h42z" /> - <glyph glyph-name="uniE149" unicode="archive" -d="M109 405h294l-20 22h-256zM256 139l117 117h-74v43h-86v-43h-74zM438 400q10 -12 10 -27v-266q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v266q0 15 10 27l29 36q10 12 25 12h256q15 0 25 -12z" /> - <glyph glyph-name="uniE14A" unicode="backspace" -d="M405 179l-76 77l76 77l-30 30l-76 -77l-77 77l-30 -30l77 -77l-77 -77l30 -30l77 77l76 -77zM469 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-320q-20 0 -34 19l-115 173l115 173q14 19 34 19h320z" /> - <glyph glyph-name="uniE14B" unicode="block" -d="M256 85q70 0 120.5 50.5t50.5 120.5q0 60 -36 105l-240 -240q45 -36 105 -36zM85 256q0 -60 36 -105l240 240q-45 36 -105 36q-70 0 -120.5 -50.5t-50.5 -120.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5 -t150.5 62.5z" /> - <glyph glyph-name="uniE14C" unicode="clear" -d="M405 375l-119 -119l119 -119l-30 -30l-119 119l-119 -119l-30 30l119 119l-119 119l30 30l119 -119l119 119z" /> - <glyph glyph-name="uniE14D" unicode="content_copy" -d="M405 64v299h-234v-299h234zM405 405q17 0 30 -12.5t13 -29.5v-299q0 -17 -13 -30t-30 -13h-234q-17 0 -30 13t-13 30v299q0 17 13 29.5t30 12.5h234zM341 491v-43h-256v-299h-42v299q0 17 12.5 30t29.5 13h256z" /> - <glyph glyph-name="uniE14E" unicode="content_cut" -d="M405 448h64v-21l-149 -150l-43 43zM256 245q11 0 11 11t-11 11t-11 -11t11 -11zM128 85q17 0 30 12.5t13 30.5t-13 30.5t-30 12.5t-30 -12.5t-13 -30.5t13 -30.5t30 -12.5zM128 341q17 0 30 12.5t13 30.5t-13 30.5t-30 12.5t-30 -12.5t-13 -30.5t13 -30.5t30 -12.5z -M206 349l263 -264v-21h-64l-149 149l-50 -50q7 -15 7 -35q0 -35 -25 -60t-60 -25t-60 25t-25 60t25 60t60 25q20 0 35 -7l50 50l-50 50q-15 -7 -35 -7q-35 0 -60 25t-25 60t25 60t60 25t60 -25t25 -60q0 -20 -7 -35z" /> - <glyph glyph-name="uniE14F" unicode="content_paste" -d="M405 85v342h-42v-64h-214v64h-42v-342h298zM256 469q-9 0 -15 -6t-6 -15t6 -15t15 -6t15 6t6 15t-6 15t-15 6zM405 469q17 0 30 -12.5t13 -29.5v-342q0 -17 -13 -29.5t-30 -12.5h-298q-17 0 -30 12.5t-13 29.5v342q0 17 13 29.5t30 12.5h89q7 19 23 31t37 12t37 -12 -t23 -31h89z" /> - <glyph glyph-name="uniE150" unicode="create" -d="M442 362l-39 -39l-80 80l39 39q6 6 15 6t15 -6l50 -50q6 -6 6 -15t-6 -15zM64 144l236 236l80 -80l-236 -236h-80v80z" /> - <glyph glyph-name="uniE151" unicode="drafts" -d="M256 235l176 110l-176 103l-176 -103zM469 341v-213q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v213q0 25 20 37l193 113l193 -113q20 -12 20 -37z" /> - <glyph glyph-name="uniE152" unicode="filter_list" -d="M128 235v42h256v-42h-256zM64 384h384v-43h-384v43zM213 128v43h86v-43h-86z" /> - <glyph glyph-name="uniE153" unicode="flag" -d="M307 384h120v-213h-150l-8 42h-120v-149h-42v363h192z" /> - <glyph glyph-name="uniE154" unicode="forward" -d="M256 341v86l171 -171l-171 -171v86h-171v170h171z" /> - <glyph glyph-name="uniE155" unicode="gesture" -d="M296 116q14 0 28 18.5t18 56.5q-30 -8 -46 -27t-16 -32q0 -7 5 -11.5t11 -4.5zM98 365l-37 36q10 12 18 20q27 27 58 27q19 0 36.5 -15t17.5 -46q0 -30 -28 -70q-28 -39 -39 -75q-6 -17 -3.5 -29t10.5 -12q9 0 24 18q22 22 49 58q48 60 105 60q42 0 62.5 -27.5 -t23.5 -61.5h53v-53h-52q-6 -69 -37 -100t-64 -31q-28 0 -48 19.5t-20 46.5q0 33 30 69t85 46q-1 8 -1.5 11t-3 9.5t-6 9.5t-10.5 5.5t-17 2.5q-28 0 -87 -73q-17 -21 -23.5 -28.5t-18.5 -17.5t-23 -13q-35 -11 -60 13t-25 60q0 15 5.5 33t14.5 35t17 30.5t15.5 24.5t8.5 12 -q17 28 6 32q-7 3 -36 -26z" /> - <glyph glyph-name="uniE156" unicode="inbox" -d="M405 192v213h-299v-213h86q0 -26 19 -45t45 -19t45 19t19 45h85zM405 448q17 0 30 -12.5t13 -30.5v-298q0 -17 -13 -30t-30 -13h-299q-18 0 -30 12.5t-12 30.5v298q0 18 12 30.5t30 12.5h299z" /> - <glyph glyph-name="uniE157" unicode="link" -d="M363 363q44 0 75 -31.5t31 -75.5t-31 -75.5t-75 -31.5h-86v41h86q27 0 46.5 19.5t19.5 46.5t-19.5 46.5t-46.5 19.5h-86v41h86zM171 235v42h170v-42h-170zM83 256q0 -27 19.5 -46.5t46.5 -19.5h86v-41h-86q-44 0 -75 31.5t-31 75.5t31 75.5t75 31.5h86v-41h-86 -q-27 0 -46.5 -19.5t-19.5 -46.5z" /> - <glyph glyph-name="uniE158" unicode="mail" -d="M427 341v43l-171 -107l-171 107v-43l171 -106zM427 427q17 0 29.5 -13t12.5 -30v-256q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h342z" /> - <glyph glyph-name="uniE159" unicode="markunread" -d="M427 341v43l-171 -107l-171 107v-43l171 -106zM427 427q17 0 29.5 -13t12.5 -30v-256q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h342z" /> - <glyph glyph-name="uniE15A" unicode="redo" -d="M393 286l76 77v-192h-192l78 77q-48 40 -110 40q-56 0 -100.5 -32.5t-61.5 -84.5l-50 16q22 68 80.5 111t131.5 43q85 0 148 -55z" /> - <glyph glyph-name="uniE15B" unicode="remove" -d="M405 235h-298v42h298v-42z" /> - <glyph glyph-name="uniE15C" unicode="remove_circle" -d="M363 235v42h-214v-42h214zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE15D" unicode="remove_circle_outline" -d="M256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5zM149 277h214v-42h-214v42z" /> - <glyph glyph-name="uniE15E" unicode="reply" -d="M213 320q104 -15 160.5 -79.5t74.5 -155.5q-77 109 -235 109v-87l-149 149l149 149v-85z" /> - <glyph glyph-name="uniE15F" unicode="reply_all" -d="M277 320q104 -15 160.5 -79.5t74.5 -155.5q-77 109 -235 109v-87l-149 149l149 149v-85zM149 341l-85 -85l85 -85v-64l-149 149l149 149v-64z" /> - <glyph glyph-name="uniE160" unicode="report" -d="M277 235v128h-42v-128h42zM256 143q11 0 19.5 8.5t8.5 19.5t-8.5 19t-19.5 8t-19.5 -8t-8.5 -19t8.5 -19.5t19.5 -8.5zM336 448l112 -112v-160l-112 -112h-160l-112 112v160l112 112h160z" /> - <glyph glyph-name="uniE161" unicode="save" -d="M320 320v85h-213v-85h213zM256 107q26 0 45 19t19 45t-19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19zM363 448l85 -85v-256q0 -17 -13 -30t-30 -13h-298q-18 0 -30.5 13t-12.5 30v298q0 17 12.5 30t30.5 13h256z" /> - <glyph glyph-name="uniE162" unicode="select_all" -d="M192 320v-128h128v128h-128zM149 149v214h214v-214h-214zM320 405v43h43v-43h-43zM320 64v43h43v-43h-43zM405 149v43h43v-43h-43zM405 320v43h43v-43h-43zM405 64v43h43q0 -17 -13 -30t-30 -13zM405 235v42h43v-42h-43zM235 64v43h42v-43h-42zM192 448v-43h-43v43h43z -M64 149v43h43v-43h-43zM107 64q-17 0 -30 13t-13 30h43v-43zM405 448q17 0 30 -13t13 -30h-43v43zM277 448v-43h-42v43h42zM64 320v43h43v-43h-43zM149 64v43h43v-43h-43zM64 235v42h43v-42h-43zM64 405q0 17 13 30t30 13v-43h-43z" /> - <glyph glyph-name="uniE163" unicode="send" -d="M43 64v149l320 43l-320 43v149l448 -192z" /> - <glyph glyph-name="uniE164" unicode="sort" -d="M64 235v42h256v-42h-256zM64 384h384v-43h-384v43zM64 128v43h128v-43h-128z" /> - <glyph glyph-name="uniE165" unicode="text_format" -d="M256 384l-40 -107h80zM203 239l-20 -47h-44l101 235h32l101 -235h-44l-20 47h-106zM107 149h298v-42h-298v42z" /> - <glyph glyph-name="uniE166" unicode="undo" -d="M267 341q73 0 131 -43t81 -111l-50 -16q-17 52 -61.5 84.5t-100.5 32.5q-62 0 -110 -40l78 -77h-192v192l76 -77q63 55 148 55z" /> - <glyph glyph-name="uniE167" unicode="font_download" -d="M340 117h45l-109 278h-40l-109 -278h45l24 64h120zM427 469q17 0 29.5 -12.5t12.5 -29.5v-342q0 -17 -12.5 -29.5t-29.5 -12.5h-342q-17 0 -29.5 12.5t-12.5 29.5v342q0 17 12.5 29.5t29.5 12.5h342zM212 224l44 118l44 -118h-88z" /> - <glyph glyph-name="uniE168" unicode="move_to_inbox" -d="M341 299l-85 -86l-85 86h42v64h86v-64h42zM405 192v213h-299v-213h86q0 -26 19 -45t45 -19t45 19t19 45h85zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-299q-18 0 -30 12.5t-12 30.5v298q0 18 12 30.5t30 12.5h299z" /> - <glyph glyph-name="uniE169" unicode="unarchive" -d="M109 405h294l-20 22h-256zM256 309l-117 -117h74v-43h86v43h74zM438 401q10 -12 10 -28v-266q0 -17 -13 -30t-30 -13h-298q-18 0 -30.5 13t-12.5 30v266q0 16 10 28l29 35q10 12 25 12h256q15 0 25 -12z" /> - <glyph glyph-name="uniE16A" unicode="next_week" -d="M235 117l85 86l-85 85l-22 -21l64 -64l-64 -64zM213 405v-42h86v42h-86zM299 448q17 0 29.5 -12.5t12.5 -30.5v-42h86q17 0 29.5 -13t12.5 -30v-235q0 -17 -12.5 -29.5t-29.5 -12.5h-342q-17 0 -29.5 12.5t-12.5 29.5v235q0 17 12.5 30t29.5 13h86v42q0 17 12.5 30 -t29.5 13h86z" /> - <glyph glyph-name="uniE16B" unicode="weekend" -d="M384 405q17 0 30 -12.5t13 -29.5v-46q-19 -7 -31 -23t-12 -37v-44h-256v44q0 21 -12 37t-31 23v46q0 17 13 29.5t30 12.5h256zM448 299q17 0 30 -13t13 -30v-107q0 -17 -13 -29.5t-30 -12.5h-384q-17 0 -30 12.5t-13 29.5v107q0 17 13 30t30 13t30 -13t13 -30v-64h298v64 -q0 17 13 30t30 13z" /> - <glyph glyph-name="uniE16C" unicode="delete_sweep" -d="M299 405v-42h-256v42h64l21 22h85l22 -22h64zM64 128v213h213v-213q0 -17 -12.5 -30t-29.5 -13h-128q-17 0 -30 13t-13 30zM320 256h128v-43h-128v43zM320 341h149v-42h-149v42zM320 171h85v-43h-85v43z" /> - <glyph glyph-name="uniE16D" unicode="low_priority" -d="M43 267q0 57 40.5 97.5t97.5 40.5h75v-42h-75q-40 0 -68 -28t-28 -68t28 -68t68 -28h11v42l64 -64l-64 -64v43h-11q-57 0 -97.5 41t-40.5 98zM299 171h170v-43h-170v43zM299 288h170v-43h-170v43zM299 405h170v-42h-170v42z" /> - <glyph glyph-name="uniE190" unicode="access_alarm" -d="M256 85q62 0 105.5 44t43.5 106t-43.5 105.5t-105.5 43.5t-105.5 -43.5t-43.5 -105.5t43.5 -106t105.5 -44zM256 427q80 0 136 -56.5t56 -135.5t-56 -135.5t-136 -56.5t-136 56.5t-56 135.5t56 135.5t136 56.5zM267 341v-112l85 -50l-16 -26l-101 60v128h32zM168 440 -l-98 -82l-27 32l98 82zM469 390l-27 -33l-98 83l27 32z" /> - <glyph glyph-name="uniE191" unicode="access_alarms" -d="M256 85q62 0 105.5 44t43.5 106t-43.5 105.5t-105.5 43.5t-105.5 -43.5t-43.5 -105.5t43.5 -106t105.5 -44zM256 427q80 0 136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136t56 136t136 56zM267 341v-113l85 -51l-17 -26l-100 62v128h32zM169 439l-99 -81l-27 32 -l98 81zM469 390l-27 -32l-99 84l28 32z" /> - <glyph glyph-name="uniE192" unicode="access_time" -d="M267 363v-112l96 -57l-16 -27l-112 68v128h32zM256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5 -t150.5 62.5z" /> - <glyph glyph-name="uniE193" unicode="add_alarm" -d="M277 320v-64h64v-43h-64v-64h-42v64h-64v43h64v64h42zM256 85q62 0 105.5 44t43.5 106t-43.5 105.5t-105.5 43.5t-105.5 -43.5t-43.5 -105.5t43.5 -106t105.5 -44zM256 427q80 0 136 -56.5t56 -135.5t-56 -135.5t-136 -56.5t-136 56.5t-56 135.5t56 135.5t136 56.5z -M469 390l-27 -33l-98 83l27 32zM168 440l-98 -82l-27 32l98 82z" /> - <glyph glyph-name="uniE194" unicode="airplanemode_inactive" -d="M64 400l27 27l336 -336l-27 -27l-123 122v-79l43 -32v-32l-75 21l-74 -21v32l42 32v117l-170 -53v42l127 80zM277 320l171 -107v-42l-68 21l-167 167v78q0 13 9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5v-117z" /> - <glyph glyph-name="uniE195" unicode="airplanemode_active" -d="M217 320zM448 171l-171 53v-117l43 -32v-32l-75 21l-74 -21v32l42 32v117l-170 -53v42l170 107v117q0 13 9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5v-117l171 -107v-42z" /> - <glyph glyph-name="uniE19C" unicode="battery_alert" -d="M277 213v107h-42v-107h42zM277 128v43h-42v-43h42zM334 427q12 0 20.5 -8.5t8.5 -20.5v-327q0 -12 -8.5 -20t-20.5 -8h-156q-12 0 -20.5 8t-8.5 20v327q0 12 8.5 20.5t20.5 8.5h35v42h86v-42h35z" /> - <glyph glyph-name="uniE1A3" unicode="battery_charging_full" -d="M235 85l85 160h-43v118l-85 -160h43v-118zM334 427q12 0 20.5 -8.5t8.5 -20.5v-327q0 -12 -8.5 -20t-20.5 -8h-156q-12 0 -20.5 8t-8.5 20v327q0 12 8.5 20.5t20.5 8.5h35v42h86v-42h35z" /> - <glyph glyph-name="uniE1A4" unicode="battery_full" -d="M334 427q12 0 20.5 -8.5t8.5 -20.5v-327q0 -12 -8.5 -20t-20.5 -8h-156q-12 0 -20.5 8t-8.5 20v327q0 12 8.5 20.5t20.5 8.5h35v42h86v-42h35z" /> - <glyph glyph-name="uniE1A5" unicode="battery_std" -d="M334 427q12 0 20.5 -8.5t8.5 -20.5v-327q0 -12 -8.5 -20t-20.5 -8h-156q-12 0 -20.5 8t-8.5 20v327q0 12 8.5 20.5t20.5 8.5h35v42h86v-42h35z" /> - <glyph glyph-name="uniE1A6" unicode="battery_unknown" -d="M305 241q15 15 15 36q0 26 -19 45t-45 19t-45 -19t-19 -45h32q0 13 9 22.5t23 9.5t23 -9.5t9 -22.5t-9 -22l-20 -20q-20 -20 -20 -43h34q0 16 18 34zM276 129v41h-40v-41h40zM334 427q12 0 20.5 -8.5t8.5 -20.5v-327q0 -12 -8.5 -20t-20.5 -8h-156q-12 0 -20.5 8t-8.5 20 -v327q0 12 8.5 20.5t20.5 8.5h35v42h86v-42h35z" /> - <glyph glyph-name="uniE1A7" unicode="bluetooth" -d="M317 164l-40 41v-81zM277 388v-81l40 41zM378 348l-92 -92l92 -92l-122 -121h-21v162l-98 -98l-30 30l119 119l-119 119l30 30l98 -98v162h21z" /> - <glyph glyph-name="uniE1A8" unicode="bluetooth_connected" -d="M405 299l43 -43l-43 -43l-42 43zM317 164l-40 41v-81zM277 388v-81l40 41zM378 348l-92 -92l92 -92l-122 -121h-21v162l-98 -98l-30 30l119 119l-119 119l30 30l98 -98v162h21zM149 256l-42 -43l-43 43l43 43z" /> - <glyph glyph-name="uniE1A9" unicode="bluetooth_disabled" -d="M277 124l40 40l-40 41v-81zM115 427l312 -312l-30 -30l-49 49l-92 -91h-21v162l-98 -98l-30 30l119 119l-141 141zM277 388v-69l-42 43v107h21l122 -121l-65 -65l-30 30l34 35z" /> - <glyph glyph-name="uniE1AA" unicode="bluetooth_searching" -d="M275 164l-40 41v-81zM235 388v-81l40 41zM335 348l-92 -92l92 -92l-122 -121h-21v162l-98 -98l-30 30l119 119l-119 119l30 30l98 -98v162h21zM417 369q31 -50 31 -111t-33 -113l-25 25q21 42 21 86t-21 86zM304 256l49 49q10 -25 10 -49q0 -25 -10 -50z" /> - <glyph glyph-name="uniE1AB" unicode="brightness_auto" -d="M305 171h41l-69 192h-42l-69 -192h41l15 42h68zM427 327l70 -71l-70 -71v-100h-100l-71 -70l-71 70h-100v100l-70 71l70 71v100h100l71 70l71 -70h100v-100zM231 242l25 78l25 -78h-50z" /> - <glyph glyph-name="uniE1AC" unicode="brightness_high" -d="M256 341q35 0 60 -25t25 -60t-25 -60t-60 -25t-60 25t-25 60t25 60t60 25zM256 128q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5zM427 327l70 -71l-70 -71v-100h-100l-71 -70l-71 70h-100v100l-70 71l70 71v100h100 -l71 70l71 -70h100v-100z" /> - <glyph glyph-name="uniE1AD" unicode="brightness_low" -d="M256 128q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5zM427 185v-100h-100l-71 -70l-71 70h-100v100l-70 71l70 71v100h100l71 70l71 -70h100v-100l70 -71z" /> - <glyph glyph-name="uniE1AE" unicode="brightness_medium" -d="M256 128q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5v-256zM427 185v-100h-100l-71 -70l-71 70h-100v100l-70 71l70 71v100h100l71 70l71 -70h100v-100l70 -71z" /> - <glyph glyph-name="uniE1AF" unicode="data_usage" -d="M256 107q72 0 116 56l56 -33q-64 -87 -172 -87q-88 0 -150.5 62.5t-62.5 150.5q0 83 55.5 143.5t136.5 68.5v-64q-54 -8 -91 -50t-37 -98q0 -62 43.5 -105.5t105.5 -43.5zM277 468q81 -8 136.5 -68.5t55.5 -143.5q0 -48 -18 -87l-56 33q10 28 10 54q0 56 -37 98t-91 50 -v64z" /> - <glyph glyph-name="uniE1B0" unicode="developer_mode" -d="M363 107v42h42v-85q0 -17 -12.5 -30t-29.5 -13h-214q-17 0 -29.5 13t-12.5 30v85h42v-42h214zM213 188l-30 -30l-98 98l98 98l30 -30l-67 -68zM329 158l-30 30l67 68l-67 68l30 30l98 -98zM149 405v-42h-42v85q0 17 12.5 30t29.5 13l214 -1q17 0 29.5 -12.5t12.5 -29.5 -v-85h-42v42h-214z" /> - <glyph glyph-name="uniE1B1" unicode="devices" -d="M469 149v150h-85v-150h85zM491 341q9 0 15 -6t6 -15v-213q0 -9 -6 -15.5t-15 -6.5h-128q-9 0 -15.5 6.5t-6.5 15.5v213q0 9 6.5 15t15.5 6h128zM85 384v-235h214v-64h-299v64h43v235q0 17 12.5 30t29.5 13h384v-43h-384z" /> - <glyph glyph-name="uniE1B2" unicode="dvr" -d="M149 256v-43h-42v43h42zM149 341v-42h-42v42h42zM405 256v-43h-234v43h234zM405 341v-42h-234v42h234zM448 149v256h-384v-256h384zM448 448q17 0 30 -13t13 -30l-1 -256q0 -17 -12.5 -29.5t-29.5 -12.5h-107v-43h-170v43h-107q-17 0 -30 12.5t-13 29.5v256q0 17 13 30 -t30 13h384z" /> - <glyph glyph-name="uniE1B3" unicode="gps_fixed" -d="M256 107q62 0 105.5 43.5t43.5 105.5t-43.5 105.5t-105.5 43.5t-105.5 -43.5t-43.5 -105.5t43.5 -105.5t105.5 -43.5zM447 277h44v-42h-44q-7 -67 -55 -115t-115 -55v-44h-42v44q-67 7 -115 55t-55 115h-44v42h44q7 67 55 115t115 55v44h42v-44q67 -7 115 -55t55 -115z -M256 341q35 0 60 -25t25 -60t-25 -60t-60 -25t-60 25t-25 60t25 60t60 25z" /> - <glyph glyph-name="uniE1B4" unicode="gps_not_fixed" -d="M256 107q62 0 105.5 43.5t43.5 105.5t-43.5 105.5t-105.5 43.5t-105.5 -43.5t-43.5 -105.5t43.5 -105.5t105.5 -43.5zM447 277h44v-42h-44q-7 -67 -55 -115t-115 -55v-44h-42v44q-67 7 -115 55t-55 115h-44v42h44q7 67 55 115t115 55v44h42v-44q67 -7 115 -55t55 -115z -" /> - <glyph glyph-name="uniE1B5" unicode="gps_off" -d="M347 138l-209 209q-31 -41 -31 -91q0 -62 43.5 -105.5t105.5 -43.5q50 0 91 31zM64 421l27 27l357 -357l-27 -27l-44 44q-45 -37 -100 -43v-44h-42v44q-67 7 -115 55t-55 115h-44v42h44q6 55 43 100zM447 277h44v-42h-44q-5 -39 -21 -68l-32 32q11 27 11 57 -q0 62 -43.5 105.5t-105.5 43.5q-30 0 -57 -11l-32 32q31 16 68 21v44h42v-44q67 -7 115 -55t55 -115z" /> - <glyph glyph-name="uniE1B6" unicode="location_disabled" -d="M347 138l-209 209q-31 -41 -31 -91q0 -62 43.5 -105.5t105.5 -43.5q50 0 91 31zM64 421l27 27l357 -357l-27 -27l-44 44q-45 -37 -100 -43v-44h-42v44q-67 7 -115 55t-55 115h-44v42h44q6 55 43 100zM447 277h44v-42h-44q-5 -39 -21 -68l-32 32q11 27 11 57 -q0 62 -43.5 105.5t-105.5 43.5q-30 0 -57 -11l-32 32q31 16 68 21v44h42v-44q67 -7 115 -55t55 -115z" /> - <glyph glyph-name="uniE1B7" unicode="location_searching" -d="M256 107q62 0 105.5 43.5t43.5 105.5t-43.5 105.5t-105.5 43.5t-105.5 -43.5t-43.5 -105.5t43.5 -105.5t105.5 -43.5zM447 277h44v-42h-44q-7 -67 -55 -115t-115 -55v-44h-42v44q-67 7 -115 55t-55 115h-44v42h44q7 67 55 115t115 55v44h42v-44q67 -7 115 -55t55 -115z -" /> - <glyph glyph-name="uniE1B8" unicode="graphic_eq" -d="M405 299h43v-86h-43v86zM320 128v256h43v-256h-43zM64 213v86h43v-86h-43zM235 43v426h42v-426h-42zM149 128v256h43v-256h-43z" /> - <glyph glyph-name="uniE1B9" unicode="network_cell" -d="M469 43h-426l426 426v-426z" /> - <glyph glyph-name="uniE1BA" unicode="network_wifi" -d="M436 279l1 -1l-181 -224l-181 224l1 1l-68 84q121 85 248 85t248 -85z" /> - <glyph glyph-name="uniE1BB" unicode="nfc" -d="M384 384v-256h-256v256h85v-43h-42v-170h170v170h-64v-48q22 -12 22 -37q0 -17 -13 -30t-30 -13t-30 13t-13 30q0 25 22 37v48q0 17 12.5 30t29.5 13h107zM427 85v342h-342v-342h342zM427 469q17 0 29.5 -12.5t12.5 -29.5v-342q0 -17 -12.5 -29.5t-29.5 -12.5h-342 -q-17 0 -29.5 12.5t-12.5 29.5v342q0 17 12.5 29.5t29.5 12.5h342z" /> - <glyph glyph-name="uniE1BC" unicode="now_wallpaper" -d="M85 235v-150h150v-42h-150q-17 0 -29.5 12.5t-12.5 29.5v150h42zM427 85v150h42v-150q0 -17 -12.5 -29.5t-29.5 -12.5h-150v42h150zM427 469q17 0 29.5 -12.5t12.5 -29.5v-150h-42v150h-150v42h150zM363 331q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5t9.5 22.5 -t22.5 9.5t22.5 -9.5t9.5 -22.5zM213 235l64 -79l43 57l64 -85h-256zM85 427v-150h-42v150q0 17 12.5 29.5t29.5 12.5h150v-42h-150z" /> - <glyph glyph-name="uniE1BD" unicode="now_widgets" -d="M355 476l121 -121l-121 -120h93v-171h-171v171h78l-120 120v-78h-171v171h171v-93zM64 64v171h171v-171h-171z" /> - <glyph glyph-name="uniE1BE" unicode="screen_lock_landscape" -d="M230 299v-22h52v22q0 10 -7.5 17.5t-18.5 7.5t-18.5 -7.5t-7.5 -17.5zM213 171q-9 0 -15 6t-6 15v64q0 9 6 15t15 6v22q0 17 12.5 29.5t30.5 12.5t30.5 -12t12.5 -30v-22q9 0 15 -6t6 -15v-64q0 -9 -6 -15t-15 -6h-86zM405 149v214h-298v-214h298zM448 405q17 0 30 -12.5 -t13 -29.5v-214q0 -17 -13 -29.5t-30 -12.5h-384q-17 0 -30 12.5t-13 29.5v214q0 17 13 29.5t30 12.5h384z" /> - <glyph glyph-name="uniE1BF" unicode="screen_lock_portrait" -d="M363 107v298h-214v-298h214zM363 491q17 0 29.5 -13t12.5 -30v-384q0 -17 -12.5 -30t-29.5 -13h-214q-17 0 -29.5 13t-12.5 30v384q0 17 12.5 30t29.5 13h214zM230 299v-22h52v22q0 10 -7.5 17.5t-18.5 7.5t-18.5 -7.5t-7.5 -17.5zM213 171q-9 0 -15 6t-6 15v64q0 9 6 15 -t15 6v22q0 17 12.5 29.5t30.5 12.5t30.5 -12t12.5 -30v-22q9 0 15 -6t6 -15v-64q0 -9 -6 -15t-15 -6h-86z" /> - <glyph glyph-name="uniE1C0" unicode="screen_lock_rotation" -d="M358 459v-11h73v11q0 15 -10.5 25.5t-25.5 10.5t-26 -10.5t-11 -25.5zM341 320q-9 0 -15 6t-6 15v86q0 9 6 15t15 6v11q0 22 16 37.5t38 15.5t37.5 -15.5t15.5 -37.5v-11q9 0 15 -6t6 -15v-86q0 -9 -6 -15t-15 -6h-107zM181 75l28 28l81 -81l-14 -1q-100 0 -173.5 68 -t-81.5 167h32q6 -59 40.5 -107.5t87.5 -73.5zM496 240q10 -9 10 -22.5t-10 -23.5l-136 -135q-9 -10 -22 -10t-23 10l-256 256q-10 9 -10 22t10 23l135 136q9 10 22.5 10t23.5 -10l52 -52l-30 -30l-45 44l-121 -120l242 -242l120 121l-47 47l30 30z" /> - <glyph glyph-name="uniE1C1" unicode="screen_rotation" -d="M160 54l29 28l81 -81l-14 -1q-100 0 -173.5 68t-81.5 167h32q6 -60 40 -108t87 -73zM316 60l136 136l-256 256l-136 -136zM218 475l257 -257q10 -9 10 -22t-10 -23l-136 -136q-9 -10 -22 -10t-23 10l-257 257q-10 9 -10 22t10 23l136 136q9 10 22 10t23 -10zM352 458 -l-29 -28l-81 81l14 1q100 0 173.5 -68t81.5 -167h-32q-6 60 -40 108t-87 73z" /> - <glyph glyph-name="uniE1C2" unicode="sd_storage" -d="M384 341v86h-43v-86h43zM320 341v86h-43v-86h43zM256 341v86h-43v-86h43zM384 469q17 0 30 -12.5t13 -29.5v-342q0 -17 -13 -29.5t-30 -12.5h-256q-17 0 -30 12.5t-13 29.5l1 256l127 128h171z" /> - <glyph glyph-name="uniE1C3" unicode="settings_system_daydream" -d="M448 106v300h-384v-300h384zM448 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-384q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h384zM192 171q-26 0 -45 19t-19 45q0 25 16.5 43t40.5 20h4q21 43 67 43q28 0 49 -18.5t25 -45.5h1q22 0 37.5 -15.5t15.5 -37.5 -t-15.5 -37.5t-37.5 -15.5h-139z" /> - <glyph glyph-name="uniE1C8" unicode="signal_cellular_4_bar" -d="M43 43l426 426v-426h-426z" /> - <glyph glyph-name="uniE1CD" unicode="signal_cellular_connected_no_internet_4_bar" -d="M43 43l426 426v-128h-85v-298h-341zM427 43v42h42v-42h-42zM427 128v171h42v-171h-42z" /> - <glyph glyph-name="uniE1CE" unicode="signal_cellular_no_sim" -d="M78 429l373 -372l-28 -28l-40 41q-12 -6 -20 -6h-214q-17 0 -29.5 13t-12.5 30v239l-56 56zM405 405v-249l-242 242l50 50h150q17 0 29.5 -13t12.5 -30z" /> - <glyph glyph-name="uniE1CF" unicode="signal_cellular_null" -d="M469 469v-426h-426zM427 366l-281 -281h281v281z" /> - <glyph glyph-name="uniE1D0" unicode="signal_cellular_off" -d="M102 416l367 -368l-27 -27l-42 43h-379l189 189l-135 136zM448 491v-367l-183 183z" /> - <glyph glyph-name="uniE1D8" unicode="signal_wifi_4_bar" -d="M256 54l-248 309q121 85 248 85t248 -85z" /> - <glyph glyph-name="uniE1D9" unicode="signal_wifi_4_bar_lock" -d="M331 203v-56l-75 -94l-247 310l6 5q6 4 12.5 8.5t17.5 11.5t23.5 13t28.5 13.5t34 13t37.5 10.5t42 7.5t45.5 2.5t45.5 -2.5t42 -7.5t37.5 -10.5t34 -13t28.5 -13.5t23.5 -13t17.5 -11.5t12.5 -8.5l6 -5l-44 -56q-6 2 -22 2q-45 0 -75.5 -30.5t-30.5 -75.5zM469 171v32 -q0 13 -9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5v-32h64zM491 171q8 0 14.5 -7t6.5 -15v-85q0 -8 -6.5 -14.5t-14.5 -6.5h-107q-8 0 -14.5 6.5t-6.5 14.5v85q0 8 6.5 15t14.5 7v32q0 23 15 38t38 15t38.5 -15.5t15.5 -37.5v-32z" /> - <glyph glyph-name="uniE1DA" unicode="signal_wifi_off" -d="M70 481q12 -12 153.5 -153t213.5 -215l-27 -27l-71 71l-83 -103l-248 309q33 27 78 47l-43 44zM504 363l-116 -145l-221 220q45 10 89 10q127 0 248 -85z" /> - <glyph glyph-name="uniE1DB" unicode="storage" -d="M85 277v-42h43v42h-43zM43 213v86h426v-86h-426zM128 363v42h-43v-42h43zM43 427h426v-86h-426v86zM85 149v-42h43v42h-43zM43 85v86h426v-86h-426z" /> - <glyph glyph-name="uniE1E0" unicode="usb" -d="M320 363h85v-86h-21v-42q0 -18 -12.5 -30.5t-30.5 -12.5h-64v-65q26 -14 26 -42q0 -19 -13.5 -33t-33.5 -14t-33.5 14t-13.5 33q0 28 26 42v65h-64q-18 0 -30.5 12.5t-12.5 30.5v44q-26 14 -26 41q0 20 14 33.5t33 13.5t33 -13.5t14 -33.5q0 -28 -25 -41v-44h64v170h-43 -l64 86l64 -86h-43v-170h64v42h-21v86z" /> - <glyph glyph-name="uniE1E1" unicode="wifi_lock" -d="M469 171v32q0 13 -9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5v-32h64zM491 171q9 0 15 -6.5t6 -15.5v-85q0 -9 -6 -15t-15 -6h-107q-9 0 -15 6t-6 15v85q0 9 6 15.5t15 6.5v32q0 22 15.5 37.5t37.5 15.5t38 -15.5t16 -37.5v-32zM437 309q-44 0 -75 -31t-31 -75v-61 -l-75 -99l-256 341q112 85 256 85t256 -85l-57 -76q-6 1 -18 1z" /> - <glyph glyph-name="uniE1E2" unicode="wifi_tethering" -d="M256 448q88 0 150.5 -62t62.5 -151q0 -58 -28.5 -107.5t-77.5 -77.5l-22 37q39 23 62.5 62.5t23.5 85.5q0 70 -50 120t-121 50t-121 -50t-50 -120q0 -47 23 -86t62 -62l-21 -37q-49 28 -77.5 77.5t-28.5 107.5q0 89 62.5 151t150.5 62zM384 235q0 -35 -17.5 -64.5 -t-46.5 -46.5l-21 37q42 25 42 74q0 35 -25 60t-60 25t-60 -25t-25 -60q0 -49 42 -74l-21 -37q-29 17 -46.5 46.5t-17.5 64.5q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM256 277q17 0 30 -12.5t13 -29.5t-13 -30t-30 -13t-30 13t-13 30t13 29.5t30 12.5z" /> - <glyph glyph-name="uniE226" unicode="attach_file" -d="M352 384h32v-245q0 -49 -34 -83.5t-83 -34.5t-83.5 34.5t-34.5 83.5v266q0 35 25.5 60.5t60.5 25.5t60 -25.5t25 -60.5v-224q0 -22 -15.5 -37.5t-37.5 -15.5t-38 15.5t-16 37.5v203h32v-203q0 -9 6.5 -15t15.5 -6t15 6t6 15v224q0 22 -15.5 38t-37.5 16t-38 -16t-16 -38 -v-266q0 -35 25.5 -60.5t60.5 -25.5t60 25.5t25 60.5v245z" /> - <glyph glyph-name="uniE227" unicode="attach_money" -d="M252 279q22 -6 36.5 -12t30.5 -16.5t24.5 -26.5t8.5 -38q0 -31 -20.5 -50.5t-54.5 -25.5v-46h-64v46q-33 7 -54.5 28t-23.5 54h47q4 -45 63 -45q31 0 44.5 11.5t13.5 26.5q0 36 -64 52q-100 23 -100 88q0 29 21 49.5t53 27.5v46h64v-47q33 -8 50.5 -30t18.5 -51h-47 -q-2 45 -54 45q-26 0 -41.5 -11t-15.5 -29q0 -29 64 -46z" /> - <glyph glyph-name="uniE228" unicode="border_all" -d="M405 277v128h-128v-128h128zM405 107v128h-128v-128h128zM235 277v128h-128v-128h128zM235 107v128h-128v-128h128zM64 448h384v-384h-384v384z" /> - <glyph glyph-name="uniE229" unicode="border_bottom" -d="M107 192v-43h-43v43h43zM64 64v43h384v-43h-384zM107 277v-42h-43v42h43zM405 320v43h43v-43h-43zM405 448h43v-43h-43v43zM107 363v-43h-43v43h43zM405 149v43h43v-43h-43zM405 235v42h43v-42h-43zM363 448v-43h-43v43h43zM277 448v-43h-42v43h42zM363 277v-42h-43v42 -h43zM277 363v-43h-42v43h42zM107 448v-43h-43v43h43zM277 277v-42h-42v42h42zM192 448v-43h-43v43h43zM277 192v-43h-42v43h42zM192 277v-42h-43v42h43z" /> - <glyph glyph-name="uniE22A" unicode="border_clear" -d="M320 405v43h43v-43h-43zM320 235v42h43v-42h-43zM320 64v43h43v-43h-43zM235 405v43h42v-43h-42zM405 448h43v-43h-43v43zM235 320v43h42v-43h-42zM405 320v43h43v-43h-43zM405 64v43h43v-43h-43zM405 235v42h43v-42h-43zM405 149v43h43v-43h-43zM235 235v42h42v-42h-42z -M64 405v43h43v-43h-43zM64 320v43h43v-43h-43zM64 235v42h43v-42h-43zM64 149v43h43v-43h-43zM64 64v43h43v-43h-43zM235 64v43h42v-43h-42zM235 149v43h42v-43h-42zM149 64v43h43v-43h-43zM149 235v42h43v-42h-43zM149 405v43h43v-43h-43z" /> - <glyph glyph-name="uniE22B" unicode="border_color" -d="M0 85h512v-85h-512v85zM442 426l-42 -42l-80 80l42 42q6 6 15 6t15 -6l50 -50q6 -6 6 -15t-6 -15zM379 363l-214 -214h-80v80l214 214z" /> - <glyph glyph-name="uniE22C" unicode="border_horizontal" -d="M405 64v43h43v-43h-43zM320 64v43h43v-43h-43zM235 149v43h42v-43h-42zM405 320v43h43v-43h-43zM405 448h43v-43h-43v43zM64 235v42h384v-42h-384zM235 64v43h42v-43h-42zM405 149v43h43v-43h-43zM277 448v-43h-42v43h42zM277 363v-43h-42v43h42zM363 448v-43h-43v43h43z -M192 448v-43h-43v43h43zM107 448v-43h-43v43h43zM149 64v43h43v-43h-43zM64 149v43h43v-43h-43zM107 363v-43h-43v43h43zM64 64v43h43v-43h-43z" /> - <glyph glyph-name="uniE22D" unicode="border_inner" -d="M405 149v43h43v-43h-43zM405 64v43h43v-43h-43zM277 448v-171h171v-42h-171v-171h-42v171h-171v42h171v171h42zM320 64v43h43v-43h-43zM405 448h43v-43h-43v43zM405 320v43h43v-43h-43zM363 448v-43h-43v43h43zM107 448v-43h-43v43h43zM192 448v-43h-43v43h43zM64 149v43 -h43v-43h-43zM107 363v-43h-43v43h43zM149 64v43h43v-43h-43zM64 64v43h43v-43h-43z" /> - <glyph glyph-name="uniE22E" unicode="border_left" -d="M320 405v43h43v-43h-43zM320 235v42h43v-42h-43zM405 64v43h43v-43h-43zM405 235v42h43v-42h-43zM405 448h43v-43h-43v43zM405 149v43h43v-43h-43zM320 64v43h43v-43h-43zM405 320v43h43v-43h-43zM64 64v384h43v-384h-43zM149 235v42h43v-42h-43zM149 405v43h43v-43h-43z -M149 64v43h43v-43h-43zM235 235v42h42v-42h-42zM235 320v43h42v-43h-42zM235 405v43h42v-43h-42zM235 149v43h42v-43h-42zM235 64v43h42v-43h-42z" /> - <glyph glyph-name="uniE22F" unicode="border_outer" -d="M192 277v-42h-43v42h43zM277 192v-43h-42v43h42zM405 107v298h-298v-298h298zM64 448h384v-384h-384v384zM363 277v-42h-43v42h43zM277 277v-42h-42v42h42zM277 363v-43h-42v43h42z" /> - <glyph glyph-name="uniE230" unicode="border_right" -d="M235 320v43h42v-43h-42zM235 405v43h42v-43h-42zM235 235v42h42v-42h-42zM320 405v43h43v-43h-43zM320 64v43h43v-43h-43zM405 448h43v-384h-43v384zM320 235v42h43v-42h-43zM235 149v43h42v-43h-42zM64 320v43h43v-43h-43zM64 149v43h43v-43h-43zM64 235v42h43v-42h-43z -M235 64v43h42v-43h-42zM64 64v43h43v-43h-43zM149 235v42h43v-42h-43zM149 405v43h43v-43h-43zM64 405v43h43v-43h-43zM149 64v43h43v-43h-43z" /> - <glyph glyph-name="uniE231" unicode="border_style" -d="M405 320v43h43v-43h-43zM64 448h384v-43h-341v-341h-43v384zM405 235v42h43v-42h-43zM405 149v43h43v-43h-43zM235 64v43h42v-43h-42zM149 64v43h43v-43h-43zM405 64v43h43v-43h-43zM320 64v43h43v-43h-43z" /> - <glyph glyph-name="uniE232" unicode="border_top" -d="M320 235v42h43v-42h-43zM405 64v43h43v-43h-43zM235 320v43h42v-43h-42zM320 64v43h43v-43h-43zM405 149v43h43v-43h-43zM64 448h384v-43h-384v43zM405 235v42h43v-42h-43zM405 320v43h43v-43h-43zM235 149v43h42v-43h-42zM64 320v43h43v-43h-43zM64 235v42h43v-42h-43z -M64 64v43h43v-43h-43zM64 149v43h43v-43h-43zM235 64v43h42v-43h-42zM235 235v42h42v-42h-42zM149 235v42h43v-42h-43zM149 64v43h43v-43h-43z" /> - <glyph glyph-name="uniE233" unicode="border_vertical" -d="M320 235v42h43v-42h-43zM320 64v43h43v-43h-43zM320 405v43h43v-43h-43zM405 320v43h43v-43h-43zM405 448h43v-43h-43v43zM405 235v42h43v-42h-43zM405 64v43h43v-43h-43zM235 64v384h42v-384h-42zM405 149v43h43v-43h-43zM149 405v43h43v-43h-43zM64 149v43h43v-43h-43z -M64 64v43h43v-43h-43zM64 235v42h43v-42h-43zM149 235v42h43v-42h-43zM149 64v43h43v-43h-43zM64 405v43h43v-43h-43zM64 320v43h43v-43h-43z" /> - <glyph glyph-name="uniE234" unicode="format_align_center" -d="M64 448h384v-43h-384v43zM149 363h214v-43h-214v43zM64 235v42h384v-42h-384zM64 64v43h384v-43h-384zM149 192h214v-43h-214v43z" /> - <glyph glyph-name="uniE235" unicode="format_align_justify" -d="M64 448h384v-43h-384v43zM64 320v43h384v-43h-384zM64 235v42h384v-42h-384zM64 149v43h384v-43h-384zM64 64v43h384v-43h-384z" /> - <glyph glyph-name="uniE236" unicode="format_align_left" -d="M64 448h384v-43h-384v43zM64 64v43h384v-43h-384zM64 235v42h384v-42h-384zM320 363v-43h-256v43h256zM320 192v-43h-256v43h256z" /> - <glyph glyph-name="uniE237" unicode="format_align_right" -d="M64 448h384v-43h-384v43zM192 320v43h256v-43h-256zM64 235v42h384v-42h-384zM192 149v43h256v-43h-256zM64 64v43h384v-43h-384z" /> - <glyph glyph-name="uniE238" unicode="format_bold" -d="M288 181q14 0 23 9.5t9 22.5t-9 22.5t-23 9.5h-75v-64h75zM213 373v-64h64q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5h-64zM333 282q46 -21 46 -73q0 -34 -22.5 -57.5t-56.5 -23.5h-151v299h134q36 0 60.5 -25t24.5 -61t-35 -59z" /> - <glyph glyph-name="uniE239" unicode="format_clear" -d="M128 405h299v-64h-124l-34 -80l-45 44l15 36h-51l-60 60v4zM70 405l6 -5l308 -309l-27 -27l-121 121l-33 -78h-64l52 123l-148 148z" /> - <glyph glyph-name="uniE23A" unicode="format_color_fill" -d="M0 85h512v-85h-512v85zM405 267q43 -47 43 -75q0 -17 -13 -30t-30 -13t-29.5 13t-12.5 30q0 12 10.5 31t20.5 31zM111 299h205l-103 102zM353 321q10 -10 10 -23t-10 -22l-117 -117q-10 -10 -23 -10q-12 0 -22 10l-118 117q-10 9 -10 22t10 23l110 110l-51 51l31 30z" /> - <glyph glyph-name="uniE23B" unicode="format_color_reset" -d="M112 400l312 -312l-27 -27l-57 56q-37 -32 -84 -32q-53 0 -90.5 37.5t-37.5 90.5q0 34 28 88l-71 71zM384 213q0 -15 -3 -28l-183 184l58 75q14 -16 35.5 -43t57 -88.5t35.5 -99.5z" /> - <glyph glyph-name="uniE23C" unicode="format_color_text" -d="M205 256h102l-51 135zM235 448h42l117 -299h-48l-23 64h-134l-24 -64h-48zM0 85h512v-85h-512v85z" /> - <glyph glyph-name="uniE23D" unicode="format_indent_decrease" -d="M235 235v42h213v-42h-213zM235 320v43h213v-43h-213zM64 448h384v-43h-384v43zM64 64v43h384v-43h-384zM64 256l85 85v-170zM235 149v43h213v-43h-213z" /> - <glyph glyph-name="uniE23E" unicode="format_indent_increase" -d="M235 235v42h213v-42h-213zM235 320v43h213v-43h-213zM64 448h384v-43h-384v43zM235 149v43h213v-43h-213zM64 341l85 -85l-85 -85v170zM64 64v43h384v-43h-384z" /> - <glyph glyph-name="uniE23F" unicode="format_italic" -d="M213 427h171v-64h-60l-72 -171h47v-64h-171v64h60l72 171h-47v64z" /> - <glyph glyph-name="uniE240" unicode="format_line_spacing" -d="M213 235v42h256v-42h-256zM213 107v42h256v-42h-256zM213 405h256v-42h-256v42zM128 363v-214h53l-74 -74l-75 74h53v214h-53l75 74l74 -74h-53z" /> - <glyph glyph-name="uniE241" unicode="format_list_bulleted" -d="M149 405h299v-42h-299v42zM149 235v42h299v-42h-299zM149 107v42h299v-42h-299zM85 160q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM85 416q13 0 22.5 -9t9.5 -23t-9.5 -23t-22.5 -9t-22.5 9t-9.5 23t9.5 23t22.5 9z -M85 288q13 0 22.5 -9t9.5 -23t-9.5 -23t-22.5 -9t-22.5 9t-9.5 23t9.5 23t22.5 9z" /> - <glyph glyph-name="uniE242" unicode="format_list_numbered" -d="M149 235v42h299v-42h-299zM149 107v42h299v-42h-299zM149 405h299v-42h-299v42zM43 277v22h64v-20l-39 -44h39v-22h-64v20l38 44h-38zM64 341v64h-21v22h42v-86h-21zM43 149v22h64v-86h-64v22h42v10h-21v22h21v10h-42z" /> - <glyph glyph-name="uniE243" unicode="format_paint" -d="M384 427h64v-171h-171v-192q0 -9 -6 -15t-15 -6h-43q-9 0 -15 6t-6 15v235h213v85h-21v-21q0 -9 -6 -15.5t-15 -6.5h-256q-9 0 -15.5 6.5t-6.5 15.5v85q0 9 6.5 15t15.5 6h256q9 0 15 -6t6 -15v-21z" /> - <glyph glyph-name="uniE244" unicode="format_quote" -d="M299 149l42 86h-64v128h128v-128l-42 -86h-64zM128 149l43 86h-64v128h128v-128l-43 -86h-64z" /> - <glyph glyph-name="uniE245" unicode="format_size" -d="M64 256v64h192v-64h-64v-149h-64v149h-64zM192 427h277v-64h-106v-256h-64v256h-107v64z" /> - <glyph glyph-name="uniE246" unicode="format_strikethrough" -d="M64 213v43h384v-43h-384zM107 427h298v-64h-106v-64h-86v64h-106v64zM213 107v64h86v-64h-86z" /> - <glyph glyph-name="uniE247" unicode="format_textdirection_l_to_r" -d="M448 128l-85 -85v64h-256v42h256v64zM192 299q-35 0 -60 25t-25 60t25 60t60 25h171v-42h-43v-235h-43v235h-42v-235h-43v107z" /> - <glyph glyph-name="uniE248" unicode="format_textdirection_r_to_l" -d="M171 149h256v-42h-256v-64l-86 85l86 85v-64zM213 299q-35 0 -60 25t-25 60t25 60t60 25h171v-42h-43v-235h-42v235h-43v-235h-43v107z" /> - <glyph glyph-name="uniE249" unicode="format_underlined" -d="M107 107h298v-43h-298v43zM256 149q-53 0 -90.5 37.5t-37.5 90.5v171h53v-171q0 -31 22 -52.5t53 -21.5t53 21.5t22 52.5v171h53v-171q0 -53 -37.5 -90.5t-90.5 -37.5z" /> - <glyph glyph-name="uniE24A" unicode="functions" -d="M384 427v-64h-149l106 -107l-106 -107h149v-64h-256v43l139 128l-139 128v43h256z" /> - <glyph glyph-name="uniE24B" unicode="insert_chart" -d="M363 149v86h-43v-86h43zM277 149v214h-42v-214h42zM192 149v150h-43v-150h43zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniE24C" unicode="insert_comment" -d="M384 341v43h-256v-43h256zM384 277v43h-256v-43h256zM384 213v43h-256v-43h256zM427 469q17 0 29.5 -12.5t12.5 -29.5v-384l-85 85h-299q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 29.5t29.5 12.5h342z" /> - <glyph glyph-name="uniE24D" unicode="insert_drive_file" -d="M277 320h118l-118 117v-117zM128 469h171l128 -128v-256q0 -17 -13 -29.5t-30 -12.5h-256q-17 0 -30 12.5t-13 29.5l1 342q0 17 12.5 29.5t29.5 12.5z" /> - <glyph glyph-name="uniE24E" unicode="insert_emoticon" -d="M256 139q-37 0 -66.5 20.5t-42.5 53.5h218q-13 -33 -42.5 -53.5t-66.5 -20.5zM181 277q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5zM331 277q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5t-9.5 -22.5 -t-22.5 -9.5zM256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE24F" unicode="insert_invitation" -d="M405 107v234h-298v-234h298zM341 491h43v-43h21q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-18 0 -30.5 13t-12.5 30v298q0 17 12.5 30t30.5 13h21v43h43v-43h170v43zM363 256v-107h-107v107h107z" /> - <glyph glyph-name="uniE250" unicode="insert_link" -d="M363 363q44 0 75 -31.5t31 -75.5t-31 -75.5t-75 -31.5h-86v41h86q27 0 46.5 19.5t19.5 46.5t-19.5 46.5t-46.5 19.5h-86v41h86zM171 235v42h170v-42h-170zM83 256q0 -27 19.5 -46.5t46.5 -19.5h86v-41h-86q-44 0 -75 31.5t-31 75.5t31 75.5t75 31.5h86v-41h-86 -q-27 0 -46.5 -19.5t-19.5 -46.5z" /> - <glyph glyph-name="uniE251" unicode="insert_photo" -d="M181 224l-74 -96h298l-96 128l-74 -96zM448 107q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298q17 0 30 -13t13 -30v-298z" /> - <glyph glyph-name="uniE252" unicode="merge_type" -d="M160 341l96 96l96 -96h-75v-136l-128 -128l-30 30l116 115v119h-75zM363 77l-73 72l30 30l73 -72z" /> - <glyph glyph-name="uniE253" unicode="mode_comment" -d="M469 427v-384l-85 85h-299q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 29.5t29.5 12.5h342q17 0 29.5 -12.5t12.5 -29.5z" /> - <glyph glyph-name="uniE254" unicode="mode_edit" -d="M442 362l-39 -39l-80 80l39 39q6 6 15 6t15 -6l50 -50q6 -6 6 -15t-6 -15zM64 144l236 236l80 -80l-236 -236h-80v80z" /> - <glyph glyph-name="uniE255" unicode="publish" -d="M107 213l149 150l149 -150h-85v-128h-128v128h-85zM107 427h298v-43h-298v43z" /> - <glyph glyph-name="uniE256" unicode="space_bar" -d="M384 320h43v-128h-342v128h43v-85h256v85z" /> - <glyph glyph-name="uniE257" unicode="strikethrough_s" -d="M200 232q0 -54 62 -54q49 0 49 36q0 16 -6.5 23t-23.5 15q-1 0 -3.5 1t-4.5 2t-4 1h-205v43h384v-43h-83q0 -1 1.5 -3.5t2.5 -3.5q7 -17 7 -35q0 -61 -67 -80q-21 -6 -46 -6q-16 0 -31 3q-36 7 -56 22q-39 29 -39 79h63zM311 352q0 45 -51 45q-36 0 -47 -22q-3 -6 -3 -14 -q0 -15 16 -26q16 -10 30 -15h-98q0 1 -2 2.5t-2 2.5q-8 13 -8 36q0 37 32 63q34 24 83 24q53 0 83 -27q31 -28 31 -69h-64z" /> - <glyph glyph-name="uniE258" unicode="vertical_align_bottom" -d="M85 107h342v-43h-342v43zM341 235l-85 -86l-85 86h64v213h42v-213h64z" /> - <glyph glyph-name="uniE259" unicode="vertical_align_center" -d="M85 277h342v-42h-342v42zM341 405l-85 -85l-85 85h64v86h42v-86h64zM171 107l85 85l85 -85h-64v-86h-42v86h-64z" /> - <glyph glyph-name="uniE25A" unicode="vertical_align_top" -d="M85 448h342v-43h-342v43zM171 277l85 86l85 -86h-64v-213h-42v213h-64z" /> - <glyph glyph-name="uniE25B" unicode="wrap_text" -d="M363 277q35 0 60 -25t25 -60t-25 -60t-60 -25h-43v-43l-64 64l64 64v-43h48q17 0 30 13t13 30t-13 30t-30 13h-283v42h278zM427 405v-42h-342v42h342zM85 107v42h128v-42h-128z" /> - <glyph glyph-name="uniE25C" unicode="money_off" -d="M114 425l311 -312l-27 -27l-47 48q-19 -17 -52 -24v-46h-64v46q-33 7 -55 28t-24 54h47q4 -45 64 -45q37 0 51 20l-75 74q-83 25 -83 84l-73 73zM267 365q-19 0 -33 -6l-31 31q14 7 32 12v46h64v-47q32 -8 49.5 -30t18.5 -51h-47q-2 45 -53 45z" /> - <glyph glyph-name="uniE25D" unicode="drag_handle" -d="M85 192v43h342v-43h-342zM427 320v-43h-342v43h342z" /> - <glyph glyph-name="uniE25E" unicode="format_shapes" -d="M228 240h56l-28 82zM293 213h-75l-15 -42h-35l73 192h30l72 -192h-34zM405 405h43v43h-43v-43zM448 64v43h-43v-43h43zM363 107v42h42v214h-42v42h-214v-42h-42v-214h42v-42h214zM107 64v43h-43v-43h43zM64 448v-43h43v43h-43zM491 363h-43v-214h43v-128h-128v43h-214 -v-43h-128v128h43v214h-43v128h128v-43h214v43h128v-128z" /> - <glyph glyph-name="uniE25F" unicode="highlight" -d="M362 372l45 45l30 -30l-45 -46zM75 387l30 30l45 -45l-30 -31zM235 469h42v-64h-42v64zM128 213v107h256v-107l-64 -64v-106h-128v106z" /> - <glyph glyph-name="uniE260" unicode="linear_scale" -d="M416 309q22 0 37.5 -15.5t15.5 -37.5t-15.5 -37.5t-37.5 -15.5q-36 0 -49 32h-62q-13 -32 -49 -32t-49 32h-62q-13 -32 -49 -32q-22 0 -37.5 15.5t-15.5 37.5t15.5 37.5t37.5 15.5q36 0 49 -32h62q13 32 49 32t49 -32h62q13 32 49 32z" /> - <glyph glyph-name="uniE261" unicode="short_text" -d="M85 235h214v-43h-214v43zM85 320h342v-43h-342v43z" /> - <glyph glyph-name="uniE262" unicode="text_fields" -d="M459 320v-64h-64v-149h-64v149h-64v64h192zM53 427h278v-64h-107v-256h-64v256h-107v64z" /> - <glyph glyph-name="uniE263" unicode="monetization_on" -d="M286 126q67 13 67 67q0 61 -90 84q-56 14 -56 41q0 15 13.5 25t37.5 10q45 0 47 -40h42q-2 57 -61 72v42h-57v-42q-29 -6 -47.5 -23.5t-18.5 -44.5q0 -56 89 -78q57 -13 57 -46q0 -13 -11.5 -23.5t-39.5 -10.5q-53 0 -57 40h-42q3 -57 70 -72v-42h57v41zM256 469 -q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE264" unicode="title" -d="M107 427h298v-64h-117v-256h-64v256h-117v64z" /> - <glyph glyph-name="uniE2BC" unicode="attachment" -d="M43 245q0 49 34 83.5t83 34.5h224q35 0 60 -25.5t25 -60.5t-25 -60t-60 -25h-181q-22 0 -38 15.5t-16 37.5t16 38t38 16h160v-43h-162q-9 0 -9 -10.5t9 -10.5h183q17 0 30 12.5t13 29.5t-13 30t-30 13h-224q-31 0 -53 -22t-22 -53t22 -52.5t53 -21.5h203v-43h-203 -q-49 0 -83 34t-34 83z" /> - <glyph glyph-name="uniE2BD" unicode="cloud" -d="M413 298q41 -3 70 -33.5t29 -72.5q0 -44 -31.5 -75.5t-75.5 -31.5h-277q-53 0 -90.5 37.5t-37.5 90.5q0 49 33 85.5t81 41.5q21 39 59 63t83 24q58 0 102 -36.5t55 -92.5z" /> - <glyph glyph-name="uniE2BE" unicode="cloud_circle" -d="M352 171q22 0 37.5 15.5t15.5 37.5t-15.5 37.5t-37.5 15.5h-11q0 35 -25 60.5t-60 25.5q-30 0 -52.5 -18.5t-29.5 -46.5l-3 1q-26 0 -45 -19t-19 -45t19 -45t45 -19h181zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5 -t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE2BF" unicode="cloud_done" -d="M213 149l141 141l-30 30l-111 -110l-44 44l-30 -30zM413 298q41 -3 70 -33.5t29 -72.5q0 -44 -31.5 -75.5t-75.5 -31.5h-277q-53 0 -90.5 37.5t-37.5 90.5q0 49 33 85.5t81 41.5q21 39 59 63t83 24q58 0 102 -36.5t55 -92.5z" /> - <glyph glyph-name="uniE2C0" unicode="cloud_download" -d="M363 235h-64v85h-86v-85h-64l107 -107zM413 298q41 -3 70 -33.5t29 -72.5q0 -44 -31.5 -75.5t-75.5 -31.5h-277q-53 0 -90.5 37.5t-37.5 90.5q0 49 33 85.5t81 41.5q21 39 59 63t83 24q58 0 102 -36.5t55 -92.5z" /> - <glyph glyph-name="uniE2C1" unicode="cloud_off" -d="M165 299h-37q-35 0 -60 -25.5t-25 -60.5t25 -60t60 -25h208zM64 400l27 27l357 -357l-27 -27l-43 42h-250q-53 0 -90.5 37.5t-37.5 90.5q0 52 36 89t87 39zM413 298q41 -3 70 -33.5t29 -72.5q0 -55 -45 -87l-31 31q33 18 33 56q0 26 -19 45t-45 19h-32v11q0 49 -34 83 -t-83 34q-31 0 -54 -13l-32 31q39 25 86 25q58 0 102 -36.5t55 -92.5z" /> - <glyph glyph-name="uniE2C2" unicode="cloud_queue" -d="M405 128q26 0 45 19t19 45t-19 45t-45 19h-32v11q0 49 -34 83t-83 34q-40 0 -71 -24t-42 -61h-15q-35 0 -60 -25.5t-25 -60.5t25 -60t60 -25h277zM413 298q41 -3 70 -33.5t29 -72.5q0 -44 -31.5 -75.5t-75.5 -31.5h-277q-53 0 -90.5 37.5t-37.5 90.5q0 49 33 85.5 -t81 41.5q21 39 59 63t83 24q58 0 102 -36.5t55 -92.5z" /> - <glyph glyph-name="uniE2C3" unicode="cloud_upload" -d="M299 235h64l-107 106l-107 -106h64v-86h86v86zM413 298q41 -3 70 -33.5t29 -72.5q0 -44 -31.5 -75.5t-75.5 -31.5h-277q-53 0 -90.5 37.5t-37.5 90.5q0 49 33 85.5t81 41.5q21 39 59 63t83 24q58 0 102 -36.5t55 -92.5z" /> - <glyph glyph-name="uniE2C4" unicode="file_download" -d="M107 128h298v-43h-298v43zM405 320l-149 -149l-149 149h85v128h128v-128h85z" /> - <glyph glyph-name="uniE2C6" unicode="file_upload" -d="M107 128h298v-43h-298v43zM192 171v128h-85l149 149l149 -149h-85v-128h-128z" /> - <glyph glyph-name="uniE2C7" unicode="folder" -d="M213 427l43 -43h171q17 0 29.5 -13t12.5 -30v-213q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h128z" /> - <glyph glyph-name="uniE2C8" unicode="folder_open" -d="M427 128v213h-342v-213h342zM427 384q17 0 29.5 -13t12.5 -30v-213q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h128l43 -43h171z" /> - <glyph glyph-name="uniE2C9" unicode="folder_shared" -d="M405 149v22q0 19 -29.5 30.5t-55.5 11.5t-55.5 -11.5t-29.5 -30.5v-22h170zM320 320q-17 0 -30 -13t-13 -30t13 -29.5t30 -12.5t30 12.5t13 29.5t-13 30t-30 13zM427 384q17 0 29.5 -13t12.5 -30v-213q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256 -q0 17 12.5 30t29.5 13h128l43 -43h171z" /> - <glyph glyph-name="uniE2CC" unicode="create_new_folder" -d="M405 213v43h-64v64h-42v-64h-64v-43h64v-64h42v64h64zM427 384q18 0 30 -12.5t12 -30.5v-213q0 -18 -12 -30.5t-30 -12.5h-342q-18 0 -30 12.5t-12 30.5v256q0 18 12 30.5t30 12.5h128l43 -43h171z" /> - <glyph glyph-name="uniE307" unicode="cast" -d="M21 299q97 0 166 -69t69 -166h-43q0 80 -56.5 136t-135.5 56v43zM21 213q62 0 106 -43.5t44 -105.5h-43q0 44 -31.5 75.5t-75.5 31.5v42zM21 128q26 0 45 -19t19 -45h-64v64zM448 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-149v43h149v298h-384v-64h-43v64 -q0 17 13 30t30 13h384z" /> - <glyph glyph-name="uniE308" unicode="cast_connected" -d="M448 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-149v43h149v298h-384v-64h-43v64q0 17 13 30t30 13h384zM21 299q97 0 166 -69t69 -166h-43q0 80 -56.5 136t-135.5 56v43zM405 363v-214h-120q-20 63 -67.5 111t-110.5 68v35h298zM21 213q62 0 106 -43.5 -t44 -105.5h-43q0 44 -31.5 75.5t-75.5 31.5v42zM21 128q26 0 45 -19t19 -45h-64v64z" /> - <glyph glyph-name="uniE30A" unicode="computer" -d="M85 384v-213h342v213h-342zM427 128h85v-43h-512v43h85q-17 0 -29.5 13t-12.5 30v213q0 17 12.5 30t29.5 13h342q17 0 29.5 -13t12.5 -30v-213q0 -17 -12.5 -30t-29.5 -13z" /> - <glyph glyph-name="uniE30B" unicode="desktop_mac" -d="M448 213v214h-384v-214h384zM448 469q17 0 30 -12.5t13 -29.5v-256q0 -17 -13 -30t-30 -13h-149l42 -64v-21h-170v21l42 64h-149q-17 0 -30 13t-13 30v256q0 17 13 29.5t30 12.5h384z" /> - <glyph glyph-name="uniE30C" unicode="desktop_windows" -d="M448 171v256h-384v-256h384zM448 469q17 0 30 -12.5t13 -29.5v-256q0 -17 -13 -30t-30 -13h-149v-43h42v-42h-170v42h42v43h-149q-17 0 -30 13t-13 30v256q0 17 13 29.5t30 12.5h384z" /> - <glyph glyph-name="uniE30D" unicode="developer_board" -d="M256 277h85v-128h-85v128zM128 363h107v-107h-107v107zM256 363h85v-64h-85v64zM128 235h107v-86h-107v86zM384 107v298h-299v-298h299zM469 320h-42v-43h42v-42h-42v-43h42v-43h-42v-42q0 -17 -13 -30t-30 -13h-299q-17 0 -29.5 13t-12.5 30v298q0 17 12.5 30t29.5 13 -h299q17 0 30 -13t13 -30v-42h42v-43z" /> - <glyph glyph-name="uniE30E" unicode="dock" -d="M341 192v213h-170v-213h170zM341 490q17 0 30 -12.5t13 -29.5v-299q0 -17 -13 -29.5t-30 -12.5h-170q-17 0 -30 12.5t-13 29.5v299q0 17 13 30t30 13zM171 21v43h170v-43h-170z" /> - <glyph glyph-name="uniE30F" unicode="gamepad" -d="M352 320h117v-128h-117l-64 64zM192 160l64 64l64 -64v-117h-128v117zM160 320l64 -64l-64 -64h-117v128h117zM320 352l-64 -64l-64 64v117h128v-117z" /> - <glyph glyph-name="uniE310" unicode="headset" -d="M256 491q80 0 136 -56.5t56 -135.5v-150q0 -26 -19 -45t-45 -19h-64v171h85v43q0 62 -43.5 105.5t-105.5 43.5t-105.5 -43.5t-43.5 -105.5v-43h85v-171h-64q-26 0 -45 19t-19 45v150q0 79 56 135.5t136 56.5z" /> - <glyph glyph-name="uniE311" unicode="headset_mic" -d="M256 491q80 0 136 -56.5t56 -135.5v-214q0 -26 -19 -45t-45 -19h-128v43h149v21h-85v171h85v43q0 62 -43.5 105.5t-105.5 43.5t-105.5 -43.5t-43.5 -105.5v-43h85v-171h-64q-26 0 -45 19t-19 45v150q0 79 56 135.5t136 56.5z" /> - <glyph glyph-name="uniE312" unicode="keyboard" -d="M405 299v42h-42v-42h42zM405 235v42h-42v-42h42zM341 299v42h-42v-42h42zM341 235v42h-42v-42h42zM341 149v43h-170v-43h170zM149 299v42h-42v-42h42zM149 235v42h-42v-42h42zM171 277v-42h42v42h-42zM171 341v-42h42v42h-42zM235 277v-42h42v42h-42zM235 341v-42h42v42 -h-42zM427 405q17 0 29.5 -12.5t12.5 -29.5v-214q0 -17 -12.5 -29.5t-29.5 -12.5h-342q-17 0 -29.5 12.5t-12.5 29.5v214q0 17 12.5 29.5t29.5 12.5h342z" /> - <glyph glyph-name="uniE313" unicode="keyboard_arrow_down" -d="M158 345l98 -98l98 98l30 -30l-128 -128l-128 128z" /> - <glyph glyph-name="uniE314" unicode="keyboard_arrow_left" -d="M329 169l-30 -30l-128 128l128 128l30 -30l-98 -98z" /> - <glyph glyph-name="uniE315" unicode="keyboard_arrow_right" -d="M183 163l98 98l-98 98l30 30l128 -128l-128 -128z" /> - <glyph glyph-name="uniE316" unicode="keyboard_arrow_up" -d="M158 183l-30 30l128 128l128 -128l-30 -30l-98 98z" /> - <glyph glyph-name="uniE317" unicode="keyboard_backspace" -d="M448 277v-42h-302l76 -77l-30 -30l-128 128l128 128l30 -30l-76 -77h302z" /> - <glyph glyph-name="uniE318" unicode="keyboard_capslock" -d="M128 128v43h256v-43h-256zM256 333l-98 -98l-30 30l128 128l128 -128l-30 -30z" /> - <glyph glyph-name="uniE31A" unicode="keyboard_hide" -d="M256 21l-85 86h170zM405 341v43h-42v-43h42zM405 277v43h-42v-43h42zM341 341v43h-42v-43h42zM341 277v43h-42v-43h42zM341 192v43h-170v-43h170zM149 341v43h-42v-43h42zM149 277v43h-42v-43h42zM171 320v-43h42v43h-42zM171 384v-43h42v43h-42zM235 320v-43h42v43h-42z -M235 384v-43h42v43h-42zM427 448q17 0 29.5 -13t12.5 -30v-213q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v213q0 17 12.5 30t29.5 13h342z" /> - <glyph glyph-name="uniE31B" unicode="keyboard_return" -d="M405 363h43v-128h-324l77 -77l-30 -30l-128 128l128 128l30 -30l-77 -77h281v86z" /> - <glyph glyph-name="uniE31C" unicode="keyboard_tab" -d="M427 384h42v-256h-42v256zM247 354l30 30l128 -128l-128 -128l-30 30l77 77h-303v42h303z" /> - <glyph glyph-name="uniE31D" unicode="keyboard_voice" -d="M369 256h36q0 -54 -37.5 -94.5t-90.5 -48.5v-70h-42v70q-53 8 -90.5 48.5t-37.5 94.5h36q0 -47 33.5 -78t79.5 -31t79.5 31t33.5 78zM256 192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -26 -19 -45t-45 -19z" /> - <glyph glyph-name="uniE31E" unicode="laptop" -d="M85 384v-213h342v213h-342zM427 128h85v-43h-512v43h85q-17 0 -29.5 13t-12.5 30v213q0 17 12.5 30t29.5 13h342q17 0 29.5 -13t12.5 -30v-213q0 -17 -12.5 -30t-29.5 -13z" /> - <glyph glyph-name="uniE31F" unicode="laptop_chromebook" -d="M427 192v213h-342v-213h342zM299 128v21h-86v-21h86zM469 128h43v-43h-512v43h43v320h426v-320z" /> - <glyph glyph-name="uniE320" unicode="laptop_mac" -d="M256 107q9 0 15 6t6 15t-6 15t-15 6t-15 -6t-6 -15t6 -15t15 -6zM85 405v-234h342v234h-342zM427 128h85q0 -17 -13 -30t-30 -13h-426q-17 0 -30 13t-13 30h85q-17 0 -29.5 13t-12.5 30v234q0 17 12.5 30t29.5 13h342q17 0 29.5 -13t12.5 -30v-234q0 -17 -12.5 -30 -t-29.5 -13z" /> - <glyph glyph-name="uniE321" unicode="laptop_windows" -d="M85 405v-213h342v213h-342zM427 128h85v-43h-512v43h85v21q-17 0 -29.5 13t-12.5 30v213q0 17 12.5 30t29.5 13h342q17 0 29.5 -13t12.5 -30v-213q0 -17 -12.5 -30t-29.5 -13v-21z" /> - <glyph glyph-name="uniE322" unicode="memory" -d="M363 149v214h-214v-214h214zM448 277h-43v-42h43v-43h-43v-43q0 -17 -12.5 -29.5t-29.5 -12.5h-43v-43h-43v43h-42v-43h-43v43h-43q-17 0 -29.5 12.5t-12.5 29.5v43h-43v43h43v42h-43v43h43v43q0 17 12.5 29.5t29.5 12.5h43v43h43v-43h42v43h43v-43h43q17 0 29.5 -12.5 -t12.5 -29.5v-43h43v-43zM277 235v42h-42v-42h42zM320 320v-128h-128v128h128z" /> - <glyph glyph-name="uniE323" unicode="mouse" -d="M235 489v-169h-150q0 65 43.5 113t106.5 56zM85 192v85h342v-85q0 -70 -50.5 -120.5t-120.5 -50.5t-120.5 50.5t-50.5 120.5zM277 489q63 -8 106.5 -56t43.5 -113h-150v169z" /> - <glyph glyph-name="uniE324" unicode="phone_android" -d="M368 128v299h-224v-299h224zM299 64v21h-86v-21h86zM341 491q26 0 45 -19t19 -45v-342q0 -26 -19 -45t-45 -19h-170q-26 0 -45 19t-19 45v342q0 26 19 45t45 19h170z" /> - <glyph glyph-name="uniE325" unicode="phone_iphone" -d="M341 128v299h-192v-299h192zM245 43q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5t9.5 -22.5t22.5 -9.5zM331 491q22 0 37.5 -16t15.5 -38v-362q0 -22 -15.5 -38t-37.5 -16h-171q-22 0 -37.5 16t-15.5 38v362q0 22 15.5 38t37.5 16h171z" /> - <glyph glyph-name="uniE326" unicode="phonelink" -d="M469 149v150h-85v-150h85zM491 341q9 0 15 -6t6 -15v-213q0 -9 -6 -15.5t-15 -6.5h-128q-9 0 -15.5 6.5t-6.5 15.5v213q0 9 6.5 15t15.5 6h128zM85 384v-235h214v-64h-299v64h43v235q0 17 12.5 30t29.5 13h384v-43h-384z" /> - <glyph glyph-name="uniE327" unicode="phonelink_off" -d="M491 341q9 0 15 -6t6 -15v-213q0 -9 -6 -15.5t-15 -6.5h-4l-64 64h46v150h-85v-111l-43 43v89q0 9 6.5 15t15.5 6h128zM85 378v-229h229zM41 477q81 -81 230.5 -231t183.5 -184l-27 -27l-50 50h-378v64h43v235q0 15 10 27l-39 39zM469 384h-281l-43 43h324v-43z" /> - <glyph glyph-name="uniE328" unicode="router" -d="M320 128v43h-43v-43h43zM245 128v43h-42v-43h42zM171 128v43h-43v-43h43zM405 235q17 0 30 -13t13 -30v-85q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v85q0 17 13 30t30 13h213v85h43v-85h42zM412 369l-17 -17q-21 21 -54 21q-32 0 -53 -21l-17 17q30 30 70 30 -q41 0 71 -30zM431 386q-41 36 -90 36q-48 0 -89 -36l-17 17q45 45 106 45q62 0 107 -45z" /> - <glyph glyph-name="uniE329" unicode="scanner" -d="M405 149v43h-213v-43h213zM149 149v43h-42v-43h42zM422 284q11 -3 18.5 -14.5t7.5 -24.5v-117q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v85q0 17 13 30t30 13h268l-300 109l15 40z" /> - <glyph glyph-name="uniE32A" unicode="security" -d="M256 491l192 -86v-128q0 -89 -55 -162.5t-137 -93.5q-82 20 -137 93.5t-55 162.5v128zM256 256v-191q59 19 100 71.5t49 119.5h-149zM256 256v188l-149 -66v-122h149z" /> - <glyph glyph-name="uniE32B" unicode="sim_card" -d="M363 192v85h-43v-85h43zM277 235v42h-42v-42h42zM277 107v85h-42v-85h42zM192 192v85h-43v-85h43zM363 107v42h-43v-42h43zM192 107v42h-43v-42h43zM426 427l1 -342q0 -17 -13 -29.5t-30 -12.5h-256q-17 0 -30 12.5t-13 29.5v256l128 128h171q17 0 29.5 -12.5t12.5 -29.5 -z" /> - <glyph glyph-name="uniE32C" unicode="smartphone" -d="M363 107v298h-214v-298h214zM363 490q17 0 29.5 -12.5t12.5 -29.5v-384q0 -17 -12.5 -30t-29.5 -13h-214q-17 0 -29.5 13t-12.5 30v384q0 17 12.5 30t29.5 13z" /> - <glyph glyph-name="uniE32D" unicode="speaker" -d="M256 256q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM256 85q44 0 75.5 31.5t31.5 75.5t-31.5 75.5t-75.5 31.5t-75.5 -31.5t-31.5 -75.5t31.5 -75.5t75.5 -31.5zM256 427q-18 0 -30.5 -13t-12.5 -30t12.5 -30t30.5 -13q17 0 30 13t13 30t-13 30 -t-30 13zM363 469q17 0 29.5 -12.5t12.5 -29.5v-342q0 -17 -12.5 -29.5t-29.5 -12.5h-214q-17 0 -29.5 12.5t-12.5 29.5v342q0 17 12.5 29.5t29.5 12.5h214z" /> - <glyph glyph-name="uniE32E" unicode="speaker_group" -d="M128 405v-341h213v-43h-213q-18 0 -30.5 13t-12.5 30v341h43zM245 245q0 22 16 38t38 16t37.5 -16t15.5 -38t-15.5 -37.5t-37.5 -15.5t-38 15.5t-16 37.5zM299 160q35 0 60 25t25 60t-25 60.5t-60 25.5t-60.5 -25.5t-25.5 -60.5t25.5 -60t60.5 -25zM299 448 -q-17 0 -30 -12.5t-13 -30.5t12.5 -30t30.5 -12q17 0 29.5 12t12.5 30t-12.5 30.5t-29.5 12.5zM388 491q16 0 27.5 -11.5t11.5 -27.5v-307q0 -16 -11.5 -27t-27.5 -11h-179q-16 0 -27 11t-11 27v307q0 16 11 27.5t27 11.5h179z" /> - <glyph glyph-name="uniE32F" unicode="tablet" -d="M405 128v256h-298v-256h298zM448 427q17 0 30 -13t13 -30l-1 -256q0 -17 -12.5 -30t-29.5 -13h-384q-17 0 -30 13t-13 30v256q0 17 13 30t30 13h384z" /> - <glyph glyph-name="uniE330" unicode="tablet_android" -d="M411 107v341h-310v-341h310zM299 43v21h-86v-21h86zM384 512q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h256z" /> - <glyph glyph-name="uniE331" unicode="tablet_mac" -d="M405 107v341h-320v-341h320zM245 21q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5t9.5 -22.5t22.5 -9.5zM395 512q22 0 37.5 -15.5t15.5 -37.5v-406q0 -22 -15.5 -37.5t-37.5 -15.5h-299q-22 0 -37.5 15.5t-15.5 37.5v406q0 22 15.5 37.5 -t37.5 15.5h299z" /> - <glyph glyph-name="uniE332" unicode="toys" -d="M256 256q0 -48 -34.5 -82.5t-82.5 -34.5t-83 34.5t-35 82.5h235zM256 256q-48 0 -82.5 34.5t-34.5 82.5t34.5 83t82.5 35v-235zM256 256q48 0 82.5 -34.5t34.5 -82.5t-34.5 -83t-82.5 -35v235zM256 256q0 48 34.5 82.5t82.5 34.5t83 -34.5t35 -82.5h-235z" /> - <glyph glyph-name="uniE333" unicode="tv" -d="M448 149v256h-384v-256h384zM448 448q17 0 30 -13t13 -30l-1 -256q0 -17 -12.5 -29.5t-29.5 -12.5h-107v-43h-170v43h-107q-17 0 -30 12.5t-13 29.5v256q0 17 13 30t30 13h384z" /> - <glyph glyph-name="uniE334" unicode="watch" -d="M128 256q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM427 256q0 -82 -65 -134l-21 -122h-170l-21 122q-65 50 -65 134t65 134l21 122h170l21 -122q65 -52 65 -134z" /> - <glyph glyph-name="uniE335" unicode="device_hub" -d="M363 171h85v-107h-107v65l-85 90l-85 -90v-65h-107v107h85l86 85v68q-19 7 -31 23t-12 37q0 26 19 45t45 19t45 -19t19 -45q0 -21 -12 -37t-31 -23v-68z" /> - <glyph glyph-name="uniE336" unicode="power_input" -d="M341 192v43h107v-43h-107zM192 192v43h107v-43h-107zM43 192v43h106v-43h-106zM43 320h405v-43h-405v43z" /> - <glyph glyph-name="uniE337" unicode="devices_other" -d="M448 128v171h-85v-171h85zM469 341q8 0 15 -6.5t7 -14.5v-213q0 -8 -7 -15t-15 -7h-128q-8 0 -14.5 7t-6.5 15v213q0 8 6.5 14.5t14.5 6.5h128zM235 139q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5t9.5 -22.5t22.5 -9.5zM277 256v-38 -q22 -20 22 -47q0 -28 -22 -48v-38h-85v38q-21 19 -21 48q0 28 21 47v38h85zM64 384v-256h85v-43h-85q-17 0 -30 13t-13 30v256q0 17 13 30t30 13h384v-43h-384z" /> - <glyph glyph-name="uniE338" unicode="videogame_asset" -d="M416 256q14 0 23 9t9 23t-9 23t-23 9t-23 -9t-9 -23t9 -23t23 -9zM331 192q13 0 22.5 9t9.5 23t-9.5 23t-22.5 9t-22.5 -9t-9.5 -23t9.5 -23t22.5 -9zM235 235v42h-64v64h-43v-64h-64v-42h64v-64h43v64h64zM448 384q17 0 30 -13t13 -30v-170q0 -17 -13 -30t-30 -13h-384 -q-17 0 -30 13t-13 30v170q0 17 13 30t30 13h384z" /> - <glyph glyph-name="uniE39D" unicode="add_to_photos" -d="M405 277v43h-85v85h-43v-85h-85v-43h85v-85h43v85h85zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-256q-17 0 -30 13t-13 30v256q0 17 13 29.5t30 12.5h256zM85 384v-299h299v-42h-299q-17 0 -29.5 12.5t-12.5 29.5v299h42z" /> - <glyph glyph-name="uniE39E" unicode="adjust" -d="M320 256q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5 -t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE39F" unicode="assistant" -d="M296 237l88 40l-88 40l-40 88l-40 -88l-88 -40l88 -40l40 -88zM405 469q17 0 30 -12.5t13 -29.5v-299q0 -17 -13 -30t-30 -13h-85l-64 -64l-64 64h-85q-17 0 -30 13t-13 30v299q0 17 13 29.5t30 12.5h298z" /> - <glyph glyph-name="uniE3A0" unicode="assistant_photo" -d="M307 384h120v-213h-150l-8 42h-120v-149h-42v363h192z" /> - <glyph glyph-name="uniE3A1" unicode="audiotrack" -d="M256 448h149v-64h-85v-235h-1q-4 -36 -31 -60.5t-64 -24.5q-40 0 -68 28t-28 68t28 68t68 28q17 0 32 -6v198z" /> - <glyph glyph-name="uniE3A2" unicode="blur_circular" -d="M299 235q9 0 15 -6.5t6 -15.5t-6 -15t-15 -6t-15.5 6t-6.5 15t6.5 15.5t15.5 6.5zM299 160q10 0 10 -11q0 -10 -10 -10q-11 0 -11 10q0 11 11 11zM256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5z -M256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5zM363 309q10 0 10 -10q0 -11 -10 -11q-11 0 -11 11q0 10 11 10zM363 224q10 0 10 -11q0 -10 -10 -10q-11 0 -11 10q0 11 11 11zM299 352q-11 0 -11 11 -q0 10 11 10q10 0 10 -10q0 -11 -10 -11zM299 320q9 0 15 -6t6 -15t-6 -15.5t-15 -6.5t-15.5 6.5t-6.5 15.5t6.5 15t15.5 6zM213 352q-10 0 -10 11q0 10 10 10q11 0 11 -10q0 -11 -11 -11zM149 224q11 0 11 -11q0 -10 -11 -10q-10 0 -10 10q0 11 10 11zM213 160q11 0 11 -11 -q0 -10 -11 -10q-10 0 -10 10q0 11 10 11zM149 309q11 0 11 -10q0 -11 -11 -11q-10 0 -10 11q0 10 10 10zM213 235q9 0 15.5 -6.5t6.5 -15.5t-6.5 -15t-15.5 -6t-15 6t-6 15t6 15.5t15 6.5zM213 320q9 0 15.5 -6t6.5 -15t-6.5 -15.5t-15.5 -6.5t-15 6.5t-6 15.5t6 15t15 6z -" /> - <glyph glyph-name="uniE3A3" unicode="blur_linear" -d="M277 149q-9 0 -15 6.5t-6 15.5t6 15t15 6t15.5 -6t6.5 -15t-6.5 -15.5t-15.5 -6.5zM277 235q-9 0 -15 6t-6 15t6 15t15 6t15.5 -6t6.5 -15t-6.5 -15t-15.5 -6zM277 320q-9 0 -15 6t-6 15t6 15.5t15 6.5t15.5 -6.5t6.5 -15.5t-6.5 -15t-15.5 -6zM363 245q-11 0 -11 11 -t11 11q10 0 10 -11t-10 -11zM363 331q-11 0 -11 10q0 11 11 11q10 0 10 -11q0 -10 -10 -10zM64 448h384v-43h-384v43zM363 160q-11 0 -11 11q0 10 11 10q10 0 10 -10q0 -11 -10 -11zM192 149q-9 0 -15 6.5t-6 15.5t6 15t15 6t15 -6t6 -15t-6 -15.5t-15 -6.5zM107 224 -q-13 0 -22.5 9t-9.5 23t9.5 23t22.5 9t22.5 -9t9.5 -23t-9.5 -23t-22.5 -9zM107 309q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5zM64 64v43h384v-43h-384zM192 320q-9 0 -15 6t-6 15t6 15.5t15 6.5t15 -6.5t6 -15.5t-6 -15 -t-15 -6zM192 235q-9 0 -15 6t-6 15t6 15t15 6t15 -6t6 -15t-6 -15t-15 -6zM107 139q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5z" /> - <glyph glyph-name="uniE3A4" unicode="blur_off" -d="M64 224q11 0 11 -11q0 -10 -11 -10t-11 10q0 11 11 11zM128 149q9 0 15 -6t6 -15t-6 -15t-15 -6t-15 6t-6 15t6 15t15 6zM213 75q11 0 11 -11t-11 -11q-10 0 -10 11t10 11zM64 309q11 0 11 -10q0 -11 -11 -11t-11 11q0 10 11 10zM128 235q9 0 15 -6.5t6 -15.5t-6 -15 -t-15 -6t-15 6t-6 15t6 15.5t15 6.5zM448 224q11 0 11 -11q0 -10 -11 -10t-11 10q0 11 11 11zM213 149q9 0 15.5 -6t6.5 -15t-6.5 -15t-15.5 -6t-15 6t-6 15t6 15t15 6zM53 400l27 27l347 -347l-28 -27l-80 81q1 -2 1 -6q0 -9 -6 -15t-15 -6t-15.5 6t-6.5 15t6.5 15t15.5 6 -q4 0 6 -1l-60 60q-2 -11 -11 -19t-21 -8q-13 0 -22.5 9.5t-9.5 22.5q0 12 8 21t19 11l-60 60q1 -2 1 -6q0 -9 -6 -15.5t-15 -6.5t-15 6.5t-6 15.5t6 15t15 6l6 -1zM299 75q10 0 10 -11t-10 -11q-11 0 -11 11t11 11zM384 363q-9 0 -15 6t-6 15t6 15t15 6t15 -6t6 -15t-6 -15 -t-15 -6zM384 277q-9 0 -15 6.5t-6 15.5t6 15t15 6t15 -6t6 -15t-6 -15.5t-15 -6.5zM384 192q-9 0 -15 6t-6 15t6 15.5t15 6.5t15 -6.5t6 -15.5t-6 -15t-15 -6zM213 363q-9 0 -15 6t-6 15t6 15t15 6t15.5 -6t6.5 -15t-6.5 -15t-15.5 -6zM448 288q-11 0 -11 11q0 10 11 10 -t11 -10q0 -11 -11 -11zM213 437q-10 0 -10 11t10 11q11 0 11 -11t-11 -11zM299 437q-11 0 -11 11t11 11q10 0 10 -11t-10 -11zM294 267q-10 1 -18 9t-9 18v5q0 13 9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-5zM299 363q-9 0 -15.5 6t-6.5 15t6.5 15 -t15.5 6t15 -6t6 -15t-6 -15t-15 -6z" /> - <glyph glyph-name="uniE3A5" unicode="blur_on" -d="M299 331q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM299 245q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM213 149q9 0 15.5 -6t6.5 -15t-6.5 -15t-15.5 -6t-15 6t-6 15t6 15 -t15 6zM213 331q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM299 75q10 0 10 -11t-10 -11q-11 0 -11 11t11 11zM299 149q9 0 15 -6t6 -15t-6 -15t-15 -6t-15.5 6t-6.5 15t6.5 15t15.5 6zM448 224q11 0 11 -11q0 -10 -11 -10 -t-11 10q0 11 11 11zM384 405q9 0 15 -6t6 -15t-6 -15t-15 -6t-15 6t-6 15t6 15t15 6zM384 320q9 0 15 -6t6 -15t-6 -15.5t-15 -6.5t-15 6.5t-6 15.5t6 15t15 6zM384 149q9 0 15 -6t6 -15t-6 -15t-15 -6t-15 6t-6 15t6 15t15 6zM384 235q9 0 15 -6.5t6 -15.5t-6 -15t-15 -6 -t-15 6t-6 15t6 15.5t15 6.5zM213 245q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM213 363q-9 0 -15 6t-6 15t6 15t15 6t15.5 -6t6.5 -15t-6.5 -15t-15.5 -6zM213 437q-10 0 -10 11t10 11q11 0 11 -11t-11 -11zM213 75 -q11 0 11 -11t-11 -11q-10 0 -10 11t10 11zM64 224q11 0 11 -11q0 -10 -11 -10t-11 10q0 11 11 11zM299 437q-11 0 -11 11t11 11q10 0 10 -11t-10 -11zM299 363q-9 0 -15.5 6t-6.5 15t6.5 15t15.5 6t15 -6t6 -15t-6 -15t-15 -6zM448 288q-11 0 -11 11q0 10 11 10t11 -10 -q0 -11 -11 -11zM128 405q9 0 15 -6t6 -15t-6 -15t-15 -6t-15 6t-6 15t6 15t15 6zM64 309q11 0 11 -10q0 -11 -11 -11t-11 11q0 10 11 10zM128 320q9 0 15 -6t6 -15t-6 -15.5t-15 -6.5t-15 6.5t-6 15.5t6 15t15 6zM128 149q9 0 15 -6t6 -15t-6 -15t-15 -6t-15 6t-6 15t6 15 -t15 6zM128 235q9 0 15 -6.5t6 -15.5t-6 -15t-15 -6t-15 6t-6 15t6 15.5t15 6.5z" /> - <glyph glyph-name="uniE3A6" unicode="brightness_1" -d="M43 256q0 88 62.5 150.5t150.5 62.5t150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5z" /> - <glyph glyph-name="uniE3A7" unicode="brightness_2" -d="M213 469q89 0 151.5 -62.5t62.5 -150.5t-62.5 -150.5t-151.5 -62.5q-58 0 -106 28q49 28 77.5 77.5t28.5 107.5t-28.5 107.5t-77.5 77.5q48 28 106 28z" /> - <glyph glyph-name="uniE3A8" unicode="brightness_3" -d="M192 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5q-34 0 -64 9q66 20 107.5 76.5t41.5 127.5t-41.5 127.5t-107.5 76.5q30 9 64 9z" /> - <glyph glyph-name="uniE3A9" unicode="brightness_4" -d="M256 128q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5q-26 0 -53 -12q33 -15 53.5 -46.5t20.5 -69.5t-20.5 -69.5t-53.5 -46.5q27 -12 53 -12zM427 327l70 -71l-70 -71v-100h-100l-71 -70l-71 70h-100v100l-70 71l70 71v100h100l71 70l71 -70h100v-100z" /> - <glyph glyph-name="uniE3AA" unicode="brightness_5" -d="M256 128q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5zM427 185v-100h-100l-71 -70l-71 70h-100v100l-70 71l70 71v100h100l71 70l71 -70h100v-100l70 -71z" /> - <glyph glyph-name="uniE3AB" unicode="brightness_6" -d="M256 128q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5v-256zM427 185v-100h-100l-71 -70l-71 70h-100v100l-70 71l70 71v100h100l71 70l71 -70h100v-100l70 -71z" /> - <glyph glyph-name="uniE3AC" unicode="brightness_7" -d="M256 341q35 0 60 -25t25 -60t-25 -60t-60 -25t-60 25t-25 60t25 60t60 25zM256 128q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5zM427 327l70 -71l-70 -71v-100h-100l-71 -70l-71 70h-100v100l-70 71l70 71v100h100 -l71 70l71 -70h100v-100z" /> - <glyph glyph-name="uniE3AD" unicode="broken_image" -d="M384 268l64 -64v-97q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v140l64 -64l85 86l86 -86zM448 405v-140l-64 64l-85 -86l-86 86l-85 -86l-64 65v97q0 17 13 30t30 13h298q17 0 30 -13t13 -30z" /> - <glyph glyph-name="uniE3AE" unicode="brush" -d="M442 413q6 -6 6 -15t-6 -15l-191 -191l-59 59l191 191q6 6 15 6t15 -6zM149 213q26 0 45 -19t19 -45q0 -35 -25 -60t-60 -25q-52 0 -85 43q15 0 28.5 11.5t13.5 30.5q0 26 19 45t45 19z" /> - <glyph glyph-name="uniE3AF" unicode="camera" -d="M210 48q4 7 43 75t60 103l78 -135q-59 -48 -135 -48q-21 0 -46 5zM52 192h207l-79 -135q-46 17 -79.5 52.5t-48.5 82.5zM99 400l108 -187h-160q-4 19 -4 43q0 83 56 144zM465 299q4 -19 4 -43q0 -83 -56 -144l-102 176l-6 11h160zM460 320h-207l79 135q46 -17 79.5 -52.5 -t48.5 -82.5zM201 288l-2 -2l-78 135q59 48 135 48q21 0 46 -5z" /> - <glyph glyph-name="uniE3B0" unicode="camera_alt" -d="M256 149q44 0 75.5 31.5t31.5 75.5t-31.5 75.5t-75.5 31.5t-75.5 -31.5t-31.5 -75.5t31.5 -75.5t75.5 -31.5zM192 469h128l39 -42h68q17 0 29.5 -13t12.5 -30v-256q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h68zM188 256 -q0 28 20 48t48 20t48 -20t20 -48t-20 -48t-48 -20t-48 20t-20 48z" /> - <glyph glyph-name="uniE3B1" unicode="camera_front" -d="M149 469v-224q0 24 36.5 39t70.5 15t70.5 -15t36.5 -39v224h-214zM363 512q17 0 29.5 -13t12.5 -30v-298q0 -17 -12.5 -30t-29.5 -13h-150l64 -64l-64 -64v43h-106v42h106v43h-64q-17 0 -29.5 13t-12.5 30v298q0 17 12.5 30t29.5 13h214zM256 341q-17 0 -29.5 13 -t-12.5 30t12.5 30t29.5 13t30 -13t13 -30t-13 -30t-30 -13zM299 85h106v-42h-106v42z" /> - <glyph glyph-name="uniE3B2" unicode="camera_rear" -d="M256 384q17 0 29.5 13t12.5 30t-12.5 29.5t-29.5 12.5t-30 -12.5t-13 -29.5t12.5 -30t30.5 -13zM363 512q17 0 29.5 -13t12.5 -30v-298q0 -17 -12.5 -30t-29.5 -13h-150l64 -64l-64 -64v43h-106v42h106v43h-64q-17 0 -29.5 13t-12.5 30v298q0 17 12.5 30t29.5 13h214z -M299 85h106v-42h-106v42z" /> - <glyph glyph-name="uniE3B3" unicode="camera_roll" -d="M427 320v43h-43v-43h43zM427 128v43h-43v-43h43zM341 320v43h-42v-43h42zM341 128v43h-42v-43h42zM256 320v43h-43v-43h43zM256 128v43h-43v-43h43zM299 405h170v-320h-170q0 -17 -13 -29.5t-30 -12.5h-171q-17 0 -29.5 12.5t-12.5 29.5v320q0 17 12.5 30t29.5 13h22v21 -q0 9 6 15.5t15 6.5h85q9 0 15.5 -6.5t6.5 -15.5v-21h21q17 0 30 -13t13 -30z" /> - <glyph glyph-name="uniE3B4" unicode="center_focus_strong" -d="M405 107v85h43v-85q0 -17 -13 -30t-30 -13h-85v43h85zM405 448q17 0 30 -13t13 -30v-85h-43v85h-85v43h85zM107 405v-85h-43v85q0 17 13 30t30 13h85v-43h-85zM107 192v-85h85v-43h-85q-17 0 -30 13t-13 30v85h43zM256 341q35 0 60 -25t25 -60t-25 -60t-60 -25t-60 25 -t-25 60t25 60t60 25z" /> - <glyph glyph-name="uniE3B5" unicode="center_focus_weak" -d="M256 213q17 0 30 13t13 30t-13 30t-30 13t-30 -13t-13 -30t13 -30t30 -13zM256 341q35 0 60 -25t25 -60t-25 -60t-60 -25t-60 25t-25 60t25 60t60 25zM405 107v85h43v-85q0 -17 -13 -30t-30 -13h-85v43h85zM405 448q17 0 30 -13t13 -30v-85h-43v85h-85v43h85zM107 405 -v-85h-43v85q0 17 13 30t30 13h85v-43h-85zM107 192v-85h85v-43h-85q-17 0 -30 13t-13 30v85h43z" /> - <glyph glyph-name="uniE3B6" unicode="collections" -d="M43 384h42v-299h299v-42h-299q-17 0 -29.5 12.5t-12.5 29.5v299zM235 256l-64 -85h256l-86 106l-63 -79zM469 171q0 -17 -12.5 -30t-29.5 -13h-256q-17 0 -30 13t-13 30v256q0 17 13 29.5t30 12.5h256q17 0 29.5 -12.5t12.5 -29.5v-256z" /> - <glyph glyph-name="uniE3B7" unicode="color_lens" -d="M373 256q13 0 22.5 9t9.5 23t-9.5 23t-22.5 9t-22.5 -9t-9.5 -23t9.5 -23t22.5 -9zM309 341q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5t9.5 -22.5t22.5 -9.5zM203 341q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5 -t9.5 -22.5t22.5 -9.5zM139 256q13 0 22.5 9t9.5 23t-9.5 23t-22.5 9t-22.5 -9t-9.5 -23t9.5 -23t22.5 -9zM256 448q79 0 135.5 -50t56.5 -121q0 -44 -31.5 -75t-75.5 -31h-37q-14 0 -23 -9.5t-9 -22.5q0 -11 8 -21t8 -22q0 -14 -9 -23t-23 -9q-80 0 -136 56t-56 136t56 136 -t136 56z" /> - <glyph glyph-name="uniE3B8" unicode="colorize" -d="M148 107l172 172l-41 41l-172 -172zM442 392q15 -15 0 -30l-67 -67l41 -41l-30 -30l-30 30l-191 -190h-101v101l190 191l-30 30l30 30l41 -41l67 67q6 6 15 6t15 -6z" /> - <glyph glyph-name="uniE3B9" unicode="compare" -d="M405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-106v192l106 -128v277h-106v43h106zM213 128v128l-106 -128h106zM213 448v43h43v-470h-43v43h-106q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h106z" /> - <glyph glyph-name="uniE3BA" unicode="control_point" -d="M256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5zM277 363v-86h86v-42h-86v-86h-42 -v86h-86v42h86v86h42z" /> - <glyph glyph-name="uniE3BB" unicode="control_point_duplicate" -d="M320 107q62 0 105.5 43.5t43.5 105.5t-43.5 105.5t-105.5 43.5t-105.5 -43.5t-43.5 -105.5t43.5 -105.5t105.5 -43.5zM320 448q80 0 136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136t56 136t136 56zM43 256q0 -44 23 -80.5t62 -54.5v-46q-56 20 -92 70t-36 111 -t36 111t92 70v-46q-39 -18 -62 -54.5t-23 -80.5zM341 341v-64h64v-42h-64v-64h-42v64h-64v42h64v64h42z" /> - <glyph glyph-name="uniE3BC" unicode="crop_16_9" -d="M405 171v170h-298v-170h298zM405 384q17 0 30 -13t13 -30v-170q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v170q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniE3BD" unicode="crop_3_2" -d="M405 128v256h-298v-256h298zM405 427q17 0 30 -13t13 -30v-256q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v256q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniE3BE" unicode="crop" -d="M149 149h342v-42h-86v-86h-42v86h-214q-17 0 -29.5 12.5t-12.5 29.5v214h-86v42h86v86h42v-342zM363 192v171h-171v42h171q17 0 29.5 -12.5t12.5 -29.5v-171h-42z" /> - <glyph glyph-name="uniE3BF" unicode="crop_5_4" -d="M405 149v214h-298v-214h298zM405 405q17 0 30 -12.5t13 -29.5v-214q0 -17 -13 -29.5t-30 -12.5h-298q-17 0 -30 12.5t-13 29.5v214q0 17 13 29.5t30 12.5h298z" /> - <glyph glyph-name="uniE3C0" unicode="crop_7_5" -d="M405 192v128h-298v-128h298zM405 363q17 0 30 -13t13 -30v-128q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v128q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniE3C1" unicode="crop_din" -d="M405 107v298h-298v-298h298zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniE3C2" unicode="crop_free" -d="M405 448q17 0 30 -13t13 -30v-85h-43v85h-85v43h85zM405 107v85h43v-85q0 -17 -13 -30t-30 -13h-85v43h85zM107 192v-85h85v-43h-85q-17 0 -30 13t-13 30v85h43zM64 405q0 17 13 30t30 13h85v-43h-85v-85h-43v85z" /> - <glyph glyph-name="uniE3C3" unicode="crop_landscape" -d="M405 149v214h-298v-214h298zM405 405q17 0 30 -12.5t13 -29.5v-214q0 -17 -13 -29.5t-30 -12.5h-298q-17 0 -30 12.5t-13 29.5v214q0 17 13 29.5t30 12.5h298z" /> - <glyph glyph-name="uniE3C4" unicode="crop_original" -d="M298 250l75 -101h-234l58 76l42 -51zM405 107v298h-298v-298h298zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniE3C5" unicode="crop_portrait" -d="M363 107v298h-214v-298h214zM363 448q17 0 29.5 -13t12.5 -30v-298q0 -17 -12.5 -30t-29.5 -13h-214q-17 0 -29.5 13t-12.5 30v298q0 17 12.5 30t29.5 13h214z" /> - <glyph glyph-name="uniE3C6" unicode="crop_square" -d="M384 128v256h-256v-256h256zM384 427q17 0 30 -13t13 -30v-256q0 -17 -13 -30t-30 -13h-256q-17 0 -30 13t-13 30v256q0 17 13 30t30 13h256z" /> - <glyph glyph-name="uniE3C7" unicode="dehaze" -d="M43 395h426v-43h-426v43zM43 288h426v-43h-426v43zM43 181h426v-42h-426v42z" /> - <glyph glyph-name="uniE3C8" unicode="details" -d="M136 384l120 -213l120 213h-240zM64 427h384l-192 -342z" /> - <glyph glyph-name="uniE3C9" unicode="edit" -d="M442 362l-39 -39l-80 80l39 39q6 6 15 6t15 -6l50 -50q6 -6 6 -15t-6 -15zM64 144l236 236l80 -80l-236 -236h-80v80z" /> - <glyph glyph-name="uniE3CA" unicode="exposure" -d="M427 85v342l-342 -342h342zM107 405v-42h128v42h-128zM427 469q17 0 29.5 -12.5t12.5 -29.5v-342q0 -17 -12.5 -29.5t-29.5 -12.5h-342q-17 0 -29.5 12.5t-12.5 29.5v342q0 17 12.5 29.5t29.5 12.5h342zM320 149h-43v43h43v43h43v-43h42v-43h-42v-42h-43v42z" /> - <glyph glyph-name="uniE3CB" unicode="exposure_minus_1" -d="M405 128h-42v227l-64 -22v36l100 36h6v-277zM85 277h171v-42h-171v42z" /> - <glyph glyph-name="uniE3CC" unicode="exposure_minus_2" -d="M43 277h170v-42h-170v42zM351 405q86 0 86 -75q0 -14 -4 -25q-7 -19 -11 -25q-17 -27 -40 -50l-61 -66h127v-36h-184v32l89 97q18 18 31 40q7 12 7 28q0 13 -2 18q-10 26 -38 26q-46 0 -46 -49h-46q0 36 24 60q25 25 68 25z" /> - <glyph glyph-name="uniE3CD" unicode="exposure_plus_1" -d="M427 128h-43v227l-64 -22v36l100 36h7v-277zM213 363v-86h86v-42h-86v-86h-42v86h-86v42h86v86h42z" /> - <glyph glyph-name="uniE3CE" unicode="exposure_plus_2" -d="M171 363v-86h85v-42h-85v-86h-43v86h-85v42h85v86h43zM342 164h127v-36h-184v32l89 97q18 18 31 40q8 13 8 28q0 16 -11 31q-10 13 -30 13q-21 0 -35 -14q-11 -11 -11 -35h-46q0 36 24 60q14 14 29 19q18 6 40 6q18 0 36 -5q20 -8 27 -15q23 -20 23 -55q0 -24 -16 -50 -q-12 -20 -17 -25q-14 -16 -23 -25z" /> - <glyph glyph-name="uniE3CF" unicode="exposure_zero" -d="M299 296q0 40 -11 57q-4 6 -14 12q-7 4 -18 4t-18 -4q-10 -6 -14 -12q-11 -17 -11 -57v-57q0 -56 25 -71q7 -4 18 -4q21 0 32 17q12 18 12 58v57h-1zM168 289q0 116 88 116q65 0 82 -62q7 -26 7 -54v-44h-1q0 -59 -24 -90q-14 -16 -28 -21q-16 -6 -36 -6t-36 6 -q-14 5 -28 21q-24 27 -24 90v44z" /> - <glyph glyph-name="uniE3D0" unicode="filter_1" -d="M448 149v299h-299v-299h299zM448 491q17 0 30 -13t13 -30v-299q0 -17 -13 -29.5t-30 -12.5h-299q-17 0 -29.5 12.5t-12.5 29.5v299q0 17 12.5 30t29.5 13h299zM299 192v171h-43v42h85v-213h-42zM64 405v-341h341v-43h-341q-17 0 -30 13t-13 30v341h43z" /> - <glyph glyph-name="uniE3D1" unicode="filter_2" -d="M363 235v-43h-128v85q0 18 12.5 30.5t29.5 12.5h43v43h-85v42h85q18 0 30.5 -12t12.5 -30v-43q0 -18 -13 -30.5t-30 -12.5h-43v-42h86zM448 149v299h-299v-299h299zM448 491q17 0 30 -13t13 -30v-299q0 -17 -13 -29.5t-30 -12.5h-299q-17 0 -29.5 12.5t-12.5 29.5v299 -q0 17 12.5 30t29.5 13h299zM64 405v-341h341v-43h-341q-17 0 -30 13t-13 30v341h43z" /> - <glyph glyph-name="uniE3D2" unicode="filter_3" -d="M363 235q0 -18 -13 -30.5t-30 -12.5h-85v43h85v42h-43v43h43v43h-85v42h85q18 0 30.5 -12t12.5 -30v-32q0 -13 -9.5 -22.5t-22.5 -9.5q13 0 22.5 -9.5t9.5 -22.5v-32zM64 405v-341h341v-43h-341q-17 0 -30 13t-13 30v341h43zM448 149v299h-299v-299h299zM448 491 -q17 0 30 -13t13 -30v-299q0 -17 -13 -29.5t-30 -12.5h-299q-17 0 -29.5 12.5t-12.5 29.5v299q0 17 12.5 30t29.5 13h299z" /> - <glyph glyph-name="uniE3D3" unicode="filter" -d="M448 149v299h-299v-299h299zM448 491q17 0 30 -13t13 -30v-299q0 -17 -13 -29.5t-30 -12.5h-299q-17 0 -29.5 12.5t-12.5 29.5v299q0 17 12.5 30t29.5 13h299zM64 405v-341h341v-43h-341q-17 0 -30 13t-13 30v341h43zM340 292l76 -100h-235l59 75l42 -50z" /> - <glyph glyph-name="uniE3D4" unicode="filter_4" -d="M448 149v299h-299v-299h299zM448 491q17 0 30 -13t13 -30v-299q0 -17 -13 -29.5t-30 -12.5h-299q-17 0 -29.5 12.5t-12.5 29.5v299q0 17 12.5 30t29.5 13h299zM320 192v85h-85v128h42v-85h43v85h43v-213h-43zM64 405v-341h341v-43h-341q-17 0 -30 13t-13 30v341h43z" /> - <glyph glyph-name="uniE3D5" unicode="filter_5" -d="M363 235q0 -18 -13 -30.5t-30 -12.5h-85v43h85v42h-85v128h128v-42h-86v-43h43q17 0 30 -12.5t13 -30.5v-42zM64 405v-341h341v-43h-341q-17 0 -30 13t-13 30v341h43zM448 149v299h-299v-299h299zM448 491q17 0 30 -13t13 -30v-299q0 -17 -13 -29.5t-30 -12.5h-299 -q-17 0 -29.5 12.5t-12.5 29.5v299q0 17 12.5 30t29.5 13h299z" /> - <glyph glyph-name="uniE3D6" unicode="filter_6" -d="M277 277v-42h43v42h-43zM277 192q-17 0 -29.5 12.5t-12.5 30.5v128q0 18 12.5 30t29.5 12h86v-42h-86v-43h43q17 0 30 -12.5t13 -30.5v-42q0 -18 -13 -30.5t-30 -12.5h-43zM448 149v299h-299v-299h299zM448 491q17 0 30 -13t13 -30v-299q0 -17 -13 -29.5t-30 -12.5h-299 -q-17 0 -29.5 12.5t-12.5 29.5v299q0 17 12.5 30t29.5 13h299zM64 405v-341h341v-43h-341q-17 0 -30 13t-13 30v341h43z" /> - <glyph glyph-name="uniE3D7" unicode="filter_7" -d="M277 192h-42l85 171h-85v42h128v-42zM448 149v299h-299v-299h299zM448 491q17 0 30 -13t13 -30v-299q0 -17 -13 -29.5t-30 -12.5h-299q-17 0 -29.5 12.5t-12.5 29.5v299q0 17 12.5 30t29.5 13h299zM64 405v-341h341v-43h-341q-17 0 -30 13t-13 30v341h43z" /> - <glyph glyph-name="uniE3D8" unicode="filter_8" -d="M277 277v-42h43v42h-43zM277 363v-43h43v43h-43zM277 192q-17 0 -29.5 12.5t-12.5 30.5v32q0 13 9.5 22.5t22.5 9.5q-13 0 -22.5 9.5t-9.5 22.5v32q0 18 12.5 30t29.5 12h43q18 0 30.5 -12t12.5 -30v-32q0 -13 -9.5 -22.5t-22.5 -9.5q13 0 22.5 -9.5t9.5 -22.5v-32 -q0 -18 -13 -30.5t-30 -12.5h-43zM448 149v299h-299v-299h299zM448 491q17 0 30 -13t13 -30v-299q0 -17 -13 -29.5t-30 -12.5h-299q-17 0 -29.5 12.5t-12.5 29.5v299q0 17 12.5 30t29.5 13h299zM64 405v-341h341v-43h-341q-17 0 -30 13t-13 30v341h43z" /> - <glyph glyph-name="uniE3D9" unicode="filter_9" -d="M320 320v43h-43v-43h43zM320 405q18 0 30.5 -12t12.5 -30v-128q0 -18 -13 -30.5t-30 -12.5h-85v43h85v42h-43q-17 0 -29.5 12.5t-12.5 30.5v43q0 18 12.5 30t29.5 12h43zM448 149v299h-299v-299h299zM448 491q17 0 30 -13t13 -30v-299q0 -17 -13 -29.5t-30 -12.5h-299 -q-17 0 -29.5 12.5t-12.5 29.5v299q0 17 12.5 30t29.5 13h299zM64 405v-341h341v-43h-341q-17 0 -30 13t-13 30v341h43z" /> - <glyph glyph-name="uniE3DA" unicode="filter_9_plus" -d="M448 320v128h-299v-299h299v128h-43v-42h-42v42h-43v43h43v43h42v-43h43zM448 491q17 0 30 -13t13 -30v-299q0 -17 -13 -29.5t-30 -12.5h-299q-17 0 -29.5 12.5t-12.5 29.5v299q0 17 12.5 30t29.5 13h299zM235 320h21v21h-21v-21zM299 256q0 -18 -13 -30.5t-30 -12.5h-64 -v43h64v21h-21q-17 0 -30 12.5t-13 30.5v21q0 18 13 30.5t30 12.5h21q17 0 30 -12.5t13 -30.5v-85zM64 405v-341h341v-43h-341q-17 0 -30 13t-13 30v341h43z" /> - <glyph glyph-name="uniE3DB" unicode="filter_b_and_w" -d="M405 107v298h-149v-128zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298zM256 277l-149 -170h149v170z" /> - <glyph glyph-name="uniE3DC" unicode="filter_center_focus" -d="M256 320q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM405 107v85h43v-85q0 -17 -13 -30t-30 -13h-85v43h85zM405 448q17 0 30 -13t13 -30v-85h-43v85h-85v43h85zM107 405v-85h-43v85q0 17 13 30t30 13h85v-43h-85zM107 192v-85h85v-43h-85 -q-17 0 -30 13t-13 30v85h43z" /> - <glyph glyph-name="uniE3DD" unicode="filter_drama" -d="M405 128q26 0 45 19t19 45t-19 45t-45 19h-32v11q0 49 -34 83t-83 34q-58 0 -94 -47q41 -11 67.5 -45.5t26.5 -78.5h-43q0 35 -25 60.5t-60 25.5t-60 -25.5t-25 -60.5t25 -60t60 -25h277zM413 298q41 -3 70 -33.5t29 -72.5q0 -44 -31.5 -75.5t-75.5 -31.5h-277 -q-53 0 -90.5 37.5t-37.5 90.5q0 49 33 85.5t81 41.5q21 39 59 63t83 24q58 0 102 -36.5t55 -92.5z" /> - <glyph glyph-name="uniE3DE" unicode="filter_frames" -d="M384 341h-256v-213h256v213zM427 85v299h-96l-74 75l-75 -75h-97v-299h342zM427 427q17 0 29.5 -13t12.5 -30v-299q0 -17 -12.5 -29.5t-29.5 -12.5h-342q-17 0 -29.5 12.5t-12.5 29.5v299q0 17 12.5 30t29.5 13h86l85 85l85 -85h86z" /> - <glyph glyph-name="uniE3DF" unicode="filter_hdr" -d="M299 384l192 -256h-470l128 171l96 -128l34 25l-60 81z" /> - <glyph glyph-name="uniE3E0" unicode="filter_none" -d="M448 149v299h-299v-299h299zM448 491q17 0 30 -13t13 -30v-299q0 -17 -13 -29.5t-30 -12.5h-299q-17 0 -29.5 12.5t-12.5 29.5v299q0 17 12.5 30t29.5 13h299zM64 405v-341h341v-43h-341q-17 0 -30 13t-13 30v341h43z" /> - <glyph glyph-name="uniE3E2" unicode="filter_tilt_shift" -d="M121 91l30 30q37 -28 84 -34v-43q-63 6 -114 47zM277 87q47 6 83 34l31 -30q-51 -41 -114 -47v43zM391 151q28 38 34 83h43q-6 -62 -47 -113zM320 256q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM87 235q6 -47 34 -83l-30 -31q-41 51 -47 114h43z -M121 361q-28 -37 -34 -84h-43q6 63 47 114zM425 277q-6 47 -34 84l30 30q41 -51 47 -114h-43zM391 421l-30 -30q-37 28 -84 34v43q63 -6 114 -47zM235 425q-47 -6 -84 -34l-30 30q51 41 114 47v-43z" /> - <glyph glyph-name="uniE3E3" unicode="filter_vintage" -d="M256 171q35 0 60 25t25 60t-25 60t-60 25t-60 -25t-25 -60t25 -60t60 -25zM49 137q0 38 22.5 72.5t59.5 46.5l-18 9q-30 18 -47 47.5t-17 62.5q64 37 128 0q9 -4 17 -11q-2 14 -2 20q0 35 17.5 64.5t46.5 46.5q29 -17 46.5 -46.5t17.5 -64.5q0 -6 -2 -20q8 7 17 11 -q64 37 128 0q0 -33 -17 -62.5t-47 -47.5q-2 -1 -5.5 -3t-6.5 -3.5t-6 -2.5q3 -1 6 -2.5t6.5 -3.5t5.5 -3q30 -18 47 -47.5t17 -62.5q-64 -37 -128 0q-9 4 -17 11q2 -14 2 -20q0 -35 -17.5 -64.5t-46.5 -46.5q-29 17 -46.5 46.5t-17.5 64.5q0 6 2 20q-8 -7 -17 -11 -q-64 -37 -128 0z" /> - <glyph glyph-name="uniE3E4" unicode="flare" -d="M235 21v128h42v-128h-42zM120 150l46 46l30 -30l-46 -46zM316 166l30 30l46 -46l-30 -30zM256 320q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM363 277h128v-42h-128v42zM392 362l-46 -46l-30 30l46 46zM277 491v-128h-42v128h42zM196 346l-30 -30 -l-46 46l30 30zM149 277v-42h-128v42h128z" /> - <glyph glyph-name="uniE3E5" unicode="flash_auto" -d="M359 349h50l-25 78zM405 469l69 -192h-41l-15 43h-68l-15 -43h-41l69 192h42zM64 469h213l-85 -192h85l-149 -256v192h-64v256z" /> - <glyph glyph-name="uniE3E6" unicode="flash_off" -d="M363 299l-33 -57l-181 181v46h214l-86 -170h86zM70 448l335 -336l-27 -27l-88 89l-77 -131v192h-64v79l-106 107z" /> - <glyph glyph-name="uniE3E7" unicode="flash_on" -d="M149 469h214l-86 -170h86l-150 -256v192h-64v234z" /> - <glyph glyph-name="uniE3E8" unicode="flip" -d="M405 64v43h43q0 -17 -13 -30t-30 -13zM405 235v42h43v-42h-43zM320 405v43h43v-43h-43zM405 149v43h43v-43h-43zM235 21v470h42v-470h-42zM405 448q17 0 30 -13t13 -30h-43v43zM64 405q0 17 13 30t30 13h85v-43h-85v-298h85v-43h-85q-17 0 -30 13t-13 30v298zM405 320v43 -h43v-43h-43zM320 64v43h43v-43h-43z" /> - <glyph glyph-name="uniE3E9" unicode="gradient" -d="M405 277v128h-298v-128h42v-42h43v-43h43v43h42v-43h43v43h43v42h42zM363 128v43h-43v-43h43zM277 128v43h-42v-43h42zM192 128v43h-43v-43h43zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298zM149 320h43 -v-43h-43v43zM320 320h43v-43h-43v43zM235 320h42v-43h43v-42h-43v42h-42v-42h-43v42h43v43zM363 235v-43h42v43h-42zM149 235h-42v-43h42v43z" /> - <glyph glyph-name="uniE3EA" unicode="grain" -d="M213 427q17 0 30 -13t13 -30t-13 -30t-30 -13t-29.5 13t-12.5 30t12.5 30t29.5 13zM299 341q17 0 29.5 -12.5t12.5 -29.5t-12.5 -30t-29.5 -13t-30 13t-13 30t13 29.5t30 12.5zM384 256q17 0 30 -13t13 -30t-13 -29.5t-30 -12.5t-30 12.5t-13 29.5t13 30t30 13zM299 171 -q17 0 29.5 -13t12.5 -30t-12.5 -30t-29.5 -13t-30 13t-13 30t13 30t30 13zM384 341q-17 0 -30 13t-13 30t13 30t30 13t30 -13t13 -30t-13 -30t-30 -13zM128 171q17 0 30 -13t13 -30t-13 -30t-30 -13t-30 13t-13 30t13 30t30 13zM128 341q17 0 30 -12.5t13 -29.5t-13 -30 -t-30 -13t-30 13t-13 30t13 29.5t30 12.5zM213 256q17 0 30 -13t13 -30t-13 -29.5t-30 -12.5t-29.5 12.5t-12.5 29.5t12.5 30t29.5 13z" /> - <glyph glyph-name="uniE3EB" unicode="grid_off" -d="M341 85h31l-31 31v-31zM299 85v74l-12 12h-74v-86h86zM171 213v74l-12 12h-74v-86h86zM171 85v86h-86v-86h86zM85 372v-31h31zM213 244v-31h31zM27 485l458 -458l-27 -27l-43 43h-330q-17 0 -29.5 12.5t-12.5 29.5v330l-43 43zM341 427v-86h86v86h-86zM171 427h-31 -l-43 42h330q17 0 29.5 -12.5t12.5 -29.5v-330l-42 43v31h-31l-43 42h74v86h-86v-74l-42 43v31h-31l-43 42h74v86h-86v-74l-42 43v31z" /> - <glyph glyph-name="uniE3EC" unicode="grid_on" -d="M427 341v86h-86v-86h86zM427 213v86h-86v-86h86zM427 85v86h-86v-86h86zM299 341v86h-86v-86h86zM299 213v86h-86v-86h86zM299 85v86h-86v-86h86zM171 341v86h-86v-86h86zM171 213v86h-86v-86h86zM171 85v86h-86v-86h86zM427 469q17 0 29.5 -12.5t12.5 -29.5v-342 -q0 -17 -12.5 -29.5t-29.5 -12.5h-342q-17 0 -29.5 12.5t-12.5 29.5v342q0 17 12.5 29.5t29.5 12.5h342z" /> - <glyph glyph-name="uniE3ED" unicode="hdr_off" -d="M53 459q98 -99 408 -406l-24 -23l-162 162h-72v73l-32 32v-105h-32v53h-43v-53h-32v128h32v-43h43v43h8l-117 117zM277 288h-8l-32 32h40q13 0 22.5 -9.5t9.5 -22.5v-41l-32 32v9zM373 288v-21h43v21h-43zM373 192h-8l-24 23v105h75q13 0 22.5 -9.5t9.5 -22.5v-21 -q0 -23 -19 -30l19 -45h-32l-19 43h-24v-43z" /> - <glyph glyph-name="uniE3EE" unicode="hdr_on" -d="M277 224v64h-42v-64h42zM277 320q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-74v128h74zM139 277v43h32v-128h-32v53h-43v-53h-32v128h32v-43h43zM416 267v21h-43v-21h43zM448 267q0 -20 -19 -30l19 -45h-32l-19 43h-24v-43h-32v128h75q13 0 22.5 -9.5 -t9.5 -22.5v-21z" /> - <glyph glyph-name="uniE3F1" unicode="hdr_strong" -d="M107 213q17 0 29.5 13t12.5 30t-12.5 30t-29.5 13t-30 -13t-13 -30t13 -30t30 -13zM107 341q35 0 60 -25t25 -60t-25 -60t-60 -25t-60.5 25t-25.5 60t25.5 60t60.5 25zM363 384q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5 -t90.5 37.5z" /> - <glyph glyph-name="uniE3F2" unicode="hdr_weak" -d="M363 171q35 0 60 25t25 60t-25 60t-60 25t-60.5 -25t-25.5 -60t25.5 -60t60.5 -25zM363 384q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5zM107 341q35 0 60 -25t25 -60t-25 -60t-60 -25t-60.5 25t-25.5 60t25.5 60 -t60.5 25z" /> - <glyph glyph-name="uniE3F3" unicode="healing" -d="M355 78l78 78l-78 77l-77 -78zM299 277q-9 0 -15.5 -6t-6.5 -15t6.5 -15t15.5 -6t15 6t6 15t-6 15t-15 6zM256 192q9 0 15 6t6 15t-6 15.5t-15 6.5t-15 -6.5t-6 -15.5t6 -15t15 -6zM213 235q9 0 15.5 6t6.5 15t-6.5 15t-15.5 6t-15 -6t-6 -15t6 -15t15 -6zM156 278l77 78 -l-77 77l-78 -78zM256 320q-9 0 -15 -6t-6 -15t6 -15.5t15 -6.5t15 6.5t6 15.5t-6 15t-15 6zM378 256l85 -85q6 -6 6 -15t-6 -15l-92 -93q-6 -6 -15 -6q-10 0 -16 6l-84 85l-85 -85q-6 -6 -15 -6t-15 6l-93 93q-6 6 -6 15t6 15l85 85l-85 84q-6 6 -6 15.5t6 15.5l93 92 -q6 6 15 6t15 -6l85 -85l84 85q6 6 15.5 6t15.5 -6l92 -92q6 -6 6 -15.5t-6 -15.5z" /> - <glyph glyph-name="uniE3F4" unicode="image" -d="M181 224l-74 -96h298l-96 128l-74 -96zM448 107q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298q17 0 30 -13t13 -30v-298z" /> - <glyph glyph-name="uniE3F5" unicode="image_aspect_ratio" -d="M427 128v256h-342v-256h342zM427 427q17 0 29.5 -13t12.5 -30v-256q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h342zM256 299v-43h-43v43h43zM171 299v-43h-43v43h43zM341 213v-42h-42v42h42zM341 299v-43h-42v43h42z" /> - <glyph glyph-name="uniE3F6" unicode="iso" -d="M363 149h-107v32h107v-32zM405 107v298l-298 -298h298zM117 352v-32h43v-43h32v43h43v32h-43v43h-32v-43h-43zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniE3F7" unicode="landscape" -d="M299 384l192 -256h-470l128 171l96 -128l34 25l-60 81z" /> - <glyph glyph-name="uniE3F8" unicode="leak_add" -d="M299 64q0 62 43.5 105.5t105.5 43.5v-42q-44 0 -75.5 -31.5t-31.5 -75.5h-42zM384 64q0 26 19 45t45 19v-64h-64zM213 64q0 97 69 166t166 69v-43q-80 0 -136 -56t-56 -136h-43zM213 448q0 -62 -43.5 -105.5t-105.5 -43.5v42q44 0 75.5 31.5t31.5 75.5h42zM299 448 -q0 -97 -69 -166t-166 -69v43q80 0 136 56t56 136h43zM128 448q0 -26 -19 -45t-45 -19v64h64z" /> - <glyph glyph-name="uniE3F9" unicode="leak_remove" -d="M328 265q57 34 120 34v-43q-47 0 -89 -22zM425 168l-34 34q27 11 57 11v-42q-12 0 -23 -3zM299 448q0 -63 -34 -120l-31 31q22 42 22 89h43zM64 421l27 27l357 -357l-27 -27l-61 61q-19 -27 -19 -61h-42q0 50 31 91l-31 30q-43 -53 -43 -121h-43q0 86 56 152l-53 53 -q-66 -56 -152 -56v43q69 0 122 43l-31 31q-41 -31 -91 -31v42q34 0 61 19zM213 448q0 -30 -11 -57l-34 34q3 11 3 23h42z" /> - <glyph glyph-name="uniE3FA" unicode="lens" -d="M256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE3FB" unicode="looks_3" -d="M320 288v32q0 18 -12.5 30.5t-29.5 12.5h-86v-43h86v-43h-43v-42h43v-43h-86v-43h86q17 0 29.5 12.5t12.5 30.5v32q0 14 -9 23t-23 9q14 0 23 9t9 23zM406 448q17 0 29.5 -13t12.5 -30v-298q0 -17 -12.5 -30t-29.5 -13h-299q-17 0 -30 13t-13 30v298q0 17 13 30t30 13 -h299z" /> - <glyph glyph-name="uniE3FC" unicode="looks" -d="M256 384q97 0 166 -69t69 -166h-43q0 79 -56 135.5t-136 56.5t-136 -56.5t-56 -135.5h-43q0 97 69 166t166 69zM256 299q61 0 105 -44t44 -106h-42q0 44 -31.5 75.5t-75.5 31.5t-75.5 -31.5t-31.5 -75.5h-42q0 62 44 106t105 44z" /> - <glyph glyph-name="uniE3FD" unicode="looks_4" -d="M320 149v214h-43v-86h-42v86h-43v-128h85v-86h43zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniE3FE" unicode="looks_5" -d="M320 320v43h-128v-128h85v-43h-85v-43h85q17 0 30 12.5t13 30.5v43q0 18 -12.5 30t-30.5 12h-42v43h85zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniE3FF" unicode="looks_6" -d="M320 320v43h-85q-17 0 -30 -12.5t-13 -30.5v-128q0 -18 13 -30.5t30 -12.5h42q17 0 30 12.5t13 30.5v43q0 18 -12.5 30t-30.5 12h-42v43h85zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298zM235 192v43h42 -v-43h-42z" /> - <glyph glyph-name="uniE400" unicode="looks_one" -d="M299 149v214h-86v-43h43v-171h43zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniE401" unicode="looks_two" -d="M320 277v43q0 18 -13 30.5t-30 12.5h-85v-43h85v-43h-42q-18 0 -30.5 -12t-12.5 -30v-86h128v43h-85v43h42q18 0 30.5 12t12.5 30zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniE402" unicode="loupe" -d="M256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5v-171q0 -17 -12.5 -29.5t-29.5 -12.5h-171q-88 0 -150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5zM277 363v-86 -h86v-42h-86v-86h-42v86h-86v42h86v86h42z" /> - <glyph glyph-name="uniE403" unicode="monochrome_photos" -d="M427 107v256h-171v-22q45 0 76 -30.5t31 -75.5t-31 -76t-76 -31v38q-28 0 -48 20t-20 49t20 48.5t48 19.5v-137q28 0 48 20t20 49t-20 48.5t-48 19.5v38q-45 0 -76 -30.5t-31 -75.5t31 -76t76 -31v-21h171zM427 405q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30 -t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 29.5t29.5 12.5h69l38 43h128l38 -43h69z" /> - <glyph glyph-name="uniE404" unicode="movie_creation" -d="M384 427h85v-299q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h22l42 -86h64l-42 86h42l43 -86h64l-43 86h43l43 -86h64z" /> - <glyph glyph-name="uniE405" unicode="music_note" -d="M256 448h128v-85h-85v-214q0 -35 -25.5 -60t-60.5 -25t-60 25t-25 60t25 60.5t60 25.5q21 0 43 -12v225z" /> - <glyph glyph-name="uniE406" unicode="nature" -d="M277 168v-83h128v-42h-298v42h128v84q-54 9 -89.5 50.5t-35.5 96.5q0 62 44 106t106 44t105.5 -44t43.5 -106q0 -57 -38 -99t-94 -49z" /> - <glyph glyph-name="uniE407" unicode="nature_people" -d="M96 277q-14 0 -23 9.5t-9 22.5t9 22.5t23 9.5t23 -9.5t9 -22.5t-9 -22.5t-23 -9.5zM473 316q0 -57 -38 -99t-94 -49v-83h64v-42h-341v106h-21v86q0 9 6 15t15 6h64q9 0 15 -6t6 -15v-86h-21v-64h171v84q-54 9 -89.5 50.5t-35.5 96.5q0 62 44 106t106 44t105.5 -44 -t43.5 -106z" /> - <glyph glyph-name="uniE408" unicode="navigate_before" -d="M329 354l-98 -98l98 -98l-30 -30l-128 128l128 128z" /> - <glyph glyph-name="uniE409" unicode="navigate_next" -d="M213 384l128 -128l-128 -128l-30 30l98 98l-98 98z" /> - <glyph glyph-name="uniE40A" unicode="palette" -d="M373 256q13 0 22.5 9t9.5 23t-9.5 23t-22.5 9t-22.5 -9t-9.5 -23t9.5 -23t22.5 -9zM309 341q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5t9.5 -22.5t22.5 -9.5zM203 341q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5 -t9.5 -22.5t22.5 -9.5zM139 256q13 0 22.5 9t9.5 23t-9.5 23t-22.5 9t-22.5 -9t-9.5 -23t9.5 -23t22.5 -9zM256 448q79 0 135.5 -50t56.5 -121q0 -44 -31.5 -75t-75.5 -31h-37q-14 0 -23 -9.5t-9 -22.5q0 -11 8 -21t8 -22q0 -14 -9 -23t-23 -9q-80 0 -136 56t-56 136t56 136 -t136 56z" /> - <glyph glyph-name="uniE40B" unicode="panorama" -d="M181 245l-74 -96h298l-96 128l-74 -96zM491 128q0 -17 -13 -30t-30 -13h-384q-17 0 -30 13t-13 30v256q0 17 13 30t30 13h384q17 0 30 -13t13 -30v-256z" /> - <glyph glyph-name="uniE40C" unicode="panorama_fish_eye" -d="M256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE40D" unicode="panorama_horizontal" -d="M457 427q12 0 12 -14v-314q0 -14 -12 -14q-2 0 -6 2q-96 35 -195 35t-195 -35q-4 -2 -6 -2q-12 0 -12 14v314q0 14 12 14q2 0 6 -2q96 -35 195 -35t195 35q4 2 6 2zM427 372q-78 -24 -171 -24q-88 0 -171 24v-232q82 24 171 24q88 0 171 -24v232z" /> - <glyph glyph-name="uniE40E" unicode="panorama_vertical" -d="M140 85h232q-24 83 -24 171t24 171h-232q24 -82 24 -171q0 -88 -24 -171zM425 61q2 -4 2 -6q0 -12 -14 -12h-314q-14 0 -14 12q0 2 2 6q35 96 35 195t-35 195q-2 4 -2 6q0 12 14 12h314q14 0 14 -12q0 -2 -2 -6q-35 -96 -35 -195t35 -195z" /> - <glyph glyph-name="uniE40F" unicode="panorama_wide_angle" -d="M256 427q77 0 170 -16l19 -3l6 -19q18 -66 18 -133t-18 -133l-6 -19l-19 -3q-93 -16 -170 -16t-170 16l-19 3l-6 19q-18 66 -18 133t18 133l6 19l19 3q93 16 170 16zM256 384q-70 0 -156 -14q-15 -57 -15 -114t15 -114q86 -14 156 -14t156 14q15 57 15 114t-15 114 -q-86 14 -156 14z" /> - <glyph glyph-name="uniE410" unicode="photo" -d="M181 224l-74 -96h298l-96 128l-74 -96zM448 107q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298q17 0 30 -13t13 -30v-298z" /> - <glyph glyph-name="uniE411" unicode="photo_album" -d="M128 107h256l-82 109l-64 -82l-46 55zM128 427v-171l53 32l54 -32v171h-107zM384 469q17 0 30 -12.5t13 -29.5v-342q0 -17 -13 -29.5t-30 -12.5h-256q-17 0 -30 12.5t-13 29.5v342q0 17 13 29.5t30 12.5h256z" /> - <glyph glyph-name="uniE412" unicode="photo_camera" -d="M256 149q44 0 75.5 31.5t31.5 75.5t-31.5 75.5t-75.5 31.5t-75.5 -31.5t-31.5 -75.5t31.5 -75.5t75.5 -31.5zM192 469h128l39 -42h68q17 0 29.5 -13t12.5 -30v-256q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h68zM188 256 -q0 28 20 48t48 20t48 -20t20 -48t-20 -48t-48 -20t-48 20t-20 48z" /> - <glyph glyph-name="uniE413" unicode="photo_library" -d="M43 384h42v-299h299v-42h-299q-17 0 -29.5 12.5t-12.5 29.5v299zM235 256l-64 -85h256l-86 106l-63 -79zM469 171q0 -17 -12.5 -30t-29.5 -13h-256q-17 0 -30 13t-13 30v256q0 17 13 29.5t30 12.5h256q17 0 29.5 -12.5t12.5 -29.5v-256z" /> - <glyph glyph-name="uniE415" unicode="picture_as_pdf" -d="M299 267v64h21v-64h-21zM85 384v-299h299v-42h-299q-17 0 -29.5 12.5t-12.5 29.5v299h42zM192 309v22h21v-22h-21zM437 331v32h-64v-128h32v42h32v32h-32v22h32zM352 267v64q0 13 -9 22.5t-23 9.5h-53v-128h53q14 0 23 9.5t9 22.5zM245 309v22q0 13 -9.5 22.5t-22.5 9.5 -h-53v-128h32v42h21q13 0 22.5 9.5t9.5 22.5zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-256q-17 0 -30 13t-13 30v256q0 17 13 29.5t30 12.5h256z" /> - <glyph glyph-name="uniE416" unicode="portrait" -d="M405 107v298h-298v-298h298zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298zM352 165v-16h-192v16q0 22 33 35t63 13t63 -13t33 -35zM256 251q-20 0 -34 14.5t-14 33.5t14 33.5t34 14.5t34 -14.5t14 -33.5 -t-14 -33.5t-34 -14.5z" /> - <glyph glyph-name="uniE417" unicode="remove_red_eye" -d="M256 320q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM256 149q44 0 75.5 31.5t31.5 75.5t-31.5 75.5t-75.5 31.5t-75.5 -31.5t-31.5 -75.5t31.5 -75.5t75.5 -31.5zM256 416q79 0 143 -44t92 -116q-28 -72 -92 -116t-143 -44t-143 44t-92 116 -q28 72 92 116t143 44z" /> - <glyph glyph-name="uniE418" unicode="rotate_90_degrees_ccw" -d="M413 370q56 -56 56 -135.5t-56 -135.5q-55 -56 -136 -56q-49 0 -92 24l32 31q27 -13 60 -13q62 0 106 44q43 43 43 105t-43 106q-44 44 -106 44v-69l-90 90l90 91v-69q81 0 136 -57zM79 237l78 -78l78 78l-78 78zM157 375l138 -138l-138 -138l-139 138z" /> - <glyph glyph-name="uniE419" unicode="rotate_left" -d="M277 425q63 -8 106.5 -56t43.5 -113t-43.5 -113t-106.5 -56v43q46 8 76.5 43.5t30.5 82.5t-30.5 82.5t-76.5 43.5v-83l-97 95l97 97v-66zM151 121l31 31q23 -17 53 -22v-43q-48 6 -84 34zM130 235q5 -29 21 -53l-30 -30q-28 37 -34 83h43zM152 330q-18 -26 -22 -53h-43 -q6 45 35 83z" /> - <glyph glyph-name="uniE41A" unicode="rotate_right" -d="M360 182q17 23 22 53h43q-6 -46 -34 -83zM277 130q30 5 53 22l31 -31q-36 -28 -84 -34v43zM425 277h-43q-5 30 -22 53l31 30q28 -37 34 -83zM332 394l-97 -95v83q-46 -8 -76.5 -43.5t-30.5 -82.5t30.5 -82.5t76.5 -43.5v-43q-63 8 -106.5 56t-43.5 113t43.5 113t106.5 56 -v66z" /> - <glyph glyph-name="uniE41B" unicode="slideshow" -d="M405 107v298h-298v-298h298zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298zM213 341l107 -85l-107 -85v170z" /> - <glyph glyph-name="uniE41C" unicode="straighten" -d="M448 171v170h-43v-85h-42v85h-43v-85h-43v85h-42v-85h-43v85h-43v-85h-42v85h-43v-170h384zM448 384q17 0 30 -13t13 -30v-170q0 -17 -13 -30t-30 -13h-384q-17 0 -30 13t-13 30v170q0 17 13 30t30 13h384z" /> - <glyph glyph-name="uniE41D" unicode="style" -d="M125 91v135l74 -178h-31q-17 0 -30 13t-13 30zM168 325q9 0 15 6.5t6 15.5t-6 15t-15 6t-15 -6t-6 -15t6 -15.5t15 -6.5zM470 172q7 -16 0 -32.5t-23 -23.5l-157 -65q-8 -3 -17 -3q-28 0 -39 26l-106 256q-3 9 -3 17q0 27 26 38l158 65q9 3 17 3q27 0 38 -26zM54 93 -q-16 7 -23 23t0 32l52 125v-192z" /> - <glyph glyph-name="uniE41E" unicode="switch_camera" -d="M320 181l75 75l-75 75v-54h-128v54l-75 -75l75 -75v54h128v-54zM427 427q17 0 29.5 -13t12.5 -30v-256q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h68l39 42h128l39 -42h68z" /> - <glyph glyph-name="uniE41F" unicode="switch_video" -d="M277 181l75 75l-75 75v-54h-128v54l-74 -75l74 -75v54h128v-54zM384 309l85 86v-278l-85 86v-75q0 -9 -6 -15t-15 -6h-299q-9 0 -15 6t-6 15v256q0 9 6 15t15 6h299q9 0 15 -6t6 -15v-75z" /> - <glyph glyph-name="uniE420" unicode="tag_faces" -d="M256 139q-37 0 -66.5 20.5t-42.5 53.5h218q-13 -33 -42.5 -53.5t-66.5 -20.5zM181 277q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5zM331 277q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5t-9.5 -22.5 -t-22.5 -9.5zM256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE421" unicode="texture" -d="M198 64l250 250v-61l-189 -189h-61zM448 107q0 -17 -13 -30t-30 -13h-42l85 85v-42zM107 448h42l-85 -85v42q0 17 13 30t30 13zM253 448h61l-250 -250v61zM416 446q25 -7 31 -30l-351 -350q-23 7 -30 30z" /> - <glyph glyph-name="uniE422" unicode="timelapse" -d="M256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5zM346 346q38 -38 38 -90t-37 -90 -t-90 -38t-91 38l90 90v128q52 0 90 -38z" /> - <glyph glyph-name="uniE423" unicode="timer_10" -d="M275 230v54q0 36 -10 53q-7 15 -30 15q-10 0 -18 -3q-23 -14 -23 -66v-53q0 -24 2 -33q1 -5 9 -21t30 -16t30 16q6 12 8 21t2 33zM152 277q0 109 83 109q41 0 60 -24q22 -28 22 -85v-41q0 -110 -82 -110q-83 0 -83 110v41zM436 289q-30 0 -30 -23q0 -3 0.5 -5.5t1.5 -4 -l2 -3t3 -2.5l3 -1.5t4.5 -2t4.5 -1.5q9 -4 19 -5q9 -2 28 -8q8 -3 22 -12q8 -5 13 -16q5 -10 5 -21q0 -37 -44 -52q-12 -4 -30 -4q-57 0 -74 39q-5 12 -5 22h41q0 -30 38 -30q33 0 33 23q0 6 -3 10.5t-6 6t-10 4.5t-24.5 7.5t-23.5 6.5q-8 3 -20 11q-19 13 -19 36 -q0 38 42 52q12 4 29 4q33 0 54 -15t21 -44h-42q0 21 -18 25q-12 3 -15 3zM0 347l101 37h6v-256h-43v205l-64 -22v36z" /> - <glyph glyph-name="uniE424" unicode="timer_3" -d="M374 289q-31 0 -31 -23q0 -3 0.5 -5t1 -3.5t2 -3t2.5 -2t3 -2t3 -1.5t4 -1.5t4 -1.5q9 -4 18 -5q11 -2 29 -8q8 -3 22 -12q7 -5 13 -16q5 -10 5 -21q0 -37 -44 -52q-12 -4 -31 -4q-56 0 -73 39q-5 12 -5 22h40q0 -15 11 -22.5t28 -7.5q33 0 33 23q0 6 -3 10.5t-6 6 -t-10 4.5q-5 2 -21 6q-28 6 -48 19q-18 12 -18 36q0 38 42 52q12 4 29 4q33 0 54 -15t21 -44h-42q0 20 -19 25q-12 3 -14 3zM215 259q42 -16 42 -58q0 -37 -24 -55q-23 -20 -60 -20t-60.5 19t-23.5 53h43q0 -20 11 -28q13 -10 30 -10q42 0 42 41t-46 41h-26v33h25q32 0 41 23 -q2 5 2 16q0 38 -38 38q-26 0 -36 -20q-3 -6 -3 -15h-42q0 45 48 64q17 5 33 5q38 0 59 -18t21 -54t-38 -55z" /> - <glyph glyph-name="uniE425" unicode="timer" -d="M256 85q62 0 105.5 44t43.5 106t-43.5 105.5t-105.5 43.5t-105.5 -43.5t-43.5 -105.5t43.5 -106t105.5 -44zM406 354q42 -53 42 -119q0 -79 -56 -135.5t-136 -56.5t-136 56.5t-56 135.5t56 135.5t136 56.5q65 0 120 -43l30 31q16 -13 30 -30zM235 213v128h42v-128h-42z -M320 491v-43h-128v43h128z" /> - <glyph glyph-name="uniE426" unicode="timer_off" -d="M256 85q39 0 75 21l-204 204q-20 -34 -20 -75q0 -62 43.5 -106t105.5 -44zM64 427l379 -379l-27 -27l-54 54q-50 -32 -106 -32q-80 0 -136 56.5t-56 135.5q0 58 32 106l-59 59zM235 311v30h42v-73zM320 491v-43h-128v43h128zM406 415l30 -30l-30 -31q42 -53 42 -119 -q0 -58 -32 -106l-31 31q20 34 20 75q0 62 -43.5 105.5t-105.5 43.5q-40 0 -74 -20l-32 31q48 32 106 32q67 0 120 -42z" /> - <glyph glyph-name="uniE427" unicode="tonality" -d="M421 213q2 6 4 22h-148v-22h144zM389 149q12 17 15 22h-127v-22h112zM277 87q32 4 62 20h-62v-20zM277 299v-22h148q-2 16 -4 22h-144zM277 363v-22h127q-3 5 -15 22h-112zM277 425v-20h62q-30 16 -62 20zM235 87v338q-63 -8 -106.5 -56t-43.5 -113t43.5 -113t106.5 -56z -M256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE428" unicode="transform" -d="M213 341v43h128q17 0 30 -13t13 -30v-128h-43v128h-128zM469 128h-85v-43h43l-64 -64l-64 64h42v43h-170q-17 0 -30 13t-13 30v170h-85v43h85v43h-43l64 64l64 -64h-42v-256h298v-43z" /> - <glyph glyph-name="uniE429" unicode="tune" -d="M320 320v128h43v-43h85v-42h-85v-43h-43zM448 235h-213v42h213v-42zM149 320h43v-128h-43v43h-85v42h85v43zM277 64h-42v128h42v-43h171v-42h-171v-43zM64 405h213v-42h-213v42zM64 149h128v-42h-128v42z" /> - <glyph glyph-name="uniE42A" unicode="view_comfortable" -d="M384 405h85v-85h-85v85zM384 107v85h85v-85h-85zM277 107v85h86v-85h-86zM171 107v85h85v-85h-85zM64 107v85h85v-85h-85zM384 213v86h85v-86h-85zM277 405h86v-85h-86v85zM171 320v85h85v-85h-85zM277 213v86h86v-86h-86zM171 213v86h85v-86h-85zM64 213v86h85v-86h-85z -M64 320v85h85v-85h-85z" /> - <glyph glyph-name="uniE42B" unicode="view_compact" -d="M64 405h405v-128h-405v128zM213 107v149h256v-149h-256zM64 107v149h128v-149h-128z" /> - <glyph glyph-name="uniE42C" unicode="wb_auto" -d="M220 171h40l-68 192h-43l-68 -192h41l15 42h68zM469 363h39l-44 -192h-37l-32 130l-32 -130h-38l-2 9q-21 -43 -62 -69t-90 -26q-71 0 -121 50.5t-50 120.5t50 120.5t121 50.5q82 0 133 -64h16l26 -135l32 135h34l32 -135zM146 242l25 78l24 -78h-49z" /> - <glyph glyph-name="uniE42D" unicode="wb_cloudy" -d="M413 298q41 -3 70 -33.5t29 -72.5q0 -44 -31.5 -75.5t-75.5 -31.5h-277q-53 0 -90.5 37.5t-37.5 90.5q0 49 33 85.5t81 41.5q21 39 59 63t83 24q58 0 102 -36.5t55 -92.5z" /> - <glyph glyph-name="uniE42E" unicode="wb_incandescent" -d="M368 125l30 29l38 -38l-30 -30zM427 288h64v-43h-64v43zM320 377q29 -17 46.5 -46t17.5 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5q0 35 17.5 64t46.5 46v103h128v-103zM85 288v-43h-64v43h64zM235 33v63h42v-63h-42zM76 116l38 39l30 -30l-38 -39z" /> - <glyph glyph-name="uniE430" unicode="wb_sunny" -d="M76 116l38 39l30 -30l-38 -39zM235 33v63h42v-63h-42zM256 395q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5zM427 288h64v-43h-64v43zM368 125l30 29l38 -38l-30 -30zM436 417l-38 -38l-30 30l38 38zM277 500v-63 -h-42v63h42zM85 288v-43h-64v43h64zM144 409l-30 -30l-38 38l30 30z" /> - <glyph glyph-name="uniE431" unicode="collections_bookmark" -d="M427 256v171h-107v-171l53 32zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-256q-17 0 -30 13t-13 30v256q0 17 13 29.5t30 12.5h256zM85 384v-299h299v-42h-299q-17 0 -29.5 12.5t-12.5 29.5v299h42z" /> - <glyph glyph-name="uniE432" unicode="photo_size_select_actual" -d="M107 149h298l-96 128l-74 -96l-54 64zM448 448q16 0 29.5 -13.5t13.5 -29.5v-298q0 -16 -13.5 -29.5t-29.5 -13.5h-384q-17 0 -30 13t-13 30v298q0 16 13.5 29.5t29.5 13.5h384z" /> - <glyph glyph-name="uniE433" unicode="photo_size_select_large" -d="M64 107h213l-68 91l-53 -69l-39 46zM21 277h299v-213h-256q-17 0 -30 13t-13 30v170zM107 448h42v-43h-42v43zM192 448h43v-43h-43v43zM64 448v-43h-43q0 16 13.5 29.5t29.5 13.5zM363 107h42v-43h-42v43zM363 448h42v-43h-42v43zM21 363h43v-43h-43v43zM448 448 -q16 0 29.5 -13.5t13.5 -29.5h-43v43zM448 363h43v-43h-43v43zM277 448h43v-43h-43v43zM491 107q0 -16 -13.5 -29.5t-29.5 -13.5v43h43zM448 277h43v-42h-43v42zM448 192h43v-43h-43v43z" /> - <glyph glyph-name="uniE434" unicode="photo_size_select_small" -d="M149 448v-43h-42v43h42zM235 448v-43h-43v43h43zM64 277v-42h-43v42h43zM64 448v-43h-43q0 16 13.5 29.5t29.5 13.5zM405 107v-43h-42v43h42zM405 448v-43h-42v43h42zM320 107v-43h-43v43h43zM64 363v-43h-43v43h43zM64 64q-17 0 -30 13t-13 30v85h214v-128h-171z -M448 448q16 0 29.5 -13.5t13.5 -29.5h-43v43zM491 363v-43h-43v43h43zM320 448v-43h-43v43h43zM491 107q0 -16 -13.5 -29.5t-29.5 -13.5v43h43zM491 277v-42h-43v42h43zM491 192v-43h-43v43h43z" /> - <glyph glyph-name="uniE435" unicode="vignette" -d="M256 128q71 0 121 37.5t50 90.5t-50 90.5t-121 37.5t-121 -37.5t-50 -90.5t50 -90.5t121 -37.5zM448 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-384q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h384z" /> - <glyph glyph-name="uniE436" unicode="wb_iridescent" -d="M106 86l-30 31l38 38l30 -30zM76 417l30 30l38 -38l-30 -30zM436 116l-30 -30l-38 39l30 30zM277 33h-42v63h42v-63zM406 447l30 -30l-38 -38l-30 30zM235 500h42v-63h-42v63zM107 203v128h298v-128h-298z" /> - <glyph glyph-name="uniE437" unicode="crop_rotate" -d="M171 171h256v-43h-43v-43h-43v43h-170q-18 0 -30.5 13t-12.5 30v170h-43v43h43v43h43v-256zM341 213v128h-128v43h128q17 0 30 -12.5t13 -30.5v-128h-43zM257 512q100 0 173.5 -68t81.5 -167h-32q-6 60 -40 108t-87 73l-29 -28l-81 81q3 0 7 0.5t7 0.5zM159 54l29 28 -l81 -81q-3 0 -7 -0.5t-7 -0.5q-100 0 -173.5 68t-81.5 167h32q6 -60 40 -108t87 -73z" /> - <glyph glyph-name="uniE438" unicode="linked_camera" -d="M341 384q18 0 30.5 -12.5t12.5 -30.5h28q0 29 -21 50t-50 21v-28v0zM256 107q44 0 75.5 31t31.5 75t-31.5 75.5t-75.5 31.5t-75.5 -31.5t-31.5 -75.5t31.5 -75t75.5 -31zM363 320h106v-235q0 -17 -12.5 -29.5t-29.5 -12.5h-342q-17 0 -29.5 12.5t-12.5 29.5v256 -q0 17 12.5 30t29.5 13h68l39 43h128v-64q18 0 30.5 -12.5t12.5 -30.5zM341 441v28q53 0 90.5 -37.5t37.5 -90.5h-28q0 41 -29.5 70.5t-70.5 29.5zM188 213q0 29 20 49t48 20t48 -20t20 -49t-20 -48.5t-48 -19.5t-48 19.5t-20 48.5z" /> - <glyph glyph-name="uniE439" unicode="add_a_photo" -d="M209 213q0 29 20 49t48 20q29 0 49 -20t20 -49q0 -28 -20 -48t-49 -20t-48.5 19.5t-19.5 48.5zM277 107q44 0 75.5 31t31.5 75t-31.5 75.5t-75.5 31.5t-75 -31.5t-31 -75.5t31 -75t75 -31zM128 299v64h64v64h149l39 -43h68q17 0 30 -13t13 -30v-256q0 -17 -13 -29.5 -t-30 -12.5h-341q-17 0 -30 12.5t-13 29.5v214h64zM64 427v64h43v-64h64v-43h-64v-64h-43v64h-64v43h64z" /> - <glyph glyph-name="uniE43A" unicode="movie_filter" -d="M361 257l44 20l-44 20l-20 44l-20 -44l-44 -20l44 -20l20 -44zM240 187l59 26l-59 27l-27 59l-26 -59l-59 -27l59 -26l26 -59zM384 427h85v-299q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h22l42 -64h64l-42 64h42l43 -64h64 -l-43 64h43l43 -64h64z" /> - <glyph glyph-name="uniE43B" unicode="photo_filter" -d="M283 283l58 -27l-58 -27l-27 -58l-27 58l-58 27l58 27l27 58zM363 299l-20 44l-44 20l44 20l20 44l20 -44l44 -20l-44 -20zM406 299h42v-192q0 -17 -12.5 -30t-29.5 -13h-299q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h192v-43h-192v-298h299v192z" /> - <glyph glyph-name="uniE43C" unicode="burst_mode" -d="M235 149h213l-68 90l-54 -68l-38 46zM469 405q9 0 15.5 -6t6.5 -15v-256q0 -9 -6.5 -15t-15.5 -6h-256q-9 0 -15 6t-6 15v256q0 9 6 15t15 6h256zM107 405h42v-298h-42v298zM21 405h43v-298h-43v298z" /> - <glyph glyph-name="uniE52D" unicode="beenhere" -d="M213 171l192 192l-30 30l-162 -162l-76 76l-30 -30zM405 491q17 0 30 -13t13 -30v-276q0 -21 -19 -35l-173 -116l-173 116q-19 14 -19 35v276q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniE52E" unicode="directions" -d="M299 203l74 74l-74 75v-53h-107q-9 0 -15 -6.5t-6 -15.5v-85h42v64h86v-53zM463 271q14 -16 0 -30l-192 -192q-6 -6 -15 -6t-15 6l-192 192q-6 6 -6 15t6 15l192 192q6 6 15 6t15 -6z" /> - <glyph glyph-name="uniE52F" unicode="directions_bike" -d="M405 75q31 0 53 21.5t22 52.5t-22 53t-53 22t-52.5 -22t-21.5 -53t21.5 -52.5t52.5 -21.5zM405 256q45 0 76 -31t31 -76t-31 -75.5t-76 -30.5t-75.5 30.5t-30.5 75.5t30.5 76t75.5 31zM230 288l47 -49v-132h-42v106l-69 60q-12 8 -12 30q0 18 12 30l60 60q8 12 30 12 -q19 0 34 -12l41 -41q32 -32 76 -32v-43q-63 0 -108 45l-17 17zM107 75q31 0 52.5 21.5t21.5 52.5t-21.5 53t-52.5 22t-53 -22t-22 -53t22 -52.5t53 -21.5zM107 256q45 0 75.5 -31t30.5 -76t-30.5 -75.5t-75.5 -30.5t-76 30.5t-31 75.5t31 76t76 31zM331 395q-17 0 -30 12.5 -t-13 29.5t13 30t30 13t29.5 -13t12.5 -30t-12.5 -29.5t-29.5 -12.5z" /> - <glyph glyph-name="uniE530" unicode="directions_bus" -d="M384 277v107h-256v-107h256zM352 149q14 0 23 9.5t9 22.5t-9 22.5t-23 9.5t-23 -9.5t-9 -22.5t9 -22.5t23 -9.5zM160 149q14 0 23 9.5t9 22.5t-9 22.5t-23 9.5t-23 -9.5t-9 -22.5t9 -22.5t23 -9.5zM85 171v213q0 51 44 68t127 17t127 -17t44 -68v-213q0 -28 -22 -48v-38 -q0 -9 -6 -15t-15 -6h-21q-9 0 -15.5 6t-6.5 15v22h-170v-22q0 -9 -6.5 -15t-15.5 -6h-21q-9 0 -15 6t-6 15v38q-22 20 -22 48z" /> - <glyph glyph-name="uniE531" unicode="directions_car" -d="M107 277h298l-32 96h-234zM373 171q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5t9.5 -22.5t22.5 -9.5zM139 171q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5t9.5 -22.5t22.5 -9.5zM404 384l44 -128v-171q0 -9 -6 -15 -t-15 -6h-22q-9 0 -15 6t-6 15v22h-256v-22q0 -9 -6 -15t-15 -6h-22q-9 0 -15 6t-6 15v171l44 128q6 21 31 21h234q25 0 31 -21z" /> - <glyph glyph-name="uniE532" unicode="directions_ferry" -d="M128 384v-85l128 42l128 -42v85h-256zM84 107l-40 142q-7 20 14 27l27 9v99q0 17 13 30t30 13h64v64h128v-64h64q17 0 30 -13t13 -30v-99l27 -9q21 -7 14 -27l-40 -142h-1q-49 0 -86 42q-37 -42 -85 -42t-85 42q-37 -42 -86 -42h-1zM427 64h42v-43h-42q-45 0 -86 21 -q-85 -44 -170 0q-41 -21 -86 -21h-42v43h42q46 0 86 28q39 -27 85 -27t85 27q40 -28 86 -28z" /> - <glyph glyph-name="uniE533" unicode="directions_subway" -d="M384 277v107h-107v-107h107zM352 149q14 0 23 9.5t9 22.5t-9 22.5t-23 9.5t-23 -9.5t-9 -22.5t9 -22.5t23 -9.5zM235 277v107h-107v-107h107zM160 149q14 0 23 9.5t9 22.5t-9 22.5t-23 9.5t-23 -9.5t-9 -22.5t9 -22.5t23 -9.5zM256 469q83 0 127 -17t44 -68v-203 -q0 -31 -22 -52.5t-53 -21.5l32 -32v-11h-256v11l32 32q-31 0 -53 21.5t-22 52.5v203q0 51 44 68t127 17z" /> - <glyph glyph-name="uniE534" unicode="directions_railway" -d="M384 299v106h-256v-106h256zM256 149q17 0 30 13t13 30t-13 30t-30 13t-30 -13t-13 -30t13 -30t30 -13zM85 181v224q0 51 44 68.5t127 17.5t127 -17.5t44 -68.5v-224q0 -31 -22 -52.5t-53 -21.5l32 -32v-11h-256v11l32 32q-31 0 -53 21.5t-22 52.5z" /> - <glyph glyph-name="uniE535" unicode="directions_transit" -d="M384 277v107h-107v-107h107zM352 149q14 0 23 9.5t9 22.5t-9 22.5t-23 9.5t-23 -9.5t-9 -22.5t9 -22.5t23 -9.5zM235 277v107h-107v-107h107zM160 149q14 0 23 9.5t9 22.5t-9 22.5t-23 9.5t-23 -9.5t-9 -22.5t9 -22.5t23 -9.5zM256 469q83 0 127 -17t44 -68v-203 -q0 -31 -22 -52.5t-53 -21.5l32 -32v-11h-256v11l32 32q-31 0 -53 21.5t-22 52.5v203q0 51 44 68t127 17z" /> - <glyph glyph-name="uniE536" unicode="directions_walk" -d="M209 322l-60 -301h45l39 171l44 -43v-128h43v160l-45 43l13 64q46 -53 117 -53v42q-62 0 -91 52l-22 34q-15 21 -36 21q-3 0 -8.5 -1t-8.5 -1l-111 -47v-100h43v72l38 15v0zM288 395q-17 0 -30 12.5t-13 29.5t13 30t30 13t30 -13t13 -30t-13 -29.5t-30 -12.5z" /> - <glyph glyph-name="uniE539" unicode="flight" -d="M217 320zM448 171l-171 53v-117l43 -32v-32l-75 21l-74 -21v32l42 32v117l-170 -53v42l170 107v117q0 13 9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5v-117l171 -107v-42z" /> - <glyph glyph-name="uniE53A" unicode="hotel" -d="M405 363q35 0 60.5 -25.5t25.5 -60.5v-192h-43v64h-384v-64h-43v320h43v-192h171v150h170zM149 235q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19z" /> - <glyph glyph-name="uniE53B" unicode="layers" -d="M256 171q-9 7 -81.5 63.5t-110.5 85.5l192 149l192 -149q-38 -29 -110 -85t-82 -64zM256 116l157 123l35 -27l-192 -149l-192 149l35 27z" /> - <glyph glyph-name="uniE53C" unicode="layers_clear" -d="M70 491l399 -400l-27 -27l-80 81l-106 -82l-192 149l35 27l157 -123l75 59l-30 30l-45 -34q-9 7 -81.5 63.5t-110.5 85.5l69 54l-90 90zM448 320q-27 -21 -86 -67l-168 168l62 48zM423 192l-31 31l25 19l31 -30z" /> - <glyph glyph-name="uniE53D" unicode="local_airport" -d="M448 171l-171 53v-117l43 -32v-32l-75 21l-74 -21v32l42 32v117l-170 -53v42l170 107v117q0 13 9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5v-117l171 -107v-42z" /> - <glyph glyph-name="uniE53E" unicode="local_atm" -d="M427 128v256h-342v-256h342zM427 427q18 0 30 -12.5t12 -30.5v-256q0 -18 -12 -30.5t-30 -12.5h-342q-18 0 -30 12.5t-12 30.5v256q0 18 12 30.5t30 12.5h342zM235 149v22h-43v42h85v22h-64q-9 0 -15 6t-6 15v64q0 9 6 15t15 6h22v22h42v-22h43v-42h-85v-22h64q9 0 15 -6 -t6 -15v-64q0 -9 -6 -15t-15 -6h-22v-22h-42z" /> - <glyph glyph-name="uniE53F" unicode="local_attraction" -d="M332 154l-23 87l70 58l-90 5l-33 84l-33 -84l-91 -5l71 -58l-23 -87l76 49zM427 256q0 -17 12.5 -30t29.5 -13v-85q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v85q18 0 30 12.5t12 30.5q0 17 -12.5 30t-29.5 13v85q0 17 12.5 30t29.5 13h342q17 0 29.5 -13 -t12.5 -30v-85q-17 0 -29.5 -13t-12.5 -30z" /> - <glyph glyph-name="uniE540" unicode="local_bar" -d="M159 363h194l38 42h-270zM448 405l-171 -192v-106h107v-43h-256v43h107v106l-171 192v43h384v-43z" /> - <glyph glyph-name="uniE541" unicode="local_cafe" -d="M43 64v43h384v-43h-384zM427 341v64h-43v-64h43zM427 448q18 0 30 -12.5t12 -30.5v-64q0 -18 -12 -30t-30 -12h-43v-64q0 -35 -25 -60.5t-60 -25.5h-128q-35 0 -60.5 25.5t-25.5 60.5v213h342z" /> - <glyph glyph-name="uniE542" unicode="local_car_wash" -d="M107 235h298l-32 96h-234zM373 128q13 0 22.5 9t9.5 23t-9.5 23t-22.5 9t-22.5 -9t-9.5 -23t9.5 -23t22.5 -9zM139 128q13 0 22.5 9t9.5 23t-9.5 23t-22.5 9t-22.5 -9t-9.5 -23t9.5 -23t22.5 -9zM404 341l44 -128v-170q0 -9 -6 -15.5t-15 -6.5h-22q-9 0 -15 6.5t-6 15.5 -v21h-256v-21q0 -9 -6 -15.5t-15 -6.5h-22q-9 0 -15 6.5t-6 15.5v170l44 128q7 22 31 22h234q24 0 31 -22zM149 405q-13 0 -22.5 9.5t-9.5 22.5q0 9 8 23.5t16 24.5l8 10q32 -37 32 -58q0 -13 -9.5 -22.5t-22.5 -9.5zM256 405q-14 0 -23 9.5t-9 22.5q0 9 8 23.5t16 24.5l8 10 -q32 -37 32 -58q0 -13 -9 -22.5t-23 -9.5zM363 405q-13 0 -22.5 9.5t-9.5 22.5q0 9 8 23.5t16 24.5l8 10q32 -37 32 -58q0 -13 -9.5 -22.5t-22.5 -9.5z" /> - <glyph glyph-name="uniE543" unicode="local_convenience_store" -d="M341 256v107h-21v-43h-21v43h-22v-64h43v-43h21zM235 299v64h-64v-22h42v-21h-42v-64h64v21h-43v22h43zM405 363h64v-278h-170v86h-86v-86h-170v278h64v64h298v-64z" /> - <glyph glyph-name="uniE544" unicode="local_drink" -d="M391 341l9 86h-288l9 -86h270zM256 107q26 0 45 19t19 45q0 19 -16 48t-32 48l-16 19q-64 -72 -64 -115q0 -26 19 -45t45 -19zM64 469h384l-43 -389q-2 -16 -14 -26.5t-28 -10.5h-214q-16 0 -28 10.5t-14 26.5z" /> - <glyph glyph-name="uniE545" unicode="local_florist" -d="M256 395q-22 0 -37.5 -16t-15.5 -38t15.5 -37.5t37.5 -15.5t37.5 15.5t15.5 37.5t-15.5 38t-37.5 16zM119 293q0 33 31 48q-31 15 -31 48q0 22 16 38t38 16q15 0 30 -10v4q0 22 15.5 38t37.5 16t37.5 -16t15.5 -38v-4q15 10 30 10q22 0 38 -16t16 -38q0 -33 -31 -48 -q31 -15 31 -48q0 -22 -16 -37.5t-38 -15.5q-17 0 -30 9v-4q0 -22 -15.5 -37.5t-37.5 -15.5t-37.5 15.5t-15.5 37.5v4q-13 -9 -30 -9q-22 0 -38 15.5t-16 37.5zM256 43q-80 0 -136 56.5t-56 135.5q80 0 136 -56.5t56 -135.5zM256 43q0 79 56 135.5t136 56.5q0 -79 -56 -135.5 -t-136 -56.5z" /> - <glyph glyph-name="uniE546" unicode="local_gas_station" -d="M384 299q9 0 15 6t6 15t-6 15t-15 6t-15 -6t-6 -15t6 -15t15 -6zM256 299v106h-128v-106h128zM422 358q15 -15 15 -38v-203q0 -22 -15.5 -37.5t-37.5 -15.5t-37.5 15.5t-15.5 37.5v107h-32v-160h-214v341q0 17 13 30t30 13h128q17 0 30 -13t13 -30v-149h21q17 0 30 -13 -t13 -30v-96q0 -9 6 -15t15 -6t15 6t6 15v154q-9 -4 -21 -4q-22 0 -37.5 15.5t-15.5 37.5q0 36 34 50l-45 45l23 22z" /> - <glyph glyph-name="uniE547" unicode="local_grocery_store" -d="M363 128q17 0 29.5 -13t12.5 -30t-12.5 -29.5t-29.5 -12.5t-30 12.5t-13 29.5t13 30t30 13zM21 469h70l20 -42h316q9 0 15 -6.5t6 -15.5q0 -5 -3 -10l-76 -138q-12 -22 -37 -22h-159l-19 -35l-1 -3q0 -5 5 -5h247v-43h-256q-17 0 -29.5 13t-12.5 30q0 10 5 20l29 53 -l-77 162h-43v42zM149 128q17 0 30 -13t13 -30t-13 -29.5t-30 -12.5t-29.5 12.5t-12.5 29.5t12.5 30t29.5 13z" /> - <glyph glyph-name="uniE548" unicode="local_hospital" -d="M384 213v86h-85v85h-86v-85h-85v-86h85v-85h86v85h85zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniE549" unicode="local_hotel" -d="M405 363q35 0 60.5 -25.5t25.5 -60.5v-192h-43v64h-384v-64h-43v320h43v-192h171v150h170zM149 235q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19z" /> - <glyph glyph-name="uniE54A" unicode="local_laundry_service" -d="M256 85q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5zM149 427q-9 0 -15 -6.5t-6 -15.5t6 -15t15 -6t15.5 6t6.5 15t-6.5 15.5t-15.5 6.5zM213 427q-9 0 -15 -6.5t-6 -15.5t6 -15t15 -6t15.5 6t6.5 15t-6.5 15.5 -t-15.5 6.5zM384 469q18 0 30.5 -12t12.5 -30v-342q0 -18 -12.5 -30t-30.5 -12h-256q-18 0 -30.5 12t-12.5 30v342q0 18 12.5 30t30.5 12h256zM196 153l120 121q25 -25 25 -60.5t-25 -60.5t-60 -25t-60 25z" /> - <glyph glyph-name="uniE54B" unicode="local_library" -d="M256 341q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM256 266q80 75 192 75v-234q-111 0 -192 -76q-81 76 -192 76v234q112 0 192 -75z" /> - <glyph glyph-name="uniE54C" unicode="local_mall" -d="M256 235q44 0 75.5 31t31.5 75h-43q0 -26 -19 -45t-45 -19t-45 19t-19 45h-43q0 -44 31.5 -75t75.5 -31zM256 448q-26 0 -45 -19t-19 -45h128q0 26 -19 45t-45 19zM405 384q17 0 30 -13t13 -30v-256q0 -17 -13 -29.5t-30 -12.5h-298q-17 0 -30 12.5t-13 29.5v256 -q0 17 13 30t30 13h42q0 44 31.5 75.5t75.5 31.5t75.5 -31.5t31.5 -75.5h42z" /> - <glyph glyph-name="uniE54D" unicode="local_movies" -d="M384 320v43h-43v-43h43zM384 235v42h-43v-42h43zM384 149v43h-43v-43h43zM171 320v43h-43v-43h43zM171 235v42h-43v-42h43zM171 149v43h-43v-43h43zM384 448h43v-384h-43v43h-43v-43h-170v43h-43v-43h-43v384h43v-43h43v43h170v-43h43v43z" /> - <glyph glyph-name="uniE54E" unicode="local_offer" -d="M117 363q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5t9.5 -22.5t22.5 -9.5zM457 265q12 -12 12 -30t-12 -30l-150 -150q-12 -12 -30 -12t-30 12l-192 192q-12 12 -12 30v150q0 17 12.5 29.5t29.5 12.5h150q18 0 30 -12z" /> - <glyph glyph-name="uniE54F" unicode="local_parking" -d="M282 277q17 0 29.5 13t12.5 30t-12.5 30t-29.5 13h-69v-86h69zM277 448q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-64v-128h-85v384h149z" /> - <glyph glyph-name="uniE550" unicode="local_pharmacy" -d="M341 213v43h-64v64h-42v-64h-64v-43h64v-64h42v64h64zM448 405v-42l-43 -128l43 -128v-43h-384v43l43 128l-43 128v42h271l31 86l50 -19l-24 -67h56z" /> - <glyph glyph-name="uniE551" unicode="local_phone" -d="M141 282q48 -93 141 -141l47 47q10 10 22 5q36 -12 76 -12q9 0 15 -6t6 -15v-75q0 -9 -6 -15t-15 -6q-150 0 -256.5 106.5t-106.5 256.5q0 9 6 15t15 6h75q9 0 15 -6t6 -15q0 -40 12 -76q4 -13 -5 -22z" /> - <glyph glyph-name="uniE552" unicode="local_pizza" -d="M256 192q17 0 30 13t13 30t-13 29.5t-30 12.5t-30 -12.5t-13 -29.5t13 -30t30 -13zM149 363q0 -17 13 -30t30 -13t30 13t13 30t-13 29.5t-30 12.5t-30 -12.5t-13 -29.5zM256 469q115 0 192 -85l-192 -341l-192 341q77 85 192 85z" /> - <glyph glyph-name="uniE553" unicode="local_play" -d="M332 154l-23 87l70 58l-90 5l-33 84l-33 -84l-91 -5l71 -58l-23 -87l76 49zM427 256q0 -17 12.5 -30t29.5 -13v-85q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v85q18 0 30 12.5t12 30.5q0 17 -12.5 30t-29.5 13v85q0 17 12.5 30t29.5 13h342q17 0 29.5 -13 -t12.5 -30v-85q-17 0 -29.5 -13t-12.5 -30z" /> - <glyph glyph-name="uniE554" unicode="local_post_office" -d="M427 341v43l-171 -107l-171 107v-43l171 -106zM427 427q17 0 29.5 -13t12.5 -30v-256q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h342z" /> - <glyph glyph-name="uniE555" unicode="local_print_shop" -d="M384 448v-85h-256v85h256zM405 256q9 0 15.5 6t6.5 15t-6.5 15.5t-15.5 6.5t-15 -6.5t-6 -15.5t6 -15t15 -6zM341 107v106h-170v-106h170zM405 341q26 0 45 -19t19 -45v-128h-85v-85h-256v85h-85v128q0 26 19 45t45 19h298z" /> - <glyph glyph-name="uniE556" unicode="local_restaurant" -d="M317 266l-31 -31l147 -147l-30 -30l-147 147l-147 -147l-30 30l208 208q-12 24 -3.5 56t33.5 57q31 31 69 35.5t61 -18.5t18.5 -61.5t-35.5 -69.5q-25 -25 -57 -33t-56 4zM173 227l-90 90q-25 25 -25 60t25 60l150 -149z" /> - <glyph glyph-name="uniE557" unicode="local_see" -d="M256 149q44 0 75.5 31.5t31.5 75.5t-31.5 75.5t-75.5 31.5t-75.5 -31.5t-31.5 -75.5t31.5 -75.5t75.5 -31.5zM192 469h128l39 -42h68q17 0 29.5 -13t12.5 -30v-256q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h68zM188 256 -q0 28 20 48t48 20t48 -20t20 -48t-20 -48t-48 -20t-48 20t-20 48z" /> - <glyph glyph-name="uniE558" unicode="local_shipping" -d="M384 117q14 0 23 9.5t9 22.5t-9 22.5t-23 9.5t-23 -9.5t-9 -22.5t9 -22.5t23 -9.5zM416 309h-53v-53h95zM128 117q14 0 23 9.5t9 22.5t-9 22.5t-23 9.5t-23 -9.5t-9 -22.5t9 -22.5t23 -9.5zM427 341l64 -85v-107h-43q0 -26 -19 -45t-45 -19t-45 19t-19 45h-128 -q0 -26 -19 -45t-45 -19t-45 19t-19 45h-43v235q0 17 13 30t30 13h299v-86h64z" /> - <glyph glyph-name="uniE559" unicode="local_taxi" -d="M107 277h298l-32 96h-234zM373 171q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5t9.5 -22.5t22.5 -9.5zM139 171q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5t9.5 -22.5t22.5 -9.5zM404 384l44 -128v-171q0 -9 -6 -15 -t-15 -6h-22q-9 0 -15 6t-6 15v22h-256v-22q0 -9 -6 -15t-15 -6h-22q-9 0 -15 6t-6 15v171l44 128q6 21 31 21h53v43h128v-43h53q25 0 31 -21z" /> - <glyph glyph-name="uniE55A" unicode="location_history" -d="M384 171v19q0 29 -44 47.5t-84 18.5t-84 -18.5t-44 -47.5v-19h256zM256 399q-24 0 -41 -17t-17 -41t17 -40.5t41 -16.5t41 16.5t17 40.5t-17 41t-41 17zM405 469q17 0 30 -12.5t13 -29.5v-299q0 -17 -13 -30t-30 -13h-85l-64 -64l-64 64h-85q-18 0 -30.5 13t-12.5 30v299 -q0 17 12.5 29.5t30.5 12.5h298z" /> - <glyph glyph-name="uniE55B" unicode="map" -d="M320 107v253l-128 45v-253zM437 448q11 0 11 -11v-322q0 -8 -8 -10l-120 -41l-128 45l-114 -44l-3 -1q-11 0 -11 11v322q0 8 8 10l120 41l128 -45l114 44z" /> - <glyph glyph-name="uniE55C" unicode="my_location" -d="M256 107q62 0 105.5 43.5t43.5 105.5t-43.5 105.5t-105.5 43.5t-105.5 -43.5t-43.5 -105.5t43.5 -105.5t105.5 -43.5zM447 277h44v-42h-44q-7 -67 -55 -115t-115 -55v-44h-42v44q-67 7 -115 55t-55 115h-44v42h44q7 67 55 115t115 55v44h42v-44q67 -7 115 -55t55 -115z -M256 341q35 0 60 -25t25 -60t-25 -60t-60 -25t-60 25t-25 60t25 60t60 25z" /> - <glyph glyph-name="uniE55D" unicode="navigation" -d="M256 469l160 -390l-15 -15l-145 64l-145 -64l-15 15z" /> - <glyph glyph-name="uniE55E" unicode="pin_drop" -d="M107 85h298v-42h-298v42zM213 341q0 -17 13 -29.5t30 -12.5q18 0 30.5 12.5t12.5 29.5t-13 30t-30 13t-30 -13t-13 -30zM384 341q0 -43 -32 -101.5t-64 -95.5l-32 -37q-14 15 -35.5 41t-57 88t-35.5 105q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5z" /> - <glyph glyph-name="uniE55F" unicode="place" -d="M256 267q22 0 37.5 15.5t15.5 37.5t-15.5 37.5t-37.5 15.5t-37.5 -15.5t-15.5 -37.5t15.5 -37.5t37.5 -15.5zM256 469q62 0 105.5 -43.5t43.5 -105.5q0 -31 -15.5 -71t-37.5 -75t-43.5 -65.5t-36.5 -48.5l-16 -17q-6 7 -16 18.5t-36 46t-45.5 67t-35.5 73.5t-16 72 -q0 62 43.5 105.5t105.5 43.5z" /> - <glyph glyph-name="uniE560" unicode="rate_review" -d="M384 213v43h-117l-43 -43h160zM128 213h53l147 147q8 8 0 15l-38 38q-8 7 -15 0l-147 -147v-53zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-299l-85 -85v384q0 17 12.5 29.5t29.5 12.5h342z" /> - <glyph glyph-name="uniE561" unicode="restaurant_menu" -d="M317 266l-31 -31l147 -147l-30 -30l-147 147l-147 -147l-30 30l208 208q-12 24 -3.5 56t33.5 57q31 31 69 35.5t61 -18.5t18.5 -61.5t-35.5 -69.5q-25 -25 -57 -33t-56 4zM173 227l-90 90q-25 25 -25 60t25 60l150 -149z" /> - <glyph glyph-name="uniE562" unicode="satellite" -d="M107 128h298l-96 128l-74 -96l-54 64zM107 256q62 0 105.5 44t43.5 106h-43q0 -44 -31 -75.5t-75 -31.5v-43zM107 406v-65q26 0 45 19.5t19 45.5h-64zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniE563" unicode="store_mall_directory" -d="M256 128v85h-128v-85h128zM448 213h-21v-128h-43v128h-85v-128h-214v128h-21v43l21 107h342l21 -107v-43zM427 427v-43h-342v43h342z" /> - <glyph glyph-name="uniE564" unicode="terrain" -d="M299 384l192 -256h-470l128 171l96 -128l34 25l-60 81z" /> - <glyph glyph-name="uniE565" unicode="traffic" -d="M256 320q18 0 30.5 13t12.5 30q0 18 -12.5 30t-30.5 12t-30.5 -12t-12.5 -30q0 -17 12.5 -30t30.5 -13zM256 213q18 0 30.5 13t12.5 30t-13 30t-30 13q-18 0 -30.5 -13t-12.5 -30t12.5 -30t30.5 -13zM256 107q18 0 30.5 12.5t12.5 29.5t-13 30t-30 13q-18 0 -30.5 -13 -t-12.5 -30t12.5 -29.5t30.5 -12.5zM427 299q0 -30 -18 -52.5t-46 -30.5v-24h64q0 -30 -18 -52t-46 -30v-25q0 -9 -6.5 -15t-15.5 -6h-170q-9 0 -15.5 6t-6.5 15v25q-28 8 -46 30t-18 52h64v24q-28 8 -46 30.5t-18 52.5h64v24q-28 8 -46 30t-18 52h64v22q0 9 6.5 15t15.5 6 -h170q9 0 15.5 -6t6.5 -15v-22h64q0 -30 -18 -52t-46 -30v-24h64z" /> - <glyph glyph-name="uniE566" unicode="directions_run" -d="M211 99l-149 29l8 43l105 -21l34 173l-39 -15v-73h-42v100l111 47q3 0 8.5 1t8.5 1q21 0 36 -21l21 -34q29 -51 92 -51v-43q-71 0 -117 53l-13 -64l45 -42v-160h-43v128l-45 42zM288 395q-17 0 -30 13t-13 30t13 29.5t30 12.5t29.5 -12.5t12.5 -29.5t-12.5 -30t-29.5 -13 -z" /> - <glyph glyph-name="uniE567" unicode="add_location" -d="M341 299v42h-64v64h-42v-64h-64v-42h64v-64h42v64h64zM256 469q62 0 105.5 -43.5t43.5 -105.5q0 -31 -15.5 -71t-37.5 -75t-43.5 -65.5t-36.5 -48.5l-16 -17q-6 7 -16 18.5t-36 46t-45.5 67t-35.5 73.5t-16 72q0 62 43.5 105.5t105.5 43.5z" /> - <glyph glyph-name="uniE568" unicode="edit_location" -d="M318 351q6 5 0 11l-20 20q-6 6 -11 0l-15 -15l31 -31zM223 256l71 71l-31 31l-71 -71v-31h31zM256 469q62 0 105.5 -43.5t43.5 -105.5q0 -31 -15.5 -71t-37.5 -75t-43.5 -65.5t-36.5 -48.5l-16 -17q-6 7 -16 18.5t-36 46t-45.5 67t-35.5 73.5t-16 72q0 62 43.5 105.5 -t105.5 43.5z" /> - <glyph glyph-name="uniE569" unicode="near_me" -d="M448 448l-161 -384h-21l-56 146l-146 56v21z" /> - <glyph glyph-name="uniE56A" unicode="person_pin_circle" -d="M256 213q55 0 85 46q0 19 -29.5 31.5t-55.5 12.5t-55.5 -12.5t-29.5 -31.5q30 -46 85 -46zM256 427q-17 0 -30 -13t-13 -30q0 -18 13 -30.5t30 -12.5t30 12.5t13 30.5q0 17 -13 30t-30 13zM256 469q62 0 105.5 -43.5t43.5 -105.5q0 -31 -15.5 -71t-37.5 -75t-43.5 -65.5 -t-36.5 -48.5l-16 -17q-6 7 -16 18.5t-36 46t-45.5 67t-35.5 73.5t-16 72q0 62 43.5 105.5t105.5 43.5z" /> - <glyph glyph-name="uniE56B" unicode="zoom_out_map" -d="M448 192v-128h-128l49 49l-62 61l31 31l61 -62zM192 64h-128v128l49 -49l61 62l31 -31l-62 -61zM64 320v128h128l-49 -49l62 -61l-31 -31l-61 62zM320 448h128v-128l-49 49l-61 -62l-31 31l62 61z" /> - <glyph glyph-name="uniE56C" unicode="restaurant" -d="M341 384q0 30 32.5 57.5t74.5 27.5v-426h-53v170h-54v171zM235 320v149h42v-149q0 -34 -23 -58.5t-57 -26.5v-192h-53v192q-34 2 -57 26.5t-23 58.5v149h43v-149h42v149h43v-149h43z" /> - <glyph glyph-name="uniE56D" unicode="ev_station" -d="M171 128l85 149h-43v107l-85 -160h43v-96zM384 299q9 0 15 6t6 15t-6 15t-15 6t-15 -6t-6 -15t6 -15t15 -6zM422 358q15 -15 15 -38v-203q0 -22 -15.5 -37.5t-37.5 -15.5t-37.5 15.5t-15.5 37.5v107h-32v-160h-214v341q0 17 13 30t30 13h128q17 0 30 -13t13 -30v-149h21 -q17 0 30 -13t13 -30v-96q0 -9 6 -15t15 -6t15 6t6 15v154q-9 -4 -21 -4q-22 0 -37.5 15.5t-15.5 37.5q0 36 34 50l-45 45l23 22z" /> - <glyph glyph-name="uniE56E" unicode="streetview" -d="M245 384q0 -57 41 -98l-209 -209q-13 13 -13 30v298q0 17 13 30t30 13h154q-16 -30 -16 -64zM277 384q0 44 31.5 75.5t75.5 31.5t75.5 -31.5t31.5 -75.5t-31.5 -75.5t-75.5 -31.5t-75.5 31.5t-31.5 75.5zM268 206q52 39 116 39q33 0 64 -11v-127q0 -17 -13 -30t-30 -13 -h-149v117q0 15 12 25z" /> - <glyph glyph-name="uniE56F" unicode="subway" -d="M384 173v147q0 38 -33 51t-95 13q-59 0 -93.5 -13t-34.5 -51v-147q0 -23 16.5 -39.5t39.5 -16.5l-24 -24v-8h36l32 32h60l32 -32h32v8l-24 24q23 0 39.5 16.5t16.5 39.5zM380 452q43 -16 66 -50t23 -79v-280h-426v280q0 45 23 79t66 50q43 17 124 17t124 -17zM150 320 -h213v-107h-213v107zM160 171q0 9 6 15t15 6t15.5 -6t6.5 -15t-6.5 -15.5t-15.5 -6.5t-15 6.5t-6 15.5zM309 171q0 9 6.5 15t15.5 6t15 -6t6 -15t-6 -15.5t-15 -6.5t-15.5 6.5t-6.5 15.5z" /> - <glyph glyph-name="uniE570" unicode="train" -d="M352 149q14 0 23 9.5t9 22.5t-9 22.5t-23 9.5t-23 -9.5t-9 -22.5t9 -22.5t23 -9.5zM277 299h107v85h-107v-85zM235 299v85h-107v-85h107zM160 149q14 0 23 9.5t9 22.5t-9 22.5t-23 9.5t-23 -9.5t-9 -22.5t9 -22.5t23 -9.5zM256 469q83 0 127 -17t44 -68v-203 -q0 -31 -22 -52.5t-53 -21.5l32 -32v-11h-43l-42 43h-81l-42 -43h-48v11l32 32q-31 0 -53 21.5t-22 52.5v203q0 27 14 45t40.5 26t53 11t63.5 3z" /> - <glyph glyph-name="uniE571" unicode="tram" -d="M363 213v107h-214v-107h214zM256 117q14 0 23 9.5t9 22.5t-9 22.5t-23 9.5t-23 -9.5t-9 -22.5t9 -22.5t23 -9.5zM405 151q0 -28 -14.5 -47t-40.5 -19h2l32 -32v-10h-43l-42 42h-81l-42 -42h-48v10l34 34q-23 5 -39 23t-16 41v180q0 41 34 56.5t93 17.5l17 32h-102v32h214 -v-32h-70l-16 -32q63 -2 95.5 -17t32.5 -57v-180z" /> - <glyph glyph-name="uniE572" unicode="transfer_within_a_station" -d="M123 322l-59 -301h45l37 171l46 -43v-128h43v161l-44 44l13 64q45 -55 116 -55v42q-29 0 -53.5 14.5t-39.5 38.5l-20 34q-11 20 -36 20q-9 0 -16 -3l-112 -46v-100h42v71l38 16v0zM203 395q-17 0 -30 12.5t-13 29.5t13 30t30 13t29.5 -13t12.5 -30t-12.5 -29.5 -t-29.5 -12.5zM416 91v37l53 -53l-53 -54v38h-117v32h117zM352 181h117v-32h-117v-37l-53 53l53 54v-38z" /> - <glyph glyph-name="uniE5C3" unicode="apps" -d="M341 85v86h86v-86h-86zM341 213v86h86v-86h-86zM213 341v86h86v-86h-86zM341 427h86v-86h-86v86zM213 213v86h86v-86h-86zM85 213v86h86v-86h-86zM85 85v86h86v-86h-86zM213 85v86h86v-86h-86zM85 341v86h86v-86h-86z" /> - <glyph glyph-name="uniE5C4" unicode="arrow_back" -d="M427 277v-42h-260l119 -120l-30 -30l-171 171l171 171l30 -30l-119 -120h260z" /> - <glyph glyph-name="uniE5C5" unicode="arrow_drop_down" -d="M149 299h214l-107 -107z" /> - <glyph glyph-name="uniE5C6" unicode="arrow_drop_down_circle" -d="M256 213l85 86h-170zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE5C7" unicode="arrow_drop_up" -d="M149 213l107 107l107 -107h-214z" /> - <glyph glyph-name="uniE5C8" unicode="arrow_forward" -d="M256 427l171 -171l-171 -171l-30 30l119 120h-260v42h260l-119 120z" /> - <glyph glyph-name="uniE5C9" unicode="cancel" -d="M363 179l-77 77l77 77l-30 30l-77 -77l-77 77l-30 -30l77 -77l-77 -77l30 -30l77 77l77 -77zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE5CA" unicode="check" -d="M192 167l226 226l30 -30l-256 -256l-119 119l30 30z" /> - <glyph glyph-name="uniE5CB" unicode="chevron_left" -d="M329 354l-98 -98l98 -98l-30 -30l-128 128l128 128z" /> - <glyph glyph-name="uniE5CC" unicode="chevron_right" -d="M213 384l128 -128l-128 -128l-30 30l98 98l-98 98z" /> - <glyph glyph-name="uniE5CD" unicode="close" -d="M405 375l-119 -119l119 -119l-30 -30l-119 119l-119 -119l-30 30l119 119l-119 119l30 30l119 -119l119 119z" /> - <glyph glyph-name="uniE5CE" unicode="expand_less" -d="M256 341l128 -128l-30 -30l-98 98l-98 -98l-30 30z" /> - <glyph glyph-name="uniE5CF" unicode="expand_more" -d="M354 329l30 -30l-128 -128l-128 128l30 30l98 -98z" /> - <glyph glyph-name="uniE5D0" unicode="fullscreen" -d="M299 405h106v-106h-42v64h-64v42zM363 149v64h42v-106h-106v42h64zM107 299v106h106v-42h-64v-64h-42zM149 213v-64h64v-42h-106v106h42z" /> - <glyph glyph-name="uniE5D1" unicode="fullscreen_exit" -d="M341 341h64v-42h-106v106h42v-64zM299 107v106h106v-42h-64v-64h-42zM171 341v64h42v-106h-106v42h64zM107 171v42h106v-106h-42v64h-64z" /> - <glyph glyph-name="uniE5D2" unicode="menu" -d="M64 384h384v-43h-384v43zM64 235v42h384v-42h-384zM64 128v43h384v-43h-384z" /> - <glyph glyph-name="uniE5D3" unicode="keyboard_control" -d="M256 299q17 0 30 -13t13 -30t-13 -30t-30 -13t-30 13t-13 30t13 30t30 13zM384 299q17 0 30 -13t13 -30t-13 -30t-30 -13t-30 13t-13 30t13 30t30 13zM128 299q17 0 30 -13t13 -30t-13 -30t-30 -13t-30 13t-13 30t13 30t30 13z" /> - <glyph glyph-name="uniE5D4" unicode="more_vert" -d="M256 171q17 0 30 -13t13 -30t-13 -30t-30 -13t-30 13t-13 30t13 30t30 13zM256 299q17 0 30 -13t13 -30t-13 -30t-30 -13t-30 13t-13 30t13 30t30 13zM256 341q-17 0 -30 13t-13 30t13 30t30 13t30 -13t13 -30t-13 -30t-30 -13z" /> - <glyph glyph-name="uniE5D5" unicode="refresh" -d="M377 377l50 50v-150h-150l69 69q-38 38 -90 38q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5q42 0 75 23.5t46 61.5h44q-14 -56 -60 -92t-105 -36q-70 0 -120 50t-50 121t50 121t120 50q71 0 121 -50z" /> - <glyph glyph-name="uniE5D6" unicode="unfold_less" -d="M354 397l-98 -98l-98 98l30 30l68 -68l68 68zM158 115l98 98l98 -98l-30 -30l-68 68l-68 -68z" /> - <glyph glyph-name="uniE5D7" unicode="unfold_more" -d="M256 124l68 68l30 -30l-98 -98l-98 98l30 30zM256 388l-68 -68l-30 30l98 98l98 -98l-30 -30z" /> - <glyph glyph-name="uniE5D8" unicode="arrow_upward" -d="M85 256l171 171l171 -171l-31 -30l-119 119v-260h-42v260l-120 -119z" /> - <glyph glyph-name="uniE5D9" unicode="subdirectory_arrow_left" -d="M235 320l30 -30l-77 -77h196v214h43v-256h-239l77 -77l-30 -30l-128 128z" /> - <glyph glyph-name="uniE5DA" unicode="subdirectory_arrow_right" -d="M405 192l-128 -128l-30 30l77 77h-239v256h43v-214h196l-77 77l30 30z" /> - <glyph glyph-name="uniE5DB" unicode="arrow_downward" -d="M427 256l-171 -171l-171 171l31 30l119 -119v260h42v-260l120 119z" /> - <glyph glyph-name="uniE5DC" unicode="first_page" -d="M128 384h43v-256h-43v256zM393 158l-30 -30l-128 128l128 128l30 -30l-98 -98z" /> - <glyph glyph-name="uniE5DD" unicode="last_page" -d="M341 384h43v-256h-43v256zM119 354l30 30l128 -128l-128 -128l-30 30l98 98z" /> - <glyph glyph-name="uniE60E" unicode="adb" -d="M320 320q9 0 15 6t6 15t-6 15.5t-15 6.5t-15 -6.5t-6 -15.5t6 -15t15 -6zM192 320q9 0 15 6t6 15t-6 15.5t-15 6.5t-15 -6.5t-6 -15.5t6 -15t15 -6zM344 419q61 -45 61 -120v-22h-298v22q0 75 61 120l-45 45l18 17l49 -49q32 16 66 16t66 -16l49 49l18 -17zM107 171v85 -h298v-85q0 -62 -43.5 -106t-105.5 -44t-105.5 44t-43.5 106z" /> - <glyph glyph-name="uniE60F" unicode="bluetooth_audio" -d="M275 164l-40 41v-81zM235 388v-81l40 41zM335 348l-92 -92l92 -92l-122 -121h-21v162l-98 -98l-30 30l119 119l-119 119l30 30l98 -98v162h21zM417 369q31 -50 31 -111t-33 -113l-25 25q21 42 21 86t-21 86zM304 256l49 49q10 -25 10 -49q0 -25 -10 -50z" /> - <glyph glyph-name="uniE610" unicode="disc_full" -d="M213 213q17 0 30 13t13 30t-13 30t-30 13t-29.5 -13t-12.5 -30t12.5 -30t29.5 -13zM213 427q71 0 121 -50.5t50 -120.5t-50 -120.5t-121 -50.5q-70 0 -120 50t-50 121t50 121t120 50zM427 363h42v-107h-42v107zM427 171v42h42v-42h-42z" /> - <glyph glyph-name="uniE611" unicode="do_not_disturb_alt" -d="M256 85q70 0 120.5 50.5t50.5 120.5q0 57 -37 105l-239 -239q48 -37 105 -37zM85 256q0 -57 37 -105l239 239q-48 37 -105 37q-70 0 -120.5 -50.5t-50.5 -120.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5 -t150.5 62.5z" /> - <glyph glyph-name="uniE612" unicode="do_not_disturb" -d="M391 151q36 45 36 105q0 70 -50.5 120.5t-120.5 50.5q-60 0 -105 -36zM256 85q60 0 105 36l-240 240q-36 -45 -36 -105q0 -70 50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5 -z" /> - <glyph glyph-name="uniE613" unicode="drive_eta" -d="M107 299h298l-32 96h-234zM373 192q13 0 22.5 9t9.5 23t-9.5 23t-22.5 9t-22.5 -9t-9.5 -23t9.5 -23t22.5 -9zM139 192q13 0 22.5 9t9.5 23t-9.5 23t-22.5 9t-22.5 -9t-9.5 -23t9.5 -23t22.5 -9zM404 405l44 -128v-170q0 -9 -6 -15.5t-15 -6.5h-22q-9 0 -15 6.5t-6 15.5 -v21h-256v-21q0 -9 -6 -15.5t-15 -6.5h-22q-9 0 -15 6.5t-6 15.5v170l44 128q7 22 31 22h234q24 0 31 -22z" /> - <glyph glyph-name="uniE614" unicode="event_available" -d="M405 107v234h-298v-234h298zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-18 0 -30.5 13t-12.5 30v298q0 17 12.5 30t30.5 13h21v43h43v-43h170v43h43v-43h21zM353 276l-127 -127l-68 68l23 23l45 -45l104 104z" /> - <glyph glyph-name="uniE615" unicode="event_busy" -d="M405 107v234h-298v-234h298zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-18 0 -30.5 13t-12.5 30v298q0 17 12.5 30t30.5 13h21v43h43v-43h170v43h43v-43h21zM199 149l-23 23l52 52l-52 52l23 23l52 -52l52 52l22 -23l-52 -52l52 -52l-22 -23l-52 52z -" /> - <glyph glyph-name="uniE616" unicode="event_note" -d="M299 213v-42h-150v42h150zM405 107v234h-298v-234h298zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-18 0 -30.5 13t-12.5 30v298q0 17 12.5 30t30.5 13h21v43h43v-43h170v43h43v-43h21zM363 299v-43h-214v43h214z" /> - <glyph glyph-name="uniE617" unicode="folder_special" -d="M383 149l-17 71l55 48l-72 6l-29 67l-29 -67l-72 -6l55 -48l-17 -71l63 37zM427 384q17 0 29.5 -13t12.5 -30v-213q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h128l43 -43h171z" /> - <glyph glyph-name="uniE618" unicode="mms" -d="M107 213h298l-96 128l-74 -96l-54 64zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-299l-85 -85v384q0 17 12.5 29.5t29.5 12.5h342z" /> - <glyph glyph-name="uniE619" unicode="more" -d="M405 224q13 0 22.5 9t9.5 23t-9.5 23t-22.5 9t-22.5 -9t-9.5 -23t9.5 -23t22.5 -9zM299 224q13 0 22.5 9t9.5 23t-9.5 23t-22.5 9t-22.5 -9t-9.5 -23t9.5 -23t22.5 -9zM192 224q14 0 23 9t9 23t-9 23t-23 9t-23 -9t-9 -23t9 -23t23 -9zM469 448q17 0 30 -13t13 -30v-298 -q0 -17 -13 -30t-30 -13h-318q-22 0 -36 19l-115 173l115 173q14 19 34 19h320z" /> - <glyph glyph-name="uniE61A" unicode="network_locked" -d="M448 171v32q0 13 -9 22.5t-23 9.5t-23 -9.5t-9 -22.5v-32h64zM469 171q9 0 15.5 -6.5t6.5 -15.5v-85q0 -9 -6.5 -15t-15.5 -6h-106q-9 0 -15.5 6t-6.5 15v85q0 9 6.5 15.5t15.5 6.5v32q0 22 15.5 37.5t37.5 15.5t37.5 -15.5t15.5 -37.5v-32zM416 299q-40 0 -68 -28 -t-28 -68v-6q-21 -19 -21 -48v-64h-278l406 406v-193q-2 0 -5.5 0.5t-5.5 0.5z" /> - <glyph glyph-name="uniE61B" unicode="phone_bluetooth_speaker" -d="M427 181q9 0 15 -6t6 -15v-75q0 -9 -6 -15t-15 -6q-150 0 -256.5 106.5t-106.5 256.5q0 9 6 15t15 6h75q9 0 15 -6t6 -15q0 -40 12 -76q4 -13 -5 -22l-47 -47q47 -92 141 -141l47 47q9 9 22 5q36 -12 76 -12zM384 358v-40l20 20zM384 450v-40l20 20zM314 309l-15 15 -l59 60l-59 60l15 15l49 -49v81h10l61 -61l-46 -46l46 -46l-61 -61h-10v81z" /> - <glyph glyph-name="uniE61C" unicode="phone_forwarded" -d="M427 181q9 0 15 -6t6 -15v-75q0 -9 -6 -15t-15 -6q-150 0 -256.5 106.5t-106.5 256.5q0 9 6 15t15 6h75q9 0 15 -6t6 -15q0 -40 12 -76q4 -13 -5 -22l-47 -47q47 -92 141 -141l47 47q9 9 22 5q36 -12 76 -12zM384 277v64h-85v86h85v64l107 -107z" /> - <glyph glyph-name="uniE61D" unicode="phone_in_talk" -d="M320 256q0 26 -19 45t-45 19v43q44 0 75.5 -31.5t31.5 -75.5h-43zM405 256q0 62 -43.5 105.5t-105.5 43.5v43q80 0 136 -56t56 -136h-43zM427 181q9 0 15 -6t6 -15v-75q0 -9 -6 -15t-15 -6q-150 0 -256.5 106.5t-106.5 256.5q0 9 6 15t15 6h75q9 0 15 -6t6 -15 -q0 -40 12 -76q4 -13 -5 -22l-47 -47q47 -92 141 -141l47 47q9 9 22 5q36 -12 76 -12z" /> - <glyph glyph-name="uniE61E" unicode="phone_locked" -d="M410 427v10q0 15 -11 26t-26 11t-25.5 -11t-10.5 -26v-10h73zM427 427q9 0 15 -6.5t6 -15.5v-85q0 -9 -6 -15t-15 -6h-107q-9 0 -15 6t-6 15v85q0 9 6 15.5t15 6.5v10q0 22 15.5 38t37.5 16t38 -16t16 -38v-10zM427 181q9 0 15 -6t6 -15v-75q0 -9 -6 -15t-15 -6 -q-150 0 -256.5 106.5t-106.5 256.5q0 9 6 15t15 6h75q9 0 15 -6t6 -15q0 -40 12 -76q4 -13 -5 -22l-47 -47q47 -92 141 -141l47 47q9 9 22 5q36 -12 76 -12z" /> - <glyph glyph-name="uniE61F" unicode="phone_missed" -d="M506 156q6 -6 6 -15t-6 -15l-53 -53q-6 -6 -15 -6t-15 6q-28 26 -57 40q-12 5 -12 19v66q-46 15 -98 15t-98 -15v-66q0 -15 -12 -20q-32 -15 -57 -39q-6 -6 -15 -6t-15 6l-53 53q-6 6 -6 15t6 15q105 100 250 100t250 -100zM139 395v-75h-32v128h128v-32h-75l96 -96 -l128 128l21 -21l-149 -150z" /> - <glyph glyph-name="uniE620" unicode="phone_paused" -d="M405 448h43v-149h-43v149zM427 181q9 0 15 -6t6 -15v-75q0 -9 -6 -15t-15 -6q-150 0 -256.5 106.5t-106.5 256.5q0 9 6 15t15 6h75q9 0 15 -6t6 -15q0 -40 12 -76q4 -13 -5 -22l-47 -47q47 -92 141 -141l47 47q9 9 22 5q36 -12 76 -12zM363 448v-149h-43v149h43z" /> - <glyph glyph-name="uniE623" unicode="sd_card" -d="M384 341v86h-43v-86h43zM320 341v86h-43v-86h43zM256 341v86h-43v-86h43zM384 469q17 0 30 -12.5t13 -29.5v-342q0 -17 -13 -29.5t-30 -12.5h-256q-17 0 -30 12.5t-13 29.5l1 256l127 128h171z" /> - <glyph glyph-name="uniE624" unicode="sim_card_alert" -d="M277 235v106h-42v-106h42zM277 149v43h-42v-43h42zM384 469q17 0 30 -12.5t13 -29.5v-342q0 -17 -13 -29.5t-30 -12.5h-256q-17 0 -30 12.5t-13 29.5l1 256l127 128h171z" /> - <glyph glyph-name="uniE625" unicode="sms" -d="M363 277v43h-43v-43h43zM277 277v43h-42v-43h42zM192 277v43h-43v-43h43zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-299l-85 -85v384q0 17 12.5 29.5t29.5 12.5h342z" /> - <glyph glyph-name="uniE626" unicode="sms_failed" -d="M277 299v85h-42v-85h42zM277 213v43h-42v-43h42zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-299l-85 -85v384q0 17 12.5 29.5t29.5 12.5h342z" /> - <glyph glyph-name="uniE627" unicode="sync" -d="M256 128v64l85 -85l-85 -86v64q-70 0 -120.5 50.5t-50.5 120.5q0 50 27 91l31 -31q-15 -27 -15 -60q0 -53 37.5 -90.5t90.5 -37.5zM256 427q70 0 120.5 -50.5t50.5 -120.5q0 -50 -27 -91l-31 31q15 27 15 60q0 53 -37.5 90.5t-90.5 37.5v-64l-85 85l85 86v-64z" /> - <glyph glyph-name="uniE628" unicode="sync_disabled" -d="M427 427l-51 -51q51 -51 51 -120q0 -48 -26 -90l-32 31q15 30 15 59q0 52 -38 90l-47 -47v128h128zM61 397l27 27l335 -336l-27 -27l-50 50q-24 -14 -48 -20v44q8 3 17 8l-172 172q-15 -30 -15 -59q0 -52 38 -90l47 47v-128h-128l51 51q-51 51 -51 120q0 48 26 90z -M213 377q-6 -2 -16 -8l-31 32q25 15 47 20v-44z" /> - <glyph glyph-name="uniE629" unicode="sync_problem" -d="M235 235v128h42v-128h-42zM448 427l-50 -51q50 -50 50 -120q0 -59 -36 -105t-92 -60v44q38 13 61.5 46t23.5 75q0 53 -37 90l-48 -47v128h128zM235 149v43h42v-43h-42zM64 256q0 59 36 105t92 60v-44q-38 -13 -61.5 -46t-23.5 -75q0 -53 37 -90l48 47v-128h-128l50 51 -q-50 50 -50 120z" /> - <glyph glyph-name="uniE62A" unicode="system_update" -d="M341 235l-85 -86l-85 86h64v106h42v-106h64zM363 107v298h-214v-298h214zM363 490q17 0 29.5 -12.5t12.5 -29.5v-384q0 -17 -12.5 -30t-29.5 -13h-214q-17 0 -29.5 13t-12.5 30v384q0 17 12.5 30t29.5 13z" /> - <glyph glyph-name="uniE62B" unicode="tap_and_play" -d="M363 490q17 0 29.5 -12.5t12.5 -29.5v-363q0 -17 -12.5 -29.5t-29.5 -12.5h-45q-3 43 -20 85h65v277h-214v-128q-25 11 -42 14v157q0 17 12.5 30t29.5 13zM43 256q97 0 165.5 -68.5t68.5 -166.5h-42q0 79 -56.5 135.5t-135.5 56.5v43zM43 85q26 0 45 -19t19 -45h-64v64z -M43 171q62 0 105.5 -44t43.5 -106h-43q0 44 -31 75.5t-75 31.5v43z" /> - <glyph glyph-name="uniE62C" unicode="time_to_leave" -d="M107 299h298l-32 96h-234zM373 192q13 0 22.5 9t9.5 23t-9.5 23t-22.5 9t-22.5 -9t-9.5 -23t9.5 -23t22.5 -9zM139 192q13 0 22.5 9t9.5 23t-9.5 23t-22.5 9t-22.5 -9t-9.5 -23t9.5 -23t22.5 -9zM404 405l44 -128v-170q0 -9 -6 -15.5t-15 -6.5h-22q-9 0 -15 6.5t-6 15.5 -v21h-256v-21q0 -9 -6 -15.5t-15 -6.5h-22q-9 0 -15 6.5t-6 15.5v170l44 128q7 22 31 22h234q24 0 31 -22z" /> - <glyph glyph-name="uniE62D" unicode="vibration" -d="M341 107v298h-170v-298h170zM352 448q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192zM405 149v214h43v-214h-43zM469 320h43v-128h-43v128zM64 149v214h43v-214h-43zM0 192v128h43v-128h-43z" /> - <glyph glyph-name="uniE62E" unicode="voice_chat" -d="M384 213v171l-85 -68v68h-171v-171h171v69zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-299l-85 -85v384q0 17 12.5 29.5t29.5 12.5h342z" /> - <glyph glyph-name="uniE62F" unicode="vpn_lock" -d="M213 65v42q-17 0 -29.5 12.5t-12.5 29.5v22l-103 102q-4 -16 -4 -38q0 -65 43 -113.5t106 -56.5zM404 256h43q1 -7 1 -21q0 -89 -62.5 -151.5t-150.5 -62.5q-89 0 -151.5 62.5t-62.5 151.5q0 88 62.5 150.5t151.5 62.5q31 0 64 -10v-54q0 -17 -13 -30t-30 -13h-43v-42 -q0 -9 -6 -15.5t-15 -6.5h-43v-42h128q9 0 15.5 -6.5t6.5 -15.5v-64h21q31 0 41 -29q44 47 44 115q0 14 -1 21zM452 427v10q0 15 -10.5 26t-25.5 11t-25.5 -11t-10.5 -26v-10h72zM469 427q9 0 15.5 -6.5t6.5 -15.5v-85q0 -9 -6.5 -15t-15.5 -6h-106q-9 0 -15.5 6t-6.5 15v85 -q0 9 6.5 15.5t15.5 6.5v10q0 22 15.5 38t37.5 16t37.5 -16t15.5 -38v-10z" /> - <glyph glyph-name="uniE630" unicode="airline_seat_flat" -d="M152 254q-19 -19 -45 -19.5t-45 18.5t-19.5 45t18.5 45t45 19.5t45 -18.5t19.5 -45t-18.5 -45zM43 213h426v-42h-128v-43h-170v43h-128v42zM469 277v-42h-277v128h192q35 0 60 -25.5t25 -60.5z" /> - <glyph glyph-name="uniE631" unicode="airline_seat_flat_angled" -d="M156 294q-24 -11 -49.5 -2.5t-36.5 32.5t-2.5 49.5t32.5 36.5t49.5 2.5t36.5 -32.5t2.5 -49.5t-32.5 -36.5zM32 253l15 40l405 -146l-14 -40l-97 34v-34h-170v96zM475 207l-15 -40l-264 95l45 121l182 -66q34 -12 49 -44t3 -66z" /> - <glyph glyph-name="uniE632" unicode="airline_seat_individual_suite" -d="M405 363q35 0 60.5 -25.5t25.5 -60.5v-128h-470v214h43v-150h171v150h170zM149 235q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19z" /> - <glyph glyph-name="uniE633" unicode="airline_seat_legroom_extra" -d="M487 144q7 -12 2 -25t-17 -19l-79 -36l-73 149h-149q-26 0 -45 19t-19 45v171h128v-128h75q27 0 38 -24l72 -149l24 11q12 5 24.5 1t18.5 -15zM85 256q0 -26 19 -45t45 -19h128v-43h-128q-44 0 -75 31.5t-31 75.5v192h42v-192z" /> - <glyph glyph-name="uniE634" unicode="airline_seat_legroom_normal" -d="M437 128q13 0 22.5 -9t9.5 -23t-9.5 -23t-22.5 -9h-96v149h-149q-26 0 -45 19t-19 45v171h128v-128h107q17 0 29.5 -13t12.5 -30v-149h32zM107 256q0 -26 19 -45t45 -19h128v-43h-128q-44 0 -75.5 31.5t-31.5 75.5v192h43v-192z" /> - <glyph glyph-name="uniE635" unicode="airline_seat_legroom_reduced" -d="M107 256q0 -26 19 -45t45 -19h85v-43h-85q-44 0 -75.5 31.5t-31.5 75.5v192h43v-192zM426 102q3 -15 -6.5 -26.5t-24.5 -11.5h-96v64l21 85h-128q-26 0 -45 19t-19 45v171h128v-128h107q17 0 29.5 -13t12.5 -30l-42 -149h30q12 0 21.5 -7.5t11.5 -18.5z" /> - <glyph glyph-name="uniE636" unicode="airline_seat_recline_extra" -d="M346 192l123 -96l-32 -32l-81 64h-146q-23 0 -40.5 14.5t-22.5 37.5l-29 126q-3 20 8.5 36t30.5 20h1q22 3 37 -9l35 -27q48 -37 100 -27v-46q-48 -8 -110 26l22 -87h104zM341 107v-43h-150q-40 0 -70 25.5t-36 64.5l-42 209h42l42 -202q4 -23 22 -38.5t42 -15.5h150z -M114 392q-14 10 -17 27.5t7 31.5t27.5 17.5t31.5 -6.5q14 -11 17.5 -28.5t-6.5 -31.5t-28 -17t-32 7z" /> - <glyph glyph-name="uniE637" unicode="airline_seat_recline_normal" -d="M427 84l-31 -31l-75 75h-108q-26 0 -45 19t-19 45v123q0 19 14.5 33.5t33.5 14.5h1q19 0 35 -16l30 -33q17 -19 45.5 -31t54.5 -12v-47q-62 0 -118 47v-79h74zM128 171q0 -26 19 -45t45 -19h128v-43h-128q-44 0 -75.5 31.5t-31.5 75.5v192h43v-192zM162 397 -q-13 13 -13 30t13 30t30 13t30 -13t13 -30t-13 -30t-30 -13t-30 13z" /> - <glyph glyph-name="uniE638" unicode="confirmation_number" -d="M277 331v42h-42v-42h42zM277 235v42h-42v-42h42zM277 139v42h-42v-42h42zM469 299q-17 0 -29.5 -13t-12.5 -30t12.5 -30t29.5 -13v-85q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v85q18 0 30 12.5t12 30.5q0 17 -12.5 30t-29.5 13v85q0 18 12.5 30.5 -t29.5 12.5h342q17 0 29.5 -12.5t12.5 -30.5v-85z" /> - <glyph glyph-name="uniE639" unicode="live_tv" -d="M192 299l149 -86l-149 -85v171zM448 85v256h-384v-256h384zM448 384q17 0 30 -12.5t13 -30.5v-256q0 -17 -13 -29.5t-30 -12.5h-384q-17 0 -30 12.5t-13 29.5v256q0 18 13 30.5t30 12.5h162l-70 70l15 15l85 -85l85 85l15 -15l-70 -70h162z" /> - <glyph glyph-name="uniE63A" unicode="ondemand_video" -d="M341 277l-149 -85v171zM448 149v256h-384v-256h384zM448 448q17 0 30 -12.5t13 -30.5l-1 -256q0 -17 -12.5 -29.5t-29.5 -12.5h-107v-43h-170v43h-107q-18 0 -30.5 12.5t-12.5 29.5v256q0 18 12.5 30.5t30.5 12.5h384z" /> - <glyph glyph-name="uniE63B" unicode="personal_video" -d="M448 149v256h-384v-256h384zM448 448q17 0 30 -12.5t13 -30.5l-1 -256q0 -17 -12.5 -29.5t-29.5 -12.5h-107v-43h-170v43h-107q-18 0 -30.5 12.5t-12.5 29.5v256q0 18 12.5 30.5t30.5 12.5h384z" /> - <glyph glyph-name="uniE63C" unicode="power" -d="M342 363q16 0 29 -13.5t13 -29.5v-117l-75 -75v-64h-106v64l-75 75v117q0 16 13 29.5t29 13.5h1v85h42v-85h86v85h42z" /> - <glyph glyph-name="uniE63D" unicode="wc" -d="M352 384q-18 0 -30.5 12.5t-12.5 30.5t12.5 30t30.5 12t30.5 -12t12.5 -30t-12.5 -30.5t-30.5 -12.5zM160 384q-18 0 -30.5 12.5t-12.5 30.5t12.5 30t30.5 12t30.5 -12t12.5 -30t-12.5 -30.5t-30.5 -12.5zM384 43h-64v128h-64l54 162q11 30 41 30h2q30 0 41 -30l54 -162 -h-64v-128zM117 43v160h-32v117q0 17 13 30t30 13h64q17 0 30 -13t13 -30v-117h-32v-160h-86z" /> - <glyph glyph-name="uniE63E" unicode="wifi" -d="M107 235q62 61 149.5 61t148.5 -61l-42 -43q-44 44 -107 44t-107 -44zM192 149q26 26 64 26t64 -26l-64 -64zM21 320q98 97 235.5 97t234.5 -97l-43 -43q-80 79 -192 79t-192 -79z" /> - <glyph glyph-name="uniE63F" unicode="enhanced_encryption" -d="M341 171v42h-64v64h-42v-64h-64v-42h64v-64h42v64h64zM190 384v-43h132v43q0 27 -19.5 46.5t-46.5 19.5t-46.5 -19.5t-19.5 -46.5zM384 341q17 0 30 -12.5t13 -29.5v-214q0 -17 -13 -29.5t-30 -12.5h-256q-17 0 -30 12.5t-13 29.5v214q0 17 13 29.5t30 12.5h21v43 -q0 44 31.5 75.5t75.5 31.5t75.5 -31.5t31.5 -75.5v-43h21z" /> - <glyph glyph-name="uniE640" unicode="network_check" -d="M107 235q64 64 156 61l-28 -61q-49 -6 -86 -43zM363 192q-11 11 -26 21l12 62q32 -16 56 -40zM448 277q-39 39 -88 59l11 60q69 -25 120 -76zM21 320q59 59 136.5 82.5t156.5 9.5l-25 -57q-61 8 -120.5 -12.5t-104.5 -65.5zM339 405q11 0 11 -10l-52 -275v-1 -q-3 -14 -15 -24t-27 -10q-18 0 -30.5 12.5t-12.5 30.5q0 11 5 21l111 248q3 8 10 8z" /> - <glyph glyph-name="uniE641" unicode="no_encryption" -d="M190 384v-26l-39 39q5 40 34.5 67t70.5 27q44 0 75.5 -31.5t31.5 -75.5v-43h21q17 0 30 -12.5t13 -29.5v-178l-221 220h116v43q0 27 -19.5 46.5t-46.5 19.5t-46.5 -19.5t-19.5 -46.5zM448 47l-26 -26l-24 24q-8 -2 -14 -2h-256q-17 0 -30 12.5t-13 29.5v214q0 25 23 37 -l-44 43l26 26z" /> - <glyph glyph-name="uniE642" unicode="rv_hookup" -d="M363 469l64 -64l-64 -64v43h-171v43h171v42zM384 213v64h-85v-64h85zM235 85q9 0 15 6.5t6 15.5t-6 15t-15 6t-15.5 -6t-6.5 -15t6.5 -15.5t15.5 -6.5zM427 149h42v-42h-170q0 -26 -19 -45t-45 -19t-45 19t-19 45h-43q-17 0 -30 12.5t-13 29.5v64h150v64h-86v-42l-64 64 -l64 64v-43h235q17 0 30 -13t13 -30v-128z" /> - <glyph glyph-name="uniE643" unicode="do_not_disturb_off" -d="M149 235h74l-43 42h-31v-42zM48 464l416 -416l-28 -27l-59 60q-54 -38 -121 -38q-88 0 -150.5 62.5t-62.5 150.5q0 67 38 121l-60 59zM363 277h-74l-154 154q54 38 121 38q88 0 150.5 -62.5t62.5 -150.5q0 -67 -38 -121l-99 100h31v42z" /> - <glyph glyph-name="uniE644" unicode="do_not_disturb_on" -d="M363 235v42h-214v-42h214zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE645" unicode="priority_high" -d="M213 448h86v-256h-86v256zM213 107q0 18 12.5 30t30.5 12t30.5 -12t12.5 -30t-12.5 -30.5t-30.5 -12.5t-30.5 12.5t-12.5 30.5z" /> - <glyph glyph-name="uniE6C4" unicode="pie_chart" -d="M278 234h191q-7 -76 -61 -130t-130 -61v191zM278 469q76 -7 130 -61t61 -130h-191v191zM235 469v-426q-81 8 -136.5 69t-55.5 144t55.5 144t136.5 69z" /> - <glyph glyph-name="uniE6C5" unicode="pie_chart_outlined" -d="M277 87q58 7 99.5 48.5t48.5 99.5h-148v-148zM85 256q0 -65 43 -113t107 -56v338q-63 -8 -106.5 -56t-43.5 -113zM277 425v-148h148q-7 58 -48.5 99.5t-99.5 48.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5 -t150.5 62.5z" /> - <glyph glyph-name="uniE6DD" unicode="bubble_chart" -d="M222 324q0 43 29.5 73t72.5 30t73 -30t30 -73t-30 -72.5t-73 -29.5t-72.5 29.5t-29.5 72.5zM273 128q0 18 12.5 30.5t30.5 12.5t30 -12.5t12 -30.5t-12 -30.5t-30 -12.5t-30.5 12.5t-12.5 30.5zM85 205q0 28 20 48t49 20q28 0 48 -19.5t20 -48.5t-20 -48.5t-48 -19.5 -q-29 0 -49 20t-20 48z" /> - <glyph glyph-name="uniE6DF" unicode="multiline_chart" -d="M469 364l-65 -73q37 -59 44 -131h-43q-6 51 -31 97l-86 -97l-85 86l-128 -128l-32 32l160 160l85 -86l61 70q-59 69 -144 69q-73 0 -132 -52l-30 30q72 64 162 64q102 0 173 -79l61 68z" /> - <glyph glyph-name="uniE6E1" unicode="show_chart" -d="M75 118l-32 32l160 160l85 -86l151 170l30 -30l-181 -204l-85 86z" /> - <glyph glyph-name="uniE7E9" unicode="cake" -d="M384 320q26 0 45 -19t19 -45v-33q0 -17 -12.5 -29.5t-29.5 -12.5t-29 12l-46 46l-46 -46q-12 -12 -29.5 -12t-29.5 12l-45 46l-46 -46q-12 -12 -29 -12t-29.5 12.5t-12.5 29.5v33q0 26 19 45t45 19h107v43h42v-43h107zM354 171q22 -22 52 -22q22 0 42 13v-98q0 -9 -6 -15 -t-15 -6h-342q-9 0 -15 6t-6 15v98q19 -13 42 -13q30 0 52 22l23 23l23 -23q21 -21 52 -21t52 21l23 23zM256 384q-17 0 -30 13t-13 30q0 11 7 22l36 63l36 -63q7 -11 7 -22q0 -17 -12.5 -30t-30.5 -13z" /> - <glyph glyph-name="uniE7EE" unicode="domain" -d="M384 192v-43h-43v43h43zM384 277v-42h-43v42h43zM427 107v213h-171v-43h43v-42h-43v-43h43v-43h-43v-42h171zM213 363v42h-42v-42h42zM213 277v43h-42v-43h42zM213 192v43h-42v-43h42zM213 107v42h-42v-42h42zM128 363v42h-43v-42h43zM128 277v43h-43v-43h43zM128 192v43 -h-43v-43h43zM128 107v42h-43v-42h43zM256 363h213v-299h-426v384h213v-85z" /> - <glyph glyph-name="uniE7EF" unicode="group" -d="M341 235q28 0 61 -8t61 -26t28 -41v-53h-128v53q0 44 -42 74q7 1 20 1zM171 235q28 0 61 -8t60.5 -26t27.5 -41v-53h-299v53q0 23 28 41t61 26t61 8zM171 277q-26 0 -45 19t-19 45t19 45t45 19t44.5 -19t18.5 -45t-18.5 -45t-44.5 -19zM341 277q-26 0 -45 19t-19 45 -t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19z" /> - <glyph glyph-name="uniE7F0" unicode="group_add" -d="M277 235q40 0 84 -17.5t44 -46.5v-43h-256v43q0 29 44 46.5t84 17.5zM419 231q37 -6 65 -21.5t28 -38.5v-43h-64v43q0 34 -29 60zM277 277q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM384 277q-10 0 -19 3q19 27 19 61t-19 61q9 3 19 3 -q26 0 45 -19t19 -45t-19 -45t-45 -19zM171 299v-43h-64v-64h-43v64h-64v43h64v64h43v-64h64z" /> - <glyph glyph-name="uniE7F1" unicode="location_city" -d="M405 192v43h-42v-43h42zM405 107v42h-42v-42h42zM277 363v42h-42v-42h42zM277 277v43h-42v-43h42zM277 192v43h-42v-43h42zM277 107v42h-42v-42h42zM149 277v43h-42v-43h42zM149 192v43h-42v-43h42zM149 107v42h-42v-42h42zM320 277h128v-213h-384v299h128v42l64 64 -l64 -64v-128z" /> - <glyph glyph-name="uniE7F2" unicode="mood" -d="M256 139q-37 0 -66.5 20.5t-42.5 53.5h218q-13 -33 -42.5 -53.5t-66.5 -20.5zM181 277q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5zM331 277q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5t-9.5 -22.5 -t-22.5 -9.5zM256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE7F3" unicode="mood_bad" -d="M256 213q37 0 66.5 -20.5t42.5 -53.5h-218q13 33 42.5 53.5t66.5 20.5zM181 277q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5zM331 277q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5t-9.5 -22.5 -t-22.5 -9.5zM256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE7F4" unicode="notifications" -d="M384 171l43 -43v-21h-342v21l43 43v106q0 50 25.5 87t70.5 48v15q0 13 9 22.5t23 9.5t23 -9.5t9 -22.5v-15q45 -11 70.5 -48t25.5 -87v-106zM256 43q-18 0 -30.5 12.5t-12.5 29.5h86q0 -17 -13 -29.5t-30 -12.5z" /> - <glyph glyph-name="uniE7F5" unicode="notifications_none" -d="M341 149v128q0 41 -23 68.5t-62 27.5t-62 -27.5t-23 -68.5v-128h170zM384 171l43 -43v-21h-342v21l43 43v106q0 50 25.5 87t70.5 48v15q0 13 9 22.5t23 9.5t23 -9.5t9 -22.5v-15q45 -11 70.5 -48t25.5 -87v-106zM256 43q-17 0 -30 12.5t-13 29.5h86q0 -17 -13 -29.5 -t-30 -12.5z" /> - <glyph glyph-name="uniE7F6" unicode="notifications_off" -d="M384 199l-191 201q3 1 8 3.5l7 3.5h1l6 3q1 0 4 1t5 1v15q0 13 9 22.5t23 9.5t23 -9.5t9 -22.5v-15q45 -11 70.5 -48t25.5 -87v-78zM256 43q-18 0 -30.5 12t-12.5 30h86q0 -18 -12.5 -30t-30.5 -12zM167 381q24 -25 125.5 -129t155.5 -161l-27 -27l-43 43h-293v21l43 43 -v107q0 41 17 73l-60 59l27 28z" /> - <glyph glyph-name="uniE7F7" unicode="notifications_active" -d="M256 43q-18 0 -30.5 12.5t-12.5 29.5h85q0 -18 -12 -30t-30 -12zM384 277v-106l43 -43v-21h-342v21l43 43v106q0 50 25.5 87t70.5 48v15q0 13 9 22.5t23 9.5t23 -9.5t9 -22.5v-15q45 -11 70.5 -48t25.5 -87zM426 288q-5 86 -75 137l30 30q83 -64 88 -167h-43zM162 425 -q-71 -50 -76 -137h-43q5 103 88 167z" /> - <glyph glyph-name="uniE7F8" unicode="notifications_paused" -d="M309 303v38h-106v-38h59l-59 -73v-38h106v38h-59zM384 171l43 -43v-21h-342v21l43 43v106q0 50 25.5 87t70.5 48v15q0 13 9 22.5t23 9.5t23 -9.5t9 -22.5v-15q45 -11 70.5 -48t25.5 -87v-106zM256 43q-18 0 -30.5 12.5t-12.5 29.5h86q0 -17 -13 -29.5t-30 -12.5z" /> - <glyph glyph-name="uniE7F9" unicode="pages" -d="M405 448q17 0 30 -13t13 -30v-128h-107l22 86l-86 -22v107h128zM363 149l-22 86h107v-128q0 -17 -13 -30t-30 -13h-128v107zM171 235l-22 -86l86 22v-107h-128q-17 0 -30 13t-13 30v128h107zM64 405q0 17 13 30t30 13h128v-107l-86 22l22 -86h-107v128z" /> - <glyph glyph-name="uniE7FA" unicode="party_mode" -d="M256 149q44 0 75.5 31.5t31.5 75.5q0 7 -2 21h-45q4 -14 4 -21q0 -26 -19 -45t-45 -19h-85q33 -43 85 -43zM256 363q-44 0 -75.5 -31.5t-31.5 -75.5q0 -7 2 -21h45q-4 14 -4 21q0 26 19 45t45 19h85q-33 43 -85 43zM427 427q17 0 29.5 -13t12.5 -30v-256q0 -17 -12.5 -30 -t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h68l39 42h128l39 -42h68z" /> - <glyph glyph-name="uniE7FB" unicode="people" -d="M341 235q28 0 61 -8t61 -26t28 -41v-53h-128v53q0 44 -42 74q7 1 20 1zM171 235q28 0 61 -8t60.5 -26t27.5 -41v-53h-299v53q0 23 28 41t61 26t61 8zM171 277q-26 0 -45 19t-19 45t19 45t45 19t44.5 -19t18.5 -45t-18.5 -45t-44.5 -19zM341 277q-26 0 -45 19t-19 45 -t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19z" /> - <glyph glyph-name="uniE7FC" unicode="people_outline" -d="M352 373q-17 0 -30 -12.5t-13 -29.5t13 -30t30 -13t30 13t13 30t-13 29.5t-30 12.5zM352 256q-31 0 -53 22t-22 53t22 52.5t53 21.5t53 -21.5t22 -52.5t-22 -53t-53 -22zM160 373q-17 0 -30 -12.5t-13 -29.5t13 -30t30 -13t30 13t13 30t-13 29.5t-30 12.5zM160 256 -q-31 0 -53 22t-22 53t22 52.5t53 21.5t53 -21.5t22 -52.5t-22 -53t-53 -22zM459 139v26q0 10 -35.5 24t-71.5 14q-26 0 -64 -12q11 -13 11 -26v-26h160zM267 139v26q0 10 -35.5 24t-71.5 14t-71.5 -14t-35.5 -24v-26h214zM352 235q43 0 91 -19.5t48 -50.5v-58h-470v58 -q0 31 48 50.5t91 19.5q47 0 96 -22q49 22 96 22z" /> - <glyph glyph-name="uniE7FD" unicode="person" -d="M256 213q54 0 112.5 -23.5t58.5 -61.5v-43h-342v43q0 38 58.5 61.5t112.5 23.5zM256 256q-35 0 -60 25t-25 60t25 60.5t60 25.5t60 -25.5t25 -60.5t-25 -60t-60 -25z" /> - <glyph glyph-name="uniE7FE" unicode="person_add" -d="M320 213q54 0 112.5 -23.5t58.5 -61.5v-43h-342v43q0 38 58.5 61.5t112.5 23.5zM128 299h64v-43h-64v-64h-43v64h-64v43h64v64h43v-64zM320 256q-35 0 -60 25t-25 60t25 60.5t60 25.5t60 -25.5t25 -60.5t-25 -60t-60 -25z" /> - <glyph glyph-name="uniE7FF" unicode="person_outline" -d="M256 235q32 0 70 -9t69.5 -30t31.5 -47v-64h-342v64q0 26 31.5 47t69.5 30t70 9zM256 427q35 0 60 -25.5t25 -60.5t-25 -60t-60 -25t-60 25t-25 60t25 60.5t60 25.5zM256 194q-44 0 -87 -16.5t-43 -28.5v-23h260v23q0 12 -43 28.5t-87 16.5zM256 386q-19 0 -32 -13 -t-13 -32t13 -31.5t32 -12.5t32 12.5t13 31.5t-13 32t-32 13z" /> - <glyph glyph-name="uniE800" unicode="plus_one" -d="M309 382l96 23v-277h-42v226l-54 -11v39zM213 341v-85h86v-43h-86v-85h-42v85h-86v43h86v85h42z" /> - <glyph glyph-name="uniE801" unicode="poll" -d="M363 149v86h-43v-86h43zM277 149v214h-42v-214h42zM192 149v150h-43v-150h43zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniE80B" unicode="public" -d="M382 141q45 48 45 115q0 53 -29.5 96t-77.5 62v-9q0 -17 -13 -29.5t-30 -12.5h-42v-43q0 -9 -6.5 -15t-15.5 -6h-42v-43h128q9 0 15 -6t6 -15v-64h21q30 0 41 -30zM235 87v41q-17 0 -30 13t-13 30v21l-102 102q-5 -20 -5 -38q0 -65 43.5 -113t106.5 -56zM256 469 -q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE80C" unicode="school" -d="M256 448l235 -128v-171h-43v148l-192 -105l-235 128zM107 231l149 -82l149 82v-86l-149 -81l-149 81v86z" /> - <glyph glyph-name="uniE80D" unicode="share" -d="M384 169q26 0 44 -18.5t18 -43.5q0 -26 -18.5 -44.5t-43.5 -18.5t-43.5 18.5t-18.5 44.5q0 10 1 14l-151 88q-19 -17 -44 -17q-26 0 -45 19t-19 45t19 45t45 19q25 0 44 -17l150 87q-2 10 -2 15q0 26 19 45t45 19t45 -19t19 -45t-19 -45t-45 -19q-24 0 -44 18l-150 -88 -q2 -10 2 -15t-2 -15l152 -88q18 16 42 16z" /> - <glyph glyph-name="uniE80E" unicode="whatshot" -d="M250 107q43 0 72.5 29.5t29.5 72.5q0 44 -12 86q-31 -41 -99 -55q-60 -13 -60 -66q0 -28 20 -47.5t49 -19.5zM288 498q64 -52 101.5 -126.5t37.5 -158.5q0 -70 -50 -120t-121 -50t-121 50t-50 120q0 108 69 190v-8q0 -33 22 -56t55 -23q32 0 52.5 22.5t20.5 56.5 -q0 20 -4 46t-8 41z" /> - <glyph glyph-name="uniE811" unicode="sentiment_dissatisfied" -d="M256 213q37 0 66.5 -20.5t42.5 -53.5h-35q-25 42 -74 42t-74 -42h-35q13 33 42.5 53.5t66.5 20.5zM256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5 -t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5zM149 309q0 13 9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5zM299 309q0 13 9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5z" /> - <glyph glyph-name="uniE812" unicode="sentiment_neutral" -d="M256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5zM149 309q0 13 9.5 22.5t22.5 9.5 -t22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5zM299 309q0 13 9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5zM192 213h128v-32h-128v32z" /> - <glyph glyph-name="uniE813" unicode="sentiment_satisfied" -d="M256 171q49 0 74 42h35q-13 -33 -42.5 -53.5t-66.5 -20.5t-66.5 20.5t-42.5 53.5h35q25 -42 74 -42zM256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5 -t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5zM149 309q0 13 9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5zM299 309q0 13 9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5t-22.5 9.5 -t-9.5 22.5z" /> - <glyph glyph-name="uniE814" unicode="sentiment_very_dissatisfied" -d="M256 213q37 0 66.5 -20.5t42.5 -53.5h-218q13 33 42.5 53.5t66.5 20.5zM167 256l-23 23l23 22l-23 23l23 22l22 -22l23 22l23 -22l-23 -23l23 -22l-23 -23l-23 23zM345 346l23 -22l-23 -23l23 -22l-23 -23l-22 23l-23 -23l-23 23l23 22l-23 23l23 22l23 -22zM256 85 -q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE815" unicode="sentiment_very_satisfied" -d="M256 139q-37 0 -66.5 20.5t-42.5 53.5h218q-13 -33 -42.5 -53.5t-66.5 -20.5zM189 300l-22 -23l-23 23l45 45l46 -45l-23 -23zM277 300l46 45l45 -45l-23 -23l-22 23l-23 -23zM256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5 -t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE834" unicode="check_box" -d="M213 149l192 192l-30 31l-162 -162l-76 76l-30 -30zM405 448q18 0 30.5 -13t12.5 -30v-298q0 -17 -12.5 -30t-30.5 -13h-298q-18 0 -30.5 13t-12.5 30v298q0 17 12.5 30t30.5 13h298z" /> - <glyph glyph-name="uniE835" unicode="check_box_outline_blank" -d="M405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298zM405 405h-298v-298h298v298z" /> - <glyph glyph-name="uniE836" unicode="radio_button_unchecked" -d="M256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE837" unicode="radio_button_checked" -d="M256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5zM256 363q44 0 75.5 -31.5 -t31.5 -75.5t-31.5 -75.5t-75.5 -31.5t-75.5 31.5t-31.5 75.5t31.5 75.5t75.5 31.5z" /> - <glyph glyph-name="uniE838" unicode="star" -d="M256 144l-132 -80l35 150l-116 101l153 13l60 141l60 -141l153 -13l-116 -101l35 -150z" /> - <glyph glyph-name="uniE839" unicode="star_half" -d="M256 183l80 -48l-21 91l71 62l-94 8l-36 86v-199zM469 315l-116 -101l35 -150l-132 80l-132 -80l35 150l-116 101l153 13l60 141l60 -141z" /> - <glyph glyph-name="uniE83A" unicode="star_outline" -d="M256 183l80 -48l-21 91l71 62l-94 8l-36 86l-36 -86l-94 -8l71 -62l-21 -91zM469 315l-116 -101l35 -150l-132 80l-132 -80l35 150l-116 101l153 13l60 141l60 -141z" /> - <glyph glyph-name="uniE84D" unicode="3d_rotation" -d="M256 512q100 0 173.5 -67.5t81.5 -166.5h-32q-5 59 -39.5 107t-87.5 73l-29 -28l-81 81zM353 260q0 57 -47 57h-20v-123h19q36 0 46 34q2 7 2 24v8zM306 341q53 0 72 -47q5 -12 5 -34v-8q0 -38 -21 -59q-22 -22 -57 -22h-49v170h50zM207 258q28 -11 28 -39q0 -10 -5 -20 -q-6 -12 -11 -16q-15 -12 -40 -12q-24 0 -39 12t-15 35h27q0 -11 7.5 -18t19.5 -7q28 0 28 27t-31 27h-16v22h16q29 0 29 25t-26 25q-25 0 -25 -23h-28q0 17 15 32q16 13 38 13q35 0 49 -27q4 -8 4 -20q0 -23 -25 -36zM160 54l29 28l81 -81l-14 -1q-100 0 -173.5 68 -t-81.5 167h32q6 -60 40 -108t87 -73z" /> - <glyph glyph-name="uniE84E" unicode="accessibility" -d="M448 320h-128v-277h-43v128h-42v-128h-43v277h-128v43h384v-43zM256 469q17 0 30 -12.5t13 -29.5t-13 -30t-30 -13t-30 13t-13 30t13 29.5t30 12.5z" /> - <glyph glyph-name="uniE84F" unicode="account_balance" -d="M245 491l203 -107v-43h-405v43zM341 299h64v-150h-64v150zM43 43v64h405v-64h-405zM213 299h64v-150h-64v150zM85 299h64v-150h-64v150z" /> - <glyph glyph-name="uniE850" unicode="account_balance_wallet" -d="M341 224q13 0 22.5 9t9.5 23t-9.5 23t-22.5 9t-22.5 -9t-9.5 -23t9.5 -23t22.5 -9zM256 171v170h213v-170h-213zM448 128v-21q0 -17 -13 -30t-30 -13h-298q-18 0 -30.5 13t-12.5 30v298q0 17 12.5 30t30.5 13h298q17 0 30 -13t13 -30v-21h-192q-18 0 -30.5 -13t-12.5 -30 -v-170q0 -17 12.5 -30t30.5 -13h192z" /> - <glyph glyph-name="uniE851" unicode="account_box" -d="M128 149v-21h256v21q0 29 -44 47.5t-84 18.5t-84 -18.5t-44 -47.5zM320 320q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM64 405q0 17 12.5 30t30.5 13h298q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-18 0 -30.5 13t-12.5 30v298z" /> - <glyph glyph-name="uniE853" unicode="account_circle" -d="M256 102q81 0 128 69q-1 28 -45 47t-83 19t-83 -18.5t-45 -47.5q47 -69 128 -69zM256 405q-26 0 -45 -19t-19 -45t19 -45t45 -19t45 19t19 45t-19 45t-45 19zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5 -t150.5 62.5z" /> - <glyph glyph-name="uniE854" unicode="add_shopping_cart" -d="M153 197q0 -5 5 -5h247v-43h-256q-17 0 -29.5 13t-12.5 30q0 10 5 20l29 53l-77 162h-43v42h70q20 -42 40 -85q5 -9 23 -47.5t28 -59.5h150q75 136 82 150l37 -21l-82 -149q-12 -22 -37 -22h-159l-19 -35zM363 128q17 0 29.5 -13t12.5 -30t-12.5 -29.5t-29.5 -12.5 -t-30 12.5t-13 29.5t13 30t30 13zM149 128q17 0 30 -13t13 -30t-13 -29.5t-30 -12.5t-29.5 12.5t-12.5 29.5t12.5 30t29.5 13zM235 320v64h-64v43h64v64h42v-64h64v-43h-64v-64h-42z" /> - <glyph glyph-name="uniE855" unicode="alarm" -d="M256 85q62 0 105.5 44t43.5 106t-43.5 105.5t-105.5 43.5t-105.5 -43.5t-43.5 -105.5t43.5 -106t105.5 -44zM256 427q80 0 136 -56.5t56 -135.5t-56 -135.5t-136 -56.5t-136 56.5t-56 135.5t56 135.5t136 56.5zM267 341v-112l85 -50l-16 -26l-101 60v128h32zM168 440 -l-98 -82l-27 32l98 82zM469 390l-27 -33l-98 83l27 32z" /> - <glyph glyph-name="uniE856" unicode="alarm_add" -d="M277 320v-64h64v-43h-64v-64h-42v64h-64v43h64v64h42zM256 85q62 0 105.5 44t43.5 106t-43.5 105.5t-105.5 43.5t-105.5 -43.5t-43.5 -105.5t43.5 -106t105.5 -44zM256 427q80 0 136 -56.5t56 -135.5t-56 -135.5t-136 -56.5t-136 56.5t-56 135.5t56 135.5t136 56.5z -M469 390l-27 -33l-98 83l27 32zM168 440l-98 -82l-27 32l98 82z" /> - <glyph glyph-name="uniE857" unicode="alarm_off" -d="M171 442l-18 -15l-31 30l19 15zM351 120l-210 210q-34 -42 -34 -95q0 -62 43.5 -106t105.5 -44q52 0 95 35zM62 463q76 -76 216.5 -216t177.5 -177l-27 -27l-47 47q-55 -47 -126 -47q-80 0 -136 56.5t-56 135.5q0 70 47 125l-17 17l-24 -20l-30 31l24 19l-29 29zM469 390 -l-27 -33l-98 83l27 32zM256 384q-27 0 -51 -9l-33 32q42 20 84 20q80 0 136 -56.5t56 -135.5q0 -44 -19 -84l-33 32q9 24 9 52q0 62 -43.5 105.5t-105.5 43.5z" /> - <glyph glyph-name="uniE858" unicode="alarm_on" -d="M225 202l105 106l23 -23l-128 -128l-68 68l22 22zM256 85q62 0 105.5 44t43.5 106t-43.5 105.5t-105.5 43.5t-105.5 -43.5t-43.5 -105.5t43.5 -106t105.5 -44zM256 427q80 0 136 -56.5t56 -135.5t-56 -135.5t-136 -56.5t-136 56.5t-56 135.5t56 135.5t136 56.5zM168 440 -l-98 -82l-27 32l98 82zM469 390l-27 -33l-98 83l27 32z" /> - <glyph glyph-name="uniE859" unicode="android" -d="M320 405v22h-21v-22h21zM213 405v22h-21v-22h21zM331 466q53 -38 53 -103h-256q0 66 52 103l-28 28q-8 8 0 15t15 0l32 -32q26 14 57 14q30 0 56 -14l32 32q8 7 15 0t0 -15zM437 341q13 0 22.5 -9.5t9.5 -22.5v-149q0 -14 -9.5 -23t-22.5 -9t-22.5 9t-9.5 23v149 -q0 13 9.5 22.5t22.5 9.5zM75 341q13 0 22.5 -9.5t9.5 -22.5v-149q0 -14 -9.5 -23t-22.5 -9t-22.5 9t-9.5 23v149q0 13 9.5 22.5t22.5 9.5zM128 128v213h256v-213q0 -9 -6 -15t-15 -6h-22v-75q0 -14 -9.5 -23t-22.5 -9t-22.5 9t-9.5 23v75h-42v-75q0 -14 -9.5 -23t-22.5 -9 -t-22.5 9t-9.5 23v75h-22q-9 0 -15 6t-6 15z" /> - <glyph glyph-name="uniE85A" unicode="announcement" -d="M277 192v43h-42v-43h42zM277 277v128h-42v-128h42zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-299l-85 -85v384q0 17 12.5 29.5t29.5 12.5h342z" /> - <glyph glyph-name="uniE85B" unicode="aspect_ratio" -d="M448 106v300h-384v-300h384zM448 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-384q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h384zM149 320v-64h-42v107h106v-43h-64zM405 256v-107h-106v43h64v64h42z" /> - <glyph glyph-name="uniE85C" unicode="assessment" -d="M363 149v86h-43v-86h43zM277 149v214h-42v-214h42zM192 149v150h-43v-150h43zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniE85D" unicode="assignment" -d="M363 320v43h-214v-43h214zM363 235v42h-214v-42h214zM299 149v43h-150v-43h150zM256 448q-9 0 -15 -6t-6 -15t6 -15.5t15 -6.5t15 6.5t6 15.5t-6 15t-15 6zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h89 -q7 19 23 31t37 12t37 -12t23 -31h89z" /> - <glyph glyph-name="uniE85E" unicode="assignment_ind" -d="M384 107v30q0 29 -44 47.5t-84 18.5t-84 -18.5t-44 -47.5v-30h256zM256 363q-26 0 -45 -19t-19 -45t19 -45t45 -19t45 19t19 45t-19 45t-45 19zM256 448q-9 0 -15 -6t-6 -15t6 -15.5t15 -6.5t15 6.5t6 15.5t-6 15t-15 6zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30 -t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h89q7 19 23 31t37 12t37 -12t23 -31h89z" /> - <glyph glyph-name="uniE85F" unicode="assignment_late" -d="M256 405q9 0 15 6.5t6 15.5t-6 15t-15 6t-15 -6t-6 -15t6 -15.5t15 -6.5zM277 213v128h-42v-128h42zM277 128v43h-42v-43h42zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h89q7 19 23 31t37 12t37 -12t23 -31 -h89z" /> - <glyph glyph-name="uniE860" unicode="assignment_return" -d="M341 192v85h-85v64l-107 -106l107 -107v64h85zM256 448q-9 0 -15 -6t-6 -15t6 -15.5t15 -6.5t15 6.5t6 15.5t-6 15t-15 6zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h89q7 19 23 31t37 12t37 -12t23 -31h89 -z" /> - <glyph glyph-name="uniE861" unicode="assignment_returned" -d="M256 128l107 107h-64v85h-86v-85h-64zM256 448q-9 0 -15 -6t-6 -15t6 -15.5t15 -6.5t15 6.5t6 15.5t-6 15t-15 6zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h89q7 19 23 31t37 12t37 -12t23 -31h89z" /> - <glyph glyph-name="uniE862" unicode="assignment_turned_in" -d="M213 149l171 171l-30 30l-141 -140l-55 55l-30 -30zM256 448q-9 0 -15 -6t-6 -15t6 -15.5t15 -6.5t15 6.5t6 15.5t-6 15t-15 6zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h89q7 19 23 31t37 12t37 -12 -t23 -31h89z" /> - <glyph glyph-name="uniE863" unicode="autorenew" -d="M400 347q27 -41 27 -91q0 -70 -50.5 -120.5t-120.5 -50.5v-64l-85 86l85 85v-64q53 0 90.5 37.5t37.5 90.5q0 30 -15 60zM256 384q-53 0 -90.5 -37.5t-37.5 -90.5q0 -33 15 -60l-31 -31q-27 41 -27 91q0 70 50.5 120.5t120.5 50.5v64l85 -86l-85 -85v64z" /> - <glyph glyph-name="uniE864" unicode="backup" -d="M299 235h64l-107 106l-107 -106h64v-86h86v86zM413 298q41 -3 70 -33.5t29 -72.5q0 -44 -31.5 -75.5t-75.5 -31.5h-277q-53 0 -90.5 37.5t-37.5 90.5q0 49 33 85.5t81 41.5q21 39 59 63t83 24q58 0 102 -36.5t55 -92.5z" /> - <glyph glyph-name="uniE865" unicode="book" -d="M128 427v-171l53 32l54 -32v171h-107zM384 469q17 0 30 -12.5t13 -29.5v-342q0 -17 -13 -29.5t-30 -12.5h-256q-17 0 -30 12.5t-13 29.5v342q0 17 13 29.5t30 12.5h256z" /> - <glyph glyph-name="uniE866" unicode="bookmark" -d="M363 448q17 0 29.5 -13t12.5 -30v-341l-149 64l-149 -64v341q0 17 12.5 30t29.5 13h214z" /> - <glyph glyph-name="uniE867" unicode="bookmark_outline" -d="M363 128v277h-214v-277l107 47zM363 448q17 0 29.5 -13t12.5 -30v-341l-149 64l-149 -64v341q0 17 12.5 30t29.5 13h214z" /> - <glyph glyph-name="uniE868" unicode="bug_report" -d="M299 256v43h-86v-43h86zM299 171v42h-86v-42h86zM427 341v-42h-45q2 -14 2 -22v-21h43v-43h-43v-21q0 -7 -2 -21h45v-43h-60q-17 -29 -46.5 -46.5t-64.5 -17.5t-64.5 17.5t-46.5 46.5h-60v43h45q-2 14 -2 21v21h-43v43h43v21q0 8 2 22h-45v42h60q15 25 39 42l-35 35 -l30 30l47 -46q15 3 30 3t30 -3l47 46l30 -30l-35 -35q24 -17 39 -42h60z" /> - <glyph glyph-name="uniE869" unicode="build" -d="M484 107q7 -4 6.5 -13.5t-8.5 -16.5l-49 -49q-15 -15 -30 0l-194 194q-36 -15 -76.5 -6.5t-70.5 38.5q-32 32 -40 76t12 82l94 -92l64 64l-92 92q38 18 82 11t76 -39q30 -30 38.5 -70.5t-6.5 -76.5z" /> - <glyph glyph-name="uniE86A" unicode="cached" -d="M128 256h64l-85 -85l-86 85h64q0 70 50.5 120.5t120.5 50.5q50 0 91 -27l-31 -31q-27 15 -60 15q-53 0 -90.5 -37.5t-37.5 -90.5zM405 341l86 -85h-64q0 -70 -50.5 -120.5t-120.5 -50.5q-50 0 -91 27l31 31q27 -15 60 -15q53 0 90.5 37.5t37.5 90.5h-64z" /> - <glyph glyph-name="uniE86B" unicode="change_history" -d="M256 427l213 -342h-426zM256 346l-136 -218h272z" /> - <glyph glyph-name="uniE86C" unicode="check_circle" -d="M213 149l192 192l-30 31l-162 -162l-76 76l-30 -30zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE86D" unicode="chrome_reader_mode" -d="M448 107v277h-192v-277h192zM448 427q17 0 30 -13t13 -30v-277q0 -17 -13 -30t-30 -13h-384q-17 0 -30 13t-13 30v277q0 17 13 30t30 13h384zM277 203h150v-32h-150v32zM277 309h150v-32h-150v32zM277 256h150v-32h-150v32z" /> - <glyph glyph-name="uniE86E" unicode="class" -d="M128 427v-171l53 32l54 -32v171h-107zM384 469q17 0 30 -12.5t13 -29.5v-342q0 -17 -13 -29.5t-30 -12.5h-256q-17 0 -30 12.5t-13 29.5v342q0 17 13 29.5t30 12.5h256z" /> - <glyph glyph-name="uniE86F" unicode="code" -d="M311 158l99 98l-99 98l30 30l128 -128l-128 -128zM201 158l-30 -30l-128 128l128 128l30 -30l-99 -98z" /> - <glyph glyph-name="uniE870" unicode="credit_card" -d="M427 341v43h-342v-43h342zM427 128v128h-342v-128h342zM427 427q18 0 30 -12.5t12 -30.5v-256q0 -18 -12 -30.5t-30 -12.5h-342q-18 0 -30 12.5t-12 30.5v256q0 18 12 30.5t30 12.5h342z" /> - <glyph glyph-name="uniE871" unicode="dashboard" -d="M277 448h171v-128h-171v128zM277 64v213h171v-213h-171zM64 64v128h171v-128h-171zM64 235v213h171v-213h-171z" /> - <glyph glyph-name="uniE872" unicode="delete" -d="M405 427v-43h-298v43h74l22 21h106l22 -21h74zM128 107v256h256v-256q0 -17 -13 -30t-30 -13h-170q-17 0 -30 13t-13 30z" /> - <glyph glyph-name="uniE873" unicode="description" -d="M277 320h118l-118 117v-117zM341 213v43h-170v-43h170zM341 128v43h-170v-43h170zM299 469l128 -128v-256q0 -17 -13 -29.5t-30 -12.5h-256q-17 0 -30 12.5t-13 29.5l1 342q0 17 12.5 29.5t29.5 12.5h171z" /> - <glyph glyph-name="uniE875" unicode="dns" -d="M149 320q17 0 30 13t13 30t-13 29.5t-30 12.5t-29.5 -12.5t-12.5 -29.5t12.5 -30t29.5 -13zM427 448q9 0 15 -6t6 -15v-128q0 -9 -6 -15.5t-15 -6.5h-342q-9 0 -15 6.5t-6 15.5v128q0 9 6 15t15 6h342zM149 107q17 0 30 12.5t13 29.5t-13 30t-30 13t-29.5 -13t-12.5 -30 -t12.5 -29.5t29.5 -12.5zM427 235q9 0 15 -6.5t6 -15.5v-128q0 -9 -6 -15t-15 -6h-342q-9 0 -15 6t-6 15v128q0 9 6 15.5t15 6.5h342z" /> - <glyph glyph-name="uniE876" unicode="done" -d="M192 166l226 227l30 -30l-256 -256l-119 119l29 30z" /> - <glyph glyph-name="uniE877" unicode="done_all" -d="M9 226l30 30l119 -119l-30 -30zM474 393l31 -30l-256 -256l-120 119l31 30l89 -89zM384 363l-135 -136l-30 30l135 136z" /> - <glyph glyph-name="uniE878" unicode="event" -d="M405 107v234h-298v-234h298zM341 491h43v-43h21q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-18 0 -30.5 13t-12.5 30v298q0 17 12.5 30t30.5 13h21v43h43v-43h170v43zM363 256v-107h-107v107h107z" /> - <glyph glyph-name="uniE879" unicode="exit_to_app" -d="M405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-18 0 -30.5 13t-12.5 30v85h43v-85h298v298h-298v-85h-43v85q0 17 12.5 30t30.5 13h298zM215 179l55 56h-206v42h206l-55 56l30 30l107 -107l-107 -107z" /> - <glyph glyph-name="uniE87A" unicode="explore" -d="M303 209l81 175l-175 -81l-81 -175zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5zM256 279q10 0 16.5 -6.5t6.5 -16.5t-6.5 -16.5t-16.5 -6.5t-16.5 6.5t-6.5 16.5t6.5 16.5t16.5 6.5z" /> - <glyph glyph-name="uniE87B" unicode="extension" -d="M437 277q22 0 38 -15.5t16 -37.5t-16 -37.5t-38 -15.5h-32v-86q0 -17 -12.5 -29.5t-29.5 -12.5h-81v32q0 24 -17 40.5t-41 16.5t-41 -16.5t-17 -40.5v-32h-81q-17 0 -29.5 12.5t-12.5 29.5v81h32q24 0 40.5 17t16.5 41t-16.5 41t-40.5 17h-32v81q0 17 12.5 29.5 -t29.5 12.5h86v32q0 22 15.5 38t37.5 16t37.5 -16t15.5 -38v-32h86q17 0 29.5 -12.5t12.5 -29.5v-86h32z" /> - <glyph glyph-name="uniE87C" unicode="face" -d="M256 85q70 0 120.5 50.5t50.5 120.5q0 22 -7 48q-19 -5 -48 -5q-110 0 -174 90q-33 -80 -112 -115q-1 -6 -1 -18q0 -70 50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z -M320 261q11 0 19 -7.5t8 -18.5t-8 -19t-19 -8t-19 8t-8 19t8 18.5t19 7.5zM192 261q11 0 19 -7.5t8 -18.5t-8 -19t-19 -8t-19 8t-8 19t8 18.5t19 7.5z" /> - <glyph glyph-name="uniE87D" unicode="favorite" -d="M256 57l-31 28q-53 48 -77 71t-53.5 57t-40.5 61.5t-11 56.5q0 49 33.5 83t83.5 34q58 0 96 -45q38 45 96 45q50 0 83.5 -34t33.5 -83q0 -39 -26 -81t-56.5 -73t-99.5 -93z" /> - <glyph glyph-name="uniE87E" unicode="favorite_outline" -d="M258 116q48 43 71 65t50 52t37.5 53t10.5 45q0 32 -21.5 53t-53.5 21q-25 0 -46.5 -14t-29.5 -36h-40q-8 22 -29.5 36t-46.5 14q-32 0 -53.5 -21t-21.5 -53q0 -22 10.5 -45t37.5 -53t50 -52t71 -65l2 -2zM352 448q50 0 83.5 -34t33.5 -83q0 -29 -11 -56.5t-40.5 -61.5 -t-53.5 -57t-77 -71l-31 -28l-31 27q-69 62 -99.5 93t-56.5 73t-26 81q0 49 33.5 83t83.5 34q58 0 96 -45q38 45 96 45z" /> - <glyph glyph-name="uniE87F" unicode="feedback" -d="M277 299v85h-42v-85h42zM277 213v43h-42v-43h42zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-299l-85 -85v384q0 17 12.5 29.5t29.5 12.5h342z" /> - <glyph glyph-name="uniE880" unicode="find_in_page" -d="M192 235q0 26 19 45t45 19t45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45zM427 94l-82 82q18 28 18 59q0 44 -31.5 75t-75.5 31t-75.5 -31t-31.5 -75t31.5 -75.5t75.5 -31.5q31 0 59 18l94 -95q-11 -8 -25 -8h-256q-17 0 -30 12.5t-13 29.5l1 342q0 17 12.5 29.5 -t29.5 12.5h171l128 -128v-247z" /> - <glyph glyph-name="uniE881" unicode="find_replace" -d="M355 189l103 -104l-31 -31l-104 103q-40 -29 -88 -29q-62 0 -106 44l-44 -44v128h128l-54 -54q31 -31 76 -31q39 0 67.5 24t36.5 61h43q-4 -36 -27 -67zM235 384q-39 0 -68 -24t-37 -61h-43q8 54 50 91t98 37q61 0 105 -44l44 44v-128h-128l54 54q-31 31 -75 31z" /> - <glyph glyph-name="uniE882" unicode="flip_to_back" -d="M320 149v43h43v-43h-43zM320 405v43h43v-43h-43zM107 363v-256h256v-43h-256q-18 0 -30.5 13t-12.5 30v256h43zM405 149v43h43q0 -17 -13 -30t-30 -13zM405 320v43h43v-43h-43zM405 235v42h43v-42h-43zM192 149q-18 0 -30.5 13t-12.5 30h43v-43zM277 448v-43h-42v43h42z -M405 448q17 0 30 -13t13 -30h-43v43zM277 192v-43h-42v43h42zM192 448v-43h-43q0 17 12.5 30t30.5 13zM192 277v-42h-43v42h43zM192 363v-43h-43v43h43z" /> - <glyph glyph-name="uniE883" unicode="flip_to_front" -d="M149 64v43h43v-43h-43zM235 64v43h42v-43h-42zM405 192v213h-213v-213h213zM405 448q17 0 30 -13t13 -30v-213q0 -17 -13 -30t-30 -13h-213q-18 0 -30.5 13t-12.5 30v213q0 17 12.5 30t30.5 13h213zM320 64v43h43v-43h-43zM64 320v43h43v-43h-43zM107 64q-18 0 -30.5 13 -t-12.5 30h43v-43zM64 149v43h43v-43h-43zM64 235v42h43v-42h-43z" /> - <glyph glyph-name="uniE884" unicode="get_app" -d="M107 128h298v-43h-298v43zM405 320l-149 -149l-149 149h85v128h128v-128h85z" /> - <glyph glyph-name="uniE885" unicode="grade" -d="M256 144l-132 -80l35 150l-116 101l153 13l60 141l60 -141l153 -13l-116 -101l35 -150z" /> - <glyph glyph-name="uniE886" unicode="group_work" -d="M341 139q22 0 38 15.5t16 37.5t-16 37.5t-38 15.5t-37.5 -15.5t-15.5 -37.5t15.5 -37.5t37.5 -15.5zM203 341q0 -22 15.5 -37.5t37.5 -15.5t37.5 15.5t15.5 37.5t-15.5 38t-37.5 16t-37.5 -16t-15.5 -38zM171 139q22 0 37.5 15.5t15.5 37.5t-15.5 37.5t-37.5 15.5 -t-38 -15.5t-16 -37.5t16 -37.5t38 -15.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE887" unicode="help" -d="M321 272q20 20 20 48q0 35 -25 60t-60 25t-60 -25t-25 -60h42q0 17 13 30t30 13t30 -13t13 -30t-13 -30l-26 -27q-25 -27 -25 -60v-11h42q0 33 25 60zM277 107v42h-42v-42h42zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5 -t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE888" unicode="highlight_remove" -d="M256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5zM311 341l30 -30l-55 -55l55 -55 -l-30 -30l-55 55l-55 -55l-30 30l55 55l-55 55l30 30l55 -55z" /> - <glyph glyph-name="uniE889" unicode="history" -d="M256 341h32v-90l75 -45l-16 -26l-91 55v106zM277 448q79 0 135.5 -56t56.5 -136t-56.5 -136t-135.5 -56t-135 56l30 31q44 -44 105 -44q62 0 106 43.5t44 105.5t-44 105.5t-106 43.5t-105.5 -43.5t-43.5 -105.5h64l-86 -86l-2 3l-83 83h64q0 80 56.5 136t135.5 56z" /> - <glyph glyph-name="uniE88A" unicode="home" -d="M213 85h-106v171h-64l213 192l213 -192h-64v-171h-106v128h-86v-128z" /> - <glyph glyph-name="uniE88B" unicode="hourglass_empty" -d="M256 267l85 85v75h-170v-75zM341 160l-85 85l-85 -85v-75h170v75zM128 469h256v-128l-85 -85l85 -85v-128h-256v128l85 85l-85 85v128z" /> - <glyph glyph-name="uniE88C" unicode="hourglass_full" -d="M128 469h256v-128l-85 -85l85 -85v-128h-256v128l85 85l-85 85v128z" /> - <glyph glyph-name="uniE88D" unicode="https" -d="M322 341v43q0 27 -19.5 46.5t-46.5 19.5t-46.5 -19.5t-19.5 -46.5v-43h132zM256 149q17 0 30 13t13 30t-13 30t-30 13t-30 -13t-13 -30t13 -30t30 -13zM384 341q17 0 30 -12.5t13 -29.5v-214q0 -17 -13 -29.5t-30 -12.5h-256q-17 0 -30 12.5t-13 29.5v214q0 17 13 29.5 -t30 12.5h21v43q0 44 31.5 75.5t75.5 31.5t75.5 -31.5t31.5 -75.5v-43h21z" /> - <glyph glyph-name="uniE88E" unicode="info" -d="M277 320v43h-42v-43h42zM277 149v128h-42v-128h42zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE88F" unicode="info_outline" -d="M235 320v43h42v-43h-42zM256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5zM235 149 -v128h42v-128h-42z" /> - <glyph glyph-name="uniE890" unicode="input" -d="M235 171v64h-214v42h214v64l85 -85zM448 448q17 0 30 -12.5t13 -30.5v-299q0 -17 -13 -29.5t-30 -12.5h-384q-17 0 -30 12.5t-13 29.5v86h43v-86h384v300h-384v-86h-43v85q0 17 13 30t30 13h384z" /> - <glyph glyph-name="uniE891" unicode="invert_colors_on" -d="M256 94v309l-90 -90q-38 -38 -38 -91q0 -52 38 -90t90 -38zM377 343q50 -50 50 -120.5t-50 -120.5t-121 -50t-121 50t-50 120.5t50 120.5l121 121z" /> - <glyph glyph-name="uniE892" unicode="label" -d="M376 387l93 -131l-93 -131q-13 -18 -35 -18h-234q-17 0 -30 12.5t-13 29.5v214q0 17 13 29.5t30 12.5h234q22 0 35 -18z" /> - <glyph glyph-name="uniE893" unicode="label_outline" -d="M341 149l76 107l-76 107h-234v-214h234zM376 387l93 -131l-93 -131q-13 -18 -35 -18h-234q-17 0 -30 12.5t-13 29.5v214q0 17 13 29.5t30 12.5h234q22 0 35 -18z" /> - <glyph glyph-name="uniE894" unicode="language" -d="M349 213h72q6 28 6 43t-6 43h-72q3 -21 3 -43t-3 -43zM311 95q61 20 93 76h-63q-10 -40 -30 -76zM306 213q3 21 3 43t-3 43h-100q-3 -21 -3 -43t3 -43h100zM256 86q28 41 41 85h-82q13 -44 41 -85zM171 341q10 40 30 76q-61 -20 -93 -76h63zM108 171q32 -56 93 -76 -q-20 36 -30 76h-63zM91 213h72q-3 21 -3 43t3 43h-72q-6 -28 -6 -43t6 -43zM256 426q-28 -41 -41 -85h82q-13 44 -41 85zM404 341q-32 56 -93 76q20 -36 30 -76h63zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5 -t150.5 62.5z" /> - <glyph glyph-name="uniE895" unicode="launch" -d="M299 448h149v-149h-43v76l-209 -209l-30 30l209 209h-76v43zM405 107v149h43v-149q0 -17 -13 -30t-30 -13h-298q-18 0 -30.5 13t-12.5 30v298q0 17 12.5 30t30.5 13h149v-43h-149v-298h298z" /> - <glyph glyph-name="uniE896" unicode="list" -d="M149 363h299v-43h-299v43zM149 149v43h299v-43h-299zM149 235v42h299v-42h-299zM64 320v43h43v-43h-43zM64 149v43h43v-43h-43zM64 235v42h43v-42h-43z" /> - <glyph glyph-name="uniE897" unicode="lock" -d="M322 341v43q0 27 -19.5 46.5t-46.5 19.5t-46.5 -19.5t-19.5 -46.5v-43h132zM256 149q17 0 30 13t13 30t-13 30t-30 13t-30 -13t-13 -30t13 -30t30 -13zM384 341q17 0 30 -12.5t13 -29.5v-214q0 -17 -13 -29.5t-30 -12.5h-256q-17 0 -30 12.5t-13 29.5v214q0 17 13 29.5 -t30 12.5h21v43q0 44 31.5 75.5t75.5 31.5t75.5 -31.5t31.5 -75.5v-43h21z" /> - <glyph glyph-name="uniE898" unicode="lock_open" -d="M384 85v214h-256v-214h256zM384 341q17 0 30 -12.5t13 -29.5v-214q0 -17 -13 -29.5t-30 -12.5h-256q-17 0 -30 12.5t-13 29.5v214q0 17 13 29.5t30 12.5h194v43q0 27 -19.5 46.5t-46.5 19.5t-46.5 -19.5t-19.5 -46.5h-41q0 44 31.5 75.5t75.5 31.5t75.5 -31.5t31.5 -75.5 -v-43h21zM256 149q-17 0 -30 13t-13 30t13 30t30 13t30 -13t13 -30t-13 -30t-30 -13z" /> - <glyph glyph-name="uniE899" unicode="lock_outline" -d="M384 85v214h-256v-214h256zM190 384v-43h132v43q0 27 -19.5 46.5t-46.5 19.5t-46.5 -19.5t-19.5 -46.5zM384 341q17 0 30 -12.5t13 -29.5v-214q0 -17 -13 -29.5t-30 -12.5h-256q-17 0 -30 12.5t-13 29.5v214q0 17 13 29.5t30 12.5h21v43q0 44 31.5 75.5t75.5 31.5 -t75.5 -31.5t31.5 -75.5v-43h21zM256 149q-17 0 -30 13t-13 30t13 30t30 13t30 -13t13 -30t-13 -30t-30 -13z" /> - <glyph glyph-name="uniE89A" unicode="loyalty" -d="M368 186q16 16 16 38t-15.5 37.5t-37.5 15.5q-23 0 -38 -15l-16 -16l-15 16q-15 15 -38 15q-22 0 -37.5 -15.5t-15.5 -37.5q0 -23 15 -38l91 -91zM117 363q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5t9.5 -22.5t22.5 -9.5zM457 265 -q12 -12 12 -30t-12 -30l-150 -150q-12 -12 -30 -12t-30 12l-192 192q-12 12 -12 30v150q0 17 12.5 29.5t29.5 12.5h150q18 0 30 -12z" /> - <glyph glyph-name="uniE89B" unicode="markunread_mailbox" -d="M427 384q17 0 29.5 -13t12.5 -30v-256q0 -17 -12.5 -29.5t-29.5 -12.5h-342q-17 0 -29.5 12.5t-12.5 29.5v256q0 17 12.5 30t29.5 13h43v128h171v-85h-128v-171h42v128h214z" /> - <glyph glyph-name="uniE89C" unicode="note_add" -d="M277 320h118l-118 117v-117zM341 171v42h-64v64h-42v-64h-64v-42h64v-64h42v64h64zM299 469l128 -128v-256q0 -17 -13 -29.5t-30 -12.5h-256q-17 0 -30 12.5t-13 29.5l1 342q0 17 12.5 29.5t29.5 12.5h171z" /> - <glyph glyph-name="uniE89D" unicode="open_in_browser" -d="M256 299l85 -86h-64v-128h-42v128h-64zM405 427q18 0 30.5 -13t12.5 -30v-256q0 -17 -13 -30t-30 -13h-85v43h85v213h-298v-213h85v-43h-85q-18 0 -30.5 13t-12.5 30v256q0 17 12.5 30t30.5 13h298z" /> - <glyph glyph-name="uniE89E" unicode="open_in_new" -d="M299 448h149v-149h-43v76l-209 -209l-30 30l209 209h-76v43zM405 107v149h43v-149q0 -17 -13 -30t-30 -13h-298q-18 0 -30.5 13t-12.5 30v298q0 17 12.5 30t30.5 13h149v-43h-149v-298h298z" /> - <glyph glyph-name="uniE89F" unicode="open_with" -d="M299 192v-64h64l-107 -107l-107 107h64v64h86zM491 256l-107 -107v64h-64v86h64v64zM192 299v-86h-64v-64l-107 107l107 107v-64h64zM213 320v64h-64l107 107l107 -107h-64v-64h-86z" /> - <glyph glyph-name="uniE8A0" unicode="pageview" -d="M358 124l30 30l-62 62q15 25 15 51q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28q26 0 51 15zM427 427q17 0 29.5 -13t12.5 -30v-256q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 30t29.5 13h342zM245 320q22 0 38 -15.5t16 -37.5 -t-16 -38t-38 -16t-37.5 16t-15.5 38t15.5 37.5t37.5 15.5z" /> - <glyph glyph-name="uniE8A1" unicode="payment" -d="M427 341v43h-342v-43h342zM427 128v128h-342v-128h342zM427 427q18 0 30 -12.5t12 -30.5v-256q0 -18 -12 -30.5t-30 -12.5h-342q-18 0 -30 12.5t-12 30.5v256q0 18 12 30.5t30 12.5h342z" /> - <glyph glyph-name="uniE8A2" unicode="perm_camera_mic" -d="M299 235v85q0 17 -13 30t-30 13t-30 -13t-13 -30v-85q0 -17 13 -30t30 -13t30 13t13 30zM427 405q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-150v45q45 8 76 43.5t31 82.5h-43q0 -35 -25 -60.5t-60 -25.5t-60 25.5t-25 60.5h-43q0 -47 31 -82.5 -t76 -43.5v-45h-150q-17 0 -29.5 13t-12.5 30v256q0 17 12.5 29.5t29.5 12.5h68l39 43h128l39 -43h68z" /> - <glyph glyph-name="uniE8A3" unicode="perm_contact_calendar" -d="M384 128v21q0 29 -44 47.5t-84 18.5t-84 -18.5t-44 -47.5v-21h256zM256 384q-26 0 -45 -19t-19 -45t19 -45t45 -19t45 19t19 45t-19 45t-45 19zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-18 0 -30.5 13t-12.5 30v298q0 17 12.5 30t30.5 13h21v43h43 -v-43h170v43h43v-43h21z" /> - <glyph glyph-name="uniE8A4" unicode="perm_data_setting" -d="M405 75q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5t9.5 -22.5t22.5 -9.5zM484 96l23 -17q3 -3 1 -7l-21 -37q-3 -5 -7 -3l-26 11q-3 -3 -18 -10l-4 -29q0 -4 -6 -4h-42q-6 0 -6 4l-4 29q-8 4 -18 10l-26 -11q-5 -2 -7 3l-21 37q-2 4 1 7l23 17 -q0 1 -0.5 5t-0.5 6t0.5 5.5t0.5 4.5l-23 18q-3 3 -1 7l21 37q2 4 7 2l26 -11q12 8 18 11l4 28q0 4 6 4h42q6 0 6 -4l4 -28q4 -2 18 -11l26 11q5 2 7 -2l21 -37q2 -4 -1 -7l-23 -18q1 -3 1 -10q0 -2 -0.5 -6t-0.5 -5zM405 267q-66 0 -113 -47t-47 -113q0 -8 2 -22h-247 -l427 427l-1 -247q-14 2 -21 2z" /> - <glyph glyph-name="uniE8A5" unicode="perm_device_information" -d="M363 107v298h-214v-298h214zM363 490q17 0 29.5 -12.5t12.5 -29.5v-384q0 -17 -12.5 -30t-29.5 -13h-214q-17 0 -29.5 13t-12.5 30v384q0 17 12.5 30t29.5 13zM277 277v-128h-42v128h42zM277 363v-43h-42v43h42z" /> - <glyph glyph-name="uniE8A6" unicode="perm_identity" -d="M256 235q32 0 70 -9t69.5 -30t31.5 -47v-64h-342v64q0 26 31.5 47t69.5 30t70 9zM256 427q35 0 60 -25.5t25 -60.5t-25 -60t-60 -25t-60 25t-25 60t25 60.5t60 25.5zM256 194q-44 0 -87 -16.5t-43 -28.5v-23h260v23q0 12 -43 28.5t-87 16.5zM256 386q-19 0 -32 -13 -t-13 -32t13 -31.5t32 -12.5t32 12.5t13 31.5t-13 32t-32 13z" /> - <glyph glyph-name="uniE8A7" unicode="perm_media" -d="M149 192h299l-75 96l-53 -64l-75 96zM469 427q17 0 30 -13t13 -30v-213q0 -17 -13 -30t-30 -13h-341q-17 0 -30 13t-13 30l1 256q0 17 12.5 29.5t29.5 12.5h128l43 -42h170zM43 384v-299h384v-42h-384q-17 0 -30 12.5t-13 29.5v299h43z" /> - <glyph glyph-name="uniE8A8" unicode="perm_phone_msg" -d="M256 448h192v-149h-128l-64 -64v213zM427 181q9 0 15 -6t6 -15v-75q0 -9 -6 -15t-15 -6q-150 0 -256.5 106.5t-106.5 256.5q0 9 6 15t15 6h75q9 0 15 -6t6 -15q0 -40 12 -76q4 -13 -5 -22l-47 -47q48 -93 141 -141l47 47q9 9 22 5q36 -12 76 -12z" /> - <glyph glyph-name="uniE8A9" unicode="perm_scan_wifi" -d="M235 341h42v43h-42v-43zM277 171v128h-42v-128h42zM256 448q136 0 256 -91l-256 -314l-256 315q118 90 256 90z" /> - <glyph glyph-name="uniE8AA" unicode="picture_in_picture" -d="M448 106v300h-384v-300h384zM448 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-384q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h384zM405 363v-128h-170v128h170z" /> - <glyph glyph-name="uniE8AB" unicode="polymer" -d="M405 427l96 -171l-96 -171h-85l96 171l-56 99l-168 -270h-85l-96 171l96 171h85l-96 -171l56 -99l168 270h85z" /> - <glyph glyph-name="uniE8AC" unicode="power_settings_new" -d="M380 402q68 -58 68 -146q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 88 68 146l30 -30q-55 -45 -55 -116q0 -62 43.5 -105.5t105.5 -43.5t105.5 43.5t43.5 105.5q0 71 -55 115zM277 448v-213h-42v213h42z" /> - <glyph glyph-name="uniE8AD" unicode="print" -d="M384 448v-85h-256v85h256zM405 256q9 0 15.5 6t6.5 15t-6.5 15.5t-15.5 6.5t-15 -6.5t-6 -15.5t6 -15t15 -6zM341 107v106h-170v-106h170zM405 341q26 0 45 -19t19 -45v-128h-85v-85h-256v85h-85v128q0 26 19 45t45 19h298z" /> - <glyph glyph-name="uniE8AE" unicode="query_builder" -d="M267 363v-112l96 -57l-16 -27l-112 68v128h32zM256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5 -t150.5 62.5z" /> - <glyph glyph-name="uniE8AF" unicode="question_answer" -d="M363 256q0 -9 -6.5 -15t-15.5 -6h-213l-85 -86v299q0 9 6 15t15 6h277q9 0 15.5 -6t6.5 -15v-192zM448 384q9 0 15 -6t6 -15v-320l-85 85h-235q-9 0 -15 6t-6 15v43h277v192h43z" /> - <glyph glyph-name="uniE8B0" unicode="receipt" -d="M64 43v426l32 -32l32 32l32 -32l32 32l32 -32l32 32l32 -32l32 32l32 -32l32 32l32 -32l32 32v-426l-32 32l-32 -32l-32 32l-32 -32l-32 32l-32 -32l-32 32l-32 -32l-32 32l-32 -32l-32 32zM384 320v43h-256v-43h256zM384 235v42h-256v-42h256zM384 149v43h-256v-43h256z -" /> - <glyph glyph-name="uniE8B1" unicode="redeem" -d="M427 213v128h-109l45 -60l-35 -25q-64 87 -72 98q-8 -11 -72 -98l-35 25l45 60h-109v-128h342zM427 107v42h-342v-42h342zM192 427q-9 0 -15 -6.5t-6 -15.5t6 -15t15 -6t15 6t6 15t-6 15.5t-15 6.5zM320 427q-9 0 -15 -6.5t-6 -15.5t6 -15t15 -6t15 6t6 15t-6 15.5 -t-15 6.5zM427 384q18 0 30 -12.5t12 -30.5v-234q0 -18 -12 -30.5t-30 -12.5h-342q-18 0 -30 12.5t-12 30.5v234q0 18 12 30.5t30 12.5h47q-4 14 -4 21q0 26 19 45t45 19q33 0 53 -28l11 -15l11 15q20 28 53 28q26 0 45 -19t19 -45q0 -7 -4 -21h47z" /> - <glyph glyph-name="uniE8B2" unicode="report_problem" -d="M277 213v86h-42v-86h42zM277 128v43h-42v-43h42zM21 64l235 405l235 -405h-470z" /> - <glyph glyph-name="uniE8B3" unicode="restore" -d="M256 341h32v-90l75 -45l-16 -26l-91 55v106zM277 448q79 0 135.5 -56t56.5 -136t-56.5 -136t-135.5 -56t-135 56l30 31q44 -44 105 -44q62 0 106 43.5t44 105.5t-44 105.5t-106 43.5t-105.5 -43.5t-43.5 -105.5h64l-86 -86l-2 3l-83 83h64q0 80 56.5 136t135.5 56z" /> - <glyph glyph-name="uniE8B4" unicode="room" -d="M256 267q22 0 37.5 15.5t15.5 37.5t-15.5 37.5t-37.5 15.5t-37.5 -15.5t-15.5 -37.5t15.5 -37.5t37.5 -15.5zM256 469q62 0 105.5 -43.5t43.5 -105.5q0 -31 -15.5 -71t-37.5 -75t-43.5 -65.5t-36.5 -48.5l-16 -17q-6 7 -16 18.5t-36 46t-45.5 67t-35.5 73.5t-16 72 -q0 62 43.5 105.5t105.5 43.5z" /> - <glyph glyph-name="uniE8B5" unicode="schedule" -d="M267 363v-112l96 -57l-16 -27l-112 68v128h32zM256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5 -t150.5 62.5z" /> - <glyph glyph-name="uniE8B6" unicode="search" -d="M203 213q40 0 68 28t28 68t-28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28zM331 213l106 -106l-32 -32l-106 106v17l-6 6q-38 -33 -90 -33q-58 0 -98.5 40t-40.5 98t40.5 98.5t98.5 40.5t98 -40.5t40 -98.5q0 -52 -33 -90l6 -6h17z" /> - <glyph glyph-name="uniE8B8" unicode="settings" -d="M256 181q31 0 53 22t22 53t-22 53t-53 22t-53 -22t-22 -53t22 -53t53 -22zM415 235l45 -35q7 -5 2 -14l-43 -74q-4 -7 -13 -4l-53 21q-21 -15 -36 -21l-8 -56q-2 -9 -10 -9h-86q-8 0 -10 9l-8 56q-19 8 -36 21l-53 -21q-9 -3 -13 4l-43 74q-5 9 2 14l45 35q-1 7 -1 21 -t1 21l-45 35q-7 5 -2 14l43 74q4 7 13 4l53 -21q21 15 36 21l8 56q2 9 10 9h86q8 0 10 -9l8 -56q19 -8 36 -21l53 21q9 3 13 -4l43 -74q5 -9 -2 -14l-45 -35q1 -7 1 -21t-1 -21z" /> - <glyph glyph-name="uniE8B9" unicode="settings_applications" -d="M368 256q0 10 -1 15l32 24q5 4 1 10l-30 52q-3 5 -9 3l-37 -15q-13 10 -25 15l-6 39q-2 6 -7 6h-60q-6 0 -7 -6l-6 -40q-16 -7 -25 -14l-37 15q-5 2 -9 -4l-30 -51q-4 -6 1 -10l32 -24q-1 -5 -1 -15t1 -15l-32 -24q-5 -4 -1 -10l30 -52q3 -5 9 -3l37 15q13 -10 25 -15 -l6 -39q2 -6 7 -6h60q6 0 7 6l6 40q16 7 25 14l37 -15q5 -2 9 4l30 51q4 6 -1 10l-32 24q1 5 1 15zM405 448q18 0 30.5 -13t12.5 -30v-298q0 -17 -12.5 -30t-30.5 -13h-298q-18 0 -30.5 13t-12.5 30v298q0 17 12.5 30t30.5 13h298zM256 299q17 0 30 -13t13 -30t-13 -30 -t-30 -13t-30 13t-13 30t13 30t30 13z" /> - <glyph glyph-name="uniE8BA" unicode="settings_backup_restore" -d="M256 448q80 0 136 -56t56 -136t-56 -136t-136 -56q-66 0 -117 40l30 30q40 -27 87 -27q62 0 105.5 43.5t43.5 105.5t-43.5 105.5t-105.5 43.5t-105.5 -43.5t-43.5 -105.5h64l-86 -85l-85 85h64q0 80 56 136t136 56zM299 256q0 -17 -13 -30t-30 -13t-30 13t-13 30t13 30 -t30 13t30 -13t13 -30z" /> - <glyph glyph-name="uniE8BB" unicode="settings_bluetooth" -d="M317 207l-40 40v-80zM277 430v-80l40 40zM378 390l-92 -91l92 -92l-122 -122h-21v162l-98 -98l-30 30l119 120l-119 119l30 30l98 -98v162h21zM320 0v43h43v-43h-43zM149 0v43h43v-43h-43zM235 0v43h42v-43h-42z" /> - <glyph glyph-name="uniE8BC" unicode="settings_cell" -d="M341 171v256h-170v-256h170zM341 512q17 0 30 -13t13 -30v-341q0 -17 -13 -30t-30 -13h-170q-17 0 -30 13t-13 30v341q0 17 13 30t30 13h170zM320 0v43h43v-43h-43zM235 0v43h42v-43h-42zM149 0v43h43v-43h-43z" /> - <glyph glyph-name="uniE8BD" unicode="settings_brightness" -d="M256 320v-128q26 0 45 19t19 45t-19 45t-45 19zM171 171v53l-32 32l32 32v53h53l32 32l32 -32h53v-53l32 -32l-32 -32v-53h-53l-32 -32l-32 32h-53zM448 106v300h-384v-300h384zM448 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-384q-17 0 -30 13t-13 30v298 -q0 17 13 30t30 13h384z" /> - <glyph glyph-name="uniE8BE" unicode="settings_ethernet" -d="M379 395l116 -139l-116 -139l-33 27l93 112l-93 112zM235 235v42h42v-42h-42zM363 277v-42h-43v42h43zM149 235v42h43v-42h-43zM166 368l-93 -112l93 -112l-33 -27l-116 139l116 139z" /> - <glyph glyph-name="uniE8BF" unicode="settings_input_antenna" -d="M256 491q97 0 166 -69t69 -166h-43q0 80 -56 136t-136 56t-136 -56t-56 -136h-43q0 97 69 166t166 69zM277 207v-70l73 -73l-30 -30l-64 64l-64 -64l-30 30l73 73v70q-32 13 -32 49q0 22 15.5 37.5t37.5 15.5t37.5 -15.5t15.5 -37.5q0 -36 -32 -49zM256 405 -q62 0 105.5 -43.5t43.5 -105.5h-42q0 44 -31.5 75.5t-75.5 31.5t-75.5 -31.5t-31.5 -75.5h-42q0 62 43.5 105.5t105.5 43.5z" /> - <glyph glyph-name="uniE8C0" unicode="settings_input_component" -d="M363 171v42h128v-42q0 -21 -12 -37t-31 -23v-90h-43v90q-42 15 -42 60zM277 469v-85h43v-128h-128v128h43v85q0 9 6 15.5t15 6.5t15 -6.5t6 -15.5zM448 384h43v-128h-128v128h42v85q0 9 6.5 15.5t15.5 6.5t15 -6.5t6 -15.5v-85zM21 171v42h128v-42q0 -45 -42 -60v-90h-43 -v90q-19 7 -31 23t-12 37zM192 171v42h128v-42q0 -21 -12 -37t-31 -23v-90h-42v90q-19 7 -31 23t-12 37zM107 469v-85h42v-128h-128v128h43v85q0 9 6 15.5t15 6.5t15.5 -6.5t6.5 -15.5z" /> - <glyph glyph-name="uniE8C1" unicode="settings_input_composite" -d="M363 171v42h128v-42q0 -21 -12 -37t-31 -23v-90h-43v90q-42 15 -42 60zM277 469v-85h43v-128h-128v128h43v85q0 9 6 15.5t15 6.5t15 -6.5t6 -15.5zM448 384h43v-128h-128v128h42v85q0 9 6.5 15.5t15.5 6.5t15 -6.5t6 -15.5v-85zM21 171v42h128v-42q0 -45 -42 -60v-90h-43 -v90q-19 7 -31 23t-12 37zM192 171v42h128v-42q0 -21 -12 -37t-31 -23v-90h-42v90q-19 7 -31 23t-12 37zM107 469v-85h42v-128h-128v128h43v85q0 9 6 15.5t15 6.5t15.5 -6.5t6.5 -15.5z" /> - <glyph glyph-name="uniE8C2" unicode="settings_input_hdmi" -d="M171 427v-64h42v42h22v-42h42v42h22v-42h42v64h-170zM384 363h21v-128l-64 -128v-64h-170v64l-64 128v128h21v64q0 17 13 29.5t30 12.5h170q17 0 30 -12.5t13 -29.5v-64z" /> - <glyph glyph-name="uniE8C3" unicode="settings_input_svideo" -d="M331 192q13 0 22.5 -9t9.5 -23t-9.5 -23t-22.5 -9t-22.5 9t-9.5 23t9.5 23t22.5 9zM373 299q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM256 64q80 0 136 56t56 136t-56 136t-136 56t-136 -56t-56 -136t56 -136t136 -56z -M256 491q97 0 166 -69t69 -166t-69 -166t-166 -69t-166 69t-69 166t69 166t166 69zM181 192q13 0 22.5 -9t9.5 -23t-9.5 -23t-22.5 -9t-22.5 9t-9.5 23t9.5 23t22.5 9zM320 373q0 -13 -9 -22.5t-23 -9.5h-64q-14 0 -23 9.5t-9 22.5t9 22.5t23 9.5h64q14 0 23 -9.5t9 -22.5z -M171 267q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5z" /> - <glyph glyph-name="uniE8C4" unicode="settings_overscan" -d="M448 106v300h-384v-300h384zM448 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-384q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h384zM299 171l-43 -54l-43 54h86zM128 299v-86l-53 43zM384 299l53 -43l-53 -43v86zM256 395l43 -54h-86z" /> - <glyph glyph-name="uniE8C5" unicode="settings_phone" -d="M405 320h43v-43h-43v43zM427 181q9 0 15 -6t6 -15v-75q0 -9 -6 -15t-15 -6q-150 0 -256.5 106.5t-106.5 256.5q0 9 6 15t15 6h75q9 0 15 -6t6 -15q0 -40 12 -76q4 -13 -5 -22l-47 -47q48 -93 141 -141l47 47q9 9 22 5q36 -12 76 -12zM363 320v-43h-43v43h43zM277 320v-43 -h-42v43h42z" /> - <glyph glyph-name="uniE8C6" unicode="settings_power" -d="M320 0v43h43v-43h-43zM353 417q74 -52 74 -140q0 -70 -50 -120t-121 -50t-121 50t-50 120q0 88 74 140l30 -30q-61 -38 -61 -110q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5q0 72 -62 109zM277 469v-213h-42v213h42zM235 0v43h42v-43h-42zM149 0v43h43v-43h-43z -" /> - <glyph glyph-name="uniE8C7" unicode="settings_remote" -d="M256 512q99 0 166 -69l-30 -30q-56 56 -136 56t-136 -56l-30 30q69 69 166 69zM150 383q44 44 106 44t106 -44l-30 -30q-31 31 -76 31t-76 -31zM256 192q17 0 30 13t13 30t-13 29.5t-30 12.5t-30 -12.5t-13 -29.5t13 -30t30 -13zM320 320q9 0 15 -6t6 -15v-256 -q0 -9 -6 -15.5t-15 -6.5h-128q-9 0 -15 6.5t-6 15.5v256q0 9 6 15t15 6h128z" /> - <glyph glyph-name="uniE8C8" unicode="settings_voice" -d="M405 299q0 -54 -37.5 -95t-90.5 -49v-70h-42v70q-53 8 -90.5 49t-37.5 95h36q0 -47 33.5 -78t79.5 -31t79.5 31t33.5 78h36zM320 0v43h43v-43h-43zM235 0v43h42v-43h-42zM256 235q-26 0 -45 19t-19 45v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -26 -19 -45t-45 -19z -M149 0v43h43v-43h-43z" /> - <glyph glyph-name="uniE8C9" unicode="shop" -d="M192 128l160 107l-160 85v-192zM213 427v-43h86v43h-86zM341 384h128v-277q0 -18 -12 -30.5t-30 -12.5h-342q-18 0 -30 12.5t-12 30.5v277h128v43q0 18 12 30t30 12h86q18 0 30 -12t12 -30v-43z" /> - <glyph glyph-name="uniE8CA" unicode="shop_two" -d="M256 192l117 85l-117 64v-149zM256 448v-43h85v43h-85zM384 405h107v-234q0 -18 -12.5 -30.5t-30.5 -12.5h-299q-18 0 -30 12.5t-12 30.5v234h106v43q0 18 12.5 30.5t30.5 12.5h85q18 0 30.5 -12.5t12.5 -30.5v-43zM64 320v-235h341q0 -18 -12 -30t-30 -12h-299 -q-18 0 -30.5 12t-12.5 30v235h43z" /> - <glyph glyph-name="uniE8CB" unicode="shopping_basket" -d="M256 149q17 0 30 13t13 30t-13 30t-30 13t-30 -13t-13 -30t13 -30t30 -13zM192 320h128l-64 94zM367 320h102q9 0 15.5 -6t6.5 -15q-10 -40 -30 -112.5t-25 -91.5q-9 -31 -41 -31h-278q-32 0 -41 31l-54 198q-1 2 -1 6q0 9 6.5 15t15.5 6h102l93 140q6 9 18 9t18 -9z" /> - <glyph glyph-name="uniE8CC" unicode="shopping_cart" -d="M363 128q17 0 29.5 -13t12.5 -30t-12.5 -29.5t-29.5 -12.5t-30 12.5t-13 29.5t13 30t30 13zM21 469h70l20 -42h316q9 0 15 -6.5t6 -15.5q0 -5 -3 -10l-76 -138q-12 -22 -37 -22h-159l-19 -35l-1 -3q0 -5 5 -5h247v-43h-256q-17 0 -29.5 13t-12.5 30q0 10 5 20l29 53 -l-77 162h-43v42zM149 128q17 0 30 -13t13 -30t-13 -29.5t-30 -12.5t-29.5 12.5t-12.5 29.5t12.5 30t29.5 13z" /> - <glyph glyph-name="uniE8CD" unicode="speaker_notes" -d="M384 341v43h-171v-43h171zM384 277v43h-171v-43h171zM320 213v43h-107v-43h107zM171 341v43h-43v-43h43zM171 277v43h-43v-43h43zM171 213v43h-43v-43h43zM427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-299l-85 -85v384q0 17 12.5 29.5 -t29.5 12.5h342z" /> - <glyph glyph-name="uniE8CE" unicode="spellcheck" -d="M461 265l30 -30l-203 -203l-108 109l30 30l78 -79zM137 277h88l-44 118zM266 171l-25 64h-120l-24 -64h-45l109 277h40l109 -277h-44z" /> - <glyph glyph-name="uniE8D0" unicode="stars" -d="M346 128l-24 103l80 69l-105 9l-41 96l-41 -97l-105 -8l80 -69l-24 -103l90 54zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE8D1" unicode="store" -d="M256 128v85h-128v-85h128zM448 213h-21v-128h-43v128h-85v-128h-214v128h-21v43l21 107h342l21 -107v-43zM427 427v-43h-342v43h342z" /> - <glyph glyph-name="uniE8D2" unicode="subject" -d="M85 405h342v-42h-342v42zM85 192v43h342v-43h-342zM427 320v-43h-342v43h342zM299 149v-42h-214v42h214z" /> - <glyph glyph-name="uniE8D3" unicode="supervisor_account" -d="M192 235q22 0 51 -6q-51 -28 -51 -74v-48h-149v53q0 23 27.5 41t60.5 26t61 8zM352 213q37 0 77 -16t40 -42v-48h-234v48q0 26 40 42t77 16zM192 277q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM352 256q-22 0 -37.5 15.5t-15.5 37.5t15.5 38 -t37.5 16t37.5 -16t15.5 -38t-15.5 -37.5t-37.5 -15.5z" /> - <glyph glyph-name="uniE8D4" unicode="swap_horiz" -d="M448 320l-85 -85v64h-150v42h150v64zM149 277v-64h150v-42h-150v-64l-85 85z" /> - <glyph glyph-name="uniE8D5" unicode="swap_vert" -d="M192 448l85 -85h-64v-150h-42v150h-64zM341 149h64l-85 -85l-85 85h64v150h42v-150z" /> - <glyph glyph-name="uniE8D6" unicode="swap_vertical_circle" -d="M373 192h-53v85h-43v-85h-53l75 -75zM139 320h53v-85h43v85h53l-75 75zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE8D7" unicode="system_update_alt" -d="M448 437q17 0 30 -12.5t13 -29.5v-299q0 -17 -13 -30t-30 -13h-384q-17 0 -30 13t-13 30v299q0 17 13 29.5t30 12.5h128v-42h-128v-299h384v299h-128v42h128zM256 160l-85 85h64v192h42v-192h64z" /> - <glyph glyph-name="uniE8D8" unicode="tab" -d="M448 107v213h-171v85h-213v-298h384zM448 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-384q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h384z" /> - <glyph glyph-name="uniE8D9" unicode="tab_unselected" -d="M363 64v43h42v-43h-42zM277 64v43h43v-43h-43zM448 235v42h43v-42h-43zM448 64v43h43q0 -17 -13 -30t-30 -13zM107 405v43h42v-43h-42zM107 64v43h42v-43h-42zM192 405v43h43v-43h-43zM448 149v43h43v-43h-43zM448 448q17 0 30 -13t13 -30v-85h-214v128h171zM64 64 -q-17 0 -30 13t-13 30h43v-43zM21 149v43h43v-43h-43zM192 64v43h43v-43h-43zM21 405q0 17 13 30t30 13v-43h-43zM21 235v42h43v-42h-43zM21 320v43h43v-43h-43z" /> - <glyph glyph-name="uniE8DA" unicode="theaters" -d="M384 320v43h-43v-43h43zM384 235v42h-43v-42h43zM384 149v43h-43v-43h43zM171 320v43h-43v-43h43zM171 235v42h-43v-42h43zM171 149v43h-43v-43h43zM384 448h43v-384h-43v43h-43v-43h-170v43h-43v-43h-43v384h43v-43h43v43h170v-43h43v43z" /> - <glyph glyph-name="uniE8DB" unicode="thumb_down" -d="M405 448h86v-256h-86v256zM320 448q17 0 30 -13t13 -30v-213q0 -17 -13 -30l-140 -141l-23 23q-9 9 -9 22v7l21 98h-135q-17 0 -30 12.5t-13 29.5l1 2h-1v41q0 8 3 16l65 150q10 26 39 26h192z" /> - <glyph glyph-name="uniE8DC" unicode="thumb_up" -d="M491 299l-1 -2h1v-41q0 -8 -3 -16l-65 -150q-10 -26 -39 -26h-192q-17 0 -30 13t-13 30v213q0 17 13 30l140 141l23 -23q9 -9 9 -22v-7l-21 -98h135q17 0 30 -12.5t13 -29.5zM21 64v256h86v-256h-86z" /> - <glyph glyph-name="uniE8DD" unicode="thumbs_up_down" -d="M480 299q14 0 23 -9.5t9 -22.5v-139q0 -14 -9 -23l-106 -105l-17 17q-7 7 -7 17q3 14 8.5 40t6.5 33h-111q-9 0 -15 6t-6 15v27q0 3 2 11l49 113q9 20 29 20h144zM256 384v-27q0 -3 -2 -11l-49 -113q-9 -20 -29 -20h-144q-14 0 -23 9.5t-9 22.5v139q0 14 9 23l106 105 -l17 -17q7 -7 7 -17q-3 -14 -8.5 -40t-6.5 -33h111q9 0 15 -6t6 -15z" /> - <glyph glyph-name="uniE8DE" unicode="toc" -d="M405 235v42h43v-42h-43zM405 363h43v-43h-43v43zM405 149v43h43v-43h-43zM64 149v43h299v-43h-299zM64 235v42h299v-42h-299zM64 320v43h299v-43h-299z" /> - <glyph glyph-name="uniE8DF" unicode="today" -d="M149 299h107v-107h-107v107zM405 107v234h-298v-234h298zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-18 0 -30.5 13t-12.5 30v298q0 17 12.5 30t30.5 13h21v43h43v-43h170v43h43v-43h21z" /> - <glyph glyph-name="uniE8E0" unicode="toll" -d="M64 256q0 -42 23.5 -75t61.5 -46v-44q-56 14 -92 60t-36 105t36 105t92 60v-44q-38 -13 -61.5 -46t-23.5 -75zM320 128q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5zM320 427q70 0 120.5 -50.5t50.5 -120.5 -t-50.5 -120.5t-120.5 -50.5t-120.5 50.5t-50.5 120.5t50.5 120.5t120.5 50.5z" /> - <glyph glyph-name="uniE8E1" unicode="track_changes" -d="M407 407q62 -62 62 -151q0 -88 -62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5h21v-176q22 -12 22 -37q0 -17 -13 -30t-30 -13t-30 13t-13 30q0 25 22 37v45q-28 -8 -46 -30t-18 -52q0 -35 25 -60t60 -25t60 25t25 60q0 33 -25 60l30 30 -q38 -38 38 -90q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5q0 47 30.5 82.5t76.5 43.5v43q-63 -8 -106.5 -56t-43.5 -113q0 -70 50.5 -120.5t120.5 -50.5t120.5 50.5t50.5 120.5q0 71 -50 121z" /> - <glyph glyph-name="uniE8E2" unicode="translate" -d="M339 149h69l-35 93zM395 299l96 -256h-43l-24 64h-101l-24 -64h-43l96 256h43zM275 191l-17 -44l-66 66l-107 -106l-30 30l109 107q-40 44 -64 97h43q21 -40 49 -71q46 51 68 114h-239v43h150v42h42v-42h150v-43h-63q-26 -80 -79 -139l-1 -1z" /> - <glyph glyph-name="uniE8E3" unicode="trending_down" -d="M341 128l49 49l-104 104l-85 -85l-158 158l30 30l128 -128l85 85l134 -134l49 49v-128h-128z" /> - <glyph glyph-name="uniE8E4" unicode="trending_neutral" -d="M469 256l-85 -85v64h-320v42h320v64z" /> - <glyph glyph-name="uniE8E5" unicode="trending_up" -d="M341 384h128v-128l-49 49l-134 -134l-85 85l-128 -128l-30 30l158 158l85 -85l104 104z" /> - <glyph glyph-name="uniE8E6" unicode="turned_in" -d="M363 448q17 0 29.5 -13t12.5 -30v-341l-149 64l-149 -64v341q0 17 12.5 30t29.5 13h214z" /> - <glyph glyph-name="uniE8E7" unicode="turned_in_not" -d="M363 128v277h-214v-277l107 47zM363 448q17 0 29.5 -13t12.5 -30v-341l-149 64l-149 -64v341q0 17 12.5 30t29.5 13h214z" /> - <glyph glyph-name="uniE8E8" unicode="verified_user" -d="M213 149l171 171l-30 30l-141 -140l-55 55l-30 -30zM256 491l192 -86v-128q0 -89 -55 -162.5t-137 -93.5q-82 20 -137 93.5t-55 162.5v128z" /> - <glyph glyph-name="uniE8E9" unicode="view_agenda" -d="M427 448q9 0 15 -6t6 -15v-128q0 -9 -6 -15.5t-15 -6.5h-363q-9 0 -15 6.5t-6 15.5v128q0 9 6 15t15 6h363zM427 235q9 0 15 -6.5t6 -15.5v-128q0 -9 -6 -15t-15 -6h-363q-9 0 -15 6t-6 15v128q0 9 6 15.5t15 6.5h363z" /> - <glyph glyph-name="uniE8EA" unicode="view_array" -d="M171 128v277h192v-277h-192zM384 405h64v-277h-64v277zM85 128v277h64v-277h-64z" /> - <glyph glyph-name="uniE8EB" unicode="view_carousel" -d="M384 384h85v-235h-85v235zM43 149v235h85v-235h-85zM149 107v320h214v-320h-214z" /> - <glyph glyph-name="uniE8EC" unicode="view_column" -d="M341 405h107v-277h-107v277zM85 128v277h107v-277h-107zM213 128v277h107v-277h-107z" /> - <glyph glyph-name="uniE8ED" unicode="view_day" -d="M43 448h405v-64h-405v64zM427 341q9 0 15 -6t6 -15v-128q0 -9 -6 -15t-15 -6h-363q-9 0 -15 6t-6 15v128q0 9 6 15t15 6h363zM43 64v64h405v-64h-405z" /> - <glyph glyph-name="uniE8EE" unicode="view_headline" -d="M85 405h342v-42h-342v42zM85 277v43h342v-43h-342zM85 107v42h342v-42h-342zM85 192v43h342v-43h-342z" /> - <glyph glyph-name="uniE8EF" unicode="view_list" -d="M192 405h256v-85h-256v85zM192 107v85h256v-85h-256zM192 213v86h256v-86h-256zM85 320v85h86v-85h-86zM85 107v85h86v-85h-86zM85 213v86h86v-86h-86z" /> - <glyph glyph-name="uniE8F0" unicode="view_module" -d="M341 405h107v-128h-107v128zM213 277v128h107v-128h-107zM341 128v128h107v-128h-107zM213 128v128h107v-128h-107zM85 128v128h107v-128h-107zM85 277v128h107v-128h-107z" /> - <glyph glyph-name="uniE8F1" unicode="view_quilt" -d="M213 405h235v-128h-235v128zM341 128v128h107v-128h-107zM85 128v277h107v-277h-107zM213 128v128h107v-128h-107z" /> - <glyph glyph-name="uniE8F2" unicode="view_stream" -d="M85 405h363v-128h-363v128zM85 128v128h363v-128h-363z" /> - <glyph glyph-name="uniE8F3" unicode="view_week" -d="M277 405q9 0 15.5 -6t6.5 -15v-256q0 -9 -6.5 -15t-15.5 -6h-64q-9 0 -15 6t-6 15v256q0 9 6 15t15 6h64zM427 405q9 0 15 -6t6 -15v-256q0 -9 -6 -15t-15 -6h-64q-9 0 -15.5 6t-6.5 15v256q0 9 6.5 15t15.5 6h64zM128 405q9 0 15 -6t6 -15v-256q0 -9 -6 -15t-15 -6h-64 -q-9 0 -15 6t-6 15v256q0 9 6 15t15 6h64z" /> - <glyph glyph-name="uniE8F4" unicode="visibility" -d="M256 320q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM256 149q44 0 75.5 31.5t31.5 75.5t-31.5 75.5t-75.5 31.5t-75.5 -31.5t-31.5 -75.5t31.5 -75.5t75.5 -31.5zM256 416q79 0 143 -44t92 -116q-28 -72 -92 -116t-143 -44t-143 44t-92 116 -q28 72 92 116t143 44z" /> - <glyph glyph-name="uniE8F5" unicode="visibility_off" -d="M253 320h3q26 0 45 -19t19 -45v-4zM161 303q-12 -24 -12 -47q0 -44 31.5 -75.5t75.5 -31.5q23 0 47 12l-33 33q-8 -2 -14 -2q-26 0 -45 19t-19 45q0 6 2 14zM43 421l27 27l378 -378l-27 -27q-5 5 -31.5 31t-40.5 40q-43 -18 -93 -18q-79 0 -143 44t-92 116q25 62 80 106 -q-12 12 -33.5 34t-24.5 25zM256 363q-20 0 -39 -8l-46 46q39 15 85 15q79 0 142.5 -44t91.5 -116q-24 -59 -73 -101l-62 62q8 19 8 39q0 44 -31.5 75.5t-75.5 31.5z" /> - <glyph glyph-name="uniE8F6" unicode="card_giftcard" -d="M427 213v128h-109l45 -60l-35 -25q-64 87 -72 98q-8 -11 -72 -98l-35 25l45 60h-109v-128h342zM427 107v42h-342v-42h342zM192 427q-9 0 -15 -6.5t-6 -15.5t6 -15t15 -6t15 6t6 15t-6 15.5t-15 6.5zM320 427q-9 0 -15 -6.5t-6 -15.5t6 -15t15 -6t15 6t6 15t-6 15.5 -t-15 6.5zM427 384q18 0 30 -12.5t12 -30.5v-234q0 -18 -12 -30.5t-30 -12.5h-342q-18 0 -30 12.5t-12 30.5v234q0 18 12 30.5t30 12.5h47q-4 14 -4 21q0 26 19 45t45 19q33 0 53 -28l11 -15l11 15q20 28 53 28q26 0 45 -19t19 -45q0 -7 -4 -21h47z" /> - <glyph glyph-name="uniE8F7" unicode="card_membership" -d="M427 299v128h-342v-128h342zM427 192v43h-342v-43h342zM427 469q18 0 30 -12t12 -30v-235q0 -18 -12 -30.5t-30 -12.5h-86v-106l-85 42l-85 -42v106h-86q-18 0 -30 12.5t-12 30.5v235q0 18 12 30t30 12h342z" /> - <glyph glyph-name="uniE8F8" unicode="card_travel" -d="M427 213v128h-64v-42h-43v42h-128v-42h-43v42h-64v-128h342zM427 107v42h-342v-42h342zM192 427v-43h128v43h-128zM427 384q18 0 30 -12.5t12 -30.5v-234q0 -18 -12 -30.5t-30 -12.5h-342q-18 0 -30 12.5t-12 30.5v234q0 18 12 30.5t30 12.5h64v43q0 18 12.5 30t30.5 12 -h128q18 0 30.5 -12t12.5 -30v-43h64z" /> - <glyph glyph-name="uniE8F9" unicode="work" -d="M299 384v43h-86v-43h86zM427 384q18 0 30 -12.5t12 -30.5v-234q0 -18 -12 -30.5t-30 -12.5h-342q-18 0 -30 12.5t-12 30.5v234q0 18 12 30.5t30 12.5h86v43q0 18 12 30t30 12h86q18 0 30 -12t12 -30v-43h86z" /> - <glyph glyph-name="uniE8FA" unicode="youtube_searched_for" -d="M363 213l106 -106l-31 -32l-107 107v16l-6 6q-38 -33 -90 -33q-38 0 -71 19l32 31q19 -8 39 -8q40 0 68 28t28 68t-28 68t-68 28t-68 -28t-28 -68h74l-88 -85l-82 85h53q0 57 41 98t98 41q58 0 98.5 -40.5t40.5 -98.5q0 -51 -34 -90l6 -6h17z" /> - <glyph glyph-name="uniE8FB" unicode="eject" -d="M256 405l142 -213h-284zM107 149h298v-42h-298v42z" /> - <glyph glyph-name="uniE8FC" unicode="camera_enhance" -d="M256 149l-27 59l-58 27l58 26l27 59l27 -59l58 -26l-58 -27zM256 128q44 0 75.5 31.5t31.5 75.5t-31.5 75t-75.5 31t-75.5 -31t-31.5 -75t31.5 -75.5t75.5 -31.5zM192 448h128l39 -43h68q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12.5 -30t-29.5 -13h-342q-17 0 -29.5 13 -t-12.5 30v256q0 17 12.5 29.5t29.5 12.5h68z" /> - <glyph glyph-name="uniE8FD" unicode="help_outline" -d="M256 384q35 0 60 -25t25 -60q0 -27 -32 -55.5t-32 -51.5h-42q0 23 10 39.5t22 24t22 18.5t10 25q0 17 -13 29.5t-30 12.5t-30 -12.5t-13 -29.5h-42q0 35 25 60t60 25zM256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5 -t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5zM235 128v43h42v-43h-42z" /> - <glyph glyph-name="uniE8FE" unicode="reorder" -d="M64 405h384v-42h-384v42zM64 277v43h384v-43h-384zM64 107v42h384v-42h-384zM64 192v43h384v-43h-384z" /> - <glyph glyph-name="uniE8FF" unicode="zoom_in" -d="M256 299h-43v-43h-21v43h-43v21h43v43h21v-43h43v-21zM203 213q40 0 68 28t28 68t-28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28zM331 213l106 -106l-32 -32l-106 106v17l-6 6q-38 -33 -90 -33q-58 0 -98.5 40t-40.5 98t40.5 98.5t98.5 40.5t98 -40.5t40 -98.5 -q0 -52 -33 -90l6 -6h17z" /> - <glyph glyph-name="uniE900" unicode="zoom_out" -d="M149 320h107v-21h-107v21zM203 213q40 0 68 28t28 68t-28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28zM331 213l106 -106l-32 -32l-106 106v17l-6 6q-38 -33 -90 -33q-58 0 -98.5 40t-40.5 98t40.5 98.5t98.5 40.5t98 -40.5t40 -98.5q0 -52 -33 -90l6 -6h17z" /> - <glyph glyph-name="uniE902" unicode="http" -d="M459 267v21h-43v-21h43zM459 320q13 0 22.5 -9.5t9.5 -22.5v-21q0 -13 -9.5 -22.5t-22.5 -9.5h-43v-43h-32v128h75zM267 288v32h96v-32h-32v-96h-32v96h-32zM149 288v32h96v-32h-32v-96h-32v96h-32zM96 277v43h32v-128h-32v53h-43v-53h-32v128h32v-43h43z" /> - <glyph glyph-name="uniE903" unicode="event_seat" -d="M363 235h-214v170q0 17 13 30t30 13h128q17 0 30 -13t13 -30v-170zM43 299h64v-64h-64v64zM405 299h64v-64h-64v64zM85 64v128h342v-128h-64v64h-214v-64h-64z" /> - <glyph glyph-name="uniE904" unicode="flight_land" -d="M299 204q-82 23 -206 55l-34 10v110l31 -8l20 -50l106 -28v176l41 -11l59 -192l113 -30q13 -4 19.5 -15.5t3.5 -24.5q-4 -13 -15 -19t-24 -3zM53 107h406v-43h-406v43z" /> - <glyph glyph-name="uniE905" unicode="flight_takeoff" -d="M471 306q3 -13 -3.5 -24t-19.5 -15q-124 -33 -206 -55l-113 -30l-34 -10l-56 96l31 8l42 -32l106 28l-88 153l41 11l147 -137l114 30q13 4 24.5 -3t14.5 -20zM53 107h406v-43h-406v43z" /> - <glyph glyph-name="uniE906" unicode="play_for_work" -d="M128 213h43q0 -35 25 -60t60 -25t60 25t25 60h43q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM235 405h42v-119h75l-96 -96l-96 96h75v119z" /> - <glyph glyph-name="uniE908" unicode="gif" -d="M405 288h-64v-21h43v-32h-43v-43h-32v128h96v-32zM192 320q9 0 15 -6t6 -15v-11h-74v-64h42v32h32v-43q0 -9 -6 -15t-15 -6h-64q-9 0 -15 6t-6 15v86q0 9 6 15t15 6h64zM245 320h32v-128h-32v128z" /> - <glyph glyph-name="uniE909" unicode="indeterminate_check_box" -d="M363 235v42h-214v-42h214zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniE90A" unicode="offline_pin" -d="M220 213l143 143l-30 30l-113 -113l-41 41l-30 -30zM363 128v43h-214v-43h214zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE90B" unicode="all_out" -d="M343 170q34 34 34 82.5t-34 82.5t-82.5 34t-82.5 -34t-34 -82.5t34 -82.5t82.5 -34t82.5 34zM366 358q44 -44 44 -106t-44 -105t-106 -43t-105 43t-43 105t43 106t105 44t106 -44zM90 338v85h85zM175 82h-85v85zM431 167v-85h-85zM346 423h85v-85z" /> - <glyph glyph-name="uniE90C" unicode="copyright" -d="M256 85q70 0 120.5 50.5t50.5 120.5t-50.5 120.5t-120.5 50.5t-120.5 -50.5t-50.5 -120.5t50.5 -120.5t120.5 -50.5zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5zM253 317q-40 0 -40 -58v-6 -q0 -58 40 -58q15 0 25 8.5t10 21.5h38q0 -25 -22 -44q-21 -18 -51 -18q-40 0 -61 24t-21 66v6q0 41 20 64q24 27 62 27q33 0 52 -19q21 -21 21 -49h-38q0 7 -3 13q-5 10 -7 12q-10 10 -25 10z" /> - <glyph glyph-name="uniE90D" unicode="fingerprint" -d="M318 43h-3q-46 12 -79 45q-46 46 -46 111q0 26 19 44.5t46 18.5t46.5 -18.5t19.5 -44.5q0 -17 12.5 -29t31.5 -12t32 12t13 29q0 60 -45.5 103t-109.5 43q-46 0 -84 -23.5t-57 -62.5q-12 -25 -12 -60q0 -40 14 -77q3 -10 -7 -13t-13 6q-16 45 -16 84t15 69q21 45 64.5 72 -t95.5 27q73 0 124.5 -49.5t51.5 -118.5q0 -26 -19.5 -44t-46.5 -18t-46 18t-19 44q0 17 -13 29.5t-32 12.5t-31.5 -12.5t-12.5 -29.5q0 -56 40 -96q28 -28 70 -39q9 -1 7 -13q-2 -8 -10 -8zM265 199q0 -37 27.5 -64t68.5 -27q2 0 9 1t11.5 1t9 -1.5t5.5 -6.5q2 -11 -9 -13 -q-12 -2 -26 -2q-40 0 -66 19q-51 35 -51 93q0 11 11 11q10 0 10 -11zM208 47q-4 0 -7 3q-27 27 -43 57q-23 40 -23 92q0 47 35.5 81t85.5 34t85.5 -34t35.5 -81q0 -10 -11 -10t-11 10q0 39 -29 66.5t-70 27.5t-70 -27.5t-29 -66.5q0 -48 19 -82q13 -23 40 -52q8 -7 0 -15 -q-3 -3 -8 -3zM75 305q-7 0 -10 5t1 11q32 46 80 70q50 26 110 26t110 -26q49 -24 80 -69q6 -10 -3 -15q-10 -6 -15 3q-27 39 -72 62q-46 23 -100 23.5t-100 -23.5q-45 -23 -73 -63q-3 -4 -8 -4zM380 417q-4 0 -5 1q-59 30 -119 30q-65 0 -119 -30q-6 -3 -10.5 0.5t-4.5 9 -t5 9.5q58 32 129 32q65 0 129 -32q7 -4 5 -12t-10 -8z" /> - <glyph glyph-name="uniE90E" unicode="gavel" -d="M82 310l120 -121l-60 -60l-121 120zM263 491l120 -121l-60 -60l-121 120zM112 340l60 60l302 -302l-60 -60zM21 64h256v-43h-256v43z" /> - <glyph glyph-name="uniE90F" unicode="lightbulb_outline" -d="M317 233q46 32 46 87q0 44 -31.5 75.5t-75.5 31.5t-75.5 -31.5t-31.5 -75.5q0 -55 46 -87l18 -13v-49h86v49zM256 469q62 0 105.5 -43.5t43.5 -105.5q0 -78 -64 -122v-49q0 -9 -6 -15t-15 -6h-128q-9 0 -15 6t-6 15v49q-64 44 -64 122q0 62 43.5 105.5t105.5 43.5z -M192 64v21h128v-21q0 -9 -6 -15t-15 -6h-86q-9 0 -15 6t-6 15z" /> - <glyph glyph-name="uniE911" unicode="picture_in_picture_alt" -d="M448 106v300h-384v-300h384zM491 107q0 -17 -13 -30t-30 -13h-384q-17 0 -30 13t-13 30v299q0 17 13 29.5t30 12.5h384q17 0 30 -12.5t13 -29.5v-299zM405 277v-128h-170v128h170z" /> - <glyph glyph-name="uniE912" unicode="important_devices" -d="M255 320h65l-53 -38l20 -62l-52 39l-53 -39l20 62l-53 38h65l21 64zM427 469q17 0 29.5 -12t12.5 -30v-107h-42v107h-384v-256h277v-43h-43v-43h43v-42h-171v42h43v43h-149q-18 0 -30.5 13t-12.5 30v256q0 18 12.5 30t30.5 12h384zM491 85v150h-107v-150h107zM491 277 -q9 0 15 -6t6 -15v-192q0 -9 -6 -15t-15 -6h-107q-9 0 -15 6t-6 15v192q0 9 6 15t15 6h107z" /> - <glyph glyph-name="uniE913" unicode="touch_app" -d="M402 173q19 -9 19 -29v-4l-16 -113q-1 -12 -10 -19.5t-21 -7.5h-145q-13 0 -22 9l-106 106l17 17q7 7 17 7q1 0 2.5 -0.5t2.5 -0.5l73 -15v229q0 14 9.5 23t22.5 9t22.5 -9t9.5 -23v-128h17q3 0 11 -2zM192 272q-43 28 -43 80q0 40 28 68t68 28t68 -28t28 -68 -q0 -53 -42 -80v80q0 22 -16 37.5t-38 15.5t-37.5 -15.5t-15.5 -37.5v-80z" /> - <glyph glyph-name="uniE914" unicode="accessible" -d="M274 128h44q-8 -37 -37 -61t-68 -24q-44 0 -75 31t-31 75q0 39 24 68t61 37v-44q-19 -7 -31 -23.5t-12 -37.5q0 -26 19 -45t45 -19q21 0 37.5 12t23.5 31zM213 318q0 24 21 38t43 1h1v-1q7 -3 13 -9l28 -31q36 -39 86 -39v-42q-56 0 -106 41v-73h64q17 0 29.5 -13 -t12.5 -30v-117h-42v106h-107q-17 0 -30 13t-13 30v126zM213 427q0 18 12.5 30t30.5 12t30.5 -12t12.5 -30t-12.5 -30.5t-30.5 -12.5t-30.5 12.5t-12.5 30.5z" /> - <glyph glyph-name="uniE915" unicode="compare_arrows" -d="M320 235l-85 85l85 85v-64h149v-42h-149v-64zM192 213v64l85 -85l-85 -85v64h-149v42h149z" /> - <glyph glyph-name="uniE916" unicode="date_range" -d="M405 85v235h-298v-235h298zM405 427q17 0 30 -13t13 -30v-299q0 -17 -13 -29.5t-30 -12.5h-298q-18 0 -30.5 12.5t-12.5 29.5v299q0 17 12.5 30t30.5 13h21v42h43v-42h170v42h43v-42h21zM363 277v-42h-43v42h43zM277 277v-42h-42v42h42zM192 277v-42h-43v42h43z" /> - <glyph glyph-name="uniE917" unicode="donut_large" -d="M277 108q48 7 84.5 43t43.5 84h64q-8 -80 -60 -132.5t-132 -59.5v65zM405 277q-7 48 -43.5 84t-84.5 43v65q80 -8 132 -60t60 -132h-64zM235 404q-50 -8 -89 -51t-39 -97t39 -97t89 -51v-65q-81 8 -136.5 69t-55.5 144t55.5 144t136.5 69v-65z" /> - <glyph glyph-name="uniE918" unicode="donut_small" -d="M277 195q27 8 40 40h152q-8 -77 -60.5 -131t-131.5 -61v152zM317 277q-12 32 -40 40v152q79 -7 131.5 -61t60.5 -131h-152zM235 317q-17 -7 -30 -24t-13 -37t13 -37t30 -24v-152q-81 8 -136.5 69t-55.5 144t55.5 144t136.5 69v-152z" /> - <glyph glyph-name="uniE919" unicode="line_style" -d="M64 427h384v-86h-384v86zM277 256v43h171v-43h-171zM64 256v43h171v-43h-171zM405 85v43h43v-43h-43zM320 85v43h43v-43h-43zM235 85v43h42v-43h-42zM149 85v43h43v-43h-43zM64 85v43h43v-43h-43zM341 171v42h107v-42h-107zM203 171v42h106v-42h-106zM64 171v42h107v-42 -h-107z" /> - <glyph glyph-name="uniE91A" unicode="line_weight" -d="M64 427h384v-86h-384v86zM64 235v64h384v-64h-384zM64 85v22h384v-22h-384zM64 149v43h384v-43h-384z" /> - <glyph glyph-name="uniE91B" unicode="motorcycle" -d="M405 149q26 0 45 19t19 45t-19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19zM167 192h-60v43h60q-7 19 -23.5 30.5t-36.5 11.5q-26 0 -45 -19t-19 -45t19 -45t45 -19q20 0 36.5 12t23.5 31zM415 319q41 -3 69 -33t28 -73q0 -45 -31 -75.5t-76 -30.5t-75.5 30.5t-30.5 75.5 -q0 20 6 38l-59 -59h-35q-8 -37 -36.5 -61t-67.5 -24q-45 0 -76 30.5t-31 75.5t31 76t76 31h247l-43 43h-76v42h94z" /> - <glyph glyph-name="uniE91C" unicode="opacity" -d="M128 213h256q0 55 -38 93l-90 94l-90 -93q-38 -38 -38 -94zM377 341q50 -50 50 -120q0 -71 -50 -121t-121 -50t-121 50t-50 121q0 70 50 120l121 121z" /> - <glyph glyph-name="uniE91D" unicode="pets" -d="M370 195l8.5 -8.5l8.5 -8.5t8.5 -9t8 -9.5t7.5 -9.5t6.5 -10t5 -11t3 -11.5t1 -12t-0.5 -12.5q-11 -42 -50 -50q-7 -1 -48.5 4t-69.5 5h-4q-28 0 -69.5 -5t-48.5 -4q-39 8 -50 50q-3 20 7 41t18.5 30t30.5 31q10 11 26.5 31t26.5 31q18 22 37 28q4 2 7 2q6 1 17 1 -q12 0 17 -1q3 0 7 -2q19 -6 37 -28q9 -11 26 -31t27 -31zM363 309q0 22 15.5 38t37.5 16t37.5 -16t15.5 -38t-15.5 -37.5t-37.5 -15.5t-37.5 15.5t-15.5 37.5zM267 395q0 22 15.5 37.5t37.5 15.5t37.5 -15.5t15.5 -37.5t-15.5 -38t-37.5 -16t-37.5 16t-15.5 38zM139 395 -q0 22 15.5 37.5t37.5 15.5t37.5 -15.5t15.5 -37.5t-15.5 -38t-37.5 -16t-37.5 16t-15.5 38zM43 309q0 22 15.5 38t37.5 16t37.5 -16t15.5 -38t-15.5 -37.5t-37.5 -15.5t-37.5 15.5t-15.5 37.5z" /> - <glyph glyph-name="uniE91E" unicode="pregnant_woman" -d="M341 235v-86h-64v-106h-64v106h-42v150q0 26 19 45t45 19t45 -19t19 -45q42 -17 42 -64zM192 427q0 18 12.5 30t30.5 12t30 -12t12 -30t-12 -30.5t-30 -12.5t-30.5 12.5t-12.5 30.5z" /> - <glyph glyph-name="uniE91F" unicode="record_voice_over" -d="M428 469q62 -65 62 -150.5t-62 -147.5l-35 34q44 51 44 116.5t-44 113.5zM358 398q32 -35 32 -79t-32 -76l-36 36q14 19 14 41.5t-14 41.5zM192 192q54 0 112.5 -23.5t58.5 -61.5v-43h-342v43q0 38 58.5 61.5t112.5 23.5zM107 320q0 35 25 60t60 25t60 -25t25 -60 -t-25 -60t-60 -25t-60 25t-25 60z" /> - <glyph glyph-name="uniE920" unicode="rounded_corner" -d="M448 341v-106h-43v106q0 26 -19 45t-45 19h-106v43h106q44 0 75.5 -31.5t31.5 -75.5zM64 64v43h43v-43h-43zM149 64v43h43v-43h-43zM235 64v43h42v-43h-42zM149 405v43h43v-43h-43zM64 405v43h43v-43h-43zM64 320v43h43v-43h-43zM64 149v43h43v-43h-43zM64 235v42h43v-42 -h-43zM405 149v43h43v-43h-43zM405 107h43v-43h-43v43z" /> - <glyph glyph-name="uniE921" unicode="rowing" -d="M448 64l-64 -64l-64 64v32l-151 151q-7 -1 -20 -1v46q26 -1 54 11.5t46 31.5l30 33q16 16 35 16h1q19 0 33.5 -14t14.5 -34v-123q0 -26 -20 -46l-76 76v49q-20 -17 -49 -30l134 -134h32zM320 491q17 0 30 -13t13 -30t-13 -30t-30 -13t-30 13t-13 30t13 30t30 13zM181 203 -l54 -54h-43l-75 -74l-32 32z" /> - <glyph glyph-name="uniE922" unicode="timeline" -d="M491 341q0 -17 -13 -29.5t-30 -12.5q-8 0 -11 1l-76 -76q2 -6 2 -11q0 -17 -13 -29.5t-30 -12.5t-30 12.5t-13 29.5q0 5 2 11l-55 55q-6 -2 -11 -2t-11 2l-97 -97q2 -6 2 -11q0 -17 -13 -30t-30 -13t-30 13t-13 30t13 29.5t30 12.5q8 0 11 -1l97 97q-1 3 -1 11 -q0 17 12.5 30t29.5 13t30 -13t13 -30q0 -8 -1 -11l54 -54q3 1 11 1t11 -1l76 75q-2 6 -2 11q0 17 13 30t30 13t30 -13t13 -30z" /> - <glyph glyph-name="uniE923" unicode="update" -d="M267 341v-90l74 -45l-15 -26l-91 55v106h32zM448 296h-145l59 60q-44 44 -105.5 44.5t-105.5 -42.5q-43 -44 -43 -104t43 -104t105 -44t106 44q43 43 43 104h43q0 -79 -56 -134q-56 -56 -136 -56t-136 56q-56 55 -56 133.5t56 134.5t135 56t135 -56l58 60v-152z" /> - <glyph glyph-name="uniE924" unicode="watch_later" -d="M346 166l17 28l-96 58v111h-32v-128zM256 469q88 0 150.5 -62.5t62.5 -150.5t-62.5 -150.5t-150.5 -62.5t-150.5 62.5t-62.5 150.5t62.5 150.5t150.5 62.5z" /> - <glyph glyph-name="uniE925" unicode="pan_tool" -d="M491 395v-310q0 -35 -25.5 -60t-60.5 -25h-155q-36 0 -61 25l-168 171q27 26 28 26q7 6 17 6q7 0 13 -3l92 -52v254q0 13 9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5v-150h21v203q0 14 9 23t23 9t23 -9t9 -23v-203h21v182q0 13 9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5v-182 -h22v118q0 13 9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5z" /> - <glyph glyph-name="uniE926" unicode="euro_symbol" -d="M320 117q51 0 90 34l38 -38q-54 -49 -128 -49q-62 0 -111.5 36t-69.5 92h-75v43h65q-1 7 -1 21t1 21h-65v43h75q20 56 69.5 92t111.5 36q74 0 128 -49l-38 -38q-39 34 -90 34q-39 0 -72 -20.5t-51 -54.5h123v-43h-137q-2 -14 -2 -21t2 -21h137v-43h-123 -q18 -34 50.5 -54.5t72.5 -20.5z" /> - <glyph glyph-name="uniE927" unicode="g_translate" -d="M448 85v278q0 9 -6 15t-15 6h-188l25 -86h41v22h23v-22h77v-22h-27q-10 -39 -41 -75l58 -57l-15 -16l-58 57l-19 -19l17 -59l-43 -43h150q9 0 15 6t6 15zM298 253q9 -19 24 -36q12 14 20 28.5t10 22.5l3 8h-85l7 -23h21zM282 237l13 -47l12 11q-14 15 -25 36zM237 286 -q0 11 -2 15h-84v-33h47q-3 -12 -14 -22t-31 -10q-21 0 -36 15.5t-15 36.5t15 36.5t36 15.5q19 0 32 -13l2 -1l26 25l-2 1q-25 23 -58 23q-36 0 -61.5 -25.5t-25.5 -61.5t25.5 -61.5t61.5 -25.5q37 0 60.5 24t23.5 61zM427 405q17 0 29.5 -12.5t12.5 -29.5v-278 -q0 -17 -12.5 -29.5t-29.5 -12.5h-171l-21 64h-150q-17 0 -29.5 12.5t-12.5 29.5v278q0 17 12.5 29.5t29.5 12.5h128l19 -64h195z" /> - <glyph glyph-name="uniE928" unicode="remove_shopping_cart" -d="M149 128q17 0 30 -13t13 -30t-13 -29.5t-30 -12.5t-29.5 12.5t-12.5 29.5t12.5 30t29.5 13zM332 235l-192 192h287q9 0 15 -6.5t6 -15.5q0 -5 -3 -10l-76 -138q-12 -22 -37 -22zM158 192h108l-43 43h-50l-19 -35l-1 -3q0 -5 5 -5zM485 27l-27 -27l-61 61q-13 -18 -34 -18 -q-17 0 -30 12.5t-13 29.5q0 22 18 35l-30 29h-159q-17 0 -29.5 13t-12.5 30q0 10 5 20l29 53l-47 99l-94 94l27 27z" /> - <glyph glyph-name="uniE929" unicode="restore_page" -d="M256 128q44 0 75.5 31.5t31.5 75.5t-31.5 75t-75.5 31q-58 0 -90 -49l-27 28v-85h85l-34 34q20 40 66 40q31 0 53 -21.5t22 -52.5t-22 -53t-53 -22q-39 0 -61 32h-37q12 -29 38.5 -46.5t59.5 -17.5zM299 469l128 -128v-256q0 -17 -13 -29.5t-30 -12.5h-256 -q-17 0 -30 12.5t-13 29.5l1 342q0 17 12.5 29.5t29.5 12.5h171z" /> - <glyph glyph-name="uniE92A" unicode="speaker_notes_off" -d="M427 469q17 0 29.5 -12.5t12.5 -29.5v-256q0 -17 -12 -29.5t-29 -13.5l-149 149h105v43h-148l-21 21h169v43h-171v-41l-126 126h340zM128 277h43l-43 43v-43zM171 213v43h-43v-43h43zM27 475l442 -442l-27 -27l-122 122h-192l-85 -85v362l-43 43z" /> - <glyph glyph-name="uniE92B" unicode="delete_forever" -d="M331 427h74v-43h-298v43h74l22 21h106zM180 259l46 -46l-45 -45l30 -30l45 45l45 -45l30 30l-45 45l45 46l-30 30l-45 -46l-45 46zM128 107v256h256v-256q0 -17 -13 -30t-30 -13h-170q-17 0 -30 13t-13 30z" /> - <glyph glyph-name="uniEB3B" unicode="ac_unit" -d="M469 277v-42h-89l69 -69l-30 -31l-99 100h-43v-43l100 -99l-31 -30l-69 69v-89h-42v89l-69 -69l-31 30l100 99v43h-43l-99 -100l-30 31l69 69h-89v42h89l-69 69l30 31l99 -100h43v43l-100 99l31 30l69 -69v89h42v-89l69 69l31 -30l-100 -99v-43h43l99 100l30 -31l-69 -69 -h89z" /> - <glyph glyph-name="uniEB3C" unicode="airport_shuttle" -d="M320 277h107l-86 86h-21v-86zM373 139q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5t9.5 -22.5t22.5 -9.5zM277 277v86h-85v-86h85zM128 139q14 0 23 9.5t9 22.5t-9 22.5t-23 9.5t-23 -9.5t-9 -22.5t9 -22.5t23 -9.5zM64 277h85v86h-85v-86z -M363 405l128 -128v-106h-54q0 -26 -19 -45t-45 -19t-45 19t-19 45h-117q0 -26 -19 -45t-45 -19t-45 19t-19 45h-43v192q0 18 12.5 30t30.5 12h299z" /> - <glyph glyph-name="uniEB3D" unicode="all_inclusive" -d="M397 371q48 0 81.5 -34t33.5 -81t-33.5 -81t-81.5 -34t-82 34l-27 24l32 28l25 -21q22 -22 52 -22t51 21t21 51t-21 51t-51 21t-51 -21q-71 -62 -90 -80l-60 -53q-33 -33 -81 -33t-81.5 34t-33.5 81t33.5 81t81.5 34t82 -34l27 -24l-33 -28l-24 21q-22 22 -52 22t-51 -21 -t-21 -51t21 -51t51 -21t51 21q71 62 90 80l60 53q33 33 81 33z" /> - <glyph glyph-name="uniEB3E" unicode="beach_access" -d="M371 324q-50 50 -115.5 66t-127.5 -5q48 6 105.5 -18.5t106.5 -73.5l-122 -122q-49 49 -73.5 106.5t-18.5 105.5q-21 -62 -5 -127.5t66 -115.5l-61 -61q-63 63 -63 152.5t63 152.5q0 1 1 1q70 70 168 62q81 -6 137 -62zM279 201l31 31l137 -138l-31 -30z" /> - <glyph glyph-name="uniEB3F" unicode="business_center" -d="M299 363v42h-86v-42h86zM427 363q17 0 29.5 -13t12.5 -30v-64q0 -17 -12.5 -30t-29.5 -13h-128v43h-86v-43h-128q-18 0 -30 12.5t-12 30.5v64q0 17 12.5 30t29.5 13h85v42l43 43h85l43 -43v-42h86zM213 171h86v21h149v-85q0 -18 -12.5 -30.5t-30.5 -12.5h-298 -q-18 0 -30.5 12.5t-12.5 30.5v85h149v-21z" /> - <glyph glyph-name="uniEB40" unicode="casino" -d="M352 320q14 0 23 9t9 23t-9 23t-23 9t-23 -9t-9 -23t9 -23t23 -9zM352 128q14 0 23 9t9 23t-9 23t-23 9t-23 -9t-9 -23t9 -23t23 -9zM256 224q14 0 23 9t9 23t-9 23t-23 9t-23 -9t-9 -23t9 -23t23 -9zM160 320q14 0 23 9t9 23t-9 23t-23 9t-23 -9t-9 -23t9 -23t23 -9z -M160 128q14 0 23 9t9 23t-9 23t-23 9t-23 -9t-9 -23t9 -23t23 -9zM405 448q17 0 30 -13t13 -30v-298q0 -17 -13 -30t-30 -13h-298q-17 0 -30 13t-13 30v298q0 17 13 30t30 13h298z" /> - <glyph glyph-name="uniEB41" unicode="child_care" -d="M160 213h192q-12 -29 -38 -46.5t-58 -17.5t-58 17.5t-38 46.5zM256 107q51 0 90.5 30t52.5 77q1 0 3 -0.5t3 -0.5q17 0 30 13t13 30t-13 30t-30 13q-1 0 -3 -0.5t-3 -0.5q-13 47 -52.5 77t-90.5 30t-90.5 -30t-52.5 -77q-1 0 -3 0.5t-3 0.5q-17 0 -30 -13t-13 -30t13 -30 -t30 -13q1 0 3 0.5t3 0.5q13 -47 52.5 -77t90.5 -30zM489 242q-4 -24 -20 -42.5t-39 -25.5q-22 -47 -69.5 -78.5t-104.5 -31.5t-104 31.5t-69 78.5q-23 7 -39.5 25.5t-20.5 42.5q-2 8 -2 14t2 14q4 24 20.5 42.5t39.5 25.5q17 38 46 62q54 48 127 48q58 0 104.5 -31t68.5 -79 -q23 -7 39.5 -25.5t20.5 -42.5q2 -8 2 -14t-2 -14zM176 288q0 11 8 19t19 8t18.5 -8t7.5 -19t-7.5 -19t-18.5 -8t-19 8t-8 19zM283 288q0 11 7.5 19t18.5 8t19 -8t8 -19t-8 -19t-19 -8t-18.5 8t-7.5 19z" /> - <glyph glyph-name="uniEB42" unicode="child_friendly" -d="M363 85q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5t9.5 -22.5t22.5 -9.5zM171 85q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5t-22.5 -9.5t-9.5 -22.5t9.5 -22.5t22.5 -9.5zM412 173q25 -23 25 -56q0 -31 -21.5 -52.5t-52.5 -21.5 -q-28 0 -49 18.5t-25 45.5h-45q-4 -27 -24.5 -45.5t-48.5 -18.5q-31 0 -53 21.5t-22 52.5q0 44 39 66l-45 94h-47v43h74l20 -43h311q0 -57 -36 -104zM277 469q71 0 121 -50t50 -120h-171v170z" /> - <glyph glyph-name="uniEB43" unicode="fitness_center" -d="M439 195l30 -31l-45 -45l30 -31l-30 -30l-31 30l-45 -45l-31 30l-30 -30l-31 30l76 76l-183 183l-76 -76l-30 31l30 30l-30 31l45 45l-30 31l30 30l31 -30l45 45l31 -30l30 30l31 -30l-76 -76l183 -183l76 76l30 -31z" /> - <glyph glyph-name="uniEB44" unicode="free_breakfast" -d="M85 107h342v-43h-342v43zM427 341v64h-43v-64h43zM427 448q18 0 30 -12.5t12 -30.5v-64q0 -17 -12 -29.5t-30 -12.5h-43v-64q0 -35 -25 -60.5t-60 -25.5h-128q-35 0 -60.5 25.5t-25.5 60.5v213h342z" /> - <glyph glyph-name="uniEB45" unicode="golf_course" -d="M363 386l-128 -66v-193q46 -2 76 -14t30 -28q0 -17 -37.5 -29.5t-90.5 -12.5t-90.5 12.5t-37.5 29.5q0 25 64 37v-37h43v384zM384 96q0 14 9 23t23 9t23 -9t9 -23t-9 -23t-23 -9t-23 9t-9 23z" /> - <glyph glyph-name="uniEB46" unicode="hot_tub" -d="M313 387q33 -32 27 -79l-1 -9h-41l3 12q5 27 -16 48q-34 34 -28 80l1 9h41l-2 -13q-5 -27 14 -47zM398 387q34 -33 28 -79l-2 -9h-40l2 12q5 27 -14 47l-2 1q-34 34 -28 80l2 9h40l-2 -13q-5 -27 14 -47zM405 85v128h-42v-128h42zM320 85v128h-43v-128h43zM235 85v128 -h-43v-128h43zM149 85v128h-42v-128h42zM238 256h231v-171q0 -17 -12.5 -29.5t-29.5 -12.5h-342q-17 0 -29.5 12.5t-12.5 29.5v171h64v16q0 20 14.5 34t33.5 14q20 0 36 -16l29 -33q4 -5 18 -15zM107 384q0 18 12 30.5t30 12.5t30.5 -12.5t12.5 -30.5t-12.5 -30.5 -t-30.5 -12.5t-30 12.5t-12 30.5z" /> - <glyph glyph-name="uniEB47" unicode="kitchen" -d="M171 256h42v-107h-42v107zM171 405h42v-64h-42v64zM384 320v107h-256v-107h256zM384 85v193h-256v-193h256zM384 469q18 0 30.5 -12t12.5 -30v-342q0 -17 -13 -29.5t-30 -12.5h-256q-17 0 -30 12.5t-13 29.5v342q0 18 12.5 30t30.5 12h256z" /> - <glyph glyph-name="uniEB48" unicode="pool" -d="M299 395q0 22 15.5 37.5t37.5 15.5t37.5 -15.5t15.5 -37.5t-15.5 -38t-37.5 -16t-37.5 16t-15.5 38zM185 256q-12 0 -25 8q-4 3 -16 8l69 69l-21 22q-32 32 -85 32v53q41 0 67 -9.5t50 -33.5l137 -136q-6 -4 -9 -5q-13 -8 -25 -8q-11 0 -24 8q-22 13 -47 13t-47 -13 -q-13 -8 -24 -8zM469 160q-23 0 -46 14q-11 7 -25 7q-13 0 -24 -7q-23 -14 -47 -14q-23 0 -46 14q-11 7 -25 7q-13 0 -24 -7q-23 -14 -47 -14q-23 0 -46 14q-11 7 -25 7q-13 0 -24 -7q-23 -14 -47 -14v43q13 0 24 7q23 14 47 14q23 0 46 -14q11 -7 25 -7q13 0 24 7 -q23 14 47 14q23 0 46 -14q11 -7 25 -7q13 0 24 7q23 14 47 14q23 0 46 -14q11 -7 25 -7v-43zM469 64q-23 0 -46 14q-11 7 -25 7q-13 0 -24 -7q-23 -14 -47 -14q-23 0 -46 14q-11 7 -25 7q-13 0 -24 -7q-23 -14 -47 -14t-47 14q-11 7 -24 7q-14 0 -25 -7q-23 -14 -46 -14v43 -q13 0 24 7q23 14 47 14q23 0 46 -14q11 -7 25 -7q13 0 24 7q23 14 47 14t47 -14q11 -7 24 -7q14 0 25 7q23 14 46 14q24 0 47 -14q11 -7 24 -7v-43z" /> - <glyph glyph-name="uniEB49" unicode="room_service" -d="M295 346q63 -13 106 -61.5t47 -113.5h-384q4 65 47 113.5t106 61.5q-4 10 -4 17q0 17 13 29.5t30 12.5t30 -12.5t13 -29.5q0 -7 -4 -17zM43 149h426v-42h-426v42z" /> - <glyph glyph-name="uniEB4A" unicode="smoke_free" -d="M363 172l-63 63h63v-63zM309 326q-29 0 -50 21.5t-21 50.5t21 50t50 21v-32q-17 0 -28 -10.5t-11 -26.5q0 -17 11.5 -30t27.5 -13h33q30 0 52 -19.5t22 -47.5v-34h-32v27q0 20 -12.5 31.5t-29.5 11.5h-33zM402 408q30 -14 48.5 -43t18.5 -65v-44h-32v44q0 36 -24.5 61.5 -t-60.5 25.5v32q16 0 27.5 11.5t11.5 28.5h32q0 -30 -21 -51zM384 235h32v-64h-32v64zM437 235h32v-64h-32v64zM43 384l26 27l363 -363l-27 -27l-149 150h-213v64h149z" /> - <glyph glyph-name="uniEB4B" unicode="smoking_rooms" -d="M342 294q31 0 52.5 -19t21.5 -48v-35h-32v28q0 20 -12.5 31.5t-29.5 11.5h-33q-29 0 -50 21.5t-21 50.5t21 50t50 21v-32q-17 0 -28 -10.5t-11 -26.5q0 -17 11.5 -30t27.5 -13h33zM402 347q30 -14 48.5 -43t18.5 -64v-48h-32v48q0 36 -24.5 61t-60.5 25v32 -q16 0 27.5 11.5t11.5 28.5q0 16 -11.5 27.5t-27.5 11.5v32q29 0 50 -21t21 -50q0 -30 -21 -51zM384 171h32v-64h-32v64zM437 171h32v-64h-32v64zM43 171h320v-64h-320v64z" /> - <glyph glyph-name="uniEB4C" unicode="spa" -d="M330 307q-42 -23 -74 -57q-32 34 -74 57q8 95 75 162q67 -67 73 -162zM43 299q68 0 124 -33t89 -84q33 51 89 84t124 33q0 -84 -47.5 -151t-123.5 -94q-17 -6 -42 -11q-21 3 -42 11q-76 27 -123.5 94t-47.5 151z" /> - <glyph glyph-name="u10FFFD" unicode="goat" -d="M511 318q1 -1 1 -2.5t-1 -2.5l-25 -32q-2 -2 -4 -2l-15 3l-7 -22q-2 -4 -6.5 -4t-6.5 4l-14 30l-23 5l-47 -112l17 -136q0 -4 -4 -4h-20q-2 0 -4 3l-20 81l-10 17l-25 -98q0 -3 -4 -3h-21q-4 0 -4 4l23 135h-135l-35 -66l8 -68q2 -5 -4 -5h-20q-3 0 -4 2l-28 102l-34 -39 -l6 -60q2 -5 -4 -5h-22q-4 0 -4 2l-13 56l21 82v144q-23 9 -23 30h274q48 -1 95 33q-8 22 6 36q28 -20 36 -25q7 -4 11.5 1.5t2.5 12.5q-9 28 -45 42q-1 0 -3 1q-12 3 -10 8q0 3 4 3q29 -4 49.5 -22.5t27.5 -35.5l4 -3q3 -4 6.5 -8t6 -11.5t1.5 -15.5q0 -5 2 -7z" /> - <glyph glyph-name=".notdef" -d="M17 0v341h136v-341h-136zM34 17h102v307h-102v-307z" /> - <glyph glyph-name="glyph1" horiz-adv-x="0" - /> - <glyph glyph-name="glyph2" - /> - <glyph glyph-name="zero" unicode="0" -d="M0 0z" /> - <glyph glyph-name="one" unicode="1" -d="M0 0z" /> - <glyph glyph-name="two" unicode="2" -d="M0 0z" /> - <glyph glyph-name="three" unicode="3" -d="M0 0z" /> - <glyph glyph-name="four" unicode="4" -d="M0 0z" /> - <glyph glyph-name="five" unicode="5" -d="M0 0z" /> - <glyph glyph-name="six" unicode="6" -d="M0 0z" /> - <glyph glyph-name="seven" unicode="7" -d="M0 0z" /> - <glyph glyph-name="eight" unicode="8" -d="M0 0z" /> - <glyph glyph-name="nine" unicode="9" -d="M0 0z" /> - <glyph glyph-name="underscore" unicode="_" -d="M0 0z" /> - <glyph glyph-name="a" unicode="a" -d="M0 0z" /> - <glyph glyph-name="b" unicode="b" -d="M0 0z" /> - <glyph glyph-name="c" unicode="c" -d="M0 0z" /> - <glyph glyph-name="d" unicode="d" -d="M0 0z" /> - <glyph glyph-name="e" unicode="e" -d="M0 0z" /> - <glyph glyph-name="f" unicode="f" -d="M0 0z" /> - <glyph glyph-name="g" unicode="g" -d="M0 0z" /> - <glyph glyph-name="h" unicode="h" -d="M0 0z" /> - <glyph glyph-name="i" unicode="i" -d="M0 0z" /> - <glyph glyph-name="j" unicode="j" -d="M0 0z" /> - <glyph glyph-name="k" unicode="k" -d="M0 0z" /> - <glyph glyph-name="l" unicode="l" -d="M0 0z" /> - <glyph glyph-name="m" unicode="m" -d="M0 0z" /> - <glyph glyph-name="n" unicode="n" -d="M0 0z" /> - <glyph glyph-name="o" unicode="o" -d="M0 0z" /> - <glyph glyph-name="p" unicode="p" -d="M0 0z" /> - <glyph glyph-name="q" unicode="q" -d="M0 0z" /> - <glyph glyph-name="r" unicode="r" -d="M0 0z" /> - <glyph glyph-name="s" unicode="s" -d="M0 0z" /> - <glyph glyph-name="t" unicode="t" -d="M0 0z" /> - <glyph glyph-name="u" unicode="u" -d="M0 0z" /> - <glyph glyph-name="v" unicode="v" -d="M0 0z" /> - <glyph glyph-name="w" unicode="w" -d="M0 0z" /> - <glyph glyph-name="x" unicode="x" -d="M0 0z" /> - <glyph glyph-name="y" unicode="y" -d="M0 0z" /> - <glyph glyph-name="z" unicode="z" -d="M0 0z" /> - <glyph glyph-name="uniEC2E" unicode="" -d="M142 313zM323 220q41 -17 68.5 -53t33.5 -82h-41q-8 47 -44 78t-84 31t-84.5 -31t-43.5 -78h-42q6 45 33.5 81.5t68.5 54.5q-21 16 -33.5 40t-12.5 52q0 47 33 80t80.5 33t80.5 -33t33 -81q0 -27 -12.5 -51.5t-33.5 -40.5zM183 313q0 -30 21.5 -51.5t51.5 -21.5 -t51.5 21.5t21.5 51.5t-21.5 51.5t-51.5 21.5t-51.5 -21.5t-21.5 -51.5v0z" /> - <glyph glyph-name="uniEDDE" unicode="" -d="M405 427h-53q-31.999 -1.00098 -53 -22q-21 -21 -22 -53v-53h-42v-64h42v-150h64v150h64v64h-64v42q1.00098 9 7 15q6 6 15 7h42v64zM427 469q18 0 30 -12t12 -30v-342q0 -18 -12 -30t-30 -12h-342q-18 0 -30 12t-12 30v342q0 18 12 30t30 12h342z" /> - <glyph glyph-name="uniEDDF" unicode="" -d="M405 107v121q0 31.999 -21.5 53q-21.499 21 -52.5 22q-15 0 -30 -8q-15 -7.99902 -24 -22v26h-64v-192h64v113q1.00098 13.001 10 22q9 9 22.5 9t22.5 -9t9 -22v-113h64zM139 335q16.001 0 27 11q10.999 10.999 11 27.5q0 16.5 -11 27.5q-10.999 10.999 -27.5 11 -q-16.5 0 -27.5 -11q-10.999 -10.999 -11 -27.5q0 -16.5 11 -27.5q10.999 -10.999 28 -11zM171 107v192h-64v-192h64zM427 469q18 0 30 -12t12 -30v-342q0 -18 -12 -30t-30 -12h-342q-18 0 -30 12t-12 30v342q0 18 12 30t30 12h342z" /> - <glyph glyph-name="uniEDE0" unicode="" -d="M427 469q18 0 30 -12t12 -30v-342q0 -18 -12 -30t-30 -12h-342q-18 0 -30 12t-12 30v342q0 18 12 30t30 12h342zM427 256h-43v43h-21v-43h-43v-21h43v-43h21v43h43v21zM192 271v-36h61q-1.99902 -13.001 -15.5 -29q-13.5 -16.001 -45.5 -17q-28.001 1.00098 -46.5 20 -q-18.499 19.001 -18.5 47q0 28.001 18.5 47q18.499 19.001 46.5 20q16.001 0 26.5 -5.5q10.501 -5.50098 16.5 -11.5l29 28q-28.001 28.001 -72 29q-46.001 -1.00098 -76 -31q-30 -30 -30 -76q0 -46.001 30 -76q30 -30 76 -30q46.001 0 74 28q28.001 28.001 28 75 -q1.00098 10.001 -2 18h-100z" /> - <glyph glyph-name="uniEDE1" unicode="" -d="M378 309q7.99902 6 15.5 14q7.49805 7.99707 11.5 16q-13.001 -7.00098 -30 -9q16.001 10.999 24 32q-16.001 -10.001 -37 -14q-28.999 28.999 -66.5 11.5q-37.5 -17.501 -31.5 -63.5q-40.999 3 -69 19.5t-49 39.5q-10.999 -21 -4.5 -44q6.49902 -22.999 21.5 -32 -q-13.999 1.00098 -24 7q1.00098 -24 13 -37.5q12 -13.5 31 -19.5q-12 -3 -24 -1q10.999 -34.999 52 -40q-15 -13.001 -38 -19.5q-22.999 -6.49902 -45 -3.5q18 -12 40 -19.5q22.001 -7.5 51 -6.5q72 4 114.5 49.5q42.499 45.499 44.5 120.5zM427 465q18 0 30 -12t12 -30 -v-342q0 -18 -12 -30t-30 -12h-342q-18 0 -30 12t-12 30v342q0 18 12 30t30 12h342z" /> - <glyph glyph-name="uniEDE0" unicode="" -d="M427 469q18 0 30 -12t12 -30v-342q0 -18 -12 -30t-30 -12h-342q-18 0 -30 12t-12 30v342q0 18 12 30t30 12h342zM427 256h-43v43h-21v-43h-43v-21h43v-43h21v43h43v21zM192 271v-36h61q-2 -13 -15 -29q-14 -16 -46 -17q-1.13636 -0.0454545 -2.26446 -0.0454545 -q-23.6901 0 -43.7355 20.0455q-19 19 -19 47t18 47q18 18 47 20q2.14286 0.142857 4.20408 0.142857q12.3673 0 21.7959 -5.14286q11 -6 17 -12l29 28q-28 28 -72 29q-1.33333 0.030303 -2.65565 0.030303q-42.314 0 -73.3444 -31.0303q-30 -30 -30 -76t30 -76t76 -30t74 28 -t28 75q0 13 -2 18h-100z" /> - </font> -</defs></svg> diff --git a/plugins/easy_gantt/assets/fonts/EasyMaterialIcons-Regular.ttf b/plugins/easy_gantt/assets/fonts/EasyMaterialIcons-Regular.ttf deleted file mode 100644 index 567bc7822e146735ca48da310f6839b1f39ce3ce..0000000000000000000000000000000000000000 Binary files a/plugins/easy_gantt/assets/fonts/EasyMaterialIcons-Regular.ttf and /dev/null differ diff --git a/plugins/easy_gantt/assets/fonts/EasyMaterialIcons-Regular.woff b/plugins/easy_gantt/assets/fonts/EasyMaterialIcons-Regular.woff deleted file mode 100644 index ceb41a11158b2497932b035bc1c46258beaa8130..0000000000000000000000000000000000000000 Binary files a/plugins/easy_gantt/assets/fonts/EasyMaterialIcons-Regular.woff and /dev/null differ diff --git a/plugins/easy_gantt/assets/fonts/EasyMaterialIcons-Regular.woff2 b/plugins/easy_gantt/assets/fonts/EasyMaterialIcons-Regular.woff2 deleted file mode 100644 index 6fbc47406ef0bcbe8b57b6da13670dcb60fd0f2d..0000000000000000000000000000000000000000 Binary files a/plugins/easy_gantt/assets/fonts/EasyMaterialIcons-Regular.woff2 and /dev/null differ diff --git a/plugins/easy_gantt/assets/images/.gitkeep b/plugins/easy_gantt/assets/images/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/plugins/easy_gantt/assets/images/yt.png b/plugins/easy_gantt/assets/images/yt.png deleted file mode 100644 index 7c752df0c42df7ac7f86ad1385a6959cdc5999aa..0000000000000000000000000000000000000000 Binary files a/plugins/easy_gantt/assets/images/yt.png and /dev/null differ diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/background.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/background.js deleted file mode 100644 index 3d04200e3c5a66b311a88dfcc10d0f3b7fba9542..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/background.js +++ /dev/null @@ -1,304 +0,0 @@ -/* background.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.view = ysy.view || {}; -ysy.view.getGanttBackground = function () { - var colors = ysy.settings.styles.backgrounds; - - function getBackgroundColor() { - var defaultColor = "rgba(200, 200, 200, 0.25)"; - if (!window.getComputedStyle) return defaultColor; - var styles = window.getComputedStyle(document.getElementsByTagName('body')[0]); - var colorString = styles.getPropertyValue('background-color') || ""; - if (!colorString.match(/rgba?\([0-9, ]+\)/)) return defaultColor; - var colorSplit = colorString.replace(/^rgba?\(|\s+|\)$/g,'').split(','); - var colorArray = [parseInt(colorSplit[0]), parseInt(colorSplit[1]), parseInt(colorSplit[2])]; - var strongColorArray = []; - var stronger = 3; - for (var i = 0; i < 3; i++) { - var component = colorArray[i]; - if (component > 255 * (stronger - 1) / stronger) { - strongColorArray.push(255 - (255 - component) * stronger); - } else { - strongColorArray.push(Math.floor(component / stronger)); - } - } - return "rgba(" + strongColorArray.join(", ") + ", 0.15)"; - } - - var backgroundColor = getBackgroundColor(); - return { - fullCanvasRender: false, - container: gantt.$task_bg, - renderer: true, - filter: gantt._create_filter(['_filter_task', '_is_chart_visible', '_is_std_background']), - lastItems: null, - lastPos: null, - svg: null, - lastElements: {}, - _render_bg_canvas: function (svg, items, limits) { - var rowHeight = gantt.config.row_height; - var cfg = gantt._tasks; - var widths = cfg.width; - var fullHeight = rowHeight * (limits.toY - limits.fromY); - var fullWidth = 0; - var width; - var partWidth; - for (var i = limits.fromX; i < limits.toX; i++) { - fullWidth += widths[i]; - } - svg.size(fullWidth, fullHeight); - svg.node.style.left = cfg.left[limits.fromX] + "px"; - svg.node.style.top = rowHeight * limits.fromY + "px"; - // -- CLEARING -- - svg.clear(); - // -- SELECTED -- - for (i = limits.fromY; i < limits.toY; i++) { - if (gantt.getState().selected_task == items[i].id) { - svg.rect(fullWidth, rowHeight).x(0).y((i - limits.fromY) * rowHeight).attr('fill', colors.selected); - break; - } - } - // -- HORIZONTAL LINES -- - var commands = []; - var lineCmd = "l " + fullWidth + " 0"; - for (i = 1; i <= limits.toY - limits.fromY; i++) { - commands.push("M 0 " + (i * rowHeight - 0.5)); - commands.push(lineCmd); - } - // -- VERTICAL LINES -- - partWidth = -0.5; - lineCmd = "l 0 " + fullHeight; - for (i = limits.fromX; i < limits.toX; i++) { - width = widths[i]; - if (width <= 0) continue; //do not render skipped columns - partWidth += width; - commands.push("M " + partWidth + " 0"); - commands.push(lineCmd); - } - svg.path(commands.join("")).attr("stroke", colors.line); - - if (gantt.config.scale_unit === "day") { - var weekendGroup = svg.group().attr('fill', backgroundColor); - if (ysy.settings.resource.open) { - // -- USER WEEKENDS BACKGROUND -- - partWidth = 0; - - for (i = limits.fromX; i < limits.toX; i++) { - width = widths[i]; - var top = 0; - var mDate = moment(cfg.trace_x[i]); - var iDate = mDate.format("YYYY-MM-DD"); - var lastWeekend = false; - var firstEntity = items[limits.fromY]; - if (firstEntity.type !== "assignee") { - var assignee = ysy.data.assignees.getByID(firstEntity.widget.model.assigned_to_id || "unassigned"); - if (assignee) { - lastWeekend = assignee.getMaxHours(iDate, mDate) === 0; - } - } - for (var j = limits.fromY; j < limits.toY; j++) { - if (items[j].type !== "assignee") continue; - var hours = items[j].widget.model.getMaxHours(iDate, mDate); - if ((hours === 0) === lastWeekend) continue; - if (lastWeekend) { - weekendGroup.rect(width, (j - limits.fromY) * rowHeight - top).x(partWidth).y(top); - } else { - top = (j - limits.fromY) * rowHeight; - } - lastWeekend = !lastWeekend; - } - if (lastWeekend) { - weekendGroup.rect(width, (limits.toY + 1) * rowHeight).x(partWidth).y(top); - } - partWidth += width; - } - } else { - // -- WEEKENDS BACKGROUND -- - if (!cfg.weekends) { - cfg.weekends = []; - for (var d = 0; d < cfg.trace_x.length; d++) { - cfg.weekends.push(!gantt._working_time_helper.is_working_day(cfg.trace_x[d])); - } - } - partWidth = 0; - for (i = limits.fromX; i < limits.toX; i++) { - width = widths[i]; - if (cfg.weekends[i]) { - weekendGroup.rect(width, fullHeight).x(partWidth); - } - partWidth += width; - } - - } - } - if (ysy.settings.resource.open) { - // -- ASSIGNEE BACKGROUND -- - var assigneeGroup = svg.group().attr('fill', backgroundColor); - for (i = limits.fromY; i < limits.toY; i++) { - if (items[i].type === "assignee") { - assigneeGroup.rect(fullWidth, rowHeight).y((i - limits.fromY) * rowHeight); - } - } - // -- DARK LIMITS -- - var darkLimitGroup = svg.group().attr('fill', backgroundColor.replace("0.2)", "0.3)")); - var ganttLimits = ysy.data.limits; - if (ganttLimits.start_date) { - var left = gantt.posFromDate(ganttLimits.start_date) - gantt.posFromDate(cfg.trace_x[limits.fromX]); - if (left > 0) { - darkLimitGroup.rect(left, fullHeight); - } - } - if (ganttLimits.end_date) { - var right = gantt.posFromDate(ganttLimits.end_date) - gantt.posFromDate(cfg.trace_x[limits.fromX]); - if (right > 0 && right < fullWidth) { - darkLimitGroup.rect(fullWidth - right, fullHeight).x(right); - } - } - } - // -- BLUE LINE -- - if (gantt.config.scale_unit === "day") { - partWidth = -0.5; - commands = []; - lineCmd = "l 0 " + fullHeight; - for (i = limits.fromX; i < limits.toX; i++) { - width = cfg.width[i]; - var first = moment(cfg.trace_x[i]).date() === 1; - if (first) { - commands.push("M " + partWidth + " 0"); - commands.push(lineCmd); - } - partWidth += width; - } - svg.path(commands.join("")).attr("stroke", colors.line_month); - } - }, - render_bg_line: function (canvas, index, item) { - - }, - render_item: function (item, container) { - ysy.log.debug("render_item BG", "canvas_bg"); - }, - render_items: function (items, container) { - ysy.log.debug("render_items FULL BG", "canvas_bg"); - container = container || this.node; - if (items) { - this.lastItems = items; - } else { - items = this.lastItems; - if (!items) return; - } - if (this.fullCanvasRender) { - this.render_full_svg(items, container); - } else { - this.render_shrunken_svg(items, container); - } - var fullHeight = gantt.config.row_height * items.length; - container.style.height = fullHeight + "px"; - var lastEvent; - $(container) - .off("mousedown.bg") - .on("mousedown.bg", function (e) { - lastEvent = e; - }) - .off("click.bg") - .on("click.bg", function (e) { - if (!lastEvent) return; - if (Math.abs(lastEvent.pageX - e.pageX) > 2 || Math.abs(lastEvent.pageY - e.pageY) > 2) return; - var order = gantt._order; - var offsetTop = $(container).offset().top; - var index = Math.floor((e.pageY - offsetTop) / gantt.config.row_height); - if (index < 0 || index >= order.length) return; - var taskId = order[index]; - if (!gantt.isTaskExists(taskId)) return; - if (gantt._selected_task == taskId) { - gantt.unselectTask(); - } else { - gantt.selectTask(taskId); - } - }) - }, - render_shrunken_svg: function (items, container) { - var cfg = gantt._tasks; - var scrollPos = gantt.getCachedScroll(); - // var nodeWidth = this.node.innerWidth; - // if(scrollPos.x > Math.max(nodeWidth - window.innerWidth, 0)){ - // scrollPos.x = gantt.$task.scrollLeft; - // } - this.lastPos = scrollPos; - //ysy.log.debug("render_one_canvas ["+scrollPos.x+","+scrollPos.y+"]","canvas_bg"); - var rowHeight = gantt.config.row_height; - var colWidth = cfg.col_width; - var countX = cfg.count; - var countY = items.length; - var limits = this.getCanvasLimits(); - var partCountX = Math.ceil(limits.x / colWidth), - partCountY = Math.ceil(limits.y / rowHeight); - var startX = Math.max(scrollPos.x - (limits.x - window.innerWidth) / 2, 0); - var startY = Math.max(scrollPos.y - (limits.y - window.innerHeight) / 2, 0); - var startCountX = Math.floor(startX / colWidth); - var startCountY = Math.floor(startY / rowHeight); - if (startCountX + partCountX > countX) { - startCountX = countX - partCountX; - } - if (startCountY + partCountY > countY) { - startCountY = countY - partCountY; - } - var svg = this.svg; - if (!svg) { - svg = this._createSvg(container); - } - this._render_bg_canvas(svg, items, { - fromX: Math.max(startCountX, 0), - toX: startCountX + partCountX, - fromY: Math.max(startCountY, 0), - toY: startCountY + partCountY - }); - }, - render_full_svg: function (items, container) { - ysy.log.debug("render_items FULL BG", "canvas_bg"); - var cfg = gantt._tasks; - var countX = cfg.count; - var countY = items.length; - var svg = this.svg; - if (!svg) { - svg = this._createSvg(container); - } - this._render_bg_canvas(svg, items, { - fromX: 0, - toX: countX, - fromY: 0, - toY: countY - }); - }, - _createSvg: function (container) { - var svg = SVG(container); - $(svg.node).css({position: "absolute"}); - this.svg = svg; - return svg; - }, - switchFullRender: function (fullRender) { - if (this.fullCanvasRender === fullRender) return; - this.fullCanvasRender = fullRender; - this.render_items(); - }, - isScrolledOut: function (x, y) { - if (this.fullCanvasRender) return false; - if (this.forceRender) return true; - var lastPos = this.lastPos; - if (!lastPos) return true; - var limits = this.getCanvasLimits(); - if (x !== undefined) { - var bufferX = (limits.x - window.innerWidth) / 2; - if (Math.abs(x - lastPos.x) > bufferX) return true; - } - if (y !== undefined) { - var bufferY = (limits.y - window.innerHeight) / 2; - if (Math.abs(y - lastPos.y) > bufferY) return true; - } - }, - getCanvasLimits: function () { - return {x: window.innerWidth + 600, y: window.innerHeight + 600}; - } - }; -}; diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/bars.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/bars.js deleted file mode 100644 index b10fde7ef2c35546ec8c8df12af44d87fd71e606..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/bars.js +++ /dev/null @@ -1,278 +0,0 @@ -/* bars.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.view = ysy.view || {}; - -ysy.view.bars = ysy.view.bars || {}; -$.extend(ysy.view.bars, { - _dateCache: {}, // for faster parsing YYYY-MM-DD to moment - _rendererStack: {}, - - registerRenderer: function (entity, renderer) { - if (this._rendererStack[entity] === undefined) { - this._rendererStack[entity] = []; - } - var renderers = this._rendererStack[entity]; - var found = false; - for (var i = 0; i < renderers.length; i++) { - if (renderers[i] === renderer) found = true; - } - if (found) return; - renderers.push(renderer); - this.reconstructRenderer(entity); - }, - removeRenderer: function (entity, renderer) { - var renderers = this._rendererStack[entity]; - if (!renderers) return; - for (var i = 0; i < renderers.length; i++) { - if (renderers[i] === renderer) { - renderers.splice(i, 1); - this.reconstructRenderer(entity); - return; - } - } - }, - reconstructRenderer: function (entity) { - var renderers = this._rendererStack[entity]; - if (renderers.length === 0) { - gantt.config.type_renderers[entity] = gantt._task_default_render; - return; - } - gantt.config.type_renderers[entity] = function (task) { - var i = renderers.length - 1; - var nextRenderer = function () { - if (i < 0) return gantt._task_default_render; - return renderers[i--]; - }; - return nextRenderer().call(this, task, nextRenderer); - } - }, - - getFromDateCache: function (allodate) { - var alloMoment = this._dateCache[allodate]; - if (alloMoment === undefined) { - alloMoment = moment(allodate); - this._dateCache[allodate] = alloMoment; - } - return alloMoment; - }, - insertCanvas:function (canvas,rootDiv) { - var taskLeftElements = rootDiv.getElementsByClassName("task_left"); - if (taskLeftElements.length === 0) { - rootDiv.appendChild(canvas); - } else { - rootDiv.insertBefore(canvas, taskLeftElements[0]); - } - }, - canvasListBuilder: function () { - return { - __proto__: this.canvasListPrototype - }; - //return canvasList; - }, - canvasListPrototype: { - limit: 8170, - build: function (task, gantt, start_date, end_date) { - // initialization - this.canvases = []; - this.contexts = []; - this.starts = []; - this.gantt = gantt; - this.isAssignee = task.type === "assignee"; - this.el = null; - this.height = this.isAssignee ? gantt.config.row_height : gantt._tasks.bar_height; - this.columnWidth = gantt._tasks.col_width; - - var startX = gantt.posFromDate(start_date || task.start_date); - var endX = gantt.posFromDate(end_date || task.end_date); - //var fullWidth = gantt._get_task_width(task); - var fullWidth = endX - startX; - this.startX = startX; - this.fullWidth = fullWidth; - var config = gantt._tasks; - - if (fullWidth < this.limit) { - this.el = this.createCanvas(fullWidth); - this.starts.push(startX); - this.staticPack = { - ctx: this.contexts[0], - canvas: this.el, - start: startX, - end: startX + fullWidth - }; - } else { - this.el = document.createElement("div"); - var lefts = config.left; - for (var i = 0; i < lefts.length; i++) { - if (lefts[i] >= startX) break; - } - var partX = startX; - for (; i < lefts.length; i++) { - if (lefts[i] > fullWidth + startX) break; - if (lefts[i] >= partX + this.limit) { - var canvas = this.createCanvas(lefts[i - 1] - partX); - this.el.appendChild(canvas); - this.starts.push(partX); - partX = lefts[i - 1]; - } - } - canvas = this.createCanvas(startX + fullWidth - partX); - this.el.appendChild(canvas); - this.starts.push(partX); - - } - this.el.className += " gantt-task-bar-line"; - if (this.isAssignee) { - var y = this.gantt.getTaskTop(task.id); - this.el.style.left = startX + "px"; - this.el.style.top = y + "px"; - } - }, - createCanvas: function (width) { - var el = document.createElement("canvas"); - //var height = this.gantt._tasks.bar_height; - width = Math.round(width); - el.style.width = width + "px"; - el.width = width; - el.height = this.height - 1; - el.className = "gantt-task-bar-canvas"; - this.canvases.push(el); - var ctx = el.getContext("2d"); - ctx.textAlign = 'center'; - ctx.textBaseline = 'middle'; - this.contexts.push(ctx); - return el; - }, - getElement: function () { - return this.el; - }, - inRange: function (date) { - var pos = gantt.posFromDateCached(date); - return pos + this.columnWidth >= this.startX && pos < this.fullWidth + this.startX; - }, - fillTextAt: function (date, text, styles) { - var x = gantt.posFromDateCached(date); - var pack = this.getPack(x); - var posPack = this.getPosPack(x, pack); - var ctx = pack.ctx; - if (styles.backgroundColor) { - this.fillRectAtPosPack(posPack, pack, styles.backgroundColor); - } - ctx.font = styles.fontStyle; - ctx.fillStyle = styles.textColor; - text = this.fitTextInWidth(text, posPack.width, ctx); - ctx.fillText(text, posPack.middle, this.height / 2 + 1); - }, - fillFormattedTextAt: function (date, formatter, value, styles) { - var x = gantt.posFromDateCached(date); - var pack = this.getPack(x); - var posPack = this.getPosPack(x, pack); - var ctx = pack.ctx; - if (styles.backgroundColor) { - this.fillRectAtPosPack(posPack, pack, styles.backgroundColor, styles.shrink); - } - ctx.font = styles.fontStyle; - ctx.fillStyle = styles.textColor; - var text = formatter(value, posPack.width); - text = this.fitTextInWidth(text, posPack.width, ctx); - ctx.fillText(text, posPack.middle, this.height / 2 + 1); - }, - fillTwoTextAt: function (date, textUpper, textBottom, styles) { - var x = gantt.posFromDateCached(date); - var pack = this.getPack(x); - var posPack = this.getPosPack(x, pack); - var ctx = pack.ctx; - if (styles.backgroundColor) { - this.fillRectAtPosPack(posPack, pack, styles.backgroundColor, styles.shrink); - } - var bottomLine = this.height / 2 + 1; - ctx.fillStyle = styles.textColor; - if (textUpper) { - ctx.font = styles.fontStyle.replace("12px", "9px"); - bottomLine = bottomLine * 13.0 / 10; - textUpper = this.fitTextInWidth(textUpper, posPack.width, ctx); - ctx.fillText(textUpper, posPack.middle, this.height * 3 / 12); - } - if (textBottom) { - ctx.font = styles.fontStyle; - // ctx.fillStyle = styles.textColor; - textBottom = this.fitTextInWidth(textBottom, posPack.width, ctx); - ctx.fillText(textBottom, posPack.middle, bottomLine); - } - }, - fillRectAtPosPack: function (posPack, pack, fillColor, shrink) { - pack.ctx.fillStyle = fillColor; - if (shrink) { - pack.ctx.fillRect(posPack.start + 1, 1, posPack.width - 3, this.height - 3); - } else { - pack.ctx.fillRect(posPack.start, 0, posPack.width, this.height); - } - }, - roundTo1: function (number) { - if (number === undefined) return ""; - var modulated = number % 1; - if (modulated < 0) { - modulated += 1; - } - if (modulated < this.MARGIN || modulated > (1 - this.MARGIN)) { - return number.toFixed(); - } - return number.toFixed(1); - }, - fitTextInWidth: function (text, width, ctx) { - width -= 2; - if (text.length * 7.2 < width) return text; - ctx.font = ctx.font.replace("12px", "9px"); - if (text.length * 5.3 < width) return text; - var splitPos = Math.floor(width / 5.3 - 1); - return text.substring(0, splitPos) + "#"; - }, - getPosPack: function (x, pack) { - var start, end, width = this.columnWidth; - if (!pack) return null; - start = x - pack.start; - if (x < pack.start || x > pack.end - width) { - end = start + width + Math.min(0, pack.end - width - x); - start = Math.max(start, 0); - return { - start: start, - end: end, - middle: Math.floor((start + end) / 2), - width: end - start - }; - } else { - return { - start: start, - end: start + width, - middle: Math.floor(start + width / 2), - width: width - }; - } - }, - getPack: function (pos) { - if (this.staticPack) return this.staticPack; - //var pos = gantt.posFromDateCached(date); - // var min = this.startX; - var mid = pos + this.columnWidth / 2; - // if (pos + width < min) return null; - // if (pos >= this.fullWidth + min) return null; - - for (var i = 1; i < this.starts.length; i++) { - if (this.starts[i] > mid) break; - } - if (i >= this.starts.length) { - i = this.starts.length; - var end = this.startX + this.fullWidth; - } else { - end = this.starts[i]; - } - - return { - ctx: this.contexts[i - 1], - canvas: this.canvases[i - 1], - start: this.starts[i - 1], - end: end - }; - } - } -}); diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/collapsor.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/collapsor.js deleted file mode 100644 index 83892ae56416219128e7588096749a1296038399..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/collapsor.js +++ /dev/null @@ -1,148 +0,0 @@ -/* collapsor.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.pro = ysy.pro || {}; -ysy.pro.collapsor = ysy.pro.collapsor || {}; -$.extend(ysy.pro.collapsor, { - templateHtml: null, - patch: function () { - var $sourceDiv = $("#close_all_something"); - this.templateHtml = '<div id="gantt_grid_collapsors" class="gantt-grid-header-collapse-buttons">' + $sourceDiv.html() + '</div>'; - $sourceDiv.remove(); - - }, - extendees: [ - { - id: "close_all_parent_issues", - - bind: function () { - this.model = ysy.data.limits; - }, - func: function () { - var openings = this.model.openings; - var issues = ysy.data.issues.getArray(); - this.model.parentsIssuesClosed = !this.model.parentsIssuesClosed; - if (this.model.parentsIssuesClosed) { - for (var i = 0; i < issues.length; i++) { - openings[issues[i].getID()] = false; - } - } else { - for (i = 0; i < issues.length; i++) { - delete openings[issues[i].getID()]; - } - } - this.model._fireChanges(this, "close_all_parent_issues"); - return false; - }, - isOn: function () { - return this.model.parentsIssuesClosed; - } - }, - { - id: "close_all_milestones", - bind: function () { - this.model = ysy.data.limits; - }, - func: function () { - var openings = this.model.openings; - var milestones = ysy.data.milestones.getArray(); - this.model.milestonesClosed = !this.model.milestonesClosed; - if (this.model.milestonesClosed) { - for (var i = 0; i < milestones.length; i++) { - openings[milestones[i].getID()] = false; - } - } else { - for (i = 0; i < milestones.length; i++) { - delete openings[milestones[i].getID()]; - } - } - this.model._fireChanges(this, "close_all_milestones"); - return false; - }, - isOn: function () { - return this.model.milestonesClosed; - } - }, - { - id: "close_all_projects", - bind: function () { - this.model = ysy.data.limits; - }, - func: function () { - var openings = this.model.openings; - var projects = ysy.data.projects.getArray(); - this.model.projectsClosed = !this.model.projectsClosed; - if (this.model.projectsClosed) { - for (var i = 0; i < projects.length; i++) { - if (projects[i].id === ysy.settings.projectID) continue; - delete openings[projects[i].getID()]; - // gantt.close(projects[i].getID()); - } - } else { - for (i = 0; i < projects.length; i++) { - if (!projects[i].needLoad) { - openings[projects[i].getID()] = true; - } - //gantt.open(projects[i].getID()); - } - } - this.model._fireChanges(this, "close_all_projects"); - return false; - }, - isOn: function () { - return this.model.projectsClosed; - } - } - ] -}); -//############################################################################################# -ysy.view.Collapsors = function () { - ysy.view.Widget.call(this); -}; -ysy.main.extender(ysy.view.Widget, ysy.view.Collapsors, { - name: "CollapsorsWidget", - _postInit:function(){ - this.model = ysy.settings.resource; - this.model.unregister(this); - this.model.register(this.requestRepaint,this); - }, - _updateChildren: function () { - for (var i = 0; i < this.children.length; i++) { - this.children.destroy(); - } - this.children = []; - var collapsorClass = ysy.pro.collapsor; - for (i = 0; i < collapsorClass.extendees.length; i++) { - var extendee = collapsorClass.extendees[i]; - var button = new ysy.view.Button(); - $.extend(button, extendee); - button.init(); - this.children.push(button); - } - }, - repaint: function (force) { - var $target = $("#gantt_grid_collapsors"); - if(this.repaintRequested){ - if(this.model.open){ - $target.hide(); - return; - }else{ - $target.show(); - } - $target.off("click").on("click",function(){ - return false; - }); - } - for (var i = 0; i < this.children.length; i++) { - var child = this.children[i]; - child.$target = this.getChildTarget(child); - if(!child.$target.length) continue; - child.repaint(force || this.repaintRequested); - } - this.repaintRequested=false; - }, - getChildTarget: function (child) { - return this.$target.find("#" + child.elementPrefix + child.id); - } -}); - diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/data.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/data.js deleted file mode 100644 index 92a4fa333a289cfb8c4b633f1fe4fa01ddb4ef33..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/data.js +++ /dev/null @@ -1,1046 +0,0 @@ -/* data.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.data = ysy.data || {}; -ysy.data.Data = function () { - this._onChange = []; - this._deleted = false; - this._created = false; - this._changed = false; - this._cache = null; -}; -ysy.data.Data.prototype = { - permissions: null, - problems: {}, - init: function (obj, parent) { - this._old = obj; - $.extend(this, obj); - this._parent = parent; - this._postInit(); - return this; - }, - _postInit: function () { - }, - set: function (key, val) { - // in the case of object as a first parameter: - // - parameter key is object and parameter val is not used. - if (typeof key === "object") { - var nObj = key; - } else { - nObj = {}; - nObj[key] = val; - } - var rev = {}; - for (var k in nObj) { - if (!nObj.hasOwnProperty(k)) continue; - var nObjk = nObj[k]; - var thisk = this[k]; - if (nObjk !== thisk) { - if (ysy.main.isSameMoment(thisk, nObjk)) { - ysy.log.debug("date filtered as same", "set"); - continue; - } - rev[k] = thisk; - if (rev[k] === undefined) { - rev[k] = null; - } - } else { - ysy.log.debug(k + "=" + nObjk + " filtered as same", "set"); - } - } - if ($.isEmptyObject(rev)) { - return false; - } - rev._changed = this._changed; - $.extend(this, nObj); - this._fireChanges(this, "set"); - ysy.history.add(rev, this); - this._changed = true; - return true; - }, - register: function (func, ctx) { - for (var i = 0; i < this._onChange.length; i++) { - var reg = this._onChange[i]; - if (reg.ctx === ctx) { - this._onChange[i] = {func: func, ctx: ctx}; - return; - } - } - this._onChange.push({func: func, ctx: ctx}); - }, - unregister: function (ctx) { - var nonch = []; - for (var i = 0; i < this._onChange.length; i++) { - var reg = this._onChange[i]; - if (reg.ctx !== ctx) { - nonch.push(reg); - } - } - this._onChange = nonch; - }, - setSilent: function (key, val) { - if (typeof key === "object") { - var different; - var keyk, thisk; - for (var k in key) { - if (!key.hasOwnProperty(k)) continue; - keyk = key[k]; - thisk = this[k]; - if (keyk === thisk)continue; - if (ysy.main.isSameMoment(thisk, keyk)) continue; - this[k] = keyk; - different = true; - } - return different || false; - //$.extend(this, key); - } else { - if (this[key] === val) return false; - this[key] = val; - return true; - } - }, - _fireChanges: function (who, reason, onlyChildChanged) { - if (who) { - var reasonPart = ""; - if (reason) { - reasonPart = " because of " + reason; - } - if (who === this) { - var targetPart = "itself"; - } else { - targetPart = this._name; - } - var name = who._name; - if (!name) { - name = who.name; - } - if (!name) { - ysy.log.warning(who); - } - ysy.log.log("* " + name + " ordered repaint on " + targetPart + reasonPart); - - } - if (onlyChildChanged) { - var onChangeArray = this._onChildChange; - } else { - onChangeArray = this._onChange; - this._cache = null; - } - if (onChangeArray.length > 0) { - ysy.log.log("- " + this._name + (onlyChildChanged ? " on ChildChange" : " onChange") + " fired for " + onChangeArray.length + " widgets"); - } else { - ysy.log.log("- no " + (onlyChildChanged ? "childChange" : "change") + " for " + this._name); - } - for (var i = 0; i < onChangeArray.length; i++) { - var ctx = onChangeArray[i].ctx; - if (!ctx || ctx.deleted) { - onChangeArray.splice(i, 1); - continue; - } - //this.onChangeNew[i].func(); - ysy.log.log("-- changes to " + (ctx.name ? ctx.name : ctx._name) + " widget"); - //console.log(ctx); - onChangeArray[i].func.call(ctx, reason); - } - }, - remove: function () { - if (this._deleted) return; - var prevChanged = this._changed; - this._changed = true; - this._deleted = true; - if (this._parent && this._parent.isArray) { - this._parent.pop(this); - } - ysy.history.add(function () { - this._changed = prevChanged; - this._deleted = false; - if (this._parent && this._parent.isArray) { - this._parent._fireChanges(this, "revert parent"); - } - }, this); - this._fireChanges(this, "remove"); - }, - removeSilent: function () { - if (this._deleted) return; - this._deleted = true; - }, - clearCache: function () { - this._cache = null; - }, - getDiff: function (newObj) { - var diff = {}; - var any = false; - for (var key in newObj) { - if (!newObj.hasOwnProperty(key)) continue; - var newItem = newObj[key]; - if (newItem != this._old[key]) { - if (moment.isMoment(newItem)) { - if (newItem.format("YYYY-MM-DD") === this._old[key]) continue; - } - diff[key] = newObj[key]; - any = true; - } - } - if (!any) return null; - return diff; - }, - isEditable: function () { - if (!this.permissions) return false; - return !!this.permissions.editable; - }, - getProblems: function () { - if (this._cache && this._cache.problems !== undefined) { - return this._cache.problems; - } - var ret = []; - for (var problemType in this.problems) { - if (!this.problems.hasOwnProperty(problemType)) continue; - var res = this.problems[problemType].call(this); - if (res) ret.push(res); - } - if (ret.length === 0) { - ret = false; - } - if (!this._cache) { - this._cache = {}; - } - this._cache.problems = ret; - return ret; - } -}; -//###########################################################################################x -ysy.data.Array = function () { - ysy.data.Data.call(this); - this.array = []; - this.dict = {}; - this._onChildChange = []; -}; -ysy.main.extender(ysy.data.Data, ysy.data.Array, { - isArray: true, - get: function (i) { - if (i < 0 || i >= this.array.length) return null; - return this.array[i]; - }, - getArray: function () { - if (!this._cache) { - var cache = []; - for (var i = 0; i < this.array.length; i++) { - if (this.array[i]._deleted) continue; - cache.push(this.array[i]); - } - this._cache = cache; - } - return this._cache; - }, - getByID: function (id) { - if (id === undefined || id === null) return null; - var el = this.dict[id]; - if (el) return el; - for (var i = 0; i < this.array.length; i++) { - if (id === this.array[i].id) { - this.dict[id] = this.array[i]; - return this.array[i]; - } - } - }, - pushSilent: function (elem) { - if (elem.id) { - var same = this.getByID(elem.id); - if (same) { - var needFire = false; - if (same._deleted !== elem._deleted) { - needFire = true; - } - elem._onChange = same._onChange; - same.setSilent(elem); - same._fireChanges(this, "pushSame"); - if (needFire) { - this._fireChanges(this, "pushSame"); - } - return same; - } - } - if (!elem._parent) { - elem._parent = this; - } - elem.register(function () { - // registered for observing changes in own children - // do not propagate to full this._fireChanges() - this.orderFireChildChange(elem); - }, this); - this.array.push(elem); - if (elem.id) { - this.dict[elem.id] = elem; - } - return elem; - - }, - childRegister: function (func, ctx) { - for (var i = 0; i < this._onChildChange.length; i++) { - var reg = this._onChildChange[i]; - if (reg.ctx === ctx) { - this._onChildChange[i] = {func: func, ctx: ctx}; - return; - } - } - this._onChildChange.push({func: func, ctx: ctx}); - }, - push: function (elem) { - //var rev=this.array.slice(); - elem._changed = true; - elem._created = true; - elem = this.pushSilent(elem); - this._fireChanges(this, "push"); - ysy.history.add(function () { - //this.pop(elem); - this._deleted = true; - this._parent._fireChanges(this, "push revert"); - //this._fireChanges(this,"push revert"); - }, elem); - - }, - pop: function (model) { - //ysy.data.history.saveDelete(this); - if (model === undefined) { - return false; - } - if (!model._deleted) { - model.remove(); - return true; - } else { - - } - this._fireChanges(this, "pop"); - /*if(model._created){ - var rev=this.array.slice(); - this.cache=null; - var arr=this.array; - for(var i=0;i<arr;i++){ - if(arr[i]===model){ - this.array.splice(i, 1); - console.log("removed item No. " + i); - this._fireChanges(this,"pop"); - ysy.history.add(rev,this); - return true; - } - } - return false; - }*/ - //this.array[i].deleted=true; - }, - clear: function () { - this.array = []; - this.dict = {}; - this._fireChanges(this, "clear all"); - }, - clearSilent: function () { - this.array = []; - this.dict = {}; - this._cache = null; - }, - orderFireChildChange: function (elem) { - if (this.childChangeTimeout) { - return; - } - var self = this; - this.childChangeTimeout = setTimeout(function () { - self._fireChanges(elem, "child updated", true); - self.childChangeTimeout = null; - }, 0); - } - /*size: function () { - return this.getArray().length; - }*/ - -}); -//############################################################################## -ysy.data.IssuesArray = { - _name: "IssuesArray" -}; -//############################################################################## -ysy.data.Issue = function () { - ysy.data.Data.call(this); -}; -ysy.main.extender(ysy.data.Data, ysy.data.Issue, { - _name: "Issue", - ganttType: "task", - isIssue: true, - closed: false, - css: '', - _postInit: function () { - if (this.start_date) { - if (typeof this.start_date === "string") { - this.start_date = moment(this.start_date, "YYYY-MM-DD"); - } else if (!this.start_date._isAMomentObject) { - console.error("start_date is not string"); - this.start_date = moment(this.start_date).startOf("day"); - } - } - if (this.due_date) { - this.end_date = moment(this.due_date, "YYYY-MM-DD"); - delete this.due_date; - } - if (this.start_date) { - this._start_date = this.start_date; - } else { - if (this.end_date && this.end_date.isBefore(moment())) { - this._start_date = moment(this.end_date); - } else { - this._start_date = moment().startOf("day"); - } - } - if (this.end_date) { - this._end_date = this.end_date; - } else { - if (this.start_date && this.start_date.isAfter(moment())) { - this._end_date = moment(this.start_date); - } else { - this._end_date = moment().startOf("day"); - } - } - //this.end_date._isEndDate = true; - this._end_date._isEndDate = true; - if (this.soonest_start) { - this.soonest_start = moment(this.soonest_start, "YYYY-MM-DD"); - } - if (this.latest_due) { - this.latest_due = moment(this.latest_due, "YYYY-MM-DD"); - this.latest_due._isEndDate = true; - } - this._transformColumns(); - }, - _transformColumns: function () { - var cols = this.columns; - if (!cols) return; - var ncols = {}; - for (var i = 0; i < cols.length; i++) { - var col = cols[i]; - ncols[col.name] = col.value; - if (col.value_id !== undefined) { - ncols[col.name + "_id"] = col.value_id; - } - } - this.columns = ncols; - }, - set: function (key, val) { - // in the case of object as a first parameter: - // - parameter key is object and parameter val is not used. - if (typeof key === "object") { - var nObj = key; - } else { - nObj = {}; - nObj[key] = val; - } - nObj = this._dateSetHelper(nObj); - return ysy.data.Data.prototype.set.call(this, nObj); - }, - setSilent: function (key, val) { - // in the case of object as a first parameter: - // - parameter key is object and parameter val is not used. - if (typeof key === "object") { - var nObj = key; - } else { - nObj = {}; - nObj[key] = val; - } - nObj = this._dateSetHelper(nObj); - return ysy.data.Data.prototype.setSilent.call(this, nObj); - }, - _dateSetHelper: function (nObj) { - if (nObj.start_date) { - if (nObj.start_date.isSame(this._start_date)) { - delete nObj.start_date; - } else { - nObj._start_date = nObj.start_date - } - } - if (nObj.end_date) { - if (nObj.end_date.isSame(this._end_date)) { - delete nObj.end_date; - } else { - nObj._end_date = nObj.end_date - } - } - return nObj; - }, - getID: function () { - return this.id; - }, - getParent: function () { - var parent = ysy.data.issues.getByID(this.parent_issue_id); - if (parent) { - if (this.project_id === parent.project_id) { - return this.parent_issue_id; - } - } - if (this.fixed_version_id) { - parent = ysy.data.milestones.getByID(this.fixed_version_id + "p" + this.project_id); - if (parent) return "m" + this.fixed_version_id + "p" + this.project_id; - parent = ysy.data.milestones.getByID(this.fixed_version_id); - if (parent) { - if (this.project_id === parent.project_id) { - return "m" + this.fixed_version_id; - } - } - } - if (ysy.data.projects.getByID(this.project_id)) { - return "p" + this.project_id; - } - return false; - }, - problems: { - checkOverMile: function () { - if (!this.fixed_version_id) { - return; - } - var milestone = ysy.data.milestones.getByID(this.fixed_version_id); - if (!milestone) { - return; - /*ysy.error("Error: Issue "+this.id+" not found its milestone");*/ - } - if (milestone.start_date.diff(this._end_date, "days") < 0) - return ysy.settings.labels.problems.overMilestone - .replace("%{effective_date}", milestone.start_date.format(gantt.config.date_format)); - }, - overDue: function () { - if ( - !this.closed - && this.end_date - && this.end_date.isBefore(moment().subtract(1, "day"))) - return ysy.settings.labels.problems.overdue; - } - }, - getDuration: function (unit) { - unit = unit || "days"; - if (this._cache && this._cache.duration) { - return this._cache.duration[unit]; - } - var durationPack = gantt._working_time_helper.get_work_units_between(this._start_date, this._end_date, "all"); - if (!this._cache) { - this._cache = {}; - } - this._cache.duration = durationPack; - return durationPack[unit]; - }, - - correctPosition: function (allRequests) { - if (allRequests === undefined) allRequests = {}; - var request = this.getMoveRequest(allRequests); - if (!request.needBroadcast) return; - request.needBroadcast = false; - request.counter++; - if (request.counter > 200) return; - ysy.log.debug(this.name + " - correctingPosition", "moveRequest"); - if (ysy.settings.milestonePush) { - var milestone = ysy.data.milestones.getByID(this.fixed_version_id); - if (milestone) { - var milestoneRequest = milestone.getMoveRequest(allRequests); - request.setLimits(null, milestoneRequest.softEnd); - } - } - var relations = ysy.data.relations.getArray(); - for (var i = 0; i < relations.length; i++) { - var relation = relations[i]; - if (relation.getTarget() === this || relation.getSource() === this) { - relation.sendMoveRequest(allRequests); - } - } - if (ysy.settings.parentIssueDates) { - var issues = ysy.data.issues.getArray(); - var childRequests = []; - for (var j = 0; j < issues.length; j++) { - if (issues[j].parent_issue_id !== this.id) continue; - var child = issues[j]; - var childRequest = child.getMoveRequest(allRequests); - childRequest.setLimits(request.hardStart, request.hardEnd, true); - childRequests.push(childRequest); - } - for (j = 0; j < childRequests.length; j++) { - childRequests[j].entity.correctPosition(allRequests); - } - var parent = ysy.data.issues.getByID(this.parent_issue_id); - if (parent) { - var parentRequest = parent.getMoveRequest(allRequests); - parentRequest.resetByChildren(allRequests); - } - } - }, - getMoveRequest: function (allRequests) { - var request = allRequests[this.getID()]; - if (!request) { - ysy.log.debug(this.name + " - new moveRequest", "moveRequest"); - allRequests[this.getID()] = request = new ysy.data.MoveRequest(); - request.init(this, allRequests); - } - return request; - }, - isOpened: function () { - var opened = ysy.data.limits.openings[this.getID()]; - if (opened === undefined) { - return true; - } - return opened; - } -}); -//############################################################################ -ysy.data.Relation = function () { - ysy.data.Data.call(this); - this.unlocked = !ysy.settings.fixedRelations; -}; -ysy.main.extender(ysy.data.Data, ysy.data.Relation, { - _name: "Relation", - _postInit: function () { - //if(this.delay&&this.delay>0){this.delay--;} - }, - getID: function () { - return "r" + this.id; - }, - getActDelay: function () { - var sourceDate = this.getSourceDate(); - var targetDate = this.getTargetDate(); - if (!sourceDate || !targetDate) return this.delay; - if (ysy.settings.workDayDelays) { - return gantt._working_time_helper.get_work_units_between(sourceDate, targetDate, "day"); - } - var correction = 0; - if (sourceDate._isEndDate) correction -= 1; - if (targetDate._isEndDate) correction += 1; - return targetDate.diff(sourceDate, "days") + correction; - }, - getSourceDate: function (source) { - if (!source) source = this.getSource(); - if (!source) return null; - if (this.type === "precedes") return source._end_date; - if (this.type === "finish_to_finish") return source._end_date; - if (this.type === "start_to_start") return source._start_date; - if (this.type === "start_to_finish") return source._start_date; - return null; - }, - getTargetDate: function (target) { - if (!target) target = this.getTarget(); - if (!target) return null; - if (this.type === "precedes") return target._start_date; - if (this.type === "finish_to_finish") return target._end_date; - if (this.type === "start_to_start") return target._start_date; - if (this.type === "start_to_finish") return target._end_date; - return null; - }, - getSourceCorrection: function () { - if (this.type === "precedes") return 1; - if (this.type === "finish_to_finish") return 1; - return 0; - }, - getTargetCorrection: function () { - if (this.type === "start_to_finish") return -1; - if (this.type === "finish_to_finish") return -1; - return 0; - }, - //getOtherDate: function (date, forSource) { - // var otherDate = gantt._working_time_helper.add_worktime(date, forSource ? -this.delay : this.delay, "day"); - //}, - getProblems: function () { - var del = this.getActDelay(); - var diff = (this.delay || 0) - del; - if (diff > 0) - return [ - ysy.settings.labels.problems.shortDelay - .replace("%{diff}", diff.toFixed(0)) - ]; - return []; - }, - checkDelay: function () { - var del = this.getActDelay(); - return del >= (this.delay || 0); - }, - getSource: function () { - return ysy.data.issues.getByID(this.source_id); - }, - getTarget: function () { - return ysy.data.issues.getByID(this.target_id); - }, - makeDelayFixedForSave: function () { - var delay = this.getActDelay(); - if (this.set({delay: delay})) { - this._fireChanges(this, "makeDelayFixedForSave()"); - } - }, - sendMoveRequest: function (allRequests) { - var source = this.getSource(); - var target = this.getTarget(); - if (!source || !target) return true; // HALF LINK - var sourceRequest = source.getMoveRequest(allRequests); - var targetRequest = target.getMoveRequest(allRequests); - if (this.getSourceCorrection() === 1) { - var sourceDate = sourceRequest.softEnd; - sourceDate._isEndDate = true; - } else { - sourceDate = sourceRequest.softStart; - } - if (ysy.settings.workDayDelays) { - var earliestTarget = gantt._working_time_helper.add_worktime(sourceDate, this.delay, "day", this.getTargetCorrection() === -1); - } else { - earliestTarget = moment(sourceDate).add(this.delay + this.getTargetCorrection() + this.getSourceCorrection(), "days"); - } - gantt._working_time_helper.round_date(earliestTarget); - targetRequest.setLimits(earliestTarget, null, true); - - if (this.getTargetCorrection() === 0) { - earliestTarget = gantt._working_time_helper.add_worktime(earliestTarget, targetRequest.duration, "day", false); - } - - if (targetRequest.hardEnd && earliestTarget.isAfter(targetRequest.hardEnd)) { - var targetDate = targetRequest.hardEnd; - targetDate._isEndDate = true; - if (this.getTargetCorrection() === 0) { - targetDate = gantt._working_time_helper.add_worktime(targetDate, -targetRequest.duration, "day", false); - } - if (ysy.settings.workDayDelays) { - var latestDate = gantt._working_time_helper.add_worktime(targetDate, -this.delay, "day", sourceDate._isEndDate === true); - } else { - latestDate = moment(targetDate).add(-this.delay - this.getTargetCorrection() - this.getSourceCorrection(), "days"); - } - if (this.getSourceCorrection() === 0) { - latestDate = gantt._working_time_helper.add_worktime(latestDate, sourceRequest.duration, "day", false); - } - latestDate._isEndDate = true; - gantt._working_time_helper.round_date(latestDate, "past"); - ysy.log.debug(source.name + " - milestonePush to " + latestDate.format("DD.MM.YYYY"), "moveRequest"); - source.getMoveRequest(allRequests) - .setLimits(null, latestDate); - return; - } - ysy.log.debug(target.name + " - classicPush to (end) " + earliestTarget.format("DD.MM.YYYY"), "moveRequest"); - target.correctPosition(allRequests); - - }, - isEditable: function () { - var source = this.getSource(); - if (!source) return false; - if (source.isEditable()) return true; - var target = this.getTarget(); - if (!target) return false; - if (target.isEditable()) return true; - }, - isHalfLink: function () { - return !(ysy.data.issues.getByID(this.source_id) && ysy.data.issues.getByID(this.target_id)); - } -}); -//############################################################################ -ysy.data.SimpleRelation = function () { - ysy.data.Data.call(this); -}; -ysy.main.extender(ysy.data.Relation, ysy.data.SimpleRelation, { - _name: "SimpleRelation", - isSimple: true, - sendMoveRequest: function (allRequests) { - return false - }, - isEditable: function () { - return false; - } -}); -//############################################################################## -ysy.data.Milestone = function () { - ysy.data.Data.call(this); -}; -ysy.main.extender(ysy.data.Data, ysy.data.Milestone, { - _name: "Milestone", - ganttType: "milestone", - milestone: true, - _postInit: function () { - if (this.start_date) { - if (typeof this.start_date === "string") { - this.start_date = moment(this.start_date, "YYYY-MM-DD"); - } else { - this.start_date = moment(this.start_date).startOf("day"); - } - } - if (!this.start_date) { - this.start_date = moment().startOf("day"); - } - }, - getID: function () { - return "m" + this.id; - }, - getIssues: function () { - var retissues = []; - var issues = ysy.data.issues.getArray(); - for (var i = 0; i < issues.length; i++) { - if (issues[i].fixed_version_id === this.id) { - retissues.push(issues[i]); - } - } - return retissues; - }, - _fireChanges: function (who, reason) { - var prototype = ysy.data.Data.prototype; - prototype._fireChanges.call(this, who, reason); - var childs = this.getIssues(); - for (var i = 0; i < childs.length; i++) { - childs[i]._fireChanges(this, "milestone change"); - } - }, - getProblems: function () { - return false; - }, - getParent: function () { - if (ysy.data.projects.getByID(this.project_id)) { - return "p" + this.project_id; - } - return false; - }, - correctPosition: function (allRequests) { - if (allRequests === undefined) allRequests = {}; - var request = this.getMoveRequest(allRequests); - if (!request.needBroadcast) return; - request.needBroadcast = false; - ysy.log.debug(this.name + " - correctingPosition", "moveRequest"); - var issues = ysy.data.issues.getArray(); - for (var j = 0; j < issues.length; j++) { - if (issues[j].fixed_version_id !== this.id) continue; - var child = issues[j]; - child.getMoveRequest(allRequests).setLimits(null, request.softEnd); - } - }, - getMoveRequest: function (allRequests) { - var request = allRequests[this.getID()]; - if (!request) { - ysy.log.debug(this.name + " - new moveRequest", "moveRequest"); - allRequests[this.getID()] = request = { - allRequests: allRequests, - entity: this, - setPosition: function (sortStart, softEnd) { - this.softStart = sortStart; - this.softEnd = moment(sortStart); - this.softEnd._isEndDate = true; - } - }; - request.setPosition(this.start_date, null); - // request.init(this, allRequests); - } - return request; - }, - isOpened: function () { - var opened = ysy.data.limits.openings[this.getID()]; - if (opened === undefined) { - return true; - } - return opened; - } -}); -//############################################################################## -ysy.data.SharedMilestone = function () { - ysy.data.Milestone.call(this); -}; -ysy.main.extender(ysy.data.Milestone, ysy.data.SharedMilestone, { - _name: "SharedMilestone", - isShared: true, - ganttSubtype: "shared_milestone", - _postInit: function () { - this.real_id = this.id; - this.id = this.id + "p" + this.project_id; - this.css = "gantt-milestone-shared"; - this.__proto__.__proto__._postInit.call(this); - this.real_milestone.register(function (reason) { - if (reason === "revert") return; - if (this.start_date.isSame(this.real_milestone.start_date)) return; - this.set({start_date: moment(this.real_milestone.start_date)}); - }, this); - }, - isEditable: function () { - return false; - } -}); -//############################################################################## -ysy.data.Project = function () { - ysy.data.Data.call(this); -}; -ysy.main.extender(ysy.data.Data, ysy.data.Project, { - _name: "Project", - ganttType: "project", - isProject: true, - needLoad: true, - issues_count: 0, - has_subprojects: false, - _shift: 0, - _postInit: function () { - this.start_date = this.start_date ? moment(this.start_date, "YYYY-MM-DD") : null; - //this.end_date=moment(this.due_date).add(1, "d"); - if (this.due_date) { - this.end_date = moment(this.due_date, "YYYY-MM-DD"); - this.end_date._isEndDate = true; - } - delete this.due_date; - if (this.is_baseline) { - this._ignore = true; - } - this.project_id = this.id; - if (ysy.settings.projectID === this.id) { - ysy.data.limits.openings[this.getID()] = true; - this.needLoad = false; - } - if (ysy.settings.global) { - this.needLoad = this.needLoad && this.has_subprojects; - } - this._transformColumns(); - }, - _transformColumns: function () { - var cols = this.columns; - if (!cols) return; - var ncols = {}; - for (var i = 0; i < cols.length; i++) { - var col = cols[i]; - ncols[col.name] = col.value; - if (col.value_id !== undefined) { - ncols[col.name + "_id"] = col.value_id; - } - } - this.columns = ncols; - }, - getID: function () { - return "p" + this.id; - }, - problems: {}, - getProgress: function () { - return this.done_ratio / 100.0 || 0; - }, - getParent: function () { - if (ysy.data.projects.getByID(this.parent_id)) { - return "p" + this.parent_id; - } - return false; - }, - isOpened: function () { - return ysy.data.limits.openings[this.getID()] || false; - } -}); -//############################################################################## -ysy.data.MoveRequest = function () { - this.needBroadcast = false; - this.counter = 0; -}; -ysy.main.extender(Object, ysy.data.MoveRequest, { - _name: "MoveRequest", - init: function (issue, allRequests) { - this.entity = issue; - this.allRequests = allRequests; - this.softStart = issue._start_date; - this.softEnd = issue._end_date; - this.duration = issue.getDuration(); - if (!this.entity.isEditable()) { - this.hardStart = issue._start_date; - this.hardEnd = issue._end_date; - } - return this; - }, - setLimits: function (hardStart, hardEnd, silent) { - var startSet = false, endSet = false, oldHardStart = this.hardStart; - if (hardStart) { - if (!this.hardStart || this.hardStart.isBefore(hardStart)) { - this.hardStart = moment(hardStart); - startSet = true; - } - } - if (hardEnd) { - if (!this.hardEnd || this.hardEnd.isAfter(hardEnd)) { - this.hardEnd = moment(hardEnd); - this.hardEnd._isEndDate = true; - endSet = true; - } - } - if (startSet || endSet) { - if (this.hardEnd) { - var lastStart = gantt._working_time_helper.add_worktime(this.hardEnd, -this.duration, "day"); - if (this.hardStart && this.hardStart.isAfter(lastStart)) { - this.hardStart = lastStart; - } - if (this.softEnd && this.softEnd.isAfter(this.hardEnd)) { - ysy.log.debug("start: " + this.softStart.format("DD.MM.YYYY") + "=>" + lastStart.format("DD.MM.YYYY") + - " end: " + this.softEnd.format("DD.MM.YYYY") + "=>" + this.hardEnd.format("DD.MM.YYYY"), "moveRequest"); - this.softEnd = moment(this.hardEnd); - this.softEnd._isEndDate = true; - this.softStart = lastStart; - this.needBroadcast = true; - } - } - if (this.hardStart) { - var earliestEnd = gantt._working_time_helper.add_worktime(this.hardStart, this.duration, "day", true); - if (this.softStart && this.softStart.isBefore(this.hardStart)) { - ysy.log.debug("start: " + this.softStart.format("DD.MM.YYYY") + "=>" + this.hardStart.format("DD.MM.YYYY") + - " end: " + this.softEnd.format("DD.MM.YYYY") + "=>" + earliestEnd.format("DD.MM.YYYY"), "moveRequest"); - this.softStart = moment(this.hardStart); - this.softEnd = earliestEnd; - this.needBroadcast = true; - } - } - } - // if (this.needBroadcast) { - // ysy.log.debug(this.entity.name + " - setLimits(" + (hardStart ? hardStart.format("DD.MM.YYYY") : "null") + "," + (hardEnd ? hardEnd.format("DD.MM.YYYY") : "null") + ") => " + this.needBroadcast,"moveRequest"); - // } - if (!silent) { - this.entity.correctPosition(this.allRequests); - } - }, - resetByChildren: function (allRequests) { - var issues = ysy.data.issues.getArray(); - var lastStart; - var earliestEnd; - var startLimit = undefined; - var endLimit = undefined; - for (var j = 0; j < issues.length; j++) { - if (issues[j].parent_issue_id !== this.entity.id) continue; - var childRequest = issues[j].getMoveRequest(allRequests); - if (!lastStart || lastStart.isAfter(childRequest.softStart)) { - lastStart = childRequest.softStart; - } - if (startLimit !== false) { - if (childRequest.hardStart) { - if (!startLimit || startLimit.isAfter(childRequest.hardStart)) { - startLimit = childRequest.hardStart; - } - } else { - startLimit = false; - } - } - if (!earliestEnd || earliestEnd.isBefore(childRequest.softEnd)) { - earliestEnd = childRequest.softEnd; - } - if (endLimit !== false) { - if (childRequest.hardEnd) { - if (!endLimit || endLimit.isBefore(childRequest.hardEnd)) { - endLimit = childRequest.hardEnd; - } - } else { - endLimit = false; - } - } - } - this.needBroadcast = true; - this.softStart = moment(lastStart); - this.softEnd = moment(earliestEnd); - this.softEnd._isEndDate = true; - this.hardStart = startLimit || undefined; - this.hardEnd = endLimit || undefined; - ysy.log.debug(this.entity.name + " - resetByChildren (" + this.softStart.format("DD.MM.YYYY") + "," + this.softEnd.format("DD.MM.YYYY") + ")", "moveRequest"); - this.duration = gantt._working_time_helper.get_work_units_between(this.softStart, this.softEnd, "day"); - this.entity.correctPosition(this.allRequests); - }, - setPosition: function (startDate, endDate, silent) { - if (!this.entity.isEditable()) return; - this.duration = gantt._working_time_helper.get_work_units_between(startDate, endDate, "day"); - if (!this.hardStart || !this.hardStart.isAfter(startDate)) { - this.softStart = startDate; - this.needBroadcast = true; - } else { - endDate = gantt._working_time_helper.add_worktime(this.hardStart, this.duration, "day", true); - } - if (!this.hardEnd || !this.hardEnd.isBefore(endDate)) { - this.softEnd = endDate; - this.needBroadcast = true; - } - ysy.log.debug(this.entity.name + " - setPosition to (" + this.softStart.format("DD.MM.YYYY") + "," + this.softEnd.format("DD.MM.YYYY") + ") => " + this.needBroadcast, "moveRequest"); - if (!silent) { - this.entity.correctPosition(this.allRequests); - } - } -}); diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/dhtml_addons.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/dhtml_addons.js deleted file mode 100644 index 84a0238b885411eb8616d8c8e7c8a951eb497e84..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/dhtml_addons.js +++ /dev/null @@ -1,478 +0,0 @@ -/* dhtml_addons.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.view = ysy.view || {}; -ysy.view.addGanttAddons = function () { - gantt.ascStop = function (task, start_date, end_date, ancestorLink) { - var diff; - if (task.soonest_start && start_date && start_date.isBefore(task.soonest_start)) { - diff = task.soonest_start.diff(start_date, "seconds"); - start_date.add(diff, "seconds"); - if (end_date) end_date.add(diff, "seconds"); - } - if (task.latest_due && end_date && end_date.isAfter(task.latest_due)) { - diff = task.latest_due.diff(end_date, "seconds"); - end_date.add(diff, "seconds"); - if (start_date) start_date.add(diff, "seconds"); - } - var sumMove = 0; - for (var i = 0; i < task.$target.length; i++) { - var lid = task.$target[i]; - if (ancestorLink && parseInt(lid) === ancestorLink.id) continue; // skip link sourcing moved parent - var link = gantt._lpull[lid]; - if (link.isSimple) continue; - var targetDate; - if (link.type === "precedes" || link.type == "start_to_start") { - if (!start_date) continue; - targetDate = start_date; - } else if (link.type === "finish_to_finish" || link.type == "start_to_finish") { - if (!end_date) continue; - targetDate = end_date; - } else continue; - //if (link.type !== "precedes") continue; - var source = gantt._pull[link.source]; - var sourceDate = gantt.getLinkSourceDate(source, link.type); - if (ysy.settings.workDayDelays) { - var linkLast = gantt._working_time_helper.add_worktime(sourceDate, link.delay, "day", targetDate._isEndDate === true); - diff = -targetDate.diff(linkLast, "seconds"); - } else { - diff = -targetDate.diff(sourceDate, "seconds") + (link.delay + gantt.getLinkCorrection(link.type)) * 24 * 60 * 60; - } - // ysy.log.debug("sourceDate="+sourceDate.toISOString()+" diff="+diff); - if (diff > 0) { - sumMove += diff; - //ysy.log.debug("ascStop linkLast=" + linkLast.format("YYYY-MM-DD") + " diff=" + diff, "task_drag"); - if (start_date) { - start_date.add(diff, "seconds"); - } - if (end_date) { - end_date.add(diff, "seconds"); - } - } - } - return sumMove; - }; - gantt.multiStop = gantt.ascStop; - gantt.moveDesc = function (task, diff, ancestorLink, resizing) { - if (typeof(diff) === "object") { - diff = task.start_date.diff(diff.old_start, "seconds"); - } - // runs after task dates are already modified. - ysy.log.debug("moveDesc(): task=" + task.text + " diff=" + (diff / 86400) + (ancestorLink ? " ancestorLink=" + ancestorLink.id : ""), "task_drag"); - var first = !ancestorLink; - if (first && task.type === "milestone") { - var oldTask = gantt._pull[task.id]; - oldTask.end_date = task.end_date; - } - var bothDir = false; - // diff in seconds - if (diff === 0) return 0; - if (diff <= 0 && !bothDir) { - gantt.moveChildren(task, diff, first); - return 0; - } - var mileBack = 0; - if (diff > 0) { - if (ysy.settings.milestonePush) { - mileBack = gantt.milestoneDescStop(task, first ? 0 : diff); - if (mileBack !== 0) { - diff -= mileBack; - ysy.log.debug("task=" + task.text + " oldDiff=" + ((diff + mileBack) / 86400) + " newDiff=" + (diff / 86400) + " mileDiff=" + (mileBack / 86400), "task_drag_milestone"); - } - } else { - gantt.milestoneMoveBy(task, first ? 0 : diff); - } - } - if (first && mileBack !== 0) { - if (resizing !== "right") { - task.start_date.add(Math.floor(-mileBack), 'seconds'); - } - if (resizing !== "left") { - task.end_date.add(Math.floor(-mileBack), 'seconds'); - } - gantt.refreshTask(task.id); - ysy.log.debug("FIRST " + task.text + " corrected by mileDiff=" + (mileBack / 3600 / 24) + " to " + task.start_date.format("YYYY-MM-DD"), "task_drag_milestone"); - } - var movedByChildren = gantt.moveChildren(task, diff, first); - - if (!first && (diff > 0 || bothDir)) { - if(!movedByChildren){ - ysy.log.debug("Task " + task.text + " pushed by " + (diff / 86400) + " days", "task_drag"); - task.start_date.add(Math.floor(diff), 'seconds'); - task.end_date.add(Math.floor(diff), 'seconds'); - } - // var oldStartDate = moment(task.start_date); - task._changed = gantt.config.drag_mode.move; - gantt.refreshTask(task.id); - } - if (!first && diff < 0) { - var ascDiff = gantt.ascStop(task, task.start_date, task.end_date, ancestorLink); - if (ascDiff !== 0) { - // ysy.log.debug("diff=" + diff + " ascStopDiff=" + ascDiff); - diff += ascDiff; - } - } - var start_date = +task.start_date / 1000; - var end_date = +task.end_date / 1000; - for (var i = 0; i < task.$source.length; i++) { - var lid = task.$source[i]; - var link = gantt._lpull[lid]; - if (link.isSimple) continue; - var desc = gantt._pull[link.target]; - if (diff < 0 && bothDir) { - // ysy.log.debug("desc=" + desc.text +" diff="+diff); - gantt.moveDesc(desc, diff, link); - // ysy.log.debug("task=" + task.text + " diff=" + diff + " reduced by " + backDiff); - } else { - var descDiff = gantt.getFreeDelay(link, desc, start_date, end_date); - if (descDiff <= 0) continue; - // ysy.log.debug("desc=" + desc.text +" diff="+diff+" descDiff="+descDiff); - gantt.moveDesc(desc, descDiff, link); - } - } - //ysy.log.debug("Task " + task.text + " pushed back by " + (diff / 86400) + " days", "task_drag"); - return 0; - }; - gantt.moveChildren = function (task, shift, first) { - if (!(gantt._get_safe_type(task.type) === "task" && ysy.settings.parentIssueDates)) { - if (task.$open && gantt.isTaskVisible(task.id)) { - if (task.type === "milestone") gantt.moveMilestoneChildren(task); - return; - } - } - var branch = gantt._branches[task.id]; - if (!branch || branch.length === 0) return; - ysy.log.debug("Shift children of \"" + task.text + "\" by " + shift + " seconds", "parent"); - ysy.log.debug("moveChildren(): of \"" + task.text + "\" by " + shift + " seconds", "task_drag"); - var parentStartDate = +task.start_date; - if (first) { - parentStartDate -= shift * 1000; - } - var shiftedParentDate = moment(parentStartDate + shift * 1000); - for (var i = 0; i < branch.length; i++) { - var childId = branch[i]; - //if(gantt.isTaskVisible(childId)){continue;} - var child = gantt.getTask(childId); - if (!child._parent_offset) { - child._parent_offset = gantt._working_time_helper.get_work_units_between(parentStartDate, child.start_date, "day"); - } - var childStartDiff = gantt._working_time_helper.add_worktime( - shiftedParentDate, child._parent_offset, "day", false - ) - child.start_date; - child.start_date.add(childStartDiff, 'milliseconds'); - var childEndDiff = gantt._working_time_helper.add_worktime(child.start_date, child.duration, 'day', true) - child.end_date; - child.end_date.add(childEndDiff, 'milliseconds'); - gantt.ascStop(child, child.start_date, child.end_date); - child._changed = gantt.config.drag_mode.move; - gantt.refreshTask(child.id); - gantt.moveDesc(child, childStartDiff); - } - }; - gantt.moveMilestoneChildren = function (milestone) { - var branch = gantt._branches[milestone.id]; - if (!branch || branch.length === 0) return 0; - // ysy.log.debug("Shift children of \"" + milestone.text + "\" by " + shift + " seconds", "parent"); - // ysy.log.debug("moveChildren(): of \"" + milestone.text + "\" by " + shift + " seconds", "task_drag"); - for (var i = 0; i < branch.length; i++) { - var childId = branch[i]; - var child = gantt.getTask(childId); - if (child.end_date.isAfter(milestone.end_date)) { - var shift = milestone.end_date.diff(child.end_date, "seconds"); - child.start_date.add(shift, 'seconds'); - child.end_date.add(shift, 'seconds'); - child._changed = gantt.config.drag_mode.move; - gantt.refreshTask(child.id); - gantt.moveDesc(child, shift); - } - } - return 0; - }; - gantt.milestoneStop = function (task, diff) { - var issue = task.widget && task.widget.model; - if (!issue) return 0; - var milestone = ysy.data.milestones.getByID(issue.fixed_version_id); - if (!milestone) return 0; - var ganttMilestone = gantt._pull[milestone.getID()]; - if (ganttMilestone) { - var milDiff = ganttMilestone.end_date.diff(task.end_date, "seconds"); - } else { - milDiff = milestone.start_date.diff(task.end_date, "seconds"); - } - milDiff -= diff; - if (milDiff < 0) { - ysy.log.debug("milestoneStop() for " + task.text + " milDiff=" + (milDiff / 86400) + - " diff=" + (diff / 86400) + " at " + milestone.start_date.format("YYYY-MM-DD"), "task_drag_milestone"); - return -milDiff; - } - return 0; - }; - gantt.milestoneDescStop = function (task, diff) { - ysy.log.debug("milestoneDescStop(): task " + task.text + " moving by " + (diff / 86400), "task_drag_milestone"); - var backDiff = gantt.milestoneStop(task, diff); - var start_date = +task.start_date / 1000 + diff; - var end_date = +task.end_date / 1000 + diff; - for (var i = 0; i < task.$source.length; i++) { - var lid = task.$source[i]; - var link = gantt._lpull[lid]; - if (link.isSimple) continue; - var desc = gantt._pull[link.target]; - var descDiff = gantt.getFreeDelay(link, desc, start_date, end_date); - if (descDiff <= 0) continue; - backDiff = Math.max(backDiff, gantt.milestoneDescStop(desc, descDiff)); - } - return backDiff; - }; - gantt.milestoneMoveBy = function (task, diff) { - ysy.log.debug("milestoneMoveBy(): task " + task.text + " moving by " + (diff / 86400), "task_drag"); - var issue = task.widget && task.widget.model; - if (!issue) return; - var milestone = ysy.data.milestones.getByID(issue.fixed_version_id); - if (!milestone) return; - var ganttMilestone = gantt._pull[milestone.getID()]; - var taskDate; - if (diff === 0) { - taskDate = task.end_date; - } else { - taskDate = moment(task.end_date).add(diff, "seconds"); - } - if (ganttMilestone) { - if (ganttMilestone.end_date.isBefore(taskDate)) { - var moveDiff = taskDate.diff(ganttMilestone.end_date); - ganttMilestone.end_date.add(moveDiff, "milliseconds"); - ganttMilestone.start_date.add(moveDiff, "milliseconds"); - ganttMilestone._changed = gantt.config.drag_mode.move; - gantt.refreshTask(ganttMilestone.id); - } - } - - }; - gantt.getLinkSourceDate = function (source, type) { - if (type === "precedes") return source.end_date; - if (type === "finish_to_finish") return source.end_date; - if (type === "start_to_start") return source.start_date; - if (type === "start_to_finish") return source.start_date; - return null; - }; - gantt.getLinkTargetDate = function (target, type) { - if (type === "precedes") return target.start_date; - if (type === "finish_to_finish") return target.end_date; - if (type === "start_to_start") return target.start_date; - if (type === "start_to_finish") return target.end_date; - return null; - }; - gantt.getLinkCorrection = function (type) { - if (type === "precedes") return 1; - if (type === "start_to_finish") return -1; - return 0; - }; - gantt.getFreeDelay = function (link, desc, ascStartDate, ascEndDate) { - if (!desc) desc = gantt._pull[link.target]; - var sourceDate; - var daysToSeconds = 60 * 60 * 24; - if (!ascStartDate) { - var asc = gantt._pull[link.source]; - ascStartDate = asc.start_date / 1000; - ascEndDate = asc.end_date / 1000; - } - if (link.type === "precedes" || link.type === "finish_to_finish") { - if (!ascEndDate) return 0; - sourceDate = ascEndDate; - } else if (link.type === "start_to_finish" || link.type === "start_to_start") { - if (!ascStartDate) return 0; - sourceDate = ascStartDate; - } else return 0; - var targetDate = gantt.getLinkTargetDate(desc, link.type); - var correction = gantt.getLinkCorrection(link.type); - var delay = (targetDate / 1000 - sourceDate) / daysToSeconds; - return (link.delay + correction - delay) * daysToSeconds; - - }; - gantt.updateAllTask = function (seed_task) { - ysy.history.openBrack(); - var toUpdate = {}; - // sort + reverse in order to process milestones before tasks - var pullIds = Object.getOwnPropertyNames(gantt._pull).sort().reverse(); - var allRequests = {}; - if (ysy.settings.fixedRelations) { - for (var i = 0; i < pullIds.length; i++) { - var task = gantt._pull[pullIds[i]]; - if (task._changed) { - //gantt._tasks_dnd._fix_dnd_scale_time(task,{mode:task._changed}); - gantt._tasks_dnd._fix_working_times(task, {mode: task._changed}); - gantt._update_parents(task.id, false); - delete task._parent_offset; - var parentId = gantt.getParent(task.id); - while (parentId) { - var parent = gantt._pull[parentId]; - if (!parent) break; - toUpdate[parentId] = parent; - parentId = gantt.getParent(parentId); - } - - toUpdate[task.id] = task; - // var issue = task.widget.model; - // if (issue.getMoveRequest) { - // var request = issue.getMoveRequest(allRequests); - // request.setPosition(task.start_date, task.end_date, true); - // } - task._changed = false; - } - } - } else { - for (i = 0; i < pullIds.length; i++) { - task = gantt._pull[pullIds[i]]; - if (task._changed) { - //gantt._tasks_dnd._fix_dnd_scale_time(task,{mode:task._changed}); - gantt._tasks_dnd._fix_working_times(task, {mode: task._changed}); - gantt._update_parents(task.id, false); - delete task._parent_offset; - toUpdate[task.id] = task; - var issue = task.widget.model; - if (issue.getMoveRequest) { - var request = issue.getMoveRequest(allRequests); - request.setPosition(task.start_date, task.end_date, true); - } - task._changed = false; - ysy.log.debug("UpdateAllTask update " + task.text, "task_drag"); - } - } - } - for (var id in allRequests) { - if (!allRequests.hasOwnProperty(id)) continue; - request = allRequests[id]; - request.entity.correctPosition(allRequests); - } - for (id in allRequests) { - if (!allRequests.hasOwnProperty(id)) continue; - request = allRequests[id]; - task = toUpdate[id]; - if (task) { - $.extend(task, {start_date: request.softStart, end_date: request.softEnd}); - } else { - if (!request.entity.set({start_date: request.softStart, end_date: request.softEnd})) { - request.entity._fireChanges({_name: "UpdateAll"}, "updateAll"); - } - } - } - for (id in toUpdate) { - if (!toUpdate.hasOwnProperty(id)) continue; - task = toUpdate[id]; - ysy.log.debug("UpdateAllTask update " + task.text, "task_drag"); - task.widget.update(task); - // for (var j = 0; j < task.$target.length; j++) { - // var link = gantt._lpull[task.$target[j]]; - // if (!link) continue; - // if (!link.unlocked) continue; - // var source = gantt._pull[link.source]; - // if (!source) continue; - // var targetDate = gantt.getLinkTargetDate(task, link.type); - // var sourceDate = gantt.getLinkSourceDate(source, link.type); - // var correction = gantt.getLinkCorrection(link.type); - // var delay = targetDate.diff(sourceDate, "days") - correction; - // // ysy.log.debug("Link from "+source.id+" to "+task.id+" delay="+delay ); - // var relation = link.widget.model; - // if (!relation) continue; - // relation.set("delay", delay); - // } - } - ysy.history.closeBrack(); - }; - gantt.applyMoveRequests = function (allRequests) { - for (var id in allRequests) { - if (!allRequests.hasOwnProperty(id)) continue; - var request = allRequests[id]; - if (!request.entity.set({start_date: request.softStart, end_date: request.softEnd})) { - request.entity._fireChanges({_name: "applyMoveRequests"}, "applyMoveRequests"); - } - } - }; - gantt.checkLoopedLink = function (target, bannedId) { - var relations = ysy.data.relations.getArray(); - for (var i = 0; i < relations.length; i++) { - if (relations[i].source_id !== target.id) continue; - var relation = relations[i]; - if (relation.target_id == bannedId) return false; - var nextTarget = relation.getTarget(); - if (!gantt.checkLoopedLink(nextTarget, bannedId)) return false; - } - return true; - }; - //############################################################################### - gantt.render_delay_element = function (link, pos) { - if (link.widget && link.widget.model.isSimple) return null; - //if(link.delay===0){return null;} - var sourceDate = gantt.getLinkSourceDate(gantt._pull[link.source], link.type); - var targetDate = gantt.getLinkTargetDate(gantt._pull[link.target], link.type); - if (ysy.settings.workDayDelays) { - var actualDelay = gantt._working_time_helper.get_work_units_between(sourceDate, targetDate, "day"); - actualDelay = Math.round(actualDelay); - } else { - actualDelay = targetDate.diff(sourceDate, "hours") / 24; - actualDelay = Math.round(actualDelay) - gantt.getLinkCorrection(link.type); - } - var text = (link.delay ? link.delay : '') + (actualDelay !== link.delay ? ' (' + actualDelay + ')' : ''); - return $('<div>') - .css({position: "absolute", left: pos.x, top: pos.y}) - // .html(link.delay+" ("+actualDelay + ")")[0]; - .html(text)[0]; - }; - //############################################################################## - /* - * Přepsané funkce z dhtmlxganttu, kvůli efektivnějšímu napojení či kvůli odstranění bugů - */ - //########################################################################################## - gantt.allowedParent = function (child, parent) { - if (child === parent) return false; - var type = child.type; - if (!type) { - type = "task"; - } - var allowed = gantt.config["allowedParent_" + type]; - if (!allowed) return false; - if (parent.real_id > 1000000000000) return false; - var parentType = parent.type || "task"; - return allowed.indexOf(parentType) >= 0; - }; - gantt.getShowDate = function () { - var pos = gantt._restore_scroll_state(); - if (!pos) return null; - return this.dateFromPos(pos.x + this.config.task_scroll_offset); - }; - gantt.silentMoveTask = function (task, parentId) { - ysy.log.debug("silentMoveTask", "move_task"); - var id = task.id; - var sourceId = this.getParent(id); - if (sourceId == parentId) return; - - this._replace_branch_child(sourceId, id); - var tbranch = this.getChildren(parentId); - tbranch.push(id); - - this.setParent(task, parentId); - this._branches[parentId] = tbranch; - - var childTree = this._getTaskTree(id); - for (var i = 0; i < childTree.length; i++) { - var item = this._pull[childTree[i]]; - if (item) - item.$level = this.calculateTaskLevel(item); - } - task.$level = gantt.calculateTaskLevel(task); - this.refreshData(); - - }; - gantt.getCachedScroll = function () { - if (!gantt._cached_scroll_pos) return {x: 0, y: 0}; - return {x: gantt._cached_scroll_pos.x || 0, y: gantt._cached_scroll_pos.y || 0}; - }; - gantt.reconstructTree = function () { - var tasks = gantt._pull; - var ids = Object.getOwnPropertyNames(tasks); - for (var i = 0; i < ids.length; i++) { - var task = tasks[ids[i]]; - if (task.realParent === undefined) continue; - gantt.silentMoveTask(task, task.realParent); - delete task.realParent; - } - } -}; diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/dhtml_modif.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/dhtml_modif.js deleted file mode 100644 index 35dde3d617e70e10ba566d6e00b34f81b07af647..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/dhtml_modif.js +++ /dev/null @@ -1,694 +0,0 @@ -/* dhtml_modif.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.view = ysy.view || {}; -ysy.view.initGantt = function () { - var toMomentFormat = function (rubyFormat) { - switch (rubyFormat) { - case '%Y-%m-%d': - return 'YYYY-MM-DD'; - case '%Y/%m/%d': - return 'YYYY/MM/DD'; - case '%d/%m/%Y': - return 'DD/MM/YYYY'; - case '%d.%m.%Y': - return 'DD.MM.YYYY'; - case '%d-%m-%Y': - return 'DD-MM-YYYY'; - case '%m/%d/%Y': - return 'MM/DD/YYYY'; - case '%d %b %Y': - return 'DD MMM YYYY'; - case '%d %B %Y': - return 'DD MMMM YYYY'; - case '%b %d, %Y': - return 'MMM DD, YYYY'; - case '%B %d, %Y': - return 'MMMM DD, YYYY'; - default: - return 'D. M. YYYY'; - } - }; - - function getERUISassValue(varName, defaultValue) { - if (window.ERUI && ERUI.sassData !== undefined && ERUI.sassData[varName] !== undefined) { - return parseInt(ERUI.sassData[varName]); - } - return defaultValue; - } - - $.extend(gantt.config, { - //xml_date: "%Y-%m-%d", - //scale_unit: "week", - //date_scale: "Week #%W", - //autosize:"y", - details_on_dblclick: false, - readonly_project: true, - //autofit:true, - drag_empty: true, - work_time: true, - //min_duration:24*60*60*1000, // 1*24*60*60*1000s = 1 day - correct_work_time: true, - //date_grid: "%j %M %Y", - date_format: toMomentFormat(ysy.settings.dateFormat), - date_grid: "%j.%n.%Y", - links: { - finish_to_start: "precedes", - start_to_start: "start_to_start", - start_to_finish: "start_to_finish", - finish_to_finish: "finish_to_finish" - }, - step: 1, - duration_unit: "day", - fit_tasks: true, - row_height: getERUISassValue('gantt-row-height', 25), - task_height: getERUISassValue('gantt-task-height', 20), - min_column_width: 36, - autosize: "y", - link_line_width: 0, - scale_height: 60, - start_on_monday: true, - order_branch: true, - rearrange_branch: true, - grid_resize: true, - grid_width: ysy.data.limits.columnsWidth.grid_width, - task_scroll_offset: 250, - controls_task: {progress: true, resize: true, links: true}, - controls_milestone: {}, - start_date: ysy.data.limits.start_date, - end_date: ysy.data.limits.end_date, - controls_project: {show_progress: true, resize: false}, - allowedParent_task: ["project", "milestone", "empty"], - allowedParent_task_global: ["project", "milestone"], - allowedParent_milestone: ["project"], - allowedParent_project: ["empty"] - }); - gantt.config.columns = ysy.view.leftGrid.constructColumns(ysy.data.columns); - ysy.proManager.fireEvent("ganttConfig", gantt.config); - gantt._pull["empty"] = { - type: "empty", - id: "empty", - $target: [], - $source: [], - columns: {}, - text: "", - start_date: moment() - }; -}; -ysy.view.applyGanttPatch = function () { - ysy.view.leftGrid.patch(); - gantt.locale.date = ysy.settings.labels.date; - $.extend(gantt.templates, { - task_cell_class: function (item, date) { - if (gantt.config.scale_unit === "day") { - //var css=""; - if (moment(date).date() === 1) { - return true; - // css+=" first-date"; - } - //return css; - } - return false; - }, - scale_cell_class: function (date) { - if (gantt.config.scale_unit === "day") { - var css = ""; - if (!gantt._working_time_helper.is_working_day(date)) { - css += " weekend"; - } - //if(date.getDate()===1){ - if (moment(date).date() === 1) { - css += " first-date"; - } - return css; - } - }, - task_text: function (start, end, task) { - return ""; - }, - task_class: function (start, end, task) { - var css = ""; - if (task.css) { - css = task.css; - } - css += " " + (task.type || "task") + "-type"; - if (task.widget && task.widget.model) { - var problems = task.widget.model.getProblems(); - if (problems) { - css += " wrong"; - } - } - return css; - }, - grid_row_class: function (start, end, task) { - var ret = ""; - if (task.css) { - ret = task.css; - } - if (task.widget && task.widget.model) { - var problems = task.widget.model.getProblems(); - if (problems) { - ret += " wrong"; - } - } - ret += " " + (task.type || "task") + "-type"; - return ret;//+'" data-url="/issues/'+task.id+' data-none="'; - //return task.css+" "+task.type+"-type"; - }, - /*grid_file: function (item) { - return ""; - //return "<div class='gantt_tree_icon gantt_file'></div>"; - },*/ - link_class: function (link) { - var css = "type-" + link.type; - if (link.widget) { - var relation = link.widget.model; - if (relation) { - if (!relation.checkDelay()) { - css += " wrong"; - } - if (relation.isSimple) { - css += " gantt-relation-simple"; - } - if (link.unlocked) { - css += " gantt-relation-unlocked"; - } - } - } - return css; - }, - drag_link: function (from, from_start, to, to_start) { - var labels = ysy.view.getLabel("links"); - if (!gantt._get_link_type(from_start, to_start)) { - var reason = "unsupported_link_type"; - } else if (from === to) { - reason = "loop_link"; - } else if (to && to.length > 12) { - reason = "link_target_new"; - } else if (to && gantt.getTask(to).readonly) { - reason = "link_target_readonly"; - } else { - reason = "other"; - } - var obj = { - errorReason: ysy.view.getLabel("errors2")[reason], - from: gantt.getTask(from).text - }; - if (to) { - obj.to = gantt.getTask(to).text; - var ganttLinkType = (from_start ? "start" : "finish") + "_to_" + (to_start ? "start" : "finish"); - obj.type = labels[gantt.config.links[ganttLinkType]]; - } - return Mustache.render(ysy.view.templates.linkDragModal, obj); - }, - scale_row_class: function (scale) { - return scale.className || ""; - } - }); - - gantt.attachEvent("onRowDragStart", function (id /*, elem*/) { - //$(".gantt_grid_data").addClass("dragging"); - var task = gantt.getTask(id); - $(".gantt_row").each(function () { - var target = gantt._pull[$(this).attr("task_id")]; - if (!target) return; - if (gantt.allowedParent(task, target)) { - $(this).addClass("gantt_drag_to_allowed"); - } - }); - return true; - }); - gantt.attachEvent("onRowDragEnd", function (id, elem) { - //$(".gantt_grid_data").removeClass("dragging"); - $(".gantt_drag_to_allowed").removeClass("gantt_drag_to_allowed"); - }); - - // Funkce pro vytvoření a posunování Today markeru - function initTodayMarker() { - var date_to_str = gantt.date.date_to_str(gantt.config.task_date); - var id = gantt.addMarker({start_date: new Date(), css: "today", title: date_to_str(new Date())}); - setInterval(function () { - var today = gantt.getMarker(id); - today.start_date = new Date(); - today.title = date_to_str(today.start_date); - gantt.updateMarker(id); - }, 1000 * 60 * 60); - } - - initTodayMarker(); - - //gantt.initProjectMarker=function initProjectMarker(start,end) { - // if(start&&start.isValid()){ - // var startMarker = gantt.addMarker({start_date: start.toDate(), css: "start", title: "Project start"}); - // } - // if(end&&end.isValid()){ - // var endMarker = gantt.addMarker({start_date: end.toDate(), css: "end", title: "Project due time"}); - // } - //}; - //initProjectMarker(); - -//################################################################################## - if (!ysy.settings.fixedRelations) { - gantt.attachEvent("onLinkClick", function (id, mouseEvent) { - if (!gantt.config.drag_links) return; - ysy.log.debug("LinkClick on " + id, "link_config"); - var link = gantt.getLink(id); - if (gantt._is_readonly(link)) return; - var source = gantt._pull[link.source]; - if (!source) return; - var target = gantt._pull[link.target]; - if (!target) return; - if (source.readonly && target.readonly) return; - - var linkConfigWidget = new ysy.view.LinkPopup().init(link.widget.model, link); - linkConfigWidget.$target = $("#ajax-modal");//$dialog; - linkConfigWidget.repaint(); - showModal("ajax-modal", "auto"); - return false; - }); - } - gantt.attachEvent("onAfterLinkDelete", function (id, elem) { - if (elem.deleted) return; - if (!elem.widget.model._deleted) { - elem.widget.model.remove(); - } - }); - gantt.attachEvent("onBeforeLinkAdd", function (id, link) { - if (link.widget) return true; - var relations = ysy.data.relations; - var data; - data = { - id: id, - source_id: parseInt(link.source), - target_id: parseInt(link.target), - delay: 0, - unlocked: true, - permissions: { - editable: true - }, - type: link.type - }; - var relArray = relations.getArray(); - for (var i = 0; i < relArray.length; i++) { - var relation = relArray[i]; - if (relation.source_id === data.source_id && relation.target_id === data.target_id) { - dhtmlx.message(ysy.view.getLabel("errors2", "duplicate_link"), "error"); - return false; - } - } - var rel = new ysy.data.Relation(); - rel.init(data, relations); - //rel.delay=rel.getActDelay(); // created link have maximal delay - if (!gantt.checkLoopedLink(rel.getTarget(), rel.source_id)) { - dhtmlx.message(ysy.view.getLabel("errors2", "loop_link"), "error"); - return false; - } - - ysy.history.openBrack(); - relations.push(rel); - var allRequests = {}; - rel.sendMoveRequest(allRequests); - gantt.applyMoveRequests(allRequests); - ysy.history.closeBrack(); - return false; - }); - - ysy.view.taskTooltip.taskTooltipInit(); - - dhtmlx.message = function (msg, type, delay) { - if (!type) { - type = msg.type; - msg = msg.text; - delay = msg.delay; - } - window.showFlashMessage(type, msg, delay && delay > 0 ? delay : undefined); - //if (type !== "notice") { - // var flashElement = $("#content").children(".flash")[0]; - // var adjust = -10; - // if (ysy.settings.easyRedmine) { - // $(document).scrollTop(flashElement.offsetTop + adjust + "px"); - // //window.scrollTo(".flash",adjust); - // } else { - // window.scrollTo(0, flashElement.offsetTop + adjust); - // } - //} - }; - - if (!window.showFlashMessage) { - window.showFlashMessage = function (type, message) { - var $content = $("#content"); - $content.find(".flash").remove(); - var template = '<div class="flash {{type}}"><a href="javascript:void(0)" class="close-icon close_button" style="float:right"></a><span>{{{message}}}</span></div>'; - var closeFunction = function (event) { - $(this) - .closest('.flash') - .fadeOut(500, function () { - $(this).remove(); - }) - }; - var rendered = Mustache.render(template, {message: message, type: type}); - $content.prepend($(rendered)); - $content.find(".close_button").click(closeFunction); - } - } - if (!dhtmlx.dragScroll) { - dhtmlx.dragScroll = function () { - var $background = $(".gantt_task_bg"); - if (!$background.hasClass("inited")) { - $background.addClass("inited"); - var dnd = new dhtmlxDnD($background[0], {}); - var lastScroll = null; - dnd.attachEvent("onDragStart", function () { - lastScroll = gantt.getCachedScroll(); - }); - dnd.attachEvent("onDragMove", function () { - var diff = dnd.getDiff(); - gantt.scrollTo(lastScroll.x - diff.x, undefined); - }); - } - }; - } - gantt.attachEvent("onTaskOpened", function (id) { - ysy.data.limits.openings[id] = true; - var task = gantt._pull[id]; - if (!task || !task.widget) return true; - var entity = task.widget.model; - if (entity.needLoad) { - entity.needLoad = false; - ysy.data.loader.loadSubEntity(task.type, entity.id); - } - }); - gantt.attachEvent("onTaskClosed", function (id) { - ysy.data.limits.openings[id] = false; - }); - gantt.attachEvent("onTaskSelected", function (id) { - var data = gantt._get_tasks_data(); - gantt._backgroundRenderer.render_items(data); - }); - gantt.attachEvent("onTaskUnselected", function (id, ignore) { - if (ignore) return; - var data = gantt._get_tasks_data(); - gantt._backgroundRenderer.render_items(data); - }); - gantt.attachEvent("onLinkValidation", function (link) { - if (link.source.length > 12) return false; - if (link.target.length > 12) return false; - var source = gantt.getTask(link.source); - var target = gantt.getTask(link.target); - if (source.readonly && target.readonly) return false; - var parentId = source.id; - while (parentId !== 0) { - var parent = gantt.getTask(parentId); - if (parent === target) return false; - parentId = parent.parent; - } - parentId = target.id; - while (parentId !== 0) { - parent = gantt.getTask(parentId); - if (parent === source) return false; - parentId = parent.parent; - } - return true; - }); - gantt.attachEvent("onAfterTaskMove", function (sid, parent, tindex) { - this.open(parent); - return true; - }); - gantt._filter_task = function (id, task) { - // commented out because pushing task out of bounds removed the task and its project - //var min = null, max = null; - //if(this.config.start_date && this.config.end_date){ - // min = this.config.start_date.valueOf(); - // max = this.config.end_date.valueOf(); - // - // if(+task.start_date > max || +task.end_date < +min) - // return false; - //} - return ysy.proManager.eventFilterTask(id, task); - }; - //var oldPosFromDate = gantt.posFromDate; - //gantt.posFromDate = function(date){ - // ysy.log.debug("old: "+oldPosFromDate.call(gantt,date)+" new: "+gantt.posFromDate2(date)); - // return gantt.posFromDate2(date); - //}; - gantt.posFromDate = function (date) { - var scale = this._tasks; - if (typeof date === "string") { - date = moment(date); - } - - var tdate = date.valueOf(); - var units = { - day: 86400000, // 24 * 60 * 60 * 1000 - week: 604800000, // 7 * 24 * 60 * 60 * 1000 - //month: 2592000000 // 30 * 24 * 60 * 60 * 1000 - month: 2629800000 // 30.4375 * 24 * 60 * 60 * 1000 - }; - if (date._isEndDate) { - tdate += units.day; - } - - if (tdate <= this._min_date) - return 0; - - if (tdate >= this._max_date) - return scale.full_width; - - var unitRatio = (tdate - scale.trace_x[0]) / units[scale.unit]; - var index = Math.floor(unitRatio); - index = Math.min(scale.count - 1, Math.max(0, index)); - if (scale.count === index + 1) { - return scale.left[index] - + scale.width[index] - * (tdate - scale.trace_x[index]) - / (gantt._max_date - scale.trace_x[index]); - } - if (tdate > scale.trace_x[index + 1]) { - index++; - if (scale.count === index + 1) { - return scale.left[index] - + scale.width[index] - * (tdate - scale.trace_x[index]) - / (gantt._max_date - scale.trace_x[index]); - } - } else { - while (index !== 0 && tdate < scale.trace_x[index]) index--; - } - var restRatio = (tdate - scale.trace_x[index]) / (scale.trace_x[index + 1] - scale.trace_x[index]); - return scale.left[index] + scale.width[index] * restRatio; - }; - gantt.dateFromPos2 = function (x) { - // TODO tasks ends - var scale = this._tasks; - if (x < 0 || x > scale.full_width || !scale.full_width) { - scale.needRescale = true; - ysy.log.debug("needRescale", "outer"); - } - if (!scale.trace_x.length) { - return 0; - } - // var units = { - // day: 86400000, // 24 * 60 * 60 * 1000 - // week: 604800000, // 7 * 24 * 60 * 60 * 1000 - // //month: 2592000000 // 30 * 24 * 60 * 60 * 1000 - // month: 2629800000 // 30.4375 * 24 * 60 * 60 * 1000 - // }; - var unitRatio = x / (scale.full_width / scale.count); - var index = Math.floor(unitRatio); - index = Math.min(scale.count - 1, Math.max(0, index)); - if (index === scale.count - 1) { - return gantt.date.Date( - scale.trace_x[index].valueOf() - + (gantt._max_date - scale.trace_x[index]) - * (x - scale.left[index]) - / scale.width[index]); - } - if (x > scale.left[index + 1]) { - index++; - if (index === scale.count - 1) { - return gantt.date.Date( - scale.trace_x[index].valueOf() - + (gantt._max_date - scale.trace_x[index]) - * (x - scale.left[index]) - / scale.width[index]); - } - } - return gantt.date.Date( - scale.trace_x[index].valueOf() - + (scale.trace_x[index + 1] - scale.trace_x[index]) - * (x - scale.left[index]) - / scale.width[index]); - }; - ysy.view.bars.registerRenderer("task", function (task, next) { - var $div = $(next().call(this, task, next)); - if (this.hasChild(task.id) || $div.hasClass("parent")) { - $div.addClass("gantt_parent_task-subtype"); - var $ticks = $("<div class='gantt_task_ticks'></div>"); - var width = $div.width(); - if (width < 20) { - $ticks.css({borderLeftWidth: width / 2, borderRightWidth: width / 2}); - } - $div.append($ticks); - - - } - if (task.latest_due) { - var stop_x = this.posFromDate(task.widget.model.latest_due); - var issue_x = this.posFromDate(task.start_date); - var pos_x = stop_x - issue_x; - var $preStop = $(ysy.view.templates.endBlocker.replace("{{pos_x}}", pos_x.toString())); - $div.prepend($preStop); - } - if (task.soonest_start) { - var stop_x = this.posFromDate(task.widget.model.soonest_start); - var issue_x = this.posFromDate(task.start_date); - var pos_x = stop_x - issue_x; - var $preStop = $(ysy.view.templates.preBlocker.replace("{{pos_x}}", pos_x.toString())); - $div.prepend($preStop); - } - return $div[0]; - }); - // var progressRenderer = gantt._render_task_progress; - // gantt._render_task_progress = function (task, element, maxWidth) { - // var width = progressRenderer.call(this, task, element, maxWidth); - // if (task.type !== "project") return width; - // var pos = gantt.posFromDate(task.start_date); - // var todayPos = gantt.posFromDate(moment()); - // if (task.progress < 1 && pos + width < todayPos) { - // element.className += " gantt-project-overdue"; - // } - // return width; - // }; - gantt._default_task_date = function (item, parent_id) { - return moment(); - }; - gantt.attachEvent("onScrollTo", function (x, y) { - var renderer = gantt._backgroundRenderer; - var needRender = renderer.isScrolledOut(x, y); - if (needRender) { - //ysy.log.debug("render_one_canvas on [" + x + "," + y + "]", "scrollRender"); - renderer.render_items(); - } - }); - var ganttOffsetTop; - $(document).add("#content").on("scroll", function (e) { - if (!ganttOffsetTop) { - if (!gantt.$task) return; - ganttOffsetTop = $(gantt.$task).offset().top; - } - var scroll = $(this).scrollTop(); - gantt.scrollTo(undefined, scroll - ganttOffsetTop); - }); - gantt.showTask = function (id) { - var el = this.getTaskNode(id); - if (!el) return; - var left = Math.max(el.offsetLeft - this.config.task_scroll_offset, 0); - var top = $(el).offset().top - 200; - $(window).scrollTop(top); - this.scrollTo(left, top); - }; - gantt.getScrollState = function () { - if (!this.$task || !this.$task_data) return null; - return {x: this.$task.scrollLeft, y: $(window).scrollTop()}; - }; - gantt._path_builder.get_endpoint = function (link) { - var types = gantt.config.links; - var from_start = false, to_start = false; - - if (link.type == types.start_to_start) { - from_start = to_start = true; - } else if (link.type == types.finish_to_finish) { - from_start = to_start = false; - } else if (link.type == types.finish_to_start) { - from_start = false; - to_start = true; - } else if (link.type == types.start_to_finish) { - from_start = true; - to_start = false; - } else { - dhtmlx.assert(false, "Invalid link type"); - } - var source = gantt._pull[link.source]; - var target = gantt._pull[link.target]; - var sourceShift = 0, targetShift = 0; - var fromMount = from_start ? source.$startMount : source.$endMount; - var toMount = to_start ? target.$startMount : target.$endMount; - if (fromMount.length > 1) { - for (var i = 0; i < fromMount.length; i++) { - if (link.id == fromMount[i]) break; - } - sourceShift = (i * 2) / (fromMount.length - 1) * 6 - 6; - } - if (toMount.length > 1) { - for (i = 0; i < toMount.length; i++) { - if (link.id == toMount[i]) break; - } - targetShift = (i * 2) / (toMount.length - 1) * 6 - 6; - } - var from = gantt._get_task_visible_pos(gantt._pull[link.source], from_start); - var to = gantt._get_task_visible_pos(gantt._pull[link.target], to_start); - - return { - x: from.x, - e_x: to.x, - y: from.y + sourceShift, - e_y: to.y + targetShift - }; - }; - gantt._sync_links = function () { - for (var id in this._pull) { - if (!this._pull.hasOwnProperty(id)) continue; - var task = this._pull[id]; - task.$source = []; - task.$target = []; - task.$startMount = []; - task.$endMount = []; - } - for (id in this._lpull) { - if (!this._lpull.hasOwnProperty(id)) continue; - var link = this._lpull[id]; - var types = gantt.config.links; - if (this._pull[link.source]) { - this._pull[link.source].$source.push(id); - if (link.type == types.start_to_start || link.type == types.start_to_finish) { - this._pull[link.source].$startMount.push(id); - } else { - this._pull[link.source].$endMount.push(id); - } - } - if (this._pull[link.target]) { - this._pull[link.target].$target.push(id); - if (link.type == types.start_to_start || link.type == types.finish_to_start) { - this._pull[link.target].$startMount.push(id); - } else { - this._pull[link.target].$endMount.push(id); - } - } - } - }; - gantt._has_children = function (id) { - var item = gantt._pull[id]; - if (item.widget && item.widget.model && item.widget.model.needLoad) { - return true; - } - return this.getChildren(id).length > 0; - }; - gantt.setParent = function (task, new_pid) { - if (ysy.settings.parentIssueDates) { - var parentTask = this._pull[new_pid]; - if (parentTask && gantt._get_safe_type(parentTask.type) === "task") { - parentTask.$no_start = true; - parentTask.$no_end = true; - } - } - task.parent = new_pid; - }; - gantt.attachEvent("onAfterTaskMove", function (taskId) { - var task = gantt._pull[taskId]; - if (!task) return; - task._parentChanged = true; - }); - $("#main").on("resize", function () { - gantt.render(); - }); -}; diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/dhtml_relations.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/dhtml_relations.js deleted file mode 100644 index 8e5e5e83544cd4f4f6bedf7ece4a7e8903b524f1..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/dhtml_relations.js +++ /dev/null @@ -1,623 +0,0 @@ -/* dhtml_relations.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.pro = ysy.pro || {}; -ysy.pro.relations = { - patch: function () { - if (ysy.settings.fixedRelations) { - ysy.pro.relations = null; - return; - } - var patch = function () { - gantt.multiStop = function (task, start_date, end_date, previous) { - var diff; - var sumMove = 0; - if (!previous) { - previous = { - visitedLinks: [], - visitedParents: [], - alreadyMoved: [] - }; - // ysy.log.debug("previous created"); - } - if (task.soonest_start && start_date && start_date.isBefore(task.soonest_start)) { - diff = task.soonest_start.diff(start_date, "seconds"); - start_date.add(diff, "seconds"); - if (end_date) end_date.add(diff, "seconds"); - sumMove += diff; - ysy.log.debug("AscStop(): soonest_start task=" + task.text + " diff=" + diff, "asc"); - } - if (task.latest_due && end_date && end_date.isAfter(task.latest_due)) { - diff = task.latest_due.diff(end_date, "seconds"); - end_date.add(diff, "seconds"); - if (start_date) start_date.add(diff, "seconds"); - sumMove += diff; - ysy.log.debug("AscStop(): latest_end task=" + task.text + " diff=" + diff, "asc"); - } - if (end_date) { - if (ysy.settings.milestonePush) { - var newStartDate = gantt.descStartByMilestone(task, +start_date, +end_date); - if (newStartDate) { - ysy.log.debug("AscStop(): milePush task=" + task.text + " start_date=" + newStartDate.format("YYYY-MM-DD"), "asc"); - var newEndDate = gantt._working_time_helper.add_worktime(newStartDate, task.duration, "day", true); - var mileDiff = (newEndDate - end_date) / 1000; - end_date.add(mileDiff, "seconds"); - if (start_date) { - mileDiff = (newStartDate - start_date) / 1000; - start_date.add(mileDiff, "seconds"); - } - ysy.log.debug("task=" + task.text + " mileDiff=" + (mileDiff / 86400), "task_drag_milestone"); - sumMove += mileDiff; - } - } - } - // #################### - sumMove += gantt.ascStop(task, start_date, end_date, previous); - var parentId = gantt.getParent(task.id); - var parent = gantt._pull[parentId]; - if (parent && gantt._get_safe_type(parent.type) === "task") { - // if(parent.start_date.isAfter(start_date) || parent.end_date.isAfter(end_date)){ - var branch = gantt._branches[parent.id]; - if (branch && branch.length > 0) { - var minDate = start_date; - var maxDate = end_date; - for (var i = 0; i < branch.length; i++) { - var childId = branch[i]; - var child = gantt.getTask(childId); - if (child.id === task.id) continue; - - if (!minDate || minDate.isAfter(child.start_date)) { - minDate = child.start_date; - } - if (!maxDate || maxDate.isBefore(child.end_date)) { - maxDate = child.end_date; - } - } - } - var parentSumMove = gantt.multiStop(parent, moment(minDate), moment(maxDate)); - if (start_date) { - start_date.add(parentSumMove, "seconds"); - if (end_date) { - var new_end = gantt._working_time_helper.add_worktime(start_date, task.duration, "day", true); //< HOSEKP - end_date.add(new_end - end_date, "milliseconds"); - } - } else { - end_date.add(parentSumMove, "seconds"); - } - if (parentSumMove > sumMove) { - ysy.log.debug("AscStop(): parent task=" + task.text + " diff=" + parentSumMove, "asc"); - sumMove = parentSumMove; - } - // } - } - return sumMove; - }; - gantt.ascStop = function (task, start_date, end_date, previous) { - var shortestDiff; - var diff, sumMove = 0; - for (var i = 0; i < task.$target.length; i++) { - var lid = task.$target[i]; - if (previous.visitedLinks.indexOf(lid) > -1) continue; // skip link sourcing moved parent - var link = gantt._lpull[lid]; - if (link.isSimple) continue; - var targetDate; - if (link.type === "precedes" || link.type === "start_to_start") { - if (!start_date) continue; - targetDate = start_date; - } else if (link.type === "finish_to_finish" || link.type === "start_to_finish") { - if (!end_date) continue; - targetDate = end_date; - } else continue; - var source = gantt._pull[link.source]; - var sourceDate = gantt.getLinkSourceDate(source, link.type); - diff = -targetDate.diff(sourceDate, "seconds") + gantt.getLinkCorrection(link.type) * 24 * 60 * 60; - if (!link.unlocked) { - diff += link.delay * 24 * 60 * 60; - if (diff <= 0) { - if (shortestDiff === undefined || shortestDiff < diff) { - shortestDiff = diff; - } - } - } - if (diff > 0) { - sumMove += diff; - ysy.log.debug("AscStop(): relDiff<0 task=" + task.text + " diff=" + diff, "asc"); - if (start_date) { - start_date.add(diff, "seconds"); - } - if (end_date) { - var new_end = gantt._working_time_helper.add_worktime(start_date, task.duration, "day", true); //< HOSEKP - end_date.add(new_end - end_date, "milliseconds"); - // end_date.add(diff, "seconds"); - } - shortestDiff = 0; - } - } - if (shortestDiff) { - sumMove += shortestDiff; - ysy.log.debug("AscStop(): shortest_diff task=" + task.text + " diff=" + shortestDiff, "asc"); - if (start_date) { - start_date.add(shortestDiff, "seconds"); - } - if (end_date) { - new_end = gantt._working_time_helper.add_worktime(start_date, task.duration, "day", true); //< HOSEKP - end_date.add(new_end - end_date, "milliseconds"); - // end_date.add(shortestDiff, "seconds"); - } - } - return sumMove; - }; - /** - * - * @param task - * @param {{[old_start]:{},[old_end]:{},[fromParent]:boolean,[fromChild]:boolean,[asc]:boolean}} options - * @param previous - * @return {number} - */ - gantt.moveDesc = function (task, options, previous/*, resizing*/) { - // runs after task dates are already modified. - if (!previous) { - previous = { - visitedLinks: [], - visitedParents: [], - alreadyMovedFrom: {}, - central: task, - parentsToRecalculate: [] - }; - previous.alreadyMovedFrom[task.id] = options.old_start; - // ysy.log.debug("previous created"); - } - if (!options.old_start) { - options.old_start = previous.alreadyMovedFrom[task.id]; - } - var shouldMove = gantt.shouldMoveChildren(task); - if (!options.fromChild && shouldMove.move) { - var children = gantt.moveChildren(task, $.extend({}, options, {fromParent: true}), previous); - } else if (shouldMove.milestoneMove) { - this.moveMilestoneChildren(task, {old_start: options.old_start}, previous); - } - if (shouldMove.adjust) { - if (!children) { - var branch = gantt._branches[task.id]; - if (branch && branch.length !== 0) { - children = []; - for (i = 0; i < branch.length; i++) { - children.push(gantt.getTask(branch[i])); - } - } - } - if (children && children.length) { - var dates = {start_date: null, end_date: null}; - for (i = 0; i < children.length; i++) { - var child = children[i]; - if (dates.start_date === null || dates.start_date.isAfter(child.start_date)) { - dates.start_date = child.start_date; - } - if (dates.end_date === null || dates.end_date.isBefore(child.end_date)) { - dates.end_date = child.end_date; - } - } - task.start_date.add(dates.start_date - task.start_date, "milliseconds"); - task.end_date.add(dates.end_date - task.end_date, "milliseconds"); - } - } - - var start_date = +task.start_date; - var end_date = +task.end_date; - if (!options.asc) { - /** DESCENDANTS */ - for (var i = 0; i < task.$source.length; i++) { - var lid = task.$source[i]; - var link = gantt._lpull[lid]; - if (previous.visitedLinks.indexOf(lid) > -1) continue; - previous.visitedLinks.push(lid); - if (link.isSimple) continue; - var desc = gantt._pull[link.target]; - // var isTargetingEnd = link.type === "finish_to_finish" || link.type === "start_to_finish"; - if (!link.unlocked) { - var descDates = this.getDescDates(link, start_date, end_date); - // var diff = gantt.getFreeDelay(link, desc, start_date, end_date); - if (descDates.end_date) { - debugger - } else { - gantt.safeMoveToStartDate(desc, descDates.start_date, previous); - } - //ysy.log.debug("pushing "+desc.text+" by freeDelay "+diff); - gantt.moveDesc(desc, {}, previous); - } else { - descDates = this.getDescDates(link, start_date, end_date); - // var descDiff = gantt.getFreeDelay(link, desc, start_date, end_date); - // if (descDiff <= 0) continue; - // console.log("OVER"); - if (descDates.start_date && descDates.start_date.isAfter(desc.start_date)) { - gantt.safeMoveToStartDate(desc, descDates.start_date, previous); - } - if (descDates.end_date && descDates.end_date.isAfter(desc.end_date)) { - debugger; - gantt.safeMoveToStartDate(desc, descDates.start_date, previous); - } - // ysy.log.debug("desc=" + desc.text +" diff="+diff+" descDiff="+descDiff); - gantt.moveDesc(desc, {}, previous); - } - } - } else { - /** ASCENDANTS */ - for (i = 0; i < task.$target.length; i++) { - lid = task.$target[i]; - link = gantt._lpull[lid]; - if (previous.visitedLinks.indexOf(lid) > -1) continue; - previous.visitedLinks.push(lid); - if (link.isSimple) continue; - var asc = gantt._pull[link.source]; - // var isTargetingEnd = link.type === "finish_to_finish" || link.type === "start_to_finish"; - if (!link.unlocked) { - var ascDates = this.getAscDates(link, start_date, end_date); - // var diff = gantt.getFreeDelay(link, desc, start_date, end_date); - if (ascDates.end_date) { - debugger - } else { - gantt.safeMoveToStartDate(asc, ascDates.start_date, previous); - } - //ysy.log.debug("pushing "+desc.text+" by freeDelay "+diff); - gantt.moveDesc(asc, {asc: true}, previous); - } else { - var ascDiff = gantt.getFreeDelay(link, task, asc.start_date, asc.end_date); - if (ascDiff <= 0) continue; - // ysy.log.debug("desc=" + desc.text +" diff="+diff+" descDiff="+descDiff); - gantt.moveDesc(asc, {asc: true}, previous); - } - } - } - if (!options.fromParent) { - gantt.moveParent(task, {}, previous); - } - }; - - gantt.moveChildren = function (task, options, previous) { - var branch = gantt._branches[task.id]; - if (!branch || branch.length === 0) return null; - var children = []; - for (var i = 0; i < branch.length; i++) { - var childId = branch[i]; - //if(gantt.isTaskVisible(childId)){continue;} - var child = gantt.getTask(childId); - if (!child._parent_offset) { - child._parent_offset = gantt._working_time_helper.get_work_units_between(options.old_start, child.start_date, "day"); - } - children.push(child); - if (previous.alreadyMovedFrom[childId]) continue; - var childOldStart = previous.alreadyMovedFrom[childId] || child.start_date; - var childNewStart = gantt._working_time_helper.add_worktime(task.start_date, child._parent_offset, "day", false); - gantt.safeMoveToStartDate(child, childNewStart, previous); - // child.start_date.add(childNewStart - child.start_date, "milliseconds"); - child._changed = gantt.config.drag_mode.move; - gantt.moveDesc(child, {old_start: childOldStart, fromParent: options.fromParent}, previous); - gantt.refreshTask(childId); - } - // gantt._update_parents(task.id); - return children; - }; - gantt.shouldMoveChildren = function (task) { - if (task.type === "milestone") return {milestoneMove: true}; - if (gantt._get_safe_type(task.type) === "task" && ysy.settings.parentIssueDates) return { - move: true, - adjust: true - }; - if (task.$open && gantt.isTaskVisible(task.id)) return {move: true}; - return false; - }; - gantt.safeMoveToStartDate = function (task, start_date, previous) { - if (task.start_date.isSame(start_date)) { - previous.alreadyMovedFrom[task.id] = moment(start_date); - return 0; - } - previous.alreadyMovedFrom[task.id] = moment(task.start_date); - if (task.start_date.isAfter(start_date)) { - // moved forward - var end_date = gantt._working_time_helper.add_worktime(start_date, task.duration, "day", true); - task.start_date.add(start_date - task.start_date, "milliseconds"); - task.end_date.add(end_date - task.end_date, "milliseconds"); - task._changed = gantt.config.drag_mode.move; - gantt.refreshTask(task.id); - return 0; - } else { - // moved backward - end_date = gantt._working_time_helper.add_worktime(start_date, task.duration, "day", true); - task.start_date.add(start_date - task.start_date, "milliseconds"); - task.end_date.add(end_date - task.end_date, "milliseconds"); - task._changed = gantt.config.drag_mode.move; - gantt.refreshTask(task.id); - var ascDiff = gantt.ascStop(task, task.start_date, task.end_date, previous); - if (ascDiff !== 0) { - // ysy.log.debug("diff=" + diff + " ascStopDiff=" + ascDiff); - return ascDiff; - } - } - }; - gantt.moveMilestoneChildren = function (milestone, options, previous) { - var branch = gantt._branches[milestone.id]; - if (!branch || branch.length === 0) return 0; - // ysy.log.debug("Shift children of \"" + milestone.text + "\" by " + shift + " seconds", "parent"); - ysy.log.debug("moveChildren(): of \"" + milestone.text + "\"(" + milestone.end_date.toISOString() + ") from " + options.old_start.toISOString(), "task_drag"); - // var milestoneEndDate=moment(milestone.end_date).add(shift,"seconds"); - // milestoneEndDate._isEndDate=true; - for (var i = 0; i < branch.length; i++) { - var childId = branch[i]; - var child = gantt.getTask(childId); - if (child.end_date.isAfter(milestone.end_date)) { - // var shift = milestone.end_date.diff(child.end_date, "seconds"); - // child.start_date.add(shift, 'seconds'); - var startDateValue = +child.start_date; - // child.end_date = moment(milestone.end_date); - // child.end_date._isEndDate = true; - child.end_date.add(milestone.end_date - child.end_date, "milliseconds"); - var childNewStart = gantt._working_time_helper.add_worktime(child.end_date, -child.duration, "day", false); - var childOldStart = moment(child.start_date); - child.start_date.add(childNewStart - child.start_date, "milliseconds"); - // ysy.log.debug(child.start_date.toISOString()+" "+child.end_date.toISOString()); - child._changed = gantt.config.drag_mode.move; - gantt.refreshTask(child.id); - previous.alreadyMovedFrom[child.id] = previous.alreadyMovedFrom[child.id] || childOldStart; - gantt.moveDesc(child, {old_date: moment(startDateValue), asc: true}, previous); - } - } - return 0; - }; - gantt.moveParent = function (child, option, previous) { - if (!ysy.settings.parentIssueDates) return; - var parentId = gantt.getParent(child.id); - if (previous.central.id === parentId) { - parent = previous.central; - } else { - var parent = gantt._pull[parentId]; - } - if (gantt._get_safe_type(parent.type) !== "task") return 0; - // previous.visitedParents.push(parent.id); - // if (parent.end_date.isBefore(child.end_date)) { - // parent.end_date.add(child.end_date - parent.end_date, "milliseconds"); - // parent._changed = gantt.config.drag_mode.move; - // gantt.refreshTask(parent.id); - // // if(option.skipParent) - // } - gantt.moveDesc(parent, {fromChild: true/*old_start:moment(parent.start_date)*/}, previous); - }; - gantt.startByMilestone = function (task, end_date) { - var issue = task.widget && task.widget.model; - if (!issue) return 0; - var milestone = ysy.data.milestones.getByID(issue.fixed_version_id); - if (!milestone) return 0; - var ganttMilestone = gantt._pull[milestone.getID()]; - if (ganttMilestone) { - var milestoneDate = ganttMilestone.end_date; - } else { - milestoneDate = milestone.start_date; - } - if (milestoneDate.isBefore(end_date)) { - ysy.log.debug("milestoneStop() for " + task.text + - " at " + milestone.start_date.format("YYYY-MM-DD"), "task_drag_milestone"); - return gantt._working_time_helper.toMoment( - gantt._working_time_helper.add_worktime(milestoneDate, -task.duration, "day", false) - ); - } - return null; - }; - gantt.descStartByMilestone = function (task, start_date, end_date) { - var newStartDate = gantt.startByMilestone(task, end_date); - // var start_date = +task.start_date / 1000 + diff; - // var end_date = +task.end_date / 1000 + diff; - for (var i = 0; i < task.$source.length; i++) { - var lid = task.$source[i]; - var link = gantt._lpull[lid]; - if (link.isSimple) continue; - var desc = gantt._pull[link.target]; - var descDiff = gantt.getFreeDelay(link, desc, start_date, end_date); - if (descDiff <= 0) continue; - var descEndDate = gantt._working_time_helper.add_worktime(desc.start_date + descDiff * 1000, desc.duration, "day", true); - var correctedDescStartDate = gantt.descStartByMilestone(desc, desc.start_date + descDiff * 1000, descEndDate); - if (!correctedDescStartDate) continue; - switch (link.type) { - case "precedes": - if (!link.unlocked) { - correctedDescStartDate.subtract(link.delay, "days"); - } - var correctedStartDate = gantt._working_time_helper.add_worktime(correctedDescStartDate, -task.duration, "day", false); - break; - default: - debugger; - } - if (!newStartDate || (correctedStartDate && correctedStartDate.isBefore(newStartDate))) { - newStartDate = correctedStartDate; - } - } - var childrenStartDate = gantt.childrenStartByMilestone(task, (newStartDate ? newStartDate : start_date) - task.start_date); - if (childrenStartDate) { - newStartDate = childrenStartDate; - } - if (newStartDate) { - ysy.log.debug("milestoneDescStop(): task " + task.text + " start set to " + newStartDate.format("YYYY-MM-DD"), "task_drag_milestone"); - } - return newStartDate; - }; - gantt.childrenStartByMilestone = function (task, diff) { - if (task.type === "milestone") return null; - var branch = gantt._branches[task.id]; - if (!branch || branch.length === 0) return 0; - var newStartDate; - for (var i = 0; i < branch.length; i++) { - var childId = branch[i]; - //if(gantt.isTaskVisible(childId)){continue;} - var child = gantt.getTask(childId); - var childEndDate = gantt._working_time_helper.add_worktime(child.start_date + diff, child.duration, "day", true); - var correctedStartDate = gantt.descStartByMilestone(child, child.start_date + diff, childEndDate); - if (!newStartDate || (correctedStartDate && correctedStartDate.isBefore(newStartDate))) { - newStartDate = correctedStartDate; - } - } - if (newStartDate) { - ysy.log.debug("milestoneChildrenStop(): \"" + task.text + "\" start_date set to " + newStartDate.format("YYYY-MM-DD"), "task_drag"); - } - return newStartDate; - }; - gantt.getLinkSourceDate = function (source, type) { - if (type === "precedes") return source.end_date; - if (type === "finish_to_finish") return source.end_date; - if (type === "start_to_start") return source.start_date; - if (type === "start_to_finish") return source.start_date; - return null; - }; - gantt.getLinkTargetDate = function (target, type) { - if (type === "precedes") return target.start_date; - if (type === "finish_to_finish") return target.end_date; - if (type === "start_to_start") return target.start_date; - if (type === "start_to_finish") return target.end_date; - return null; - }; - gantt.getLinkCorrection = function (type) { - if (type === "precedes") return 1; - if (type === "start_to_finish") return -1; - return 0; - }; - /** - * How much can be distance between two task shortened - * @param link - gantt link - * @param desc - gantt task - * @param {number} ascStartDate - number of milliseconds since epoch - * @param {number} ascEndDate - number of milliseconds since epoch - * @return {number} - number of seconds - */ - gantt.getFreeDelay = function (link, desc, ascStartDate, ascEndDate) { - if (!desc) desc = gantt._pull[link.target]; - var sourceDate; - var daysToSeconds = 60 * 60 * 24; - if (!ascStartDate) { - var asc = gantt._pull[link.source]; - ascStartDate = +asc.start_date; - ascEndDate = +asc.end_date; - } - if (link.type === "precedes" || link.type === "finish_to_finish") { - if (!ascEndDate) return 0; - sourceDate = ascEndDate; - } else if (link.type === "start_to_finish" || link.type === "start_to_start") { - if (!ascStartDate) return 0; - sourceDate = ascStartDate; - } else return 0; - var targetDate = +gantt.getLinkTargetDate(desc, link.type); - var correction = gantt.getLinkCorrection(link.type); - var delay = (targetDate - sourceDate) / daysToSeconds / 1000; - return ((link.unlocked ? 0 : link.delay) + correction - delay) * daysToSeconds; - }; - /** - * - * @param {{type:String,delay:int,source:int,target:int,unlocked:boolean}} link - * @param {int} ascStartDate - * @param {int} ascEndDate - * @return {{[start_date]:Object,[end_date]:Object}} - */ - gantt.getDescDates = function (link, ascStartDate, ascEndDate) { - //if (!desc) desc = gantt._pull[link.target]; - var sourceDate; - if (!ascStartDate) { - var asc = gantt._pull[link.source]; - ascStartDate = +asc.start_date; - ascEndDate = +asc.end_date; - } - if (link.type === "precedes" || link.type === "finish_to_finish") { - if (!ascEndDate) return {}; - sourceDate = ascEndDate; - } else if (link.type === "start_to_finish" || link.type === "start_to_start") { - if (!ascStartDate) return {}; - sourceDate = ascStartDate; - } else return {}; - var correction = gantt.getLinkCorrection(link.type); - if (link.type === "finish_to_finish" || link.type === "start_to_finish") { - var descEndDate = moment(sourceDate).add((link.unlocked ? 0 : link.delay) + correction, "days"); - descEndDate._isEndDate = true; - var descSafeEnd = gantt._working_time_helper.get_closest_worktime({ - dir: "future", - date: descEndDate - }); - return {end_date: descSafeEnd}; - } else { - var descStartDate = moment(sourceDate).add((link.unlocked ? 0 : link.delay) + correction, "days"); - var descSafeStart = gantt._working_time_helper.get_closest_worktime({ - dir: "future", - date: descStartDate - }); - return {start_date: descSafeStart}; - } - }; - /** - * - * @param {{type:String,delay:int,source:int,target:int,unlocked:boolean}} link - * @param {int} descStartDate - * @param {int} descEndDate - * @return {{[start_date]:moment,[end_date]:moment}} - */ - gantt.getAscDates = function (link, descStartDate, descEndDate) { - var targetDate; - if (!descStartDate) { - var desc = gantt._pull[link.target]; - descStartDate = +desc.start_date; - descEndDate = +desc.end_date; - } - if (link.type === "start_to_finish" || link.type === "finish_to_finish") { - if (!descEndDate) return {}; - targetDate = descEndDate; - } else if (link.type === "precedes" || link.type === "start_to_start") { - if (!descStartDate) return {}; - targetDate = descStartDate; - } else return {}; - var correction = gantt.getLinkCorrection(link.type); - if (link.type === "finish_to_finish" || link.type === "start_to_finish") { - var ascEndDate = moment(targetDate).subtract((link.unlocked ? 0 : link.delay) + correction, "days"); - ascEndDate._isEndDate = true; - var ascSafeEnd = gantt._working_time_helper.get_closest_worktime({ - dir: "past", - date: ascEndDate - }); - return {end_date: ascSafeEnd}; - } else { - var ascStartDate = moment(targetDate).subtract((link.unlocked ? 0 : link.delay) + correction, "days"); - var ascSafeStart = gantt._working_time_helper.get_closest_worktime({ - dir: "past", - date: ascStartDate - }); - return {start_date: ascSafeStart}; - } - }; - //################################################################################################################## - gantt.attachEvent("onLinkClick", function (id, mouseEvent) { - // if (!gantt.config.drag_links) return; - ysy.log.debug("LinkClick on " + id, "link_config"); - var link = gantt.getLink(id); - if (gantt._is_readonly(link)) return; - var source = gantt._pull[link.source]; - if (!source) return; - var target = gantt._pull[link.target]; - if (!target) return; - if (source.readonly && target.readonly) return; - var relation = link.widget.model; - var isUnlocked = relation.unlocked; - relation.set({unlocked: !isUnlocked, delay: isUnlocked ? relation.getActDelay() : 0}); - return false; - }); - gantt.attachEvent("onContextMenu", function (taskId, id /*, mouseEvent*/) { - if (taskId) return; - if (!gantt.config.drag_links) return; - ysy.log.debug("LinkClick on " + id, "link_config"); - var link = gantt.getLink(id); - if (gantt._is_readonly(link)) return; - var source = gantt._pull[link.source]; - if (!source) return; - var target = gantt._pull[link.target]; - if (!target) return; - if (source.readonly && target.readonly) return; - var linkConfigWidget = new ysy.view.LinkPopup().init(link.widget.model, link); - linkConfigWidget.$target = $("#ajax-modal");//$dialog; - linkConfigWidget.repaint(); - showModal("ajax-modal", "auto"); - }); - }; - patch(); - } -}; diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/dhtml_rewrite.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/dhtml_rewrite.js deleted file mode 100644 index 17750a063168fdc05152f41914bd731c0216eef3..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/dhtml_rewrite.js +++ /dev/null @@ -1,705 +0,0 @@ -/* dhtml_rewrite.js */ -/* global ysy */ -/** - * @external Moment - */ -// noinspection JSCommentMatchesSignature -/** - * @function moment - * @param {*} [arg1] - * @return {Moment} - */ -window.ysy = window.ysy || {}; -ysy.view = ysy.view || {}; -ysy.view.applyGanttRewritePatch = function () { - ysy.view.initNonworkingDays = function () { - var work_helper = gantt._working_time_helper; - work_helper.defHours = ysy.settings.hoursPerDay; - var i; - // Now we specify working days - var nonWorking = ysy.settings.nonWorkingWeekDays; - for (i in nonWorking) { - work_helper.set_time({day: nonWorking[i] % 7, hours: false}); - } - // Now we specify holidays - var holidays = ysy.settings.holidays; - if (holidays) { - for (i = 0; i < holidays.length; i++) { - work_helper.set_time({date: moment(holidays[i]), hours: false}); - } - } - work_helper._cache = {}; - }; - gantt._working_time_helper = { - defHours: 8, - timeformat: "YYYY-MM-DD", - days: {0: true, 1: true, 2: true, 3: true, 4: true, 5: true, 6: true}, - dates: {}, - _cache: {}, - oneDaySeconds: 1000 * 60 * 60 * 24, - oneHourSeconds: 1000 * 60 * 60, - //formatDate: function (date) { - // if (date._isAMomentObject) { - // return date.format(this.timeformat); - // } - // return moment(date).format(this.timeformat); - //}, - toMoment: function (date) { - if (date._isAMomentObject) { - return date; - } - return moment(date); - }, - set_time: function (settings) { - var hours = settings.hours !== undefined ? settings.hours : true; - if (settings.day !== undefined) { - this.days[settings.day] = hours; - } else if (settings.date !== undefined) { - this.dates[+settings.date] = hours; - } - - }, - is_weekend: function (date) { - date = this.toMoment(date); - return !this.days[date.day()]; - }, - is_working_day: function (date) { - date = this.toMoment(date); - if (!this.days[date.day()]) { - return false;//week day - } - var val = this.get_working_hours(date); - return val > 0; - }, - get_working_hours: function (date) { - //return 8; - //console.log("get_working_hours: "+date.toString()); - //var t = this._timestamp({date: date}); - date = this.toMoment(date); - var t = +date; - var hours = true; - //date = moment(date); - if (this.dates[t] !== undefined) { - hours = this.dates[t];//custom day - } else if (this.days[date.day()] !== undefined) { - hours = this.days[date.day()];//week day - } - if (hours === true) { - return this.defHours; - } else if (hours) { - return hours; - } - return 0; - }, - is_working_unit: function (date, unit, order) { - if (!gantt.config.work_time) - return true; - return this.is_working_day(date); - }, - save_working_unit: function (first_date, end_date, unit) { - var weekID = first_date.isoWeek(); - var workDays = this.get_work_units_between(first_date, end_date, "day"); - var workHours = this.get_work_units_between(first_date, end_date, "hour"); - this.weeks[weekID] = {days: workDays, hours: workHours}; - }, - _work_times_between: function (from, to) { - var spanID = from.valueOf() + "_" + to.valueOf(); - if (this._cache[spanID]) { - this._cache[spanID].cached = true; - return this._cache[spanID]; - } - if (from.isBefore(to)) { - var ret = this._work_times_forward(from, to); - } else { - ret = this._work_times_backward(from, to); - } - this._cache[spanID] = ret; - return ret; - }, - _work_times_forward: function (from, to) { - var sumHours = 0; - var sumDays = 0; - - if ((+from % this.oneHourSeconds) !== 0 || from.hours()!==0) { - var mover = moment(from).startOf("day"); - var first = true; - } else { - mover = from; - } - var count = 0; - while (mover.isBefore(to)) { - if ((count++) > 3000) { - ysy.log.error("_work_times_forward: Probably task with start_date=" + from.format("YYYY-MM-DD") - + " and end_date=" + to.format("YYYY-MM-DD") + " is too long"); - break; - } - var hours = this.get_working_hours(mover); - if (hours > 0) { - if (first) { - var rest = 1 - (from - mover) / this.oneDaySeconds; - sumDays += rest; - sumHours += hours * rest; - } else { - sumDays++; - sumHours += hours; - } - } - first = false; - mover.add(1, "days"); - } - if (hours > 0 && mover.isAfter(to)) { - rest = (mover - to) / this.oneDaySeconds; - sumDays -= rest; - sumHours -= hours * rest; - } - return {days: sumDays, hours: sumHours}; - }, - _work_times_backward: function (from, to) { - var sumHours = 0; - var sumDays = 0; - if ((+from % this.oneHourSeconds) !== 0 || from.hours()!==0) { - var mover = moment(from).startOf("day"); - var first = true; - mover.add(1, "day"); - } else { - mover = from; - } - var count = 0; - while (mover.isAfter(to)) { - mover.subtract(1, "days"); - if ((count++) > 3000) { - ysy.log.error("_work_times_backward: Probably task with start_date=" + to.format("YYYY-MM-DD") - + " and end_date=" + from.format("YYYY-MM-DD") + " is too long"); - break; - } - var hours = this.get_working_hours(mover); - if (hours > 0) { - if (first) { - var rest = (from - mover) / this.oneDaySeconds; - sumDays += rest; - sumHours += hours * rest; - } else { - sumDays++; - sumHours += hours; - } - } - first = false; - } - if (hours > 0 && mover.isBefore(to)) { - var rest2 = (to - mover) / this.oneDaySeconds; - sumDays -= rest2; - sumHours -= hours * rest2; - } - //ysy.log.debug(mover.format() + " hours=" + hours + " rest=" + rest + " rest2=" + rest2); - return {days: -1 * sumDays, hours: -1 * sumHours}; - }, - get_work_units_between: function (from, to, unit) { - if (!unit) { - ysy.log.error("missing unit"); - return 0; - } - var safeFrom = moment(from); - if (to._isEndDate) { - var safeTo = moment(to).add(1, "days"); - }else{ - safeTo = moment(to) - } - if (from._isEndDate) { - safeFrom = safeFrom.add(1, "days"); - } - var workSums = this._work_times_between(safeFrom, safeTo); - ysy.log.debug("get_work_units_between: " + this.toMoment(from).format("DD.MM.YYYY") + "(" + from._isEndDate + ") " + this.toMoment(to).format("DD.MM.YYYY") + "(" + to._isEndDate + ") " + unit + " " + (workSums.cached ? "(cached)" : ""), "date_helper"); - if (unit === "day") { - return workSums.days; - } else if (unit === "all") { - return workSums; - } else { - return workSums.hours; - } - }, - is_work_units_between: function (from, to, unit) { - if (!unit) { - return false; - } - return this.get_work_units_between(from, to, unit) > 0; - }, - /** - * - * @param {Moment|Date} from - * @param {boolean} from._isEndDate - * @param {int} duration - * @param {string} unit - * @param {boolean} toIsEndDate - * @return {Moment|Date} - */ - add_worktime: function (from, duration, unit, toIsEndDate) { - var hours; - ysy.log.debug("add_worktime: " + from.toString() + " " + duration + " " + unit, "date_helper"); - if (!unit) { - throw "Missing unit"; - } else { - unit = unit + "s"; - } - var added = 0; - var safeFrom = moment(from); - if (from._isEndDate) { - safeFrom.add(1, "days"); - } - if ((+from % this.oneHourSeconds) !== 0 || safeFrom.hours()!==0) { - var mover = moment(safeFrom).startOf("day"); - var diff = safeFrom - mover; - var first = true; - } else { - mover = safeFrom; - } - //if (!gantt.config.work_time||unit==="weeks") { - // console.log(mover.format("YYYY-MM-DD HH:mm")+" mover before"); - if (gantt.config.work_time && (unit === "days" || unit === "hours")) { - var count = 0; - if (duration === 0) { - while (true) { - if (count++ > 3000) { - ysy.log.error("_add_worktime: Probably task with start_date=" + moment(from).format("YYYY-MM-DD") - + " and duration " + duration + " is too long"); - break; - } - hours = this.get_working_hours(mover); - if (hours) { - if (first) { - mover.add(diff, "milliseconds"); - } - break; - } - first = false; - mover.add(1, "days"); - } - } else if (duration > 0) { - while (added < duration) { - if (count++ > 3000) { - ysy.log.error("_add_worktime: Probably task with start_date=" + moment(from).format("YYYY-MM-DD") - + " and duration " + duration + " is too long"); - break; - } - hours = this.get_working_hours(mover); - if (hours > 0) { - var rest = 1; - if (first) { - rest = 1 - diff / this.oneDaySeconds; - } - if (unit === "hours") { - added += rest * hours; - } else { - added += rest; - } - } - first = false; - mover.add(1, "days"); - } - if (hours && added > duration) { - mover.subtract((added - duration) * (unit === "hours" ? 3600 : 3600 * 24), "seconds"); - } - } else { - while (added < -duration) { - if (count++ > 3000) { - ysy.log.error("_add_worktime: Probably task with end_date=" + moment(from).format("YYYY-MM-DD") - + " and duration " + duration + " is too long"); - break; - } - if (!first || !diff) { - mover.add(-1, "days"); - } - hours = this.get_working_hours(mover); - if (hours > 0) { - rest = 1; - if (first) { - rest = diff / this.oneDaySeconds; - } - if (unit === "hours") { - added += rest * hours; - } else { - added += rest; - } - // console.log(mover.format("YYYY-MM-DD HH:mm")+" moved rest="+rest+" added="+added); - } - first = false; - } - if (hours && added > -duration) { - mover.add((added + duration) * (unit === "hours" ? 3600 : 3600 * 24), "seconds"); - } - } - } else { - mover.add(duration, unit); - } - // console.log(mover.format("YYYY-MM-DD HH:mm")+" mover after"); - if (toIsEndDate || !from._isEndDate && toIsEndDate === undefined) { - mover.add(-1, "days"); - mover._isEndDate = true; - } - // console.log(mover.format("YYYY-MM-DD HH:mm")+" mover endDated"); - if (moment.isMoment(from)) { - return mover; - } - return mover.toDate(); - }, - round_date: function (date, direction) { - ysy.log.debug("round_date: " + date.toString(), "date_helper"); - if (date._isAMomentObject) { - var momentDate = date; - } else { - momentDate = moment(date); - } - momentDate.add(12, "hours").startOf("day"); - var count = 0; - if (gantt.config.work_time) { - if (direction === 'past') { - while (!this.is_working_day(momentDate) && (count++) < 1000) { - momentDate.subtract(1, "days"); - } - } else { - while (!this.is_working_day(momentDate) && (count++) < 1000) { - momentDate.add(1, "days"); - } - } - } - if (!date._isAMomentObject) { - date.setTime(momentDate.valueOf()); - } - - //end.add(12,"hours").startOf("day"); - - }, - /** - * @param {String} settings.dir - * @param {Moment|int} settings.date - * @param {String} [settings.unit] - * @param {int} [settings.length] - minimal size of working span - * @return {*} - */ - get_closest_worktime: function (settings) { - ysy.log.debug("get_closest_worktime: " + settings.date.toString(), "date_helper"); - - var isMoment = moment.isMoment(settings.date); - var unit = settings.unit || "day"; - var dayStart = moment(settings.date).startOf(unit); - var diff = settings.date - dayStart; // in milliseconds - - - var goFuture = settings.dir === 'any' || settings.dir === 'future', - goPast = settings.dir === 'any' || settings.dir === 'past'; - - if (!settings.length) { - if (this.is_working_day(dayStart)) { - dayStart.add(diff, "milliseconds"); - if (isMoment) return dayStart; - return dayStart.toDate(); - } - } - if (goPast) { - var past_target = moment(dayStart); - if (settings.length) { - past_target.add(settings.length, "days"); - } - } - if (goFuture) { - var future_target = dayStart; - if (diff !== 0) { - future_target.add(1, unit); - } - } - if (goPast) { - // ysy.log.debug("checking past " + past_target.format("YYYY-MM-DD")); - if (this.is_working_day(past_target)) { - if (!settings.length) { - past_target.add(diff, "milliseconds"); - if (isMoment) return past_target; - return past_target.toDate(); - } else { - past_target.subtract(1, "days"); - if (this.is_working_day(past_target)) { - past_target.add(diff, "milliseconds"); - if (isMoment) return past_target; - return past_target.toDate(); - } - } - } - past_target.add(-1, "days"); - } - //will seek closest working hour in future or in past, one step in both direction per iteration - for (var count = 0; count < 3000; count++) { //be extra sure we won't fall into infinite loop, 3k seems big enough - if (goPast) { - // ysy.log.debug("checking past " + past_target.format("YYYY-MM-DD")); - if (this.is_working_day(past_target)) { - if (isMoment) return past_target; - return past_target.toDate(); - } - past_target.add(-1, "days"); - } - if (goFuture) { - // ysy.log.debug("checking future " + future_target.format("YYYY-MM-DD")); - if (this.is_working_day(future_target)) { - if (isMoment) return future_target; - return future_target.toDate(); - } - future_target.add(1, "days"); - } - } - dhtmlx.assert(false, "Invalid working time check"); - return false; - } - - - }; -//####################################################################### - gantt.date = { - now: function () { - return moment(); - }, - Date: function (date, isEndDate) { - if (!date) { - //return moment(); - return new Date(); - } - if (date._isAMomentObject/*||!isNaN(date)*/) { - var ndate = moment(date); - if (isEndDate === undefined) { - isEndDate = date._isEndDate; - } - } else { - //ysy.log.warning("date created as new Date(), not as moment()"); - ndate = moment(date).toDate(); - } - ndate._isEndDate = isEndDate; - return ndate; - }, - toMoment: function (date) { - if (!date) { - ysy.log.error("No date to convert to Moment"); - return; - } - if (date._isAMomentObject) { - return date; - } - return moment(date); - }, - fromMoment: function (date, momentDate) { - if (date._isAMomentObject) { - return date; - } - date.setTime(momentDate.valueOf()); - return date; - }, - init: function () { - return; - var s = gantt.locale.date.month_short; - var t = gantt.locale.date.month_short_hash = {}; - for (var i = 0; i < s.length; i++) - t[s[i]] = i; - - var s = gantt.locale.date.month_full; - var t = gantt.locale.date.month_full_hash = {}; - for (var i = 0; i < s.length; i++) - t[s[i]] = i; - }, - _startOf: function (date, unit) { - var momentDate = this.toMoment(date); - momentDate.startOf(unit); - return this.fromMoment(date, momentDate); - }, - date_part: function (date) { - return this._startOf(date, "day"); - }, - time_part: function (date) { - alert("Forbidden function"); - return (date.valueOf() / 1000 - date.getTimezoneOffset() * 60) % 86400; - }, - week_start: function (date) { - return this._startOf(date, "isoweek"); - }, - month_start: function (date) { - return this._startOf(date, "month"); - }, - year_start: function (date) { - return this._startOf(date, "year"); - }, - day_start: function (date) { - return this._startOf(date, "day"); - }, - hour_start: function (date) { - alert("Forbidden function"); - if (date.getMinutes()) - date.setMinutes(0); - this.minute_start(date); - - return date; - }, - minute_start: function (date) { - alert("Forbidden function"); - if (date.getSeconds()) - date.setSeconds(0); - if (date.getMilliseconds()) - date.setMilliseconds(0); - return date; - }, - /*_add_days: function (date, inc) { - var ndate = new Date(date.valueOf()); - - ndate.setDate(ndate.getDate() + inc); - if (inc >= 0 && (!date.getHours() && ndate.getHours()) && //shift to yesterday on dst - (ndate.getDate() < date.getDate() || ndate.getMonth() < date.getMonth() || ndate.getFullYear() < date.getFullYear())) - ndate.setTime(ndate.getTime() + 60 * 60 * 1000 * (24 - ndate.getHours())); - return ndate; - },*/ - add: function (date, inc, mode) { - var momentDate = this.toMoment(date); - momentDate.add(inc, mode + "s"); - return momentDate.toDate(); - }, - to_fixed: function (num) { - if (num < 10) - return "0" + num; - return num; - }, - copy: function (date) { - var momentDate = moment(date); - if (date._isAMomentObject) { - return momentDate; - } - return momentDate.toDate(); - //return new Date(date.valueOf()); - }, - date_to_str: function (format, utc) { - ysy.log.debug("date_to_str " + format, "date_format"); - format = format.replace(/%[a-zA-Z]/g, function (a) { - switch (a) { - case "%d": - return "\"+gantt.date.to_fixed(date.getDate())+\""; - case "%m": - return "\"+gantt.date.to_fixed((date.getMonth()+1))+\""; - case "%j": - return "\"+date.getDate()+\""; - case "%n": - return "\"+(date.getMonth()+1)+\""; - case "%y": - return "\"+gantt.date.to_fixed(date.getFullYear()%100)+\""; - case "%Y": - return "\"+date.getFullYear()+\""; - case "%D": - return "\"+gantt.locale.date.day_short[date.getDay()]+\""; - case "%l": - return "\"+gantt.locale.date.day_full[date.getDay()]+\""; - case "%M": - return "\"+gantt.locale.date.month_short[date.getMonth()]+\""; - case "%F": - return "\"+gantt.locale.date.month_full[date.getMonth()]+\""; - case "%h": - return "\"+gantt.date.to_fixed((date.getHours()+11)%12+1)+\""; - case "%g": - return "\"+((date.getHours()+11)%12+1)+\""; - case "%G": - return "\"+date.getHours()+\""; - case "%H": - return "\"+gantt.date.to_fixed(date.getHours())+\""; - case "%i": - return "\"+gantt.date.to_fixed(date.getMinutes())+\""; - case "%a": - return "\"+(date.getHours()>11?\"pm\":\"am\")+\""; - case "%A": - return "\"+(date.getHours()>11?\"PM\":\"AM\")+\""; - case "%s": - return "\"+gantt.date.to_fixed(date.getSeconds())+\""; - case "%W": - return "\"+gantt.date.to_fixed(gantt.date.getISOWeek(date))+\""; - default: - return a; - } - }); - if (utc) - format = format.replace(/date\.get/g, "date.getUTC"); - return new Function("date", "return \"" + format + "\";"); - }, - str_to_date: function (format, utc) { - ysy.log.debug("str_to_date " + format, "date_format"); - var splt = "var temp=date.match(/[a-zA-Z]+|[0-9]+/g);"; - var mask = format.match(/%[a-zA-Z]/g); - for (var i = 0; i < mask.length; i++) { - switch (mask[i]) { - case "%j": - case "%d": - splt += "set[2]=temp[" + i + "]||1;"; - break; - case "%n": - case "%m": - splt += "set[1]=(temp[" + i + "]||1)-1;"; - break; - case "%y": - splt += "set[0]=temp[" + i + "]*1+(temp[" + i + "]>50?1900:2000);"; - break; - case "%g": - case "%G": - case "%h": - case "%H": - splt += "set[3]=temp[" + i + "]||0;"; - break; - case "%i": - splt += "set[4]=temp[" + i + "]||0;"; - break; - case "%Y": - splt += "set[0]=temp[" + i + "]||0;"; - break; - case "%a": - case "%A": - splt += "set[3]=set[3]%12+((temp[" + i + "]||'').toLowerCase()=='am'?0:12);"; - break; - case "%s": - splt += "set[5]=temp[" + i + "]||0;"; - break; - case "%M": - splt += "set[1]=gantt.locale.date.month_short_hash[temp[" + i + "]]||0;"; - break; - case "%F": - splt += "set[1]=gantt.locale.date.month_full_hash[temp[" + i + "]]||0;"; - break; - default: - break; - } - } - var code = "set[0],set[1],set[2],set[3],set[4],set[5]"; - if (utc) - code = " Date.UTC(" + code + ")"; - return new Function("date", "var set=[0,0,1,0,0,0]; " + splt + " return new Date(" + code + ");"); - }, - getISOWeek: function (ndate) { - if (!ndate) - return false; - var mom = this.toMoment(ndate); - return mom.isoWeek(); - }, - getUTCISOWeek: function (ndate) { - return this.getISOWeek(ndate); - }, - convert_to_utc: function (date) { - var mom = this.toMoment(date); - mom.utc(); - return this.fromMoment(date, mom); - - //return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); - }, - parseDate: function (date, format) { - if (typeof (date) == "string") { - ysy.log.debug("parseDate() " + date + " " + format, "date_format"); - if (dhtmlx.defined(format)) { - if (typeof (format) == "string") - format = dhtmlx.defined(gantt.templates[format]) ? gantt.templates[format] : gantt.date.str_to_date(format); - else - format = gantt.templates.xml_date; - } - if (date) - date = format(date); - else - date = null; - } - return this.toMoment(date); - } - }; - ysy.view.initNonworkingDays(); -}; diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/dhtmlxgantt.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/dhtmlxgantt.js deleted file mode 100644 index c8929d418f0ccd11f6caa85fc02977bfb728ca05..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/dhtmlxgantt.js +++ /dev/null @@ -1,9439 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.1 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -if (typeof(window.dhx4) == "undefined") { - - window.dhx4 = { - - version: "4.1.3", - - skin: null, // allow to be set by user - - skinDetect: function(comp) { - return {10:"dhx_skyblue",20:"dhx_web",30:"dhx_terrace"}[this.readFromCss(comp+"_skin_detect")]||null; - }, - - // read value from css - readFromCss: function(className, property) { - var t = document.createElement("DIV"); - t.className = className; - if (document.body.firstChild != null) document.body.insertBefore(t, document.body.firstChild); else document.body.appendChild(t); - var w = t[property||"offsetWidth"]; - t.parentNode.removeChild(t); - t = null; - return w; - }, - - // id manager - lastId: 1, - newId: function() { - return this.lastId++; - }, - - // z-index manager - zim: { - data: {}, - step: 5, - first: function() { - return 100; - }, - last: function() { - var t = this.first(); - for (var a in this.data) t = Math.max(t, this.data[a]); - return t; - }, - reserve: function(id) { - this.data[id] = this.last()+this.step; - return this.data[id]; - }, - clear: function(id) { - if (this.data[id] != null) { - this.data[id] = null; - delete this.data[id]; - } - } - }, - - // string to boolean - s2b: function(r) { - if (typeof(r) == "string") r = r.toLowerCase(); - return (r == true || r == 1 || r == "true" || r == "1" || r == "yes" || r == "y"); - }, - - // string to json - s2j: function(s) { - var obj = null; - dhx4.temp = null; - try { eval("dhx4.temp="+s); } catch(e) { dhx4.temp = null; } - obj = dhx4.temp; - dhx4.temp = null; - return obj; - }, - - // absolute top/left position on screen - absLeft: function(obj) { - if (typeof(obj) == "string") obj = document.getElementById(obj); - return this.getOffset(obj).left; - }, - absTop: function(obj) { - if (typeof(obj) == "string") obj = document.getElementById(obj); - return this.getOffset(obj).top; - }, - _aOfs: function(elem) { - var top = 0, left = 0; - while (elem) { - top = top + parseInt(elem.offsetTop); - left = left + parseInt(elem.offsetLeft); - elem = elem.offsetParent; - } - return {top: top, left: left}; - }, - _aOfsRect: function(elem) { - var box = elem.getBoundingClientRect(); - var body = document.body; - var docElem = document.documentElement; - var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop; - var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft; - var clientTop = docElem.clientTop || body.clientTop || 0; - var clientLeft = docElem.clientLeft || body.clientLeft || 0; - var top = box.top + scrollTop - clientTop; - var left = box.left + scrollLeft - clientLeft; - return { top: Math.round(top), left: Math.round(left) }; - }, - getOffset: function(elem) { - if (elem.getBoundingClientRect) { - return this._aOfsRect(elem); - } else { - return this._aOfs(elem); - } - }, - - // copy obj - _isObj: function(k) { - return (k != null && typeof(k) == "object" && typeof(k.length) == "undefined"); - }, - _copyObj: function(r) { - if (this._isObj(r)) { - var t = {}; - for (var a in r) { - if (typeof(r[a]) == "object" && r[a] != null) t[a] = this._copyObj(r[a]); else t[a] = r[a]; - } - } else { - var t = []; - for (var a=0; a<r.length; a++) { - if (typeof(r[a]) == "object" && r[a] != null) t[a] = this._copyObj(r[a]); else t[a] = r[a]; - } - } - return t; - }, - - // screen dim - screenDim: function() { - var isIE = (navigator.userAgent.indexOf("MSIE") >= 0); - var dim = {}; - dim.left = document.body.scrollLeft; - dim.right = dim.left+(window.innerWidth||document.body.clientWidth); - dim.top = Math.max((isIE?document.documentElement:document.getElementsByTagName("html")[0]).scrollTop, document.body.scrollTop); - dim.bottom = dim.top+(isIE?Math.max(document.documentElement.clientHeight||0,document.documentElement.offsetHeight||0):window.innerHeight); - return dim; - }, - - // input/textarea range selection - selectTextRange: function(inp, start, end) { - - inp = (typeof(inp)=="string"?document.getElementById(inp):inp); - - var len = inp.value.length; - start = Math.max(Math.min(start, len), 0); - end = Math.min(end, len); - - if (inp.setSelectionRange) { - try {inp.setSelectionRange(start, end);} catch(e){}; // combo in grid under IE requires try/catch - } else if (inp.createTextRange) { - var range = inp.createTextRange(); - range.moveStart("character", start); - range.moveEnd("character", end-len); - try {range.select();} catch(e){}; - } - }, - // transition - transData: null, - transDetect: function() { - - if (this.transData == null) { - - this.transData = {transProp: false, transEv: null}; - - // transition, MozTransition, WebkitTransition, msTransition, OTransition - var k = { - "MozTransition": "transitionend", - "WebkitTransition": "webkitTransitionEnd", - "OTransition": "oTransitionEnd", - "msTransition": "transitionend", - "transition": "transitionend" - }; - - for (var a in k) { - if (this.transData.transProp == false && document.documentElement.style[a] != null) { - this.transData.transProp = a; - this.transData.transEv = k[a]; - } - } - k = null; - } - - return this.transData; - - }, - - // xml parser - _xmlNodeValue: function(node) { - var value = ""; - for (var q=0; q<node.childNodes.length; q++) { - value += (node.childNodes[q].nodeValue!=null?node.childNodes[q].nodeValue.toString().replace(/^[\n\r\s]{0,}/,"").replace(/[\n\r\s]{0,}$/,""):""); - } - return value; - } - - }; - - // browser - window.dhx4.isIE = (navigator.userAgent.indexOf("MSIE") >= 0 || navigator.userAgent.indexOf("Trident") >= 0); - window.dhx4.isIE6 = (window.XMLHttpRequest == null && navigator.userAgent.indexOf("MSIE") >= 0); - window.dhx4.isIE7 = (navigator.userAgent.indexOf("MSIE 7.0") >= 0 && navigator.userAgent.indexOf("Trident") < 0); - window.dhx4.isIE8 = (navigator.userAgent.indexOf("MSIE 8.0") >= 0 && navigator.userAgent.indexOf("Trident") >= 0); - window.dhx4.isOpera = (navigator.userAgent.indexOf("Opera") >= 0); - window.dhx4.isChrome = (navigator.userAgent.indexOf("Chrome") >= 0); - window.dhx4.isKHTML = (navigator.userAgent.indexOf("Safari") >= 0 || navigator.userAgent.indexOf("Konqueror") >= 0); - window.dhx4.isFF = (navigator.userAgent.indexOf("Firefox") >= 0); - window.dhx4.isIPad = (navigator.userAgent.search(/iPad/gi) >= 0); -}; - - - -/* -if (typeof(window.dhx4.ajax) == "undefined") { - - window.dhx4.ajax = { - - // if false - dhxr param will added to prevent caching on client side (default), - // if true - do not add extra params - cache: false, - - // default method for load/loadStruct, post/get allowed - // get - since 4.1.1, this should fix 412 error for macos safari - method: "get", - - parse: function(data) { - if (typeof data !== "string") return data; - - data = data.replace(/^[\s]+/,""); - if (window.DOMParser && !dhx4.isIE) { // ff,ie9 - var obj = (new window.DOMParser()).parseFromString(data, "text/xml"); - } else if (window.ActiveXObject !== window.undefined) { - var obj = new window.ActiveXObject("Microsoft.XMLDOM"); - obj.async = "false"; - obj.loadXML(data); - } - return obj; - }, - xmltop: function(tagname, xhr, obj) { - if (typeof xhr.status == "undefined" || xhr.status < 400) { - var xml = (!xhr.responseXML) ? dhx4.ajax.parse(xhr.responseText || xhr) : (xhr.responseXML || xhr); - if (xml && xml.documentElement !== null && !xml.getElementsByTagName("parsererror").length) { - return xml.getElementsByTagName(tagname)[0]; - } - } - if (obj !== -1) dhx4.callEvent("onLoadXMLError",["Incorrect XML", arguments[1], obj]); - return document.createElement("DIV"); - }, - xpath: function(xpathExp, docObj) { - if (!docObj.nodeName) docObj = docObj.responseXML || docObj; - if (dhx4.isIE) { - return docObj.selectNodes(xpathExp)||[]; - } else { - var rows = []; - var first; - var col = (docObj.ownerDocument||docObj).evaluate(xpathExp, docObj, null, XPathResult.ANY_TYPE, null); - while (first = col.iterateNext()) rows.push(first); - return rows; - } - }, - query: function(config) { - dhx4.ajax._call( - (config.method || "GET"), - config.url, - config.data || "", - (config.async || true), - config.callback, - null, - config.headers - ); - }, - get: function(url, onLoad) { - this._call("GET", url, null, true, onLoad); - }, - getSync: function(url) { - return this._call("GET", url, null, false); - }, - put: function(url, postData, onLoad) { - this._call("PUT", url, postData, true, onLoad); - }, - del: function(url, postData, onLoad) { - this._call("DELETE", url, postData, true, onLoad); - }, - post: function(url, postData, onLoad) { - if (arguments.length == 1) { - postData = ""; - } else if (arguments.length == 2 && (typeof(postData) == "function" || typeof(window[postData]) == "function")) { - onLoad = postData; - postData = ""; - } else { - postData = String(postData); - } - this._call("POST", url, postData, true, onLoad); - }, - postSync: function(url, postData) { - postData = (postData == null ? "" : String(postData)); - return this._call("POST", url, postData, false); - }, - getLong: function(url, onLoad) { - this._call("GET", url, null, true, onLoad, {url:url}); - }, - postLong: function(url, postData, onLoad) { - if (arguments.length == 2 && (typeof(postData) == "function" || typeof(window[postData]))) { - onLoad = postData; - postData = ""; - } - this._call("POST", url, postData, true, onLoad, {url:url, postData:postData}); - }, - _call: function(method, url, postData, async, onLoad, longParams, headers) { - - var t = (window.XMLHttpRequest && !dhx4.isIE ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP")); - var isQt = (navigator.userAgent.match(/AppleWebKit/) != null && navigator.userAgent.match(/Qt/) != null && navigator.userAgent.match(/Safari/) != null); - - if (async == true) { - t.onreadystatechange = function() { - if ((t.readyState == 4) || (isQt == true && t.readyState == 3)) { // what for long response and status 404? - if (t.status != 200 || t.responseText == "") - if (!dhx4.callEvent("onAjaxError", [t])) return; - - window.setTimeout(function(){ - if (typeof(onLoad) == "function") { - onLoad.apply(window, [{xmlDoc:t}]); // dhtmlx-compat, response.xmlDoc.responseXML/responseText - } - if (longParams != null) { - if (typeof(longParams.postData) != "undefined") { - dhx4.ajax.postLong(longParams.url, longParams.postData, onLoad); - } else { - dhx4.ajax.getLong(longParams.url, onLoad); - } - } - onLoad = null; - t = null; - },1); - } - } - } - - if (method == "GET" && this.cache != true) { - url += (url.indexOf("?")>=0?"&":"?")+"dhxr"+new Date().getTime()+"=1"; - } - - t.open(method, url, async); - - if (headers){ - for (var key in headers) - t.setRequestHeader(key, headers[key]); - } else if (method.toUpperCase() == "POST" || method == "PUT" || method == "DELETE") { - t.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); - } else if (method == "GET") { - postData = null; - } - - t.setRequestHeader("X-Requested-With", "XMLHttpRequest"); - - t.send(postData); - - if (!async) return {xmlDoc:t}; // dhtmlx-compat, response.xmlDoc.responseXML/responseText - - } - }; - -}; -*/ - -if (typeof(window.dhx4._eventable) == "undefined") { - - window.dhx4._eventable = function(obj, mode) { - - if (mode == "clear") { - - obj.detachAllEvents(); - - obj.dhxevs = null; - - obj.attachEvent = null; - obj.detachEvent = null; - obj.checkEvent = null; - obj.callEvent = null; - obj.detachAllEvents = null; - - obj = null; - - return; - - } - - obj.dhxevs = { data: {} }; - - obj.attachEvent = function(name, func) { - name = String(name).toLowerCase(); - if (!this.dhxevs.data[name]) this.dhxevs.data[name] = {}; - var eventId = window.dhx4.newId(); - this.dhxevs.data[name][eventId] = func; - return eventId; - } - - obj.detachEvent = function(eventId) { - for (var a in this.dhxevs.data) { - var k = 0; - for (var b in this.dhxevs.data[a]) { - if (b == eventId) { - this.dhxevs.data[a][b] = null; - delete this.dhxevs.data[a][b]; - } else { - k++; - } - } - if (k == 0) { - this.dhxevs.data[a] = null; - delete this.dhxevs.data[a]; - } - } - } - - obj.checkEvent = function(name) { - name = String(name).toLowerCase(); - return (this.dhxevs.data[name] != null); - } - - obj.callEvent = function(name, params) { - name = String(name).toLowerCase(); - if (this.dhxevs.data[name] == null) return true; - var r = true; - for (var a in this.dhxevs.data[name]) { - r = this.dhxevs.data[name][a].apply(this, params) && r; - } - return r; - } - - obj.detachAllEvents = function() { - for (var a in this.dhxevs.data) { - for (var b in this.dhxevs.data[a]) { - this.dhxevs.data[a][b] = null; - delete this.dhxevs.data[a][b]; - } - this.dhxevs.data[a] = null; - delete this.dhxevs.data[a]; - } - } - - obj = null; - }; - - dhx4._eventable(dhx4); - -}; - -if (typeof(window.dhtmlx) == "undefined") { - window.dhtmlx={ - extend:function(a, b){ - for (var key in b) - if (!a[key]) - a[key]=b[key]; - return a; - }, - extend_api:function(name,map,ext){ - var t = window[name]; - if (!t) return; //component not defined - window[name]=function(obj){ - if (obj && typeof obj == "object" && !obj.tagName){ - var that = t.apply(this,(map._init?map._init(obj):arguments)); - //global settings - for (var a in dhtmlx) - if (map[a]) this[map[a]](dhtmlx[a]); - //local settings - for (var a in obj){ - if (map[a]) this[map[a]](obj[a]); - else if (a.indexOf("on")===0){ - this.attachEvent(a,obj[a]); - } - } - } else - var that = t.apply(this,arguments); - if (map._patch) map._patch(this); - return that||this; - }; - window[name].prototype=t.prototype; - if (ext) - dhtmlx.extend(window[name].prototype,ext); - }, - url:function(str){ - if (str.indexOf("?") != -1) - return "&"; - else - return "?"; - } - }; -}; - - _isFF = false; - _isIE = false; - _isOpera = false; - _isKHTML = false; - _isMacOS = false; - _isChrome = false; - _FFrv = false; - _KHTMLrv = false; - _OperaRv = false; - -if (navigator.userAgent.indexOf('Macintosh') != -1) - _isMacOS=true; - - -if (navigator.userAgent.toLowerCase().indexOf('chrome')>-1) - _isChrome=true; - -if ((navigator.userAgent.indexOf('Safari') != -1)||(navigator.userAgent.indexOf('Konqueror') != -1)){ - _KHTMLrv = parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Safari')+7, 5)); - - if (_KHTMLrv > 525){ //mimic FF behavior for Safari 3.1+ - _isFF=true; - _FFrv = 1.9; - } else - _isKHTML=true; -} else if (navigator.userAgent.indexOf('Opera') != -1){ - _isOpera=true; - _OperaRv=parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Opera')+6, 3)); -} - - -else if (navigator.appName.indexOf("Microsoft") != -1){ - _isIE=true; - if ((navigator.appVersion.indexOf("MSIE 8.0")!= -1 || - navigator.appVersion.indexOf("MSIE 9.0")!= -1 || - navigator.appVersion.indexOf("MSIE 10.0")!= -1 || - document.documentMode > 7) && - document.compatMode != "BackCompat"){ - _isIE=8; - } -} else if (navigator.appName == 'Netscape' && navigator.userAgent.indexOf("Trident") != -1){ - //ie11 - _isIE=8; -} else { - _isFF=true; - _FFrv = parseFloat(navigator.userAgent.split("rv:")[1]) -} - -if (typeof(window.dhtmlxEvent) == "undefined") { - - function dhtmlxEvent(el, event, handler){ - if (el.addEventListener) - el.addEventListener(event, handler, false); - - else if (el.attachEvent) - el.attachEvent("on"+event, handler); - } -}; - -if (dhtmlxEvent.touchDelay == null) { - dhtmlxEvent.touchDelay = 2000; -}; - -if (typeof(dhtmlxEvent.initTouch) == "undefined") { - - dhtmlxEvent.initTouch = function(){ - var longtouch; - var target; - var tx, ty; - - dhtmlxEvent(document.body, "touchstart", function(ev){ - target = ev.touches[0].target; - tx = ev.touches[0].clientX; - ty = ev.touches[0].clientY; - longtouch = window.setTimeout(touch_event, dhtmlxEvent.touchDelay); - }); - function touch_event(){ - if (target){ - var ev = document.createEvent("HTMLEvents"); // for chrome and firefox - ev.initEvent("dblclick", true, true); - target.dispatchEvent(ev); - longtouch = target = null; - } - }; - dhtmlxEvent(document.body, "touchmove", function(ev){ - if (longtouch){ - if (Math.abs(ev.touches[0].clientX - tx) > 50 || Math.abs(ev.touches[0].clientY - ty) > 50 ){ - window.clearTimeout(longtouch); - longtouch = target = false; - } - } - }); - dhtmlxEvent(document.body, "touchend", function(ev){ - if (longtouch){ - window.clearTimeout(longtouch); - longtouch = target = false; - } - }); - - dhtmlxEvent.initTouch = function(){}; - }; -}; - -if(!window.dhtmlx) - window.dhtmlx = {}; - -(function(){ - var _dhx_msg_cfg = null; - function callback(config, result){ - var usercall = config.callback; - modality(false); - config.box.parentNode.removeChild(config.box); - _dhx_msg_cfg = config.box = null; - if (usercall) - usercall(result); - } - function modal_key(e){ - if (_dhx_msg_cfg){ - e = e||event; - var code = e.which||event.keyCode; - if (dhtmlx.message.keyboard){ - if (code == 13 || code == 32) - callback(_dhx_msg_cfg, true); - if (code == 27) - callback(_dhx_msg_cfg, false); - } - if (e.preventDefault) - e.preventDefault(); - return !(e.cancelBubble = true); - } - } - if (document.attachEvent) - document.attachEvent("onkeydown", modal_key); - else - document.addEventListener("keydown", modal_key, true); - - function modality(mode){ - if(!modality.cover){ - modality.cover = document.createElement("DIV"); - //necessary for IE only - modality.cover.onkeydown = modal_key; - modality.cover.className = "dhx_modal_cover"; - document.body.appendChild(modality.cover); - } - var height = document.body.scrollHeight; - modality.cover.style.display = mode?"inline-block":"none"; - } - - function button(text, result){ - var button_css = "dhtmlx_"+text.toLowerCase().replace(/ /g, "_")+"_button"; // dhtmlx_ok_button, dhtmlx_click_me_button - return "<div class='dhtmlx_popup_button "+button_css+"' result='"+result+"' ><div>"+text+"</div></div>"; - } - - function info(text){ - if (!t.area){ - t.area = document.createElement("DIV"); - t.area.className = "dhtmlx_message_area"; - t.area.style[t.position]="5px"; - document.body.appendChild(t.area); - } - - t.hide(text.id); - var message = document.createElement("DIV"); - message.innerHTML = "<div>"+text.text+"</div>"; - //message.className = "dhtmlx-info dhtmlx-" + text.type; - message.className = "dhtmlx-message dhtmlx-" + text.type; // HOSEK - message.onclick = function(){ - t.hide(text.id); - text = null; - }; - - if (t.position == "bottom" && t.area.firstChild) - t.area.insertBefore(message,t.area.firstChild); - else - t.area.appendChild(message); - - if (text.expire > 0) - t.timers[text.id]=window.setTimeout(function(){ - t.hide(text.id); - }, text.expire); - - t.pull[text.id] = message; - message = null; - - return text.id; - } - function _boxStructure(config, ok, cancel){ - var box = document.createElement("DIV"); - box.className = " dhtmlx_modal_box dhtmlx-"+config.type; - box.setAttribute("dhxbox", 1); - - var inner = ''; - - if (config.width) - box.style.width = config.width; - if (config.height) - box.style.height = config.height; - if (config.title) - inner+='<div class="dhtmlx_popup_title">'+config.title+'</div>'; - inner+='<div class="dhtmlx_popup_text"><span>'+(config.content?'':config.text)+'</span></div><div class="dhtmlx_popup_controls">'; - if (ok) - inner += button(config.ok || "OK", true); - if (cancel) - inner += button(config.cancel || "Cancel", false); - if (config.buttons){ - for (var i=0; i<config.buttons.length; i++) - inner += button(config.buttons[i],i); - } - inner += '</div>'; - box.innerHTML = inner; - - if (config.content){ - var node = config.content; - if (typeof node == "string") - node = document.getElementById(node); - if (node.style.display == 'none') - node.style.display = ""; - box.childNodes[config.title?1:0].appendChild(node); - } - - box.onclick = function(e){ - e = e ||event; - var source = e.target || e.srcElement; - if (!source.className) source = source.parentNode; - if (source.className.split(" ")[0] == "dhtmlx_popup_button"){ - var result = source.getAttribute("result"); - result = (result == "true")||(result == "false"?false:result); - callback(config, result); - } - }; - config.box = box; - if (ok||cancel) - _dhx_msg_cfg = config; - - return box; - } - function _createBox(config, ok, cancel){ - var box = config.tagName ? config : _boxStructure(config, ok, cancel); - - if (!config.hidden) - modality(true); - document.body.appendChild(box); - var x = Math.abs(Math.floor(((window.innerWidth||document.documentElement.offsetWidth) - box.offsetWidth)/2)); - var y = Math.abs(Math.floor(((window.innerHeight||document.documentElement.offsetHeight) - box.offsetHeight)/2)); - if (config.position == "top") - box.style.top = "-3px"; - else - box.style.top = y+'px'; - box.style.left = x+'px'; - //necessary for IE only - box.onkeydown = modal_key; - - box.focus(); - if (config.hidden) - dhtmlx.modalbox.hide(box); - - return box; - } - - function alertPopup(config){ - return _createBox(config, true, false); - } - function confirmPopup(config){ - return _createBox(config, true, true); - } - function boxPopup(config){ - return _createBox(config); - } - function box_params(text, type, callback){ - if (typeof text != "object"){ - if (typeof type == "function"){ - callback = type; - type = ""; - } - text = {text:text, type:type, callback:callback }; - } - return text; - } - function params(text, type, expire, id){ - if (typeof text != "object") - text = {text:text, type:type, expire:expire, id:id}; - text.id = text.id||t.uid(); - text.expire = text.expire||t.expire; - return text; - } - dhtmlx.alert = function(){ - var text = box_params.apply(this, arguments); - text.type = text.type || "confirm"; - return alertPopup(text); - }; - dhtmlx.confirm = function(){ - var text = box_params.apply(this, arguments); - text.type = text.type || "alert"; - return confirmPopup(text); - }; - dhtmlx.modalbox = function(){ - var text = box_params.apply(this, arguments); - text.type = text.type || "alert"; - return boxPopup(text); - }; - dhtmlx.modalbox.hide = function(node){ - while (node && node.getAttribute && !node.getAttribute("dhxbox")) - node = node.parentNode; - if (node){ - node.parentNode.removeChild(node); - modality(false); - } - }; - var t = dhtmlx.message = function(text, type, expire, id){ - text = params.apply(this, arguments); - text.type = text.type||"info"; - - var subtype = text.type.split("-")[0]; - switch (subtype){ - case "alert": - return alertPopup(text); - case "confirm": - return confirmPopup(text); - case "modalbox": - return boxPopup(text); - default: - return info(text); - } - }; - - t.seed = (new Date()).valueOf(); - t.uid = function(){return t.seed++;}; - t.expire = 4000; - t.keyboard = true; - t.position = "top"; - t.pull = {}; - t.timers = {}; - - t.hideAll = function(){ - for (var key in t.pull) - t.hide(key); - }; - t.hide = function(id){ - var obj = t.pull[id]; - if (obj && obj.parentNode){ - window.setTimeout(function(){ - obj.parentNode.removeChild(obj); - obj = null; - },2000); - obj.className+=" hidden"; - - if(t.timers[id]) - window.clearTimeout(t.timers[id]); - delete t.pull[id]; - } - }; -})(); -gantt = { - version:"3.2.1" -}; - -/*jsl:ignore*/ -//import from dhtmlxcommon.js - -function dhtmlxDetachEvent(el, event, handler){ - if (el.removeEventListener) - el.removeEventListener(event, handler, false); - - else if (el.detachEvent) - el.detachEvent("on"+event, handler); -} - - -/** Overrides event functionality. - * Includes all default methods from dhtmlx.common but adds _silentStart, _silendEnd - * @desc: - * @type: private - */ -dhtmlxEventable=function(obj){ - obj._silent_mode = false; - obj._silentStart = function() { - this._silent_mode = true; - }; - obj._silentEnd = function() { - this._silent_mode = false; - }; - obj.attachEvent=function(name, catcher, callObj){ - name='ev_'+name.toLowerCase(); - if (!this[name]) - this[name]=new this._eventCatcher(callObj||this); - - return(name+':'+this[name].addEvent(catcher)); //return ID (event name & event ID) - }; - obj.callEvent=function(name, arg0){ - if (this._silent_mode) return true; - name='ev_'+name.toLowerCase(); - if (this[name]) - return this[name].apply(this, arg0); - return true; - }; - obj.checkEvent=function(name){ - return (!!this['ev_'+name.toLowerCase()]); - }; - obj._eventCatcher=function(obj){ - var dhx_catch = []; - var z = function(){ - var res = true; - for (var i = 0; i < dhx_catch.length; i++){ - if (dhx_catch[i]){ - var zr = dhx_catch[i].apply(obj, arguments); - res=res&&zr; - } - } - return res; - }; - z.addEvent=function(ev){ - if (typeof (ev) != "function") - ev=eval(ev); - if (ev) - return dhx_catch.push(ev)-1; - return false; - }; - z.removeEvent=function(id){ - dhx_catch[id]=null; - }; - return z; - }; - obj.detachEvent=function(id){ - if (id){ - var list = id.split(':'); //get EventName and ID - this[list[0]].removeEvent(list[1]); //remove event - } - }; - obj.detachAllEvents = function(){ - for (var name in this){ - if (name.indexOf("ev_") === 0) - delete this[name]; - } - }; - obj = null; -}; - - -/*jsl:end*/ - -dhtmlx.copy = function (object) { - var i, t, result; // iterator, types array, result - - if (object && typeof object === "object") { - result = {}; - t = [Array, Date, Number, String, Boolean]; - for (i = 0; i < t.length; i++) { - if (object instanceof t[i]) - result = i ? new t[i](object) : new t[i](); // first one is array - } - if(moment.isMoment(object)){ - result = moment(object); - result._isEndDate = object._isEndDate; - return result; - } - for (i in object) { - // HOSEK V - if (i === "model" || i === "widget" || i === "columns" ) { - continue; - //result[i]=object[i]; - } - // HOSEK A - if (Object.prototype.hasOwnProperty.apply(object, [i])) { - result[i] = dhtmlx.copy(object[i]); - } - } - } - return result || object; -}; - -dhtmlx.mixin = function(target, source, force){ - for (var f in source) - if ((!target[f] || force)) target[f]=source[f]; - return target; -}; - - -dhtmlx.defined = function(obj) { - return typeof(obj) != "undefined"; -}; - -dhtmlx.uid = function() { - if (!this._seed) - this._seed = gantt.date.now().valueOf(); - - this._seed++; - return this._seed; -}; - - -//creates function with specified "this" pointer -dhtmlx.bind=function(functor, object){ - if(functor.bind) - return functor.bind(object); - else - return function(){ return functor.apply(object,arguments); }; -}; - - -//returns position of html element on the page -gantt._get_position = function(elem) { - var top=0, left=0; - if (elem.getBoundingClientRect) { //HTML5 method - var box = elem.getBoundingClientRect(); - var body = document.body; - var docElem = document.documentElement; - var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop; - var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft; - var clientTop = docElem.clientTop || body.clientTop || 0; - var clientLeft = docElem.clientLeft || body.clientLeft || 0; - top = box.top + scrollTop - clientTop; - left = box.left + scrollLeft - clientLeft; - return { y: Math.round(top), x: Math.round(left), width:elem.offsetWidth, height:elem.offsetHeight }; - } else { //fallback to naive approach - while(elem) { - top = top + parseInt(elem.offsetTop,10); - left = left + parseInt(elem.offsetLeft,10); - elem = elem.offsetParent; - } - return { y: top, x: left, width:elem.offsetWidth, height: elem.offsetHeight}; - } -}; - - -gantt._detectScrollSize = function(){ - var div = document.createElement("div"); - div.style.cssText="visibility:hidden;position:absolute;left:-1000px;width:100px;padding:0px;margin:0px;height:110px;min-height:100px;overflow-y:scroll;"; - - document.body.appendChild(div); - var width = div.offsetWidth-div.clientWidth; - document.body.removeChild(div); - - return width; -}; - -if (window.dhtmlx){ - - if (!dhtmlx.attaches) - dhtmlx.attaches = {}; - - dhtmlx.attaches.attachGantt=function(start, end, gantt){ - var obj = document.createElement("DIV"); - obj.id = "gantt_"+dhtmlx.uid(); - obj.style.width = "100%"; - obj.style.height = "100%"; - obj.cmp = "grid"; - gantt = gantt || window.gantt; - document.body.appendChild(obj); - this.attachObject(obj.id); - - var that = this.vs[this.av]; - that.grid = gantt; - - gantt.init(obj.id, start, end); - obj.firstChild.style.border = "none"; - - that.gridId = obj.id; - that.gridObj = obj; - - var method_name="_viewRestore"; - return this.vs[this[method_name]()].grid; - }; - -} -if (typeof(window.dhtmlXCellObject) != "undefined") { - - dhtmlXCellObject.prototype.attachGantt=function(start, end, gantt){ - var obj = document.createElement("DIV"); - obj.id = "gantt_"+dhtmlx.uid(); - obj.style.width = "100%"; - obj.style.height = "100%"; - obj.cmp = "grid"; - - document.body.appendChild(obj); - this.attachObject(obj.id); - gantt = gantt || window.gantt; - gantt.init(obj.id, start, end); - obj.firstChild.style.border = "none"; - var method_name="_viewRestore"; - obj = null; - this.callEvent("_onContentAttach",[]); - - return this.dataObj; - }; - -} - - -dhtmlxEventable(gantt); - -//dhx4.ajax.cache = true; - -gantt._click = {}; -gantt._dbl_click = {}; -gantt._context_menu = {}; -gantt._on_click = function(e) { - e = e || window.event; - var trg = e.target || e.srcElement; - var id = gantt.locate(e); - - var res = true; - if (id !== null){ - res = !gantt.checkEvent("onTaskClick") || gantt.callEvent("onTaskClick", [id, e]); - }else{ - res = gantt.callEvent("onEmptyClick", [e]); - } - - if(res){ - var default_action = gantt._find_ev_handler(e, trg, gantt._click, id); - if(!default_action) - return; - - if(id && gantt.getTask(id) && gantt.config.select_task){ - if(gantt._selected_task == id){ - gantt.unselectTask(); - }else{ - gantt.selectTask(id); - } - } - } - -}; -gantt._on_contextmenu = function(e){ - e = e || window.event; - var src = e.target||e.srcElement, - taskId = gantt.locate(src), - linkId = gantt.locate(src, gantt.config.link_attribute); - - var res = !gantt.checkEvent("onContextMenu") || gantt.callEvent("onContextMenu", [taskId, linkId, e]); - if(!res){ - if(e.preventDefault) - e.preventDefault(); - else - e.returnValue = false; - } - return res; -}; -gantt._find_ev_handler = function(e, trg, hash, id){ - var res = true; - while (trg){ - var css = trg.className || ""; - if (typeof(css) === "string") { - css = css.split(" "); - for (var i = 0; i < css.length; i++) { - if (!css[i]) continue; - if (hash[css[i]]){ - var handler = hash[css[i]].call(gantt, e, id, trg); - res = res && !(typeof handler != "undefined" && handler !== true); - } - } - } - trg=trg.parentNode; - } - return res; -}; -gantt._on_dblclick = function(e) { - e = e || window.event; - var trg = e.target || e.srcElement; - var id = gantt.locate(e); - var res = !gantt.checkEvent("onTaskDblClick") || gantt.callEvent("onTaskDblClick", [id, e]); - if(res){ - var default_action = gantt._find_ev_handler(e, trg, gantt._dbl_click, id); - if(!default_action) - return; - - if (id !== null && gantt.getTask(id)){ - if(res && gantt.config.details_on_dblclick){ - gantt.showLightbox(id); - } - } - } -}; - -gantt._on_mousemove = function(e){ - if (gantt.checkEvent("onMouseMove")){ - var id = gantt.locate(e); - gantt._last_move_event = e; - gantt.callEvent("onMouseMove", [id,e]); - } -}; -function dhtmlxDnD(obj, config) { - if(config){ - this._settings = config; - } - //if($("#gantt_markers").length===0){ - // $("body").append($("<div id='gantt_markers' ></div>")); - //} - dhtmlxEventable(this); - dhtmlxEvent(obj, "mousedown", dhtmlx.bind(function(e) { - config.original_target = {target : e.target || e.srcElement}; - this.dragStart(obj, e); - }, this)); - -} -dhtmlxDnD.prototype = { - dragStart: function(obj, e) { - this.config = { - obj: obj, - marker: null, - started: false, - pos: this.getPosition(e), - sensitivity: 4, - offset:$(obj).offset() - }; - if(this._settings) - dhtmlx.mixin(this.config, this._settings, true); - e.preventDefault(); - - var mousemove = dhtmlx.bind(function(e) { return this.dragMove(obj, e); }, this); - var scroll = dhtmlx.bind(function(e) { return this.dragScroll(obj, e); }, this); - var limitation = false; - var limited_mousemove = dhtmlx.bind(function(e) { - //if(dhtmlx.defined(this.config.updates_per_second)){ - // if(!gantt._checkTimeout(this, this.config.updates_per_second)) - // return true; - //} - if(limitation) return; - limitation = true; - var res = mousemove(e); - limitation = false; - return res; - }, this); - - var mouseup = dhtmlx.bind(function(e) { - dhtmlxDetachEvent(document.body, "mousemove", limited_mousemove); - dhtmlxDetachEvent(document.body, "mouseup", mouseup); - return this.dragEnd(obj); - }, this); - // initialize dnd marker - if(this.config.marker){ - var marker = this.config.marker = document.createElement("div"); - marker.className = "gantt_drag_marker"; - //marker.innerHTML = "Dragging object"; - document.body.appendChild(marker); - //$("#gantt_markers")[0].appendChild(marker); - //obj.appendChild(marker); - } - e.pos = this.getPosition(e); - this.actPos= e.pos; // HOSEK - dhtmlxEvent(document.body, "mousemove", limited_mousemove); - dhtmlxEvent(document.body, "mouseup", mouseup); - // document.body.className += " gantt_noselect"; - this.callEvent("onDragStart", [obj,e]); - }, - dragMove: function(obj, e) { - if (/*!this.config.marker &&*/ !this.config.started) { - var pos = this.getPosition(e); - var diff_x = pos.x - this.config.pos.x; - var diff_y = pos.y - this.config.pos.y; - var distance = Math.sqrt(Math.pow(Math.abs(diff_x), 2) + Math.pow(Math.abs(diff_y), 2)); - - if (distance > this.config.sensitivity) { - // real drag starts here, - // when user moves mouse at first time after onmousedown - /*if(this.config.started){ - return; - }*/ - this.config.started = true; - this.config.ignore = false; - if (this.callEvent("onBeforeDragStart", [obj, this.config.original_target]) === false) { - this.config.ignore = true; - return true; - } - this.callEvent("onAfterDragStart", [obj, this.config.original_target]); - } else - this.config.ignore = true; - } - if (!this.config.ignore) { - e.pos = this.getPosition(e); - this.actPos= e.pos; // HOSEK - if(this.config.marker){ - this.config.marker.style.left = e.pos.x + "px"; - this.config.marker.style.top = e.pos.y + "px"; - } - this.callEvent("onDragMove", [obj,e]); - } - }, - - dragEnd: function(obj) { - if (this.config.marker) { - this.destroyMarker(); - } - if(this.config.started&&!this.config.ignore){ - this.callEvent("onDragEnd", []); - } - // document.body.className = document.body.className.replace(" gantt_noselect", ""); - }, - getDiff: function(e){ - //var pos=this.getPosition(e); - return {x:(this.actPos.x-this.config.pos.x),y:(this.actPos.y-this.config.pos.y)}; - }, - getPosition: function(e) { - var x = 0, y = 0; - e = e || window.event; - if (e.pageX || e.pageY) { - x = e.pageX; - y = e.pageY; - } else if (e.clientX || e.clientY) { - x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; - y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; - } - return { x:x, y:y }; - }, - destroyMarker:function(){ - this.config.marker.parentNode.removeChild(this.config.marker); - this.config.marker = null; - }, - getRelativePos:function(){ - return {x:(this.actPos.x-this.config.offset.left),y:(this.actPos.y-this.config.offset.top)} - } -}; -gantt._init_grid = function () { - this._click.gantt_close = dhtmlx.bind(function (e, id, trg) { - this.close(id); - return false; - }, this); - this._click.gantt_open = dhtmlx.bind(function (e, id, trg) { - this.open(id); - return false; - }, this); - - - this._click.gantt_row = dhtmlx.bind(function (e, id, trg) { - if (id !== null) { - var task = this.getTask(id); - //if(this.config.scroll_on_click) - // this.showDate(task.start_date); - this.callEvent("onTaskRowClick", [id, trg]); - } - }, this); - - this._click.gantt_grid_head_cell = dhtmlx.bind(function (e, id, trg) { - var column = trg.getAttribute("column_id"); - - if (!this.callEvent("onGridHeaderClick", [column, e])) - return; - - if (column == "add") { - this._click.gantt_add(e, this.config.root_id); - } else if (this.config.sort) { - var sort = (this._sort && this._sort.direction && this._sort.name == column) ? this._sort.direction : "desc"; - // invert sort direction - sort = (sort == "desc") ? "asc" : "desc"; - this._sort = { - name: column, - direction: sort - }; - this.sort(column, sort == "desc"); - } - }, this); - - if (!this.config.sort && (this.config.order_branch || this.config.rearrange_branch)) { - this._init_dnd(this.config.rearrange_branch); - } - - this._click.gantt_add = dhtmlx.bind(function (e, id, trg) { - if (this.config.readonly) return; - - var item = { }; - this.createTask(item, id ? id : this.config.root_id); - - return false; - }, this); - - if(this._init_resize){ - this._init_resize(); - } - -}; - -gantt._render_grid = function () { - if (this._is_grid_visible()) { - this._calc_grid_width(); - this._render_grid_header(); - } -}; - -gantt._calc_grid_width = function () { - var columns = this.getGridColumns(); - var cols_width = 0; - var unknown = []; - var width = []; - - for (var i = 0; i < columns.length; i++) { - var v = parseInt(columns[i].width, 10); - if (window.isNaN(v)) { - v = 50; - unknown.push(i); - } - width[i] = v; - cols_width += v; - } - - if (this.config.autofit || unknown.length) { - var diff = this._get_grid_width() - cols_width; - // TODO: logic may be improved for proportional changing of width - var step = diff / (unknown.length > 0 ? unknown.length : (width.length > 0 ? width.length : 1)); - if (unknown.length > 0) { - // there are several columns with undefined width - var delta = diff / (unknown.length ? unknown.length : 1); - for (var i = 0; i < unknown.length; i++) { - var index = unknown[i]; - width[index] += delta; - } - } else { - // delta must be added for all columns - var delta = diff / (width.length ? width.length : 1); - for (var i = 0; i < width.length; i++) - width[i] += delta; - } - - for (var i = 0; i < width.length; i++) { - columns[i].width = width[i]; - } - }else{ - this.config.grid_width = cols_width; - } -}; - -gantt._render_grid_header = function () { - var columns = this.getGridColumns(); - var cells = []; - var width = 0, - labels = this.locale.labels; - - var lineHeigth = this.config.scale_height - 2; - - for (var i = 0; i < columns.length; i++) { - var last = i == columns.length - 1; - var col = columns[i]; - if (last && this._get_grid_width() > width + col.width) - col.width = this._get_grid_width() - width; - width += col.width; - var sort = (this._sort && col.name == this._sort.name) ? ("<div class='gantt_sort gantt_" + this._sort.direction + "'></div>") : ""; - var cssClass = ["gantt_grid_head_cell", - ("gantt_grid_head_" + col.name), - (last ? "gantt_last_cell" : ""), - this.templates.grid_header_class(col.name, col)].join(" "); - - var style = "width:" + (col.width - (last ? 1 : 0)) + "px;"; - var label = (col.label || labels["column_" + col.name]); - label = label || ""; - var cell = "<div class='" + cssClass + "' style='" + style + "' column_id='" + col.name + "'>" + label + sort + "</div>"; - cells.push(cell); - } - this.$grid_scale.style.height = (this.config.scale_height - 1) + "px"; - this.$grid_scale.style.lineHeight = lineHeigth + "px"; - this.$grid_scale.style.width = (width - 1) + "px"; - this.$grid_scale.innerHTML = cells.join(""); -}; - - -gantt._render_grid_item = function (item) { - if (!gantt._is_grid_visible()) - return null; - if(!item.columns){ - return gantt._render_grid_superitem(item); - } - var columns = this.getGridColumns(); - var cells = []; - var width = 0; - for (var i = 0; i < columns.length; i++) { - var last = i == columns.length - 1; - var col = columns[i]; - var cell; - - var value; - if (col.name == "add") { - value = "<div class='gantt_add'></div>"; - } else { - if (col.template) - value = col.template(item); - else - value = item[col.name]; - - if (value instanceof Date) - value = this.templates.date_grid(value); - value = "<div class='gantt_tree_content'>" + value + "</div>"; - } - var css = "gantt_cell" +(col.css?" "+col.css:"")+ (last ? " gantt_last_cell" : ""); - - var tree = ""; - if (col.tree) { - for (var j = 0; j < item.$level; j++) - tree += this.templates.grid_indent(item); - - var has_child = this._has_children(item.id); - if (has_child) { - tree += this.templates.grid_open(item); - tree += this.templates.grid_folder(item); - } else { - tree += this.templates.grid_blank(item); - tree += this.templates.grid_file(item); - } - } - var style = "width:" + (col.width - (last ? 1 : 0)) + "px;"; - if (dhtmlx.defined(col.align)) - style += "text-align:" + col.align + ";"; - cell = "<div class='" + css + "' style='" + style + "'>" + tree + value + "</div>"; - cells.push(cell); - } - var css = item.$index % 2 === 0 ? " odd" : ""; - css += (item.$transparent) ? " gantt_transparent" : ""; - if (this.templates.grid_row_class) { - var css_template = this.templates.grid_row_class.call(this, item.start_date, item.end_date, item); - if (css_template) - css += " " + css_template; - } - - if (this.getState().selected_task == item.id) { - css += " gantt_selected"; - } - var el = document.createElement("div"); - el.className = "gantt_row" + css; - el.setAttribute("data-url","/issues/"+item.id+".json"); // HOSEK - el.style.height = this.config.row_height + "px"; - el.style.lineHeight = (gantt.config.row_height) + "px"; - el.setAttribute(this.config.task_attribute, item.id); - el.innerHTML = cells.join(""); - return el; -}; - - -gantt.open = function (id) { - if (this.callEvent("onBeforeTaskOpened", [id]) === false) return; - gantt._set_item_state(id, true); - this.callEvent("onTaskOpened", [id]); -}; -gantt.close = function (id) { - gantt._set_item_state(id, false); - this.callEvent("onTaskClosed", [id]); -}; -gantt._set_item_state = function (id, state) { - if (id && this._pull[id]) { - this._pull[id].$open = state; - this.refreshData(); - } -}; - -gantt._is_grid_visible = function () { - return (this.config.grid_width && this.config.show_grid); -}; -gantt._get_grid_width = function () { - if (this._is_grid_visible()) { - if (this._is_chart_visible()) { - return this.config.grid_width; - } else { - return this._x; - } - } else { - return 0; - } -}; -gantt.getTaskIndex = function (id) { - var branch = this.getChildren(this.getParent(id)); - for (var i = 0; i < branch.length; i++) - if (branch[i] == id) - return i; - - return -1; -}; -gantt.getGlobalTaskIndex = function (id) { - var branch = this._order; - for (var i = 0; i < branch.length; i++) - if (branch[i] == id) - return i; - - return -1; -}; -gantt.moveTask = function (sid, tindex, parent) { - ysy.log.debug("moveTask","move_task"); - //target id as 4th parameter - var id = arguments[3]; - if (id) { - if (id === sid) return; - - parent = this.getParent(id); - tindex = this.getTaskIndex(id); - } - if(sid == parent){ - return; - } - parent = parent || this.config.root_id; - var source = this.getTask(sid); - var source_pid = this.getParent(source.id); - var sbranch = this.getChildren(this.getParent(source.id)); - - var tbranch = this.getChildren(parent); - if (tindex == -1) - tindex = tbranch.length + 1; - if (source_pid == parent) { - var sindex = this.getTaskIndex(sid); - if (sindex == tindex) return; - } - - - /* - prevent moving to another sub-branch: - - gantt.attachEvent("onBeforeTaskMove", function(id, parent, tindex){ - var task = gantt.getTask(id); - if(task.parent != parent) - return false; - return true; - }); - */ - if(this.callEvent("onBeforeTaskMove", [sid, parent, tindex]) === false) - return; - - this._replace_branch_child(source_pid, sid); - tbranch = this.getChildren(parent); - - var tid = tbranch[tindex]; - if (!tid) //adding as last element - tbranch.push(sid); - else - tbranch = tbranch.slice(0, tindex).concat([ sid ]).concat(tbranch.slice(tindex)); - - this.setParent(source, parent); - this._branches[parent] = tbranch; - - var childTree = this._getTaskTree(sid); - for(var i = 0; i < childTree.length; i++){ - var item = this._pull[childTree[i]]; - if(item) - item.$level = this.calculateTaskLevel(item); - } - - if(tindex*1 > 0){ - if(id){ - source.$drop_target = (this.getTaskIndex(sid) > this.getTaskIndex(id) ? "next:" : '') + id; - }else{ - source.$drop_target = "next:" + gantt.getPrevSibling(sid); - } - }else if(tbranch[tindex*1 + 1]){ - source.$drop_target = tbranch[tindex*1 + 1]; - }else{ - source.$drop_target = parent; - } - - if(!this.callEvent("onAfterTaskMove", [sid, parent, tindex])) - return; - source.$level = gantt.calculateTaskLevel(source); - this.refreshData(); - -}; - -gantt._init_dnd = function (rearrange) { - var dnd = new dhtmlxDnD(this.$grid_data, {marker:true,updates_per_second: 60}); - if (dhtmlx.defined(this.config.dnd_sensitivity)) - dnd.config.sensitivity = this.config.dnd_sensitivity; - - dnd.attachEvent("onBeforeDragStart", dhtmlx.bind(function (obj, e) { - var target = e.target; - ysy.log.debug("Grid onBeforeDragStart "+target.className,"move_task"); - if(!$(target).hasClass("gantt_drag_handle")){ - return false; - } - var el = this._locateHTML(e); - if (!el) return false; - if (this.hideQuickInfo) this._hideQuickInfo(); - - var id = this.locate(e); - - var task = gantt.getTask(id); - - if(gantt._is_readonly(task)) - return false; - if(task.type===gantt.config.types.milestone){ - return false; - } - - dnd.config.initial_open_state = task.$open; - if (!this.callEvent("onRowDragStart", [id, e.target || e.srcElement, e])) { - return false; - } - - }, this)); - - dnd.attachEvent("onAfterDragStart", dhtmlx.bind(function (obj, e) { - var el = this._locateHTML(e); - ysy.log.debug("Grid onAfterDragStart "+e.target.className,"move_task"); - dnd.config.marker.innerHTML = el.outerHTML; - dnd.config.id = this.locate(e); - var task = this.getTask(dnd.config.id); - dnd.config.index = this.getTaskIndex(dnd.config.id); - dnd.config.parent = task.parent; - task.$open = false; - task.$transparent = true; - //this.refreshData(); - }, this)); - - - dnd.lastTaskOfLevel = function (level) { - var ids = gantt._order, - pull = gantt._pull, - last_item = null; - for (var i = 0, len = ids.length; i < len; i++) { - if (pull[ids[i]].$level == level) { - last_item = pull[ids[i]]; - } - } - return last_item ? last_item.id : null; - }; - dnd._getGridPos = dhtmlx.bind( function(e){ - var pos = this._get_position(this.$grid_data); - - // row offset - var x = pos.x; - var y = e.pos.y - 10; - - // prevent moving row out of grid_data container - if (y < pos.y) y = pos.y; - if (y > pos.y + this.$grid_data.offsetHeight - this.config.row_height) y = pos.y + this.$grid_data.offsetHeight - this.config.row_height; - - pos.x = x; - pos.y = y; - return pos; - }, this); - dnd.attachEvent("onDragMove", dhtmlx.bind(function (obj, e) { - ysy.log.debug("Grid onDragMove","move_task"); - var dd = dnd.config; - var pos = dnd._getGridPos(e); - - // setting position of row - dd.marker.style.left = pos.x + 10 + "px"; - dd.marker.style.top = pos.y + "px"; - - //previous action might cause page scroll appear thus change position of the gantt, need to recalculate - pos = dnd._getGridPos(e); - - var x = pos.x, - y = pos.y; - - // highlight row when mouseover - var $window = $(window); - //var target = document.elementFromPoint(pos.x - document.body.scrollLeft + 1, y - document.body.scrollTop+9); - var target = document.elementFromPoint(pos.x - $window.scrollLeft() + 1, y - $window.scrollTop()+9); - var el = this.locate(target); - - var item = this.getTask(dnd.config.id); - if (!this.isTaskExists(el)) { - el = dnd.lastTaskOfLevel(item.$level); - if (el == dnd.config.id) { - el = null; - } - } - - if (this.isTaskExists(el)) { - var box = gantt._get_position(target); - var over = this.getTask(el); - - if(rearrange){ // HOSEK - ysy.log.debug("over="+over.id+" "+over.text,"sort_over"); - if(dnd.config.over!==over){ - dnd.config.over=over; - $(target).closest(".gantt_grid_data").find(".gantt_drag_hover").removeClass("gantt_drag_hover"); - $(target).closest(".gantt_row").addClass("gantt_drag_hover"); - } - return true; - } // HOSEK - - if (box.y + target.offsetHeight / 2 < y) { - //hovering over bottom part of item, check can be drop to bottom - var index = this.getGlobalTaskIndex(over.id); - var next = this._pull[this._order[index + 1]]; //adds +1 when hovering over placeholder - if (next) { - if (next.id != item.id) - over = next; //there is a valid target - else - return; - } else { - //we at end of the list, check and drop at the end of list - next = this._pull[this._order[index]]; - if (next.$level == item.$level && next.id != item.id) { - this.moveTask(item.id, -1, this.getParent(next.id)); - - return; - } - } - } - //if item is on different level, check the one before it - var index = this.getGlobalTaskIndex(over.id), - prev = this._pull[this._order[index-1]]; - - var shift = 1; - while((!prev || prev.id == over.id) && index - shift >= 0){ - prev = this._pull[this._order[index-shift]]; - shift++; - } - - if (item.id == over.id) return; - //replacing item under cursor - if (over.$level == item.$level && item.id != over.id) { - this.moveTask(item.id, 0, 0, over.id); - - }else if(over.$level == item.$level - 1 && !gantt.getChildren(over.id).length){ - this.moveTask(item.id, 0, over.id); - - } else if(prev && (prev.$level == item.$level) && (item.id != prev.id)){ - this.moveTask(item.id, -1, this.getParent(prev.id)); - - } - } - return true; - }, this)); - - - dnd.attachEvent("onDragEnd", dhtmlx.bind(function () { - ysy.log.debug("Grid onDragEnd","move_task"); - //if(!dnd.config.started){return;} - var task = this.getTask(dnd.config.id); - if(this.callEvent("onBeforeRowDragEnd",[dnd.config.id, dnd.config.parent, dnd.config.index]) === false) { - this.moveTask(dnd.config.id, dnd.config.index, dnd.config.parent); - task.$drop_target = null; - }else{ - if(rearrange){ // HOSEK - var over=dnd.config.over; - var allowed = gantt.allowedParent(task,over); - while(!allowed){ - if(over.real_id>1000000000000){ - dhtmlx.message(ysy.view.getLabel("errors2","unsaved_parent"),"error"); - over = null; - break; - } - var parentID = over.parent; - if(parentID === 0){ - over = null; - break; - } - over = gantt.getTask(parentID); - allowed = gantt.allowedParent(task,over); - } - if(over){ - if(this.callEvent("onBeforeTaskMove", [task.id, over.id, 0]) === false) - return; - //this.moveTask(task.id, -1, over.id); - task.$drop_target = null; - //task.widget.update(task,["fixed_version_id"]); - gantt.silentMoveTask(task, over.id); - this.callEvent("onAfterTaskMove", [task.id, over.id, 0]); - task.widget.update(task); - } - } // HOSEK - this.callEvent("onRowDragEnd", [dnd.config.id, task.$drop_target]); - } - - task.$transparent = false; - task.$open = dnd.config.initial_open_state; - this.refreshData(); - - }, this)); -}; - -/* will be overwriten in order to provide hide/show column functionality in some editions */ -gantt.getGridColumns = function () { - return this.config.columns; -}; - - -gantt._has_children = function(id){ - return this.getChildren(id).length > 0; -}; -// --#include core/grid_resize.js -// --#include core/dynamic_loading.js -// --#include core/grid_column_api.js - -gantt._scale_helpers = { - getSum : function(sizes, from, to){ - if(to === undefined) - to = sizes.length - 1; - if(from === undefined) - from = 0; - - var summ = 0; - for(var i=from; i <= to; i++) - summ += sizes[i]; - - return summ; - }, - setSumWidth : function(sum_width, scale, from, to){ - var parts = scale.width; - - if(to === undefined) - to = parts.length - 1; - if(from === undefined) - from = 0; - var length = to - from + 1; - - if(from > parts.length - 1 || length <= 0 || to > parts.length - 1) - return; - - var oldWidth = this.getSum(parts, from, to); - - var diff = sum_width - oldWidth; - - this.adjustSize(diff, parts, from, to); - this.adjustSize(- diff, parts, to + 1); - - scale.full_width = this.getSum(parts); - }, - splitSize : function(width, count){ - var arr = []; - for(var i=0; i < count; i++) arr[i] = 0; - - this.adjustSize(width, arr); - return arr; - - }, - adjustSize : function(width, parts, from, to){ - if(!from) - from = 0; - if(to === undefined) - to = parts.length - 1; - - var length = to - from + 1; - - var full = this.getSum(parts, from, to); - - var shared = 0; - - for(var i = from; i <= to; i++){ - var share = Math.floor(width*(full ? (parts[i]/full) : (1/length))); - - full -= parts[i]; - width -= share; - length--; - - parts[i] += share; - shared += share; - } - parts[parts.length - 1] += width; - //parts[parts.length - 1] += width - shared; - }, - // HOSEK V - sortScales : function(scales){ - scales.sort(function(a, b){ - var durA=moment.duration(a.step,a.unit+"s"); - var durB=moment.duration(b.step,b.unit+"s") - if(durA < durB){ - return 1; - }else if(durA > durB){ - return -1; - }else{ - return 0; - } - }); - }, - primaryScale : function(){ - - gantt._init_template("date_scale"); - - return { - unit: gantt.config.scale_unit, - step: gantt.config.step, - template : gantt.templates.date_scale, - date : gantt.config.date_scale, - css: gantt.templates.scale_cell_class - }; - }, - - prepareConfigs : function(scales, min_coll_width, container_width, scale_height){ - var heights = this.splitSize(scale_height, scales.length); - var full_width = container_width; - - var configs = []; - for(var i=scales.length-1; i >= 0; i--){ - var main_scale = (i == scales.length - 1); - var cfg = this.initScaleConfig(scales[i]); - if(main_scale){ - this.processIgnores(cfg); - } - - this.initColSizes(cfg, min_coll_width, full_width, heights[i]); - this.limitVisibleRange(cfg); - - if(main_scale){ - full_width = cfg.full_width; - } - - configs.unshift(cfg); - } - - - for( var i =0; i < configs.length-1; i++){ - this.alineScaleColumns(configs[configs.length-1], configs[i]); - } - for(var i = 0; i < configs.length; i++){ - this.setPosSettings(configs[i]); - } - return configs; - - }, - setPosSettings: function(config){ - for(var i = 0, len = config.trace_x.length; i < len; i++){ - config.left.push((config.width[i - 1] || 0) + (config.left[i - 1] || 0)); - } - }, - - _ignore_time_config : function(date){ - if(this.config.skip_off_time){ - return !this.isWorkTime(date); - } - return false; - }, - //defined in an extension - processIgnores : function(config){ - config.ignore_x = {}; - config.display_count = config.count; - }, - initColSizes : function(config, min_col_width, full_width, line_height){ - var cont_width = full_width; - - config.height = line_height; - - var column_count = config.display_count === undefined ? config.count : config.display_count; - - if(!column_count) - column_count = 1; - - config.col_width = Math.floor(cont_width/column_count); - - if(min_col_width){ - if (config.col_width < min_col_width){ - config.col_width = min_col_width; - cont_width = config.col_width * column_count; - } - } - config.width = []; - var ignores = config.ignore_x || {}; - for(var i =0; i < config.trace_x.length; i++){ - if(ignores[config.trace_x[i].valueOf()] || (config.display_count == config.count)){ - config.width[i] = 0; - }else{ - config.width[i] = 1; - } - } - - this.adjustSize(cont_width - this.getSum(config.width)/* 1 width per column from the code above */, config.width); - config.full_width = this.getSum(config.width); - }, - initScaleConfig : function(config){ - var cfg = dhtmlx.mixin({ - count:0, - col_width:0, - full_width:0, - height:0, - width:[], - left:[], - trace_x:[], - date_cache:{} - }, config); - - this.eachColumn(config.unit, config.step, function(date){ - cfg.count++; - var dateObj=gantt.date.Date(date); - cfg.trace_x.push(dateObj); - }); - - return cfg; - }, - iterateScales : function(lower_scale, upper_scale, from, to, callback){ - var upper_dates = upper_scale.trace_x; - var lower_dates = lower_scale.trace_x; - - var prev = from || 0; - var end = to || (lower_dates.length - 1); - var prevUpper = 0; - for(var up=1; up < upper_dates.length; up++){ - for(var next=prev; next <= end; next++){ - if(+lower_dates[next] == +upper_dates[up]){ - if(callback){ - callback.apply(this, [prevUpper, up, prev, next]); - } - prev = next; - prevUpper = up; - continue; - } - } - } - }, - alineScaleColumns : function(lower_scale, upper_scale, from, to){ - this.iterateScales(lower_scale, upper_scale, from, to, function(upper_start, upper_end, lower_start, lower_end){ - var targetWidth = this.getSum(lower_scale.width, lower_start, lower_end - 1); - var actualWidth = this.getSum(upper_scale.width, upper_start, upper_end - 1); - if(actualWidth != targetWidth){ - this.setSumWidth(targetWidth, upper_scale, upper_start, upper_end - 1); - } - - }); - }, - - eachColumn : function(unit, step, callback){ - var start = gantt.date.Date(gantt._min_date), - end = gantt.date.Date(gantt._max_date); - if(gantt.date[unit + "_start"]){ - start = gantt.date[unit + "_start"](start); - } - - var curr = moment(start).toDate(); - if(+curr >= +end){ - end = gantt.date.add(curr, step, unit); - } - while(+curr < +end){ - callback.call(this, gantt.date.Date(curr)); - var tzOffset = curr.getTimezoneOffset(); - curr = gantt.date.add(curr, step, unit); - curr = gantt._correct_dst_change(curr, tzOffset, step, unit); - if(gantt.date[unit + '_start']) - curr = gantt.date[unit + "_start"](curr); - } - }, - limitVisibleRange : function(cfg){ - var dates = cfg.trace_x; - - var left = 0, right = cfg.width.length-1; - var diff = 0; - if(+dates[0] < +gantt._min_date && left != right){ - var width = Math.floor(cfg.width[0] * ((dates[1] - gantt._min_date)/ (dates[1] - dates[0]))); - diff += cfg.width[0] - width; - cfg.width[0] = width; - - dates[0] = moment(gantt._min_date).toDate(); - } - - var last = dates.length - 1; - var lastDate = dates[last]; - var outDate = gantt.date.add(lastDate, cfg.step, cfg.unit); - if(+outDate > +gantt._max_date && last > 0){ - var width = cfg.width[last] - Math.floor(cfg.width[last] * ((outDate - gantt._max_date)/(outDate - lastDate))); - diff += cfg.width[last] - width; - cfg.width[last] = width; - } - - if(diff){ - var full = this.getSum(cfg.width); - var shared = 0; - for(var i =0; i < cfg.width.length; i++){ - var share = Math.floor(diff*(cfg.width[i]/full)); - cfg.width[i] += share; - shared += share; - } - this.adjustSize(diff - shared, cfg.width); - } - - } -}; -// --#include core/scales_ignore.js -gantt._tasks_dnd = { - drag : null, - _events:{ - before_start:{}, - before_finish:{}, - after_finish:{} - }, - _handlers:{}, - init:function(){ - this.clear_drag_state(); - var drag = gantt.config.drag_mode; - this.set_actions(); - - var evs = { - "before_start":"onBeforeTaskDrag", - "before_finish":"onBeforeTaskChanged", - "after_finish":"onAfterTaskDrag" - }; - //for now, all drag operations will trigger the same events - for(var stage in this._events){ - for(var mode in drag){ - this._events[stage][mode] = evs[stage]; - } - } - - this._handlers[drag.move] = this._handlers[drag.move] || this._move; - this._handlers[drag.resize] = this._handlers[drag.resize] || this._resize; - this._handlers[drag.progress] = this._handlers[drag.progress] || this._resize_progress; - - }, - set_actions:function(){ - var data = gantt.$task_data; - dhtmlxEvent(data, "mousemove", dhtmlx.bind(function(e){ - this.on_mouse_move(e||event); - }, this)); - dhtmlxEvent(data, "mousedown", dhtmlx.bind(function(e){ - this.on_mouse_down(e||event); - }, this)); - dhtmlxEvent(data, "mouseup", dhtmlx.bind(function(e){ - this.on_mouse_up(e||event); - }, this)); - }, - - clear_drag_state : function(){ - this.drag = { - id:null, - mode:null, - pos:null, - start_x:null, - start_y:null, - obj:null, - left:null, - last_event:null - }; - }, - _resize : function(ev, shift, drag){ - var cfg = gantt.config; - var coords_x = this._drag_task_coords(ev, drag); - if(drag.left){ - var old_start = ev.start_date; - var start_date = moment(gantt.dateFromPos(coords_x.start + shift.x)); - gantt.multiStop(ev, start_date); - ev.start_date = start_date; - if(!ev.start_date){ - ev.start_date = gantt.date.Date(gantt.getState().min_date); - } - }else{ - var old_end = ev.end_date; - var end_date = moment(gantt.dateFromPos(coords_x.end + shift.x)).subtract(1, "days"); - end_date._isEndDate = true; - gantt.multiStop(ev, undefined, end_date); - ev.end_date = end_date; - if(!ev.end_date){ - ev.end_date = gantt.date.Date(gantt.getState().max_date); - } - ev.end_date._isEndDate = true; // HOSEK < A - } - if (ev.end_date - ev.start_date < cfg.min_duration){ - if(drag.left) - ev.start_date = gantt.calculateEndDate(ev.end_date, -1); - else - ev.end_date = gantt.calculateEndDate(ev.start_date, 1); - } - if(drag.left){ - gantt.moveDesc(ev, ev.start_date.diff(old_start, "seconds"),null, 'left'); - }else{ - gantt.moveDesc(ev, ev.end_date.diff(old_end, "seconds"), null, 'right'); - } - //gantt.moveChildren(ev,ev.start_date.diff(old_start,"seconds")); - return; // HOSEK - gantt._init_task_timing(ev); - }, - _resize_progress:function(ev, shift, drag){ - var coords_x = this._drag_task_coords(ev, drag); - - var diff = Math.max(0, drag.pos.x - coords_x.start); - ev.progress = Math.min(1, diff / (coords_x.end - coords_x.start)); - }, - _move : function(ev, shift, drag){ - // TODO konce tasku - var coords_x = this._drag_task_coords(ev, drag); - if (ev.type==="milestone"){ - new_end = moment(gantt.dateFromPos(coords_x.start + shift.x)); - new_end = gantt._working_time_helper.get_closest_worktime({date:new_end, unit:"day", dir: 'any', length:1}); - new_end._isEndDate = true; - new_start = moment(new_end); - } else { - var new_start = gantt._working_time_helper.get_closest_worktime({ - date:moment(gantt.dateFromPos(coords_x.start + shift.x)), - dir:"future" - }); - var new_end = gantt._working_time_helper.add_worktime(new_start, ev.duration, "day", true); //< HOSEKP - } - if (!new_start.isValid() || !new_end.isValid()) { - debugger; - } - // console.log(new_start.format("DD.MM.YYYY HH:mm")+" "+new_end.format("DD.MM.YYYY HH:mm")); - gantt.multiStop(ev, new_start, new_end); - var old_start = ev.start_date; - if(!new_start){ - ev.start_date = gantt.date.Date(gantt.getState().min_date); - ev.end_date = gantt.dateFromPos(gantt.posFromDate(ev.start_date) + (coords_x.end - coords_x.start)); - }else if(!new_end){ - ev.end_date = gantt.date.Date(gantt.getState().max_date); - ev.start_date = gantt.dateFromPos(gantt.posFromDate(ev.end_date) - (coords_x.end - coords_x.start)); - }else{ - ev.start_date = new_start; - ev.end_date = new_end; - } - if (ev.type === "project") { - ev.maximal_start = null; - ev.minimal_end = null; - } else { - gantt.moveDesc(ev, {old_start: old_start}); - } - //console.log(new_start.toString()+" "+new_end.toString()); - }, - _drag_task_coords : function(t, drag){ - // TODO konce tasku - var start = drag.obj_s_x = drag.obj_s_x || gantt.posFromDate(t.start_date); - var end = drag.obj_e_x = drag.obj_e_x || gantt.posFromDate(t.end_date); - return { - start : start, - end : end - }; - }, - on_mouse_move : function(e){ - if(this.drag.start_drag) - this._start_dnd(e); - - var drag = this.drag; - - if (drag.mode){ - //if(!e.movementX && !e.movementY) return; - if(!drag.last_event){ - setTimeout($.proxy(this._update_on_move,this),5); - } - drag.last_event=e; - } - }, - _update_on_move : function(){ - var drag = this.drag; - - if (drag&&drag.mode){ - var e=drag.last_event; - if(!e) return; - drag.last_event = null; - var pos = gantt._get_mouse_pos(e); - if (drag.pos) { - if (drag.pos.x == pos.x - && drag.pos.y == pos.y) return; - } else { - if (Math.abs(drag.start_x - pos.x) < 10 - && Math.abs(drag.start_y - pos.y) < 10) return; - } - - drag.pos = pos; - // TODO konce tasku - //ysy.log.debug("pos.x="+pos.x,"task_drag"); - var curr_date = gantt.dateFromPos(pos.x); - if(!curr_date || isNaN( curr_date.getTime() )) - return; - - //ysy.log.debug(curr_date,"task_drag"); - var shift = {x:pos.x - drag.start_x,y:pos.y - drag.start_y}; - var ev = gantt.getTask(drag.id); - - - if(this._handlers[drag.mode]){ - var original = dhtmlx.mixin({}, ev); - var copy = dhtmlx.mixin({}, ev); - this._handlers[drag.mode].apply(this, [copy, shift, drag]); - dhtmlx.mixin(ev, copy, true); - //return; - //gantt._update_parents(gantt.getParent(drag.id),false); - gantt.callEvent("onTaskDrag", [ev.id, drag.mode, copy, original, e]); - //gantt.moveDesc(ev, ev.end_date); - //gantt.moveChildren(ev,ev.start_date.diff(original.start_date,"seconds")); - //gantt._update_parents(); - ev._changed = drag.mode; - - gantt.refreshTask(drag.id); - } - } - }, - - on_mouse_down : function(e, src){ - // on Mac we do not get onmouseup event when clicking right mouse button leaving us in dnd state - // let's ignore right mouse button then - if (e.button == 2) - return false; - - var id =gantt.locate(e); - var task = null; - if(gantt.isTaskExists(id)){ - task = gantt.getTask(id); - } - if(task==null){ // HOSEK < V - ysy.log.debug("No task under click","empty_field"); - this.clear_drag_state(); - return; - } // HOSEK A - if (gantt._is_readonly(task) || this.drag.mode) return false; - - this.clear_drag_state(); - - src = src||(e.target||e.srcElement); - - var className = gantt._trim(src.className || ""); - if(!className || !this._get_drag_mode(className)){ - if(src.parentNode) - return this.on_mouse_down(e, src.parentNode); - else - return false; - } - - var drag = this._get_drag_mode(className); - ysy.log.debug("drag.mode="+(drag?drag.mode:"null"),"empty_field"); - if(!drag){ - if (gantt.checkEvent("onMouseDown") && gantt.callEvent("onMouseDown", [className.split(" ")[0]])) { - if (src.parentNode) - return this.on_mouse_down(e,src.parentNode); - - } - }else{ - if (drag.mode && drag.mode != gantt.config.drag_mode.ignore && gantt.config["drag_" + drag.mode]){ - id = gantt.locate(src); - if(id!=null){ - task = dhtmlx.copy(gantt.getTask(id) || {}); - - if(gantt._is_readonly(task)){ - this.clear_drag_state(); - return false; - } - - /*if(gantt._is_flex_task(task) && drag.mode != gantt.config.drag_mode.progress){//only progress drag is allowed for tasks with flexible duration - this.clear_drag_state(); - return; - }*/ // HOSEK - drag.id = id; - drag.obj = task; - } - var pos = gantt._get_mouse_pos(e); - drag.start_x = pos.x; - drag.start_y = pos.y; - this.drag.start_drag = drag; - }else - this.clear_drag_state(); - } - return false; - }, - _fix_dnd_scale_time:function(task, drag){ - alert("Forbidden function _fix_dnd_scale_time"); - var unit = gantt._tasks.unit, - step = gantt._tasks.step; - if(!gantt.config.round_dnd_dates){ - unit = 'minute'; - step = gantt.config.time_step; - } - unit="day"; // HOSEK - - function fixStart(task){ - if(!gantt.isWorkTime(task.start_date)) - task.start_date = gantt.calculateEndDate(task.start_date, 0, gantt.config.duration_unit); // HOSEK (originally -1) - } - function fixEnd(task){ - if(!gantt.isWorkTime(gantt.date.Date(task.end_date - 1))) - task.end_date = gantt.calculateEndDate(task.end_date, 1, gantt.config.duration_unit); - } - if(drag.mode == gantt.config.drag_mode.resize){ - if(drag.left){ - task.start_date = gantt.roundDate({date:task.start_date, unit:unit, step:step}); - fixStart(task); - }else{ - task.end_date = gantt.roundDate({date:task.end_date, unit:unit, step:step}); - fixEnd(task); - } - task.duration=gantt.calculateDuration(task.start_date,task.end_date); - }else if(drag.mode == gantt.config.drag_mode.move){ - task.start_date = gantt.roundDate({date:task.start_date, unit:unit, step:step}); - fixStart(task); - - task.end_date = gantt.calculateEndDate(task.start_date, task.duration, gantt.config.duration_unit); - } - }, - _fix_working_times:function(task, drag){ - //console.log("_fix_working_times REWRITED"); - gantt._working_time_helper.round_date(task.start_date); - if(drag.mode == gantt.config.drag_mode.resize){ - gantt._working_time_helper.round_date(task.end_date, "past"); - task.duration=gantt._working_time_helper.get_work_units_between(task.start_date,task.end_date,"day"); - } - task.end_date=gantt._working_time_helper.add_worktime(task.start_date,task.duration,"day"); - /*return; - var drag = drag || {mode : gantt.config.drag_mode.move}; - if(gantt.config.work_time && gantt.config.correct_work_time){ - if(drag.mode == gantt.config.drag_mode.resize){ - if(drag.left){ - task.start_date = gantt.getClosestWorkTime({date:task.start_date, dir:'future'}); - }else{ - task.end_date = gantt.getClosestWorkTime({date:task.end_date, dir:'past'}); - } - }else if(drag.mode == gantt.config.drag_mode.move){ - gantt.correctTaskWorkTime(task); - } - }*/ - }, - on_mouse_up : function(e){ - var drag = this.drag; - if (drag.mode && drag.id) { - //drop - var ev = gantt.getTask(drag.id); - - //if(gantt.config.work_time && gantt.config.correct_work_time){ - // this._fix_working_times(ev, drag); - //} - //gantt.resetProjectDates(ev); - //this._fix_dnd_scale_time(ev, drag); - - //gantt._init_task_timing(ev); - // HOSEK - this._fireEvent("before_finish", drag.mode, [drag.id, drag.mode, e]); - gantt.updateAllTask(ev); - - if (gantt._tasks.needRescale) { - gantt._tasks.needRescale = false; - //gantt._adjust_scales(); - //gantt.refreshData(); - gantt.render(); - ysy.log.debug("Scale rescaled", "outer"); - } - this.clear_drag_state(); - return; - // HOSEK - //if (!this._fireEvent("before_finish", drag.mode, [drag.id, drag.mode, dhtmlx.copy(drag.obj), e])) { - // drag.obj._dhx_changed = false; - // dhtmlx.mixin(ev, drag.obj, true); - // - // gantt.updateTask(ev.id); - //} else { - // var drag_id = drag.id; - // - // gantt._init_task_timing(ev); - // this._fireEvent("after_finish", drag.mode, [drag_id, drag.mode, e]); - // this.clear_drag_state(); - // gantt.updateTask(ev.id); - //} - } - this.clear_drag_state(); - }, - _get_drag_mode : function(className){ - var modes = gantt.config.drag_mode; - var classes = (className || "").split(" "); - var classname = classes[0]; - var drag = {mode:null, left:null}; - switch (classname) { - case "gantt_task_line": - case "gantt_task_content": - drag.mode = modes.move; - break; - case "gantt_task_drag": - drag.mode = modes.resize; - if(classes[1] && classes[1].indexOf("left", classes[1].length - "left".length) !== -1){ - drag.left = true; - }else{ - drag.left = false; - } - break; - case "gantt_task_progress_drag": - drag.mode = modes.progress; - break; - case "gantt_link_control": - case "gantt_link_point": - drag.mode = modes.ignore; - break; - case "gantt_task_cell": - drag.mode = "empty"; // HOSEK < A V - break; - default: - drag = null; - break; - } - return drag; - - }, - - _start_dnd : function(e){ - var drag = this.drag = this.drag.start_drag; - delete drag.start_drag; - - var cfg = gantt.config; - var id = drag.id; - if (!cfg["drag_"+drag.mode] || !gantt.callEvent("onBeforeDrag",[id, drag.mode, e]) || !this._fireEvent("before_start", drag.mode, [id, drag.mode, e])){ - this.clear_drag_state(); - }else { - delete drag.start_drag; - } - - }, - _fireEvent:function(stage, mode, params){ - dhtmlx.assert(this._events[stage], "Invalid stage:{" + stage + "}"); - - var trigger = this._events[stage][mode]; - - dhtmlx.assert(trigger, "Unknown after drop mode:{" + mode + "}"); - dhtmlx.assert(params, "Invalid event arguments"); - - - if(!gantt.checkEvent(trigger)) - return true; - - return gantt.callEvent(trigger, params); - } -}; - -gantt.roundTaskDates = function(task){ - alert("Forbidden function roundTaskDates"); - var drag_state = gantt._tasks_dnd.drag; - - if(!drag_state){ - drag_state = {mode:gantt.config.drag_mode.move}; - } - gantt._tasks_dnd._fix_dnd_scale_time(task, drag_state); -}; - - - - - - - -gantt._render_link = function(id){ - var link = this.getLink(id); - var renders = gantt._get_link_renderers(); - //ysy.log.debug("_render_link() id="+id+" rend="+renders.length,"link_render"); - for(var i = 0; i < renders.length; i++) - renders[i].render_item(link); -}; - -gantt._get_link_type = function(from_start, to_start){ - var type = null; - if(from_start && to_start){ - type = gantt.config.links.start_to_start; - }else if(!from_start && to_start){ - type = gantt.config.links.finish_to_start; - }else if(!from_start && !to_start){ - type = gantt.config.links.finish_to_finish; - }else if(from_start && !to_start){ - type = gantt.config.links.start_to_finish; - } - return type; -}; - -gantt.isLinkAllowed = function(from, to, from_start, to_start){ - var link = null; - if(typeof(from) == "object"){ - link = from; - }else{ - link = {source:from, target:to, type: this._get_link_type(from_start, to_start)}; - } - - if(!link) return false; - if(!(link.source && link.target && link.type)) return false; - if(link.source == link.target) return false; - - var res = true; - //any custom rules - if(this.checkEvent("onLinkValidation")) - res = this.callEvent("onLinkValidation", [link]); - - return res; -}; - -gantt._render_link_element = function(link){ - //ysy.log.debug("render_link_element() link="+link.id,"link_render"); - var dots = this._path_builder.get_points(link); - var drawer = gantt._drawer; - var lines = drawer.get_lines(dots); - - var div = document.createElement("div"); - - - var css = "gantt_task_link"; - - if(link.color){ - css += " gantt_link_inline_color"; - } - var cssTemplate = this.templates.link_class ? this.templates.link_class(link) : ""; - if(cssTemplate){ - css += " " + cssTemplate; - } - - if(this.config.highlight_critical_path && this.isCriticalLink){ - if(this.isCriticalLink(link)) - css += " gantt_critical_link"; - } - - div.className = css; - div.setAttribute(gantt.config.link_attribute, link.id); - for(var i=0; i < lines.length; i++){ - if(i == lines.length - 1){ - lines[i].size -= gantt.config.link_arrow_size; - } - var el = drawer.render_line(lines[i], lines[i+1]); - if(link.color){ - el.firstChild.style.backgroundColor = link.color; - } - div.appendChild(el); - } - - var direction = lines[lines.length - 1].direction; - var endpoint = gantt._render_link_arrow(dots[dots.length - 1], direction); - if(link.color){ - endpoint.style.borderColor = link.color; - } - div.appendChild(endpoint); - // HOSEK - // if (link.delay !== 0) { - var delaypos = { - x: (dots[dots.length - 2].x + dots[dots.length - 1].x) / 2 - 5, - y: dots[dots.length - 2].y - 2 - }; - var delay_element = gantt.render_delay_element(link, delaypos); - if(delay_element) - div.appendChild(delay_element); - // } - // HOSEK - return div; -}; - -gantt._render_link_arrow = function(point, direction){ - var div = document.createElement("div"); - var drawer = gantt._drawer; - var top = point.y; - var left = point.x; - - var size = gantt.config.link_arrow_size; - var line_width = gantt.config.row_height; - var className = "gantt_link_arrow gantt_link_arrow_" + direction; - switch (direction){ - case drawer.dirs.right: - top -= (size - line_width)/2; - left -= size; - break; - case drawer.dirs.left: - top -= (size - line_width)/2; - break; - case drawer.dirs.up: - left -= (size - line_width)/2; - break; - case drawer.dirs.down: - top -= size; - left -= (size - line_width)/2; - break; - default: - break; - } - div.style.cssText = [ - "top:"+top + "px", - "left:"+left+'px'].join(';'); - div.className = className; - - return div; -}; - - -gantt._drawer = { - current_pos:null, - dirs:{"left":'left',"right":'right',"up":'up', "down":'down'}, - path:[], - clear:function(){ - this.current_pos = null; - this.path = []; - }, - point:function(pos){ - this.current_pos = dhtmlx.copy(pos); - }, - get_lines:function(dots){ - this.clear(); - this.point(dots[0]); - for(var i=1; i<dots.length ; i++){ - this.line_to(dots[i]); - } - return this.get_path(); - }, - line_to:function(pos){ - var next = dhtmlx.copy(pos); - var prev = this.current_pos; - - var line = this._get_line(prev, next); - this.path.push(line); - this.current_pos = next; - }, - get_path:function(){ - return this.path; - }, - get_wrapper_sizes :function(v){ - var res, - wrapper_size = gantt.config.link_wrapper_width, - line_size = gantt.config.link_line_width, - y = v.y + Math.floor((gantt.config.row_height - wrapper_size)/2); - switch (v.direction){ - case this.dirs.left: - res = { top : y, - height : wrapper_size, - lineHeight : wrapper_size, - left : v.x - v.size - wrapper_size/2 , - width : v.size +wrapper_size}; - break; - case this.dirs.right: - res = { top : y, - lineHeight : wrapper_size, - height : wrapper_size, - left : v.x - wrapper_size/2, - width : v.size + wrapper_size}; - break; - case this.dirs.up: - res = { top : y - v.size, - lineHeight: v.size + wrapper_size, - height : v.size + wrapper_size, - left : v.x - wrapper_size/2, - width : wrapper_size}; - break; - case this.dirs.down: - res = { top : y, - lineHeight: v.size + wrapper_size, - height : v.size + wrapper_size, - left : v.x - wrapper_size/2, - width : wrapper_size}; - break; - default: - break; - } - - return res; - }, - get_line_sizes : function(v){ - var res, - line_size = gantt.config.link_line_width, - wrapper_size = gantt.config.link_wrapper_width, - size = v.size + line_size; - switch (v.direction){ - case this.dirs.left: - case this.dirs.right: - res = { - height : line_size, - width : size, - marginTop: (wrapper_size - line_size)/2-1, - marginLeft: (wrapper_size - line_size)/2 - }; - break; - case this.dirs.up: - case this.dirs.down: - res = { - height : size, - width : line_size, - marginTop: (wrapper_size - line_size)/2-1, - marginLeft: (wrapper_size - line_size)/2 - }; - break; - default: - break; - } - - - - return res; - }, - render_line : function(v){ - //ysy.log.debug("render_line()","link_render"); - var pos = this.get_wrapper_sizes(v); - var wrapper = document.createElement("div"); - wrapper.style.cssText = [ - "top:" + pos.top + "px", - "left:" + pos.left + "px", - "height:" + pos.height + "px", - "width:" + pos.width + "px" - ].join(';'); - wrapper.className = "gantt_line_wrapper"; - - var innerPos = this.get_line_sizes(v); - var inner = document.createElement("div"); - inner.style.cssText = [ - "height:" + innerPos.height + "px", - "width:" + innerPos.width + "px", - "margin-top:" + innerPos.marginTop + "px", - "margin-left:" + innerPos.marginLeft + "px" - ].join(";"); - - inner.className = "gantt_link_line_" + v.direction; - wrapper.appendChild(inner); - - return wrapper; - }, - _get_line:function(from, to){ - var direction = this.get_direction(from, to); - var vect = { - x : from.x, - y : from.y, - direction : this.get_direction(from, to) - }; - if(direction == this.dirs.left || direction == this.dirs.right){ - vect.size = Math.abs(from.x - to.x); - }else{ - vect.size = Math.abs(from.y - to.y); - } - return vect; - }, - get_direction:function(from, to){ - var direction = 0; - if(to.x < from.x){ - direction = this.dirs.left; - }else if (to.x > from.x){ - direction = this.dirs.right; - }else if (to.y > from.y){ - direction = this.dirs.down; - }else { - direction = this.dirs.up; - } - return direction; - } - -}; -gantt._y_from_ind = function(index){ - return (index)*gantt.config.row_height; -}; -gantt._path_builder = { - - path:[], - clear:function(){ - this.path = []; - }, - current:function(){ - return this.path[this.path.length - 1]; - }, - point:function(next){ - if(!next) - return this.current(); - - this.path.push(dhtmlx.copy(next)); - return next; - }, - point_to:function(direction, diff, point){ - if(!point) - point = dhtmlx.copy(this.point()); - else - point = {x:point.x, y:point.y}; - var dir = gantt._drawer.dirs; - switch (direction){ - case (dir.left): - point.x -= diff; - break; - case (dir.right): - point.x += diff; - break; - case (dir.up): - point.y -= diff; - break; - case (dir.down): - point.y += diff; - break; - default: - break; - } - return this.point(point); - }, - get_points:function(link){ - var pt = this.get_endpoint(link); - var xy = gantt.config; - - - var dy = pt.e_y - pt.y; - var dx = pt.e_x - pt.x; - - var dir = gantt._drawer.dirs; - - this.clear(); - this.point({x: pt.x, y : pt.y}); - - var shiftX = ((link.id % 3) / 3 + 1.5) * xy.link_arrow_size;//just random size for first line - //var shiftX = Math.max((link.delay-1)*gantt._tasks.col_width/gantt._get_line(gantt.config.scale_unit)*gantt._get_line("day"),2*xy.link_arrow_size); - - - var forward = (pt.e_x > pt.x); - if(link.type == gantt.config.links.start_to_start){ - this.point_to(dir.left, shiftX); - if(forward){ - this.point_to(dir.down, dy); - this.point_to(dir.right, dx); - }else{ - this.point_to(dir.right, dx); - this.point_to(dir.down, dy); - } - this.point_to(dir.right, shiftX); - - }else if(link.type == gantt.config.links.finish_to_start){ - forward = (pt.e_x > (pt.x + 2*shiftX)); - this.point_to(dir.right, shiftX); - if(forward){ - dx -= shiftX; - this.point_to(dir.down, dy); - this.point_to(dir.right, dx); - }else{ - dx -= 2*shiftX; - var sign = dy > 0 ? 1 : -1; - - this.point_to(dir.down, sign * (xy.row_height/2)); - this.point_to(dir.right, dx); - this.point_to(dir.down, sign * ( Math.abs(dy) - (xy.row_height/2))); - this.point_to(dir.right, shiftX); - } - - }else if(link.type == gantt.config.links.finish_to_finish){ - this.point_to(dir.right, shiftX); - if(forward){ - this.point_to(dir.right, dx); - this.point_to(dir.down, dy); - }else{ - this.point_to(dir.down, dy); - this.point_to(dir.right, dx); - } - this.point_to(dir.left, shiftX); - }else if(link.type == gantt.config.links.start_to_finish){ - - forward = (pt.e_x > (pt.x - 2*shiftX)); - this.point_to(dir.left, shiftX); - - if(!forward){ - dx += shiftX; - this.point_to(dir.down, dy); - this.point_to(dir.right, dx); - }else{ - dx += 2*shiftX; - var sign = dy > 0 ? 1 : -1; - this.point_to(dir.down, sign * (xy.row_height/2)); - this.point_to(dir.right, dx); - this.point_to(dir.down, sign * ( Math.abs(dy) - (xy.row_height/2))); - this.point_to(dir.left, shiftX); - } - - } - - return this.path; - }, - get_endpoint : function(link){ - var types = gantt.config.links; - var from_start = false, to_start = false; - - if(link.type == types.start_to_start){ - from_start = to_start = true; - }else if(link.type == types.finish_to_finish){ - from_start = to_start = false; - }else if(link.type == types.finish_to_start){ - from_start = false; - to_start = true; - }else if(link.type == types.start_to_finish){ - from_start = true; - to_start = false; - }else{ - dhtmlx.assert(false, "Invalid link type"); - } - - var from = gantt._get_task_visible_pos(gantt._pull[link.source], from_start); - var to = gantt._get_task_visible_pos(gantt._pull[link.target], to_start); - - return { - x : from.x, - e_x : to.x, - y : from.y , - e_y : to.y - }; - } -}; - -gantt._init_links_dnd = function() { - var dnd = new dhtmlxDnD(this.$task_bars, { marker:true,sensitivity : 0, updates_per_second : 60 }), - start_marker = "task_left", - end_marker = "task_right", - link_edge_marker = "gantt_link_point", - link_landing_hover_area = "gantt_link_control"; - - dnd.attachEvent("onBeforeDragStart", dhtmlx.bind(function(obj,e) { -//console.log("init_links_dnd"); - var target = (e.target||e.srcElement); - resetDndState(); - if(gantt.getState().drag_id) - return false; - - - if(gantt._locate_css(target, link_edge_marker)){ - if(gantt._locate_css(target, start_marker)) - gantt._link_source_task_start = true; - - var sid = gantt._link_source_task = this.locate(e); - - - var t = gantt.getTask(sid); - if(gantt._is_readonly(t)){ - resetDndState(); - return false; - } - - var shift = 0; - if(gantt._get_safe_type(t.type) == gantt.config.types.milestone){ - shift = (gantt._get_visible_milestone_width() - gantt._get_milestone_width())/2; - } - - this._dir_start = getLinePos(t, !!gantt._link_source_task_start, shift); - return true; - }else{ - return false; - } - - }, this)); - - dnd.attachEvent("onAfterDragStart", dhtmlx.bind(function(obj,e) { - updateMarkedHtml(dnd.config.marker); - }, this)); - - function getLinePos(task, to_start, shift){ - var pos = gantt._get_task_pos(task, !!to_start); - pos.y += gantt._get_task_height()/2; - - shift = shift || 0; - pos.x += (to_start ? -1 : 1)*shift; - return pos; - } - - dnd.attachEvent("onDragMove", dhtmlx.bind(function(obj,e) { - var dd = dnd.config; - var pos = dnd.getPosition(e); - //advanceMarker(dd.marker, pos); - var landing = false;// = gantt._is_link_drop_area(e); - - var prevTarget = gantt._link_target_task; - var prevLanding = gantt._link_landing; - var prevToStart = gantt._link_target_task_start; - var to_start = true; - if(gantt._locate_css(e,"gantt_task_line")){ - var targ = gantt.locate(e); - }else{ - targ = null; - } - ysy.log.debug("landing=" + landing + " target=" + targ, "link_drag"); - if (targ){ - //refreshTask - to_start = !gantt._locate_css(e, end_marker); - var link = getDndState(); - var landing = gantt.isLinkAllowed(link.from, link.to, link.from_start, link.to_start); - } - - gantt._link_target_task = targ; - gantt._link_landing = landing; - gantt._link_target_task_start = to_start; - - if(landing){ - var t = gantt.getTask(targ); - - var node = gantt._locate_css(e, link_landing_hover_area); - var shift = 0; - if(node){ - shift = Math.floor(node.offsetWidth / 2); - } - - this._dir_end = getLinePos(t, !!gantt._link_target_task_start,shift); - }else{ - this._dir_end = gantt._get_mouse_pos(e); - } - - var targetChanged = !(prevLanding == landing && prevTarget == targ && prevToStart == to_start); - if(targetChanged){ - if(prevTarget) - gantt.refreshTask(prevTarget, false); - if(targ) - gantt.refreshTask(targ, false); - } - - if(targetChanged){ - updateMarkedHtml(dd.marker); - } - - - - showDirectingLine(this._dir_start.x, this._dir_start.y, this._dir_end.x, this._dir_end.y); - - return true; - }, this)); - - - dnd.attachEvent("onDragEnd", dhtmlx.bind(function() { - var drag = getDndState(); - - if(drag.from && drag.to && drag.from != drag.to){ - var type = gantt._get_link_type(drag.from_start, drag.to_start); - - var link = {source : drag.from, target: drag.to, type:type}; - if(link.type && gantt.isLinkAllowed(link)) - gantt.addLink(link); - } - - resetDndState(); - - if(drag.from) - gantt.refreshTask(drag.from, false); - if(drag.to) - gantt.refreshTask(drag.to, false); - removeDirectionLine(); - }, this)); - - function updateMarkedHtml(marker){ - var link = getDndState(); - - var css = ["gantt_link_tooltip"]; - var allowed = gantt.isLinkAllowed(link.from, link.to, link.from_start, link.to_start); - if(link.from && link.to){ - if (allowed){ - css.push("gantt_allowed_link"); - } else { - css.push("gantt_invalid_link"); - } - } - - var className = gantt.templates.drag_link_class(link.from, link.from_start, link.to, link.to_start); - if(className) - css.push(className); - - var html = "<div class='"+className+ "'>" + - gantt.templates.drag_link(link.from, link.from_start, link.to, link.to_start) + - "</div>"; - marker.innerHTML = html; - } - - function advanceMarker(marker, pos){ - marker.style.left = pos.x + 5 + "px"; - marker.style.top = pos.y + 5 + "px"; - } - function getDndState(){ - return { from : gantt._link_source_task, - to : gantt._link_target_task, - from_start : gantt._link_source_task_start, - to_start : gantt._link_target_task_start}; - } - function resetDndState(){ - gantt._link_source_task = - gantt._link_source_task_start = - gantt._link_target_task = null; - gantt._link_target_task_start = true; - } - function showDirectingLine(s_x, s_y, e_x, e_y){ - var div = getDirectionLine(); - - var link = getDndState(); - - var css = ["gantt_link_direction"]; - if(gantt.templates.link_direction_class){ - css.push(gantt.templates.link_direction_class(link.from, link.from_start, link.to, link.to_start)); - } - - var dist =Math.sqrt( (Math.pow(e_x - s_x, 2)) + (Math.pow(e_y - s_y, 2)) ); - dist = Math.max(0, dist - 3); - if(!dist) - return; - - div.className = css.join(" "); - var tan = (e_y - s_y)/(e_x - s_x), - angle = Math.atan(tan); - - if(coordinateCircleQuarter(s_x, e_x, s_y, e_y) == 2){ - angle += Math.PI; - }else if(coordinateCircleQuarter(s_x, e_x, s_y, e_y) == 3){ - angle -= Math.PI; - } - - - - var sin = Math.sin(angle), - cos = Math.cos(angle), - top = Math.round(s_y), - left = Math.round(s_x); - - - var style = [ - "-webkit-transform: rotate("+angle+"rad)", - "-moz-transform: rotate("+angle+"rad)", - "-ms-transform: rotate("+angle+"rad)", - "-o-transform: rotate("+angle+"rad)", - "transform: rotate("+angle+"rad)", - "width:" + Math.round(dist) + "px" - ]; - - if(window.navigator.userAgent.indexOf("MSIE 8.0") != -1){ - //ms-filter breaks styles in ie9, so add it only for 8th - style.push("-ms-filter: \"" + ieTransform(sin, cos) + "\""); - - var shiftLeft = Math.abs(Math.round(s_x - e_x)), - shiftTop = Math.abs(Math.round(e_y - s_y)); - //fix rotation axis - switch(coordinateCircleQuarter(s_x, e_x, s_y, e_y)){ - case 1: - top -= shiftTop; - break; - case 2: - left -= shiftLeft; - top -= shiftTop; - break; - case 3: - left -= shiftLeft; - break; - default: - break; - } - - } - - style.push("top:" + top + "px"); - style.push("left:" + left + "px"); - - div.style.cssText = style.join(";"); - } - - function ieTransform(sin, cos){ - return "progid:DXImageTransform.Microsoft.Matrix("+ - "M11 = "+cos+","+ - "M12 = -"+sin+","+ - "M21 = "+sin+","+ - "M22 = "+cos+","+ - "SizingMethod = 'auto expand'"+ - ")"; - } - function coordinateCircleQuarter(sX, eX, sY, eY){ - if(eX >= sX){ - if(eY <= sY){ - return 1; - }else{ - return 4; - } - }else{ - if(eY <= sY){ - return 2; - }else{ - return 3; - } - } - - } - function getDirectionLine(){ - if(!dnd._direction){ - dnd._direction = document.createElement("div"); - gantt.$task_links.appendChild(dnd._direction); - } - return dnd._direction; - } - function removeDirectionLine(){ - if(dnd._direction){ - if (dnd._direction.parentNode) //the event line can be detached because of data refresh - dnd._direction.parentNode.removeChild(dnd._direction); - - dnd._direction = null; - } - } - - gantt._is_link_drop_area = function(e){ - return !!gantt._locate_css(e, link_landing_hover_area); - }; -}; -gantt._get_link_state = function(){ - return { - link_landing_area : this._link_landing, - link_target_id : this._link_target_task, - link_target_start : this._link_target_task_start, - link_source_id : this._link_source_task, - link_source_start : this._link_source_task_start - }; -}; - - -gantt._init_tasks = function(){ - //store temporary configs - this._tasks = { - col_width:this.config.columnWidth, - width: [], // width of each column - full_width: 0, // width of all columns - trace_x:[], - rendered:{} - }; - - - this._click.gantt_task_link = dhtmlx.bind(function(e, trg){ - var id = this.locate(e, gantt.config.link_attribute); - if(id){ - this.callEvent("onLinkClick", [id, e]); - } - }, this); - - this._click.gantt_scale_cell = dhtmlx.bind(function(e, trg){ - var pos = gantt._get_mouse_pos(e); - var date = gantt.dateFromPos(pos.x); - var coll = Math.floor(gantt._day_index_by_date(date)); - - var coll_date = gantt._tasks.trace_x[coll]; - - gantt.callEvent("onScaleClick", [e, coll_date]); - }, this); - - /*this._dbl_click.gantt_task_link = dhtmlx.bind(function(e, id, trg){ // HOSEK - var id = this.locate(e, gantt.config.link_attribute); - this._delete_link_handler(id, e); - }, this); - - this._dbl_click.gantt_link_point = dhtmlx.bind(function(e, id, trg){ - var id = this.locate(e), - task = this.getTask(id); - - - var link = null; - if(trg.parentNode && trg.parentNode.className){ - if(trg.parentNode.className.indexOf("_left") > -1){ - link = task.$target[0]; - }else{ - link = task.$source[0]; - } - } - if(link) - this._delete_link_handler(link, e); - return false; - }, this);*/ - - this._tasks_dnd.init(); - this._init_links_dnd(); - - this._link_layers.clear(); - - var links_layer = this.addLinkLayer({ - renderer: this._render_link_element, - container: this.$task_links, - filter: gantt._create_filter(['_filter_link', '_is_chart_visible']) - }); - gantt._link_layers.process(); - this._linkRenderer = this._link_layers.getRenderer(links_layer); - - this._task_layers.clear(); - var bar_layer = this.addTaskLayer({ - renderer: this._render_task_element, - container: this.$task_bars, - filter: gantt._create_filter(['_filter_task', '_is_chart_visible']) - }); - - var grid_layer = this.addTaskLayer({ - renderer: this._render_grid_item, - container: this.$grid_data, - filter: gantt._create_filter(['_filter_task', '_is_grid_visible']) - }); - //var background_layer = this.addTaskLayer({ - // renderer: this._render_bg_line, - // container: this.$task_bg, - // filter: gantt._create_filter(['_filter_task', '_is_chart_visible', '_is_std_background']) - //}); - var background_layer = this.addTaskLayer(ysy.view.getGanttBackground()); - gantt._task_layers.process(); - this._taskRenderer = this._task_layers.getRenderer(bar_layer); - this._gridRenderer = this._task_layers.getRenderer(grid_layer); - this._backgroundRenderer = this._task_layers.getRenderer(background_layer); - - - //function refreshId(renders, oldId, newId, item){ - // for(var i =0; i < renders.length; i++){ - // renders[i].change_id(oldId, newId); - // renders[i].render_item(item); - // } - //} - //if(this._onTaskIdChange) - // this.detachEvent(this._onTaskIdChange); - // - //this._onTaskIdChange = this.attachEvent("onTaskIdChange", function(oldId, newId){ - // var render = this._get_task_renderers(); - // refreshId(render, oldId, newId, this.getTask(newId)); - //}); - // - //if(this._onLinkIdChange) - // this.detachEvent(this._onLinkIdChange); - // - //this._onLinkIdChange = this.attachEvent("onLinkIdChange", function(oldId, newId){ - // var render = this._get_link_renderers(); - // refreshId(render, oldId, newId, this.getLink(newId)); - //}); -}; - -gantt._create_filter = function(filter_methods){ - if(!(filter_methods instanceof Array)){ - filter_methods = Array.prototype.slice.call(arguments, 0); - } - - return function(obj){ - var res = true; - for(var i = 0, len = filter_methods.length; i < len; i++){ - var filter_method = filter_methods[i]; - if(gantt[filter_method]){ - res = res && (gantt[filter_method].apply(gantt, [obj.id, obj]) !== false); - } - } - - return res; - }; -}; - -gantt._is_chart_visible = function(){ - return !!this.config.show_chart; -}; - -gantt._filter_task = function(id, task){ - var min = null, max = null; - if(this.config.start_date && this.config.end_date){ - min = this.config.start_date.valueOf(); - max = this.config.end_date.valueOf(); - - if(+task.start_date > max || +task.end_date < +min) - return false; - } - return true; -}; -gantt._filter_link = function(id, link){ - if(!this.config.show_links){ - return false; - } - // TODO enable rendering task even out of chart - if(!(gantt.isTaskVisible(link.source) && gantt.isTaskVisible(link.target))) - return false; - - return this.callEvent("onBeforeLinkDisplay", [id, link]); -}; -gantt._is_std_background = function(){ - return !this.config.static_background; -}; - -/*gantt._delete_link_handler = function(id, e){ // HOSEK - if(id && this.callEvent("onLinkDblClick", [id, e])){ - var link = gantt.getLink(id); - if(gantt._is_readonly(link)) return; - - var title = ""; - var question = gantt.locale.labels.link + " " +this.templates.link_description(this.getLink(id)) + " " + gantt.locale.labels.confirm_link_deleting; - - window.setTimeout(function(){ - gantt._dhtmlx_confirm(question, title, function(){ - gantt.deleteLink(id); - }); - },(gantt.config.touch ? 300 : 1)); - } -};*/ -gantt.getTaskNode = function(id){ - return this._taskRenderer.rendered[id]; -}; -gantt.getLinkNode = function(id){ - return this._linkRenderer.rendered[id]; -}; - - - - - -gantt._get_tasks_data = function(){ - var rows = []; - for(var i=0; i < this._order.length; i++){ - var item = this._pull[this._order[i]]; - item.$index = i; - //this._update_parents(item.id, true); - this.resetProjectDates(item); - rows.push(item); - } - return rows; -}; -gantt._get_links_data = function(){ - var links = []; - for(var i in this._lpull) - links.push(this._lpull[i]); - - return links; -}; -gantt._render_data = function(){ - this.callEvent("onBeforeDataRender", []); - //if(!this._is_render_active()) - // return; - - this._sync_order(); - this._update_layout_sizes(); - - if(this.config.static_background) - this._render_bg_canvas(); - - var data = this._get_tasks_data(); - - var renderers = this._get_task_renderers(); - for(var i=0; i < renderers.length; i++){ - renderers[i].render_items(data); - } - - var links = gantt._get_links_data(); - renderers = this._get_link_renderers(); - for(var i=0; i < renderers.length; i++) - renderers[i].render_items(links); - - this.callEvent("onDataRender", []); -}; - -gantt._update_layout_sizes = function(){ - var cfg = this._tasks; - - cfg.bar_height = this._get_task_height(); - - //task bars layer - this.$task_data.style.height = Math.max(this.$task.offsetHeight - this.config.scale_height, 0) + 'px'; - this.$task_bg.style.height = ""; - this.$task_bg.style.backgroundImage = ""; - - //timeline area layers - var data_els = this.$task_data.childNodes; - for(var i= 0, len = data_els.length; i < len; i++){ - var el = data_els[i]; - if(this._is_layer(el) && el.style) - el.style.width = cfg.full_width + "px"; - } - - //grid area - if(this._is_grid_visible()){ - var columns = this.getGridColumns(); - var width = 0; - for (var i = 0; i < columns.length; i++) - width += columns[i].width; - this.$grid_data.style.width = Math.max(width-1, 0) + "px"; - } -}; - -gantt._scale_range_unit = function(){ - var unit = this.config.scale_unit; - if(this.config.scale_offset_minimal){ - var scales = this._get_scales(); - unit = scales[scales.length - 1].unit; - } - return unit; -}; - -gantt._init_tasks_range = function(){ - var unit = this._scale_range_unit(); - - //reset project timing - this._sync_order(); // HOSEK - this._get_tasks_data(); - - var range = this.getSubtaskDates(); - this._min_date = range.start_date || moment(); - this._max_date = range.end_date || moment(); - - if(this.config.start_date && +this.config.start_date < +this._min_date){ - this._min_date = this.date[unit + "_start"]( this.date.Date(this.config.start_date)); - } - if(this.config.end_date && +this.config.end_date > +this._max_date){ - this._max_date = this.date[unit + "_start"]( this.date.Date(this.config.end_date)); - } - if(!(this._max_date && this._max_date)){ - this._min_date = gantt.date.Date(); - this._max_date = gantt.date.Date(this._min_date); - } - var coef=1; // HOSEK - if(unit==="day"){coef=3;} - this._min_date = this.date[unit + "_start"](this._min_date); - //this._min_date = this.calculateEndDate(this.date[unit + "_start"](this._min_date), -1, unit);//one free column before first task - this._min_date = this.date.add(this._min_date,-coef,unit); // HOSEK - - this._max_date = this.date[unit + "_start"](this._max_date); - //this._max_date = this.calculateEndDate(this._max_date, 2, unit);//one free column after last task - this._max_date = this.date.add(this._max_date,3*coef,unit); // HOSEK -}; - - - -gantt._prepare_scale_html = function(config){ - var cells = []; - var date = null, content = null, css = null; - - if(config.template || config.date){ - content = config.template || this.date.date_to_str(config.date); - } - - - css = config.css || function(){}; - if(!config.css && this.config.inherit_scale_class){ - css = gantt.templates.scale_cell_class; - } - - for (var i = 0; i < config.count; i++) { - date = gantt.date.Date(config.trace_x[i]); - var value = content.call(this, date), - width = config.width[i], - style = "", - template = "", - cssclass = ""; - - if(width){ - style = "width:"+(width)+"px;"; - cssclass = "gantt_scale_cell" + (i == config.count-1 ? " gantt_last_cell" : ""); - - template = css.call(this, date); - if(template) cssclass += " " + template; - var cell = "<div class='" + cssclass + "' style='" + style + "'>" + value + "</div>"; - cells.push(cell); - }else{ - //do not render ignored cells - } - - } - return cells.join(""); -}; -gantt._get_scales = function(){ - var helpers = this._scale_helpers; - var scales = [helpers.primaryScale()].concat(this.config.subscales); - - helpers.sortScales(scales); - return scales; -}; - -gantt._render_tasks_scales = function() { - this._init_tasks_range(); - this._scroll_resize(); - this._set_sizes(); - - var scales_html = "", - outer_width = 0, - data_width = 0, - scale_height = 0; - - if(this._is_chart_visible()){ - var helpers = this._scale_helpers; - var scales = this._get_scales(); - scale_height = (this.config.scale_height-1); - var resize = this._get_resize_options(); - var avail_width = resize.x ? Math.max(this.config.autosize_min_width, 0) : this.$task.offsetWidth; - - var cfgs = helpers.prepareConfigs(scales,this.config.min_column_width, avail_width, scale_height); - var cfg = this._tasks = cfgs[cfgs.length - 1]; - - var html = []; - - var css = this.templates.scale_row_class; - for(var i=0; i < cfgs.length; i++){ - var cssClass = "gantt_scale_line"; - var tplClass = css(cfgs[i]); - if(tplClass){ - cssClass += " " + tplClass; - } - - html.push("<div class=\""+cssClass+"\" style=\"height:"+(cfgs[i].height)+"px;line-height:"+(cfgs[i].height)+"px\">" + this._prepare_scale_html(cfgs[i]) + "</div>"); - } - - scales_html = html.join(""); - outer_width = cfg.full_width + this.$scroll_ver.offsetWidth + "px"; - data_width = cfg.full_width + "px"; - scale_height += "px"; - } - - if(this._is_chart_visible()){ - this.$task.style.display = ""; - }else{ - this.$task.style.display = "none"; - } - - this.$task_scale.style.height = scale_height; - - this.$task_data.style.width = - this.$task_scale.style.width = outer_width; - - this.$task_scale.innerHTML = scales_html; - -}; - -gantt._render_bg_line = function(item){ - var cfg = gantt._tasks; - var count = cfg.count; - var row = document.createElement("div"); - if(gantt.config.show_task_cells){ - for (var j = 0; j < count; j++) { - var width = cfg.width[j], - cssclass = ""; - - if(width > 0){//do not render skipped columns - var cell = document.createElement("div"); - cell.style.width = (width)+"px"; - - cssclass = "gantt_task_cell" + (j == count-1 ? " gantt_last_cell" : ""); - cssTemplate = this.templates.task_cell_class(item, cfg.trace_x[j]); - if(cssTemplate) - cssclass += " " + cssTemplate; - cell.className = cssclass; - - row.appendChild(cell); - } - - } - } - var odd = item.$index%2 !== 0; - var cssTemplate = gantt.templates.task_row_class(item.start_date, item.end_date, item); - var css = "gantt_task_row" + (odd ? " odd" : "") + (cssTemplate ? ' '+cssTemplate : ''); - - if(this.getState().selected_task == item.id){ - css += " gantt_selected"; - } - - //var row = "<div class='" + css + "' " + this.config.task_attribute + "='" + item.id + "'>" + cells.join("") + "</div>"; - - row.className = css; - row.style.height = (gantt.config.row_height)+"px"; - row.setAttribute(this.config.task_attribute, item.id); - return row; -}; - -//defined in an extension -gantt._render_bg_canvas = function(){}; - - -gantt._adjust_scales = function(){ - if(this.config.fit_tasks){ - var old_min = +this._min_date, - old_max = +this._max_date; - this._init_tasks_range(); - if(+this._min_date != old_min || +this._max_date != old_max){ - this.render(); - - this.callEvent("onScaleAdjusted", []); - return true; - } - } - return false; -}; - -//refresh task and related links -gantt.refreshTask = function(taskId, refresh_links){ - gantt._update_parents(gantt.getParent(taskId)); - this.refresher.refreshTask(taskId); -}; -gantt._refreshTask = function(taskId){ - var i; - var renders = this._get_task_renderers(); - - var task = this.getTask(taskId); - //if(task && this.isTaskVisible(taskId)){ - if(!task){ - // nothing - }else - if(+this._min_date < +task.start_date && +this._max_date > +task.end_date){ - for(i =0; i < renders.length; i++) - renders[i].render_item(task); - - for(i=0; i < task.$source.length; i++){ - gantt.refreshLink(task.$source[i]); - } - for(i=0; i < task.$target.length; i++){ - gantt.refreshLink(task.$target[i]); - } - }else{ - this.render(); // HOSEK - } -}; -gantt.refreshLink = function(linkId){ - this.refresher.refreshLink(linkId); -}; -gantt._refreshLink = function(linkId){ - //if(!this._is_render_active()) - // return; - //ysy.log.debug("Link "+linkId+" is being refreshed","link_render"); - - if(this.isLinkExists(linkId)){ - this._render_link(linkId); - }else{ - var renders = this._get_link_renderers(); - for(var i =0; i < renders.length; i++) - renders[i].remove_item(linkId); - } -}; - - - -gantt._combine_item_class = function(basic, template, itemId){ - var css = [basic]; - if(template) - css.push(template); - - var state = gantt.getState(); - - var task = this.getTask(itemId); - - - if(task.type){css.push("gantt_"+task.type+"-type");} - //if(this._get_safe_type(task.type) == this.config.types.milestone){ - // css.push("gantt_milestone"); - //} - // - //if(this._get_safe_type(task.type) == this.config.types.project){ - // css.push("gantt_project"); - //} - - if(this._is_flex_task(task)) - css.push("gantt_dependent_task"); - - if(this.config.select_task && itemId == state.selected_task) - css.push("gantt_selected"); - - if(itemId == state.drag_id){ - css.push("gantt_drag_" + state.drag_mode); - if(state.touch_drag){ - css.push("gantt_touch_" + state.drag_mode); - } - } - var links = gantt._get_link_state(); - if(links.link_source_id == itemId) - css.push("gantt_link_source"); - - if(links.link_target_id == itemId) - css.push("gantt_link_target"); - - - if(this.config.highlight_critical_path && this.isCriticalTask){ - if(this.isCriticalTask(task)) - css.push("gantt_critical_task"); - } - - if(links.link_landing_area && - (links.link_target_id && links.link_source_id) && - (links.link_target_id != links.link_source_id)){ - - var from_id = links.link_source_id; - var from_start = links.link_source_start; - var to_start = links.link_target_start; - - var allowDrag = gantt.isLinkAllowed(from_id, itemId, from_start, to_start); - - var dragClass = ""; - if(allowDrag){ - if(to_start) - dragClass = "link_start_allow"; - else - dragClass = "link_finish_allow"; - }else{ - if(to_start) - dragClass = "link_start_deny"; - else - dragClass = "link_finish_deny"; - } - css.push(dragClass); - } - return css.join(" "); -}; - -gantt._render_pair = function(parent, css, task, content){ - var state = gantt.getState(); - - if (+task.start_date >= +state.min_date) - parent.appendChild(content(css + " task_left")); - - if(+task.end_date <= +state.max_date) { - parent.appendChild(content(css + " task_right")); - } -}; - -gantt._get_task_height = function(){ - // height of the bar item - var height = this.config.task_height; - if(height == "full") - height = this.config.row_height - 5; - //item height cannot be bigger than row height - height = Math.min(height, this.config.row_height); - return Math.max(height, 0); -}; - -gantt._get_milestone_width = function(){ - return this._get_task_height(); -}; -gantt._get_visible_milestone_width = function(){ - var origWidth = gantt._get_task_height();//m-s have square shape - return Math.sqrt(2*origWidth*origWidth); -}; - -// TODO: remove reduntant methods for task positioning -gantt.getTaskPosition = function(task, start_date, end_date){ - var x = this.posFromDate(start_date || task.start_date); - var x2 = this.posFromDate(end_date || task.end_date); - x2 = Math.max(x, x2); - var y = this.getTaskTop(task.id); - var height = this.config.task_height; - return { - left:x, - top:y, - height : height, - width: Math.max((x2 - x), 0) - }; -}; - -gantt._get_task_width = function(task, start, end ){ - return Math.round(this._get_task_pos(task, false).x - this._get_task_pos(task, true).x); -}; - -gantt._is_readonly = function(item){ - if(item && item[this.config.editable_property]){ - return false; - }else{ - return (item && item[this.config.readonly_property]) || this.config.readonly || this.config["readonly_"+gantt._get_safe_type(item.type)]; - } -}; -gantt._task_default_render = function(task){ - var pos = this._get_task_pos(task); - - var cfg = this.config; - var height = this._get_task_height(); - var type = this._get_safe_type(task.type); - var controls = cfg["controls_"+type] || {}; - - var padd = Math.floor((this.config.row_height - height)/2); - if(type == cfg.types.milestone && cfg.link_line_width > 1){ - //little adjust milestone position, so horisontal corners would match link arrow when thickness of link line is more than 1px - padd += 1; - } - - var div = document.createElement("div"); - var width = gantt._get_task_width(task); - - - div.setAttribute(this.config.task_attribute, task.id); - - if(cfg.show_progress && (controls.show_progress || controls.progress)){ - var progress = this._render_task_progress(task,div, width); - if(!this._is_readonly(task) && controls.progress){ - this._render_task_progress_drag(div,progress); - } - } - - //use separate div to display content above progress bar - var content = gantt._render_task_content(task, width); - if(task.textColor){ - content.style.color = task.textColor; - } - div.appendChild(content); - - var css = this._combine_item_class("gantt_task_line", - this.templates.task_class(task.start_date, task.end_date, task), - task.id); - if(task.color || task.progressColor || task.textColor){ - css += " gantt_task_inline_color"; - } - div.className = css; - - var styles = [ - "left:" + pos.x + "px", - "top:" + (padd + pos.y) + 'px', - "height:" + height + 'px', - "line-height:" + height + 'px', - "width:" + width + 'px' - ]; - if(task.color){ - styles.push("background-color:" + task.color); - } - if(task.textColor){ - styles.push("color:" + task.textColor); - } - - div.style.cssText = styles.join(";"); - var side = this._render_leftside_content(task); - if(side) div.appendChild(side); - - side = this._render_rightside_content(task); - if(side) div.appendChild(side); - - if(!this._is_readonly(task)){ - if(cfg.drag_resize && !this._is_flex_task(task) && controls.resize){ - gantt._render_pair(div, "gantt_task_drag", task, function(css){ - var el = document.createElement("div"); - el.className = css; - return el; - }); - } - if(cfg.drag_links && this.config.show_links && controls.links){ - gantt._render_pair(div, "gantt_link_control", task, function(css){ - var outer = document.createElement("div"); - outer.className = css; - outer.style.cssText = [ - "height:" + height + 'px', - "line-height:" + height + 'px' - ].join(";"); - var inner = document.createElement("div"); - inner.className = "gantt_link_point"; - outer.appendChild(inner); - return outer; - }); - } - } - return div; -}; - -gantt._render_task_element = function(task){ - var painters = this.config.type_renderers; - var renderer = painters[this._get_safe_type(task.type)], - defaultRenderer = this._task_default_render; - - if(!renderer){ - renderer = defaultRenderer; - } - return renderer.call(this, task, dhtmlx.bind(defaultRenderer, this)); -}; - -gantt._render_side_content = function(task, template, cssClass){ - if(!template) return null; - - var text = template(task.start_date, task.end_date, task); - if(!text) return null; - var content = document.createElement("div"); - content.className = "gantt_side_content " + cssClass; - content.innerHTML = text; - return content; -}; - - - -gantt._render_leftside_content = function(task){ - var css = "gantt_left " + gantt._get_link_crossing_css(true, task); - return gantt._render_side_content(task, this.templates.leftside_text, css); -}; -gantt._render_rightside_content = function(task){ - var css = "gantt_right " + gantt._get_link_crossing_css(false, task); - return gantt._render_side_content(task, this.templates.rightside_text, css); -}; - -gantt._get_conditions = function(leftside){ - if(leftside){ - return { - $source : [ - gantt.config.links.start_to_start - ], - $target : [ - gantt.config.links.start_to_start, - gantt.config.links.finish_to_start - ] - }; - }else{ - return { - $source : [ - gantt.config.links.finish_to_start, - gantt.config.links.finish_to_finish - ], - $target : [ - gantt.config.links.finish_to_finish - ] - }; - } -}; - -gantt._get_link_crossing_css = function(left, task){ - var cond = gantt._get_conditions(left); - - for(var i in cond){ - var links = task[i]; - for(var ln =0; ln < links.length; ln++){ - var link = gantt.getLink(links[ln]); - - for(var tp =0; tp < cond[i].length; tp++){ - if(link.type == cond[i][tp]){ - return "gantt_link_crossing"; - } - } - } - } - return ""; -}; - - - -gantt._render_task_content = function(task, width){ - var content = document.createElement("div"); - if(this._get_safe_type(task.type) != this.config.types.milestone) - content.innerHTML = this.templates.task_text(task.start_date, task.end_date, task); - content.className = "gantt_task_content"; - //content.style.width = width + 'px'; - return content; -}; -gantt._render_task_progress = function(task, element, maxWidth){ - var done = task.progress*1 || 0; - - maxWidth = Math.max(maxWidth - 2, 0);//2px for borders - var pr = document.createElement("div"); - var width = Math.round(maxWidth*done); - - width = Math.min(maxWidth, width); - if(task.progressColor){ - pr.style.backgroundColor = task.progressColor; - pr.style.opacity = 1; - } - pr.style.width = width + 'px'; - pr.className = "gantt_task_progress"; - pr.innerHTML = this.templates.progress_text(task.start_date, task.end_date, task); - element.appendChild(pr); - return width; - //if(this.config.drag_progress && !gantt._is_readonly(task)){ - //} -}; -gantt._render_task_progress_drag = function(element,width){ - var drag = document.createElement("div"); - drag.style.left = width + 'px'; - drag.className = "gantt_task_progress_drag"; - //pr.appendChild(drag); - element.appendChild(drag); -} -gantt._get_line = function(step) { - var steps = { - "second": 1, - "minute": 60, - "hour": 60*60, - "day": 60*60*24, - "week": 60*60*24*7, - "month": 60*60*24*30, - "year": 60*60*24*365 - }; - return steps[step] || 0; -}; - - -gantt.dateFromPos = function(x){ - return gantt.dateFromPos2(x); - var scale = this._tasks; - if(x < 0 || x > scale.full_width || !scale.full_width){ - return null; - } - - var ind = this._findBinary(this._tasks.left, x); - var summ = this._tasks.left[ind]; - //ysy.log.debug("ind="+ind+" summ="+summ,"task_drag"); - var col_width = scale.width[ind] || scale.col_width; - var part = 0; - if(col_width) - part = (x - summ)/col_width; - - var unit = 0; - if(part){ - unit = gantt._get_coll_duration(scale, scale.trace_x[ind]); - } - //ysy.log.debug("trace="+scale.trace_x[ind].valueOf()+" part="+part+" unit="+unit,"task_drag"); - var date = gantt.date.Date(scale.trace_x[ind].valueOf() + Math.round(part*unit)); - //ysy.log.debug("old:"+date.toString()+" new:"+gantt.dateFromPos2(x).toString(),"task_drag"); - return date; -}; - -gantt.posFromDate = function(date){ - var ind = gantt._day_index_by_date(date); - dhtmlx.assert(ind >= 0, "Invalid day index"); - - var wholeCells = Math.floor(ind); - var partCell = ind % 1; - - var pos = gantt._tasks.left[Math.min(wholeCells, gantt._tasks.width.length - 1)]; - if(wholeCells == gantt._tasks.width.length) - pos += gantt._tasks.width[gantt._tasks.width.length - 1]; - //for(var i=1; i <= wholeCells; i++) - // pos += gantt._tasks.width[i-1]; - - if(partCell){ - if(wholeCells < gantt._tasks.width.length){ - pos += gantt._tasks.width[wholeCells]*(partCell % 1); - }else{ - pos += 1; - } - - } - return pos; -}; -gantt.posFromDateCached = function(date){ - if (typeof date !== "string") { - var momentDate = date; - date = date.toISOString(); - } - var pos = gantt._tasks.date_cache[date]; - if(!pos){ - pos = gantt.posFromDate(momentDate || date); - gantt._tasks.date_cache[date] = pos; - } - return pos; -}; - -gantt._day_index_by_date = function(date){ - //ysy.log.debug(date,"task_drag"); - /*if(date.isValid&&!date.isValid()){ - debugger; - }*/ - var tdate=gantt.date.Date(date);// HOSEK - if(date._isEndDate){tdate=moment(tdate).add(1,"days");} - var pos = tdate.valueOf(); - var days = gantt._tasks.trace_x, - ignores = gantt._tasks.ignore_x || {}; - - if(pos <= this._min_date) - return 0; - - if(pos >= this._max_date) - return days.length; - - /*var day = null; - for (var xind = 0, length = days.length-1; xind < length; xind++) { - // | 8:00, 8:30 | 8:15 should be checked against 8:30 - // clicking at the most left part of the cell, say 8:30 should create event in that cell, not previous one - day = +days[xind+1]; - if (pos < day && !ignores[day]) - break; - }*/ - - var day_ind = gantt._findBinary(days, pos); - var day = +gantt._tasks.trace_x[day_ind]; - while(ignores[day]){ - day = gantt._tasks.trace_x[++day_ind]; - } - - if(!day) return 0; - - return day_ind + ((tdate - days[day_ind]) / gantt._get_coll_duration(gantt._tasks, days[day_ind])); - - -}; -gantt._findBinary = function(array, target) { - // modified binary search, target value not exactly match array elements, looking for closest one - - var low = 0, high = array.length - 1, i, item, prev; - while (low <= high) { - - i = Math.floor((low + high) / 2); - item = +array[i]; - prev = +array[i - 1]; - if (item < target){ - low = i + 1; continue; - } - if (item > target){ - if(!(!isNaN(prev) && prev < target)) { - high = i - 1; continue; - }else{ - // if target is between 'i' and 'i-1' return 'i - 1' - return i - 1; - } - - } - - return i; - } - return array.length - 1; -}; -gantt._get_coll_duration = function(scale, date){ - return gantt.date.add(date, scale.step, scale.unit) - date; -}; - -gantt._get_x_pos = function(task, to_start){ - to_start = to_start !== false; - var x = gantt.posFromDate(to_start ? task.start_date : task.end_date); -}; - -gantt.getTaskTop = function(task_id){ - return this._y_from_ind(this._get_visible_order(task_id)); -}; - -gantt._get_task_coord = function(task, to_start, x_correction){ - to_start = to_start !== false; - x_correction = x_correction || 0; - var isMilestone = (this._get_safe_type(task.type) == this.config.types.milestone); - - var date = null; - - if(to_start && !isMilestone){ - date = (task.start_date || this._default_task_date(task)); - }else{ - date = (task.end_date || this.calculateEndDate(this._default_task_date(task))); - } - var x = this.posFromDate(date), - y = this.getTaskTop(task.id); - - if(isMilestone){ - if(to_start){ - x -= x_correction; - }else{ - x += x_correction; - } - } - return {x:x, y:y}; -}; -gantt._get_task_pos = function(task, to_start){ - to_start = to_start !== false; - var mstoneCorrection = gantt._get_milestone_width()/2; - return this._get_task_coord(task, to_start, mstoneCorrection); -}; - -gantt._get_task_visible_pos = function(task, to_start){ - to_start = to_start !== false; - var mstoneCorrection = gantt._get_visible_milestone_width()/2; - return this._get_task_coord(task, to_start, mstoneCorrection); -}; - - -gantt._correct_shift=function(start, back){ - return start-=((gantt.date.Date(gantt._min_date)).getTimezoneOffset()-(gantt.date.Date(start)).getTimezoneOffset())*60000*(back?-1:1); -}; - - - -gantt._get_mouse_pos = function(ev){ - if (ev.pageX || ev.pageY) { - var pos = {x: ev.pageX, y: ev.pageY}; - } else { - var d = _isIE ? document.documentElement : document.body; - pos = { - x:ev.clientX + d.scrollLeft - d.clientLeft, - y:ev.clientY + d.scrollTop - d.clientTop - }; - } - - var box = gantt._get_position(gantt.$task_data); - pos.x = pos.x - box.x + gantt.$task_data.scrollLeft; - pos.y = pos.y - box.y + gantt.$task_data.scrollTop; - //ysy.log.debug("POS=["+pos.x+","+pos.y+"]"); - return pos; -}; - -gantt._is_layer = function(dom_element){ - return (dom_element && dom_element.hasAttribute && dom_element.hasAttribute(this.config.layer_attribute)); -}; -//helper for rendering bars and links -gantt._task_renderer = function(layer){ -//gantt._task_renderer = function(id, render_one, node, filter){ - //hash of dom elements is needed to redraw single bar/link - if(typeof layer !== "object"){ - var id=layer; - }else{ - var id = layer.id; - var render_one = layer.renderer; - var node = layer.container; - var filter = layer.filter; - } - if(!this._task_area_pulls) - this._task_area_pulls = {}; - - if(!this._task_area_renderers) - this._task_area_renderers = {}; - - if(this._task_area_renderers[id]) - return this._task_area_renderers[id]; - - if(!render_one) - dhtmlx.assert(false, "Invalid renderer call"); - - if(node) - node.setAttribute(this.config.layer_attribute, true); - - this._task_area_renderers[id] = $.extend({ - render_item : function(item, container){ - var pull = gantt._task_area_pulls[id]; - container = container || node; - - - if(filter){ - if(!filter(item)){ - ysy.log.debug("_task_area_renderers() filtered id="+item.id,"link_render"); - this.remove_item(item.id); - return; - } - } - var dom = render_one.call(gantt, item, pull[item.id]); - if(!dom) return; - if(pull[item.id]){ - this.replace_item(item.id, dom); - }else{ - pull[item.id] = dom; - container.appendChild(dom); - } - }, - clear : function(container){ - this.rendered = gantt._task_area_pulls[id] = {}; - container = container || node; - if(container) - container.innerHTML = ""; - }, - render_items : function(items, container){ - container = container || node; - this.clear(container); - var buffer = document.createDocumentFragment(); - for(var i= 0, vis = items.length; i < vis; i++){ - this.render_item(items[i], buffer); - } - container.appendChild(buffer); - }, - replace_item: function(item_id, newNode){ - var item = this.rendered[item_id]; - if(item && item.parentNode){ - item.parentNode.replaceChild(newNode, item); - } - this.rendered[item_id] = newNode; - }, - remove_item:function(item_id){ - var item = this.rendered[item_id]; - if(item && item.parentNode){ - item.parentNode.removeChild(item); - } - delete this.rendered[item_id]; - }, - change_id: function(oldid, newid) { - this.rendered[newid] = this.rendered[oldid]; - delete this.rendered[oldid]; - }, - rendered : this._task_area_pulls[id] || {}, - node: node, - unload : function(){ - this.clear(); - delete gantt._task_area_renderers[id]; - delete gantt._task_area_pulls[id]; - } - },layer); - - return this._task_area_renderers[id]; -}; - -gantt._clear_renderers = function(){ - for(var i in this._task_area_renderers){ - this._task_renderer(i).unload(); - } -}; - - - -// --#include core/tasks_canvas_render.js -gantt.attachEvent("onGanttReady", function(){ - gantt._task_layers.add(); - gantt._link_layers.add(); -}); - -gantt._layers = { - prepareConfig: function(config){ - if(typeof config == "function"){ - config = {renderer: config}; - } - - var id = config.id = dhtmlx.uid(); - - if(!config.container) - config.container = document.createElement("div"); - - return config; - }, - create: function(get_container, rel_root){ - return { - tempCollection:[], - renderers:{}, - container: get_container, - getRenderers: function(){ - var res = []; - for (var i in this.renderers){ - res.push(this.renderers[i]); - } - return res; - }, - getRenderer: function(id){ - return this.renderers[id]; - }, - add: function(layer){ - if(layer) - this.tempCollection.push(layer); - //this.process(); - }, - // TODO put process to all layer creators - process: function(){ - if(!this.container()) return; - var container = this.container(); - var pending = this.tempCollection; - for(var i =0; i < pending.length; i++){ - var layer = pending[i]; - var node = layer.container, - id = layer.id, - topmost = layer.topmost; - if(!node.parentNode){ - //insert on top or below the tasks - if(topmost){ - container.appendChild(node); - }else{ - var rel = rel_root ? rel_root() : container.firstChild; - if(rel) - container.insertBefore(node, rel); - else - container.appendChild(node); - } - } - this.renderers[id] = gantt._task_renderer(layer); - //this.renderers[id] = gantt._task_renderer(id, layer.renderer, node, layer.filter); - this.tempCollection.splice(i,1); - i--; - } - }, - remove: function(id){ - this.renderers[id].unload(); - delete this.renderers[id]; - }, - clear: function(){ - for(var i in this.renderers){ - this.renderers[i].unload(); - } - this.renderers = {}; - } - }; - } -}; - -gantt._create_filter = function(filter_methods){ - if(!(filter_methods instanceof Array)){ - filter_methods = Array.prototype.slice.call(arguments, 0); - } - - return function(obj){ - var res = true; - for(var i = 0, len = filter_methods.length; i < len; i++){ - var filter_method = filter_methods[i]; - if(gantt[filter_method]){ - res = res && (gantt[filter_method].call(gantt, obj.id, obj) !== false); - } - } - - return res; - }; -}; - -gantt._add_generic_layer = function(layersManager, filters){ - return function(config){ - if(config.filter === undefined){ - config.filter = gantt._create_filter(filters); - } - config = gantt._layers.prepareConfig(config); - layersManager.add(config); - return config.id; - }; -}; - -gantt._task_layers = gantt._layers.create(function(){return gantt.$task_data; }, function(){return gantt.$task_links;}); - -gantt._link_layers = gantt._layers.create(function(){return gantt.$task_data; }); - -gantt.addTaskLayer = gantt._add_generic_layer(gantt._task_layers, ['_filter_task', '_is_chart_visible']); - -gantt.removeTaskLayer = function(id){ - gantt._task_layers.remove(id); -}; - -gantt.addLinkLayer = gantt._add_generic_layer(gantt._link_layers, ['_filter_link', '_is_chart_visible']); -gantt.removeLinkLayer = function(id){ - gantt._link_layers.remove(id); -}; - -gantt._get_task_renderers = function(){ - return this._task_layers.getRenderers(); -}; -gantt._get_link_renderers = function(){ - return this._link_layers.getRenderers(); -}; - -gantt._pull = {}; -gantt._branches = {}; -gantt._order = []; -gantt._lpull = {}; - -gantt.load = function(url, type, callback){ - this._load_url = url; - dhtmlx.assert(arguments.length, "Invalid load arguments"); - this.callEvent("onLoadStart", []); - var tp = 'json', cl = null; - if(arguments.length >= 3){ - tp = type; - cl = callback; - }else{ - if(typeof arguments[1] == "string") - tp = arguments[1]; - else if(typeof arguments[1] == "function") - cl = arguments[1]; - } - - this._load_type = tp; - - dhx4.ajax.get(url, dhtmlx.bind(function(l) { - this.on_load(l, tp); - this.callEvent("onLoadEnd", []); - if(typeof cl == "function") - cl.call(this); - }, this)); -}; -gantt.parse = function(data, type) { - this.on_load({xmlDoc: {responseText: data}}, type); -}; - -gantt.serialize = function(type){ - type = type || "json"; - return this[type].serialize(); -}; - -/* -tasks and relations -{ -data:[ - { - "id":"string", - "text":"...", - "start_date":"Date or string", - "end_date":"Date or string", - "duration":"number", - "progress":"0..1", - "parent_id":"string", - "order":"number" - },...], -links:[ - { - id:"string", - source:"string", - target:"string", - type:"string" - },...], -collections:{ - collectionName:[ - {key:, label:, optional:...},... - ],... - } -} - - gantt._pull - id to object hash - gantt._branch - array of per branch arrays of objects|ids - gantt._order - array of visible elements - gantt._order_full - array of all elements - - gantt._links -* */ - -gantt.on_load = function(resp, type){ - this.callEvent("onBeforeParse", []); - if(!type) - type = "json"; - dhtmlx.assert(this[type], "Invalid data type:'" + type + "'"); - - var raw = resp.xmlDoc.responseText; - - var data = this[type].parse(raw, resp); - this._process_loading(data); -}; - - - -gantt._process_loading = function(data){ - if(data.collections) - this._load_collections(data.collections); - - var tasks = data.data; - var task; - for (var i = 0; i < tasks.length; i++) { - task = tasks[i]; - this._init_task(task); - if (!this.callEvent("onTaskLoading", [task])) continue; - this._pull[task.id] = task; - } - - for (var i in this._pull){ - task = this._pull[i]; - this.setParent(task, this.getParent(task) || this.config.root_id); - } - - // calculating $level for each item - for (var i in this._pull){ - task = this._pull[i]; - this._add_branch(task, true); - task.$level = this.calculateTaskLevel(task); - } - this._sync_order(); - this._init_links(data.links || (data.collections ? data.collections.links : [])); - this.callEvent("onParse", []); - this.render(); - if(this.config.initial_scroll){ - var id = (this._order[0] || this.config.root_id); - if(id) - this.showTask(id); - } -}; - - -gantt._init_links = function(links){ - if (links) - for(var i=0; i < links.length; i++){ - if(links[i]){ - var link = this._init_link(links[i]); - this._lpull[link.id] = link; - } - } - this._sync_links(); -}; - - -gantt._load_collections = function(collections){ - var collections_loaded = false; - for (var key in collections) { - if (collections.hasOwnProperty(key)) { - collections_loaded = true; - var collection = collections[key]; - var arr = this.serverList[key]; - if (!arr) continue; - arr.splice(0, arr.length); //clear old options - for (var j = 0; j < collection.length; j++) { - var option = collection[j]; - var obj = dhtmlx.copy(option); - obj.key = obj.value;// resulting option object - - for (var option_key in option) { - if (option.hasOwnProperty(option_key)) { - if (option_key == "value" || option_key == "label") - continue; - obj[option_key] = option[option_key]; // obj['value'] = option['value'] - } - } - arr.push(obj); - } - } - } - if (collections_loaded) - this.callEvent("onOptionsLoad", []); -}; - -gantt._sync_order = function(silent) { - this._order = []; - this._sync_order_item({parent:this.config.root_id, $open:true, $ignore:true, id:this.config.root_id}); - this._order.push("empty"); - - if(!silent){ - this._scroll_resize(); - this._set_sizes(); - } -}; -gantt.attachEvent("onBeforeTaskDisplay", function(id, task){ - return !task.$ignore; -}); -gantt._sync_order_item = function(item) { - if(!item){ - ysy.log.debug("error: no item"); - } - if (!item.id - || this._filter_task(item.id, item) - && this.callEvent("onBeforeTaskDisplay", [item.id, item])) { - if (item.id) { //do not trigger event for virtual root - this._order.push(item.id); - } - if (item.$open) { - var children = this.getChildren(item.id); - if (children) - for (var i = 0; i < children.length; i++) - this._sync_order_item(this._pull[children[i]]); - } - } -}; - -gantt._get_visible_order = function(id){ - dhtmlx.assert(id, "Invalid argument"); - var ord = this._order; - for(var i= 0, count = ord.length; i < count; i++) - if(ord[i] == id) return i; - - return -1; -}; - - - -gantt.eachTask = function(code, parent, master){ - parent = parent || this.config.root_id; - master = master || this; - - var branch = this.getChildren(parent); - if (branch) - for (var i=0; i<branch.length; i++){ - var item = this._pull[branch[i]]; - code.call(master, item); - if (this.hasChild(item.id)) - this.eachTask(code, item.id, master); - } -}; - -gantt.json = { - parse : function(data){ - dhtmlx.assert(data, "Invalid data"); - - if (typeof data == "string") { - if(window.JSON) - data = JSON.parse(data); - else{ - gantt._temp = eval("(" + data + ")"); - data = gantt._temp || {}; - gantt._temp = null; - } - } - - if (data.dhx_security) - dhtmlx.security_key = data.dhx_security; - return data; - }, - _copyLink:function(obj){ - var copy = {}; - for (var key in obj) - copy[key] = obj[key]; - return copy; - }, - _copyObject:function(obj){ - var copy = {}; - for (var key in obj){ - if (key.charAt(0) == "$") - continue; - copy[key] = obj[key]; - - if(copy[key] instanceof Date){ - copy[key] = gantt.templates.xml_format(copy[key]); - } - } - return copy; - }, - serialize:function(){ - var tasks = []; - var links = []; - - gantt.eachTask(function(obj){ - gantt.resetProjectDates(obj); - tasks.push(this._copyObject(obj)); - }, gantt.config.root_id, this); - for (var key in gantt._lpull) - links.push(this._copyLink(gantt._lpull[key])); - - return { - data : tasks, - links: links - }; - } -}; - -/* -<data> - <task id:"some" parent_id="0" progress="0.5"> - <text>My task 1</text> - <start_date>16.08.2013</start_date> - <end_date>22.08.2013</end_date> - </task> - <coll_options> - <links> - <link source='a1' target='b2' type='c3' /> - </links> - </coll_options> -</data> -*/ - -gantt.xml = { - _xmlNodeToJSON:function(node, attrs_only){ - var t = {}; - for (var i = 0; i < node.attributes.length; i++) - t[node.attributes[i].name] = node.attributes[i].value; - - if (!attrs_only){ - for (var i = 0; i < node.childNodes.length; i++) { - var child = node.childNodes[i]; - if (child.nodeType == 1) - t[child.tagName] = child.firstChild ? child.firstChild.nodeValue : ""; - } - - if (!t.text) t.text = node.firstChild ? node.firstChild.nodeValue : ""; - } - - return t; - }, - _getCollections:function(loader){ - var collection = {}; - var opts = dhx4.ajax.xpath("//coll_options", loader); - for (var i = 0; i < opts.length; i++) { - var bind = opts[i].getAttribute("for"); - var arr = collection[bind] = []; - var itms = dhx4.ajax.xpath(".//item", opts[i]); - for (var j = 0; j < itms.length; j++) { - var itm = itms[j]; - var attrs = itm.attributes; - var obj = { key: itms[j].getAttribute("value"), label: itms[j].getAttribute("label")}; - for (var k = 0; k < attrs.length; k++) { - var attr = attrs[k]; - if (attr.nodeName == "value" || attr.nodeName == "label") - continue; - obj[attr.nodeName] = attr.nodeValue; - } - arr.push(obj); - } - } - return collection; - }, - _getXML:function(text, loader, toptag){ - toptag = toptag || "data"; - if (!loader.getXMLTopNode){ - loader = dhx4.ajax.parse(loader); - } - - var xml = dhx4.ajax.xmltop(toptag, loader.xmlDoc); - if (xml.tagName != toptag) throw "Invalid XML data"; - - var skey = xml.getAttribute("dhx_security"); - if (skey) - dhtmlx.security_key = skey; - - return xml; - }, - parse:function(text, loader){ - loader = this._getXML(text, loader); - var data = { }; - - var evs = data.data = []; - var xml = dhx4.ajax.xpath("//task", loader); - - for (var i = 0; i < xml.length; i++) - evs[i] = this._xmlNodeToJSON(xml[i]); - - data.collections = this._getCollections(loader); - return data; - }, - _copyLink:function(obj){ - return "<item id='"+obj.id+"' source='"+obj.source+"' target='"+obj.target+"' type='"+obj.type+"' />"; - }, - _copyObject:function(obj){ - return "<task id='"+obj.id+"' parent='"+(obj.parent||"")+"' start_date='"+obj.start_date+"' duration='"+obj.duration+"' open='"+(!!obj.open)+"' progress='"+obj.progress+"' end_date='"+obj.end_date+"'><![CDATA["+obj.text+"]]></task>"; - }, - serialize:function(){ - var tasks = []; - var links = []; - - var json = gantt.json.serialize(); - for(var i= 0, len = json.data.length; i < len; i++){ - tasks.push(this._copyObject(json.data[i])); - } - for(var i= 0, len = json.links.length; i < len; i++){ - links.push(this._copyLink(json.links[i])); - } - return "<data>"+tasks.join("")+"<coll_options for='links'>"+links.join("")+"</coll_options></data>"; - } -}; - - -gantt.oldxml = { - parse:function(text, loader){ - loader = gantt.xml._getXML(text, loader, "projects"); - var data = { collections:{ links:[] } }; - - var evs = data.data = []; - var xml = dhx4.ajax.xpath("//task", loader); - - for (var i = 0; i < xml.length; i++){ - evs[i] = gantt.xml._xmlNodeToJSON(xml[i]); - var parent = xml[i].parentNode; - - if (parent.tagName == "project") - evs[i].parent = "project-"+parent.getAttribute("id"); - else - evs[i].parent = parent.parentNode.getAttribute("id"); - } - - xml = dhx4.ajax.xpath("//project", loader); - for (var i = 0; i < xml.length; i++){ - var ev = gantt.xml._xmlNodeToJSON(xml[i], true); - ev.id ="project-"+ev.id; - evs.push(ev); - } - - for (var i=0; i<evs.length; i++){ - var ev = evs[i]; - ev.start_date = ev.startdate || ev.est; - ev.end_date = ev.enddate; - ev.text = ev.name; - ev.duration = ev.duration / 8; - ev.open = 1; - if (!ev.duration && !ev.end_date) ev.duration = 1; - if (ev.predecessortasks) - data.collections.links.push({ target:ev.id, source:ev.predecessortasks, type:gantt.config.links.finish_to_start }); - } - - return data; - }, - serialize:function(){ - dhtmlx.message("Serialization to 'old XML' is not implemented"); - } -}; - -gantt.serverList = function(name, array) { - if (array) { - this.serverList[name] = array.slice(0); - }else if(!this.serverList[name]){ - this.serverList[name] = []; - } - return this.serverList[name]; -}; - -gantt.getTask = function(id) { - dhtmlx.assert(id, "Invalid argument for gantt.getTask"); - dhtmlx.assert(this._pull[id], "Task not found id=" + id); - return this._pull[id]; -}; -gantt.getTaskByTime = function(from, to){ - var p = this._pull, - res = [], - pos = 0, - taken = 0; - - if(!(from || to)){ - for (var t in p) res.push(p[t]); - }else{ - from = +from || -Infinity; - to = +to || Infinity; - for (var t in p){ - var task = p[t]; - if (+task.start_date < to && +task.end_date > from) - res.push(task); - } - } - - return res; -}; - -gantt.isTaskExists = function(id) { - return dhtmlx.defined(this._pull[id]); -}; - -gantt.isTaskVisible = function(id){ - if(!this._pull[id]) - return false; - - if(!(+this._pull[id].start_date < +this._max_date && +this._pull[id].end_date > +this._min_date)) - return false; - - for(var i= 0, count = this._order.length; i < count; i++) - if(this._order[i] == id) return true; - return false; -}; - - -gantt.updateTask = function (id, item) { - if (!dhtmlx.defined(item)) - item = this.getTask(id); - if (this.callEvent("onBeforeTaskUpdate", [id, item]) === false) - return false; - - this._pull[item.id] = item; - if (!this._is_parent_sync(item)) { - this._resync_parent(item); - } - //this._update_parents(item.id); - item.widget.update(item); - this.refreshTask(item.id); - this.callEvent("onAfterTaskUpdate", [id, item]); - this._sync_order(); - this._adjust_scales(); -}; -gantt._add_branch = function(task, silent){ - var pid = this.getParent(task); - if (!this.hasChild(pid)) - this._branches[pid] = []; - var branch = this.getChildren(pid); - var added_already = false; - for(var i = 0, length = branch.length; i < length; i++){ - if(branch[i] == task.id){ - added_already = true; - break; - } - } - if(!added_already) - branch.push(task.id); - - this._sync_parent(task); - if(!silent){ - this._sync_order(silent); - } -}; - -gantt._move_branch = function(task, old_parent, new_parent){ - this.setParent(task, new_parent); - this._sync_parent(task); - this._replace_branch_child(old_parent, task.id); - if(this.isTaskExists(new_parent) || new_parent == this.config.root_id){ - - this._add_branch(task); - }else{ - delete this._branches[task.id]; - } - task.$level = this.calculateTaskLevel(task); - //this._sync_order(); // HOSEK -}; -gantt._resync_parent = function(task){ - this._move_branch(task, task.$rendered_parent, this.getParent(task)); -}; -gantt._sync_parent = function(task){ - task.$rendered_parent = this.getParent(task); -}; -gantt._is_parent_sync = function(task){ - return (task.$rendered_parent == this.getParent(task)); -}; - - -gantt._replace_branch_child = function(node, old_id, new_id){ - var branch; - ysy.log.debug("_replace_branch_child","sort"); - /*if(!node){ // HOSEK - ysy.log.warning("deprecated: has to be node"); - return; - for(var i in this._branches){ - this._replace_branch_child(i,old_id,new_id); - } - return; - }*/ - branch = this.getChildren(node); - if (branch){ - var newbranch = []; - for (var i=0; i<branch.length; i++){ - if (branch[i] != old_id) - newbranch.push(branch[i]); - else if (new_id) - newbranch.push(new_id); - } - ysy.log.debug("new Branch="+JSON.stringify(newbranch),"sort"); - this._branches[node] = newbranch; - //this._sync_order(); - } -}; - -gantt.addTask = function(item, parent) { - if (!dhtmlx.defined(parent)) parent = this.getParent(item) || 0; - if (!this.isTaskExists(parent)) parent = 0; - this.setParent(item, parent); - item = this._init_task(item); - - if (this.callEvent("onBeforeTaskAdd", [item.id, item])===false) return false; - - this._pull[item.id] = item; - - this._add_branch(item); - - this.refreshData(); - this._adjust_scales(); - this.callEvent("onAfterTaskAdd", [item.id, item]); - return item.id; -}; - -gantt.addTaskFaster = function (item, parent) { - ysy.log.debug("addTaskNoDraw()","add_task"); - if (!dhtmlx.defined(parent)) parent = this.getParent(item) || 0; - if (!this.isTaskExists(parent)) parent = 0; - this.setParent(item, parent); - item = this._init_task(item); - - this._pull[item.id] = item; - - this._add_branch(item,true); - - this.refreshData(); - if(+this._min_date > +item.start_date || +this._max_date < +item.end_date){ - this.render(); - } - - return item.id; -}; - -gantt._default_task_date = function(item, parent_id){ - var parent = (parent_id && parent_id != this.config.root_id) ? this.getTask(parent_id) : false, - startDate = ''; - if(parent){ - startDate = parent.start_date; - }else{ - var first = this._order[0]; - startDate = first ? this.getTask(first).start_date : (this.config.start_date || this.getState().min_date); - } - return gantt.date.Date(startDate); -}; - -gantt._set_default_task_timing = function(task){ - task.start_date = task.start_date || gantt._default_task_date(task, this.getParent(task)); - task.duration = task.duration || this.config.duration_step; - task.end_date = task.end_date || this.calculateEndDate(task.start_date, task.duration); -}; - -/*gantt.createTask = function(item, parent){ - item = item || {}; - item.id = dhtmlx.uid(); - if(!item.start_date){ - item.start_date = gantt._default_task_date(item, parent); - } - if(item.text === undefined){ - item.text = gantt.locale.labels.new_task; - } - if(item.duration === undefined){ - item.duration = 1; - } - - if(parent){ - this.setParent(item, parent); - parent = this.getTask(parent); - parent.$open = true; - } - - if(!this.callEvent("onTaskCreated", [item])){ - return null; - } - if (this.config.details_on_create){ - item.$new = true; - this._pull[item.id] = this._init_task(item); - - this._add_branch(item); - item.$level = this.calculateTaskLevel(item); - this.selectTask(item.id); - this.refreshData(); - this.showLightbox(item.id); - }else{ - if (this.addTask(item)){ - this.showTask(item.id); - this.selectTask(item.id); - } - } - return item.id; -};*/ - -gantt.deleteTask = function(id) { - return this._deleteTask(id); -}; - -//TODO: do something with overcomplicated dataprocessor logic -gantt._getChildLinks = function(id){ - var item = this.getTask(id); - if(!item){ - return []; - } - - var links = item.$source.concat(item.$target); - - var branches = this.getChildren(item.id); - for (var i = 0; i < branches.length; i++) { - links = links.concat(this._getChildLinks(branches[i])); - } - - var res = {}; - for(var i=0; i < links.length; i++){ - res[links[i]] = true; - } - links = []; - for(var i in res){ - links.push(i); - } - - return links; -}; -gantt._getTaskTree = function(id){ - var item = this.getTask(id); - if(!item){ - return []; - } - - var items = []; - var branches = this.getChildren(item.id); - for (var i = 0; i < branches.length; i++) { - items.push(branches[i]); - items = items.concat(this._getTaskTree(branches[i])); - } - return items; -}; -gantt._deleteRelatedLinks = function(links, silent){ - var use_dp = (this._dp && !silent); - var prev_mode = ''; - var send_changes = use_dp ? this._dp.updateMode != 'off' : false; - if (use_dp){ - prev_mode = this._dp.updateMode; - this._dp.setUpdateMode("off"); - } - for(var i =0; i < links.length; i++){ - if (use_dp) { - this._dp.setGanttMode("links"); - this._dp.setUpdated(links[i],true,"deleted"); - } - this._deleteLink(links[i], true); - } - - if(use_dp){ - this._dp.setUpdateMode(prev_mode); - if(send_changes) - this._dp.sendAllData(); - } -}; -gantt._deleteRelatedTasks = function(id, silent){ - var use_dp = (this._dp && !silent); - var prev_mode = ''; - - if (use_dp) { - prev_mode = this._dp.updateMode; - this._dp.setGanttMode("tasks"); - this._dp.setUpdateMode("off"); - } - var tree = this._getTaskTree(id); - for (var i = 0; i < tree.length; i++) { - // add deleted subrow into dataprocessor update list manually - // because silent mode is on - var t_id = tree[i]; - this._unset_task(t_id); - if(use_dp){ - this._dp.setUpdated(t_id,true,"deleted"); - } - } - if(use_dp){ - - this._dp.setUpdateMode(prev_mode); - } -}; -gantt._unset_task = function(id){ - var item = this.getTask(id); - this._update_flags(id, null); - delete this._pull[id]; - this._move_branch(item, this.getParent(item), null); -}; -gantt._deleteTask = function(id, silent) { - var item = this.getTask(id); - if (!silent && this.callEvent("onBeforeTaskDelete", [id, item])===false) return false; - - var links = gantt._getChildLinks(id); - this._deleteRelatedTasks(id, silent); - this._deleteRelatedLinks(links, silent); - this._unset_task(id); - if (!silent) { - this.callEvent("onAfterTaskDelete", [id, item]); - this.refreshData(); - } - return true; -}; - -gantt.clearAll = function() { - this._clear_data(); - this.callEvent("onClear", []); - this.refreshData(); -}; -gantt._clear_data = function(){ - this._pull = {}; - this._branches = {}; - this._order = []; - this._order_full = []; - this._lpull = {}; - this._update_flags(); - this.userdata = {}; -}; - -gantt._update_flags = function(oldid, newid){ - // TODO: need a proper way to update all possible flags - if(oldid === undefined){ - this._lightbox_id = this._selected_task = null; - if (this._tasks_dnd.drag){ - this._tasks_dnd.drag.id = null; - } - }else{ - if (this._lightbox_id == oldid) - this._lightbox_id = newid; - if (this._selected_task == oldid){ - this._selected_task = newid; - } - if (this._tasks_dnd.drag && this._tasks_dnd.drag.id == oldid){ - this._tasks_dnd.drag.id = newid; - } - } -}; -//gantt.changeTaskId = function(oldid, newid) { -// var item = this._pull[newid] = this._pull[oldid]; -// this._pull[newid].id = newid; -// delete this._pull[oldid]; -// for (var id in this._pull) { -// var task = this._pull[id]; -// if(this.getParent(task) == oldid) -// this.setParent(task, newid); -// } -// this._update_flags(oldid, newid); -// this._replace_branch_child(this.getParent(item), oldid, newid); -// -// this.callEvent("onTaskIdChange", [oldid, newid]); -//}; - -gantt._get_duration_unit = function(){ - return (gantt._get_line(this.config.duration_unit)*1000) || this.config.duration_unit; -}; - -gantt._get_safe_type = function(type){ - return type || "task"; -}; -gantt._get_type_name = function(type_value){ - for(var i in this.config.types){ - if(this.config.types[i] == type_value){ - return i; - } - } - return "task"; -}; -gantt.getWorkHours = function(date){ - return this._working_time_helper.get_working_hours(date); -}; - -gantt.setWorkTime = function(config){ - this._working_time_helper.set_time(config); -}; - -gantt.isWorkTime = function(date, unit){ - var helper = this._working_time_helper; - return helper.is_working_unit(date, unit || this.config.duration_unit); -}; - -gantt.correctTaskWorkTime = function(task){ - alert("Forbidden function correctTaskWorkTime"); - if(gantt.config.work_time && gantt.config.correct_work_time){ - if(!gantt.isWorkTime(task.start_date)){ - task.start_date = gantt.getClosestWorkTime({date:task.start_date, dir:'future'}); - task.end_date = gantt.calculateEndDate(task.start_date, task.duration); - }else if(!gantt.isWorkTime(new Date(+task.end_date - 1))){ - task.end_date = gantt.calculateEndDate(task.start_date, task.duration); - } - } -}; - -gantt.getClosestWorkTime = function(config){ - var helper = this._working_time_helper; - if(config instanceof Date){ - config = { - date:config - }; - } - config.dir = config.dir || 'any'; - config.unit = config.unit || this.config.duration_unit; - return helper.get_closest_worktime(config); -}; - -gantt.calculateDuration = function(start_date, end_date){ - var helper = this._working_time_helper; - return helper.get_work_units_between(start_date, end_date, this.config.duration_unit, this.config.duration_step); -}; -gantt._hasDuration = function(start_date, end_date){ - var helper = this._working_time_helper; - return helper.is_work_units_between(start_date, end_date, this.config.duration_unit, this.config.duration_step); -}; - -gantt.calculateEndDate = function(start, duration, unit){ - var helper = this._working_time_helper; - return helper.add_worktime(start, duration, unit || this.config.duration_unit); -}; - -gantt._init_task = function(task){ - if (!dhtmlx.defined(task.id)) - task.id = dhtmlx.uid(); - - if(task.start_date) - task.start_date = gantt.date.parseDate(task.start_date, "xml_date"); - if(task.end_date) - task.end_date = gantt.date.parseDate(task.end_date, "xml_date"); - - - - if(task.start_date){ - if(!task.end_date && task.duration){ - task.end_date = this.calculateEndDate(task.start_date, task.duration); - } - } - - gantt._init_task_timing(task); - if(task.start_date && task.end_date){ - //gantt.correctTaskWorkTime(task); // HOSEK neopravovat počátky a konce dat ze serveru - } - - task.$source = []; - task.$target = []; - if(task.parent === undefined){ - this.setParent(task, this.config.root_id); - } - task.$open = dhtmlx.defined(task.open) ? task.open : this.config.open_tree_initially; - task.$level = this.calculateTaskLevel(task); - return task; -}; - -gantt._init_task_timing = function(task){ - var task_type = this._get_safe_type(task.type); - - if(task.$rendered_type === undefined){ - task.$rendered_type = task_type; - }else if(task.$rendered_type != task_type){ - delete task.$no_end; - delete task.$no_start; - task.$rendered_type = task_type; - } - - if((task.$no_end === undefined || task.$no_start === undefined) && task_type != this.config.types.milestone){ - if(task_type == this.config.types.project){ - //project duration is always defined by children duration - task.$no_end = task.$no_start = true; - this._set_default_task_timing(task); - }else{ - //tasks can have fixed duration, children duration(as projects), or one date fixed, and other defined by nested items - task.$no_end = !(task.end_date || task.duration); - task.$no_start = !task.start_date; - } - } - - if (task.start_date && task.end_date){ - task.duration = Math.max(this.calculateDuration(task.start_date, task.end_date),1); // HOSEK - because of weekend issues - } - task.duration = task.duration || 0; -}; -gantt._is_flex_task = function(task){ - return !!(task.$no_end || task.$no_start); -}; - -// downward calculation of project duration -gantt.resetProjectDates = function(task){ - if(task.$no_end || task.$no_start){ - var dates = this.getSubtaskDates(task.id); - if (task.minimal_end && task.minimal_end > dates.end_date) { - dates.end_date = moment(task.minimal_end); - dates.end_date._isEndDate = true; - } - if (task.maximal_start && task.maximal_start < dates.start_date) { - dates.start_date = moment(task.maximal_start); - } - ysy.log.debug("resetProjectDates to start="+dates.start_date+" end="+dates.end_date,"parent"); - this._assign_project_dates(task, dates.start_date, dates.end_date); - } -}; - -gantt.getSubtaskDates = function(task_id){ - var min = null, - max = null, - root = task_id !== undefined ? task_id : gantt.config.root_id; - - this.eachTask(function(child){ - //if(this._get_safe_type(child.type) == gantt.config.types.project) - // return; - //var dates=gantt.getSubtaskDates(child.id); - if(child.start_date){ - if(!min || min > child.start_date.valueOf()){ - min=child.start_date.valueOf(); - } - } - if(child.end_date){ - if(!max || max < child.end_date.valueOf()){ - max=child.end_date.valueOf(); - } - } - //ysy.log.debug("subtaskDates: root: "+task_id+" child: "+child.id+" min:"+moment(min).format("YYYY-MM-DD")); - //if((child.start_date && !child.$no_start) && (!min || min > child.start_date.valueOf())) - // min = child.start_date.valueOf(); - //if((child.end_date && !child.$no_end) && (!max || max < child.end_date.valueOf())) - // max = child.end_date.valueOf(); - }, root); - if((!min || !max) && task_id){ - var task = gantt.getTask(task_id); - min = min || task.start_date; - max = max || task.end_date; - } - var start_date = moment(min); - var end_date = moment(max); - end_date._isEndDate=true; - return { - start_date:start_date.isValid()?start_date:null, - end_date:end_date.isValid()?end_date:null - }; - return { - start_date: min ? gantt.date.Date(min) : null, - end_date: max ? gantt.date.Date(max): null - }; -}; - -gantt._assign_project_dates = function(task, from, to){ - if(task.$no_start){ - if(from && from != Infinity){ - task.start_date = gantt.date.Date(from); - }else{ - task.start_date = this._default_task_date(task, this.getParent(task)); - } - } - - if(task.$no_end){ - if(to && to != -Infinity){ - task.end_date = gantt.date.Date(to); - }else{ - task.end_date = this.calculateEndDate(task.start_date, this.config.duration_step); - } - } - if(task.$no_start || task.$no_end){ - this._init_task_timing(task); - } -}; - -// upward calculation of project duration -gantt._update_parents = function(taskId, silent){ - ysy.log.debug("_update_parents on ID="+taskId,"parent"); - if(!taskId) return; - - var task = this.getTask(taskId); - var pid = this.getParent(task); - - while(!(task.$no_end || task.$no_start) && pid && this.isTaskExists(pid)){ - task = this.getTask(pid); - pid = this.getParent(task); - } - - if(task.$no_start || task.$no_end){ - gantt.resetProjectDates(task); - - if(!silent) - this.refreshTask(task.id, true); - } - - if(pid && this.isTaskExists(pid)){ - this._update_parents(pid, silent); - } -}; -gantt.isChildOf = function(child_id, parent_id){ - if(!this.isTaskExists(child_id)) - return false; - if(parent_id === this.config.root_id) - return this.isTaskExists(child_id); - - var task = this.getTask(child_id); - var pid = this.getParent(child_id); - - while(task && this.isTaskExists(pid)){ - task = this.getTask(pid); - - if(task && task.id == parent_id) - return true; - pid = this.getParent(task); - } - return false; -}; - -gantt.roundDate = function(config){ - alert("Forbidden function roundDate"); - if(config instanceof Date){ - config = { - date: config, - unit: gantt._tasks.unit, - step: gantt._tasks.step - }; - } - var date = config.date, - steps = config.step, - unit = config.unit; - var rounding=this._get_line(unit)*1000; - var tzOffset = date.getTimezoneOffset(); // HOSEK - return moment(Math.round((+date) / rounding) * rounding).add(tzOffset,"m").toDate(); - /*var upper, lower; - if(unit == gantt._tasks.unit && steps == gantt._tasks.step && - +date >= +gantt._min_date && +date <= +gantt._max_date){ - //find date in time scale config - var colIndex = Math.floor(gantt._day_index_by_date(date)); - lower = new Date(gantt._tasks.trace_x[colIndex]); - upper = new Date(lower); - if(.trace_x[colIndex + 1]) - upper = new Date(gantt._tasks.trace_x[colIndex + 1]); - }else{ - upper = gantt.date[unit + "_start"](new Date(this._min_date)); - while(+upper < +date){ - upper = gantt.date[unit + "_start"](gantt.date.add(upper, steps, unit)); - - var tzOffset = upper.getTimezoneOffset(); - upper = gantt.date.add(upper, steps, unit); - upper = gantt._correct_dst_change(upper, tzOffset, upper, unit); - if(gantt.date[unit + '_start']) - upper = gantt.date[unit + '_start'](upper); - } - - lower = gantt.date.add(upper, -1*steps, unit); - - } - if(config.dir && config.dir == 'future') - return upper; - if(config.dir && config.dir == 'past') - return lower; - - if(Math.abs(date - lower) < Math.abs(upper - date)){ - return lower; - }else{ - return upper; - }*/ - -}; - - -gantt.attachEvent("onBeforeTaskUpdate", function(id, task){ - gantt._init_task_timing(task); - return true; -}); -gantt.attachEvent("onBeforeTaskAdd", function(id, task){ - gantt._init_task_timing(task); - return true; -}); - -gantt.calculateTaskLevel = function (item) { - var level = 0; - while (this.getParent(item)) { - if (!this.isTaskExists(this.getParent(item))) break; - item = this.getTask(this.getParent(item)); - level++; - } - return level; -}; - - -gantt.sort = function(field, desc, parent, silent) { - var render = !silent;//4th argument to cancel redraw after sorting - - if (!this.isTaskExists(parent)) { - parent = this.config.root_id; - } - - if (!field) field = "order"; - var criteria = (typeof(field) == "string") ? (function(a, b) { - if(a[field] == b[field]){ - return 0; - } - - var result = a[field] > b[field]; - if (desc) result = !result; - return result ? 1 : -1; - }) : field; - - - var els = this.getChildren(parent); - if (els){ - var temp = []; - for (var i = els.length - 1; i >= 0; i--) - temp[i] = this._pull[els[i]]; - - temp.sort(criteria); - - for (var i = 0; i < temp.length; i++) { - els[i] = temp[i].id; - this.sort(field, desc, els[i], true); - } - } - - if (render) { - this.render(); - } -}; - -gantt.getNext = function(id) { - for (var i = 0; i < this._order.length-1; i++) { - if (this._order[i] == id) - return this._order[i+1]; - } - return null; -}; -gantt.getPrev = function(id) { - for (var i = 1; i < this._order.length; i++) { - if (this._order[i] == id) - return this._order[i-1]; - } - return null; -}; - -gantt._get_parent_id = function(task){ - var parent = this.config.root_id; - if(task){ - parent = task.parent; - } - return parent; -}; - -gantt.getParent = function(id){ - var task = null; - if(id.id){ - task = id; - }else if(this.isTaskExists(id)){ - task = gantt.getTask(id); - } - - return this._get_parent_id(task); -}; - - - -gantt.setParent = function(task, new_pid){ - task.parent = new_pid; -}; - -gantt.getSiblings = function(id){ - if(!this.isTaskExists(id)){ - return []; - } - var parent = this.getParent(id); - return this.getChildren(parent); -}; -gantt.getNextSibling = function(id){ - var siblings = this.getSiblings(id); - for(var i= 0, len = siblings.length; i < len; i++){ - if(siblings[i] == id) - return siblings[i+1] || null; - } - return null; -}; -gantt.getPrevSibling = function(id){ - var siblings = this.getSiblings(id); - for(var i= 0, len = siblings.length; i < len; i++){ - if(siblings[i] == id) - return siblings[i-1] || null; - } - return null; -}; - -/*gantt._dp_init = function(dp) { - dp.setTransactionMode("POST", true); - dp.serverProcessor += (dp.serverProcessor.indexOf("?") != -1 ? "&" : "?") + "editing=true"; - dp._serverProcessor = dp.serverProcessor; - - dp.styles = { - updated:"gantt_updated", - inserted:"gantt_inserted", - deleted:"gantt_deleted", - invalid:"gantt_invalid", - error:"gantt_error", - clear:"" - }; - - dp._methods=["_row_style","setCellTextStyle","_change_id","_delete_task"]; - - dp.setGanttMode = function(mode){ - var modes = dp.modes || {}; - if(dp._ganttMode){ - modes[dp._ganttMode] = { - _in_progress : dp._in_progress, - _invalid : dp._invalid, - updatedRows : dp.updatedRows - }; - } - - var newState = modes[mode]; - if(!newState){ - newState = modes[mode] = { - _in_progress : {}, - _invalid : {}, - updatedRows : [] - }; - } - dp._in_progress = newState._in_progress; - dp._invalid = newState._invalid; - dp.updatedRows = newState.updatedRows; - dp.modes = modes; - dp._ganttMode = mode; - }; - - this._sendTaskOrder = function(id, item){ - if(item.$drop_target){ - dp.setGanttMode("tasks"); - this.getTask(id).target = item.$drop_target; - dp.setUpdated(id, true,"order"); - delete this.getTask(id).$drop_target; - } - }; - this.attachEvent("onAfterTaskAdd", function(id, item) { - dp.setGanttMode("tasks"); - dp.setUpdated(id,true,"inserted"); - }); - this.attachEvent("onAfterTaskUpdate", function(id, item) { - dp.setGanttMode("tasks"); - dp.setUpdated(id,true); - - gantt._sendTaskOrder(id, item); - }); - this.attachEvent("onAfterTaskDelete", function(id, item) { - dp.setGanttMode("tasks"); - dp.setUpdated(id,true,"deleted"); - - if(dp.updateMode != 'off' && !dp._tSend){ - dp.sendAllData(); - } - - }); - - this.attachEvent("onAfterLinkUpdate", function(id, item) { - dp.setGanttMode("links"); - dp.setUpdated(id, true); - }); - this.attachEvent("onAfterLinkAdd", function(id, item) { - dp.setGanttMode("links"); - dp.setUpdated(id, true,"inserted"); - }); - this.attachEvent("onAfterLinkDelete", function(id, item) { - dp.setGanttMode("links"); - dp.setUpdated(id, true,"deleted"); - }); - this.attachEvent("onRowDragEnd", function(id, target) { - gantt._sendTaskOrder(id, gantt.getTask(id)); - }); - - dp.attachEvent("onBeforeDataSending", function() { - var url = this._serverProcessor; - if(this._tMode == "REST"){ - var mode = this._ganttMode.substr(0, this._ganttMode.length - 1);// links, tasks -> /link/id, /task/id - - url = url.substring(0, url.indexOf("?") > -1 ? url.indexOf("?") : url.length); - //editing=true& - this.serverProcessor = url + (url.slice(-1) == "/" ? "" : "/") + mode; - }else{ - this.serverProcessor = url + window.dhtmlx.url(url) + "gantt_mode=" + this._ganttMode; - } - - return true; - }); - - - var afterUpdate = dp.afterUpdate; - dp.afterUpdate = function(){ - var xml; - if(arguments.length == 3){ - xml = arguments[1]; - }else{ - // old dataprocessor - xml = arguments[4]; - } - var mode = dp._ganttMode; - var reqUrl = xml.filePath; - - if(this._tMode != "REST"){ - if (reqUrl.indexOf("gantt_mode=links") != -1) { - mode = "links"; - }else{ - mode = "tasks"; - } - }else{ - if(reqUrl.indexOf("/link") > reqUrl.indexOf("/task")){ - mode = "links"; - }else{ - mode = "tasks"; - } - } - dp.setGanttMode(mode); - - var res = afterUpdate.apply(dp, arguments); - dp.setGanttMode(mode); - return res; - }; - - dp._getRowData=dhtmlx.bind(function(id, pref) { - var task; - if (dp._ganttMode == "tasks") - task = this.isTaskExists(id) ? this.getTask(id) : { id: id }; - else - task = this.isLinkExists(id) ? this.getLink(id) : { id: id }; - - task = dhtmlx.copy(task); - - var data = {}; - for (var key in task) { - if (key.substr(0, 1) == "$") continue; - var value = task[key]; - if (value instanceof Date) - data[key] = this.templates.xml_format(value); - else if(value === null) - data[key] = ""; - else - data[key] = value; - } - if(task.$no_start){ - task.start_date = ""; - task.duration = ""; - } - if(task.$no_end){ - task.end_date = ""; - task.duration = ""; - } - data[dp.action_param] = this.getUserData(id, dp.action_param); - return data; - }, this); - - this._change_id = dhtmlx.bind(function(oldid, newid) { - if (dp._ganttMode != "tasks") - this.changeLinkId(oldid, newid); - else - this.changeTaskId(oldid, newid); - }, this); - - this._row_style = function(row_id, classname){ - if (dp._ganttMode != "tasks") return; - var el = gantt.getTaskRowNode(row_id); - if (!el) return; - if (!classname) { - var regexp = / (gantt_updated|gantt_inserted|gantt_deleted|gantt_invalid|gantt_error)/g; - el.className = el.className.replace(regexp, ""); - } else - el.className += " " + classname; - }; - - // fake method for dataprocessor - this._delete_task = function(row_id, node){}; - - this._dp = dp; - - gantt._patch_dhx4_ajax(); -}; -*//* -gantt._patch_dhx4_ajax = function(){ - var dhxVersion = parseInt((dhx4.version || "").split(".").join(""), 10); - - // dhtmlx 4.0.0 - 4.1.3 does not provide filePath parameter to callback, patch won't be needed for future versions - if(dhxVersion <= 413){ - window.dhx4.ajax._call = function(method, url, postData, async, onLoad, longParams, headers) { - - var t = (window.XMLHttpRequest && !dhx4.isIE ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP")); - var isQt = (navigator.userAgent.match(/AppleWebKit/) != null && navigator.userAgent.match(/Qt/) != null && navigator.userAgent.match(/Safari/) != null); - - if (async == true) { - t.onreadystatechange = function() { - if ((t.readyState == 4) || (isQt == true && t.readyState == 3)) { // what for long response and status 404? - if (t.status != 200 || t.responseText == "") - if (!dhx4.callEvent("onAjaxError", [t])) return; - - window.setTimeout(function(){ - if (typeof(onLoad) == "function") { - onLoad.apply(window, [{xmlDoc:t, filePath:url}]); // dhtmlx-compat, response.xmlDoc.responseXML/responseText - } - if (longParams != null) { - if (typeof(longParams.postData) != "undefined") { - dhx4.ajax.postLong(longParams.url, longParams.postData, onLoad); - } else { - dhx4.ajax.getLong(longParams.url, onLoad); - } - } - onLoad = null; - t = null; - },1); - } - } - } - - if (method == "GET" && this.cache != true) { - url += (url.indexOf("?")>=0?"&":"?")+"dhxr"+new Date().getTime()+"=1"; - } - - t.open(method, url, async); - - if (headers){ - for (var key in headers) - t.setRequestHeader(key, headers[key]); - } else if (method.toUpperCase() == "POST" || method == "PUT" || method == "DELETE") { - t.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); - } else if (method == "GET") { - postData = null; - } - - t.setRequestHeader("X-Requested-With", "XMLHttpRequest"); - - t.send(postData); - - if (!async) return {xmlDoc:t, filePath:url}; // dhtmlx-compat, response.xmlDoc.responseXML/responseText - - }; - } - - gantt._patch_dhx4_ajax = function(){}; -}; - -gantt.getUserData = function(id, name) { - if (!this.userdata) this.userdata = {}; - if (this.userdata[id] && this.userdata[id][name]) return this.userdata[id][name]; - return ""; -}; -gantt.setUserData = function(id, name, value) { - if (!this.userdata) this.userdata = {}; - if (!this.userdata[id]) this.userdata[id] = {}; - this.userdata[id][name] = value; -}; -*/ - -gantt._init_link = function(link) { - if (!dhtmlx.defined(link.id)) - link.id = dhtmlx.uid(); - return link; -}; - -gantt._sync_links = function() { - for (var id in this._pull) { - this._pull[id].$source = []; - this._pull[id].$target = []; - } - for (var id in this._lpull) { - var link = this._lpull[id]; - if(this._pull[link.source]) - this._pull[link.source].$source.push(id); - if(this._pull[link.target]) - this._pull[link.target].$target.push(id); - } -}; - -gantt.getLink = function(id) { - dhtmlx.assert(this._lpull[id], "Link doesn't exist"); - return this._lpull[id]; -}; - -gantt.getLinks = function(){ - var links = []; - for (var key in gantt._lpull) - links.push(gantt._lpull[key]); - return links; -}; - -gantt.isLinkExists = function(id) { - return dhtmlx.defined(this._lpull[id]); -}; - -gantt.addLink = function(link) { - link = this._init_link(link); - - if (this.callEvent("onBeforeLinkAdd", [link.id, link])===false) return false; - - this._lpull[link.id] = link; - this._sync_links(); - //this._render_link(link.id); - this.refreshLink(link.id); - this.callEvent("onAfterLinkAdd", [link.id, link]); - return link.id; -}; - -gantt.updateLink = function (id, data) { - if (!dhtmlx.defined(data)) - data = this.getLink(id); - - if (this.callEvent("onBeforeLinkUpdate", [id, data]) === false) - return false; - - this._lpull[id] = data; - data.widget.update(data); - this._sync_links(); - //this._render_link(id); - this.refreshLink(id); - this.callEvent("onAfterLinkUpdate", [id, data]); - return true; -}; - -gantt.deleteLink = function(id) { - return this._deleteLink(id); -}; - -gantt._deleteLink = function(id, silent) { - var link = this.getLink(id); - if (!silent && this.callEvent("onBeforeLinkDelete", [id, link])===false) return false; - - delete this._lpull[id]; - this._sync_links(); - this.refreshLink(id); - if (!silent) this.callEvent("onAfterLinkDelete", [id, link]); - return true; -}; - -//gantt.changeLinkId = function(oldid, newid) { -// this._lpull[newid] = this._lpull[oldid]; -// this._lpull[newid].id = newid; -// delete this._lpull[oldid]; -// -// this._sync_links(); -// this.callEvent("onLinkIdChange", [oldid, newid]); -//}; - - -gantt.getChildren = function(id) { - return dhtmlx.defined(this._branches[id]) ? this._branches[id] : []; -}; -gantt.hasChild = function(id) { - return (dhtmlx.defined(this._branches[id]) && this._branches[id].length); -}; - - -gantt.refreshData = function(){ - this.refresher.renderData(); - //this._render_data(); -}; - - -gantt._configure = function(col, data, force){ - for (var key in data) - if (typeof col[key] == "undefined" || force) - col[key] = data[key]; -}; -gantt._init_skin = function(){ - gantt._get_skin(false); - gantt._init_skin = function(){}; -}; -gantt._get_skin = function(force){ - if (!gantt.skin || force){ - var links = document.getElementsByTagName("link"); - for (var i = 0; i < links.length; i++) { - var res = links[i].href.match("dhtmlxgantt_([a-z]+).css"); - if (res){ - gantt.skin = res[1]; - break; - } - } - } - - if (!gantt.skin) gantt.skin = "terrace"; - var skinset = gantt.skins[gantt.skin]; - - //apply skin related settings - this._configure(gantt.config, skinset.config, force); - - var config = gantt.getGridColumns(); - if (config[1] && typeof config[1].width == "undefined") - config[1].width = skinset._second_column_width; - if (config[2] && typeof config[2].width == "undefined") - config[2].width = skinset._third_column_width; - - if (skinset._lightbox_template) - gantt._lightbox_template = skinset._lightbox_template; - - //gantt.resetLightbox(); //HOSEK -}; -gantt.resetSkin = function(){ - this.skin = ""; - this._get_skin(true); -}; -gantt.skins = {}; - -/* -gantt._lightbox_methods = {}; -gantt._lightbox_template="<div class='gantt_cal_ltitle'><span class='gantt_mark'> </span><span class='gantt_time'></span><span class='gantt_title'></span></div><div class='gantt_cal_larea'></div>"; - -gantt.showLightbox=function(id){ - if (!id || gantt._is_readonly(this.getTask(id))) return; - if (!this.callEvent("onBeforeLightbox",[id])) return; - - var task = this.getTask(id); - - var box = this.getLightbox(this._get_safe_type(task.type)); - this._center_lightbox(box); - this.showCover(); - this._fill_lightbox(id,box); - this.callEvent("onLightbox",[id]); -}; -gantt._get_timepicker_step = function(){ - if(this.config.round_dnd_dates){ - var scale = gantt._tasks, - step = (this._get_line(scale.unit) * scale.step)/60;//timepicker step is measured in minutes - if(step >= 60*24 || !this._is_chart_visible()){ - step = this.config.time_step; - } - return step; - } - return this.config.time_step; -}; -gantt.getLabel = function(property, key) { - var sections = this._get_typed_lightbox_config(); - for (var i=0; i<sections.length; i++) { - if(sections[i].map_to == property) { - var options = sections[i].options; - for (var j=0; j<options.length; j++) { - if(options[j].key == key) { - return options[j].label; - } - } - } - } - return ""; -}; - -gantt.updateCollection = function(list_name, collection) { - collection = collection.slice(0); - var list = gantt.serverList(list_name); - if (!list) return false; - list.splice(0, list.length); - list.push.apply(list, collection || []); - gantt.resetLightbox(); -}; -gantt.getLightboxType = function(){ - return this._get_safe_type(this._lightbox_type); -}; -gantt.getLightbox = function(type){ - if(type === undefined) - type = this.getLightboxType(); - - if (!this._lightbox || this.getLightboxType() != this._get_safe_type(type)){ - this._lightbox_type = this._get_safe_type(type); - var d=document.createElement("DIV"); - d.className="gantt_cal_light"; - - var full_width = this._is_lightbox_timepicker(); - if (gantt.config.wide_form || full_width) - d.className+=" gantt_cal_light_wide"; - - if (full_width) { - gantt.config.wide_form = true; - d.className+=" gantt_cal_light_full"; - } - - - d.style.visibility="hidden"; - var html = this._lightbox_template; - - var buttons = this.config.buttons_left; - for (var i = 0; i < buttons.length; i++){ - // needed to migrate from 'dhx_something' to 'gantt_something' naming in a lightbox - var button = this.config._migrate_buttons[buttons[i]] ? this.config._migrate_buttons[buttons[i]] : buttons[i]; - - html+="<div class='gantt_btn_set gantt_left_btn_set "+button+"_set'><div dhx_button='1' class='"+button+"'></div><div>"+this.locale.labels[button]+"</div></div>"; - - } - buttons = this.config.buttons_right; - for (var i = 0; i < buttons.length; i++){ - var button = this.config._migrate_buttons[buttons[i]] ? this.config._migrate_buttons[buttons[i]] : buttons[i]; - html+="<div class='gantt_btn_set gantt_right_btn_set "+button+"_set' style='float:right;'><div dhx_button='1' class='"+button+"'></div><div>"+this.locale.labels[button]+"</div></div>"; - - } - html+="</div>"; - d.innerHTML=html; - - if (gantt.config.drag_lightbox){ - d.firstChild.onmousedown = gantt._ready_to_dnd; - d.firstChild.onselectstart = function(){ return false; }; - d.firstChild.style.cursor = "pointer"; - gantt._init_dnd_events(); - - } - - document.body.insertBefore(d,document.body.firstChild); - this._lightbox=d; - - var sns = this._get_typed_lightbox_config(type); - html = this._render_sections(sns); - - var ds=d.getElementsByTagName("div"); - for (var i=0; i<ds.length; i++) { - var t_ds = ds[i]; - if (t_ds.className == "gantt_cal_larea") { - t_ds.innerHTML = html; - break; - } - } - - //sizes - this.resizeLightbox(); - - this._init_lightbox_events(this); - d.style.display="none"; - d.style.visibility="visible"; - } - return this._lightbox; -}; - -gantt._render_sections = function(sns) { - var html=""; - for (var i=0; i < sns.length; i++) { - var block=this.form_blocks[sns[i].type]; - if (!block) continue; //ignore incorrect blocks - sns[i].id="area_"+dhtmlx.uid(); - - var display = sns[i].hidden ? " style='display:none'" : ""; - var button = ""; - if (sns[i].button){ - button = "<div class='gantt_custom_button' index='"+i+"'><div class='gantt_custom_button_"+sns[i].button+"'></div><div>"+this.locale.labels["button_"+sns[i].button]+"</div></div>"; - } - if (this.config.wide_form){ - html+="<div class='gantt_wrap_section' " + display+">"; - } - html+="<div id='"+sns[i].id+"' class='gantt_cal_lsection'>"+button+this.locale.labels["section_"+sns[i].name]+"</div>"+block.render.call(this,sns[i]); - html+="</div>"; - } - return html; -}; - - -gantt.resizeLightbox=function(){ - var d = this._lightbox; - if (!d) return; - - var con = d.childNodes[1]; - con.style.height="0px"; - con.style.height=con.scrollHeight+"px"; - d.style.height=con.scrollHeight+this.config.lightbox_additional_height+"px"; - con.style.height=con.scrollHeight+"px"; //it is incredible , how ugly IE can be - - -}; - -gantt._center_lightbox = function(box) { - if (box){ - box.style.display="block"; - - var scroll_top = window.pageYOffset||document.body.scrollTop||document.documentElement.scrollTop; - var scroll_left = window.pageXOffset||document.body.scrollLeft||document.documentElement.scrollLeft; - - var view_height = window.innerHeight||document.documentElement.clientHeight; - - if(scroll_top) // if vertical scroll on window - box.style.top=Math.round(scroll_top+Math.max((view_height-box.offsetHeight)/2, 0))+"px"; - else // vertical scroll on body - box.style.top=Math.round(Math.max(((view_height-box.offsetHeight)/2), 0) + 9)+"px"; // +9 for compatibility with auto tests - - // not quite accurate but used for compatibility reasons - if(document.documentElement.scrollWidth > document.body.offsetWidth) // if horizontal scroll on the window - box.style.left=Math.round(scroll_left+(document.body.offsetWidth-box.offsetWidth)/2)+"px"; - else // horizontal scroll on the body - box.style.left=Math.round((document.body.offsetWidth-box.offsetWidth)/2)+"px"; - } -}; -gantt.showCover = function(){ - if(this._cover) return; - - this._cover=document.createElement("DIV"); - this._cover.className="gantt_cal_cover"; - var _document_height = ((document.height !== undefined) ? document.height : document.body.offsetHeight); - var _scroll_height = ((document.documentElement) ? document.documentElement.scrollHeight : 0); - this._cover.style.height = Math.max(_document_height, _scroll_height) + 'px'; - document.body.appendChild(this._cover); -}; - - -gantt._init_lightbox_events = function(){ - gantt.lightbox_events = {}; - - - gantt.lightbox_events["gantt_save_btn"] = function(e) { - gantt._save_lightbox(); - }; - - - gantt.lightbox_events["gantt_delete_btn"] = function(e) { - if(!gantt.callEvent("onLightboxDelete", [gantt._lightbox_id])) - return; - - if(gantt.isTaskExists(gantt._lightbox_id)){ - gantt.$click.buttons["delete"](gantt._lightbox_id); - }else{ - gantt.hideLightbox(); - } - - }; - - - gantt.lightbox_events["gantt_cancel_btn"] = function(e) { - gantt._cancel_lightbox(); - }; - - - gantt.lightbox_events["default"] = function(e, src) { - if (src.getAttribute("dhx_button")) { - gantt.callEvent("onLightboxButton", [src.className, src, e]); - } else { - var index, block, sec; - if (src.className.indexOf("gantt_custom_button") != -1) { - if (src.className.indexOf("gantt_custom_button_") != -1) { - index = src.parentNode.getAttribute("index"); - sec = src.parentNode.parentNode; - } else { - index = src.getAttribute("index"); - sec = src.parentNode; - src = src.firstChild; - } - } - - var sections = gantt._get_typed_lightbox_config(); - - if (index) { - block = gantt.form_blocks[sections[index].type]; - block.button_click(index, src, sec, sec.nextSibling); - } - } - }; - dhtmlxEvent(gantt.getLightbox(), "click", function(e) { - e = e || window.event; - var src = e.target ? e.target : e.srcElement; - - if (!src.className) - src = src.previousSibling; - if (src && src.className && src.className.indexOf("gantt_btn_set") === 0) - src = src.firstChild; - if (src && src.className) { - var func = dhtmlx.defined(gantt.lightbox_events[src.className]) ? gantt.lightbox_events[src.className] : gantt.lightbox_events["default"]; - return func(e, src); - } - return false; - }); - - gantt.getLightbox().onkeydown=function(e){ - switch((e||event).keyCode){ - case gantt.keys.edit_save: - if ((e||event).shiftKey) return; - gantt._save_lightbox(); - break; - case gantt.keys.edit_cancel: - gantt._cancel_lightbox(); - break; - default: - break; - } - }; -}; - -gantt._cancel_lightbox=function(){ - var task = this.getLightboxValues(); - this.callEvent("onLightboxCancel",[this._lightbox_id, task.$new]); - if(gantt.isTaskExists(task.id) && task.$new){ - this._deleteTask(task.id, true); - } - - this.refreshData(); - this.hideLightbox(); -}; - -gantt._save_lightbox=function(){ - var task = this.getLightboxValues(); - if(!this.callEvent("onLightboxSave", [this._lightbox_id, task, !!task.$new])) - return; - - if (task.$new){ - delete task.$new; - this.addTask(task); - }else if(this.isTaskExists(task.id)){ - dhtmlx.mixin(this.getTask(task.id), task, true); - this.updateTask(task.id); - } - this.refreshData(); - - // TODO: do we need any blockable events here to prevent closing lightbox? - this.hideLightbox(); -}; - -gantt._resolve_default_mapping = function(section) { - var mapping = section.map_to; - var time_controls = {"time":true, "duration":true}; - if(time_controls[section.type]){ - if(section.map_to == 'auto'){ - mapping = {start_date: "start_date", end_date: "end_date", duration: "duration"}; - }else if(typeof(section.map_to) === "string"){ - mapping = {start_date: section.map_to}; - } - } - - return mapping; -}; - -gantt.getLightboxValues=function(){ - var task = {}; - - if(gantt.isTaskExists(this._lightbox_id)) { - task = dhtmlx.mixin({}, this.getTask(this._lightbox_id)); - } - - var sns = this._get_typed_lightbox_config(); - for (var i=0; i < sns.length; i++) { - var node = document.getElementById(sns[i].id); - node=(node?node.nextSibling:node); - var block=this.form_blocks[sns[i].type]; - if(!block) continue; - var res=block.get_value.call(this,node,task, sns[i]); - var map_to = gantt._resolve_default_mapping(sns[i]); - if (typeof map_to == "string" && map_to != "auto") { - task[map_to] = res; - } else if(typeof map_to == "object") { - for(var property in map_to) { - if(map_to[property]) - task[map_to[property]] = res[property]; - } - } - } - return task; -}; - - -gantt.hideLightbox=function(){ - var box = this.getLightbox(); - if (box) box.style.display="none"; - this._lightbox_id=null; - - this.hideCover(); - this.callEvent("onAfterLightbox",[]); -}; -gantt.hideCover=function(){ - if (this._cover) - this._cover.parentNode.removeChild(this._cover); - this._cover=null; -}; - -gantt.resetLightbox = function(){ - if (gantt._lightbox && !gantt._custom_lightbox) - gantt._lightbox.parentNode.removeChild(gantt._lightbox); - gantt._lightbox = null; -}; -gantt._set_lightbox_values = function(data, box){ - var task = data; - var s = box.getElementsByTagName("span"); - if (gantt.templates.lightbox_header) { - s[1].innerHTML = ""; - s[2].innerHTML = gantt.templates.lightbox_header(task.start_date, task.end_date, task); - } else { - s[1].innerHTML = this.templates.task_time(task.start_date, task.end_date, task); - s[2].innerHTML = (this.templates.task_text(task.start_date, task.end_date, task) || "").substr(0, 70); //IE6 fix - } - - - var sns = this._get_typed_lightbox_config(this.getLightboxType()); - for (var i = 0; i < sns.length; i++) { - var section = sns[i]; - - if(!this.form_blocks[section.type]){ - continue;//skip incorrect sections, same check is done during rendering - } - - - var node = document.getElementById(section.id).nextSibling; - var block = this.form_blocks[section.type]; - var map_to = gantt._resolve_default_mapping(sns[i]); - var value = dhtmlx.defined(task[map_to]) ? task[map_to] : section.default_value; - block.set_value.call(gantt, node, value, task, section); - - if (section.focus) - block.focus.call(gantt, node); - } - if(data.id) - gantt._lightbox_id = data.id; -}; -gantt._fill_lightbox = function(id, box) { - var task = this.getTask(id); - this._set_lightbox_values(task, box); -}; - - -gantt.getLightboxSection = function(name){ - var config = this._get_typed_lightbox_config(); - var i =0; - for (i; i < config.length; i++) - if (config[i].name == name) - break; - var section = config[i]; - if(!section) - return null; - - if (!this._lightbox) - this.getLightbox(); - var header = document.getElementById(section.id); - var node = header.nextSibling; - - var result = { - section: section, - header: header, - node: node, - getValue:function(ev){ - return gantt.form_blocks[section.type].get_value.call(gantt, node, (ev||{}), section); - }, - setValue:function(value, ev){ - return gantt.form_blocks[section.type].set_value.call(gantt, node, value, (ev||{}), section); - } - }; - - var handler = this._lightbox_methods["get_"+section.type+"_control"]; - return handler?handler(result):result; -}; - -gantt._lightbox_methods.get_template_control = function(result) { - result.control = result.node; - return result; -}; -gantt._lightbox_methods.get_select_control = function(result) { - result.control = result.node.getElementsByTagName('select')[0]; - return result; -}; -gantt._lightbox_methods.get_textarea_control = function(result) { - result.control = result.node.getElementsByTagName('textarea')[0]; - return result; -}; -gantt._lightbox_methods.get_time_control = function(result) { - result.control = result.node.getElementsByTagName('select'); // array - return result; -}; - - - -*/ - -gantt._init_dnd_events = function(){ - dhtmlxEvent(document.body, "mousemove", gantt._move_while_dnd); - dhtmlxEvent(document.body, "mouseup", gantt._finish_dnd); - gantt._init_dnd_events = function(){}; -}; -gantt._move_while_dnd = function(e){ - if (gantt._dnd_start_lb){ - if (!document.gantt_unselectable){ - document.body.className += " gantt_unselectable"; - document.gantt_unselectable = true; - } - var lb = gantt.getLightbox(); - var now = (e&&e.target)?[e.pageX, e.pageY]:[event.clientX, event.clientY]; - lb.style.top = gantt._lb_start[1]+now[1]-gantt._dnd_start_lb[1]+"px"; - lb.style.left = gantt._lb_start[0]+now[0]-gantt._dnd_start_lb[0]+"px"; - } -}; -gantt._ready_to_dnd = function(e){ - var lb = gantt.getLightbox(); - gantt._lb_start = [parseInt(lb.style.left,10), parseInt(lb.style.top,10)]; - gantt._dnd_start_lb = (e&&e.target)?[e.pageX, e.pageY]:[event.clientX, event.clientY]; -}; -gantt._finish_dnd = function(){ - if (gantt._lb_start){ - gantt._lb_start = gantt._dnd_start_lb = false; - document.body.className = document.body.className.replace(" gantt_unselectable",""); - document.gantt_unselectable = false; - } -}; - - - - -gantt._focus = function(node, select){ - if (node && node.focus){ - if (gantt.config.touch){ - //do not focus editor, to prevent auto-zoom - } else { - try { - if (select && node.select) node.select(); - node.focus(); - }catch(e){ } - } - } -}; - - -/*gantt.form_blocks={ - getTimePicker: function(sns, hidden) { - var time_format = sns.time_format; - if (!time_format) { - // default order - var time_format = ["%d", "%m", "%Y"]; - if(gantt._get_line(gantt._tasks.unit) < gantt._get_line("day")){ - time_format.push("%H:%i"); - } - } - // map: default order => real one - sns._time_format_order = { size:0 }; - - - var cfg = this.config; - var dt = this.date.date_part(gantt.date.Date(gantt._min_date)); - var last = 24*60, first = 0; - if(gantt.config.limit_time_select){ - last = 60*cfg.last_hour+1; - first = 60*cfg.first_hour; - dt.setHours(cfg.first_hour); - } - var html = ""; - - for (var p = 0; p < time_format.length; p++) { - var time_option = time_format[p]; - - // adding spaces between selects - if (p > 0) { - html += " "; - } - - var options = ''; - switch (time_option) { - case "%Y": - sns._time_format_order[2] = p; - sns._time_format_order.size++; - //year - - var range, offset, start_year, end_year; - - if(sns.year_range){ - if(!isNaN(sns.year_range)){ - range = sns.year_range; - }else if(sns.year_range.push){ - // if - start_year = sns.year_range[0]; - end_year = sns.year_range[1]; - } - } - - range = range || 10; - offset = offset || Math.floor(range/2); - start_year = start_year || dt.getFullYear() - offset; - end_year = end_year || start_year + range; - - - for (var i=start_year; i < end_year; i++) - options+="<option value='"+(i)+"'>"+(i)+"</option>"; - break; - case "%m": - sns._time_format_order[1] = p; - sns._time_format_order.size++; - //month - for (var i=0; i < 12; i++) - options+="<option value='"+i+"'>"+this.locale.date.month_full[i]+"</option>"; - break; - case "%d": - sns._time_format_order[0] = p; - sns._time_format_order.size++; - //days - for (var i=1; i < 32; i++) - options+="<option value='"+i+"'>"+i+"</option>"; - break; - case "%H:%i": - // var last = 24*60, first = 0; - sns._time_format_order[3] = p; - sns._time_format_order.size++; - //hours - var i = first; - var tdate = dt.getDate(); - sns._time_values = []; - - while(i<last){ - var time=this.templates.time_picker(dt); - options+="<option value='"+i+"'>"+time+"</option>"; - sns._time_values.push(i); - dt.setTime(dt.valueOf()+this._get_timepicker_step()*60*1000); - var diff = (dt.getDate()!=tdate)?1:0; // moved or not to the next day - i=diff*24*60+dt.getHours()*60+dt.getMinutes(); - } - break; - default: - break; - } - - if(options){ - var readonly = sns.readonly ? "disabled='disabled'" : ""; - var display = hidden ? " style='display:none'" : ""; - html += "<select "+readonly+display +">"+options+"</select>"; - } - } - return html; - }, - _fill_lightbox_select: function (s,i,d,map,cfg) { - s[i+map[0]].value=d.getDate(); - s[i+map[1]].value=d.getMonth(); - s[i+map[2]].value=d.getFullYear(); - if (dhtmlx.defined(map[3])) { - var v = d.getHours()*60+ d.getMinutes(); - v = Math.round(v/gantt._get_timepicker_step())*gantt._get_timepicker_step(); - var input = s[i+map[3]]; - input.value= v; - //in case option not shown - input.setAttribute('data-value', v); - } - }, - template:{ - render: function(sns){ - var height=(sns.height||"30")+"px"; - return "<div class='gantt_cal_ltext gantt_cal_template' style='height:"+height+";'></div>"; - }, - set_value:function(node,value,ev,config){ - node.innerHTML = value||""; - }, - get_value:function(node,ev,config){ - return node.innerHTML||""; - }, - focus: function(node){ - } - }, - textarea:{ - render:function(sns){ - var height=(sns.height||"130")+"px"; - return "<div class='gantt_cal_ltext' style='height:"+height+";'><textarea></textarea></div>"; - }, - set_value:function(node,value,ev){ - node.firstChild.value=value||""; - }, - get_value:function(node,ev){ - return node.firstChild.value; - }, - focus:function(node){ - var a=node.firstChild; gantt._focus(a, true); - } - }, - select:{ - render:function(sns){ - var height=(sns.height||"23")+"px"; - var html="<div class='gantt_cal_ltext' style='height:"+height+";'><select style='width:100%;'>"; - for (var i=0; i < sns.options.length; i++) - html+="<option value='"+sns.options[i].key+"'>"+sns.options[i].label+"</option>"; - html+="</select></div>"; - return html; - }, - set_value:function(node,value,ev,sns){ - var select = node.firstChild; - if (!select._dhx_onchange && sns.onchange) { - select.onchange = sns.onchange; - select._dhx_onchange = true; - } - if (typeof value == "undefined") - value = (select.options[0]||{}).value; - select.value=value||""; - }, - get_value:function(node,ev){ - return node.firstChild.value; - }, - focus:function(node){ - var a=node.firstChild; gantt._focus(a, true); - } - }, - time:{ - render:function(sns) { - var time = this.form_blocks.getTimePicker.call(this, sns); - var parts = ["<div style='height:"+(sns.height || 30)+"px;padding-top:0px;font-size:inherit;text-align:center;' class='gantt_section_time'>"]; - parts.push(time); - - if(sns.single_date){ - time = this.form_blocks.getTimePicker.call(this, sns, true); - parts.push("<span></span>"); - }else{ - parts.push("<span style='font-weight:normal; font-size:10pt;'> – </span>"); - } - - parts.push(time); - parts.push("</div>"); - return parts.join(''); - }, - set_value:function(node,value,ev,config){ - var cfg = config; - var s=node.getElementsByTagName("select"); - - var map = config._time_format_order; - var map_size = config._time_format_size; - - if(cfg.auto_end_date) { - var _update_lightbox_select = function() { - start_date = new Date(s[map[2]].value,s[map[1]].value,s[map[0]].value,0,0); - end_date = gantt.calculateEndDate(start_date, 1); - this.form_blocks._fill_lightbox_select(s,map.size, end_date,map,cfg); - }; - for(var i=0; i<4; i++) { - s[i].onchange = _update_lightbox_select; - } - } - - var mapping = gantt._resolve_default_mapping(config); - - if(typeof(mapping) === "string") mapping = {start_date: mapping}; - - var start_date = ev[mapping.start_date] || new Date(); - var end_date = ev[mapping.end_date] || gantt.calculateEndDate(start_date, 1); - - this.form_blocks._fill_lightbox_select(s,0,start_date,map,cfg); - this.form_blocks._fill_lightbox_select(s,map.size,end_date,map,cfg); - }, - - get_value:function(node, ev, config) { - var s=node.getElementsByTagName("select"); - var map = config._time_format_order; - - var hours = 0, minutes = 0; - if (dhtmlx.defined(map[3])) { - var time = parseInt(s[map[3]].value, 10); - hours = Math.floor(time/60); - minutes = time%60; - } - var start_date=new Date(s[map[2]].value,s[map[1]].value,s[map[0]].value,hours,minutes); - - hours = minutes = 0; - if (dhtmlx.defined(map[3])) { - var time = parseInt(s[map.size+map[3]].value, 10); - hours = Math.floor(time/60); - minutes = time%60; - } - var end_date=new Date(s[map[2]+map.size].value,s[map[1]+map.size].value,s[map[0]+map.size].value,hours,minutes); - - if (end_date <= start_date) - end_date = gantt.date.add(start_date, gantt._get_timepicker_step(),"minute"); - - var mapped_fields = gantt._resolve_default_mapping(config); - - var res = { - start_date: new Date(start_date), - end_date: new Date(end_date) - }; - if(typeof mapped_fields == "string"){ - return res.start_date; - }else{ - return res; - } - }, - focus:function(node){ - gantt._focus(node.getElementsByTagName("select")[0]); - } - }, - duration:{ - render:function(sns) { - var time = this.form_blocks.getTimePicker.call(this, sns); - time = "<div class='gantt_time_selects'>"+time+"</div>"; - var label = this.locale.labels[this.config.duration_unit + "s"]; - - var singleDate = sns.single_date ? ' style="display:none"' : ""; - var readonly = sns.readonly ? " disabled='disabled'" : ""; - - var duration = "<div class='gantt_duration' "+singleDate+">" + - "<input type='button' class='gantt_duration_dec' value='-'"+readonly+">" + - "<input type='text' value='5' class='gantt_duration_value'"+readonly+">" + - "<input type='button' class='gantt_duration_inc' value='+'"+readonly+"> " + label + " <span></span>" + - "</div>"; - var html = "<div style='height:"+(sns.height || 30)+"px;padding-top:0px;font-size:inherit;' class='gantt_section_time'>"+time+" "+duration+"</div>"; - return html; - }, - set_value:function(node,value,ev,config){ - var cfg = config; - var s=node.getElementsByTagName("select"); - var inps = node.getElementsByTagName("input"); - - var duration = inps[1]; - var btns=[inps[0],inps[2]]; - var endspan = node.getElementsByTagName("span")[0]; - - var map = config._time_format_order; - - function _calc_date() { - var start_date = gantt.form_blocks.duration._get_start_date.call(gantt, node ,config); - var duration = gantt.form_blocks.duration._get_duration.call(gantt, node ,config); - var end_date = gantt.calculateEndDate(start_date, duration); - - endspan.innerHTML = gantt.templates.task_date(end_date); - } - - function _change_duration(step) { - var value = duration.value; - value = parseInt(value, 10); - if (window.isNaN(value)) - value = 0; - value+=step; - if (value < 1) value = 1; - duration.value = value; - _calc_date(); - } - - btns[0].onclick = dhtmlx.bind(function() { _change_duration(-1*this.config.duration_step); }, this); - btns[1].onclick = dhtmlx.bind(function() { _change_duration(1*this.config.duration_step); }, this); - s[0].onchange = _calc_date; - s[1].onchange = _calc_date; - s[2].onchange = _calc_date; - if (s[3]) s[3].onchange = _calc_date; - duration.onkeydown = dhtmlx.bind(function(e) { - e = e || window.event; - // up - var code = (e.charCode || e.keyCode || e.which); - - if (code == 40) { - _change_duration(-1*this.config.duration_step); - return false; - } - // down - if (code == 38) { - _change_duration(1*this.config.duration_step); - return false; - } - window.setTimeout(function(e) { - _calc_date(); - }, 1); - }, this); - - duration.onchange = dhtmlx.bind(function(e) { _calc_date(); }, this); - - var mapping = gantt._resolve_default_mapping(config); - if(typeof(mapping) === "string") mapping = {start_date: mapping}; - - var start_date = ev[mapping.start_date] || new Date(); - var end_date = ev[mapping.end_date] || gantt.calculateEndDate(start_date, 1); - var duration_val = Math.round(ev[mapping.duration]) || gantt.calculateDuration(start_date, end_date); - - gantt.form_blocks._fill_lightbox_select(s, 0, start_date, map, cfg); - duration.value = duration_val; - _calc_date(); - }, - - _get_start_date: function(node, config) { - var s=node.getElementsByTagName("select"); - var map = config._time_format_order; - var hours = 0; - var minutes = 0; - if (dhtmlx.defined(map[3])) { - var input = s[map[3]]; - var time = parseInt(input.value, 10); - if(isNaN(time) && input.hasAttribute("data-value")){ - time = parseInt(input.getAttribute("data-value"), 10); - } - - hours = Math.floor(time/60); - minutes = time%60; - } - return new Date(s[map[2]].value,s[map[1]].value,s[map[0]].value,hours,minutes); - }, - _get_duration: function(node, config) { - var duration = node.getElementsByTagName("input")[1]; - duration = parseInt(duration.value, 10); - if (!duration || window.isNaN(duration)) duration = 1; - if (duration < 0) duration *= -1; - return duration; - }, - - get_value:function(node, ev, config) { - var start_date = gantt.form_blocks.duration._get_start_date(node, config); - var duration = gantt.form_blocks.duration._get_duration(node, config); - - var end_date = gantt.calculateEndDate(start_date, duration); - var mapped_fields = gantt._resolve_default_mapping(config); - var res = { - start_date: new Date(start_date), - end_date: new Date(end_date), - duration: duration - }; - if(typeof mapped_fields == "string"){ - return res.start_date; - }else{ - return res; - } - }, - focus:function(node){ - gantt._focus(node.getElementsByTagName("select")[0]); - } - }, - parent: { - _filter : function(options, config, item_id){ - var filter = config.filter || function(){ return true;}; - - options = options.slice(0); - - for(var i=0; i < options.length; i++){ - var task = options[i]; - if(task.id == item_id || gantt.isChildOf(task.id, item_id) || filter(task.id, task) === false){ - options.splice(i, 1); - i--; - } - } - return options; - }, - - _display : function(config, item_id){ - var tasks = [], - options = []; - if(item_id){ - tasks = gantt.getTaskByTime(); - if(config.allow_root){ - tasks.unshift({id:gantt.config.root_id, text:config.root_label || ""}); - } - tasks = this._filter(tasks, config, item_id); - if(config.sort){ - tasks.sort(config.sort); - } - } - var text = config.template || gantt.templates.task_text; - for(var i = 0; i < tasks.length; i++){ - var label = text.apply(gantt, [tasks[i].start_date, tasks[i].end_date, tasks[i]]); - if(label === undefined){ - label = ""; - } - options.push({ - key: tasks[i].id, - label: label - }); - } - config.options = options; - config.map_to = config.map_to || "parent"; - return gantt.form_blocks.select.render.apply(this, arguments); - }, - render : function(sns){ - return gantt.form_blocks.parent._display(sns, false); - }, - set_value:function(node,value,ev,config){ - var tmpDom = document.createElement("div"); - tmpDom.innerHTML = gantt.form_blocks.parent._display(config, ev.id); - var newOptions = tmpDom.removeChild(tmpDom.firstChild); - node.onselect = null; - node.parentNode.replaceChild(newOptions, node); - - return gantt.form_blocks.select.set_value.apply(gantt, [newOptions,value,ev,config]); - }, - get_value:function(){ - return gantt.form_blocks.select.get_value.apply(gantt, arguments); - }, - focus:function(){ - return gantt.form_blocks.select.focus.apply(gantt, arguments); - } - } -}; - -gantt._is_lightbox_timepicker = function() { - var s = this._get_typed_lightbox_config(); - for (var i = 0; i < s.length; i++) - if (s[i].name == "time" && s[i].type == "time") - return true; - return false; -}; - -gantt._dhtmlx_confirm = function(message, title, callback, ok) { - if (!message) - return callback(); - var opts = { text: message }; - if (title) - opts.title = title; - if(ok){ - opts.ok = ok; - } - if (callback) { - opts.callback = function(result) { - if (result) - callback(); - }; - } - dhtmlx.confirm(opts); -}; - -gantt._get_typed_lightbox_config = function(type){ - if(type === undefined){ - type = this.getLightboxType(); - } - - var field = this._get_type_name(type); - - if(gantt.config.lightbox[field+"_sections"]){ - return gantt.config.lightbox[field+"_sections"]; - }else{ - return gantt.config.lightbox.sections; - } -}; - -gantt._silent_redraw_lightbox = function(type){ - var oldType = this.getLightboxType(); - - if(this.getState().lightbox){ - var taskId = this.getState().lightbox; - var formData = this.getLightboxValues(), - task = dhtmlx.copy(this.getTask(taskId)); - - this.resetLightbox(); - - var updTask = dhtmlx.mixin(task, formData, true); - var box = this.getLightbox(type ? type : undefined); - this._center_lightbox(this.getLightbox()); - this._set_lightbox_values(updTask, box); - }else{ - this.resetLightbox(); - this.getLightbox(type ? type : undefined); - } - this.callEvent("onLightboxChange", [oldType, this.getLightboxType()]); -}; -gantt._extend_to_optional = function(lightbox_block){ - - var duration = lightbox_block; - var optional_time = { - render : duration.render, - focus : duration.focus, - set_value: function (node, value, task, section){ - var mapping = gantt._resolve_default_mapping(section); - if(!task[mapping.start_date]){ - optional_time.disable(node, section); - var val = {}; - - for(var i in mapping){ - //take default values from the time control from task start/end dates - val[mapping[i]] = task[i]; - } - - return duration.set_value.call(gantt, node, value, val, section);//set default value - }else{ - optional_time.enable(node, section); - return duration.set_value.call(gantt, node, value, task, section); - } - }, - get_value: function (node, task, section){ - if(section.disabled){ - return {start_date: null}; - }else{ - return duration.get_value.call(gantt, node, task, section); - } - }, - update_block : function(node, section){ - gantt.callEvent("onSectionToggle", [gantt._lightbox_id, section]); - node.style.display = section.disabled ? "none" : "block"; - - if(section.button){ - var button = node.previousSibling.firstChild.firstChild, - labels = gantt.locale.labels; - - var button_text = section.disabled ? labels[section.name + "_enable_button"] : labels[section.name + "_disable_button"]; - - button.nextSibling.innerHTML = button_text; - } - gantt.resizeLightbox(); - }, - disable: function(node, section){ - section.disabled = true; - optional_time.update_block(node, section); - - }, - enable:function(node, section){ - section.disabled = false; - optional_time.update_block(node, section); - }, - button_click: function(index, el, section, container){ - if(gantt.callEvent("onSectionButton", [gantt._lightbox_id, section]) === false){ - return; - } - var config = gantt._get_typed_lightbox_config()[index]; - if(config.disabled){ - optional_time.enable(container, config); - }else{ - optional_time.disable(container, config); - } - } - }; - return optional_time; -}; - -gantt.form_blocks.duration_optional = gantt._extend_to_optional(gantt.form_blocks.duration); -gantt.form_blocks.time_optional = gantt._extend_to_optional(gantt.form_blocks.time); -*/ -/** - * @desc: constructor, data processor object - * @param: serverProcessorURL - url used for update - * @type: public - */ -function dataProcessor(serverProcessorURL){ - this.serverProcessor = serverProcessorURL; - this.action_param="!nativeeditor_status"; - - this.object = null; - this.updatedRows = []; //ids of updated rows - - this.autoUpdate = true; - this.updateMode = "cell"; - this._tMode="GET"; - this._headers = null; - this._payload = null; - this.post_delim = "_"; - - this._waitMode=0; - this._in_progress={};//? - this._invalid={}; - this.mandatoryFields=[]; - this.messages=[]; - - this.styles={ - updated:"font-weight:bold;", - inserted:"font-weight:bold;", - deleted:"text-decoration : line-through;", - invalid:"background-color:FFE0E0;", - invalid_cell:"border-bottom:2px solid red;", - error:"color:red;", - clear:"font-weight:normal;text-decoration:none;" - }; - - this.enableUTFencoding(true); - dhx4._eventable(this); - - return this; - } - -dataProcessor.prototype={ - setTransactionMode:function(mode,total){ - if (typeof mode == "object"){ - this._tMode = mode.mode || this._tMode; - this._headers = this._headers || mode.headers; - this._payload = this._payload || mode.payload; - } else { - this._tMode=mode; - this._tSend=total; - } - - if (this._tMode == "REST"){ - this._tSend = false; - this._endnm = true; - } - }, - escape:function(data){ - if (this._utf) - return encodeURIComponent(data); - else - return escape(data); - }, - /** - * @desc: allows to set escaping mode - * @param: true - utf based escaping, simple - use current page encoding - * @type: public - */ - enableUTFencoding:function(mode){ - this._utf=dhx4.s2b(mode); - }, - /** - * @desc: allows to define, which column may trigger update - * @param: val - array or list of true/false values - * @type: public - */ - setDataColumns:function(val){ - this._columns=(typeof val == "string")?val.split(","):val; - }, - /** - * @desc: get state of updating - * @returns: true - all in sync with server, false - some items not updated yet. - * @type: public - */ - getSyncState:function(){ - return !this.updatedRows.length; - }, - /** - * @desc: enable/disable named field for data syncing, will use column ids for grid - * @param: mode - true/false - * @type: public - */ - enableDataNames:function(mode){ - this._endnm=dhx4.s2b(mode); - }, - /** - * @desc: enable/disable mode , when only changed fields and row id send to the server side, instead of all fields in default mode - * @param: mode - true/false - * @type: public - */ - enablePartialDataSend:function(mode){ - this._changed=dhx4.s2b(mode); - }, - /** - * @desc: set if rows should be send to server automaticaly - * @param: mode - "row" - based on row selection changed, "cell" - based on cell editing finished, "off" - manual data sending - * @type: public - */ - setUpdateMode:function(mode,dnd){ - this.autoUpdate = (mode=="cell"); - this.updateMode = mode; - this.dnd=dnd; - }, - ignore:function(code,master){ - this._silent_mode=true; - code.call(master||window); - this._silent_mode=false; - }, - /** - * @desc: mark row as updated/normal. check mandatory fields,initiate autoupdate (if turned on) - * @param: rowId - id of row to set update-status for - * @param: state - true for "updated", false for "not updated" - * @param: mode - update mode name - * @type: public - */ - setUpdated:function(rowId,state,mode){ - if (this._silent_mode) return; - var ind=this.findRow(rowId); - - mode=mode||"updated"; - var existing = this.obj.getUserData(rowId,this.action_param); - if (existing && mode == "updated") mode=existing; - if (state){ - this.set_invalid(rowId,false); //clear previous error flag - this.updatedRows[ind]=rowId; - this.obj.setUserData(rowId,this.action_param,mode); - if (this._in_progress[rowId]) - this._in_progress[rowId]="wait"; - } else{ - if (!this.is_invalid(rowId)){ - this.updatedRows.splice(ind,1); - this.obj.setUserData(rowId,this.action_param,""); - } - } - - //clear changed flag - if (!state) - this._clearUpdateFlag(rowId); - - this.markRow(rowId,state,mode); - if (state && this.autoUpdate) this.sendData(rowId); - }, - _clearUpdateFlag:function(id){}, - markRow:function(id,state,mode){ - var str=""; - var invalid=this.is_invalid(id); - if (invalid){ - str=this.styles[invalid]; - state=true; - } - if (this.callEvent("onRowMark",[id,state,mode,invalid])){ - //default logic - str=this.styles[state?mode:"clear"]+str; - - this.obj[this._methods[0]](id,str); - - if (invalid && invalid.details){ - str+=this.styles[invalid+"_cell"]; - for (var i=0; i < invalid.details.length; i++) - if (invalid.details[i]) - this.obj[this._methods[1]](id,i,str); - } - } - }, - getState:function(id){ - return this.obj.getUserData(id,this.action_param); - }, - is_invalid:function(id){ - return this._invalid[id]; - }, - set_invalid:function(id,mode,details){ - if (details) mode={value:mode, details:details, toString:function(){ return this.value.toString(); }}; - this._invalid[id]=mode; - }, - /** - * @desc: check mandatory fields and varify values of cells, initiate update (if specified) - * @param: rowId - id of row to set update-status for - * @type: public - */ - checkBeforeUpdate:function(rowId){ - return true; - }, - /** - * @desc: send row(s) values to server - * @param: rowId - id of row which data to send. If not specified, then all "updated" rows will be send - * @type: public - */ - sendData:function(rowId){ - if (this._waitMode && (this.obj.mytype=="tree" || this.obj._h2)) return; - if (this.obj.editStop) this.obj.editStop(); - - - if(typeof rowId == "undefined" || this._tSend) return this.sendAllData(); - if (this._in_progress[rowId]) return false; - - this.messages=[]; - if (!this.checkBeforeUpdate(rowId) && this.callEvent("onValidationError",[rowId,this.messages])) return false; - this._beforeSendData(this._getRowData(rowId),rowId); - }, - _beforeSendData:function(data,rowId){ - if (!this.callEvent("onBeforeUpdate",[rowId,this.getState(rowId),data])) return false; - this._sendData(data,rowId); - }, - serialize:function(data, id){ - if (typeof data == "string") - return data; - if (typeof id != "undefined") - return this.serialize_one(data,""); - else{ - var stack = []; - var keys = []; - for (var key in data) - if (data.hasOwnProperty(key)){ - stack.push(this.serialize_one(data[key],key+this.post_delim)); - keys.push(key); - } - stack.push("ids="+this.escape(keys.join(","))); - if (dhtmlx.security_key) - stack.push("dhx_security="+dhtmlx.security_key); - return stack.join("&"); - } - }, - serialize_one:function(data, pref){ - if (typeof data == "string") - return data; - var stack = []; - for (var key in data) - if (data.hasOwnProperty(key)){ - if ((key == "id" || key == this.action_param) && this._tMode == "REST") continue; - stack.push(this.escape((pref||"")+key)+"="+this.escape(data[key])); - } - return stack.join("&"); - }, - _sendData:function(a1,rowId){ - if (!a1) return; //nothing to send - if (!this.callEvent("onBeforeDataSending",rowId?[rowId,this.getState(rowId),a1]:[null, null, a1])) return false; - - if (rowId) - this._in_progress[rowId]=(new Date()).valueOf(); - - var that = this; - var back = function(xml){ - var ids = []; - if (rowId) - ids.push(rowId); - else if (a1) - for (var key in a1) - ids.push(key); - - return that.afterUpdate(that,xml,ids); - }; - - var a3 = this.serverProcessor+(this._user?(dhtmlx.url(this.serverProcessor)+["dhx_user="+this._user,"dhx_version="+this.obj.getUserData(0,"version")].join("&")):""); - - if (this._tMode=="GET") - dhx4.ajax.get(a3+((a3.indexOf("?")!=-1)?"&":"?")+this.serialize(a1,rowId), back); - else if (this._tMode == "POST") - dhx4.ajax.post(a3,this.serialize(a1,rowId), back); - else if (this._tMode == "REST"){ - var state = this.getState(rowId); - var url = a3.replace(/(\&|\?)editing\=true/,""); - var data = ""; - var method = "post"; - - if (state == "inserted"){ - data = this.serialize(a1, rowId); - } else if (state == "deleted"){ - method = "DELETE"; - url = url + (url.slice(-1) == "/" ? "" : "/") + rowId; - } else { - method = "PUT"; - data = this.serialize(a1, rowId); - url = url + (url.slice(-1) == "/" ? "" : "/") + rowId; - } - - - if (this._payload) - for (var key in this._payload) - url = url + dhtmlx.url(url) + this.escape(key) + "=" + this.escape(this._payload[key]); - - dhx4.ajax.query({ - url:url, - method:method, - headers:this._headers, - data:data, - callback:back - }); - } - - this._waitMode++; - }, - sendAllData:function(){ - if (!this.updatedRows.length) return; - - this.messages=[]; var valid=true; - for (var i=0; i<this.updatedRows.length; i++) - valid&=this.checkBeforeUpdate(this.updatedRows[i]); - if (!valid && !this.callEvent("onValidationError",["",this.messages])) return false; - - if (this._tSend) - this._sendData(this._getAllData()); - else - for (var i=0; i<this.updatedRows.length; i++) - if (!this._in_progress[this.updatedRows[i]]){ - if (this.is_invalid(this.updatedRows[i])) continue; - this._beforeSendData(this._getRowData(this.updatedRows[i]),this.updatedRows[i]); - if (this._waitMode && (this.obj.mytype=="tree" || this.obj._h2)) return; //block send all for tree - } - }, - - - - - - - - - _getAllData:function(rowId){ - var out={}; - var has_one = false; - for(var i=0;i<this.updatedRows.length;i++){ - var id=this.updatedRows[i]; - if (this._in_progress[id] || this.is_invalid(id)) continue; - if (!this.callEvent("onBeforeUpdate",[id,this.getState(id), this._getRowData(id)])) continue; - out[id]=this._getRowData(id,id+this.post_delim); - has_one = true; - this._in_progress[id]=(new Date()).valueOf(); - } - return has_one?out:null; - }, - - - /** - * @desc: specify column which value should be varified before sending to server - * @param: ind - column index (0 based) - * @param: verifFunction - function (object) which should verify cell value (if not specified, then value will be compared to empty string). Two arguments will be passed into it: value and column name - * @type: public - */ - setVerificator:function(ind,verifFunction){ - this.mandatoryFields[ind] = verifFunction||(function(value){return (value!=="");}); - }, - /** - * @desc: remove column from list of those which should be verified - * @param: ind - column Index (0 based) - * @type: public - */ - clearVerificator:function(ind){ - this.mandatoryFields[ind] = false; - }, - - - - - - findRow:function(pattern){ - var i=0; - for(i=0;i<this.updatedRows.length;i++) - if(pattern==this.updatedRows[i]) break; - return i; - }, - - - - - - - - - - - - /** - * @desc: define custom actions - * @param: name - name of action, same as value of action attribute - * @param: handler - custom function, which receives a XMl response content for action - * @type: private - */ - defineAction:function(name,handler){ - if (!this._uActions) this._uActions=[]; - this._uActions[name]=handler; - }, - - - - - /** -* @desc: used in combination with setOnBeforeUpdateHandler to create custom client-server transport system -* @param: sid - id of item before update -* @param: tid - id of item after up0ate -* @param: action - action name -* @type: public -* @topic: 0 -*/ - afterUpdateCallback:function(sid, tid, action, btag) { - var marker = sid; - var correct=(action!="error" && action!="invalid"); - if (!correct) this.set_invalid(sid,action); - if ((this._uActions)&&(this._uActions[action])&&(!this._uActions[action](btag))) - return (delete this._in_progress[marker]); - - if (this._in_progress[marker]!="wait") - this.setUpdated(sid, false); - - var soid = sid; - - switch (action) { - case "inserted": - case "insert": - if (tid != sid) { - this.obj[this._methods[2]](sid, tid); - sid = tid; - } - break; - case "delete": - case "deleted": - this.obj.setUserData(sid, this.action_param, "true_deleted"); - this.obj[this._methods[3]](sid); - delete this._in_progress[marker]; - return this.callEvent("onAfterUpdate", [sid, action, tid, btag]); - break; - } - - if (this._in_progress[marker]!="wait"){ - if (correct) this.obj.setUserData(sid, this.action_param,''); - delete this._in_progress[marker]; - } else { - delete this._in_progress[marker]; - this.setUpdated(tid,true,this.obj.getUserData(sid,this.action_param)); - } - - this.callEvent("onAfterUpdate", [soid, action, tid, btag]); - }, - - /** - * @desc: response from server - * @param: xml - XMLLoader object with response XML - * @type: private - */ - afterUpdate:function(that,xml,id){ - //try to use json first - if (window.JSON){ - try{ - var tag = JSON.parse(xml.xmlDoc.responseText); - var action = tag.action || this.getState(id) || "updated"; - var sid = tag.sid || id[0]; - var tid = tag.tid || id[0]; - that.afterUpdateCallback(sid, tid, action, tag); - that.finalizeUpdate(); - return; - } catch(e){ - } - } - //xml response - var top = dhx4.ajax.xmltop("data", xml.xmlDoc); //fix incorrect content type in IE - if (!top) return this.cleanUpdate(id); - var atag=dhx4.ajax.xpath("//data/action", top); - if (!atag.length) return this.cleanUpdate(id); - - for (var i=0; i<atag.length; i++){ - var btag=atag[i]; - var action = btag.getAttribute("type"); - var sid = btag.getAttribute("sid"); - var tid = btag.getAttribute("tid"); - - that.afterUpdateCallback(sid,tid,action,btag); - } - that.finalizeUpdate(); - }, - cleanUpdate:function(id){ - if (id) - for (var i = 0; i < id.length; i++) - delete this._in_progress[id[i]]; - }, - finalizeUpdate:function(){ - if (this._waitMode) this._waitMode--; - - if ((this.obj.mytype=="tree" || this.obj._h2) && this.updatedRows.length) - this.sendData(); - this.callEvent("onAfterUpdateFinish",[]); - if (!this.updatedRows.length) - this.callEvent("onFullSync",[]); - }, - - - - - - /** - * @desc: initializes data-processor - * @param: anObj - dhtmlxGrid object to attach this data-processor to - * @type: public - */ - init:function(anObj){ - this.obj = anObj; - if (this.obj._dp_init) - this.obj._dp_init(this); - }, - - - setOnAfterUpdate:function(ev){ - this.attachEvent("onAfterUpdate",ev); - }, - enableDebug:function(mode){ - }, - setOnBeforeUpdateHandler:function(func){ - this.attachEvent("onBeforeDataSending",func); - }, - - - - /* starts autoupdate mode - @param interval - time interval for sending update requests - */ - setAutoUpdate: function(interval, user) { - interval = interval || 2000; - - this._user = user || (new Date()).valueOf(); - this._need_update = false; - this._loader = null; - this._update_busy = false; - - this.attachEvent("onAfterUpdate",function(sid,action,tid,xml_node){ - this.afterAutoUpdate(sid, action, tid, xml_node); - }); - this.attachEvent("onFullSync",function(){ - this.fullSync(); - }); - - var self = this; - window.setInterval(function(){ - self.loadUpdate(); - }, interval); - }, - - - /* process updating request answer - if status == collision version is depricated - set flag for autoupdating immidiatly - */ - afterAutoUpdate: function(sid, action, tid, xml_node) { - if (action == 'collision') { - this._need_update = true; - return false; - } else { - return true; - } - }, - - - /* callback function for onFillSync event - call update function if it's need - */ - fullSync: function() { - if (this._need_update == true) { - this._need_update = false; - this.loadUpdate(); - } - return true; - }, - - - /* sends query to the server and call callback function - */ - getUpdates: function(url,callback){ - if (this._update_busy) - return false; - else - this._update_busy = true; - - this._loader = this._loader || new dtmlXMLLoaderObject(true); - - this._loader.async=true; - this._loader.waitCall=callback; - this._loader.loadXML(url); - }, - - - /* returns xml node value - @param node - xml node - */ - _v: function(node) { - if (node.firstChild) return node.firstChild.nodeValue; - return ""; - }, - - - /* returns values array of xml nodes array - @param arr - array of xml nodes - */ - _a: function(arr) { - var res = []; - for (var i=0; i < arr.length; i++) { - res[i]=this._v(arr[i]); - }; - return res; - }, - - - /* loads updates and processes them - */ - loadUpdate: function(){ - var self = this; - var version = this.obj.getUserData(0,"version"); - var url = this.serverProcessor+dhtmlx.url(this.serverProcessor)+["dhx_user="+this._user,"dhx_version="+version].join("&"); - url = url.replace("editing=true&",""); - this.getUpdates(url, function(){ - var vers = self._loader.doXPath("//userdata"); - self.obj.setUserData(0,"version",self._v(vers[0])); - - var upds = self._loader.doXPath("//update"); - if (upds.length){ - self._silent_mode = true; - - for (var i=0; i<upds.length; i++) { - var status = upds[i].getAttribute('status'); - var id = upds[i].getAttribute('id'); - var parent = upds[i].getAttribute('parent'); - switch (status) { - case 'inserted': - self.callEvent("insertCallback",[upds[i], id, parent]); - break; - case 'updated': - self.callEvent("updateCallback",[upds[i], id, parent]); - break; - case 'deleted': - self.callEvent("deleteCallback",[upds[i], id, parent]); - break; - } - } - - self._silent_mode = false; - } - - self._update_busy = false; - self = null; - }); - } - -}; - - -// --#include core/data_task_types.js - -/* - asserts will be removed in final code, so you can place them anythere - without caring about performance impacts -*/ -dhtmlx.assert = function(check, message){ - //jshint -W087 - if (!check){ - dhtmlx.message({ type:"error", text:message, expire:-1 }); - debugger; - } -}; - -//initial initialization -gantt.init = function(node, from, to){ - this.callEvent("onBeforeGanttReady", []); - if(from && to){ - this.config.start_date = this._min_date = gantt.date.Date(from); - this.config.end_date = this._max_date = gantt.date.Date(to); - } - this._init_skin(); - - if (!this.config.scroll_size) - this.config.scroll_size = this._detectScrollSize(); - - dhtmlxEvent(window, "resize", this._on_resize); - - //can be called only once - this.init = function(node){ - if (this.$container && this.$container.parentNode){ - this.$container.parentNode.removeChild(this.$container); - this.$container = null; - - } - this._reinit(node); - }; - - this._reinit(node); -}; - -gantt._reinit = function(node){ - this._init_html_area(node); - this._set_sizes(); - - this._clear_renderers(); - //this.resetLightbox(); // HOSEK - this._update_flags(); - this._init_touch_events(); - this._init_templates(); - this._init_grid(); - this._init_tasks(); - - - this._set_scroll_events(); - - dhtmlxEvent(this.$container, "click", this._on_click); - dhtmlxEvent(this.$container, "dblclick", this._on_dblclick); - dhtmlxEvent(this.$container, "mousemove", this._on_mousemove); - dhtmlxEvent(this.$container, "contextmenu", this._on_contextmenu); - - this.callEvent("onGanttReady", []); - - this.render(); -}; - -//renders initial html markup -gantt._init_html_area = function(node){ - ysy.log.debug("html_inited","render"); - if (typeof node == "string") - this._obj = document.getElementById(node); - else - this._obj = node; - dhtmlx.assert(this._obj, "Invalid html container: "+node); - var html = "<div class='gantt_container'><div class='gantt_grid'></div><div class='gantt_task'></div><div class='gantt_grid_column_resize_wrap' data-column_id='grid_width'>\ - </div>"; - html += "<div class='gantt_ver_scroll'><div></div></div><div class='gantt_hor_scroll'><div></div></div></div>"; - this._obj.innerHTML = html; - //store links for further reference - this.$container = this._obj.firstChild; - var childs = this.$container.childNodes; - this.$grid = childs[0]; - this.$task = childs[1]; - this.$grid_resize = childs[2]; - this.$scroll_ver = childs[3]; - this.$scroll_hor = childs[4]; - - this.$grid.innerHTML = "<div class='gantt_grid_scale'></div><div class='gantt_grid_data'></div>"; - this.$grid_scale = this.$grid.childNodes[0]; - this.$grid_data = this.$grid.childNodes[1]; - - this.$task.innerHTML = "<div class='gantt_task_scale'></div><div class='gantt_data_area'><div class='gantt_task_bg'></div><div class='gantt_marker_area'></div><div class='gantt_links_area'></div><div class='gantt_bars_area'></div></div>"; - this.$task_scale = this.$task.childNodes[0]; - - this.$task_data = this.$task.childNodes[1]; - - this.$task_bg = this.$task_data.childNodes[0]; - this.$marker_area = this.$task_data.childNodes[1]; - this.$task_links = this.$task_data.childNodes[2]; - this.$task_bars = this.$task_data.childNodes[3]; -}; - -gantt.$click={ - buttons:{ - "edit":function(id){ - gantt.showLightbox(id); - }, - "delete":function(id){ - var question = gantt.locale.labels.confirm_deleting; - var title = gantt.locale.labels.confirm_deleting_title; - - gantt._dhtmlx_confirm(question, title, function(){ - var task = gantt.getTask(id); - if(task.$new){ - gantt._deleteTask(id, true); - gantt.refreshData(); - }else{ - gantt.deleteTask(id); - } - - gantt.hideLightbox(); - }); - } - } -}; - -gantt._calculate_content_height = function(){ - var scale_height = this.config.scale_height, - rows_height = this._order.length*this.config.row_height, - hor_scroll_height = this._scroll_hor ? this.config.scroll_size + 1 : 0; - - if(!(this._is_grid_visible() || this._is_chart_visible())){ - return 0; - }else{ - return scale_height + rows_height + 2 + hor_scroll_height; - } -}; -gantt._calculate_content_width = function(){ - var grid_width = this._get_grid_width(), - chart_width = this._tasks ? this._tasks.full_width : 0, - ver_scroll_width = this._scroll_ver ? this.config.scroll_size + 1 : 0; - - if(!this._is_chart_visible()){ - chart_width = 0; - } - if(!this._is_grid_visible()){ - grid_width = 0; - } - return grid_width + chart_width + 1; -}; - -gantt._get_resize_options = function(){ - var res = {x:false, y:false}; - if(this.config.autosize == "xy"){ - res.x = res.y = true; - }else if(this.config.autosize == "y" || this.config.autosize === true){ - res.y = true; - }else if(this.config.autosize == "x"){ - res.x = true; - } - return res; -}; - -gantt._clean_el_size = function(value){ - return ((value || "").toString().replace("px", "") * 1 || 0); -}; -gantt._get_box_styles = function(){ - var computed = null; - if(window.getComputedStyle){ - computed = window.getComputedStyle(this._obj, null); - }else{ - //IE with elem.currentStyle does not calculate sizes from %, so will use the default approach - computed = { - "width":this._obj.clientWidth, - "height":this._obj.clientHeight - }; - } - var properties = [ - "width", - "height", - - "paddingTop", - "paddingBottom", - "paddingLeft", - "paddingRight", - - "borderLeftWidth", - "borderRightWidth", - "borderTopWidth", - "borderBottomWidth" - ]; - var styles = { - boxSizing:(computed.boxSizing == "border-box") - }; - - if(computed.MozBoxSizing){ - styles.boxSizing = (computed.MozBoxSizing == "border-box"); - } - for(var i =0; i < properties.length; i++){ - styles[properties[i]] = computed[properties[i]] ? this._clean_el_size(computed[properties[i]]) : 0; - } - - - var box = { - horPaddings : (styles.paddingLeft + styles.paddingRight + styles.borderLeftWidth + styles.borderRightWidth), - vertPaddings : (styles.paddingTop + styles.paddingBottom + styles.borderTopWidth + styles.borderBottomWidth), - borderBox: styles.boxSizing, - innerWidth : styles.width, - innerHeight : styles.height, - outerWidth : styles.width, - outerHeight : styles.height - }; - - - if(box.borderBox){ - box.innerWidth -= box.horPaddings; - box.innerHeight -= box.vertPaddings; - }else{ - box.outerWidth += box.horPaddings; - box.outerHeight += box.vertPaddings; - } - - return box; -}; -gantt._do_autosize = function(){ - ysy.log.debug("_do_autosize()","print"); - var resize = this._get_resize_options(); - var boxSizes = this._get_box_styles(); - if(resize.y){ - var reqHeight = this._calculate_content_height(); - if(boxSizes.borderBox){ - reqHeight += boxSizes.vertPaddings; - } - - this._obj.style.height = reqHeight + 'px'; - } - if(resize.x){ - var reqWidth = this._calculate_content_width(); - if(boxSizes.borderBox){ - reqWidth += boxSizes.horPaddings; - } - this._obj.style.width = reqWidth + 'px'; - } -}; -//set sizes to top level html element -gantt._set_sizes = function(){ - ysy.log.debug("_set_sizes()","print"); - // TODO printable - this._do_autosize(); - - var boxSizes = this._get_box_styles(); - this._y = boxSizes.innerHeight; - - if (this._y < 20) return; - - //same height - this.$grid.style.height = this.$task.style.height = Math.max(this._y - this.$scroll_hor.offsetHeight - 2, 0) +"px"; - - var dataHeight = Math.max((this._y - (this.config.scale_height||0) - this.$scroll_hor.offsetHeight - 2), 0); - this.$grid_data.style.height = this.$task_data.style.height = dataHeight + "px"; - - //share width - var gridWidth = Math.max(this._get_grid_width()-1, 0); - this.$grid.style.width = gridWidth +"px"; - this.$grid.style.display = gridWidth === 0 ? 'none' : ''; - - boxSizes = this._get_box_styles(); - this._x = boxSizes.innerWidth; - - if (this._x < 20) return; - - this.$grid_data.style.width = Math.max(this._get_grid_width()-1, 0) +"px"; - this.$task.style.width = Math.max(this._x - this._get_grid_width() - 2, 0) +"px"; -}; -gantt._unset_sizes = function(){ - ysy.log.debug("_unset_sizes()","print"); - // TODO printable - - this.$grid.style.height = this.$task.style.height = ""; - - //var dataHeight = Math.max((this._y - (this.config.scale_height||0) - this.$scroll_hor.offsetHeight - 2), 0); - this.$grid_data.style.height = this.$task_data.style.height = ""; - - //share width - var gridWidth = Math.max(this._get_grid_width()-1, 0); - this.$grid.style.width = gridWidth +"px"; - this.$grid.style.display = gridWidth === 0 ? 'none' : ''; - - var boxSizes = this._get_box_styles(); - this._x = boxSizes.innerWidth; - - if (this._x < 20) return; - - this.$grid_data.style.width = Math.max(this._get_grid_width()-1, 0) +"px"; - this.$task.style.width = ""; - this.$scroll_hor.style.display = "none"; - this.$scroll_ver.style.display = "none"; -}; - -gantt.getScrollState = function(){ - if(this.$task && this.$task_data) - return { x:this.$task.scrollLeft, y:this.$task_data.scrollTop }; - else - return null; -}; - -gantt._save_scroll_state = function (x, y) { - // according to Chrome profiler - // getting-setting scrollLeft for restoring scroll position after render takes surprisingly big amount of time - // 2x-3x times more than setting innerHTML (if using gantt.config.static_background) - // Will store scroll position in memory instead of getting actual values from DOM - var pos = {}; - this._cached_scroll_pos = this._cached_scroll_pos || {x:0,y:0}; - if (x !== undefined) { - pos.x = x; - } - if (y !== undefined) { - pos.y = y; - } - dhtmlx.mixin(this._cached_scroll_pos, pos, true); - -}; -gantt._restore_scroll_state = function(){ - return this._cached_scroll_pos || null; -}; -gantt.scrollTo = function(left, top){ - if (left*1 == left){ - var modLeft = Math.min(left, this.$task.scrollWidth - this.$task.offsetWidth); - this.$task.scrollLeft = modLeft; - this._save_scroll_state(modLeft, undefined); - } - if(top*1 == top){ - // this.$task_data.scrollTop = top; - // this.$grid_data.scrollTop = top; - this._save_scroll_state(undefined, top); - } - ysy.log.debug("ScrollTo [" + left + " (" + modLeft + ")," + top + "]", "scroll"); - this.callEvent("onScrollTo", [modLeft, top]); -}; - -gantt.showDate = function(date){ - var date_x = Math.round(this.posFromDate(date)); - var scroll_to = Math.max(date_x - this.config.task_scroll_offset, 0); - this.scrollTo(scroll_to); -}; -gantt.showTask = function(id) { - var el = this.getTaskNode(id); - if(!el) - return; - - var left = Math.max(el.offsetLeft - this.config.task_scroll_offset, 0); - var top = el.offsetTop - (this.$task_data.offsetHeight - this.config.row_height)/2; - this.scrollTo(left, top); -}; - - -//called after window resize -gantt._on_resize = gantt.setSizes = function(){ - gantt._set_sizes(); - gantt._scroll_resize(); -}; - -//renders self -gantt.render = function() { - this.refresher.renderAll(); - return; - //if(!this._is_render_active()){ - // ysy.log.debug("render rejected","render"); - // return; - //} - //ysy.log.debug("render is pending","render"); - // - //gantt._skip_render = true; - //setTimeout($.proxy(gantt._render,gantt),0); -} -gantt._render = function(){ - ysy.log.debug("render is triggered","render"); - this.callEvent("onBeforeGanttRender", []); - - var pos = dhtmlx.copy(this._restore_scroll_state()); - var visible_date = null; - if(pos){ - visible_date = gantt.dateFromPos(pos.x + this.config.task_scroll_offset); - } - - this._render_grid(); //grid.js - this._render_tasks_scales(); //tasks.js - this._scroll_resize(); - this._on_resize(); - this._render_data(); - - // if(gantt._selected_task){ // TODO vyladit a povolit - // if(gantt.isTaskExists(gantt._selected_task)){ - // gantt.showTask(gantt._selected_task); - // } - // }else - if(this.config.preserve_scroll && pos){ - - var new_pos =gantt._restore_scroll_state(); - var new_date = gantt.dateFromPos(new_pos.x + this.config.task_scroll_offset); - if(!(+visible_date == +new_date && new_pos.y == pos.y)){ - /*if(visible_date){ - this.showDate(visible_date); - }*/ - ysy.log.debug("pos.x="+pos.x+" new_pos="+new_pos.x,"scroll"); - this.showDate(new_date); - gantt.scrollTo(undefined, pos.y); - //gantt.scrollTo(pos.x,pos.y); - } - }else{ - this.showDate(moment()); - } - - this.callEvent("onGanttRender", []); - gantt._skip_render = false; -}; - - -gantt._set_scroll_events = function(){ - dhtmlxEvent(this.$scroll_hor, "scroll", function() { - //in safari we can catch previous onscroll after setting new value from mouse-wheel event - //set delay to prevent value drifiting - if (gantt.date.now() - ( gantt._wheel_time || 0 ) < 100) return true; - if (gantt._touch_scroll_active) return; - var left = gantt.$scroll_hor.scrollLeft; - gantt.scrollTo(left); - }); - dhtmlxEvent(this.$scroll_ver, "scroll", function() { - if (gantt._touch_scroll_active) return; - var top = gantt.$scroll_ver.scrollTop; - gantt.$grid_data.scrollTop = top; - gantt.scrollTo(null, top); - }); - dhtmlxEvent(this.$task, "scroll", function() { - var left = gantt.$task.scrollLeft, - barLeft = gantt.$scroll_hor.scrollLeft; - if(barLeft != left) - gantt.$scroll_hor.scrollLeft = left; - }); - dhtmlxEvent(this.$task_data, "scroll", function() { - var top = gantt.$task_data.scrollTop, - barTop = gantt.$scroll_ver.scrollTop; - if(barTop != top) - gantt.$scroll_ver.scrollTop = top; - }); - - var ff = _isFF && !window._KHTMLrv; - function onMouseWheel(e){ - var res = gantt._get_resize_options(); - gantt._wheel_time = gantt.date.Date(); - - var wx = ff ? (e.deltaX*-20) : e.wheelDeltaX*2; - var wy = ff ? (e.deltaY*-40) : e.wheelDelta; - - if (wx && Math.abs(wx) > Math.abs(wy)){ - if(res.x) return true;//no horisontal scroll, must not block scrolling - - var dir = wx/-40; - var left = gantt.$task.scrollLeft+dir*30; - gantt.scrollTo(left, null); - gantt.$scroll_hor.scrollTop = top; - } else { - if(res.y) return true;//no vertical scroll, must not block scrolling - - var dir = wy/-40; - if (typeof wy == "undefined") - dir = e.detail; - - var top = gantt.$scroll_ver.scrollTop+dir*30; - if(!gantt.config.prevent_default_scroll && gantt._cached_scroll_pos && gantt._cached_scroll_pos.y == top) return true; - - gantt.scrollTo(null, top); - gantt.$scroll_ver.scrollTop = top; - } - - if (e.preventDefault) - e.preventDefault(); - e.cancelBubble=true; - return false; - } - - if (ff) - dhtmlxEvent(gantt.$container, "wheel", onMouseWheel); - else - dhtmlxEvent(gantt.$container, "mousewheel", onMouseWheel); - -}; - - -gantt._scroll_resize = function() { - if (this._x < 20 || this._y < 20) return; - - var grid_width = this._get_grid_width(); - - var task_width = Math.max(this._x - grid_width, 0); - var task_height = Math.max(this._y - this.config.scale_height, 0); - - var scroll_size = this.config.scroll_size + 1;//1px for inner content - - var task_data_width = Math.max(this.$task_data.offsetWidth - scroll_size, 0); - var task_data_height = this.config.row_height*this._order.length; - - var resize = this._get_resize_options(); - var scroll_hor = this._scroll_hor = resize.x ? false : (task_data_width > task_width); - var scroll_ver = this._scroll_ver = resize.y ? false : (task_data_height > task_height); - - this.$scroll_hor.style.display = scroll_hor ? "block" : "none"; - this.$scroll_hor.style.height = (scroll_hor ? scroll_size : 0) + "px"; - this.$scroll_hor.style.width = Math.max((this._x - (scroll_ver ? scroll_size : 2)), 0) + "px"; - this.$scroll_hor.firstChild.style.width = (task_data_width + grid_width + scroll_size + 2) + "px"; - - this.$scroll_ver.style.display = scroll_ver ? "block" : "none"; - this.$scroll_ver.style.width = (scroll_ver ? scroll_size : 0) + "px"; - this.$scroll_ver.style.height = Math.max((this._y - (scroll_hor ? scroll_size : 0) - this.config.scale_height), 0) + "px"; - this.$scroll_ver.style.top = this.config.scale_height + "px"; - this.$scroll_ver.firstChild.style.height = (this.config.scale_height + task_data_height) + "px"; -}; - -gantt.locate = function(e) { - var trg = gantt._get_target_node(e); - - //ignore empty cells - var className = trg.className || ""; - if(!className.indexOf){ - //'className' exist but not a string - IE svg element in DOM - className = ''; - } - if ((className || "").indexOf("gantt_task_cell") >= 0) return null; - - var attribute = arguments[1] || this.config.task_attribute; - - while (trg){ - if (trg.getAttribute){ //text nodes has not getAttribute - var test = trg.getAttribute(attribute); - if (test) return test; - } - trg=trg.parentNode; - } - return null; -}; -gantt._get_target_node = function(e){ - var trg; - if (e.tagName) - trg = e; - else { - e=e||window.event; - trg=e.target||e.srcElement; - } - return trg; -}; -gantt._trim = function(str){ - var func = String.prototype.trim || function(){ return this.replace(/^\s+|\s+$/g, ""); }; - return func.apply(str); -}; - -gantt._locate_css = function(e, classname, strict){ - if(strict === undefined) - strict = true; - - var trg = gantt._get_target_node(e); - var css = ''; - var test = false; - while (trg){ - css = trg.className; - if(css && !css.indexOf){ - //'className' exist but not a string - IE svg element in DOM - css = ''; - } - - if(css){ - var ind = css.indexOf(classname); - if (ind >= 0){ - if (!strict) - return trg; - - //check that we have exact match - var left = (ind === 0) || (!gantt._trim(css.charAt(ind - 1))); - var right = ((ind + classname.length >= css.length)) || (!gantt._trim(css.charAt(ind + classname.length))); - - if (left && right) - return trg; - } - } - - trg=trg.parentNode; - } - return null; -}; -gantt._locateHTML = function(e, attribute) { - var trg = gantt._get_target_node(e); - attribute = attribute || this.config.task_attribute; - - while (trg){ - if (trg.getAttribute){ //text nodes has not getAttribute - var test = trg.getAttribute(attribute); - if (test) return trg; - } - trg=trg.parentNode; - } - return null; -}; - -gantt.getTaskRowNode = function(id) { - var els = this.$grid_data.childNodes; - var attribute = this.config.task_attribute; - for (var i = 0; i < els.length; i++) { - if (els[i].getAttribute) { - var value = els[i].getAttribute(attribute); - if (value == id) return els[i]; - } - } - return null; -}; - -gantt.getState = function(){ - return { - drag_id : this._tasks_dnd.drag.id, - drag_mode : this._tasks_dnd.drag.mode, - drag_from_start : this._tasks_dnd.drag.left, - selected_task : this._selected_task, - min_date : gantt.date.Date(this._min_date), - max_date : gantt.date.Date(this._max_date), - lightbox : this._lightbox_id, - touch_drag : this._touch_drag - - }; - -}; - - -gantt._checkTimeout = function(host, updPerSecond){ - if(!updPerSecond) - return true; - var timeout = 1000/updPerSecond; - if(timeout < 1) return true; - - if(host._on_timeout) - return false; - - setTimeout(function(){ - delete host._on_timeout; - }, timeout); - - host._on_timeout = true; - return true; -}; - -gantt.selectTask = function(id){ - if(!this.config.select_task) - return false; - if (id){ - - if(this._selected_task == id) - //return false; - return this._selected_task; - - if(!this.callEvent("onBeforeTaskSelected", [id])){ - return false; - } - - this.unselectTask(true); - this._selected_task = id; - - this.refreshTask(id); - if(this.config.scroll_on_click){ - var task=gantt.getTask(id); - this.showDate(task.start_date); - } - this.callEvent("onTaskSelected", [id]); - } - return this._selected_task; -}; -gantt.unselectTask = function(ignore){ - var id = this._selected_task; - if(!id) - return; - this._selected_task = null; - this.refreshTask(id); - this.callEvent("onTaskUnselected", [id,ignore]); -}; -gantt.getSelectedId = function() { - return dhtmlx.defined(this._selected_task) ? this._selected_task : null; -}; - -gantt.changeLightboxType = function(type){ - if(this.getLightboxType() == type) - return true; - gantt._silent_redraw_lightbox(type); -}; - -gantt._is_render_active = function(){ - return !this._skip_render; -}; - -gantt._correct_dst_change = function(date, prevOffset, step, unit){ - var time_unit = gantt._get_line(unit) * step; - if(time_unit > 60*60 && time_unit < 60*60*24){ - //correct dst change only if current unit is more than one hour and less than day (days have own checking), e.g. 12h - var offsetChanged = date.getTimezoneOffset() - prevOffset; - if(offsetChanged){ - date = gantt.date.add(date, offsetChanged, "minute"); - } - } - return date; -}; - -gantt.batchUpdate = function (callback) { - var call_dp = (this._dp && this._dp.updateMode != "off"); - var dp_mode; - if (call_dp){ - dp_mode = this._dp.updateMode; - this._dp.setUpdateMode("off"); - } - - this._skip_render = true; - - try{ - callback(); - }catch(e){ - - } - - this._skip_render = false; - this.render(); - if (call_dp) { - this._dp.setUpdateMode(dp_mode); - this._dp.sendData(); - } -}; - -/*gantt.date.quarter_start = function(date){ - gantt.date.month_start(date); - var m = date.getMonth(), - res_month; - - if(m >= 9){ - res_month = 9; - }else if(m >= 6){ - res_month = 6; - }else if(m >= 3){ - res_month = 3; - }else{ - res_month = 0; - } - - date.setMonth(res_month); - return date; -}; -gantt.date.add_quarter = function(date, inc){ - return gantt.date.add(date, inc*3, "month"); -};*/ -/* - %d - the day as a number with a leading zero ( 01 to 31 ); - %j - the day as a number without a leading zero ( 1 to 31 ); - %D - the day as an abbreviation ( Sun to Sat ); - %l - the day as a full name ( Sunday to Saturday ); - %W - the ISO-8601 week number of the year. Weeks start on Monday; 1) - %m - the month as a number without a leading zero ( 1 to 12 ); - %n - the month as a number with a leading zero ( 01 to 12); - %M - the month as an abbreviation ( Jan to Dec ); - %F - the month as a full name ( January to December ); - %y - the year as a two-digit number ( 00 to 99 ); - %Y - the year as a four-digit number ( 1900–9999 ); - %h - the hour based on the 12-hour clock ( 00 to 11 ); - %H - the hour based on the 24-hour clock ( 00 to 23 ); - %i - the minute as a number with a leading zero ( 00 to 59 ); - %s - the second as a number without a leading zero ( 00 to 59 ); 2) - %a - displays am (for times from midnight until noon) and pm (for times from noon until midnight); - %A - displays AM (for times from midnight until noon) and PM (for times from noon until midnight). - - */ - -if(!gantt.config) gantt.config = {}; -if(!gantt.config) gantt.config = {}; -if(!gantt.templates) gantt.templates = {}; - -(function(){ - -dhtmlx.mixin(gantt.config, - {links : { - "finish_to_start":"0", - "start_to_start":"1", - "finish_to_finish":"2", - "start_to_finish":"3" - }, - types : { - 'task':'task', - 'project':'project', - 'milestone':'milestone' - }, - duration_unit : "day", - work_time:false, - correct_work_time:false, - skip_off_time:false, - - autosize:false, - autosize_min_width: 0, - - show_links : true, - show_task_cells : true, - // replace backgroung of the task area with a canvas img - static_background: false, - branch_loading: false, - show_loading: false, - show_chart : true, - show_grid : true, - min_duration : 60*60*1000, - xml_date : "%d-%m-%Y %H:%i", - api_date : "%d-%m-%Y %H:%i", - start_on_monday: true, - server_utc : false, - show_progress:true, - fit_tasks : false, - select_task:true, - scroll_on_click: true, - preserve_scroll: true, - readonly:false, - - /*grid */ - date_grid: "%Y-%m-%d", - - drag_links : true, - drag_progress:true, - drag_resize:true, - drag_move:true, - drag_mode:{ - "resize":"resize", - "progress":"progress", - "move":"move", - "ignore":"ignore", - "empty":"empty" // HOSEK - }, - round_dnd_dates:true, - link_wrapper_width:20, - root_id:0, - - autofit: false, // grid column automatic fit grid_width config - columns: [ - {name:"text", tree:true, width:'*', resize:true }, - {name:"start_date", align: "center", resize:true }, - {name:"duration", align: "center" }, - {name:"add", width:'44' } - ], - - /*scale*/ - step: 1, - scale_unit: "day", - scale_offset_minimal:true, - subscales : [ - - ], - - inherit_scale_class:false, - - time_step: 60, - duration_step: 1, - date_scale: "%d %M", - task_date: "%d %F %Y", - time_picker: "%H:%i", - task_attribute: "task_id", - link_attribute: "link_id", - layer_attribute: "data-layer", - buttons_left: [ - "gantt_save_btn", - "gantt_cancel_btn" - ], - _migrate_buttons: { - "dhx_save_btn":"gantt_save_btn", - "dhx_cancel_btn":"gantt_cancel_btn", - "dhx_delete_btn":"gantt_delete_btn" - }, - buttons_right: [ - "gantt_delete_btn" - ], - lightbox: { - sections: [ - {name: "description", height: 70, map_to: "text", type: "textarea", focus: true}, - {name: "time", type: "duration", map_to: "auto"} - ], - project_sections: [ - {name: "description", height: 70, map_to: "text", type: "textarea", focus: true}, - {name: "type", type: "typeselect", map_to: "type"}, - {name: "time", type: "duration", readonly:true, map_to: "auto"} - ], - milestone_sections: [ - {name: "description", height: 70, map_to: "text", type: "textarea", focus: true}, - {name: "type", type: "typeselect", map_to: "type"}, - {name: "time", type: "duration", single_date:true, map_to: "auto"} - ] - }, - drag_lightbox: true, - sort: false, - details_on_create: true, - details_on_dblclick:true, - initial_scroll : true, - task_scroll_offset : 100, - - task_height: "full",//number px of 'full' for row height - min_column_width:70, - - // min width for grid column (when resizing) - min_grid_column_width:70, - // name of the attribute with column index for resize element - grid_resizer_column_attribute: "column_index", - // name of the attribute with column index for resize element - grid_resizer_attribute: "grid_resizer", - - // grid width can be increased after the column has been resized - keep_grid_width:false, - - // grid width can be adjusted - grid_resize:false, - - // - readonly_property: "readonly", - editable_property: "editable", - type_renderers:{}, - - open_tree_initially: false, - optimize_render: 'auto', - prevent_default_scroll: false - -}); -gantt.keys={ - edit_save:13, - edit_cancel:27 -}; - -gantt._init_template = function(name, initial){ - var registeredTemplates = this._reg_templates || {}; - - if(this.config[name] && registeredTemplates[name] != this.config[name]){ - if(!(initial && this.templates[name])){ - this.templates[name] = this.date.date_to_str(this.config[name]); - registeredTemplates[name] = this.config[name]; - } - } - this._reg_templates = registeredTemplates; -}; -gantt._init_templates = function(){ - var labels = gantt.locale.labels; - labels.gantt_save_btn = labels.icon_save; - labels.gantt_cancel_btn = labels.icon_cancel; - labels.gantt_delete_btn = labels.icon_delete; - - - - //build configuration based templates - var d = this.date.date_to_str; - var c = this.config; - gantt._init_template("date_scale", true); - gantt._init_template("date_grid", true); - gantt._init_template("task_date", true); - - - - dhtmlx.mixin(this.templates,{ - xml_date:this.date.str_to_date(c.xml_date,c.server_utc), - xml_format:d(c.xml_date,c.server_utc), - api_date:this.date.str_to_date(c.api_date), - progress_text:function(start, end, task){return "";}, - grid_header_class : function(column, config){ - return ""; - }, - - task_text:function(start, end, task){ - return task.text; - }, - task_class:function(start, end, task){return "";}, - grid_row_class:function(start, end, task){ - return ""; - }, - task_row_class:function(start, end, task){ - return ""; - }, - task_cell_class:function(item, date){return "";}, - scale_cell_class:function(date){return "";}, - scale_row_class:function(date){return "";}, - - grid_indent:function(item) { - return "<div class='gantt_tree_indent'></div>"; - }, - grid_folder:function(item) { - if(item.$open||gantt._get_safe_type(item.type)!==gantt.config.types.task){ // HOSEK - return "<div class='gantt_tree_icon gantt_folder_" + (item.$open ? "open" : "closed") + "'></div>"; - }else{ - return "<div class='gantt_tree_icon'><div class='gantt_drag_handle gantt_alldirarrow'></div></div>"; // HOSEK - } - }, - grid_file:function(item) { - if(gantt._get_safe_type(item.type)===gantt.config.types.task) - return "<div class='gantt_tree_icon'><div class='gantt_drag_handle gantt_alldirarrow'></div></div>"; // HOSEK - return "<div class='gantt_tree_icon gantt_folder_open'></div>"; - //return "<div class='gantt_tree_icon gantt_file'></div>"; - }, - grid_open:function(item) { - return "<div class='gantt_tree_icon gantt_" + (item.$open ? "close" : "open") + "'></div>"; - }, - grid_blank:function(item) { - return "<div class='gantt_tree_icon gantt_blank'></div>"; - }, - - task_time:function(start,end,ev){ - return gantt.templates.task_date(start)+" - "+gantt.templates.task_date(end); - }, - time_picker:d(c.time_picker), - link_class : function(link){ - return ""; - }, - link_description : function(link){ - var from = gantt.getTask(link.source), - to = gantt.getTask(link.target); - - return "<b>" + from.text + "</b> – <b>" + to.text+"</b>"; - }, - - drag_link : function(from, from_start, to, to_start) { - from = gantt.getTask(from); - var labels = gantt.locale.labels; - - var text = "<b>" + from.text + "</b> " + (from_start ? labels.link_start : labels.link_end)+"<br/>"; - if(to){ - to = gantt.getTask(to); - text += "<b> " + to.text + "</b> "+ (to_start ? labels.link_start : labels.link_end)+"<br/>"; - } - return text; - }, - drag_link_class: function(from, from_start, to, to_start) { - var add = ""; - - if(from && to){ - var allowed = gantt.isLinkAllowed(from, to, from_start, to_start); - add = " " + (allowed ? "gantt_link_allow" : "gantt_link_deny"); - } - - return "gantt_link_tooltip" + add; - } - }); - - this.callEvent("onTemplatesReady",[]); -}; - -})(); -if (window.jQuery){ - -(function( $ ){ - - var methods = []; - $.fn.dhx_gantt = function(config){ - config = config || {}; - if (typeof(config) === 'string') { - if (methods[config] ) { - return methods[config].apply(this, []); - }else { - $.error('Method ' + config + ' does not exist on jQuery.dhx_gantt'); - } - } else { - var views = []; - this.each(function() { - if (this && this.getAttribute){ - if (!this.getAttribute("dhxgantt")){ - for (var key in config) - if (key!="data") - gantt.config[key] = config[key]; - - gantt.init(this); - if (config.data) - gantt.parse(config.data); - - views.push(gantt); - } - } - }); - - - if (views.length === 1) return views[0]; - return views; - } - }; - -})(jQuery); - -} - -if (window.dhtmlx){ - - if (!dhtmlx.attaches) - dhtmlx.attaches = {}; - - dhtmlx.attaches.attachGantt=function(start, end){ - var obj = document.createElement("DIV"); - obj.id = "gantt_"+dhtmlx.uid(); - obj.style.width = "100%"; - obj.style.height = "100%"; - obj.cmp = "grid"; - - document.body.appendChild(obj); - this.attachObject(obj.id); - - var that = this.vs[this.av]; - that.grid = gantt; - - gantt.init(obj.id, start, end); - obj.firstChild.style.border = "none"; - - that.gridId = obj.id; - that.gridObj = obj; - - var method_name="_viewRestore"; - return this.vs[this[method_name]()].grid; - }; - -} -gantt.locale = { - //date:{ - // month_full:["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], - // month_short:["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], - // day_full:["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], - // day_short:["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] - //}, - labels:{ - //new_task:"New task", - //icon_save:"Save", - //icon_cancel:"Cancel", - //icon_details:"Details", - //icon_edit:"Edit", - //icon_delete:"Delete", - //confirm_closing:"",//Your changes will be lost, are your sure ? - //confirm_deleting:"Task will be deleted permanently, are you sure?", - // section_description:"Description", - // section_time:"Time period", - //section_type:"Type", - // - // /* grid columns */ - // - // column_text : "Task name", - // column_start_date : "Start time", - // column_duration : "Duration", - // column_add : "", - // - ///* link confirmation */ - //link: "Link", - //confirm_link_deleting:"will be deleted", - //link_start: " (start)", - //link_end: " (end)", - // - //type_task: "Task", - //type_project: "Project", - //type_milestone: "Milestone", - // - // minutes: "Minutes", - // hours: "Hours", - // days: "Days", - // weeks: "Week", - // months: "Months", - // years: "Years" - } -}; - - - - -gantt.skins.skyblue = { - config:{ - grid_width:350, - row_height: 27, - scale_height: 27, - link_line_width:1, - link_arrow_size:8, - lightbox_additional_height:75 - }, - _second_column_width:95, - _third_column_width:80 -}; -gantt.skins.meadow = { - config:{ - grid_width:350, - row_height: 27, - scale_height: 30, - link_line_width:2, - link_arrow_size:6, - lightbox_additional_height:72 - }, - _second_column_width:95, - _third_column_width:80 -}; - -gantt.skins.terrace = { - config:{ - grid_width:360, - row_height: 35, - scale_height: 35, - link_line_width:2, - link_arrow_size:6, - lightbox_additional_height:75 - }, - _second_column_width:90, - _third_column_width:70 -}; -gantt.skins.broadway = { - config:{ - grid_width:360, - row_height: 35, - scale_height: 35, - link_line_width:1, - link_arrow_size:7, - lightbox_additional_height:86 - }, - _second_column_width:90, - _third_column_width:80, - - _lightbox_template:"<div class='gantt_cal_ltitle'><span class='gantt_mark'> </span><span class='gantt_time'></span><span class='gantt_title'></span><div class='gantt_cancel_btn'></div></div><div class='gantt_cal_larea'></div>", - _config_buttons_left: {}, - _config_buttons_right: { - "gantt_delete_btn": "icon_delete", - "gantt_save_btn": "icon_save" - } -}; - - -gantt.config.touch_drag = 500; //nearly immediate dnd -gantt.config.touch = true; -gantt.config.touch_feedback = true; - - -gantt._touch_feedback = function(){ - if(gantt.config.touch_feedback){ - if(navigator.vibrate) - navigator.vibrate(1); - } -}; - -gantt._init_touch_events = function(){ - if (this.config.touch != "force") - this.config.touch = this.config.touch && - ((navigator.userAgent.indexOf("Mobile")!=-1) || - (navigator.userAgent.indexOf("iPad")!=-1) || - (navigator.userAgent.indexOf("Android")!=-1) || - (navigator.userAgent.indexOf("Touch")!=-1)); - - if (this.config.touch){ - if (window.navigator.msPointerEnabled){ - this._touch_events(["MSPointerMove", "MSPointerDown", "MSPointerUp"], function(ev){ - if (ev.pointerType == ev.MSPOINTER_TYPE_MOUSE ) return null; - return ev; - }, function(ev){ - return (!ev || ev.pointerType == ev.MSPOINTER_TYPE_MOUSE); - }); - } else - this._touch_events(["touchmove", "touchstart", "touchend"], function(ev){ - if (ev.touches && ev.touches.length > 1) return null; - if (ev.touches[0]) - return { - target: ev.target, - pageX: ev.touches[0].pageX, - pageY: ev.touches[0].pageY, - clientX:ev.touches[0].clientX, - clientY:ev.touches[0].clientY - }; - else - return ev; - }, function(){ return false; }); - } -}; - - -//we can't use native scrolling, as we need to sync momentum between different parts -//so we will block native scroll and use the custom one -//in future we can add custom momentum -gantt._touch_events = function(names, accessor, ignore){ - //webkit on android need to be handled separately - var dblclicktime = 0; - var action_mode = false; - var scroll_mode = false; - var dblclick_timer = 0; - var action_start = null; - var scroll_state; - var long_tap_timer = null; - var current_target = null; - - //touch move - if (!this._gantt_touch_event_ready){ - this._gantt_touch_event_ready = 1; - dhtmlxEvent(gantt.$container, names[0], function(e){ - if (ignore(e)) return; - - //ignore common and scrolling moves - if (!action_mode) return; - - if (long_tap_timer) clearTimeout(long_tap_timer); - - var source = accessor(e); - if (gantt._tasks_dnd.drag.id || gantt._tasks_dnd.drag.start_drag) { - gantt._tasks_dnd.on_mouse_move(source); - if (e.preventDefault) - e.preventDefault(); - e.cancelBubble = true; - return false; - } - if (source && action_start){ - var dx = action_start.pageX - source.pageX; - var dy = action_start.pageY - source.pageY; - if (!scroll_mode && (Math.abs(dx) > 5 || Math.abs(dy) > 5)){ - gantt._touch_scroll_active = scroll_mode = true; - dblclicktime = 0; - scroll_state = gantt.getScrollState(); - } - - if (scroll_mode){ - gantt.scrollTo(scroll_state.x + dx, scroll_state.y + dy); - var new_scroll_state = gantt.getScrollState(); - - if((scroll_state.x != new_scroll_state.x && dy > 2 * dx) || - (scroll_state.y != new_scroll_state.y && dx > 2 * dy )) - { - return block_action(e); - } - } - } - return block_action(e); - }); - } - - //block touch context menu in IE10 - dhtmlxEvent(this.$container, "contextmenu", function(e){ - if (action_mode) - return block_action(e); - }); - - //touch start - dhtmlxEvent(this.$container, names[1], function(e){ - if (ignore(e)) return; - if (e.touches && e.touches.length > 1){ - action_mode = false; - return; - } - - action_mode = true; - action_start = accessor(e); - - - - //dbl-tap handling - if (action_start && dblclicktime){ - var now = gantt.date.Date(); - if ((now - dblclicktime) < 500 ){ - gantt._on_dblclick(action_start); - block_action(e); - } else - dblclicktime = now; - } else { - dblclicktime = gantt.date.Date(); - } - - //long tap - long_tap_timer = setTimeout(function(){ - var taskId = gantt.locate(action_start); - if(taskId && !gantt._locate_css(action_start, "gantt_link_control") && !gantt._locate_css(action_start, "gantt_grid_data")) { - gantt._tasks_dnd.on_mouse_down(action_start); - gantt._tasks_dnd._start_dnd(action_start); - gantt._touch_drag = true; - cloneTaskRendered(taskId); - - gantt.refreshTask(taskId); - - gantt._touch_feedback(); - } - - long_tap_timer = null; - }, gantt.config.touch_drag); - }); - - //touch end - dhtmlxEvent(this.$container, names[2], function(e){ - if (ignore(e)) return; - if (long_tap_timer) clearTimeout(long_tap_timer); - gantt._touch_drag = false; - action_mode = false; - var source = accessor(e); - gantt._tasks_dnd.on_mouse_up(source); - - if(current_target) { - gantt.refreshTask(gantt.locate(current_target)); - current_target.parentNode.removeChild(current_target); - gantt._touch_feedback(); - } - - gantt._touch_scroll_active = action_mode = scroll_mode = false; - current_target = null; - }); - - - //common helper, prevents event - function block_action(e){ - if (e && e.preventDefault) - e.preventDefault(); - (e||event).cancelBubble = true; - return false; - } - - function cloneTaskRendered(taskId) { - var renders = gantt._task_area_pulls; - var task = gantt.getTask(taskId); - if(task && gantt.isTaskVisible(taskId)){ - for(var i in renders) { - task = renders[i][taskId]; - if(task && task.getAttribute("task_id") && task.getAttribute("task_id") == taskId) { - var copy = task.cloneNode(true); - current_target = task; - renders[i][taskId] = copy; - task.style.display="none"; - copy.className += " gantt_drag_move "; - task.parentNode.appendChild(copy); - return copy; - } - } - } - } -}; diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/dhtmlxgantt_marker.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/dhtmlxgantt_marker.js deleted file mode 100644 index 56883743a360c77ddda1655965d6734821ca7a9c..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/dhtmlxgantt_marker.js +++ /dev/null @@ -1,127 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.1 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ - -if(!gantt._markers) - gantt._markers = {}; - -gantt.config.show_markers = true; - -gantt.attachEvent("onClear", function(){ - gantt._markers = {}; -}); - -gantt.attachEvent("onGanttReady", function(){ - /*if(!gantt.$marker_area){ // HOSEK - var markerArea=$(".gantt_marker_area"); - if(markerArea.length===0){ - markerArea = document.createElement("div"); - markerArea.className = "gantt_marker_area"; - gantt.$task_data.appendChild(markerArea); - }else{ - markerArea=markerArea[0]; - } - gantt.$marker_area = markerArea; - }*/ // HOSEK - - //gantt._markerRenderer = gantt._task_renderer("markers", render_marker, gantt.$marker_area, null); - gantt._markerRenderer = gantt._task_renderer({id:"markers",renderer: render_marker,container: gantt.$marker_area,filter: null}); - - function render_marker(marker){ - if(!gantt.config.show_markers) - return false; - - if(!marker.start_date) - return false; - - var state = gantt.getState(); - if(+marker.start_date > +state.max_date) - return; - if(+marker.end_date && +marker.end_date < +state.min_date || +marker.start_date < +state.min_date) - return; - - var div = document.createElement("div"); - - div.setAttribute("marker_id", marker.id); - - var css = "gantt_marker"; - if(gantt.templates.marker_class) - css += " " + gantt.templates.marker_class(marker); - - if(marker.css){ - css += " " + marker.css; - } - - if(marker.title){ - div.title = marker.title; - } - div.className = css; - - var start = gantt.posFromDate(marker.start_date); - div.style.left = start + "px"; - div.style.height = Math.max(gantt._y_from_ind(gantt._order.length), 0) + "px"; - if(marker.end_date){ - var end = gantt.posFromDate(marker.end_date); - div.style.width = Math.max((end - start), 0) + "px"; - - } - - if(marker.text){ - div.innerHTML = "<div class='gantt_marker_content' >" + marker.text + "</div>"; - } - - return div; - } -}); - - -gantt.attachEvent("onDataRender", function(){ - gantt.renderMarkers(); -}); - -gantt.getMarker = function(id){ - if(!this._markers) return null; - - return this._markers[id]; -}; - -gantt.addMarker = function(marker){ - marker.id = marker.id || dhtmlx.uid(); - - this._markers[marker.id] = marker; - - return marker.id; -}; - -gantt.deleteMarker = function(id){ - if(!this._markers || !this._markers[id]) - return false; - - delete this._markers[id]; - return true; -}; -gantt.updateMarker = function(id){ - if(this._markerRenderer) - this._markerRenderer.render_item(id); -}; -gantt.renderMarkers = function(){ - if(!this._markers) - return false; - - if(!this._markerRenderer) - return false; - - var to_render = []; - - for(var id in this._markers) - to_render.push(this._markers[id]); - - this._markerRenderer.render_items(to_render); - - return true; -}; \ No newline at end of file diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/easy_gantt.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/easy_gantt.js deleted file mode 100644 index e198612b16a29537473894f43d466d04789f4474..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/easy_gantt.js +++ /dev/null @@ -1,9 +0,0 @@ -/* - * = require_directory ./libs - * = require easy_gantt/utils - * = require easy_gantt/data - * = require easy_gantt/widget - * = require_directory . - * = stub easy_gantt/sample - * = stub easy_gantt/libs/moment -*/ \ No newline at end of file diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/gantt_widget.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/gantt_widget.js deleted file mode 100644 index 056e99ead02ae52c5c89ee51c238d2026ad6d6f2..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/gantt_widget.js +++ /dev/null @@ -1,574 +0,0 @@ -/* gantt_widget.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.view = ysy.view || {}; -//##################################################################### -ysy.view.Gantt = function () { - ysy.view.Widget.call(this); - this.name = "GanttInitWidget"; - ysy.log.message("widget Gantt created"); -}; -ysy.main.extender(ysy.view.Widget, ysy.view.Gantt, { - _updateChildren: function () { - if (this.children.length > 0) { - return; - } - var renderer = new ysy.view.GanttRender(); - renderer.init( - ysy.data.limits, - ysy.settings.critical, - ysy.settings.zoom, - ysy.settings.sumRow - ); - this.children.push(renderer); - }, - _postInit: function () { - //gantt.initProjectMarker(this.model.start,this.model.end); - }, - _repaintCore: function () { - if (this.$target === null) { - throw "Target is null for " + this.name; - } - if (!ysy.data.columns) { - //ysy.log.log("GanttInitWidget: columns are missing"); - return true; - } - ysy.data.limits.setSilent("zoomDate", gantt.getShowDate() || moment()); - ysy.view.initGantt(); - this.addBaselineLayer(); - gantt.init(this.$target); // REPAINT - ysy.log.debug("gantt.init()", "load"); - this.tideFunctionality(); // TIDE FUNCTIONALITY - for (var i = 0; i < this.children.length; i++) { - var child = this.children[i]; - child.$target = this.$target; // SET CHILD TARGET - child.repaint(true); // CHILD REPAINT - } - if (!ysy.settings.controls.controls) { - $(".gantt_bars_area").addClass("no_task_controls"); - } - dhtmlx.dragScroll(); - }, - addBaselineLayer: function () { - } -}); -//############################################################################## -ysy.view.GanttRender = function () { - ysy.view.Widget.call(this); - this.name = "GanttRenderWidget"; -}; -ysy.main.extender(ysy.view.Widget, ysy.view.GanttRender, { - _updateChildren: function () { - if (!this.tasks) { - this.tasks = new ysy.view.GanttTasks(); - this.tasks.init( - ysy.data.issues, - ysy.data.milestones, - ysy.data.projects, - ysy.settings.resource, - ysy.data.assignees, - ysy.settings.scheme - ); - this.children.push(this.tasks); - } - if (!this.links) { - this.links = new ysy.view.GanttLinks(); - this.links.init( - ysy.data.relations, - ysy.settings.resource - ); - this.children.push(this.links); - } - if (!this.refresher) { - this.refresher = new ysy.view.GanttRefresher(); - this.refresher.init(gantt); - this.children.push(this.refresher); - } - if (!this.sumRow && ysy.settings.sumRow.active) { - this.sumRow = new ysy.view.SumRow(); - this.sumRow.init(); - this.children.push(this.sumRow); - } - }, - zoomTo: function (timespan) { - if (timespan === "month") { - $.extend(gantt.config, { - scale_unit: "month", - date_scale: "%M", - subscales: [ - {unit: "year", step: 1, date: "%Y"} - ] - }); - } else if (timespan === "week") { - $.extend(gantt.config, { - scale_unit: "week", - date_scale: "%W", - subscales: [ - {unit: "month", step: 1, date: "%F %Y"} - ] - }); - } else if (timespan === "day") { - $.extend(gantt.config, { - scale_unit: "day", - date_scale: "%d", - subscales: [ - {unit: "month", step: 1, date: "%F %Y"} - ] - }); - } - if (this.sumRow && ysy.settings.sumRow.active) { - gantt.config.subscales.push(this.sumRow.getSubScale(timespan)); - } - }, - _repaintCore: function () { - if (this.$target === null) { - throw "Target is null for " + this.name; - } - this.zoomTo(ysy.settings.zoom.zoom); - //this.addBaselineLayer(); - //ysy.data.limits.setSilent("pos", gantt.getScrollState()); - //var pos = ysy.data.limits.pos; - //if (pos)ysy.log.debug("scrollSave pos={x:" + pos.x + ",y:" + pos.y + "}", "scroll"); - // gantt.render(); - this.tideFunctionality(); // TIDE FUNCTIONALITY - for (var i = 0; i < this.children.length; i++) { - var child = this.children[i]; - child.repaint(true); // CHILD REPAINT - } - - }, - addBaselineLayer: function () { - } -}); -//############################################################################## -ysy.view.GanttTasks = function () { - ysy.view.Widget.call(this); - this.name = "GanttTasksWidget"; - ysy.view.ganttTasks = this; -}; -ysy.main.extender(ysy.view.Widget, ysy.view.GanttTasks, { - _selectChildren: function () { - var issues = this.model.getArray(); - var milestones = ysy.data.milestones.getArray(); - var projects = ysy.data.projects.getArray(); - return issues.concat(milestones,projects); - }, - _updateChildren: function () { - var combined = this._selectChildren(); - //var combined=issues.concat(milestones); - var i, model, task; - if (this.children.length === 0) { - for (i = 0; i < combined.length; i++) { - model = combined[i]; - task = new ysy.view.GanttTask(); - task.init(model); - task.parent = this; - task.order = i + 1; - this.children.push(task); - } - } else { - var narr = []; - var temp = {}; - for (i = 0; i < this.children.length; i++) { - var child = this.children[i]; - temp[child.model.getID()] = child; - } - for (i = 0; i < combined.length; i++) { - model = combined[i]; - task = temp[model.getID()]; - if (!task) { - task = new ysy.view.GanttTask(); - task.init(model); - task.parent = this; - } else { - delete temp[model.getID()]; - } - task.order = i + 1; - narr.push(task); - } - for (var key in temp) { - if (temp.hasOwnProperty(key)) { - temp[key].destroy(true); - } - } - //var narr = []; - this.children = narr; - } - ysy.log.log("-- " + this.children.length + " Children updated in " + this.name); - }, - _repaintCore: function () { - for (var i = 0; i < this.children.length; i++) { - var child = this.children[i]; - //this.setChildTarget(child, i); // SET CHILD TARGET - child.repaint(true); // CHILD REPAINT - } - gantt._sync_links(); - gantt.reconstructTree(); - gantt.sort(gantt._sort && gantt._sort.criteria); - //window.initInlineEditForContainer($("#gantt_cont")); // TODO - } -}); -//############################################################################## -ysy.view.GanttTask = function () { - ysy.view.Widget.call(this); - this.name = "GanttTaskWidget"; -}; -ysy.main.extender(ysy.view.Widget, ysy.view.GanttTask, { - _repaintCore: function () { - var issue = this.model; - var gantt_issue = this._constructDhData(issue); - if (gantt._pull[gantt_issue.id]) { - if (this.dhdata.parent != gantt_issue.realParent) { - gantt.silentMoveTask(this.dhdata, gantt_issue.realParent); - delete gantt_issue.realParent; - } - $.extend(this.dhdata, gantt_issue); - gantt.refreshTask(gantt_issue.id); - } else { - this.destroyDhData(); - this.dhdata = gantt_issue; - ysy.log.debug("addTaskNoDraw()", "load"); - gantt.addTaskFaster(gantt_issue); - } - //window.initInlineEditForContainer($("#gantt_cont")); // TODO - }, - destroyDhData: function (silent) { - if (!this.dhdata) return; - this.dhdata.deleted = true; - if (gantt.isTaskExists(this.dhdata.id)) { - gantt._deleteTask(this.dhdata.id, silent); - } - this.dhdata = null; - ysy.log.debug("Destroy for " + this.name, "widget_destroy"); - }, - destroy: function (silent) { - this.destroyDhData(silent); - this.deleted = true; - }, - _constructDhData: function (issue) { - // var parent = issue.getParent() || 0; - var gantt_issue = { - id: issue.getID(), - real_id: issue.id, - text: issue.name, - css: (issue.css || '') + (issue.closed ? ' closed' : ''), - //model:issue, - widget: this, - order: this.order, - open: issue.isOpened(), - start_date: issue.start_date ? moment(issue.start_date) : undefined, - $ignore: issue._ignore || false, - columns: issue.columns, - readonly: !issue.isEditable(), - realParent: issue.getParent() || 0, - type: issue.ganttType - }; - gantt_issue.$open = gantt_issue.open; - if (issue.isProject) { - // -- PROJECT -- - $.extend(gantt_issue, { - progress: issue.getProgress(), - maximal_start: issue.start_date, - minimal_end: issue.end_date, - start_date: issue.start_date, - end_date: issue.end_date - }); - } else if (issue.isIssue) { - // -- ISSUE -- - var end_date = moment(issue._end_date); - //if (!issue._end_date.isValid()) { - // console.error("_end_date is not valid"); - // end_date = moment(issue._start_date).add(1, "d"); - //} - end_date._isEndDate = true; - $.extend(gantt_issue, { - start_date: moment(issue._start_date), - end_date: end_date, - progress: (issue.done_ratio || 0) / 100.0, - //duration: issue.end_date.diff(issue.start_date, 'days'), - assigned_to: issue.assigned_to, - estimated: issue.estimated_hours || 0, - soonest_start: issue.soonest_start, - latest_due: issue.latest_due - }); - } else if (issue.milestone) { - // -- MILESTONE -- - gantt_issue.end_date = moment(gantt_issue.start_date); - gantt_issue.end_date._isEndDate = true; - } else { - // -- ASSIGNEE -- - } - ysy.proManager.fireEvent("extendGanttTask", issue, gantt_issue); - return gantt_issue; - }, - update: function (item, keys) { - var obj; - if (item.type === "milestone") { - this.model.set({ - name: item.text, - start_date: moment(item.start_date) - }); - } else if (item.type === "project") { - obj = { - start_date: moment(item.start_date), - end_date: moment(item.end_date), - _shift: item.start_date.diff(this.model.start_date, "days") + (this.model._shift || 0) - }; - obj.end_date._isEndDate = true; - this.model.set(obj); - } else { - var fullObj = { - name: item.text, - //assignedto: item.assignee, - estimated_hours: item.estimated, - done_ratio: Math.round(item.progress * 10) * 10, - start_date: moment(item.start_date), - end_date: moment(item.end_date) - }; - fullObj.end_date._isEndDate = true; - if (item._parentChanged) { - $.extend(fullObj, this._constructParentUpdate(item.parent)); - item._parentChanged = false; - } - obj = fullObj; - if (keys !== undefined) { - obj = {}; - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - if (key === "fixed_version_id") { - if (typeof item.parent === "string") { - obj.fixed_version_id = parseInt(item.parent.substring(1)); - } else { - obj.parent = item.parent; // TODO subtask žížaly musí mít parent nebo něco - } - //this.parent.requestRepaint(); - } else { - obj[key] = fullObj[key]; - } - } - } - this.model.set(obj); - } - this.requestRepaint(); - }, - _constructParentUpdate: function (parentId) { - if (typeof parentId !== "string") { - var parent = gantt._pull[parentId]; - if (!parent) return {}; - var parentModel = parent.widget.model; - if (!parentModel) return {}; - if (parentModel.fixed_version_id) { - return { - parent_issue_id: parentId, - fixed_version_id: parentModel.fixed_version_id, - project_id: parentModel.project_id - }; - } else { - return {parent_issue_id: parentId, project_id: parentModel.project_id}; - } - } else if (ysy.main.startsWith(parentId, "p")) { - return { - parent_issue_id: null, project_id: parseInt(parentId.substring(1)), fixed_version_id: null - }; - } else if (ysy.main.startsWith(parentId, "m")) { - return { - parent_issue_id: null, fixed_version_id: parseInt(parentId.substring(1)) - }; - } else if (parentId === "empty") { - return { - parent_issue_id: null, project_id: ysy.settings.projectID, fixed_version_id: null - }; - } else return null; - } -}); -//############################################################################## -ysy.view.GanttLinks = function () { - ysy.view.Widget.call(this); - this.name = "GanttLinksWidget"; - ysy.view.ganttLinks = this; -}; -ysy.main.extender(ysy.view.Widget, ysy.view.GanttLinks, { - _updateChildren: function () { - var rela, link, i; - var model = this.model.getArray(); - if (this.children.length === 0) { - for (i = 0; i < model.length; i++) { - rela = model[i]; - if (rela.isHalfLink()) continue; - link = new ysy.view.GanttLink(); - link.init(rela); - this.children.push(link); - } - } else { - var narr = []; - var temp = {}; - for (i = 0; i < this.children.length; i++) { - var child = this.children[i]; - temp[child.model.id] = child; - } - for (i = 0; i < model.length; i++) { - rela = model[i]; - if (rela.isHalfLink()) continue; - link = temp[rela.id]; - if (!link) { - link = new ysy.view.GanttLink(); - link.init(rela); - } else { - delete temp[rela.id]; - } - narr.push(link); - } - for (var key in temp) { - if (temp.hasOwnProperty(key)) { - temp[key].destroy(true); - } - } - this.children = narr; - } - ysy.log.log("-- " + this.children.length + " Children updated in " + this.name); - }, - _repaintCore: function () { - //this._updateTaskInGantt(); - for (var i = 0; i < this.children.length; i++) { - var child = this.children[i]; - //this.setChildTarget(child, i); // SET CHILD TARGET - child.repaint(true); // CHILD REPAINT - } - //gantt.refreshData(); - } -}); -//############################################################################## -ysy.view.GanttLink = function () { - ysy.view.Widget.call(this); - this.name = "GanttLinkWidget"; -}; -ysy.main.extender(ysy.view.Widget, ysy.view.GanttLink, { - _repaintCore: function () { - var rela = this.model; - var link = this._constructDhData(rela); - if (gantt._lpull[link.id]) { - $.extend(this.dhdata, link); - gantt.refreshLink(link.id); - gantt.refreshTask(link.source); - gantt.refreshTask(link.target); - } else { - this.dhdata = link; - gantt.addLink(link); - } - //gantt.sort(); - }, - destroy: function (silent) { - if (this.dhdata) { - this.dhdata.deleted = true; - if (gantt.isLinkExists(this.model.id)) { - gantt._deleteLink(this.model.id, silent); - } - this.dhdata = null; - ysy.log.debug("Destroy for " + this.name, "widget_destroy"); - } - this.deleted = true; - }, - _constructDhData: function (model) { - return { - id: model.id, - source: model.source_id, - target: model.target_id, - type: model.isSimple ? "start_to_start" : model.type, - isSimple: model.isSimple, - unlocked: model.unlocked, - delay: model.delay, - readonly: !model.isEditable(), - widget: this - }; - }, - update: function (item) { - ysy.history.openBrack(); - this.model.set({ - // name: item.text, - // source_id: item.source, - // target_id: item.target, - type: this.model.type || item.type, - delay: item.delay - }); - var allRequests = {}; - this.model.sendMoveRequest(allRequests); - gantt.applyMoveRequests(allRequests); - ysy.history.closeBrack(); - } - -}); -//############################################################################## -ysy.view.GanttRefresher = function () { - ysy.view.Widget.call(this); - this.name = "GanttRefresherWidget"; - this.all = false; - this.data = false; - this.tasks = []; - this.links = []; -}; -ysy.main.extender(ysy.view.Widget, ysy.view.GanttRefresher, { - _postInit: function () { - this.model.refresher = this; - }, - _register: function () { - }, - renderAll: function () { - this.all = true; - this.requestRepaint(); - }, - renderData: function () { - this.data = true; - this.requestRepaint(); - }, - refreshTask: function (taskId) { - for (var i = 0; i < this.tasks.length; i++) { - if (this.tasks[i] == taskId) return; - } - this.tasks.push(taskId); - this.requestRepaint(); - }, - refreshLink: function (linkId) { - for (var i = 0; i < this.links.length; i++) { - if (this.links[i] == linkId) return; - } - this.links.push(linkId); - this.requestRepaint(); - }, - _repaintCore: function () { - if (this.all) { - ysy.log.debug("---- Refresher: _renderAll", "refresher"); - var visibleDate = gantt.getShowDate(); - if (!visibleDate) { - visibleDate = ysy.data.limits.zoomDate; - } - gantt._backgroundRenderer.forceRender = false; - this.model._render(); - gantt._backgroundRenderer.forceRender = true; - //ysy.log.debug(moment(visibleDate).toISOString(), "refresher"); - gantt.showDate(visibleDate); - delete gantt._backgroundRenderer.forceRender; - ysy.view.affix.requestRepaint(); - } else if (this.data) { - ysy.log.debug("---- Refresher: _renderData", "refresher"); - this.model._render_data(); - if (this.all) return true; - } else { - ysy.log.debug("---- Refresher: _render for " + this.tasks.length + " tasks and " + this.links.length + " links", "refresher"); - for (var i = 0; i < this.tasks.length; i++) { - var taskId = this.tasks[i]; - this.model._refreshTask(taskId); - if (this.all || this.data) return true; - } - for (i = 0; i < this.links.length; i++) { - var linkId = this.links[i]; - this.model._refreshLink(linkId); - if (this.all || this.data) return true; - } - } - this.all = false; - this.data = false; - this.tasks = []; - this.links = []; - } - -}); diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/history.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/history.js deleted file mode 100644 index 27341902b7e94428720ba83e967a43033fc9c9f4..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/history.js +++ /dev/null @@ -1,130 +0,0 @@ -/* history.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.history = ysy.history || {}; -$.extend(ysy.history, { - _name: "History", - _inbrack: 0, - stack: [], - _binded: false, - add: function (diff, ctx) { - this.stack.push({diff: diff, ctx: ctx}); - this._fireChanges(this, "add"); - this._bind(); - }, - revert: function (who) { - var first = true; - if (this.stack.length === 0) return; - while (this._inbrack || first) { - first = false; - var rev = this.stack.pop(); - if (!rev) return; - if (typeof rev === "string") { - if (rev === "close") { - this._inbrack++; - continue; - } else if (rev === "open") { - this._inbrack--; - break; - } - } - this._revertOne(rev); - } - //console.log("Revert by "+(typeof rev.diff)); - if (this.stack.length === 0) { - this._unbind(); - } - this._fireChanges(who, "revert"); - }, - _revertOne: function (rev) { - if (typeof rev.diff === "array") { - rev.ctx.array = rev.diff; - rev.ctx._fireChanges(this, "revert"); - } else if (typeof rev.diff === "function") { - $.proxy(rev.diff, rev.ctx)(); - rev.ctx._fireChanges(this, "revert"); - } else { - //rev.ctx.set(rev.diff,true); - $.extend(rev.ctx, rev.diff); - rev.ctx._fireChanges(this, "revert"); - } - - }, - clear: function (who) { - if (this.stack.length > 0) { - this._unbind(); - } - this.stack = []; - this._inbrack = 0; - this._fireChanges(who, "clear"); - }, - openBrack: function () { - if (this._inbrack) { - - } else { - this.stack.push("open"); - } - this._inbrack++; - }, - closeBrack: function () { - if (this._inbrack === 0) { - ysy.log.error("History bracket is not opened"); - } - if (this._inbrack === 1) { - if (this.stack[this.stack.length - 1] === "open") { - this.stack.pop(); - } else { - this.stack.push("close"); - } - } - this._inbrack--; - }, - _bind: function () { - if (this._binded)return; - $(window).bind('beforeunload', function (e) { - var message = "Some changes are not saved!"; - e.returnValue = message; - return message; - }); - }, - _unbind: function () { - $(window).unbind('beforeunload'); - this._binded = false; - }, - _onChange: [], - register: function (func, ctx) { - this._onChange.push({func: func, ctx: ctx}); - }, - inBracket: function () { - return this._inbrack > 0 - }, - isEmpty: function () { - return !this.stack.length; - }, - _fireChanges: function (who, reason) { - if (who) { - var rest = ""; - if (reason) { - rest = " because of " + reason; - } - ysy.log.log("* " + who._name + " ordered repaint on " + this._name + "" + rest); - - } - if (this._onChange.length > 0) { - ysy.log.log("- " + this._name + " onChange fired for " + this._onChange.length + " widgets"); - } else { - ysy.log.log("- no changes for " + this._name); - } - for (var i = 0; i < this._onChange.length; i++) { - var ctx = this._onChange[i].ctx; - if (!ctx || ctx.deleted) { - this._onChange.splice(i, 1); - continue; - } - //this.onChangeNew[i].func(); - ysy.log.log("-- changes to " + ctx.name + " widget"); - //console.log(ctx); - $.proxy(this._onChange[i].func, ctx)(); - } - } -}); \ No newline at end of file diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/global_gantt.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/global_gantt.js deleted file mode 100644 index bdddeea14d4d399956d89f3c643d1153d7e979aa..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/global_gantt.js +++ /dev/null @@ -1,8 +0,0 @@ -describeExtra("global_gantt", function () { - describe("FREE Global gantt", function () { - it("should fail anywhere but global gantt", function () { - expect(ysy.settings.global).toBe(true); - expect(ysy.settings.isGantt).toBe(true); - }); - }); -}); \ No newline at end of file diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/helpers/test.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/helpers/test.js deleted file mode 100644 index 636bad7cdfaac114717ca3ea4f64a5c0484c839f..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/helpers/test.js +++ /dev/null @@ -1,90 +0,0 @@ -window.ysy = window.ysy || {}; -ysy.pro = ysy.pro || {}; -ysy.pro.test = { - jasmineStarted: false, - startCounter: 0, - beatCallbacks: [], - extraTestNames: [], - extraTestFunctions: [], - patch: function () { - ysy.view.onRepaint.push($.proxy(this.beat, this)); - this.loadExtraTests(); - }, - beat: function () { - if (!this.jasmineStarted) { - if (ysy.data.loader.loaded) { - if (this.startCounter++ > 3) { - this.jasmineStarted = true; - this.jasmineStart(); - } - } - } - if (this.beatCallbacks.length) { - var newCallbacks = []; - for (var i = 0; i < this.beatCallbacks.length; i++) { - var callPack = this.beatCallbacks[i]; - if (callPack.rounds === 1) { - callPack.callback(); - } else { - callPack.rounds--; - newCallbacks.push(callPack); - } - } - this.beatCallbacks = newCallbacks; - } - }, - fewBeatsAfter: function (callback, count) { - if (count === undefined) count = 2; - this.beatCallbacks.push({callback: callback, rounds: count}); - }, - loadExtraTests: function () { - var self = this; - describe("(EXTRA)", function () { - for (var i = 0; i < self.extraTestFunctions.length; i++) { - self.extraTestFunctions[i](); - } - }); - }, - parseResult: function () { - var specs = window.jsApiReporter.specs(); - var shortReport = ""; - var report = ""; - var allPassed = true; - var result = ""; - for (var i = 0; i < specs.length; i++) { - var spec = specs[i]; - if (spec.status === "passed") { - shortReport += "."; - } else { - allPassed = false; - shortReport += "X"; - report += "__TEST " + spec.fullName + "______\n"; - for (var j = 0; j < spec.failedExpectations.length; j++) { - var fail = spec.failedExpectations[j]; - var split = fail.stack.split("\n"); - result+=window.location+"\n"; - report += " " + fail.message + "\n"; - for (var k = 1; k < split.length; k++) { - if (split[k].indexOf("/jasmine_lib/") > -1) break; - report += split[k] + "\n"; - } - } - } - } - if (allPassed) { - return "success"; - } - result += " RESULTS: " + shortReport + "\n" + report; - $("#content").text(result.replace("\n","<br>")); - return result; - } -}; -window.describeExtra = function (file, func) { - if (file.indexOf("/") === -1) { - file = "easy_gantt/" + file - } - ysy.pro.test.extraTestNames.push(file); - ysy.pro.test.extraTestFunctions.push(function () { - describe(file, func); - }); -}; diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/helpers/test_old.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/helpers/test_old.js deleted file mode 100644 index 8a91562805803ae7f9e59f2e765b3bee851cb31b..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/helpers/test_old.js +++ /dev/null @@ -1,160 +0,0 @@ -window.ysy = window.ysy || {}; -ysy.counter = 0; -ysy.test = { - run: function (date) { - //this.test7(); - var predate = moment(date || "2016-02-26"); - var pos = gantt.posFromDate(predate); - var postdate = gantt.dateFromPos2(pos); - console.log("pre: " + predate.toISOString() + " post: " + postdate.toISOString()); - console.log("pre: " + (predate.valueOf() - postdate.valueOf())); - //console.log("posFromDate: " + gantt.posFromDate(predate) + " posFromDate2: " + gantt.posFromDate2(predate)); - }, - test8: function () { - ysy.data.saver.openReloadModal(["error"]); - }, - test7: function () { - ysy.data.critical.construct(); - }, - test6: function () { - window.initInlineEditForContainer($("#gantt_cont")); - }, - test5: function () { - }, - test1: function () { - ysy.data.loader.load(); - gantt._unset_sizes(); - }, - test2: function () { - var issue0 = ysy.data.issues.get(0); - issue0.set({ - start_date: moment(issue0.start_date).add(4, "days"), - end_date: moment(issue0.end_date).add(4, "days") - }); - var rel = new ysy.data.Relation(); - rel.init({delay: 2, id: 150, source_id: 489, target_id: 490, type: "precedes"}); - ysy.data.relations.push(rel); - ysy.history.revert(); - ysy.history.revert(); - issue0 = ysy.data.issues.get(0); - issue0.set({ - start_date: moment(issue0.start_date).add(4, "days"), - end_date: moment(issue0.end_date).add(4, "days") - }); - rel = new ysy.data.Relation(); - rel.init({delay: 2, id: 150, source_id: 489, target_id: 490, type: "precedes"}); - ysy.history.revert(); - ysy.history.revert(); - if (!ysy.history.isEmpty()) { - alert("Test failed 1"); - } - }, - test3: function () { - dhtmlx.message("Warning message", "warning", -1); - //dhtmlx.message("Error message","error",-1); - //dhtmlx.message("Success message","notice",-1); - //dhtmlx.message("Confirm message","confirm"); - - }, - test4: function () { - var projects = ysy.data.projects; - var project = projects.get(0); - /*var allid=[]; - for(var i=0;i<projects.size();i++){ - allid.push(projects.get(i).id); - } - allid.sort(); - console.log("("+allid.join(",")+")");*/ - //project.getIssues().size(); - var issues = project.getIssues(); - /*issues.register(function(){ - //console.log(issues.size()); - $.each(issues.array,function(index,issue){ - //issue.getRelations(); - issue.register(function(){ - //console.log("Issue "+issue.id+" má "); - //console.log(issue.getRelations()); - ysy.counter++; - console.log("Counter: "+ysy.counter); - - },this); - }); - },this);*/ - console.log("Test 2"); - ysy.data.loader.createIssueFromTask({ - start_date: moment("2015-06-25"), - end_date: moment("2015-06-30"), - id: 25666, - text: "Ahoj", - estimated_hours: "253" - }); - //return; - setTimeout(function () { - console.log("test1a"); - issues.get(0).set({start: moment("2015-06-25"), end: moment("2015-06-30")}); - }, 1000); - setTimeout(function () { - console.log("test1b"); - var rel = new ysy.data.Relation(); - rel.init({delay: 0, id: 150, issue_from_id: 489, issue_to_id: 490, type: "precedes"}); - project.relations.push(rel, project.relations); - }, 2000); - /*for(var i=0;i<projects.size();i++){ - projects.getByID(i).getIssues().size(); - }*/ - } -}; -/*ysy.view.demo_tasks = { - data: [ - {"id": 1, "text": "Office itinerancy", "type": gantt.config.types.project, "order": "10", progress: 0.4, open: false}, - {"id": 2, "text": "Office facing", "type": gantt.config.types.project, "start_date": "02-04-2013", "duration": "8", "order": "10", progress: 0.6, "parent": "1", open: true}, - {"id": 3, "text": "Furniture installation", "type": gantt.config.types.project, "start_date": "11-04-2013", "duration": "8", "order": "20", "parent": "1", progress: 0.6, open: true}, - {"id": 4, "text": "The employee relocation", "type": gantt.config.types.project, "start_date": "13-04-2013", "duration": "6", "order": "30", "parent": "1", progress: 0.5, open: true}, - {"id": 5, "text": "Interior office", "start_date": "02-04-2013", "duration": "7", "order": "3", "parent": "2", progress: 0.6, open: true}, - {"id": 6, "text": "Air conditioners check", "start_date": "03-04-2013", "duration": "7", "order": "3", "parent": "2", progress: 0.6, open: true}, - {"id": 7, "text": "Workplaces preparation", "start_date": "11-04-2013", "duration": "8", "order": "3", "parent": "3", progress: 0.6, open: true}, - {"id": 8, "text": "Preparing workplaces", "start_date": "14-04-2013", "duration": "5", "order": "3", "parent": "4", progress: 0.5, open: true}, - {"id": 9, "text": "Workplaces importation", "start_date": "14-04-2013", "duration": "4", "order": "3", "parent": "4", progress: 0.5, open: true}, - {"id": 10, "text": "Workplaces exportation", "start_date": "14-04-2013", "duration": "3", "order": "3", "parent": "4", progress: 0.5, open: true}, - {"id": 11, "text": "Product launch", "type": gantt.config.types.project, "order": "5", progress: 0.6, open: true}, - {"id": 12, "text": "Perform Initial testing", "start_date": "03-04-2013", "duration": "5", "order": "3", "parent": "11", progress: 1, open: true}, - {"id": 13, "text": "Development", "type": gantt.config.types.project, "start_date": "02-04-2013", "duration": "7", "order": "3", "parent": "11", progress: 0.5, open: true}, - {"id": 14, "text": "Analysis", "start_date": "02-04-2013", "duration": "6", "order": "3", "parent": "11", progress: 0.8, open: true}, - {"id": 15, "text": "Design", "type": gantt.config.types.project, "start_date": "02-04-2013", "duration": "5", "order": "3", "parent": "11", progress: 0.2, open: false}, - {"id": 16, "text": "Documentation creation", "start_date": "02-04-2013", "duration": "7", "order": "3", "parent": "11", progress: 0, open: true}, - {"id": 17, "text": "Develop System", "start_date": "03-04-2013", "duration": "2", "order": "3", "parent": "13", progress: 1, open: true}, - {"id": 25, "text": "Beta Release", "start_date": "06-04-2013", "order": "3", "type": gantt.config.types.milestone, "parent": "13", progress: 0, open: true}, - {"id": 18, "text": "Integrate System", "start_date": "08-04-2013", "duration": "2", "order": "3", "parent": "13", progress: 0.8, open: true}, - {"id": 19, "text": "Test", "start_date": "10-04-2013", "duration": "4", "order": "3", "parent": "13", progress: 0.2, open: true}, - {"id": 20, "text": "Marketing", "start_date": "10-04-2013", "duration": "4", "order": "3", "parent": "13", progress: 0, open: true}, - {"id": 21, "text": "Design database", "start_date": "03-04-2013", "duration": "4", "order": "3", "parent": "15", progress: 0.5, open: true}, - {"id": 22, "text": "Software design", "start_date": "03-04-2013", "duration": "4", "order": "3", "parent": "15", progress: 0.1, open: true}, - {"id": 23, "text": "Interface setup", "start_date": "03-04-2013", "duration": "5", "order": "3", "parent": "15", progress: 0, open: true}, - {"id": 24, "text": "Release v1.0", "start_date": "15-04-2013", "order": "3", "type": gantt.config.types.milestone, "parent": "11", progress: 0, open: true} - ], - links: [ - {id: "1", source: "1", target: "2", type: "1"}, - {id: "2", source: "2", target: "3", type: "0"}, - {id: "3", source: "3", target: "4", type: "0"}, - {id: "4", source: "2", target: "5", type: "2"}, - {id: "5", source: "2", target: "6", type: "2"}, - {id: "6", source: "3", target: "7", type: "2"}, - {id: "7", source: "4", target: "8", type: "2"}, - {id: "8", source: "4", target: "9", type: "2"}, - {id: "9", source: "4", target: "10", type: "2"}, - {id: "10", source: "11", target: "12", type: "1"}, - {id: "11", source: "11", target: "13", type: "1"}, - {id: "12", source: "11", target: "14", type: "1"}, - {id: "13", source: "11", target: "15", type: "1"}, - {id: "14", source: "11", target: "16", type: "1"}, - {id: "15", source: "13", target: "17", type: "1"}, - {id: "16", source: "17", target: "25", type: "0"}, - {id: "23", source: "25", target: "18", type: "0"}, - {id: "17", source: "18", target: "19", type: "0"}, - {id: "18", source: "19", target: "20", type: "0"}, - {id: "19", source: "15", target: "21", type: "2"}, - {id: "20", source: "15", target: "22", type: "2"}, - {id: "21", source: "15", target: "23", type: "2"}, - {id: "22", source: "13", target: "24", type: "0"} - ] - };*/ \ No newline at end of file diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/history.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/history.js deleted file mode 100644 index 61d9fcd6f7a6837594fdf0261096def713c6d056..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/history.js +++ /dev/null @@ -1,31 +0,0 @@ -describe("History",function(){ - var issue; - var history; - beforeAll(function(){ - history = ysy.history; - issue = new ysy.data.Issue(); - issue.init({ - id:12, - start_date:"2016-05-25", - due_date:"2016-05-29", - estimated: 25, - subject:"task H", - columns:[] - }); - }); - it("should revert estimated change",function(){ - issue.set("estimated",60); - expect(issue.estimated).toBe(60); - expect(issue._changed).toBe(true); - history.revert(); - expect(issue.estimated).toBe(25); - expect(issue._changed).toBe(false); - }); - it("should revert start_date change",function(){ - issue.set({start_date:moment("2016-05-15")}); - expect(issue.start_date.isSame(moment("2016-05-15"))).toBe(true); - history.revert(); - expect(issue.start_date.isSame(moment("2016-05-25"))).toBe(true); - }); - -}); \ No newline at end of file diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/jasmine_lib/boot.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/jasmine_lib/boot.js deleted file mode 100644 index 7f8bcb332b3009781a88cbe0f097e870e6cac042..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/jasmine_lib/boot.js +++ /dev/null @@ -1,131 +0,0 @@ -/** - Starting with version 2.0, this file "boots" Jasmine, performing all of the necessary initialization before executing the loaded environment and all of a project's specs. This file should be loaded after `jasmine.js` and `jasmine_html.js`, but before any project source files or spec files are loaded. Thus this file can also be used to customize Jasmine for a project. - - If a project is using Jasmine via the standalone distribution, this file can be customized directly. If a project is using Jasmine via the [Ruby gem][jasmine-gem], this file can be copied into the support directory via `jasmine copy_boot_js`. Other environments (e.g., Python) will have different mechanisms. - - The location of `boot.js` can be specified and/or overridden in `jasmine.yml`. - - [jasmine-gem]: http://github.com/pivotal/jasmine-gem - */ - -(function() { - - /** - * ## Require & Instantiate - * - * Require Jasmine's core files. Specifically, this requires and attaches all of Jasmine's code to the `jasmine` reference. - */ - window.jasmine = jasmineRequire.core(jasmineRequire); - - /** - * Since this is being run in a browser and the results should populate to an HTML page, require the HTML-specific Jasmine code, injecting the same reference. - */ - jasmineRequire.html(jasmine); - - /** - * Create the Jasmine environment. This is used to run all specs in a project. - */ - var env = jasmine.getEnv(); - - /** - * ## The Global Interface - * - * Build up the functions that will be exposed as the Jasmine public interface. A project can customize, rename or alias any of these functions as desired, provided the implementation remains unchanged. - */ - var jasmineInterface = jasmineRequire.interface(jasmine, env); - - /** - * Add all of the Jasmine global/public interface to the global scope, so a project can use the public interface directly. For example, calling `describe` in specs instead of `jasmine.getEnv().describe`. - */ - extend(window, jasmineInterface); - - /** - * ## Runner Parameters - * - * More browser specific code - wrap the query string in an object and to allow for getting/setting parameters from the runner user interface. - */ - - var queryString = new jasmine.QueryString({ - getWindowLocation: function() { return window.location; } - }); - - var catchingExceptions = queryString.getParam("catch"); - env.catchExceptions(typeof catchingExceptions === "undefined" ? true : catchingExceptions); - - var throwingExpectationFailures = queryString.getParam("throwFailures"); - env.throwOnExpectationFailure(throwingExpectationFailures); - - var random = queryString.getParam("random"); - env.randomizeTests(random); - - var seed = queryString.getParam("seed"); - if (seed) { - env.seed(seed); - } - - /** - * ## Reporters - * The `HtmlReporter` builds all of the HTML UI for the runner page. This reporter paints the dots, stars, and x's for specs, as well as all spec names and all failures (if any). - */ - var htmlReporter = new jasmine.HtmlReporter({ - env: env, - onRaiseExceptionsClick: function() { queryString.navigateWithNewParam("catch", !env.catchingExceptions()); }, - onThrowExpectationsClick: function() { queryString.navigateWithNewParam("throwFailures", !env.throwingExpectationFailures()); }, - onRandomClick: function() { queryString.navigateWithNewParam("random", !env.randomTests()); }, - addToExistingQueryString: function(key, value) { return queryString.fullStringWithNewParam(key, value); }, - getContainer: function() { return document.body; }, - createElement: function() { return document.createElement.apply(document, arguments); }, - createTextNode: function() { return document.createTextNode.apply(document, arguments); }, - timer: new jasmine.Timer() - }); - - /** - * The `jsApiReporter` also receives spec results, and is used by any environment that needs to extract the results from JavaScript. - */ - env.addReporter(jasmineInterface.jsApiReporter); - env.addReporter(htmlReporter); - - /** - * Filter which specs will be run by matching the start of the full name against the `spec` query param. - */ - var specFilter = new jasmine.HtmlSpecFilter({ - filterString: function() { return queryString.getParam("spec"); } - }); - - env.specFilter = function(spec) { - return specFilter.matches(spec.getFullName()); - }; - - /** - * Setting up timing functions to be able to be overridden. Certain browsers (Safari, IE 8, phantomjs) require this hack. - */ - window.setTimeout = window.setTimeout; - window.setInterval = window.setInterval; - window.clearTimeout = window.clearTimeout; - window.clearInterval = window.clearInterval; - - /** - * ## Execution - * - * Replace the browser window's `onload`, ensure it's called, and then run all of the loaded specs. This includes initializing the `HtmlReporter` instance and then executing the loaded Jasmine environment. All of this will happen after all of the specs are loaded. - */ - var currentWindowOnload = window.onload; - - ysy.pro.test.jasmineStart = function() { - // window.onload = function() { // HOSEKP - // if (currentWindowOnload) { - // currentWindowOnload(); - // } // HOSEKP - htmlReporter.initialize(); - env.execute(); - }; - - /** - * Helper function for readability above. - */ - function extend(destination, source) { - for (var property in source) destination[property] = source[property]; - return destination; - } - -}()); diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/jasmine_lib/jasmine-html.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/jasmine_lib/jasmine-html.js deleted file mode 100644 index da23532e9b661f71eb9b667f52a78e0cfa92e583..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/jasmine_lib/jasmine-html.js +++ /dev/null @@ -1,473 +0,0 @@ -/* -Copyright (c) 2008-2015 Pivotal Labs - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ -jasmineRequire.html = function(j$) { - j$.ResultsNode = jasmineRequire.ResultsNode(); - j$.HtmlReporter = jasmineRequire.HtmlReporter(j$); - j$.QueryString = jasmineRequire.QueryString(); - j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter(); -}; - -jasmineRequire.HtmlReporter = function(j$) { - - var noopTimer = { - start: function() {}, - elapsed: function() { return 0; } - }; - - function HtmlReporter(options) { - var env = options.env || {}, - getContainer = options.getContainer, - createElement = options.createElement, - createTextNode = options.createTextNode, - onRaiseExceptionsClick = options.onRaiseExceptionsClick || function() {}, - onThrowExpectationsClick = options.onThrowExpectationsClick || function() {}, - onRandomClick = options.onRandomClick || function() {}, - addToExistingQueryString = options.addToExistingQueryString || defaultQueryString, - timer = options.timer || noopTimer, - results = [], - specsExecuted = 0, - failureCount = 0, - pendingSpecCount = 0, - htmlReporterMain, - symbols, - failedSuites = []; - - this.initialize = function() { - clearPrior(); - htmlReporterMain = createDom('div', {className: 'jasmine_html-reporter'}, - createDom('div', {className: 'jasmine-banner'}, - createDom('a', {className: 'jasmine-title', href: 'http://jasmine.github.io/', target: '_blank'}), - createDom('span', {className: 'jasmine-version'}, j$.version) - ), - createDom('ul', {className: 'jasmine-symbol-summary'}), - createDom('div', {className: 'jasmine-alert'}), - createDom('div', {className: 'jasmine-results'}, - createDom('div', {className: 'jasmine-failures'}) - ) - ); - getContainer().appendChild(htmlReporterMain); - }; - - var totalSpecsDefined; - this.jasmineStarted = function(options) { - totalSpecsDefined = options.totalSpecsDefined || 0; - timer.start(); - }; - - var summary = createDom('div', {className: 'jasmine-summary'}); - - var topResults = new j$.ResultsNode({}, '', null), - currentParent = topResults; - - this.suiteStarted = function(result) { - currentParent.addChild(result, 'suite'); - currentParent = currentParent.last(); - }; - - this.suiteDone = function(result) { - if (result.status == 'failed') { - failedSuites.push(result); - } - - if (currentParent == topResults) { - return; - } - - currentParent = currentParent.parent; - }; - - this.specStarted = function(result) { - currentParent.addChild(result, 'spec'); - }; - - var failures = []; - this.specDone = function(result) { - if(noExpectations(result) && typeof console !== 'undefined' && typeof console.error !== 'undefined') { - console.error('Spec \'' + result.fullName + '\' has no expectations.'); - } - - if (result.status != 'disabled') { - specsExecuted++; - } - - if (!symbols){ - symbols = find('.jasmine-symbol-summary'); - } - - symbols.appendChild(createDom('li', { - className: noExpectations(result) ? 'jasmine-empty' : 'jasmine-' + result.status, - id: 'spec_' + result.id, - title: result.fullName - } - )); - - if (result.status == 'failed') { - failureCount++; - - var failure = - createDom('div', {className: 'jasmine-spec-detail jasmine-failed'}, - createDom('div', {className: 'jasmine-description'}, - createDom('a', {title: result.fullName, href: specHref(result)}, result.fullName) - ), - createDom('div', {className: 'jasmine-messages'}) - ); - var messages = failure.childNodes[1]; - - for (var i = 0; i < result.failedExpectations.length; i++) { - var expectation = result.failedExpectations[i]; - messages.appendChild(createDom('div', {className: 'jasmine-result-message'}, expectation.message)); - messages.appendChild(createDom('div', {className: 'jasmine-stack-trace'}, expectation.stack)); - } - - failures.push(failure); - } - - if (result.status == 'pending') { - pendingSpecCount++; - } - }; - - this.jasmineDone = function(doneResult) { - var banner = find('.jasmine-banner'); - var alert = find('.jasmine-alert'); - var order = doneResult && doneResult.order; - alert.appendChild(createDom('span', {className: 'jasmine-duration'}, 'finished in ' + timer.elapsed() / 1000 + 's')); - - banner.appendChild( - createDom('div', { className: 'jasmine-run-options' }, - createDom('span', { className: 'jasmine-trigger' }, 'Options'), - createDom('div', { className: 'jasmine-payload' }, - createDom('div', { className: 'jasmine-exceptions' }, - createDom('input', { - className: 'jasmine-raise', - id: 'jasmine-raise-exceptions', - type: 'checkbox' - }), - createDom('label', { className: 'jasmine-label', 'for': 'jasmine-raise-exceptions' }, 'raise exceptions')), - createDom('div', { className: 'jasmine-throw-failures' }, - createDom('input', { - className: 'jasmine-throw', - id: 'jasmine-throw-failures', - type: 'checkbox' - }), - createDom('label', { className: 'jasmine-label', 'for': 'jasmine-throw-failures' }, 'stop spec on expectation failure')), - createDom('div', { className: 'jasmine-random-order' }, - createDom('input', { - className: 'jasmine-random', - id: 'jasmine-random-order', - type: 'checkbox' - }), - createDom('label', { className: 'jasmine-label', 'for': 'jasmine-random-order' }, 'run tests in random order')) - ) - )); - - var raiseCheckbox = find('#jasmine-raise-exceptions'); - - raiseCheckbox.checked = !env.catchingExceptions(); - raiseCheckbox.onclick = onRaiseExceptionsClick; - - var throwCheckbox = find('#jasmine-throw-failures'); - throwCheckbox.checked = env.throwingExpectationFailures(); - throwCheckbox.onclick = onThrowExpectationsClick; - - var randomCheckbox = find('#jasmine-random-order'); - randomCheckbox.checked = env.randomTests(); - randomCheckbox.onclick = onRandomClick; - - var optionsMenu = find('.jasmine-run-options'), - optionsTrigger = optionsMenu.querySelector('.jasmine-trigger'), - optionsPayload = optionsMenu.querySelector('.jasmine-payload'), - isOpen = /\bjasmine-open\b/; - - optionsTrigger.onclick = function() { - if (isOpen.test(optionsPayload.className)) { - optionsPayload.className = optionsPayload.className.replace(isOpen, ''); - } else { - optionsPayload.className += ' jasmine-open'; - } - }; - - if (specsExecuted < totalSpecsDefined) { - var skippedMessage = 'Ran ' + specsExecuted + ' of ' + totalSpecsDefined + ' specs - run all'; - alert.appendChild( - createDom('span', {className: 'jasmine-bar jasmine-skipped'}, - createDom('a', {href: '?', title: 'Run all specs'}, skippedMessage) - ) - ); - } - var statusBarMessage = ''; - var statusBarClassName = 'jasmine-bar '; - - if (totalSpecsDefined > 0) { - statusBarMessage += pluralize('spec', specsExecuted) + ', ' + pluralize('failure', failureCount); - if (pendingSpecCount) { statusBarMessage += ', ' + pluralize('pending spec', pendingSpecCount); } - statusBarClassName += (failureCount > 0) ? 'jasmine-failed' : 'jasmine-passed'; - } else { - statusBarClassName += 'jasmine-skipped'; - statusBarMessage += 'No specs found'; - } - - var seedBar; - if (order && order.random) { - seedBar = createDom('span', {className: 'jasmine-seed-bar'}, - ', randomized with seed ', - createDom('a', {title: 'randomized with seed ' + order.seed, href: seedHref(order.seed)}, order.seed) - ); - } - - alert.appendChild(createDom('span', {className: statusBarClassName}, statusBarMessage, seedBar)); - - for(i = 0; i < failedSuites.length; i++) { - var failedSuite = failedSuites[i]; - for(var j = 0; j < failedSuite.failedExpectations.length; j++) { - var errorBarMessage = 'AfterAll ' + failedSuite.failedExpectations[j].message; - var errorBarClassName = 'jasmine-bar jasmine-errored'; - alert.appendChild(createDom('span', {className: errorBarClassName}, errorBarMessage)); - } - } - - var results = find('.jasmine-results'); - results.appendChild(summary); - - summaryList(topResults, summary); - - function summaryList(resultsTree, domParent) { - var specListNode; - for (var i = 0; i < resultsTree.children.length; i++) { - var resultNode = resultsTree.children[i]; - if (resultNode.type == 'suite') { - var suiteListNode = createDom('ul', {className: 'jasmine-suite', id: 'suite-' + resultNode.result.id}, - createDom('li', {className: 'jasmine-suite-detail'}, - createDom('a', {href: specHref(resultNode.result)}, resultNode.result.description) - ) - ); - - summaryList(resultNode, suiteListNode); - domParent.appendChild(suiteListNode); - } - if (resultNode.type == 'spec') { - if (domParent.getAttribute('class') != 'jasmine-specs') { - specListNode = createDom('ul', {className: 'jasmine-specs'}); - domParent.appendChild(specListNode); - } - var specDescription = resultNode.result.description; - if(noExpectations(resultNode.result)) { - specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription; - } - if(resultNode.result.status === 'pending' && resultNode.result.pendingReason !== '') { - specDescription = specDescription + ' PENDING WITH MESSAGE: ' + resultNode.result.pendingReason; - } - specListNode.appendChild( - createDom('li', { - className: 'jasmine-' + resultNode.result.status, - id: 'spec-' + resultNode.result.id - }, - createDom('a', {href: specHref(resultNode.result)}, specDescription) - ) - ); - } - } - } - - if (failures.length) { - alert.appendChild( - createDom('span', {className: 'jasmine-menu jasmine-bar jasmine-spec-list'}, - createDom('span', {}, 'Spec List | '), - createDom('a', {className: 'jasmine-failures-menu', href: '#'}, 'Failures'))); - alert.appendChild( - createDom('span', {className: 'jasmine-menu jasmine-bar jasmine-failure-list'}, - createDom('a', {className: 'jasmine-spec-list-menu', href: '#'}, 'Spec List'), - createDom('span', {}, ' | Failures '))); - - find('.jasmine-failures-menu').onclick = function() { - setMenuModeTo('jasmine-failure-list'); - }; - find('.jasmine-spec-list-menu').onclick = function() { - setMenuModeTo('jasmine-spec-list'); - }; - - setMenuModeTo('jasmine-failure-list'); - - var failureNode = find('.jasmine-failures'); - for (var i = 0; i < failures.length; i++) { - failureNode.appendChild(failures[i]); - } - } - }; - - return this; - - function find(selector) { - return getContainer().querySelector('.jasmine_html-reporter ' + selector); - } - - function clearPrior() { - // return the reporter - var oldReporter = find(''); - - if(oldReporter) { - getContainer().removeChild(oldReporter); - } - } - - function createDom(type, attrs, childrenVarArgs) { - var el = createElement(type); - - for (var i = 2; i < arguments.length; i++) { - var child = arguments[i]; - - if (typeof child === 'string') { - el.appendChild(createTextNode(child)); - } else { - if (child) { - el.appendChild(child); - } - } - } - - for (var attr in attrs) { - if (attr == 'className') { - el[attr] = attrs[attr]; - } else { - el.setAttribute(attr, attrs[attr]); - } - } - - return el; - } - - function pluralize(singular, count) { - var word = (count == 1 ? singular : singular + 's'); - - return '' + count + ' ' + word; - } - - function specHref(result) { - return addToExistingQueryString('spec', result.fullName); - } - - function seedHref(seed) { - return addToExistingQueryString('seed', seed); - } - - function defaultQueryString(key, value) { - return '?' + key + '=' + value; - } - - function setMenuModeTo(mode) { - htmlReporterMain.setAttribute('class', 'jasmine_html-reporter ' + mode); - } - - function noExpectations(result) { - return (result.failedExpectations.length + result.passedExpectations.length) === 0 && - result.status === 'passed'; - } - } - - return HtmlReporter; -}; - -jasmineRequire.HtmlSpecFilter = function() { - function HtmlSpecFilter(options) { - var filterString = options && options.filterString() && options.filterString().replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); - var filterPattern = new RegExp(filterString); - - this.matches = function(specName) { - return filterPattern.test(specName); - }; - } - - return HtmlSpecFilter; -}; - -jasmineRequire.ResultsNode = function() { - function ResultsNode(result, type, parent) { - this.result = result; - this.type = type; - this.parent = parent; - - this.children = []; - - this.addChild = function(result, type) { - this.children.push(new ResultsNode(result, type, this)); - }; - - this.last = function() { - return this.children[this.children.length - 1]; - }; - } - - return ResultsNode; -}; - -jasmineRequire.QueryString = function() { - function QueryString(options) { - - this.navigateWithNewParam = function(key, value) { - options.getWindowLocation().search = this.fullStringWithNewParam(key, value); - }; - - this.fullStringWithNewParam = function(key, value) { - var paramMap = queryStringToParamMap(); - paramMap[key] = value; - return toQueryString(paramMap); - }; - - this.getParam = function(key) { - return queryStringToParamMap()[key]; - }; - - return this; - - function toQueryString(paramMap) { - var qStrPairs = []; - for (var prop in paramMap) { - qStrPairs.push(encodeURIComponent(prop) + '=' + encodeURIComponent(paramMap[prop])); - } - return '?' + qStrPairs.join('&'); - } - - function queryStringToParamMap() { - var paramStr = options.getWindowLocation().search.substring(1), - params = [], - paramMap = {}; - - if (paramStr.length > 0) { - params = paramStr.split('&'); - for (var i = 0; i < params.length; i++) { - var p = params[i].split('='); - var value = decodeURIComponent(p[1]); - if (value === 'true' || value === 'false') { - value = JSON.parse(value); - } - paramMap[decodeURIComponent(p[0])] = value; - } - } - - return paramMap; - } - - } - - return QueryString; -}; diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/jasmine_lib/jasmine.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/jasmine_lib/jasmine.js deleted file mode 100644 index 7156e6672e7ec6aabbd2a8a8321661c338deb299..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/jasmine_lib/jasmine.js +++ /dev/null @@ -1,4941 +0,0 @@ -/* - Copyright (c) 2008-2017 Pivotal Labs - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -var getJasmineRequireObj = (function (jasmineGlobal) { - var jasmineRequire; - - if (typeof module !== 'undefined' && module.exports && typeof exports !== 'undefined') { - if (typeof global !== 'undefined') { - jasmineGlobal = global; - } else { - jasmineGlobal = {}; - } - jasmineRequire = exports; - } else { - if (typeof window !== 'undefined' && typeof window.toString === 'function' && window.toString() === '[object GjsGlobal]') { - jasmineGlobal = window; - } - jasmineRequire = jasmineGlobal.jasmineRequire = jasmineGlobal.jasmineRequire || {}; - } - - function getJasmineRequire() { - return jasmineRequire; - } - - getJasmineRequire().core = function(jRequire) { - var j$ = {}; - - jRequire.base(j$, jasmineGlobal); - j$.util = jRequire.util(); - j$.errors = jRequire.errors(); - j$.formatErrorMsg = jRequire.formatErrorMsg(); - j$.Any = jRequire.Any(j$); - j$.Anything = jRequire.Anything(j$); - j$.CallTracker = jRequire.CallTracker(j$); - j$.MockDate = jRequire.MockDate(); - j$.getClearStack = jRequire.clearStack(j$); - j$.Clock = jRequire.Clock(); - j$.DelayedFunctionScheduler = jRequire.DelayedFunctionScheduler(); - j$.Env = jRequire.Env(j$); - j$.ExceptionFormatter = jRequire.ExceptionFormatter(); - j$.Expectation = jRequire.Expectation(); - j$.buildExpectationResult = jRequire.buildExpectationResult(); - j$.JsApiReporter = jRequire.JsApiReporter(); - j$.matchersUtil = jRequire.matchersUtil(j$); - j$.ObjectContaining = jRequire.ObjectContaining(j$); - j$.ArrayContaining = jRequire.ArrayContaining(j$); - j$.pp = jRequire.pp(j$); - j$.QueueRunner = jRequire.QueueRunner(j$); - j$.ReportDispatcher = jRequire.ReportDispatcher(); - j$.Spec = jRequire.Spec(j$); - j$.Spy = jRequire.Spy(j$); - j$.SpyRegistry = jRequire.SpyRegistry(j$); - j$.SpyStrategy = jRequire.SpyStrategy(j$); - j$.StringMatching = jRequire.StringMatching(j$); - j$.Suite = jRequire.Suite(j$); - j$.Timer = jRequire.Timer(); - j$.TreeProcessor = jRequire.TreeProcessor(); - j$.version = jRequire.version(); - j$.Order = jRequire.Order(); - j$.DiffBuilder = jRequire.DiffBuilder(j$); - j$.NullDiffBuilder = jRequire.NullDiffBuilder(j$); - j$.ObjectPath = jRequire.ObjectPath(j$); - j$.GlobalErrors = jRequire.GlobalErrors(j$); - - j$.matchers = jRequire.requireMatchers(jRequire, j$); - - return j$; - }; - - return getJasmineRequire; -})(this); - -getJasmineRequireObj().requireMatchers = function(jRequire, j$) { - var availableMatchers = [ - 'toBe', - 'toBeCloseTo', - 'toBeDefined', - 'toBeFalsy', - 'toBeGreaterThan', - 'toBeGreaterThanOrEqual', - 'toBeLessThan', - 'toBeLessThanOrEqual', - 'toBeNaN', - 'toBeNegativeInfinity', - 'toBeNull', - 'toBePositiveInfinity', - 'toBeTruthy', - 'toBeUndefined', - 'toContain', - 'toEqual', - 'toHaveBeenCalled', - 'toHaveBeenCalledBefore', - 'toHaveBeenCalledTimes', - 'toHaveBeenCalledWith', - 'toMatch', - 'toThrow', - 'toThrowError' - ], - matchers = {}; - - for (var i = 0; i < availableMatchers.length; i++) { - var name = availableMatchers[i]; - matchers[name] = jRequire[name](j$); - } - - return matchers; -}; - -getJasmineRequireObj().base = function(j$, jasmineGlobal) { - j$.unimplementedMethod_ = function() { - throw new Error('unimplemented method'); - }; - - /** - * Maximum object depth the pretty printer will print to. - * Set this to a lower value to speed up pretty printing if you have large objects. - * @name jasmine.MAX_PRETTY_PRINT_DEPTH - */ - j$.MAX_PRETTY_PRINT_DEPTH = 40; - /** - * Maximum number of array elements to display when pretty printing objects. - * Elements past this number will be ellipised. - * @name jasmine.MAX_PRETTY_PRINT_ARRAY_LENGTH - */ - j$.MAX_PRETTY_PRINT_ARRAY_LENGTH = 100; - /** - * Default number of milliseconds Jasmine will wait for an asynchronous spec to complete. - * @name jasmine.DEFAULT_TIMEOUT_INTERVAL - */ - j$.DEFAULT_TIMEOUT_INTERVAL = 5000; - - j$.getGlobal = function() { - return jasmineGlobal; - }; - - /** - * Get the currently booted Jasmine Environment. - * - * @name jasmine.getEnv - * @function - * @return {Env} - */ - j$.getEnv = function(options) { - var env = j$.currentEnv_ = j$.currentEnv_ || new j$.Env(options); - //jasmine. singletons in here (setTimeout blah blah). - return env; - }; - - j$.isArray_ = function(value) { - return j$.isA_('Array', value); - }; - - j$.isObject_ = function(value) { - return !j$.util.isUndefined(value) && value !== null && j$.isA_('Object', value); - }; - - j$.isString_ = function(value) { - return j$.isA_('String', value); - }; - - j$.isNumber_ = function(value) { - return j$.isA_('Number', value); - }; - - j$.isFunction_ = function(value) { - return j$.isA_('Function', value); - }; - - j$.isA_ = function(typeName, value) { - return j$.getType_(value) === '[object ' + typeName + ']'; - }; - - j$.getType_ = function(value) { - return Object.prototype.toString.apply(value); - }; - - j$.isDomNode = function(obj) { - return obj.nodeType > 0; - }; - - j$.fnNameFor = function(func) { - if (func.name) { - return func.name; - } - - var matches = func.toString().match(/^\s*function\s*(\w*)\s*\(/); - return matches ? matches[1] : '<anonymous>'; - }; - - /** - * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), - * that will succeed if the actual value being compared is an instance of the specified class/constructor. - * @name jasmine.any - * @function - * @param {Constructor} clazz - The constructor to check against. - */ - j$.any = function(clazz) { - return new j$.Any(clazz); - }; - - /** - * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), - * that will succeed if the actual value being compared is not `null` and not `undefined`. - * @name jasmine.anything - * @function - */ - j$.anything = function() { - return new j$.Anything(); - }; - - /** - * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), - * that will succeed if the actual value being compared contains at least the keys and values. - * @name jasmine.objectContaining - * @function - * @param {Object} sample - The subset of properties that _must_ be in the actual. - */ - j$.objectContaining = function(sample) { - return new j$.ObjectContaining(sample); - }; - - /** - * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), - * that will succeed if the actual value is a `String` that matches the `RegExp` or `String`. - * @name jasmine.stringMatching - * @function - * @param {RegExp|String} expected - */ - j$.stringMatching = function(expected) { - return new j$.StringMatching(expected); - }; - - /** - * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), - * that will succeed if the actual value is an `Array` that contains at least the elements in the sample. - * @name jasmine.arrayContaining - * @function - * @param {Array} sample - */ - j$.arrayContaining = function(sample) { - return new j$.ArrayContaining(sample); - }; - - /** - * Create a bare {@link Spy} object. This won't be installed anywhere and will not have any implementation behind it. - * @name jasmine.createSpy - * @function - * @param {String} [name] - Name to give the spy. This will be displayed in failure messages. - * @param {Function} [originalFn] - Function to act as the real implementation. - * @return {Spy} - */ - j$.createSpy = function(name, originalFn) { - return j$.Spy(name, originalFn); - }; - - j$.isSpy = function(putativeSpy) { - if (!putativeSpy) { - return false; - } - return putativeSpy.and instanceof j$.SpyStrategy && - putativeSpy.calls instanceof j$.CallTracker; - }; - - /** - * Create an object with multiple {@link Spy}s as its members. - * @name jasmine.createSpyObj - * @function - * @param {String} [baseName] - Base name for the spies in the object. - * @param {String[]|Object} methodNames - Array of method names to create spies for, or Object whose keys will be method names and values the {@link Spy#and#returnValue|returnValue}. - * @return {Object} - */ - j$.createSpyObj = function(baseName, methodNames) { - var baseNameIsCollection = j$.isObject_(baseName) || j$.isArray_(baseName); - - if (baseNameIsCollection && j$.util.isUndefined(methodNames)) { - methodNames = baseName; - baseName = 'unknown'; - } - - var obj = {}; - var spiesWereSet = false; - - if (j$.isArray_(methodNames)) { - for (var i = 0; i < methodNames.length; i++) { - obj[methodNames[i]] = j$.createSpy(baseName + '.' + methodNames[i]); - spiesWereSet = true; - } - } else if (j$.isObject_(methodNames)) { - for (var key in methodNames) { - if (methodNames.hasOwnProperty(key)) { - obj[key] = j$.createSpy(baseName + '.' + key); - obj[key].and.returnValue(methodNames[key]); - spiesWereSet = true; - } - } - } - - if (!spiesWereSet) { - throw 'createSpyObj requires a non-empty array or object of method names to create spies for'; - } - - return obj; - }; -}; - -getJasmineRequireObj().util = function() { - - var util = {}; - - util.inherit = function(childClass, parentClass) { - var Subclass = function() { - }; - Subclass.prototype = parentClass.prototype; - childClass.prototype = new Subclass(); - }; - - util.htmlEscape = function(str) { - if (!str) { - return str; - } - return str.replace(/&/g, '&') - .replace(/</g, '<') - .replace(/>/g, '>'); - }; - - util.argsToArray = function(args) { - var arrayOfArgs = []; - for (var i = 0; i < args.length; i++) { - arrayOfArgs.push(args[i]); - } - return arrayOfArgs; - }; - - util.isUndefined = function(obj) { - return obj === void 0; - }; - - util.arrayContains = function(array, search) { - var i = array.length; - while (i--) { - if (array[i] === search) { - return true; - } - } - return false; - }; - - util.clone = function(obj) { - if (Object.prototype.toString.apply(obj) === '[object Array]') { - return obj.slice(); - } - - var cloned = {}; - for (var prop in obj) { - if (obj.hasOwnProperty(prop)) { - cloned[prop] = obj[prop]; - } - } - - return cloned; - }; - - util.getPropertyDescriptor = function(obj, methodName) { - var descriptor, - proto = obj; - - do { - descriptor = Object.getOwnPropertyDescriptor(proto, methodName); - proto = Object.getPrototypeOf(proto); - } while (!descriptor && proto); - - return descriptor; - }; - - util.objectDifference = function(obj, toRemove) { - var diff = {}; - - for (var key in obj) { - if (util.has(obj, key) && !util.has(toRemove, key)) { - diff[key] = obj[key]; - } - } - - return diff; - }; - - util.has = function(obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key); - }; - - return util; -}; - -getJasmineRequireObj().Spec = function(j$) { - function Spec(attrs) { - this.expectationFactory = attrs.expectationFactory; - this.resultCallback = attrs.resultCallback || function() {}; - this.id = attrs.id; - this.description = attrs.description || ''; - this.queueableFn = attrs.queueableFn; - this.beforeAndAfterFns = attrs.beforeAndAfterFns || function() { return {befores: [], afters: []}; }; - this.userContext = attrs.userContext || function() { return {}; }; - this.onStart = attrs.onStart || function() {}; - this.getSpecName = attrs.getSpecName || function() { return ''; }; - this.expectationResultFactory = attrs.expectationResultFactory || function() { }; - this.queueRunnerFactory = attrs.queueRunnerFactory || function() {}; - this.catchingExceptions = attrs.catchingExceptions || function() { return true; }; - this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure; - - if (!this.queueableFn.fn) { - this.pend(); - } - - this.result = { - id: this.id, - description: this.description, - fullName: this.getFullName(), - failedExpectations: [], - passedExpectations: [], - pendingReason: '' - }; - } - - Spec.prototype.addExpectationResult = function(passed, data, isError) { - var expectationResult = this.expectationResultFactory(data); - if (passed) { - this.result.passedExpectations.push(expectationResult); - } else { - this.result.failedExpectations.push(expectationResult); - - if (this.throwOnExpectationFailure && !isError) { - throw new j$.errors.ExpectationFailed(); - } - } - }; - - Spec.prototype.expect = function(actual) { - return this.expectationFactory(actual, this); - }; - - Spec.prototype.execute = function(onComplete, enabled) { - var self = this; - - this.onStart(this); - - if (!this.isExecutable() || this.markedPending || enabled === false) { - complete(enabled); - return; - } - - var fns = this.beforeAndAfterFns(); - var allFns = fns.befores.concat(this.queueableFn).concat(fns.afters); - - this.queueRunnerFactory({ - queueableFns: allFns, - onException: function() { self.onException.apply(self, arguments); }, - onComplete: complete, - userContext: this.userContext() - }); - - function complete(enabledAgain) { - self.result.status = self.status(enabledAgain); - self.resultCallback(self.result); - - if (onComplete) { - onComplete(); - } - } - }; - - Spec.prototype.onException = function onException(e) { - if (Spec.isPendingSpecException(e)) { - this.pend(extractCustomPendingMessage(e)); - return; - } - - if (e instanceof j$.errors.ExpectationFailed) { - return; - } - - this.addExpectationResult(false, { - matcherName: '', - passed: false, - expected: '', - actual: '', - error: e - }, true); - }; - - Spec.prototype.disable = function() { - this.disabled = true; - }; - - Spec.prototype.pend = function(message) { - this.markedPending = true; - if (message) { - this.result.pendingReason = message; - } - }; - - Spec.prototype.getResult = function() { - this.result.status = this.status(); - return this.result; - }; - - Spec.prototype.status = function(enabled) { - if (this.disabled || enabled === false) { - return 'disabled'; - } - - if (this.markedPending) { - return 'pending'; - } - - if (this.result.failedExpectations.length > 0) { - return 'failed'; - } else { - return 'passed'; - } - }; - - Spec.prototype.isExecutable = function() { - return !this.disabled; - }; - - Spec.prototype.getFullName = function() { - return this.getSpecName(this); - }; - - var extractCustomPendingMessage = function(e) { - var fullMessage = e.toString(), - boilerplateStart = fullMessage.indexOf(Spec.pendingSpecExceptionMessage), - boilerplateEnd = boilerplateStart + Spec.pendingSpecExceptionMessage.length; - - return fullMessage.substr(boilerplateEnd); - }; - - Spec.pendingSpecExceptionMessage = '=> marked Pending'; - - Spec.isPendingSpecException = function(e) { - return !!(e && e.toString && e.toString().indexOf(Spec.pendingSpecExceptionMessage) !== -1); - }; - - return Spec; -}; - -if (typeof window == void 0 && typeof exports == 'object') { - exports.Spec = jasmineRequire.Spec; -} - -/*jshint bitwise: false*/ - -getJasmineRequireObj().Order = function() { - function Order(options) { - this.random = 'random' in options ? options.random : true; - var seed = this.seed = options.seed || generateSeed(); - this.sort = this.random ? randomOrder : naturalOrder; - - function naturalOrder(items) { - return items; - } - - function randomOrder(items) { - var copy = items.slice(); - copy.sort(function(a, b) { - return jenkinsHash(seed + a.id) - jenkinsHash(seed + b.id); - }); - return copy; - } - - function generateSeed() { - return String(Math.random()).slice(-5); - } - - // Bob Jenkins One-at-a-Time Hash algorithm is a non-cryptographic hash function - // used to get a different output when the key changes slighly. - // We use your return to sort the children randomly in a consistent way when - // used in conjunction with a seed - - function jenkinsHash(key) { - var hash, i; - for(hash = i = 0; i < key.length; ++i) { - hash += key.charCodeAt(i); - hash += (hash << 10); - hash ^= (hash >> 6); - } - hash += (hash << 3); - hash ^= (hash >> 11); - hash += (hash << 15); - return hash; - } - - } - - return Order; -}; - -getJasmineRequireObj().Env = function(j$) { - /** - * _Note:_ Do not construct this directly, Jasmine will make one during booting. - * @name Env - * @classdesc The Jasmine environment - * @constructor - */ - function Env(options) { - options = options || {}; - - var self = this; - var global = options.global || j$.getGlobal(); - - var totalSpecsDefined = 0; - - var catchExceptions = true; - - var realSetTimeout = j$.getGlobal().setTimeout; - var realClearTimeout = j$.getGlobal().clearTimeout; - var clearStack = j$.getClearStack(j$.getGlobal()); - this.clock = new j$.Clock(global, function () { return new j$.DelayedFunctionScheduler(); }, new j$.MockDate(global)); - - var runnableResources = {}; - - var currentSpec = null; - var currentlyExecutingSuites = []; - var currentDeclarationSuite = null; - var throwOnExpectationFailure = false; - var random = false; - var seed = null; - - var currentSuite = function() { - return currentlyExecutingSuites[currentlyExecutingSuites.length - 1]; - }; - - var currentRunnable = function() { - return currentSpec || currentSuite(); - }; - - var reporter = new j$.ReportDispatcher([ - 'jasmineStarted', - 'jasmineDone', - 'suiteStarted', - 'suiteDone', - 'specStarted', - 'specDone' - ]); - - var globalErrors = new j$.GlobalErrors(); - - this.specFilter = function() { - return true; - }; - - this.addCustomEqualityTester = function(tester) { - if(!currentRunnable()) { - throw new Error('Custom Equalities must be added in a before function or a spec'); - } - runnableResources[currentRunnable().id].customEqualityTesters.push(tester); - }; - - this.addMatchers = function(matchersToAdd) { - if(!currentRunnable()) { - throw new Error('Matchers must be added in a before function or a spec'); - } - var customMatchers = runnableResources[currentRunnable().id].customMatchers; - for (var matcherName in matchersToAdd) { - customMatchers[matcherName] = matchersToAdd[matcherName]; - } - }; - - j$.Expectation.addCoreMatchers(j$.matchers); - - var nextSpecId = 0; - var getNextSpecId = function() { - return 'spec' + nextSpecId++; - }; - - var nextSuiteId = 0; - var getNextSuiteId = function() { - return 'suite' + nextSuiteId++; - }; - - var expectationFactory = function(actual, spec) { - return j$.Expectation.Factory({ - util: j$.matchersUtil, - customEqualityTesters: runnableResources[spec.id].customEqualityTesters, - customMatchers: runnableResources[spec.id].customMatchers, - actual: actual, - addExpectationResult: addExpectationResult - }); - - function addExpectationResult(passed, result) { - return spec.addExpectationResult(passed, result); - } - }; - - var defaultResourcesForRunnable = function(id, parentRunnableId) { - var resources = {spies: [], customEqualityTesters: [], customMatchers: {}}; - - if(runnableResources[parentRunnableId]){ - resources.customEqualityTesters = j$.util.clone(runnableResources[parentRunnableId].customEqualityTesters); - resources.customMatchers = j$.util.clone(runnableResources[parentRunnableId].customMatchers); - } - - runnableResources[id] = resources; - }; - - var clearResourcesForRunnable = function(id) { - spyRegistry.clearSpies(); - delete runnableResources[id]; - }; - - var beforeAndAfterFns = function(suite) { - return function() { - var befores = [], - afters = []; - - while(suite) { - befores = befores.concat(suite.beforeFns); - afters = afters.concat(suite.afterFns); - - suite = suite.parentSuite; - } - - return { - befores: befores.reverse(), - afters: afters - }; - }; - }; - - var getSpecName = function(spec, suite) { - var fullName = [spec.description], - suiteFullName = suite.getFullName(); - - if (suiteFullName !== '') { - fullName.unshift(suiteFullName); - } - return fullName.join(' '); - }; - - // TODO: we may just be able to pass in the fn instead of wrapping here - var buildExpectationResult = j$.buildExpectationResult, - exceptionFormatter = new j$.ExceptionFormatter(), - expectationResultFactory = function(attrs) { - attrs.messageFormatter = exceptionFormatter.message; - attrs.stackFormatter = exceptionFormatter.stack; - - return buildExpectationResult(attrs); - }; - - // TODO: fix this naming, and here's where the value comes in - this.catchExceptions = function(value) { - catchExceptions = !!value; - return catchExceptions; - }; - - this.catchingExceptions = function() { - return catchExceptions; - }; - - var maximumSpecCallbackDepth = 20; - var currentSpecCallbackDepth = 0; - - var catchException = function(e) { - return j$.Spec.isPendingSpecException(e) || catchExceptions; - }; - - this.throwOnExpectationFailure = function(value) { - throwOnExpectationFailure = !!value; - }; - - this.throwingExpectationFailures = function() { - return throwOnExpectationFailure; - }; - - this.randomizeTests = function(value) { - random = !!value; - }; - - this.randomTests = function() { - return random; - }; - - this.seed = function(value) { - if (value) { - seed = value; - } - return seed; - }; - - var queueRunnerFactory = function(options) { - options.catchException = catchException; - options.clearStack = options.clearStack || clearStack; - options.timeout = {setTimeout: realSetTimeout, clearTimeout: realClearTimeout}; - options.fail = self.fail; - options.globalErrors = globalErrors; - - new j$.QueueRunner(options).execute(); - }; - - var topSuite = new j$.Suite({ - env: this, - id: getNextSuiteId(), - description: 'Jasmine__TopLevel__Suite', - expectationFactory: expectationFactory, - expectationResultFactory: expectationResultFactory - }); - defaultResourcesForRunnable(topSuite.id); - currentDeclarationSuite = topSuite; - - this.topSuite = function() { - return topSuite; - }; - - this.execute = function(runnablesToRun) { - if(!runnablesToRun) { - if (focusedRunnables.length) { - runnablesToRun = focusedRunnables; - } else { - runnablesToRun = [topSuite.id]; - } - } - - var order = new j$.Order({ - random: random, - seed: seed - }); - - var processor = new j$.TreeProcessor({ - tree: topSuite, - runnableIds: runnablesToRun, - queueRunnerFactory: queueRunnerFactory, - nodeStart: function(suite) { - currentlyExecutingSuites.push(suite); - defaultResourcesForRunnable(suite.id, suite.parentSuite.id); - reporter.suiteStarted(suite.result); - }, - nodeComplete: function(suite, result) { - if (!suite.markedPending) { - clearResourcesForRunnable(suite.id); - } - currentlyExecutingSuites.pop(); - reporter.suiteDone(result); - }, - orderChildren: function(node) { - return order.sort(node.children); - } - }); - - if(!processor.processTree().valid) { - throw new Error('Invalid order: would cause a beforeAll or afterAll to be run multiple times'); - } - - reporter.jasmineStarted({ - totalSpecsDefined: totalSpecsDefined - }); - - currentlyExecutingSuites.push(topSuite); - - globalErrors.install(); - processor.execute(function() { - clearResourcesForRunnable(topSuite.id); - currentlyExecutingSuites.pop(); - globalErrors.uninstall(); - - reporter.jasmineDone({ - order: order, - failedExpectations: topSuite.result.failedExpectations - }); - }); - }; - - /** - * Add a custom reporter to the Jasmine environment. - * @name Env#addReporter - * @function - * @see custom_reporter - */ - this.addReporter = function(reporterToAdd) { - reporter.addReporter(reporterToAdd); - }; - - this.provideFallbackReporter = function(reporterToAdd) { - reporter.provideFallbackReporter(reporterToAdd); - }; - - this.clearReporters = function() { - reporter.clearReporters(); - }; - - var spyRegistry = new j$.SpyRegistry({currentSpies: function() { - if(!currentRunnable()) { - throw new Error('Spies must be created in a before function or a spec'); - } - return runnableResources[currentRunnable().id].spies; - }}); - - this.allowRespy = function(allow){ - spyRegistry.allowRespy(allow); - }; - - this.spyOn = function() { - return spyRegistry.spyOn.apply(spyRegistry, arguments); - }; - - this.spyOnProperty = function() { - return spyRegistry.spyOnProperty.apply(spyRegistry, arguments); - }; - - var ensureIsFunction = function(fn, caller) { - if (!j$.isFunction_(fn)) { - throw new Error(caller + ' expects a function argument; received ' + j$.getType_(fn)); - } - }; - - var suiteFactory = function(description) { - var suite = new j$.Suite({ - env: self, - id: getNextSuiteId(), - description: description, - parentSuite: currentDeclarationSuite, - expectationFactory: expectationFactory, - expectationResultFactory: expectationResultFactory, - throwOnExpectationFailure: throwOnExpectationFailure - }); - - return suite; - }; - - this.describe = function(description, specDefinitions) { - ensureIsFunction(specDefinitions, 'describe'); - var suite = suiteFactory(description); - if (specDefinitions.length > 0) { - throw new Error('describe does not expect any arguments'); - } - if (currentDeclarationSuite.markedPending) { - suite.pend(); - } - addSpecsToSuite(suite, specDefinitions); - return suite; - }; - - this.xdescribe = function(description, specDefinitions) { - ensureIsFunction(specDefinitions, 'xdescribe'); - var suite = suiteFactory(description); - suite.pend(); - addSpecsToSuite(suite, specDefinitions); - return suite; - }; - - var focusedRunnables = []; - - this.fdescribe = function(description, specDefinitions) { - ensureIsFunction(specDefinitions, 'fdescribe'); - var suite = suiteFactory(description); - suite.isFocused = true; - - focusedRunnables.push(suite.id); - unfocusAncestor(); - addSpecsToSuite(suite, specDefinitions); - - return suite; - }; - - function addSpecsToSuite(suite, specDefinitions) { - var parentSuite = currentDeclarationSuite; - parentSuite.addChild(suite); - currentDeclarationSuite = suite; - - var declarationError = null; - try { - specDefinitions.call(suite); - } catch (e) { - declarationError = e; - } - - if (declarationError) { - self.it('encountered a declaration exception', function() { - throw declarationError; - }); - } - - currentDeclarationSuite = parentSuite; - } - - function findFocusedAncestor(suite) { - while (suite) { - if (suite.isFocused) { - return suite.id; - } - suite = suite.parentSuite; - } - - return null; - } - - function unfocusAncestor() { - var focusedAncestor = findFocusedAncestor(currentDeclarationSuite); - if (focusedAncestor) { - for (var i = 0; i < focusedRunnables.length; i++) { - if (focusedRunnables[i] === focusedAncestor) { - focusedRunnables.splice(i, 1); - break; - } - } - } - } - - var specFactory = function(description, fn, suite, timeout) { - totalSpecsDefined++; - var spec = new j$.Spec({ - id: getNextSpecId(), - beforeAndAfterFns: beforeAndAfterFns(suite), - expectationFactory: expectationFactory, - resultCallback: specResultCallback, - getSpecName: function(spec) { - return getSpecName(spec, suite); - }, - onStart: specStarted, - description: description, - expectationResultFactory: expectationResultFactory, - queueRunnerFactory: queueRunnerFactory, - userContext: function() { return suite.clonedSharedUserContext(); }, - queueableFn: { - fn: fn, - timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; } - }, - throwOnExpectationFailure: throwOnExpectationFailure - }); - - if (!self.specFilter(spec)) { - spec.disable(); - } - - return spec; - - function specResultCallback(result) { - clearResourcesForRunnable(spec.id); - currentSpec = null; - reporter.specDone(result); - } - - function specStarted(spec) { - currentSpec = spec; - defaultResourcesForRunnable(spec.id, suite.id); - reporter.specStarted(spec.result); - } - }; - - this.it = function(description, fn, timeout) { - // it() sometimes doesn't have a fn argument, so only check the type if - // it's given. - if (arguments.length > 1 && typeof fn !== 'undefined') { - ensureIsFunction(fn, 'it'); - } - var spec = specFactory(description, fn, currentDeclarationSuite, timeout); - if (currentDeclarationSuite.markedPending) { - spec.pend(); - } - currentDeclarationSuite.addChild(spec); - return spec; - }; - - this.xit = function(description, fn, timeout) { - // xit(), like it(), doesn't always have a fn argument, so only check the - // type when needed. - if (arguments.length > 1 && typeof fn !== 'undefined') { - ensureIsFunction(fn, 'xit'); - } - var spec = this.it.apply(this, arguments); - spec.pend('Temporarily disabled with xit'); - return spec; - }; - - this.fit = function(description, fn, timeout){ - ensureIsFunction(fn, 'fit'); - var spec = specFactory(description, fn, currentDeclarationSuite, timeout); - currentDeclarationSuite.addChild(spec); - focusedRunnables.push(spec.id); - unfocusAncestor(); - return spec; - }; - - this.expect = function(actual) { - if (!currentRunnable()) { - throw new Error('\'expect\' was used when there was no current spec, this could be because an asynchronous test timed out'); - } - - return currentRunnable().expect(actual); - }; - - this.beforeEach = function(beforeEachFunction, timeout) { - ensureIsFunction(beforeEachFunction, 'beforeEach'); - currentDeclarationSuite.beforeEach({ - fn: beforeEachFunction, - timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; } - }); - }; - - this.beforeAll = function(beforeAllFunction, timeout) { - ensureIsFunction(beforeAllFunction, 'beforeAll'); - currentDeclarationSuite.beforeAll({ - fn: beforeAllFunction, - timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; } - }); - }; - - this.afterEach = function(afterEachFunction, timeout) { - ensureIsFunction(afterEachFunction, 'afterEach'); - currentDeclarationSuite.afterEach({ - fn: afterEachFunction, - timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; } - }); - }; - - this.afterAll = function(afterAllFunction, timeout) { - ensureIsFunction(afterAllFunction, 'afterAll'); - currentDeclarationSuite.afterAll({ - fn: afterAllFunction, - timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; } - }); - }; - - this.pending = function(message) { - var fullMessage = j$.Spec.pendingSpecExceptionMessage; - if(message) { - fullMessage += message; - } - throw fullMessage; - }; - - this.fail = function(error) { - if (!currentRunnable()) { - throw new Error('\'fail\' was used when there was no current spec, this could be because an asynchronous test timed out'); - } - - var message = 'Failed'; - if (error) { - message += ': '; - if (error.message) { - message += error.message; - } else if (jasmine.isString_(error)) { - message += error; - } else { - // pretty print all kind of objects. This includes arrays. - message += jasmine.pp(error); - } - } - - currentRunnable().addExpectationResult(false, { - matcherName: '', - passed: false, - expected: '', - actual: '', - message: message, - error: error && error.message ? error : null - }); - }; - } - - return Env; -}; - -getJasmineRequireObj().JsApiReporter = function() { - - var noopTimer = { - start: function(){}, - elapsed: function(){ return 0; } - }; - - /** - * _Note:_ Do not construct this directly, use the global `jsApiReporter` to retrieve the instantiated object. - * - * @name jsApiReporter - * @classdesc Reporter added by default in `boot.js` to record results for retrieval in javascript code. - * @class - */ - function JsApiReporter(options) { - var timer = options.timer || noopTimer, - status = 'loaded'; - - this.started = false; - this.finished = false; - this.runDetails = {}; - - this.jasmineStarted = function() { - this.started = true; - status = 'started'; - timer.start(); - }; - - var executionTime; - - this.jasmineDone = function(runDetails) { - this.finished = true; - this.runDetails = runDetails; - executionTime = timer.elapsed(); - status = 'done'; - }; - - /** - * Get the current status for the Jasmine environment. - * @name jsApiReporter#status - * @function - * @return {String} - One of `loaded`, `started`, or `done` - */ - this.status = function() { - return status; - }; - - var suites = [], - suites_hash = {}; - - this.suiteStarted = function(result) { - suites_hash[result.id] = result; - }; - - this.suiteDone = function(result) { - storeSuite(result); - }; - - /** - * Get the results for a set of suites. - * - * Retrievable in slices for easier serialization. - * @name jsApiReporter#suiteResults - * @function - * @param {Number} index - The position in the suites list to start from. - * @param {Number} length - Maximum number of suite results to return. - * @return {Object[]} - */ - this.suiteResults = function(index, length) { - return suites.slice(index, index + length); - }; - - function storeSuite(result) { - suites.push(result); - suites_hash[result.id] = result; - } - - /** - * Get all of the suites in a single object, with their `id` as the key. - * @name jsApiReporter#suites - * @function - * @return {Object} - */ - this.suites = function() { - return suites_hash; - }; - - var specs = []; - - this.specDone = function(result) { - specs.push(result); - }; - - /** - * Get the results for a set of specs. - * - * Retrievable in slices for easier serialization. - * @name jsApiReporter#specResults - * @function - * @param {Number} index - The position in the specs list to start from. - * @param {Number} length - Maximum number of specs results to return. - * @return {Object[]} - */ - this.specResults = function(index, length) { - return specs.slice(index, index + length); - }; - - /** - * Get all spec results. - * @name jsApiReporter#specs - * @function - * @return {Object[]} - */ - this.specs = function() { - return specs; - }; - - /** - * Get the number of milliseconds it took for the full Jasmine suite to run. - * @name jsApiReporter#executionTime - * @function - * @return {Number} - */ - this.executionTime = function() { - return executionTime; - }; - - } - - return JsApiReporter; -}; - -getJasmineRequireObj().Any = function(j$) { - - function Any(expectedObject) { - if (typeof expectedObject === 'undefined') { - throw new TypeError( - 'jasmine.any() expects to be passed a constructor function. ' + - 'Please pass one or use jasmine.anything() to match any object.' - ); - } - this.expectedObject = expectedObject; - } - - Any.prototype.asymmetricMatch = function(other) { - if (this.expectedObject == String) { - return typeof other == 'string' || other instanceof String; - } - - if (this.expectedObject == Number) { - return typeof other == 'number' || other instanceof Number; - } - - if (this.expectedObject == Function) { - return typeof other == 'function' || other instanceof Function; - } - - if (this.expectedObject == Object) { - return typeof other == 'object'; - } - - if (this.expectedObject == Boolean) { - return typeof other == 'boolean'; - } - - return other instanceof this.expectedObject; - }; - - Any.prototype.jasmineToString = function() { - return '<jasmine.any(' + j$.fnNameFor(this.expectedObject) + ')>'; - }; - - return Any; -}; - -getJasmineRequireObj().Anything = function(j$) { - - function Anything() {} - - Anything.prototype.asymmetricMatch = function(other) { - return !j$.util.isUndefined(other) && other !== null; - }; - - Anything.prototype.jasmineToString = function() { - return '<jasmine.anything>'; - }; - - return Anything; -}; - -getJasmineRequireObj().ArrayContaining = function(j$) { - function ArrayContaining(sample) { - this.sample = sample; - } - - ArrayContaining.prototype.asymmetricMatch = function(other, customTesters) { - var className = Object.prototype.toString.call(this.sample); - if (className !== '[object Array]') { throw new Error('You must provide an array to arrayContaining, not \'' + this.sample + '\'.'); } - - for (var i = 0; i < this.sample.length; i++) { - var item = this.sample[i]; - if (!j$.matchersUtil.contains(other, item, customTesters)) { - return false; - } - } - - return true; - }; - - ArrayContaining.prototype.jasmineToString = function () { - return '<jasmine.arrayContaining(' + jasmine.pp(this.sample) +')>'; - }; - - return ArrayContaining; -}; - -getJasmineRequireObj().ObjectContaining = function(j$) { - - function ObjectContaining(sample) { - this.sample = sample; - } - - function getPrototype(obj) { - if (Object.getPrototypeOf) { - return Object.getPrototypeOf(obj); - } - - if (obj.constructor.prototype == obj) { - return null; - } - - return obj.constructor.prototype; - } - - function hasProperty(obj, property) { - if (!obj) { - return false; - } - - if (Object.prototype.hasOwnProperty.call(obj, property)) { - return true; - } - - return hasProperty(getPrototype(obj), property); - } - - ObjectContaining.prototype.asymmetricMatch = function(other, customTesters) { - if (typeof(this.sample) !== 'object') { throw new Error('You must provide an object to objectContaining, not \''+this.sample+'\'.'); } - - for (var property in this.sample) { - if (!hasProperty(other, property) || - !j$.matchersUtil.equals(this.sample[property], other[property], customTesters)) { - return false; - } - } - - return true; - }; - - ObjectContaining.prototype.jasmineToString = function() { - return '<jasmine.objectContaining(' + j$.pp(this.sample) + ')>'; - }; - - return ObjectContaining; -}; - -getJasmineRequireObj().StringMatching = function(j$) { - - function StringMatching(expected) { - if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) { - throw new Error('Expected is not a String or a RegExp'); - } - - this.regexp = new RegExp(expected); - } - - StringMatching.prototype.asymmetricMatch = function(other) { - return this.regexp.test(other); - }; - - StringMatching.prototype.jasmineToString = function() { - return '<jasmine.stringMatching(' + this.regexp + ')>'; - }; - - return StringMatching; -}; - -getJasmineRequireObj().CallTracker = function(j$) { - - /** - * @namespace Spy#calls - */ - function CallTracker() { - var calls = []; - var opts = {}; - - function argCloner(context) { - var clonedArgs = []; - var argsAsArray = j$.util.argsToArray(context.args); - for(var i = 0; i < argsAsArray.length; i++) { - if(Object.prototype.toString.apply(argsAsArray[i]).match(/^\[object/)) { - clonedArgs.push(j$.util.clone(argsAsArray[i])); - } else { - clonedArgs.push(argsAsArray[i]); - } - } - context.args = clonedArgs; - } - - this.track = function(context) { - if(opts.cloneArgs) { - argCloner(context); - } - calls.push(context); - }; - - /** - * Check whether this spy has been invoked. - * @name Spy#calls#any - * @function - * @return {Boolean} - */ - this.any = function() { - return !!calls.length; - }; - - /** - * Get the number of invocations of this spy. - * @name Spy#calls#count - * @function - * @return {Integer} - */ - this.count = function() { - return calls.length; - }; - - /** - * Get the arguments that were passed to a specific invocation of this spy. - * @name Spy#calls#argsFor - * @function - * @param {Integer} index The 0-based invocation index. - * @return {Array} - */ - this.argsFor = function(index) { - var call = calls[index]; - return call ? call.args : []; - }; - - /** - * Get the raw calls array for this spy. - * @name Spy#calls#all - * @function - * @return {Spy.callData[]} - */ - this.all = function() { - return calls; - }; - - /** - * Get all of the arguments for each invocation of this spy in the order they were received. - * @name Spy#calls#allArgs - * @function - * @return {Array} - */ - this.allArgs = function() { - var callArgs = []; - for(var i = 0; i < calls.length; i++){ - callArgs.push(calls[i].args); - } - - return callArgs; - }; - - /** - * Get the first invocation of this spy. - * @name Spy#calls#first - * @function - * @return {ObjecSpy.callData} - */ - this.first = function() { - return calls[0]; - }; - - /** - * Get the most recent invocation of this spy. - * @name Spy#calls#mostRecent - * @function - * @return {ObjecSpy.callData} - */ - this.mostRecent = function() { - return calls[calls.length - 1]; - }; - - /** - * Reset this spy as if it has never been called. - * @name Spy#calls#reset - * @function - */ - this.reset = function() { - calls = []; - }; - - /** - * Set this spy to do a shallow clone of arguments passed to each invocation. - * @name Spy#calls#saveArgumentsByValue - * @function - */ - this.saveArgumentsByValue = function() { - opts.cloneArgs = true; - }; - - } - - return CallTracker; -}; - -getJasmineRequireObj().clearStack = function(j$) { - function messageChannelImpl(global) { - var channel = new global.MessageChannel(), - head = {}, - tail = head; - - channel.port1.onmessage = function() { - head = head.next; - var task = head.task; - delete head.task; - task(); - }; - - return function clearStack(fn) { - tail = tail.next = { task: fn }; - channel.port2.postMessage(0); - }; - } - - function getClearStack(global) { - if (j$.isFunction_(global.setImmediate)) { - var realSetImmediate = global.setImmediate; - return function(fn) { - realSetImmediate(fn); - }; - } else if (!j$.util.isUndefined(global.MessageChannel)) { - return messageChannelImpl(global); - } else { - var realSetTimeout = global.setTimeout; - return function clearStack(fn) { - Function.prototype.apply.apply(realSetTimeout, [global, [fn, 0]]); - }; - } - } - - return getClearStack; -}; - -getJasmineRequireObj().Clock = function() { - /** - * _Note:_ Do not construct this directly, Jasmine will make one during booting. You can get the current clock with {@link jasmine.clock}. - * @class Clock - * @classdesc Jasmine's mock clock is used when testing time dependent code. - */ - function Clock(global, delayedFunctionSchedulerFactory, mockDate) { - var self = this, - realTimingFunctions = { - setTimeout: global.setTimeout, - clearTimeout: global.clearTimeout, - setInterval: global.setInterval, - clearInterval: global.clearInterval - }, - fakeTimingFunctions = { - setTimeout: setTimeout, - clearTimeout: clearTimeout, - setInterval: setInterval, - clearInterval: clearInterval - }, - installed = false, - delayedFunctionScheduler, - timer; - - - /** - * Install the mock clock over the built-in methods. - * @name Clock#install - * @function - * @return {Clock} - */ - self.install = function() { - if(!originalTimingFunctionsIntact()) { - throw new Error('Jasmine Clock was unable to install over custom global timer functions. Is the clock already installed?'); - } - replace(global, fakeTimingFunctions); - timer = fakeTimingFunctions; - delayedFunctionScheduler = delayedFunctionSchedulerFactory(); - installed = true; - - return self; - }; - - /** - * Uninstall the mock clock, returning the built-in methods to their places. - * @name Clock#uninstall - * @function - */ - self.uninstall = function() { - delayedFunctionScheduler = null; - mockDate.uninstall(); - replace(global, realTimingFunctions); - - timer = realTimingFunctions; - installed = false; - }; - - /** - * Execute a function with a mocked Clock - * - * The clock will be {@link Clock#install|install}ed before the function is called and {@link Clock#uninstall|uninstall}ed in a `finally` after the function completes. - * @name Clock#withMock - * @function - * @param {closure} Function The function to be called. - */ - self.withMock = function(closure) { - this.install(); - try { - closure(); - } finally { - this.uninstall(); - } - }; - - /** - * Instruct the installed Clock to also mock the date returned by `new Date()` - * @name Clock#mockDate - * @function - * @param {Date} [initialDate=now] The `Date` to provide. - */ - self.mockDate = function(initialDate) { - mockDate.install(initialDate); - }; - - self.setTimeout = function(fn, delay, params) { - if (legacyIE()) { - if (arguments.length > 2) { - throw new Error('IE < 9 cannot support extra params to setTimeout without a polyfill'); - } - return timer.setTimeout(fn, delay); - } - return Function.prototype.apply.apply(timer.setTimeout, [global, arguments]); - }; - - self.setInterval = function(fn, delay, params) { - if (legacyIE()) { - if (arguments.length > 2) { - throw new Error('IE < 9 cannot support extra params to setInterval without a polyfill'); - } - return timer.setInterval(fn, delay); - } - return Function.prototype.apply.apply(timer.setInterval, [global, arguments]); - }; - - self.clearTimeout = function(id) { - return Function.prototype.call.apply(timer.clearTimeout, [global, id]); - }; - - self.clearInterval = function(id) { - return Function.prototype.call.apply(timer.clearInterval, [global, id]); - }; - - /** - * Tick the Clock forward, running any enqueued timeouts along the way - * @name Clock#tick - * @function - * @param {int} millis The number of milliseconds to tick. - */ - self.tick = function(millis) { - if (installed) { - delayedFunctionScheduler.tick(millis, function(millis) { mockDate.tick(millis); }); - } else { - throw new Error('Mock clock is not installed, use jasmine.clock().install()'); - } - }; - - return self; - - function originalTimingFunctionsIntact() { - return global.setTimeout === realTimingFunctions.setTimeout && - global.clearTimeout === realTimingFunctions.clearTimeout && - global.setInterval === realTimingFunctions.setInterval && - global.clearInterval === realTimingFunctions.clearInterval; - } - - function legacyIE() { - //if these methods are polyfilled, apply will be present - return !(realTimingFunctions.setTimeout || realTimingFunctions.setInterval).apply; - } - - function replace(dest, source) { - for (var prop in source) { - dest[prop] = source[prop]; - } - } - - function setTimeout(fn, delay) { - return delayedFunctionScheduler.scheduleFunction(fn, delay, argSlice(arguments, 2)); - } - - function clearTimeout(id) { - return delayedFunctionScheduler.removeFunctionWithId(id); - } - - function setInterval(fn, interval) { - return delayedFunctionScheduler.scheduleFunction(fn, interval, argSlice(arguments, 2), true); - } - - function clearInterval(id) { - return delayedFunctionScheduler.removeFunctionWithId(id); - } - - function argSlice(argsObj, n) { - return Array.prototype.slice.call(argsObj, n); - } - } - - return Clock; -}; - -getJasmineRequireObj().DelayedFunctionScheduler = function() { - function DelayedFunctionScheduler() { - var self = this; - var scheduledLookup = []; - var scheduledFunctions = {}; - var currentTime = 0; - var delayedFnCount = 0; - - self.tick = function(millis, tickDate) { - millis = millis || 0; - var endTime = currentTime + millis; - - runScheduledFunctions(endTime, tickDate); - currentTime = endTime; - }; - - self.scheduleFunction = function(funcToCall, millis, params, recurring, timeoutKey, runAtMillis) { - var f; - if (typeof(funcToCall) === 'string') { - /* jshint evil: true */ - f = function() { return eval(funcToCall); }; - /* jshint evil: false */ - } else { - f = funcToCall; - } - - millis = millis || 0; - timeoutKey = timeoutKey || ++delayedFnCount; - runAtMillis = runAtMillis || (currentTime + millis); - - var funcToSchedule = { - runAtMillis: runAtMillis, - funcToCall: f, - recurring: recurring, - params: params, - timeoutKey: timeoutKey, - millis: millis - }; - - if (runAtMillis in scheduledFunctions) { - scheduledFunctions[runAtMillis].push(funcToSchedule); - } else { - scheduledFunctions[runAtMillis] = [funcToSchedule]; - scheduledLookup.push(runAtMillis); - scheduledLookup.sort(function (a, b) { - return a - b; - }); - } - - return timeoutKey; - }; - - self.removeFunctionWithId = function(timeoutKey) { - for (var runAtMillis in scheduledFunctions) { - var funcs = scheduledFunctions[runAtMillis]; - var i = indexOfFirstToPass(funcs, function (func) { - return func.timeoutKey === timeoutKey; - }); - - if (i > -1) { - if (funcs.length === 1) { - delete scheduledFunctions[runAtMillis]; - deleteFromLookup(runAtMillis); - } else { - funcs.splice(i, 1); - } - - // intervals get rescheduled when executed, so there's never more - // than a single scheduled function with a given timeoutKey - break; - } - } - }; - - return self; - - function indexOfFirstToPass(array, testFn) { - var index = -1; - - for (var i = 0; i < array.length; ++i) { - if (testFn(array[i])) { - index = i; - break; - } - } - - return index; - } - - function deleteFromLookup(key) { - var value = Number(key); - var i = indexOfFirstToPass(scheduledLookup, function (millis) { - return millis === value; - }); - - if (i > -1) { - scheduledLookup.splice(i, 1); - } - } - - function reschedule(scheduledFn) { - self.scheduleFunction(scheduledFn.funcToCall, - scheduledFn.millis, - scheduledFn.params, - true, - scheduledFn.timeoutKey, - scheduledFn.runAtMillis + scheduledFn.millis); - } - - function forEachFunction(funcsToRun, callback) { - for (var i = 0; i < funcsToRun.length; ++i) { - callback(funcsToRun[i]); - } - } - - function runScheduledFunctions(endTime, tickDate) { - tickDate = tickDate || function() {}; - if (scheduledLookup.length === 0 || scheduledLookup[0] > endTime) { - tickDate(endTime - currentTime); - return; - } - - do { - var newCurrentTime = scheduledLookup.shift(); - tickDate(newCurrentTime - currentTime); - - currentTime = newCurrentTime; - - var funcsToRun = scheduledFunctions[currentTime]; - delete scheduledFunctions[currentTime]; - - forEachFunction(funcsToRun, function(funcToRun) { - if (funcToRun.recurring) { - reschedule(funcToRun); - } - }); - - forEachFunction(funcsToRun, function(funcToRun) { - funcToRun.funcToCall.apply(null, funcToRun.params || []); - }); - } while (scheduledLookup.length > 0 && - // checking first if we're out of time prevents setTimeout(0) - // scheduled in a funcToRun from forcing an extra iteration - currentTime !== endTime && - scheduledLookup[0] <= endTime); - - // ran out of functions to call, but still time left on the clock - if (currentTime !== endTime) { - tickDate(endTime - currentTime); - } - } - } - - return DelayedFunctionScheduler; -}; - -getJasmineRequireObj().errors = function() { - function ExpectationFailed() {} - - ExpectationFailed.prototype = new Error(); - ExpectationFailed.prototype.constructor = ExpectationFailed; - - return { - ExpectationFailed: ExpectationFailed - }; -}; -getJasmineRequireObj().ExceptionFormatter = function() { - function ExceptionFormatter() { - this.message = function(error) { - var message = ''; - - if (error.name && error.message) { - message += error.name + ': ' + error.message; - } else { - message += error.toString() + ' thrown'; - } - - if (error.fileName || error.sourceURL) { - message += ' in ' + (error.fileName || error.sourceURL); - } - - if (error.line || error.lineNumber) { - message += ' (line ' + (error.line || error.lineNumber) + ')'; - } - - return message; - }; - - this.stack = function(error) { - return error ? error.stack : null; - }; - } - - return ExceptionFormatter; -}; - -getJasmineRequireObj().Expectation = function() { - - /** - * Matchers that come with Jasmine out of the box. - * @namespace matchers - */ - function Expectation(options) { - this.util = options.util || { buildFailureMessage: function() {} }; - this.customEqualityTesters = options.customEqualityTesters || []; - this.actual = options.actual; - this.addExpectationResult = options.addExpectationResult || function(){}; - this.isNot = options.isNot; - - var customMatchers = options.customMatchers || {}; - for (var matcherName in customMatchers) { - this[matcherName] = Expectation.prototype.wrapCompare(matcherName, customMatchers[matcherName]); - } - } - - Expectation.prototype.wrapCompare = function(name, matcherFactory) { - return function() { - var args = Array.prototype.slice.call(arguments, 0), - expected = args.slice(0), - message = ''; - - args.unshift(this.actual); - - var matcher = matcherFactory(this.util, this.customEqualityTesters), - matcherCompare = matcher.compare; - - function defaultNegativeCompare() { - var result = matcher.compare.apply(null, args); - result.pass = !result.pass; - return result; - } - - if (this.isNot) { - matcherCompare = matcher.negativeCompare || defaultNegativeCompare; - } - - var result = matcherCompare.apply(null, args); - - if (!result.pass) { - if (!result.message) { - args.unshift(this.isNot); - args.unshift(name); - message = this.util.buildFailureMessage.apply(null, args); - } else { - if (Object.prototype.toString.apply(result.message) === '[object Function]') { - message = result.message(); - } else { - message = result.message; - } - } - } - - if (expected.length == 1) { - expected = expected[0]; - } - - // TODO: how many of these params are needed? - this.addExpectationResult( - result.pass, - { - matcherName: name, - passed: result.pass, - message: message, - error: result.error, - actual: this.actual, - expected: expected // TODO: this may need to be arrayified/sliced - } - ); - }; - }; - - Expectation.addCoreMatchers = function(matchers) { - var prototype = Expectation.prototype; - for (var matcherName in matchers) { - var matcher = matchers[matcherName]; - prototype[matcherName] = prototype.wrapCompare(matcherName, matcher); - } - }; - - Expectation.Factory = function(options) { - options = options || {}; - - var expect = new Expectation(options); - - // TODO: this would be nice as its own Object - NegativeExpectation - // TODO: copy instead of mutate options - options.isNot = true; - expect.not = new Expectation(options); - - return expect; - }; - - return Expectation; -}; - -//TODO: expectation result may make more sense as a presentation of an expectation. -getJasmineRequireObj().buildExpectationResult = function() { - function buildExpectationResult(options) { - var messageFormatter = options.messageFormatter || function() {}, - stackFormatter = options.stackFormatter || function() {}; - - var result = { - matcherName: options.matcherName, - message: message(), - stack: stack(), - passed: options.passed - }; - - if(!result.passed) { - result.expected = options.expected; - result.actual = options.actual; - } - - return result; - - function message() { - if (options.passed) { - return 'Passed.'; - } else if (options.message) { - return options.message; - } else if (options.error) { - return messageFormatter(options.error); - } - return ''; - } - - function stack() { - if (options.passed) { - return ''; - } - - var error = options.error; - if (!error) { - try { - throw new Error(message()); - } catch (e) { - error = e; - } - } - return stackFormatter(error); - } - } - - return buildExpectationResult; -}; - -getJasmineRequireObj().formatErrorMsg = function() { - function generateErrorMsg(domain, usage) { - var usageDefinition = usage ? '\nUsage: ' + usage : ''; - - return function errorMsg(msg) { - return domain + ' : ' + msg + usageDefinition; - }; - } - - return generateErrorMsg; -}; - -getJasmineRequireObj().GlobalErrors = function(j$) { - function GlobalErrors(global) { - var handlers = []; - global = global || j$.getGlobal(); - - var onerror = function onerror() { - var handler = handlers[handlers.length - 1]; - handler.apply(null, Array.prototype.slice.call(arguments, 0)); - }; - - this.uninstall = function noop() {}; - - this.install = function install() { - if (global.process && global.process.listeners && j$.isFunction_(global.process.on)) { - var originalHandlers = global.process.listeners('uncaughtException'); - global.process.removeAllListeners('uncaughtException'); - global.process.on('uncaughtException', onerror); - - this.uninstall = function uninstall() { - global.process.removeListener('uncaughtException', onerror); - for (var i = 0; i < originalHandlers.length; i++) { - global.process.on('uncaughtException', originalHandlers[i]); - } - }; - } else { - var originalHandler = global.onerror; - global.onerror = onerror; - - this.uninstall = function uninstall() { - global.onerror = originalHandler; - }; - } - }; - - this.pushListener = function pushListener(listener) { - handlers.push(listener); - }; - - this.popListener = function popListener() { - handlers.pop(); - }; - } - - return GlobalErrors; -}; - -getJasmineRequireObj().DiffBuilder = function(j$) { - return function DiffBuilder() { - var path = new j$.ObjectPath(), - mismatches = []; - - return { - record: function (actual, expected, formatter) { - formatter = formatter || defaultFormatter; - mismatches.push(formatter(actual, expected, path)); - }, - - getMessage: function () { - return mismatches.join('\n'); - }, - - withPath: function (pathComponent, block) { - var oldPath = path; - path = path.add(pathComponent); - block(); - path = oldPath; - } - }; - - function defaultFormatter (actual, expected, path) { - return 'Expected ' + - path + (path.depth() ? ' = ' : '') + - j$.pp(actual) + - ' to equal ' + - j$.pp(expected) + - '.'; - } - }; -}; - -getJasmineRequireObj().matchersUtil = function(j$) { - // TODO: what to do about jasmine.pp not being inject? move to JSON.stringify? gut PrettyPrinter? - - return { - equals: equals, - - contains: function(haystack, needle, customTesters) { - customTesters = customTesters || []; - - if ((Object.prototype.toString.apply(haystack) === '[object Set]')) { - return haystack.has(needle); - } - - if ((Object.prototype.toString.apply(haystack) === '[object Array]') || - (!!haystack && !haystack.indexOf)) - { - for (var i = 0; i < haystack.length; i++) { - if (equals(haystack[i], needle, customTesters)) { - return true; - } - } - return false; - } - - return !!haystack && haystack.indexOf(needle) >= 0; - }, - - buildFailureMessage: function() { - var args = Array.prototype.slice.call(arguments, 0), - matcherName = args[0], - isNot = args[1], - actual = args[2], - expected = args.slice(3), - englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); }); - - var message = 'Expected ' + - j$.pp(actual) + - (isNot ? ' not ' : ' ') + - englishyPredicate; - - if (expected.length > 0) { - for (var i = 0; i < expected.length; i++) { - if (i > 0) { - message += ','; - } - message += ' ' + j$.pp(expected[i]); - } - } - - return message + '.'; - } - }; - - function isAsymmetric(obj) { - return obj && j$.isA_('Function', obj.asymmetricMatch); - } - - function asymmetricMatch(a, b, customTesters, diffBuilder) { - var asymmetricA = isAsymmetric(a), - asymmetricB = isAsymmetric(b), - result; - - if (asymmetricA && asymmetricB) { - return undefined; - } - - if (asymmetricA) { - result = a.asymmetricMatch(b, customTesters); - diffBuilder.record(a, b); - return result; - } - - if (asymmetricB) { - result = b.asymmetricMatch(a, customTesters); - diffBuilder.record(a, b); - return result; - } - } - - function equals(a, b, customTesters, diffBuilder) { - customTesters = customTesters || []; - diffBuilder = diffBuilder || j$.NullDiffBuilder(); - - return eq(a, b, [], [], customTesters, diffBuilder); - } - - // Equality function lovingly adapted from isEqual in - // [Underscore](http://underscorejs.org) - function eq(a, b, aStack, bStack, customTesters, diffBuilder) { - var result = true, i; - - var asymmetricResult = asymmetricMatch(a, b, customTesters, diffBuilder); - if (!j$.util.isUndefined(asymmetricResult)) { - return asymmetricResult; - } - - for (i = 0; i < customTesters.length; i++) { - var customTesterResult = customTesters[i](a, b); - if (!j$.util.isUndefined(customTesterResult)) { - if (!customTesterResult) { - diffBuilder.record(a, b); - } - return customTesterResult; - } - } - - if (a instanceof Error && b instanceof Error) { - result = a.message == b.message; - if (!result) { - diffBuilder.record(a, b); - } - return result; - } - - // Identical objects are equal. `0 === -0`, but they aren't identical. - // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). - if (a === b) { - result = a !== 0 || 1 / a == 1 / b; - if (!result) { - diffBuilder.record(a, b); - } - return result; - } - // A strict comparison is necessary because `null == undefined`. - if (a === null || b === null) { - result = a === b; - if (!result) { - diffBuilder.record(a, b); - } - return result; - } - var className = Object.prototype.toString.call(a); - if (className != Object.prototype.toString.call(b)) { - diffBuilder.record(a, b); - return false; - } - switch (className) { - // Strings, numbers, dates, and booleans are compared by value. - case '[object String]': - // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is - // equivalent to `new String("5")`. - result = a == String(b); - if (!result) { - diffBuilder.record(a, b); - } - return result; - case '[object Number]': - // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for - // other numeric values. - result = a != +a ? b != +b : (a === 0 ? 1 / a == 1 / b : a == +b); - if (!result) { - diffBuilder.record(a, b); - } - return result; - case '[object Date]': - case '[object Boolean]': - // Coerce dates and booleans to numeric primitive values. Dates are compared by their - // millisecond representations. Note that invalid dates with millisecond representations - // of `NaN` are not equivalent. - result = +a == +b; - if (!result) { - diffBuilder.record(a, b); - } - return result; - // RegExps are compared by their source patterns and flags. - case '[object RegExp]': - return a.source == b.source && - a.global == b.global && - a.multiline == b.multiline && - a.ignoreCase == b.ignoreCase; - } - if (typeof a != 'object' || typeof b != 'object') { - diffBuilder.record(a, b); - return false; - } - - var aIsDomNode = j$.isDomNode(a); - var bIsDomNode = j$.isDomNode(b); - if (aIsDomNode && bIsDomNode) { - // At first try to use DOM3 method isEqualNode - if (a.isEqualNode) { - result = a.isEqualNode(b); - if (!result) { - diffBuilder.record(a, b); - } - return result; - } - // IE8 doesn't support isEqualNode, try to use outerHTML && innerText - var aIsElement = a instanceof Element; - var bIsElement = b instanceof Element; - if (aIsElement && bIsElement) { - result = a.outerHTML == b.outerHTML; - if (!result) { - diffBuilder.record(a, b); - } - return result; - } - if (aIsElement || bIsElement) { - diffBuilder.record(a, b); - return false; - } - result = a.innerText == b.innerText && a.textContent == b.textContent; - if (!result) { - diffBuilder.record(a, b); - } - return result; - } - if (aIsDomNode || bIsDomNode) { - diffBuilder.record(a, b); - return false; - } - - // Assume equality for cyclic structures. The algorithm for detecting cyclic - // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. - var length = aStack.length; - while (length--) { - // Linear search. Performance is inversely proportional to the number of - // unique nested structures. - if (aStack[length] == a) { return bStack[length] == b; } - } - // Add the first object to the stack of traversed objects. - aStack.push(a); - bStack.push(b); - var size = 0; - // Recursively compare objects and arrays. - // Compare array lengths to determine if a deep comparison is necessary. - if (className == '[object Array]') { - size = a.length; - if (size !== b.length) { - diffBuilder.record(a, b); - return false; - } - - for (i = 0; i < size; i++) { - diffBuilder.withPath(i, function() { - result = eq(a[i], b[i], aStack, bStack, customTesters, diffBuilder) && result; - }); - } - if (!result) { - return false; - } - } else if (className == '[object Set]') { - if (a.size != b.size) { - diffBuilder.record(a, b); - return false; - } - var iterA = a.values(), iterB = b.values(); - var valA, valB; - do { - valA = iterA.next(); - valB = iterB.next(); - if (!eq(valA.value, valB.value, aStack, bStack, customTesters, j$.NullDiffBuilder())) { - diffBuilder.record(a, b); - return false; - } - } while (!valA.done && !valB.done); - } else { - - // Objects with different constructors are not equivalent, but `Object`s - // or `Array`s from different frames are. - var aCtor = a.constructor, bCtor = b.constructor; - if (aCtor !== bCtor && - isFunction(aCtor) && isFunction(bCtor) && - a instanceof aCtor && b instanceof bCtor && - !(aCtor instanceof aCtor && bCtor instanceof bCtor)) { - - diffBuilder.record(a, b, constructorsAreDifferentFormatter); - return false; - } - } - - // Deep compare objects. - var aKeys = keys(a, className == '[object Array]'), key; - size = aKeys.length; - - // Ensure that both objects contain the same number of properties before comparing deep equality. - if (keys(b, className == '[object Array]').length !== size) { - diffBuilder.record(a, b, objectKeysAreDifferentFormatter); - return false; - } - - for (i = 0; i < size; i++) { - key = aKeys[i]; - // Deep compare each member - if (!j$.util.has(b, key)) { - diffBuilder.record(a, b, objectKeysAreDifferentFormatter); - result = false; - continue; - } - - diffBuilder.withPath(key, function() { - if(!eq(a[key], b[key], aStack, bStack, customTesters, diffBuilder)) { - result = false; - } - }); - } - - if (!result) { - return false; - } - - // Remove the first object from the stack of traversed objects. - aStack.pop(); - bStack.pop(); - - return result; - } - - function keys(obj, isArray) { - var allKeys = Object.keys ? Object.keys(obj) : - (function(o) { - var keys = []; - for (var key in o) { - if (j$.util.has(o, key)) { - keys.push(key); - } - } - return keys; - })(obj); - - if (!isArray) { - return allKeys; - } - - if (allKeys.length === 0) { - return allKeys; - } - - var extraKeys = []; - for (var i = 0; i < allKeys.length; i++) { - if (!/^[0-9]+$/.test(allKeys[i])) { - extraKeys.push(allKeys[i]); - } - } - - return extraKeys; - } - - function has(obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key); - } - - function isFunction(obj) { - return typeof obj === 'function'; - } - - function objectKeysAreDifferentFormatter(actual, expected, path) { - var missingProperties = j$.util.objectDifference(expected, actual), - extraProperties = j$.util.objectDifference(actual, expected), - missingPropertiesMessage = formatKeyValuePairs(missingProperties), - extraPropertiesMessage = formatKeyValuePairs(extraProperties), - messages = []; - - if (!path.depth()) { - path = 'object'; - } - - if (missingPropertiesMessage.length) { - messages.push('Expected ' + path + ' to have properties' + missingPropertiesMessage); - } - - if (extraPropertiesMessage.length) { - messages.push('Expected ' + path + ' not to have properties' + extraPropertiesMessage); - } - - return messages.join('\n'); - } - - function constructorsAreDifferentFormatter(actual, expected, path) { - if (!path.depth()) { - path = 'object'; - } - - return 'Expected ' + - path + ' to be a kind of ' + - j$.fnNameFor(expected.constructor) + - ', but was ' + j$.pp(actual) + '.'; - } - - function formatKeyValuePairs(obj) { - var formatted = ''; - for (var key in obj) { - formatted += '\n ' + key + ': ' + j$.pp(obj[key]); - } - return formatted; - } -}; - -getJasmineRequireObj().NullDiffBuilder = function(j$) { - return function() { - return { - withPath: function(_, block) { - block(); - }, - record: function() {} - }; - }; -}; - -getJasmineRequireObj().ObjectPath = function(j$) { - function ObjectPath(components) { - this.components = components || []; - } - - ObjectPath.prototype.toString = function() { - if (this.components.length) { - return '$' + map(this.components, formatPropertyAccess).join(''); - } else { - return ''; - } - }; - - ObjectPath.prototype.add = function(component) { - return new ObjectPath(this.components.concat([component])); - }; - - ObjectPath.prototype.depth = function() { - return this.components.length; - }; - - function formatPropertyAccess(prop) { - if (typeof prop === 'number') { - return '[' + prop + ']'; - } - - if (isValidIdentifier(prop)) { - return '.' + prop; - } - - return '[\'' + prop + '\']'; - } - - function map(array, fn) { - var results = []; - for (var i = 0; i < array.length; i++) { - results.push(fn(array[i])); - } - return results; - } - - function isValidIdentifier(string) { - return /^[A-Za-z\$_][A-Za-z0-9\$_]*$/.test(string); - } - - return ObjectPath; -}; - -getJasmineRequireObj().toBe = function() { - /** - * {@link expect} the actual value to be `===` to the expected value. - * @function - * @name matchers#toBe - * @param {Object} expected - The expected value to compare against. - * @example - * expect(thing).toBe(realThing); - */ - function toBe() { - return { - compare: function(actual, expected) { - return { - pass: actual === expected - }; - } - }; - } - - return toBe; -}; - -getJasmineRequireObj().toBeCloseTo = function() { - /** - * {@link expect} the actual value to be within a specified precision of the expected value. - * @function - * @name matchers#toBeCloseTo - * @param {Object} expected - The expected value to compare against. - * @param {Number} [precision=2] - The number of decimal points to check. - * @example - * expect(number).toBeCloseTo(42.2, 3); - */ - function toBeCloseTo() { - return { - compare: function(actual, expected, precision) { - if (precision !== 0) { - precision = precision || 2; - } - - return { - pass: Math.abs(expected - actual) < (Math.pow(10, -precision) / 2) - }; - } - }; - } - - return toBeCloseTo; -}; - -getJasmineRequireObj().toBeDefined = function() { - /** - * {@link expect} the actual value to be defined. (Not `undefined`) - * @function - * @name matchers#toBeDefined - * @example - * expect(result).toBeDefined(); - */ - function toBeDefined() { - return { - compare: function(actual) { - return { - pass: (void 0 !== actual) - }; - } - }; - } - - return toBeDefined; -}; - -getJasmineRequireObj().toBeFalsy = function() { - /** - * {@link expect} the actual value to be falsy - * @function - * @name matchers#toBeFalsy - * @example - * expect(result).toBeFalsy(); - */ - function toBeFalsy() { - return { - compare: function(actual) { - return { - pass: !!!actual - }; - } - }; - } - - return toBeFalsy; -}; - -getJasmineRequireObj().toBeGreaterThan = function() { - /** - * {@link expect} the actual value to be greater than the expected value. - * @function - * @name matchers#toBeGreaterThan - * @param {Number} expected - The value to compare against. - * @example - * expect(result).toBeGreaterThan(3); - */ - function toBeGreaterThan() { - return { - compare: function(actual, expected) { - return { - pass: actual > expected - }; - } - }; - } - - return toBeGreaterThan; -}; - - -getJasmineRequireObj().toBeGreaterThanOrEqual = function() { - /** - * {@link expect} the actual value to be greater than or equal to the expected value. - * @function - * @name matchers#toBeGreaterThanOrEqual - * @param {Number} expected - The expected value to compare against. - * @example - * expect(result).toBeGreaterThanOrEqual(25); - */ - function toBeGreaterThanOrEqual() { - return { - compare: function(actual, expected) { - return { - pass: actual >= expected - }; - } - }; - } - - return toBeGreaterThanOrEqual; -}; - -getJasmineRequireObj().toBeLessThan = function() { - /** - * {@link expect} the actual value to be less than the expected value. - * @function - * @name matchers#toBeLessThan - * @param {Number} expected - The expected value to compare against. - * @example - * expect(result).toBeLessThan(0); - */ - function toBeLessThan() { - return { - - compare: function(actual, expected) { - return { - pass: actual < expected - }; - } - }; - } - - return toBeLessThan; -}; - -getJasmineRequireObj().toBeLessThanOrEqual = function() { - /** - * {@link expect} the actual value to be less than or equal to the expected value. - * @function - * @name matchers#toBeLessThanOrEqual - * @param {Number} expected - The expected value to compare against. - * @example - * expect(result).toBeLessThanOrEqual(123); - */ - function toBeLessThanOrEqual() { - return { - - compare: function(actual, expected) { - return { - pass: actual <= expected - }; - } - }; - } - - return toBeLessThanOrEqual; -}; - -getJasmineRequireObj().toBeNaN = function(j$) { - /** - * {@link expect} the actual value to be `NaN` (Not a Number). - * @function - * @name matchers#toBeNaN - * @example - * expect(thing).toBeNaN(); - */ - function toBeNaN() { - return { - compare: function(actual) { - var result = { - pass: (actual !== actual) - }; - - if (result.pass) { - result.message = 'Expected actual not to be NaN.'; - } else { - result.message = function() { return 'Expected ' + j$.pp(actual) + ' to be NaN.'; }; - } - - return result; - } - }; - } - - return toBeNaN; -}; - -getJasmineRequireObj().toBeNegativeInfinity = function(j$) { - /** - * {@link expect} the actual value to be `-Infinity` (-infinity). - * @function - * @name matchers#toBeNegativeInfinity - * @example - * expect(thing).toBeNegativeInfinity(); - */ - function toBeNegativeInfinity() { - return { - compare: function(actual) { - var result = { - pass: (actual === Number.NEGATIVE_INFINITY) - }; - - if (result.pass) { - result.message = 'Expected actual to be -Infinity.'; - } else { - result.message = function() { return 'Expected ' + j$.pp(actual) + ' not to be -Infinity.'; }; - } - - return result; - } - }; - } - - return toBeNegativeInfinity; -}; - -getJasmineRequireObj().toBeNull = function() { - /** - * {@link expect} the actual value to be `null`. - * @function - * @name matchers#toBeNull - * @example - * expect(result).toBeNull(); - */ - function toBeNull() { - return { - compare: function(actual) { - return { - pass: actual === null - }; - } - }; - } - - return toBeNull; -}; - -getJasmineRequireObj().toBePositiveInfinity = function(j$) { - /** - * {@link expect} the actual value to be `Infinity` (infinity). - * @function - * @name matchers#toBePositiveInfinity - * @example - * expect(thing).toBePositiveInfinity(); - */ - function toBePositiveInfinity() { - return { - compare: function(actual) { - var result = { - pass: (actual === Number.POSITIVE_INFINITY) - }; - - if (result.pass) { - result.message = 'Expected actual to be Infinity.'; - } else { - result.message = function() { return 'Expected ' + j$.pp(actual) + ' not to be Infinity.'; }; - } - - return result; - } - }; - } - - return toBePositiveInfinity; -}; - -getJasmineRequireObj().toBeTruthy = function() { - /** - * {@link expect} the actual value to be truthy. - * @function - * @name matchers#toBeTruthy - * @example - * expect(thing).toBeTruthy(); - */ - function toBeTruthy() { - return { - compare: function(actual) { - return { - pass: !!actual - }; - } - }; - } - - return toBeTruthy; -}; - -getJasmineRequireObj().toBeUndefined = function() { - /** - * {@link expect} the actual value to be `undefined`. - * @function - * @name matchers#toBeUndefined - * @example - * expect(result).toBeUndefined(): - */ - function toBeUndefined() { - return { - compare: function(actual) { - return { - pass: void 0 === actual - }; - } - }; - } - - return toBeUndefined; -}; - -getJasmineRequireObj().toContain = function() { - /** - * {@link expect} the actual value to contain a specific value. - * @function - * @name matchers#toContain - * @param {Object} expected - The value to look for. - * @example - * expect(array).toContain(anElement); - * expect(string).toContain(substring); - */ - function toContain(util, customEqualityTesters) { - customEqualityTesters = customEqualityTesters || []; - - return { - compare: function(actual, expected) { - - return { - pass: util.contains(actual, expected, customEqualityTesters) - }; - } - }; - } - - return toContain; -}; - -getJasmineRequireObj().toEqual = function(j$) { - /** - * {@link expect} the actual value to be equal to the expected, using deep equality comparison. - * @function - * @name matchers#toEqual - * @param {Object} expected - Expected value - * @example - * expect(bigObject).toEqual({"foo": ['bar', 'baz']}); - */ - function toEqual(util, customEqualityTesters) { - customEqualityTesters = customEqualityTesters || []; - - return { - compare: function(actual, expected) { - var result = { - pass: false - }, - diffBuilder = j$.DiffBuilder(); - - result.pass = util.equals(actual, expected, customEqualityTesters, diffBuilder); - - // TODO: only set error message if test fails - result.message = diffBuilder.getMessage(); - - return result; - } - }; - } - - return toEqual; -}; - -getJasmineRequireObj().toHaveBeenCalled = function(j$) { - - var getErrorMsg = j$.formatErrorMsg('<toHaveBeenCalled>', 'expect(<spyObj>).toHaveBeenCalled()'); - - /** - * {@link expect} the actual (a {@link Spy}) to have been called. - * @function - * @name matchers#toHaveBeenCalled - * @example - * expect(mySpy).toHaveBeenCalled(); - * expect(mySpy).not.toHaveBeenCalled(); - */ - function toHaveBeenCalled() { - return { - compare: function(actual) { - var result = {}; - - if (!j$.isSpy(actual)) { - throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(actual) + '.')); - } - - if (arguments.length > 1) { - throw new Error(getErrorMsg('Does not take arguments, use toHaveBeenCalledWith')); - } - - result.pass = actual.calls.any(); - - result.message = result.pass ? - 'Expected spy ' + actual.and.identity() + ' not to have been called.' : - 'Expected spy ' + actual.and.identity() + ' to have been called.'; - - return result; - } - }; - } - - return toHaveBeenCalled; -}; - -getJasmineRequireObj().toHaveBeenCalledBefore = function(j$) { - - var getErrorMsg = j$.formatErrorMsg('<toHaveBeenCalledBefore>', 'expect(<spyObj>).toHaveBeenCalledBefore(<spyObj>)'); - - /** - * {@link expect} the actual value (a {@link Spy}) to have been called before another {@link Spy}. - * @function - * @name matchers#toHaveBeenCalledBefore - * @param {Spy} expected - {@link Spy} that should have been called after the `actual` {@link Spy}. - * @example - * expect(mySpy).toHaveBeenCalledBefore(otherSpy); - */ - function toHaveBeenCalledBefore() { - return { - compare: function(firstSpy, latterSpy) { - if (!j$.isSpy(firstSpy)) { - throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(firstSpy) + '.')); - } - if (!j$.isSpy(latterSpy)) { - throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(latterSpy) + '.')); - } - - var result = { pass: false }; - - if (!firstSpy.calls.count()) { - result.message = 'Expected spy ' + firstSpy.and.identity() + ' to have been called.'; - return result; - } - if (!latterSpy.calls.count()) { - result.message = 'Expected spy ' + latterSpy.and.identity() + ' to have been called.'; - return result; - } - - var latest1stSpyCall = firstSpy.calls.mostRecent().invocationOrder; - var first2ndSpyCall = latterSpy.calls.first().invocationOrder; - - result.pass = latest1stSpyCall < first2ndSpyCall; - - if (result.pass) { - result.message = 'Expected spy ' + firstSpy.and.identity() + ' to not have been called before spy ' + latterSpy.and.identity() + ', but it was'; - } else { - var first1stSpyCall = firstSpy.calls.first().invocationOrder; - var latest2ndSpyCall = latterSpy.calls.mostRecent().invocationOrder; - - if(first1stSpyCall < first2ndSpyCall) { - result.message = 'Expected latest call to spy ' + firstSpy.and.identity() + ' to have been called before first call to spy ' + latterSpy.and.identity() + ' (no interleaved calls)'; - } else if (latest2ndSpyCall > latest1stSpyCall) { - result.message = 'Expected first call to spy ' + latterSpy.and.identity() + ' to have been called after latest call to spy ' + firstSpy.and.identity() + ' (no interleaved calls)'; - } else { - result.message = 'Expected spy ' + firstSpy.and.identity() + ' to have been called before spy ' + latterSpy.and.identity(); - } - } - - return result; - } - }; - } - - return toHaveBeenCalledBefore; -}; - -getJasmineRequireObj().toHaveBeenCalledTimes = function(j$) { - - var getErrorMsg = j$.formatErrorMsg('<toHaveBeenCalledTimes>', 'expect(<spyObj>).toHaveBeenCalledTimes(<Number>)'); - - /** - * {@link expect} the actual (a {@link Spy}) to have been called the specified number of times. - * @function - * @name matchers#toHaveBeenCalledTimes - * @param {Number} expected - The number of invocations to look for. - * @example - * expect(mySpy).toHaveBeenCalledTimes(3); - */ - function toHaveBeenCalledTimes() { - return { - compare: function(actual, expected) { - if (!j$.isSpy(actual)) { - throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(actual) + '.')); - } - - var args = Array.prototype.slice.call(arguments, 0), - result = { pass: false }; - - if (!j$.isNumber_(expected)){ - throw new Error(getErrorMsg('The expected times failed is a required argument and must be a number.')); - } - - actual = args[0]; - var calls = actual.calls.count(); - var timesMessage = expected === 1 ? 'once' : expected + ' times'; - result.pass = calls === expected; - result.message = result.pass ? - 'Expected spy ' + actual.and.identity() + ' not to have been called ' + timesMessage + '. It was called ' + calls + ' times.' : - 'Expected spy ' + actual.and.identity() + ' to have been called ' + timesMessage + '. It was called ' + calls + ' times.'; - return result; - } - }; - } - - return toHaveBeenCalledTimes; -}; - -getJasmineRequireObj().toHaveBeenCalledWith = function(j$) { - - var getErrorMsg = j$.formatErrorMsg('<toHaveBeenCalledWith>', 'expect(<spyObj>).toHaveBeenCalledWith(...arguments)'); - - /** - * {@link expect} the actual (a {@link Spy}) to have been called with particular arguments at least once. - * @function - * @name matchers#toHaveBeenCalledWith - * @param {...Object} - The arguments to look for - * @example - * expect(mySpy).toHaveBeenCalledWith('foo', 'bar', 2); - */ - function toHaveBeenCalledWith(util, customEqualityTesters) { - return { - compare: function() { - var args = Array.prototype.slice.call(arguments, 0), - actual = args[0], - expectedArgs = args.slice(1), - result = { pass: false }; - - if (!j$.isSpy(actual)) { - throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(actual) + '.')); - } - - if (!actual.calls.any()) { - result.message = function() { return 'Expected spy ' + actual.and.identity() + ' to have been called with ' + j$.pp(expectedArgs) + ' but it was never called.'; }; - return result; - } - - if (util.contains(actual.calls.allArgs(), expectedArgs, customEqualityTesters)) { - result.pass = true; - result.message = function() { return 'Expected spy ' + actual.and.identity() + ' not to have been called with ' + j$.pp(expectedArgs) + ' but it was.'; }; - } else { - result.message = function() { return 'Expected spy ' + actual.and.identity() + ' to have been called with ' + j$.pp(expectedArgs) + ' but actual calls were ' + j$.pp(actual.calls.allArgs()).replace(/^\[ | \]$/g, '') + '.'; }; - } - - return result; - } - }; - } - - return toHaveBeenCalledWith; -}; - -getJasmineRequireObj().toMatch = function(j$) { - - var getErrorMsg = j$.formatErrorMsg('<toMatch>', 'expect(<expectation>).toMatch(<string> || <regexp>)'); - - /** - * {@link expect} the actual value to match a regular expression - * @function - * @name matchers#toMatch - * @param {RegExp|String} expected - Value to look for in the string. - * @example - * expect("my string").toMatch(/string$/); - * expect("other string").toMatch("her"); - */ - function toMatch() { - return { - compare: function(actual, expected) { - if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) { - throw new Error(getErrorMsg('Expected is not a String or a RegExp')); - } - - var regexp = new RegExp(expected); - - return { - pass: regexp.test(actual) - }; - } - }; - } - - return toMatch; -}; - -getJasmineRequireObj().toThrow = function(j$) { - - var getErrorMsg = j$.formatErrorMsg('<toThrow>', 'expect(function() {<expectation>}).toThrow()'); - - /** - * {@link expect} a function to `throw` something. - * @function - * @name matchers#toThrow - * @param {Object} [expected] - Value that should be thrown. If not provided, simply the fact that something was thrown will be checked. - * @example - * expect(function() { return 'things'; }).toThrow('foo'); - * expect(function() { return 'stuff'; }).toThrow(); - */ - function toThrow(util) { - return { - compare: function(actual, expected) { - var result = { pass: false }, - threw = false, - thrown; - - if (typeof actual != 'function') { - throw new Error(getErrorMsg('Actual is not a Function')); - } - - try { - actual(); - } catch (e) { - threw = true; - thrown = e; - } - - if (!threw) { - result.message = 'Expected function to throw an exception.'; - return result; - } - - if (arguments.length == 1) { - result.pass = true; - result.message = function() { return 'Expected function not to throw, but it threw ' + j$.pp(thrown) + '.'; }; - - return result; - } - - if (util.equals(thrown, expected)) { - result.pass = true; - result.message = function() { return 'Expected function not to throw ' + j$.pp(expected) + '.'; }; - } else { - result.message = function() { return 'Expected function to throw ' + j$.pp(expected) + ', but it threw ' + j$.pp(thrown) + '.'; }; - } - - return result; - } - }; - } - - return toThrow; -}; - -getJasmineRequireObj().toThrowError = function(j$) { - - var getErrorMsg = j$.formatErrorMsg('<toThrowError>', 'expect(function() {<expectation>}).toThrowError(<ErrorConstructor>, <message>)'); - - /** - * {@link expect} a function to `throw` an `Error`. - * @function - * @name matchers#toThrowError - * @param {Error} [expected] - `Error` constructor the object that was thrown needs to be an instance of. If not provided, `Error` will be used. - * @param {RegExp|String} [message] - The message that should be set on the thrown `Error` - * @example - * expect(function() { return 'things'; }).toThrowError(MyCustomError, 'message'); - * expect(function() { return 'things'; }).toThrowError(MyCustomError, /bar/); - * expect(function() { return 'stuff'; }).toThrowError(MyCustomError); - * expect(function() { return 'other'; }).toThrowError(/foo/); - * expect(function() { return 'other'; }).toThrowError(); - */ - function toThrowError () { - return { - compare: function(actual) { - var threw = false, - pass = {pass: true}, - fail = {pass: false}, - thrown; - - if (typeof actual != 'function') { - throw new Error(getErrorMsg('Actual is not a Function')); - } - - var errorMatcher = getMatcher.apply(null, arguments); - - try { - actual(); - } catch (e) { - threw = true; - thrown = e; - } - - if (!threw) { - fail.message = 'Expected function to throw an Error.'; - return fail; - } - - // Get Error constructor of thrown - if (!isErrorObject(thrown)) { - fail.message = function() { return 'Expected function to throw an Error, but it threw ' + j$.pp(thrown) + '.'; }; - return fail; - } - - if (errorMatcher.hasNoSpecifics()) { - pass.message = 'Expected function not to throw an Error, but it threw ' + j$.fnNameFor(thrown) + '.'; - return pass; - } - - if (errorMatcher.matches(thrown)) { - pass.message = function() { - return 'Expected function not to throw ' + errorMatcher.errorTypeDescription + errorMatcher.messageDescription() + '.'; - }; - return pass; - } else { - fail.message = function() { - return 'Expected function to throw ' + errorMatcher.errorTypeDescription + errorMatcher.messageDescription() + - ', but it threw ' + errorMatcher.thrownDescription(thrown) + '.'; - }; - return fail; - } - } - }; - - function getMatcher() { - var expected = null, - errorType = null; - - if (arguments.length == 2) { - expected = arguments[1]; - if (isAnErrorType(expected)) { - errorType = expected; - expected = null; - } - } else if (arguments.length > 2) { - errorType = arguments[1]; - expected = arguments[2]; - if (!isAnErrorType(errorType)) { - throw new Error(getErrorMsg('Expected error type is not an Error.')); - } - } - - if (expected && !isStringOrRegExp(expected)) { - if (errorType) { - throw new Error(getErrorMsg('Expected error message is not a string or RegExp.')); - } else { - throw new Error(getErrorMsg('Expected is not an Error, string, or RegExp.')); - } - } - - function messageMatch(message) { - if (typeof expected == 'string') { - return expected == message; - } else { - return expected.test(message); - } - } - - return { - errorTypeDescription: errorType ? j$.fnNameFor(errorType) : 'an exception', - thrownDescription: function(thrown) { - var thrownName = errorType ? j$.fnNameFor(thrown.constructor) : 'an exception', - thrownMessage = ''; - - if (expected) { - thrownMessage = ' with message ' + j$.pp(thrown.message); - } - - return thrownName + thrownMessage; - }, - messageDescription: function() { - if (expected === null) { - return ''; - } else if (expected instanceof RegExp) { - return ' with a message matching ' + j$.pp(expected); - } else { - return ' with message ' + j$.pp(expected); - } - }, - hasNoSpecifics: function() { - return expected === null && errorType === null; - }, - matches: function(error) { - return (errorType === null || error instanceof errorType) && - (expected === null || messageMatch(error.message)); - } - }; - } - - function isStringOrRegExp(potential) { - return potential instanceof RegExp || (typeof potential == 'string'); - } - - function isAnErrorType(type) { - if (typeof type !== 'function') { - return false; - } - - var Surrogate = function() {}; - Surrogate.prototype = type.prototype; - return isErrorObject(new Surrogate()); - } - - function isErrorObject(thrown) { - if (thrown instanceof Error) { - return true; - } - if (thrown && thrown.constructor && thrown.constructor.constructor && - (thrown instanceof (thrown.constructor.constructor('return this')()).Error)) { - return true; - } - return false; - } - } - - return toThrowError; -}; - -getJasmineRequireObj().MockDate = function() { - function MockDate(global) { - var self = this; - var currentTime = 0; - - if (!global || !global.Date) { - self.install = function() {}; - self.tick = function() {}; - self.uninstall = function() {}; - return self; - } - - var GlobalDate = global.Date; - - self.install = function(mockDate) { - if (mockDate instanceof GlobalDate) { - currentTime = mockDate.getTime(); - } else { - currentTime = new GlobalDate().getTime(); - } - - global.Date = FakeDate; - }; - - self.tick = function(millis) { - millis = millis || 0; - currentTime = currentTime + millis; - }; - - self.uninstall = function() { - currentTime = 0; - global.Date = GlobalDate; - }; - - createDateProperties(); - - return self; - - function FakeDate() { - switch(arguments.length) { - case 0: - return new GlobalDate(currentTime); - case 1: - return new GlobalDate(arguments[0]); - case 2: - return new GlobalDate(arguments[0], arguments[1]); - case 3: - return new GlobalDate(arguments[0], arguments[1], arguments[2]); - case 4: - return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3]); - case 5: - return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3], - arguments[4]); - case 6: - return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3], - arguments[4], arguments[5]); - default: - return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3], - arguments[4], arguments[5], arguments[6]); - } - } - - function createDateProperties() { - FakeDate.prototype = GlobalDate.prototype; - - FakeDate.now = function() { - if (GlobalDate.now) { - return currentTime; - } else { - throw new Error('Browser does not support Date.now()'); - } - }; - - FakeDate.toSource = GlobalDate.toSource; - FakeDate.toString = GlobalDate.toString; - FakeDate.parse = GlobalDate.parse; - FakeDate.UTC = GlobalDate.UTC; - } - } - - return MockDate; -}; - -getJasmineRequireObj().pp = function(j$) { - - function PrettyPrinter() { - this.ppNestLevel_ = 0; - this.seen = []; - } - - function hasCustomToString(value) { - // value.toString !== Object.prototype.toString if value has no custom toString but is from another context (e.g. - // iframe, web worker) - return value.toString !== Object.prototype.toString && (value.toString() !== Object.prototype.toString.call(value)); - } - - PrettyPrinter.prototype.format = function(value) { - this.ppNestLevel_++; - try { - if (j$.util.isUndefined(value)) { - this.emitScalar('undefined'); - } else if (value === null) { - this.emitScalar('null'); - } else if (value === 0 && 1/value === -Infinity) { - this.emitScalar('-0'); - } else if (value === j$.getGlobal()) { - this.emitScalar('<global>'); - } else if (value.jasmineToString) { - this.emitScalar(value.jasmineToString()); - } else if (typeof value === 'string') { - this.emitString(value); - } else if (j$.isSpy(value)) { - this.emitScalar('spy on ' + value.and.identity()); - } else if (value instanceof RegExp) { - this.emitScalar(value.toString()); - } else if (typeof value === 'function') { - this.emitScalar('Function'); - } else if (typeof value.nodeType === 'number') { - this.emitScalar('HTMLNode'); - } else if (value instanceof Date) { - this.emitScalar('Date(' + value + ')'); - } else if (value.toString && value.toString() == '[object Set]') { - this.emitSet(value); - } else if (value.toString && typeof value === 'object' && !j$.isArray_(value) && hasCustomToString(value)) { - this.emitScalar(value.toString()); - } else if (j$.util.arrayContains(this.seen, value)) { - this.emitScalar('<circular reference: ' + (j$.isArray_(value) ? 'Array' : 'Object') + '>'); - } else if (j$.isArray_(value) || j$.isA_('Object', value)) { - this.seen.push(value); - if (j$.isArray_(value)) { - this.emitArray(value); - } else { - this.emitObject(value); - } - this.seen.pop(); - } else { - this.emitScalar(value.toString()); - } - } finally { - this.ppNestLevel_--; - } - }; - - PrettyPrinter.prototype.iterateObject = function(obj, fn) { - for (var property in obj) { - if (!Object.prototype.hasOwnProperty.call(obj, property)) { continue; } - fn(property, obj.__lookupGetter__ ? (!j$.util.isUndefined(obj.__lookupGetter__(property)) && - obj.__lookupGetter__(property) !== null) : false); - } - }; - - PrettyPrinter.prototype.emitArray = j$.unimplementedMethod_; - PrettyPrinter.prototype.emitSet = j$.unimplementedMethod_; - PrettyPrinter.prototype.emitObject = j$.unimplementedMethod_; - PrettyPrinter.prototype.emitScalar = j$.unimplementedMethod_; - PrettyPrinter.prototype.emitString = j$.unimplementedMethod_; - - function StringPrettyPrinter() { - PrettyPrinter.call(this); - - this.string = ''; - } - - j$.util.inherit(StringPrettyPrinter, PrettyPrinter); - - StringPrettyPrinter.prototype.emitScalar = function(value) { - this.append(value); - }; - - StringPrettyPrinter.prototype.emitString = function(value) { - this.append('\'' + value + '\''); - }; - - StringPrettyPrinter.prototype.emitArray = function(array) { - if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { - this.append('Array'); - return; - } - var length = Math.min(array.length, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH); - this.append('[ '); - for (var i = 0; i < length; i++) { - if (i > 0) { - this.append(', '); - } - this.format(array[i]); - } - if(array.length > length){ - this.append(', ...'); - } - - var self = this; - var first = array.length === 0; - this.iterateObject(array, function(property, isGetter) { - if (property.match(/^\d+$/)) { - return; - } - - if (first) { - first = false; - } else { - self.append(', '); - } - - self.formatProperty(array, property, isGetter); - }); - - this.append(' ]'); - }; - - StringPrettyPrinter.prototype.emitSet = function(set) { - if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { - this.append('Set'); - return; - } - this.append('Set( '); - var size = Math.min(set.size, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH); - var iter = set.values(); - for (var i = 0; i < size; i++) { - if (i > 0) { - this.append(', '); - } - this.format(iter.next().value); - } - if (set.size > size){ - this.append(', ...'); - } - this.append(' )'); - }; - - StringPrettyPrinter.prototype.emitObject = function(obj) { - var ctor = obj.constructor, - constructorName; - - constructorName = typeof ctor === 'function' && obj instanceof ctor ? - j$.fnNameFor(obj.constructor) : - 'null'; - - this.append(constructorName); - - if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { - return; - } - - var self = this; - this.append('({ '); - var first = true; - - this.iterateObject(obj, function(property, isGetter) { - if (first) { - first = false; - } else { - self.append(', '); - } - - self.formatProperty(obj, property, isGetter); - }); - - this.append(' })'); - }; - - StringPrettyPrinter.prototype.formatProperty = function(obj, property, isGetter) { - this.append(property); - this.append(': '); - if (isGetter) { - this.append('<getter>'); - } else { - this.format(obj[property]); - } - }; - - StringPrettyPrinter.prototype.append = function(value) { - this.string += value; - }; - - return function(value) { - var stringPrettyPrinter = new StringPrettyPrinter(); - stringPrettyPrinter.format(value); - return stringPrettyPrinter.string; - }; -}; - -getJasmineRequireObj().QueueRunner = function(j$) { - - function once(fn) { - var called = false; - return function() { - if (!called) { - called = true; - fn(); - } - return null; - }; - } - - function QueueRunner(attrs) { - this.queueableFns = attrs.queueableFns || []; - this.onComplete = attrs.onComplete || function() {}; - this.clearStack = attrs.clearStack || function(fn) {fn();}; - this.onException = attrs.onException || function() {}; - this.catchException = attrs.catchException || function() { return true; }; - this.userContext = attrs.userContext || {}; - this.timeout = attrs.timeout || {setTimeout: setTimeout, clearTimeout: clearTimeout}; - this.fail = attrs.fail || function() {}; - this.globalErrors = attrs.globalErrors || { pushListener: function() {}, popListener: function() {} }; - } - - QueueRunner.prototype.execute = function() { - this.run(this.queueableFns, 0); - }; - - QueueRunner.prototype.run = function(queueableFns, recursiveIndex) { - var length = queueableFns.length, - self = this, - iterativeIndex; - - - for(iterativeIndex = recursiveIndex; iterativeIndex < length; iterativeIndex++) { - var queueableFn = queueableFns[iterativeIndex]; - if (queueableFn.fn.length > 0) { - attemptAsync(queueableFn); - return; - } else { - attemptSync(queueableFn); - } - } - - this.clearStack(this.onComplete); - - function attemptSync(queueableFn) { - try { - queueableFn.fn.call(self.userContext); - } catch (e) { - handleException(e, queueableFn); - } - } - - function attemptAsync(queueableFn) { - var clearTimeout = function () { - Function.prototype.apply.apply(self.timeout.clearTimeout, [j$.getGlobal(), [timeoutId]]); - }, - handleError = function(error) { - onException(error); - next(); - }, - next = once(function () { - clearTimeout(timeoutId); - self.globalErrors.popListener(handleError); - self.run(queueableFns, iterativeIndex + 1); - }), - timeoutId; - - next.fail = function() { - self.fail.apply(null, arguments); - next(); - }; - - self.globalErrors.pushListener(handleError); - - if (queueableFn.timeout) { - timeoutId = Function.prototype.apply.apply(self.timeout.setTimeout, [j$.getGlobal(), [function() { - var error = new Error('Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.'); - onException(error); - next(); - }, queueableFn.timeout()]]); - } - - try { - queueableFn.fn.call(self.userContext, next); - } catch (e) { - handleException(e, queueableFn); - next(); - } - } - - function onException(e) { - self.onException(e); - } - - function handleException(e, queueableFn) { - onException(e); - if (!self.catchException(e)) { - //TODO: set a var when we catch an exception and - //use a finally block to close the loop in a nice way.. - throw e; - } - } - }; - - return QueueRunner; -}; - -getJasmineRequireObj().ReportDispatcher = function() { - function ReportDispatcher(methods) { - - var dispatchedMethods = methods || []; - - for (var i = 0; i < dispatchedMethods.length; i++) { - var method = dispatchedMethods[i]; - this[method] = (function(m) { - return function() { - dispatch(m, arguments); - }; - }(method)); - } - - var reporters = []; - var fallbackReporter = null; - - this.addReporter = function(reporter) { - reporters.push(reporter); - }; - - this.provideFallbackReporter = function(reporter) { - fallbackReporter = reporter; - }; - - this.clearReporters = function() { - reporters = []; - }; - - return this; - - function dispatch(method, args) { - if (reporters.length === 0 && fallbackReporter !== null) { - reporters.push(fallbackReporter); - } - for (var i = 0; i < reporters.length; i++) { - var reporter = reporters[i]; - if (reporter[method]) { - reporter[method].apply(reporter, args); - } - } - } - } - - return ReportDispatcher; -}; - - -getJasmineRequireObj().interface = function(jasmine, env) { - var jasmineInterface = { - /** - * Create a group of specs (often called a suite). - * - * Calls to `describe` can be nested within other calls to compose your suite as a tree. - * @name describe - * @function - * @global - * @param {String} description Textual description of the group - * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites a specs - */ - describe: function(description, specDefinitions) { - return env.describe(description, specDefinitions); - }, - - /** - * A temporarily disabled [`describe`]{@link describe} - * - * Specs within an `xdescribe` will be marked pending and not executed - * @name xdescribe - * @function - * @global - * @param {String} description Textual description of the group - * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites a specs - */ - xdescribe: function(description, specDefinitions) { - return env.xdescribe(description, specDefinitions); - }, - - /** - * A focused [`describe`]{@link describe} - * - * If suites or specs are focused, only those that are focused will be executed - * @see fit - * @name fdescribe - * @function - * @global - * @param {String} description Textual description of the group - * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites a specs - */ - fdescribe: function(description, specDefinitions) { - return env.fdescribe(description, specDefinitions); - }, - - /** - * Define a single spec. A spec should contain one or more {@link expect|expectations} that test the state of the code. - * - * A spec whose expectations all succeed will be passing and a spec with any failures will fail. - * @name it - * @function - * @global - * @param {String} description Textual description of what this spec is checking - * @param {Function} [testFunction] Function that contains the code of your test. If not provided the test will be `pending`. - * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec. - */ - it: function() { - return env.it.apply(env, arguments); - }, - - /** - * A temporarily disabled [`it`]{@link it} - * - * The spec will report as `pending` and will not be executed. - * @name xit - * @function - * @global - * @param {String} description Textual description of what this spec is checking. - * @param {Function} [testFunction] Function that contains the code of your test. Will not be executed. - */ - xit: function() { - return env.xit.apply(env, arguments); - }, - - /** - * A focused [`it`]{@link it} - * - * If suites or specs are focused, only those that are focused will be executed. - * @name fit - * @function - * @global - * @param {String} description Textual description of what this spec is checking. - * @param {Function} testFunction Function that contains the code of your test. - * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec. - */ - fit: function() { - return env.fit.apply(env, arguments); - }, - - /** - * Run some shared setup before each of the specs in the {@link describe} in which it is called. - * @name beforeEach - * @function - * @global - * @param {Function} [function] Function that contains the code to setup your specs. - * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeEach. - */ - beforeEach: function() { - return env.beforeEach.apply(env, arguments); - }, - - /** - * Run some shared teardown after each of the specs in the {@link describe} in which it is called. - * @name afterEach - * @function - * @global - * @param {Function} [function] Function that contains the code to teardown your specs. - * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterEach. - */ - afterEach: function() { - return env.afterEach.apply(env, arguments); - }, - - /** - * Run some shared setup once before all of the specs in the {@link describe} are run. - * - * _Note:_ Be careful, sharing the setup from a beforeAll makes it easy to accidentally leak state between your specs so that they erroneously pass or fail. - * @name beforeAll - * @function - * @global - * @param {Function} [function] Function that contains the code to setup your specs. - * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeAll. - */ - beforeAll: function() { - return env.beforeAll.apply(env, arguments); - }, - - /** - * Run some shared teardown once before all of the specs in the {@link describe} are run. - * - * _Note:_ Be careful, sharing the teardown from a afterAll makes it easy to accidentally leak state between your specs so that they erroneously pass or fail. - * @name afterAll - * @function - * @global - * @param {Function} [function] Function that contains the code to teardown your specs. - * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterAll. - */ - afterAll: function() { - return env.afterAll.apply(env, arguments); - }, - - /** - * Create an expectation for a spec. - * @name expect - * @function - * @global - * @param {Object} actual - Actual computed value to test expectations against. - * @return {matchers} - */ - expect: function(actual) { - return env.expect(actual); - }, - - /** - * Mark a spec as pending, expectation results will be ignored. - * @name pending - * @function - * @global - * @param {String} [message] - Reason the spec is pending. - */ - pending: function() { - return env.pending.apply(env, arguments); - }, - - /** - * Explicitly mark a spec as failed. - * @name fail - * @function - * @global - * @param {String|Error} [error] - Reason for the failure. - */ - fail: function() { - return env.fail.apply(env, arguments); - }, - - /** - * Install a spy onto an existing object. - * @name spyOn - * @function - * @global - * @param {Object} obj - The object upon which to install the {@link Spy}. - * @param {String} methodName - The name of the method to replace with a {@link Spy}. - * @returns {Spy} - */ - spyOn: function(obj, methodName) { - return env.spyOn(obj, methodName); - }, - - /** - * Install a spy on a property onto an existing object. - * @name spyOnProperty - * @function - * @global - * @param {Object} obj - The object upon which to install the {@link Spy} - * @param {String} propertyName - The name of the property to replace with a {@link Spy}. - * @param {String} [accessType=get] - The access type (get|set) of the property to {@link Spy} on. - * @returns {Spy} - */ - spyOnProperty: function(obj, methodName, accessType) { - return env.spyOnProperty(obj, methodName, accessType); - }, - - jsApiReporter: new jasmine.JsApiReporter({ - timer: new jasmine.Timer() - }), - - /** - * @namespace jasmine - */ - jasmine: jasmine - }; - - /** - * Add a custom equality tester for the current scope of specs. - * - * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}. - * @name jasmine.addCustomEqualityTester - * @function - * @param {Function} tester - A function which takes two arguments to compare and returns a `true` or `false` comparison result if it knows how to compare them, and `undefined` otherwise. - * @see custom_equality - */ - jasmine.addCustomEqualityTester = function(tester) { - env.addCustomEqualityTester(tester); - }; - - /** - * Add custom matchers for the current scope of specs. - * - * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}. - * @name jasmine.addMatchers - * @function - * @param {Object} matchers - Keys from this object will be the new matcher names. - * @see custom_matcher - */ - jasmine.addMatchers = function(matchers) { - return env.addMatchers(matchers); - }; - - /** - * Get the currently booted mock {Clock} for this Jasmine environment. - * @name jasmine.clock - * @function - * @returns {Clock} - */ - jasmine.clock = function() { - return env.clock; - }; - - return jasmineInterface; -}; - -getJasmineRequireObj().Spy = function (j$) { - - var nextOrder = (function() { - var order = 0; - - return function() { - return order++; - }; - })(); - - /** - * _Note:_ Do not construct this directly, use {@link spyOn}, {@link spyOnProperty}, {@link jasmine.createSpy}, or {@link jasmine.createSpyObj} - * @constructor - * @name Spy - */ - function Spy(name, originalFn) { - var numArgs = (typeof originalFn === 'function' ? originalFn.length : 0), - wrapper = makeFunc(numArgs, function () { - return spy.apply(this, Array.prototype.slice.call(arguments)); - }), - spyStrategy = new j$.SpyStrategy({ - name: name, - fn: originalFn, - getSpy: function () { - return wrapper; - } - }), - callTracker = new j$.CallTracker(), - spy = function () { - /** - * @name Spy.callData - * @property {object} object - `this` context for the invocation. - * @property {number} invocationOrder - Order of the invocation. - * @property {Array} args - The arguments passed for this invocation. - */ - var callData = { - object: this, - invocationOrder: nextOrder(), - args: Array.prototype.slice.apply(arguments) - }; - - callTracker.track(callData); - var returnValue = spyStrategy.exec.apply(this, arguments); - callData.returnValue = returnValue; - - return returnValue; - }; - - function makeFunc(length, fn) { - switch (length) { - case 1 : return function (a) { return fn.apply(this, arguments); }; - case 2 : return function (a,b) { return fn.apply(this, arguments); }; - case 3 : return function (a,b,c) { return fn.apply(this, arguments); }; - case 4 : return function (a,b,c,d) { return fn.apply(this, arguments); }; - case 5 : return function (a,b,c,d,e) { return fn.apply(this, arguments); }; - case 6 : return function (a,b,c,d,e,f) { return fn.apply(this, arguments); }; - case 7 : return function (a,b,c,d,e,f,g) { return fn.apply(this, arguments); }; - case 8 : return function (a,b,c,d,e,f,g,h) { return fn.apply(this, arguments); }; - case 9 : return function (a,b,c,d,e,f,g,h,i) { return fn.apply(this, arguments); }; - default : return function () { return fn.apply(this, arguments); }; - } - } - - for (var prop in originalFn) { - if (prop === 'and' || prop === 'calls') { - throw new Error('Jasmine spies would overwrite the \'and\' and \'calls\' properties on the object being spied upon'); - } - - wrapper[prop] = originalFn[prop]; - } - - wrapper.and = spyStrategy; - wrapper.calls = callTracker; - - return wrapper; - } - - return Spy; -}; - -getJasmineRequireObj().SpyRegistry = function(j$) { - - var getErrorMsg = j$.formatErrorMsg('<spyOn>', 'spyOn(<object>, <methodName>)'); - - function SpyRegistry(options) { - options = options || {}; - var currentSpies = options.currentSpies || function() { return []; }; - - this.allowRespy = function(allow){ - this.respy = allow; - }; - - this.spyOn = function(obj, methodName) { - - if (j$.util.isUndefined(obj) || obj === null) { - throw new Error(getErrorMsg('could not find an object to spy upon for ' + methodName + '()')); - } - - if (j$.util.isUndefined(methodName) || methodName === null) { - throw new Error(getErrorMsg('No method name supplied')); - } - - if (j$.util.isUndefined(obj[methodName])) { - throw new Error(getErrorMsg(methodName + '() method does not exist')); - } - - if (obj[methodName] && j$.isSpy(obj[methodName]) ) { - if ( !!this.respy ){ - return obj[methodName]; - }else { - throw new Error(getErrorMsg(methodName + ' has already been spied upon')); - } - } - - var descriptor; - try { - descriptor = Object.getOwnPropertyDescriptor(obj, methodName); - } catch(e) { - // IE 8 doesn't support `definePropery` on non-DOM nodes - } - - if (descriptor && !(descriptor.writable || descriptor.set)) { - throw new Error(getErrorMsg(methodName + ' is not declared writable or has no setter')); - } - - var originalMethod = obj[methodName], - spiedMethod = j$.createSpy(methodName, originalMethod), - restoreStrategy; - - if (Object.prototype.hasOwnProperty.call(obj, methodName)) { - restoreStrategy = function() { - obj[methodName] = originalMethod; - }; - } else { - restoreStrategy = function() { - if (!delete obj[methodName]) { - obj[methodName] = originalMethod; - } - }; - } - - currentSpies().push({ - restoreObjectToOriginalState: restoreStrategy - }); - - obj[methodName] = spiedMethod; - - return spiedMethod; - }; - - this.spyOnProperty = function (obj, propertyName, accessType) { - accessType = accessType || 'get'; - - if (j$.util.isUndefined(obj)) { - throw new Error('spyOn could not find an object to spy upon for ' + propertyName + ''); - } - - if (j$.util.isUndefined(propertyName)) { - throw new Error('No property name supplied'); - } - - var descriptor; - try { - descriptor = j$.util.getPropertyDescriptor(obj, propertyName); - } catch(e) { - // IE 8 doesn't support `definePropery` on non-DOM nodes - } - - if (!descriptor) { - throw new Error(propertyName + ' property does not exist'); - } - - if (!descriptor.configurable) { - throw new Error(propertyName + ' is not declared configurable'); - } - - if(!descriptor[accessType]) { - throw new Error('Property ' + propertyName + ' does not have access type ' + accessType); - } - - if (j$.isSpy(descriptor[accessType])) { - //TODO?: should this return the current spy? Downside: may cause user confusion about spy state - throw new Error(propertyName + ' has already been spied upon'); - } - - var originalDescriptor = j$.util.clone(descriptor), - spy = j$.createSpy(propertyName, descriptor[accessType]), - restoreStrategy; - - if (Object.prototype.hasOwnProperty.call(obj, propertyName)) { - restoreStrategy = function() { - Object.defineProperty(obj, propertyName, originalDescriptor); - }; - } else { - restoreStrategy = function() { - delete obj[propertyName]; - }; - } - - currentSpies().push({ - restoreObjectToOriginalState: restoreStrategy - }); - - descriptor[accessType] = spy; - - Object.defineProperty(obj, propertyName, descriptor); - - return spy; - }; - - this.clearSpies = function() { - var spies = currentSpies(); - for (var i = spies.length - 1; i >= 0; i--) { - var spyEntry = spies[i]; - spyEntry.restoreObjectToOriginalState(); - } - }; - } - - return SpyRegistry; -}; - -getJasmineRequireObj().SpyStrategy = function(j$) { - - /** - * @namespace Spy#and - */ - function SpyStrategy(options) { - options = options || {}; - - var identity = options.name || 'unknown', - originalFn = options.fn || function() {}, - getSpy = options.getSpy || function() {}, - plan = function() {}; - - /** - * Return the identifying information for the spy. - * @name Spy#and#identity - * @function - * @returns {String} - */ - this.identity = function() { - return identity; - }; - - /** - * Execute the current spy strategy. - * @name Spy#and#exec - * @function - */ - this.exec = function() { - return plan.apply(this, arguments); - }; - - /** - * Tell the spy to call through to the real implementation when invoked. - * @name Spy#and#callThrough - * @function - */ - this.callThrough = function() { - plan = originalFn; - return getSpy(); - }; - - /** - * Tell the spy to return the value when invoked. - * @name Spy#and#returnValue - * @function - * @param {*} value The value to return. - */ - this.returnValue = function(value) { - plan = function() { - return value; - }; - return getSpy(); - }; - - /** - * Tell the spy to return one of the specified values (sequentially) each time the spy is invoked. - * @name Spy#and#returnValues - * @function - * @param {...*} values - Values to be returned on subsequent calls to the spy. - */ - this.returnValues = function() { - var values = Array.prototype.slice.call(arguments); - plan = function () { - return values.shift(); - }; - return getSpy(); - }; - - /** - * Tell the spy to throw an error when invoked. - * @name Spy#and#throwError - * @function - * @param {Error|String} something Thing to throw - */ - this.throwError = function(something) { - var error = (something instanceof Error) ? something : new Error(something); - plan = function() { - throw error; - }; - return getSpy(); - }; - - /** - * Tell the spy to call a fake implementation when invoked. - * @name Spy#and#callFake - * @function - * @param {Function} fn The function to invoke with the passed parameters. - */ - this.callFake = function(fn) { - if(!j$.isFunction_(fn)) { - throw new Error('Argument passed to callFake should be a function, got ' + fn); - } - plan = fn; - return getSpy(); - }; - - /** - * Tell the spy to do nothing when invoked. This is the default. - * @name Spy#and#stub - * @function - */ - this.stub = function(fn) { - plan = function() {}; - return getSpy(); - }; - } - - return SpyStrategy; -}; - -getJasmineRequireObj().Suite = function(j$) { - function Suite(attrs) { - this.env = attrs.env; - this.id = attrs.id; - this.parentSuite = attrs.parentSuite; - this.description = attrs.description; - this.expectationFactory = attrs.expectationFactory; - this.expectationResultFactory = attrs.expectationResultFactory; - this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure; - - this.beforeFns = []; - this.afterFns = []; - this.beforeAllFns = []; - this.afterAllFns = []; - - this.children = []; - - this.result = { - id: this.id, - description: this.description, - fullName: this.getFullName(), - failedExpectations: [] - }; - } - - Suite.prototype.expect = function(actual) { - return this.expectationFactory(actual, this); - }; - - Suite.prototype.getFullName = function() { - var fullName = []; - for (var parentSuite = this; parentSuite; parentSuite = parentSuite.parentSuite) { - if (parentSuite.parentSuite) { - fullName.unshift(parentSuite.description); - } - } - return fullName.join(' '); - }; - - Suite.prototype.pend = function() { - this.markedPending = true; - }; - - Suite.prototype.beforeEach = function(fn) { - this.beforeFns.unshift(fn); - }; - - Suite.prototype.beforeAll = function(fn) { - this.beforeAllFns.push(fn); - }; - - Suite.prototype.afterEach = function(fn) { - this.afterFns.unshift(fn); - }; - - Suite.prototype.afterAll = function(fn) { - this.afterAllFns.unshift(fn); - }; - - Suite.prototype.addChild = function(child) { - this.children.push(child); - }; - - Suite.prototype.status = function() { - if (this.markedPending) { - return 'pending'; - } - - if (this.result.failedExpectations.length > 0) { - return 'failed'; - } else { - return 'finished'; - } - }; - - Suite.prototype.isExecutable = function() { - return !this.markedPending; - }; - - Suite.prototype.canBeReentered = function() { - return this.beforeAllFns.length === 0 && this.afterAllFns.length === 0; - }; - - Suite.prototype.getResult = function() { - this.result.status = this.status(); - return this.result; - }; - - Suite.prototype.sharedUserContext = function() { - if (!this.sharedContext) { - this.sharedContext = this.parentSuite ? clone(this.parentSuite.sharedUserContext()) : {}; - } - - return this.sharedContext; - }; - - Suite.prototype.clonedSharedUserContext = function() { - return clone(this.sharedUserContext()); - }; - - Suite.prototype.onException = function() { - if (arguments[0] instanceof j$.errors.ExpectationFailed) { - return; - } - - if(isAfterAll(this.children)) { - var data = { - matcherName: '', - passed: false, - expected: '', - actual: '', - error: arguments[0] - }; - this.result.failedExpectations.push(this.expectationResultFactory(data)); - } else { - for (var i = 0; i < this.children.length; i++) { - var child = this.children[i]; - child.onException.apply(child, arguments); - } - } - }; - - Suite.prototype.addExpectationResult = function () { - if(isAfterAll(this.children) && isFailure(arguments)){ - var data = arguments[1]; - this.result.failedExpectations.push(this.expectationResultFactory(data)); - if(this.throwOnExpectationFailure) { - throw new j$.errors.ExpectationFailed(); - } - } else { - for (var i = 0; i < this.children.length; i++) { - var child = this.children[i]; - try { - child.addExpectationResult.apply(child, arguments); - } catch(e) { - // keep going - } - } - } - }; - - function isAfterAll(children) { - return children && children[0].result.status; - } - - function isFailure(args) { - return !args[0]; - } - - function clone(obj) { - var clonedObj = {}; - for (var prop in obj) { - if (obj.hasOwnProperty(prop)) { - clonedObj[prop] = obj[prop]; - } - } - - return clonedObj; - } - - return Suite; -}; - -if (typeof window == void 0 && typeof exports == 'object') { - exports.Suite = jasmineRequire.Suite; -} - -getJasmineRequireObj().Timer = function() { - var defaultNow = (function(Date) { - return function() { return new Date().getTime(); }; - })(Date); - - function Timer(options) { - options = options || {}; - - var now = options.now || defaultNow, - startTime; - - this.start = function() { - startTime = now(); - }; - - this.elapsed = function() { - return now() - startTime; - }; - } - - return Timer; -}; - -getJasmineRequireObj().TreeProcessor = function() { - function TreeProcessor(attrs) { - var tree = attrs.tree, - runnableIds = attrs.runnableIds, - queueRunnerFactory = attrs.queueRunnerFactory, - nodeStart = attrs.nodeStart || function() {}, - nodeComplete = attrs.nodeComplete || function() {}, - orderChildren = attrs.orderChildren || function(node) { return node.children; }, - stats = { valid: true }, - processed = false, - defaultMin = Infinity, - defaultMax = 1 - Infinity; - - this.processTree = function() { - processNode(tree, false); - processed = true; - return stats; - }; - - this.execute = function(done) { - if (!processed) { - this.processTree(); - } - - if (!stats.valid) { - throw 'invalid order'; - } - - var childFns = wrapChildren(tree, 0); - - queueRunnerFactory({ - queueableFns: childFns, - userContext: tree.sharedUserContext(), - onException: function() { - tree.onException.apply(tree, arguments); - }, - onComplete: done - }); - }; - - function runnableIndex(id) { - for (var i = 0; i < runnableIds.length; i++) { - if (runnableIds[i] === id) { - return i; - } - } - } - - function processNode(node, parentEnabled) { - var executableIndex = runnableIndex(node.id); - - if (executableIndex !== undefined) { - parentEnabled = true; - } - - parentEnabled = parentEnabled && node.isExecutable(); - - if (!node.children) { - stats[node.id] = { - executable: parentEnabled && node.isExecutable(), - segments: [{ - index: 0, - owner: node, - nodes: [node], - min: startingMin(executableIndex), - max: startingMax(executableIndex) - }] - }; - } else { - var hasExecutableChild = false; - - var orderedChildren = orderChildren(node); - - for (var i = 0; i < orderedChildren.length; i++) { - var child = orderedChildren[i]; - - processNode(child, parentEnabled); - - if (!stats.valid) { - return; - } - - var childStats = stats[child.id]; - - hasExecutableChild = hasExecutableChild || childStats.executable; - } - - stats[node.id] = { - executable: hasExecutableChild - }; - - segmentChildren(node, orderedChildren, stats[node.id], executableIndex); - - if (!node.canBeReentered() && stats[node.id].segments.length > 1) { - stats = { valid: false }; - } - } - } - - function startingMin(executableIndex) { - return executableIndex === undefined ? defaultMin : executableIndex; - } - - function startingMax(executableIndex) { - return executableIndex === undefined ? defaultMax : executableIndex; - } - - function segmentChildren(node, orderedChildren, nodeStats, executableIndex) { - var currentSegment = { index: 0, owner: node, nodes: [], min: startingMin(executableIndex), max: startingMax(executableIndex) }, - result = [currentSegment], - lastMax = defaultMax, - orderedChildSegments = orderChildSegments(orderedChildren); - - function isSegmentBoundary(minIndex) { - return lastMax !== defaultMax && minIndex !== defaultMin && lastMax < minIndex - 1; - } - - for (var i = 0; i < orderedChildSegments.length; i++) { - var childSegment = orderedChildSegments[i], - maxIndex = childSegment.max, - minIndex = childSegment.min; - - if (isSegmentBoundary(minIndex)) { - currentSegment = {index: result.length, owner: node, nodes: [], min: defaultMin, max: defaultMax}; - result.push(currentSegment); - } - - currentSegment.nodes.push(childSegment); - currentSegment.min = Math.min(currentSegment.min, minIndex); - currentSegment.max = Math.max(currentSegment.max, maxIndex); - lastMax = maxIndex; - } - - nodeStats.segments = result; - } - - function orderChildSegments(children) { - var specifiedOrder = [], - unspecifiedOrder = []; - - for (var i = 0; i < children.length; i++) { - var child = children[i], - segments = stats[child.id].segments; - - for (var j = 0; j < segments.length; j++) { - var seg = segments[j]; - - if (seg.min === defaultMin) { - unspecifiedOrder.push(seg); - } else { - specifiedOrder.push(seg); - } - } - } - - specifiedOrder.sort(function(a, b) { - return a.min - b.min; - }); - - return specifiedOrder.concat(unspecifiedOrder); - } - - function executeNode(node, segmentNumber) { - if (node.children) { - return { - fn: function(done) { - nodeStart(node); - - queueRunnerFactory({ - onComplete: function() { - nodeComplete(node, node.getResult()); - done(); - }, - queueableFns: wrapChildren(node, segmentNumber), - userContext: node.sharedUserContext(), - onException: function() { - node.onException.apply(node, arguments); - } - }); - } - }; - } else { - return { - fn: function(done) { node.execute(done, stats[node.id].executable); } - }; - } - } - - function wrapChildren(node, segmentNumber) { - var result = [], - segmentChildren = stats[node.id].segments[segmentNumber].nodes; - - for (var i = 0; i < segmentChildren.length; i++) { - result.push(executeNode(segmentChildren[i].owner, segmentChildren[i].index)); - } - - if (!stats[node.id].executable) { - return result; - } - - return node.beforeAllFns.concat(result).concat(node.afterAllFns); - } - } - - return TreeProcessor; -}; - -getJasmineRequireObj().version = function() { - return '2.6.1'; -}; diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/load_reorder.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/load_reorder.js deleted file mode 100644 index a9dc33d4f14394241a16b3d4457b3d6b645b32b4..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/load_reorder.js +++ /dev/null @@ -1,72 +0,0 @@ -describe("Loader", function () { - describe("reorder", function () { - var oldIds = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]; - var newIds = [1, 2, 4, 3, 5, 11, 6, 7, 8, 9, 10, 12, 19, 14, 16, 21, 15, 17, 22, 20]; - var targetIds = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 19, 20, 21, 22]; - var codeTable = null; - - /** - * - * @param {Array.<{id:int}>} array - * @return {Array.<int>} - */ - function getIdArray(array) { - return array.map(function (item) { - return item.id; - }); - // var result = []; - // for (var i = 0; i < array.length; i++) { - // result.push(array[i].id); - // } - // return result; - } - - /** - * - * @param {Array.<int>} idArray - * @return {Array.<int>} - */ - function encodeIdArray(idArray) { - if (codeTable === null) { - codeTable = []; - while (codeTable.length < 25) { - var code = getRandomInt(1000, 5000); - if (codeTable.indexOf(code) > -1) continue; - codeTable.push(code); - } - } - return idArray.map(function (id) { - return codeTable[id]; - }); - } - - function getRandomInt(min, max) { - min = Math.ceil(min); - max = Math.floor(max); - return Math.floor(Math.random() * (max - min)) + min; - } - - function toDataArray(idArray) { - var array = []; - for (var i = 0; i < idArray.length; i++) { - var entityId = idArray[i]; - array.push({id: entityId, name: "entity #" + entityId}); - } - return array; - } - - it("should be defined", function () { - expect(typeof(ysy.data.loader.reorderArray)).toBe("function"); - }); - it("should reorder by ID array", function () { - var reordered = ysy.data.loader.reorderArray(toDataArray(newIds), oldIds); - var reorderedIdArray = getIdArray(reordered); - expect(reorderedIdArray).toEqual(targetIds); - }); - it("should reorder encoded ID array", function () { - var reordered = ysy.data.loader.reorderArray(toDataArray(encodeIdArray(newIds)), encodeIdArray(oldIds)); - var reorderedIdArray = getIdArray(reordered); - expect(reorderedIdArray).toEqual(encodeIdArray(targetIds)); - }); - }); -}); diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/loader.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/loader.js deleted file mode 100644 index 85a07d4e96a90436c4176bba91c81cce03369c9a..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/loader.js +++ /dev/null @@ -1,90 +0,0 @@ -describe("Loader", function () { - describe("init", function () { - var sett = ysy.settings; - it("should prepare proper rootPath", function () { - expect(sett.paths.rootPath.substring(-1)).toBe("/"); - }); - it("should prepare global/projectID variables", function () { - if (sett.global) { - expect(sett.global).toBe(true); - expect(sett.projectID).toBeUndefined(); - } else { - expect(sett.global).toBeUndefined(); - expect(sett.projectID).toEqual(jasmine.any(Number)); - } - }); - it("should init many settings", function () { - expect(sett.zoom._name).toEqual("Zoom"); - expect(sett.controls._name).toEqual("Task controls"); - expect(sett.baseline._name).toEqual("Baselines"); - expect(sett.critical._name).toEqual("Critical path"); - expect(sett.addTask._name).toEqual("Add Task"); - expect(sett.resource._name).toEqual("Resource Management"); - expect(sett.scheme._name).toEqual("Schema switch"); - }); - }); - describe("Project load", function () { - var projectsBackup; - beforeEach(function () { - projectsBackup = ysy.data.projects; - ysy.data.projects = new ysy.data.Array(); - }); - afterEach(function () { - ysy.data.projects = projectsBackup; - }); - var projectsJson = [{ - id: 25, - name: "superproject", - start_date: "2016-06-25", - end_date: "2016-07-16" - }, { - id: 26, - name: "subproject", - start_date: "2016-06-25", - end_date: "2016-07-16" - }, { - id: 31, - name: "project", - start_date: "2016-01-01", - end_date: "2016-02-16" - }]; - it("should load project array", function () { - expect(ysy.data.projects.getArray().length).toBe(0); - ysy.data.loader._loadProjects(projectsJson); - expect(ysy.data.projects.getArray().length).toBe(3); - }); - }); - describe("Issue load", function () { - var issuesBackup; - beforeEach(function () { - issuesBackup = ysy.data.issues; - ysy.data.issues = new ysy.data.Array(); - }); - afterEach(function () { - ysy.data.issues = issuesBackup; - }); - var issuesJson = [{ - id: 25, - name: "superissue", - start_date: "2016-06-25", - end_date: "2016-07-16", - columns: [] - }, { - id: 26, - name: "subissue", - start_date: "2016-06-25", - end_date: "2016-07-16", - columns: [] - }]; - it("should load issue array", function () { - expect(ysy.data.issues.getArray().length).toBe(0); - ysy.data.loader._loadIssues(issuesJson, "root"); - expect(ysy.data.issues.getArray().length).toBe(2); - }); - // it("should throw error when no columns property", function () { - // expect(function () { - // ysy.data.loader._loadIssues([{id: 25}]) - // }).toThrowError(TypeError) - // }); - }); -}); \ No newline at end of file diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/main.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/main.js deleted file mode 100644 index 7b4c911efe25a3fc6374286276b72e519a52df83..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/main.js +++ /dev/null @@ -1,66 +0,0 @@ -describe("Test framework", function () { - it("should load", function () { - expect(true).toBe(true); - // expect(false).toBe(true); - }); - - it("should start after gantt is loaded", function () { - expect($(".gantt_data_area").length).toBe(1); - }); - it("should handle long tests", function (done) { - setTimeout(function () { - expect(true).toBe(true); - done(); - }, 100); - }); - var getQueryString = function () { - var query_string = {}; - var query = window.location.search.substring(1); - var vars = query.split("&"); - for (var i = 0; i < vars.length; i++) { - var pair = vars[i].split("="); - // If first entry with this name - if (typeof query_string[pair[0]] === "undefined") { - query_string[pair[0]] = decodeURIComponent(pair[1]); - // If second entry with this name - } else if (typeof query_string[pair[0]] === "string") { - query_string[pair[0]] = [query_string[pair[0]], decodeURIComponent(pair[1])]; - // If third or later entry with this name - } else { - query_string[pair[0]].push(decodeURIComponent(pair[1])); - } - } - return query_string; - }; - var prefixTestFile = function (file) { - if (file.indexOf("/") > -1) return file; - return "easy_gantt/" + file; - }; - it("should load extra tests if any", function () { - var params = getQueryString(); - var requestedTests = params["run_jasmine_tests"] || params["run_jasmine_tests[]"] || params["run_jasmine_tests%5B%5D"]; - if (requestedTests === "true") { - requestedTests = []; - } else if (typeof(requestedTests) === "string") { - requestedTests = [prefixTestFile(requestedTests)]; - } else if (typeof(requestedTests) === "object" && requestedTests.length !== undefined) { - requestedTests = requestedTests.map(function (requestedTest) { - return prefixTestFile(requestedTest); - }) - } else { - throw "Wrong type of run_jasmine_tests - \""+requestedTests+"\" is not true|string|Array<String>"; - } - var extraTests = ysy.pro.test.extraTestNames; - if (requestedTests.length > extraTests.length) { - for (var i = 0; i < requestedTests.length; i++) { - expect(extraTests).toContain(requestedTests[i], "extraTests missing " + requestedTests[i]); - } - return; - } - expect(requestedTests.length).toBe(extraTests.length, "requested tests !== loaded tests"); - for (i = 0; i < extraTests.length; i++) { - expect(requestedTests).toContain(extraTests[i]); - } - - }); -}); \ No newline at end of file diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/model_relations.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/model_relations.js deleted file mode 100644 index 2c15af7f1f1ab44381b7763ae34b31068c48d20a..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/model_relations.js +++ /dev/null @@ -1,3 +0,0 @@ -describe("Model relations",function(){ - -}); \ No newline at end of file diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/pos_date.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/pos_date.js deleted file mode 100644 index 8160dd0f4a6378199ef5fda9173d139c57ff28c9..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/pos_date.js +++ /dev/null @@ -1,75 +0,0 @@ -describe("PosFromDate", function () { - beforeAll(function () { - this._max_date = gantt._max_date; - this._min_date = gantt._min_date; - this.fullWidth = gantt._tasks.full_width; - this.scale = gantt._tasks; - }); - it("should return 0 if min_date", function () { - expect(gantt.posFromDate(this._min_date)).toBe(0); - }); - it("should return fullWidth if max_date", function () { - expect(gantt.posFromDate(this._max_date)).toBe(this.fullWidth); - }); - it("should work for all columns", function () { - for (var i = 0; i < this.scale.count; i++) { - expect(gantt.posFromDate(this.scale.trace_x[i])).toEqual(this.scale.left[i]); - } - }); - it("should work for quarter-column", function () { - for (var i = 0; i < this.scale.count - 1; i++) { - // expect(gantt.posFromDate(moment(this.scale.trace_x[i]).add(6, "hours"))) - expect(gantt.posFromDate(moment( - +this.scale.trace_x[i] + 0.25 * (this.scale.trace_x[i + 1] - this.scale.trace_x[i]) - ))) - .toEqual(this.scale.left[i] + 0.25 * (this.scale.left[i + 1] - this.scale.left[i])); - } - }); -}); -describe("DateFromPos", function () { - beforeAll(function () { - this._max_date = gantt._max_date; - this._min_date = gantt._min_date; - this.fullWidth = gantt._tasks.full_width; - this.scale = gantt._tasks; - }); - it("should return min_date if 0", function () { - expect(gantt.dateFromPos(0)).toEqual(this._min_date); - }); - it("should return max_date if fullWidth", function () { - expect(gantt.dateFromPos(this.fullWidth)).toEqual(this._max_date); - }); - it("should work for all columns", function () { - for (var i = 0; i < this.scale.count; i++) { - expect(gantt.dateFromPos(this.scale.left[i])).toEqual(this.scale.trace_x[i]); - } - }); - it("should work for quarter-column", function () { - for (var i = 0; i < this.scale.count - 1; i++) { - expect(gantt.dateFromPos(this.scale.left[i] + 0.25 * (this.scale.left[i + 1] - this.scale.left[i]))) - .toEqual(moment( - +this.scale.trace_x[i] + 0.25 * (this.scale.trace_x[i + 1] - this.scale.trace_x[i]) - ).toDate()); - } - }); -}); -describe("DateFromPos => PosFromDate", function () { - beforeAll(function () { - this._max_date = gantt._max_date; - this._min_date = gantt._min_date; - this.fullWidth = gantt._tasks.full_width; - this.scale = gantt._tasks; - }); - it("should work for 300 random values from 0-fullWidth", function () { - for (var i = 0; i < 300; i++) { - var value = Math.random() * this.fullWidth; - expect(gantt.posFromDate(gantt.dateFromPos(value))).toBeCloseTo(value, 0.00001); - } - }); - it("should work for 300 random values from min_date-max_date", function () { - for (var i = 0; i < 300; i++) { - var value = gantt.date.Date(this._min_date.valueOf() + Math.random() * (this._max_date - this._min_date)); - expect(gantt.dateFromPos(gantt.posFromDate(value))).toEqual(value); - } - }); -}); \ No newline at end of file diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/working_helper.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/working_helper.js deleted file mode 100644 index c800ea8d655cc6e0930730caf32dc3ee3ecd6871..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/working_helper.js +++ /dev/null @@ -1,106 +0,0 @@ -describe("Working time helper", function () { - var helper; - var defHours; - var workingDays; - var events; - var iso = "YYYY-MM-DD"; - - beforeAll(function () { - helper = gantt._working_time_helper; - defHours = helper.defHours; - helper.defHours = 8; - workingDays = helper.days; - helper.days = {0: false, 1: true, 2: true, 3: true, 4: true, 5: true, 6: false}; - events = helper.dates; - helper.dates = []; - }); - afterAll(function () { - helper.defHours = defHours; - helper.days = workingDays; - helper.dates = events; - }); - beforeEach(function () { - helper._cache = {}; - }); - - it("should mark 29.6.2016 as weekend", function () { - expect(helper.is_weekend(moment("2016-05-29"))).toBe(true); - }); - it("should mark 30.6.2016 as non-weekend", function () { - expect(helper.is_weekend(moment("2016-05-30"))).toBe(false); - }); - it("should return 8h for working day", function () { - expect(helper.get_working_hours(moment("2016-06-03"))).toBe(8); - }); - it("should return 0h for weekend", function () { - expect(helper.get_working_hours(moment("2016-06-04"))).toBe(0); - }); - describe("date ranges", function () { - var start = moment("2016-06-01"); - var end = moment("2016-06-30"); - it("should return 21d for June", function () { - expect(helper.get_work_units_between(start, end, "day")).toBe(21); - }); - it("should return 168h for June", function () { - expect(helper.get_work_units_between(start, end, "hour")).toBe(168); - }); - }); - describe("date ranges with _end", function () { - var start = moment("2016-06-01"); - var end = moment("2016-06-30"); - end._isEndDate = true; - it("should return 22d for June", function () { - expect(helper.get_work_units_between(start, end, "day")).toBe(22); - }); - it("should return 176h for June", function () { - expect(helper.get_work_units_between(start, end, "hour")).toBe(176); - }); - }); - describe("inverted date ranges with _end", function () { - var start = moment("2016-07-15"); - var end = moment("2016-06-30"); - end._isEndDate = true; - it("should return -10d for half July", function () { - expect(helper.get_work_units_between(start, end, "day")).toBe(-10); - }); - it("should return -80h for half July", function () { - expect(helper.get_work_units_between(start, end, "hour")).toBe(-80); - }); - }); - describe("float date ranges with _end", function () { - var start = moment("2016-06-01").add(8, "hours"); - var end = moment("2016-06-30").add(8, "hours"); - end._isEndDate = true; - it("should return 22d for June", function () { - expect(helper.get_work_units_between(start, end, "day")).toBe(22); - }); - it("should return 176h for June", function () { - expect(helper.get_work_units_between(start, end, "hour")).toBe(176); - }); - }); - describe("float date ranges on weekend", function () { - var start = moment("2016-05-22").add(6, "hours"); - var end = moment("2016-05-30").add(6, "hours"); - it("should return 5.25d", function () { - expect(helper.get_work_units_between(start, end, "day")).toBe(5.25); - }); - it("should return 42h", function () { - expect(helper.get_work_units_between(start, end, "hour")).toBe(42); - }); - }); - describe("get_closest_worktime", function () { - it("should return Monday from middle of Saturday", function () { - var start_date = moment("2017-03-25 06:00"); - var end_date = gantt._working_time_helper.get_closest_worktime({date: start_date, unit: "day", dir: "future"}); - var compareDate = moment("2017-03-27 00:00"); - expect(end_date.toISOString()).toBe(compareDate.toISOString()); - }); - it("should return same from middle of Friday", function () { - var start_date = moment("2017-03-24 06:00"); - var end_date = gantt._working_time_helper.get_closest_worktime({date: start_date, unit: "day", dir: "future"}); - var compareDate = moment("2017-03-24 06:00"); - expect(end_date.toISOString()).toBe(compareDate.toISOString()); - }); - }); - -}); diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/working_helper_add.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/working_helper_add.js deleted file mode 100644 index fdcba57939aceae981847ad2ed9a0ecc779680aa..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/jasmine/working_helper_add.js +++ /dev/null @@ -1,91 +0,0 @@ -describe("Working time helper", function () { - var helper; - var defHours; - var workingDays; - var events; - var iso = "YYYY-MM-DD"; - - beforeAll(function () { - helper = gantt._working_time_helper; - defHours = helper.defHours; - helper.defHours = 8; - workingDays = helper.days; - helper.days = {0: false, 1: true, 2: true, 3: true, 4: true, 5: true, 6: false}; - events = helper.dates; - helper.dates = []; - }); - afterAll(function () { - helper.defHours = defHours; - helper.days = workingDays; - helper.dates = events; - }); - beforeEach(function () { - helper._cache = {}; - }); - - describe("addWorkingTime()", function () { - var start = moment("2016-05-20"); - var start2 = moment(start); - start2._isEndDate = true; - it("should return 2016-05-24 after adding 2 days", function () { - expect(helper.add_worktime(start, 2, "day", false).format(iso)).toBe("2016-05-24"); - }); - it("should return 2016-05-23 after adding 2 days with _end", function () { - expect(helper.add_worktime(start, 2, "day", true).format(iso)).toBe("2016-05-23"); - }); - it("should return 2016-05-13 after subtracting 5 days", function () { - expect(helper.add_worktime(start, -5, "day", false).format(iso)).toBe("2016-05-13"); - }); - it("should return 2016-05-12 after subtracting 5 days", function () { - expect(helper.add_worktime(start, -5, "day", true).format(iso)).toBe("2016-05-12"); - }); - it("should return 2016-05-25 after adding 2 days with start._end", function () { - expect(helper.add_worktime(start2, 2, "day", false).format(iso)).toBe("2016-05-25"); - }); - it("should return 2016-05-16 after subtracting 5 days with start._end", function () { - expect(helper.add_worktime(start2, -5, "day", false).format(iso)).toBe("2016-05-16"); - }); - it("should return 2016-05-24+12 after adding 2 days", function () { - var start12 = moment(start).add(12, "hours"); - expect(helper.add_worktime(start12, 2, "day", false).format()).toBe("2016-05-24T12:00:00+02:00"); - }); - it("should return 2017-04-05 23:00 after subtracting 2 days (end)", function () { - var end_date = moment("2017-04-06 23:00"); - end_date._isEndDate = true; - var start_date = gantt._working_time_helper.add_worktime(end_date, -2, "day", false); - var compareDate = moment("2017-04-05 23:00"); - expect(start_date.toISOString()).toBe(compareDate.toISOString()); - }); - it("should return 2017-03-30 23:00 after subtracting 2 days (end)", function () { - var end_date = moment("2017-04-02 23:00"); - end_date._isEndDate = true; - var start_date = gantt._working_time_helper.add_worktime(end_date, -2, "day", false); - var compareDate = moment("2017-03-30 23:00"); - expect(start_date.toISOString()).toBe(compareDate.toISOString()); - }); - it("should return", function () { - var start_date = moment("2017-04-05 23:00"); - var end_date = gantt._working_time_helper.add_worktime(start_date, 2, "day", true); - var compareDate = moment("2017-04-06 23:00"); - expect(end_date.toISOString()).toBe(compareDate.toISOString()); - }); - it("should return", function () { - var start_date = moment("2017-03-30 23:00"); - var end_date = gantt._working_time_helper.add_worktime(start_date, 2, "day", true); - var compareDate = moment("2017-04-02 23:00"); - expect(end_date.toISOString()).toBe(compareDate.toISOString()); - }); - it("should return same date in middle of Friday", function () { - var start_date = moment("2017-03-24 06:00"); - var end_date = gantt._working_time_helper.add_worktime(start_date, -0, "day", false); - var compareDate = moment("2017-03-24 06:00"); - expect(end_date.toISOString()).toBe(compareDate.toISOString()); - }); - it("should return Monday in middle of Saturday", function () { - var start_date = moment("2017-03-25 06:00"); - var end_date = gantt._working_time_helper.add_worktime(start_date, -0, "day", false); - var compareDate = moment("2017-03-27 00:00"); - expect(end_date.toISOString()).toBe(compareDate.toISOString()); - }); - }); -}); diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/left_grid.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/left_grid.js deleted file mode 100644 index 0d749b5bfb1f0f2f0c31fc98f4eedc7eaecfe47d..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/left_grid.js +++ /dev/null @@ -1,329 +0,0 @@ -/* left_grid.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.view = ysy.view || {}; -ysy.view.leftGrid = ysy.view.leftGrid || {}; -$.extend(ysy.view.leftGrid, { - columnsWidth: { - id: 60, - subject: 200, - name: 200, - project: 140, - other: 70, - updated_on: 85, - assigned_to: 100, - grid_width: 400 - }, - patch: function () { - ysy.data.limits.columnsWidth = $.extend({}, this.columnsWidth); - ysy.view.columnBuilders = ysy.view.columnBuilders || {}; - $.extend(ysy.view.columnBuilders, { - id: function (obj) { - if (obj.id > 1000000000000) return ''; - var path = ysy.settings.paths.rootPath + "issues/"; - return "<a href='" + path + obj.id + "' title='" + obj.text + "' target='_blank'>#" + obj.id + "</a>"; - }, - updated_on: function (obj) { - if (!obj.columns)return ""; - var value = obj.columns.updated_on; - if (value) { - return moment.utc(value, 'YYYY-MM-DD HH:mm:ss ZZ').fromNow(); - } else { - return ""; - } - }, - done_ratio: function (obj) { - if (!obj.columns)return ""; - //return '<span class="multieditable">'+Math.round(obj.progress*10)*10+'</span>'; - return '<span >' + Math.round(obj.progress * 10) * 10 + '</span>'; - }, - estimated_hours: function (obj) { - if (!obj.columns)return ""; - return '<span >' + obj.estimated + '</span>'; - }, - subject: function (obj) { - var id = parseInt(obj.real_id); - if (isNaN(id) || id > 1000000000000) return obj.text; - var path = ysy.settings.paths.rootPath + "issues/"; - if (obj.type === "milestone") { - path = ysy.settings.paths.rootPath + "versions/" - } else if (obj.type === "project") { - path = ysy.settings.paths.rootPath + "projects/" - } else if (obj.type === "assignee") { - if (obj.subtype === "group") { - path = ysy.settings.paths.rootPath + "groups/" - } else { - path = ysy.settings.paths.rootPath + "users/" - } - } - return "<a href='" + path + id + "' title='" + obj.text + "' target='_blank'>" + obj.text + "</a>"; - }, - _default: function (col) { - return function (obj) { - if (!obj.columns) return ""; - return obj.columns[col.name] || ""; - }; - } - - }); - gantt._render_grid_superitem = function (item) { - var subjectColumn = ysy.view.columnBuilders.subject; - - var tree = ""; - for (var j = 0; j < item.$level; j++) - tree += this.templates.grid_indent(item); - var has_child = this._has_children(item.id); - if (has_child) { - tree += this.templates.grid_open(item); - tree += this.templates.grid_folder(item); - } else { - tree += this.templates.grid_blank(item); - tree += this.templates.grid_file(item); - } - var afterText = this.templates.superitem_after_text(item, has_child); - - var odd = item.$index % 2 === 0; - var style = "";//"width:" + (col.width - (last ? 1 : 0)) + "px;"; - var cell = "<div class='gantt_grid_superitem' style='" + style + "'>" + tree + subjectColumn(item) + afterText + "</div>"; - - var css = odd ? " odd" : ""; - if (this.templates.grid_row_class) { - var css_template = this.templates.grid_row_class.call(this, item.start_date, item.end_date, item); - if (css_template) - css += " " + css_template; - } - - if (this.getState().selected_task == item.id) { - css += " gantt_selected"; - } - var el = document.createElement("div"); - el.className = "gantt_row" + css; - //el.setAttribute("data-url","/issues/"+item.id+".json"); // HOSEK - el.style.height = this.config.row_height + "px"; - el.style.lineHeight = (gantt.config.row_height) + "px"; - el.setAttribute(this.config.task_attribute, item.id); - el.innerHTML = cell; - return el; - }; - $.extend(gantt.templates, { - grid_open:function(item) { - return "<div class='gantt_tree_icon gantt_" + (item.$open ? "close" : "open") + " easy-gantt__icon easy-gantt__icon--" + (item.$open ? "close" : "open") + "'></div>"; - }, - grid_folder: function (item) { - /// = HAS CHILDREN - if (this["grid_bullet_" + gantt._get_safe_type(item.type)]) { - return this["grid_bullet_" + gantt._get_safe_type(item.type)](item, true); - } - // default fallback - if (item.$open || gantt._get_safe_type(item.type) !== gantt.config.types.task) { - return "<div class='gantt_tree_icon gantt_folder_" + (item.$open ? "open" : "closed") + "'></div>"; - } else { - return "<div class='gantt_tree_icon'><div class='gantt_drag_handle gantt_subtask_arrow'></div></div>"; - } - }, - grid_file: function (item) { - // = HAS NO CHILDREN - if (this["grid_bullet_" + gantt._get_safe_type(item.type)]) { - return this["grid_bullet_" + gantt._get_safe_type(item.type)](item, false); - } - // default fallback - if (gantt._get_safe_type(item.type) === gantt.config.types.task) - return "<div class='gantt_tree_icon'><div class='gantt_drag_handle gantt_subtask_arrow'></div></div>"; - return "<div class='gantt_tree_icon gantt_folder_open'></div>"; - }, - grid_bullet_milestone: function (item, has_children) { - var rearrangable = false; - return "<div class='gantt_tree_icon " + (rearrangable ? "gantt_drag_handle" : "") + "'>" + - "<div class='gantt-milestone-icon gantt-grid-milestone-bullet" + (rearrangable ? " gantt-bullet-hover-hide" : "") + "'></div></div>"; - }, - grid_bullet_project: function (item, has_children) { - if (item.$open || !has_children) { - return "<div class='gantt_tree_icon gantt_folder_open'></div>"; - } else { - return "<div class='gantt_tree_icon gantt_folder_closed'></div>"; - } - }, - grid_bullet_task: function (item, has_children) { - if (has_children) { - return "<div class='gantt_tree_icon gantt_drag_handle gantt_folder_" + (item.$open ? "open" : "closed") + "'></div>"; - } else { - return "<div class='gantt_tree_icon'><div class='gantt_drag_handle gantt_subtask_arrow'></div></div>"; - } - }, - superitem_after_text: function (item, has_children) { - if (this["superitem_after_" + gantt._get_safe_type(item.type)]) { - return this["superitem_after_" + gantt._get_safe_type(item.type)](item, has_children); - } - return ""; - } - }); - gantt._render_grid_header = function () { - var columns = this.getGridColumns(); - var cells = []; - var width = 0, - labels = this.locale.labels; - - var lineHeigth = this.config.scale_height - 2; - var resizes = []; - - for (var i = 0; i < columns.length; i++) { - var last = i === columns.length - 1; - var col = columns[i]; - if (last && this._get_grid_width() > width + col.width) - col.width = this._get_grid_width() - width; - width += col.width; - var sort = (this._sort && col.name === this._sort.name) ? ("<div class='gantt_sort gantt_" + this._sort.direction + "'></div>") : ""; - if (col.tree) { - if (!this._sort) sort = '<div class="gantt_sort gantt_none"></div>'; - if (ysy.pro.collapsor) { - sort += ysy.pro.collapsor.templateHtml; - } - } - var cssClass = ["gantt_grid_head_cell", - ("gantt_grid_head_" + col.name), - (last ? "gantt_last_cell" : ""), - this.templates.grid_header_class(col.name, col)].join(" "); - - var style = "width:" + (col.width - (last ? 1 : 0)) + "px;"; - var label = (col.label || labels["column_" + col.name]); - label = label || ""; - var cell = "<div class='" + cssClass + "' style='" + style + "' column_id='" + col.name + "'><div class='gantt-grid-header-multi'>" + label + sort + "</div></div>"; - if (!last) { - resizes.push("<div style='left:" + (width - 6) + "px' class='gantt_grid_column_resize_wrap' data-column_id='" + col.name + "'></div>"); - } - cells.push(cell); - //var resize='<div style="height:100%;background-color:red;width:10px;cursor: col-resize;position: absolute;left:'+(width-5)+'px;z-index:1"></div>'; - /*var resize = '<div class="gantt_grid_column_resize_wrap" style="height:100%;left:' + (width - 7) + 'px;z-index:1" column-index="' + i + '">\ - <div class="gantt_grid_column_resize"></div></div>'; - resizes.push(resize);*/ - } - //var resize = '<div class="gantt_grid_column_resize_wrap" style="height:100%;left:' + (this._get_grid_width() - 10) + 'px;z-index:1" >\ - //<div class="gantt_grid_column_resize"></div></div>'; - this.$grid_resize.style.left = (this._get_grid_width() - 6) + "px"; - this.$grid_scale.style.height = (this.config.scale_height - 1) + "px"; - this.$grid_scale.style.lineHeight = lineHeigth + "px"; - this.$grid_scale.style.width = (width - 1) + "px"; - this.$grid_scale.style.position = "relative"; - this.$grid_scale.innerHTML = cells.join("") + resizes.join(""); - ysy.view.leftGrid.resizeTable(); - if (ysy.view.collapsors) { - ysy.view.collapsors.requestRepaint(); - } - //resizeColumns(); - }; - gantt._calc_grid_width = function () { - var i; - var columns = this.getGridColumns(); - var cols_width = 0; - var width = []; - - for (i = 0; i < columns.length; i++) { - var v = parseInt(columns[i].min_width, 10); - width[i] = v; - cols_width += v; - } - - var diff = this._get_grid_width() - cols_width; - if (this.config.autofit || diff > 0) { - var delta = Math.ceil(diff / (columns.length ? columns.length : 1)); - //var ratio=1+diff/(cols_width?cols_width:1); - for (i = 0; i < width.length; i++) { - columns[i].width = columns[i].min_width + delta;//*ratio; - } - } else { - for (i = 0; i < columns.length; i++) { - columns[i].width = columns[i].min_width; - } - //this.config.grid_width = cols_width; - } - }; - }, - constructColumns: function (columns) { - var dcolumns = []; - var columnBuilders = ysy.view.columnBuilders; - var getBuilder = function (col) { - if (columnBuilders[col.name]) { - return columnBuilders[col.name]; - } else if (columnBuilders[col.name + "Builder"]) { - return columnBuilders[col.name + "Builder"](col); - } - else return columnBuilders._default(col); - }; - for (var i = 0; i < columns.length; i++) { - var col = columns[i]; - var isMainColumn = col.name === "subject" || col.name === "name"; - if (col.name === "id" && !ysy.settings.easyRedmine) continue; - var css = "gantt_grid_body_" + col.name; - if (col.name !== "") { - var width = ysy.data.limits.columnsWidth[col.name] || ysy.data.limits.columnsWidth["other"]; - var dcolumn = { - name: col.name, - label: col.title, - min_width: width, - width: width, - tree: isMainColumn, - align: isMainColumn ? "left" : "center", - template: getBuilder(col), - css: css - }; - if (isMainColumn) { - dcolumns.unshift(dcolumn); - } else { - dcolumns.push(dcolumn); - } - } - } - return dcolumns; - }, - resizeTable: function () { - var $resizes = $(".gantt_grid_column_resize_wrap:not(inited)"); - var colWidths = ysy.data.limits.columnsWidth; - var $gantt_grid = $(".gantt_grid"); - var $gantt_grid_data = $(".gantt_grid_data"); - var $gantt_grid_scale = $(".gantt_grid_scale"); - $resizes.each(function (index, el) { - var config = {}; - var $el = $(el); - var column = $el.data("column_id"); - var dhtmlxDrag = new dhtmlxDnD(el, config); - var minWidth, - realWidth, - resizePos, - gridWidth; - dhtmlxDrag.attachEvent("onDragStart", function () { - if (this.config.started) return; - minWidth = colWidths[column] || colWidths.other; - realWidth = $gantt_grid.find(".gantt_grid_head_" + column).width(); - gridWidth = $gantt_grid.width(); - resizePos = $el.offset(); - }); - dhtmlxDrag.attachEvent("onDragMove", function (target, event) { - //var diff=Math.floor(event.pageX-lastPos); - var diff = Math.floor(dhtmlxDrag.getDiff().x); - ysy.log.debug("moveDrag diff=" + diff + "px width=" + realWidth + "px", "grid_resize"); - - $gantt_grid.width(gridWidth + diff); - $gantt_grid_data.width(gridWidth + diff); - $gantt_grid_scale.width(gridWidth + diff); - $el.offset({top: resizePos.top, left: resizePos.left + diff}); - colWidths[column] = minWidth + diff; - var columns = gantt.config.columns; - if (index < columns.length - 1) { - gantt.config.columns[index].min_width = minWidth + diff; - gantt.config.columns[index].width = realWidth + diff + 1; - $gantt_grid.find(".gantt_grid_head_" + column + ", .gantt_grid_body_" + column).width(realWidth + diff + "px"); - } - gantt.config.grid_width = gridWidth + diff; - colWidths.grid_width = gridWidth + diff; - }); - dhtmlxDrag.attachEvent("onDragEnd", function (target, event) { - gantt.render(); - //gantt._render_grid(); - //var data = gantt._get_tasks_data(); - //gantt._gridRenderer.render_items(data); - //ysy.view.ganttTasks.requestRepaint(); - }); - }); - $resizes.addClass("inited"); - } -}); diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/libs/libs.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/libs/libs.js deleted file mode 100644 index 6663b378655f9f6ea0945d57b26761b7a4dd8f9d..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/libs/libs.js +++ /dev/null @@ -1,359 +0,0 @@ -// Mustache -(function (global, factory) { - if (typeof exports === "object" && exports) { - factory(exports) - } else if (typeof define === "function" && define.amd) { - define(["exports"], factory) - } else { - factory(global.Mustache = {}) - } -})(this, function (mustache) { - var Object_toString = Object.prototype.toString; - var isArray = Array.isArray || function (object) { - return Object_toString.call(object) === "[object Array]" - }; - - function isFunction(object) { - return typeof object === "function" - } - - function escapeRegExp(string) { - return string.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&") - } - - var RegExp_test = RegExp.prototype.test; - - function testRegExp(re, string) { - return RegExp_test.call(re, string) - } - - var nonSpaceRe = /\S/; - - function isWhitespace(string) { - return !testRegExp(nonSpaceRe, string) - } - - var entityMap = {"&": "&", "<": "<", ">": ">", '"': """, "'": "'", "/": "/"}; - - function escapeHtml(string) { - return String(string).replace(/[&<>"'\/]/g, function (s) { - return entityMap[s] - }) - } - - var whiteRe = /\s*/; - var spaceRe = /\s+/; - var equalsRe = /\s*=/; - var curlyRe = /\s*\}/; - var tagRe = /#|\^|\/|>|\{|&|=|!/; - - function parseTemplate(template, tags) { - if (!template)return []; - var sections = []; - var tokens = []; - var spaces = []; - var hasTag = false; - var nonSpace = false; - - function stripSpace() { - if (hasTag && !nonSpace) { - while (spaces.length)delete tokens[spaces.pop()] - } else { - spaces = [] - } - hasTag = false; - nonSpace = false - } - - var openingTagRe, closingTagRe, closingCurlyRe; - - function compileTags(tags) { - if (typeof tags === "string")tags = tags.split(spaceRe, 2); - if (!isArray(tags) || tags.length !== 2)throw new Error("Invalid tags: " + tags); - openingTagRe = new RegExp(escapeRegExp(tags[0]) + "\\s*"); - closingTagRe = new RegExp("\\s*" + escapeRegExp(tags[1])); - closingCurlyRe = new RegExp("\\s*" + escapeRegExp("}" + tags[1])) - } - - compileTags(tags || mustache.tags); - var scanner = new Scanner(template); - var start, type, value, chr, token, openSection; - while (!scanner.eos()) { - start = scanner.pos; - value = scanner.scanUntil(openingTagRe); - if (value) { - for (var i = 0, valueLength = value.length; i < valueLength; ++i) { - chr = value.charAt(i); - if (isWhitespace(chr)) { - spaces.push(tokens.length) - } else { - nonSpace = true - } - tokens.push(["text", chr, start, start + 1]); - start += 1; - if (chr === "\n")stripSpace() - } - } - if (!scanner.scan(openingTagRe))break; - hasTag = true; - type = scanner.scan(tagRe) || "name"; - scanner.scan(whiteRe); - if (type === "=") { - value = scanner.scanUntil(equalsRe); - scanner.scan(equalsRe); - scanner.scanUntil(closingTagRe) - } else if (type === "{") { - value = scanner.scanUntil(closingCurlyRe); - scanner.scan(curlyRe); - scanner.scanUntil(closingTagRe); - type = "&" - } else { - value = scanner.scanUntil(closingTagRe) - } - if (!scanner.scan(closingTagRe))throw new Error("Unclosed tag at " + scanner.pos); - token = [type, value, start, scanner.pos]; - tokens.push(token); - if (type === "#" || type === "^") { - sections.push(token) - } else if (type === "/") { - openSection = sections.pop(); - if (!openSection)throw new Error('Unopened section "' + value + '" at ' + start); - if (openSection[1] !== value)throw new Error('Unclosed section "' + openSection[1] + '" at ' + start) - } else if (type === "name" || type === "{" || type === "&") { - nonSpace = true - } else if (type === "=") { - compileTags(value) - } - } - openSection = sections.pop(); - if (openSection)throw new Error('Unclosed section "' + openSection[1] + '" at ' + scanner.pos); - return nestTokens(squashTokens(tokens)) - } - - function squashTokens(tokens) { - var squashedTokens = []; - var token, lastToken; - for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) { - token = tokens[i]; - if (token) { - if (token[0] === "text" && lastToken && lastToken[0] === "text") { - lastToken[1] += token[1]; - lastToken[3] = token[3] - } else { - squashedTokens.push(token); - lastToken = token - } - } - } - return squashedTokens - } - - function nestTokens(tokens) { - var nestedTokens = []; - var collector = nestedTokens; - var sections = []; - var token, section; - for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) { - token = tokens[i]; - switch (token[0]) { - case"#": - case"^": - collector.push(token); - sections.push(token); - collector = token[4] = []; - break; - case"/": - section = sections.pop(); - section[5] = token[2]; - collector = sections.length > 0 ? sections[sections.length - 1][4] : nestedTokens; - break; - default: - collector.push(token) - } - } - return nestedTokens - } - - function Scanner(string) { - this.string = string; - this.tail = string; - this.pos = 0 - } - - Scanner.prototype.eos = function () { - return this.tail === "" - }; - Scanner.prototype.scan = function (re) { - var match = this.tail.match(re); - if (!match || match.index !== 0)return ""; - var string = match[0]; - this.tail = this.tail.substring(string.length); - this.pos += string.length; - return string - }; - Scanner.prototype.scanUntil = function (re) { - var index = this.tail.search(re), match; - switch (index) { - case-1: - match = this.tail; - this.tail = ""; - break; - case 0: - match = ""; - break; - default: - match = this.tail.substring(0, index); - this.tail = this.tail.substring(index) - } - this.pos += match.length; - return match - }; - function Context(view, parentContext) { - this.view = view; - this.cache = {".": this.view}; - this.parent = parentContext - } - - Context.prototype.push = function (view) { - return new Context(view, this) - }; - Context.prototype.lookup = function (name) { - var cache = this.cache; - var value; - if (name in cache) { - value = cache[name] - } else { - var context = this, names, index, lookupHit = false; - while (context) { - if (name.indexOf(".") > 0) { - value = context.view; - names = name.split("."); - index = 0; - while (value != null && index < names.length) { - if (index === names.length - 1 && value != null)lookupHit = typeof value === "object" && value.hasOwnProperty(names[index]); - value = value[names[index++]] - } - } else if (context.view != null && typeof context.view === "object") { - value = context.view[name]; - lookupHit = context.view.hasOwnProperty(name) - } - if (lookupHit)break; - context = context.parent - } - cache[name] = value - } - if (isFunction(value))value = value.call(this.view); - return value - }; - function Writer() { - this.cache = {} - } - - Writer.prototype.clearCache = function () { - this.cache = {} - }; - Writer.prototype.parse = function (template, tags) { - var cache = this.cache; - var tokens = cache[template]; - if (tokens == null)tokens = cache[template] = parseTemplate(template, tags); - return tokens - }; - Writer.prototype.render = function (template, view, partials) { - var tokens = this.parse(template); - var context = view instanceof Context ? view : new Context(view); - return this.renderTokens(tokens, context, partials, template) - }; - Writer.prototype.renderTokens = function (tokens, context, partials, originalTemplate) { - var buffer = ""; - var token, symbol, value; - for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) { - value = undefined; - token = tokens[i]; - symbol = token[0]; - if (symbol === "#")value = this._renderSection(token, context, partials, originalTemplate); else if (symbol === "^")value = this._renderInverted(token, context, partials, originalTemplate); else if (symbol === ">")value = this._renderPartial(token, context, partials, originalTemplate); else if (symbol === "&")value = this._unescapedValue(token, context); else if (symbol === "name")value = this._escapedValue(token, context); else if (symbol === "text")value = this._rawValue(token); - if (value !== undefined)buffer += value - } - return buffer - }; - Writer.prototype._renderSection = function (token, context, partials, originalTemplate) { - var self = this; - var buffer = ""; - var value = context.lookup(token[1]); - - function subRender(template) { - return self.render(template, context, partials) - } - - if (!value)return; - if (isArray(value)) { - for (var j = 0, valueLength = value.length; j < valueLength; ++j) { - buffer += this.renderTokens(token[4], context.push(value[j]), partials, originalTemplate) - } - } else if (typeof value === "object" || typeof value === "string" || typeof value === "number") { - buffer += this.renderTokens(token[4], context.push(value), partials, originalTemplate) - } else if (isFunction(value)) { - if (typeof originalTemplate !== "string")throw new Error("Cannot use higher-order sections without the original template"); - value = value.call(context.view, originalTemplate.slice(token[3], token[5]), subRender); - if (value != null)buffer += value - } else { - buffer += this.renderTokens(token[4], context, partials, originalTemplate) - } - return buffer - }; - Writer.prototype._renderInverted = function (token, context, partials, originalTemplate) { - var value = context.lookup(token[1]); - if (!value || isArray(value) && value.length === 0)return this.renderTokens(token[4], context, partials, originalTemplate) - }; - Writer.prototype._renderPartial = function (token, context, partials) { - if (!partials)return; - var value = isFunction(partials) ? partials(token[1]) : partials[token[1]]; - if (value != null)return this.renderTokens(this.parse(value), context, partials, value) - }; - Writer.prototype._unescapedValue = function (token, context) { - var value = context.lookup(token[1]); - if (value != null)return value - }; - Writer.prototype._escapedValue = function (token, context) { - var value = context.lookup(token[1]); - if (value != null)return mustache.escape(value) - }; - Writer.prototype._rawValue = function (token) { - return token[1] - }; - mustache.name = "mustache.js"; - mustache.version = "2.0.0"; - mustache.tags = ["{{", "}}"]; - var defaultWriter = new Writer; - mustache.clearCache = function () { - return defaultWriter.clearCache() - }; - mustache.parse = function (template, tags) { - return defaultWriter.parse(template, tags) - }; - mustache.render = function (template, view, partials) { - return defaultWriter.render(template, view, partials) - }; - mustache.to_html = function (template, view, partials, send) { - var result = mustache.render(template, view, partials); - if (isFunction(send)) { - send(result) - } else { - return result - } - }; - mustache.escape = escapeHtml; - mustache.Scanner = Scanner; - mustache.Context = Context; - mustache.Writer = Writer -}); - - -// RAF compatibility -window.requestAnimFrame = (function () { - return window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - function (callback) { - window.setTimeout(callback, 1000 / 60); - }; -})(); \ No newline at end of file diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/libs/moment.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/libs/moment.js deleted file mode 100644 index e606ed7c8442d30c5856b6c08da39f5db3807447..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/libs/moment.js +++ /dev/null @@ -1,12915 +0,0 @@ -//! moment.js -//! version : 2.17.1 -//! authors : Tim Wood, Iskren Chernev, Moment.js contributors -//! license : MIT -//! momentjs.com -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - global.moment = factory() -}(this, (function () { 'use strict'; - -var hookCallback; - -function hooks () { - return hookCallback.apply(null, arguments); -} - -// This is done to register the method called with moment() -// without creating circular dependencies. -function setHookCallback (callback) { - hookCallback = callback; -} - -function isArray(input) { - return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; -} - -function isObject(input) { - // IE8 will treat undefined and null as object if it wasn't for - // input != null - return input != null && Object.prototype.toString.call(input) === '[object Object]'; -} - -function isObjectEmpty(obj) { - var k; - for (k in obj) { - // even if its not own property I'd still call it non-empty - return false; - } - return true; -} - -function isNumber(input) { - return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; -} - -function isDate(input) { - return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; -} - -function map(arr, fn) { - var res = [], i; - for (i = 0; i < arr.length; ++i) { - res.push(fn(arr[i], i)); - } - return res; -} - -function hasOwnProp(a, b) { - return Object.prototype.hasOwnProperty.call(a, b); -} - -function extend(a, b) { - for (var i in b) { - if (hasOwnProp(b, i)) { - a[i] = b[i]; - } - } - - if (hasOwnProp(b, 'toString')) { - a.toString = b.toString; - } - - if (hasOwnProp(b, 'valueOf')) { - a.valueOf = b.valueOf; - } - - return a; -} - -function createUTC (input, format, locale, strict) { - return createLocalOrUTC(input, format, locale, strict, true).utc(); -} - -function defaultParsingFlags() { - // We need to deep clone this object. - return { - empty : false, - unusedTokens : [], - unusedInput : [], - overflow : -2, - charsLeftOver : 0, - nullInput : false, - invalidMonth : null, - invalidFormat : false, - userInvalidated : false, - iso : false, - parsedDateParts : [], - meridiem : null - }; -} - -function getParsingFlags(m) { - if (m._pf == null) { - m._pf = defaultParsingFlags(); - } - return m._pf; -} - -var some; -if (Array.prototype.some) { - some = Array.prototype.some; -} else { - some = function (fun) { - var t = Object(this); - var len = t.length >>> 0; - - for (var i = 0; i < len; i++) { - if (i in t && fun.call(this, t[i], i, t)) { - return true; - } - } - - return false; - }; -} - -var some$1 = some; - -function isValid(m) { - if (m._isValid == null) { - var flags = getParsingFlags(m); - var parsedParts = some$1.call(flags.parsedDateParts, function (i) { - return i != null; - }); - var isNowValid = !isNaN(m._d.getTime()) && - flags.overflow < 0 && - !flags.empty && - !flags.invalidMonth && - !flags.invalidWeekday && - !flags.nullInput && - !flags.invalidFormat && - !flags.userInvalidated && - (!flags.meridiem || (flags.meridiem && parsedParts)); - - if (m._strict) { - isNowValid = isNowValid && - flags.charsLeftOver === 0 && - flags.unusedTokens.length === 0 && - flags.bigHour === undefined; - } - - if (Object.isFrozen == null || !Object.isFrozen(m)) { - m._isValid = isNowValid; - } - else { - return isNowValid; - } - } - return m._isValid; -} - -function createInvalid (flags) { - var m = createUTC(NaN); - if (flags != null) { - extend(getParsingFlags(m), flags); - } - else { - getParsingFlags(m).userInvalidated = true; - } - - return m; -} - -function isUndefined(input) { - return input === void 0; -} - -// Plugins that add properties should also add the key here (null value), -// so we can properly clone ourselves. -var momentProperties = hooks.momentProperties = []; - -function copyConfig(to, from) { - var i, prop, val; - - if (!isUndefined(from._isAMomentObject)) { - to._isAMomentObject = from._isAMomentObject; - } - if (!isUndefined(from._i)) { - to._i = from._i; - } - if (!isUndefined(from._f)) { - to._f = from._f; - } - if (!isUndefined(from._l)) { - to._l = from._l; - } - if (!isUndefined(from._strict)) { - to._strict = from._strict; - } - if (!isUndefined(from._tzm)) { - to._tzm = from._tzm; - } - if (!isUndefined(from._isUTC)) { - to._isUTC = from._isUTC; - } - if (!isUndefined(from._offset)) { - to._offset = from._offset; - } - if (!isUndefined(from._pf)) { - to._pf = getParsingFlags(from); - } - if (!isUndefined(from._locale)) { - to._locale = from._locale; - } - - if (momentProperties.length > 0) { - for (i in momentProperties) { - prop = momentProperties[i]; - val = from[prop]; - if (!isUndefined(val)) { - to[prop] = val; - } - } - } - - return to; -} - -var updateInProgress = false; - -// Moment prototype object -function Moment(config) { - copyConfig(this, config); - this._d = new Date(config._d != null ? config._d.getTime() : NaN); - if (!this.isValid()) { - this._d = new Date(NaN); - } - // Prevent infinite loop in case updateOffset creates new moment - // objects. - if (updateInProgress === false) { - updateInProgress = true; - hooks.updateOffset(this); - updateInProgress = false; - } -} - -function isMoment (obj) { - return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); -} - -function absFloor (number) { - if (number < 0) { - // -0 -> 0 - return Math.ceil(number) || 0; - } else { - return Math.floor(number); - } -} - -function toInt(argumentForCoercion) { - var coercedNumber = +argumentForCoercion, - value = 0; - - if (coercedNumber !== 0 && isFinite(coercedNumber)) { - value = absFloor(coercedNumber); - } - - return value; -} - -// compare two arrays, return the number of differences -function compareArrays(array1, array2, dontConvert) { - var len = Math.min(array1.length, array2.length), - lengthDiff = Math.abs(array1.length - array2.length), - diffs = 0, - i; - for (i = 0; i < len; i++) { - if ((dontConvert && array1[i] !== array2[i]) || - (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { - diffs++; - } - } - return diffs + lengthDiff; -} - -function warn(msg) { - if (hooks.suppressDeprecationWarnings === false && - (typeof console !== 'undefined') && console.warn) { - console.warn('Deprecation warning: ' + msg); - } -} - -function deprecate(msg, fn) { - var firstTime = true; - - return extend(function () { - if (hooks.deprecationHandler != null) { - hooks.deprecationHandler(null, msg); - } - if (firstTime) { - var args = []; - var arg; - for (var i = 0; i < arguments.length; i++) { - arg = ''; - if (typeof arguments[i] === 'object') { - arg += '\n[' + i + '] '; - for (var key in arguments[0]) { - arg += key + ': ' + arguments[0][key] + ', '; - } - arg = arg.slice(0, -2); // Remove trailing comma and space - } else { - arg = arguments[i]; - } - args.push(arg); - } - warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); - firstTime = false; - } - return fn.apply(this, arguments); - }, fn); -} - -var deprecations = {}; - -function deprecateSimple(name, msg) { - if (hooks.deprecationHandler != null) { - hooks.deprecationHandler(name, msg); - } - if (!deprecations[name]) { - warn(msg); - deprecations[name] = true; - } -} - -hooks.suppressDeprecationWarnings = false; -hooks.deprecationHandler = null; - -function isFunction(input) { - return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; -} - -function set (config) { - var prop, i; - for (i in config) { - prop = config[i]; - if (isFunction(prop)) { - this[i] = prop; - } else { - this['_' + i] = prop; - } - } - this._config = config; - // Lenient ordinal parsing accepts just a number in addition to - // number + (possibly) stuff coming from _ordinalParseLenient. - this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\d{1,2}/).source); -} - -function mergeConfigs(parentConfig, childConfig) { - var res = extend({}, parentConfig), prop; - for (prop in childConfig) { - if (hasOwnProp(childConfig, prop)) { - if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { - res[prop] = {}; - extend(res[prop], parentConfig[prop]); - extend(res[prop], childConfig[prop]); - } else if (childConfig[prop] != null) { - res[prop] = childConfig[prop]; - } else { - delete res[prop]; - } - } - } - for (prop in parentConfig) { - if (hasOwnProp(parentConfig, prop) && - !hasOwnProp(childConfig, prop) && - isObject(parentConfig[prop])) { - // make sure changes to properties don't modify parent config - res[prop] = extend({}, res[prop]); - } - } - return res; -} - -function Locale(config) { - if (config != null) { - this.set(config); - } -} - -var keys; - -if (Object.keys) { - keys = Object.keys; -} else { - keys = function (obj) { - var i, res = []; - for (i in obj) { - if (hasOwnProp(obj, i)) { - res.push(i); - } - } - return res; - }; -} - -var keys$1 = keys; - -var defaultCalendar = { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' -}; - -function calendar (key, mom, now) { - var output = this._calendar[key] || this._calendar['sameElse']; - return isFunction(output) ? output.call(mom, now) : output; -} - -var defaultLongDateFormat = { - LTS : 'h:mm:ss A', - LT : 'h:mm A', - L : 'MM/DD/YYYY', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY h:mm A', - LLLL : 'dddd, MMMM D, YYYY h:mm A' -}; - -function longDateFormat (key) { - var format = this._longDateFormat[key], - formatUpper = this._longDateFormat[key.toUpperCase()]; - - if (format || !formatUpper) { - return format; - } - - this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { - return val.slice(1); - }); - - return this._longDateFormat[key]; -} - -var defaultInvalidDate = 'Invalid date'; - -function invalidDate () { - return this._invalidDate; -} - -var defaultOrdinal = '%d'; -var defaultOrdinalParse = /\d{1,2}/; - -function ordinal (number) { - return this._ordinal.replace('%d', number); -} - -var defaultRelativeTime = { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' -}; - -function relativeTime (number, withoutSuffix, string, isFuture) { - var output = this._relativeTime[string]; - return (isFunction(output)) ? - output(number, withoutSuffix, string, isFuture) : - output.replace(/%d/i, number); -} - -function pastFuture (diff, output) { - var format = this._relativeTime[diff > 0 ? 'future' : 'past']; - return isFunction(format) ? format(output) : format.replace(/%s/i, output); -} - -var aliases = {}; - -function addUnitAlias (unit, shorthand) { - var lowerCase = unit.toLowerCase(); - aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; -} - -function normalizeUnits(units) { - return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; -} - -function normalizeObjectUnits(inputObject) { - var normalizedInput = {}, - normalizedProp, - prop; - - for (prop in inputObject) { - if (hasOwnProp(inputObject, prop)) { - normalizedProp = normalizeUnits(prop); - if (normalizedProp) { - normalizedInput[normalizedProp] = inputObject[prop]; - } - } - } - - return normalizedInput; -} - -var priorities = {}; - -function addUnitPriority(unit, priority) { - priorities[unit] = priority; -} - -function getPrioritizedUnits(unitsObj) { - var units = []; - for (var u in unitsObj) { - units.push({unit: u, priority: priorities[u]}); - } - units.sort(function (a, b) { - return a.priority - b.priority; - }); - return units; -} - -function makeGetSet (unit, keepTime) { - return function (value) { - if (value != null) { - set$1(this, unit, value); - hooks.updateOffset(this, keepTime); - return this; - } else { - return get(this, unit); - } - }; -} - -function get (mom, unit) { - return mom.isValid() ? - mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; -} - -function set$1 (mom, unit, value) { - if (mom.isValid()) { - mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); - } -} - -// MOMENTS - -function stringGet (units) { - units = normalizeUnits(units); - if (isFunction(this[units])) { - return this[units](); - } - return this; -} - - -function stringSet (units, value) { - if (typeof units === 'object') { - units = normalizeObjectUnits(units); - var prioritized = getPrioritizedUnits(units); - for (var i = 0; i < prioritized.length; i++) { - this[prioritized[i].unit](units[prioritized[i].unit]); - } - } else { - units = normalizeUnits(units); - if (isFunction(this[units])) { - return this[units](value); - } - } - return this; -} - -function zeroFill(number, targetLength, forceSign) { - var absNumber = '' + Math.abs(number), - zerosToFill = targetLength - absNumber.length, - sign = number >= 0; - return (sign ? (forceSign ? '+' : '') : '-') + - Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; -} - -var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; - -var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; - -var formatFunctions = {}; - -var formatTokenFunctions = {}; - -// token: 'M' -// padded: ['MM', 2] -// ordinal: 'Mo' -// callback: function () { this.month() + 1 } -function addFormatToken (token, padded, ordinal, callback) { - var func = callback; - if (typeof callback === 'string') { - func = function () { - return this[callback](); - }; - } - if (token) { - formatTokenFunctions[token] = func; - } - if (padded) { - formatTokenFunctions[padded[0]] = function () { - return zeroFill(func.apply(this, arguments), padded[1], padded[2]); - }; - } - if (ordinal) { - formatTokenFunctions[ordinal] = function () { - return this.localeData().ordinal(func.apply(this, arguments), token); - }; - } -} - -function removeFormattingTokens(input) { - if (input.match(/\[[\s\S]/)) { - return input.replace(/^\[|\]$/g, ''); - } - return input.replace(/\\/g, ''); -} - -function makeFormatFunction(format) { - var array = format.match(formattingTokens), i, length; - - for (i = 0, length = array.length; i < length; i++) { - if (formatTokenFunctions[array[i]]) { - array[i] = formatTokenFunctions[array[i]]; - } else { - array[i] = removeFormattingTokens(array[i]); - } - } - - return function (mom) { - var output = '', i; - for (i = 0; i < length; i++) { - output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; - } - return output; - }; -} - -// format date using native date object -function formatMoment(m, format) { - if (!m.isValid()) { - return m.localeData().invalidDate(); - } - - format = expandFormat(format, m.localeData()); - formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); - - return formatFunctions[format](m); -} - -function expandFormat(format, locale) { - var i = 5; - - function replaceLongDateFormatTokens(input) { - return locale.longDateFormat(input) || input; - } - - localFormattingTokens.lastIndex = 0; - while (i >= 0 && localFormattingTokens.test(format)) { - format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); - localFormattingTokens.lastIndex = 0; - i -= 1; - } - - return format; -} - -var match1 = /\d/; // 0 - 9 -var match2 = /\d\d/; // 00 - 99 -var match3 = /\d{3}/; // 000 - 999 -var match4 = /\d{4}/; // 0000 - 9999 -var match6 = /[+-]?\d{6}/; // -999999 - 999999 -var match1to2 = /\d\d?/; // 0 - 99 -var match3to4 = /\d\d\d\d?/; // 999 - 9999 -var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 -var match1to3 = /\d{1,3}/; // 0 - 999 -var match1to4 = /\d{1,4}/; // 0 - 9999 -var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 - -var matchUnsigned = /\d+/; // 0 - inf -var matchSigned = /[+-]?\d+/; // -inf - inf - -var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z -var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z - -var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 - -// any word (or two) characters or numbers including two/three word month in arabic. -// includes scottish gaelic two word and hyphenated months -var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i; - - -var regexes = {}; - -function addRegexToken (token, regex, strictRegex) { - regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { - return (isStrict && strictRegex) ? strictRegex : regex; - }; -} - -function getParseRegexForToken (token, config) { - if (!hasOwnProp(regexes, token)) { - return new RegExp(unescapeFormat(token)); - } - - return regexes[token](config._strict, config._locale); -} - -// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript -function unescapeFormat(s) { - return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { - return p1 || p2 || p3 || p4; - })); -} - -function regexEscape(s) { - return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); -} - -var tokens = {}; - -function addParseToken (token, callback) { - var i, func = callback; - if (typeof token === 'string') { - token = [token]; - } - if (isNumber(callback)) { - func = function (input, array) { - array[callback] = toInt(input); - }; - } - for (i = 0; i < token.length; i++) { - tokens[token[i]] = func; - } -} - -function addWeekParseToken (token, callback) { - addParseToken(token, function (input, array, config, token) { - config._w = config._w || {}; - callback(input, config._w, config, token); - }); -} - -function addTimeToArrayFromToken(token, input, config) { - if (input != null && hasOwnProp(tokens, token)) { - tokens[token](input, config._a, config, token); - } -} - -var YEAR = 0; -var MONTH = 1; -var DATE = 2; -var HOUR = 3; -var MINUTE = 4; -var SECOND = 5; -var MILLISECOND = 6; -var WEEK = 7; -var WEEKDAY = 8; - -var indexOf; - -if (Array.prototype.indexOf) { - indexOf = Array.prototype.indexOf; -} else { - indexOf = function (o) { - // I know - var i; - for (i = 0; i < this.length; ++i) { - if (this[i] === o) { - return i; - } - } - return -1; - }; -} - -var indexOf$1 = indexOf; - -function daysInMonth(year, month) { - return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); -} - -// FORMATTING - -addFormatToken('M', ['MM', 2], 'Mo', function () { - return this.month() + 1; -}); - -addFormatToken('MMM', 0, 0, function (format) { - return this.localeData().monthsShort(this, format); -}); - -addFormatToken('MMMM', 0, 0, function (format) { - return this.localeData().months(this, format); -}); - -// ALIASES - -addUnitAlias('month', 'M'); - -// PRIORITY - -addUnitPriority('month', 8); - -// PARSING - -addRegexToken('M', match1to2); -addRegexToken('MM', match1to2, match2); -addRegexToken('MMM', function (isStrict, locale) { - return locale.monthsShortRegex(isStrict); -}); -addRegexToken('MMMM', function (isStrict, locale) { - return locale.monthsRegex(isStrict); -}); - -addParseToken(['M', 'MM'], function (input, array) { - array[MONTH] = toInt(input) - 1; -}); - -addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { - var month = config._locale.monthsParse(input, token, config._strict); - // if we didn't find a month name, mark the date as invalid. - if (month != null) { - array[MONTH] = month; - } else { - getParsingFlags(config).invalidMonth = input; - } -}); - -// LOCALES - -var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; -var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); -function localeMonths (m, format) { - if (!m) { - return this._months; - } - return isArray(this._months) ? this._months[m.month()] : - this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; -} - -var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); -function localeMonthsShort (m, format) { - if (!m) { - return this._monthsShort; - } - return isArray(this._monthsShort) ? this._monthsShort[m.month()] : - this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; -} - -function handleStrictParse(monthName, format, strict) { - var i, ii, mom, llc = monthName.toLocaleLowerCase(); - if (!this._monthsParse) { - // this is not used - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - for (i = 0; i < 12; ++i) { - mom = createUTC([2000, i]); - this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); - this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); - } - } - - if (strict) { - if (format === 'MMM') { - ii = indexOf$1.call(this._shortMonthsParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf$1.call(this._longMonthsParse, llc); - return ii !== -1 ? ii : null; - } - } else { - if (format === 'MMM') { - ii = indexOf$1.call(this._shortMonthsParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf$1.call(this._longMonthsParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf$1.call(this._longMonthsParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf$1.call(this._shortMonthsParse, llc); - return ii !== -1 ? ii : null; - } - } -} - -function localeMonthsParse (monthName, format, strict) { - var i, mom, regex; - - if (this._monthsParseExact) { - return handleStrictParse.call(this, monthName, format, strict); - } - - if (!this._monthsParse) { - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - } - - // TODO: add sorting - // Sorting makes sure if one month (or abbr) is a prefix of another - // see sorting in computeMonthsParse - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, i]); - if (strict && !this._longMonthsParse[i]) { - this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); - this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); - } - if (!strict && !this._monthsParse[i]) { - regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); - this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { - return i; - } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { - return i; - } else if (!strict && this._monthsParse[i].test(monthName)) { - return i; - } - } -} - -// MOMENTS - -function setMonth (mom, value) { - var dayOfMonth; - - if (!mom.isValid()) { - // No op - return mom; - } - - if (typeof value === 'string') { - if (/^\d+$/.test(value)) { - value = toInt(value); - } else { - value = mom.localeData().monthsParse(value); - // TODO: Another silent failure? - if (!isNumber(value)) { - return mom; - } - } - } - - dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); - mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); - return mom; -} - -function getSetMonth (value) { - if (value != null) { - setMonth(this, value); - hooks.updateOffset(this, true); - return this; - } else { - return get(this, 'Month'); - } -} - -function getDaysInMonth () { - return daysInMonth(this.year(), this.month()); -} - -var defaultMonthsShortRegex = matchWord; -function monthsShortRegex (isStrict) { - if (this._monthsParseExact) { - if (!hasOwnProp(this, '_monthsRegex')) { - computeMonthsParse.call(this); - } - if (isStrict) { - return this._monthsShortStrictRegex; - } else { - return this._monthsShortRegex; - } - } else { - if (!hasOwnProp(this, '_monthsShortRegex')) { - this._monthsShortRegex = defaultMonthsShortRegex; - } - return this._monthsShortStrictRegex && isStrict ? - this._monthsShortStrictRegex : this._monthsShortRegex; - } -} - -var defaultMonthsRegex = matchWord; -function monthsRegex (isStrict) { - if (this._monthsParseExact) { - if (!hasOwnProp(this, '_monthsRegex')) { - computeMonthsParse.call(this); - } - if (isStrict) { - return this._monthsStrictRegex; - } else { - return this._monthsRegex; - } - } else { - if (!hasOwnProp(this, '_monthsRegex')) { - this._monthsRegex = defaultMonthsRegex; - } - return this._monthsStrictRegex && isStrict ? - this._monthsStrictRegex : this._monthsRegex; - } -} - -function computeMonthsParse () { - function cmpLenRev(a, b) { - return b.length - a.length; - } - - var shortPieces = [], longPieces = [], mixedPieces = [], - i, mom; - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, i]); - shortPieces.push(this.monthsShort(mom, '')); - longPieces.push(this.months(mom, '')); - mixedPieces.push(this.months(mom, '')); - mixedPieces.push(this.monthsShort(mom, '')); - } - // Sorting makes sure if one month (or abbr) is a prefix of another it - // will match the longer piece. - shortPieces.sort(cmpLenRev); - longPieces.sort(cmpLenRev); - mixedPieces.sort(cmpLenRev); - for (i = 0; i < 12; i++) { - shortPieces[i] = regexEscape(shortPieces[i]); - longPieces[i] = regexEscape(longPieces[i]); - } - for (i = 0; i < 24; i++) { - mixedPieces[i] = regexEscape(mixedPieces[i]); - } - - this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._monthsShortRegex = this._monthsRegex; - this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); - this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); -} - -// FORMATTING - -addFormatToken('Y', 0, 0, function () { - var y = this.year(); - return y <= 9999 ? '' + y : '+' + y; -}); - -addFormatToken(0, ['YY', 2], 0, function () { - return this.year() % 100; -}); - -addFormatToken(0, ['YYYY', 4], 0, 'year'); -addFormatToken(0, ['YYYYY', 5], 0, 'year'); -addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); - -// ALIASES - -addUnitAlias('year', 'y'); - -// PRIORITIES - -addUnitPriority('year', 1); - -// PARSING - -addRegexToken('Y', matchSigned); -addRegexToken('YY', match1to2, match2); -addRegexToken('YYYY', match1to4, match4); -addRegexToken('YYYYY', match1to6, match6); -addRegexToken('YYYYYY', match1to6, match6); - -addParseToken(['YYYYY', 'YYYYYY'], YEAR); -addParseToken('YYYY', function (input, array) { - array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); -}); -addParseToken('YY', function (input, array) { - array[YEAR] = hooks.parseTwoDigitYear(input); -}); -addParseToken('Y', function (input, array) { - array[YEAR] = parseInt(input, 10); -}); - -// HELPERS - -function daysInYear(year) { - return isLeapYear(year) ? 366 : 365; -} - -function isLeapYear(year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; -} - -// HOOKS - -hooks.parseTwoDigitYear = function (input) { - return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); -}; - -// MOMENTS - -var getSetYear = makeGetSet('FullYear', true); - -function getIsLeapYear () { - return isLeapYear(this.year()); -} - -function createDate (y, m, d, h, M, s, ms) { - //can't just apply() to create a date: - //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply - var date = new Date(y, m, d, h, M, s, ms); - - //the date constructor remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { - date.setFullYear(y); - } - return date; -} - -function createUTCDate (y) { - var date = new Date(Date.UTC.apply(null, arguments)); - - //the Date.UTC function remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { - date.setUTCFullYear(y); - } - return date; -} - -// start-of-first-week - start-of-year -function firstWeekOffset(year, dow, doy) { - var // first-week day -- which january is always in the first week (4 for iso, 1 for other) - fwd = 7 + dow - doy, - // first-week day local weekday -- which local weekday is fwd - fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; - - return -fwdlw + fwd - 1; -} - -//http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday -function dayOfYearFromWeeks(year, week, weekday, dow, doy) { - var localWeekday = (7 + weekday - dow) % 7, - weekOffset = firstWeekOffset(year, dow, doy), - dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, - resYear, resDayOfYear; - - if (dayOfYear <= 0) { - resYear = year - 1; - resDayOfYear = daysInYear(resYear) + dayOfYear; - } else if (dayOfYear > daysInYear(year)) { - resYear = year + 1; - resDayOfYear = dayOfYear - daysInYear(year); - } else { - resYear = year; - resDayOfYear = dayOfYear; - } - - return { - year: resYear, - dayOfYear: resDayOfYear - }; -} - -function weekOfYear(mom, dow, doy) { - var weekOffset = firstWeekOffset(mom.year(), dow, doy), - week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, - resWeek, resYear; - - if (week < 1) { - resYear = mom.year() - 1; - resWeek = week + weeksInYear(resYear, dow, doy); - } else if (week > weeksInYear(mom.year(), dow, doy)) { - resWeek = week - weeksInYear(mom.year(), dow, doy); - resYear = mom.year() + 1; - } else { - resYear = mom.year(); - resWeek = week; - } - - return { - week: resWeek, - year: resYear - }; -} - -function weeksInYear(year, dow, doy) { - var weekOffset = firstWeekOffset(year, dow, doy), - weekOffsetNext = firstWeekOffset(year + 1, dow, doy); - return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; -} - -// FORMATTING - -addFormatToken('w', ['ww', 2], 'wo', 'week'); -addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); - -// ALIASES - -addUnitAlias('week', 'w'); -addUnitAlias('isoWeek', 'W'); - -// PRIORITIES - -addUnitPriority('week', 5); -addUnitPriority('isoWeek', 5); - -// PARSING - -addRegexToken('w', match1to2); -addRegexToken('ww', match1to2, match2); -addRegexToken('W', match1to2); -addRegexToken('WW', match1to2, match2); - -addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { - week[token.substr(0, 1)] = toInt(input); -}); - -// HELPERS - -// LOCALES - -function localeWeek (mom) { - return weekOfYear(mom, this._week.dow, this._week.doy).week; -} - -var defaultLocaleWeek = { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. -}; - -function localeFirstDayOfWeek () { - return this._week.dow; -} - -function localeFirstDayOfYear () { - return this._week.doy; -} - -// MOMENTS - -function getSetWeek (input) { - var week = this.localeData().week(this); - return input == null ? week : this.add((input - week) * 7, 'd'); -} - -function getSetISOWeek (input) { - var week = weekOfYear(this, 1, 4).week; - return input == null ? week : this.add((input - week) * 7, 'd'); -} - -// FORMATTING - -addFormatToken('d', 0, 'do', 'day'); - -addFormatToken('dd', 0, 0, function (format) { - return this.localeData().weekdaysMin(this, format); -}); - -addFormatToken('ddd', 0, 0, function (format) { - return this.localeData().weekdaysShort(this, format); -}); - -addFormatToken('dddd', 0, 0, function (format) { - return this.localeData().weekdays(this, format); -}); - -addFormatToken('e', 0, 0, 'weekday'); -addFormatToken('E', 0, 0, 'isoWeekday'); - -// ALIASES - -addUnitAlias('day', 'd'); -addUnitAlias('weekday', 'e'); -addUnitAlias('isoWeekday', 'E'); - -// PRIORITY -addUnitPriority('day', 11); -addUnitPriority('weekday', 11); -addUnitPriority('isoWeekday', 11); - -// PARSING - -addRegexToken('d', match1to2); -addRegexToken('e', match1to2); -addRegexToken('E', match1to2); -addRegexToken('dd', function (isStrict, locale) { - return locale.weekdaysMinRegex(isStrict); -}); -addRegexToken('ddd', function (isStrict, locale) { - return locale.weekdaysShortRegex(isStrict); -}); -addRegexToken('dddd', function (isStrict, locale) { - return locale.weekdaysRegex(isStrict); -}); - -addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { - var weekday = config._locale.weekdaysParse(input, token, config._strict); - // if we didn't get a weekday name, mark the date as invalid - if (weekday != null) { - week.d = weekday; - } else { - getParsingFlags(config).invalidWeekday = input; - } -}); - -addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { - week[token] = toInt(input); -}); - -// HELPERS - -function parseWeekday(input, locale) { - if (typeof input !== 'string') { - return input; - } - - if (!isNaN(input)) { - return parseInt(input, 10); - } - - input = locale.weekdaysParse(input); - if (typeof input === 'number') { - return input; - } - - return null; -} - -function parseIsoWeekday(input, locale) { - if (typeof input === 'string') { - return locale.weekdaysParse(input) % 7 || 7; - } - return isNaN(input) ? null : input; -} - -// LOCALES - -var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); -function localeWeekdays (m, format) { - if (!m) { - return this._weekdays; - } - return isArray(this._weekdays) ? this._weekdays[m.day()] : - this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; -} - -var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); -function localeWeekdaysShort (m) { - return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; -} - -var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); -function localeWeekdaysMin (m) { - return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; -} - -function handleStrictParse$1(weekdayName, format, strict) { - var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); - if (!this._weekdaysParse) { - this._weekdaysParse = []; - this._shortWeekdaysParse = []; - this._minWeekdaysParse = []; - - for (i = 0; i < 7; ++i) { - mom = createUTC([2000, 1]).day(i); - this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); - this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); - this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); - } - } - - if (strict) { - if (format === 'dddd') { - ii = indexOf$1.call(this._weekdaysParse, llc); - return ii !== -1 ? ii : null; - } else if (format === 'ddd') { - ii = indexOf$1.call(this._shortWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf$1.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } - } else { - if (format === 'dddd') { - ii = indexOf$1.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf$1.call(this._shortWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf$1.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else if (format === 'ddd') { - ii = indexOf$1.call(this._shortWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf$1.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf$1.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf$1.call(this._minWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf$1.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf$1.call(this._shortWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } - } -} - -function localeWeekdaysParse (weekdayName, format, strict) { - var i, mom, regex; - - if (this._weekdaysParseExact) { - return handleStrictParse$1.call(this, weekdayName, format, strict); - } - - if (!this._weekdaysParse) { - this._weekdaysParse = []; - this._minWeekdaysParse = []; - this._shortWeekdaysParse = []; - this._fullWeekdaysParse = []; - } - - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - - mom = createUTC([2000, 1]).day(i); - if (strict && !this._fullWeekdaysParse[i]) { - this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i'); - this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i'); - this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i'); - } - if (!this._weekdaysParse[i]) { - regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); - this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { - return i; - } - } -} - -// MOMENTS - -function getSetDayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); - if (input != null) { - input = parseWeekday(input, this.localeData()); - return this.add(input - day, 'd'); - } else { - return day; - } -} - -function getSetLocaleDayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; - return input == null ? weekday : this.add(input - weekday, 'd'); -} - -function getSetISODayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - - // behaves the same as moment#day except - // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) - // as a setter, sunday should belong to the previous week. - - if (input != null) { - var weekday = parseIsoWeekday(input, this.localeData()); - return this.day(this.day() % 7 ? weekday : weekday - 7); - } else { - return this.day() || 7; - } -} - -var defaultWeekdaysRegex = matchWord; -function weekdaysRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysStrictRegex; - } else { - return this._weekdaysRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysRegex')) { - this._weekdaysRegex = defaultWeekdaysRegex; - } - return this._weekdaysStrictRegex && isStrict ? - this._weekdaysStrictRegex : this._weekdaysRegex; - } -} - -var defaultWeekdaysShortRegex = matchWord; -function weekdaysShortRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysShortStrictRegex; - } else { - return this._weekdaysShortRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysShortRegex')) { - this._weekdaysShortRegex = defaultWeekdaysShortRegex; - } - return this._weekdaysShortStrictRegex && isStrict ? - this._weekdaysShortStrictRegex : this._weekdaysShortRegex; - } -} - -var defaultWeekdaysMinRegex = matchWord; -function weekdaysMinRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysMinStrictRegex; - } else { - return this._weekdaysMinRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysMinRegex')) { - this._weekdaysMinRegex = defaultWeekdaysMinRegex; - } - return this._weekdaysMinStrictRegex && isStrict ? - this._weekdaysMinStrictRegex : this._weekdaysMinRegex; - } -} - - -function computeWeekdaysParse () { - function cmpLenRev(a, b) { - return b.length - a.length; - } - - var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], - i, mom, minp, shortp, longp; - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, 1]).day(i); - minp = this.weekdaysMin(mom, ''); - shortp = this.weekdaysShort(mom, ''); - longp = this.weekdays(mom, ''); - minPieces.push(minp); - shortPieces.push(shortp); - longPieces.push(longp); - mixedPieces.push(minp); - mixedPieces.push(shortp); - mixedPieces.push(longp); - } - // Sorting makes sure if one weekday (or abbr) is a prefix of another it - // will match the longer piece. - minPieces.sort(cmpLenRev); - shortPieces.sort(cmpLenRev); - longPieces.sort(cmpLenRev); - mixedPieces.sort(cmpLenRev); - for (i = 0; i < 7; i++) { - shortPieces[i] = regexEscape(shortPieces[i]); - longPieces[i] = regexEscape(longPieces[i]); - mixedPieces[i] = regexEscape(mixedPieces[i]); - } - - this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._weekdaysShortRegex = this._weekdaysRegex; - this._weekdaysMinRegex = this._weekdaysRegex; - - this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); - this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); - this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); -} - -// FORMATTING - -function hFormat() { - return this.hours() % 12 || 12; -} - -function kFormat() { - return this.hours() || 24; -} - -addFormatToken('H', ['HH', 2], 0, 'hour'); -addFormatToken('h', ['hh', 2], 0, hFormat); -addFormatToken('k', ['kk', 2], 0, kFormat); - -addFormatToken('hmm', 0, 0, function () { - return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); -}); - -addFormatToken('hmmss', 0, 0, function () { - return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + - zeroFill(this.seconds(), 2); -}); - -addFormatToken('Hmm', 0, 0, function () { - return '' + this.hours() + zeroFill(this.minutes(), 2); -}); - -addFormatToken('Hmmss', 0, 0, function () { - return '' + this.hours() + zeroFill(this.minutes(), 2) + - zeroFill(this.seconds(), 2); -}); - -function meridiem (token, lowercase) { - addFormatToken(token, 0, 0, function () { - return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); - }); -} - -meridiem('a', true); -meridiem('A', false); - -// ALIASES - -addUnitAlias('hour', 'h'); - -// PRIORITY -addUnitPriority('hour', 13); - -// PARSING - -function matchMeridiem (isStrict, locale) { - return locale._meridiemParse; -} - -addRegexToken('a', matchMeridiem); -addRegexToken('A', matchMeridiem); -addRegexToken('H', match1to2); -addRegexToken('h', match1to2); -addRegexToken('HH', match1to2, match2); -addRegexToken('hh', match1to2, match2); - -addRegexToken('hmm', match3to4); -addRegexToken('hmmss', match5to6); -addRegexToken('Hmm', match3to4); -addRegexToken('Hmmss', match5to6); - -addParseToken(['H', 'HH'], HOUR); -addParseToken(['a', 'A'], function (input, array, config) { - config._isPm = config._locale.isPM(input); - config._meridiem = input; -}); -addParseToken(['h', 'hh'], function (input, array, config) { - array[HOUR] = toInt(input); - getParsingFlags(config).bigHour = true; -}); -addParseToken('hmm', function (input, array, config) { - var pos = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos)); - array[MINUTE] = toInt(input.substr(pos)); - getParsingFlags(config).bigHour = true; -}); -addParseToken('hmmss', function (input, array, config) { - var pos1 = input.length - 4; - var pos2 = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos1)); - array[MINUTE] = toInt(input.substr(pos1, 2)); - array[SECOND] = toInt(input.substr(pos2)); - getParsingFlags(config).bigHour = true; -}); -addParseToken('Hmm', function (input, array, config) { - var pos = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos)); - array[MINUTE] = toInt(input.substr(pos)); -}); -addParseToken('Hmmss', function (input, array, config) { - var pos1 = input.length - 4; - var pos2 = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos1)); - array[MINUTE] = toInt(input.substr(pos1, 2)); - array[SECOND] = toInt(input.substr(pos2)); -}); - -// LOCALES - -function localeIsPM (input) { - // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays - // Using charAt should be more compatible. - return ((input + '').toLowerCase().charAt(0) === 'p'); -} - -var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; -function localeMeridiem (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'pm' : 'PM'; - } else { - return isLower ? 'am' : 'AM'; - } -} - - -// MOMENTS - -// Setting the hour should keep the time, because the user explicitly -// specified which hour he wants. So trying to maintain the same hour (in -// a new timezone) makes sense. Adding/subtracting hours does not follow -// this rule. -var getSetHour = makeGetSet('Hours', true); - -// months -// week -// weekdays -// meridiem -var baseConfig = { - calendar: defaultCalendar, - longDateFormat: defaultLongDateFormat, - invalidDate: defaultInvalidDate, - ordinal: defaultOrdinal, - ordinalParse: defaultOrdinalParse, - relativeTime: defaultRelativeTime, - - months: defaultLocaleMonths, - monthsShort: defaultLocaleMonthsShort, - - week: defaultLocaleWeek, - - weekdays: defaultLocaleWeekdays, - weekdaysMin: defaultLocaleWeekdaysMin, - weekdaysShort: defaultLocaleWeekdaysShort, - - meridiemParse: defaultLocaleMeridiemParse -}; - -// internal storage for locale config files -var locales = {}; -var localeFamilies = {}; -var globalLocale; - -function normalizeLocale(key) { - return key ? key.toLowerCase().replace('_', '-') : key; -} - -// pick the locale from the array -// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each -// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root -function chooseLocale(names) { - var i = 0, j, next, locale, split; - - while (i < names.length) { - split = normalizeLocale(names[i]).split('-'); - j = split.length; - next = normalizeLocale(names[i + 1]); - next = next ? next.split('-') : null; - while (j > 0) { - locale = loadLocale(split.slice(0, j).join('-')); - if (locale) { - return locale; - } - if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { - //the next array item is better than a shallower substring of this one - break; - } - j--; - } - i++; - } - return null; -} - -function loadLocale(name) { - var oldLocale = null; - // TODO: Find a better way to register and load all the locales in Node - if (!locales[name] && (typeof module !== 'undefined') && - module && module.exports) { - try { - oldLocale = globalLocale._abbr; - require('./locale/' + name); - // because defineLocale currently also sets the global locale, we - // want to undo that for lazy loaded locales - getSetGlobalLocale(oldLocale); - } catch (e) { } - } - return locales[name]; -} - -// This function will load locale and then set the global locale. If -// no arguments are passed in, it will simply return the current global -// locale key. -function getSetGlobalLocale (key, values) { - var data; - if (key) { - if (isUndefined(values)) { - data = getLocale(key); - } - else { - data = defineLocale(key, values); - } - - if (data) { - // moment.duration._locale = moment._locale = data; - globalLocale = data; - } - } - - return globalLocale._abbr; -} - -function defineLocale (name, config) { - if (config !== null) { - var parentConfig = baseConfig; - config.abbr = name; - if (locales[name] != null) { - deprecateSimple('defineLocaleOverride', - 'use moment.updateLocale(localeName, config) to change ' + - 'an existing locale. moment.defineLocale(localeName, ' + - 'config) should only be used for creating a new locale ' + - 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); - parentConfig = locales[name]._config; - } else if (config.parentLocale != null) { - if (locales[config.parentLocale] != null) { - parentConfig = locales[config.parentLocale]._config; - } else { - if (!localeFamilies[config.parentLocale]) { - localeFamilies[config.parentLocale] = []; - } - localeFamilies[config.parentLocale].push({ - name: name, - config: config - }); - return null; - } - } - locales[name] = new Locale(mergeConfigs(parentConfig, config)); - - if (localeFamilies[name]) { - localeFamilies[name].forEach(function (x) { - defineLocale(x.name, x.config); - }); - } - - // backwards compat for now: also set the locale - // make sure we set the locale AFTER all child locales have been - // created, so we won't end up with the child locale set. - getSetGlobalLocale(name); - - - return locales[name]; - } else { - // useful for testing - delete locales[name]; - return null; - } -} - -function updateLocale(name, config) { - if (config != null) { - var locale, parentConfig = baseConfig; - // MERGE - if (locales[name] != null) { - parentConfig = locales[name]._config; - } - config = mergeConfigs(parentConfig, config); - locale = new Locale(config); - locale.parentLocale = locales[name]; - locales[name] = locale; - - // backwards compat for now: also set the locale - getSetGlobalLocale(name); - } else { - // pass null for config to unupdate, useful for tests - if (locales[name] != null) { - if (locales[name].parentLocale != null) { - locales[name] = locales[name].parentLocale; - } else if (locales[name] != null) { - delete locales[name]; - } - } - } - return locales[name]; -} - -// returns locale data -function getLocale (key) { - var locale; - - if (key && key._locale && key._locale._abbr) { - key = key._locale._abbr; - } - - if (!key) { - return globalLocale; - } - - if (!isArray(key)) { - //short-circuit everything else - locale = loadLocale(key); - if (locale) { - return locale; - } - key = [key]; - } - - return chooseLocale(key); -} - -function listLocales() { - return keys$1(locales); -} - -function checkOverflow (m) { - var overflow; - var a = m._a; - - if (a && getParsingFlags(m).overflow === -2) { - overflow = - a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : - a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : - a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : - a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : - a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : - a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : - -1; - - if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { - overflow = DATE; - } - if (getParsingFlags(m)._overflowWeeks && overflow === -1) { - overflow = WEEK; - } - if (getParsingFlags(m)._overflowWeekday && overflow === -1) { - overflow = WEEKDAY; - } - - getParsingFlags(m).overflow = overflow; - } - - return m; -} - -// iso 8601 regex -// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) -var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; -var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; - -var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; - -var isoDates = [ - ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], - ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], - ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], - ['GGGG-[W]WW', /\d{4}-W\d\d/, false], - ['YYYY-DDD', /\d{4}-\d{3}/], - ['YYYY-MM', /\d{4}-\d\d/, false], - ['YYYYYYMMDD', /[+-]\d{10}/], - ['YYYYMMDD', /\d{8}/], - // YYYYMM is NOT allowed by the standard - ['GGGG[W]WWE', /\d{4}W\d{3}/], - ['GGGG[W]WW', /\d{4}W\d{2}/, false], - ['YYYYDDD', /\d{7}/] -]; - -// iso time formats and regexes -var isoTimes = [ - ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], - ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], - ['HH:mm:ss', /\d\d:\d\d:\d\d/], - ['HH:mm', /\d\d:\d\d/], - ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], - ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], - ['HHmmss', /\d\d\d\d\d\d/], - ['HHmm', /\d\d\d\d/], - ['HH', /\d\d/] -]; - -var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; - -// date from iso format -function configFromISO(config) { - var i, l, - string = config._i, - match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), - allowTime, dateFormat, timeFormat, tzFormat; - - if (match) { - getParsingFlags(config).iso = true; - - for (i = 0, l = isoDates.length; i < l; i++) { - if (isoDates[i][1].exec(match[1])) { - dateFormat = isoDates[i][0]; - allowTime = isoDates[i][2] !== false; - break; - } - } - if (dateFormat == null) { - config._isValid = false; - return; - } - if (match[3]) { - for (i = 0, l = isoTimes.length; i < l; i++) { - if (isoTimes[i][1].exec(match[3])) { - // match[2] should be 'T' or space - timeFormat = (match[2] || ' ') + isoTimes[i][0]; - break; - } - } - if (timeFormat == null) { - config._isValid = false; - return; - } - } - if (!allowTime && timeFormat != null) { - config._isValid = false; - return; - } - if (match[4]) { - if (tzRegex.exec(match[4])) { - tzFormat = 'Z'; - } else { - config._isValid = false; - return; - } - } - config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); - configFromStringAndFormat(config); - } else { - config._isValid = false; - } -} - -// date from iso format or fallback -function configFromString(config) { - var matched = aspNetJsonRegex.exec(config._i); - - if (matched !== null) { - config._d = new Date(+matched[1]); - return; - } - - configFromISO(config); - if (config._isValid === false) { - delete config._isValid; - hooks.createFromInputFallback(config); - } -} - -hooks.createFromInputFallback = deprecate( - 'value provided is not in a recognized ISO format. moment construction falls back to js Date(), ' + - 'which is not reliable across all browsers and versions. Non ISO date formats are ' + - 'discouraged and will be removed in an upcoming major release. Please refer to ' + - 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', - function (config) { - config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); - } -); - -// Pick the first defined of two or three arguments. -function defaults(a, b, c) { - if (a != null) { - return a; - } - if (b != null) { - return b; - } - return c; -} - -function currentDateArray(config) { - // hooks is actually the exported moment object - var nowValue = new Date(hooks.now()); - if (config._useUTC) { - return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; - } - return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; -} - -// convert an array to a date. -// the array should mirror the parameters below -// note: all values past the year are optional and will default to the lowest possible value. -// [year, month, day , hour, minute, second, millisecond] -function configFromArray (config) { - var i, date, input = [], currentDate, yearToUse; - - if (config._d) { - return; - } - - currentDate = currentDateArray(config); - - //compute day of the year from weeks and weekdays - if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { - dayOfYearFromWeekInfo(config); - } - - //if the day of the year is set, figure out what it is - if (config._dayOfYear) { - yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); - - if (config._dayOfYear > daysInYear(yearToUse)) { - getParsingFlags(config)._overflowDayOfYear = true; - } - - date = createUTCDate(yearToUse, 0, config._dayOfYear); - config._a[MONTH] = date.getUTCMonth(); - config._a[DATE] = date.getUTCDate(); - } - - // Default to current date. - // * if no year, month, day of month are given, default to today - // * if day of month is given, default month and year - // * if month is given, default only year - // * if year is given, don't default anything - for (i = 0; i < 3 && config._a[i] == null; ++i) { - config._a[i] = input[i] = currentDate[i]; - } - - // Zero out whatever was not defaulted, including time - for (; i < 7; i++) { - config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; - } - - // Check for 24:00:00.000 - if (config._a[HOUR] === 24 && - config._a[MINUTE] === 0 && - config._a[SECOND] === 0 && - config._a[MILLISECOND] === 0) { - config._nextDay = true; - config._a[HOUR] = 0; - } - - config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); - // Apply timezone offset from input. The actual utcOffset can be changed - // with parseZone. - if (config._tzm != null) { - config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - } - - if (config._nextDay) { - config._a[HOUR] = 24; - } -} - -function dayOfYearFromWeekInfo(config) { - var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; - - w = config._w; - if (w.GG != null || w.W != null || w.E != null) { - dow = 1; - doy = 4; - - // TODO: We need to take the current isoWeekYear, but that depends on - // how we interpret now (local, utc, fixed offset). So create - // a now version of current config (take local/utc/offset flags, and - // create now). - weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); - week = defaults(w.W, 1); - weekday = defaults(w.E, 1); - if (weekday < 1 || weekday > 7) { - weekdayOverflow = true; - } - } else { - dow = config._locale._week.dow; - doy = config._locale._week.doy; - - var curWeek = weekOfYear(createLocal(), dow, doy); - - weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); - - // Default to current week. - week = defaults(w.w, curWeek.week); - - if (w.d != null) { - // weekday -- low day numbers are considered next week - weekday = w.d; - if (weekday < 0 || weekday > 6) { - weekdayOverflow = true; - } - } else if (w.e != null) { - // local weekday -- counting starts from begining of week - weekday = w.e + dow; - if (w.e < 0 || w.e > 6) { - weekdayOverflow = true; - } - } else { - // default to begining of week - weekday = dow; - } - } - if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { - getParsingFlags(config)._overflowWeeks = true; - } else if (weekdayOverflow != null) { - getParsingFlags(config)._overflowWeekday = true; - } else { - temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; - } -} - -// constant that refers to the ISO standard -hooks.ISO_8601 = function () {}; - -// date from string and format string -function configFromStringAndFormat(config) { - // TODO: Move this to another part of the creation flow to prevent circular deps - if (config._f === hooks.ISO_8601) { - configFromISO(config); - return; - } - - config._a = []; - getParsingFlags(config).empty = true; - - // This array is used to make a Date, either with `new Date` or `Date.UTC` - var string = '' + config._i, - i, parsedInput, tokens, token, skipped, - stringLength = string.length, - totalParsedInputLength = 0; - - tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; - - for (i = 0; i < tokens.length; i++) { - token = tokens[i]; - parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; - // console.log('token', token, 'parsedInput', parsedInput, - // 'regex', getParseRegexForToken(token, config)); - if (parsedInput) { - skipped = string.substr(0, string.indexOf(parsedInput)); - if (skipped.length > 0) { - getParsingFlags(config).unusedInput.push(skipped); - } - string = string.slice(string.indexOf(parsedInput) + parsedInput.length); - totalParsedInputLength += parsedInput.length; - } - // don't parse if it's not a known token - if (formatTokenFunctions[token]) { - if (parsedInput) { - getParsingFlags(config).empty = false; - } - else { - getParsingFlags(config).unusedTokens.push(token); - } - addTimeToArrayFromToken(token, parsedInput, config); - } - else if (config._strict && !parsedInput) { - getParsingFlags(config).unusedTokens.push(token); - } - } - - // add remaining unparsed input length to the string - getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; - if (string.length > 0) { - getParsingFlags(config).unusedInput.push(string); - } - - // clear _12h flag if hour is <= 12 - if (config._a[HOUR] <= 12 && - getParsingFlags(config).bigHour === true && - config._a[HOUR] > 0) { - getParsingFlags(config).bigHour = undefined; - } - - getParsingFlags(config).parsedDateParts = config._a.slice(0); - getParsingFlags(config).meridiem = config._meridiem; - // handle meridiem - config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); - - configFromArray(config); - checkOverflow(config); -} - - -function meridiemFixWrap (locale, hour, meridiem) { - var isPm; - - if (meridiem == null) { - // nothing to do - return hour; - } - if (locale.meridiemHour != null) { - return locale.meridiemHour(hour, meridiem); - } else if (locale.isPM != null) { - // Fallback - isPm = locale.isPM(meridiem); - if (isPm && hour < 12) { - hour += 12; - } - if (!isPm && hour === 12) { - hour = 0; - } - return hour; - } else { - // this is not supposed to happen - return hour; - } -} - -// date from string and array of format strings -function configFromStringAndArray(config) { - var tempConfig, - bestMoment, - - scoreToBeat, - i, - currentScore; - - if (config._f.length === 0) { - getParsingFlags(config).invalidFormat = true; - config._d = new Date(NaN); - return; - } - - for (i = 0; i < config._f.length; i++) { - currentScore = 0; - tempConfig = copyConfig({}, config); - if (config._useUTC != null) { - tempConfig._useUTC = config._useUTC; - } - tempConfig._f = config._f[i]; - configFromStringAndFormat(tempConfig); - - if (!isValid(tempConfig)) { - continue; - } - - // if there is any input that was not parsed add a penalty for that format - currentScore += getParsingFlags(tempConfig).charsLeftOver; - - //or tokens - currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; - - getParsingFlags(tempConfig).score = currentScore; - - if (scoreToBeat == null || currentScore < scoreToBeat) { - scoreToBeat = currentScore; - bestMoment = tempConfig; - } - } - - extend(config, bestMoment || tempConfig); -} - -function configFromObject(config) { - if (config._d) { - return; - } - - var i = normalizeObjectUnits(config._i); - config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { - return obj && parseInt(obj, 10); - }); - - configFromArray(config); -} - -function createFromConfig (config) { - var res = new Moment(checkOverflow(prepareConfig(config))); - if (res._nextDay) { - // Adding is smart enough around DST - res.add(1, 'd'); - res._nextDay = undefined; - } - - return res; -} - -function prepareConfig (config) { - var input = config._i, - format = config._f; - - config._locale = config._locale || getLocale(config._l); - - if (input === null || (format === undefined && input === '')) { - return createInvalid({nullInput: true}); - } - - if (typeof input === 'string') { - config._i = input = config._locale.preparse(input); - } - - if (isMoment(input)) { - return new Moment(checkOverflow(input)); - } else if (isDate(input)) { - config._d = input; - } else if (isArray(format)) { - configFromStringAndArray(config); - } else if (format) { - configFromStringAndFormat(config); - } else { - configFromInput(config); - } - - if (!isValid(config)) { - config._d = null; - } - - return config; -} - -function configFromInput(config) { - var input = config._i; - if (input === undefined) { - config._d = new Date(hooks.now()); - } else if (isDate(input)) { - config._d = new Date(input.valueOf()); - } else if (typeof input === 'string') { - configFromString(config); - } else if (isArray(input)) { - config._a = map(input.slice(0), function (obj) { - return parseInt(obj, 10); - }); - configFromArray(config); - } else if (typeof(input) === 'object') { - configFromObject(config); - } else if (isNumber(input)) { - // from milliseconds - config._d = new Date(input); - } else { - hooks.createFromInputFallback(config); - } -} - -function createLocalOrUTC (input, format, locale, strict, isUTC) { - var c = {}; - - if (locale === true || locale === false) { - strict = locale; - locale = undefined; - } - - if ((isObject(input) && isObjectEmpty(input)) || - (isArray(input) && input.length === 0)) { - input = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c._isAMomentObject = true; - c._useUTC = c._isUTC = isUTC; - c._l = locale; - c._i = input; - c._f = format; - c._strict = strict; - - return createFromConfig(c); -} - -function createLocal (input, format, locale, strict) { - return createLocalOrUTC(input, format, locale, strict, false); -} - -var prototypeMin = deprecate( - 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', - function () { - var other = createLocal.apply(null, arguments); - if (this.isValid() && other.isValid()) { - return other < this ? this : other; - } else { - return createInvalid(); - } - } -); - -var prototypeMax = deprecate( - 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', - function () { - var other = createLocal.apply(null, arguments); - if (this.isValid() && other.isValid()) { - return other > this ? this : other; - } else { - return createInvalid(); - } - } -); - -// Pick a moment m from moments so that m[fn](other) is true for all -// other. This relies on the function fn to be transitive. -// -// moments should either be an array of moment objects or an array, whose -// first element is an array of moment objects. -function pickBy(fn, moments) { - var res, i; - if (moments.length === 1 && isArray(moments[0])) { - moments = moments[0]; - } - if (!moments.length) { - return createLocal(); - } - res = moments[0]; - for (i = 1; i < moments.length; ++i) { - if (!moments[i].isValid() || moments[i][fn](res)) { - res = moments[i]; - } - } - return res; -} - -// TODO: Use [].sort instead? -function min () { - var args = [].slice.call(arguments, 0); - - return pickBy('isBefore', args); -} - -function max () { - var args = [].slice.call(arguments, 0); - - return pickBy('isAfter', args); -} - -var now = function () { - return Date.now ? Date.now() : +(new Date()); -}; - -function Duration (duration) { - var normalizedInput = normalizeObjectUnits(duration), - years = normalizedInput.year || 0, - quarters = normalizedInput.quarter || 0, - months = normalizedInput.month || 0, - weeks = normalizedInput.week || 0, - days = normalizedInput.day || 0, - hours = normalizedInput.hour || 0, - minutes = normalizedInput.minute || 0, - seconds = normalizedInput.second || 0, - milliseconds = normalizedInput.millisecond || 0; - - // representation for dateAddRemove - this._milliseconds = +milliseconds + - seconds * 1e3 + // 1000 - minutes * 6e4 + // 1000 * 60 - hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 - // Because of dateAddRemove treats 24 hours as different from a - // day when working around DST, we need to store them separately - this._days = +days + - weeks * 7; - // It is impossible translate months into days without knowing - // which months you are are talking about, so we have to store - // it separately. - this._months = +months + - quarters * 3 + - years * 12; - - this._data = {}; - - this._locale = getLocale(); - - this._bubble(); -} - -function isDuration (obj) { - return obj instanceof Duration; -} - -function absRound (number) { - if (number < 0) { - return Math.round(-1 * number) * -1; - } else { - return Math.round(number); - } -} - -// FORMATTING - -function offset (token, separator) { - addFormatToken(token, 0, 0, function () { - var offset = this.utcOffset(); - var sign = '+'; - if (offset < 0) { - offset = -offset; - sign = '-'; - } - return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); - }); -} - -offset('Z', ':'); -offset('ZZ', ''); - -// PARSING - -addRegexToken('Z', matchShortOffset); -addRegexToken('ZZ', matchShortOffset); -addParseToken(['Z', 'ZZ'], function (input, array, config) { - config._useUTC = true; - config._tzm = offsetFromString(matchShortOffset, input); -}); - -// HELPERS - -// timezone chunker -// '+10:00' > ['10', '00'] -// '-1530' > ['-15', '30'] -var chunkOffset = /([\+\-]|\d\d)/gi; - -function offsetFromString(matcher, string) { - var matches = (string || '').match(matcher); - - if (matches === null) { - return null; - } - - var chunk = matches[matches.length - 1] || []; - var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; - var minutes = +(parts[1] * 60) + toInt(parts[2]); - - return minutes === 0 ? - 0 : - parts[0] === '+' ? minutes : -minutes; -} - -// Return a moment from input, that is local/utc/zone equivalent to model. -function cloneWithOffset(input, model) { - var res, diff; - if (model._isUTC) { - res = model.clone(); - diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); - // Use low-level api, because this fn is low-level api. - res._d.setTime(res._d.valueOf() + diff); - hooks.updateOffset(res, false); - return res; - } else { - return createLocal(input).local(); - } -} - -function getDateOffset (m) { - // On Firefox.24 Date#getTimezoneOffset returns a floating point. - // https://github.com/moment/moment/pull/1871 - return -Math.round(m._d.getTimezoneOffset() / 15) * 15; -} - -// HOOKS - -// This function will be called whenever a moment is mutated. -// It is intended to keep the offset in sync with the timezone. -hooks.updateOffset = function () {}; - -// MOMENTS - -// keepLocalTime = true means only change the timezone, without -// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> -// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset -// +0200, so we adjust the time as needed, to be valid. -// -// Keeping the time actually adds/subtracts (one hour) -// from the actual represented time. That is why we call updateOffset -// a second time. In case it wants us to change the offset again -// _changeInProgress == true case, then we have to adjust, because -// there is no such time in the given timezone. -function getSetOffset (input, keepLocalTime) { - var offset = this._offset || 0, - localAdjust; - if (!this.isValid()) { - return input != null ? this : NaN; - } - if (input != null) { - if (typeof input === 'string') { - input = offsetFromString(matchShortOffset, input); - if (input === null) { - return this; - } - } else if (Math.abs(input) < 16) { - input = input * 60; - } - if (!this._isUTC && keepLocalTime) { - localAdjust = getDateOffset(this); - } - this._offset = input; - this._isUTC = true; - if (localAdjust != null) { - this.add(localAdjust, 'm'); - } - if (offset !== input) { - if (!keepLocalTime || this._changeInProgress) { - addSubtract(this, createDuration(input - offset, 'm'), 1, false); - } else if (!this._changeInProgress) { - this._changeInProgress = true; - hooks.updateOffset(this, true); - this._changeInProgress = null; - } - } - return this; - } else { - return this._isUTC ? offset : getDateOffset(this); - } -} - -function getSetZone (input, keepLocalTime) { - if (input != null) { - if (typeof input !== 'string') { - input = -input; - } - - this.utcOffset(input, keepLocalTime); - - return this; - } else { - return -this.utcOffset(); - } -} - -function setOffsetToUTC (keepLocalTime) { - return this.utcOffset(0, keepLocalTime); -} - -function setOffsetToLocal (keepLocalTime) { - if (this._isUTC) { - this.utcOffset(0, keepLocalTime); - this._isUTC = false; - - if (keepLocalTime) { - this.subtract(getDateOffset(this), 'm'); - } - } - return this; -} - -function setOffsetToParsedOffset () { - if (this._tzm != null) { - this.utcOffset(this._tzm); - } else if (typeof this._i === 'string') { - var tZone = offsetFromString(matchOffset, this._i); - if (tZone != null) { - this.utcOffset(tZone); - } - else { - this.utcOffset(0, true); - } - } - return this; -} - -function hasAlignedHourOffset (input) { - if (!this.isValid()) { - return false; - } - input = input ? createLocal(input).utcOffset() : 0; - - return (this.utcOffset() - input) % 60 === 0; -} - -function isDaylightSavingTime () { - return ( - this.utcOffset() > this.clone().month(0).utcOffset() || - this.utcOffset() > this.clone().month(5).utcOffset() - ); -} - -function isDaylightSavingTimeShifted () { - if (!isUndefined(this._isDSTShifted)) { - return this._isDSTShifted; - } - - var c = {}; - - copyConfig(c, this); - c = prepareConfig(c); - - if (c._a) { - var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); - this._isDSTShifted = this.isValid() && - compareArrays(c._a, other.toArray()) > 0; - } else { - this._isDSTShifted = false; - } - - return this._isDSTShifted; -} - -function isLocal () { - return this.isValid() ? !this._isUTC : false; -} - -function isUtcOffset () { - return this.isValid() ? this._isUTC : false; -} - -function isUtc () { - return this.isValid() ? this._isUTC && this._offset === 0 : false; -} - -// ASP.NET json date format regex -var aspNetRegex = /^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; - -// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html -// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere -// and further modified to allow for strings containing both week and day -var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/; - -function createDuration (input, key) { - var duration = input, - // matching against regexp is expensive, do it on demand - match = null, - sign, - ret, - diffRes; - - if (isDuration(input)) { - duration = { - ms : input._milliseconds, - d : input._days, - M : input._months - }; - } else if (isNumber(input)) { - duration = {}; - if (key) { - duration[key] = input; - } else { - duration.milliseconds = input; - } - } else if (!!(match = aspNetRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - duration = { - y : 0, - d : toInt(match[DATE]) * sign, - h : toInt(match[HOUR]) * sign, - m : toInt(match[MINUTE]) * sign, - s : toInt(match[SECOND]) * sign, - ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match - }; - } else if (!!(match = isoRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - duration = { - y : parseIso(match[2], sign), - M : parseIso(match[3], sign), - w : parseIso(match[4], sign), - d : parseIso(match[5], sign), - h : parseIso(match[6], sign), - m : parseIso(match[7], sign), - s : parseIso(match[8], sign) - }; - } else if (duration == null) {// checks for null or undefined - duration = {}; - } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { - diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); - - duration = {}; - duration.ms = diffRes.milliseconds; - duration.M = diffRes.months; - } - - ret = new Duration(duration); - - if (isDuration(input) && hasOwnProp(input, '_locale')) { - ret._locale = input._locale; - } - - return ret; -} - -createDuration.fn = Duration.prototype; - -function parseIso (inp, sign) { - // We'd normally use ~~inp for this, but unfortunately it also - // converts floats to ints. - // inp may be undefined, so careful calling replace on it. - var res = inp && parseFloat(inp.replace(',', '.')); - // apply sign while we're at it - return (isNaN(res) ? 0 : res) * sign; -} - -function positiveMomentsDifference(base, other) { - var res = {milliseconds: 0, months: 0}; - - res.months = other.month() - base.month() + - (other.year() - base.year()) * 12; - if (base.clone().add(res.months, 'M').isAfter(other)) { - --res.months; - } - - res.milliseconds = +other - +(base.clone().add(res.months, 'M')); - - return res; -} - -function momentsDifference(base, other) { - var res; - if (!(base.isValid() && other.isValid())) { - return {milliseconds: 0, months: 0}; - } - - other = cloneWithOffset(other, base); - if (base.isBefore(other)) { - res = positiveMomentsDifference(base, other); - } else { - res = positiveMomentsDifference(other, base); - res.milliseconds = -res.milliseconds; - res.months = -res.months; - } - - return res; -} - -// TODO: remove 'name' arg after deprecation is removed -function createAdder(direction, name) { - return function (val, period) { - var dur, tmp; - //invert the arguments, but complain about it - if (period !== null && !isNaN(+period)) { - deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + - 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); - tmp = val; val = period; period = tmp; - } - - val = typeof val === 'string' ? +val : val; - dur = createDuration(val, period); - addSubtract(this, dur, direction); - return this; - }; -} - -function addSubtract (mom, duration, isAdding, updateOffset) { - var milliseconds = duration._milliseconds, - days = absRound(duration._days), - months = absRound(duration._months); - - if (!mom.isValid()) { - // No op - return; - } - - updateOffset = updateOffset == null ? true : updateOffset; - - if (milliseconds) { - mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); - } - if (days) { - set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); - } - if (months) { - setMonth(mom, get(mom, 'Month') + months * isAdding); - } - if (updateOffset) { - hooks.updateOffset(mom, days || months); - } -} - -var add = createAdder(1, 'add'); -var subtract = createAdder(-1, 'subtract'); - -function getCalendarFormat(myMoment, now) { - var diff = myMoment.diff(now, 'days', true); - return diff < -6 ? 'sameElse' : - diff < -1 ? 'lastWeek' : - diff < 0 ? 'lastDay' : - diff < 1 ? 'sameDay' : - diff < 2 ? 'nextDay' : - diff < 7 ? 'nextWeek' : 'sameElse'; -} - -function calendar$1 (time, formats) { - // We want to compare the start of today, vs this. - // Getting start-of-today depends on whether we're local/utc/offset or not. - var now = time || createLocal(), - sod = cloneWithOffset(now, this).startOf('day'), - format = hooks.calendarFormat(this, sod) || 'sameElse'; - - var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); - - return this.format(output || this.localeData().calendar(format, this, createLocal(now))); -} - -function clone () { - return new Moment(this); -} - -function isAfter (input, units) { - var localInput = isMoment(input) ? input : createLocal(input); - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); - if (units === 'millisecond') { - return this.valueOf() > localInput.valueOf(); - } else { - return localInput.valueOf() < this.clone().startOf(units).valueOf(); - } -} - -function isBefore (input, units) { - var localInput = isMoment(input) ? input : createLocal(input); - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); - if (units === 'millisecond') { - return this.valueOf() < localInput.valueOf(); - } else { - return this.clone().endOf(units).valueOf() < localInput.valueOf(); - } -} - -function isBetween (from, to, units, inclusivity) { - inclusivity = inclusivity || '()'; - return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) && - (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units)); -} - -function isSame (input, units) { - var localInput = isMoment(input) ? input : createLocal(input), - inputMs; - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(units || 'millisecond'); - if (units === 'millisecond') { - return this.valueOf() === localInput.valueOf(); - } else { - inputMs = localInput.valueOf(); - return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); - } -} - -function isSameOrAfter (input, units) { - return this.isSame(input, units) || this.isAfter(input,units); -} - -function isSameOrBefore (input, units) { - return this.isSame(input, units) || this.isBefore(input,units); -} - -function diff (input, units, asFloat) { - var that, - zoneDelta, - delta, output; - - if (!this.isValid()) { - return NaN; - } - - that = cloneWithOffset(input, this); - - if (!that.isValid()) { - return NaN; - } - - zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; - - units = normalizeUnits(units); - - if (units === 'year' || units === 'month' || units === 'quarter') { - output = monthDiff(this, that); - if (units === 'quarter') { - output = output / 3; - } else if (units === 'year') { - output = output / 12; - } - } else { - delta = this - that; - output = units === 'second' ? delta / 1e3 : // 1000 - units === 'minute' ? delta / 6e4 : // 1000 * 60 - units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60 - units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst - units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst - delta; - } - return asFloat ? output : absFloor(output); -} - -function monthDiff (a, b) { - // difference in months - var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), - // b is in (anchor - 1 month, anchor + 1 month) - anchor = a.clone().add(wholeMonthDiff, 'months'), - anchor2, adjust; - - if (b - anchor < 0) { - anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor - anchor2); - } else { - anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor2 - anchor); - } - - //check for negative zero, return zero if negative zero - return -(wholeMonthDiff + adjust) || 0; -} - -hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; -hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; - -function toString () { - return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); -} - -function toISOString () { - var m = this.clone().utc(); - if (0 < m.year() && m.year() <= 9999) { - if (isFunction(Date.prototype.toISOString)) { - // native implementation is ~50x faster, use it when we can - return this.toDate().toISOString(); - } else { - return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); - } - } else { - return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); - } -} - -/** - * Return a human readable representation of a moment that can - * also be evaluated to get a new moment which is the same - * - * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects - */ -function inspect () { - if (!this.isValid()) { - return 'moment.invalid(/* ' + this._i + ' */)'; - } - var func = 'moment'; - var zone = ''; - if (!this.isLocal()) { - func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; - zone = 'Z'; - } - var prefix = '[' + func + '("]'; - var year = (0 < this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; - var datetime = '-MM-DD[T]HH:mm:ss.SSS'; - var suffix = zone + '[")]'; - - return this.format(prefix + year + datetime + suffix); -} - -function format (inputString) { - if (!inputString) { - inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; - } - var output = formatMoment(this, inputString); - return this.localeData().postformat(output); -} - -function from (time, withoutSuffix) { - if (this.isValid() && - ((isMoment(time) && time.isValid()) || - createLocal(time).isValid())) { - return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); - } else { - return this.localeData().invalidDate(); - } -} - -function fromNow (withoutSuffix) { - return this.from(createLocal(), withoutSuffix); -} - -function to (time, withoutSuffix) { - if (this.isValid() && - ((isMoment(time) && time.isValid()) || - createLocal(time).isValid())) { - return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); - } else { - return this.localeData().invalidDate(); - } -} - -function toNow (withoutSuffix) { - return this.to(createLocal(), withoutSuffix); -} - -// If passed a locale key, it will set the locale for this -// instance. Otherwise, it will return the locale configuration -// variables for this instance. -function locale (key) { - var newLocaleData; - - if (key === undefined) { - return this._locale._abbr; - } else { - newLocaleData = getLocale(key); - if (newLocaleData != null) { - this._locale = newLocaleData; - } - return this; - } -} - -var lang = deprecate( - 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', - function (key) { - if (key === undefined) { - return this.localeData(); - } else { - return this.locale(key); - } - } -); - -function localeData () { - return this._locale; -} - -function startOf (units) { - units = normalizeUnits(units); - // the following switch intentionally omits break keywords - // to utilize falling through the cases. - switch (units) { - case 'year': - this.month(0); - /* falls through */ - case 'quarter': - case 'month': - this.date(1); - /* falls through */ - case 'week': - case 'isoWeek': - case 'day': - case 'date': - this.hours(0); - /* falls through */ - case 'hour': - this.minutes(0); - /* falls through */ - case 'minute': - this.seconds(0); - /* falls through */ - case 'second': - this.milliseconds(0); - } - - // weeks are a special case - if (units === 'week') { - this.weekday(0); - } - if (units === 'isoWeek') { - this.isoWeekday(1); - } - - // quarters are also special - if (units === 'quarter') { - this.month(Math.floor(this.month() / 3) * 3); - } - - return this; -} - -function endOf (units) { - units = normalizeUnits(units); - if (units === undefined || units === 'millisecond') { - return this; - } - - // 'date' is an alias for 'day', so it should be considered as such. - if (units === 'date') { - units = 'day'; - } - - return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); -} - -function valueOf () { - return this._d.valueOf() - ((this._offset || 0) * 60000); -} - -function unix () { - return Math.floor(this.valueOf() / 1000); -} - -function toDate () { - return new Date(this.valueOf()); -} - -function toArray () { - var m = this; - return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; -} - -function toObject () { - var m = this; - return { - years: m.year(), - months: m.month(), - date: m.date(), - hours: m.hours(), - minutes: m.minutes(), - seconds: m.seconds(), - milliseconds: m.milliseconds() - }; -} - -function toJSON () { - // new Date(NaN).toJSON() === null - return this.isValid() ? this.toISOString() : null; -} - -function isValid$1 () { - return isValid(this); -} - -function parsingFlags () { - return extend({}, getParsingFlags(this)); -} - -function invalidAt () { - return getParsingFlags(this).overflow; -} - -function creationData() { - return { - input: this._i, - format: this._f, - locale: this._locale, - isUTC: this._isUTC, - strict: this._strict - }; -} - -// FORMATTING - -addFormatToken(0, ['gg', 2], 0, function () { - return this.weekYear() % 100; -}); - -addFormatToken(0, ['GG', 2], 0, function () { - return this.isoWeekYear() % 100; -}); - -function addWeekYearFormatToken (token, getter) { - addFormatToken(0, [token, token.length], 0, getter); -} - -addWeekYearFormatToken('gggg', 'weekYear'); -addWeekYearFormatToken('ggggg', 'weekYear'); -addWeekYearFormatToken('GGGG', 'isoWeekYear'); -addWeekYearFormatToken('GGGGG', 'isoWeekYear'); - -// ALIASES - -addUnitAlias('weekYear', 'gg'); -addUnitAlias('isoWeekYear', 'GG'); - -// PRIORITY - -addUnitPriority('weekYear', 1); -addUnitPriority('isoWeekYear', 1); - - -// PARSING - -addRegexToken('G', matchSigned); -addRegexToken('g', matchSigned); -addRegexToken('GG', match1to2, match2); -addRegexToken('gg', match1to2, match2); -addRegexToken('GGGG', match1to4, match4); -addRegexToken('gggg', match1to4, match4); -addRegexToken('GGGGG', match1to6, match6); -addRegexToken('ggggg', match1to6, match6); - -addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { - week[token.substr(0, 2)] = toInt(input); -}); - -addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { - week[token] = hooks.parseTwoDigitYear(input); -}); - -// MOMENTS - -function getSetWeekYear (input) { - return getSetWeekYearHelper.call(this, - input, - this.week(), - this.weekday(), - this.localeData()._week.dow, - this.localeData()._week.doy); -} - -function getSetISOWeekYear (input) { - return getSetWeekYearHelper.call(this, - input, this.isoWeek(), this.isoWeekday(), 1, 4); -} - -function getISOWeeksInYear () { - return weeksInYear(this.year(), 1, 4); -} - -function getWeeksInYear () { - var weekInfo = this.localeData()._week; - return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); -} - -function getSetWeekYearHelper(input, week, weekday, dow, doy) { - var weeksTarget; - if (input == null) { - return weekOfYear(this, dow, doy).year; - } else { - weeksTarget = weeksInYear(input, dow, doy); - if (week > weeksTarget) { - week = weeksTarget; - } - return setWeekAll.call(this, input, week, weekday, dow, doy); - } -} - -function setWeekAll(weekYear, week, weekday, dow, doy) { - var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), - date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); - - this.year(date.getUTCFullYear()); - this.month(date.getUTCMonth()); - this.date(date.getUTCDate()); - return this; -} - -// FORMATTING - -addFormatToken('Q', 0, 'Qo', 'quarter'); - -// ALIASES - -addUnitAlias('quarter', 'Q'); - -// PRIORITY - -addUnitPriority('quarter', 7); - -// PARSING - -addRegexToken('Q', match1); -addParseToken('Q', function (input, array) { - array[MONTH] = (toInt(input) - 1) * 3; -}); - -// MOMENTS - -function getSetQuarter (input) { - return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); -} - -// FORMATTING - -addFormatToken('D', ['DD', 2], 'Do', 'date'); - -// ALIASES - -addUnitAlias('date', 'D'); - -// PRIOROITY -addUnitPriority('date', 9); - -// PARSING - -addRegexToken('D', match1to2); -addRegexToken('DD', match1to2, match2); -addRegexToken('Do', function (isStrict, locale) { - return isStrict ? locale._ordinalParse : locale._ordinalParseLenient; -}); - -addParseToken(['D', 'DD'], DATE); -addParseToken('Do', function (input, array) { - array[DATE] = toInt(input.match(match1to2)[0], 10); -}); - -// MOMENTS - -var getSetDayOfMonth = makeGetSet('Date', true); - -// FORMATTING - -addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); - -// ALIASES - -addUnitAlias('dayOfYear', 'DDD'); - -// PRIORITY -addUnitPriority('dayOfYear', 4); - -// PARSING - -addRegexToken('DDD', match1to3); -addRegexToken('DDDD', match3); -addParseToken(['DDD', 'DDDD'], function (input, array, config) { - config._dayOfYear = toInt(input); -}); - -// HELPERS - -// MOMENTS - -function getSetDayOfYear (input) { - var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; - return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); -} - -// FORMATTING - -addFormatToken('m', ['mm', 2], 0, 'minute'); - -// ALIASES - -addUnitAlias('minute', 'm'); - -// PRIORITY - -addUnitPriority('minute', 14); - -// PARSING - -addRegexToken('m', match1to2); -addRegexToken('mm', match1to2, match2); -addParseToken(['m', 'mm'], MINUTE); - -// MOMENTS - -var getSetMinute = makeGetSet('Minutes', false); - -// FORMATTING - -addFormatToken('s', ['ss', 2], 0, 'second'); - -// ALIASES - -addUnitAlias('second', 's'); - -// PRIORITY - -addUnitPriority('second', 15); - -// PARSING - -addRegexToken('s', match1to2); -addRegexToken('ss', match1to2, match2); -addParseToken(['s', 'ss'], SECOND); - -// MOMENTS - -var getSetSecond = makeGetSet('Seconds', false); - -// FORMATTING - -addFormatToken('S', 0, 0, function () { - return ~~(this.millisecond() / 100); -}); - -addFormatToken(0, ['SS', 2], 0, function () { - return ~~(this.millisecond() / 10); -}); - -addFormatToken(0, ['SSS', 3], 0, 'millisecond'); -addFormatToken(0, ['SSSS', 4], 0, function () { - return this.millisecond() * 10; -}); -addFormatToken(0, ['SSSSS', 5], 0, function () { - return this.millisecond() * 100; -}); -addFormatToken(0, ['SSSSSS', 6], 0, function () { - return this.millisecond() * 1000; -}); -addFormatToken(0, ['SSSSSSS', 7], 0, function () { - return this.millisecond() * 10000; -}); -addFormatToken(0, ['SSSSSSSS', 8], 0, function () { - return this.millisecond() * 100000; -}); -addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { - return this.millisecond() * 1000000; -}); - - -// ALIASES - -addUnitAlias('millisecond', 'ms'); - -// PRIORITY - -addUnitPriority('millisecond', 16); - -// PARSING - -addRegexToken('S', match1to3, match1); -addRegexToken('SS', match1to3, match2); -addRegexToken('SSS', match1to3, match3); - -var token; -for (token = 'SSSS'; token.length <= 9; token += 'S') { - addRegexToken(token, matchUnsigned); -} - -function parseMs(input, array) { - array[MILLISECOND] = toInt(('0.' + input) * 1000); -} - -for (token = 'S'; token.length <= 9; token += 'S') { - addParseToken(token, parseMs); -} -// MOMENTS - -var getSetMillisecond = makeGetSet('Milliseconds', false); - -// FORMATTING - -addFormatToken('z', 0, 0, 'zoneAbbr'); -addFormatToken('zz', 0, 0, 'zoneName'); - -// MOMENTS - -function getZoneAbbr () { - return this._isUTC ? 'UTC' : ''; -} - -function getZoneName () { - return this._isUTC ? 'Coordinated Universal Time' : ''; -} - -var proto = Moment.prototype; - -proto.add = add; -proto.calendar = calendar$1; -proto.clone = clone; -proto.diff = diff; -proto.endOf = endOf; -proto.format = format; -proto.from = from; -proto.fromNow = fromNow; -proto.to = to; -proto.toNow = toNow; -proto.get = stringGet; -proto.invalidAt = invalidAt; -proto.isAfter = isAfter; -proto.isBefore = isBefore; -proto.isBetween = isBetween; -proto.isSame = isSame; -proto.isSameOrAfter = isSameOrAfter; -proto.isSameOrBefore = isSameOrBefore; -proto.isValid = isValid$1; -proto.lang = lang; -proto.locale = locale; -proto.localeData = localeData; -proto.max = prototypeMax; -proto.min = prototypeMin; -proto.parsingFlags = parsingFlags; -proto.set = stringSet; -proto.startOf = startOf; -proto.subtract = subtract; -proto.toArray = toArray; -proto.toObject = toObject; -proto.toDate = toDate; -proto.toISOString = toISOString; -proto.inspect = inspect; -proto.toJSON = toJSON; -proto.toString = toString; -proto.unix = unix; -proto.valueOf = valueOf; -proto.creationData = creationData; - -// Year -proto.year = getSetYear; -proto.isLeapYear = getIsLeapYear; - -// Week Year -proto.weekYear = getSetWeekYear; -proto.isoWeekYear = getSetISOWeekYear; - -// Quarter -proto.quarter = proto.quarters = getSetQuarter; - -// Month -proto.month = getSetMonth; -proto.daysInMonth = getDaysInMonth; - -// Week -proto.week = proto.weeks = getSetWeek; -proto.isoWeek = proto.isoWeeks = getSetISOWeek; -proto.weeksInYear = getWeeksInYear; -proto.isoWeeksInYear = getISOWeeksInYear; - -// Day -proto.date = getSetDayOfMonth; -proto.day = proto.days = getSetDayOfWeek; -proto.weekday = getSetLocaleDayOfWeek; -proto.isoWeekday = getSetISODayOfWeek; -proto.dayOfYear = getSetDayOfYear; - -// Hour -proto.hour = proto.hours = getSetHour; - -// Minute -proto.minute = proto.minutes = getSetMinute; - -// Second -proto.second = proto.seconds = getSetSecond; - -// Millisecond -proto.millisecond = proto.milliseconds = getSetMillisecond; - -// Offset -proto.utcOffset = getSetOffset; -proto.utc = setOffsetToUTC; -proto.local = setOffsetToLocal; -proto.parseZone = setOffsetToParsedOffset; -proto.hasAlignedHourOffset = hasAlignedHourOffset; -proto.isDST = isDaylightSavingTime; -proto.isLocal = isLocal; -proto.isUtcOffset = isUtcOffset; -proto.isUtc = isUtc; -proto.isUTC = isUtc; - -// Timezone -proto.zoneAbbr = getZoneAbbr; -proto.zoneName = getZoneName; - -// Deprecations -proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); -proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); -proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); -proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); -proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); - -function createUnix (input) { - return createLocal(input * 1000); -} - -function createInZone () { - return createLocal.apply(null, arguments).parseZone(); -} - -function preParsePostFormat (string) { - return string; -} - -var proto$1 = Locale.prototype; - -proto$1.calendar = calendar; -proto$1.longDateFormat = longDateFormat; -proto$1.invalidDate = invalidDate; -proto$1.ordinal = ordinal; -proto$1.preparse = preParsePostFormat; -proto$1.postformat = preParsePostFormat; -proto$1.relativeTime = relativeTime; -proto$1.pastFuture = pastFuture; -proto$1.set = set; - -// Month -proto$1.months = localeMonths; -proto$1.monthsShort = localeMonthsShort; -proto$1.monthsParse = localeMonthsParse; -proto$1.monthsRegex = monthsRegex; -proto$1.monthsShortRegex = monthsShortRegex; - -// Week -proto$1.week = localeWeek; -proto$1.firstDayOfYear = localeFirstDayOfYear; -proto$1.firstDayOfWeek = localeFirstDayOfWeek; - -// Day of Week -proto$1.weekdays = localeWeekdays; -proto$1.weekdaysMin = localeWeekdaysMin; -proto$1.weekdaysShort = localeWeekdaysShort; -proto$1.weekdaysParse = localeWeekdaysParse; - -proto$1.weekdaysRegex = weekdaysRegex; -proto$1.weekdaysShortRegex = weekdaysShortRegex; -proto$1.weekdaysMinRegex = weekdaysMinRegex; - -// Hours -proto$1.isPM = localeIsPM; -proto$1.meridiem = localeMeridiem; - -function get$1 (format, index, field, setter) { - var locale = getLocale(); - var utc = createUTC().set(setter, index); - return locale[field](utc, format); -} - -function listMonthsImpl (format, index, field) { - if (isNumber(format)) { - index = format; - format = undefined; - } - - format = format || ''; - - if (index != null) { - return get$1(format, index, field, 'month'); - } - - var i; - var out = []; - for (i = 0; i < 12; i++) { - out[i] = get$1(format, i, field, 'month'); - } - return out; -} - -// () -// (5) -// (fmt, 5) -// (fmt) -// (true) -// (true, 5) -// (true, fmt, 5) -// (true, fmt) -function listWeekdaysImpl (localeSorted, format, index, field) { - if (typeof localeSorted === 'boolean') { - if (isNumber(format)) { - index = format; - format = undefined; - } - - format = format || ''; - } else { - format = localeSorted; - index = format; - localeSorted = false; - - if (isNumber(format)) { - index = format; - format = undefined; - } - - format = format || ''; - } - - var locale = getLocale(), - shift = localeSorted ? locale._week.dow : 0; - - if (index != null) { - return get$1(format, (index + shift) % 7, field, 'day'); - } - - var i; - var out = []; - for (i = 0; i < 7; i++) { - out[i] = get$1(format, (i + shift) % 7, field, 'day'); - } - return out; -} - -function listMonths (format, index) { - return listMonthsImpl(format, index, 'months'); -} - -function listMonthsShort (format, index) { - return listMonthsImpl(format, index, 'monthsShort'); -} - -function listWeekdays (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); -} - -function listWeekdaysShort (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); -} - -function listWeekdaysMin (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); -} - -getSetGlobalLocale('en', { - ordinalParse: /\d{1,2}(th|st|nd|rd)/, - ordinal : function (number) { - var b = number % 10, - output = (toInt(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } -}); - -// Side effect imports -hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); -hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); - -var mathAbs = Math.abs; - -function abs () { - var data = this._data; - - this._milliseconds = mathAbs(this._milliseconds); - this._days = mathAbs(this._days); - this._months = mathAbs(this._months); - - data.milliseconds = mathAbs(data.milliseconds); - data.seconds = mathAbs(data.seconds); - data.minutes = mathAbs(data.minutes); - data.hours = mathAbs(data.hours); - data.months = mathAbs(data.months); - data.years = mathAbs(data.years); - - return this; -} - -function addSubtract$1 (duration, input, value, direction) { - var other = createDuration(input, value); - - duration._milliseconds += direction * other._milliseconds; - duration._days += direction * other._days; - duration._months += direction * other._months; - - return duration._bubble(); -} - -// supports only 2.0-style add(1, 's') or add(duration) -function add$1 (input, value) { - return addSubtract$1(this, input, value, 1); -} - -// supports only 2.0-style subtract(1, 's') or subtract(duration) -function subtract$1 (input, value) { - return addSubtract$1(this, input, value, -1); -} - -function absCeil (number) { - if (number < 0) { - return Math.floor(number); - } else { - return Math.ceil(number); - } -} - -function bubble () { - var milliseconds = this._milliseconds; - var days = this._days; - var months = this._months; - var data = this._data; - var seconds, minutes, hours, years, monthsFromDays; - - // if we have a mix of positive and negative values, bubble down first - // check: https://github.com/moment/moment/issues/2166 - if (!((milliseconds >= 0 && days >= 0 && months >= 0) || - (milliseconds <= 0 && days <= 0 && months <= 0))) { - milliseconds += absCeil(monthsToDays(months) + days) * 864e5; - days = 0; - months = 0; - } - - // The following code bubbles up values, see the tests for - // examples of what that means. - data.milliseconds = milliseconds % 1000; - - seconds = absFloor(milliseconds / 1000); - data.seconds = seconds % 60; - - minutes = absFloor(seconds / 60); - data.minutes = minutes % 60; - - hours = absFloor(minutes / 60); - data.hours = hours % 24; - - days += absFloor(hours / 24); - - // convert days to months - monthsFromDays = absFloor(daysToMonths(days)); - months += monthsFromDays; - days -= absCeil(monthsToDays(monthsFromDays)); - - // 12 months -> 1 year - years = absFloor(months / 12); - months %= 12; - - data.days = days; - data.months = months; - data.years = years; - - return this; -} - -function daysToMonths (days) { - // 400 years have 146097 days (taking into account leap year rules) - // 400 years have 12 months === 4800 - return days * 4800 / 146097; -} - -function monthsToDays (months) { - // the reverse of daysToMonths - return months * 146097 / 4800; -} - -function as (units) { - var days; - var months; - var milliseconds = this._milliseconds; - - units = normalizeUnits(units); - - if (units === 'month' || units === 'year') { - days = this._days + milliseconds / 864e5; - months = this._months + daysToMonths(days); - return units === 'month' ? months : months / 12; - } else { - // handle milliseconds separately because of floating point math errors (issue #1867) - days = this._days + Math.round(monthsToDays(this._months)); - switch (units) { - case 'week' : return days / 7 + milliseconds / 6048e5; - case 'day' : return days + milliseconds / 864e5; - case 'hour' : return days * 24 + milliseconds / 36e5; - case 'minute' : return days * 1440 + milliseconds / 6e4; - case 'second' : return days * 86400 + milliseconds / 1000; - // Math.floor prevents floating point math errors here - case 'millisecond': return Math.floor(days * 864e5) + milliseconds; - default: throw new Error('Unknown unit ' + units); - } - } -} - -// TODO: Use this.as('ms')? -function valueOf$1 () { - return ( - this._milliseconds + - this._days * 864e5 + - (this._months % 12) * 2592e6 + - toInt(this._months / 12) * 31536e6 - ); -} - -function makeAs (alias) { - return function () { - return this.as(alias); - }; -} - -var asMilliseconds = makeAs('ms'); -var asSeconds = makeAs('s'); -var asMinutes = makeAs('m'); -var asHours = makeAs('h'); -var asDays = makeAs('d'); -var asWeeks = makeAs('w'); -var asMonths = makeAs('M'); -var asYears = makeAs('y'); - -function get$2 (units) { - units = normalizeUnits(units); - return this[units + 's'](); -} - -function makeGetter(name) { - return function () { - return this._data[name]; - }; -} - -var milliseconds = makeGetter('milliseconds'); -var seconds = makeGetter('seconds'); -var minutes = makeGetter('minutes'); -var hours = makeGetter('hours'); -var days = makeGetter('days'); -var months = makeGetter('months'); -var years = makeGetter('years'); - -function weeks () { - return absFloor(this.days() / 7); -} - -var round = Math.round; -var thresholds = { - s: 45, // seconds to minute - m: 45, // minutes to hour - h: 22, // hours to day - d: 26, // days to month - M: 11 // months to year -}; - -// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize -function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { - return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); -} - -function relativeTime$1 (posNegDuration, withoutSuffix, locale) { - var duration = createDuration(posNegDuration).abs(); - var seconds = round(duration.as('s')); - var minutes = round(duration.as('m')); - var hours = round(duration.as('h')); - var days = round(duration.as('d')); - var months = round(duration.as('M')); - var years = round(duration.as('y')); - - var a = seconds < thresholds.s && ['s', seconds] || - minutes <= 1 && ['m'] || - minutes < thresholds.m && ['mm', minutes] || - hours <= 1 && ['h'] || - hours < thresholds.h && ['hh', hours] || - days <= 1 && ['d'] || - days < thresholds.d && ['dd', days] || - months <= 1 && ['M'] || - months < thresholds.M && ['MM', months] || - years <= 1 && ['y'] || ['yy', years]; - - a[2] = withoutSuffix; - a[3] = +posNegDuration > 0; - a[4] = locale; - return substituteTimeAgo.apply(null, a); -} - -// This function allows you to set the rounding function for relative time strings -function getSetRelativeTimeRounding (roundingFunction) { - if (roundingFunction === undefined) { - return round; - } - if (typeof(roundingFunction) === 'function') { - round = roundingFunction; - return true; - } - return false; -} - -// This function allows you to set a threshold for relative time strings -function getSetRelativeTimeThreshold (threshold, limit) { - if (thresholds[threshold] === undefined) { - return false; - } - if (limit === undefined) { - return thresholds[threshold]; - } - thresholds[threshold] = limit; - return true; -} - -function humanize (withSuffix) { - var locale = this.localeData(); - var output = relativeTime$1(this, !withSuffix, locale); - - if (withSuffix) { - output = locale.pastFuture(+this, output); - } - - return locale.postformat(output); -} - -var abs$1 = Math.abs; - -function toISOString$1() { - // for ISO strings we do not use the normal bubbling rules: - // * milliseconds bubble up until they become hours - // * days do not bubble at all - // * months bubble up until they become years - // This is because there is no context-free conversion between hours and days - // (think of clock changes) - // and also not between days and months (28-31 days per month) - var seconds = abs$1(this._milliseconds) / 1000; - var days = abs$1(this._days); - var months = abs$1(this._months); - var minutes, hours, years; - - // 3600 seconds -> 60 minutes -> 1 hour - minutes = absFloor(seconds / 60); - hours = absFloor(minutes / 60); - seconds %= 60; - minutes %= 60; - - // 12 months -> 1 year - years = absFloor(months / 12); - months %= 12; - - - // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js - var Y = years; - var M = months; - var D = days; - var h = hours; - var m = minutes; - var s = seconds; - var total = this.asSeconds(); - - if (!total) { - // this is the same as C#'s (Noda) and python (isodate)... - // but not other JS (goog.date) - return 'P0D'; - } - - return (total < 0 ? '-' : '') + - 'P' + - (Y ? Y + 'Y' : '') + - (M ? M + 'M' : '') + - (D ? D + 'D' : '') + - ((h || m || s) ? 'T' : '') + - (h ? h + 'H' : '') + - (m ? m + 'M' : '') + - (s ? s + 'S' : ''); -} - -var proto$2 = Duration.prototype; - -proto$2.abs = abs; -proto$2.add = add$1; -proto$2.subtract = subtract$1; -proto$2.as = as; -proto$2.asMilliseconds = asMilliseconds; -proto$2.asSeconds = asSeconds; -proto$2.asMinutes = asMinutes; -proto$2.asHours = asHours; -proto$2.asDays = asDays; -proto$2.asWeeks = asWeeks; -proto$2.asMonths = asMonths; -proto$2.asYears = asYears; -proto$2.valueOf = valueOf$1; -proto$2._bubble = bubble; -proto$2.get = get$2; -proto$2.milliseconds = milliseconds; -proto$2.seconds = seconds; -proto$2.minutes = minutes; -proto$2.hours = hours; -proto$2.days = days; -proto$2.weeks = weeks; -proto$2.months = months; -proto$2.years = years; -proto$2.humanize = humanize; -proto$2.toISOString = toISOString$1; -proto$2.toString = toISOString$1; -proto$2.toJSON = toISOString$1; -proto$2.locale = locale; -proto$2.localeData = localeData; - -// Deprecations -proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); -proto$2.lang = lang; - -// Side effect imports - -// FORMATTING - -addFormatToken('X', 0, 0, 'unix'); -addFormatToken('x', 0, 0, 'valueOf'); - -// PARSING - -addRegexToken('x', matchSigned); -addRegexToken('X', matchTimestamp); -addParseToken('X', function (input, array, config) { - config._d = new Date(parseFloat(input, 10) * 1000); -}); -addParseToken('x', function (input, array, config) { - config._d = new Date(toInt(input)); -}); - -// Side effect imports - -//! moment.js -//! version : 2.17.1 -//! authors : Tim Wood, Iskren Chernev, Moment.js contributors -//! license : MIT -//! momentjs.com - -hooks.version = '2.17.1'; - -setHookCallback(createLocal); - -hooks.fn = proto; -hooks.min = min; -hooks.max = max; -hooks.now = now; -hooks.utc = createUTC; -hooks.unix = createUnix; -hooks.months = listMonths; -hooks.isDate = isDate; -hooks.locale = getSetGlobalLocale; -hooks.invalid = createInvalid; -hooks.duration = createDuration; -hooks.isMoment = isMoment; -hooks.weekdays = listWeekdays; -hooks.parseZone = createInZone; -hooks.localeData = getLocale; -hooks.isDuration = isDuration; -hooks.monthsShort = listMonthsShort; -hooks.weekdaysMin = listWeekdaysMin; -hooks.defineLocale = defineLocale; -hooks.updateLocale = updateLocale; -hooks.locales = listLocales; -hooks.weekdaysShort = listWeekdaysShort; -hooks.normalizeUnits = normalizeUnits; -hooks.relativeTimeRounding = getSetRelativeTimeRounding; -hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; -hooks.calendarFormat = getCalendarFormat; -hooks.prototype = proto; - -//! moment.js locale configuration -//! locale : Afrikaans [af] -//! author : Werner Mollentze : https://github.com/wernerm - -hooks.defineLocale('af', { - months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), - monthsShort : 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), - weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), - weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), - weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), - meridiemParse: /vm|nm/i, - isPM : function (input) { - return /^nm$/i.test(input); - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 12) { - return isLower ? 'vm' : 'VM'; - } else { - return isLower ? 'nm' : 'NM'; - } - }, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Vandag om] LT', - nextDay : '[Môre om] LT', - nextWeek : 'dddd [om] LT', - lastDay : '[Gister om] LT', - lastWeek : '[Laas] dddd [om] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'oor %s', - past : '%s gelede', - s : '\'n paar sekondes', - m : '\'n minuut', - mm : '%d minute', - h : '\'n uur', - hh : '%d ure', - d : '\'n dag', - dd : '%d dae', - M : '\'n maand', - MM : '%d maande', - y : '\'n jaar', - yy : '%d jaar' - }, - ordinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter - }, - week : { - dow : 1, // Maandag is die eerste dag van die week. - doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. - } -}); - -//! moment.js locale configuration -//! locale : Arabic (Algeria) [ar-dz] -//! author : Noureddine LOUAHEDJ : https://github.com/noureddineme - -hooks.defineLocale('ar-dz', { - months : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - monthsShort : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'أح_إث_ثلا_أر_خم_جم_سب'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'في %s', - past : 'منذ %s', - s : 'ثوان', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 4 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Arabic (Lybia) [ar-ly] -//! author : Ali Hmer: https://github.com/kikoanis - -var symbolMap = { - '1': '1', - '2': '2', - '3': '3', - '4': '4', - '5': '5', - '6': '6', - '7': '7', - '8': '8', - '9': '9', - '0': '0' -}; -var pluralForm = function (n) { - return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; -}; -var plurals = { - s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], - m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], - h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], - d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], - M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], - y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] -}; -var pluralize = function (u) { - return function (number, withoutSuffix, string, isFuture) { - var f = pluralForm(number), - str = plurals[u][pluralForm(number)]; - if (f === 2) { - str = str[withoutSuffix ? 0 : 1]; - } - return str.replace(/%d/i, number); - }; -}; -var months$1 = [ - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'مايو', - 'يونيو', - 'يوليو', - 'أغسطس', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر' -]; - -hooks.defineLocale('ar-ly', { - months : months$1, - monthsShort : months$1, - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'D/\u200FM/\u200FYYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - meridiemParse: /ص|م/, - isPM : function (input) { - return 'م' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ص'; - } else { - return 'م'; - } - }, - calendar : { - sameDay: '[اليوم عند الساعة] LT', - nextDay: '[غدًا عند الساعة] LT', - nextWeek: 'dddd [عند الساعة] LT', - lastDay: '[أمس عند الساعة] LT', - lastWeek: 'dddd [عند الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'بعد %s', - past : 'منذ %s', - s : pluralize('s'), - m : pluralize('m'), - mm : pluralize('m'), - h : pluralize('h'), - hh : pluralize('h'), - d : pluralize('d'), - dd : pluralize('d'), - M : pluralize('M'), - MM : pluralize('M'), - y : pluralize('y'), - yy : pluralize('y') - }, - preparse: function (string) { - return string.replace(/\u200f/g, '').replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, '،'); - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Arabic (Morocco) [ar-ma] -//! author : ElFadili Yassine : https://github.com/ElFadiliY -//! author : Abdel Said : https://github.com/abdelsaid - -hooks.defineLocale('ar-ma', { - months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'في %s', - past : 'منذ %s', - s : 'ثوان', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Arabic (Saudi Arabia) [ar-sa] -//! author : Suhail Alkowaileet : https://github.com/xsoh - -var symbolMap$1 = { - '1': '١', - '2': '٢', - '3': '٣', - '4': '٤', - '5': '٥', - '6': '٦', - '7': '٧', - '8': '٨', - '9': '٩', - '0': '٠' -}; -var numberMap = { - '١': '1', - '٢': '2', - '٣': '3', - '٤': '4', - '٥': '5', - '٦': '6', - '٧': '7', - '٨': '8', - '٩': '9', - '٠': '0' -}; - -hooks.defineLocale('ar-sa', { - months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - meridiemParse: /ص|م/, - isPM : function (input) { - return 'م' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ص'; - } else { - return 'م'; - } - }, - calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'في %s', - past : 'منذ %s', - s : 'ثوان', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' - }, - preparse: function (string) { - return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { - return numberMap[match]; - }).replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap$1[match]; - }).replace(/,/g, '،'); - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Arabic (Tunisia) [ar-tn] -//! author : Nader Toukabri : https://github.com/naderio - -hooks.defineLocale('ar-tn', { - months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY HH:mm', - LLLL: 'dddd D MMMM YYYY HH:mm' - }, - calendar: { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' - }, - relativeTime: { - future: 'في %s', - past: 'منذ %s', - s: 'ثوان', - m: 'دقيقة', - mm: '%d دقائق', - h: 'ساعة', - hh: '%d ساعات', - d: 'يوم', - dd: '%d أيام', - M: 'شهر', - MM: '%d أشهر', - y: 'سنة', - yy: '%d سنوات' - }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Arabic [ar] -//! author : Abdel Said: https://github.com/abdelsaid -//! author : Ahmed Elkhatib -//! author : forabi https://github.com/forabi - -var symbolMap$2 = { - '1': '١', - '2': '٢', - '3': '٣', - '4': '٤', - '5': '٥', - '6': '٦', - '7': '٧', - '8': '٨', - '9': '٩', - '0': '٠' -}; -var numberMap$1 = { - '١': '1', - '٢': '2', - '٣': '3', - '٤': '4', - '٥': '5', - '٦': '6', - '٧': '7', - '٨': '8', - '٩': '9', - '٠': '0' -}; -var pluralForm$1 = function (n) { - return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; -}; -var plurals$1 = { - s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], - m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], - h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], - d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], - M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], - y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] -}; -var pluralize$1 = function (u) { - return function (number, withoutSuffix, string, isFuture) { - var f = pluralForm$1(number), - str = plurals$1[u][pluralForm$1(number)]; - if (f === 2) { - str = str[withoutSuffix ? 0 : 1]; - } - return str.replace(/%d/i, number); - }; -}; -var months$2 = [ - 'كانون الثاني يناير', - 'شباط فبراير', - 'آذار مارس', - 'نيسان أبريل', - 'أيار مايو', - 'حزيران يونيو', - 'تموز يوليو', - 'آب أغسطس', - 'أيلول سبتمبر', - 'تشرين الأول أكتوبر', - 'تشرين الثاني نوفمبر', - 'كانون الأول ديسمبر' -]; - -hooks.defineLocale('ar', { - months : months$2, - monthsShort : months$2, - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'D/\u200FM/\u200FYYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - meridiemParse: /ص|م/, - isPM : function (input) { - return 'م' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ص'; - } else { - return 'م'; - } - }, - calendar : { - sameDay: '[اليوم عند الساعة] LT', - nextDay: '[غدًا عند الساعة] LT', - nextWeek: 'dddd [عند الساعة] LT', - lastDay: '[أمس عند الساعة] LT', - lastWeek: 'dddd [عند الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'بعد %s', - past : 'منذ %s', - s : pluralize$1('s'), - m : pluralize$1('m'), - mm : pluralize$1('m'), - h : pluralize$1('h'), - hh : pluralize$1('h'), - d : pluralize$1('d'), - dd : pluralize$1('d'), - M : pluralize$1('M'), - MM : pluralize$1('M'), - y : pluralize$1('y'), - yy : pluralize$1('y') - }, - preparse: function (string) { - return string.replace(/\u200f/g, '').replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { - return numberMap$1[match]; - }).replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap$2[match]; - }).replace(/,/g, '،'); - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Azerbaijani [az] -//! author : topchiyev : https://github.com/topchiyev - -var suffixes = { - 1: '-inci', - 5: '-inci', - 8: '-inci', - 70: '-inci', - 80: '-inci', - 2: '-nci', - 7: '-nci', - 20: '-nci', - 50: '-nci', - 3: '-üncü', - 4: '-üncü', - 100: '-üncü', - 6: '-ncı', - 9: '-uncu', - 10: '-uncu', - 30: '-uncu', - 60: '-ıncı', - 90: '-ıncı' -}; - -hooks.defineLocale('az', { - months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), - monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), - weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'), - weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), - weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[bugün saat] LT', - nextDay : '[sabah saat] LT', - nextWeek : '[gələn həftə] dddd [saat] LT', - lastDay : '[dünən] LT', - lastWeek : '[keçən həftə] dddd [saat] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s sonra', - past : '%s əvvəl', - s : 'birneçə saniyyə', - m : 'bir dəqiqə', - mm : '%d dəqiqə', - h : 'bir saat', - hh : '%d saat', - d : 'bir gün', - dd : '%d gün', - M : 'bir ay', - MM : '%d ay', - y : 'bir il', - yy : '%d il' - }, - meridiemParse: /gecə|səhər|gündüz|axşam/, - isPM : function (input) { - return /^(gündüz|axşam)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'gecə'; - } else if (hour < 12) { - return 'səhər'; - } else if (hour < 17) { - return 'gündüz'; - } else { - return 'axşam'; - } - }, - ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, - ordinal : function (number) { - if (number === 0) { // special case for zero - return number + '-ıncı'; - } - var a = number % 10, - b = number % 100 - a, - c = number >= 100 ? 100 : null; - return number + (suffixes[a] || suffixes[b] || suffixes[c]); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Belarusian [be] -//! author : Dmitry Demidov : https://github.com/demidov91 -//! author: Praleska: http://praleska.pro/ -//! Author : Menelion Elensúle : https://github.com/Oire - -function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); -} -function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', - 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', - 'dd': 'дзень_дні_дзён', - 'MM': 'месяц_месяцы_месяцаў', - 'yy': 'год_гады_гадоў' - }; - if (key === 'm') { - return withoutSuffix ? 'хвіліна' : 'хвіліну'; - } - else if (key === 'h') { - return withoutSuffix ? 'гадзіна' : 'гадзіну'; - } - else { - return number + ' ' + plural(format[key], +number); - } -} - -hooks.defineLocale('be', { - months : { - format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'), - standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_') - }, - monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'), - weekdays : { - format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'), - standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'), - isFormat: /\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/ - }, - weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'), - weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY г.', - LLL : 'D MMMM YYYY г., HH:mm', - LLLL : 'dddd, D MMMM YYYY г., HH:mm' - }, - calendar : { - sameDay: '[Сёння ў] LT', - nextDay: '[Заўтра ў] LT', - lastDay: '[Учора ў] LT', - nextWeek: function () { - return '[У] dddd [ў] LT'; - }, - lastWeek: function () { - switch (this.day()) { - case 0: - case 3: - case 5: - case 6: - return '[У мінулую] dddd [ў] LT'; - case 1: - case 2: - case 4: - return '[У мінулы] dddd [ў] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'праз %s', - past : '%s таму', - s : 'некалькі секунд', - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : relativeTimeWithPlural, - hh : relativeTimeWithPlural, - d : 'дзень', - dd : relativeTimeWithPlural, - M : 'месяц', - MM : relativeTimeWithPlural, - y : 'год', - yy : relativeTimeWithPlural - }, - meridiemParse: /ночы|раніцы|дня|вечара/, - isPM : function (input) { - return /^(дня|вечара)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночы'; - } else if (hour < 12) { - return 'раніцы'; - } else if (hour < 17) { - return 'дня'; - } else { - return 'вечара'; - } - }, - ordinalParse: /\d{1,2}-(і|ы|га)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - case 'w': - case 'W': - return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы'; - case 'D': - return number + '-га'; - default: - return number; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Bulgarian [bg] -//! author : Krasen Borisov : https://github.com/kraz - -hooks.defineLocale('bg', { - months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'), - monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'), - weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'), - weekdaysShort : 'нед_пон_вто_сря_чет_пет_съб'.split('_'), - weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'D.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY H:mm', - LLLL : 'dddd, D MMMM YYYY H:mm' - }, - calendar : { - sameDay : '[Днес в] LT', - nextDay : '[Утре в] LT', - nextWeek : 'dddd [в] LT', - lastDay : '[Вчера в] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - case 6: - return '[В изминалата] dddd [в] LT'; - case 1: - case 2: - case 4: - case 5: - return '[В изминалия] dddd [в] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'след %s', - past : 'преди %s', - s : 'няколко секунди', - m : 'минута', - mm : '%d минути', - h : 'час', - hh : '%d часа', - d : 'ден', - dd : '%d дни', - M : 'месец', - MM : '%d месеца', - y : 'година', - yy : '%d години' - }, - ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, - ordinal : function (number) { - var lastDigit = number % 10, - last2Digits = number % 100; - if (number === 0) { - return number + '-ев'; - } else if (last2Digits === 0) { - return number + '-ен'; - } else if (last2Digits > 10 && last2Digits < 20) { - return number + '-ти'; - } else if (lastDigit === 1) { - return number + '-ви'; - } else if (lastDigit === 2) { - return number + '-ри'; - } else if (lastDigit === 7 || lastDigit === 8) { - return number + '-ми'; - } else { - return number + '-ти'; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Bengali [bn] -//! author : Kaushik Gandhi : https://github.com/kaushikgandhi - -var symbolMap$3 = { - '1': '১', - '2': '২', - '3': '৩', - '4': '৪', - '5': '৫', - '6': '৬', - '7': '৭', - '8': '৮', - '9': '৯', - '0': '০' -}; -var numberMap$2 = { - '১': '1', - '২': '2', - '৩': '3', - '৪': '4', - '৫': '5', - '৬': '6', - '৭': '7', - '৮': '8', - '৯': '9', - '০': '0' -}; - -hooks.defineLocale('bn', { - months : 'জানুয়ারী_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'), - monthsShort : 'জানু_ফেব_মার্চ_এপ্র_মে_জুন_জুল_আগ_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'), - weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'), - weekdaysShort : 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'), - weekdaysMin : 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'), - longDateFormat : { - LT : 'A h:mm সময়', - LTS : 'A h:mm:ss সময়', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm সময়', - LLLL : 'dddd, D MMMM YYYY, A h:mm সময়' - }, - calendar : { - sameDay : '[আজ] LT', - nextDay : '[আগামীকাল] LT', - nextWeek : 'dddd, LT', - lastDay : '[গতকাল] LT', - lastWeek : '[গত] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s পরে', - past : '%s আগে', - s : 'কয়েক সেকেন্ড', - m : 'এক মিনিট', - mm : '%d মিনিট', - h : 'এক ঘন্টা', - hh : '%d ঘন্টা', - d : 'এক দিন', - dd : '%d দিন', - M : 'এক মাস', - MM : '%d মাস', - y : 'এক বছর', - yy : '%d বছর' - }, - preparse: function (string) { - return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { - return numberMap$2[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap$3[match]; - }); - }, - meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if ((meridiem === 'রাত' && hour >= 4) || - (meridiem === 'দুপুর' && hour < 5) || - meridiem === 'বিকাল') { - return hour + 12; - } else { - return hour; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'রাত'; - } else if (hour < 10) { - return 'সকাল'; - } else if (hour < 17) { - return 'দুপুর'; - } else if (hour < 20) { - return 'বিকাল'; - } else { - return 'রাত'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Tibetan [bo] -//! author : Thupten N. Chakrishar : https://github.com/vajradog - -var symbolMap$4 = { - '1': '༡', - '2': '༢', - '3': '༣', - '4': '༤', - '5': '༥', - '6': '༦', - '7': '༧', - '8': '༨', - '9': '༩', - '0': '༠' -}; -var numberMap$3 = { - '༡': '1', - '༢': '2', - '༣': '3', - '༤': '4', - '༥': '5', - '༦': '6', - '༧': '7', - '༨': '8', - '༩': '9', - '༠': '0' -}; - -hooks.defineLocale('bo', { - months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), - monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), - weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), - weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), - weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), - longDateFormat : { - LT : 'A h:mm', - LTS : 'A h:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm', - LLLL : 'dddd, D MMMM YYYY, A h:mm' - }, - calendar : { - sameDay : '[དི་རིང] LT', - nextDay : '[སང་ཉིན] LT', - nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', - lastDay : '[ཁ་སང] LT', - lastWeek : '[བདུན་ཕྲག་མཐའ་མ] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s ལ་', - past : '%s སྔན་ལ', - s : 'ལམ་སང', - m : 'སྐར་མ་གཅིག', - mm : '%d སྐར་མ', - h : 'ཆུ་ཚོད་གཅིག', - hh : '%d ཆུ་ཚོད', - d : 'ཉིན་གཅིག', - dd : '%d ཉིན་', - M : 'ཟླ་བ་གཅིག', - MM : '%d ཟླ་བ', - y : 'ལོ་གཅིག', - yy : '%d ལོ' - }, - preparse: function (string) { - return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { - return numberMap$3[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap$4[match]; - }); - }, - meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if ((meridiem === 'མཚན་མོ' && hour >= 4) || - (meridiem === 'ཉིན་གུང' && hour < 5) || - meridiem === 'དགོང་དག') { - return hour + 12; - } else { - return hour; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'མཚན་མོ'; - } else if (hour < 10) { - return 'ཞོགས་ཀས'; - } else if (hour < 17) { - return 'ཉིན་གུང'; - } else if (hour < 20) { - return 'དགོང་དག'; - } else { - return 'མཚན་མོ'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Breton [br] -//! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou - -function relativeTimeWithMutation(number, withoutSuffix, key) { - var format = { - 'mm': 'munutenn', - 'MM': 'miz', - 'dd': 'devezh' - }; - return number + ' ' + mutation(format[key], number); -} -function specialMutationForYears(number) { - switch (lastNumber(number)) { - case 1: - case 3: - case 4: - case 5: - case 9: - return number + ' bloaz'; - default: - return number + ' vloaz'; - } -} -function lastNumber(number) { - if (number > 9) { - return lastNumber(number % 10); - } - return number; -} -function mutation(text, number) { - if (number === 2) { - return softMutation(text); - } - return text; -} -function softMutation(text) { - var mutationTable = { - 'm': 'v', - 'b': 'v', - 'd': 'z' - }; - if (mutationTable[text.charAt(0)] === undefined) { - return text; - } - return mutationTable[text.charAt(0)] + text.substring(1); -} - -hooks.defineLocale('br', { - months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), - monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), - weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), - weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), - weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'h[e]mm A', - LTS : 'h[e]mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D [a viz] MMMM YYYY', - LLL : 'D [a viz] MMMM YYYY h[e]mm A', - LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A' - }, - calendar : { - sameDay : '[Hiziv da] LT', - nextDay : '[Warc\'hoazh da] LT', - nextWeek : 'dddd [da] LT', - lastDay : '[Dec\'h da] LT', - lastWeek : 'dddd [paset da] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'a-benn %s', - past : '%s \'zo', - s : 'un nebeud segondennoù', - m : 'ur vunutenn', - mm : relativeTimeWithMutation, - h : 'un eur', - hh : '%d eur', - d : 'un devezh', - dd : relativeTimeWithMutation, - M : 'ur miz', - MM : relativeTimeWithMutation, - y : 'ur bloaz', - yy : specialMutationForYears - }, - ordinalParse: /\d{1,2}(añ|vet)/, - ordinal : function (number) { - var output = (number === 1) ? 'añ' : 'vet'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Bosnian [bs] -//! author : Nedim Cholich : https://github.com/frontyard -//! based on (hr) translation by Bojan Marković - -function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'm': - return withoutSuffix ? 'jedna minuta' : 'jedne minute'; - case 'mm': - if (number === 1) { - result += 'minuta'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'minute'; - } else { - result += 'minuta'; - } - return result; - case 'h': - return withoutSuffix ? 'jedan sat' : 'jednog sata'; - case 'hh': - if (number === 1) { - result += 'sat'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sata'; - } else { - result += 'sati'; - } - return result; - case 'dd': - if (number === 1) { - result += 'dan'; - } else { - result += 'dana'; - } - return result; - case 'MM': - if (number === 1) { - result += 'mjesec'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'mjeseca'; - } else { - result += 'mjeseci'; - } - return result; - case 'yy': - if (number === 1) { - result += 'godina'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'godine'; - } else { - result += 'godina'; - } - return result; - } -} - -hooks.defineLocale('bs', { - months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), - monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), - weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), - weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd, D. MMMM YYYY H:mm' - }, - calendar : { - sameDay : '[danas u] LT', - nextDay : '[sutra u] LT', - nextWeek : function () { - switch (this.day()) { - case 0: - return '[u] [nedjelju] [u] LT'; - case 3: - return '[u] [srijedu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[jučer u] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - return '[prošlu] dddd [u] LT'; - case 6: - return '[prošle] [subote] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[prošli] dddd [u] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'prije %s', - s : 'par sekundi', - m : translate, - mm : translate, - h : translate, - hh : translate, - d : 'dan', - dd : translate, - M : 'mjesec', - MM : translate, - y : 'godinu', - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Catalan [ca] -//! author : Juan G. Hurtado : https://github.com/juanghurtado - -hooks.defineLocale('ca', { - months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), - monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'), - monthsParseExact : true, - weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), - weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), - weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY H:mm', - LLLL : 'dddd D MMMM YYYY H:mm' - }, - calendar : { - sameDay : function () { - return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - nextDay : function () { - return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - lastDay : function () { - return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'd\'aquí %s', - past : 'fa %s', - s : 'uns segons', - m : 'un minut', - mm : '%d minuts', - h : 'una hora', - hh : '%d hores', - d : 'un dia', - dd : '%d dies', - M : 'un mes', - MM : '%d mesos', - y : 'un any', - yy : '%d anys' - }, - ordinalParse: /\d{1,2}(r|n|t|è|a)/, - ordinal : function (number, period) { - var output = (number === 1) ? 'r' : - (number === 2) ? 'n' : - (number === 3) ? 'r' : - (number === 4) ? 't' : 'è'; - if (period === 'w' || period === 'W') { - output = 'a'; - } - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Czech [cs] -//! author : petrbela : https://github.com/petrbela - -var months$3 = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'); -var monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'); -function plural$1(n) { - return (n > 1) && (n < 5) && (~~(n / 10) !== 1); -} -function translate$1(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': // a few seconds / in a few seconds / a few seconds ago - return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; - case 'm': // a minute / in a minute / a minute ago - return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); - case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago - if (withoutSuffix || isFuture) { - return result + (plural$1(number) ? 'minuty' : 'minut'); - } else { - return result + 'minutami'; - } - break; - case 'h': // an hour / in an hour / an hour ago - return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); - case 'hh': // 9 hours / in 9 hours / 9 hours ago - if (withoutSuffix || isFuture) { - return result + (plural$1(number) ? 'hodiny' : 'hodin'); - } else { - return result + 'hodinami'; - } - break; - case 'd': // a day / in a day / a day ago - return (withoutSuffix || isFuture) ? 'den' : 'dnem'; - case 'dd': // 9 days / in 9 days / 9 days ago - if (withoutSuffix || isFuture) { - return result + (plural$1(number) ? 'dny' : 'dní'); - } else { - return result + 'dny'; - } - break; - case 'M': // a month / in a month / a month ago - return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem'; - case 'MM': // 9 months / in 9 months / 9 months ago - if (withoutSuffix || isFuture) { - return result + (plural$1(number) ? 'měsíce' : 'měsíců'); - } else { - return result + 'měsíci'; - } - break; - case 'y': // a year / in a year / a year ago - return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; - case 'yy': // 9 years / in 9 years / 9 years ago - if (withoutSuffix || isFuture) { - return result + (plural$1(number) ? 'roky' : 'let'); - } else { - return result + 'lety'; - } - break; - } -} - -hooks.defineLocale('cs', { - months : months$3, - monthsShort : monthsShort, - monthsParse : (function (months, monthsShort) { - var i, _monthsParse = []; - for (i = 0; i < 12; i++) { - // use custom parser to solve problem with July (červenec) - _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); - } - return _monthsParse; - }(months$3, monthsShort)), - shortMonthsParse : (function (monthsShort) { - var i, _shortMonthsParse = []; - for (i = 0; i < 12; i++) { - _shortMonthsParse[i] = new RegExp('^' + monthsShort[i] + '$', 'i'); - } - return _shortMonthsParse; - }(monthsShort)), - longMonthsParse : (function (months) { - var i, _longMonthsParse = []; - for (i = 0; i < 12; i++) { - _longMonthsParse[i] = new RegExp('^' + months[i] + '$', 'i'); - } - return _longMonthsParse; - }(months$3)), - weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'), - weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'), - weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'), - longDateFormat : { - LT: 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd D. MMMM YYYY H:mm', - l : 'D. M. YYYY' - }, - calendar : { - sameDay: '[dnes v] LT', - nextDay: '[zítra v] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[v neděli v] LT'; - case 1: - case 2: - return '[v] dddd [v] LT'; - case 3: - return '[ve středu v] LT'; - case 4: - return '[ve čtvrtek v] LT'; - case 5: - return '[v pátek v] LT'; - case 6: - return '[v sobotu v] LT'; - } - }, - lastDay: '[včera v] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[minulou neděli v] LT'; - case 1: - case 2: - return '[minulé] dddd [v] LT'; - case 3: - return '[minulou středu v] LT'; - case 4: - case 5: - return '[minulý] dddd [v] LT'; - case 6: - return '[minulou sobotu v] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : 'před %s', - s : translate$1, - m : translate$1, - mm : translate$1, - h : translate$1, - hh : translate$1, - d : translate$1, - dd : translate$1, - M : translate$1, - MM : translate$1, - y : translate$1, - yy : translate$1 - }, - ordinalParse : /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Chuvash [cv] -//! author : Anatoly Mironov : https://github.com/mirontoli - -hooks.defineLocale('cv', { - months : 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'), - monthsShort : 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'), - weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'), - weekdaysShort : 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'), - weekdaysMin : 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD-MM-YYYY', - LL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]', - LLL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm', - LLLL : 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm' - }, - calendar : { - sameDay: '[Паян] LT [сехетре]', - nextDay: '[Ыран] LT [сехетре]', - lastDay: '[Ӗнер] LT [сехетре]', - nextWeek: '[Ҫитес] dddd LT [сехетре]', - lastWeek: '[Иртнӗ] dddd LT [сехетре]', - sameElse: 'L' - }, - relativeTime : { - future : function (output) { - var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран'; - return output + affix; - }, - past : '%s каялла', - s : 'пӗр-ик ҫеккунт', - m : 'пӗр минут', - mm : '%d минут', - h : 'пӗр сехет', - hh : '%d сехет', - d : 'пӗр кун', - dd : '%d кун', - M : 'пӗр уйӑх', - MM : '%d уйӑх', - y : 'пӗр ҫул', - yy : '%d ҫул' - }, - ordinalParse: /\d{1,2}-мӗш/, - ordinal : '%d-мӗш', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Welsh [cy] -//! author : Robert Allen : https://github.com/robgallen -//! author : https://github.com/ryangreaves - -hooks.defineLocale('cy', { - months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), - monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), - weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), - weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), - weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), - weekdaysParseExact : true, - // time formats are the same as en-gb - longDateFormat: { - LT: 'HH:mm', - LTS : 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY HH:mm', - LLLL: 'dddd, D MMMM YYYY HH:mm' - }, - calendar: { - sameDay: '[Heddiw am] LT', - nextDay: '[Yfory am] LT', - nextWeek: 'dddd [am] LT', - lastDay: '[Ddoe am] LT', - lastWeek: 'dddd [diwethaf am] LT', - sameElse: 'L' - }, - relativeTime: { - future: 'mewn %s', - past: '%s yn ôl', - s: 'ychydig eiliadau', - m: 'munud', - mm: '%d munud', - h: 'awr', - hh: '%d awr', - d: 'diwrnod', - dd: '%d diwrnod', - M: 'mis', - MM: '%d mis', - y: 'blwyddyn', - yy: '%d flynedd' - }, - ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, - // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh - ordinal: function (number) { - var b = number, - output = '', - lookup = [ - '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed - 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed - ]; - if (b > 20) { - if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { - output = 'fed'; // not 30ain, 70ain or 90ain - } else { - output = 'ain'; - } - } else if (b > 0) { - output = lookup[b]; - } - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Danish [da] -//! author : Ulrik Nielsen : https://github.com/mrbase - -hooks.defineLocale('da', { - months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), - weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), - weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY HH:mm', - LLLL : 'dddd [d.] D. MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[I dag kl.] LT', - nextDay : '[I morgen kl.] LT', - nextWeek : 'dddd [kl.] LT', - lastDay : '[I går kl.] LT', - lastWeek : '[sidste] dddd [kl] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'om %s', - past : '%s siden', - s : 'få sekunder', - m : 'et minut', - mm : '%d minutter', - h : 'en time', - hh : '%d timer', - d : 'en dag', - dd : '%d dage', - M : 'en måned', - MM : '%d måneder', - y : 'et år', - yy : '%d år' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : German (Austria) [de-at] -//! author : lluchs : https://github.com/lluchs -//! author: Menelion Elensúle: https://github.com/Oire -//! author : Martin Groller : https://github.com/MadMG -//! author : Mikolaj Dadela : https://github.com/mik01aj - -function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eine Minute', 'einer Minute'], - 'h': ['eine Stunde', 'einer Stunde'], - 'd': ['ein Tag', 'einem Tag'], - 'dd': [number + ' Tage', number + ' Tagen'], - 'M': ['ein Monat', 'einem Monat'], - 'MM': [number + ' Monate', number + ' Monaten'], - 'y': ['ein Jahr', 'einem Jahr'], - 'yy': [number + ' Jahre', number + ' Jahren'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; -} - -hooks.defineLocale('de-at', { - months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), - monthsParseExact : true, - weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), - weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), - weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY HH:mm', - LLLL : 'dddd, D. MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[heute um] LT [Uhr]', - sameElse: 'L', - nextDay: '[morgen um] LT [Uhr]', - nextWeek: 'dddd [um] LT [Uhr]', - lastDay: '[gestern um] LT [Uhr]', - lastWeek: '[letzten] dddd [um] LT [Uhr]' - }, - relativeTime : { - future : 'in %s', - past : 'vor %s', - s : 'ein paar Sekunden', - m : processRelativeTime, - mm : '%d Minuten', - h : processRelativeTime, - hh : '%d Stunden', - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : German [de] -//! author : lluchs : https://github.com/lluchs -//! author: Menelion Elensúle: https://github.com/Oire -//! author : Mikolaj Dadela : https://github.com/mik01aj - -function processRelativeTime$1(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eine Minute', 'einer Minute'], - 'h': ['eine Stunde', 'einer Stunde'], - 'd': ['ein Tag', 'einem Tag'], - 'dd': [number + ' Tage', number + ' Tagen'], - 'M': ['ein Monat', 'einem Monat'], - 'MM': [number + ' Monate', number + ' Monaten'], - 'y': ['ein Jahr', 'einem Jahr'], - 'yy': [number + ' Jahre', number + ' Jahren'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; -} - -hooks.defineLocale('de', { - months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), - monthsParseExact : true, - weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), - weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), - weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY HH:mm', - LLLL : 'dddd, D. MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[heute um] LT [Uhr]', - sameElse: 'L', - nextDay: '[morgen um] LT [Uhr]', - nextWeek: 'dddd [um] LT [Uhr]', - lastDay: '[gestern um] LT [Uhr]', - lastWeek: '[letzten] dddd [um] LT [Uhr]' - }, - relativeTime : { - future : 'in %s', - past : 'vor %s', - s : 'ein paar Sekunden', - m : processRelativeTime$1, - mm : '%d Minuten', - h : processRelativeTime$1, - hh : '%d Stunden', - d : processRelativeTime$1, - dd : processRelativeTime$1, - M : processRelativeTime$1, - MM : processRelativeTime$1, - y : processRelativeTime$1, - yy : processRelativeTime$1 - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Maldivian [dv] -//! author : Jawish Hameed : https://github.com/jawish - -var months$4 = [ - 'ޖެނުއަރީ', - 'ފެބްރުއަރީ', - 'މާރިޗު', - 'އޭޕްރީލު', - 'މޭ', - 'ޖޫން', - 'ޖުލައި', - 'އޯގަސްޓު', - 'ސެޕްޓެމްބަރު', - 'އޮކްޓޯބަރު', - 'ނޮވެމްބަރު', - 'ޑިސެމްބަރު' -]; -var weekdays = [ - 'އާދިއްތަ', - 'ހޯމަ', - 'އަންގާރަ', - 'ބުދަ', - 'ބުރާސްފަތި', - 'ހުކުރު', - 'ހޮނިހިރު' -]; - -hooks.defineLocale('dv', { - months : months$4, - monthsShort : months$4, - weekdays : weekdays, - weekdaysShort : weekdays, - weekdaysMin : 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'), - longDateFormat : { - - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'D/M/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - meridiemParse: /މކ|މފ/, - isPM : function (input) { - return 'މފ' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'މކ'; - } else { - return 'މފ'; - } - }, - calendar : { - sameDay : '[މިއަދު] LT', - nextDay : '[މާދަމާ] LT', - nextWeek : 'dddd LT', - lastDay : '[އިއްޔެ] LT', - lastWeek : '[ފާއިތުވި] dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : 'ތެރޭގައި %s', - past : 'ކުރިން %s', - s : 'ސިކުންތުކޮޅެއް', - m : 'މިނިޓެއް', - mm : 'މިނިޓު %d', - h : 'ގަޑިއިރެއް', - hh : 'ގަޑިއިރު %d', - d : 'ދުވަހެއް', - dd : 'ދުވަސް %d', - M : 'މަހެއް', - MM : 'މަސް %d', - y : 'އަހަރެއް', - yy : 'އަހަރު %d' - }, - preparse: function (string) { - return string.replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/,/g, '،'); - }, - week : { - dow : 7, // Sunday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Greek [el] -//! author : Aggelos Karalias : https://github.com/mehiel - -hooks.defineLocale('el', { - monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'), - monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'), - months : function (momentToFormat, format) { - if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' - return this._monthsGenitiveEl[momentToFormat.month()]; - } else { - return this._monthsNominativeEl[momentToFormat.month()]; - } - }, - monthsShort : 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'), - weekdays : 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'), - weekdaysShort : 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'), - weekdaysMin : 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'), - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'μμ' : 'ΜΜ'; - } else { - return isLower ? 'πμ' : 'ΠΜ'; - } - }, - isPM : function (input) { - return ((input + '').toLowerCase()[0] === 'μ'); - }, - meridiemParse : /[ΠΜ]\.?Μ?\.?/i, - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' - }, - calendarEl : { - sameDay : '[Σήμερα {}] LT', - nextDay : '[Αύριο {}] LT', - nextWeek : 'dddd [{}] LT', - lastDay : '[Χθες {}] LT', - lastWeek : function () { - switch (this.day()) { - case 6: - return '[το προηγούμενο] dddd [{}] LT'; - default: - return '[την προηγούμενη] dddd [{}] LT'; - } - }, - sameElse : 'L' - }, - calendar : function (key, mom) { - var output = this._calendarEl[key], - hours = mom && mom.hours(); - if (isFunction(output)) { - output = output.apply(mom); - } - return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); - }, - relativeTime : { - future : 'σε %s', - past : '%s πριν', - s : 'λίγα δευτερόλεπτα', - m : 'ένα λεπτό', - mm : '%d λεπτά', - h : 'μία ώρα', - hh : '%d ώρες', - d : 'μία μέρα', - dd : '%d μέρες', - M : 'ένας μήνας', - MM : '%d μήνες', - y : 'ένας χρόνος', - yy : '%d χρόνια' - }, - ordinalParse: /\d{1,2}η/, - ordinal: '%dη', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : English (Australia) [en-au] -//! author : Jared Morse : https://github.com/jarcoal - -hooks.defineLocale('en-au', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - ordinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : English (Canada) [en-ca] -//! author : Jonathan Abourbih : https://github.com/jonbca - -hooks.defineLocale('en-ca', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'YYYY-MM-DD', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY h:mm A', - LLLL : 'dddd, MMMM D, YYYY h:mm A' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - ordinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } -}); - -//! moment.js locale configuration -//! locale : English (United Kingdom) [en-gb] -//! author : Chris Gedrim : https://github.com/chrisgedrim - -hooks.defineLocale('en-gb', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - ordinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : English (Ireland) [en-ie] -//! author : Chris Cartlidge : https://github.com/chriscartlidge - -hooks.defineLocale('en-ie', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD-MM-YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - ordinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : English (New Zealand) [en-nz] -//! author : Luke McGregor : https://github.com/lukemcgregor - -hooks.defineLocale('en-nz', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - ordinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Esperanto [eo] -//! author : Colin Dean : https://github.com/colindean -//! komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko. -//! Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni! - -hooks.defineLocale('eo', { - months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'), - weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato'.split('_'), - weekdaysShort : 'Dim_Lun_Mard_Merk_Ĵaŭ_Ven_Sab'.split('_'), - weekdaysMin : 'Di_Lu_Ma_Me_Ĵa_Ve_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'D[-an de] MMMM, YYYY', - LLL : 'D[-an de] MMMM, YYYY HH:mm', - LLLL : 'dddd, [la] D[-an de] MMMM, YYYY HH:mm' - }, - meridiemParse: /[ap]\.t\.m/i, - isPM: function (input) { - return input.charAt(0).toLowerCase() === 'p'; - }, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'p.t.m.' : 'P.T.M.'; - } else { - return isLower ? 'a.t.m.' : 'A.T.M.'; - } - }, - calendar : { - sameDay : '[Hodiaŭ je] LT', - nextDay : '[Morgaŭ je] LT', - nextWeek : 'dddd [je] LT', - lastDay : '[Hieraŭ je] LT', - lastWeek : '[pasinta] dddd [je] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'je %s', - past : 'antaŭ %s', - s : 'sekundoj', - m : 'minuto', - mm : '%d minutoj', - h : 'horo', - hh : '%d horoj', - d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo - dd : '%d tagoj', - M : 'monato', - MM : '%d monatoj', - y : 'jaro', - yy : '%d jaroj' - }, - ordinalParse: /\d{1,2}a/, - ordinal : '%da', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Spanish (Dominican Republic) [es-do] - -var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'); -var monthsShort$1 = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); - -hooks.defineLocale('es-do', { - months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), - monthsShort : function (m, format) { - if (/-MMM-/.test(format)) { - return monthsShort$1[m.month()]; - } else { - return monthsShortDot[m.month()]; - } - }, - monthsParseExact : true, - weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), - weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), - weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY h:mm A', - LLLL : 'dddd, D [de] MMMM [de] YYYY h:mm A' - }, - calendar : { - sameDay : function () { - return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextDay : function () { - return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastDay : function () { - return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'en %s', - past : 'hace %s', - s : 'unos segundos', - m : 'un minuto', - mm : '%d minutos', - h : 'una hora', - hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', - MM : '%d meses', - y : 'un año', - yy : '%d años' - }, - ordinalParse : /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Spanish [es] -//! author : Julio Napurí : https://github.com/julionc - -var monthsShortDot$1 = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'); -var monthsShort$2 = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); - -hooks.defineLocale('es', { - months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), - monthsShort : function (m, format) { - if (/-MMM-/.test(format)) { - return monthsShort$2[m.month()]; - } else { - return monthsShortDot$1[m.month()]; - } - }, - monthsParseExact : true, - weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), - weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), - weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY H:mm', - LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm' - }, - calendar : { - sameDay : function () { - return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextDay : function () { - return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastDay : function () { - return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'en %s', - past : 'hace %s', - s : 'unos segundos', - m : 'un minuto', - mm : '%d minutos', - h : 'una hora', - hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', - MM : '%d meses', - y : 'un año', - yy : '%d años' - }, - ordinalParse : /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Estonian [et] -//! author : Henry Kehlmann : https://github.com/madhenry -//! improvements : Illimar Tambek : https://github.com/ragulka - -function processRelativeTime$2(number, withoutSuffix, key, isFuture) { - var format = { - 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], - 'm' : ['ühe minuti', 'üks minut'], - 'mm': [number + ' minuti', number + ' minutit'], - 'h' : ['ühe tunni', 'tund aega', 'üks tund'], - 'hh': [number + ' tunni', number + ' tundi'], - 'd' : ['ühe päeva', 'üks päev'], - 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], - 'MM': [number + ' kuu', number + ' kuud'], - 'y' : ['ühe aasta', 'aasta', 'üks aasta'], - 'yy': [number + ' aasta', number + ' aastat'] - }; - if (withoutSuffix) { - return format[key][2] ? format[key][2] : format[key][1]; - } - return isFuture ? format[key][0] : format[key][1]; -} - -hooks.defineLocale('et', { - months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), - monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), - weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), - weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), - weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd, D. MMMM YYYY H:mm' - }, - calendar : { - sameDay : '[Täna,] LT', - nextDay : '[Homme,] LT', - nextWeek : '[Järgmine] dddd LT', - lastDay : '[Eile,] LT', - lastWeek : '[Eelmine] dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s pärast', - past : '%s tagasi', - s : processRelativeTime$2, - m : processRelativeTime$2, - mm : processRelativeTime$2, - h : processRelativeTime$2, - hh : processRelativeTime$2, - d : processRelativeTime$2, - dd : '%d päeva', - M : processRelativeTime$2, - MM : processRelativeTime$2, - y : processRelativeTime$2, - yy : processRelativeTime$2 - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Basque [eu] -//! author : Eneko Illarramendi : https://github.com/eillarra - -hooks.defineLocale('eu', { - months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), - monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), - monthsParseExact : true, - weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), - weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), - weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'YYYY[ko] MMMM[ren] D[a]', - LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm', - LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm', - l : 'YYYY-M-D', - ll : 'YYYY[ko] MMM D[a]', - lll : 'YYYY[ko] MMM D[a] HH:mm', - llll : 'ddd, YYYY[ko] MMM D[a] HH:mm' - }, - calendar : { - sameDay : '[gaur] LT[etan]', - nextDay : '[bihar] LT[etan]', - nextWeek : 'dddd LT[etan]', - lastDay : '[atzo] LT[etan]', - lastWeek : '[aurreko] dddd LT[etan]', - sameElse : 'L' - }, - relativeTime : { - future : '%s barru', - past : 'duela %s', - s : 'segundo batzuk', - m : 'minutu bat', - mm : '%d minutu', - h : 'ordu bat', - hh : '%d ordu', - d : 'egun bat', - dd : '%d egun', - M : 'hilabete bat', - MM : '%d hilabete', - y : 'urte bat', - yy : '%d urte' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Persian [fa] -//! author : Ebrahim Byagowi : https://github.com/ebraminio - -var symbolMap$5 = { - '1': '۱', - '2': '۲', - '3': '۳', - '4': '۴', - '5': '۵', - '6': '۶', - '7': '۷', - '8': '۸', - '9': '۹', - '0': '۰' -}; -var numberMap$4 = { - '۱': '1', - '۲': '2', - '۳': '3', - '۴': '4', - '۵': '5', - '۶': '6', - '۷': '7', - '۸': '8', - '۹': '9', - '۰': '0' -}; - -hooks.defineLocale('fa', { - months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), - monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), - weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), - weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), - weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - meridiemParse: /قبل از ظهر|بعد از ظهر/, - isPM: function (input) { - return /بعد از ظهر/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'قبل از ظهر'; - } else { - return 'بعد از ظهر'; - } - }, - calendar : { - sameDay : '[امروز ساعت] LT', - nextDay : '[فردا ساعت] LT', - nextWeek : 'dddd [ساعت] LT', - lastDay : '[دیروز ساعت] LT', - lastWeek : 'dddd [پیش] [ساعت] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'در %s', - past : '%s پیش', - s : 'چندین ثانیه', - m : 'یک دقیقه', - mm : '%d دقیقه', - h : 'یک ساعت', - hh : '%d ساعت', - d : 'یک روز', - dd : '%d روز', - M : 'یک ماه', - MM : '%d ماه', - y : 'یک سال', - yy : '%d سال' - }, - preparse: function (string) { - return string.replace(/[۰-۹]/g, function (match) { - return numberMap$4[match]; - }).replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap$5[match]; - }).replace(/,/g, '،'); - }, - ordinalParse: /\d{1,2}م/, - ordinal : '%dم', - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Finnish [fi] -//! author : Tarmo Aidantausta : https://github.com/bleadof - -var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '); -var numbersFuture = [ - 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', - numbersPast[7], numbersPast[8], numbersPast[9] - ]; -function translate$2(number, withoutSuffix, key, isFuture) { - var result = ''; - switch (key) { - case 's': - return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; - case 'm': - return isFuture ? 'minuutin' : 'minuutti'; - case 'mm': - result = isFuture ? 'minuutin' : 'minuuttia'; - break; - case 'h': - return isFuture ? 'tunnin' : 'tunti'; - case 'hh': - result = isFuture ? 'tunnin' : 'tuntia'; - break; - case 'd': - return isFuture ? 'päivän' : 'päivä'; - case 'dd': - result = isFuture ? 'päivän' : 'päivää'; - break; - case 'M': - return isFuture ? 'kuukauden' : 'kuukausi'; - case 'MM': - result = isFuture ? 'kuukauden' : 'kuukautta'; - break; - case 'y': - return isFuture ? 'vuoden' : 'vuosi'; - case 'yy': - result = isFuture ? 'vuoden' : 'vuotta'; - break; - } - result = verbalNumber(number, isFuture) + ' ' + result; - return result; -} -function verbalNumber(number, isFuture) { - return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; -} - -hooks.defineLocale('fi', { - months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), - monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), - weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), - weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), - weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD.MM.YYYY', - LL : 'Do MMMM[ta] YYYY', - LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm', - LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm', - l : 'D.M.YYYY', - ll : 'Do MMM YYYY', - lll : 'Do MMM YYYY, [klo] HH.mm', - llll : 'ddd, Do MMM YYYY, [klo] HH.mm' - }, - calendar : { - sameDay : '[tänään] [klo] LT', - nextDay : '[huomenna] [klo] LT', - nextWeek : 'dddd [klo] LT', - lastDay : '[eilen] [klo] LT', - lastWeek : '[viime] dddd[na] [klo] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s päästä', - past : '%s sitten', - s : translate$2, - m : translate$2, - mm : translate$2, - h : translate$2, - hh : translate$2, - d : translate$2, - dd : translate$2, - M : translate$2, - MM : translate$2, - y : translate$2, - yy : translate$2 - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Faroese [fo] -//! author : Ragnar Johannesen : https://github.com/ragnar123 - -hooks.defineLocale('fo', { - months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), - weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), - weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), - weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D. MMMM, YYYY HH:mm' - }, - calendar : { - sameDay : '[Í dag kl.] LT', - nextDay : '[Í morgin kl.] LT', - nextWeek : 'dddd [kl.] LT', - lastDay : '[Í gjár kl.] LT', - lastWeek : '[síðstu] dddd [kl] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'um %s', - past : '%s síðani', - s : 'fá sekund', - m : 'ein minutt', - mm : '%d minuttir', - h : 'ein tími', - hh : '%d tímar', - d : 'ein dagur', - dd : '%d dagar', - M : 'ein mánaði', - MM : '%d mánaðir', - y : 'eitt ár', - yy : '%d ár' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : French (Canada) [fr-ca] -//! author : Jonathan Abourbih : https://github.com/jonbca - -hooks.defineLocale('fr-ca', { - months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), - monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), - monthsParseExact : true, - weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), - weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), - weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Aujourd\'hui à] LT', - nextDay: '[Demain à] LT', - nextWeek: 'dddd [à] LT', - lastDay: '[Hier à] LT', - lastWeek: 'dddd [dernier à] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'dans %s', - past : 'il y a %s', - s : 'quelques secondes', - m : 'une minute', - mm : '%d minutes', - h : 'une heure', - hh : '%d heures', - d : 'un jour', - dd : '%d jours', - M : 'un mois', - MM : '%d mois', - y : 'un an', - yy : '%d ans' - }, - ordinalParse: /\d{1,2}(er|e)/, - ordinal : function (number) { - return number + (number === 1 ? 'er' : 'e'); - } -}); - -//! moment.js locale configuration -//! locale : French (Switzerland) [fr-ch] -//! author : Gaspard Bucher : https://github.com/gaspard - -hooks.defineLocale('fr-ch', { - months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), - monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), - monthsParseExact : true, - weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), - weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), - weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Aujourd\'hui à] LT', - nextDay: '[Demain à] LT', - nextWeek: 'dddd [à] LT', - lastDay: '[Hier à] LT', - lastWeek: 'dddd [dernier à] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'dans %s', - past : 'il y a %s', - s : 'quelques secondes', - m : 'une minute', - mm : '%d minutes', - h : 'une heure', - hh : '%d heures', - d : 'un jour', - dd : '%d jours', - M : 'un mois', - MM : '%d mois', - y : 'un an', - yy : '%d ans' - }, - ordinalParse: /\d{1,2}(er|e)/, - ordinal : function (number) { - return number + (number === 1 ? 'er' : 'e'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : French [fr] -//! author : John Fischer : https://github.com/jfroffice - -hooks.defineLocale('fr', { - months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), - monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), - monthsParseExact : true, - weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), - weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), - weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Aujourd\'hui à] LT', - nextDay: '[Demain à] LT', - nextWeek: 'dddd [à] LT', - lastDay: '[Hier à] LT', - lastWeek: 'dddd [dernier à] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'dans %s', - past : 'il y a %s', - s : 'quelques secondes', - m : 'une minute', - mm : '%d minutes', - h : 'une heure', - hh : '%d heures', - d : 'un jour', - dd : '%d jours', - M : 'un mois', - MM : '%d mois', - y : 'un an', - yy : '%d ans' - }, - ordinalParse: /\d{1,2}(er|)/, - ordinal : function (number) { - return number + (number === 1 ? 'er' : ''); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Frisian [fy] -//! author : Robin van der Vliet : https://github.com/robin0van0der0v - -var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'); -var monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); - -hooks.defineLocale('fy', { - months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), - monthsShort : function (m, format) { - if (/-MMM-/.test(format)) { - return monthsShortWithoutDots[m.month()]; - } else { - return monthsShortWithDots[m.month()]; - } - }, - monthsParseExact : true, - weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), - weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), - weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD-MM-YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[hjoed om] LT', - nextDay: '[moarn om] LT', - nextWeek: 'dddd [om] LT', - lastDay: '[juster om] LT', - lastWeek: '[ôfrûne] dddd [om] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'oer %s', - past : '%s lyn', - s : 'in pear sekonden', - m : 'ien minút', - mm : '%d minuten', - h : 'ien oere', - hh : '%d oeren', - d : 'ien dei', - dd : '%d dagen', - M : 'ien moanne', - MM : '%d moannen', - y : 'ien jier', - yy : '%d jierren' - }, - ordinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Scottish Gaelic [gd] -//! author : Jon Ashdown : https://github.com/jonashdown - -var months$5 = [ - 'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd' -]; - -var monthsShort$3 = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh']; - -var weekdays$1 = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne']; - -var weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis']; - -var weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa']; - -hooks.defineLocale('gd', { - months : months$5, - monthsShort : monthsShort$3, - monthsParseExact : true, - weekdays : weekdays$1, - weekdaysShort : weekdaysShort, - weekdaysMin : weekdaysMin, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[An-diugh aig] LT', - nextDay : '[A-màireach aig] LT', - nextWeek : 'dddd [aig] LT', - lastDay : '[An-dè aig] LT', - lastWeek : 'dddd [seo chaidh] [aig] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'ann an %s', - past : 'bho chionn %s', - s : 'beagan diogan', - m : 'mionaid', - mm : '%d mionaidean', - h : 'uair', - hh : '%d uairean', - d : 'latha', - dd : '%d latha', - M : 'mìos', - MM : '%d mìosan', - y : 'bliadhna', - yy : '%d bliadhna' - }, - ordinalParse : /\d{1,2}(d|na|mh)/, - ordinal : function (number) { - var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Galician [gl] -//! author : Juan G. Hurtado : https://github.com/juanghurtado - -hooks.defineLocale('gl', { - months : 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'), - monthsShort : 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays : 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'), - weekdaysShort : 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'), - weekdaysMin : 'do_lu_ma_mé_xo_ve_sá'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY H:mm', - LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm' - }, - calendar : { - sameDay : function () { - return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; - }, - nextDay : function () { - return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; - }, - nextWeek : function () { - return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; - }, - lastDay : function () { - return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; - }, - lastWeek : function () { - return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : function (str) { - if (str.indexOf('un') === 0) { - return 'n' + str; - } - return 'en ' + str; - }, - past : 'hai %s', - s : 'uns segundos', - m : 'un minuto', - mm : '%d minutos', - h : 'unha hora', - hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', - MM : '%d meses', - y : 'un ano', - yy : '%d anos' - }, - ordinalParse : /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Hebrew [he] -//! author : Tomer Cohen : https://github.com/tomer -//! author : Moshe Simantov : https://github.com/DevelopmentIL -//! author : Tal Ater : https://github.com/TalAter - -hooks.defineLocale('he', { - months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'), - monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'), - weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), - weekdaysShort : 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), - weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D [ב]MMMM YYYY', - LLL : 'D [ב]MMMM YYYY HH:mm', - LLLL : 'dddd, D [ב]MMMM YYYY HH:mm', - l : 'D/M/YYYY', - ll : 'D MMM YYYY', - lll : 'D MMM YYYY HH:mm', - llll : 'ddd, D MMM YYYY HH:mm' - }, - calendar : { - sameDay : '[היום ב־]LT', - nextDay : '[מחר ב־]LT', - nextWeek : 'dddd [בשעה] LT', - lastDay : '[אתמול ב־]LT', - lastWeek : '[ביום] dddd [האחרון בשעה] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'בעוד %s', - past : 'לפני %s', - s : 'מספר שניות', - m : 'דקה', - mm : '%d דקות', - h : 'שעה', - hh : function (number) { - if (number === 2) { - return 'שעתיים'; - } - return number + ' שעות'; - }, - d : 'יום', - dd : function (number) { - if (number === 2) { - return 'יומיים'; - } - return number + ' ימים'; - }, - M : 'חודש', - MM : function (number) { - if (number === 2) { - return 'חודשיים'; - } - return number + ' חודשים'; - }, - y : 'שנה', - yy : function (number) { - if (number === 2) { - return 'שנתיים'; - } else if (number % 10 === 0 && number !== 10) { - return number + ' שנה'; - } - return number + ' שנים'; - } - }, - meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i, - isPM : function (input) { - return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 5) { - return 'לפנות בוקר'; - } else if (hour < 10) { - return 'בבוקר'; - } else if (hour < 12) { - return isLower ? 'לפנה"צ' : 'לפני הצהריים'; - } else if (hour < 18) { - return isLower ? 'אחה"צ' : 'אחרי הצהריים'; - } else { - return 'בערב'; - } - } -}); - -//! moment.js locale configuration -//! locale : Hindi [hi] -//! author : Mayank Singhal : https://github.com/mayanksinghal - -var symbolMap$6 = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' -}; -var numberMap$5 = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' -}; - -hooks.defineLocale('hi', { - months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'), - monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'), - monthsParseExact: true, - weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'), - weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'), - weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'), - longDateFormat : { - LT : 'A h:mm बजे', - LTS : 'A h:mm:ss बजे', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm बजे', - LLLL : 'dddd, D MMMM YYYY, A h:mm बजे' - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[कल] LT', - nextWeek : 'dddd, LT', - lastDay : '[कल] LT', - lastWeek : '[पिछले] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s में', - past : '%s पहले', - s : 'कुछ ही क्षण', - m : 'एक मिनट', - mm : '%d मिनट', - h : 'एक घंटा', - hh : '%d घंटे', - d : 'एक दिन', - dd : '%d दिन', - M : 'एक महीने', - MM : '%d महीने', - y : 'एक वर्ष', - yy : '%d वर्ष' - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap$5[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap$6[match]; - }); - }, - // Hindi notation for meridiems are quite fuzzy in practice. While there exists - // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. - meridiemParse: /रात|सुबह|दोपहर|शाम/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'रात') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'सुबह') { - return hour; - } else if (meridiem === 'दोपहर') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'शाम') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'रात'; - } else if (hour < 10) { - return 'सुबह'; - } else if (hour < 17) { - return 'दोपहर'; - } else if (hour < 20) { - return 'शाम'; - } else { - return 'रात'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Croatian [hr] -//! author : Bojan Marković : https://github.com/bmarkovic - -function translate$3(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'm': - return withoutSuffix ? 'jedna minuta' : 'jedne minute'; - case 'mm': - if (number === 1) { - result += 'minuta'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'minute'; - } else { - result += 'minuta'; - } - return result; - case 'h': - return withoutSuffix ? 'jedan sat' : 'jednog sata'; - case 'hh': - if (number === 1) { - result += 'sat'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sata'; - } else { - result += 'sati'; - } - return result; - case 'dd': - if (number === 1) { - result += 'dan'; - } else { - result += 'dana'; - } - return result; - case 'MM': - if (number === 1) { - result += 'mjesec'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'mjeseca'; - } else { - result += 'mjeseci'; - } - return result; - case 'yy': - if (number === 1) { - result += 'godina'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'godine'; - } else { - result += 'godina'; - } - return result; - } -} - -hooks.defineLocale('hr', { - months : { - format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'), - standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_') - }, - monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), - monthsParseExact: true, - weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), - weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), - weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd, D. MMMM YYYY H:mm' - }, - calendar : { - sameDay : '[danas u] LT', - nextDay : '[sutra u] LT', - nextWeek : function () { - switch (this.day()) { - case 0: - return '[u] [nedjelju] [u] LT'; - case 3: - return '[u] [srijedu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[jučer u] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - return '[prošlu] dddd [u] LT'; - case 6: - return '[prošle] [subote] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[prošli] dddd [u] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'prije %s', - s : 'par sekundi', - m : translate$3, - mm : translate$3, - h : translate$3, - hh : translate$3, - d : 'dan', - dd : translate$3, - M : 'mjesec', - MM : translate$3, - y : 'godinu', - yy : translate$3 - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Hungarian [hu] -//! author : Adam Brunner : https://github.com/adambrunner - -var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' '); -function translate$4(number, withoutSuffix, key, isFuture) { - var num = number, - suffix; - switch (key) { - case 's': - return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; - case 'm': - return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); - case 'mm': - return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); - case 'h': - return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); - case 'hh': - return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); - case 'd': - return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); - case 'dd': - return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); - case 'M': - return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); - case 'MM': - return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); - case 'y': - return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); - case 'yy': - return num + (isFuture || withoutSuffix ? ' év' : ' éve'); - } - return ''; -} -function week(isFuture) { - return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; -} - -hooks.defineLocale('hu', { - months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), - monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), - weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'), - weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), - weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'YYYY.MM.DD.', - LL : 'YYYY. MMMM D.', - LLL : 'YYYY. MMMM D. H:mm', - LLLL : 'YYYY. MMMM D., dddd H:mm' - }, - meridiemParse: /de|du/i, - isPM: function (input) { - return input.charAt(1).toLowerCase() === 'u'; - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 12) { - return isLower === true ? 'de' : 'DE'; - } else { - return isLower === true ? 'du' : 'DU'; - } - }, - calendar : { - sameDay : '[ma] LT[-kor]', - nextDay : '[holnap] LT[-kor]', - nextWeek : function () { - return week.call(this, true); - }, - lastDay : '[tegnap] LT[-kor]', - lastWeek : function () { - return week.call(this, false); - }, - sameElse : 'L' - }, - relativeTime : { - future : '%s múlva', - past : '%s', - s : translate$4, - m : translate$4, - mm : translate$4, - h : translate$4, - hh : translate$4, - d : translate$4, - dd : translate$4, - M : translate$4, - MM : translate$4, - y : translate$4, - yy : translate$4 - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Armenian [hy-am] -//! author : Armendarabyan : https://github.com/armendarabyan - -hooks.defineLocale('hy-am', { - months : { - format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'), - standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_') - }, - monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'), - weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'), - weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'), - weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY թ.', - LLL : 'D MMMM YYYY թ., HH:mm', - LLLL : 'dddd, D MMMM YYYY թ., HH:mm' - }, - calendar : { - sameDay: '[այսօր] LT', - nextDay: '[վաղը] LT', - lastDay: '[երեկ] LT', - nextWeek: function () { - return 'dddd [օրը ժամը] LT'; - }, - lastWeek: function () { - return '[անցած] dddd [օրը ժամը] LT'; - }, - sameElse: 'L' - }, - relativeTime : { - future : '%s հետո', - past : '%s առաջ', - s : 'մի քանի վայրկյան', - m : 'րոպե', - mm : '%d րոպե', - h : 'ժամ', - hh : '%d ժամ', - d : 'օր', - dd : '%d օր', - M : 'ամիս', - MM : '%d ամիս', - y : 'տարի', - yy : '%d տարի' - }, - meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/, - isPM: function (input) { - return /^(ցերեկվա|երեկոյան)$/.test(input); - }, - meridiem : function (hour) { - if (hour < 4) { - return 'գիշերվա'; - } else if (hour < 12) { - return 'առավոտվա'; - } else if (hour < 17) { - return 'ցերեկվա'; - } else { - return 'երեկոյան'; - } - }, - ordinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/, - ordinal: function (number, period) { - switch (period) { - case 'DDD': - case 'w': - case 'W': - case 'DDDo': - if (number === 1) { - return number + '-ին'; - } - return number + '-րդ'; - default: - return number; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Indonesian [id] -//! author : Mohammad Satrio Utomo : https://github.com/tyok -//! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan - -hooks.defineLocale('id', { - months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'), - weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), - weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), - weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] HH.mm', - LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' - }, - meridiemParse: /pagi|siang|sore|malam/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'pagi') { - return hour; - } else if (meridiem === 'siang') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'sore' || meridiem === 'malam') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'pagi'; - } else if (hours < 15) { - return 'siang'; - } else if (hours < 19) { - return 'sore'; - } else { - return 'malam'; - } - }, - calendar : { - sameDay : '[Hari ini pukul] LT', - nextDay : '[Besok pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kemarin pukul] LT', - lastWeek : 'dddd [lalu pukul] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dalam %s', - past : '%s yang lalu', - s : 'beberapa detik', - m : 'semenit', - mm : '%d menit', - h : 'sejam', - hh : '%d jam', - d : 'sehari', - dd : '%d hari', - M : 'sebulan', - MM : '%d bulan', - y : 'setahun', - yy : '%d tahun' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Icelandic [is] -//! author : Hinrik Örn Sigurðsson : https://github.com/hinrik - -function plural$2(n) { - if (n % 100 === 11) { - return true; - } else if (n % 10 === 1) { - return false; - } - return true; -} -function translate$5(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': - return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; - case 'm': - return withoutSuffix ? 'mínúta' : 'mínútu'; - case 'mm': - if (plural$2(number)) { - return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); - } else if (withoutSuffix) { - return result + 'mínúta'; - } - return result + 'mínútu'; - case 'hh': - if (plural$2(number)) { - return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); - } - return result + 'klukkustund'; - case 'd': - if (withoutSuffix) { - return 'dagur'; - } - return isFuture ? 'dag' : 'degi'; - case 'dd': - if (plural$2(number)) { - if (withoutSuffix) { - return result + 'dagar'; - } - return result + (isFuture ? 'daga' : 'dögum'); - } else if (withoutSuffix) { - return result + 'dagur'; - } - return result + (isFuture ? 'dag' : 'degi'); - case 'M': - if (withoutSuffix) { - return 'mánuður'; - } - return isFuture ? 'mánuð' : 'mánuði'; - case 'MM': - if (plural$2(number)) { - if (withoutSuffix) { - return result + 'mánuðir'; - } - return result + (isFuture ? 'mánuði' : 'mánuðum'); - } else if (withoutSuffix) { - return result + 'mánuður'; - } - return result + (isFuture ? 'mánuð' : 'mánuði'); - case 'y': - return withoutSuffix || isFuture ? 'ár' : 'ári'; - case 'yy': - if (plural$2(number)) { - return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); - } - return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); - } -} - -hooks.defineLocale('is', { - months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), - weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), - weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), - weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY [kl.] H:mm', - LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm' - }, - calendar : { - sameDay : '[í dag kl.] LT', - nextDay : '[á morgun kl.] LT', - nextWeek : 'dddd [kl.] LT', - lastDay : '[í gær kl.] LT', - lastWeek : '[síðasta] dddd [kl.] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'eftir %s', - past : 'fyrir %s síðan', - s : translate$5, - m : translate$5, - mm : translate$5, - h : 'klukkustund', - hh : translate$5, - d : translate$5, - dd : translate$5, - M : translate$5, - MM : translate$5, - y : translate$5, - yy : translate$5 - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Italian [it] -//! author : Lorenzo : https://github.com/aliem -//! author: Mattia Larentis: https://github.com/nostalgiaz - -hooks.defineLocale('it', { - months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), - monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), - weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'), - weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'), - weekdaysMin : 'Do_Lu_Ma_Me_Gi_Ve_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Oggi alle] LT', - nextDay: '[Domani alle] LT', - nextWeek: 'dddd [alle] LT', - lastDay: '[Ieri alle] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[la scorsa] dddd [alle] LT'; - default: - return '[lo scorso] dddd [alle] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : function (s) { - return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; - }, - past : '%s fa', - s : 'alcuni secondi', - m : 'un minuto', - mm : '%d minuti', - h : 'un\'ora', - hh : '%d ore', - d : 'un giorno', - dd : '%d giorni', - M : 'un mese', - MM : '%d mesi', - y : 'un anno', - yy : '%d anni' - }, - ordinalParse : /\d{1,2}º/, - ordinal: '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Japanese [ja] -//! author : LI Long : https://github.com/baryon - -hooks.defineLocale('ja', { - months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'), - weekdaysShort : '日_月_火_水_木_金_土'.split('_'), - weekdaysMin : '日_月_火_水_木_金_土'.split('_'), - longDateFormat : { - LT : 'Ah時m分', - LTS : 'Ah時m分s秒', - L : 'YYYY/MM/DD', - LL : 'YYYY年M月D日', - LLL : 'YYYY年M月D日Ah時m分', - LLLL : 'YYYY年M月D日Ah時m分 dddd' - }, - meridiemParse: /午前|午後/i, - isPM : function (input) { - return input === '午後'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return '午前'; - } else { - return '午後'; - } - }, - calendar : { - sameDay : '[今日] LT', - nextDay : '[明日] LT', - nextWeek : '[来週]dddd LT', - lastDay : '[昨日] LT', - lastWeek : '[前週]dddd LT', - sameElse : 'L' - }, - ordinalParse : /\d{1,2}日/, - ordinal : function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + '日'; - default: - return number; - } - }, - relativeTime : { - future : '%s後', - past : '%s前', - s : '数秒', - m : '1分', - mm : '%d分', - h : '1時間', - hh : '%d時間', - d : '1日', - dd : '%d日', - M : '1ヶ月', - MM : '%dヶ月', - y : '1年', - yy : '%d年' - } -}); - -//! moment.js locale configuration -//! locale : Javanese [jv] -//! author : Rony Lantip : https://github.com/lantip -//! reference: http://jv.wikipedia.org/wiki/Basa_Jawa - -hooks.defineLocale('jv', { - months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'), - weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'), - weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'), - weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] HH.mm', - LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' - }, - meridiemParse: /enjing|siyang|sonten|ndalu/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'enjing') { - return hour; - } else if (meridiem === 'siyang') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'sonten' || meridiem === 'ndalu') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'enjing'; - } else if (hours < 15) { - return 'siyang'; - } else if (hours < 19) { - return 'sonten'; - } else { - return 'ndalu'; - } - }, - calendar : { - sameDay : '[Dinten puniko pukul] LT', - nextDay : '[Mbenjang pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kala wingi pukul] LT', - lastWeek : 'dddd [kepengker pukul] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'wonten ing %s', - past : '%s ingkang kepengker', - s : 'sawetawis detik', - m : 'setunggal menit', - mm : '%d menit', - h : 'setunggal jam', - hh : '%d jam', - d : 'sedinten', - dd : '%d dinten', - M : 'sewulan', - MM : '%d wulan', - y : 'setaun', - yy : '%d taun' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Georgian [ka] -//! author : Irakli Janiashvili : https://github.com/irakli-janiashvili - -hooks.defineLocale('ka', { - months : { - standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'), - format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_') - }, - monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'), - weekdays : { - standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'), - format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'), - isFormat: /(წინა|შემდეგ)/ - }, - weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'), - weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' - }, - calendar : { - sameDay : '[დღეს] LT[-ზე]', - nextDay : '[ხვალ] LT[-ზე]', - lastDay : '[გუშინ] LT[-ზე]', - nextWeek : '[შემდეგ] dddd LT[-ზე]', - lastWeek : '[წინა] dddd LT-ზე', - sameElse : 'L' - }, - relativeTime : { - future : function (s) { - return (/(წამი|წუთი|საათი|წელი)/).test(s) ? - s.replace(/ი$/, 'ში') : - s + 'ში'; - }, - past : function (s) { - if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) { - return s.replace(/(ი|ე)$/, 'ის წინ'); - } - if ((/წელი/).test(s)) { - return s.replace(/წელი$/, 'წლის წინ'); - } - }, - s : 'რამდენიმე წამი', - m : 'წუთი', - mm : '%d წუთი', - h : 'საათი', - hh : '%d საათი', - d : 'დღე', - dd : '%d დღე', - M : 'თვე', - MM : '%d თვე', - y : 'წელი', - yy : '%d წელი' - }, - ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, - ordinal : function (number) { - if (number === 0) { - return number; - } - if (number === 1) { - return number + '-ლი'; - } - if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { - return 'მე-' + number; - } - return number + '-ე'; - }, - week : { - dow : 1, - doy : 7 - } -}); - -//! moment.js locale configuration -//! locale : Kazakh [kk] -//! authors : Nurlan Rakhimzhanov : https://github.com/nurlan - -var suffixes$1 = { - 0: '-ші', - 1: '-ші', - 2: '-ші', - 3: '-ші', - 4: '-ші', - 5: '-ші', - 6: '-шы', - 7: '-ші', - 8: '-ші', - 9: '-шы', - 10: '-шы', - 20: '-шы', - 30: '-шы', - 40: '-шы', - 50: '-ші', - 60: '-шы', - 70: '-ші', - 80: '-ші', - 90: '-шы', - 100: '-ші' -}; - -hooks.defineLocale('kk', { - months : 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'), - monthsShort : 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'), - weekdays : 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'), - weekdaysShort : 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'), - weekdaysMin : 'жк_дй_сй_ср_бй_жм_сн'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Бүгін сағат] LT', - nextDay : '[Ертең сағат] LT', - nextWeek : 'dddd [сағат] LT', - lastDay : '[Кеше сағат] LT', - lastWeek : '[Өткен аптаның] dddd [сағат] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s ішінде', - past : '%s бұрын', - s : 'бірнеше секунд', - m : 'бір минут', - mm : '%d минут', - h : 'бір сағат', - hh : '%d сағат', - d : 'бір күн', - dd : '%d күн', - M : 'бір ай', - MM : '%d ай', - y : 'бір жыл', - yy : '%d жыл' - }, - ordinalParse: /\d{1,2}-(ші|шы)/, - ordinal : function (number) { - var a = number % 10, - b = number >= 100 ? 100 : null; - return number + (suffixes$1[number] || suffixes$1[a] || suffixes$1[b]); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Cambodian [km] -//! author : Kruy Vanna : https://github.com/kruyvanna - -hooks.defineLocale('km', { - months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'), - monthsShort: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'), - weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'), - weekdaysShort: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'), - weekdaysMin: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS : 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY HH:mm', - LLLL: 'dddd, D MMMM YYYY HH:mm' - }, - calendar: { - sameDay: '[ថ្ងៃនេះ ម៉ោង] LT', - nextDay: '[ស្អែក ម៉ោង] LT', - nextWeek: 'dddd [ម៉ោង] LT', - lastDay: '[ម្សិលមិញ ម៉ោង] LT', - lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT', - sameElse: 'L' - }, - relativeTime: { - future: '%sទៀត', - past: '%sមុន', - s: 'ប៉ុន្មានវិនាទី', - m: 'មួយនាទី', - mm: '%d នាទី', - h: 'មួយម៉ោង', - hh: '%d ម៉ោង', - d: 'មួយថ្ងៃ', - dd: '%d ថ្ងៃ', - M: 'មួយខែ', - MM: '%d ខែ', - y: 'មួយឆ្នាំ', - yy: '%d ឆ្នាំ' - }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Korean [ko] -//! author : Kyungwook, Park : https://github.com/kyungw00k -//! author : Jeeeyul Lee <jeeeyul@gmail.com> - -hooks.defineLocale('ko', { - months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), - monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), - weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'), - weekdaysShort : '일_월_화_수_목_금_토'.split('_'), - weekdaysMin : '일_월_화_수_목_금_토'.split('_'), - longDateFormat : { - LT : 'A h시 m분', - LTS : 'A h시 m분 s초', - L : 'YYYY.MM.DD', - LL : 'YYYY년 MMMM D일', - LLL : 'YYYY년 MMMM D일 A h시 m분', - LLLL : 'YYYY년 MMMM D일 dddd A h시 m분' - }, - calendar : { - sameDay : '오늘 LT', - nextDay : '내일 LT', - nextWeek : 'dddd LT', - lastDay : '어제 LT', - lastWeek : '지난주 dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s 후', - past : '%s 전', - s : '몇 초', - ss : '%d초', - m : '일분', - mm : '%d분', - h : '한 시간', - hh : '%d시간', - d : '하루', - dd : '%d일', - M : '한 달', - MM : '%d달', - y : '일 년', - yy : '%d년' - }, - ordinalParse : /\d{1,2}일/, - ordinal : '%d일', - meridiemParse : /오전|오후/, - isPM : function (token) { - return token === '오후'; - }, - meridiem : function (hour, minute, isUpper) { - return hour < 12 ? '오전' : '오후'; - } -}); - -//! moment.js locale configuration -//! locale : Kyrgyz [ky] -//! author : Chyngyz Arystan uulu : https://github.com/chyngyz - - -var suffixes$2 = { - 0: '-чү', - 1: '-чи', - 2: '-чи', - 3: '-чү', - 4: '-чү', - 5: '-чи', - 6: '-чы', - 7: '-чи', - 8: '-чи', - 9: '-чу', - 10: '-чу', - 20: '-чы', - 30: '-чу', - 40: '-чы', - 50: '-чү', - 60: '-чы', - 70: '-чи', - 80: '-чи', - 90: '-чу', - 100: '-чү' -}; - -hooks.defineLocale('ky', { - months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'), - monthsShort : 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'), - weekdays : 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'), - weekdaysShort : 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'), - weekdaysMin : 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Бүгүн саат] LT', - nextDay : '[Эртең саат] LT', - nextWeek : 'dddd [саат] LT', - lastDay : '[Кече саат] LT', - lastWeek : '[Өткен аптанын] dddd [күнү] [саат] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s ичинде', - past : '%s мурун', - s : 'бирнече секунд', - m : 'бир мүнөт', - mm : '%d мүнөт', - h : 'бир саат', - hh : '%d саат', - d : 'бир күн', - dd : '%d күн', - M : 'бир ай', - MM : '%d ай', - y : 'бир жыл', - yy : '%d жыл' - }, - ordinalParse: /\d{1,2}-(чи|чы|чү|чу)/, - ordinal : function (number) { - var a = number % 10, - b = number >= 100 ? 100 : null; - return number + (suffixes$2[number] || suffixes$2[a] || suffixes$2[b]); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Luxembourgish [lb] -//! author : mweimerskirch : https://github.com/mweimerskirch -//! author : David Raison : https://github.com/kwisatz - -function processRelativeTime$3(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eng Minutt', 'enger Minutt'], - 'h': ['eng Stonn', 'enger Stonn'], - 'd': ['een Dag', 'engem Dag'], - 'M': ['ee Mount', 'engem Mount'], - 'y': ['ee Joer', 'engem Joer'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; -} -function processFutureTime(string) { - var number = string.substr(0, string.indexOf(' ')); - if (eifelerRegelAppliesToNumber(number)) { - return 'a ' + string; - } - return 'an ' + string; -} -function processPastTime(string) { - var number = string.substr(0, string.indexOf(' ')); - if (eifelerRegelAppliesToNumber(number)) { - return 'viru ' + string; - } - return 'virun ' + string; -} -/** - * Returns true if the word before the given number loses the '-n' ending. - * e.g. 'an 10 Deeg' but 'a 5 Deeg' - * - * @param number {integer} - * @returns {boolean} - */ -function eifelerRegelAppliesToNumber(number) { - number = parseInt(number, 10); - if (isNaN(number)) { - return false; - } - if (number < 0) { - // Negative Number --> always true - return true; - } else if (number < 10) { - // Only 1 digit - if (4 <= number && number <= 7) { - return true; - } - return false; - } else if (number < 100) { - // 2 digits - var lastDigit = number % 10, firstDigit = number / 10; - if (lastDigit === 0) { - return eifelerRegelAppliesToNumber(firstDigit); - } - return eifelerRegelAppliesToNumber(lastDigit); - } else if (number < 10000) { - // 3 or 4 digits --> recursively check first digit - while (number >= 10) { - number = number / 10; - } - return eifelerRegelAppliesToNumber(number); - } else { - // Anything larger than 4 digits: recursively check first n-3 digits - number = number / 1000; - return eifelerRegelAppliesToNumber(number); - } -} - -hooks.defineLocale('lb', { - months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), - monthsParseExact : true, - weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), - weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), - weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'H:mm [Auer]', - LTS: 'H:mm:ss [Auer]', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY H:mm [Auer]', - LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]' - }, - calendar: { - sameDay: '[Haut um] LT', - sameElse: 'L', - nextDay: '[Muer um] LT', - nextWeek: 'dddd [um] LT', - lastDay: '[Gëschter um] LT', - lastWeek: function () { - // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule - switch (this.day()) { - case 2: - case 4: - return '[Leschten] dddd [um] LT'; - default: - return '[Leschte] dddd [um] LT'; - } - } - }, - relativeTime : { - future : processFutureTime, - past : processPastTime, - s : 'e puer Sekonnen', - m : processRelativeTime$3, - mm : '%d Minutten', - h : processRelativeTime$3, - hh : '%d Stonnen', - d : processRelativeTime$3, - dd : '%d Deeg', - M : processRelativeTime$3, - MM : '%d Méint', - y : processRelativeTime$3, - yy : '%d Joer' - }, - ordinalParse: /\d{1,2}\./, - ordinal: '%d.', - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Lao [lo] -//! author : Ryan Hart : https://github.com/ryanhart2 - -hooks.defineLocale('lo', { - months : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'), - monthsShort : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'), - weekdays : 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'), - weekdaysShort : 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'), - weekdaysMin : 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'ວັນdddd D MMMM YYYY HH:mm' - }, - meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/, - isPM: function (input) { - return input === 'ຕອນແລງ'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ຕອນເຊົ້າ'; - } else { - return 'ຕອນແລງ'; - } - }, - calendar : { - sameDay : '[ມື້ນີ້ເວລາ] LT', - nextDay : '[ມື້ອື່ນເວລາ] LT', - nextWeek : '[ວັນ]dddd[ໜ້າເວລາ] LT', - lastDay : '[ມື້ວານນີ້ເວລາ] LT', - lastWeek : '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'ອີກ %s', - past : '%sຜ່ານມາ', - s : 'ບໍ່ເທົ່າໃດວິນາທີ', - m : '1 ນາທີ', - mm : '%d ນາທີ', - h : '1 ຊົ່ວໂມງ', - hh : '%d ຊົ່ວໂມງ', - d : '1 ມື້', - dd : '%d ມື້', - M : '1 ເດືອນ', - MM : '%d ເດືອນ', - y : '1 ປີ', - yy : '%d ປີ' - }, - ordinalParse: /(ທີ່)\d{1,2}/, - ordinal : function (number) { - return 'ທີ່' + number; - } -}); - -//! moment.js locale configuration -//! locale : Lithuanian [lt] -//! author : Mindaugas Mozūras : https://github.com/mmozuras - -var units = { - 'm' : 'minutė_minutės_minutę', - 'mm': 'minutės_minučių_minutes', - 'h' : 'valanda_valandos_valandą', - 'hh': 'valandos_valandų_valandas', - 'd' : 'diena_dienos_dieną', - 'dd': 'dienos_dienų_dienas', - 'M' : 'mėnuo_mėnesio_mėnesį', - 'MM': 'mėnesiai_mėnesių_mėnesius', - 'y' : 'metai_metų_metus', - 'yy': 'metai_metų_metus' -}; -function translateSeconds(number, withoutSuffix, key, isFuture) { - if (withoutSuffix) { - return 'kelios sekundės'; - } else { - return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; - } -} -function translateSingular(number, withoutSuffix, key, isFuture) { - return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); -} -function special(number) { - return number % 10 === 0 || (number > 10 && number < 20); -} -function forms(key) { - return units[key].split('_'); -} -function translate$6(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - if (number === 1) { - return result + translateSingular(number, withoutSuffix, key[0], isFuture); - } else if (withoutSuffix) { - return result + (special(number) ? forms(key)[1] : forms(key)[0]); - } else { - if (isFuture) { - return result + forms(key)[1]; - } else { - return result + (special(number) ? forms(key)[1] : forms(key)[2]); - } - } -} -hooks.defineLocale('lt', { - months : { - format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'), - standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'), - isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/ - }, - monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), - weekdays : { - format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'), - standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'), - isFormat: /dddd HH:mm/ - }, - weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'), - weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'YYYY [m.] MMMM D [d.]', - LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', - LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]', - l : 'YYYY-MM-DD', - ll : 'YYYY [m.] MMMM D [d.]', - lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', - llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]' - }, - calendar : { - sameDay : '[Šiandien] LT', - nextDay : '[Rytoj] LT', - nextWeek : 'dddd LT', - lastDay : '[Vakar] LT', - lastWeek : '[Praėjusį] dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : 'po %s', - past : 'prieš %s', - s : translateSeconds, - m : translateSingular, - mm : translate$6, - h : translateSingular, - hh : translate$6, - d : translateSingular, - dd : translate$6, - M : translateSingular, - MM : translate$6, - y : translateSingular, - yy : translate$6 - }, - ordinalParse: /\d{1,2}-oji/, - ordinal : function (number) { - return number + '-oji'; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Latvian [lv] -//! author : Kristaps Karlsons : https://github.com/skakri -//! author : Jānis Elmeris : https://github.com/JanisE - -var units$1 = { - 'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), - 'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), - 'h': 'stundas_stundām_stunda_stundas'.split('_'), - 'hh': 'stundas_stundām_stunda_stundas'.split('_'), - 'd': 'dienas_dienām_diena_dienas'.split('_'), - 'dd': 'dienas_dienām_diena_dienas'.split('_'), - 'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), - 'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), - 'y': 'gada_gadiem_gads_gadi'.split('_'), - 'yy': 'gada_gadiem_gads_gadi'.split('_') -}; -/** - * @param withoutSuffix boolean true = a length of time; false = before/after a period of time. - */ -function format$1(forms, number, withoutSuffix) { - if (withoutSuffix) { - // E.g. "21 minūte", "3 minūtes". - return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3]; - } else { - // E.g. "21 minūtes" as in "pēc 21 minūtes". - // E.g. "3 minūtēm" as in "pēc 3 minūtēm". - return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1]; - } -} -function relativeTimeWithPlural$1(number, withoutSuffix, key) { - return number + ' ' + format$1(units$1[key], number, withoutSuffix); -} -function relativeTimeWithSingular(number, withoutSuffix, key) { - return format$1(units$1[key], number, withoutSuffix); -} -function relativeSeconds(number, withoutSuffix) { - return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm'; -} - -hooks.defineLocale('lv', { - months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'), - weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), - weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY.', - LL : 'YYYY. [gada] D. MMMM', - LLL : 'YYYY. [gada] D. MMMM, HH:mm', - LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm' - }, - calendar : { - sameDay : '[Šodien pulksten] LT', - nextDay : '[Rīt pulksten] LT', - nextWeek : 'dddd [pulksten] LT', - lastDay : '[Vakar pulksten] LT', - lastWeek : '[Pagājušā] dddd [pulksten] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'pēc %s', - past : 'pirms %s', - s : relativeSeconds, - m : relativeTimeWithSingular, - mm : relativeTimeWithPlural$1, - h : relativeTimeWithSingular, - hh : relativeTimeWithPlural$1, - d : relativeTimeWithSingular, - dd : relativeTimeWithPlural$1, - M : relativeTimeWithSingular, - MM : relativeTimeWithPlural$1, - y : relativeTimeWithSingular, - yy : relativeTimeWithPlural$1 - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Montenegrin [me] -//! author : Miodrag Nikač <miodrag@restartit.me> : https://github.com/miodragnikac - -var translator = { - words: { //Different grammatical cases - m: ['jedan minut', 'jednog minuta'], - mm: ['minut', 'minuta', 'minuta'], - h: ['jedan sat', 'jednog sata'], - hh: ['sat', 'sata', 'sati'], - dd: ['dan', 'dana', 'dana'], - MM: ['mjesec', 'mjeseca', 'mjeseci'], - yy: ['godina', 'godine', 'godina'] - }, - correctGrammaticalCase: function (number, wordKey) { - return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); - }, - translate: function (number, withoutSuffix, key) { - var wordKey = translator.words[key]; - if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return number + ' ' + translator.correctGrammaticalCase(number, wordKey); - } - } -}; - -hooks.defineLocale('me', { - months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), - monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'), - monthsParseExact : true, - weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), - weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), - weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'H:mm', - LTS : 'H:mm:ss', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY H:mm', - LLLL: 'dddd, D. MMMM YYYY H:mm' - }, - calendar: { - sameDay: '[danas u] LT', - nextDay: '[sjutra u] LT', - - nextWeek: function () { - switch (this.day()) { - case 0: - return '[u] [nedjelju] [u] LT'; - case 3: - return '[u] [srijedu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[juče u] LT', - lastWeek : function () { - var lastWeekDays = [ - '[prošle] [nedjelje] [u] LT', - '[prošlog] [ponedjeljka] [u] LT', - '[prošlog] [utorka] [u] LT', - '[prošle] [srijede] [u] LT', - '[prošlog] [četvrtka] [u] LT', - '[prošlog] [petka] [u] LT', - '[prošle] [subote] [u] LT' - ]; - return lastWeekDays[this.day()]; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'prije %s', - s : 'nekoliko sekundi', - m : translator.translate, - mm : translator.translate, - h : translator.translate, - hh : translator.translate, - d : 'dan', - dd : translator.translate, - M : 'mjesec', - MM : translator.translate, - y : 'godinu', - yy : translator.translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Maori [mi] -//! author : John Corrigan <robbiecloset@gmail.com> : https://github.com/johnideal - -hooks.defineLocale('mi', { - months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'), - monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'), - monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, - monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, - monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, - monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i, - weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'), - weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), - weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY [i] HH:mm', - LLLL: 'dddd, D MMMM YYYY [i] HH:mm' - }, - calendar: { - sameDay: '[i teie mahana, i] LT', - nextDay: '[apopo i] LT', - nextWeek: 'dddd [i] LT', - lastDay: '[inanahi i] LT', - lastWeek: 'dddd [whakamutunga i] LT', - sameElse: 'L' - }, - relativeTime: { - future: 'i roto i %s', - past: '%s i mua', - s: 'te hēkona ruarua', - m: 'he meneti', - mm: '%d meneti', - h: 'te haora', - hh: '%d haora', - d: 'he ra', - dd: '%d ra', - M: 'he marama', - MM: '%d marama', - y: 'he tau', - yy: '%d tau' - }, - ordinalParse: /\d{1,2}º/, - ordinal: '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Macedonian [mk] -//! author : Borislav Mickov : https://github.com/B0k0 - -hooks.defineLocale('mk', { - months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'), - monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'), - weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'), - weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'), - weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'D.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY H:mm', - LLLL : 'dddd, D MMMM YYYY H:mm' - }, - calendar : { - sameDay : '[Денес во] LT', - nextDay : '[Утре во] LT', - nextWeek : '[Во] dddd [во] LT', - lastDay : '[Вчера во] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - case 6: - return '[Изминатата] dddd [во] LT'; - case 1: - case 2: - case 4: - case 5: - return '[Изминатиот] dddd [во] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'после %s', - past : 'пред %s', - s : 'неколку секунди', - m : 'минута', - mm : '%d минути', - h : 'час', - hh : '%d часа', - d : 'ден', - dd : '%d дена', - M : 'месец', - MM : '%d месеци', - y : 'година', - yy : '%d години' - }, - ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, - ordinal : function (number) { - var lastDigit = number % 10, - last2Digits = number % 100; - if (number === 0) { - return number + '-ев'; - } else if (last2Digits === 0) { - return number + '-ен'; - } else if (last2Digits > 10 && last2Digits < 20) { - return number + '-ти'; - } else if (lastDigit === 1) { - return number + '-ви'; - } else if (lastDigit === 2) { - return number + '-ри'; - } else if (lastDigit === 7 || lastDigit === 8) { - return number + '-ми'; - } else { - return number + '-ти'; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Malayalam [ml] -//! author : Floyd Pink : https://github.com/floydpink - -hooks.defineLocale('ml', { - months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'), - monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'), - monthsParseExact : true, - weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'), - weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'), - weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'), - longDateFormat : { - LT : 'A h:mm -നു', - LTS : 'A h:mm:ss -നു', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm -നു', - LLLL : 'dddd, D MMMM YYYY, A h:mm -നു' - }, - calendar : { - sameDay : '[ഇന്ന്] LT', - nextDay : '[നാളെ] LT', - nextWeek : 'dddd, LT', - lastDay : '[ഇന്നലെ] LT', - lastWeek : '[കഴിഞ്ഞ] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s കഴിഞ്ഞ്', - past : '%s മുൻപ്', - s : 'അൽപ നിമിഷങ്ങൾ', - m : 'ഒരു മിനിറ്റ്', - mm : '%d മിനിറ്റ്', - h : 'ഒരു മണിക്കൂർ', - hh : '%d മണിക്കൂർ', - d : 'ഒരു ദിവസം', - dd : '%d ദിവസം', - M : 'ഒരു മാസം', - MM : '%d മാസം', - y : 'ഒരു വർഷം', - yy : '%d വർഷം' - }, - meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if ((meridiem === 'രാത്രി' && hour >= 4) || - meridiem === 'ഉച്ച കഴിഞ്ഞ്' || - meridiem === 'വൈകുന്നേരം') { - return hour + 12; - } else { - return hour; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'രാത്രി'; - } else if (hour < 12) { - return 'രാവിലെ'; - } else if (hour < 17) { - return 'ഉച്ച കഴിഞ്ഞ്'; - } else if (hour < 20) { - return 'വൈകുന്നേരം'; - } else { - return 'രാത്രി'; - } - } -}); - -//! moment.js locale configuration -//! locale : Marathi [mr] -//! author : Harshad Kale : https://github.com/kalehv -//! author : Vivek Athalye : https://github.com/vnathalye - -var symbolMap$7 = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' -}; -var numberMap$6 = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' -}; - -function relativeTimeMr(number, withoutSuffix, string, isFuture) -{ - var output = ''; - if (withoutSuffix) { - switch (string) { - case 's': output = 'काही सेकंद'; break; - case 'm': output = 'एक मिनिट'; break; - case 'mm': output = '%d मिनिटे'; break; - case 'h': output = 'एक तास'; break; - case 'hh': output = '%d तास'; break; - case 'd': output = 'एक दिवस'; break; - case 'dd': output = '%d दिवस'; break; - case 'M': output = 'एक महिना'; break; - case 'MM': output = '%d महिने'; break; - case 'y': output = 'एक वर्ष'; break; - case 'yy': output = '%d वर्षे'; break; - } - } - else { - switch (string) { - case 's': output = 'काही सेकंदां'; break; - case 'm': output = 'एका मिनिटा'; break; - case 'mm': output = '%d मिनिटां'; break; - case 'h': output = 'एका तासा'; break; - case 'hh': output = '%d तासां'; break; - case 'd': output = 'एका दिवसा'; break; - case 'dd': output = '%d दिवसां'; break; - case 'M': output = 'एका महिन्या'; break; - case 'MM': output = '%d महिन्यां'; break; - case 'y': output = 'एका वर्षा'; break; - case 'yy': output = '%d वर्षां'; break; - } - } - return output.replace(/%d/i, number); -} - -hooks.defineLocale('mr', { - months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'), - monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'), - monthsParseExact : true, - weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'), - weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'), - weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'), - longDateFormat : { - LT : 'A h:mm वाजता', - LTS : 'A h:mm:ss वाजता', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm वाजता', - LLLL : 'dddd, D MMMM YYYY, A h:mm वाजता' - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[उद्या] LT', - nextWeek : 'dddd, LT', - lastDay : '[काल] LT', - lastWeek: '[मागील] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future: '%sमध्ये', - past: '%sपूर्वी', - s: relativeTimeMr, - m: relativeTimeMr, - mm: relativeTimeMr, - h: relativeTimeMr, - hh: relativeTimeMr, - d: relativeTimeMr, - dd: relativeTimeMr, - M: relativeTimeMr, - MM: relativeTimeMr, - y: relativeTimeMr, - yy: relativeTimeMr - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap$6[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap$7[match]; - }); - }, - meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'रात्री') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'सकाळी') { - return hour; - } else if (meridiem === 'दुपारी') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'सायंकाळी') { - return hour + 12; - } - }, - meridiem: function (hour, minute, isLower) { - if (hour < 4) { - return 'रात्री'; - } else if (hour < 10) { - return 'सकाळी'; - } else if (hour < 17) { - return 'दुपारी'; - } else if (hour < 20) { - return 'सायंकाळी'; - } else { - return 'रात्री'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Malay [ms-my] -//! note : DEPRECATED, the correct one is [ms] -//! author : Weldan Jamili : https://github.com/weldan - -hooks.defineLocale('ms-my', { - months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), - monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), - weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), - weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), - weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] HH.mm', - LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' - }, - meridiemParse: /pagi|tengahari|petang|malam/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'pagi') { - return hour; - } else if (meridiem === 'tengahari') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'petang' || meridiem === 'malam') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'pagi'; - } else if (hours < 15) { - return 'tengahari'; - } else if (hours < 19) { - return 'petang'; - } else { - return 'malam'; - } - }, - calendar : { - sameDay : '[Hari ini pukul] LT', - nextDay : '[Esok pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kelmarin pukul] LT', - lastWeek : 'dddd [lepas pukul] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dalam %s', - past : '%s yang lepas', - s : 'beberapa saat', - m : 'seminit', - mm : '%d minit', - h : 'sejam', - hh : '%d jam', - d : 'sehari', - dd : '%d hari', - M : 'sebulan', - MM : '%d bulan', - y : 'setahun', - yy : '%d tahun' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Malay [ms] -//! author : Weldan Jamili : https://github.com/weldan - -hooks.defineLocale('ms', { - months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), - monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), - weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), - weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), - weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] HH.mm', - LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' - }, - meridiemParse: /pagi|tengahari|petang|malam/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'pagi') { - return hour; - } else if (meridiem === 'tengahari') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'petang' || meridiem === 'malam') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'pagi'; - } else if (hours < 15) { - return 'tengahari'; - } else if (hours < 19) { - return 'petang'; - } else { - return 'malam'; - } - }, - calendar : { - sameDay : '[Hari ini pukul] LT', - nextDay : '[Esok pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kelmarin pukul] LT', - lastWeek : 'dddd [lepas pukul] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dalam %s', - past : '%s yang lepas', - s : 'beberapa saat', - m : 'seminit', - mm : '%d minit', - h : 'sejam', - hh : '%d jam', - d : 'sehari', - dd : '%d hari', - M : 'sebulan', - MM : '%d bulan', - y : 'setahun', - yy : '%d tahun' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Burmese [my] -//! author : Squar team, mysquar.com -//! author : David Rossellat : https://github.com/gholadr -//! author : Tin Aung Lin : https://github.com/thanyawzinmin - -var symbolMap$8 = { - '1': '၁', - '2': '၂', - '3': '၃', - '4': '၄', - '5': '၅', - '6': '၆', - '7': '၇', - '8': '၈', - '9': '၉', - '0': '၀' -}; -var numberMap$7 = { - '၁': '1', - '၂': '2', - '၃': '3', - '၄': '4', - '၅': '5', - '၆': '6', - '၇': '7', - '၈': '8', - '၉': '9', - '၀': '0' -}; - -hooks.defineLocale('my', { - months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'), - monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), - weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'), - weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), - weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), - - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY HH:mm', - LLLL: 'dddd D MMMM YYYY HH:mm' - }, - calendar: { - sameDay: '[ယနေ.] LT [မှာ]', - nextDay: '[မနက်ဖြန်] LT [မှာ]', - nextWeek: 'dddd LT [မှာ]', - lastDay: '[မနေ.က] LT [မှာ]', - lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]', - sameElse: 'L' - }, - relativeTime: { - future: 'လာမည့် %s မှာ', - past: 'လွန်ခဲ့သော %s က', - s: 'စက္ကန်.အနည်းငယ်', - m: 'တစ်မိနစ်', - mm: '%d မိနစ်', - h: 'တစ်နာရီ', - hh: '%d နာရီ', - d: 'တစ်ရက်', - dd: '%d ရက်', - M: 'တစ်လ', - MM: '%d လ', - y: 'တစ်နှစ်', - yy: '%d နှစ်' - }, - preparse: function (string) { - return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) { - return numberMap$7[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap$8[match]; - }); - }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Norwegian Bokmål [nb] -//! authors : Espen Hovlandsdal : https://github.com/rexxars -//! Sigurd Gartmann : https://github.com/sigurdga - -hooks.defineLocale('nb', { - months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'), - monthsParseExact : true, - weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), - weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'), - weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY [kl.] HH:mm', - LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' - }, - calendar : { - sameDay: '[i dag kl.] LT', - nextDay: '[i morgen kl.] LT', - nextWeek: 'dddd [kl.] LT', - lastDay: '[i går kl.] LT', - lastWeek: '[forrige] dddd [kl.] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : '%s siden', - s : 'noen sekunder', - m : 'ett minutt', - mm : '%d minutter', - h : 'en time', - hh : '%d timer', - d : 'en dag', - dd : '%d dager', - M : 'en måned', - MM : '%d måneder', - y : 'ett år', - yy : '%d år' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Nepalese [ne] -//! author : suvash : https://github.com/suvash - -var symbolMap$9 = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' -}; -var numberMap$8 = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' -}; - -hooks.defineLocale('ne', { - months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'), - monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'), - monthsParseExact : true, - weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'), - weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'), - weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'Aको h:mm बजे', - LTS : 'Aको h:mm:ss बजे', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, Aको h:mm बजे', - LLLL : 'dddd, D MMMM YYYY, Aको h:mm बजे' - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap$8[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap$9[match]; - }); - }, - meridiemParse: /राति|बिहान|दिउँसो|साँझ/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'राति') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'बिहान') { - return hour; - } else if (meridiem === 'दिउँसो') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'साँझ') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 3) { - return 'राति'; - } else if (hour < 12) { - return 'बिहान'; - } else if (hour < 16) { - return 'दिउँसो'; - } else if (hour < 20) { - return 'साँझ'; - } else { - return 'राति'; - } - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[भोलि] LT', - nextWeek : '[आउँदो] dddd[,] LT', - lastDay : '[हिजो] LT', - lastWeek : '[गएको] dddd[,] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%sमा', - past : '%s अगाडि', - s : 'केही क्षण', - m : 'एक मिनेट', - mm : '%d मिनेट', - h : 'एक घण्टा', - hh : '%d घण्टा', - d : 'एक दिन', - dd : '%d दिन', - M : 'एक महिना', - MM : '%d महिना', - y : 'एक बर्ष', - yy : '%d बर्ष' - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Dutch (Belgium) [nl-be] -//! author : Joris Röling : https://github.com/jorisroling -//! author : Jacob Middag : https://github.com/middagj - -var monthsShortWithDots$1 = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'); -var monthsShortWithoutDots$1 = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); - -var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; -var monthsRegex$1 = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; - -hooks.defineLocale('nl-be', { - months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), - monthsShort : function (m, format) { - if (/-MMM-/.test(format)) { - return monthsShortWithoutDots$1[m.month()]; - } else { - return monthsShortWithDots$1[m.month()]; - } - }, - - monthsRegex: monthsRegex$1, - monthsShortRegex: monthsRegex$1, - monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i, - monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, - - monthsParse : monthsParse, - longMonthsParse : monthsParse, - shortMonthsParse : monthsParse, - - weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), - weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), - weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[vandaag om] LT', - nextDay: '[morgen om] LT', - nextWeek: 'dddd [om] LT', - lastDay: '[gisteren om] LT', - lastWeek: '[afgelopen] dddd [om] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'over %s', - past : '%s geleden', - s : 'een paar seconden', - m : 'één minuut', - mm : '%d minuten', - h : 'één uur', - hh : '%d uur', - d : 'één dag', - dd : '%d dagen', - M : 'één maand', - MM : '%d maanden', - y : 'één jaar', - yy : '%d jaar' - }, - ordinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Dutch [nl] -//! author : Joris Röling : https://github.com/jorisroling -//! author : Jacob Middag : https://github.com/middagj - -var monthsShortWithDots$2 = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'); -var monthsShortWithoutDots$2 = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); - -var monthsParse$1 = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; -var monthsRegex$2 = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; - -hooks.defineLocale('nl', { - months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), - monthsShort : function (m, format) { - if (/-MMM-/.test(format)) { - return monthsShortWithoutDots$2[m.month()]; - } else { - return monthsShortWithDots$2[m.month()]; - } - }, - - monthsRegex: monthsRegex$2, - monthsShortRegex: monthsRegex$2, - monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i, - monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, - - monthsParse : monthsParse$1, - longMonthsParse : monthsParse$1, - shortMonthsParse : monthsParse$1, - - weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), - weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), - weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD-MM-YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[vandaag om] LT', - nextDay: '[morgen om] LT', - nextWeek: 'dddd [om] LT', - lastDay: '[gisteren om] LT', - lastWeek: '[afgelopen] dddd [om] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'over %s', - past : '%s geleden', - s : 'een paar seconden', - m : 'één minuut', - mm : '%d minuten', - h : 'één uur', - hh : '%d uur', - d : 'één dag', - dd : '%d dagen', - M : 'één maand', - MM : '%d maanden', - y : 'één jaar', - yy : '%d jaar' - }, - ordinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Nynorsk [nn] -//! author : https://github.com/mechuwind - -hooks.defineLocale('nn', { - months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), - weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), - weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'), - weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY [kl.] H:mm', - LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' - }, - calendar : { - sameDay: '[I dag klokka] LT', - nextDay: '[I morgon klokka] LT', - nextWeek: 'dddd [klokka] LT', - lastDay: '[I går klokka] LT', - lastWeek: '[Føregåande] dddd [klokka] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : '%s sidan', - s : 'nokre sekund', - m : 'eit minutt', - mm : '%d minutt', - h : 'ein time', - hh : '%d timar', - d : 'ein dag', - dd : '%d dagar', - M : 'ein månad', - MM : '%d månader', - y : 'eit år', - yy : '%d år' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Punjabi (India) [pa-in] -//! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit - -var symbolMap$10 = { - '1': '੧', - '2': '੨', - '3': '੩', - '4': '੪', - '5': '੫', - '6': '੬', - '7': '੭', - '8': '੮', - '9': '੯', - '0': '੦' -}; -var numberMap$9 = { - '੧': '1', - '੨': '2', - '੩': '3', - '੪': '4', - '੫': '5', - '੬': '6', - '੭': '7', - '੮': '8', - '੯': '9', - '੦': '0' -}; - -hooks.defineLocale('pa-in', { - // There are months name as per Nanakshahi Calender but they are not used as rigidly in modern Punjabi. - months : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'), - monthsShort : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'), - weekdays : 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'), - weekdaysShort : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'), - weekdaysMin : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'), - longDateFormat : { - LT : 'A h:mm ਵਜੇ', - LTS : 'A h:mm:ss ਵਜੇ', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm ਵਜੇ', - LLLL : 'dddd, D MMMM YYYY, A h:mm ਵਜੇ' - }, - calendar : { - sameDay : '[ਅਜ] LT', - nextDay : '[ਕਲ] LT', - nextWeek : 'dddd, LT', - lastDay : '[ਕਲ] LT', - lastWeek : '[ਪਿਛਲੇ] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s ਵਿੱਚ', - past : '%s ਪਿਛਲੇ', - s : 'ਕੁਝ ਸਕਿੰਟ', - m : 'ਇਕ ਮਿੰਟ', - mm : '%d ਮਿੰਟ', - h : 'ਇੱਕ ਘੰਟਾ', - hh : '%d ਘੰਟੇ', - d : 'ਇੱਕ ਦਿਨ', - dd : '%d ਦਿਨ', - M : 'ਇੱਕ ਮਹੀਨਾ', - MM : '%d ਮਹੀਨੇ', - y : 'ਇੱਕ ਸਾਲ', - yy : '%d ਸਾਲ' - }, - preparse: function (string) { - return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) { - return numberMap$9[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap$10[match]; - }); - }, - // Punjabi notation for meridiems are quite fuzzy in practice. While there exists - // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi. - meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'ਰਾਤ') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'ਸਵੇਰ') { - return hour; - } else if (meridiem === 'ਦੁਪਹਿਰ') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'ਸ਼ਾਮ') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ਰਾਤ'; - } else if (hour < 10) { - return 'ਸਵੇਰ'; - } else if (hour < 17) { - return 'ਦੁਪਹਿਰ'; - } else if (hour < 20) { - return 'ਸ਼ਾਮ'; - } else { - return 'ਰਾਤ'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Polish [pl] -//! author : Rafal Hirsz : https://github.com/evoL - -var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'); -var monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_'); -function plural$3(n) { - return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); -} -function translate$7(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'm': - return withoutSuffix ? 'minuta' : 'minutę'; - case 'mm': - return result + (plural$3(number) ? 'minuty' : 'minut'); - case 'h': - return withoutSuffix ? 'godzina' : 'godzinę'; - case 'hh': - return result + (plural$3(number) ? 'godziny' : 'godzin'); - case 'MM': - return result + (plural$3(number) ? 'miesiące' : 'miesięcy'); - case 'yy': - return result + (plural$3(number) ? 'lata' : 'lat'); - } -} - -hooks.defineLocale('pl', { - months : function (momentToFormat, format) { - if (format === '') { - // Hack: if format empty we know this is used to generate - // RegExp by moment. Give then back both valid forms of months - // in RegExp ready format. - return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')'; - } else if (/D MMMM/.test(format)) { - return monthsSubjective[momentToFormat.month()]; - } else { - return monthsNominative[momentToFormat.month()]; - } - }, - monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), - weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'), - weekdaysShort : 'ndz_pon_wt_śr_czw_pt_sob'.split('_'), - weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Dziś o] LT', - nextDay: '[Jutro o] LT', - nextWeek: '[W] dddd [o] LT', - lastDay: '[Wczoraj o] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[W zeszłą niedzielę o] LT'; - case 3: - return '[W zeszłą środę o] LT'; - case 6: - return '[W zeszłą sobotę o] LT'; - default: - return '[W zeszły] dddd [o] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : '%s temu', - s : 'kilka sekund', - m : translate$7, - mm : translate$7, - h : translate$7, - hh : translate$7, - d : '1 dzień', - dd : '%d dni', - M : 'miesiąc', - MM : translate$7, - y : 'rok', - yy : translate$7 - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Portuguese (Brazil) [pt-br] -//! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira - -hooks.defineLocale('pt-br', { - months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'), - monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), - weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), - weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), - weekdaysMin : 'Dom_2ª_3ª_4ª_5ª_6ª_Sáb'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY [às] HH:mm', - LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm' - }, - calendar : { - sameDay: '[Hoje às] LT', - nextDay: '[Amanhã às] LT', - nextWeek: 'dddd [às] LT', - lastDay: '[Ontem às] LT', - lastWeek: function () { - return (this.day() === 0 || this.day() === 6) ? - '[Último] dddd [às] LT' : // Saturday + Sunday - '[Última] dddd [às] LT'; // Monday - Friday - }, - sameElse: 'L' - }, - relativeTime : { - future : 'em %s', - past : '%s atrás', - s : 'poucos segundos', - m : 'um minuto', - mm : '%d minutos', - h : 'uma hora', - hh : '%d horas', - d : 'um dia', - dd : '%d dias', - M : 'um mês', - MM : '%d meses', - y : 'um ano', - yy : '%d anos' - }, - ordinalParse: /\d{1,2}º/, - ordinal : '%dº' -}); - -//! moment.js locale configuration -//! locale : Portuguese [pt] -//! author : Jefferson : https://github.com/jalex79 - -hooks.defineLocale('pt', { - months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'), - monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), - weekdays : 'Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado'.split('_'), - weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), - weekdaysMin : 'Dom_2ª_3ª_4ª_5ª_6ª_Sáb'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY HH:mm', - LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm' - }, - calendar : { - sameDay: '[Hoje às] LT', - nextDay: '[Amanhã às] LT', - nextWeek: 'dddd [às] LT', - lastDay: '[Ontem às] LT', - lastWeek: function () { - return (this.day() === 0 || this.day() === 6) ? - '[Último] dddd [às] LT' : // Saturday + Sunday - '[Última] dddd [às] LT'; // Monday - Friday - }, - sameElse: 'L' - }, - relativeTime : { - future : 'em %s', - past : 'há %s', - s : 'segundos', - m : 'um minuto', - mm : '%d minutos', - h : 'uma hora', - hh : '%d horas', - d : 'um dia', - dd : '%d dias', - M : 'um mês', - MM : '%d meses', - y : 'um ano', - yy : '%d anos' - }, - ordinalParse: /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Romanian [ro] -//! author : Vlad Gurdiga : https://github.com/gurdiga -//! author : Valentin Agachi : https://github.com/avaly - -function relativeTimeWithPlural$2(number, withoutSuffix, key) { - var format = { - 'mm': 'minute', - 'hh': 'ore', - 'dd': 'zile', - 'MM': 'luni', - 'yy': 'ani' - }, - separator = ' '; - if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { - separator = ' de '; - } - return number + separator + format[key]; -} - -hooks.defineLocale('ro', { - months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), - monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'), - weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), - weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY H:mm', - LLLL : 'dddd, D MMMM YYYY H:mm' - }, - calendar : { - sameDay: '[azi la] LT', - nextDay: '[mâine la] LT', - nextWeek: 'dddd [la] LT', - lastDay: '[ieri la] LT', - lastWeek: '[fosta] dddd [la] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'peste %s', - past : '%s în urmă', - s : 'câteva secunde', - m : 'un minut', - mm : relativeTimeWithPlural$2, - h : 'o oră', - hh : relativeTimeWithPlural$2, - d : 'o zi', - dd : relativeTimeWithPlural$2, - M : 'o lună', - MM : relativeTimeWithPlural$2, - y : 'un an', - yy : relativeTimeWithPlural$2 - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Russian [ru] -//! author : Viktorminator : https://github.com/Viktorminator -//! Author : Menelion Elensúle : https://github.com/Oire -//! author : Коренберг Марк : https://github.com/socketpair - -function plural$4(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); -} -function relativeTimeWithPlural$3(number, withoutSuffix, key) { - var format = { - 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', - 'hh': 'час_часа_часов', - 'dd': 'день_дня_дней', - 'MM': 'месяц_месяца_месяцев', - 'yy': 'год_года_лет' - }; - if (key === 'm') { - return withoutSuffix ? 'минута' : 'минуту'; - } - else { - return number + ' ' + plural$4(format[key], +number); - } -} -var monthsParse$2 = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i]; - -// http://new.gramota.ru/spravka/rules/139-prop : § 103 -// Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637 -// CLDR data: http://www.unicode.org/cldr/charts/28/summary/ru.html#1753 -hooks.defineLocale('ru', { - months : { - format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'), - standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_') - }, - monthsShort : { - // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку ? - format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'), - standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_') - }, - weekdays : { - standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'), - format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'), - isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/ - }, - weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), - weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), - monthsParse : monthsParse$2, - longMonthsParse : monthsParse$2, - shortMonthsParse : monthsParse$2, - - // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки - monthsRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, - - // копия предыдущего - monthsShortRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, - - // полные названия с падежами - monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i, - - // Выражение, которое соотвествует только сокращённым формам - monthsShortStrictRegex: /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY г.', - LLL : 'D MMMM YYYY г., HH:mm', - LLLL : 'dddd, D MMMM YYYY г., HH:mm' - }, - calendar : { - sameDay: '[Сегодня в] LT', - nextDay: '[Завтра в] LT', - lastDay: '[Вчера в] LT', - nextWeek: function (now) { - if (now.week() !== this.week()) { - switch (this.day()) { - case 0: - return '[В следующее] dddd [в] LT'; - case 1: - case 2: - case 4: - return '[В следующий] dddd [в] LT'; - case 3: - case 5: - case 6: - return '[В следующую] dddd [в] LT'; - } - } else { - if (this.day() === 2) { - return '[Во] dddd [в] LT'; - } else { - return '[В] dddd [в] LT'; - } - } - }, - lastWeek: function (now) { - if (now.week() !== this.week()) { - switch (this.day()) { - case 0: - return '[В прошлое] dddd [в] LT'; - case 1: - case 2: - case 4: - return '[В прошлый] dddd [в] LT'; - case 3: - case 5: - case 6: - return '[В прошлую] dddd [в] LT'; - } - } else { - if (this.day() === 2) { - return '[Во] dddd [в] LT'; - } else { - return '[В] dddd [в] LT'; - } - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'через %s', - past : '%s назад', - s : 'несколько секунд', - m : relativeTimeWithPlural$3, - mm : relativeTimeWithPlural$3, - h : 'час', - hh : relativeTimeWithPlural$3, - d : 'день', - dd : relativeTimeWithPlural$3, - M : 'месяц', - MM : relativeTimeWithPlural$3, - y : 'год', - yy : relativeTimeWithPlural$3 - }, - meridiemParse: /ночи|утра|дня|вечера/i, - isPM : function (input) { - return /^(дня|вечера)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночи'; - } else if (hour < 12) { - return 'утра'; - } else if (hour < 17) { - return 'дня'; - } else { - return 'вечера'; - } - }, - ordinalParse: /\d{1,2}-(й|го|я)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - return number + '-й'; - case 'D': - return number + '-го'; - case 'w': - case 'W': - return number + '-я'; - default: - return number; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Northern Sami [se] -//! authors : Bård Rolstad Henriksen : https://github.com/karamell - - -hooks.defineLocale('se', { - months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'), - monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'), - weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'), - weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'), - weekdaysMin : 's_v_m_g_d_b_L'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'MMMM D. [b.] YYYY', - LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm', - LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm' - }, - calendar : { - sameDay: '[otne ti] LT', - nextDay: '[ihttin ti] LT', - nextWeek: 'dddd [ti] LT', - lastDay: '[ikte ti] LT', - lastWeek: '[ovddit] dddd [ti] LT', - sameElse: 'L' - }, - relativeTime : { - future : '%s geažes', - past : 'maŋit %s', - s : 'moadde sekunddat', - m : 'okta minuhta', - mm : '%d minuhtat', - h : 'okta diimmu', - hh : '%d diimmut', - d : 'okta beaivi', - dd : '%d beaivvit', - M : 'okta mánnu', - MM : '%d mánut', - y : 'okta jahki', - yy : '%d jagit' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Sinhalese [si] -//! author : Sampath Sitinamaluwa : https://github.com/sampathsris - -/*jshint -W100*/ -hooks.defineLocale('si', { - months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'), - monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'), - weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'), - weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්රහ_සිකු_සෙන'.split('_'), - weekdaysMin : 'ඉ_ස_අ_බ_බ්ර_සි_සෙ'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'a h:mm', - LTS : 'a h:mm:ss', - L : 'YYYY/MM/DD', - LL : 'YYYY MMMM D', - LLL : 'YYYY MMMM D, a h:mm', - LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss' - }, - calendar : { - sameDay : '[අද] LT[ට]', - nextDay : '[හෙට] LT[ට]', - nextWeek : 'dddd LT[ට]', - lastDay : '[ඊයේ] LT[ට]', - lastWeek : '[පසුගිය] dddd LT[ට]', - sameElse : 'L' - }, - relativeTime : { - future : '%sකින්', - past : '%sකට පෙර', - s : 'තත්පර කිහිපය', - m : 'මිනිත්තුව', - mm : 'මිනිත්තු %d', - h : 'පැය', - hh : 'පැය %d', - d : 'දිනය', - dd : 'දින %d', - M : 'මාසය', - MM : 'මාස %d', - y : 'වසර', - yy : 'වසර %d' - }, - ordinalParse: /\d{1,2} වැනි/, - ordinal : function (number) { - return number + ' වැනි'; - }, - meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./, - isPM : function (input) { - return input === 'ප.ව.' || input === 'පස් වරු'; - }, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'ප.ව.' : 'පස් වරු'; - } else { - return isLower ? 'පෙ.ව.' : 'පෙර වරු'; - } - } -}); - -//! moment.js locale configuration -//! locale : Slovak [sk] -//! author : Martin Minka : https://github.com/k2s -//! based on work of petrbela : https://github.com/petrbela - -var months$6 = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'); -var monthsShort$4 = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); -function plural$5(n) { - return (n > 1) && (n < 5); -} -function translate$8(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': // a few seconds / in a few seconds / a few seconds ago - return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; - case 'm': // a minute / in a minute / a minute ago - return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); - case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago - if (withoutSuffix || isFuture) { - return result + (plural$5(number) ? 'minúty' : 'minút'); - } else { - return result + 'minútami'; - } - break; - case 'h': // an hour / in an hour / an hour ago - return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); - case 'hh': // 9 hours / in 9 hours / 9 hours ago - if (withoutSuffix || isFuture) { - return result + (plural$5(number) ? 'hodiny' : 'hodín'); - } else { - return result + 'hodinami'; - } - break; - case 'd': // a day / in a day / a day ago - return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; - case 'dd': // 9 days / in 9 days / 9 days ago - if (withoutSuffix || isFuture) { - return result + (plural$5(number) ? 'dni' : 'dní'); - } else { - return result + 'dňami'; - } - break; - case 'M': // a month / in a month / a month ago - return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; - case 'MM': // 9 months / in 9 months / 9 months ago - if (withoutSuffix || isFuture) { - return result + (plural$5(number) ? 'mesiace' : 'mesiacov'); - } else { - return result + 'mesiacmi'; - } - break; - case 'y': // a year / in a year / a year ago - return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; - case 'yy': // 9 years / in 9 years / 9 years ago - if (withoutSuffix || isFuture) { - return result + (plural$5(number) ? 'roky' : 'rokov'); - } else { - return result + 'rokmi'; - } - break; - } -} - -hooks.defineLocale('sk', { - months : months$6, - monthsShort : monthsShort$4, - weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'), - weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'), - weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'), - longDateFormat : { - LT: 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd D. MMMM YYYY H:mm' - }, - calendar : { - sameDay: '[dnes o] LT', - nextDay: '[zajtra o] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[v nedeľu o] LT'; - case 1: - case 2: - return '[v] dddd [o] LT'; - case 3: - return '[v stredu o] LT'; - case 4: - return '[vo štvrtok o] LT'; - case 5: - return '[v piatok o] LT'; - case 6: - return '[v sobotu o] LT'; - } - }, - lastDay: '[včera o] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[minulú nedeľu o] LT'; - case 1: - case 2: - return '[minulý] dddd [o] LT'; - case 3: - return '[minulú stredu o] LT'; - case 4: - case 5: - return '[minulý] dddd [o] LT'; - case 6: - return '[minulú sobotu o] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : 'pred %s', - s : translate$8, - m : translate$8, - mm : translate$8, - h : translate$8, - hh : translate$8, - d : translate$8, - dd : translate$8, - M : translate$8, - MM : translate$8, - y : translate$8, - yy : translate$8 - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Slovenian [sl] -//! author : Robert Sedovšek : https://github.com/sedovsek - -function processRelativeTime$4(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': - return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami'; - case 'm': - return withoutSuffix ? 'ena minuta' : 'eno minuto'; - case 'mm': - if (number === 1) { - result += withoutSuffix ? 'minuta' : 'minuto'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'minuti' : 'minutama'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'minute' : 'minutami'; - } else { - result += withoutSuffix || isFuture ? 'minut' : 'minutami'; - } - return result; - case 'h': - return withoutSuffix ? 'ena ura' : 'eno uro'; - case 'hh': - if (number === 1) { - result += withoutSuffix ? 'ura' : 'uro'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'uri' : 'urama'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'ure' : 'urami'; - } else { - result += withoutSuffix || isFuture ? 'ur' : 'urami'; - } - return result; - case 'd': - return withoutSuffix || isFuture ? 'en dan' : 'enim dnem'; - case 'dd': - if (number === 1) { - result += withoutSuffix || isFuture ? 'dan' : 'dnem'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'dni' : 'dnevoma'; - } else { - result += withoutSuffix || isFuture ? 'dni' : 'dnevi'; - } - return result; - case 'M': - return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem'; - case 'MM': - if (number === 1) { - result += withoutSuffix || isFuture ? 'mesec' : 'mesecem'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'meseca' : 'mesecema'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'mesece' : 'meseci'; - } else { - result += withoutSuffix || isFuture ? 'mesecev' : 'meseci'; - } - return result; - case 'y': - return withoutSuffix || isFuture ? 'eno leto' : 'enim letom'; - case 'yy': - if (number === 1) { - result += withoutSuffix || isFuture ? 'leto' : 'letom'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'leti' : 'letoma'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'leta' : 'leti'; - } else { - result += withoutSuffix || isFuture ? 'let' : 'leti'; - } - return result; - } -} - -hooks.defineLocale('sl', { - months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), - monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'), - weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'), - weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd, D. MMMM YYYY H:mm' - }, - calendar : { - sameDay : '[danes ob] LT', - nextDay : '[jutri ob] LT', - - nextWeek : function () { - switch (this.day()) { - case 0: - return '[v] [nedeljo] [ob] LT'; - case 3: - return '[v] [sredo] [ob] LT'; - case 6: - return '[v] [soboto] [ob] LT'; - case 1: - case 2: - case 4: - case 5: - return '[v] dddd [ob] LT'; - } - }, - lastDay : '[včeraj ob] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - return '[prejšnjo] [nedeljo] [ob] LT'; - case 3: - return '[prejšnjo] [sredo] [ob] LT'; - case 6: - return '[prejšnjo] [soboto] [ob] LT'; - case 1: - case 2: - case 4: - case 5: - return '[prejšnji] dddd [ob] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'čez %s', - past : 'pred %s', - s : processRelativeTime$4, - m : processRelativeTime$4, - mm : processRelativeTime$4, - h : processRelativeTime$4, - hh : processRelativeTime$4, - d : processRelativeTime$4, - dd : processRelativeTime$4, - M : processRelativeTime$4, - MM : processRelativeTime$4, - y : processRelativeTime$4, - yy : processRelativeTime$4 - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Albanian [sq] -//! author : Flakërim Ismani : https://github.com/flakerimi -//! author : Menelion Elensúle : https://github.com/Oire -//! author : Oerd Cukalla : https://github.com/oerd - -hooks.defineLocale('sq', { - months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), - monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), - weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), - weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), - weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), - weekdaysParseExact : true, - meridiemParse: /PD|MD/, - isPM: function (input) { - return input.charAt(0) === 'M'; - }, - meridiem : function (hours, minutes, isLower) { - return hours < 12 ? 'PD' : 'MD'; - }, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Sot në] LT', - nextDay : '[Nesër në] LT', - nextWeek : 'dddd [në] LT', - lastDay : '[Dje në] LT', - lastWeek : 'dddd [e kaluar në] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'në %s', - past : '%s më parë', - s : 'disa sekonda', - m : 'një minutë', - mm : '%d minuta', - h : 'një orë', - hh : '%d orë', - d : 'një ditë', - dd : '%d ditë', - M : 'një muaj', - MM : '%d muaj', - y : 'një vit', - yy : '%d vite' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Serbian Cyrillic [sr-cyrl] -//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j - -var translator$1 = { - words: { //Different grammatical cases - m: ['један минут', 'једне минуте'], - mm: ['минут', 'минуте', 'минута'], - h: ['један сат', 'једног сата'], - hh: ['сат', 'сата', 'сати'], - dd: ['дан', 'дана', 'дана'], - MM: ['месец', 'месеца', 'месеци'], - yy: ['година', 'године', 'година'] - }, - correctGrammaticalCase: function (number, wordKey) { - return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); - }, - translate: function (number, withoutSuffix, key) { - var wordKey = translator$1.words[key]; - if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return number + ' ' + translator$1.correctGrammaticalCase(number, wordKey); - } - } -}; - -hooks.defineLocale('sr-cyrl', { - months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'), - monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'), - monthsParseExact: true, - weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'), - weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'), - weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'H:mm', - LTS : 'H:mm:ss', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY H:mm', - LLLL: 'dddd, D. MMMM YYYY H:mm' - }, - calendar: { - sameDay: '[данас у] LT', - nextDay: '[сутра у] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[у] [недељу] [у] LT'; - case 3: - return '[у] [среду] [у] LT'; - case 6: - return '[у] [суботу] [у] LT'; - case 1: - case 2: - case 4: - case 5: - return '[у] dddd [у] LT'; - } - }, - lastDay : '[јуче у] LT', - lastWeek : function () { - var lastWeekDays = [ - '[прошле] [недеље] [у] LT', - '[прошлог] [понедељка] [у] LT', - '[прошлог] [уторка] [у] LT', - '[прошле] [среде] [у] LT', - '[прошлог] [четвртка] [у] LT', - '[прошлог] [петка] [у] LT', - '[прошле] [суботе] [у] LT' - ]; - return lastWeekDays[this.day()]; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'за %s', - past : 'пре %s', - s : 'неколико секунди', - m : translator$1.translate, - mm : translator$1.translate, - h : translator$1.translate, - hh : translator$1.translate, - d : 'дан', - dd : translator$1.translate, - M : 'месец', - MM : translator$1.translate, - y : 'годину', - yy : translator$1.translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Serbian [sr] -//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j - -var translator$2 = { - words: { //Different grammatical cases - m: ['jedan minut', 'jedne minute'], - mm: ['minut', 'minute', 'minuta'], - h: ['jedan sat', 'jednog sata'], - hh: ['sat', 'sata', 'sati'], - dd: ['dan', 'dana', 'dana'], - MM: ['mesec', 'meseca', 'meseci'], - yy: ['godina', 'godine', 'godina'] - }, - correctGrammaticalCase: function (number, wordKey) { - return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); - }, - translate: function (number, withoutSuffix, key) { - var wordKey = translator$2.words[key]; - if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return number + ' ' + translator$2.correctGrammaticalCase(number, wordKey); - } - } -}; - -hooks.defineLocale('sr', { - months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), - monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'), - weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'), - weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'H:mm', - LTS : 'H:mm:ss', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY H:mm', - LLLL: 'dddd, D. MMMM YYYY H:mm' - }, - calendar: { - sameDay: '[danas u] LT', - nextDay: '[sutra u] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[u] [nedelju] [u] LT'; - case 3: - return '[u] [sredu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[juče u] LT', - lastWeek : function () { - var lastWeekDays = [ - '[prošle] [nedelje] [u] LT', - '[prošlog] [ponedeljka] [u] LT', - '[prošlog] [utorka] [u] LT', - '[prošle] [srede] [u] LT', - '[prošlog] [četvrtka] [u] LT', - '[prošlog] [petka] [u] LT', - '[prošle] [subote] [u] LT' - ]; - return lastWeekDays[this.day()]; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'pre %s', - s : 'nekoliko sekundi', - m : translator$2.translate, - mm : translator$2.translate, - h : translator$2.translate, - hh : translator$2.translate, - d : 'dan', - dd : translator$2.translate, - M : 'mesec', - MM : translator$2.translate, - y : 'godinu', - yy : translator$2.translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : siSwati [ss] -//! author : Nicolai Davies<mail@nicolai.io> : https://github.com/nicolaidavies - - -hooks.defineLocale('ss', { - months : "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split('_'), - monthsShort : 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'), - weekdays : 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'), - weekdaysShort : 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'), - weekdaysMin : 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' - }, - calendar : { - sameDay : '[Namuhla nga] LT', - nextDay : '[Kusasa nga] LT', - nextWeek : 'dddd [nga] LT', - lastDay : '[Itolo nga] LT', - lastWeek : 'dddd [leliphelile] [nga] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'nga %s', - past : 'wenteka nga %s', - s : 'emizuzwana lomcane', - m : 'umzuzu', - mm : '%d emizuzu', - h : 'lihora', - hh : '%d emahora', - d : 'lilanga', - dd : '%d emalanga', - M : 'inyanga', - MM : '%d tinyanga', - y : 'umnyaka', - yy : '%d iminyaka' - }, - meridiemParse: /ekuseni|emini|entsambama|ebusuku/, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'ekuseni'; - } else if (hours < 15) { - return 'emini'; - } else if (hours < 19) { - return 'entsambama'; - } else { - return 'ebusuku'; - } - }, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'ekuseni') { - return hour; - } else if (meridiem === 'emini') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') { - if (hour === 0) { - return 0; - } - return hour + 12; - } - }, - ordinalParse: /\d{1,2}/, - ordinal : '%d', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Swedish [sv] -//! author : Jens Alm : https://github.com/ulmus - -hooks.defineLocale('sv', { - months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), - weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'), - weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [kl.] HH:mm', - LLLL : 'dddd D MMMM YYYY [kl.] HH:mm', - lll : 'D MMM YYYY HH:mm', - llll : 'ddd D MMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Idag] LT', - nextDay: '[Imorgon] LT', - lastDay: '[Igår] LT', - nextWeek: '[På] dddd LT', - lastWeek: '[I] dddd[s] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : 'för %s sedan', - s : 'några sekunder', - m : 'en minut', - mm : '%d minuter', - h : 'en timme', - hh : '%d timmar', - d : 'en dag', - dd : '%d dagar', - M : 'en månad', - MM : '%d månader', - y : 'ett år', - yy : '%d år' - }, - ordinalParse: /\d{1,2}(e|a)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'e' : - (b === 1) ? 'a' : - (b === 2) ? 'a' : - (b === 3) ? 'e' : 'e'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Swahili [sw] -//! author : Fahad Kassim : https://github.com/fadsel - -hooks.defineLocale('sw', { - months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'), - monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'), - weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'), - weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'), - weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[leo saa] LT', - nextDay : '[kesho saa] LT', - nextWeek : '[wiki ijayo] dddd [saat] LT', - lastDay : '[jana] LT', - lastWeek : '[wiki iliyopita] dddd [saat] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s baadaye', - past : 'tokea %s', - s : 'hivi punde', - m : 'dakika moja', - mm : 'dakika %d', - h : 'saa limoja', - hh : 'masaa %d', - d : 'siku moja', - dd : 'masiku %d', - M : 'mwezi mmoja', - MM : 'miezi %d', - y : 'mwaka mmoja', - yy : 'miaka %d' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Tamil [ta] -//! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404 - -var symbolMap$11 = { - '1': '௧', - '2': '௨', - '3': '௩', - '4': '௪', - '5': '௫', - '6': '௬', - '7': '௭', - '8': '௮', - '9': '௯', - '0': '௦' -}; -var numberMap$10 = { - '௧': '1', - '௨': '2', - '௩': '3', - '௪': '4', - '௫': '5', - '௬': '6', - '௭': '7', - '௮': '8', - '௯': '9', - '௦': '0' -}; - -hooks.defineLocale('ta', { - months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), - monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), - weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'), - weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'), - weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, HH:mm', - LLLL : 'dddd, D MMMM YYYY, HH:mm' - }, - calendar : { - sameDay : '[இன்று] LT', - nextDay : '[நாளை] LT', - nextWeek : 'dddd, LT', - lastDay : '[நேற்று] LT', - lastWeek : '[கடந்த வாரம்] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s இல்', - past : '%s முன்', - s : 'ஒரு சில விநாடிகள்', - m : 'ஒரு நிமிடம்', - mm : '%d நிமிடங்கள்', - h : 'ஒரு மணி நேரம்', - hh : '%d மணி நேரம்', - d : 'ஒரு நாள்', - dd : '%d நாட்கள்', - M : 'ஒரு மாதம்', - MM : '%d மாதங்கள்', - y : 'ஒரு வருடம்', - yy : '%d ஆண்டுகள்' - }, - ordinalParse: /\d{1,2}வது/, - ordinal : function (number) { - return number + 'வது'; - }, - preparse: function (string) { - return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { - return numberMap$10[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap$11[match]; - }); - }, - // refer http://ta.wikipedia.org/s/1er1 - meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/, - meridiem : function (hour, minute, isLower) { - if (hour < 2) { - return ' யாமம்'; - } else if (hour < 6) { - return ' வைகறை'; // வைகறை - } else if (hour < 10) { - return ' காலை'; // காலை - } else if (hour < 14) { - return ' நண்பகல்'; // நண்பகல் - } else if (hour < 18) { - return ' எற்பாடு'; // எற்பாடு - } else if (hour < 22) { - return ' மாலை'; // மாலை - } else { - return ' யாமம்'; - } - }, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'யாமம்') { - return hour < 2 ? hour : hour + 12; - } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { - return hour; - } else if (meridiem === 'நண்பகல்') { - return hour >= 10 ? hour : hour + 12; - } else { - return hour + 12; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Telugu [te] -//! author : Krishna Chaitanya Thota : https://github.com/kcthota - -hooks.defineLocale('te', { - months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జూలై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'), - monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జూలై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'), - monthsParseExact : true, - weekdays : 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'), - weekdaysShort : 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'), - weekdaysMin : 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'), - longDateFormat : { - LT : 'A h:mm', - LTS : 'A h:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm', - LLLL : 'dddd, D MMMM YYYY, A h:mm' - }, - calendar : { - sameDay : '[నేడు] LT', - nextDay : '[రేపు] LT', - nextWeek : 'dddd, LT', - lastDay : '[నిన్న] LT', - lastWeek : '[గత] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s లో', - past : '%s క్రితం', - s : 'కొన్ని క్షణాలు', - m : 'ఒక నిమిషం', - mm : '%d నిమిషాలు', - h : 'ఒక గంట', - hh : '%d గంటలు', - d : 'ఒక రోజు', - dd : '%d రోజులు', - M : 'ఒక నెల', - MM : '%d నెలలు', - y : 'ఒక సంవత్సరం', - yy : '%d సంవత్సరాలు' - }, - ordinalParse : /\d{1,2}వ/, - ordinal : '%dవ', - meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'రాత్రి') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'ఉదయం') { - return hour; - } else if (meridiem === 'మధ్యాహ్నం') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'సాయంత్రం') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'రాత్రి'; - } else if (hour < 10) { - return 'ఉదయం'; - } else if (hour < 17) { - return 'మధ్యాహ్నం'; - } else if (hour < 20) { - return 'సాయంత్రం'; - } else { - return 'రాత్రి'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Tetun Dili (East Timor) [tet] -//! author : Joshua Brooks : https://github.com/joshbrooks -//! author : Onorio De J. Afonso : https://github.com/marobo - -hooks.defineLocale('tet', { - months : 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juniu_Juliu_Augustu_Setembru_Outubru_Novembru_Dezembru'.split('_'), - monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Aug_Set_Out_Nov_Dez'.split('_'), - weekdays : 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sexta_Sabadu'.split('_'), - weekdaysShort : 'Dom_Seg_Ters_Kua_Kint_Sext_Sab'.split('_'), - weekdaysMin : 'Do_Seg_Te_Ku_Ki_Sex_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Ohin iha] LT', - nextDay: '[Aban iha] LT', - nextWeek: 'dddd [iha] LT', - lastDay: '[Horiseik iha] LT', - lastWeek: 'dddd [semana kotuk] [iha] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'iha %s', - past : '%s liuba', - s : 'minutu balun', - m : 'minutu ida', - mm : 'minutus %d', - h : 'horas ida', - hh : 'horas %d', - d : 'loron ida', - dd : 'loron %d', - M : 'fulan ida', - MM : 'fulan %d', - y : 'tinan ida', - yy : 'tinan %d' - }, - ordinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Thai [th] -//! author : Kridsada Thanabulpong : https://github.com/sirn - -hooks.defineLocale('th', { - months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'), - monthsShort : 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'), - monthsParseExact: true, - weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'), - weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference - weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'YYYY/MM/DD', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY เวลา H:mm', - LLLL : 'วันddddที่ D MMMM YYYY เวลา H:mm' - }, - meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/, - isPM: function (input) { - return input === 'หลังเที่ยง'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ก่อนเที่ยง'; - } else { - return 'หลังเที่ยง'; - } - }, - calendar : { - sameDay : '[วันนี้ เวลา] LT', - nextDay : '[พรุ่งนี้ เวลา] LT', - nextWeek : 'dddd[หน้า เวลา] LT', - lastDay : '[เมื่อวานนี้ เวลา] LT', - lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'อีก %s', - past : '%sที่แล้ว', - s : 'ไม่กี่วินาที', - m : '1 นาที', - mm : '%d นาที', - h : '1 ชั่วโมง', - hh : '%d ชั่วโมง', - d : '1 วัน', - dd : '%d วัน', - M : '1 เดือน', - MM : '%d เดือน', - y : '1 ปี', - yy : '%d ปี' - } -}); - -//! moment.js locale configuration -//! locale : Tagalog (Philippines) [tl-ph] -//! author : Dan Hagman : https://github.com/hagmandan - -hooks.defineLocale('tl-ph', { - months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), - monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), - weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), - weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), - weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'MM/D/YYYY', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY HH:mm', - LLLL : 'dddd, MMMM DD, YYYY HH:mm' - }, - calendar : { - sameDay: 'LT [ngayong araw]', - nextDay: '[Bukas ng] LT', - nextWeek: 'LT [sa susunod na] dddd', - lastDay: 'LT [kahapon]', - lastWeek: 'LT [noong nakaraang] dddd', - sameElse: 'L' - }, - relativeTime : { - future : 'sa loob ng %s', - past : '%s ang nakalipas', - s : 'ilang segundo', - m : 'isang minuto', - mm : '%d minuto', - h : 'isang oras', - hh : '%d oras', - d : 'isang araw', - dd : '%d araw', - M : 'isang buwan', - MM : '%d buwan', - y : 'isang taon', - yy : '%d taon' - }, - ordinalParse: /\d{1,2}/, - ordinal : function (number) { - return number; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Klingon [tlh] -//! author : Dominika Kruk : https://github.com/amaranthrose - -var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_'); - -function translateFuture(output) { - var time = output; - time = (output.indexOf('jaj') !== -1) ? - time.slice(0, -3) + 'leS' : - (output.indexOf('jar') !== -1) ? - time.slice(0, -3) + 'waQ' : - (output.indexOf('DIS') !== -1) ? - time.slice(0, -3) + 'nem' : - time + ' pIq'; - return time; -} - -function translatePast(output) { - var time = output; - time = (output.indexOf('jaj') !== -1) ? - time.slice(0, -3) + 'Hu’' : - (output.indexOf('jar') !== -1) ? - time.slice(0, -3) + 'wen' : - (output.indexOf('DIS') !== -1) ? - time.slice(0, -3) + 'ben' : - time + ' ret'; - return time; -} - -function translate$9(number, withoutSuffix, string, isFuture) { - var numberNoun = numberAsNoun(number); - switch (string) { - case 'mm': - return numberNoun + ' tup'; - case 'hh': - return numberNoun + ' rep'; - case 'dd': - return numberNoun + ' jaj'; - case 'MM': - return numberNoun + ' jar'; - case 'yy': - return numberNoun + ' DIS'; - } -} - -function numberAsNoun(number) { - var hundred = Math.floor((number % 1000) / 100), - ten = Math.floor((number % 100) / 10), - one = number % 10, - word = ''; - if (hundred > 0) { - word += numbersNouns[hundred] + 'vatlh'; - } - if (ten > 0) { - word += ((word !== '') ? ' ' : '') + numbersNouns[ten] + 'maH'; - } - if (one > 0) { - word += ((word !== '') ? ' ' : '') + numbersNouns[one]; - } - return (word === '') ? 'pagh' : word; -} - -hooks.defineLocale('tlh', { - months : 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'), - monthsShort : 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'), - monthsParseExact : true, - weekdays : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), - weekdaysShort : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), - weekdaysMin : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[DaHjaj] LT', - nextDay: '[wa’leS] LT', - nextWeek: 'LLL', - lastDay: '[wa’Hu’] LT', - lastWeek: 'LLL', - sameElse: 'L' - }, - relativeTime : { - future : translateFuture, - past : translatePast, - s : 'puS lup', - m : 'wa’ tup', - mm : translate$9, - h : 'wa’ rep', - hh : translate$9, - d : 'wa’ jaj', - dd : translate$9, - M : 'wa’ jar', - MM : translate$9, - y : 'wa’ DIS', - yy : translate$9 - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Turkish [tr] -//! authors : Erhan Gundogan : https://github.com/erhangundogan, -//! Burak Yiğit Kaya: https://github.com/BYK - -var suffixes$3 = { - 1: '\'inci', - 5: '\'inci', - 8: '\'inci', - 70: '\'inci', - 80: '\'inci', - 2: '\'nci', - 7: '\'nci', - 20: '\'nci', - 50: '\'nci', - 3: '\'üncü', - 4: '\'üncü', - 100: '\'üncü', - 6: '\'ncı', - 9: '\'uncu', - 10: '\'uncu', - 30: '\'uncu', - 60: '\'ıncı', - 90: '\'ıncı' -}; - -hooks.defineLocale('tr', { - months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'), - monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'), - weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'), - weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), - weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[bugün saat] LT', - nextDay : '[yarın saat] LT', - nextWeek : '[haftaya] dddd [saat] LT', - lastDay : '[dün] LT', - lastWeek : '[geçen hafta] dddd [saat] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s sonra', - past : '%s önce', - s : 'birkaç saniye', - m : 'bir dakika', - mm : '%d dakika', - h : 'bir saat', - hh : '%d saat', - d : 'bir gün', - dd : '%d gün', - M : 'bir ay', - MM : '%d ay', - y : 'bir yıl', - yy : '%d yıl' - }, - ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/, - ordinal : function (number) { - if (number === 0) { // special case for zero - return number + '\'ıncı'; - } - var a = number % 10, - b = number % 100 - a, - c = number >= 100 ? 100 : null; - return number + (suffixes$3[a] || suffixes$3[b] || suffixes$3[c]); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Talossan [tzl] -//! author : Robin van der Vliet : https://github.com/robin0van0der0v -//! author : Iustì Canun - -// After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals. -// This is currently too difficult (maybe even impossible) to add. -hooks.defineLocale('tzl', { - months : 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'), - monthsShort : 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'), - weekdays : 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'), - weekdaysShort : 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'), - weekdaysMin : 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM [dallas] YYYY', - LLL : 'D. MMMM [dallas] YYYY HH.mm', - LLLL : 'dddd, [li] D. MMMM [dallas] YYYY HH.mm' - }, - meridiemParse: /d\'o|d\'a/i, - isPM : function (input) { - return 'd\'o' === input.toLowerCase(); - }, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'd\'o' : 'D\'O'; - } else { - return isLower ? 'd\'a' : 'D\'A'; - } - }, - calendar : { - sameDay : '[oxhi à] LT', - nextDay : '[demà à] LT', - nextWeek : 'dddd [à] LT', - lastDay : '[ieiri à] LT', - lastWeek : '[sür el] dddd [lasteu à] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'osprei %s', - past : 'ja%s', - s : processRelativeTime$5, - m : processRelativeTime$5, - mm : processRelativeTime$5, - h : processRelativeTime$5, - hh : processRelativeTime$5, - d : processRelativeTime$5, - dd : processRelativeTime$5, - M : processRelativeTime$5, - MM : processRelativeTime$5, - y : processRelativeTime$5, - yy : processRelativeTime$5 - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -function processRelativeTime$5(number, withoutSuffix, key, isFuture) { - var format = { - 's': ['viensas secunds', '\'iensas secunds'], - 'm': ['\'n míut', '\'iens míut'], - 'mm': [number + ' míuts', '' + number + ' míuts'], - 'h': ['\'n þora', '\'iensa þora'], - 'hh': [number + ' þoras', '' + number + ' þoras'], - 'd': ['\'n ziua', '\'iensa ziua'], - 'dd': [number + ' ziuas', '' + number + ' ziuas'], - 'M': ['\'n mes', '\'iens mes'], - 'MM': [number + ' mesen', '' + number + ' mesen'], - 'y': ['\'n ar', '\'iens ar'], - 'yy': [number + ' ars', '' + number + ' ars'] - }; - return isFuture ? format[key][0] : (withoutSuffix ? format[key][0] : format[key][1]); -} - -//! moment.js locale configuration -//! locale : Central Atlas Tamazight Latin [tzm-latn] -//! author : Abdel Said : https://github.com/abdelsaid - -hooks.defineLocale('tzm-latn', { - months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), - monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), - weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), - weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), - weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[asdkh g] LT', - nextDay: '[aska g] LT', - nextWeek: 'dddd [g] LT', - lastDay: '[assant g] LT', - lastWeek: 'dddd [g] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'dadkh s yan %s', - past : 'yan %s', - s : 'imik', - m : 'minuḍ', - mm : '%d minuḍ', - h : 'saɛa', - hh : '%d tassaɛin', - d : 'ass', - dd : '%d ossan', - M : 'ayowr', - MM : '%d iyyirn', - y : 'asgas', - yy : '%d isgasn' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Central Atlas Tamazight [tzm] -//! author : Abdel Said : https://github.com/abdelsaid - -hooks.defineLocale('tzm', { - months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), - monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), - weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[ⴰⵙⴷⵅ ⴴ] LT', - nextDay: '[ⴰⵙⴽⴰ ⴴ] LT', - nextWeek: 'dddd [ⴴ] LT', - lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT', - lastWeek: 'dddd [ⴴ] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s', - past : 'ⵢⴰⵏ %s', - s : 'ⵉⵎⵉⴽ', - m : 'ⵎⵉⵏⵓⴺ', - mm : '%d ⵎⵉⵏⵓⴺ', - h : 'ⵙⴰⵄⴰ', - hh : '%d ⵜⴰⵙⵙⴰⵄⵉⵏ', - d : 'ⴰⵙⵙ', - dd : '%d oⵙⵙⴰⵏ', - M : 'ⴰⵢoⵓⵔ', - MM : '%d ⵉⵢⵢⵉⵔⵏ', - y : 'ⴰⵙⴳⴰⵙ', - yy : '%d ⵉⵙⴳⴰⵙⵏ' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Ukrainian [uk] -//! author : zemlanin : https://github.com/zemlanin -//! Author : Menelion Elensúle : https://github.com/Oire - -function plural$6(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); -} -function relativeTimeWithPlural$4(number, withoutSuffix, key) { - var format = { - 'mm': withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин', - 'hh': withoutSuffix ? 'година_години_годин' : 'годину_години_годин', - 'dd': 'день_дні_днів', - 'MM': 'місяць_місяці_місяців', - 'yy': 'рік_роки_років' - }; - if (key === 'm') { - return withoutSuffix ? 'хвилина' : 'хвилину'; - } - else if (key === 'h') { - return withoutSuffix ? 'година' : 'годину'; - } - else { - return number + ' ' + plural$6(format[key], +number); - } -} -function weekdaysCaseReplace(m, format) { - var weekdays = { - 'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'), - 'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'), - 'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_') - }, - nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? - 'accusative' : - ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ? - 'genitive' : - 'nominative'); - return weekdays[nounCase][m.day()]; -} -function processHoursFunction(str) { - return function () { - return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; - }; -} - -hooks.defineLocale('uk', { - months : { - 'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'), - 'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_') - }, - monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'), - weekdays : weekdaysCaseReplace, - weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), - weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY р.', - LLL : 'D MMMM YYYY р., HH:mm', - LLLL : 'dddd, D MMMM YYYY р., HH:mm' - }, - calendar : { - sameDay: processHoursFunction('[Сьогодні '), - nextDay: processHoursFunction('[Завтра '), - lastDay: processHoursFunction('[Вчора '), - nextWeek: processHoursFunction('[У] dddd ['), - lastWeek: function () { - switch (this.day()) { - case 0: - case 3: - case 5: - case 6: - return processHoursFunction('[Минулої] dddd [').call(this); - case 1: - case 2: - case 4: - return processHoursFunction('[Минулого] dddd [').call(this); - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'за %s', - past : '%s тому', - s : 'декілька секунд', - m : relativeTimeWithPlural$4, - mm : relativeTimeWithPlural$4, - h : 'годину', - hh : relativeTimeWithPlural$4, - d : 'день', - dd : relativeTimeWithPlural$4, - M : 'місяць', - MM : relativeTimeWithPlural$4, - y : 'рік', - yy : relativeTimeWithPlural$4 - }, - // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason - meridiemParse: /ночі|ранку|дня|вечора/, - isPM: function (input) { - return /^(дня|вечора)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночі'; - } else if (hour < 12) { - return 'ранку'; - } else if (hour < 17) { - return 'дня'; - } else { - return 'вечора'; - } - }, - ordinalParse: /\d{1,2}-(й|го)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - case 'w': - case 'W': - return number + '-й'; - case 'D': - return number + '-го'; - default: - return number; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Uzbek [uz] -//! author : Sardor Muminov : https://github.com/muminoff - -hooks.defineLocale('uz', { - months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), - monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), - weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), - weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), - weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'D MMMM YYYY, dddd HH:mm' - }, - calendar : { - sameDay : '[Бугун соат] LT [да]', - nextDay : '[Эртага] LT [да]', - nextWeek : 'dddd [куни соат] LT [да]', - lastDay : '[Кеча соат] LT [да]', - lastWeek : '[Утган] dddd [куни соат] LT [да]', - sameElse : 'L' - }, - relativeTime : { - future : 'Якин %s ичида', - past : 'Бир неча %s олдин', - s : 'фурсат', - m : 'бир дакика', - mm : '%d дакика', - h : 'бир соат', - hh : '%d соат', - d : 'бир кун', - dd : '%d кун', - M : 'бир ой', - MM : '%d ой', - y : 'бир йил', - yy : '%d йил' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Vietnamese [vi] -//! author : Bang Nguyen : https://github.com/bangnk - -hooks.defineLocale('vi', { - months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), - monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), - monthsParseExact : true, - weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'), - weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), - weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), - weekdaysParseExact : true, - meridiemParse: /sa|ch/i, - isPM : function (input) { - return /^ch$/i.test(input); - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 12) { - return isLower ? 'sa' : 'SA'; - } else { - return isLower ? 'ch' : 'CH'; - } - }, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM [năm] YYYY', - LLL : 'D MMMM [năm] YYYY HH:mm', - LLLL : 'dddd, D MMMM [năm] YYYY HH:mm', - l : 'DD/M/YYYY', - ll : 'D MMM YYYY', - lll : 'D MMM YYYY HH:mm', - llll : 'ddd, D MMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Hôm nay lúc] LT', - nextDay: '[Ngày mai lúc] LT', - nextWeek: 'dddd [tuần tới lúc] LT', - lastDay: '[Hôm qua lúc] LT', - lastWeek: 'dddd [tuần rồi lúc] LT', - sameElse: 'L' - }, - relativeTime : { - future : '%s tới', - past : '%s trước', - s : 'vài giây', - m : 'một phút', - mm : '%d phút', - h : 'một giờ', - hh : '%d giờ', - d : 'một ngày', - dd : '%d ngày', - M : 'một tháng', - MM : '%d tháng', - y : 'một năm', - yy : '%d năm' - }, - ordinalParse: /\d{1,2}/, - ordinal : function (number) { - return number; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Pseudo [x-pseudo] -//! author : Andrew Hood : https://github.com/andrewhood125 - -hooks.defineLocale('x-pseudo', { - months : 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'), - monthsShort : 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'), - monthsParseExact : true, - weekdays : 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'), - weekdaysShort : 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'), - weekdaysMin : 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[T~ódá~ý át] LT', - nextDay : '[T~ómó~rró~w át] LT', - nextWeek : 'dddd [át] LT', - lastDay : '[Ý~ést~érdá~ý át] LT', - lastWeek : '[L~ást] dddd [át] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'í~ñ %s', - past : '%s á~gó', - s : 'á ~féw ~sécó~ñds', - m : 'á ~míñ~úté', - mm : '%d m~íñú~tés', - h : 'á~ñ hó~úr', - hh : '%d h~óúrs', - d : 'á ~dáý', - dd : '%d d~áýs', - M : 'á ~móñ~th', - MM : '%d m~óñt~hs', - y : 'á ~ýéár', - yy : '%d ý~éárs' - }, - ordinalParse: /\d{1,2}(th|st|nd|rd)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Yoruba Nigeria [yo] -//! author : Atolagbe Abisoye : https://github.com/andela-batolagbe - -hooks.defineLocale('yo', { - months : 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split('_'), - monthsShort : 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'), - weekdays : 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'), - weekdaysShort : 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'), - weekdaysMin : 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' - }, - calendar : { - sameDay : '[Ònì ni] LT', - nextDay : '[Ọ̀la ni] LT', - nextWeek : 'dddd [Ọsẹ̀ tón\'bọ] [ni] LT', - lastDay : '[Àna ni] LT', - lastWeek : 'dddd [Ọsẹ̀ tólọ́] [ni] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'ní %s', - past : '%s kọjá', - s : 'ìsẹjú aayá die', - m : 'ìsẹjú kan', - mm : 'ìsẹjú %d', - h : 'wákati kan', - hh : 'wákati %d', - d : 'ọjọ́ kan', - dd : 'ọjọ́ %d', - M : 'osù kan', - MM : 'osù %d', - y : 'ọdún kan', - yy : 'ọdún %d' - }, - ordinalParse : /ọjọ́\s\d{1,2}/, - ordinal : 'ọjọ́ %d', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Chinese (China) [zh-cn] -//! author : suupic : https://github.com/suupic -//! author : Zeno Zeng : https://github.com/zenozeng - -hooks.defineLocale('zh-cn', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), - weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), - weekdaysMin : '日_一_二_三_四_五_六'.split('_'), - longDateFormat : { - LT : 'Ah点mm分', - LTS : 'Ah点m分s秒', - L : 'YYYY-MM-DD', - LL : 'YYYY年MMMD日', - LLL : 'YYYY年MMMD日Ah点mm分', - LLLL : 'YYYY年MMMD日ddddAh点mm分', - l : 'YYYY-MM-DD', - ll : 'YYYY年MMMD日', - lll : 'YYYY年MMMD日Ah点mm分', - llll : 'YYYY年MMMD日ddddAh点mm分' - }, - meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === '凌晨' || meridiem === '早上' || - meridiem === '上午') { - return hour; - } else if (meridiem === '下午' || meridiem === '晚上') { - return hour + 12; - } else { - // '中午' - return hour >= 11 ? hour : hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 600) { - return '凌晨'; - } else if (hm < 900) { - return '早上'; - } else if (hm < 1130) { - return '上午'; - } else if (hm < 1230) { - return '中午'; - } else if (hm < 1800) { - return '下午'; - } else { - return '晚上'; - } - }, - calendar : { - sameDay : function () { - return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT'; - }, - nextDay : function () { - return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT'; - }, - lastDay : function () { - return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT'; - }, - nextWeek : function () { - var startOfWeek, prefix; - startOfWeek = hooks().startOf('week'); - prefix = this.diff(startOfWeek, 'days') >= 7 ? '[下]' : '[本]'; - return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; - }, - lastWeek : function () { - var startOfWeek, prefix; - startOfWeek = hooks().startOf('week'); - prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]'; - return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; - }, - sameElse : 'LL' - }, - ordinalParse: /\d{1,2}(日|月|周)/, - ordinal : function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + '日'; - case 'M': - return number + '月'; - case 'w': - case 'W': - return number + '周'; - default: - return number; - } - }, - relativeTime : { - future : '%s内', - past : '%s前', - s : '几秒', - m : '1 分钟', - mm : '%d 分钟', - h : '1 小时', - hh : '%d 小时', - d : '1 天', - dd : '%d 天', - M : '1 个月', - MM : '%d 个月', - y : '1 年', - yy : '%d 年' - }, - week : { - // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } -}); - -//! moment.js locale configuration -//! locale : Chinese (Hong Kong) [zh-hk] -//! author : Ben : https://github.com/ben-lin -//! author : Chris Lam : https://github.com/hehachris -//! author : Konstantin : https://github.com/skfd - -hooks.defineLocale('zh-hk', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), - weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), - weekdaysMin : '日_一_二_三_四_五_六'.split('_'), - longDateFormat : { - LT : 'Ah點mm分', - LTS : 'Ah點m分s秒', - L : 'YYYY年MMMD日', - LL : 'YYYY年MMMD日', - LLL : 'YYYY年MMMD日Ah點mm分', - LLLL : 'YYYY年MMMD日ddddAh點mm分', - l : 'YYYY年MMMD日', - ll : 'YYYY年MMMD日', - lll : 'YYYY年MMMD日Ah點mm分', - llll : 'YYYY年MMMD日ddddAh點mm分' - }, - meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { - return hour; - } else if (meridiem === '中午') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === '下午' || meridiem === '晚上') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 600) { - return '凌晨'; - } else if (hm < 900) { - return '早上'; - } else if (hm < 1130) { - return '上午'; - } else if (hm < 1230) { - return '中午'; - } else if (hm < 1800) { - return '下午'; - } else { - return '晚上'; - } - }, - calendar : { - sameDay : '[今天]LT', - nextDay : '[明天]LT', - nextWeek : '[下]ddddLT', - lastDay : '[昨天]LT', - lastWeek : '[上]ddddLT', - sameElse : 'L' - }, - ordinalParse: /\d{1,2}(日|月|週)/, - ordinal : function (number, period) { - switch (period) { - case 'd' : - case 'D' : - case 'DDD' : - return number + '日'; - case 'M' : - return number + '月'; - case 'w' : - case 'W' : - return number + '週'; - default : - return number; - } - }, - relativeTime : { - future : '%s內', - past : '%s前', - s : '幾秒', - m : '1 分鐘', - mm : '%d 分鐘', - h : '1 小時', - hh : '%d 小時', - d : '1 天', - dd : '%d 天', - M : '1 個月', - MM : '%d 個月', - y : '1 年', - yy : '%d 年' - } -}); - -//! moment.js locale configuration -//! locale : Chinese (Taiwan) [zh-tw] -//! author : Ben : https://github.com/ben-lin -//! author : Chris Lam : https://github.com/hehachris - -hooks.defineLocale('zh-tw', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), - weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), - weekdaysMin : '日_一_二_三_四_五_六'.split('_'), - longDateFormat : { - LT : 'Ah點mm分', - LTS : 'Ah點m分s秒', - L : 'YYYY年MMMD日', - LL : 'YYYY年MMMD日', - LLL : 'YYYY年MMMD日Ah點mm分', - LLLL : 'YYYY年MMMD日ddddAh點mm分', - l : 'YYYY年MMMD日', - ll : 'YYYY年MMMD日', - lll : 'YYYY年MMMD日Ah點mm分', - llll : 'YYYY年MMMD日ddddAh點mm分' - }, - meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { - return hour; - } else if (meridiem === '中午') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === '下午' || meridiem === '晚上') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 600) { - return '凌晨'; - } else if (hm < 900) { - return '早上'; - } else if (hm < 1130) { - return '上午'; - } else if (hm < 1230) { - return '中午'; - } else if (hm < 1800) { - return '下午'; - } else { - return '晚上'; - } - }, - calendar : { - sameDay : '[今天]LT', - nextDay : '[明天]LT', - nextWeek : '[下]ddddLT', - lastDay : '[昨天]LT', - lastWeek : '[上]ddddLT', - sameElse : 'L' - }, - ordinalParse: /\d{1,2}(日|月|週)/, - ordinal : function (number, period) { - switch (period) { - case 'd' : - case 'D' : - case 'DDD' : - return number + '日'; - case 'M' : - return number + '月'; - case 'w' : - case 'W' : - return number + '週'; - default : - return number; - } - }, - relativeTime : { - future : '%s內', - past : '%s前', - s : '幾秒', - m : '1 分鐘', - mm : '%d 分鐘', - h : '1 小時', - hh : '%d 小時', - d : '1 天', - dd : '%d 天', - M : '1 個月', - MM : '%d 個月', - y : '1 年', - yy : '%d 年' - } -}); - -hooks.locale('en'); - -return hooks; - -}))); diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/libs/svg.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/libs/svg.js deleted file mode 100644 index 06e1e1f628674649adb5347e91f0fa8cebfc8637..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/libs/svg.js +++ /dev/null @@ -1,5472 +0,0 @@ -/*! -* svg.js - A lightweight library for manipulating and animating SVG. -* @version 2.4.0 -* https://svgdotjs.github.io/ -* -* @copyright Wout Fierens <wout@mick-wout.com> -* @license MIT -* -* BUILT: Sun Feb 05 2017 03:51:27 GMT+0100 (CET) -*/; -(function(root, factory) { - if (typeof define === 'function' && define.amd) { - define(function(){ - return factory(root, root.document) - }) - } else if (typeof exports === 'object') { - module.exports = root.document ? factory(root, root.document) : function(w){ return factory(w, w.document) } - } else { - root.SVG = factory(root, root.document) - } -}(typeof window !== "undefined" ? window : this, function(window, document) { - -// The main wrapping element -var SVG = this.SVG = function(element) { - if (SVG.supported) { - element = new SVG.Doc(element) - - if(!SVG.parser.draw) - SVG.prepare() - - return element - } -} - -// Default namespaces -SVG.ns = 'http://www.w3.org/2000/svg' -SVG.xmlns = 'http://www.w3.org/2000/xmlns/' -SVG.xlink = 'http://www.w3.org/1999/xlink' -SVG.svgjs = 'http://svgjs.com/svgjs' - -// Svg support test -SVG.supported = (function() { - return !! document.createElementNS && - !! document.createElementNS(SVG.ns,'svg').createSVGRect -})() - -// Don't bother to continue if SVG is not supported -if (!SVG.supported) return false - -// Element id sequence -SVG.did = 1000 - -// Get next named element id -SVG.eid = function(name) { - return 'Svgjs' + capitalize(name) + (SVG.did++) -} - -// Method for element creation -SVG.create = function(name) { - // create element - var element = document.createElementNS(this.ns, name) - - // apply unique id - element.setAttribute('id', this.eid(name)) - - return element -} - -// Method for extending objects -SVG.extend = function() { - var modules, methods, key, i - - // Get list of modules - modules = [].slice.call(arguments) - - // Get object with extensions - methods = modules.pop() - - for (i = modules.length - 1; i >= 0; i--) - if (modules[i]) - for (key in methods) - modules[i].prototype[key] = methods[key] - - // Make sure SVG.Set inherits any newly added methods - if (SVG.Set && SVG.Set.inherit) - SVG.Set.inherit() -} - -// Invent new element -SVG.invent = function(config) { - // Create element initializer - var initializer = typeof config.create == 'function' ? - config.create : - function() { - this.constructor.call(this, SVG.create(config.create)) - } - - // Inherit prototype - if (config.inherit) - initializer.prototype = new config.inherit - - // Extend with methods - if (config.extend) - SVG.extend(initializer, config.extend) - - // Attach construct method to parent - if (config.construct) - SVG.extend(config.parent || SVG.Container, config.construct) - - return initializer -} - -// Adopt existing svg elements -SVG.adopt = function(node) { - // check for presence of node - if (!node) return null - - // make sure a node isn't already adopted - if (node.instance) return node.instance - - // initialize variables - var element - - // adopt with element-specific settings - if (node.nodeName == 'svg') - element = node.parentNode instanceof SVGElement ? new SVG.Nested : new SVG.Doc - else if (node.nodeName == 'linearGradient') - element = new SVG.Gradient('linear') - else if (node.nodeName == 'radialGradient') - element = new SVG.Gradient('radial') - else if (SVG[capitalize(node.nodeName)]) - element = new SVG[capitalize(node.nodeName)] - else - element = new SVG.Element(node) - - // ensure references - element.type = node.nodeName - element.node = node - node.instance = element - - // SVG.Class specific preparations - if (element instanceof SVG.Doc) - element.namespace().defs() - - // pull svgjs data from the dom (getAttributeNS doesn't work in html5) - element.setData(JSON.parse(node.getAttribute('svgjs:data')) || {}) - - return element -} - -// Initialize parsing element -SVG.prepare = function() { - // Select document body and create invisible svg element - var body = document.getElementsByTagName('body')[0] - , draw = (body ? new SVG.Doc(body) : new SVG.Doc(document.documentElement).nested()).size(2, 0) - - // Create parser object - SVG.parser = { - body: body || document.documentElement - , draw: draw.style('opacity:0;position:fixed;left:100%;top:100%;overflow:hidden') - , poly: draw.polyline().node - , path: draw.path().node - , native: SVG.create('svg') - } -} - -SVG.parser = { - native: SVG.create('svg') -} - -document.addEventListener('DOMContentLoaded', function() { - if(!SVG.parser.draw) - SVG.prepare() -}, false) - -// Storage for regular expressions -SVG.regex = { - // Parse unit value - numberAndUnit: /^([+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?)([a-z%]*)$/i - - // Parse hex value -, hex: /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i - - // Parse rgb value -, rgb: /rgb\((\d+),(\d+),(\d+)\)/ - - // Parse reference id -, reference: /#([a-z0-9\-_]+)/i - - // Parse matrix wrapper -, matrix: /matrix\(|\)/g - - // Elements of a matrix -, matrixElements: /,*\s+|,/ - - // Whitespace -, whitespace: /\s/g - - // Test hex value -, isHex: /^#[a-f0-9]{3,6}$/i - - // Test rgb value -, isRgb: /^rgb\(/ - - // Test css declaration -, isCss: /[^:]+:[^;]+;?/ - - // Test for blank string -, isBlank: /^(\s+)?$/ - - // Test for numeric string -, isNumber: /^[+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i - - // Test for percent value -, isPercent: /^-?[\d\.]+%$/ - - // Test for image url -, isImage: /\.(jpg|jpeg|png|gif|svg)(\?[^=]+.*)?/i - - // The following regex are used to parse the d attribute of a path - - // Replaces all negative exponents -, negExp: /e\-/gi - - // Replaces all comma -, comma: /,/g - - // Replaces all hyphens -, hyphen: /\-/g - - // Replaces and tests for all path letters -, pathLetters: /[MLHVCSQTAZ]/gi - - // yes we need this one, too -, isPathLetter: /[MLHVCSQTAZ]/i - - // split at whitespaces -, whitespaces: /\s+/ - - // matches X -, X: /X/g -} - -SVG.utils = { - // Map function - map: function(array, block) { - var i - , il = array.length - , result = [] - - for (i = 0; i < il; i++) - result.push(block(array[i])) - - return result - } - - // Filter function -, filter: function(array, block) { - var i - , il = array.length - , result = [] - - for (i = 0; i < il; i++) - if (block(array[i])) - result.push(array[i]) - - return result - } - - // Degrees to radians -, radians: function(d) { - return d % 360 * Math.PI / 180 - } - - // Radians to degrees -, degrees: function(r) { - return r * 180 / Math.PI % 360 - } - -, filterSVGElements: function(nodes) { - return this.filter( nodes, function(el) { return el instanceof SVGElement }) - } - -} - -SVG.defaults = { - // Default attribute values - attrs: { - // fill and stroke - 'fill-opacity': 1 - , 'stroke-opacity': 1 - , 'stroke-width': 0 - , 'stroke-linejoin': 'miter' - , 'stroke-linecap': 'butt' - , fill: '#000000' - , stroke: '#000000' - , opacity: 1 - // position - , x: 0 - , y: 0 - , cx: 0 - , cy: 0 - // size - , width: 0 - , height: 0 - // radius - , r: 0 - , rx: 0 - , ry: 0 - // gradient - , offset: 0 - , 'stop-opacity': 1 - , 'stop-color': '#000000' - // text - , 'font-size': 16 - , 'font-family': 'Helvetica, Arial, sans-serif' - , 'text-anchor': 'start' - } - -} -// Module for color convertions -SVG.Color = function(color) { - var match - - // initialize defaults - this.r = 0 - this.g = 0 - this.b = 0 - - if(!color) return - - // parse color - if (typeof color === 'string') { - if (SVG.regex.isRgb.test(color)) { - // get rgb values - match = SVG.regex.rgb.exec(color.replace(/\s/g,'')) - - // parse numeric values - this.r = parseInt(match[1]) - this.g = parseInt(match[2]) - this.b = parseInt(match[3]) - - } else if (SVG.regex.isHex.test(color)) { - // get hex values - match = SVG.regex.hex.exec(fullHex(color)) - - // parse numeric values - this.r = parseInt(match[1], 16) - this.g = parseInt(match[2], 16) - this.b = parseInt(match[3], 16) - - } - - } else if (typeof color === 'object') { - this.r = color.r - this.g = color.g - this.b = color.b - - } - -} - -SVG.extend(SVG.Color, { - // Default to hex conversion - toString: function() { - return this.toHex() - } - // Build hex value -, toHex: function() { - return '#' - + compToHex(this.r) - + compToHex(this.g) - + compToHex(this.b) - } - // Build rgb value -, toRgb: function() { - return 'rgb(' + [this.r, this.g, this.b].join() + ')' - } - // Calculate true brightness -, brightness: function() { - return (this.r / 255 * 0.30) - + (this.g / 255 * 0.59) - + (this.b / 255 * 0.11) - } - // Make color morphable -, morph: function(color) { - this.destination = new SVG.Color(color) - - return this - } - // Get morphed color at given position -, at: function(pos) { - // make sure a destination is defined - if (!this.destination) return this - - // normalise pos - pos = pos < 0 ? 0 : pos > 1 ? 1 : pos - - // generate morphed color - return new SVG.Color({ - r: ~~(this.r + (this.destination.r - this.r) * pos) - , g: ~~(this.g + (this.destination.g - this.g) * pos) - , b: ~~(this.b + (this.destination.b - this.b) * pos) - }) - } - -}) - -// Testers - -// Test if given value is a color string -SVG.Color.test = function(color) { - color += '' - return SVG.regex.isHex.test(color) - || SVG.regex.isRgb.test(color) -} - -// Test if given value is a rgb object -SVG.Color.isRgb = function(color) { - return color && typeof color.r == 'number' - && typeof color.g == 'number' - && typeof color.b == 'number' -} - -// Test if given value is a color -SVG.Color.isColor = function(color) { - return SVG.Color.isRgb(color) || SVG.Color.test(color) -} -// Module for array conversion -SVG.Array = function(array, fallback) { - array = (array || []).valueOf() - - // if array is empty and fallback is provided, use fallback - if (array.length == 0 && fallback) - array = fallback.valueOf() - - // parse array - this.value = this.parse(array) -} - -SVG.extend(SVG.Array, { - // Make array morphable - morph: function(array) { - this.destination = this.parse(array) - - // normalize length of arrays - if (this.value.length != this.destination.length) { - var lastValue = this.value[this.value.length - 1] - , lastDestination = this.destination[this.destination.length - 1] - - while(this.value.length > this.destination.length) - this.destination.push(lastDestination) - while(this.value.length < this.destination.length) - this.value.push(lastValue) - } - - return this - } - // Clean up any duplicate points -, settle: function() { - // find all unique values - for (var i = 0, il = this.value.length, seen = []; i < il; i++) - if (seen.indexOf(this.value[i]) == -1) - seen.push(this.value[i]) - - // set new value - return this.value = seen - } - // Get morphed array at given position -, at: function(pos) { - // make sure a destination is defined - if (!this.destination) return this - - // generate morphed array - for (var i = 0, il = this.value.length, array = []; i < il; i++) - array.push(this.value[i] + (this.destination[i] - this.value[i]) * pos) - - return new SVG.Array(array) - } - // Convert array to string -, toString: function() { - return this.value.join(' ') - } - // Real value -, valueOf: function() { - return this.value - } - // Parse whitespace separated string -, parse: function(array) { - array = array.valueOf() - - // if already is an array, no need to parse it - if (Array.isArray(array)) return array - - return this.split(array) - } - // Strip unnecessary whitespace -, split: function(string) { - return string.trim().split(/\s+/) - } - // Reverse array -, reverse: function() { - this.value.reverse() - - return this - } - -}) -// Poly points array -SVG.PointArray = function(array, fallback) { - this.constructor.call(this, array, fallback || [[0,0]]) -} - -// Inherit from SVG.Array -SVG.PointArray.prototype = new SVG.Array - -SVG.extend(SVG.PointArray, { - // Convert array to string - toString: function() { - // convert to a poly point string - for (var i = 0, il = this.value.length, array = []; i < il; i++) - array.push(this.value[i].join(',')) - - return array.join(' ') - } - // Convert array to line object -, toLine: function() { - return { - x1: this.value[0][0] - , y1: this.value[0][1] - , x2: this.value[1][0] - , y2: this.value[1][1] - } - } - // Get morphed array at given position -, at: function(pos) { - // make sure a destination is defined - if (!this.destination) return this - - // generate morphed point string - for (var i = 0, il = this.value.length, array = []; i < il; i++) - array.push([ - this.value[i][0] + (this.destination[i][0] - this.value[i][0]) * pos - , this.value[i][1] + (this.destination[i][1] - this.value[i][1]) * pos - ]) - - return new SVG.PointArray(array) - } - // Parse point string -, parse: function(array) { - var points = [] - - array = array.valueOf() - - // if already is an array, no need to parse it - if (Array.isArray(array)) return array - - // parse points - array = array.trim().split(/\s+|,/) - - // validate points - https://svgwg.org/svg2-draft/shapes.html#DataTypePoints - // Odd number of coordinates is an error. In such cases, drop the last odd coordinate. - if (array.length % 2 !== 0) array.pop() - - // wrap points in two-tuples and parse points as floats - for(var i = 0, len = array.length; i < len; i = i + 2) - points.push([ parseFloat(array[i]), parseFloat(array[i+1]) ]) - - return points - } - // Move point string -, move: function(x, y) { - var box = this.bbox() - - // get relative offset - x -= box.x - y -= box.y - - // move every point - if (!isNaN(x) && !isNaN(y)) - for (var i = this.value.length - 1; i >= 0; i--) - this.value[i] = [this.value[i][0] + x, this.value[i][1] + y] - - return this - } - // Resize poly string -, size: function(width, height) { - var i, box = this.bbox() - - // recalculate position of all points according to new size - for (i = this.value.length - 1; i >= 0; i--) { - this.value[i][0] = ((this.value[i][0] - box.x) * width) / box.width + box.x - this.value[i][1] = ((this.value[i][1] - box.y) * height) / box.height + box.y - } - - return this - } - // Get bounding box of points -, bbox: function() { - SVG.parser.poly.setAttribute('points', this.toString()) - - return SVG.parser.poly.getBBox() - } - -}) -// Path points array -SVG.PathArray = function(array, fallback) { - this.constructor.call(this, array, fallback || [['M', 0, 0]]) -} - -// Inherit from SVG.Array -SVG.PathArray.prototype = new SVG.Array - -SVG.extend(SVG.PathArray, { - // Convert array to string - toString: function() { - return arrayToString(this.value) - } - // Move path string -, move: function(x, y) { - // get bounding box of current situation - var box = this.bbox() - - // get relative offset - x -= box.x - y -= box.y - - if (!isNaN(x) && !isNaN(y)) { - // move every point - for (var l, i = this.value.length - 1; i >= 0; i--) { - l = this.value[i][0] - - if (l == 'M' || l == 'L' || l == 'T') { - this.value[i][1] += x - this.value[i][2] += y - - } else if (l == 'H') { - this.value[i][1] += x - - } else if (l == 'V') { - this.value[i][1] += y - - } else if (l == 'C' || l == 'S' || l == 'Q') { - this.value[i][1] += x - this.value[i][2] += y - this.value[i][3] += x - this.value[i][4] += y - - if (l == 'C') { - this.value[i][5] += x - this.value[i][6] += y - } - - } else if (l == 'A') { - this.value[i][6] += x - this.value[i][7] += y - } - - } - } - - return this - } - // Resize path string -, size: function(width, height) { - // get bounding box of current situation - var i, l, box = this.bbox() - - // recalculate position of all points according to new size - for (i = this.value.length - 1; i >= 0; i--) { - l = this.value[i][0] - - if (l == 'M' || l == 'L' || l == 'T') { - this.value[i][1] = ((this.value[i][1] - box.x) * width) / box.width + box.x - this.value[i][2] = ((this.value[i][2] - box.y) * height) / box.height + box.y - - } else if (l == 'H') { - this.value[i][1] = ((this.value[i][1] - box.x) * width) / box.width + box.x - - } else if (l == 'V') { - this.value[i][1] = ((this.value[i][1] - box.y) * height) / box.height + box.y - - } else if (l == 'C' || l == 'S' || l == 'Q') { - this.value[i][1] = ((this.value[i][1] - box.x) * width) / box.width + box.x - this.value[i][2] = ((this.value[i][2] - box.y) * height) / box.height + box.y - this.value[i][3] = ((this.value[i][3] - box.x) * width) / box.width + box.x - this.value[i][4] = ((this.value[i][4] - box.y) * height) / box.height + box.y - - if (l == 'C') { - this.value[i][5] = ((this.value[i][5] - box.x) * width) / box.width + box.x - this.value[i][6] = ((this.value[i][6] - box.y) * height) / box.height + box.y - } - - } else if (l == 'A') { - // resize radii - this.value[i][1] = (this.value[i][1] * width) / box.width - this.value[i][2] = (this.value[i][2] * height) / box.height - - // move position values - this.value[i][6] = ((this.value[i][6] - box.x) * width) / box.width + box.x - this.value[i][7] = ((this.value[i][7] - box.y) * height) / box.height + box.y - } - - } - - return this - } - // Test if the passed path array use the same path data commands as this path array -, equalCommands: function(pathArray) { - var i, il, equalCommands - - pathArray = new SVG.PathArray(pathArray) - - equalCommands = this.value.length === pathArray.value.length - for(i = 0, il = this.value.length; equalCommands && i < il; i++) { - equalCommands = this.value[i][0] === pathArray.value[i][0] - } - - return equalCommands - } - // Make path array morphable -, morph: function(pathArray) { - pathArray = new SVG.PathArray(pathArray) - - if(this.equalCommands(pathArray)) { - this.destination = pathArray - } else { - this.destination = null - } - - return this - } - // Get morphed path array at given position -, at: function(pos) { - // make sure a destination is defined - if (!this.destination) return this - - var sourceArray = this.value - , destinationArray = this.destination.value - , array = [], pathArray = new SVG.PathArray() - , i, il, j, jl - - // Animate has specified in the SVG spec - // See: https://www.w3.org/TR/SVG11/paths.html#PathElement - for (i = 0, il = sourceArray.length; i < il; i++) { - array[i] = [sourceArray[i][0]] - for(j = 1, jl = sourceArray[i].length; j < jl; j++) { - array[i][j] = sourceArray[i][j] + (destinationArray[i][j] - sourceArray[i][j]) * pos - } - // For the two flags of the elliptical arc command, the SVG spec say: - // Flags and booleans are interpolated as fractions between zero and one, with any non-zero value considered to be a value of one/true - // Elliptical arc command as an array followed by corresponding indexes: - // ['A', rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y] - // 0 1 2 3 4 5 6 7 - if(array[i][0] === 'A') { - array[i][4] = +(array[i][4] != 0) - array[i][5] = +(array[i][5] != 0) - } - } - - // Directly modify the value of a path array, this is done this way for performance - pathArray.value = array - return pathArray - } - // Absolutize and parse path to array -, parse: function(array) { - // if it's already a patharray, no need to parse it - if (array instanceof SVG.PathArray) return array.valueOf() - - // prepare for parsing - var i, x0, y0, s, seg, arr - , x = 0 - , y = 0 - , paramCnt = { 'M':2, 'L':2, 'H':1, 'V':1, 'C':6, 'S':4, 'Q':4, 'T':2, 'A':7 } - - if(typeof array == 'string'){ - - array = array - .replace(SVG.regex.negExp, 'X') // replace all negative exponents with certain char - .replace(SVG.regex.pathLetters, ' $& ') // put some room between letters and numbers - .replace(SVG.regex.hyphen, ' -') // add space before hyphen - .replace(SVG.regex.comma, ' ') // unify all spaces - .replace(SVG.regex.X, 'e-') // add back the expoent - .trim() // trim - .split(SVG.regex.whitespaces) // split into array - - // at this place there could be parts like ['3.124.854.32'] because we could not determine the point as seperator till now - // we fix this elements in the next loop - for(i = array.length; --i;){ - if(array[i].indexOf('.') != array[i].lastIndexOf('.')){ - var split = array[i].split('.') // split at the point - var first = [split.shift(), split.shift()].join('.') // join the first number together - array.splice.apply(array, [i, 1].concat(first, split.map(function(el){ return '.'+el }))) // add first and all other entries back to array - } - } - - }else{ - array = array.reduce(function(prev, curr){ - return [].concat.apply(prev, curr) - }, []) - } - - // array now is an array containing all parts of a path e.g. ['M', '0', '0', 'L', '30', '30' ...] - - var arr = [] - - do{ - - // Test if we have a path letter - if(SVG.regex.isPathLetter.test(array[0])){ - s = array[0] - array.shift() - // If last letter was a move command and we got no new, it defaults to [L]ine - }else if(s == 'M'){ - s = 'L' - }else if(s == 'm'){ - s = 'l' - } - - // add path letter as first element - seg = [s.toUpperCase()] - - // push all necessary parameters to segment - for(i = 0; i < paramCnt[seg[0]]; ++i){ - seg.push(parseFloat(array.shift())) - } - - // upper case - if(s == seg[0]){ - - if(s == 'M' || s == 'L' || s == 'C' || s == 'Q' || s == 'S' || s == 'T'){ - x = seg[paramCnt[seg[0]]-1] - y = seg[paramCnt[seg[0]]] - }else if(s == 'V'){ - y = seg[1] - }else if(s == 'H'){ - x = seg[1] - }else if(s == 'A'){ - x = seg[6] - y = seg[7] - } - - // lower case - }else{ - - // convert relative to absolute values - if(s == 'm' || s == 'l' || s == 'c' || s == 's' || s == 'q' || s == 't'){ - - seg[1] += x - seg[2] += y - - if(seg[3] != null){ - seg[3] += x - seg[4] += y - } - - if(seg[5] != null){ - seg[5] += x - seg[6] += y - } - - // move pointer - x = seg[paramCnt[seg[0]]-1] - y = seg[paramCnt[seg[0]]] - - }else if(s == 'v'){ - seg[1] += y - y = seg[1] - }else if(s == 'h'){ - seg[1] += x - x = seg[1] - }else if(s == 'a'){ - seg[6] += x - seg[7] += y - x = seg[6] - y = seg[7] - } - - } - - if(seg[0] == 'M'){ - x0 = x - y0 = y - } - - if(seg[0] == 'Z'){ - x = x0 - y = y0 - } - - arr.push(seg) - - }while(array.length) - - return arr - - } - // Get bounding box of path -, bbox: function() { - SVG.parser.path.setAttribute('d', this.toString()) - - return SVG.parser.path.getBBox() - } - -}) - -// Module for unit convertions -SVG.Number = SVG.invent({ - // Initialize - create: function(value, unit) { - // initialize defaults - this.value = 0 - this.unit = unit || '' - - // parse value - if (typeof value === 'number') { - // ensure a valid numeric value - this.value = isNaN(value) ? 0 : !isFinite(value) ? (value < 0 ? -3.4e+38 : +3.4e+38) : value - - } else if (typeof value === 'string') { - unit = value.match(SVG.regex.numberAndUnit) - - if (unit) { - // make value numeric - this.value = parseFloat(unit[1]) - - // normalize - if (unit[5] == '%') - this.value /= 100 - else if (unit[5] == 's') - this.value *= 1000 - - // store unit - this.unit = unit[5] - } - - } else { - if (value instanceof SVG.Number) { - this.value = value.valueOf() - this.unit = value.unit - } - } - - } - // Add methods -, extend: { - // Stringalize - toString: function() { - return ( - this.unit == '%' ? - ~~(this.value * 1e8) / 1e6: - this.unit == 's' ? - this.value / 1e3 : - this.value - ) + this.unit - } - , toJSON: function() { - return this.toString() - } - , // Convert to primitive - valueOf: function() { - return this.value - } - // Add number - , plus: function(number) { - return new SVG.Number(this + new SVG.Number(number), this.unit) - } - // Subtract number - , minus: function(number) { - return this.plus(-new SVG.Number(number)) - } - // Multiply number - , times: function(number) { - return new SVG.Number(this * new SVG.Number(number), this.unit) - } - // Divide number - , divide: function(number) { - return new SVG.Number(this / new SVG.Number(number), this.unit) - } - // Convert to different unit - , to: function(unit) { - var number = new SVG.Number(this) - - if (typeof unit === 'string') - number.unit = unit - - return number - } - // Make number morphable - , morph: function(number) { - this.destination = new SVG.Number(number) - - return this - } - // Get morphed number at given position - , at: function(pos) { - // Make sure a destination is defined - if (!this.destination) return this - - // Generate new morphed number - return new SVG.Number(this.destination) - .minus(this) - .times(pos) - .plus(this) - } - - } -}) - -SVG.Element = SVG.invent({ - // Initialize node - create: function(node) { - // make stroke value accessible dynamically - this._stroke = SVG.defaults.attrs.stroke - - // initialize data object - this.dom = {} - - // create circular reference - if (this.node = node) { - this.type = node.nodeName - this.node.instance = this - - // store current attribute value - this._stroke = node.getAttribute('stroke') || this._stroke - } - } - - // Add class methods -, extend: { - // Move over x-axis - x: function(x) { - return this.attr('x', x) - } - // Move over y-axis - , y: function(y) { - return this.attr('y', y) - } - // Move by center over x-axis - , cx: function(x) { - return x == null ? this.x() + this.width() / 2 : this.x(x - this.width() / 2) - } - // Move by center over y-axis - , cy: function(y) { - return y == null ? this.y() + this.height() / 2 : this.y(y - this.height() / 2) - } - // Move element to given x and y values - , move: function(x, y) { - return this.x(x).y(y) - } - // Move element by its center - , center: function(x, y) { - return this.cx(x).cy(y) - } - // Set width of element - , width: function(width) { - return this.attr('width', width) - } - // Set height of element - , height: function(height) { - return this.attr('height', height) - } - // Set element size to given width and height - , size: function(width, height) { - var p = proportionalSize(this, width, height) - - return this - .width(new SVG.Number(p.width)) - .height(new SVG.Number(p.height)) - } - // Clone element - , clone: function(parent) { - // clone element and assign new id - var clone = assignNewId(this.node.cloneNode(true)) - - // insert the clone in the given parent or after myself - if(parent) parent.add(clone) - else this.after(clone) - - return clone - } - // Remove element - , remove: function() { - if (this.parent()) - this.parent().removeElement(this) - - return this - } - // Replace element - , replace: function(element) { - this.after(element).remove() - - return element - } - // Add element to given container and return self - , addTo: function(parent) { - return parent.put(this) - } - // Add element to given container and return container - , putIn: function(parent) { - return parent.add(this) - } - // Get / set id - , id: function(id) { - return this.attr('id', id) - } - // Checks whether the given point inside the bounding box of the element - , inside: function(x, y) { - var box = this.bbox() - - return x > box.x - && y > box.y - && x < box.x + box.width - && y < box.y + box.height - } - // Show element - , show: function() { - return this.style('display', '') - } - // Hide element - , hide: function() { - return this.style('display', 'none') - } - // Is element visible? - , visible: function() { - return this.style('display') != 'none' - } - // Return id on string conversion - , toString: function() { - return this.attr('id') - } - // Return array of classes on the node - , classes: function() { - var attr = this.attr('class') - - return attr == null ? [] : attr.trim().split(/\s+/) - } - // Return true if class exists on the node, false otherwise - , hasClass: function(name) { - return this.classes().indexOf(name) != -1 - } - // Add class to the node - , addClass: function(name) { - if (!this.hasClass(name)) { - var array = this.classes() - array.push(name) - this.attr('class', array.join(' ')) - } - - return this - } - // Remove class from the node - , removeClass: function(name) { - if (this.hasClass(name)) { - this.attr('class', this.classes().filter(function(c) { - return c != name - }).join(' ')) - } - - return this - } - // Toggle the presence of a class on the node - , toggleClass: function(name) { - return this.hasClass(name) ? this.removeClass(name) : this.addClass(name) - } - // Get referenced element form attribute value - , reference: function(attr) { - return SVG.get(this.attr(attr)) - } - // Returns the parent element instance - , parent: function(type) { - var parent = this - - // check for parent - if(!parent.node.parentNode) return null - - // get parent element - parent = SVG.adopt(parent.node.parentNode) - - if(!type) return parent - - // loop trough ancestors if type is given - while(parent && parent.node instanceof SVGElement){ - if(typeof type === 'string' ? parent.matches(type) : parent instanceof type) return parent - parent = SVG.adopt(parent.node.parentNode) - } - } - // Get parent document - , doc: function() { - return this instanceof SVG.Doc ? this : this.parent(SVG.Doc) - } - // return array of all ancestors of given type up to the root svg - , parents: function(type) { - var parents = [], parent = this - - do{ - parent = parent.parent(type) - if(!parent || !parent.node) break - - parents.push(parent) - } while(parent.parent) - - return parents - } - // matches the element vs a css selector - , matches: function(selector){ - return matches(this.node, selector) - } - // Returns the svg node to call native svg methods on it - , native: function() { - return this.node - } - // Import raw svg - , svg: function(svg) { - // create temporary holder - var well = document.createElement('svg') - - // act as a setter if svg is given - if (svg && this instanceof SVG.Parent) { - // dump raw svg - well.innerHTML = '<svg>' + svg.replace(/\n/, '').replace(/<(\w+)([^<]+?)\/>/g, '<$1$2></$1>') + '</svg>' - - // transplant nodes - for (var i = 0, il = well.firstChild.childNodes.length; i < il; i++) - this.node.appendChild(well.firstChild.firstChild) - - // otherwise act as a getter - } else { - // create a wrapping svg element in case of partial content - well.appendChild(svg = document.createElement('svg')) - - // write svgjs data to the dom - this.writeDataToDom() - - // insert a copy of this node - svg.appendChild(this.node.cloneNode(true)) - - // return target element - return well.innerHTML.replace(/^<svg>/, '').replace(/<\/svg>$/, '') - } - - return this - } - // write svgjs data to the dom - , writeDataToDom: function() { - - // dump variables recursively - if(this.each || this.lines){ - var fn = this.each ? this : this.lines(); - fn.each(function(){ - this.writeDataToDom() - }) - } - - // remove previously set data - this.node.removeAttribute('svgjs:data') - - if(Object.keys(this.dom).length) - this.node.setAttribute('svgjs:data', JSON.stringify(this.dom)) // see #428 - - return this - } - // set given data to the elements data property - , setData: function(o){ - this.dom = o - return this - } - , is: function(obj){ - return is(this, obj) - } - } -}) - -SVG.easing = { - '-': function(pos){return pos} -, '<>':function(pos){return -Math.cos(pos * Math.PI) / 2 + 0.5} -, '>': function(pos){return Math.sin(pos * Math.PI / 2)} -, '<': function(pos){return -Math.cos(pos * Math.PI / 2) + 1} -} - -SVG.morph = function(pos){ - return function(from, to) { - return new SVG.MorphObj(from, to).at(pos) - } -} - -SVG.Situation = SVG.invent({ - - create: function(o){ - this.init = false - this.reversed = false - this.reversing = false - - this.duration = new SVG.Number(o.duration).valueOf() - this.delay = new SVG.Number(o.delay).valueOf() - - this.start = +new Date() + this.delay - this.finish = this.start + this.duration - this.ease = o.ease - - // this.loop is incremented from 0 to this.loops - // it is also incremented when in an infinite loop (when this.loops is true) - this.loop = 0 - this.loops = false - - this.animations = { - // functionToCall: [list of morphable objects] - // e.g. move: [SVG.Number, SVG.Number] - } - - this.attrs = { - // holds all attributes which are not represented from a function svg.js provides - // e.g. someAttr: SVG.Number - } - - this.styles = { - // holds all styles which should be animated - // e.g. fill-color: SVG.Color - } - - this.transforms = [ - // holds all transformations as transformation objects - // e.g. [SVG.Rotate, SVG.Translate, SVG.Matrix] - ] - - this.once = { - // functions to fire at a specific position - // e.g. "0.5": function foo(){} - } - - } - -}) - - -SVG.FX = SVG.invent({ - - create: function(element) { - this._target = element - this.situations = [] - this.active = false - this.situation = null - this.paused = false - this.lastPos = 0 - this.pos = 0 - // The absolute position of an animation is its position in the context of its complete duration (including delay and loops) - // When performing a delay, absPos is below 0 and when performing a loop, its value is above 1 - this.absPos = 0 - this._speed = 1 - } - -, extend: { - - /** - * sets or returns the target of this animation - * @param o object || number In case of Object it holds all parameters. In case of number its the duration of the animation - * @param ease function || string Function which should be used for easing or easing keyword - * @param delay Number indicating the delay before the animation starts - * @return target || this - */ - animate: function(o, ease, delay){ - - if(typeof o == 'object'){ - ease = o.ease - delay = o.delay - o = o.duration - } - - var situation = new SVG.Situation({ - duration: o || 1000, - delay: delay || 0, - ease: SVG.easing[ease || '-'] || ease - }) - - this.queue(situation) - - return this - } - - /** - * sets a delay before the next element of the queue is called - * @param delay Duration of delay in milliseconds - * @return this.target() - */ - , delay: function(delay){ - // The delay is performed by an empty situation with its duration - // attribute set to the duration of the delay - var situation = new SVG.Situation({ - duration: delay, - delay: 0, - ease: SVG.easing['-'] - }) - - return this.queue(situation) - } - - /** - * sets or returns the target of this animation - * @param null || target SVG.Element which should be set as new target - * @return target || this - */ - , target: function(target){ - if(target && target instanceof SVG.Element){ - this._target = target - return this - } - - return this._target - } - - // returns the absolute position at a given time - , timeToAbsPos: function(timestamp){ - return (timestamp - this.situation.start) / (this.situation.duration/this._speed) - } - - // returns the timestamp from a given absolute positon - , absPosToTime: function(absPos){ - return this.situation.duration/this._speed * absPos + this.situation.start - } - - // starts the animationloop - , startAnimFrame: function(){ - this.stopAnimFrame() - this.animationFrame = requestAnimationFrame(function(){ this.step() }.bind(this)) - } - - // cancels the animationframe - , stopAnimFrame: function(){ - cancelAnimationFrame(this.animationFrame) - } - - // kicks off the animation - only does something when the queue is currently not active and at least one situation is set - , start: function(){ - // dont start if already started - if(!this.active && this.situation){ - this.active = true - this.startCurrent() - } - - return this - } - - // start the current situation - , startCurrent: function(){ - this.situation.start = +new Date + this.situation.delay/this._speed - this.situation.finish = this.situation.start + this.situation.duration/this._speed - return this.initAnimations().step() - } - - /** - * adds a function / Situation to the animation queue - * @param fn function / situation to add - * @return this - */ - , queue: function(fn){ - if(typeof fn == 'function' || fn instanceof SVG.Situation) - this.situations.push(fn) - - if(!this.situation) this.situation = this.situations.shift() - - return this - } - - /** - * pulls next element from the queue and execute it - * @return this - */ - , dequeue: function(){ - // stop current animation - this.situation && this.situation.stop && this.situation.stop() - - // get next animation from queue - this.situation = this.situations.shift() - - if(this.situation){ - if(this.situation instanceof SVG.Situation) { - this.startCurrent() - } else { - // If it is not a SVG.Situation, then it is a function, we execute it - this.situation.call(this) - } - } - - return this - } - - // updates all animations to the current state of the element - // this is important when one property could be changed from another property - , initAnimations: function() { - var i - var s = this.situation - - if(s.init) return this - - for(i in s.animations){ - - if(i == 'viewbox'){ - s.animations[i] = this.target().viewbox().morph(s.animations[i]) - }else{ - - // TODO: this is not a clean clone of the array. We may have some unchecked references - s.animations[i].value = (i == 'plot' ? this.target().array().value : this.target()[i]()) - - // sometimes we get back an object and not the real value, fix this - if(s.animations[i].value.value){ - s.animations[i].value = s.animations[i].value.value - } - - if(s.animations[i].relative) - s.animations[i].destination.value = s.animations[i].destination.value + s.animations[i].value - - } - - } - - for(i in s.attrs){ - if(s.attrs[i] instanceof SVG.Color){ - var color = new SVG.Color(this.target().attr(i)) - s.attrs[i].r = color.r - s.attrs[i].g = color.g - s.attrs[i].b = color.b - }else{ - s.attrs[i].value = this.target().attr(i)// + s.attrs[i].value - } - } - - for(i in s.styles){ - s.styles[i].value = this.target().style(i) - } - - s.initialTransformation = this.target().matrixify() - - s.init = true - return this - } - , clearQueue: function(){ - this.situations = [] - return this - } - , clearCurrent: function(){ - this.situation = null - return this - } - /** stops the animation immediately - * @param jumpToEnd A Boolean indicating whether to complete the current animation immediately. - * @param clearQueue A Boolean indicating whether to remove queued animation as well. - * @return this - */ - , stop: function(jumpToEnd, clearQueue){ - if(!this.active) this.start() - - if(clearQueue){ - this.clearQueue() - } - - this.active = false - - if(jumpToEnd && this.situation){ - this.atEnd() - } - - this.stopAnimFrame() - - return this.clearCurrent() - } - - /** resets the element to the state where the current element has started - * @return this - */ - , reset: function(){ - if(this.situation){ - var temp = this.situation - this.stop() - this.situation = temp - this.atStart() - } - return this - } - - // Stop the currently-running animation, remove all queued animations, and complete all animations for the element. - , finish: function(){ - - this.stop(true, false) - - while(this.dequeue().situation && this.stop(true, false)); - - this.clearQueue().clearCurrent() - - return this - } - - // set the internal animation pointer at the start position, before any loops, and updates the visualisation - , atStart: function() { - return this.at(0, true) - } - - // set the internal animation pointer at the end position, after all the loops, and updates the visualisation - , atEnd: function() { - if (this.situation.loops === true) { - // If in a infinite loop, we end the current iteration - return this.at(this.situation.loop+1, true) - } else if(typeof this.situation.loops == 'number') { - // If performing a finite number of loops, we go after all the loops - return this.at(this.situation.loops, true) - } else { - // If no loops, we just go at the end - return this.at(1, true) - } - } - - // set the internal animation pointer to the specified position and updates the visualisation - // if isAbsPos is true, pos is treated as an absolute position - , at: function(pos, isAbsPos){ - var durDivSpd = this.situation.duration/this._speed - - this.absPos = pos - // If pos is not an absolute position, we convert it into one - if (!isAbsPos) { - if (this.situation.reversed) this.absPos = 1 - this.absPos - this.absPos += this.situation.loop - } - - this.situation.start = +new Date - this.absPos * durDivSpd - this.situation.finish = this.situation.start + durDivSpd - - return this.step(true) - } - - /** - * sets or returns the speed of the animations - * @param speed null || Number The new speed of the animations - * @return Number || this - */ - , speed: function(speed){ - if (speed === 0) return this.pause() - - if (speed) { - this._speed = speed - // We use an absolute position here so that speed can affect the delay before the animation - return this.at(this.absPos, true) - } else return this._speed - } - - // Make loopable - , loop: function(times, reverse) { - var c = this.last() - - // store total loops - c.loops = (times != null) ? times : true - c.loop = 0 - - if(reverse) c.reversing = true - return this - } - - // pauses the animation - , pause: function(){ - this.paused = true - this.stopAnimFrame() - - return this - } - - // unpause the animation - , play: function(){ - if(!this.paused) return this - this.paused = false - // We use an absolute position here so that the delay before the animation can be paused - return this.at(this.absPos, true) - } - - /** - * toggle or set the direction of the animation - * true sets direction to backwards while false sets it to forwards - * @param reversed Boolean indicating whether to reverse the animation or not (default: toggle the reverse status) - * @return this - */ - , reverse: function(reversed){ - var c = this.last() - - if(typeof reversed == 'undefined') c.reversed = !c.reversed - else c.reversed = reversed - - return this - } - - - /** - * returns a float from 0-1 indicating the progress of the current animation - * @param eased Boolean indicating whether the returned position should be eased or not - * @return number - */ - , progress: function(easeIt){ - return easeIt ? this.situation.ease(this.pos) : this.pos - } - - /** - * adds a callback function which is called when the current animation is finished - * @param fn Function which should be executed as callback - * @return number - */ - , after: function(fn){ - var c = this.last() - , wrapper = function wrapper(e){ - if(e.detail.situation == c){ - fn.call(this, c) - this.off('finished.fx', wrapper) // prevent memory leak - } - } - - this.target().on('finished.fx', wrapper) - return this - } - - // adds a callback which is called whenever one animation step is performed - , during: function(fn){ - var c = this.last() - , wrapper = function(e){ - if(e.detail.situation == c){ - fn.call(this, e.detail.pos, SVG.morph(e.detail.pos), e.detail.eased, c) - } - } - - // see above - this.target().off('during.fx', wrapper).on('during.fx', wrapper) - - return this.after(function(){ - this.off('during.fx', wrapper) - }) - } - - // calls after ALL animations in the queue are finished - , afterAll: function(fn){ - var wrapper = function wrapper(e){ - fn.call(this) - this.off('allfinished.fx', wrapper) - } - - // see above - this.target().off('allfinished.fx', wrapper).on('allfinished.fx', wrapper) - return this - } - - // calls on every animation step for all animations - , duringAll: function(fn){ - var wrapper = function(e){ - fn.call(this, e.detail.pos, SVG.morph(e.detail.pos), e.detail.eased, e.detail.situation) - } - - this.target().off('during.fx', wrapper).on('during.fx', wrapper) - - return this.afterAll(function(){ - this.off('during.fx', wrapper) - }) - } - - , last: function(){ - return this.situations.length ? this.situations[this.situations.length-1] : this.situation - } - - // adds one property to the animations - , add: function(method, args, type){ - this.last()[type || 'animations'][method] = args - setTimeout(function(){this.start()}.bind(this), 0) - return this - } - - /** perform one step of the animation - * @param ignoreTime Boolean indicating whether to ignore time and use position directly or recalculate position based on time - * @return this - */ - , step: function(ignoreTime){ - - // convert current time to an absolute position - if(!ignoreTime) this.absPos = this.timeToAbsPos(+new Date) - - // This part convert an absolute position to a position - if(this.situation.loops !== false) { - var absPos, absPosInt, lastLoop - - // If the absolute position is below 0, we just treat it as if it was 0 - absPos = Math.max(this.absPos, 0) - absPosInt = Math.floor(absPos) - - if(this.situation.loops === true || absPosInt < this.situation.loops) { - this.pos = absPos - absPosInt - lastLoop = this.situation.loop - this.situation.loop = absPosInt - } else { - this.absPos = this.situation.loops - this.pos = 1 - // The -1 here is because we don't want to toggle reversed when all the loops have been completed - lastLoop = this.situation.loop - 1 - this.situation.loop = this.situation.loops - } - - if(this.situation.reversing) { - // Toggle reversed if an odd number of loops as occured since the last call of step - this.situation.reversed = this.situation.reversed != Boolean((this.situation.loop - lastLoop) % 2) - } - - } else { - // If there are no loop, the absolute position must not be above 1 - this.absPos = Math.min(this.absPos, 1) - this.pos = this.absPos - } - - // while the absolute position can be below 0, the position must not be below 0 - if(this.pos < 0) this.pos = 0 - - if(this.situation.reversed) this.pos = 1 - this.pos - - - // apply easing - var eased = this.situation.ease(this.pos) - - // call once-callbacks - for(var i in this.situation.once){ - if(i > this.lastPos && i <= eased){ - this.situation.once[i].call(this.target(), this.pos, eased) - delete this.situation.once[i] - } - } - - // fire during callback with position, eased position and current situation as parameter - if(this.active) this.target().fire('during', {pos: this.pos, eased: eased, fx: this, situation: this.situation}) - - // the user may call stop or finish in the during callback - // so make sure that we still have a valid situation - if(!this.situation){ - return this - } - - // apply the actual animation to every property - this.eachAt() - - // do final code when situation is finished - if((this.pos == 1 && !this.situation.reversed) || (this.situation.reversed && this.pos == 0)){ - - // stop animation callback - this.stopAnimFrame() - - // fire finished callback with current situation as parameter - this.target().fire('finished', {fx:this, situation: this.situation}) - - if(!this.situations.length){ - this.target().fire('allfinished') - this.target().off('.fx') // there shouldnt be any binding left, but to make sure... - this.active = false - } - - // start next animation - if(this.active) this.dequeue() - else this.clearCurrent() - - }else if(!this.paused && this.active){ - // we continue animating when we are not at the end - this.startAnimFrame() - } - - // save last eased position for once callback triggering - this.lastPos = eased - return this - - } - - // calculates the step for every property and calls block with it - , eachAt: function(){ - var i, at, self = this, target = this.target(), s = this.situation - - // apply animations which can be called trough a method - for(i in s.animations){ - - at = [].concat(s.animations[i]).map(function(el){ - return typeof el !== 'string' && el.at ? el.at(s.ease(self.pos), self.pos) : el - }) - - target[i].apply(target, at) - - } - - // apply animation which has to be applied with attr() - for(i in s.attrs){ - - at = [i].concat(s.attrs[i]).map(function(el){ - return typeof el !== 'string' && el.at ? el.at(s.ease(self.pos), self.pos) : el - }) - - target.attr.apply(target, at) - - } - - // apply animation which has to be applied with style() - for(i in s.styles){ - - at = [i].concat(s.styles[i]).map(function(el){ - return typeof el !== 'string' && el.at ? el.at(s.ease(self.pos), self.pos) : el - }) - - target.style.apply(target, at) - - } - - // animate initialTransformation which has to be chained - if(s.transforms.length){ - - // get initial initialTransformation - at = s.initialTransformation - for(i = 0, len = s.transforms.length; i < len; i++){ - - // get next transformation in chain - var a = s.transforms[i] - - // multiply matrix directly - if(a instanceof SVG.Matrix){ - - if(a.relative){ - at = at.multiply(new SVG.Matrix().morph(a).at(s.ease(this.pos))) - }else{ - at = at.morph(a).at(s.ease(this.pos)) - } - continue - } - - // when transformation is absolute we have to reset the needed transformation first - if(!a.relative) - a.undo(at.extract()) - - // and reapply it after - at = at.multiply(a.at(s.ease(this.pos))) - - } - - // set new matrix on element - target.matrix(at) - } - - return this - - } - - - // adds an once-callback which is called at a specific position and never again - , once: function(pos, fn, isEased){ - - if(!isEased)pos = this.situation.ease(pos) - - this.situation.once[pos] = fn - - return this - } - - } - -, parent: SVG.Element - - // Add method to parent elements -, construct: { - // Get fx module or create a new one, then animate with given duration and ease - animate: function(o, ease, delay) { - return (this.fx || (this.fx = new SVG.FX(this))).animate(o, ease, delay) - } - , delay: function(delay){ - return (this.fx || (this.fx = new SVG.FX(this))).delay(delay) - } - , stop: function(jumpToEnd, clearQueue) { - if (this.fx) - this.fx.stop(jumpToEnd, clearQueue) - - return this - } - , finish: function() { - if (this.fx) - this.fx.finish() - - return this - } - // Pause current animation - , pause: function() { - if (this.fx) - this.fx.pause() - - return this - } - // Play paused current animation - , play: function() { - if (this.fx) - this.fx.play() - - return this - } - // Set/Get the speed of the animations - , speed: function(speed) { - if (this.fx) - if (speed == null) - return this.fx.speed() - else - this.fx.speed(speed) - - return this - } - } - -}) - -// MorphObj is used whenever no morphable object is given -SVG.MorphObj = SVG.invent({ - - create: function(from, to){ - // prepare color for morphing - if(SVG.Color.isColor(to)) return new SVG.Color(from).morph(to) - // prepare number for morphing - if(SVG.regex.numberAndUnit.test(to)) return new SVG.Number(from).morph(to) - - // prepare for plain morphing - this.value = 0 - this.destination = to - } - -, extend: { - at: function(pos, real){ - return real < 1 ? this.value : this.destination - }, - - valueOf: function(){ - return this.value - } - } - -}) - -SVG.extend(SVG.FX, { - // Add animatable attributes - attr: function(a, v, relative) { - // apply attributes individually - if (typeof a == 'object') { - for (var key in a) - this.attr(key, a[key]) - - } else { - // the MorphObj takes care about the right function used - this.add(a, new SVG.MorphObj(null, v), 'attrs') - } - - return this - } - // Add animatable styles -, style: function(s, v) { - if (typeof s == 'object') - for (var key in s) - this.style(key, s[key]) - - else - this.add(s, new SVG.MorphObj(null, v), 'styles') - - return this - } - // Animatable x-axis -, x: function(x, relative) { - if(this.target() instanceof SVG.G){ - this.transform({x:x}, relative) - return this - } - - var num = new SVG.Number().morph(x) - num.relative = relative - return this.add('x', num) - } - // Animatable y-axis -, y: function(y, relative) { - if(this.target() instanceof SVG.G){ - this.transform({y:y}, relative) - return this - } - - var num = new SVG.Number().morph(y) - num.relative = relative - return this.add('y', num) - } - // Animatable center x-axis -, cx: function(x) { - return this.add('cx', new SVG.Number().morph(x)) - } - // Animatable center y-axis -, cy: function(y) { - return this.add('cy', new SVG.Number().morph(y)) - } - // Add animatable move -, move: function(x, y) { - return this.x(x).y(y) - } - // Add animatable center -, center: function(x, y) { - return this.cx(x).cy(y) - } - // Add animatable size -, size: function(width, height) { - if (this.target() instanceof SVG.Text) { - // animate font size for Text elements - this.attr('font-size', width) - - } else { - // animate bbox based size for all other elements - var box - - if(!width || !height){ - box = this.target().bbox() - } - - if(!width){ - width = box.width / box.height * height - } - - if(!height){ - height = box.height / box.width * width - } - - this.add('width' , new SVG.Number().morph(width)) - .add('height', new SVG.Number().morph(height)) - - } - - return this - } - // Add animatable plot -, plot: function(p) { - return this.add('plot', this.target().array().morph(p)) - } - // Add leading method -, leading: function(value) { - return this.target().leading ? - this.add('leading', new SVG.Number().morph(value)) : - this - } - // Add animatable viewbox -, viewbox: function(x, y, width, height) { - if (this.target() instanceof SVG.Container) { - this.add('viewbox', new SVG.ViewBox(x, y, width, height)) - } - - return this - } -, update: function(o) { - if (this.target() instanceof SVG.Stop) { - if (typeof o == 'number' || o instanceof SVG.Number) { - return this.update({ - offset: arguments[0] - , color: arguments[1] - , opacity: arguments[2] - }) - } - - if (o.opacity != null) this.attr('stop-opacity', o.opacity) - if (o.color != null) this.attr('stop-color', o.color) - if (o.offset != null) this.attr('offset', o.offset) - } - - return this - } -}) - -SVG.BBox = SVG.invent({ - // Initialize - create: function(element) { - // get values if element is given - if (element) { - var box - - // yes this is ugly, but Firefox can be a bitch when it comes to elements that are not yet rendered - try { - - // the element is NOT in the dom, throw error - if(!document.documentElement.contains(element.node)) throw new Exception('Element not in the dom') - - // find native bbox - box = element.node.getBBox() - } catch(e) { - if(element instanceof SVG.Shape){ - var clone = element.clone(SVG.parser.draw).show() - box = clone.bbox() - clone.remove() - }else{ - box = { - x: element.node.clientLeft - , y: element.node.clientTop - , width: element.node.clientWidth - , height: element.node.clientHeight - } - } - } - - // plain x and y - this.x = box.x - this.y = box.y - - // plain width and height - this.width = box.width - this.height = box.height - } - - // add center, right and bottom - fullBox(this) - } - - // Define Parent -, parent: SVG.Element - - // Constructor -, construct: { - // Get bounding box - bbox: function() { - return new SVG.BBox(this) - } - } - -}) - -SVG.TBox = SVG.invent({ - // Initialize - create: function(element) { - // get values if element is given - if (element) { - var t = element.ctm().extract() - , box = element.bbox() - - // width and height including transformations - this.width = box.width * t.scaleX - this.height = box.height * t.scaleY - - // x and y including transformations - this.x = box.x + t.x - this.y = box.y + t.y - } - - // add center, right and bottom - fullBox(this) - } - - // Define Parent -, parent: SVG.Element - - // Constructor -, construct: { - // Get transformed bounding box - tbox: function() { - return new SVG.TBox(this) - } - } - -}) - - -SVG.RBox = SVG.invent({ - // Initialize - create: function(element) { - if (element) { - var e = element.doc().parent() - , box = element.node.getBoundingClientRect() - , zoom = 1 - - // get screen offset - this.x = box.left - this.y = box.top - - // subtract parent offset - this.x -= e.offsetLeft - this.y -= e.offsetTop - - while (e = e.offsetParent) { - this.x -= e.offsetLeft - this.y -= e.offsetTop - } - - // calculate cumulative zoom from svg documents - e = element - while (e.parent && (e = e.parent())) { - if (e.viewbox) { - zoom *= e.viewbox().zoom - this.x -= e.x() || 0 - this.y -= e.y() || 0 - } - } - - // recalculate viewbox distortion - this.width = box.width /= zoom - this.height = box.height /= zoom - } - - // add center, right and bottom - fullBox(this) - - // offset by window scroll position, because getBoundingClientRect changes when window is scrolled - this.x += window.pageXOffset - this.y += window.pageYOffset - } - - // define Parent -, parent: SVG.Element - - // Constructor -, construct: { - // Get rect box - rbox: function() { - return new SVG.RBox(this) - } - } - -}) - -// Add universal merge method -;[SVG.BBox, SVG.TBox, SVG.RBox].forEach(function(c) { - - SVG.extend(c, { - // Merge rect box with another, return a new instance - merge: function(box) { - var b = new c() - - // merge boxes - b.x = Math.min(this.x, box.x) - b.y = Math.min(this.y, box.y) - b.width = Math.max(this.x + this.width, box.x + box.width) - b.x - b.height = Math.max(this.y + this.height, box.y + box.height) - b.y - - return fullBox(b) - } - - }) - -}) - -SVG.Matrix = SVG.invent({ - // Initialize - create: function(source) { - var i, base = arrayToMatrix([1, 0, 0, 1, 0, 0]) - - // ensure source as object - source = source instanceof SVG.Element ? - source.matrixify() : - typeof source === 'string' ? - stringToMatrix(source) : - arguments.length == 6 ? - arrayToMatrix([].slice.call(arguments)) : - typeof source === 'object' ? - source : base - - // merge source - for (i = abcdef.length - 1; i >= 0; --i) - this[abcdef[i]] = source && typeof source[abcdef[i]] === 'number' ? - source[abcdef[i]] : base[abcdef[i]] - } - - // Add methods -, extend: { - // Extract individual transformations - extract: function() { - // find delta transform points - var px = deltaTransformPoint(this, 0, 1) - , py = deltaTransformPoint(this, 1, 0) - , skewX = 180 / Math.PI * Math.atan2(px.y, px.x) - 90 - - return { - // translation - x: this.e - , y: this.f - , transformedX:(this.e * Math.cos(skewX * Math.PI / 180) + this.f * Math.sin(skewX * Math.PI / 180)) / Math.sqrt(this.a * this.a + this.b * this.b) - , transformedY:(this.f * Math.cos(skewX * Math.PI / 180) + this.e * Math.sin(-skewX * Math.PI / 180)) / Math.sqrt(this.c * this.c + this.d * this.d) - // skew - , skewX: -skewX - , skewY: 180 / Math.PI * Math.atan2(py.y, py.x) - // scale - , scaleX: Math.sqrt(this.a * this.a + this.b * this.b) - , scaleY: Math.sqrt(this.c * this.c + this.d * this.d) - // rotation - , rotation: skewX - , a: this.a - , b: this.b - , c: this.c - , d: this.d - , e: this.e - , f: this.f - , matrix: new SVG.Matrix(this) - } - } - // Clone matrix - , clone: function() { - return new SVG.Matrix(this) - } - // Morph one matrix into another - , morph: function(matrix) { - // store new destination - this.destination = new SVG.Matrix(matrix) - - return this - } - // Get morphed matrix at a given position - , at: function(pos) { - // make sure a destination is defined - if (!this.destination) return this - - // calculate morphed matrix at a given position - var matrix = new SVG.Matrix({ - a: this.a + (this.destination.a - this.a) * pos - , b: this.b + (this.destination.b - this.b) * pos - , c: this.c + (this.destination.c - this.c) * pos - , d: this.d + (this.destination.d - this.d) * pos - , e: this.e + (this.destination.e - this.e) * pos - , f: this.f + (this.destination.f - this.f) * pos - }) - - // process parametric rotation if present - if (this.param && this.param.to) { - // calculate current parametric position - var param = { - rotation: this.param.from.rotation + (this.param.to.rotation - this.param.from.rotation) * pos - , cx: this.param.from.cx - , cy: this.param.from.cy - } - - // rotate matrix - matrix = matrix.rotate( - (this.param.to.rotation - this.param.from.rotation * 2) * pos - , param.cx - , param.cy - ) - - // store current parametric values - matrix.param = param - } - - return matrix - } - // Multiplies by given matrix - , multiply: function(matrix) { - return new SVG.Matrix(this.native().multiply(parseMatrix(matrix).native())) - } - // Inverses matrix - , inverse: function() { - return new SVG.Matrix(this.native().inverse()) - } - // Translate matrix - , translate: function(x, y) { - return new SVG.Matrix(this.native().translate(x || 0, y || 0)) - } - // Scale matrix - , scale: function(x, y, cx, cy) { - // support uniformal scale - if (arguments.length == 1) { - y = x - } else if (arguments.length == 3) { - cy = cx - cx = y - y = x - } - - return this.around(cx, cy, new SVG.Matrix(x, 0, 0, y, 0, 0)) - } - // Rotate matrix - , rotate: function(r, cx, cy) { - // convert degrees to radians - r = SVG.utils.radians(r) - - return this.around(cx, cy, new SVG.Matrix(Math.cos(r), Math.sin(r), -Math.sin(r), Math.cos(r), 0, 0)) - } - // Flip matrix on x or y, at a given offset - , flip: function(a, o) { - return a == 'x' ? this.scale(-1, 1, o, 0) : this.scale(1, -1, 0, o) - } - // Skew - , skew: function(x, y, cx, cy) { - // support uniformal skew - if (arguments.length == 1) { - y = x - } else if (arguments.length == 3) { - cy = cx - cx = y - y = x - } - - // convert degrees to radians - x = SVG.utils.radians(x) - y = SVG.utils.radians(y) - - return this.around(cx, cy, new SVG.Matrix(1, Math.tan(y), Math.tan(x), 1, 0, 0)) - } - // SkewX - , skewX: function(x, cx, cy) { - return this.skew(x, 0, cx, cy) - } - // SkewY - , skewY: function(y, cx, cy) { - return this.skew(0, y, cx, cy) - } - // Transform around a center point - , around: function(cx, cy, matrix) { - return this - .multiply(new SVG.Matrix(1, 0, 0, 1, cx || 0, cy || 0)) - .multiply(matrix) - .multiply(new SVG.Matrix(1, 0, 0, 1, -cx || 0, -cy || 0)) - } - // Convert to native SVGMatrix - , native: function() { - // create new matrix - var matrix = SVG.parser.native.createSVGMatrix() - - // update with current values - for (var i = abcdef.length - 1; i >= 0; i--) - matrix[abcdef[i]] = this[abcdef[i]] - - return matrix - } - // Convert matrix to string - , toString: function() { - return 'matrix(' + this.a + ',' + this.b + ',' + this.c + ',' + this.d + ',' + this.e + ',' + this.f + ')' - } - } - - // Define parent -, parent: SVG.Element - - // Add parent method -, construct: { - // Get current matrix - ctm: function() { - return new SVG.Matrix(this.node.getCTM()) - }, - // Get current screen matrix - screenCTM: function() { - return new SVG.Matrix(this.node.getScreenCTM()) - } - - } - -}) - -SVG.Point = SVG.invent({ - // Initialize - create: function(x,y) { - var i, source, base = {x:0, y:0} - - // ensure source as object - source = Array.isArray(x) ? - {x:x[0], y:x[1]} : - typeof x === 'object' ? - {x:x.x, y:x.y} : - x != null ? - {x:x, y:(y != null ? y : x)} : base // If y has no value, then x is used has its value - - // merge source - this.x = source.x - this.y = source.y - } - - // Add methods -, extend: { - // Clone point - clone: function() { - return new SVG.Point(this) - } - // Morph one point into another - , morph: function(x, y) { - // store new destination - this.destination = new SVG.Point(x, y) - - return this - } - // Get morphed point at a given position - , at: function(pos) { - // make sure a destination is defined - if (!this.destination) return this - - // calculate morphed matrix at a given position - var point = new SVG.Point({ - x: this.x + (this.destination.x - this.x) * pos - , y: this.y + (this.destination.y - this.y) * pos - }) - - return point - } - // Convert to native SVGPoint - , native: function() { - // create new point - var point = SVG.parser.native.createSVGPoint() - - // update with current values - point.x = this.x - point.y = this.y - - return point - } - // transform point with matrix - , transform: function(matrix) { - return new SVG.Point(this.native().matrixTransform(matrix.native())) - } - - } - -}) - -SVG.extend(SVG.Element, { - - // Get point - point: function(x, y) { - return new SVG.Point(x,y).transform(this.screenCTM().inverse()); - } - -}) - -SVG.extend(SVG.Element, { - // Set svg element attribute - attr: function(a, v, n) { - // act as full getter - if (a == null) { - // get an object of attributes - a = {} - v = this.node.attributes - for (n = v.length - 1; n >= 0; n--) - a[v[n].nodeName] = SVG.regex.isNumber.test(v[n].nodeValue) ? parseFloat(v[n].nodeValue) : v[n].nodeValue - - return a - - } else if (typeof a == 'object') { - // apply every attribute individually if an object is passed - for (v in a) this.attr(v, a[v]) - - } else if (v === null) { - // remove value - this.node.removeAttribute(a) - - } else if (v == null) { - // act as a getter if the first and only argument is not an object - v = this.node.getAttribute(a) - return v == null ? - SVG.defaults.attrs[a] : - SVG.regex.isNumber.test(v) ? - parseFloat(v) : v - - } else { - // BUG FIX: some browsers will render a stroke if a color is given even though stroke width is 0 - if (a == 'stroke-width') - this.attr('stroke', parseFloat(v) > 0 ? this._stroke : null) - else if (a == 'stroke') - this._stroke = v - - // convert image fill and stroke to patterns - if (a == 'fill' || a == 'stroke') { - if (SVG.regex.isImage.test(v)) - v = this.doc().defs().image(v, 0, 0) - - if (v instanceof SVG.Image) - v = this.doc().defs().pattern(0, 0, function() { - this.add(v) - }) - } - - // ensure correct numeric values (also accepts NaN and Infinity) - if (typeof v === 'number') - v = new SVG.Number(v) - - // ensure full hex color - else if (SVG.Color.isColor(v)) - v = new SVG.Color(v) - - // parse array values - else if (Array.isArray(v)) - v = new SVG.Array(v) - - // store parametric transformation values locally - else if (v instanceof SVG.Matrix && v.param) - this.param = v.param - - // if the passed attribute is leading... - if (a == 'leading') { - // ... call the leading method instead - if (this.leading) - this.leading(v) - } else { - // set given attribute on node - typeof n === 'string' ? - this.node.setAttributeNS(n, a, v.toString()) : - this.node.setAttribute(a, v.toString()) - } - - // rebuild if required - if (this.rebuild && (a == 'font-size' || a == 'x')) - this.rebuild(a, v) - } - - return this - } -}) -SVG.extend(SVG.Element, { - // Add transformations - transform: function(o, relative) { - // get target in case of the fx module, otherwise reference this - var target = this - , matrix - - // act as a getter - if (typeof o !== 'object') { - // get current matrix - matrix = new SVG.Matrix(target).extract() - - return typeof o === 'string' ? matrix[o] : matrix - } - - // get current matrix - matrix = new SVG.Matrix(target) - - // ensure relative flag - relative = !!relative || !!o.relative - - // act on matrix - if (o.a != null) { - matrix = relative ? - // relative - matrix.multiply(new SVG.Matrix(o)) : - // absolute - new SVG.Matrix(o) - - // act on rotation - } else if (o.rotation != null) { - // ensure centre point - ensureCentre(o, target) - - // apply transformation - matrix = relative ? - // relative - matrix.rotate(o.rotation, o.cx, o.cy) : - // absolute - matrix.rotate(o.rotation - matrix.extract().rotation, o.cx, o.cy) - - // act on scale - } else if (o.scale != null || o.scaleX != null || o.scaleY != null) { - // ensure centre point - ensureCentre(o, target) - - // ensure scale values on both axes - o.scaleX = o.scale != null ? o.scale : o.scaleX != null ? o.scaleX : 1 - o.scaleY = o.scale != null ? o.scale : o.scaleY != null ? o.scaleY : 1 - - if (!relative) { - // absolute; multiply inversed values - var e = matrix.extract() - o.scaleX = o.scaleX * 1 / e.scaleX - o.scaleY = o.scaleY * 1 / e.scaleY - } - - matrix = matrix.scale(o.scaleX, o.scaleY, o.cx, o.cy) - - // act on skew - } else if (o.skew != null || o.skewX != null || o.skewY != null) { - // ensure centre point - ensureCentre(o, target) - - // ensure skew values on both axes - o.skewX = o.skew != null ? o.skew : o.skewX != null ? o.skewX : 0 - o.skewY = o.skew != null ? o.skew : o.skewY != null ? o.skewY : 0 - - if (!relative) { - // absolute; reset skew values - var e = matrix.extract() - matrix = matrix.multiply(new SVG.Matrix().skew(e.skewX, e.skewY, o.cx, o.cy).inverse()) - } - - matrix = matrix.skew(o.skewX, o.skewY, o.cx, o.cy) - - // act on flip - } else if (o.flip) { - matrix = matrix.flip( - o.flip - , o.offset == null ? target.bbox()['c' + o.flip] : o.offset - ) - - // act on translate - } else if (o.x != null || o.y != null) { - if (relative) { - // relative - matrix = matrix.translate(o.x, o.y) - } else { - // absolute - if (o.x != null) matrix.e = o.x - if (o.y != null) matrix.f = o.y - } - } - - return this.attr('transform', matrix) - } -}) - -SVG.extend(SVG.FX, { - transform: function(o, relative) { - // get target in case of the fx module, otherwise reference this - var target = this.target() - , matrix - - // act as a getter - if (typeof o !== 'object') { - // get current matrix - matrix = new SVG.Matrix(target).extract() - - return typeof o === 'string' ? matrix[o] : matrix - } - - // ensure relative flag - relative = !!relative || !!o.relative - - // act on matrix - if (o.a != null) { - matrix = new SVG.Matrix(o) - - // act on rotation - } else if (o.rotation != null) { - // ensure centre point - ensureCentre(o, target) - - // apply transformation - matrix = new SVG.Rotate(o.rotation, o.cx, o.cy) - - // act on scale - } else if (o.scale != null || o.scaleX != null || o.scaleY != null) { - // ensure centre point - ensureCentre(o, target) - - // ensure scale values on both axes - o.scaleX = o.scale != null ? o.scale : o.scaleX != null ? o.scaleX : 1 - o.scaleY = o.scale != null ? o.scale : o.scaleY != null ? o.scaleY : 1 - - matrix = new SVG.Scale(o.scaleX, o.scaleY, o.cx, o.cy) - - // act on skew - } else if (o.skewX != null || o.skewY != null) { - // ensure centre point - ensureCentre(o, target) - - // ensure skew values on both axes - o.skewX = o.skewX != null ? o.skewX : 0 - o.skewY = o.skewY != null ? o.skewY : 0 - - matrix = new SVG.Skew(o.skewX, o.skewY, o.cx, o.cy) - - // act on flip - } else if (o.flip) { - matrix = new SVG.Matrix().morph(new SVG.Matrix().flip( - o.flip - , o.offset == null ? target.bbox()['c' + o.flip] : o.offset - )) - - // act on translate - } else if (o.x != null || o.y != null) { - matrix = new SVG.Translate(o.x, o.y) - } - - if(!matrix) return this - - matrix.relative = relative - - this.last().transforms.push(matrix) - - setTimeout(function(){this.start()}.bind(this), 0) - - return this - } -}) - -SVG.extend(SVG.Element, { - // Reset all transformations - untransform: function() { - return this.attr('transform', null) - }, - // merge the whole transformation chain into one matrix and returns it - matrixify: function() { - - var matrix = (this.attr('transform') || '') - // split transformations - .split(/\)\s*,?\s*/).slice(0,-1).map(function(str){ - // generate key => value pairs - var kv = str.trim().split('(') - return [kv[0], kv[1].split(SVG.regex.matrixElements).map(function(str){ return parseFloat(str) })] - }) - // calculate every transformation into one matrix - .reduce(function(matrix, transform){ - - if(transform[0] == 'matrix') return matrix.multiply(arrayToMatrix(transform[1])) - return matrix[transform[0]].apply(matrix, transform[1]) - - }, new SVG.Matrix()) - - return matrix - }, - // add an element to another parent without changing the visual representation on the screen - toParent: function(parent) { - if(this == parent) return this - var ctm = this.screenCTM() - var temp = parent.rect(1,1) - var pCtm = temp.screenCTM().inverse() - temp.remove() - - this.addTo(parent).untransform().transform(pCtm.multiply(ctm)) - - return this - }, - // same as above with parent equals root-svg - toDoc: function() { - return this.toParent(this.doc()) - } - -}) - -SVG.Transformation = SVG.invent({ - - create: function(source, inversed){ - - if(arguments.length > 1 && typeof inversed != 'boolean'){ - return this.create([].slice.call(arguments)) - } - - if(typeof source == 'object'){ - for(var i = 0, len = this.arguments.length; i < len; ++i){ - this[this.arguments[i]] = source[this.arguments[i]] - } - } - - if(Array.isArray(source)){ - for(var i = 0, len = this.arguments.length; i < len; ++i){ - this[this.arguments[i]] = source[i] - } - } - - this.inversed = false - - if(inversed === true){ - this.inversed = true - } - - } - -, extend: { - - at: function(pos){ - - var params = [] - - for(var i = 0, len = this.arguments.length; i < len; ++i){ - params.push(this[this.arguments[i]]) - } - - var m = this._undo || new SVG.Matrix() - - m = new SVG.Matrix().morph(SVG.Matrix.prototype[this.method].apply(m, params)).at(pos) - - return this.inversed ? m.inverse() : m - - } - - , undo: function(o){ - for(var i = 0, len = this.arguments.length; i < len; ++i){ - o[this.arguments[i]] = typeof this[this.arguments[i]] == 'undefined' ? 0 : o[this.arguments[i]] - } - - // The method SVG.Matrix.extract which was used before calling this - // method to obtain a value for the parameter o doesn't return a cx and - // a cy so we use the ones that were provided to this object at its creation - o.cx = this.cx - o.cy = this.cy - - this._undo = new SVG[capitalize(this.method)](o, true).at(1) - - return this - } - - } - -}) - -SVG.Translate = SVG.invent({ - - parent: SVG.Matrix -, inherit: SVG.Transformation - -, create: function(source, inversed){ - if(typeof source == 'object') this.constructor.call(this, source, inversed) - else this.constructor.call(this, [].slice.call(arguments)) - } - -, extend: { - arguments: ['transformedX', 'transformedY'] - , method: 'translate' - } - -}) - -SVG.Rotate = SVG.invent({ - - parent: SVG.Matrix -, inherit: SVG.Transformation - -, create: function(source, inversed){ - if(typeof source == 'object') this.constructor.call(this, source, inversed) - else this.constructor.call(this, [].slice.call(arguments)) - } - -, extend: { - arguments: ['rotation', 'cx', 'cy'] - , method: 'rotate' - , at: function(pos){ - var m = new SVG.Matrix().rotate(new SVG.Number().morph(this.rotation - (this._undo ? this._undo.rotation : 0)).at(pos), this.cx, this.cy) - return this.inversed ? m.inverse() : m - } - , undo: function(o){ - this._undo = o - } - } - -}) - -SVG.Scale = SVG.invent({ - - parent: SVG.Matrix -, inherit: SVG.Transformation - -, create: function(source, inversed){ - if(typeof source == 'object') this.constructor.call(this, source, inversed) - else this.constructor.call(this, [].slice.call(arguments)) - } - -, extend: { - arguments: ['scaleX', 'scaleY', 'cx', 'cy'] - , method: 'scale' - } - -}) - -SVG.Skew = SVG.invent({ - - parent: SVG.Matrix -, inherit: SVG.Transformation - -, create: function(source, inversed){ - if(typeof source == 'object') this.constructor.call(this, source, inversed) - else this.constructor.call(this, [].slice.call(arguments)) - } - -, extend: { - arguments: ['skewX', 'skewY', 'cx', 'cy'] - , method: 'skew' - } - -}) - -SVG.extend(SVG.Element, { - // Dynamic style generator - style: function(s, v) { - if (arguments.length == 0) { - // get full style - return this.node.style.cssText || '' - - } else if (arguments.length < 2) { - // apply every style individually if an object is passed - if (typeof s == 'object') { - for (v in s) this.style(v, s[v]) - - } else if (SVG.regex.isCss.test(s)) { - // parse css string - s = s.split(';') - - // apply every definition individually - for (var i = 0; i < s.length; i++) { - v = s[i].split(':') - this.style(v[0].replace(/\s+/g, ''), v[1]) - } - } else { - // act as a getter if the first and only argument is not an object - return this.node.style[camelCase(s)] - } - - } else { - this.node.style[camelCase(s)] = v === null || SVG.regex.isBlank.test(v) ? '' : v - } - - return this - } -}) -SVG.Parent = SVG.invent({ - // Initialize node - create: function(element) { - this.constructor.call(this, element) - } - - // Inherit from -, inherit: SVG.Element - - // Add class methods -, extend: { - // Returns all child elements - children: function() { - return SVG.utils.map(SVG.utils.filterSVGElements(this.node.childNodes), function(node) { - return SVG.adopt(node) - }) - } - // Add given element at a position - , add: function(element, i) { - if (i == null) - this.node.appendChild(element.node) - else if (element.node != this.node.childNodes[i]) - this.node.insertBefore(element.node, this.node.childNodes[i]) - - return this - } - // Basically does the same as `add()` but returns the added element instead - , put: function(element, i) { - this.add(element, i) - return element - } - // Checks if the given element is a child - , has: function(element) { - return this.index(element) >= 0 - } - // Gets index of given element - , index: function(element) { - return [].slice.call(this.node.childNodes).indexOf(element.node) - } - // Get a element at the given index - , get: function(i) { - return SVG.adopt(this.node.childNodes[i]) - } - // Get first child - , first: function() { - return this.get(0) - } - // Get the last child - , last: function() { - return this.get(this.node.childNodes.length - 1) - } - // Iterates over all children and invokes a given block - , each: function(block, deep) { - var i, il - , children = this.children() - - for (i = 0, il = children.length; i < il; i++) { - if (children[i] instanceof SVG.Element) - block.apply(children[i], [i, children]) - - if (deep && (children[i] instanceof SVG.Container)) - children[i].each(block, deep) - } - - return this - } - // Remove a given child - , removeElement: function(element) { - this.node.removeChild(element.node) - - return this - } - // Remove all elements in this container - , clear: function() { - // remove children - while(this.node.hasChildNodes()) - this.node.removeChild(this.node.lastChild) - - // remove defs reference - delete this._defs - - return this - } - , // Get defs - defs: function() { - return this.doc().defs() - } - } - -}) - -SVG.extend(SVG.Parent, { - - ungroup: function(parent, depth) { - if(depth === 0 || this instanceof SVG.Defs) return this - - parent = parent || (this instanceof SVG.Doc ? this : this.parent(SVG.Parent)) - depth = depth || Infinity - - this.each(function(){ - if(this instanceof SVG.Defs) return this - if(this instanceof SVG.Parent) return this.ungroup(parent, depth-1) - return this.toParent(parent) - }) - - this.node.firstChild || this.remove() - - return this - }, - - flatten: function(parent, depth) { - return this.ungroup(parent, depth) - } - -}) -SVG.Container = SVG.invent({ - // Initialize node - create: function(element) { - this.constructor.call(this, element) - } - - // Inherit from -, inherit: SVG.Parent - -}) - -SVG.ViewBox = SVG.invent({ - - create: function(source) { - var i, base = [0, 0, 0, 0] - - var x, y, width, height, box, view, we, he - , wm = 1 // width multiplier - , hm = 1 // height multiplier - , reg = /[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?/gi - - if(source instanceof SVG.Element){ - - we = source - he = source - view = (source.attr('viewBox') || '').match(reg) - box = source.bbox - - // get dimensions of current node - width = new SVG.Number(source.width()) - height = new SVG.Number(source.height()) - - // find nearest non-percentual dimensions - while (width.unit == '%') { - wm *= width.value - width = new SVG.Number(we instanceof SVG.Doc ? we.parent().offsetWidth : we.parent().width()) - we = we.parent() - } - while (height.unit == '%') { - hm *= height.value - height = new SVG.Number(he instanceof SVG.Doc ? he.parent().offsetHeight : he.parent().height()) - he = he.parent() - } - - // ensure defaults - this.x = 0 - this.y = 0 - this.width = width * wm - this.height = height * hm - this.zoom = 1 - - if (view) { - // get width and height from viewbox - x = parseFloat(view[0]) - y = parseFloat(view[1]) - width = parseFloat(view[2]) - height = parseFloat(view[3]) - - // calculate zoom accoring to viewbox - this.zoom = ((this.width / this.height) > (width / height)) ? - this.height / height : - this.width / width - - // calculate real pixel dimensions on parent SVG.Doc element - this.x = x - this.y = y - this.width = width - this.height = height - - } - - }else{ - - // ensure source as object - source = typeof source === 'string' ? - source.match(reg).map(function(el){ return parseFloat(el) }) : - Array.isArray(source) ? - source : - typeof source == 'object' ? - [source.x, source.y, source.width, source.height] : - arguments.length == 4 ? - [].slice.call(arguments) : - base - - this.x = source[0] - this.y = source[1] - this.width = source[2] - this.height = source[3] - } - - - } - -, extend: { - - toString: function() { - return this.x + ' ' + this.y + ' ' + this.width + ' ' + this.height - } - , morph: function(v){ - - var v = arguments.length == 1 ? - [v.x, v.y, v.width, v.height] : - [].slice.call(arguments) - - this.destination = new SVG.ViewBox(v) - - return this - - } - - , at: function(pos) { - - if(!this.destination) return this - - return new SVG.ViewBox([ - this.x + (this.destination.x - this.x) * pos - , this.y + (this.destination.y - this.y) * pos - , this.width + (this.destination.width - this.width) * pos - , this.height + (this.destination.height - this.height) * pos - ]) - - } - - } - - // Define parent -, parent: SVG.Container - - // Add parent method -, construct: { - - // get/set viewbox - viewbox: function(v) { - if (arguments.length == 0) - // act as a getter if there are no arguments - return new SVG.ViewBox(this) - - // otherwise act as a setter - v = arguments.length == 1 ? - [v.x, v.y, v.width, v.height] : - [].slice.call(arguments) - - return this.attr('viewBox', v) - } - - } - -}) -// Add events to elements -;[ 'click' - , 'dblclick' - , 'mousedown' - , 'mouseup' - , 'mouseover' - , 'mouseout' - , 'mousemove' - // , 'mouseenter' -> not supported by IE - // , 'mouseleave' -> not supported by IE - , 'touchstart' - , 'touchmove' - , 'touchleave' - , 'touchend' - , 'touchcancel' ].forEach(function(event) { - - // add event to SVG.Element - SVG.Element.prototype[event] = function(f) { - var self = this - - // bind event to element rather than element node - this.node['on' + event] = typeof f == 'function' ? - function() { return f.apply(self, arguments) } : null - - return this - } - -}) - -// Initialize listeners stack -SVG.listeners = [] -SVG.handlerMap = [] -SVG.listenerId = 0 - -// Add event binder in the SVG namespace -SVG.on = function(node, event, listener, binding) { - // create listener, get object-index - var l = listener.bind(binding || node.instance || node) - , index = (SVG.handlerMap.indexOf(node) + 1 || SVG.handlerMap.push(node)) - 1 - , ev = event.split('.')[0] - , ns = event.split('.')[1] || '*' - - - // ensure valid object - SVG.listeners[index] = SVG.listeners[index] || {} - SVG.listeners[index][ev] = SVG.listeners[index][ev] || {} - SVG.listeners[index][ev][ns] = SVG.listeners[index][ev][ns] || {} - - if(!listener._svgjsListenerId) - listener._svgjsListenerId = ++SVG.listenerId - - // reference listener - SVG.listeners[index][ev][ns][listener._svgjsListenerId] = l - - // add listener - node.addEventListener(ev, l, false) -} - -// Add event unbinder in the SVG namespace -SVG.off = function(node, event, listener) { - var index = SVG.handlerMap.indexOf(node) - , ev = event && event.split('.')[0] - , ns = event && event.split('.')[1] - - if(index == -1) return - - if (listener) { - if(typeof listener == 'function') listener = listener._svgjsListenerId - if(!listener) return - - // remove listener reference - if (SVG.listeners[index][ev] && SVG.listeners[index][ev][ns || '*']) { - // remove listener - node.removeEventListener(ev, SVG.listeners[index][ev][ns || '*'][listener], false) - - delete SVG.listeners[index][ev][ns || '*'][listener] - } - - } else if (ns && ev) { - // remove all listeners for a namespaced event - if (SVG.listeners[index][ev] && SVG.listeners[index][ev][ns]) { - for (listener in SVG.listeners[index][ev][ns]) - SVG.off(node, [ev, ns].join('.'), listener) - - delete SVG.listeners[index][ev][ns] - } - - } else if (ns){ - // remove all listeners for a specific namespace - for(event in SVG.listeners[index]){ - for(namespace in SVG.listeners[index][event]){ - if(ns === namespace){ - SVG.off(node, [event, ns].join('.')) - } - } - } - - } else if (ev) { - // remove all listeners for the event - if (SVG.listeners[index][ev]) { - for (namespace in SVG.listeners[index][ev]) - SVG.off(node, [ev, namespace].join('.')) - - delete SVG.listeners[index][ev] - } - - } else { - // remove all listeners on a given node - for (event in SVG.listeners[index]) - SVG.off(node, event) - - delete SVG.listeners[index] - - } -} - -// -SVG.extend(SVG.Element, { - // Bind given event to listener - on: function(event, listener, binding) { - SVG.on(this.node, event, listener, binding) - - return this - } - // Unbind event from listener -, off: function(event, listener) { - SVG.off(this.node, event, listener) - - return this - } - // Fire given event -, fire: function(event, data) { - - // Dispatch event - if(event instanceof Event){ - this.node.dispatchEvent(event) - }else{ - this.node.dispatchEvent(new CustomEvent(event, {detail:data})) - } - - return this - } -}) - -SVG.Defs = SVG.invent({ - // Initialize node - create: 'defs' - - // Inherit from -, inherit: SVG.Container - -}) -SVG.G = SVG.invent({ - // Initialize node - create: 'g' - - // Inherit from -, inherit: SVG.Container - - // Add class methods -, extend: { - // Move over x-axis - x: function(x) { - return x == null ? this.transform('x') : this.transform({ x: x - this.x() }, true) - } - // Move over y-axis - , y: function(y) { - return y == null ? this.transform('y') : this.transform({ y: y - this.y() }, true) - } - // Move by center over x-axis - , cx: function(x) { - return x == null ? this.gbox().cx : this.x(x - this.gbox().width / 2) - } - // Move by center over y-axis - , cy: function(y) { - return y == null ? this.gbox().cy : this.y(y - this.gbox().height / 2) - } - , gbox: function() { - - var bbox = this.bbox() - , trans = this.transform() - - bbox.x += trans.x - bbox.x2 += trans.x - bbox.cx += trans.x - - bbox.y += trans.y - bbox.y2 += trans.y - bbox.cy += trans.y - - return bbox - } - } - - // Add parent method -, construct: { - // Create a group element - group: function() { - return this.put(new SVG.G) - } - } -}) - -// ### This module adds backward / forward functionality to elements. - -// -SVG.extend(SVG.Element, { - // Get all siblings, including myself - siblings: function() { - return this.parent().children() - } - // Get the curent position siblings -, position: function() { - return this.parent().index(this) - } - // Get the next element (will return null if there is none) -, next: function() { - return this.siblings()[this.position() + 1] - } - // Get the next element (will return null if there is none) -, previous: function() { - return this.siblings()[this.position() - 1] - } - // Send given element one step forward -, forward: function() { - var i = this.position() + 1 - , p = this.parent() - - // move node one step forward - p.removeElement(this).add(this, i) - - // make sure defs node is always at the top - if (p instanceof SVG.Doc) - p.node.appendChild(p.defs().node) - - return this - } - // Send given element one step backward -, backward: function() { - var i = this.position() - - if (i > 0) - this.parent().removeElement(this).add(this, i - 1) - - return this - } - // Send given element all the way to the front -, front: function() { - var p = this.parent() - - // Move node forward - p.node.appendChild(this.node) - - // Make sure defs node is always at the top - if (p instanceof SVG.Doc) - p.node.appendChild(p.defs().node) - - return this - } - // Send given element all the way to the back -, back: function() { - if (this.position() > 0) - this.parent().removeElement(this).add(this, 0) - - return this - } - // Inserts a given element before the targeted element -, before: function(element) { - element.remove() - - var i = this.position() - - this.parent().add(element, i) - - return this - } - // Insters a given element after the targeted element -, after: function(element) { - element.remove() - - var i = this.position() - - this.parent().add(element, i + 1) - - return this - } - -}) -SVG.Mask = SVG.invent({ - // Initialize node - create: function() { - this.constructor.call(this, SVG.create('mask')) - - // keep references to masked elements - this.targets = [] - } - - // Inherit from -, inherit: SVG.Container - - // Add class methods -, extend: { - // Unmask all masked elements and remove itself - remove: function() { - // unmask all targets - for (var i = this.targets.length - 1; i >= 0; i--) - if (this.targets[i]) - this.targets[i].unmask() - this.targets = [] - - // remove mask from parent - this.parent().removeElement(this) - - return this - } - } - - // Add parent method -, construct: { - // Create masking element - mask: function() { - return this.defs().put(new SVG.Mask) - } - } -}) - - -SVG.extend(SVG.Element, { - // Distribute mask to svg element - maskWith: function(element) { - // use given mask or create a new one - this.masker = element instanceof SVG.Mask ? element : this.parent().mask().add(element) - - // store reverence on self in mask - this.masker.targets.push(this) - - // apply mask - return this.attr('mask', 'url("#' + this.masker.attr('id') + '")') - } - // Unmask element -, unmask: function() { - delete this.masker - return this.attr('mask', null) - } - -}) - -SVG.ClipPath = SVG.invent({ - // Initialize node - create: function() { - this.constructor.call(this, SVG.create('clipPath')) - - // keep references to clipped elements - this.targets = [] - } - - // Inherit from -, inherit: SVG.Container - - // Add class methods -, extend: { - // Unclip all clipped elements and remove itself - remove: function() { - // unclip all targets - for (var i = this.targets.length - 1; i >= 0; i--) - if (this.targets[i]) - this.targets[i].unclip() - this.targets = [] - - // remove clipPath from parent - this.parent().removeElement(this) - - return this - } - } - - // Add parent method -, construct: { - // Create clipping element - clip: function() { - return this.defs().put(new SVG.ClipPath) - } - } -}) - -// -SVG.extend(SVG.Element, { - // Distribute clipPath to svg element - clipWith: function(element) { - // use given clip or create a new one - this.clipper = element instanceof SVG.ClipPath ? element : this.parent().clip().add(element) - - // store reverence on self in mask - this.clipper.targets.push(this) - - // apply mask - return this.attr('clip-path', 'url("#' + this.clipper.attr('id') + '")') - } - // Unclip element -, unclip: function() { - delete this.clipper - return this.attr('clip-path', null) - } - -}) -SVG.Gradient = SVG.invent({ - // Initialize node - create: function(type) { - this.constructor.call(this, SVG.create(type + 'Gradient')) - - // store type - this.type = type - } - - // Inherit from -, inherit: SVG.Container - - // Add class methods -, extend: { - // Add a color stop - at: function(offset, color, opacity) { - return this.put(new SVG.Stop).update(offset, color, opacity) - } - // Update gradient - , update: function(block) { - // remove all stops - this.clear() - - // invoke passed block - if (typeof block == 'function') - block.call(this, this) - - return this - } - // Return the fill id - , fill: function() { - return 'url(#' + this.id() + ')' - } - // Alias string convertion to fill - , toString: function() { - return this.fill() - } - // custom attr to handle transform - , attr: function(a, b, c) { - if(a == 'transform') a = 'gradientTransform' - return SVG.Container.prototype.attr.call(this, a, b, c) - } - } - - // Add parent method -, construct: { - // Create gradient element in defs - gradient: function(type, block) { - return this.defs().gradient(type, block) - } - } -}) - -// Add animatable methods to both gradient and fx module -SVG.extend(SVG.Gradient, SVG.FX, { - // From position - from: function(x, y) { - return (this._target || this).type == 'radial' ? - this.attr({ fx: new SVG.Number(x), fy: new SVG.Number(y) }) : - this.attr({ x1: new SVG.Number(x), y1: new SVG.Number(y) }) - } - // To position -, to: function(x, y) { - return (this._target || this).type == 'radial' ? - this.attr({ cx: new SVG.Number(x), cy: new SVG.Number(y) }) : - this.attr({ x2: new SVG.Number(x), y2: new SVG.Number(y) }) - } -}) - -// Base gradient generation -SVG.extend(SVG.Defs, { - // define gradient - gradient: function(type, block) { - return this.put(new SVG.Gradient(type)).update(block) - } - -}) - -SVG.Stop = SVG.invent({ - // Initialize node - create: 'stop' - - // Inherit from -, inherit: SVG.Element - - // Add class methods -, extend: { - // add color stops - update: function(o) { - if (typeof o == 'number' || o instanceof SVG.Number) { - o = { - offset: arguments[0] - , color: arguments[1] - , opacity: arguments[2] - } - } - - // set attributes - if (o.opacity != null) this.attr('stop-opacity', o.opacity) - if (o.color != null) this.attr('stop-color', o.color) - if (o.offset != null) this.attr('offset', new SVG.Number(o.offset)) - - return this - } - } - -}) - -SVG.Pattern = SVG.invent({ - // Initialize node - create: 'pattern' - - // Inherit from -, inherit: SVG.Container - - // Add class methods -, extend: { - // Return the fill id - fill: function() { - return 'url(#' + this.id() + ')' - } - // Update pattern by rebuilding - , update: function(block) { - // remove content - this.clear() - - // invoke passed block - if (typeof block == 'function') - block.call(this, this) - - return this - } - // Alias string convertion to fill - , toString: function() { - return this.fill() - } - // custom attr to handle transform - , attr: function(a, b, c) { - if(a == 'transform') a = 'patternTransform' - return SVG.Container.prototype.attr.call(this, a, b, c) - } - - } - - // Add parent method -, construct: { - // Create pattern element in defs - pattern: function(width, height, block) { - return this.defs().pattern(width, height, block) - } - } -}) - -SVG.extend(SVG.Defs, { - // Define gradient - pattern: function(width, height, block) { - return this.put(new SVG.Pattern).update(block).attr({ - x: 0 - , y: 0 - , width: width - , height: height - , patternUnits: 'userSpaceOnUse' - }) - } - -}) -SVG.Doc = SVG.invent({ - // Initialize node - create: function(element) { - if (element) { - // ensure the presence of a dom element - element = typeof element == 'string' ? - document.getElementById(element) : - element - - // If the target is an svg element, use that element as the main wrapper. - // This allows svg.js to work with svg documents as well. - if (element.nodeName == 'svg') { - this.constructor.call(this, element) - } else { - this.constructor.call(this, SVG.create('svg')) - element.appendChild(this.node) - this.size('100%', '100%') - } - - // set svg element attributes and ensure defs node - this.namespace().defs() - } - } - - // Inherit from -, inherit: SVG.Container - - // Add class methods -, extend: { - // Add namespaces - namespace: function() { - return this - .attr({ xmlns: SVG.ns, version: '1.1' }) - .attr('xmlns:xlink', SVG.xlink, SVG.xmlns) - .attr('xmlns:svgjs', SVG.svgjs, SVG.xmlns) - } - // Creates and returns defs element - , defs: function() { - if (!this._defs) { - var defs - - // Find or create a defs element in this instance - if (defs = this.node.getElementsByTagName('defs')[0]) - this._defs = SVG.adopt(defs) - else - this._defs = new SVG.Defs - - // Make sure the defs node is at the end of the stack - this.node.appendChild(this._defs.node) - } - - return this._defs - } - // custom parent method - , parent: function() { - return this.node.parentNode.nodeName == '#document' ? null : this.node.parentNode - } - // Fix for possible sub-pixel offset. See: - // https://bugzilla.mozilla.org/show_bug.cgi?id=608812 - , spof: function(spof) { - var pos = this.node.getScreenCTM() - - if (pos) - this - .style('left', (-pos.e % 1) + 'px') - .style('top', (-pos.f % 1) + 'px') - - return this - } - - // Removes the doc from the DOM - , remove: function() { - if(this.parent()) { - this.parent().removeChild(this.node); - } - - return this; - } - } - -}) - -SVG.Shape = SVG.invent({ - // Initialize node - create: function(element) { - this.constructor.call(this, element) - } - - // Inherit from -, inherit: SVG.Element - -}) - -SVG.Bare = SVG.invent({ - // Initialize - create: function(element, inherit) { - // construct element - this.constructor.call(this, SVG.create(element)) - - // inherit custom methods - if (inherit) - for (var method in inherit.prototype) - if (typeof inherit.prototype[method] === 'function') - this[method] = inherit.prototype[method] - } - - // Inherit from -, inherit: SVG.Element - - // Add methods -, extend: { - // Insert some plain text - words: function(text) { - // remove contents - while (this.node.hasChildNodes()) - this.node.removeChild(this.node.lastChild) - - // create text node - this.node.appendChild(document.createTextNode(text)) - - return this - } - } -}) - - -SVG.extend(SVG.Parent, { - // Create an element that is not described by SVG.js - element: function(element, inherit) { - return this.put(new SVG.Bare(element, inherit)) - } - // Add symbol element -, symbol: function() { - return this.defs().element('symbol', SVG.Container) - } - -}) -SVG.Use = SVG.invent({ - // Initialize node - create: 'use' - - // Inherit from -, inherit: SVG.Shape - - // Add class methods -, extend: { - // Use element as a reference - element: function(element, file) { - // Set lined element - return this.attr('href', (file || '') + '#' + element, SVG.xlink) - } - } - - // Add parent method -, construct: { - // Create a use element - use: function(element, file) { - return this.put(new SVG.Use).element(element, file) - } - } -}) -SVG.Rect = SVG.invent({ - // Initialize node - create: 'rect' - - // Inherit from -, inherit: SVG.Shape - - // Add parent method -, construct: { - // Create a rect element - rect: function(width, height) { - return this.put(new SVG.Rect()).size(width, height) - } - } -}) -SVG.Circle = SVG.invent({ - // Initialize node - create: 'circle' - - // Inherit from -, inherit: SVG.Shape - - // Add parent method -, construct: { - // Create circle element, based on ellipse - circle: function(size) { - return this.put(new SVG.Circle).rx(new SVG.Number(size).divide(2)).move(0, 0) - } - } -}) - -SVG.extend(SVG.Circle, SVG.FX, { - // Radius x value - rx: function(rx) { - return this.attr('r', rx) - } - // Alias radius x value -, ry: function(ry) { - return this.rx(ry) - } -}) - -SVG.Ellipse = SVG.invent({ - // Initialize node - create: 'ellipse' - - // Inherit from -, inherit: SVG.Shape - - // Add parent method -, construct: { - // Create an ellipse - ellipse: function(width, height) { - return this.put(new SVG.Ellipse).size(width, height).move(0, 0) - } - } -}) - -SVG.extend(SVG.Ellipse, SVG.Rect, SVG.FX, { - // Radius x value - rx: function(rx) { - return this.attr('rx', rx) - } - // Radius y value -, ry: function(ry) { - return this.attr('ry', ry) - } -}) - -// Add common method -SVG.extend(SVG.Circle, SVG.Ellipse, { - // Move over x-axis - x: function(x) { - return x == null ? this.cx() - this.rx() : this.cx(x + this.rx()) - } - // Move over y-axis - , y: function(y) { - return y == null ? this.cy() - this.ry() : this.cy(y + this.ry()) - } - // Move by center over x-axis - , cx: function(x) { - return x == null ? this.attr('cx') : this.attr('cx', x) - } - // Move by center over y-axis - , cy: function(y) { - return y == null ? this.attr('cy') : this.attr('cy', y) - } - // Set width of element - , width: function(width) { - return width == null ? this.rx() * 2 : this.rx(new SVG.Number(width).divide(2)) - } - // Set height of element - , height: function(height) { - return height == null ? this.ry() * 2 : this.ry(new SVG.Number(height).divide(2)) - } - // Custom size function - , size: function(width, height) { - var p = proportionalSize(this, width, height) - - return this - .rx(new SVG.Number(p.width).divide(2)) - .ry(new SVG.Number(p.height).divide(2)) - } -}) -SVG.Line = SVG.invent({ - // Initialize node - create: 'line' - - // Inherit from -, inherit: SVG.Shape - - // Add class methods -, extend: { - // Get array - array: function() { - return new SVG.PointArray([ - [ this.attr('x1'), this.attr('y1') ] - , [ this.attr('x2'), this.attr('y2') ] - ]) - } - // Overwrite native plot() method - , plot: function(x1, y1, x2, y2) { - if (typeof y1 !== 'undefined') - x1 = { x1: x1, y1: y1, x2: x2, y2: y2 } - else - x1 = new SVG.PointArray(x1).toLine() - - return this.attr(x1) - } - // Move by left top corner - , move: function(x, y) { - return this.attr(this.array().move(x, y).toLine()) - } - // Set element size to given width and height - , size: function(width, height) { - var p = proportionalSize(this, width, height) - - return this.attr(this.array().size(p.width, p.height).toLine()) - } - } - - // Add parent method -, construct: { - // Create a line element - line: function(x1, y1, x2, y2) { - return this.put(new SVG.Line).plot(x1, y1, x2, y2) - } - } -}) - -SVG.Polyline = SVG.invent({ - // Initialize node - create: 'polyline' - - // Inherit from -, inherit: SVG.Shape - - // Add parent method -, construct: { - // Create a wrapped polyline element - polyline: function(p) { - return this.put(new SVG.Polyline).plot(p) - } - } -}) - -SVG.Polygon = SVG.invent({ - // Initialize node - create: 'polygon' - - // Inherit from -, inherit: SVG.Shape - - // Add parent method -, construct: { - // Create a wrapped polygon element - polygon: function(p) { - return this.put(new SVG.Polygon).plot(p) - } - } -}) - -// Add polygon-specific functions -SVG.extend(SVG.Polyline, SVG.Polygon, { - // Get array - array: function() { - return this._array || (this._array = new SVG.PointArray(this.attr('points'))) - } - // Plot new path -, plot: function(p) { - return this.attr('points', (this._array = new SVG.PointArray(p))) - } - // Move by left top corner -, move: function(x, y) { - return this.attr('points', this.array().move(x, y)) - } - // Set element size to given width and height -, size: function(width, height) { - var p = proportionalSize(this, width, height) - - return this.attr('points', this.array().size(p.width, p.height)) - } - -}) -// unify all point to point elements -SVG.extend(SVG.Line, SVG.Polyline, SVG.Polygon, { - // Define morphable array - morphArray: SVG.PointArray - // Move by left top corner over x-axis -, x: function(x) { - return x == null ? this.bbox().x : this.move(x, this.bbox().y) - } - // Move by left top corner over y-axis -, y: function(y) { - return y == null ? this.bbox().y : this.move(this.bbox().x, y) - } - // Set width of element -, width: function(width) { - var b = this.bbox() - - return width == null ? b.width : this.size(width, b.height) - } - // Set height of element -, height: function(height) { - var b = this.bbox() - - return height == null ? b.height : this.size(b.width, height) - } -}) -SVG.Path = SVG.invent({ - // Initialize node - create: 'path' - - // Inherit from -, inherit: SVG.Shape - - // Add class methods -, extend: { - // Define morphable array - morphArray: SVG.PathArray - // Get array - , array: function() { - return this._array || (this._array = new SVG.PathArray(this.attr('d'))) - } - // Plot new poly points - , plot: function(p) { - return this.attr('d', (this._array = new SVG.PathArray(p))) - } - // Move by left top corner - , move: function(x, y) { - return this.attr('d', this.array().move(x, y)) - } - // Move by left top corner over x-axis - , x: function(x) { - return x == null ? this.bbox().x : this.move(x, this.bbox().y) - } - // Move by left top corner over y-axis - , y: function(y) { - return y == null ? this.bbox().y : this.move(this.bbox().x, y) - } - // Set element size to given width and height - , size: function(width, height) { - var p = proportionalSize(this, width, height) - - return this.attr('d', this.array().size(p.width, p.height)) - } - // Set width of element - , width: function(width) { - return width == null ? this.bbox().width : this.size(width, this.bbox().height) - } - // Set height of element - , height: function(height) { - return height == null ? this.bbox().height : this.size(this.bbox().width, height) - } - - } - - // Add parent method -, construct: { - // Create a wrapped path element - path: function(d) { - return this.put(new SVG.Path).plot(d) - } - } -}) -SVG.Image = SVG.invent({ - // Initialize node - create: 'image' - - // Inherit from -, inherit: SVG.Shape - - // Add class methods -, extend: { - // (re)load image - load: function(url) { - if (!url) return this - - var self = this - , img = document.createElement('img') - - // preload image - img.onload = function() { - var p = self.parent(SVG.Pattern) - - if(p === null) return - - // ensure image size - if (self.width() == 0 && self.height() == 0) - self.size(img.width, img.height) - - // ensure pattern size if not set - if (p && p.width() == 0 && p.height() == 0) - p.size(self.width(), self.height()) - - // callback - if (typeof self._loaded === 'function') - self._loaded.call(self, { - width: img.width - , height: img.height - , ratio: img.width / img.height - , url: url - }) - } - - img.onerror = function(e){ - if (typeof self._error === 'function'){ - self._error.call(self, e) - } - } - - return this.attr('href', (img.src = this.src = url), SVG.xlink) - } - // Add loaded callback - , loaded: function(loaded) { - this._loaded = loaded - return this - } - - , error: function(error) { - this._error = error - return this - } - } - - // Add parent method -, construct: { - // create image element, load image and set its size - image: function(source, width, height) { - return this.put(new SVG.Image).load(source).size(width || 0, height || width || 0) - } - } - -}) -SVG.Text = SVG.invent({ - // Initialize node - create: function() { - this.constructor.call(this, SVG.create('text')) - - this.dom.leading = new SVG.Number(1.3) // store leading value for rebuilding - this._rebuild = true // enable automatic updating of dy values - this._build = false // disable build mode for adding multiple lines - - // set default font - this.attr('font-family', SVG.defaults.attrs['font-family']) - } - - // Inherit from -, inherit: SVG.Shape - - // Add class methods -, extend: { - // Move over x-axis - x: function(x) { - // act as getter - if (x == null) - return this.attr('x') - - // move lines as well if no textPath is present - if (!this.textPath) - this.lines().each(function() { if (this.dom.newLined) this.x(x) }) - - return this.attr('x', x) - } - // Move over y-axis - , y: function(y) { - var oy = this.attr('y') - , o = typeof oy === 'number' ? oy - this.bbox().y : 0 - - // act as getter - if (y == null) - return typeof oy === 'number' ? oy - o : oy - - return this.attr('y', typeof y === 'number' ? y + o : y) - } - // Move center over x-axis - , cx: function(x) { - return x == null ? this.bbox().cx : this.x(x - this.bbox().width / 2) - } - // Move center over y-axis - , cy: function(y) { - return y == null ? this.bbox().cy : this.y(y - this.bbox().height / 2) - } - // Set the text content - , text: function(text) { - // act as getter - if (typeof text === 'undefined'){ - var text = '' - var children = this.node.childNodes - for(var i = 0, len = children.length; i < len; ++i){ - - // add newline if its not the first child and newLined is set to true - if(i != 0 && children[i].nodeType != 3 && SVG.adopt(children[i]).dom.newLined == true){ - text += '\n' - } - - // add content of this node - text += children[i].textContent - } - - return text - } - - // remove existing content - this.clear().build(true) - - if (typeof text === 'function') { - // call block - text.call(this, this) - - } else { - // store text and make sure text is not blank - text = text.split('\n') - - // build new lines - for (var i = 0, il = text.length; i < il; i++) - this.tspan(text[i]).newLine() - } - - // disable build mode and rebuild lines - return this.build(false).rebuild() - } - // Set font size - , size: function(size) { - return this.attr('font-size', size).rebuild() - } - // Set / get leading - , leading: function(value) { - // act as getter - if (value == null) - return this.dom.leading - - // act as setter - this.dom.leading = new SVG.Number(value) - - return this.rebuild() - } - // Get all the first level lines - , lines: function() { - var node = (this.textPath && this.textPath() || this).node - - // filter tspans and map them to SVG.js instances - var lines = SVG.utils.map(SVG.utils.filterSVGElements(node.childNodes), function(el){ - return SVG.adopt(el) - }) - - // return an instance of SVG.set - return new SVG.Set(lines) - } - // Rebuild appearance type - , rebuild: function(rebuild) { - // store new rebuild flag if given - if (typeof rebuild == 'boolean') - this._rebuild = rebuild - - // define position of all lines - if (this._rebuild) { - var self = this - , blankLineOffset = 0 - , dy = this.dom.leading * new SVG.Number(this.attr('font-size')) - - this.lines().each(function() { - if (this.dom.newLined) { - if (!this.textPath) - this.attr('x', self.attr('x')) - - if(this.text() == '\n') { - blankLineOffset += dy - }else{ - this.attr('dy', dy + blankLineOffset) - blankLineOffset = 0 - } - } - }) - - this.fire('rebuild') - } - - return this - } - // Enable / disable build mode - , build: function(build) { - this._build = !!build - return this - } - // overwrite method from parent to set data properly - , setData: function(o){ - this.dom = o - this.dom.leading = new SVG.Number(o.leading || 1.3) - return this - } - } - - // Add parent method -, construct: { - // Create text element - text: function(text) { - return this.put(new SVG.Text).text(text) - } - // Create plain text element - , plain: function(text) { - return this.put(new SVG.Text).plain(text) - } - } - -}) - -SVG.Tspan = SVG.invent({ - // Initialize node - create: 'tspan' - - // Inherit from -, inherit: SVG.Shape - - // Add class methods -, extend: { - // Set text content - text: function(text) { - if(text == null) return this.node.textContent + (this.dom.newLined ? '\n' : '') - - typeof text === 'function' ? text.call(this, this) : this.plain(text) - - return this - } - // Shortcut dx - , dx: function(dx) { - return this.attr('dx', dx) - } - // Shortcut dy - , dy: function(dy) { - return this.attr('dy', dy) - } - // Create new line - , newLine: function() { - // fetch text parent - var t = this.parent(SVG.Text) - - // mark new line - this.dom.newLined = true - - // apply new hy¡n - return this.dy(t.dom.leading * t.attr('font-size')).attr('x', t.x()) - } - } - -}) - -SVG.extend(SVG.Text, SVG.Tspan, { - // Create plain text node - plain: function(text) { - // clear if build mode is disabled - if (this._build === false) - this.clear() - - // create text node - this.node.appendChild(document.createTextNode(text)) - - return this - } - // Create a tspan -, tspan: function(text) { - var node = (this.textPath && this.textPath() || this).node - , tspan = new SVG.Tspan - - // clear if build mode is disabled - if (this._build === false) - this.clear() - - // add new tspan - node.appendChild(tspan.node) - - return tspan.text(text) - } - // Clear all lines -, clear: function() { - var node = (this.textPath && this.textPath() || this).node - - // remove existing child nodes - while (node.hasChildNodes()) - node.removeChild(node.lastChild) - - return this - } - // Get length of text element -, length: function() { - return this.node.getComputedTextLength() - } -}) - -SVG.TextPath = SVG.invent({ - // Initialize node - create: 'textPath' - - // Inherit from -, inherit: SVG.Parent - - // Define parent class -, parent: SVG.Text - - // Add parent method -, construct: { - // Create path for text to run on - path: function(d) { - // create textPath element - var path = new SVG.TextPath - , track = this.doc().defs().path(d) - - // move lines to textpath - while (this.node.hasChildNodes()) - path.node.appendChild(this.node.firstChild) - - // add textPath element as child node - this.node.appendChild(path.node) - - // link textPath to path and add content - path.attr('href', '#' + track, SVG.xlink) - - return this - } - // Plot path if any - , plot: function(d) { - var track = this.track() - - if (track) - track.plot(d) - - return this - } - // Get the path track element - , track: function() { - var path = this.textPath() - - if (path) - return path.reference('href') - } - // Get the textPath child - , textPath: function() { - if (this.node.firstChild && this.node.firstChild.nodeName == 'textPath') - return SVG.adopt(this.node.firstChild) - } - } -}) -SVG.Nested = SVG.invent({ - // Initialize node - create: function() { - this.constructor.call(this, SVG.create('svg')) - - this.style('overflow', 'visible') - } - - // Inherit from -, inherit: SVG.Container - - // Add parent method -, construct: { - // Create nested svg document - nested: function() { - return this.put(new SVG.Nested) - } - } -}) -SVG.A = SVG.invent({ - // Initialize node - create: 'a' - - // Inherit from -, inherit: SVG.Container - - // Add class methods -, extend: { - // Link url - to: function(url) { - return this.attr('href', url, SVG.xlink) - } - // Link show attribute - , show: function(target) { - return this.attr('show', target, SVG.xlink) - } - // Link target attribute - , target: function(target) { - return this.attr('target', target) - } - } - - // Add parent method -, construct: { - // Create a hyperlink element - link: function(url) { - return this.put(new SVG.A).to(url) - } - } -}) - -SVG.extend(SVG.Element, { - // Create a hyperlink element - linkTo: function(url) { - var link = new SVG.A - - if (typeof url == 'function') - url.call(link, link) - else - link.to(url) - - return this.parent().put(link).put(this) - } - -}) -SVG.Marker = SVG.invent({ - // Initialize node - create: 'marker' - - // Inherit from -, inherit: SVG.Container - - // Add class methods -, extend: { - // Set width of element - width: function(width) { - return this.attr('markerWidth', width) - } - // Set height of element - , height: function(height) { - return this.attr('markerHeight', height) - } - // Set marker refX and refY - , ref: function(x, y) { - return this.attr('refX', x).attr('refY', y) - } - // Update marker - , update: function(block) { - // remove all content - this.clear() - - // invoke passed block - if (typeof block == 'function') - block.call(this, this) - - return this - } - // Return the fill id - , toString: function() { - return 'url(#' + this.id() + ')' - } - } - - // Add parent method -, construct: { - marker: function(width, height, block) { - // Create marker element in defs - return this.defs().marker(width, height, block) - } - } - -}) - -SVG.extend(SVG.Defs, { - // Create marker - marker: function(width, height, block) { - // Set default viewbox to match the width and height, set ref to cx and cy and set orient to auto - return this.put(new SVG.Marker) - .size(width, height) - .ref(width / 2, height / 2) - .viewbox(0, 0, width, height) - .attr('orient', 'auto') - .update(block) - } - -}) - -SVG.extend(SVG.Line, SVG.Polyline, SVG.Polygon, SVG.Path, { - // Create and attach markers - marker: function(marker, width, height, block) { - var attr = ['marker'] - - // Build attribute name - if (marker != 'all') attr.push(marker) - attr = attr.join('-') - - // Set marker attribute - marker = arguments[1] instanceof SVG.Marker ? - arguments[1] : - this.doc().marker(width, height, block) - - return this.attr(attr, marker) - } - -}) -// Define list of available attributes for stroke and fill -var sugar = { - stroke: ['color', 'width', 'opacity', 'linecap', 'linejoin', 'miterlimit', 'dasharray', 'dashoffset'] -, fill: ['color', 'opacity', 'rule'] -, prefix: function(t, a) { - return a == 'color' ? t : t + '-' + a - } -} - -// Add sugar for fill and stroke -;['fill', 'stroke'].forEach(function(m) { - var i, extension = {} - - extension[m] = function(o) { - if (typeof o == 'undefined') - return this - if (typeof o == 'string' || SVG.Color.isRgb(o) || (o && typeof o.fill === 'function')) - this.attr(m, o) - - else - // set all attributes from sugar.fill and sugar.stroke list - for (i = sugar[m].length - 1; i >= 0; i--) - if (o[sugar[m][i]] != null) - this.attr(sugar.prefix(m, sugar[m][i]), o[sugar[m][i]]) - - return this - } - - SVG.extend(SVG.Element, SVG.FX, extension) - -}) - -SVG.extend(SVG.Element, SVG.FX, { - // Map rotation to transform - rotate: function(d, cx, cy) { - return this.transform({ rotation: d, cx: cx, cy: cy }) - } - // Map skew to transform -, skew: function(x, y, cx, cy) { - return arguments.length == 1 || arguments.length == 3 ? - this.transform({ skew: x, cx: y, cy: cx }) : - this.transform({ skewX: x, skewY: y, cx: cx, cy: cy }) - } - // Map scale to transform -, scale: function(x, y, cx, cy) { - return arguments.length == 1 || arguments.length == 3 ? - this.transform({ scale: x, cx: y, cy: cx }) : - this.transform({ scaleX: x, scaleY: y, cx: cx, cy: cy }) - } - // Map translate to transform -, translate: function(x, y) { - return this.transform({ x: x, y: y }) - } - // Map flip to transform -, flip: function(a, o) { - return this.transform({ flip: a, offset: o }) - } - // Map matrix to transform -, matrix: function(m) { - return this.attr('transform', new SVG.Matrix(m)) - } - // Opacity -, opacity: function(value) { - return this.attr('opacity', value) - } - // Relative move over x axis -, dx: function(x) { - return this.x((this instanceof SVG.FX ? 0 : this.x()) + x, true) - } - // Relative move over y axis -, dy: function(y) { - return this.y((this instanceof SVG.FX ? 0 : this.y()) + y, true) - } - // Relative move over x and y axes -, dmove: function(x, y) { - return this.dx(x).dy(y) - } -}) - -SVG.extend(SVG.Rect, SVG.Ellipse, SVG.Circle, SVG.Gradient, SVG.FX, { - // Add x and y radius - radius: function(x, y) { - var type = (this._target || this).type; - return type == 'radial' || type == 'circle' ? - this.attr('r', new SVG.Number(x)) : - this.rx(x).ry(y == null ? x : y) - } -}) - -SVG.extend(SVG.Path, { - // Get path length - length: function() { - return this.node.getTotalLength() - } - // Get point at length -, pointAt: function(length) { - return this.node.getPointAtLength(length) - } -}) - -SVG.extend(SVG.Parent, SVG.Text, SVG.FX, { - // Set font - font: function(o) { - for (var k in o) - k == 'leading' ? - this.leading(o[k]) : - k == 'anchor' ? - this.attr('text-anchor', o[k]) : - k == 'size' || k == 'family' || k == 'weight' || k == 'stretch' || k == 'variant' || k == 'style' ? - this.attr('font-'+ k, o[k]) : - this.attr(k, o[k]) - - return this - } -}) - -SVG.Set = SVG.invent({ - // Initialize - create: function(members) { - // Set initial state - Array.isArray(members) ? this.members = members : this.clear() - } - - // Add class methods -, extend: { - // Add element to set - add: function() { - var i, il, elements = [].slice.call(arguments) - - for (i = 0, il = elements.length; i < il; i++) - this.members.push(elements[i]) - - return this - } - // Remove element from set - , remove: function(element) { - var i = this.index(element) - - // remove given child - if (i > -1) - this.members.splice(i, 1) - - return this - } - // Iterate over all members - , each: function(block) { - for (var i = 0, il = this.members.length; i < il; i++) - block.apply(this.members[i], [i, this.members]) - - return this - } - // Restore to defaults - , clear: function() { - // initialize store - this.members = [] - - return this - } - // Get the length of a set - , length: function() { - return this.members.length - } - // Checks if a given element is present in set - , has: function(element) { - return this.index(element) >= 0 - } - // retuns index of given element in set - , index: function(element) { - return this.members.indexOf(element) - } - // Get member at given index - , get: function(i) { - return this.members[i] - } - // Get first member - , first: function() { - return this.get(0) - } - // Get last member - , last: function() { - return this.get(this.members.length - 1) - } - // Default value - , valueOf: function() { - return this.members - } - // Get the bounding box of all members included or empty box if set has no items - , bbox: function(){ - var box = new SVG.BBox() - - // return an empty box of there are no members - if (this.members.length == 0) - return box - - // get the first rbox and update the target bbox - var rbox = this.members[0].rbox() - box.x = rbox.x - box.y = rbox.y - box.width = rbox.width - box.height = rbox.height - - this.each(function() { - // user rbox for correct position and visual representation - box = box.merge(this.rbox()) - }) - - return box - } - } - - // Add parent method -, construct: { - // Create a new set - set: function(members) { - return new SVG.Set(members) - } - } -}) - -SVG.FX.Set = SVG.invent({ - // Initialize node - create: function(set) { - // store reference to set - this.set = set - } - -}) - -// Alias methods -SVG.Set.inherit = function() { - var m - , methods = [] - - // gather shape methods - for(var m in SVG.Shape.prototype) - if (typeof SVG.Shape.prototype[m] == 'function' && typeof SVG.Set.prototype[m] != 'function') - methods.push(m) - - // apply shape aliasses - methods.forEach(function(method) { - SVG.Set.prototype[method] = function() { - for (var i = 0, il = this.members.length; i < il; i++) - if (this.members[i] && typeof this.members[i][method] == 'function') - this.members[i][method].apply(this.members[i], arguments) - - return method == 'animate' ? (this.fx || (this.fx = new SVG.FX.Set(this))) : this - } - }) - - // clear methods for the next round - methods = [] - - // gather fx methods - for(var m in SVG.FX.prototype) - if (typeof SVG.FX.prototype[m] == 'function' && typeof SVG.FX.Set.prototype[m] != 'function') - methods.push(m) - - // apply fx aliasses - methods.forEach(function(method) { - SVG.FX.Set.prototype[method] = function() { - for (var i = 0, il = this.set.members.length; i < il; i++) - this.set.members[i].fx[method].apply(this.set.members[i].fx, arguments) - - return this - } - }) -} - - - - -SVG.extend(SVG.Element, { - // Store data values on svg nodes - data: function(a, v, r) { - if (typeof a == 'object') { - for (v in a) - this.data(v, a[v]) - - } else if (arguments.length < 2) { - try { - return JSON.parse(this.attr('data-' + a)) - } catch(e) { - return this.attr('data-' + a) - } - - } else { - this.attr( - 'data-' + a - , v === null ? - null : - r === true || typeof v === 'string' || typeof v === 'number' ? - v : - JSON.stringify(v) - ) - } - - return this - } -}) -SVG.extend(SVG.Element, { - // Remember arbitrary data - remember: function(k, v) { - // remember every item in an object individually - if (typeof arguments[0] == 'object') - for (var v in k) - this.remember(v, k[v]) - - // retrieve memory - else if (arguments.length == 1) - return this.memory()[k] - - // store memory - else - this.memory()[k] = v - - return this - } - - // Erase a given memory -, forget: function() { - if (arguments.length == 0) - this._memory = {} - else - for (var i = arguments.length - 1; i >= 0; i--) - delete this.memory()[arguments[i]] - - return this - } - - // Initialize or return local memory object -, memory: function() { - return this._memory || (this._memory = {}) - } - -}) -// Method for getting an element by id -SVG.get = function(id) { - var node = document.getElementById(idFromReference(id) || id) - return SVG.adopt(node) -} - -// Select elements by query string -SVG.select = function(query, parent) { - return new SVG.Set( - SVG.utils.map((parent || document).querySelectorAll(query), function(node) { - return SVG.adopt(node) - }) - ) -} - -SVG.extend(SVG.Parent, { - // Scoped select method - select: function(query) { - return SVG.select(query, this.node) - } - -}) -function is(el, obj){ - return el instanceof obj -} - -// tests if a given selector matches an element -function matches(el, selector) { - return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector); -} - -// Convert dash-separated-string to camelCase -function camelCase(s) { - return s.toLowerCase().replace(/-(.)/g, function(m, g) { - return g.toUpperCase() - }) -} - -// Capitalize first letter of a string -function capitalize(s) { - return s.charAt(0).toUpperCase() + s.slice(1) -} - -// Ensure to six-based hex -function fullHex(hex) { - return hex.length == 4 ? - [ '#', - hex.substring(1, 2), hex.substring(1, 2) - , hex.substring(2, 3), hex.substring(2, 3) - , hex.substring(3, 4), hex.substring(3, 4) - ].join('') : hex -} - -// Component to hex value -function compToHex(comp) { - var hex = comp.toString(16) - return hex.length == 1 ? '0' + hex : hex -} - -// Calculate proportional width and height values when necessary -function proportionalSize(element, width, height) { - if (width == null || height == null) { - var box = element.bbox() - - if (width == null) - width = box.width / box.height * height - else if (height == null) - height = box.height / box.width * width - } - - return { - width: width - , height: height - } -} - -// Delta transform point -function deltaTransformPoint(matrix, x, y) { - return { - x: x * matrix.a + y * matrix.c + 0 - , y: x * matrix.b + y * matrix.d + 0 - } -} - -// Map matrix array to object -function arrayToMatrix(a) { - return { a: a[0], b: a[1], c: a[2], d: a[3], e: a[4], f: a[5] } -} - -// Parse matrix if required -function parseMatrix(matrix) { - if (!(matrix instanceof SVG.Matrix)) - matrix = new SVG.Matrix(matrix) - - return matrix -} - -// Add centre point to transform object -function ensureCentre(o, target) { - o.cx = o.cx == null ? target.bbox().cx : o.cx - o.cy = o.cy == null ? target.bbox().cy : o.cy -} - -// Convert string to matrix -function stringToMatrix(source) { - // remove matrix wrapper and split to individual numbers - source = source - .replace(SVG.regex.whitespace, '') - .replace(SVG.regex.matrix, '') - .split(SVG.regex.matrixElements) - - // convert string values to floats and convert to a matrix-formatted object - return arrayToMatrix( - SVG.utils.map(source, function(n) { - return parseFloat(n) - }) - ) -} - -// Calculate position according to from and to -function at(o, pos) { - // number recalculation (don't bother converting to SVG.Number for performance reasons) - return typeof o.from == 'number' ? - o.from + (o.to - o.from) * pos : - - // instance recalculation - o instanceof SVG.Color || o instanceof SVG.Number || o instanceof SVG.Matrix ? o.at(pos) : - - // for all other values wait until pos has reached 1 to return the final value - pos < 1 ? o.from : o.to -} - -// PathArray Helpers -function arrayToString(a) { - for (var i = 0, il = a.length, s = ''; i < il; i++) { - s += a[i][0] - - if (a[i][1] != null) { - s += a[i][1] - - if (a[i][2] != null) { - s += ' ' - s += a[i][2] - - if (a[i][3] != null) { - s += ' ' - s += a[i][3] - s += ' ' - s += a[i][4] - - if (a[i][5] != null) { - s += ' ' - s += a[i][5] - s += ' ' - s += a[i][6] - - if (a[i][7] != null) { - s += ' ' - s += a[i][7] - } - } - } - } - } - } - - return s + ' ' -} - -// Deep new id assignment -function assignNewId(node) { - // do the same for SVG child nodes as well - for (var i = node.childNodes.length - 1; i >= 0; i--) - if (node.childNodes[i] instanceof SVGElement) - assignNewId(node.childNodes[i]) - - return SVG.adopt(node).id(SVG.eid(node.nodeName)) -} - -// Add more bounding box properties -function fullBox(b) { - if (b.x == null) { - b.x = 0 - b.y = 0 - b.width = 0 - b.height = 0 - } - - b.w = b.width - b.h = b.height - b.x2 = b.x + b.width - b.y2 = b.y + b.height - b.cx = b.x + b.width / 2 - b.cy = b.y + b.height / 2 - - return b -} - -// Get id from reference string -function idFromReference(url) { - var m = url.toString().match(SVG.regex.reference) - - if (m) return m[1] -} - -// Create matrix array for looping -var abcdef = 'abcdef'.split('') -// Add CustomEvent to IE9 and IE10 -if (typeof CustomEvent !== 'function') { - // Code from: https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent - var CustomEvent = function(event, options) { - options = options || { bubbles: false, cancelable: false, detail: undefined } - var e = document.createEvent('CustomEvent') - e.initCustomEvent(event, options.bubbles, options.cancelable, options.detail) - return e - } - - CustomEvent.prototype = window.Event.prototype - - window.CustomEvent = CustomEvent -} - -// requestAnimationFrame / cancelAnimationFrame Polyfill with fallback based on Paul Irish -(function(w) { - var lastTime = 0 - var vendors = ['moz', 'webkit'] - - for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { - w.requestAnimationFrame = w[vendors[x] + 'RequestAnimationFrame'] - w.cancelAnimationFrame = w[vendors[x] + 'CancelAnimationFrame'] || - w[vendors[x] + 'CancelRequestAnimationFrame'] - } - - w.requestAnimationFrame = w.requestAnimationFrame || - function(callback) { - var currTime = new Date().getTime() - var timeToCall = Math.max(0, 16 - (currTime - lastTime)) - - var id = w.setTimeout(function() { - callback(currTime + timeToCall) - }, timeToCall) - - lastTime = currTime + timeToCall - return id - } - - w.cancelAnimationFrame = w.cancelAnimationFrame || w.clearTimeout; - -}(window)) - -return SVG - -})); \ No newline at end of file diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/libs/svg.min.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/libs/svg.min.js deleted file mode 100644 index 0bfe629d79ebfcd33418e6588cd198ac32146738..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/libs/svg.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! svg.js v2.4.0 MIT*/;!function(t,e){"function"==typeof define&&define.amd?define(function(){return e(t,t.document)}):"object"==typeof exports?module.exports=t.document?e(t,t.document):function(t){return e(t,t.document)}:t.SVG=e(t,t.document)}("undefined"!=typeof window?window:this,function(t,e){function i(t,e){return t instanceof e}function n(t,e){return(t.matches||t.matchesSelector||t.msMatchesSelector||t.mozMatchesSelector||t.webkitMatchesSelector||t.oMatchesSelector).call(t,e)}function s(t){return t.toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()})}function r(t){return t.charAt(0).toUpperCase()+t.slice(1)}function a(t){return 4==t.length?["#",t.substring(1,2),t.substring(1,2),t.substring(2,3),t.substring(2,3),t.substring(3,4),t.substring(3,4)].join(""):t}function o(t){var e=t.toString(16);return 1==e.length?"0"+e:e}function h(t,e,i){if(null==e||null==i){var n=t.bbox();null==e?e=n.width/n.height*i:null==i&&(i=n.height/n.width*e)}return{width:e,height:i}}function u(t,e,i){return{x:e*t.a+i*t.c+0,y:e*t.b+i*t.d+0}}function l(t){return{a:t[0],b:t[1],c:t[2],d:t[3],e:t[4],f:t[5]}}function c(t){return t instanceof g.Matrix||(t=new g.Matrix(t)),t}function f(t,e){t.cx=null==t.cx?e.bbox().cx:t.cx,t.cy=null==t.cy?e.bbox().cy:t.cy}function d(t){return t=t.replace(g.regex.whitespace,"").replace(g.regex.matrix,"").split(g.regex.matrixElements),l(g.utils.map(t,function(t){return parseFloat(t)}))}function p(t){for(var e=0,i=t.length,n="";e<i;e++)n+=t[e][0],null!=t[e][1]&&(n+=t[e][1],null!=t[e][2]&&(n+=" ",n+=t[e][2],null!=t[e][3]&&(n+=" ",n+=t[e][3],n+=" ",n+=t[e][4],null!=t[e][5]&&(n+=" ",n+=t[e][5],n+=" ",n+=t[e][6],null!=t[e][7]&&(n+=" ",n+=t[e][7])))));return n+" "}function m(t){for(var e=t.childNodes.length-1;e>=0;e--)t.childNodes[e]instanceof SVGElement&&m(t.childNodes[e]);return g.adopt(t).id(g.eid(t.nodeName))}function x(t){return null==t.x&&(t.x=0,t.y=0,t.width=0,t.height=0),t.w=t.width,t.h=t.height,t.x2=t.x+t.width,t.y2=t.y+t.height,t.cx=t.x+t.width/2,t.cy=t.y+t.height/2,t}function v(t){var e=t.toString().match(g.regex.reference);if(e)return e[1]}var g=this.SVG=function(t){if(g.supported)return t=new g.Doc(t),g.parser.draw||g.prepare(),t};if(g.ns="http://www.w3.org/2000/svg",g.xmlns="http://www.w3.org/2000/xmlns/",g.xlink="http://www.w3.org/1999/xlink",g.svgjs="http://svgjs.com/svgjs",g.supported=function(){return!!e.createElementNS&&!!e.createElementNS(g.ns,"svg").createSVGRect}(),!g.supported)return!1;g.did=1e3,g.eid=function(t){return"Svgjs"+r(t)+g.did++},g.create=function(t){var i=e.createElementNS(this.ns,t);return i.setAttribute("id",this.eid(t)),i},g.extend=function(){var t,e,i,n;for(t=[].slice.call(arguments),e=t.pop(),n=t.length-1;n>=0;n--)if(t[n])for(i in e)t[n].prototype[i]=e[i];g.Set&&g.Set.inherit&&g.Set.inherit()},g.invent=function(t){var e="function"==typeof t.create?t.create:function(){this.constructor.call(this,g.create(t.create))};return t.inherit&&(e.prototype=new t.inherit),t.extend&&g.extend(e,t.extend),t.construct&&g.extend(t.parent||g.Container,t.construct),e},g.adopt=function(t){if(!t)return null;if(t.instance)return t.instance;var e;return e="svg"==t.nodeName?t.parentNode instanceof SVGElement?new g.Nested:new g.Doc:"linearGradient"==t.nodeName?new g.Gradient("linear"):"radialGradient"==t.nodeName?new g.Gradient("radial"):g[r(t.nodeName)]?new(g[r(t.nodeName)]):new g.Element(t),e.type=t.nodeName,e.node=t,t.instance=e,e instanceof g.Doc&&e.namespace().defs(),e.setData(JSON.parse(t.getAttribute("svgjs:data"))||{}),e},g.prepare=function(){var t=e.getElementsByTagName("body")[0],i=(t?new g.Doc(t):new g.Doc(e.documentElement).nested()).size(2,0);g.parser={body:t||e.documentElement,draw:i.style("opacity:0;position:fixed;left:100%;top:100%;overflow:hidden"),poly:i.polyline().node,path:i.path().node,native:g.create("svg")}},g.parser={native:g.create("svg")},e.addEventListener("DOMContentLoaded",function(){g.parser.draw||g.prepare()},!1),g.regex={numberAndUnit:/^([+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?)([a-z%]*)$/i,hex:/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,rgb:/rgb\((\d+),(\d+),(\d+)\)/,reference:/#([a-z0-9\-_]+)/i,matrix:/matrix\(|\)/g,matrixElements:/,*\s+|,/,whitespace:/\s/g,isHex:/^#[a-f0-9]{3,6}$/i,isRgb:/^rgb\(/,isCss:/[^:]+:[^;]+;?/,isBlank:/^(\s+)?$/,isNumber:/^[+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,isPercent:/^-?[\d\.]+%$/,isImage:/\.(jpg|jpeg|png|gif|svg)(\?[^=]+.*)?/i,negExp:/e\-/gi,comma:/,/g,hyphen:/\-/g,pathLetters:/[MLHVCSQTAZ]/gi,isPathLetter:/[MLHVCSQTAZ]/i,whitespaces:/\s+/,X:/X/g},g.utils={map:function(t,e){var i,n=t.length,s=[];for(i=0;i<n;i++)s.push(e(t[i]));return s},filter:function(t,e){var i,n=t.length,s=[];for(i=0;i<n;i++)e(t[i])&&s.push(t[i]);return s},radians:function(t){return t%360*Math.PI/180},degrees:function(t){return 180*t/Math.PI%360},filterSVGElements:function(t){return this.filter(t,function(t){return t instanceof SVGElement})}},g.defaults={attrs:{"fill-opacity":1,"stroke-opacity":1,"stroke-width":0,"stroke-linejoin":"miter","stroke-linecap":"butt",fill:"#000000",stroke:"#000000",opacity:1,x:0,y:0,cx:0,cy:0,width:0,height:0,r:0,rx:0,ry:0,offset:0,"stop-opacity":1,"stop-color":"#000000","font-size":16,"font-family":"Helvetica, Arial, sans-serif","text-anchor":"start"}},g.Color=function(t){var e;this.r=0,this.g=0,this.b=0,t&&("string"==typeof t?g.regex.isRgb.test(t)?(e=g.regex.rgb.exec(t.replace(/\s/g,"")),this.r=parseInt(e[1]),this.g=parseInt(e[2]),this.b=parseInt(e[3])):g.regex.isHex.test(t)&&(e=g.regex.hex.exec(a(t)),this.r=parseInt(e[1],16),this.g=parseInt(e[2],16),this.b=parseInt(e[3],16)):"object"==typeof t&&(this.r=t.r,this.g=t.g,this.b=t.b))},g.extend(g.Color,{toString:function(){return this.toHex()},toHex:function(){return"#"+o(this.r)+o(this.g)+o(this.b)},toRgb:function(){return"rgb("+[this.r,this.g,this.b].join()+")"},brightness:function(){return this.r/255*.3+this.g/255*.59+this.b/255*.11},morph:function(t){return this.destination=new g.Color(t),this},at:function(t){return this.destination?(t=t<0?0:t>1?1:t,new g.Color({r:~~(this.r+(this.destination.r-this.r)*t),g:~~(this.g+(this.destination.g-this.g)*t),b:~~(this.b+(this.destination.b-this.b)*t)})):this}}),g.Color.test=function(t){return t+="",g.regex.isHex.test(t)||g.regex.isRgb.test(t)},g.Color.isRgb=function(t){return t&&"number"==typeof t.r&&"number"==typeof t.g&&"number"==typeof t.b},g.Color.isColor=function(t){return g.Color.isRgb(t)||g.Color.test(t)},g.Array=function(t,e){t=(t||[]).valueOf(),0==t.length&&e&&(t=e.valueOf()),this.value=this.parse(t)},g.extend(g.Array,{morph:function(t){if(this.destination=this.parse(t),this.value.length!=this.destination.length){for(var e=this.value[this.value.length-1],i=this.destination[this.destination.length-1];this.value.length>this.destination.length;)this.destination.push(i);for(;this.value.length<this.destination.length;)this.value.push(e)}return this},settle:function(){for(var t=0,e=this.value.length,i=[];t<e;t++)i.indexOf(this.value[t])==-1&&i.push(this.value[t]);return this.value=i},at:function(t){if(!this.destination)return this;for(var e=0,i=this.value.length,n=[];e<i;e++)n.push(this.value[e]+(this.destination[e]-this.value[e])*t);return new g.Array(n)},toString:function(){return this.value.join(" ")},valueOf:function(){return this.value},parse:function(t){return t=t.valueOf(),Array.isArray(t)?t:this.split(t)},split:function(t){return t.trim().split(/\s+/)},reverse:function(){return this.value.reverse(),this}}),g.PointArray=function(t,e){this.constructor.call(this,t,e||[[0,0]])},g.PointArray.prototype=new g.Array,g.extend(g.PointArray,{toString:function(){for(var t=0,e=this.value.length,i=[];t<e;t++)i.push(this.value[t].join(","));return i.join(" ")},toLine:function(){return{x1:this.value[0][0],y1:this.value[0][1],x2:this.value[1][0],y2:this.value[1][1]}},at:function(t){if(!this.destination)return this;for(var e=0,i=this.value.length,n=[];e<i;e++)n.push([this.value[e][0]+(this.destination[e][0]-this.value[e][0])*t,this.value[e][1]+(this.destination[e][1]-this.value[e][1])*t]);return new g.PointArray(n)},parse:function(t){var e=[];if(t=t.valueOf(),Array.isArray(t))return t;t=t.trim().split(/\s+|,/),t.length%2!==0&&t.pop();for(var i=0,n=t.length;i<n;i+=2)e.push([parseFloat(t[i]),parseFloat(t[i+1])]);return e},move:function(t,e){var i=this.bbox();if(t-=i.x,e-=i.y,!isNaN(t)&&!isNaN(e))for(var n=this.value.length-1;n>=0;n--)this.value[n]=[this.value[n][0]+t,this.value[n][1]+e];return this},size:function(t,e){var i,n=this.bbox();for(i=this.value.length-1;i>=0;i--)this.value[i][0]=(this.value[i][0]-n.x)*t/n.width+n.x,this.value[i][1]=(this.value[i][1]-n.y)*e/n.height+n.y;return this},bbox:function(){return g.parser.poly.setAttribute("points",this.toString()),g.parser.poly.getBBox()}}),g.PathArray=function(t,e){this.constructor.call(this,t,e||[["M",0,0]])},g.PathArray.prototype=new g.Array,g.extend(g.PathArray,{toString:function(){return p(this.value)},move:function(t,e){var i=this.bbox();if(t-=i.x,e-=i.y,!isNaN(t)&&!isNaN(e))for(var n,s=this.value.length-1;s>=0;s--)n=this.value[s][0],"M"==n||"L"==n||"T"==n?(this.value[s][1]+=t,this.value[s][2]+=e):"H"==n?this.value[s][1]+=t:"V"==n?this.value[s][1]+=e:"C"==n||"S"==n||"Q"==n?(this.value[s][1]+=t,this.value[s][2]+=e,this.value[s][3]+=t,this.value[s][4]+=e,"C"==n&&(this.value[s][5]+=t,this.value[s][6]+=e)):"A"==n&&(this.value[s][6]+=t,this.value[s][7]+=e);return this},size:function(t,e){var i,n,s=this.bbox();for(i=this.value.length-1;i>=0;i--)n=this.value[i][0],"M"==n||"L"==n||"T"==n?(this.value[i][1]=(this.value[i][1]-s.x)*t/s.width+s.x,this.value[i][2]=(this.value[i][2]-s.y)*e/s.height+s.y):"H"==n?this.value[i][1]=(this.value[i][1]-s.x)*t/s.width+s.x:"V"==n?this.value[i][1]=(this.value[i][1]-s.y)*e/s.height+s.y:"C"==n||"S"==n||"Q"==n?(this.value[i][1]=(this.value[i][1]-s.x)*t/s.width+s.x,this.value[i][2]=(this.value[i][2]-s.y)*e/s.height+s.y,this.value[i][3]=(this.value[i][3]-s.x)*t/s.width+s.x,this.value[i][4]=(this.value[i][4]-s.y)*e/s.height+s.y,"C"==n&&(this.value[i][5]=(this.value[i][5]-s.x)*t/s.width+s.x,this.value[i][6]=(this.value[i][6]-s.y)*e/s.height+s.y)):"A"==n&&(this.value[i][1]=this.value[i][1]*t/s.width,this.value[i][2]=this.value[i][2]*e/s.height,this.value[i][6]=(this.value[i][6]-s.x)*t/s.width+s.x,this.value[i][7]=(this.value[i][7]-s.y)*e/s.height+s.y);return this},equalCommands:function(t){var e,i,n;for(t=new g.PathArray(t),n=this.value.length===t.value.length,e=0,i=this.value.length;n&&e<i;e++)n=this.value[e][0]===t.value[e][0];return n},morph:function(t){return t=new g.PathArray(t),this.equalCommands(t)?this.destination=t:this.destination=null,this},at:function(t){if(!this.destination)return this;var e,i,n,s,r=this.value,a=this.destination.value,o=[],h=new g.PathArray;for(e=0,i=r.length;e<i;e++){for(o[e]=[r[e][0]],n=1,s=r[e].length;n<s;n++)o[e][n]=r[e][n]+(a[e][n]-r[e][n])*t;"A"===o[e][0]&&(o[e][4]=+(0!=o[e][4]),o[e][5]=+(0!=o[e][5]))}return h.value=o,h},parse:function(t){if(t instanceof g.PathArray)return t.valueOf();var e,i,n,s,r,a,o=0,h=0,u={M:2,L:2,H:1,V:1,C:6,S:4,Q:4,T:2,A:7};if("string"==typeof t){for(t=t.replace(g.regex.negExp,"X").replace(g.regex.pathLetters," $& ").replace(g.regex.hyphen," -").replace(g.regex.comma," ").replace(g.regex.X,"e-").trim().split(g.regex.whitespaces),e=t.length;--e;)if(t[e].indexOf(".")!=t[e].lastIndexOf(".")){var l=t[e].split("."),c=[l.shift(),l.shift()].join(".");t.splice.apply(t,[e,1].concat(c,l.map(function(t){return"."+t})))}}else t=t.reduce(function(t,e){return[].concat.apply(t,e)},[]);var a=[];do{for(g.regex.isPathLetter.test(t[0])?(s=t[0],t.shift()):"M"==s?s="L":"m"==s&&(s="l"),r=[s.toUpperCase()],e=0;e<u[r[0]];++e)r.push(parseFloat(t.shift()));s==r[0]?"M"==s||"L"==s||"C"==s||"Q"==s||"S"==s||"T"==s?(o=r[u[r[0]]-1],h=r[u[r[0]]]):"V"==s?h=r[1]:"H"==s?o=r[1]:"A"==s&&(o=r[6],h=r[7]):"m"==s||"l"==s||"c"==s||"s"==s||"q"==s||"t"==s?(r[1]+=o,r[2]+=h,null!=r[3]&&(r[3]+=o,r[4]+=h),null!=r[5]&&(r[5]+=o,r[6]+=h),o=r[u[r[0]]-1],h=r[u[r[0]]]):"v"==s?(r[1]+=h,h=r[1]):"h"==s?(r[1]+=o,o=r[1]):"a"==s&&(r[6]+=o,r[7]+=h,o=r[6],h=r[7]),"M"==r[0]&&(i=o,n=h),"Z"==r[0]&&(o=i,h=n),a.push(r)}while(t.length);return a},bbox:function(){return g.parser.path.setAttribute("d",this.toString()),g.parser.path.getBBox()}}),g.Number=g.invent({create:function(t,e){this.value=0,this.unit=e||"","number"==typeof t?this.value=isNaN(t)?0:isFinite(t)?t:t<0?-3.4e38:3.4e38:"string"==typeof t?(e=t.match(g.regex.numberAndUnit),e&&(this.value=parseFloat(e[1]),"%"==e[5]?this.value/=100:"s"==e[5]&&(this.value*=1e3),this.unit=e[5])):t instanceof g.Number&&(this.value=t.valueOf(),this.unit=t.unit)},extend:{toString:function(){return("%"==this.unit?~~(1e8*this.value)/1e6:"s"==this.unit?this.value/1e3:this.value)+this.unit},toJSON:function(){return this.toString()},valueOf:function(){return this.value},plus:function(t){return new g.Number(this+new g.Number(t),this.unit)},minus:function(t){return this.plus(-new g.Number(t))},times:function(t){return new g.Number(this*new g.Number(t),this.unit)},divide:function(t){return new g.Number(this/new g.Number(t),this.unit)},to:function(t){var e=new g.Number(this);return"string"==typeof t&&(e.unit=t),e},morph:function(t){return this.destination=new g.Number(t),this},at:function(t){return this.destination?new g.Number(this.destination).minus(this).times(t).plus(this):this}}}),g.Element=g.invent({create:function(t){this._stroke=g.defaults.attrs.stroke,this.dom={},(this.node=t)&&(this.type=t.nodeName,this.node.instance=this,this._stroke=t.getAttribute("stroke")||this._stroke)},extend:{x:function(t){return this.attr("x",t)},y:function(t){return this.attr("y",t)},cx:function(t){return null==t?this.x()+this.width()/2:this.x(t-this.width()/2)},cy:function(t){return null==t?this.y()+this.height()/2:this.y(t-this.height()/2)},move:function(t,e){return this.x(t).y(e)},center:function(t,e){return this.cx(t).cy(e)},width:function(t){return this.attr("width",t)},height:function(t){return this.attr("height",t)},size:function(t,e){var i=h(this,t,e);return this.width(new g.Number(i.width)).height(new g.Number(i.height))},clone:function(t){var e=m(this.node.cloneNode(!0));return t?t.add(e):this.after(e),e},remove:function(){return this.parent()&&this.parent().removeElement(this),this},replace:function(t){return this.after(t).remove(),t},addTo:function(t){return t.put(this)},putIn:function(t){return t.add(this)},id:function(t){return this.attr("id",t)},inside:function(t,e){var i=this.bbox();return t>i.x&&e>i.y&&t<i.x+i.width&&e<i.y+i.height},show:function(){return this.style("display","")},hide:function(){return this.style("display","none")},visible:function(){return"none"!=this.style("display")},toString:function(){return this.attr("id")},classes:function(){var t=this.attr("class");return null==t?[]:t.trim().split(/\s+/)},hasClass:function(t){return this.classes().indexOf(t)!=-1},addClass:function(t){if(!this.hasClass(t)){var e=this.classes();e.push(t),this.attr("class",e.join(" "))}return this},removeClass:function(t){return this.hasClass(t)&&this.attr("class",this.classes().filter(function(e){return e!=t}).join(" ")),this},toggleClass:function(t){return this.hasClass(t)?this.removeClass(t):this.addClass(t)},reference:function(t){return g.get(this.attr(t))},parent:function(t){var e=this;if(!e.node.parentNode)return null;if(e=g.adopt(e.node.parentNode),!t)return e;for(;e&&e.node instanceof SVGElement;){if("string"==typeof t?e.matches(t):e instanceof t)return e;e=g.adopt(e.node.parentNode)}},doc:function(){return this instanceof g.Doc?this:this.parent(g.Doc)},parents:function(t){var e=[],i=this;do{if(i=i.parent(t),!i||!i.node)break;e.push(i)}while(i.parent);return e},matches:function(t){return n(this.node,t)},native:function(){return this.node},svg:function(t){var i=e.createElement("svg");if(!(t&&this instanceof g.Parent))return i.appendChild(t=e.createElement("svg")),this.writeDataToDom(),t.appendChild(this.node.cloneNode(!0)),i.innerHTML.replace(/^<svg>/,"").replace(/<\/svg>$/,"");i.innerHTML="<svg>"+t.replace(/\n/,"").replace(/<(\w+)([^<]+?)\/>/g,"<$1$2></$1>")+"</svg>";for(var n=0,s=i.firstChild.childNodes.length;n<s;n++)this.node.appendChild(i.firstChild.firstChild);return this},writeDataToDom:function(){if(this.each||this.lines){var t=this.each?this:this.lines();t.each(function(){this.writeDataToDom()})}return this.node.removeAttribute("svgjs:data"),Object.keys(this.dom).length&&this.node.setAttribute("svgjs:data",JSON.stringify(this.dom)),this},setData:function(t){return this.dom=t,this},is:function(t){return i(this,t)}}}),g.easing={"-":function(t){return t},"<>":function(t){return-Math.cos(t*Math.PI)/2+.5},">":function(t){return Math.sin(t*Math.PI/2)},"<":function(t){return-Math.cos(t*Math.PI/2)+1}},g.morph=function(t){return function(e,i){return new g.MorphObj(e,i).at(t)}},g.Situation=g.invent({create:function(t){this.init=!1,this.reversed=!1,this.reversing=!1,this.duration=new g.Number(t.duration).valueOf(),this.delay=new g.Number(t.delay).valueOf(),this.start=+new Date+this.delay,this.finish=this.start+this.duration,this.ease=t.ease,this.loop=0,this.loops=!1,this.animations={},this.attrs={},this.styles={},this.transforms=[],this.once={}}}),g.FX=g.invent({create:function(t){this._target=t,this.situations=[],this.active=!1,this.situation=null,this.paused=!1,this.lastPos=0,this.pos=0,this.absPos=0,this._speed=1},extend:{animate:function(t,e,i){"object"==typeof t&&(e=t.ease,i=t.delay,t=t.duration);var n=new g.Situation({duration:t||1e3,delay:i||0,ease:g.easing[e||"-"]||e});return this.queue(n),this},delay:function(t){var e=new g.Situation({duration:t,delay:0,ease:g.easing["-"]});return this.queue(e)},target:function(t){return t&&t instanceof g.Element?(this._target=t,this):this._target},timeToAbsPos:function(t){return(t-this.situation.start)/(this.situation.duration/this._speed)},absPosToTime:function(t){return this.situation.duration/this._speed*t+this.situation.start},startAnimFrame:function(){this.stopAnimFrame(),this.animationFrame=requestAnimationFrame(function(){this.step()}.bind(this))},stopAnimFrame:function(){cancelAnimationFrame(this.animationFrame)},start:function(){return!this.active&&this.situation&&(this.active=!0,this.startCurrent()),this},startCurrent:function(){return this.situation.start=+new Date+this.situation.delay/this._speed,this.situation.finish=this.situation.start+this.situation.duration/this._speed,this.initAnimations().step()},queue:function(t){return("function"==typeof t||t instanceof g.Situation)&&this.situations.push(t),this.situation||(this.situation=this.situations.shift()),this},dequeue:function(){return this.situation&&this.situation.stop&&this.situation.stop(),this.situation=this.situations.shift(),this.situation&&(this.situation instanceof g.Situation?this.startCurrent():this.situation.call(this)),this},initAnimations:function(){var t,e=this.situation;if(e.init)return this;for(t in e.animations)"viewbox"==t?e.animations[t]=this.target().viewbox().morph(e.animations[t]):(e.animations[t].value="plot"==t?this.target().array().value:this.target()[t](),e.animations[t].value.value&&(e.animations[t].value=e.animations[t].value.value),e.animations[t].relative&&(e.animations[t].destination.value=e.animations[t].destination.value+e.animations[t].value));for(t in e.attrs)if(e.attrs[t]instanceof g.Color){var i=new g.Color(this.target().attr(t));e.attrs[t].r=i.r,e.attrs[t].g=i.g,e.attrs[t].b=i.b}else e.attrs[t].value=this.target().attr(t);for(t in e.styles)e.styles[t].value=this.target().style(t);return e.initialTransformation=this.target().matrixify(),e.init=!0,this},clearQueue:function(){return this.situations=[],this},clearCurrent:function(){return this.situation=null,this},stop:function(t,e){return this.active||this.start(),e&&this.clearQueue(),this.active=!1,t&&this.situation&&this.atEnd(),this.stopAnimFrame(),this.clearCurrent()},reset:function(){if(this.situation){var t=this.situation;this.stop(),this.situation=t,this.atStart()}return this},finish:function(){for(this.stop(!0,!1);this.dequeue().situation&&this.stop(!0,!1););return this.clearQueue().clearCurrent(),this},atStart:function(){return this.at(0,!0)},atEnd:function(){return this.situation.loops===!0?this.at(this.situation.loop+1,!0):"number"==typeof this.situation.loops?this.at(this.situation.loops,!0):this.at(1,!0)},at:function(t,e){var i=this.situation.duration/this._speed;return this.absPos=t,e||(this.situation.reversed&&(this.absPos=1-this.absPos),this.absPos+=this.situation.loop),this.situation.start=+new Date-this.absPos*i,this.situation.finish=this.situation.start+i,this.step(!0)},speed:function(t){return 0===t?this.pause():t?(this._speed=t,this.at(this.absPos,!0)):this._speed},loop:function(t,e){var i=this.last();return i.loops=null==t||t,i.loop=0,e&&(i.reversing=!0),this},pause:function(){return this.paused=!0,this.stopAnimFrame(),this},play:function(){return this.paused?(this.paused=!1,this.at(this.absPos,!0)):this},reverse:function(t){var e=this.last();return"undefined"==typeof t?e.reversed=!e.reversed:e.reversed=t,this},progress:function(t){return t?this.situation.ease(this.pos):this.pos},after:function(t){var e=this.last(),i=function i(n){n.detail.situation==e&&(t.call(this,e),this.off("finished.fx",i))};return this.target().on("finished.fx",i),this},during:function(t){var e=this.last(),i=function(i){i.detail.situation==e&&t.call(this,i.detail.pos,g.morph(i.detail.pos),i.detail.eased,e)};return this.target().off("during.fx",i).on("during.fx",i),this.after(function(){this.off("during.fx",i)})},afterAll:function(t){var e=function e(i){t.call(this),this.off("allfinished.fx",e)};return this.target().off("allfinished.fx",e).on("allfinished.fx",e),this},duringAll:function(t){var e=function(e){t.call(this,e.detail.pos,g.morph(e.detail.pos),e.detail.eased,e.detail.situation)};return this.target().off("during.fx",e).on("during.fx",e),this.afterAll(function(){this.off("during.fx",e)})},last:function(){return this.situations.length?this.situations[this.situations.length-1]:this.situation},add:function(t,e,i){return this.last()[i||"animations"][t]=e,setTimeout(function(){this.start()}.bind(this),0),this},step:function(t){if(t||(this.absPos=this.timeToAbsPos(+new Date)),this.situation.loops!==!1){var e,i,n;e=Math.max(this.absPos,0),i=Math.floor(e),this.situation.loops===!0||i<this.situation.loops?(this.pos=e-i,n=this.situation.loop,this.situation.loop=i):(this.absPos=this.situation.loops,this.pos=1,n=this.situation.loop-1,this.situation.loop=this.situation.loops),this.situation.reversing&&(this.situation.reversed=this.situation.reversed!=Boolean((this.situation.loop-n)%2))}else this.absPos=Math.min(this.absPos,1),this.pos=this.absPos;this.pos<0&&(this.pos=0),this.situation.reversed&&(this.pos=1-this.pos);var s=this.situation.ease(this.pos);for(var r in this.situation.once)r>this.lastPos&&r<=s&&(this.situation.once[r].call(this.target(),this.pos,s),delete this.situation.once[r]);return this.active&&this.target().fire("during",{pos:this.pos,eased:s,fx:this,situation:this.situation}),this.situation?(this.eachAt(),1==this.pos&&!this.situation.reversed||this.situation.reversed&&0==this.pos?(this.stopAnimFrame(),this.target().fire("finished",{fx:this,situation:this.situation}),this.situations.length||(this.target().fire("allfinished"),this.target().off(".fx"),this.active=!1),this.active?this.dequeue():this.clearCurrent()):!this.paused&&this.active&&this.startAnimFrame(),this.lastPos=s,this):this},eachAt:function(){var t,e,i=this,n=this.target(),s=this.situation;for(t in s.animations)e=[].concat(s.animations[t]).map(function(t){return"string"!=typeof t&&t.at?t.at(s.ease(i.pos),i.pos):t}),n[t].apply(n,e);for(t in s.attrs)e=[t].concat(s.attrs[t]).map(function(t){return"string"!=typeof t&&t.at?t.at(s.ease(i.pos),i.pos):t}),n.attr.apply(n,e);for(t in s.styles)e=[t].concat(s.styles[t]).map(function(t){return"string"!=typeof t&&t.at?t.at(s.ease(i.pos),i.pos):t}),n.style.apply(n,e);if(s.transforms.length){for(e=s.initialTransformation,t=0,len=s.transforms.length;t<len;t++){var r=s.transforms[t];r instanceof g.Matrix?e=r.relative?e.multiply((new g.Matrix).morph(r).at(s.ease(this.pos))):e.morph(r).at(s.ease(this.pos)):(r.relative||r.undo(e.extract()),e=e.multiply(r.at(s.ease(this.pos))))}n.matrix(e)}return this},once:function(t,e,i){return i||(t=this.situation.ease(t)),this.situation.once[t]=e,this}},parent:g.Element,construct:{animate:function(t,e,i){return(this.fx||(this.fx=new g.FX(this))).animate(t,e,i)},delay:function(t){return(this.fx||(this.fx=new g.FX(this))).delay(t)},stop:function(t,e){return this.fx&&this.fx.stop(t,e),this},finish:function(){return this.fx&&this.fx.finish(),this},pause:function(){return this.fx&&this.fx.pause(),this},play:function(){return this.fx&&this.fx.play(),this},speed:function(t){if(this.fx){if(null==t)return this.fx.speed();this.fx.speed(t)}return this}}}),g.MorphObj=g.invent({create:function(t,e){return g.Color.isColor(e)?new g.Color(t).morph(e):g.regex.numberAndUnit.test(e)?new g.Number(t).morph(e):(this.value=0,void(this.destination=e))},extend:{at:function(t,e){return e<1?this.value:this.destination},valueOf:function(){return this.value}}}),g.extend(g.FX,{attr:function(t,e,i){if("object"==typeof t)for(var n in t)this.attr(n,t[n]);else this.add(t,new g.MorphObj(null,e),"attrs");return this},style:function(t,e){if("object"==typeof t)for(var i in t)this.style(i,t[i]);else this.add(t,new g.MorphObj(null,e),"styles");return this},x:function(t,e){if(this.target()instanceof g.G)return this.transform({x:t},e),this;var i=(new g.Number).morph(t);return i.relative=e,this.add("x",i)},y:function(t,e){if(this.target()instanceof g.G)return this.transform({y:t},e),this;var i=(new g.Number).morph(t);return i.relative=e,this.add("y",i)},cx:function(t){return this.add("cx",(new g.Number).morph(t))},cy:function(t){return this.add("cy",(new g.Number).morph(t))},move:function(t,e){return this.x(t).y(e)},center:function(t,e){return this.cx(t).cy(e)},size:function(t,e){if(this.target()instanceof g.Text)this.attr("font-size",t);else{var i;t&&e||(i=this.target().bbox()),t||(t=i.width/i.height*e),e||(e=i.height/i.width*t),this.add("width",(new g.Number).morph(t)).add("height",(new g.Number).morph(e))}return this},plot:function(t){return this.add("plot",this.target().array().morph(t))},leading:function(t){return this.target().leading?this.add("leading",(new g.Number).morph(t)):this},viewbox:function(t,e,i,n){return this.target()instanceof g.Container&&this.add("viewbox",new g.ViewBox(t,e,i,n)),this},update:function(t){if(this.target()instanceof g.Stop){if("number"==typeof t||t instanceof g.Number)return this.update({offset:arguments[0],color:arguments[1],opacity:arguments[2]});null!=t.opacity&&this.attr("stop-opacity",t.opacity),null!=t.color&&this.attr("stop-color",t.color),null!=t.offset&&this.attr("offset",t.offset)}return this}}),g.BBox=g.invent({create:function(t){if(t){var i;try{if(!e.documentElement.contains(t.node))throw new Exception("Element not in the dom");i=t.node.getBBox()}catch(e){if(t instanceof g.Shape){var n=t.clone(g.parser.draw).show();i=n.bbox(),n.remove()}else i={x:t.node.clientLeft,y:t.node.clientTop,width:t.node.clientWidth,height:t.node.clientHeight}}this.x=i.x,this.y=i.y,this.width=i.width,this.height=i.height}x(this)},parent:g.Element,construct:{bbox:function(){return new g.BBox(this)}}}),g.TBox=g.invent({create:function(t){if(t){var e=t.ctm().extract(),i=t.bbox();this.width=i.width*e.scaleX,this.height=i.height*e.scaleY,this.x=i.x+e.x,this.y=i.y+e.y}x(this)},parent:g.Element,construct:{tbox:function(){return new g.TBox(this)}}}),g.RBox=g.invent({create:function(e){if(e){var i=e.doc().parent(),n=e.node.getBoundingClientRect(),s=1;for(this.x=n.left,this.y=n.top,this.x-=i.offsetLeft,this.y-=i.offsetTop;i=i.offsetParent;)this.x-=i.offsetLeft,this.y-=i.offsetTop;for(i=e;i.parent&&(i=i.parent());)i.viewbox&&(s*=i.viewbox().zoom,this.x-=i.x()||0,this.y-=i.y()||0);this.width=n.width/=s,this.height=n.height/=s}x(this),this.x+=t.pageXOffset,this.y+=t.pageYOffset},parent:g.Element,construct:{rbox:function(){return new g.RBox(this)}}}),[g.BBox,g.TBox,g.RBox].forEach(function(t){g.extend(t,{merge:function(e){var i=new t;return i.x=Math.min(this.x,e.x),i.y=Math.min(this.y,e.y),i.width=Math.max(this.x+this.width,e.x+e.width)-i.x,i.height=Math.max(this.y+this.height,e.y+e.height)-i.y,x(i)}})}),g.Matrix=g.invent({create:function(t){var e,i=l([1,0,0,1,0,0]);for(t=t instanceof g.Element?t.matrixify():"string"==typeof t?d(t):6==arguments.length?l([].slice.call(arguments)):"object"==typeof t?t:i,e=w.length-1;e>=0;--e)this[w[e]]=t&&"number"==typeof t[w[e]]?t[w[e]]:i[w[e]]},extend:{extract:function(){var t=u(this,0,1),e=u(this,1,0),i=180/Math.PI*Math.atan2(t.y,t.x)-90;return{x:this.e,y:this.f,transformedX:(this.e*Math.cos(i*Math.PI/180)+this.f*Math.sin(i*Math.PI/180))/Math.sqrt(this.a*this.a+this.b*this.b),transformedY:(this.f*Math.cos(i*Math.PI/180)+this.e*Math.sin(-i*Math.PI/180))/Math.sqrt(this.c*this.c+this.d*this.d),skewX:-i,skewY:180/Math.PI*Math.atan2(e.y,e.x),scaleX:Math.sqrt(this.a*this.a+this.b*this.b),scaleY:Math.sqrt(this.c*this.c+this.d*this.d),rotation:i,a:this.a,b:this.b,c:this.c,d:this.d,e:this.e,f:this.f,matrix:new g.Matrix(this)}},clone:function(){return new g.Matrix(this)},morph:function(t){return this.destination=new g.Matrix(t),this},at:function(t){if(!this.destination)return this;var e=new g.Matrix({a:this.a+(this.destination.a-this.a)*t,b:this.b+(this.destination.b-this.b)*t,c:this.c+(this.destination.c-this.c)*t,d:this.d+(this.destination.d-this.d)*t,e:this.e+(this.destination.e-this.e)*t,f:this.f+(this.destination.f-this.f)*t});if(this.param&&this.param.to){var i={rotation:this.param.from.rotation+(this.param.to.rotation-this.param.from.rotation)*t,cx:this.param.from.cx,cy:this.param.from.cy};e=e.rotate((this.param.to.rotation-2*this.param.from.rotation)*t,i.cx,i.cy),e.param=i}return e},multiply:function(t){return new g.Matrix(this.native().multiply(c(t).native()))},inverse:function(){return new g.Matrix(this.native().inverse())},translate:function(t,e){return new g.Matrix(this.native().translate(t||0,e||0))},scale:function(t,e,i,n){return 1==arguments.length?e=t:3==arguments.length&&(n=i,i=e,e=t),this.around(i,n,new g.Matrix(t,0,0,e,0,0))},rotate:function(t,e,i){return t=g.utils.radians(t),this.around(e,i,new g.Matrix(Math.cos(t),Math.sin(t),(-Math.sin(t)),Math.cos(t),0,0))},flip:function(t,e){return"x"==t?this.scale(-1,1,e,0):this.scale(1,-1,0,e)},skew:function(t,e,i,n){return 1==arguments.length?e=t:3==arguments.length&&(n=i,i=e,e=t),t=g.utils.radians(t),e=g.utils.radians(e),this.around(i,n,new g.Matrix(1,Math.tan(e),Math.tan(t),1,0,0))},skewX:function(t,e,i){return this.skew(t,0,e,i)},skewY:function(t,e,i){return this.skew(0,t,e,i)},around:function(t,e,i){return this.multiply(new g.Matrix(1,0,0,1,t||0,e||0)).multiply(i).multiply(new g.Matrix(1,0,0,1,-t||0,-e||0))},native:function(){for(var t=g.parser.native.createSVGMatrix(),e=w.length-1;e>=0;e--)t[w[e]]=this[w[e]];return t},toString:function(){return"matrix("+this.a+","+this.b+","+this.c+","+this.d+","+this.e+","+this.f+")"}},parent:g.Element,construct:{ctm:function(){return new g.Matrix(this.node.getCTM())},screenCTM:function(){return new g.Matrix(this.node.getScreenCTM())}}}),g.Point=g.invent({create:function(t,e){var i,n={x:0,y:0};i=Array.isArray(t)?{x:t[0],y:t[1]}:"object"==typeof t?{x:t.x,y:t.y}:null!=t?{x:t,y:null!=e?e:t}:n,this.x=i.x,this.y=i.y},extend:{clone:function(){return new g.Point(this)},morph:function(t,e){return this.destination=new g.Point(t,e),this},at:function(t){if(!this.destination)return this;var e=new g.Point({x:this.x+(this.destination.x-this.x)*t,y:this.y+(this.destination.y-this.y)*t});return e},native:function(){var t=g.parser.native.createSVGPoint();return t.x=this.x,t.y=this.y,t},transform:function(t){return new g.Point(this.native().matrixTransform(t.native()))}}}),g.extend(g.Element,{point:function(t,e){return new g.Point(t,e).transform(this.screenCTM().inverse())}}),g.extend(g.Element,{attr:function(t,e,i){if(null==t){for(t={},e=this.node.attributes, -i=e.length-1;i>=0;i--)t[e[i].nodeName]=g.regex.isNumber.test(e[i].nodeValue)?parseFloat(e[i].nodeValue):e[i].nodeValue;return t}if("object"==typeof t)for(e in t)this.attr(e,t[e]);else if(null===e)this.node.removeAttribute(t);else{if(null==e)return e=this.node.getAttribute(t),null==e?g.defaults.attrs[t]:g.regex.isNumber.test(e)?parseFloat(e):e;"stroke-width"==t?this.attr("stroke",parseFloat(e)>0?this._stroke:null):"stroke"==t&&(this._stroke=e),"fill"!=t&&"stroke"!=t||(g.regex.isImage.test(e)&&(e=this.doc().defs().image(e,0,0)),e instanceof g.Image&&(e=this.doc().defs().pattern(0,0,function(){this.add(e)}))),"number"==typeof e?e=new g.Number(e):g.Color.isColor(e)?e=new g.Color(e):Array.isArray(e)?e=new g.Array(e):e instanceof g.Matrix&&e.param&&(this.param=e.param),"leading"==t?this.leading&&this.leading(e):"string"==typeof i?this.node.setAttributeNS(i,t,e.toString()):this.node.setAttribute(t,e.toString()),!this.rebuild||"font-size"!=t&&"x"!=t||this.rebuild(t,e)}return this}}),g.extend(g.Element,{transform:function(t,e){var i,n=this;if("object"!=typeof t)return i=new g.Matrix(n).extract(),"string"==typeof t?i[t]:i;if(i=new g.Matrix(n),e=!!e||!!t.relative,null!=t.a)i=e?i.multiply(new g.Matrix(t)):new g.Matrix(t);else if(null!=t.rotation)f(t,n),i=e?i.rotate(t.rotation,t.cx,t.cy):i.rotate(t.rotation-i.extract().rotation,t.cx,t.cy);else if(null!=t.scale||null!=t.scaleX||null!=t.scaleY){if(f(t,n),t.scaleX=null!=t.scale?t.scale:null!=t.scaleX?t.scaleX:1,t.scaleY=null!=t.scale?t.scale:null!=t.scaleY?t.scaleY:1,!e){var s=i.extract();t.scaleX=1*t.scaleX/s.scaleX,t.scaleY=1*t.scaleY/s.scaleY}i=i.scale(t.scaleX,t.scaleY,t.cx,t.cy)}else if(null!=t.skew||null!=t.skewX||null!=t.skewY){if(f(t,n),t.skewX=null!=t.skew?t.skew:null!=t.skewX?t.skewX:0,t.skewY=null!=t.skew?t.skew:null!=t.skewY?t.skewY:0,!e){var s=i.extract();i=i.multiply((new g.Matrix).skew(s.skewX,s.skewY,t.cx,t.cy).inverse())}i=i.skew(t.skewX,t.skewY,t.cx,t.cy)}else t.flip?i=i.flip(t.flip,null==t.offset?n.bbox()["c"+t.flip]:t.offset):null==t.x&&null==t.y||(e?i=i.translate(t.x,t.y):(null!=t.x&&(i.e=t.x),null!=t.y&&(i.f=t.y)));return this.attr("transform",i)}}),g.extend(g.FX,{transform:function(t,e){var i,n=this.target();return"object"!=typeof t?(i=new g.Matrix(n).extract(),"string"==typeof t?i[t]:i):(e=!!e||!!t.relative,null!=t.a?i=new g.Matrix(t):null!=t.rotation?(f(t,n),i=new g.Rotate(t.rotation,t.cx,t.cy)):null!=t.scale||null!=t.scaleX||null!=t.scaleY?(f(t,n),t.scaleX=null!=t.scale?t.scale:null!=t.scaleX?t.scaleX:1,t.scaleY=null!=t.scale?t.scale:null!=t.scaleY?t.scaleY:1,i=new g.Scale(t.scaleX,t.scaleY,t.cx,t.cy)):null!=t.skewX||null!=t.skewY?(f(t,n),t.skewX=null!=t.skewX?t.skewX:0,t.skewY=null!=t.skewY?t.skewY:0,i=new g.Skew(t.skewX,t.skewY,t.cx,t.cy)):t.flip?i=(new g.Matrix).morph((new g.Matrix).flip(t.flip,null==t.offset?n.bbox()["c"+t.flip]:t.offset)):null==t.x&&null==t.y||(i=new g.Translate(t.x,t.y)),i?(i.relative=e,this.last().transforms.push(i),setTimeout(function(){this.start()}.bind(this),0),this):this)}}),g.extend(g.Element,{untransform:function(){return this.attr("transform",null)},matrixify:function(){var t=(this.attr("transform")||"").split(/\)\s*,?\s*/).slice(0,-1).map(function(t){var e=t.trim().split("(");return[e[0],e[1].split(g.regex.matrixElements).map(function(t){return parseFloat(t)})]}).reduce(function(t,e){return"matrix"==e[0]?t.multiply(l(e[1])):t[e[0]].apply(t,e[1])},new g.Matrix);return t},toParent:function(t){if(this==t)return this;var e=this.screenCTM(),i=t.rect(1,1),n=i.screenCTM().inverse();return i.remove(),this.addTo(t).untransform().transform(n.multiply(e)),this},toDoc:function(){return this.toParent(this.doc())}}),g.Transformation=g.invent({create:function(t,e){if(arguments.length>1&&"boolean"!=typeof e)return this.create([].slice.call(arguments));if("object"==typeof t)for(var i=0,n=this.arguments.length;i<n;++i)this[this.arguments[i]]=t[this.arguments[i]];if(Array.isArray(t))for(var i=0,n=this.arguments.length;i<n;++i)this[this.arguments[i]]=t[i];this.inversed=!1,e===!0&&(this.inversed=!0)},extend:{at:function(t){for(var e=[],i=0,n=this.arguments.length;i<n;++i)e.push(this[this.arguments[i]]);var s=this._undo||new g.Matrix;return s=(new g.Matrix).morph(g.Matrix.prototype[this.method].apply(s,e)).at(t),this.inversed?s.inverse():s},undo:function(t){for(var e=0,i=this.arguments.length;e<i;++e)t[this.arguments[e]]="undefined"==typeof this[this.arguments[e]]?0:t[this.arguments[e]];return t.cx=this.cx,t.cy=this.cy,this._undo=new(g[r(this.method)])(t,(!0)).at(1),this}}}),g.Translate=g.invent({parent:g.Matrix,inherit:g.Transformation,create:function(t,e){"object"==typeof t?this.constructor.call(this,t,e):this.constructor.call(this,[].slice.call(arguments))},extend:{arguments:["transformedX","transformedY"],method:"translate"}}),g.Rotate=g.invent({parent:g.Matrix,inherit:g.Transformation,create:function(t,e){"object"==typeof t?this.constructor.call(this,t,e):this.constructor.call(this,[].slice.call(arguments))},extend:{arguments:["rotation","cx","cy"],method:"rotate",at:function(t){var e=(new g.Matrix).rotate((new g.Number).morph(this.rotation-(this._undo?this._undo.rotation:0)).at(t),this.cx,this.cy);return this.inversed?e.inverse():e},undo:function(t){this._undo=t}}}),g.Scale=g.invent({parent:g.Matrix,inherit:g.Transformation,create:function(t,e){"object"==typeof t?this.constructor.call(this,t,e):this.constructor.call(this,[].slice.call(arguments))},extend:{arguments:["scaleX","scaleY","cx","cy"],method:"scale"}}),g.Skew=g.invent({parent:g.Matrix,inherit:g.Transformation,create:function(t,e){"object"==typeof t?this.constructor.call(this,t,e):this.constructor.call(this,[].slice.call(arguments))},extend:{arguments:["skewX","skewY","cx","cy"],method:"skew"}}),g.extend(g.Element,{style:function(t,e){if(0==arguments.length)return this.node.style.cssText||"";if(arguments.length<2)if("object"==typeof t)for(e in t)this.style(e,t[e]);else{if(!g.regex.isCss.test(t))return this.node.style[s(t)];t=t.split(";");for(var i=0;i<t.length;i++)e=t[i].split(":"),this.style(e[0].replace(/\s+/g,""),e[1])}else this.node.style[s(t)]=null===e||g.regex.isBlank.test(e)?"":e;return this}}),g.Parent=g.invent({create:function(t){this.constructor.call(this,t)},inherit:g.Element,extend:{children:function(){return g.utils.map(g.utils.filterSVGElements(this.node.childNodes),function(t){return g.adopt(t)})},add:function(t,e){return null==e?this.node.appendChild(t.node):t.node!=this.node.childNodes[e]&&this.node.insertBefore(t.node,this.node.childNodes[e]),this},put:function(t,e){return this.add(t,e),t},has:function(t){return this.index(t)>=0},index:function(t){return[].slice.call(this.node.childNodes).indexOf(t.node)},get:function(t){return g.adopt(this.node.childNodes[t])},first:function(){return this.get(0)},last:function(){return this.get(this.node.childNodes.length-1)},each:function(t,e){var i,n,s=this.children();for(i=0,n=s.length;i<n;i++)s[i]instanceof g.Element&&t.apply(s[i],[i,s]),e&&s[i]instanceof g.Container&&s[i].each(t,e);return this},removeElement:function(t){return this.node.removeChild(t.node),this},clear:function(){for(;this.node.hasChildNodes();)this.node.removeChild(this.node.lastChild);return delete this._defs,this},defs:function(){return this.doc().defs()}}}),g.extend(g.Parent,{ungroup:function(t,e){return 0===e||this instanceof g.Defs?this:(t=t||(this instanceof g.Doc?this:this.parent(g.Parent)),e=e||1/0,this.each(function(){return this instanceof g.Defs?this:this instanceof g.Parent?this.ungroup(t,e-1):this.toParent(t)}),this.node.firstChild||this.remove(),this)},flatten:function(t,e){return this.ungroup(t,e)}}),g.Container=g.invent({create:function(t){this.constructor.call(this,t)},inherit:g.Parent}),g.ViewBox=g.invent({create:function(t){var e,i,n,s,r,a,o,h,u=[0,0,0,0],l=1,c=1,f=/[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?/gi;if(t instanceof g.Element){for(o=t,h=t,a=(t.attr("viewBox")||"").match(f),r=t.bbox,n=new g.Number(t.width()),s=new g.Number(t.height());"%"==n.unit;)l*=n.value,n=new g.Number(o instanceof g.Doc?o.parent().offsetWidth:o.parent().width()),o=o.parent();for(;"%"==s.unit;)c*=s.value,s=new g.Number(h instanceof g.Doc?h.parent().offsetHeight:h.parent().height()),h=h.parent();this.x=0,this.y=0,this.width=n*l,this.height=s*c,this.zoom=1,a&&(e=parseFloat(a[0]),i=parseFloat(a[1]),n=parseFloat(a[2]),s=parseFloat(a[3]),this.zoom=this.width/this.height>n/s?this.height/s:this.width/n,this.x=e,this.y=i,this.width=n,this.height=s)}else t="string"==typeof t?t.match(f).map(function(t){return parseFloat(t)}):Array.isArray(t)?t:"object"==typeof t?[t.x,t.y,t.width,t.height]:4==arguments.length?[].slice.call(arguments):u,this.x=t[0],this.y=t[1],this.width=t[2],this.height=t[3]},extend:{toString:function(){return this.x+" "+this.y+" "+this.width+" "+this.height},morph:function(t){var t=1==arguments.length?[t.x,t.y,t.width,t.height]:[].slice.call(arguments);return this.destination=new g.ViewBox(t),this},at:function(t){return this.destination?new g.ViewBox([this.x+(this.destination.x-this.x)*t,this.y+(this.destination.y-this.y)*t,this.width+(this.destination.width-this.width)*t,this.height+(this.destination.height-this.height)*t]):this}},parent:g.Container,construct:{viewbox:function(t){return 0==arguments.length?new g.ViewBox(this):(t=1==arguments.length?[t.x,t.y,t.width,t.height]:[].slice.call(arguments),this.attr("viewBox",t))}}}),["click","dblclick","mousedown","mouseup","mouseover","mouseout","mousemove","touchstart","touchmove","touchleave","touchend","touchcancel"].forEach(function(t){g.Element.prototype[t]=function(e){var i=this;return this.node["on"+t]="function"==typeof e?function(){return e.apply(i,arguments)}:null,this}}),g.listeners=[],g.handlerMap=[],g.listenerId=0,g.on=function(t,e,i,n){var s=i.bind(n||t.instance||t),r=(g.handlerMap.indexOf(t)+1||g.handlerMap.push(t))-1,a=e.split(".")[0],o=e.split(".")[1]||"*";g.listeners[r]=g.listeners[r]||{},g.listeners[r][a]=g.listeners[r][a]||{},g.listeners[r][a][o]=g.listeners[r][a][o]||{},i._svgjsListenerId||(i._svgjsListenerId=++g.listenerId),g.listeners[r][a][o][i._svgjsListenerId]=s,t.addEventListener(a,s,!1)},g.off=function(t,e,i){var n=g.handlerMap.indexOf(t),s=e&&e.split(".")[0],r=e&&e.split(".")[1];if(n!=-1)if(i){if("function"==typeof i&&(i=i._svgjsListenerId),!i)return;g.listeners[n][s]&&g.listeners[n][s][r||"*"]&&(t.removeEventListener(s,g.listeners[n][s][r||"*"][i],!1),delete g.listeners[n][s][r||"*"][i])}else if(r&&s){if(g.listeners[n][s]&&g.listeners[n][s][r]){for(i in g.listeners[n][s][r])g.off(t,[s,r].join("."),i);delete g.listeners[n][s][r]}}else if(r)for(e in g.listeners[n])for(namespace in g.listeners[n][e])r===namespace&&g.off(t,[e,r].join("."));else if(s){if(g.listeners[n][s]){for(namespace in g.listeners[n][s])g.off(t,[s,namespace].join("."));delete g.listeners[n][s]}}else{for(e in g.listeners[n])g.off(t,e);delete g.listeners[n]}},g.extend(g.Element,{on:function(t,e,i){return g.on(this.node,t,e,i),this},off:function(t,e){return g.off(this.node,t,e),this},fire:function(t,e){return t instanceof Event?this.node.dispatchEvent(t):this.node.dispatchEvent(new b(t,{detail:e})),this}}),g.Defs=g.invent({create:"defs",inherit:g.Container}),g.G=g.invent({create:"g",inherit:g.Container,extend:{x:function(t){return null==t?this.transform("x"):this.transform({x:t-this.x()},!0)},y:function(t){return null==t?this.transform("y"):this.transform({y:t-this.y()},!0)},cx:function(t){return null==t?this.gbox().cx:this.x(t-this.gbox().width/2)},cy:function(t){return null==t?this.gbox().cy:this.y(t-this.gbox().height/2)},gbox:function(){var t=this.bbox(),e=this.transform();return t.x+=e.x,t.x2+=e.x,t.cx+=e.x,t.y+=e.y,t.y2+=e.y,t.cy+=e.y,t}},construct:{group:function(){return this.put(new g.G)}}}),g.extend(g.Element,{siblings:function(){return this.parent().children()},position:function(){return this.parent().index(this)},next:function(){return this.siblings()[this.position()+1]},previous:function(){return this.siblings()[this.position()-1]},forward:function(){var t=this.position()+1,e=this.parent();return e.removeElement(this).add(this,t),e instanceof g.Doc&&e.node.appendChild(e.defs().node),this},backward:function(){var t=this.position();return t>0&&this.parent().removeElement(this).add(this,t-1),this},front:function(){var t=this.parent();return t.node.appendChild(this.node),t instanceof g.Doc&&t.node.appendChild(t.defs().node),this},back:function(){return this.position()>0&&this.parent().removeElement(this).add(this,0),this},before:function(t){t.remove();var e=this.position();return this.parent().add(t,e),this},after:function(t){t.remove();var e=this.position();return this.parent().add(t,e+1),this}}),g.Mask=g.invent({create:function(){this.constructor.call(this,g.create("mask")),this.targets=[]},inherit:g.Container,extend:{remove:function(){for(var t=this.targets.length-1;t>=0;t--)this.targets[t]&&this.targets[t].unmask();return this.targets=[],this.parent().removeElement(this),this}},construct:{mask:function(){return this.defs().put(new g.Mask)}}}),g.extend(g.Element,{maskWith:function(t){return this.masker=t instanceof g.Mask?t:this.parent().mask().add(t),this.masker.targets.push(this),this.attr("mask",'url("#'+this.masker.attr("id")+'")')},unmask:function(){return delete this.masker,this.attr("mask",null)}}),g.ClipPath=g.invent({create:function(){this.constructor.call(this,g.create("clipPath")),this.targets=[]},inherit:g.Container,extend:{remove:function(){for(var t=this.targets.length-1;t>=0;t--)this.targets[t]&&this.targets[t].unclip();return this.targets=[],this.parent().removeElement(this),this}},construct:{clip:function(){return this.defs().put(new g.ClipPath)}}}),g.extend(g.Element,{clipWith:function(t){return this.clipper=t instanceof g.ClipPath?t:this.parent().clip().add(t),this.clipper.targets.push(this),this.attr("clip-path",'url("#'+this.clipper.attr("id")+'")')},unclip:function(){return delete this.clipper,this.attr("clip-path",null)}}),g.Gradient=g.invent({create:function(t){this.constructor.call(this,g.create(t+"Gradient")),this.type=t},inherit:g.Container,extend:{at:function(t,e,i){return this.put(new g.Stop).update(t,e,i)},update:function(t){return this.clear(),"function"==typeof t&&t.call(this,this),this},fill:function(){return"url(#"+this.id()+")"},toString:function(){return this.fill()},attr:function(t,e,i){return"transform"==t&&(t="gradientTransform"),g.Container.prototype.attr.call(this,t,e,i)}},construct:{gradient:function(t,e){return this.defs().gradient(t,e)}}}),g.extend(g.Gradient,g.FX,{from:function(t,e){return"radial"==(this._target||this).type?this.attr({fx:new g.Number(t),fy:new g.Number(e)}):this.attr({x1:new g.Number(t),y1:new g.Number(e)})},to:function(t,e){return"radial"==(this._target||this).type?this.attr({cx:new g.Number(t),cy:new g.Number(e)}):this.attr({x2:new g.Number(t),y2:new g.Number(e)})}}),g.extend(g.Defs,{gradient:function(t,e){return this.put(new g.Gradient(t)).update(e)}}),g.Stop=g.invent({create:"stop",inherit:g.Element,extend:{update:function(t){return("number"==typeof t||t instanceof g.Number)&&(t={offset:arguments[0],color:arguments[1],opacity:arguments[2]}),null!=t.opacity&&this.attr("stop-opacity",t.opacity),null!=t.color&&this.attr("stop-color",t.color),null!=t.offset&&this.attr("offset",new g.Number(t.offset)),this}}}),g.Pattern=g.invent({create:"pattern",inherit:g.Container,extend:{fill:function(){return"url(#"+this.id()+")"},update:function(t){return this.clear(),"function"==typeof t&&t.call(this,this),this},toString:function(){return this.fill()},attr:function(t,e,i){return"transform"==t&&(t="patternTransform"),g.Container.prototype.attr.call(this,t,e,i)}},construct:{pattern:function(t,e,i){return this.defs().pattern(t,e,i)}}}),g.extend(g.Defs,{pattern:function(t,e,i){return this.put(new g.Pattern).update(i).attr({x:0,y:0,width:t,height:e,patternUnits:"userSpaceOnUse"})}}),g.Doc=g.invent({create:function(t){t&&(t="string"==typeof t?e.getElementById(t):t,"svg"==t.nodeName?this.constructor.call(this,t):(this.constructor.call(this,g.create("svg")),t.appendChild(this.node),this.size("100%","100%")),this.namespace().defs())},inherit:g.Container,extend:{namespace:function(){return this.attr({xmlns:g.ns,version:"1.1"}).attr("xmlns:xlink",g.xlink,g.xmlns).attr("xmlns:svgjs",g.svgjs,g.xmlns)},defs:function(){if(!this._defs){var t;(t=this.node.getElementsByTagName("defs")[0])?this._defs=g.adopt(t):this._defs=new g.Defs,this.node.appendChild(this._defs.node)}return this._defs},parent:function(){return"#document"==this.node.parentNode.nodeName?null:this.node.parentNode},spof:function(t){var e=this.node.getScreenCTM();return e&&this.style("left",-e.e%1+"px").style("top",-e.f%1+"px"),this},remove:function(){return this.parent()&&this.parent().removeChild(this.node),this}}}),g.Shape=g.invent({create:function(t){this.constructor.call(this,t)},inherit:g.Element}),g.Bare=g.invent({create:function(t,e){if(this.constructor.call(this,g.create(t)),e)for(var i in e.prototype)"function"==typeof e.prototype[i]&&(this[i]=e.prototype[i])},inherit:g.Element,extend:{words:function(t){for(;this.node.hasChildNodes();)this.node.removeChild(this.node.lastChild);return this.node.appendChild(e.createTextNode(t)),this}}}),g.extend(g.Parent,{element:function(t,e){return this.put(new g.Bare(t,e))},symbol:function(){return this.defs().element("symbol",g.Container)}}),g.Use=g.invent({create:"use",inherit:g.Shape,extend:{element:function(t,e){return this.attr("href",(e||"")+"#"+t,g.xlink)}},construct:{use:function(t,e){return this.put(new g.Use).element(t,e)}}}),g.Rect=g.invent({create:"rect",inherit:g.Shape,construct:{rect:function(t,e){return this.put(new g.Rect).size(t,e)}}}),g.Circle=g.invent({create:"circle",inherit:g.Shape,construct:{circle:function(t){return this.put(new g.Circle).rx(new g.Number(t).divide(2)).move(0,0)}}}),g.extend(g.Circle,g.FX,{rx:function(t){return this.attr("r",t)},ry:function(t){return this.rx(t)}}),g.Ellipse=g.invent({create:"ellipse",inherit:g.Shape,construct:{ellipse:function(t,e){return this.put(new g.Ellipse).size(t,e).move(0,0)}}}),g.extend(g.Ellipse,g.Rect,g.FX,{rx:function(t){return this.attr("rx",t)},ry:function(t){return this.attr("ry",t)}}),g.extend(g.Circle,g.Ellipse,{x:function(t){return null==t?this.cx()-this.rx():this.cx(t+this.rx())},y:function(t){return null==t?this.cy()-this.ry():this.cy(t+this.ry())},cx:function(t){return null==t?this.attr("cx"):this.attr("cx",t)},cy:function(t){return null==t?this.attr("cy"):this.attr("cy",t)},width:function(t){return null==t?2*this.rx():this.rx(new g.Number(t).divide(2))},height:function(t){return null==t?2*this.ry():this.ry(new g.Number(t).divide(2))},size:function(t,e){var i=h(this,t,e);return this.rx(new g.Number(i.width).divide(2)).ry(new g.Number(i.height).divide(2))}}),g.Line=g.invent({create:"line",inherit:g.Shape,extend:{array:function(){return new g.PointArray([[this.attr("x1"),this.attr("y1")],[this.attr("x2"),this.attr("y2")]])},plot:function(t,e,i,n){return t="undefined"!=typeof e?{x1:t,y1:e,x2:i,y2:n}:new g.PointArray(t).toLine(),this.attr(t)},move:function(t,e){return this.attr(this.array().move(t,e).toLine())},size:function(t,e){var i=h(this,t,e);return this.attr(this.array().size(i.width,i.height).toLine())}},construct:{line:function(t,e,i,n){return this.put(new g.Line).plot(t,e,i,n)}}}),g.Polyline=g.invent({create:"polyline",inherit:g.Shape,construct:{polyline:function(t){return this.put(new g.Polyline).plot(t)}}}),g.Polygon=g.invent({create:"polygon",inherit:g.Shape,construct:{polygon:function(t){return this.put(new g.Polygon).plot(t)}}}),g.extend(g.Polyline,g.Polygon,{array:function(){return this._array||(this._array=new g.PointArray(this.attr("points")))},plot:function(t){return this.attr("points",this._array=new g.PointArray(t))},move:function(t,e){return this.attr("points",this.array().move(t,e))},size:function(t,e){var i=h(this,t,e);return this.attr("points",this.array().size(i.width,i.height))}}),g.extend(g.Line,g.Polyline,g.Polygon,{morphArray:g.PointArray,x:function(t){return null==t?this.bbox().x:this.move(t,this.bbox().y)},y:function(t){return null==t?this.bbox().y:this.move(this.bbox().x,t)},width:function(t){var e=this.bbox();return null==t?e.width:this.size(t,e.height)},height:function(t){var e=this.bbox();return null==t?e.height:this.size(e.width,t)}}),g.Path=g.invent({create:"path",inherit:g.Shape,extend:{morphArray:g.PathArray,array:function(){return this._array||(this._array=new g.PathArray(this.attr("d")))},plot:function(t){return this.attr("d",this._array=new g.PathArray(t))},move:function(t,e){return this.attr("d",this.array().move(t,e))},x:function(t){return null==t?this.bbox().x:this.move(t,this.bbox().y)},y:function(t){return null==t?this.bbox().y:this.move(this.bbox().x,t)},size:function(t,e){var i=h(this,t,e);return this.attr("d",this.array().size(i.width,i.height))},width:function(t){return null==t?this.bbox().width:this.size(t,this.bbox().height)},height:function(t){return null==t?this.bbox().height:this.size(this.bbox().width,t)}},construct:{path:function(t){return this.put(new g.Path).plot(t)}}}),g.Image=g.invent({create:"image",inherit:g.Shape,extend:{load:function(t){if(!t)return this;var i=this,n=e.createElement("img");return n.onload=function(){var e=i.parent(g.Pattern);null!==e&&(0==i.width()&&0==i.height()&&i.size(n.width,n.height),e&&0==e.width()&&0==e.height()&&e.size(i.width(),i.height()),"function"==typeof i._loaded&&i._loaded.call(i,{width:n.width,height:n.height,ratio:n.width/n.height,url:t}))},n.onerror=function(t){"function"==typeof i._error&&i._error.call(i,t)},this.attr("href",n.src=this.src=t,g.xlink)},loaded:function(t){return this._loaded=t,this},error:function(t){return this._error=t,this}},construct:{image:function(t,e,i){return this.put(new g.Image).load(t).size(e||0,i||e||0)}}}),g.Text=g.invent({create:function(){this.constructor.call(this,g.create("text")),this.dom.leading=new g.Number(1.3),this._rebuild=!0,this._build=!1,this.attr("font-family",g.defaults.attrs["font-family"])},inherit:g.Shape,extend:{x:function(t){return null==t?this.attr("x"):(this.textPath||this.lines().each(function(){this.dom.newLined&&this.x(t)}),this.attr("x",t))},y:function(t){var e=this.attr("y"),i="number"==typeof e?e-this.bbox().y:0;return null==t?"number"==typeof e?e-i:e:this.attr("y","number"==typeof t?t+i:t)},cx:function(t){return null==t?this.bbox().cx:this.x(t-this.bbox().width/2)},cy:function(t){return null==t?this.bbox().cy:this.y(t-this.bbox().height/2)},text:function(t){if("undefined"==typeof t){for(var t="",e=this.node.childNodes,i=0,n=e.length;i<n;++i)0!=i&&3!=e[i].nodeType&&1==g.adopt(e[i]).dom.newLined&&(t+="\n"),t+=e[i].textContent;return t}if(this.clear().build(!0),"function"==typeof t)t.call(this,this);else{t=t.split("\n");for(var i=0,s=t.length;i<s;i++)this.tspan(t[i]).newLine()}return this.build(!1).rebuild()},size:function(t){return this.attr("font-size",t).rebuild()},leading:function(t){return null==t?this.dom.leading:(this.dom.leading=new g.Number(t),this.rebuild())},lines:function(){var t=(this.textPath&&this.textPath()||this).node,e=g.utils.map(g.utils.filterSVGElements(t.childNodes),function(t){return g.adopt(t)});return new g.Set(e)},rebuild:function(t){if("boolean"==typeof t&&(this._rebuild=t),this._rebuild){var e=this,i=0,n=this.dom.leading*new g.Number(this.attr("font-size"));this.lines().each(function(){this.dom.newLined&&(this.textPath||this.attr("x",e.attr("x")),"\n"==this.text()?i+=n:(this.attr("dy",n+i),i=0))}),this.fire("rebuild")}return this},build:function(t){return this._build=!!t,this},setData:function(t){return this.dom=t,this.dom.leading=new g.Number(t.leading||1.3),this}},construct:{text:function(t){return this.put(new g.Text).text(t)},plain:function(t){return this.put(new g.Text).plain(t)}}}),g.Tspan=g.invent({create:"tspan",inherit:g.Shape,extend:{text:function(t){return null==t?this.node.textContent+(this.dom.newLined?"\n":""):("function"==typeof t?t.call(this,this):this.plain(t),this)},dx:function(t){return this.attr("dx",t)},dy:function(t){return this.attr("dy",t)},newLine:function(){var t=this.parent(g.Text);return this.dom.newLined=!0,this.dy(t.dom.leading*t.attr("font-size")).attr("x",t.x())}}}),g.extend(g.Text,g.Tspan,{plain:function(t){return this._build===!1&&this.clear(),this.node.appendChild(e.createTextNode(t)),this},tspan:function(t){var e=(this.textPath&&this.textPath()||this).node,i=new g.Tspan;return this._build===!1&&this.clear(),e.appendChild(i.node),i.text(t)},clear:function(){for(var t=(this.textPath&&this.textPath()||this).node;t.hasChildNodes();)t.removeChild(t.lastChild);return this},length:function(){return this.node.getComputedTextLength()}}),g.TextPath=g.invent({create:"textPath",inherit:g.Parent,parent:g.Text,construct:{path:function(t){for(var e=new g.TextPath,i=this.doc().defs().path(t);this.node.hasChildNodes();)e.node.appendChild(this.node.firstChild);return this.node.appendChild(e.node),e.attr("href","#"+i,g.xlink),this},plot:function(t){var e=this.track();return e&&e.plot(t),this},track:function(){var t=this.textPath();if(t)return t.reference("href")},textPath:function(){if(this.node.firstChild&&"textPath"==this.node.firstChild.nodeName)return g.adopt(this.node.firstChild)}}}),g.Nested=g.invent({create:function(){this.constructor.call(this,g.create("svg")),this.style("overflow","visible")},inherit:g.Container,construct:{nested:function(){return this.put(new g.Nested)}}}),g.A=g.invent({create:"a",inherit:g.Container,extend:{to:function(t){return this.attr("href",t,g.xlink)},show:function(t){return this.attr("show",t,g.xlink)},target:function(t){return this.attr("target",t)}},construct:{link:function(t){return this.put(new g.A).to(t)}}}),g.extend(g.Element,{linkTo:function(t){var e=new g.A;return"function"==typeof t?t.call(e,e):e.to(t),this.parent().put(e).put(this)}}),g.Marker=g.invent({create:"marker",inherit:g.Container,extend:{width:function(t){return this.attr("markerWidth",t)},height:function(t){return this.attr("markerHeight",t)},ref:function(t,e){return this.attr("refX",t).attr("refY",e)},update:function(t){return this.clear(),"function"==typeof t&&t.call(this,this),this},toString:function(){return"url(#"+this.id()+")"}},construct:{marker:function(t,e,i){return this.defs().marker(t,e,i)}}}),g.extend(g.Defs,{marker:function(t,e,i){return this.put(new g.Marker).size(t,e).ref(t/2,e/2).viewbox(0,0,t,e).attr("orient","auto").update(i)}}),g.extend(g.Line,g.Polyline,g.Polygon,g.Path,{marker:function(t,e,i,n){var s=["marker"];return"all"!=t&&s.push(t),s=s.join("-"),t=arguments[1]instanceof g.Marker?arguments[1]:this.doc().marker(e,i,n),this.attr(s,t)}});var y={stroke:["color","width","opacity","linecap","linejoin","miterlimit","dasharray","dashoffset"],fill:["color","opacity","rule"],prefix:function(t,e){return"color"==e?t:t+"-"+e}};["fill","stroke"].forEach(function(t){var e,i={};i[t]=function(i){if("undefined"==typeof i)return this;if("string"==typeof i||g.Color.isRgb(i)||i&&"function"==typeof i.fill)this.attr(t,i);else for(e=y[t].length-1;e>=0;e--)null!=i[y[t][e]]&&this.attr(y.prefix(t,y[t][e]),i[y[t][e]]);return this},g.extend(g.Element,g.FX,i)}),g.extend(g.Element,g.FX,{rotate:function(t,e,i){return this.transform({rotation:t,cx:e,cy:i})},skew:function(t,e,i,n){return 1==arguments.length||3==arguments.length?this.transform({skew:t,cx:e,cy:i}):this.transform({skewX:t,skewY:e,cx:i,cy:n})},scale:function(t,e,i,n){return 1==arguments.length||3==arguments.length?this.transform({scale:t,cx:e,cy:i}):this.transform({scaleX:t,scaleY:e,cx:i,cy:n})},translate:function(t,e){return this.transform({x:t,y:e})},flip:function(t,e){return this.transform({flip:t,offset:e})},matrix:function(t){return this.attr("transform",new g.Matrix(t))},opacity:function(t){return this.attr("opacity",t)},dx:function(t){return this.x((this instanceof g.FX?0:this.x())+t,!0)},dy:function(t){return this.y((this instanceof g.FX?0:this.y())+t,!0)},dmove:function(t,e){return this.dx(t).dy(e)}}),g.extend(g.Rect,g.Ellipse,g.Circle,g.Gradient,g.FX,{radius:function(t,e){var i=(this._target||this).type;return"radial"==i||"circle"==i?this.attr("r",new g.Number(t)):this.rx(t).ry(null==e?t:e)}}),g.extend(g.Path,{length:function(){return this.node.getTotalLength()},pointAt:function(t){return this.node.getPointAtLength(t)}}),g.extend(g.Parent,g.Text,g.FX,{font:function(t){for(var e in t)"leading"==e?this.leading(t[e]):"anchor"==e?this.attr("text-anchor",t[e]):"size"==e||"family"==e||"weight"==e||"stretch"==e||"variant"==e||"style"==e?this.attr("font-"+e,t[e]):this.attr(e,t[e]);return this}}),g.Set=g.invent({create:function(t){Array.isArray(t)?this.members=t:this.clear()},extend:{add:function(){var t,e,i=[].slice.call(arguments);for(t=0,e=i.length;t<e;t++)this.members.push(i[t]);return this},remove:function(t){var e=this.index(t);return e>-1&&this.members.splice(e,1),this},each:function(t){for(var e=0,i=this.members.length;e<i;e++)t.apply(this.members[e],[e,this.members]);return this},clear:function(){return this.members=[],this},length:function(){return this.members.length},has:function(t){return this.index(t)>=0},index:function(t){return this.members.indexOf(t)},get:function(t){return this.members[t]},first:function(){return this.get(0)},last:function(){return this.get(this.members.length-1)},valueOf:function(){return this.members},bbox:function(){var t=new g.BBox;if(0==this.members.length)return t;var e=this.members[0].rbox();return t.x=e.x,t.y=e.y,t.width=e.width,t.height=e.height,this.each(function(){t=t.merge(this.rbox())}),t}},construct:{set:function(t){return new g.Set(t)}}}),g.FX.Set=g.invent({create:function(t){this.set=t}}),g.Set.inherit=function(){var t,e=[];for(var t in g.Shape.prototype)"function"==typeof g.Shape.prototype[t]&&"function"!=typeof g.Set.prototype[t]&&e.push(t);e.forEach(function(t){g.Set.prototype[t]=function(){for(var e=0,i=this.members.length;e<i;e++)this.members[e]&&"function"==typeof this.members[e][t]&&this.members[e][t].apply(this.members[e],arguments);return"animate"==t?this.fx||(this.fx=new g.FX.Set(this)):this}}),e=[];for(var t in g.FX.prototype)"function"==typeof g.FX.prototype[t]&&"function"!=typeof g.FX.Set.prototype[t]&&e.push(t);e.forEach(function(t){g.FX.Set.prototype[t]=function(){for(var e=0,i=this.set.members.length;e<i;e++)this.set.members[e].fx[t].apply(this.set.members[e].fx,arguments);return this}})},g.extend(g.Element,{data:function(t,e,i){if("object"==typeof t)for(e in t)this.data(e,t[e]);else if(arguments.length<2)try{return JSON.parse(this.attr("data-"+t))}catch(e){return this.attr("data-"+t)}else this.attr("data-"+t,null===e?null:i===!0||"string"==typeof e||"number"==typeof e?e:JSON.stringify(e));return this}}),g.extend(g.Element,{remember:function(t,e){if("object"==typeof arguments[0])for(var e in t)this.remember(e,t[e]);else{if(1==arguments.length)return this.memory()[t];this.memory()[t]=e}return this},forget:function(){if(0==arguments.length)this._memory={};else for(var t=arguments.length-1;t>=0;t--)delete this.memory()[arguments[t]];return this},memory:function(){return this._memory||(this._memory={})}}),g.get=function(t){var i=e.getElementById(v(t)||t);return g.adopt(i)},g.select=function(t,i){return new g.Set(g.utils.map((i||e).querySelectorAll(t),function(t){return g.adopt(t)}))},g.extend(g.Parent,{select:function(t){return g.select(t,this.node)}});var w="abcdef".split("");if("function"!=typeof b){var b=function(t,i){i=i||{bubbles:!1,cancelable:!1,detail:void 0};var n=e.createEvent("CustomEvent");return n.initCustomEvent(t,i.bubbles,i.cancelable,i.detail),n};b.prototype=t.Event.prototype,t.CustomEvent=b}return function(e){for(var i=0,n=["moz","webkit"],s=0;s<n.length&&!t.requestAnimationFrame;++s)e.requestAnimationFrame=e[n[s]+"RequestAnimationFrame"],e.cancelAnimationFrame=e[n[s]+"CancelAnimationFrame"]||e[n[s]+"CancelRequestAnimationFrame"];e.requestAnimationFrame=e.requestAnimationFrame||function(t){var n=(new Date).getTime(),s=Math.max(0,16-(n-i)),r=e.setTimeout(function(){t(n+s)},s);return i=n+s,r},e.cancelAnimationFrame=e.cancelAnimationFrame||e.clearTimeout; -}(t),g}); \ No newline at end of file diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/loader.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/loader.js deleted file mode 100644 index e7a439076d99ddb4900f9a5a7e6255d79664455d..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/loader.js +++ /dev/null @@ -1,281 +0,0 @@ -/* loader.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.data = ysy.data || {}; -ysy.data.loader = ysy.data.loader || {}; -$.extend(ysy.data.loader, { - /* - * this object is responsible for downloading and preparing data from server - */ - _name: "Loader", - loaded: false, - inited: false, - issueIdListMap: {}, - _onChange: [], - init: function () { - var settings = ysy.settings; - var data = ysy.data; - if (settings.paths.rootPath.substr(-1) !== "/") { - settings.paths.rootPath += "/"; - } - if (!settings.project) { - settings.global = true; - } - if (settings.project) { - settings.projectID = parseInt(settings.project.id); - } - settings.zoom = new ysy.data.Data(); - settings.zoom.init({zoom: data.storage.getSavedZoom() || ysy.settings.defaultZoom || "day", _name: "Zoom"}); - settings.controls = new ysy.data.Data(); - settings.controls.init({controls: true, _name: "Task controls"}); - settings.baseline = new ysy.data.Data(); - settings.baseline.init({open: false, _name: "Baselines"}); - settings.critical = new ysy.data.Data(); - settings.critical.init({open: false, active: false, _name: "Critical path"}); - settings.addTask = new ysy.data.Data(); - settings.addTask.init({open: false, type: "issue", _name: "Add Task"}); - settings.resource = new ysy.data.Data(); - settings.resource.init({open: false, _name: "Resource Management"}); - settings.scheme = new ysy.data.Data(); - settings.scheme.init({by: ysy.settings.schemeBy, _name: "Schema switch"}); - settings.sumRow = new ysy.data.Data(); - settings.sumRow.init({_name: "SumRow"}); - settings.sample = new data.Data(); - data.limits = new data.Data(); - data.limits.init({_name: "Limits", openings: {}}); - data.relations = new data.Array().init({_name: "RelationArray"}); - data.issues = new data.Array().init({_name: "IssueArray"}); - data.milestones = new data.Array().init({_name: "MilestoneArray"}); - data.projects = new data.Array().init({_name: "ProjectArray"}); - data.baselines = new data.Array().init({_name: "BaselineArray"}); - ysy.view.patch(); - ysy.proManager.patch(); - settings.sample.init(); - this.inited = true; - }, - load: function () { - // second part of program initialization - this.loaded = false; - //this.projects=new ysy.data.Array; - //var data=ysy.availableProjects; - ysy.log.debug("load()", "load"); - if (ysy.settings.sample.active) { - ysy.pro.sample.loadSample(ysy.settings.sample.active); - } else { - ysy.gateway.loadGanttdata( - $.proxy(this._handleMainGantt, this), - function () { - ysy.log.error("Error: Unable to load data"); - } - ); - } - }, - loadSubEntity: function (type, id) { - if (type === "project") { - return this.loadProject(id); - } - }, - register: function (func, ctx) { - this._onChange.push({func: func, ctx: ctx}); - }, - /** - * - * @param {Array.<{id:int}>} array - * @param {Array.<int>} oldIds - * @return {Array.<{id:int}>} - */ - reorderArray: function (array, oldIds) { - var newArray = []; - var arrayPointer = 0; - for (var i = 0; i < array.length; i++) { - if (oldIds.length === i || oldIds[i] !== array[i].id) { - if (i > 0) { - newArray = array.slice(0, i); - arrayPointer = i; - oldIds = oldIds.slice(i); - } - break; - } - } - var banned = []; - for (i = 0; i < oldIds.length; i++) { - for (var j = arrayPointer; j < array.length; j++) { - if (array[j].id === oldIds[i]) { - newArray.push(array[j]); - banned.push(array[j]); - break; - } - } - } - for (i = arrayPointer; i < array.length; i++) { - if (banned.indexOf(array[i]) > -1) continue; - newArray.push(array[i]); - } - return newArray; - }, - _fireChanges: function (who, reason) { - for (var i = 0; i < this._onChange.length; i++) { - var ctx = this._onChange[i].ctx; - if (!ctx || ctx.deleted) { - this._onChange.splice(i, 1); - continue; - } - //this.onChangeNew[i].func(); - ysy.log.log("-- changes to " + (ctx.name ? ctx.name : ctx._name) + " widget"); - $.proxy(this._onChange[i].func, ctx)(); - } - }, - _handleMainGantt: function (data) { - if (!data.easy_gantt_data) return; - var json = data.easy_gantt_data; - ysy.log.debug("_handleGantt()", "load"); - // -- LIMITS -- - //ysy.data.limits.set({ // TODO - // start_date: moment(json.start_date, "YYYY-MM-DD"), - // end_date: moment(json.end_date, "YYYY-MM-DD") - //}); - // -- COLUMNS -- - ysy.data.columns = json.columns; - // ARRAY INITIALIZATION - // -- RELATIONS -- - ysy.data.relations.clear(); - // -- ISSUES -- - ysy.data.issues.clear(); - // -- MILESTONES -- - ysy.data.milestones.clear(); - // -- PROJECTS -- - ysy.data.projects.clear(); - // ARRAY FILLING - // -- PROJECTS -- - this._loadProjects(json.projects); - // -- ISSUES -- - this._loadIssues(json.issues, "root"); - // -- MILESTONES -- - this._loadMilestones(json.versions); // after issue loading because of shared milestones - // -- RELATIONS -- - this._loadRelations(json.relations); - this._loadHolidays(json.holidays); - // -- SCHEMES -- - if (this._loadSchemes) this._loadSchemes(json.schemes); - - ysy.log.debug("data loaded", "load"); - ysy.log.message("JSON loaded"); - this._fireChanges(); - ysy.history.clear(); - this.loaded = true; - }, - _loadIssues: function (json, rootId) { - if (!json) return; - if (rootId) { - if (this.issueIdListMap[rootId]) { - json = ysy.data.loader.reorderArray(json, this.issueIdListMap[rootId]); - } - this.issueIdListMap[rootId] = json.map(function (item) { - return item.id; - }); - } - var issues = ysy.data.issues; - for (var i = 0; i < json.length; i++) { - var issue = new ysy.data.Issue(); - issue.init(json[i]); - issues.pushSilent(issue); - } - issues._fireChanges(this, "load"); - }, - _loadRelations: function (json) { - if (!json) return; - var relations = ysy.data.relations; - var allowedTypes = { - precedes: true, - finish_to_finish: true, - start_to_start: true, - start_to_finish: true - }; - for (var i = 0; i < json.length; i++) { - // TODO enable other relation types - if (allowedTypes[json[i].type]) { - var rela = new ysy.data.Relation(); - } else { - rela = new ysy.data.SimpleRelation(); - } - rela.init(json[i]); - relations.pushSilent(rela); - } - relations._fireChanges(this, "load"); - }, - _loadMilestones: function (json) { - if (!json) return; - var milestones = ysy.data.milestones; - for (var i = 0; i < json.length; i++) { - var mile = new ysy.data.Milestone(); - mile.init(json[i]); - milestones.pushSilent(mile); - - var issues = mile.getIssues(); - var projectIds = {}; - for (var j = 0; j < issues.length; j++) { - projectIds[issues[j].project_id] = true; - } - delete projectIds[mile.project_id]; - var sharedForIds = Object.getOwnPropertyNames(projectIds); - if (sharedForIds.length === 0) continue; - var realProjectId = json[i].project_id; - delete json[i].project_id; - for (j = 0; j < sharedForIds.length; j++) { - var sharedMile = new ysy.data.SharedMilestone(); - $.extend(sharedMile, { - project_id: parseInt(sharedForIds[j]), - real_project_id: realProjectId, - real_milestone: milestones.getByID(mile.id) - }); - sharedMile.init(json[i]); - milestones.pushSilent(sharedMile); - } - } - milestones._fireChanges(this, "load"); - }, - _loadProjects: function (json) { - if (!json) return; - var projects = ysy.data.projects; - //var main_id = ysy.settings.projectID; - for (var i = 0; i < json.length; i++) { - //if (json[i].id === main_id) continue; - var project = new ysy.data.Project(); - project.init(json[i]); - projects.pushSilent(project); - } - projects._fireChanges(this, "load"); - var openings = ysy.data.limits.openings; - for (var id in openings) { - if (!openings.hasOwnProperty(id)) continue; - if (ysy.main.startsWith(id, "p")) { - var realId = id.substring(1); - project = projects.getByID(realId); - if (!project) continue; - if (!project.needLoad) continue; - project.needLoad = false; - this.loadProject(realId); - } else if (this.openIssuesOfProject && ysy.main.startsWith(id, "s")) { - realId = id.substring(1); - if (!openings["p" + realId]) continue; - this.openIssuesOfProject(realId); - } - } - }, - _loadHolidays: function (json) { - if (!json) return; - ysy.settings.holidays = json; - ysy.view.initNonworkingDays(); - }, - loadProject: function () { - } - -}); -if (!ysy.gateway) ysy.gateway = {}; -$.extend(ysy.gateway, { - loadGanttdata: function (callback, fail) { - $.getJSON(ysy.settings.paths.mainGantt) - .done(callback) - .fail(fail); - } -}); diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/logger.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/logger.js deleted file mode 100644 index fe2c435713635790e404459c15ca91b06d6bc281..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/logger.js +++ /dev/null @@ -1,92 +0,0 @@ -/* logger.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.log = { - logLevel: 2, - mainDebug: "", - debugTypes: [ - // "refresher", - // "critical", - // "canvas_bg", - // "set", - // "baseline", - // "baseline_render", - // "inline", - // "print", - // "move_task", - // "add_task", - // "add_task_marker", - // "taskModal", - // "date_format", - // "date_helper", - // "date", - // "tooltip", - // "send", - // "load", - // "supersend", - // "scroll", - // "scrollRender", - // "grid_resize", - // "task_drag", - // "asc", - // "task_push", - // "link_render", - // "outer", - // "sort", - // "link_config", - // "link_drag", - // "empty_field", - // "task_drag_milestone", - // "widget_destroy", - // "resource", - // "summer", - "nothing" - ], - log: function (text) { - if (this.logLevel >= 4) { - this.print(text); - } - }, - message: function (text) { - if (this.logLevel >= 3) { - this.print(text); - } - }, - debug: function (text, type) { - if (type) { - if (this.mainDebug === type) { - this.print(text, "debug"); - return; - } - for (var i = 0; i < this.debugTypes.length; i++) { - if (this.debugTypes[i] === type) { - this.print(text, type === this.mainDebug ? "debug" : null); - return; - } - } - } else { - this.print(text, "debug"); - } - }, - warning: function (text) { - if (this.logLevel >= 2) { - this.print(text, "warning"); - } - }, - error: function (text) { - if (this.logLevel >= 1) { - this.print(text, "error"); - } - }, - print: function (text, type) { - if (type === "error") { - console.error(text); - } else if (type === "warning") { - console.warn(text); - } else if (type === "debug") { - console.debug(text); - } else { - console.log(text); - } - } -}; \ No newline at end of file diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/main.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/main.js deleted file mode 100644 index 7df2f744a7945bdda1f5e571ec3d936976fca198..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/main.js +++ /dev/null @@ -1,15 +0,0 @@ -/* main.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.main = ysy.main || {}; -ysy.initGantt = function () { - $("p.nodata").remove(); - ysy.data.loader.init(); - ysy.data.loader.load(); - ysy.data.storage.init(); - if (!ysy.settings.easyRedmine) { - moment.locale(ysy.settings.language || "en"); - } - ysy.view.start(); - //ysy.main.start(); -}; diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/panel_widget.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/panel_widget.js deleted file mode 100644 index 75498b6ac75710be6a3478f5f95ec64bb6e2668d..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/panel_widget.js +++ /dev/null @@ -1,445 +0,0 @@ -/* panel_widget.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.view = ysy.view || {}; - -ysy.view.Toolbars = function () { - ysy.view.Widget.call(this); -}; -ysy.main.extender(ysy.view.Widget, ysy.view.Toolbars, { - name: "ToolbarsWidget", - template: "", - childTargets: { - "SuperPanelWidget": "#supertop_panel", - "BottomPanelWidget": "#gantt_footer_buttons", - "BaselinePanelWidget": "#baseline_panel", - "CriticalPanelWidget": "#critical_panel", - "AddTaskPanelWidget": "#add_task_panel", - "LegendWidget": "#easy_gantt_footer_legend", - "ToolPanelWidget": "#easy_gantt_tool_panel", - "CollapsorsWidget": "#gantt_cont", - "AffixWidget": "#easy_gantt_menu" - }, - _updateChildren: function () { - if (this.children.length > 0) { - return; - } - if (ysy.view.SuperPanel) { - var superpanel = new ysy.view.SuperPanel(); - superpanel.init(ysy.settings.sample); - this.children.push(superpanel); - } - - var toppanel = new ysy.view.AllButtons(); - toppanel.init(); - this.children.push(toppanel); - - ysy.proManager.fireEvent("initToolbar", this); - - var legend = new ysy.view.Legend(); - legend.init(null); - this.children.push(legend); - - var collapsors = new ysy.view.Collapsors(); - collapsors.init(null); - ysy.view.collapsors = collapsors; - this.children.push(collapsors); - - if (window.affix || !ysy.settings.easyRedmine) { - var affix = new ysy.view.Affix(); - ysy.view.affix = affix; - affix.init(); - this.children.push(affix); - } else { - ysy.view.affix = { - requestRepaint: function () { - } - }; - } - - }, - _repaintCore: function () { - for (var i = 0; i < this.children.length; i++) { - var child = this.children[i]; - this.setChildTarget(child, i); - child.repaint(true); - } - }, - setChildTarget: function (child/*, i*/) { - if (this.childTargets[child.name]) { - child.$target = this.$target.find(this.childTargets[child.name]); - } - } -}); -//############################################################################################# -ysy.view.AllButtons = function () { - ysy.view.Widget.call(this); -}; -ysy.main.extender(ysy.view.Widget, ysy.view.AllButtons, { - name: "AllButtonsWidget", - templateName: "AllButtons", - extendees: { - test: { - func: function () { - ysy.test.run(); - }, on: true, - hid: true - }, - back: { - bind: function () { - this.model = ysy.history; - }, - func: function () { - ysy.history.revert(); - }, - isDisabled: function () { - return ysy.history.isEmpty(); - } - - }, - save: { - bind: function () { - this.model = ysy.history; - this.sample = ysy.settings.sample; - this._register(this.sample); - }, - func: function () { - if (ysy.settings.sample.active) { - ysy.data.loader.load(); - return; - } - var $content =$(".easy-content-page"); - var height = $content.height(); - $content.css({"height": height}); - if (this.timeoutSubscription){ - window.clearTimeout(this.timeoutSubscription); - } - this.timeoutSubscription = window.setTimeout(function(){ - $content.css({"height": ""}); - },5000); - ysy.data.save(); - }, - specialRepaint: function () { - var button_labels = ysy.view.getLabel("buttons"); - if (ysy.settings.sample.active) { - var label = button_labels.button_reload; - } else { - label = button_labels.button_save; - } - this.$target.children().html(label); - }, - //isHidden:function(){return ysy.settings.sample.active;}, - isDisabled: function () { - return this.model.isEmpty() - }, - timeoutSubscription: 0 - }, - day_zoom: { - value: "day", - bind: function () { - this.model = ysy.settings.zoom; - }, - func: function () { - if (ysy.settings.zoom.setSilent("zoom", this.value)) ysy.settings.zoom._fireChanges(this, this.value); - }, - isOn: function () { - return ysy.settings.zoom.zoom === this.value; - } - }, - week_zoom: { - value: "week", - bind: function () { - this.model = ysy.settings.zoom; - }, - func: function () { - if (ysy.settings.zoom.setSilent("zoom", this.value)) ysy.settings.zoom._fireChanges(this, this.value); - }, - isOn: function () { - return ysy.settings.zoom.zoom === this.value; - } - }, - month_zoom: { - value: "month", - bind: function () { - this.model = ysy.settings.zoom; - }, - func: function () { - if (ysy.settings.zoom.setSilent("zoom", this.value)) ysy.settings.zoom._fireChanges(this, this.value); - }, - isOn: function () { - return ysy.settings.zoom.zoom === this.value; - } - }, - task_control: { - bind: function () { - this.model = ysy.settings.controls; - }, - func: function () { - ysy.settings.controls.setSilent("controls", !this.isOn()); - ysy.settings.controls._fireChanges(this, !this.isOn()); - //this.on=!$(".gantt_bars_area").toggleClass("no_task_controls").hasClass("no_task_controls"); - $(".gantt_bars_area").toggleClass("no_task_controls"); - this.requestRepaint(); - }, - isOn: function () { - return ysy.settings.controls.controls; - }, - isHidden: function () { - // return !ysy.settings.permissions.allowed("edit_easy_gantt", "edit_issues"); - return false; - } - }, - resource_help: {}, - add_task_help: {}, - baseline_help: {}, - critical_help: {}, - print: { - func: function () { - return ysy.pro.print.directPrint(this); - }, - isOn: function () { - return ysy.pro.print.printPreparing; - }, - forceRepaint:function () { - this.requestRepaint(); - this.repaint(); - } - }, - jump_today: { - func: function () { - gantt.showDate(moment()); - } - } - }, - _updateChildren: function () { - var children = []; - this.$target = $("#content"); - //var spans=this.$target.children("span"); - for (var elid in this.extendees) { - if (!this.extendees.hasOwnProperty(elid)) continue; - var extendee = this.extendees[elid]; - var button; - if (extendee.widget) { - button = new extendee.widget(); - } else { - button = new ysy.view.Button(); - } - $.extend(button, extendee, {elid: elid}); - if (!this.getChildTarget(button, elid).length) continue; - button.init(); - children.push(button); - } - this.children = children; - }, - out: function () { - //return {buttons:this.child_array}; - }, - _repaintCore: function () { - for (var i = 0; i < this.children.length; i++) { - var child = this.children[i]; - this.setChildTarget(child, i); - child.repaint(true); - } - }, - setChildTarget: function (child /*,i*/) { - child.$target = this.getChildTarget(child); - }, - getChildTarget: function (child, elid) { - if (!elid) elid = child.elid; - return this.$target.find("#" + child.elementPrefix + elid); - } -}); -//############################################################################## -ysy.view.Button = function () { - ysy.view.Widget.call(this); - this.on = false; - this.disabled = false; - this.func = function () { - var div = $(this.$target).next('div'); - var x = div.clone().attr({"id": div[0].id + "_popup"}).appendTo($("body")); - showModal(x[0].id); - //var template=ysy.view.getTemplate("easy_unimplemented"); - //var rendered=Mustache.render(template, {modal: ysy.view.getLabel("soon_"+this.elid)}); - //$("#ajax-modal").html(rendered); // REPAINT - //window.showModal("ajax-modal"); - } -}; -ysy.main.extender(ysy.view.Widget, ysy.view.Button, { - name: "ButtonWidget", - templateName: "Button", - elementPrefix: "button_", - _replace: true, - init: function () { - this.name = (this.elid || this.id) + this.name; - this.name = this.name.charAt(0).toUpperCase() + this.name.slice(1); - if (this.bind) { - this.bind(); - } - if (this.model) { - this._register(this.model); - } - //this.tideFunctionality(); - return this; - }, - tideFunctionality: function () { - if (this.func && !this.isDisabled() && (!this.$target.is("a") || this.$target.attr("href") === "javascript:void(0)")) { - this.$target.off("click").on("click", $.proxy(this.func, this)); - } - }, - isHidden: function () { - return this.hid; - }, - _repaintCore: function () { - var target = this.$target; - var hidden = this.isHidden(); - target.toggle(!hidden); - if (hidden) { - if (this.specialRepaint) { - this.specialRepaint(hidden); - } - return; - } - if (this.isDisabled()) { - target.addClass("disabled"); - target.removeClass("active"); - } else { - target.removeClass("disabled"); - if (this.isOn()) { - target.addClass("active"); - } else { - target.removeClass("active"); - } - } - if (this.specialRepaint) { - this.specialRepaint(); - } - this.tideFunctionality(); - }, - isOn: function () { - return this.on; - }, - isDisabled: function () { - return this.disabled; - } -}); -//############################################################################## -ysy.view.Select = function () { - ysy.view.Button.call(this); -}; -ysy.main.extender(ysy.view.Button, ysy.view.Select, { - name: "SelectWidget", - templateName: "Select", - elementPrefix: "select_", - _repaintCore: function () { - var target = this.$target; - var hidden = this.isHidden(); - target.toggle(!hidden); - if (hidden) { - if (this.specialRepaint) { - this.specialRepaint(hidden); - } - return; - } - target.prop('disabled', this.isDisabled()); - target.val(this.modelValue()); - if (this.specialRepaint) { - this.specialRepaint(); - } - this.tideFunctionality(); - }, - tideFunctionality: function () { - if (this.func && !this.isDisabled()) { - this.$target.off("change").on("change", $.proxy(this.func, this)); - } - }, - modelValue: function () { - return ""; - } -}); -//############################################################################## -ysy.view.CheckBox = function () { - ysy.view.Button.call(this); -}; -ysy.main.extender(ysy.view.Button, ysy.view.CheckBox, { - name: "CheckBoxWidget", - elementPrefix: "checkbox_", - _repaintCore: function () { - var target = this.$target; - var hidden = this.isHidden(); - target.toggle(!hidden); - if (hidden) { - if (this.specialRepaint) { - this.specialRepaint(hidden); - } - return; - } - target.prop('disabled', this.isDisabled()); - target.prop('checked', this.isOn()); - if (this.specialRepaint) { - this.specialRepaint(); - } - this.tideFunctionality(); - }, - tideFunctionality: function () { - if (this.func && !this.isDisabled()) { - this.$target.off("change").on("change", $.proxy(this.func, this)); - } - } -}); -//#################################################### -ysy.view.Legend = function () { - ysy.view.Widget.call(this); -}; -ysy.main.extender(ysy.view.Widget, ysy.view.Legend, { - name: "LegendWidget", - templateName: "legend", - _postInit: function () { - }, - out: function () { - return null; - //return {text: "Legend for EasyGantt"}; - } -}); -//################################################### -ysy.view.Affix = function () { - ysy.view.Widget.call(this); - this.offset = 0; -}; -ysy.main.extender(ysy.view.Widget, ysy.view.Affix, { - name: "AffixWidget", - init: function () { - this.$document = $(document); - this.$superPanel = $("#supertop_panel"); - this.$cont = $("#gantt_cont"); - this.$document.on("scroll", $.proxy(this.requestRepaint, this)); - $(window).on("resize", $.proxy(this.requestRepaint, this)); - if (ysy.settings.easyRedmine) { - this.offset += $("#top-menu").outerHeight(); - } - this.bottomFixed = false; - //this._updateChildren(); - }, - _repaintCore: function () { - var top = this.$document.scrollTop() + this.offset - this.$superPanel.offset().top - this.$superPanel.outerHeight(); - top = Math.max(Math.floor(top), 0); - this.setPosition(top); - var box = this.$cont[0].getBoundingClientRect(); - - if (box.bottom > window.innerHeight) { - if (!this.bottomFixed) { - // this.$cont.find(".gantt_hor_scroll").css({position: "fixed", top: (window.innerHeight - 15) + "px"}); - this.$cont.find(".gantt_hor_scroll").css({position: "fixed", bottom: "0"}); - this.bottomFixed = true; - } - } else { - if (this.bottomFixed) { - this.$cont.find(".gantt_hor_scroll").css({position: "relative", bottom: ""}); - this.bottomFixed = false; - } - } - }, - setPosition: function (top) { - this.$target.css({transform: "translate(0, " + top + "px)"}); - this.$cont.find(".gantt_grid_scale, .gantt_task_scale").css({transform: "translate(0, " + (top - 1) + "px)"}); - } -}); diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/print.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/print.js deleted file mode 100644 index ee279c30ec558dc68fc9d7bdef55299ba0736f02..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/print.js +++ /dev/null @@ -1,277 +0,0 @@ -/* print.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.pro = ysy.pro || {}; -ysy.pro.print = { - printPrepared: false, - printPreparing: false, - patch: function () { - var self = this; - var mediaQueryList = window.matchMedia('print'); - mediaQueryList.addListener(function (mql) { - if (mql.matches) { - // self.beforePrint(); - } else { - self.afterPrint(); - } - }); - // window.onbeforeprint = $.proxy(this.beforePrint, this); - window.onafterprint = $.proxy(this.afterPrint, this); - - window.easyModel = window.easyModel || {}; - window.easyModel.print = window.easyModel.print || {}; - window.easyModel.print.functions = window.easyModel.print.functions || []; - - window.easyModel.print.functions.push(this.printToTemplate); - }, - directPrint: function (buttonWidget) { - var self = this; - self.printPreparing = true; - buttonWidget.forceRepaint(); - setTimeout(function () { - self.beforePrint(); - self.printPreparing = false; - buttonWidget.forceRepaint(); - window.print(); - // self.afterPrint(); - }, 30); - }, - beforePrint: function (stripWidth) { - var self = ysy.pro.print; - if (self.printPrepared) return; - var $wrapper2 = $("#wrapper2"); - var $wrapper3 = $("#wrapper3"); - if (ysy.view.affix.setPosition) { - ysy.view.affix.setPosition(0); - } - $("#print_area").remove(); - var $print = $('<div id="print_area" class="' + (ysy.settings.easyRedmine ? "easy" : "redmine") + ' gantt-print__area"></div>'); - - // if (ysy.settings.project) { - // var headerText = '<h1 class="gantt-print__header-header gantt-print__header-project">' + ysy.settings.project.name + '</h1>' - // + '<h2 class="gantt-print__header-header gantt-print__header-plugin"> - ' - // + (ysy.settings.resource.open ? ysy.settings.labels.titles.title_rm : ysy.settings.labels.titles.easyGantt) - // + '</h2>'; - // } else { - // headerText = '<h1 class="gantt-print__header-header gantt-print__header-plugin">' - // + (ysy.settings.resource.open ? ysy.settings.labels.titles.title_rm : ysy.settings.labels.titles.easyGantt) - // + '</h1>'; - // } - // var $headerCont = $('<div class="gantt-print__header-cont"></div>'); - // $headerCont.html(headerText); - - var $gantt = $('<div class="gantt-print__gantt"></div>'); - $print.append($gantt); - var fullWidth = gantt._tasks.full_width; - stripWidth = stripWidth || 490; - var $grid = self.cloneGrid(); - // $print.prepend($headerCont); - $gantt.append($grid); - var gridWidth = $grid.outerWidth(); - for (var p = -gridWidth; p < fullWidth; p += stripWidth) { - $gantt.append(self.createStrip(p < 0 ? 0 : p, Math.min(p + stripWidth, fullWidth))); - //p -= 2; - } - // $(".gantt-print__strip, .gantt-print__grid").css("margin-top", $headerCont.height() + 5); - $wrapper3.hide(); - $(".gantt_hor_scroll").hide(); - $wrapper2.append($print); - $("body").addClass("gantt-print__body"); - self.printPrepared = true; - - }, - afterPrint: function () { - setTimeout(function () { - if (!ysy.pro.print.printPrepared) return; - $("body").removeClass("gantt-print__body"); - $("#print_area").remove(); - - $("#wrapper3").show(); - $("#content, #sidebar").removeClass("fake-responsive"); - - gantt._scroll_resize(); - ysy.pro.print.printPrepared = false; - }, 100); - }, - printToTemplate: function () { - var printFit = $("#easy_gantt_print_fit_checkbox").is(":checked"); - ysy.pro.print.beforePrint(printFit ? Infinity : undefined); - - var width = $(".gantt_container").width(); - var content = $("#print_area").html() + ysy.view.templates.printIncludes; - // TODO add easy_gantt_pro.css - // TODO add easy_gantt_resources.css - - if (printFit) { - content = '<div class="easy-print-page-fitting gantt-print__template--nowrap">' + content + '</div>'; - } - - // window.easyModel.print.tokens['easy_gantt_current_base64'] = $.base64.encode(content); - window.easyModel.print.tokens['easy_gantt_current'] = content; - window.easyModel.print.setWidth(width); - ysy.pro.print.afterPrint(); - }, - cloneGrid: function () { - var $gantt_cont = $("#gantt_cont"); - var $grid = $gantt_cont.find(".gantt_grid").clone().addClass("gantt-print__grid"); - $grid.find("a").each(function () { - var $this = $(this); - $this.parent().append('<span class="' + this.className + '">' + $this.text() + '</span>'); - $this.remove(); - }); - var $gridScale = $grid.find(".gantt_grid_scale"); - $gridScale.css({height: $gridScale.height() + 1 + "px", transform: "none"}); - return $grid; - }, - createStrip: function (start, end) { - if (end <= start) return null; - var $gantt_cont = $("#gantt_cont"); - var $gantt_task = $gantt_cont.find(".gantt_task"); - var $strip = $('<div class="gantt-print__strip" style="width:' + (end - start) + 'px"></div>'); - // SCALE LINE - $strip.append(this.cloneScales($gantt_task, start, end)); - - // DATA AREA - var $gantt_data_area = $gantt_cont.find(".gantt_data_area"); - var $data = $('<div class="gantt_data_area"></div>').css({ - height: $gantt_data_area.height() + "px", - width: (end - start) + "px" - }); - // BACKGROUND - $data.append(this.cloneSvgBackground($gantt_data_area, start, end)); - - // TASKS - $data.append(this.cloneTasks($gantt_data_area, start, end)); - // LINKS - $data.append(this.cloneLinks($gantt_data_area, start, end)); - - $strip.append($data); - - return $strip; - }, - cloneScales: function ($source, start, end) { - var $scale = $( - '<div class="gantt_task_scale gantt-print__scale"></div>'); - var lines = $source.find(".gantt_scale_line"); - for (var l = 0; l < lines.length; l++) { - var oldLine = $(lines[l]); - var cells = oldLine.find(".gantt_scale_cell"); - var $line = $('<div class="gantt_scale_line gantt-print__scale-line"></div>'); - $line[0].style.height = lines[l].style.height; - $line[0].style.lineHeight = lines[l].style.lineHeight; - //$line.style.height=oldLine.style.height; - //$line.style.lineHeight=oldLine.style.lineHeight; - //$line.height(oldLine.height()); - var leftPointer = 0; - var first = false; - for (var i = 0; i < cells.length; i++) { - var oldCell = $(cells[i]); - var width = oldCell.outerWidth(); - if (leftPointer < end && leftPointer + width > start) { - var $cell = oldCell.clone(); - $line.append($cell); - if (first === false) { - first = true; - $cell.css("margin-left", (leftPointer - start) + "px"); - } - } - leftPointer += width; - } - $line.width(leftPointer); - - $scale.append($line); - } - return $scale; - }, - cloneSvgBackground: function ($source, startX, endX) { - var $background = $('<div class="gantt_task_bg gantt-print__bg" style="width:' + (endX - startX) + 'px"></div>'); - var svg = SVG($background[0]); - $(svg.node).css({position: "absolute"}); - var itemIds = gantt._order; - var items = itemIds.map(function (itemId) { - return gantt._pull[itemId]; - }); - - - var cfg = gantt._tasks; - var fullHeight = itemIds.length * cfg.height; - var colWidth = cfg.col_width; - var countX = cfg.count; - var countY = items.length; - var endCountX = Math.ceil(endX / colWidth); - var startCountX = Math.floor(startX / colWidth); - if (endCountX > countX) { - endCountX = countX; - } - gantt._backgroundRenderer._render_bg_canvas(svg, items, { - fromX: startCountX, - toX: endCountX, - fromY: 0, - toY: countY - }); - svg.node.style.left = (cfg.left[startCountX] - startX) + "px"; - return $background.height(fullHeight); - }, - cloneLinks: function ($source, start, end) { - var $gantt_links_area = $source.find(".gantt_links_area"); - var $links = $gantt_links_area - .clone() - .addClass("gantt-print__links-area") - .css('left', -start + 'px'); - $links.find(".gantt_task_link > div").filter(function () { - var left = parseInt(this.style.left); - var width = parseInt(this.style.width || 10); - //ysy.log.debug("start: " + (left + width) + "<" + start + - // " end: " + left + ">" + end + - // " filtered = " + (left > end || left + width < start)); - return (left > end || left + width < start); - }).remove(); - return $links; - }, - cloneTasks: function ($source, start, end) { - var $gantt_bars_area = $source.find(".gantt_bars_area"); - var $tasks = $($gantt_bars_area[0].cloneNode(false)) - .addClass("gantt-print__bars-area") - .css('left', -start + 'px'); - var taskArray = $gantt_bars_area.children(); - for (var i = 0; i < taskArray.length; i++) { - var task = taskArray[i]; - var left = parseInt(task.style.left) - 50; - var width = task.offsetWidth + 300; - // ysy.log.debug(JSON.stringify({text: $(task).text(), start: (left + task.offsetWidth) + "<" + start, end: left + ">" + end})); - if (left >= end || left + width <= start) continue; - $tasks.append($(task).clone()); - } - var sourceCanvases = $gantt_bars_area.find("canvas"); - if (sourceCanvases.length > 0) { - var clonedCanvases = $tasks.find("canvas"); - for (i = 0; i < clonedCanvases.length; i++) { - clonedCanvases[i].getContext('2d').drawImage(sourceCanvases[i], 0, 0); - } - } - return $tasks; - } -}; -//###################################################################################################################### -ysy.pro = ysy.pro || {}; -ysy.pro.pdfPrint = ysy.pro.pdfPrint || {}; -$.extend(ysy.pro.pdfPrint, { - beats: 0, - targetBeat: 2, - patch: function () { - if (!ysy.settings.pdfPrint) return; - ysy.data.loader.register(function () { - ysy.view.onRepaint.push($.proxy(this.repaint, this)); - }, this); - }, - repaint: function () { - if (this.beats > this.targetBeat) return; - // skip first few renders - if (this.beats === this.targetBeat) { - gantt._backgroundRenderer.switchFullRender(true); - gantt._unset_sizes(); - // window.print(); - } - this.beats++; - } -}); diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/pro_manager.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/pro_manager.js deleted file mode 100644 index 7cb039ac3e2b5419d6480f89720fb548715a4f73..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/pro_manager.js +++ /dev/null @@ -1,72 +0,0 @@ -/* pro_manager.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.proManager = ysy.proManager || {}; -ysy.pro = ysy.pro || {}; -$.extend(ysy.proManager, { - proFunctionsMap: {}, - name:"proManager", - patch: function () { - window.ysy = window.ysy || {}; - ysy.settings = ysy.settings || {}; - for (var key in ysy.pro) { - if (!ysy.pro.hasOwnProperty(key)) continue; - if (ysy.pro[key].patch) { - ysy.pro[key].patch(); - } - } - }, - forEachPro: function (wrapperFunc, event) { - var proFunctions = this.proFunctionsMap[event]; - if (!proFunctions) return; - for (var i = 0; i < proFunctions.length; i++) { - wrapperFunc.call(this, proFunctions[i]); - } - }, - fireEvent: function (event) { - var proFunctions = this.proFunctionsMap[event]; - if (!proFunctions) return; - var slicedArgs = Array.prototype.slice.call(arguments, 1); - for (var i = 0; i < proFunctions.length; i++) { - proFunctions[i].apply(this, slicedArgs); - } - }, - register: function (event, func) { - if (!func) throw "missing call function"; - var eventList = this.proFunctionsMap[event]; - if (!eventList) this.proFunctionsMap[event] = eventList = []; - for (var i = 0; i < eventList.length; i++) { - if (eventList[i] === func) { - return; - } - } - eventList.push(func); - }, - unregister: function (event, func) { - var eventList = this.proFunctionsMap[event]; - if (!eventList) return; - for (var i = 0; i < eventList.length; i++) { - if (eventList[i] === func) { - eventList.splice(i, 1); - return; - } - } - }, - showHelp: function () { - var div = $(this).next(); - var x = div.clone().attr({"id": div[0].id + "_popup"}).appendTo($("body")); - showModal(x[0].id); - }, - closeAll: function (except) { - this.forEachPro(function (func) { - if (except.close !== func) func.call(this,except); - }, "close"); - }, - eventFilterTask: function (id, task) { - var ret = true; - this.forEachPro(function (func) { - if (ret) ret = func(id, task); - }, "filterTask"); - return ret; - } -}); diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/problem_finder.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/problem_finder.js deleted file mode 100644 index 2ad0f3677d96ca3596fd8f729d11934b5478fafb..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/problem_finder.js +++ /dev/null @@ -1,172 +0,0 @@ -/* problem_finder.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.pro = ysy.pro || {}; -ysy.pro.problemFinder = $.extend(ysy.pro.problemFinder, { - patch: function () { - var setting = new ysy.data.Data(); - setting.init({ - _name: "Problem finder", - opened: false, - issueProblems: [], - relationProblems: [] - }); - ysy.settings.problemFinder = setting; - ysy.data.issues.childRegister(function () { - ysy.pro.problemFinder.recalculateProblemsInIssues.call(this); - ysy.pro.problemFinder.recalculateProblemsInRelations.call(this); - }, setting); - ysy.data.relations.childRegister(this.recalculateProblemsInRelations, setting); - ysy.data.issues.register(this.recalculateProblemsInIssues, setting); - ysy.data.projects.register(this.recalculateProblemsInIssues, setting); - ysy.data.relations.register(this.recalculateProblemsInRelations, setting); - ysy.proManager.register("close", this.close); - - ysy.view.AllButtons.prototype.extendees.problem_finder = { - widget: ysy.view.ProblemFinder, - bind: function () { - this.model = setting; - }, - func: function () { - this.model.setSilent({opened: !this.model.opened}); - this.model._fireChanges(this, "open problem list"); - }, - isOn: function () { - return this.model.opened; - }, - isHidden: function () { - return this.problemCount() === 0; - } - }; - - }, - recalculateProblemsInIssues: function () { - var problems = []; - var array = ysy.data.issues.getArray(); - if (ysy.settings.projectProgress) { - array = array.concat(ysy.data.projects.getArray()); - } - for (var i = 0; i < array.length; i++) { - var entity = array[i]; - var entityProblems = entity.getProblems(); - if (!entityProblems) continue; - for (var j = 0; j < entityProblems.length; j++) { - problems.push({ - entity: entity, - text: entityProblems[j] - }) - } - } - this.issueProblems = problems; - this._fireChanges(this, "issues problems recalculated"); - }, - recalculateProblemsInRelations: function () { - var problems = []; - var array = ysy.data.relations.getArray(); - for (var i = 0; +i < array.length; i++) { - var entity = array[i]; - var entityProblems = entity.getProblems(); - if (!entityProblems) continue; - for (var j = 0; j < entityProblems.length; j++) { - problems.push({ - relation: entity, - text: entityProblems[j] - }) - } - } - this.relationProblems = problems; - this._fireChanges(this, "relations problems recalculated"); - }, - close: function (who) { - ysy.settings.problemFinder.setSilent({opened: false}); - ysy.settings.problemFinder._fireChanges(who, "event close"); - }, - scrollToEntity: function (entityId) { - var task = gantt._pull[entityId]; - if (!task) return; - gantt.selectTask(entityId); - gantt.showTask(entityId); - } -}); -ysy.view.ProblemFinder = function () { - ysy.view.Widget.call(this); - this.listIsHidden = true; -}; -ysy.main.extender(ysy.view.Button, ysy.view.ProblemFinder, { - templateName: "ProblemFinder", - elementPrefix: "button_", - outerClickBind: false, - specialRepaint: function (hidden) { - if (hidden && this.listIsHidden) return; - var $problemList = $("#gantt_problem_list"); - if (hidden) { - $problemList.hide(); - this.listIsHidden = true; - return; - } - var rendered = Mustache.render(ysy.view.getTemplate(this.templateName), { - count: this.problemCount() - }); - this.$target.html(rendered); - if (this.model.opened) { - if (!$problemList.length) { - var $button = $("#button_problem_finder"); - var offset = $button.position().top; - var viewHeight = Math.min($(window).height() - 105 - offset, $("#easy_gantt").height() - 95); - $problemList = $('<div id="gantt_problem_list" class="gantt-menu-problems-list"></div>').insertAfter($button) - .css({maxHeight: viewHeight + "px"}) - } - this.bindOuterClick(); - rendered = Mustache.render(ysy.view.getTemplate(this.templateName + "List"), this.out()); - $problemList.html(rendered).show(); - this.listIsHidden = false; - } else { - $problemList.hide(); - this.listIsHidden = true; - } - }, - out: function () { - var issueProblems = []; - var relationProblems = []; - var problems = this.model.issueProblems; - for (var i = 0; i < problems.length; i++) { - var problem = problems[i]; - issueProblems.push({ - isProject: problem.entity.isProject, - name: problem.entity.name, - text: problem.text, - entityId: problem.entity.getID() - }); - } - var issues = ysy.data.issues; - problems = this.model.relationProblems; - for (i = 0; i < problems.length; i++) { - problem = problems[i]; - var source = issues.getByID(problem.relation.source_id); - var target = issues.getByID(problem.relation.target_id); - relationProblems.push({ - sourceName: (source ? source.name : "#" + problem.relation.source_id), - targetName: (target ? target.name : "#" + problem.relation.target_id), - text: problem.text, - entityId: problem.relation.target_id - }); - } - return {"entities": issueProblems, "relations": relationProblems}; - - }, - problemCount: function () { - return this.model.issueProblems.length + this.model.relationProblems.length; - }, - bindOuterClick: function () { - if (this.outerClickBind) return; - var self = this; - $(document).on("click.problem_finder", function (e) { - //is inside ProblemList - if (e && $(e.target).closest("#gantt_problem_list").length) return; - $(document).off("click.problem_finder"); - self.outerClickBind = false; - ysy.pro.problemFinder.close(self); - }); - this.outerClickBind = true; - } -}); diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/sample.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/sample.js deleted file mode 100644 index 26fed3ac2bb1a76e65fb76b810e8b15732bba284..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/sample.js +++ /dev/null @@ -1,141 +0,0 @@ -window.ysy = window.ysy || {}; -ysy.pro = ysy.pro || {}; -ysy.pro.sample = { - patch: function () { - var setting = ysy.settings.sample; - $.extend(ysy.view.AllButtons.prototype.extendees, { - sample: { - bind: function () { - this.model = ysy.settings.sample; - }, - func: function () { - if (ysy.data.loader.loaded) { - this.model.toggle(); - ysy.data.loader.load(); - } - }, - isOn: function () { - return this.model.active; - } - //icon:"zoom-in icon-day" - } - }); - - $.extend(setting, { - init: function () { - if (ysy.settings.easyRedmine || this.isViewed()) { - this.prevented = true; - } - this.active = this.getSampleVersion(); - }, - getSampleVersion: function (turnOn) { - if (ysy.settings.global) return "global"; - if (turnOn === false) return 0; - if (turnOn === true) return 1; - return this.prevented ? 0 : 1; - }, - toggle: function (turnOn) { - if (turnOn === undefined) { - turnOn = !this.active; - } - this.setSilent("active", this.getSampleVersion(turnOn)); - this._fireChanges(this, "toggle"); - }, - storageKey: "sample_viewed", - setViewed: function () { - ysy.data.storage.savePersistentData(this.storageKey, true); - }, - isViewed: function () { - return ysy.data.storage.getPersistentData(this.storageKey); - } - }); - }, - _loadSampleData: function (data) { - if (!data.easy_gantt_data) return; - var json = data.easy_gantt_data; - var projects = json.projects; - for (var i = 0; i < projects.length; i++) { - projects[i].needLoad = false; - projects[i].permissions = {editable: true}; - } - var issues = json.issues; - for (i = 0; i < issues.length; i++) { - issues[i].permissions = {editable: true}; - } - var versions = json.versions; - for (i = 0; i < versions.length; i++) { - versions[i].permissions = {editable: true}; - } - ysy.data.loader._handleMainGantt(data); - }, - loadSample:function (sampleVersion) { - ysy.gateway.polymorficGetJSON( - ysy.settings.paths.sample_data.replace("{{version}}", sampleVersion), null, - $.proxy(this._loadSampleData, this), - function () { - ysy.log.error("Error: Example data fetch failed"); - } - ); - } -}; -//############################################################################## -ysy.view.SuperPanel = function () { - ysy.view.Widget.call(this); -}; -ysy.main.extender(ysy.view.Widget, ysy.view.SuperPanel, { - name: "SuperPanelWidget", - templateName: "SuperPanel", - _repaintCore: function () { - if (!this.template) { - var templ = ysy.view.getTemplate(this.templateName); - if (templ) { - this.template = templ; - } else { - return true; - } - } - var rendered = Mustache.render(this.template, this.out()); // REPAINT - var $easygantt = $("#easy_gantt"); - $easygantt.find(".flash").remove(); - this.$target = $(rendered); - $easygantt.prepend(this.$target); - //window.showFlashMessage("notice",rendered); - this.tideFunctionality(); - }, - out: function () { - var obj, label; - var free = !!ysy.settings.sample.getSampleVersion(false); - if (free) { - label = ysy.view.getLabel("sample_global_free_text"); - obj = {global_free: true}; - } else { - label = ysy.view.getLabel("sample_text"); - obj = {}; - } - return $.extend({}, {text: label}, {sample: this.model.active}, obj); - }, - tideFunctionality: function () { - this.$target.find("#sample_close_button").click($.proxy(function () { - if (ysy.data.loader.loaded) { - this.model.setViewed(); - this.model.setSilent("active", false); - this.model._fireChanges(this, "toggle"); - ysy.data.loader.load(); - } - }, this)); - this.$target.find("#sample_video_button").click($.proxy(function () { - if (ysy.settings.global) { - var template = ysy.view.getTemplate("video_modal_global"); - } else { - template = ysy.view.getTemplate("video_modal"); - } - var $modal = ysy.main.getModal("video-modal", "850px"); - $modal.html(template); // REPAINT - $modal.off("dialogclose"); - window.showModal("video-modal", 850); - $modal.on("dialogclose", function () { - $modal.empty(); - }); - })); - } -}); \ No newline at end of file diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/saver.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/saver.js deleted file mode 100644 index e41825efb9bef8dc3d6af91052a592301be81c11..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/saver.js +++ /dev/null @@ -1,529 +0,0 @@ -/* saver.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -if (!ysy.gateway) ysy.gateway = {}; -$.extend(ysy.gateway, { - requestsGroups: {}, - temp: { - retry: false, - superSuccess: null, - superFail: null, - fails: 0 - }, - sendIssue: function (method, issueID, data, callback) { - var priority = 3; - if (method === "REPAIR") { - method = "PUT"; - priority = 9; - } - var urlTemplate = ysy.settings.paths["issue" + method]; - if (!urlTemplate) return; - //var url=urlTemplate+(method==="POST"?"":"/"+issueID)+".json"; - var url = urlTemplate.replace(":issueID", issueID); - //var url = Mustache.render(urlTemplate, {issueID: issueID, apiKey: this.getApiKey()}); - this.prepare({ - priority: priority, - method: method, - url: url, - data: data, - callback: callback, - issueID: issueID - }); - }, - sendRelation: function (method, rela, data, callback) { - var urlTemplate = ysy.settings.paths["relation" + method]; - if (!urlTemplate) return; - //var url = Mustache.render(urlTemplate, $.extend(this.getBasicParams(), { - // relaID: rela.id, - // sourceID: rela.source_id - //})); - var url = urlTemplate.replace(":issueID", rela.source_id).replace(":projectID", rela.getSource().project_id).replace(":relaID", rela.id); - var priorities = {DELETE: 1, POST: 6, PUT: 6}; - this.prepare({ - priority: priorities[method], - method: method, - url: url, - data: data, - callback: callback, - relation: rela - }); - }, - sendMilestone: function (method, mile, data, callback) { - var urlTemplate = ysy.settings.paths["version" + method]; - if (!urlTemplate) return; - //var url = Mustache.render(urlTemplate, $.extend(this.getBasicParams(), {versionID: mile.id})); - var url = urlTemplate.replace(":versionID", mile.id).replace(":projectID", mile.project_id); - this.prepare({priority: 2, method: method, url: url, data: data, callback: callback, milestone: mile}); - }, - sendProject: function (method, project, data, callback) { - var urlTemplate = ysy.settings.paths["project" + method]; - if (!urlTemplate) return; - var url = urlTemplate.replace(":projectID", project.id); - this.prepare({priority: 10, method: method, url: url, data: data, callback: callback, project: project}); - }, - prepare: function (packet) { - if (!this.requestsGroups) { - this.requestsGroups = {}; - } - var priority = packet.priority; - if (!this.requestsGroups[priority]) { - this.requestsGroups[priority] = []; - } - this.requestsGroups[priority].push(packet); - ysy.log.debug("prepared " + packet.method + " " + packet.url, "supersend"); - }, - send: function (request) { - ysy.log.debug(request.method + " " + request.url + " " + JSON.stringify(request.data), "send"); - var xhr = $.ajax({ - url: request.url, - type: request.method, - dataType: "text", - data: request.data - }); - xhr.done(function (message) { - if (request.callback) { - request.callback(message); - } - var temp = ysy.gateway.temp; - temp.successes++; - request.passed = true; - temp.retry = true; - return true; - }).fail(function (response) { - var temp = ysy.gateway.temp; - temp.allOk = false; - temp.fails++; - if (response.responseText) { - try { - var json = JSON.parse(response.responseText); - if (json.errors.length) { - request.errorMessage = json.errors[0]; - } - } catch (e) { - request.errorMessage = response.responseText; - } - } - request.errorStatus = response.statusText; - }).complete(ysy.gateway._process); - //pending.push(xhr); - return xhr; - }, - fireSend: function (success, fail) { - var requestList = []; - var keys = Object.getOwnPropertyNames(this.requestsGroups); - if (keys.length === 0) { - success(); - return; - } - var sortedKeys = []; - for (var i = 0; i < keys.length; i++) { - sortedKeys.push(parseFloat(keys[i])); - } - sortedKeys.sort(); - - for (i = 0; i < sortedKeys.length; i++) { - requestList = requestList.concat(this.requestsGroups[sortedKeys[i]]); - } - ysy.log.debug("_fireSend() ", "supersend"); - this.temp = { - requestList: requestList, - superSuccess: success, - superFail: fail, - retry: true - }; - this._fireRetry(); - }, - _fireRetry: function () { - var temp = ysy.gateway.temp; - if (temp.allOk) { - ysy.log.debug("superSuccess triggered", "supersend"); - if (temp.superSuccess) { - temp.superSuccess(); - } - this.requestsGroups = {}; - return; - } - if (!temp.retry) { - ysy.log.debug("superFail triggered", "supersend"); - if (temp.superFail) { - temp.superFail(this.gatherErrors()); - } - this.requestsGroups = {}; - return; - } - ysy.log.debug("_fireRetry() ", "supersend"); - $.extend(temp, { - pointer: 0, - fails: 0, - successes: 0, - retry: false, - allOk: true - }); - this._fireOne(); - - }, - _fireOne: function () { - var temp = this.temp; - if (temp.pointer >= temp.requestList.length) { - this._fireRetry(); - return; - } - var req = temp.requestList[temp.pointer]; - temp.pointer++; - if (req && !req.passed) { - this.send(req); - } else { - this._fireOne(); - } - }, - _process: function (hrx) { - var temp = ysy.gateway.temp; - ysy.log.debug("AJAX _process (p=" + temp.pointer + ",s=" + temp.successes + ",f=" + temp.fails + ")", "supersend"); - ysy.gateway._fireOne(); - }, - gatherErrors: function () { - var errors = []; - var temp = this.temp; - var reqList = temp.requestList; - if (!reqList || reqList.length === 0)return; - for (var j = 0; j < reqList.length; j++) { - var request = reqList[j]; - if (request.passed) continue; - var error, name, entityType = null; - if (request.issueID || (request.data && request.data.issue)) { - entityType = "issue"; - var issue = ysy.data.issues.getByID(request.issueID); - if (issue) { - name = '"' + issue.name + '"'; - } else if (request.data && request.data.issue) { - name = '"' + request.data.issue.subject + '"'; - } else { - name = "#" + request.issueID; - } - } else if (request.project) { - entityType = "project"; - name = '"' + request.project.name + '"'; - } else if (request.milestone) { - entityType = "milestone"; - name = '"' + request.milestone.name + '"'; - } else if (request.relation) { - entityType = "relation"; - var source = request.relation.getSource(); - var target = request.relation.getTarget(); - name = '"' + source.name + '" - "' + target.name + '"'; - } - if (entityType) { - error = ysy.settings.labels.gateway.entitySaveFailed.replace("%{entityName}", name).replace("%{entityType}", ysy.settings.labels.types[entityType]); - } else { - error = request.method + " " + request.url.substr(0, request.url.indexOf('?')) + " - " + request.errorStatus; - } - if (request.errorMessage) { - error += ": " + request.errorMessage; - } else if (entityType) { - error += ": " + request.errorStatus; - } - errors.push(error); - } - return errors; - }, - polymorficGet: function (url, data, callback, fail) { - if (!url) return; - $.get(url, data) - .done(callback) - .fail(fail); - }, - polymorficGetJSON: function (url, data, callback, fail) { - if (!url) return; - $.getJSON(url, data) - .done(callback) - .fail(fail); - }, - polymorficPostJSON: function (url, data, callback, fail) { - if (!url) return; - $.ajax({ - url: url, - type: "POST", - data: data, - dataType: "json" - }).done(callback).fail(fail); - }, - polymorficPost: function (url, obj, data, callback, fail) { - if (!url) return; - $.ajax({ - url: url, - type: "POST", - data: data, - dataType: "text" - }).done(callback).fail(fail); - }, - polymorficPut: function (url, obj, data, callback, fail) { - if (!url) return; - $.ajax({ - url: url, - type: "PUT", - data: JSON.stringify(data), - contentType: "application/json", - dataType: "text" - }).done(callback).fail(fail); - }, - polymorficDelete: function (url, obj, callback, fail) { - if (!url) return; - $.ajax({ - url: url, - type: "DELETE", - dataType: "json" - }).done(callback).fail(fail); - } - - -}); - -ysy.data = ysy.data || {}; -ysy.data.save = function () { - ysy.data.saver.sendIssues(); - ysy.data.saver.sendRelations(); - ysy.data.saver.sendMilestones(); - ysy.data.saver.sendProjects(); - ysy.gateway.fireSend( - ysy.data.saver.afterSaveSuccess, - ysy.data.saver.afterSaveFail, - true - ); -}; -ysy.data.saver = { - _name:"Saver", - sendIssues: function () { - var j, data; - var issues = ysy.data.issues.array; - for (j = 0; j < issues.length; j++) { - var issue = issues[j]; - if (!issue._changed) continue; - if (issue._deleted && issue._created) continue; - if (issue._deleted) { - ysy.gateway.sendIssue("DELETE", issue.id, null, callbackBuilder(issue)); - } else if (issue._created) { - data = {issue: {}}; - for (var key in issue) { - if (!issue.hasOwnProperty(key)) continue; - if (ysy.main.startsWith(key, "_"))continue; - data.issue[key] = issue[key]; - } - delete data.issue["name"]; - delete data.issue["id"]; - delete data.issue["end_date"]; - $.extend(data.issue, { - subject: issue.name, - start_date: issue.start_date ? issue.start_date.format("YYYY-MM-DD") : undefined, - due_date: issue.end_date ? issue.end_date.format("YYYY-MM-DD") : undefined - }); - var parents = ysy.data.saver.constructParentData(issue); - $.extend(data.issue, parents); - ysy.gateway.sendIssue("POST", null, data, this.callbackBuilder(issue)); - //ysy.log.error("Issue "+issue.id+" cannot be created - not implemented"); - } else { - data = {}; - for (key in issue) { - if (!issue.hasOwnProperty(key)) continue; - if (ysy.main.startsWith(key, "_"))continue; - data[key] = issue[key]; - } - delete data["end_date"]; - delete data["columns"]; - $.extend(data, { - start_date: issue.start_date ? issue.start_date.format("YYYY-MM-DD") : undefined, - due_date: issue.end_date ? issue.end_date.format("YYYY-MM-DD") : undefined - }); - // parents = ysy.data.saver.constructParentData(issue); - // $.extend(data, parents); - ysy.proManager.fireEvent("beforeSaveIssue", data); - data = issue.getDiff(data); - if (data === null) { - this.callbackBuilder(issue)(); - continue; - } - ysy.gateway.sendIssue("PUT", issue.id, {issue: data}, this.callbackBuilder(issue)); - //console.log("Issue "+issue.id); - } - } - }, - sendRelations: function () { - var j, data; - var relas = ysy.data.relations.array; - var repairedIssues = {}; - for (j = 0; j < relas.length; j++) { - var rela = relas[j]; - if (ysy.settings.fixedRelations) { - rela.makeDelayFixedForSave(); - } - if (!rela._changed) continue; - if (rela._deleted && rela._created) continue; - //var callback=$.proxy(function(){this._changed=false;},rela); - if (rela._deleted) { - ysy.gateway.sendRelation("DELETE", rela, null, this.callbackBuilder(rela)); - } else { - //if(rela.delay>0){data.relation.delay=rela.delay;} - if (rela._created) { - data = { - relation: { - issue_to_id: rela.target_id, - relation_type: rela.type, - delay: rela.delay - }, - project_id: rela.getTarget().project_id - }; - ysy.gateway.sendRelation("POST", rela, data, this.callbackBuilder(rela)); - } else { - data = {delay: rela.delay}; - ysy.gateway.sendRelation("PUT", rela, data, this.callbackBuilder(rela)); - } - var targetIssue = rela.getTarget(); - repairedIssues[targetIssue.id] = targetIssue; - } - } - for (var id in repairedIssues) { - if (!repairedIssues.hasOwnProperty(id)) continue; - targetIssue = repairedIssues[id]; - var targetData = { - issue: { - start_date: targetIssue.start_date ? targetIssue.start_date.format("YYYY-MM-DD") : undefined, - due_date: targetIssue.end_date ? targetIssue.end_date.format("YYYY-MM-DD") : undefined - } - }; - ysy.gateway.sendIssue("REPAIR", targetIssue.id, targetData, null); - } - }, - sendMilestones: function () { - var j, data; - var miles = ysy.data.milestones.array; - for (j = 0; j < miles.length; j++) { - var mile = miles[j]; - if (!mile._changed) continue; - if (mile._deleted && mile._created) continue; - //var callback=$.proxy(function(){this._changed=false;},mile); - if (mile._deleted) { - ysy.gateway.sendMilestone("DELETE", mile, null, this.callbackBuilder(mile)); - } else if (mile._created) { - data = { - version: { - name: mile.name, - //status: the status of the version in: open (default), locked, closed - //sharing: the version sharing in: none (default), descendants, hierarchy, tree, system - description: mile.description, - due_date: mile.start_date.format("YYYY-MM-DD") - } - }; - ysy.gateway.sendMilestone("POST", mile, data, this.callbackBuilder(mile)); - //ysy.log.error("Milestone "+mile.id+" cannot be created - not implemented"); - //ysy.gateway.sendIssue("POST",issue.id,null,callback); - //console.log("Issue "+issue.id+" created"); - } else { - data = { - version: { - due_date: mile.start_date.format("YYYY-MM-DD") - } - }; - ysy.gateway.sendMilestone("PUT", mile, data, this.callbackBuilder(mile)); - } - } - }, - sendProjects: function () { - }, - callbackBuilder: function (item) { - return function (response) { - var message = (item.name || item._name); - //dhtmlx.message(message,"success"); - ysy.log.debug(message + " sended", "send"); - if (response) { - try { - var parsedResponse = JSON.parse(response); - } catch (e) { - } - if (parsedResponse) { - var model = parsedResponse.issue - || parsedResponse.project - || parsedResponse.version - || parsedResponse.relation; - if (model) { - item.setSilent({ - id: model.id, - _created: false - }); - item._fireChanges(ysy.data.saver, "afterPOST set"); - } - } - } - item._changed = false; - } - }, - constructParentData: function (issue) { - var data = { - parent_issue_id: null, - fixed_version_id: null, - project_id: issue.project_id - }; - var parent; - if (issue.parent_issue_id) { - data.parent_issue_id = issue.parent_issue_id; - parent = ysy.data.issues.getByID(issue.parent_issue_id); - if (parent) { - data.fixed_version_id = parent.fixed_version_id; - //data.project_id = parent.project_id; - } - } else if (issue.fixed_version_id) { - data.fixed_version_id = issue.fixed_version_id; - //parent = ysy.data.milestones.getByID(issue.fixed_version_id); - //if (parent) { - // data.project_id = parent.project_id; - //} - } - return data; - }, - afterSaveSuccess: function () { - dhtmlx.message(ysy.view.getLabel("gateway", "allSended"), "notice", 2000); - ysy.data.loader.load(); - }, - afterSaveFail: function (errors) { - var string = "<p>" + ysy.view.getLabel("gateway", "sendFailed") + "</p><ul>"; - for (var i = 0; i < errors.length; i++) { - string += "<li>" + errors[i] + "</li>"; - } - dhtmlx.message(string + "</ul>", "error",5000); - //for(var i=0;i<errors.length;i++){ - // showFlashMessage("error",errors[i]) - //} - // ysy.data.saver.openReloadModal(errors); - ysy.data.loader.load(); - } - // openReloadModal: function (errors) { - // var $target = ysy.main.getModal("form-modal", "50%"); - // var template = ysy.view.getTemplate("reloadModal"); - // //var obj = $.extend({}, ysy.view.getLabel("reloadModal"),{errors:errors}); - // var rendered = Mustache.render(template, {errors: errors}); - // $target.html(rendered); - // showModal("form-modal"); - // $target.dialog({ - // buttons: [ - // { - // id: "reload_modal_yes", - // text: ysy.settings.labels.buttons.button_yes, - // class: "gantt-reload-modal-button button-1", - // click: function () { - // $target.dialog("close"); - // $(".flash").remove(); - // ysy.data.loader.load(); - // } - // }, - // { - // id: "reload_modal_no", - // text: ysy.settings.labels.buttons.button_no, - // class: "gantt-reload-modal-button button-2", - // click: function () { - // $target.dialog("close"); - // } - // } - // ] - // }); - // $("#reload_modal_yes").focus(); - // } -}; - diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/storage.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/storage.js deleted file mode 100644 index 9ba7eecb44cd3e654be990361c23923cca96a824..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/storage.js +++ /dev/null @@ -1,38 +0,0 @@ -/* storage.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.data = ysy.data || {}; -ysy.data.storage = ysy.data.storage || {}; -$.extend(ysy.data.storage, { - _scope: "easy-gantt-", - zoomKey: "zoom", - init: function () { - - // ZOOM saving - ysy.settings.zoom.register(function () { - this.saveSessionData(this.zoomKey, ysy.settings.zoom.zoom); - }, this); - - }, - getSavedZoom: function () { - return this.getSessionData(this.zoomKey); - }, - saveCookie: function (key, value) { - $.cookie(this._scope + key, value, {expires: 3650, path: '/'}); - }, - getCookie: function (key) { - return $.cookie(this._scope + key); - }, - saveSessionData: function (key, value) { - window.sessionStorage.setItem(this._scope + key, value); - }, - getSessionData: function (key) { - return window.sessionStorage.getItem(this._scope + key); - }, - savePersistentData: function (key, value) { - window.localStorage.setItem(this._scope + key, value); - }, - getPersistentData: function (key) { - return window.localStorage.getItem(this._scope + key); - } -}); diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/sumrow.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/sumrow.js deleted file mode 100644 index bdf4c58dffcd092f96fbf7e6b09e2a5f7b5e0b5e..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/sumrow.js +++ /dev/null @@ -1,201 +0,0 @@ -/* sumrow.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.pro = ysy.pro || {}; -ysy.pro.sumRow = ysy.pro.sumRow || {}; -$.extend(ysy.pro.sumRow, { - summers: { - count: { - day: function (date, issue) { - if (issue._start_date.isAfter(date)) return 0; - if (issue._end_date.isBefore(date)) return 0; - return 1; - }, - week: function (first_date, last_date, issue) { - if (issue._start_date.isAfter(last_date)) return 0; - if (issue._end_date.isBefore(first_date)) return 0; - return 1; - }, - //formatter:function(value){return value}, - entities: ["issues"], - title: "Count" - } - }, - patch: function () { - $.extend(ysy.settings.sumRow, { - summerArray: [], - setSummer: function (summer) { - if (!ysy.pro.sumRow.summers[summer]) return; - var index = this.summerArray.indexOf(summer); - if (index !== -1) { - this.summerArray.splice(index, 1); - } - this.summerArray.push(summer); - this.setSilent({ - active: true, - summer: summer - }); - this._fireChanges(this, "setSummer to " + summer); - }, - removeSummer: function (summer) { - var index = this.summerArray.indexOf(summer); - if (index !== -1) { - this.summerArray.splice(index, 1); - } - if (this.summerArray.length === 0) { - this.setSilent({ - active: false, - summer: false - }); - } else { - this.setSilent({ - active: true, - summer: this.summerArray[this.summerArray.length - 1] - }); - } - this._fireChanges(this, "removeSummer " + summer); - } - }); - // ysy.settings.sumRow.setSummer("count"); - } -}); - - -ysy.view = ysy.view || {}; -ysy.view.SumRow = function () { - ysy.view.Widget.call(this); - this.temper = { - values: [] - }; -}; -ysy.main.extender(ysy.view.Widget, ysy.view.SumRow, { - name: "SumRowWidget", - _postInit: function () { - ysy.data.issues.childRegister(this.invalidateIssues, this); - ysy.data.projects.childRegister(this.invalidateProjects, this); - ysy.data.issues.register(this.invalidateIssues, this); - ysy.data.projects.register(this.invalidateProjects, this); - gantt.attachEvent("onGanttRender", $.proxy(this.requestRepaint, this)); - }, - nopeFormatter: function () { - return "" - }, - invalidateProjects: function () { - if (this.summer && this.summer.entities && this.summer.entities.indexOf("projects") > -1) - this.requestRepaint(); - }, - invalidateIssues: function () { - if (this.summer && (!this.summer.entities || this.summer.entities.indexOf("issues") > -1)) - this.requestRepaint(); - }, - getSubScale: function (zoom) { - var summer = ysy.pro.sumRow.summers[ysy.settings.sumRow.summer]; - if (!summer) return; - ysy.log.debug("getSubScale for " + summer.title, "summer"); - this.summer = summer; - this.updateTemper(); - var temper = this.temper; - // var max = Math.max.apply(null, values); - // var min = Math.min.apply(null, values); - var template = this.nopeFormatter; - if (temper.values) { - if (summer.formatter) { - template = function (date) { - var index = -temper.minDate.diff(date, zoom); - if (index < 0 || index > temper.valuesLength) return ""; - return summer.formatter(temper.values[index], temper.widths[index]); - } - } else { - template = function (date) { - var index = -temper.minDate.diff(date, zoom); - if (index < 0 || index > temper.valuesLength) return ""; - return temper.values[index]; - } - } - } - return { - step: 1, - className: "gantt-sum-row", - unit: zoom, - template: template - }; - }, - getSummerFunction: function (zoom) { - return zoom === "day" ? this.summer.day : this.summer.week; - }, - getEntities: function () { - if (!this.summer) return null; - var types = this.summer.entities || ["issues"]; - var entities = []; - for (var i = 0; i < types.length; i++) { - entities = entities.concat(ysy.data[types[i]].getArray()); - } - return entities; - }, - _repaintCore: function () { - if (!ysy.settings.sumRow.active) return; - ysy.log.debug("sumRow repaintCore", "summer"); - var summer = ysy.pro.sumRow.summers[ysy.settings.sumRow.summer]; - if (!summer) return; - this.summer = summer; - this.updateTemper(this.calculateSums(ysy.settings.zoom.zoom)); - var $target = $(".gantt_scale_line.gantt-sum-row"); - var config = gantt.config; - - var resize = gantt._get_resize_options(); - var avail_width = resize.x ? Math.max(config.autosize_min_width, 0) : gantt.$task.offsetWidth; - - var cfgs = gantt._scale_helpers.prepareConfigs([this.getSubScale(ysy.settings.zoom.zoom)], config.min_column_width, avail_width, config.scale_height - 1); - var html = gantt._prepare_scale_html(cfgs[0]); - $target.html(html); - }, - updateTemper: function (values) { - if (values) { - this.temper.values = values; - this.temper.valuesLength = values.length; - } - //this.temper.fullRange = moment(gantt._max_date).diff(gantt._min_date, ysy.settings.zoom.zoom); - this.temper.minDate = moment(gantt._min_date); - this.temper.widths = gantt._tasks.width; - }, - calculateSums: function (unit) { - var summerFunction = this.getSummerFunction(unit); - var values = []; - var mover = moment(gantt._min_date); - var maxDate = moment(gantt._max_date); - var issues = this.getEntities(); - // var lastValue = 0; - if (unit === "day") { - while (mover.isBefore(maxDate)) { - var count = 0; - for (var i = 0; i < issues.length; i++) { - count += summerFunction(mover, issues[i]); - } - // if (summer.cumulative) { - // count += lastValue; - // } - values.push(count); - // lastValue = count; - mover.add(1, unit); - } - } else { - var nextMover = moment(mover).add(1, unit); - while (mover.isBefore(maxDate)) { - count = 0; - for (i = 0; i < issues.length; i++) { - count += summerFunction(mover, nextMover, issues[i]); - } - // if (summer.cumulative) { - // count += lastValue; - // } - values.push(count); - // lastValue = count; - mover.add(2, unit); - var tempMover = mover; - mover = nextMover; - nextMover = tempMover; - } - } - return values; - } -}); \ No newline at end of file diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/toolpanel.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/toolpanel.js deleted file mode 100644 index c5cd44ead4d5c15919e19e2be2c81f21197d8f6d..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/toolpanel.js +++ /dev/null @@ -1,95 +0,0 @@ -/* toolpanel.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.pro = ysy.pro || {}; -ysy.pro.toolPanel = ysy.pro.toolPanel || {}; -$.extend(ysy.pro.toolPanel, { - _name: "ToolPanel", - extendees: [], - initToolbar: function (ctx) { - var toolPanel = new ysy.view.ToolPanel(); - toolPanel.init(ysy.settings.toolPanel); - ctx.children.push(toolPanel); - }, - patch: function () { - var toolSetting = ysy.settings.toolPanel = new ysy.data.Data(); - toolSetting.init({ - _name: "ToolPanel", buttonIds: [], buttons: {}, - registerButtonSilent: function (button) { - if (button.id === undefined) throw("Missing id for button"); - this.buttons[button.id] = button; - this.buttonIds.push(button.id); - } - }); - - ysy.proManager.register("initToolbar", this.initToolbar); - - for (var i = 0; i < this.extendees.length; i++) { - var button = this.extendees[i]; - if (button.isRemoved && button.isRemoved()) continue; - toolSetting.registerButtonSilent(button); - } - toolSetting._fireChanges(this, "delayed registerButton"); - delete this.extendees; - }, - registerButton: function (button) { - if (button.isRemoved && button.isRemoved()) return; - if (ysy.settings.toolPanel) { - ysy.settings.toolPanel.registerButtonSilent(button); - ysy.settings.toolPanel._fireChanges(this, "direct registerButton"); - } else { - this.extendees.push(button); - } - } -}); - -ysy.view.ToolPanel = function () { - ysy.view.Widget.call(this); -}; -ysy.main.extender(ysy.view.Widget, ysy.view.ToolPanel, { - name: "ToolPanelWidget", - templateName: "ToolButtons", - - _postInit: function () { - var $toolPanel = $("#easy_gantt_tool_panel"); - $toolPanel.find("a:not([href])").attr("href", "javascript:void(0)"); - $toolPanel.find("li > *").hide(); - }, - _updateChildren: function () { - var model = this.model; - var children = []; - // this.$target = $("#content"); - for (var i = 0; i < model.buttonIds.length; i++) { - var elid = model.buttonIds[i]; - var extendee = model.buttons[elid]; - // if (!this.getChildTarget(extendee).length) continue; - var button; - if (extendee.widget) { - button = new extendee.widget(); - } else { - button = new ysy.view.Button(); - } - $.extend(button, extendee); - button.init(); - children.push(button); - } - this.children = children; - }, - _repaintCore: function () { - for (var i = 0; i < this.children.length; i++) { - var child = this.children[i]; - this.setChildTarget(child, i); - child.repaint(true); - } - }, - setChildTarget: function (child /*,i*/) { - var selector = "#" + child.elementPrefix + child.id; - if (["#select_scheme_select"].indexOf(selector) > -1) { - child.$target = $("<div>"); - return; - } - var target = this.$target.find(selector); - if (target.length === 0) throw("element #" + child.elementPrefix + child.id + " missing"); - child.$target = target; - } -}); diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/tooltip.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/tooltip.js deleted file mode 100644 index 50a0ab646cb013cc0a3a0611150f2bcc1f030f7f..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/tooltip.js +++ /dev/null @@ -1,217 +0,0 @@ -/* tooltip.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.view = ysy.view || {}; -ysy.view.tooltip = $.extend(ysy.view.tooltip, { - instance: null, - show: function (className, event, template, out) { - if (!this.instance) { - this.instance = new ysy.view.ToolTip().init(); - } - return this.instance.set(className, event, template, out); - }, - hide: function () { - if (this.instance) - return this.instance.hide(); - return false; - }, - changePos: function (event) { - if (this.instance) - return this.instance.changePos(event); - } -}); -ysy.view.taskTooltip = $.extend(ysy.view.taskTooltip, { - timeout: 0, - timeoutTime: 1000, - phase: 1, - /** - * phase 1 mouse is out - * phase 2 mouse on, start timer - * phase 3 tooltip display - */ - taskTooltipInit: function () { - var self = this; - /** - * phase 2 mouse on, start timer 1s - */ - $("#content") - .on("mouseenter", ".gantt_task_content, .gantt_task_progress, .gantt-task-tooltip-area", function (e) { - if (self.phase !== 1) return; - ysy.log.debug("mouseenter", "tooltip"); - if (e.buttons !== 0) return; - self.phase = 2; - // ysy.log.debug("e.which = "+e.which+" e.button = "+ e.button+" e.buttons = "+ e.buttons); - self.bindHiders(e.target); - self.updatePos(e); - }); - - }, - bindHiders: function (target) { - target.addEventListener("mouseleave", this.hideTooltip); - target.addEventListener("mousedown", this.hideTooltip); - target.addEventListener("mousemove", this.updatePos); - }, - hideTooltip: function (event) { - var self = ysy.view.taskTooltip; - /** - * set phase 1 mouse out - */ - self.phase = 1; - self.lastPos = null; - if (self.timeout) { - clearTimeout(self.timeout); - } - if (ysy.view.tooltip.hide()) { - event.target.removeEventListener("mouseleave", this.hideTooltip); - event.target.removeEventListener("mousedown", this.hideTooltip); - event.target.removeEventListener("mousemove", this.updatePos); - } - }, - /** - * @param {MouseEvent} event - */ - updatePos: function (event) { - var self = ysy.view.taskTooltip; - if (self.phase === 1) return; - - var changed = false; - if (self.lastPos) { - if (Math.abs(self.lastPos.clientX - event.clientX) > 5) { - self.lastPos.clientX = event.clientX; - changed = true; - } - if (Math.abs(self.lastPos.clientY - event.clientY) > 5) { - self.lastPos.clientY = event.clientY; - changed = true; - } - } else { - self.lastPos = {clientX: event.clientX, clientY: event.clientY}; - changed = true; - } - if (self.phase === 3 && changed) { - self.hideTooltip(event); - return; - } - self.lastPos.target = event.target; - if (changed) { - if (self.timeout) { - window.clearTimeout(self.timeout); - } - self.timeout = window.setTimeout(function () { - self.showTaskTooltip(self.lastPos) - }, self.timeoutTime); - } - }, - showTaskTooltip: function (event) { - var self = this; - /** - * phase 3 tooltip display - */ - if (self.phase !== 2) return; - var task = gantt._pull[gantt.locate(event)]; - if (!task) return; - self.phase = 3; - if (event.target.parentElement.parentElement === null) { - self.phase = 1; - return; - } - var taskPos = $(event.target).offset(); - return ysy.view.tooltip.show("gantt-task-tooltip", - {clientX: event.clientX, clientY: event.clientY, top: taskPos.top + gantt.config.row_height}, - ysy.view.templates.TaskTooltip, - self.taskTooltipOut(task)); - }, - - taskTooltipOut: function (task) { - var issue = task.widget.model; - var problemList = issue.getProblems(); - var columns = []; - if (issue.milestone) { - if (issue.isShared) { - columns = [{ - name: "shared-from", - label: "Shared from project", - value: '#' + issue.real_project_id - }] - } - return { - name: issue.name, - end_date: issue.start_date.format(gantt.config.date_format), - columns: columns - }; - } - var columnHeads = gantt.config.columns; - var banned = ["subject", "start_date", "end_date", "due_date"]; - for (var i = 0; i < columnHeads.length; i++) { - var columnHead = columnHeads[i]; - if (banned.indexOf(columnHead.name) < 0) { - var html = columnHead.template(task); - if (!html) continue; - if (html.indexOf("<") === 0) { - html = $(html).html(); - } - columns.push({name: columnHead.name, label: columnHead.label, value: html}); - } - } - if (issue.fixed_version_id) { - var milestone = ysy.data.milestones.getByID(issue.fixed_version_id); - } - return { - name: issue.name, - start_date: issue.start_date ? issue.start_date.format(gantt.config.date_format) : moment(null), - end_date: issue.end_date ? issue.end_date.format(gantt.config.date_format) : moment(null), - milestone: milestone, - columns: columns, - problems: problemList - }; - } -}); -ysy.view.ToolTip = function () { - ysy.view.Widget.call(this); -}; -ysy.main.extender(ysy.view.Widget, ysy.view.ToolTip, { - name: "ToolTip", - init: function () { - var $target = this.$target = $("<div id='gantt_tooltip' style='display: none'></div>").appendTo("#content"); - $target.on("mouseleave", function () { - $target[0].style.display = "none"; - }); - ysy.view.onRepaint.push($.proxy(this.repaint, this)); - return this; - }, - set: function (className, event, template, out) { - this.className = className || this.className; - this.event = event || this.event; - this.template = template || this.template; - this.outed = out; - this.repaintRequested = true; - return this.$target; - }, - hide: function () { - this.$target[0].style.display = "none";//.hide(); - return true; - }, - changePos: function (event) { - var left = event.clientX; - var top = event.top; - if (event.clientY + this.elementHeight > window.innerHeight) { - top -= this.elementHeight + gantt.config.row_height + 4; - } - if (event.clientX + this.elementWidth > window.innerWidth) { - left -= this.elementWidth; - } - this.$target[0].style.cssText = "display: block; left: " + left + "px; top: " + top + "px"; - }, - _repaintCore: function () { - this.$target.html(Mustache.render(this.template, this.outed)); // REPAINT - this.$target[0].style.display = "block"; - this.$target[0].className = 'gantt-tooltip ' + this.className; - this.elementWidth = this.$target.outerWidth(); - this.elementHeight = this.$target.outerHeight(); - var event = this.event; - if (event) { - this.changePos(event); - } - return false; - } -}); diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/utils.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/utils.js deleted file mode 100644 index 7ed98e7beb520f2bf3915e3c51145eaa59d1c746..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/utils.js +++ /dev/null @@ -1,114 +0,0 @@ -/* utils.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.main = ysy.main || {}; -$.extend(ysy.main, { - extender: function (parent, child, proto) { - function ProtoCreator() { - } - ProtoCreator.prototype = parent.prototype; - child.prototype = new ProtoCreator(); - child.prototype.constructor = child; - $.extend(child.prototype, proto); - }, - getModal: function (id, width) { - var $target = $("#" + id); - if ($target.length === 0) { - $target = $("<div id=" + id + ">"); - $target.dialog({ - width: width, - appendTo: document.body, - modal: true, - resizable: false, - dialogClass: 'modal' - }); - $target.dialog("close"); - } - return $target; - }, - startsWith: function (text, char) { - if (text.startsWith) { - return text.startsWith(char); - } - return text.toString().charAt(0) === char; - }, - isSameMoment: function (date1, date2) { - if (!moment.isMoment(date1)) return false; - if (!moment.isMoment(date2)) return false; - return date1.isSame(date2); - }, - /** - * Utility function for measuring performance of some code - * @example - * var perf = createPerformanceMeter("myFunction"); - * perf("part 1"); - * perf("part 2"); - * perf.whole(); - * @param {String} groupName - * @return {Function} - */ - createPerformanceMeter: function (groupName) { - var lastTime = window.performance.now(); - var silence = false; - var initTime = lastTime; - var func = function (/** @param {String} name*/ name) { - if (silence) return; - var nowTime = window.performance.now(); - var nameString = groupName + " " + name + ": "; - nameString = nameString.substr(0, 30); - var diffString = " " + (nowTime - lastTime).toFixed(3); - diffString = diffString.substr(diffString.length - 10); - console.debug(nameString + diffString + " ms"); - lastTime = nowTime; - }; - func.whole = function () { - if (silence) return; - var nowTime = window.performance.now(); - var nameString = groupName + ": "; - nameString = nameString.substr(0, 30); - var diffString = " " + (nowTime - initTime).toFixed(3); - diffString = diffString.substr(diffString.length - 10); - console.debug(nameString + diffString + " ms"); - }; - func.silence = function (verbose) { - silence = !verbose; - }; - return func; - }, - /** - * - * @param {Array.<{name:String,value:String}>} formData - * @return {Object} - */ - formToJson: function (formData) { - var result = {}; - var prolong = function (result, split, value) { - var key = split.shift(); - if (key === "") { - result.push(value); - } else { - if (split.length > 0) { - var next = split[0]; - if (!result[key]) { - if (next === "") { - result[key] = []; - } else { - result[key] = {}; - } - } - prolong(result[key], split, value); - } else { - result[key] = value; - } - } - }; - for (var i = 0; i < formData.length; i++) { - var split = formData[i].name.split(/]\[|\[|]/); - if (split.length > 1) { - split.pop(); - } - prolong(result, split, formData[i].value); - } - return result; - } -}); \ No newline at end of file diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/view.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/view.js deleted file mode 100644 index 97b1d77693411d401caf41cf71bcf049feadd718..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/view.js +++ /dev/null @@ -1,48 +0,0 @@ -/* view.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.view = ysy.view || {}; -$.extend(ysy.view, { - onRepaint: [], - patch: function () { - this.applyGanttRewritePatch(); - this.addGanttAddons(); - this.applyGanttPatch(); - if (!window.initEasyAutocomplete) { - window.initEasyAutocomplete = function () { - }; - } - if (ysy.settings.easyRedmine && $("#content").children(".easy-content-page").length === 0) { - $("#easy_gantt").addClass("easy-content-page"); - } - }, - start: function () { - this.labels = ysy.settings.labels; - var main = new ysy.view.Main(); - main.init(ysy.data.projects); - this.anim(); - }, - anim: function () { - var view = ysy.view; - for (var i = 0; i < view.onRepaint.length; i++) { - view.onRepaint[i](); - } - //requestAnimFrame($.proxy(this.anim, this)); - requestAnimFrame(view.anim); - }, - getTemplate: function (name) { - return this.templates[name]; - }, - getLabel: function () { - var temp = this.labels; - for (var i = 0; i < arguments.length; i++) { - var arg = arguments[i]; - if (temp[arg]) { - temp = temp[arg]; - } else { - return temp; - } - } - return temp; - } -}); diff --git a/plugins/easy_gantt/assets/javascripts/easy_gantt/widget.js b/plugins/easy_gantt/assets/javascripts/easy_gantt/widget.js deleted file mode 100644 index 54a6b9c8796f14e54cb47a2707b1d9713ad4e2af..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/javascripts/easy_gantt/widget.js +++ /dev/null @@ -1,256 +0,0 @@ -/* widget.js */ -/* global ysy */ -window.ysy = window.ysy || {}; -ysy.view = ysy.view || {}; -ysy.view.Widget = function () { - /* - *Widget class is a base class for all other Widgets. - *It implement basic repaint, init and _register functions, which in most cases dont have to changed. - */ - //this.template = null; // nutne zakomentovat, aby to - this.$target = null; - this.parent = null; - this.children = []; - this.repaintRequested = true; - this.keepPaintedState = false; - this.deleted = false; - this.regs = [null, null, null, null]; -}; -ysy.view.Widget.prototype = { - name: "Widget", - init: function (modl) { - if (modl instanceof Array) { - ysy.log.error("Array Model"); - } - if (this.model) { - this.model.unregister(this); - } - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - if (!arguments[i]) continue; - this._register(arguments[i], i); - } - } - if (modl) { - this.model = modl; - this._register(modl); - } - this._updateChildren(); - this._postInit(); - return this; - }, - requestRepaint: function () { - this.repaintRequested = true; - }, - _updateChildren: function () { - }, - _postInit: function () { - }, - _register: function (model, pos) { - //if (model === undefined) { - // ysy.log.error("no model for register in "+this.name); - //} - if (!model) return; - if (pos) { - if (this.regs[pos]) { - this.regs[pos].unregister(this); - } - this.regs[pos] = model; - } - model.register(function () { - this._updateChildren(); - this.requestRepaint(); - }, this); - }, - out: function () { - - }, - repaint: function (force) { - if (this.hidden) { - this.repaintRequested = true; - return; - } - if (this.keepPaintedState) { - this.onNoRepaint(); - return; - } - if (this.repaintRequested || force) { - ysy.log.log("--- RepaintCore in " + this.name); - this.repaintRequested = !!this._repaintCore(); - } else { - this.onNoRepaint(); - for (var i = 0; i < this.children.length; i++) { - this.children[i].repaint(); - } - } - }, - _repaintCore: function () { - if (!this.template) { - var templ = ysy.view.getTemplate(this.templateName); - if (templ) { - this.template = templ; - } else { - return true; - } - } - if (this.$target === null) { - throw "Target is null for " + this.templateName; - } - this.$target.html(Mustache.render(this.template, this.out())); // REPAINT - this.tideFunctionality(); // TIDE FUNCTIONALITY - for (var i = 0; i < this.children.length; i++) { - var child = this.children[i]; - this.setChildTarget(child, i); // SET CHILD TARGET - child.repaint(true); // CHILD REPAINT - } - return false; - }, - onNoRepaint: function () { - - }, - tideFunctionality: function () { - - }, - setChildTarget: function (child, i) { - - }, - destroy: function () { - this.deleted = true; - }, - _getChildByID: function (id) { - for (var i = 0; i < this.children.length; i++) { - if (this.children[i].id === id) { - return this.children[i]; - } - } - return null; - }, - _getChildByName: function (name) { - for (var i = 0; i < this.children.length; i++) { - if (this.children[i].name === name) { - return this.children[i]; - } - } - return null; - } -}; -ysy.view.Main = function () { - ysy.view.Widget.call(this); - this.name = "MainWidget"; -}; -ysy.main.extender(ysy.view.Widget, ysy.view.Main, { - init: function (mod) { - this.$target = $("#easy_gantt"); - this.model = mod; - ysy.view.onRepaint.push($.proxy(this.repaint, this)); - this._register(null); - this._updateChildren(); - ysy.view.mainWidget = this; - }, - _updateChildren: function () { - if (this.children.length > 0) { - return; - } - var toolbars = new ysy.view.Toolbars(); - toolbars.init(); - toolbars.$target = $("#content"); - this.children.push(toolbars); - - var mainGantt = new ysy.view.Gantt(); - mainGantt.$target = $("#gantt_cont")[0]; - mainGantt.init(/*ysy.data.limits,*//*ysy.data.loader,*/ ysy.data.baselines); - this.children.push(mainGantt); - }, - _repaintCore: function () { - for (var i = 0; i < this.children.length; i++) { - var child = this.children[i]; - this.setChildTarget(child, i); - child.repaint(true); - } - }, - setChildTarget: function (child/*, i*/) { - //if (this.childTargets[child.name]) { - // child.$target = this.$target.find(this.childTargets[child.name]); - //} - //if (child.name === "AllButtonsWidget") { - // child.$target = $("#content"); - //} - } -}); -//############################################################################## - -//############################################################################## - -//############################################################################## -ysy.view.LinkPopup = function () { - ysy.view.Widget.call(this); -}; -ysy.main.extender(ysy.view.Widget, ysy.view.LinkPopup, { - name: "PopupWidget", - templateName: "LinkConfigPopup", - init: function (model, dhtml) { - if (this.model) { - this.model.unregister(this); - } - this.model = model; - this.dhtml = dhtml; - this._register(model); - return this; - }, - requestRepaint: function () { - ysy.log.debug("Popup requestRepaint()", "link_config"); - //this.$target.hide(); - }, - out: function () { - ysy.log.debug("Popup out()", "link_config"); - var delayLabels = ysy.view.getLabel("delay"); - var buttonLabels = ysy.view.getLabel("buttons"); - return { - readonly:this.dhtml.readonly, - title: delayLabels.title, - delay: this.dhtml.delay, - label_delay: delayLabels.label, - button_delete: buttonLabels.button_delete, - button_submit: buttonLabels.button_submit, - minimal:ysy.settings.workDayDelays?-1:"" - }; - }, - tideFunctionality: function () { - var model = this.model; - var dhtml = this.dhtml; - var $target = this.$target; - if (!ysy.settings.easyRedmine) $target.addClass("redmine"); - var close = function () { - ysy.log.debug("close link popup", "link_config"); - hideModal(); - }; - $target.find("#link_delete").on("click", function () { - model.remove(); - close(); - }); - $target.keyup(function (event) { - if (event.keyCode == 13) { - $("#link_close").click(); - } - }); - $target.find("#link_close").on("click", function () { - var delay = parseInt($target.find("#link_delay_input").val()); - close(); - if (isNaN(delay) || delay === dhtml.delay) return; - if(ysy.settings.workDayDelays && delay < -1) return; - dhtml.delay = delay || 0; - dhtml.widget.update(dhtml); - }); - $target.find("#link_fix_actual").on("click", function () { - var delay = model.getActDelay(); - close(); - dhtml.delay = delay || 0; - dhtml.widget.update(dhtml); - }); - $target.find("#link_remove_delay").on("click", function () { - close(); - dhtml.delay = 0; - dhtml.widget.update(dhtml); - }); - } -}); diff --git a/plugins/easy_gantt/assets/stylesheets/easy_gantt/dhtmlxgantt.css b/plugins/easy_gantt/assets/stylesheets/easy_gantt/dhtmlxgantt.css deleted file mode 100644 index 2ee152a4d0c3480a76aaf8c340a56e9c60f4143d..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/stylesheets/easy_gantt/dhtmlxgantt.css +++ /dev/null @@ -1,1367 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.1 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ - -.gridHoverStyle, -.gridSelection, -.timelineSelection { - background-color: #fff3a1 -} -.gantt_grid_scale .gantt_grid_head_cell { - color: #a6a6a6; - border-top: none!important; - /*border-right: none!important*/ -} -/*.gantt_grid_data .gantt_cell { - border-right: none; - color: #454545 -}*/ -.gantt_task_link .gantt_link_arrow_right { - border-width: 6px; - margin-top: -3px -} -.gantt_task_link .gantt_link_arrow_left { - border-width: 6px; - margin-left: -6px; - margin-top: -3px -} -.gantt_task_link .gantt_link_arrow_down, -.gantt_task_link .gantt_link_arrow_top { - border-width: 6px -} -.gantt_task_line .gantt_task_progress_drag { - bottom: -4px; - height: 16px; - margin-left: -8px; - width: 16px -} -.chartHeaderBg { - background-color: #fff -} -.gantt_task .gantt_task_scale .gantt_scale_cell { - color: #a6a6a6; - border-right: 1px solid #ebebeb -} - -/*.gantt_row.gantt_project-type,*/ -/*.gantt_row.odd.gantt_project-type {*/ -/*background-color: #edffef*/ -/*}*/ -.gantt_task_row.gantt_project-type, -.gantt_task_row.odd.gantt_project-type { - background-color: #f5fff6 -} -.gantt_task_line.gantt_project-type { - background-color: #65c16f; - border: 1px solid #3c9445 -} -.gantt_task_line.gantt_project-type .gantt_task_progress { - background-color: #46ad51 -} -.buttonBg { - background: #fff -} -.gantt_cal_light .gantt_btn_set { - margin: 5px 10px -} -.gantt_btn_set.gantt_cancel_btn_set { - background: #fff; - color: #454545; - border: 1px solid #cecece -} -.gantt_btn_set.gantt_save_btn_set { - background: #3db9d3; - text-shadow: 0 -1px 0 #248a9f; - color: #fff -} -.gantt_btn_set.gantt_delete_btn_set { - background: #ec8e00; - text-shadow: 0 -1px 0 #a60; - color: #fff -} -.gantt_cal_light_wide { - padding-left: 0!important; - padding-right: 0!important -} -.gantt_cal_light_wide .gantt_cal_larea { - border-left: none!important; - border-right: none!important -} -.dhtmlx_popup_button.dhtmlx_ok_button { - background: #3db9d3; - text-shadow: 0 -1px 0 #248a9f; - color: #fff; - font-weight: 700; - border-width: 0 -} -.dhtmlx_popup_button.dhtmlx_cancel_button { - font-weight: 700; - color: #454544 -} -.gantt_qi_big_icon.icon_edit { - color: #454545; - background: #fff -} -.gantt_qi_big_icon.icon_delete { - text-shadow: 0 -1px 0 #a60; - background: #ec8e00; - color: #fff; - border-width: 0 -} -.gantt_container { - font-family: Arial; - font-size: 13px; - border: 1px solid #cecece; - position: relative; - white-space: nowrap -} -.gantt_grid { - border-right: 1px solid #cecece -} -.gantt_task_scroll { - overflow-x: scroll -} -.gantt_task { - position: relative -} -.gantt_grid, -.gantt_task { - overflow-x: hidden; - overflow-y: hidden; - display: inline-block; - vertical-align: top -} -.gantt_grid_scale, -.gantt_task_scale { - color: #6b6b6b; - font-size: 12px; - border-bottom: 1px solid #cecece; - background-color: #fff -} -.gantt_scale_line { - box-sizing: border-box; - -moz-box-sizing: border-box; - border-top: 1px solid #cecece -} -.gantt_scale_line:first-child { - border-top: none -} -.gantt_grid_head_cell { - display: inline-block; - vertical-align: top; - border-right: 1px solid #cecece; - text-align: center; - position: relative; - cursor: default; - height: 100%; - -moz-user-select: -moz-none; - -webkit-user-select: none; - -user-select: none; - -ms-user-select: none; - overflow: hidden -} -.gantt_scale_line { - clear: both -} -.gantt_grid_data { - width: 100%; - overflow: hidden -} -.gantt_row { - position: relative; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -moz-user-select: -moz-none -} -.gantt_add, -.gantt_grid_head_add { - width: 100%; - height: 100%; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTQ3MjMyMENDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTQ3MjMyMERDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1NDcyMzIwQUM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1NDcyMzIwQkM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PshZT8UAAABbSURBVHjaYrTdeZmBEsCER+4wEP+H4sPkGGCDg020ARR7gb4GIAcYDKMDdPnDyAbYkGG5DVW9cIQMvUdBBAuUY4vDz8iAcZinA2zgCHqAYQMseAywJcYFAAEGAM+UFGuohFczAAAAAElFTkSuQmCC); - background-position: center center; - background-repeat: no-repeat; - cursor: pointer; - position: relative; - -moz-opacity: .3; - opacity: .3 -} -.gantt_grid_head_cell.gantt_grid_head_add { - -moz-opacity: .6; - opacity: .6; - top: 0 -} -.gantt_grid_head_cell.gantt_grid_head_add:hover { - -moz-opacity: 1; - opacity: 1 -} -@media screen { - .gantt_grid_data .gantt_row.odd:hover, - .gantt_grid_data .gantt_row:hover { - background-color: #fff3a1 - } -} -.gantt_grid_data .gantt_row.odd:hover .gantt_add, -.gantt_grid_data .gantt_row:hover .gantt_add { - -moz-opacity: 1; - opacity: 1 -} -.gantt_row, -.gantt_task_row { - border-bottom: 1px solid #ebebeb; - /*background-color: #fff*/ -} -.gantt_row.odd, -.gantt_task_row.odd { - /*background-color: #fff*/ -} -.gantt_cell, -.gantt_grid_head_cell, -.gantt_row, -.gantt_scale_cell, -.gantt_task_cell, -.gantt_task_row { - box-sizing: border-box; - -moz-box-sizing: border-box -} -.gantt_grid_head_cell, -.gantt_scale_cell { - line-height: inherit -} -.gantt_grid .gantt_grid_resize_wrap { - cursor: col-resize; - position: absolute; - width: 13px; - z-index: 1 -} -.gantt_grid_resize_wrap .gantt_grid_resize { - background-color: #cecece; - width: 1px; - margin: 0 auto -} -.gantt_drag_marker.gantt_grid_resize_area { - background-color: rgba(231, 231, 231, .5); - border-left: 1px solid #cecece; - border-right: 1px solid #cecece; - height: 100%; - width: 100%; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box -} -.gantt_cell { - display: inline-block; - vertical-align: top; - border-right: 1px solid #ebebeb; - padding-left: 6px; - padding-right: 6px; - height: 100%; - overflow: hidden; - white-space: nowrap; - font-size: 13px -} -.gantt_grid_data .gantt_last_cell, -.gantt_grid_scale .gantt_last_cell, -.gantt_task_bg .gantt_last_cell, -.gantt_task_scale .gantt_last_cell { - border-right-width: 0 -} -.gantt_task_bg { - overflow: hidden -} -.gantt_scale_cell { - display: inline-block; - white-space: nowrap; - overflow: hidden; - border-right: 1px solid #cecece; - text-align: center; - height: 100% -} -.gantt_task_cell { - display: inline-block; - height: 100%; - border-right: 1px solid #ebebeb -} -.gantt_ver_scroll { - width: 0; - background-color: transparent; - height: 1px; - overflow-x: hidden; - overflow-y: scroll; - display: none; - position: absolute; - right: 0 -} -.gantt_ver_scroll>div { - width: 1px; - height: 1px -} -.gantt_hor_scroll { - height: 0; - background-color: transparent; - width: 100%; - clear: both; - overflow-x: scroll; - overflow-y: hidden; - display: none -} -.gantt_hor_scroll>div { - width: 5000px; - height: 1px -} -.gantt_tree_indent { - width: 15px; - /*height: 100%;*/ - display: inline-block -} -.gantt_tree_content, -.gantt_tree_icon { - vertical-align: top -} -.gantt_tree_icon { - width: 28px; - height: 100%; - display: inline-block; - background-repeat: no-repeat; - background-position: center center -} -.gantt_tree_content { - height: 100%; - display: inline-block -} -.gantt_tree_icon.gantt_open { - background-image: url(data:image/gif;base64,R0lGODlhEgASALMJAMrKyt3d3ejp6d7f3+/v75aWlvf39////wAAAP///wAAAAAAAAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6M0I5RTczQjVDMDdBMTFFMTgxRjc4Mzk4M0Q3MjVFQzAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6M0I5RTczQjZDMDdBMTFFMTgxRjc4Mzk4M0Q3MjVFQzAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozQjlFNzNCM0MwN0ExMUUxODFGNzgzOTgzRDcyNUVDMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozQjlFNzNCNEMwN0ExMUUxODFGNzgzOTgzRDcyNUVDMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAkALAAAAAASABIAAARJMMlJq704661B+SAIXAVhnKhBFKSZnmuLImhslXPN3ibi+6pdBXc4IIpB2YkGE1IKAoL0ICUInJNCYMDtDgJYiScUGnHO6LQkAgA7); - width: 18px; - cursor: pointer -} -.gantt_tree_icon.gantt_close { - background-image: url(data:image/gif;base64,R0lGODlhEgASALMJAMrKyt3d3ejp6d7f3+/v75aWlvf39wAAAP///////wAAAAAAAAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzY0QzNGM0VDMDdBMTFFMUE3MDlCNUM2QjU1NDA5RjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzY0QzNGM0ZDMDdBMTFFMUE3MDlCNUM2QjU1NDA5RjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozNjRDM0YzQ0MwN0ExMUUxQTcwOUI1QzZCNTU0MDlGOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozNjRDM0YzREMwN0ExMUUxQTcwOUI1QzZCNTU0MDlGOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAkALAAAAAASABIAAARDMMlJq704661B+SAIXAVhnKhBFKSZnmv7wqxVzmpd3Uff5zKEUAi0uV4xm4DAbBIEOkohMKhaB4HoxBMKjTjgsFgSAQA7); - width: 18px; - cursor: pointer -} -.gantt_tree_icon.gantt_blank { - width: 18px -} -.gantt_tree_icon.gantt_folder_open { - background-image: url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTdDRDM3QzVDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTdDRDM3QzZDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1N0NEMzdDM0MwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMzdDNEMwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIzlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCBlXd+2XjjLKg5GqoeZXqvsOQXK/ijUZTKVUFADs=) -} -.gantt_tree_icon.gantt_folder_closed { - background-image: url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTAyMTU1RTNDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTAyMTU1RTRDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MDIxNTVFMUMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MDIxNTVFMkMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIwlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCuYIY6TYs+6bmHDO4igfdD3GNhheV0VQAADs=) -} -.gantt_tree_icon.gantt_file { - background-image: url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzkxQzI4RjZDMDZEMTFFMTgwRjhBQURDQzI3NDU3QUEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzkxQzI4RjdDMDZEMTFFMTgwRjhBQURDQzI3NDU3QUEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3OTFDMjhGNEMwNkQxMUUxODBGOEFBRENDMjc0NTdBQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3OTFDMjhGNUMwNkQxMUUxODBGOEFBRENDMjc0NTdBQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIylI+pwN16QJiUQiFThRlJm3RRFYSlR5qXMKmXaMDuuMoyOi8n/e6xn8NMHETgh5RaKQsAOw==) -} -.gantt_grid_head_cell .gantt_sort { - position: absolute; - right: 5px; - top: 8px; - width: 7px; - height: 13px; - background-repeat: no-repeat; - background-position: center center -} -.gantt_grid_head_cell .gantt_sort.gantt_asc { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC) -} -.gantt_grid_head_cell .gantt_sort.gantt_desc { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC) -} -.gantt_inserted, -.gantt_updated { - font-weight: 700 -} -.gantt_deleted { - text-decoration: line-through -} -.gantt_invalid { - background-color: #FFE0E0 -} -.gantt_error { - color: red -} -.gantt_status { - right: 1px; - padding: 5px 10px; - background: rgba(155, 155, 155, .1); - position: absolute; - top: 1px; - -webkit-transition: opacity .2s; - transition: opacity .2s; - opacity: 0 -} -.gantt_status.gantt_status_visible { - opacity: 1 -} -#gantt_ajax_dots span { - -webkit-transition: opacity .2s; - transition: opacity .2s; - background-repeat: no-repeat; - opacity: 0 -} -#gantt_ajax_dots span.gantt_dot_visible { - opacity: 1 -} -.dhtmlx_message_area { - position: fixed; - right: 5px; - width: 250px; - z-index: 1000 -} -.dhtmlx-message { // HOSEK - min-width: 120px; - font-family: Arial; - z-index: 10000; - margin: 5px 5px 10px; - -webkit-transition: all .5s ease; - -moz-transition: all .5s ease; - -o-transition: all .5s ease; - transition: all .5s ease; - font-size: 14px; - color: #000; - box-shadow: 3px 3px 3px rgba(0, 0, 0, .07); - padding: 0; - background-color: #FFF; - border-radius: 3px; - border: 1px solid #fff -} -.dhtmlx-message.hidden { // HOSEK - height: 0; - padding: 0; - border-width: 0; - margin: 0; - overflow: hidden -} -.dhtmlx_modal_box { - overflow: hidden; - display: inline-block; - min-width: 250px; - width: 250px; - text-align: center; - position: fixed; - z-index: 20000; - box-shadow: 3px 3px 3px rgba(0, 0, 0, .07); - font-family: Arial; - border-radius: 6px; - border: 1px solid #cecece; - background: #fff -} -.dhtmlx_popup_title { - border-top-left-radius: 6px; - border-top-right-radius: 6px; - border-width: 0 -} -.dhtmlx_button, -.dhtmlx_popup_button { - border: 1px solid #cecece; - height: 30px; - line-height: 30px; - display: inline-block; - margin: 0 5px; - border-radius: 4px; - background: #fff -} -.dhtmlx-message, /* HOSEK*/ -.dhtmlx_button, -.dhtmlx_popup_button { - user-select: none; - -webkit-user-select: none; - -moz-user-select: -moz-none; - -ms-user-select: none; - cursor: pointer -} -.dhtmlx_popup_text { - overflow: hidden -} -.dhtmlx_popup_controls { - border-radius: 6px; - padding: 10px -} -.dhtmlx_popup_button { - min-width: 100px -} -div.dhx_modal_cover { - background-color: #000; - cursor: default; - filter: alpha(opacity=20); - opacity: .2; - position: fixed; - z-index: 19999; - left: 0; - top: 0; - width: 100%; - height: 100%; - border: none; - zoom: 1 -} -.dhtmlx-message img, /* HOSEK */ -.dhtmlx_modal_box img { - float: left; - margin-right: 20px -} -.dhtmlx-alert-error, -.dhtmlx-confirm-error { - border: 1px solid red -} -.dhtmlx_button input, -.dhtmlx_popup_button div { - border-radius: 4px; - font-size: 14px; - -moz-box-sizing: content-box; - box-sizing: content-box; - padding: 0; - margin: 0; - vertical-align: top -} -.dhtmlx_popup_title { - color: #fff; - text-shadow: 1px 1px #000; - height: 40px; - line-height: 40px; - font-size: 20px -} -.dhtmlx_popup_text { - margin: 15px 15px 5px; - font-size: 14px; - color: #000; - min-height: 30px; - border-radius: 6px -} - -/* HOSEK V */ -/*.dhtmlx-error, -.dhtmlx-info { - font-size: 14px; - color: #000; - box-shadow: 3px 3px 3px rgba(0, 0, 0, .07); - padding: 0; - background-color: #FFF; - border-radius: 3px; - border: 1px solid #fff -}*/ -.dhtmlx-message div { - padding: 5px 10px; - border-radius: 3px; -} -.dhtmlx-info div { - background-color: #fff; - border: 1px solid #cecece; -} -.dhtmlx-error { - background-color: #d81b1b; - border: 1px solid #ff3c3c; -} -.dhtmlx-error div { - background-color: #d81b1b; - border: 1px solid #940000; - color: #FFF; -} -.dhtmlx-success { - background-color: #2dff2d; - border: 1px solid #6CFF6C; -} -.dhtmlx-success div { - background-color: #2dff2d; - border: 1px solid #1B991B; - /*color: #FFF*/ -} -/* HOSEK A */ -.gantt_data_area div, -.gantt_grid div { - -ms-touch-action: none; - -webkit-tap-highlight-color: transparent -} -.gantt_data_area { - position: relative; - overflow-x: hidden; - overflow-y: hidden; - -moz-user-select: -moz-none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; -} -.gantt_links_area { - position: absolute; - left: 0; - top: 0 -} -.gantt_side_content, -.gantt_task_content, -.gantt_task_progress { - line-height: inherit; - overflow: hidden; - height: 100% -} -.gantt_task_content { - font-size: 12px; - /*color: #fff;*/ - width: 100%; - top: 0; - position: absolute; - white-space: nowrap; - text-align: center -} -.gantt_task_progress { - text-align: center; - z-index: 0; - background: #299cb4 -} -.gantt_task_line { - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - position: absolute; - -moz-box-sizing: border-box; - box-sizing: border-box; - background-color: #3db9d3; - border: 1px solid #2898b0; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -moz-user-select: -moz-none -} -.gantt_task_line.gantt_drag_move div { - cursor: move -} -.gantt_touch_move, -.gantt_touch_progress .gantt_touch_resize { - -moz-transform: scale(1.02, 1.1); - -o-transform: scale(1.02, 1.1); - -webkit-transform: scale(1.02, 1.1); - transform: scale(1.02, 1.1); - -moz-transform-origin: 50%; - -o-transform-origin: 50%; - -webkit-transform-origin: 50%; - transform-origin: 50% -} -.gantt_touch_progress .gantt_task_progress_drag, -.gantt_touch_resize .gantt_task_drag { - -moz-transform: scaleY(1.3); - -o-transform: scaleY(1.3); - -webkit-transform: scaleY(1.3); - transform: scaleY(1.3); - -moz-transform-origin: 50%; - -o-transform-origin: 50%; - -webkit-transform-origin: 50%; - transform-origin: 50% -} -.gantt_side_content { - position: absolute; - white-space: nowrap; - /*color: #6e6e6e;*/ - bottom: 1px; - /*font-size: 14px*/ -} -.gantt_side_content.gantt_left { - right: 100%; - padding-right: 15px -} -.gantt_side_content.gantt_right { - left: 100%; - padding-left: 15px -} -.gantt_side_content.gantt_link_crossing { - /*bottom: 8.75px*/ -} -.gantt_link_arrow, -.gantt_task_link .gantt_line_wrapper { - position: absolute; - cursor: pointer -} -.gantt_line_wrapper div { - /*background-color: #ffa011;*/ - border: 1px solid #ffa011; -} -.gantt_task_link:hover .gantt_line_wrapper div { - box-shadow: 0 0 5px 0 #ffa011 -} -.gantt_task_link div.gantt_link_arrow { - background-color: transparent; - border-style: solid; - width: 0; - height: 0 -} -.gantt_link_control { - position: absolute; - width: 13px; - top: 0 -} -.gantt_link_control div { - display: none; - cursor: pointer; - box-sizing: border-box; - position: relative; - top: 50%; - margin-top: -7.5px; - vertical-align: middle; - border: 1px solid #929292; - -webkit-border-radius: 6.5px; - -moz-border-radius: 6.5px; - border-radius: 6.5px; - height: 13px; - width: 13px; - background-color: #f0f0f0 -} -.gantt_link_control div:hover { - background-color: #fff -} -.gantt_link_control.task_left { - left: -13px -} -.gantt_link_control.task_right { - right: -13px -} -.gantt_link_target .gantt_link_control div, -.gantt_task_line.gantt_selected .gantt_link_control div, -.gantt_task_line:hover .gantt_link_control div { - display: block -} -.gantt_link_source, -.gantt_link_target { - box-shadow: 0 0 3px #3db9d3 -} -.gantt_link_target.link_finish_allow, -.gantt_link_target.link_start_allow { - box-shadow: 0 0 3px #ffbf5e -} -.gantt_link_target.link_finish_deny, -.gantt_link_target.link_start_deny { - box-shadow: 0 0 3px #e87e7b -} -.link_finish_allow .gantt_link_control.task_right div, -.link_start_allow .gantt_link_control.task_left div { - background-color: #ffbf5e; - border-color: #ffa011 -} -.link_finish_deny .gantt_link_control.task_right div, -.link_start_deny .gantt_link_control.task_left div { - background-color: #e87e7b; - border-color: #dd3e3a -} -.gantt_link_arrow_right { - border-width: 4px 0 4px 6px; - border-top-color: transparent!important; - border-right-color: transparent!important; - border-bottom-color: transparent!important; - border-color: #ffa011; - margin-top: -1px -} -.gantt_link_arrow_left { - border-width: 4px 6px 4px 0; - margin-top: -1px; - border-top-color: transparent!important; - border-color: #ffa011; - border-bottom-color: transparent!important; - border-left-color: transparent!important -} -.gantt_link_arrow_top { - border-width: 0 4px 6px; - border-color: #ffa011; - border-top-color: transparent!important; - border-right-color: transparent!important; - border-left-color: transparent!important -} -.gantt_link_arrow_down { - border-width: 4px 6px 0 4px; - border-color: #ffa011; - border-right-color: transparent!important; - border-bottom-color: transparent!important; - border-left-color: transparent!important -} -.gantt_task_drag, -.gantt_task_progress_drag { - cursor: w-resize; - height: 100%; - display: none; - position: absolute -} -.gantt_task_line.gantt_selected .gantt_task_drag, -.gantt_task_line.gantt_selected .gantt_task_progress_drag, -.gantt_task_line:hover .gantt_task_drag, -.gantt_task_line:hover .gantt_task_progress_drag { - display: block -} -.gantt_task_drag { - width: 6px; - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAACCAYAAAB7Xa1eAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYDDjkw3UJvAwAAABRJREFUCNdj/P//PwM2wASl/6PTAKrrBf4+lD8LAAAAAElFTkSuQmCC); - z-index: 1; - top: 0 -} -.gantt_task_drag.task_left { - left: 0 -} -.gantt_task_drag.task_right { - right: 0 -} -.gantt_task_progress_drag { - height: 8px; - width: 8px; - bottom: -4px; - margin-left: -4px; - background-position: bottom; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY3Rjk0RUVDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY3Rjk0RUZDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjdGOTRFQ0MyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjdGOTRFREMyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PobPBzIAAADkSURBVHjaYpk2bRoDDsAExL1QdjEQ/8OmiAWHZk4gXqymqhQM4ty6fU8OSMUA8XdiDBAB4k0a6iqWRga6EKcwMQXduHlnL5DpB8Rv0J2JDFSA+JiOtgZcMwiA2CAxkBxUDVYDLEAKgIpV9XQ0MZwFEgPJAZnHoWpRDAgC4n2W5saiQKfjClQGkBxQDciL+6B6wAbkA/EqJwdrTkUFOQZCAKQGpBbIXA3SCzJggo+XK7OEuBgDsQCkFqgHrBfsBT5eHgZSAUwP2IBfv36TbABMDygdtK1Zv6UESLORaAbIhG6AAAMAKN8wE24DXWcAAAAASUVORK5CYII=); - background-repeat: no-repeat; - z-index: 2 -} -.gantt_link_tooltip { - box-shadow: 3px 3px 3px #888; - background-color: #fff; - border-left: 1px dotted #cecece; - border-top: 1px dotted #cecece; - font-family: Tahoma; - font-size: 8pt; - color: #444; - padding: 6px; - line-height: 20px -} -.gantt_link_direction { - height: 0; - border: 0 #ffa011; - border-bottom-style: dashed; - border-bottom-width: 2px; - transform-origin: 0 0; - -ms-transform-origin: 0 0; - -webkit-transform-origin: 0 0; - z-index: 2; - margin-left: 1px; - position: absolute -} -.gantt_grid_data .gantt_row.gantt_selected, -.gantt_grid_data .gantt_row.odd.gantt_selected, -.gantt_task_row.gantt_selected { - background-color: #fff3a1 -} -.gantt_task_row.gantt_selected .gantt_task_cell { - border-right-color: #ffec6e -} -.gantt_task_line.gantt_selected { - box-shadow: 0 0 5px #299cb4 -} -.gantt_task_line.gantt_project-type.gantt_selected { - box-shadow: 0 0 5px #46ad51 -} -.gantt_task_line.gantt_milestone-type { - visibility: hidden; - background-color: #d33daf; - border: 0 solid #61164f; - box-sizing: content-box; - -moz-box-sizing: content-box -} -.gantt_task_line.gantt_milestone-type div { - visibility: visible -} -.gantt_task_line.gantt_milestone-type .gantt_task_content { - background: inherit; - border: inherit; - border-width: 1px; - border-radius: inherit; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg) -} -.gantt_task_line.gantt_task_inline_color { - border-color: #999 -} -.gantt_task_line.gantt_task_inline_color .gantt_task_progress { - background-color: #363636; - opacity: .2 -} -.gantt_task_line.gantt_task_inline_color.gantt_project-type.gantt_selected, -.gantt_task_line.gantt_task_inline_color.gantt_selected { - box-shadow: 0 0 5px #999 -} -.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div { - box-shadow: 0 0 5px 0 #999 -} -.gantt_critical_task { - background-color: #e63030; - border-color: #9d3a3a -} -.gantt_critical_task .gantt_task_progress { - background-color: rgba(0, 0, 0, .4) -} -.gantt_critical_link .gantt_line_wrapper>div { - background-color: #e63030 -} -.gantt_critical_link .gantt_link_arrow { - border-color: #e63030 -} -.gantt_unselectable, -.gantt_unselectable div { - -webkit-user-select: none; - -moz-user-select: none; - -moz-user-select: -moz-none; - -ms-user-select: none; -} -.gantt_cal_light { - -webkit-tap-highlight-color: transparent; - background: #fff; - border-radius: 6px; - font-family: Arial; - border: 1px solid #cecece; - color: #6b6b6b; - font-size: 12px; - position: absolute; - z-index: 10001; - width: 550px; - height: 250px; - box-shadow: 3px 3px 3px rgba(0, 0, 0, .07) -} -.gantt_cal_light select { - font-family: Arial; - border: 1px solid #cecece; - font-size: 13px; - padding: 2px; - margin: 0 -} -.gantt_cal_ltitle { - padding: 7px 10px; - overflow: hidden; - white-space: nowrap; - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius-topleft: 6px; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 0; - border-radius: 6px 6px 0 0 -} -.gantt_cal_ltitle span { - white-space: nowrap -} -.gantt_cal_lsection { - color: #727272; - font-weight: 700; - padding: 12px 0 5px 10px -} -.gantt_cal_lsection .gantt_fullday { - float: right; - margin-right: 5px; - font-size: 12px; - font-weight: 400; - line-height: 20px; - vertical-align: top; - cursor: pointer -} -.gantt_cal_lsection { - font-size: 13px -} -.gantt_cal_ltext { - padding: 2px 10px; - overflow: hidden -} -.gantt_cal_ltext textarea { - overflow: auto; - font-family: Arial; - font-size: 13px; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - border: 1px solid #cecece; - height: 100%; - width: 100%; - outline: 0!important; - resize: none -} -.gantt_time { - font-weight: 700 -} -.gantt_cal_light .gantt_title { - padding-left: 10px -} -.gantt_cal_larea { - border: 1px solid #cecece; - border-left: none; - border-right: none; - background-color: #fff; - overflow: hidden; - height: 1px -} -.gantt_btn_set { - margin: 10px 7px 5px 10px; - padding: 5px 15px 5px 10px; - float: left; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - border-width: 0; - border-color: #cecece; - border-style: solid; - height: 32px; - font-weight: 700; - background: #fff; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - cursor: pointer -} -.gantt_btn_set div { - float: left; - font-size: 13px; - height: 22px; - line-height: 22px; - background-repeat: no-repeat; - vertical-align: middle -} -.gantt_save_btn { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTk1OUU5RDFDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTk1OUU5RDJDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxOTU5RTlDRkMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxOTU5RTlEMEMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjDroXYAAAEXSURBVHjaYvz//z8DJYCRUgPIAUxAbAnEHiAHMIBcQCwGaRYXF3e6evXqoffv39/dv38/CymaGSUkJBzv3LlzCsj///fv3wdAihkkIQnEvkAshU8zLy+v7a1bt06ANP/79+87kDIAy505cybq06dPr3p7ezuwGQLTfOPGjWP/ESAZLg8kPKBO+g01RBJNszWyZqC6uSgWgIg/f/4shxnS2dnZBjMEqNkSFGBImi8CKTYMA4BYCGjIczRDHC5dunQQSfN7IKWI4UUkjjdMMdCwnw8ePLjwHxV4Yw1gZA5Q47z/2EELzhhCE+ABGvIQWSeQvwcU38QaAML2wHj+C/X3MyAlijeB4ZBoBOIPQGxJKIVSnBsBAgwABddBclWfcZUAAAAASUVORK5CYII=); - margin-top: 2px; - width: 21px -} -.gantt_cancel_btn { - margin-top: 2px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDkzMDA3MzlDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDkzMDA3M0FDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowOTMwMDczN0MzMDQxMUUyODZBNUUzMURDODBGQkRENiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowOTMwMDczOEMzMDQxMUUyODZBNUUzMURDODBGQkRENiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmYuYOUAAAEdSURBVHjaYvz//z8DJYAFXWDlypU8QKoIiD2A2AwqfAqIdwBxX3h4+Bdk9YzILgBqtgdS84FYEYeF94E4EWjIQZgAE5LmQCB1AKoZZKMPEAtAMYh9GSp3AKjWD8UFQAEhIPshEIOc3wHENUBb/qJ57SyQMoJyPwKxElDNO1gYFEE17wMKVmIJlzNQzeegrjaA6qmBecEbSvfh0GwMxGeBhoPoemQ9MAO0kEIbl2YTqPAFKK2IbMB3AjabYIkRZmQD7kNpMyI0G0PpO8gGbIUFJj7NQDk2INWIrIcJKfBAKcwJqvkcDs0TgFgXGo19KCkRmpDWQdWDEk0NUoCBoq0FqhkE/IEWbKJKUmZEz43QzFSKIzN1481M5ACAAAMAlfl/lCwRpagAAAAASUVORK5CYII=); - width: 20px -} -.gantt_delete_btn { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=); - margin-top: 2px; - width: 20px -} -.gantt_cal_cover { - width: 100%; - height: 100%; - position: absolute; - z-index: 10000; - top: 0; - left: 0; - background-color: #000; - opacity: .1; - filter: alpha(opacity=10) -} -.gantt_custom_button { - padding: 0 3px; - font-family: Arial; - font-size: 13px; - font-weight: 400; - margin-right: 10px; - margin-top: -5px; - cursor: pointer; - float: right; - height: 21px; - width: 90px; - border: 1px solid #CECECE; - text-align: center; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - -ms-border-radius: 4px; - -o-border-radius: 4px; - border-radius: 4px -} -.gantt_custom_button div { - cursor: pointer; - float: none; - height: 21px; - line-height: 21px; - vertical-align: middle -} -.gantt_custom_button div:first-child { - display: none -} -.gantt_cal_light_wide { - width: 580px; - padding: 2px 4px -} -.gantt_cal_light_wide .gantt_cal_larea { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - border: 1px solid #cecece -} -.gantt_cal_light_wide .gantt_cal_lsection { - border: 0; - float: left; - text-align: right; - width: 80px; - height: 20px; - padding: 5px 10px 0 0 -} -.gantt_cal_light_wide .gantt_wrap_section { - position: relative; - padding: 10px 0; - overflow: hidden; - border-bottom: 1px solid #ebebeb -} -.gantt_cal_light_wide .gantt_section_time { - overflow: hidden; - padding-top: 2px!important; - padding-right: 0; - height: 20px!important -} -.gantt_cal_light_wide .gantt_cal_ltext { - padding-right: 0 -} -.gantt_cal_light_wide .gantt_cal_larea { - padding: 0 10px; - width: 100% -} -.gantt_cal_light_wide .gantt_section_time { - background: 0 0 -} -.gantt_cal_light_wide .gantt_cal_checkbox label { - padding-left: 0 -} -.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday { - float: none; - margin-right: 0; - font-weight: 700; - cursor: pointer -} -.gantt_cal_light_wide .gantt_custom_button { - position: absolute; - top: 0; - right: 0; - margin-top: 2px -} -.gantt_cal_light_wide .gantt_repeat_right { - margin-right: 55px -} -.gantt_cal_light_wide.gantt_cal_light_full { - width: 738px -} -.gantt_cal_wide_checkbox input { - margin-top: 8px; - margin-left: 14px -} -.gantt_cal_light input { - font-size: 13px -} -.gantt_section_time { - background-color: #fff; - white-space: nowrap; - padding: 5px 10px; - padding-top: 2px!important -} -.gantt_section_time .gantt_time_selects { - float: left; - height: 25px -} -.gantt_section_time .gantt_time_selects select { - height: 23px; - padding: 2px; - border: 1px solid #cecece -} -.gantt_duration { - width: 100px; - height: 23px; - float: left; - white-space: nowrap; - margin-left: 20px; - line-height: 23px -} -.gantt_duration .gantt_duration_dec, -.gantt_duration .gantt_duration_inc, -.gantt_duration .gantt_duration_value { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - text-align: center; - vertical-align: top; - height: 100%; - border: 1px solid #cecece -} -.gantt_duration .gantt_duration_value { - width: 40px; - padding: 3px 4px; - border-left-width: 0; - border-right-width: 0 -} -.gantt_duration .gantt_duration_dec, -.gantt_duration .gantt_duration_inc { - width: 20px; - padding: 1px 1px 3px; - background: #fff -} -.gantt_duration .gantt_duration_dec { - -moz-border-top-left-radius: 4px; - -moz-border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px -} -.gantt_duration .gantt_duration_inc { - margin-right: 4px; - -moz-border-top-right-radius: 4px; - -moz-border-bottom-right-radius: 4px; - -webkit-border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-top-right-radius: 4px; - border-bottom-right-radius: 4px -} -.gantt_cal_quick_info { - border: 1px solid #cecece; - border-radius: 6px; - position: absolute; - z-index: 300; - box-shadow: 3px 3px 3px rgba(0, 0, 0, .07); - background-color: #fff; - width: 300px; - transition: left .5s ease, right .5s; - -moz-transition: left .5s ease, right .5s; - -webkit-transition: left .5s ease, right .5s; - -o-transition: left .5s ease, right .5s -} -.gantt_no_animate { - transition: none; - -moz-transition: none; - -webkit-transition: none; - -o-transition: none -} -.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon { - float: right -} -.gantt_cal_qi_title { - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius-topleft: 6px; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 0; - border-radius: 6px 6px 0 0; - padding: 5px 0 8px 12px; - color: #454545; - background-color: #fff; - border-bottom: 1px solid #cecece -} -.gantt_cal_qi_tdate { - font-size: 14px; - font-weight: 700 -} -.gantt_cal_qi_tcontent { - font-size: 13px -} -.gantt_cal_qi_content { - padding: 16px 8px; - font-size: 13px; - color: #454545; - overflow: hidden -} -.gantt_cal_qi_controls { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius-topleft: 0; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topright: 0; - -moz-border-radius-bottomright: 6px; - border-radius: 0 0 6px 6px; - padding-left: 7px -} -.gantt_cal_qi_controls .gantt_menu_icon { - margin-top: 6px; - background-repeat: no-repeat -} -.gantt_cal_qi_controls .gantt_menu_icon.icon_edit { - width: 20px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC) -} -.gantt_cal_qi_controls .gantt_menu_icon.icon_delete { - width: 20px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=) -} -.gantt_qi_big_icon { - font-size: 13px; - border-radius: 4px; - font-weight: 700; - background: #fff; - margin: 5px 9px 8px 0; - min-width: 60px; - line-height: 32px; - vertical-align: middle; - padding: 0 10px 0 5px; - cursor: pointer; - border: 1px solid #cecece -} -.gantt_cal_qi_controls div { - float: left; - height: 32px; - text-align: center; - line-height: 32px -} -.gantt_tooltip { - box-shadow: 3px 3px 3px rgba(0, 0, 0, .07); - background-color: #fff; - border-left: 1px solid rgba(0, 0, 0, .07); - border-top: 1px solid rgba(0, 0, 0, .07); - font-family: Arial; - font-size: 8pt; - color: #454545; - padding: 10px; - position: absolute; - z-index: 50 -} -.gantt_marker { - height: 100%; - width: 2px; - top: 0; - position: absolute; - text-align: center; - background-color: rgba(255, 0, 0, .4); - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box -} -.gantt_marker .gantt_marker_content { - padding: 5px; - background: inherit; - color: #fff; - position: absolute; - font-size: 12px; - line-height: 12px; - opacity: .8 -} -.gantt_marker_area { - position: absolute; - top: 0; - left: 0 -} -.gantt_noselect { - -moz-user-select: -moz-none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none -} -.gantt_drag_marker { - position: absolute; - font-family: Arial; - font-size: 13px -} -.gantt_drag_marker .gantt_tree_icon.gantt_blank, -.gantt_drag_marker .gantt_tree_icon.gantt_close, -.gantt_drag_marker .gantt_tree_icon.gantt_open, -.gantt_drag_marker .gantt_tree_indent { - display: none -} -.gantt_drag_marker, -.gantt_drag_marker .gantt_row.odd { - background-color: #fff -} -.gantt_drag_marker .gantt_row { - border-left: 1px solid #d2d2d2; - border-top: 1px solid #d2d2d2 -} -.gantt_drag_marker .gantt_cell { - border-color: #d2d2d2 -} -.gantt_row.gantt_over, -.gantt_task_row.gantt_over { - background-color: #0070fe -} -.gantt_row.gantt_transparent .gantt_cell { - opacity: .7 -} -.gantt_task_row.gantt_transparent { - background-color: #f8fdfd -} -.dhtmlx_popup_button.dhtmlx_delete_button { - background: #3db9d3; - text-shadow: 0 -1px 0 #248a9f; - color: #fff; - font-weight: 700; - border-width: 0 -} \ No newline at end of file diff --git a/plugins/easy_gantt/assets/stylesheets/easy_gantt/dhtmlxgantt_vanilla.css b/plugins/easy_gantt/assets/stylesheets/easy_gantt/dhtmlxgantt_vanilla.css deleted file mode 100644 index 8a6ac9335d3f0290508480147f57048808c516d8..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/stylesheets/easy_gantt/dhtmlxgantt_vanilla.css +++ /dev/null @@ -1,9 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.1 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ -.gridHoverStyle,.gridSelection,.timelineSelection{background-color:#fff3a1}.gantt_grid_scale .gantt_grid_head_cell{color:#a6a6a6;border-top:none!important;border-right:none!important}.gantt_grid_data .gantt_cell{border-right:none;color:#454545}.gantt_task_link .gantt_link_arrow_right{border-width:6px;margin-top:-3px}.gantt_task_link .gantt_link_arrow_left{border-width:6px;margin-left:-6px;margin-top:-3px}.gantt_task_link .gantt_link_arrow_down,.gantt_task_link .gantt_link_arrow_top{border-width:6px}.gantt_task_line .gantt_task_progress_drag{bottom:-4px;height:16px;margin-left:-8px;width:16px}.chartHeaderBg{background-color:#fff}.gantt_task .gantt_task_scale .gantt_scale_cell{color:#a6a6a6;border-right:1px solid #ebebeb}.gantt_row.gantt_project,.gantt_row.odd.gantt_project{background-color:#edffef}.gantt_task_row.gantt_project,.gantt_task_row.odd.gantt_project{background-color:#f5fff6}.gantt_task_line.gantt_project{background-color:#65c16f;border:1px solid #3c9445}.gantt_task_line.gantt_project .gantt_task_progress{background-color:#46ad51}.buttonBg{background:#fff}.gantt_cal_light .gantt_btn_set{margin:5px 10px}.gantt_btn_set.gantt_cancel_btn_set{background:#fff;color:#454545;border:1px solid #cecece}.gantt_btn_set.gantt_save_btn_set{background:#3db9d3;text-shadow:0 -1px 0 #248a9f;color:#fff}.gantt_btn_set.gantt_delete_btn_set{background:#ec8e00;text-shadow:0 -1px 0 #a60;color:#fff}.gantt_cal_light_wide{padding-left:0!important;padding-right:0!important}.gantt_cal_light_wide .gantt_cal_larea{border-left:none!important;border-right:none!important}.dhtmlx_popup_button.dhtmlx_ok_button{background:#3db9d3;text-shadow:0 -1px 0 #248a9f;color:#fff;font-weight:700;border-width:0}.dhtmlx_popup_button.dhtmlx_cancel_button{font-weight:700;color:#454544}.gantt_qi_big_icon.icon_edit{color:#454545;background:#fff}.gantt_qi_big_icon.icon_delete{text-shadow:0 -1px 0 #a60;background:#ec8e00;color:#fff;border-width:0}.gantt_container{font-family:Arial;font-size:13px;border:1px solid #cecece;position:relative;white-space:nowrap}.gantt_grid{border-right:1px solid #cecece}.gantt_task_scroll{overflow-x:scroll}.gantt_task{position:relative}.gantt_grid,.gantt_task{overflow-x:hidden;overflow-y:hidden;display:inline-block;vertical-align:top}.gantt_grid_scale,.gantt_task_scale{color:#6b6b6b;font-size:12px;border-bottom:1px solid #cecece;background-color:#fff}.gantt_scale_line{box-sizing:border-box;-moz-box-sizing:border-box;border-top:1px solid #cecece}.gantt_scale_line:first-child{border-top:none}.gantt_grid_head_cell{display:inline-block;vertical-align:top;border-right:1px solid #cecece;text-align:center;position:relative;cursor:default;height:100%;-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none;overflow:hidden}.gantt_scale_line{clear:both}.gantt_grid_data{width:100%;overflow:hidden}.gantt_row{position:relative;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_add,.gantt_grid_head_add{width:100%;height:100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTQ3MjMyMENDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTQ3MjMyMERDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1NDcyMzIwQUM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1NDcyMzIwQkM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PshZT8UAAABbSURBVHjaYrTdeZmBEsCER+4wEP+H4sPkGGCDg020ARR7gb4GIAcYDKMDdPnDyAbYkGG5DVW9cIQMvUdBBAuUY4vDz8iAcZinA2zgCHqAYQMseAywJcYFAAEGAM+UFGuohFczAAAAAElFTkSuQmCC);background-position:center center;background-repeat:no-repeat;cursor:pointer;position:relative;-moz-opacity:.3;opacity:.3}.gantt_grid_head_cell.gantt_grid_head_add{-moz-opacity:.6;opacity:.6;top:0}.gantt_grid_head_cell.gantt_grid_head_add:hover{-moz-opacity:1;opacity:1}.gantt_grid_data .gantt_row.odd:hover,.gantt_grid_data .gantt_row:hover{background-color:#fff3a1}.gantt_grid_data .gantt_row.odd:hover .gantt_add,.gantt_grid_data .gantt_row:hover .gantt_add{-moz-opacity:1;opacity:1}.gantt_row,.gantt_task_row{border-bottom:1px solid #ebebeb;background-color:#fff}.gantt_row.odd,.gantt_task_row.odd{background-color:#fff}.gantt_cell,.gantt_grid_head_cell,.gantt_row,.gantt_scale_cell,.gantt_task_cell,.gantt_task_row{box-sizing:border-box;-moz-box-sizing:border-box}.gantt_grid_head_cell,.gantt_scale_cell{line-height:inherit}.gantt_grid_scale .gantt_grid_column_resize_wrap{cursor:col-resize;position:absolute;width:13px}.gantt_grid_column_resize_wrap .gantt_grid_column_resize{background-color:#cecece;height:100%;width:1px;margin:0 auto}.gantt_grid .gantt_grid_resize_wrap{cursor:col-resize;position:absolute;width:13px;z-index:1}.gantt_grid_resize_wrap .gantt_grid_resize{background-color:#cecece;width:1px;margin:0 auto}.gantt_drag_marker.gantt_grid_resize_area{background-color:rgba(231,231,231,.5);border-left:1px solid #cecece;border-right:1px solid #cecece;height:100%;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.gantt_cell{display:inline-block;vertical-align:top;border-right:1px solid #ebebeb;padding-left:6px;padding-right:6px;height:100%;overflow:hidden;white-space:nowrap;font-size:13px}.gantt_grid_data .gantt_last_cell,.gantt_grid_scale .gantt_last_cell,.gantt_task_bg .gantt_last_cell,.gantt_task_scale .gantt_last_cell{border-right-width:0}.gantt_task_bg{overflow:hidden}.gantt_scale_cell{display:inline-block;white-space:nowrap;overflow:hidden;border-right:1px solid #cecece;text-align:center;height:100%}.gantt_task_cell{display:inline-block;height:100%;border-right:1px solid #ebebeb}.gantt_ver_scroll{width:0;background-color:transparent;height:1px;overflow-x:hidden;overflow-y:scroll;display:none;position:absolute;right:0}.gantt_ver_scroll>div{width:1px;height:1px}.gantt_hor_scroll{height:0;background-color:transparent;width:100%;clear:both;overflow-x:scroll;overflow-y:hidden;display:none}.gantt_hor_scroll>div{width:5000px;height:1px}.gantt_tree_indent{width:15px;height:100%;display:inline-block}.gantt_tree_content,.gantt_tree_icon{vertical-align:top}.gantt_tree_icon{width:28px;height:100%;display:inline-block;background-repeat:no-repeat;background-position:center center}.gantt_tree_content{height:100%;display:inline-block}.gantt_tree_icon.gantt_open{background-image:url(data:image/gif;base64,R0lGODlhEgASALMJAMrKyt3d3ejp6d7f3+/v75aWlvf39////wAAAP///wAAAAAAAAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6M0I5RTczQjVDMDdBMTFFMTgxRjc4Mzk4M0Q3MjVFQzAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6M0I5RTczQjZDMDdBMTFFMTgxRjc4Mzk4M0Q3MjVFQzAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozQjlFNzNCM0MwN0ExMUUxODFGNzgzOTgzRDcyNUVDMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozQjlFNzNCNEMwN0ExMUUxODFGNzgzOTgzRDcyNUVDMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAkALAAAAAASABIAAARJMMlJq704661B+SAIXAVhnKhBFKSZnmuLImhslXPN3ibi+6pdBXc4IIpB2YkGE1IKAoL0ICUInJNCYMDtDgJYiScUGnHO6LQkAgA7);width:18px;cursor:pointer}.gantt_tree_icon.gantt_close{background-image:url(data:image/gif;base64,R0lGODlhEgASALMJAMrKyt3d3ejp6d7f3+/v75aWlvf39wAAAP///////wAAAAAAAAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzY0QzNGM0VDMDdBMTFFMUE3MDlCNUM2QjU1NDA5RjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzY0QzNGM0ZDMDdBMTFFMUE3MDlCNUM2QjU1NDA5RjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozNjRDM0YzQ0MwN0ExMUUxQTcwOUI1QzZCNTU0MDlGOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozNjRDM0YzREMwN0ExMUUxQTcwOUI1QzZCNTU0MDlGOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAkALAAAAAASABIAAARDMMlJq704661B+SAIXAVhnKhBFKSZnmv7wqxVzmpd3Uff5zKEUAi0uV4xm4DAbBIEOkohMKhaB4HoxBMKjTjgsFgSAQA7);width:18px;cursor:pointer}.gantt_tree_icon.gantt_blank{width:18px}.gantt_tree_icon.gantt_folder_open{background-image:url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTdDRDM3QzVDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTdDRDM3QzZDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1N0NEMzdDM0MwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMzdDNEMwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIzlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCBlXd+2XjjLKg5GqoeZXqvsOQXK/ijUZTKVUFADs=)}.gantt_tree_icon.gantt_folder_closed{background-image:url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTAyMTU1RTNDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTAyMTU1RTRDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MDIxNTVFMUMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MDIxNTVFMkMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIwlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCuYIY6TYs+6bmHDO4igfdD3GNhheV0VQAADs=)}.gantt_tree_icon.gantt_file{background-image:url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzkxQzI4RjZDMDZEMTFFMTgwRjhBQURDQzI3NDU3QUEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzkxQzI4RjdDMDZEMTFFMTgwRjhBQURDQzI3NDU3QUEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3OTFDMjhGNEMwNkQxMUUxODBGOEFBRENDMjc0NTdBQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3OTFDMjhGNUMwNkQxMUUxODBGOEFBRENDMjc0NTdBQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIylI+pwN16QJiUQiFThRlJm3RRFYSlR5qXMKmXaMDuuMoyOi8n/e6xn8NMHETgh5RaKQsAOw==)}.gantt_grid_head_cell .gantt_sort{position:absolute;right:5px;top:8px;width:7px;height:13px;background-repeat:no-repeat;background-position:center center}.gantt_grid_head_cell .gantt_sort.gantt_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort.gantt_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC)}.gantt_inserted,.gantt_updated{font-weight:700}.gantt_deleted{text-decoration:line-through}.gantt_invalid{background-color:FFE0E0}.gantt_error{color:red}.gantt_status{right:1px;padding:5px 10px;background:rgba(155,155,155,.1);position:absolute;top:1px;-webkit-transition:opacity .2s;transition:opacity .2s;opacity:0}.gantt_status.gantt_status_visible{opacity:1}#gantt_ajax_dots span{-webkit-transition:opacity .2s;transition:opacity .2s;background-repeat:no-repeat;opacity:0}#gantt_ajax_dots span.gantt_dot_visible{opacity:1}.dhtmlx_message_area{position:fixed;right:5px;width:250px;z-index:1000}.dhtmlx-info{min-width:120px;font-family:Arial;z-index:10000;margin:5px 5px 10px;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.dhtmlx-info.hidden{height:0;padding:0;border-width:0;margin:0;overflow:hidden}.dhtmlx_modal_box{overflow:hidden;display:inline-block;min-width:250px;width:250px;text-align:center;position:fixed;z-index:20000;box-shadow:3px 3px 3px rgba(0,0,0,.07);font-family:Arial;border-radius:6px;border:1px solid #cecece;background:#fff}.dhtmlx_popup_title{border-top-left-radius:6px;border-top-right-radius:6px;border-width:0}.dhtmlx_button,.dhtmlx_popup_button{border:1px solid #cecece;height:30px;line-height:30px;display:inline-block;margin:0 5px;border-radius:4px;background:#fff}.dhtmlx-info,.dhtmlx_button,.dhtmlx_popup_button{user-select:none;-webkit-user-select:none;-moz-user-select:-moz-none;cursor:pointer}.dhtmlx_popup_text{overflow:hidden}.dhtmlx_popup_controls{border-radius:6px;padding:10px}.dhtmlx_popup_button{min-width:100px}div.dhx_modal_cover{background-color:#000;cursor:default;filter:alpha(opacity=20);opacity:.2;position:fixed;z-index:19999;left:0;top:0;width:100%;height:100%;border:none;zoom:1}.dhtmlx-info img,.dhtmlx_modal_box img{float:left;margin-right:20px}.dhtmlx-alert-error,.dhtmlx-confirm-error{border:1px solid red}.dhtmlx_button input,.dhtmlx_popup_button div{border-radius:4px;font-size:14px;-moz-box-sizing:content-box;box-sizing:content-box;padding:0;margin:0;vertical-align:top}.dhtmlx_popup_title{color:#fff;text-shadow:1px 1px #000;height:40px;line-height:40px;font-size:20px}.dhtmlx_popup_text{margin:15px 15px 5px;font-size:14px;color:#000;min-height:30px;border-radius:6px}.dhtmlx-error,.dhtmlx-info{font-size:14px;color:#000;box-shadow:3px 3px 3px rgba(0,0,0,.07);padding:0;background-color:#FFF;border-radius:3px;border:1px solid #fff}.dhtmlx-info div{padding:5px 10px;background-color:#fff;border-radius:3px;border:1px solid #cecece}.dhtmlx-error{background-color:#d81b1b;border:1px solid #ff3c3c;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.dhtmlx-error div{background-color:#d81b1b;border:1px solid #940000;color:#FFF}.gantt_data_area div,.gantt_grid div{-ms-touch-action:none;-webkit-tap-highlight-color:transparent}.gantt_data_area{position:relative;overflow-x:hidden;overflow-y:hidden;-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none}.gantt_links_area{position:absolute;left:0;top:0}.gantt_side_content,.gantt_task_content,.gantt_task_progress{line-height:inherit;overflow:hidden;height:100%}.gantt_task_content{font-size:12px;color:#fff;width:100%;top:0;position:absolute;white-space:nowrap;text-align:center}.gantt_task_progress{text-align:center;z-index:0;background:#299cb4}.gantt_task_line{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;position:absolute;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#3db9d3;border:1px solid #2898b0;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_task_line.gantt_drag_move div{cursor:move}.gantt_touch_move,.gantt_touch_progress .gantt_touch_resize{-moz-transform:scale(1.02,1.1);-o-transform:scale(1.02,1.1);-webkit-transform:scale(1.02,1.1);transform:scale(1.02,1.1);-moz-transform-origin:50%;-o-transform-origin:50%;-webkit-transform-origin:50%;transform-origin:50%}.gantt_touch_progress .gantt_task_progress_drag,.gantt_touch_resize .gantt_task_drag{-moz-transform:scaleY(1.3);-o-transform:scaleY(1.3);-webkit-transform:scaleY(1.3);transform:scaleY(1.3);-moz-transform-origin:50%;-o-transform-origin:50%;-webkit-transform-origin:50%;transform-origin:50%}.gantt_side_content{position:absolute;white-space:nowrap;color:#6e6e6e;bottom:7px;font-size:11px}.gantt_side_content.gantt_left{right:100%;padding-right:15px}.gantt_side_content.gantt_right{left:100%;padding-left:15px}.gantt_side_content.gantt_link_crossing{bottom:8.75px}.gantt_link_arrow,.gantt_task_link .gantt_line_wrapper{position:absolute;cursor:pointer}.gantt_line_wrapper div{background-color:#ffa011}.gantt_task_link:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #ffa011}.gantt_task_link div.gantt_link_arrow{background-color:transparent;border-style:solid;width:0;height:0}.gantt_link_control{position:absolute;width:13px;top:0}.gantt_link_control div{display:none;cursor:pointer;box-sizing:border-box;position:relative;top:50%;margin-top:-7.5px;vertical-align:middle;border:1px solid #929292;-webkit-border-radius:6.5px;-moz-border-radius:6.5px;border-radius:6.5px;height:13px;width:13px;background-color:#f0f0f0}.gantt_link_control div:hover{background-color:#fff}.gantt_link_control.task_left{left:-13px}.gantt_link_control.task_right{right:-13px}.gantt_link_target .gantt_link_control div,.gantt_task_line.gantt_selected .gantt_link_control div,.gantt_task_line:hover .gantt_link_control div{display:block}.gantt_link_source,.gantt_link_target{box-shadow:0 0 3px #3db9d3}.gantt_link_target.link_finish_allow,.gantt_link_target.link_start_allow{box-shadow:0 0 3px #ffbf5e}.gantt_link_target.link_finish_deny,.gantt_link_target.link_start_deny{box-shadow:0 0 3px #e87e7b}.link_finish_allow .gantt_link_control.task_right div,.link_start_allow .gantt_link_control.task_left div{background-color:#ffbf5e;border-color:#ffa011}.link_finish_deny .gantt_link_control.task_right div,.link_start_deny .gantt_link_control.task_left div{background-color:#e87e7b;border-color:#dd3e3a}.gantt_link_arrow_right{border-width:4px 0 4px 6px;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important;border-color:#ffa011;margin-top:-1px}.gantt_link_arrow_left{border-width:4px 6px 4px 0;margin-top:-1px;border-top-color:transparent!important;border-color:#ffa011;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_top{border-width:0 4px 6px;border-color:#ffa011;border-top-color:transparent!important;border-right-color:transparent!important;border-left-color:transparent!important}.gantt_link_arrow_down{border-width:4px 6px 0 4px;border-color:#ffa011;border-right-color:transparent!important;border-bottom-color:transparent!important;border-left-color:transparent!important}.gantt_task_drag,.gantt_task_progress_drag{cursor:w-resize;height:100%;display:none;position:absolute}.gantt_task_line.gantt_selected .gantt_task_drag,.gantt_task_line.gantt_selected .gantt_task_progress_drag,.gantt_task_line:hover .gantt_task_drag,.gantt_task_line:hover .gantt_task_progress_drag{display:block}.gantt_task_drag{width:6px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAACCAYAAAB7Xa1eAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYDDjkw3UJvAwAAABRJREFUCNdj/P//PwM2wASl/6PTAKrrBf4+lD8LAAAAAElFTkSuQmCC);z-index:1;top:0}.gantt_task_drag.task_left{left:0}.gantt_task_drag.task_right{right:0}.gantt_task_progress_drag{height:8px;width:8px;bottom:-4px;margin-left:-4px;background-position:bottom;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY3Rjk0RUVDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY3Rjk0RUZDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjdGOTRFQ0MyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjdGOTRFREMyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PobPBzIAAADkSURBVHjaYpk2bRoDDsAExL1QdjEQ/8OmiAWHZk4gXqymqhQM4ty6fU8OSMUA8XdiDBAB4k0a6iqWRga6EKcwMQXduHlnL5DpB8Rv0J2JDFSA+JiOtgZcMwiA2CAxkBxUDVYDLEAKgIpV9XQ0MZwFEgPJAZnHoWpRDAgC4n2W5saiQKfjClQGkBxQDciL+6B6wAbkA/EqJwdrTkUFOQZCAKQGpBbIXA3SCzJggo+XK7OEuBgDsQCkFqgHrBfsBT5eHgZSAUwP2IBfv36TbABMDygdtK1Zv6UESLORaAbIhG6AAAMAKN8wE24DXWcAAAAASUVORK5CYII=);background-repeat:no-repeat;z-index:2}.gantt_link_tooltip{box-shadow:3px 3px 3px #888;background-color:#fff;border-left:1px dotted #cecece;border-top:1px dotted #cecece;font-family:Tahoma;font-size:8pt;color:#444;padding:6px;line-height:20px}.gantt_link_direction{height:0;border:0 #ffa011;border-bottom-style:dashed;border-bottom-width:2px;transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;z-index:2;margin-left:1px;position:absolute}.gantt_grid_data .gantt_row.gantt_selected,.gantt_grid_data .gantt_row.odd.gantt_selected,.gantt_task_row.gantt_selected{background-color:#fff3a1}.gantt_task_row.gantt_selected .gantt_task_cell{border-right-color:#ffec6e}.gantt_task_line.gantt_selected{box-shadow:0 0 5px #299cb4}.gantt_task_line.gantt_project.gantt_selected{box-shadow:0 0 5px #46ad51}.gantt_task_line.gantt_milestone{visibility:hidden;background-color:#d33daf;border:0 solid #61164f;box-sizing:content-box;-moz-box-sizing:content-box}.gantt_task_line.gantt_milestone div{visibility:visible}.gantt_task_line.gantt_milestone .gantt_task_content{background:inherit;border:inherit;border-width:1px;border-radius:inherit;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.gantt_task_line.gantt_task_inline_color{border-color:#999}.gantt_task_line.gantt_task_inline_color .gantt_task_progress{background-color:#363636;opacity:.2}.gantt_task_line.gantt_task_inline_color.gantt_project.gantt_selected,.gantt_task_line.gantt_task_inline_color.gantt_selected{box-shadow:0 0 5px #999}.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #999}.gantt_critical_task{background-color:#e63030;border-color:#9d3a3a}.gantt_critical_task .gantt_task_progress{background-color:rgba(0,0,0,.4)}.gantt_critical_link .gantt_line_wrapper>div{background-color:#e63030}.gantt_critical_link .gantt_link_arrow{border-color:#e63030}.gantt_unselectable,.gantt_unselectable div{-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_cal_light{-webkit-tap-highlight-color:transparent;background:#fff;border-radius:6px;font-family:Arial;border:1px solid #cecece;color:#6b6b6b;font-size:12px;position:absolute;z-index:10001;width:550px;height:250px;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.gantt_cal_light select{font-family:Arial;border:1px solid #cecece;font-size:13px;padding:2px;margin:0}.gantt_cal_ltitle{padding:7px 10px;overflow:hidden;white-space:nowrap;-webkit-border-radius:6px 6px 0 0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-radius:6px 6px 0 0}.gantt_cal_ltitle span{white-space:nowrap}.gantt_cal_lsection{color:#727272;font-weight:700;padding:12px 0 5px 10px}.gantt_cal_lsection .gantt_fullday{float:right;margin-right:5px;font-size:12px;font-weight:400;line-height:20px;vertical-align:top;cursor:pointer}.gantt_cal_lsection{font-size:13px}.gantt_cal_ltext{padding:2px 10px;overflow:hidden}.gantt_cal_ltext textarea{overflow:auto;font-family:Arial;font-size:13px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cecece;height:100%;width:100%;outline:0!important;resize:none}.gantt_time{font-weight:700}.gantt_cal_light .gantt_title{padding-left:10px}.gantt_cal_larea{border:1px solid #cecece;border-left:none;border-right:none;background-color:#fff;overflow:hidden;height:1px}.gantt_btn_set{margin:10px 7px 5px 10px;padding:5px 15px 5px 10px;float:left;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border-width:0;border-color:#cecece;border-style:solid;height:32px;font-weight:700;background:#fff;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.gantt_btn_set div{float:left;font-size:13px;height:22px;line-height:22px;background-repeat:no-repeat;vertical-align:middle}.gantt_save_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTk1OUU5RDFDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTk1OUU5RDJDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxOTU5RTlDRkMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxOTU5RTlEMEMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjDroXYAAAEXSURBVHjaYvz//z8DJYCRUgPIAUxAbAnEHiAHMIBcQCwGaRYXF3e6evXqoffv39/dv38/CymaGSUkJBzv3LlzCsj///fv3wdAihkkIQnEvkAshU8zLy+v7a1bt06ANP/79+87kDIAy505cybq06dPr3p7ezuwGQLTfOPGjWP/ESAZLg8kPKBO+g01RBJNszWyZqC6uSgWgIg/f/4shxnS2dnZBjMEqNkSFGBImi8CKTYMA4BYCGjIczRDHC5dunQQSfN7IKWI4UUkjjdMMdCwnw8ePLjwHxV4Yw1gZA5Q47z/2EELzhhCE+ABGvIQWSeQvwcU38QaAML2wHj+C/X3MyAlijeB4ZBoBOIPQGxJKIVSnBsBAgwABddBclWfcZUAAAAASUVORK5CYII=);margin-top:2px;width:21px}.gantt_cancel_btn{margin-top:2px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDkzMDA3MzlDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDkzMDA3M0FDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowOTMwMDczN0MzMDQxMUUyODZBNUUzMURDODBGQkRENiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowOTMwMDczOEMzMDQxMUUyODZBNUUzMURDODBGQkRENiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmYuYOUAAAEdSURBVHjaYvz//z8DJYAFXWDlypU8QKoIiD2A2AwqfAqIdwBxX3h4+Bdk9YzILgBqtgdS84FYEYeF94E4EWjIQZgAE5LmQCB1AKoZZKMPEAtAMYh9GSp3AKjWD8UFQAEhIPshEIOc3wHENUBb/qJ57SyQMoJyPwKxElDNO1gYFEE17wMKVmIJlzNQzeegrjaA6qmBecEbSvfh0GwMxGeBhoPoemQ9MAO0kEIbl2YTqPAFKK2IbMB3AjabYIkRZmQD7kNpMyI0G0PpO8gGbIUFJj7NQDk2INWIrIcJKfBAKcwJqvkcDs0TgFgXGo19KCkRmpDWQdWDEk0NUoCBoq0FqhkE/IEWbKJKUmZEz43QzFSKIzN1481M5ACAAAMAlfl/lCwRpagAAAAASUVORK5CYII=);width:20px}.gantt_delete_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=);margin-top:2px;width:20px}.gantt_cal_cover{width:100%;height:100%;position:absolute;z-index:10000;top:0;left:0;background-color:#000;opacity:.1;filter:alpha(opacity=10)}.gantt_custom_button{padding:0 3px;font-family:Arial;font-size:13px;font-weight:400;margin-right:10px;margin-top:-5px;cursor:pointer;float:right;height:21px;width:90px;border:1px solid #CECECE;text-align:center;-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px}.gantt_custom_button div{cursor:pointer;float:none;height:21px;line-height:21px;vertical-align:middle}.gantt_custom_button div:first-child{display:none}.gantt_cal_light_wide{width:580px;padding:2px 4px}.gantt_cal_light_wide .gantt_cal_larea{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cecece}.gantt_cal_light_wide .gantt_cal_lsection{border:0;float:left;text-align:right;width:80px;height:20px;padding:5px 10px 0 0}.gantt_cal_light_wide .gantt_wrap_section{position:relative;padding:10px 0;overflow:hidden;border-bottom:1px solid #ebebeb}.gantt_cal_light_wide .gantt_section_time{overflow:hidden;padding-top:2px!important;padding-right:0;height:20px!important}.gantt_cal_light_wide .gantt_cal_ltext{padding-right:0}.gantt_cal_light_wide .gantt_cal_larea{padding:0 10px;width:100%}.gantt_cal_light_wide .gantt_section_time{background:0 0}.gantt_cal_light_wide .gantt_cal_checkbox label{padding-left:0}.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday{float:none;margin-right:0;font-weight:700;cursor:pointer}.gantt_cal_light_wide .gantt_custom_button{position:absolute;top:0;right:0;margin-top:2px}.gantt_cal_light_wide .gantt_repeat_right{margin-right:55px}.gantt_cal_light_wide.gantt_cal_light_full{width:738px}.gantt_cal_wide_checkbox input{margin-top:8px;margin-left:14px}.gantt_cal_light input{font-size:13px}.gantt_section_time{background-color:#fff;white-space:nowrap;padding:5px 10px;padding-top:2px!important}.gantt_section_time .gantt_time_selects{float:left;height:25px}.gantt_section_time .gantt_time_selects select{height:23px;padding:2px;border:1px solid #cecece}.gantt_duration{width:100px;height:23px;float:left;white-space:nowrap;margin-left:20px;line-height:23px}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc,.gantt_duration .gantt_duration_value{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;vertical-align:top;height:100%;border:1px solid #cecece}.gantt_duration .gantt_duration_value{width:40px;padding:3px 4px;border-left-width:0;border-right-width:0}.gantt_duration .gantt_duration_dec,.gantt_duration .gantt_duration_inc{width:20px;padding:1px 1px 3px;background:#fff}.gantt_duration .gantt_duration_dec{-moz-border-top-left-radius:4px;-moz-border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-left-radius:4px}.gantt_duration .gantt_duration_inc{margin-right:4px;-moz-border-top-right-radius:4px;-moz-border-bottom-right-radius:4px;-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:4px}.gantt_cal_quick_info{border:1px solid #cecece;border-radius:6px;position:absolute;z-index:300;box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fff;width:300px;transition:left .5s ease,right .5s;-moz-transition:left .5s ease,right .5s;-webkit-transition:left .5s ease,right .5s;-o-transition:left .5s ease,right .5s}.gantt_no_animate{transition:none;-moz-transition:none;-webkit-transition:none;-o-transition:none}.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon{float:right}.gantt_cal_qi_title{-webkit-border-radius:6px 6px 0 0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-radius:6px 6px 0 0;padding:5px 0 8px 12px;color:#454545;background-color:#fff;border-bottom:1px solid #cecece}.gantt_cal_qi_tdate{font-size:14px;font-weight:700}.gantt_cal_qi_tcontent{font-size:13px}.gantt_cal_qi_content{padding:16px 8px;font-size:13px;color:#454545;overflow:hidden}.gantt_cal_qi_controls{-webkit-border-radius:0 0 6px 6px;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:6px;border-radius:0 0 6px 6px;padding-left:7px}.gantt_cal_qi_controls .gantt_menu_icon{margin-top:6px;background-repeat:no-repeat}.gantt_cal_qi_controls .gantt_menu_icon.icon_edit{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC)}.gantt_cal_qi_controls .gantt_menu_icon.icon_delete{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=)}.gantt_qi_big_icon{font-size:13px;border-radius:4px;font-weight:700;background:#fff;margin:5px 9px 8px 0;min-width:60px;line-height:32px;vertical-align:middle;padding:0 10px 0 5px;cursor:pointer;border:1px solid #cecece}.gantt_cal_qi_controls div{float:left;height:32px;text-align:center;line-height:32px}.gantt_tooltip{box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fff;border-left:1px solid rgba(0,0,0,.07);border-top:1px solid rgba(0,0,0,.07);font-family:Arial;font-size:8pt;color:#454545;padding:10px;position:absolute;z-index:50}.gantt_marker{height:100%;width:2px;top:0;position:absolute;text-align:center;background-color:rgba(255,0,0,.4);-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.gantt_marker .gantt_marker_content{padding:5px;background:inherit;color:#fff;position:absolute;font-size:12px;line-height:12px;opacity:.8}.gantt_marker_area{position:absolute;top:0;left:0}.gantt_noselect{-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none}.gantt_drag_marker{position:absolute;font-family:Arial;font-size:13px}.gantt_drag_marker .gantt_tree_icon.gantt_blank,.gantt_drag_marker .gantt_tree_icon.gantt_close,.gantt_drag_marker .gantt_tree_icon.gantt_open,.gantt_drag_marker .gantt_tree_indent{display:none}.gantt_drag_marker,.gantt_drag_marker .gantt_row.odd{background-color:#fff}.gantt_drag_marker .gantt_row{border-left:1px solid #d2d2d2;border-top:1px solid #d2d2d2}.gantt_drag_marker .gantt_cell{border-color:#d2d2d2}.gantt_row.gantt_over,.gantt_task_row.gantt_over{background-color:#0070fe}.gantt_row.gantt_transparent .gantt_cell{opacity:.7}.gantt_task_row.gantt_transparent{background-color:#f8fdfd}.dhtmlx_popup_button.dhtmlx_delete_button{background:#3db9d3;text-shadow:0 -1px 0 #248a9f;color:#fff;font-weight:700;border-width:0} \ No newline at end of file diff --git a/plugins/easy_gantt/assets/stylesheets/easy_gantt/easy_gantt.css b/plugins/easy_gantt/assets/stylesheets/easy_gantt/easy_gantt.css deleted file mode 100644 index 44bd19a707b2b48267814e898c0f6e9a08ab0742..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/stylesheets/easy_gantt/easy_gantt.css +++ /dev/null @@ -1,665 +0,0 @@ -/* -* = require easy_gantt/dhtmlxgantt -* = require_self -* = require easy_gantt/sass/easy_gantt_sass.scss -*/ -@media print { - .content-title { - display: none; - } - - @page { - size: landscape - } - - .gantt-grid-checkbox-cont { - display: none; - } -} - -body { - -webkit-print-color-adjust: exact !important; -} - -.gantt_container { - display: inline-block; -} - -#gantt_cont { - position: relative; - z-index: 0; -} - -#easy_gantt .weekend { - background-color: #F7F7F7; -} - -#easy_gantt .first-date { - position: relative; -} - -#easy_gantt .first-date:after { - content: ""; - position: absolute; - display: block; - left: -1px; - top: 0; - bottom: 0; - border-left: 1px solid #628DB6; -} - -#easy_gantt { - position: relative; -} - -.gantt_task_content { - overflow: visible; - /*color:black;*/ -} - -.no_task_controls .gantt_link_control div { - display: none !important; -} - -.gantt-fresh .gantt_link_control div { - display: none !important; -} - -.no_task_controls .gantt_task_drag, .no_task_controls .gantt_task_progress_drag { - display: none !important; -} - -#gantt_link_dialog { - border: 1px #000 solid; - background-color: #fff; - width: 200px; - position: absolute; - padding: 10px; - z-index: 2; -} - -#gantt_link_dialog input[type="number"] { - width: 38px; -} - -.gantt-tooltip { - position: absolute; - display: none; - background-color: white; - -webkit-box-shadow: 0 0 4px 2px rgba(232, 232, 232, 1); - -moz-box-shadow: 0 0 4px 2px rgba(232, 232, 232, 1); - box-shadow: 0 0 4px 2px rgba(232, 232, 232, 1); - padding: 20px; - z-index: 10; -} - -.gantt-tooltip-header { - font-size: 1em; - padding-bottom: 10px; - border-bottom: 1px solid rgba(0, 0, 0, 0.2); - margin: 0 0 10px; -} - -.gantt-tooltip-label { - font-size: 0.89em; - color: #a0a0a0; -} - -.gantt-tooltip-problem { - color: #d94838; - font-size: smaller; -} - -#easy_gantt.gantt .gantt_task_line.overdue { - background-color: #d94838; -} - -#easy_gantt.easy .gantt_task_line, #easy_gantt.easy .gantt_row { - padding: 0; - border-width: 0 0 1px 0; -} - -.gantt_task_progress { - /*background-color: rgba(0, 0, 0, 0.3);*/ - margin-left: 1px; -} - -#link_popup_button_cont { - margin-top: 35px; -} - -#easy_gantt a.disabled:hover { - text-decoration: none; - cursor: not-allowed; -} - -.milestone-type .gantt_cell { - border-right: 0; -} - -.gantt-legend-color-square { - border: 1px solid transparent; - margin-left: 10px; -} - -.gantt-color-square, .gantt-legend-color-square { - width: 15px; - height: 15px; - display: inline-block; - vertical-align: middle; - border: 1px solid transparent; -} - -.easy-gantt-legend-symbol { - margin-left: 10px; -} - -.gantt_cell { - padding: 0; -} - -.gantt_grid { - border-right-width: 2px; -} - -.gantt_row .gantt_drag_handle:before { - width: 18px; - height: 100%; - font-size: 20px; - font-weight: bold; -} - -.gantt_row:hover .gantt_drag_handle:before { - content: '\21F5'; - opacity: 0.5; -} - -.gantt_row .gantt_drag_handle:hover:before { - opacity: 1; - content: '\21F5'; -} - -.gantt_row.gantt_drag_to_allowed { - background-color: #FFEB59; -} - -.gantt_row.gantt_drag_hover { - background-color: #eeeeee; -} - -.gantt_row.gantt_drag_to_allowed.gantt_drag_hover { - background-color: #FBCF00; -} - -/*#sample_cont.flash {*/ -/*background-image: none;*/ -/*}*/ -.gantt-supertop-panel { - position: relative; -} - -#easy_gantt .gantt-sample-flash { - font-size: 14px; -} - -.gantt-menu { - z-index: 1; - position: relative; - background-color: #ffffff; - padding: 5px 0; -} - -.gantt-footer-menu { - padding: 5px 0; -} - -/*.easy-gantt-menu .action-buttons-with-submenu {*/ -/*display: inline;*/ -/*}*/ -.gantt-modal-video { - margin-left: 10px; - margin-top: 5px; -} - -.gantt_drag_marker { - z-index: 1; - pointer-events: none; -} - -.gantt_grid_column_resize_wrap, .gantt_grid_columns_resize_wrap { - top: 0; - height: 100%; - cursor: col-resize; - position: absolute; - /*background-color: red;*/ - width: 12px -} - -/*.gantt_task_line.parent{*/ -/*background-color: yellow;*/ -/*}*/ -.gantt-sample-close-button { - background-color: #cd0a0a; - color: white; - width: auto; - height: auto; - float: none; - display: inline; - margin-left: 25px; - padding: 8px 10px 8px 25px; - background-position-x: 5px; -} - -/* Easy Redmine < 2016 */ -#easy_gantt.easy .push-left { - float: left; -} - -#easy_gantt.easy .push-right { - float: right; - text-align: right -} - -/*#easy_gantt.easy .gantt-menu p[id^="button_"], #easy_gantt.easy .gantt-menu div[id^="button_"] {*/ -/*display: inline-block;*/ -/*}*/ -.gantt_grid_data div.empty-type div { - display: none; -} - -.gantt_bars_area div.empty-type { - display: none; -} - -.gantt_task_line.planned { - z-index: 1; -} - -.gantt_link_tooltip.gantt_link_deny { - background-color: #ff6666; -} - -@media print { - #easy_servicebar { - display: none; - } - - #easy_gantt_menu { - display: none; - } - - #easy_gantt_footer { - display: none; - } - - .flash { - display: none; - } -} - -.gantt_grid_superitem { - font-weight: bold; - /*font-style: italic;*/ - height: 100%; - width: 100%; - vertical-align: top; -} - -.gantt_grid_scale, .gantt_task_scale { - background-color: #ffffff; - z-index: 1; - position: relative; - border-top: 1px solid #cecece; - transform: translate(0, -1px); -} - -.gantt_grid_scale .gantt_grid_head_cell, .gantt_task .gantt_task_scale .gantt_scale_cell { - color: rgba(72, 72, 72, 0.8); -} - -/*.gantt_scale_cell{*/ -/*overflow: visible;*/ -/*}*/ - -.gantt-footer-legend { - display: inline-block; - float: right; - margin-top: 20px; -} - -.gantt-legend-symbol { - font-size: 15px; -} - -#easy_gantt input.wrong { - background-color: #cd0a0a; -} - -.gantt-reload-model-error { - color: #cd0a0a; -} - -.gantt_task_line { - background-color: inherit !important; - border: none !important; - box-shadow: none !important; -} - -.gantt_task_line.gantt_selected .gantt_task_content { - box-shadow: none !important; -} - -.gantt_task_line.closed .gantt_task_ticks, -.gantt_task_line.closed .gantt_task_content { - background-color: rgba(200, 200, 200, 0.2); - border-color: rgba(200, 200, 200, 1); -} - -.gantt_link_point { - border-color: rgba(217, 72, 56, 1) !important; - background-color: rgba(217, 72, 56, 1) !important; -} - -.gantt_task_drag { - background: radial-gradient(rgba(217, 72, 56, 1) 25%, transparent 10%) 1px 1px; - background-size: 4px 4px; -} - -.gantt_task_progress_drag { - border-bottom: 10px solid rgba(217, 72, 56, 1); -} - -.gantt_line_wrapper div, .gantt_link_arrow { - border-color: rgba(255, 125, 30, 1); -} - -.gantt-relation-simple > .gantt_line_wrapper div, .gantt-relation-simple > .gantt_link_arrow { - border-color: rgba(30, 120, 255, 1); -} - -.gantt-relation-simple:hover > .gantt_line_wrapper div { - box-shadow: 0 0 5px 0 rgba(30, 120, 255, 1); -} -.gantt-relation-unlocked > .gantt_line_wrapper div, .gantt-relation-unlocked > .gantt_link_arrow { - border-color: rgba(51, 141, 71, 1); -} - -.gantt-relation-unlocked:hover > .gantt_line_wrapper div { - box-shadow: 0 0 5px 0 rgba(255, 125, 30, 1); -} - -#easy_gantt .wrong .gantt_line_wrapper div { - border-color: rgba(217, 72, 56, 1) !important; -} - -#easy_gantt .wrong .gantt_link_arrow { - border-color: rgba(217, 72, 56, 1) !important; - border-top-color: transparent !important; - border-right-color: transparent !important; - border-bottom-color: transparent !important; -} - -.gantt_task_progress_drag { - border-bottom: 10px solid rgba(217, 72, 56, 1); -} - -#easy_gantt .gantt_link_arrow_right { - border-top-color: transparent !important; - border-right-color: transparent !important; - border-bottom-color: transparent !important; -} - -.gantt_task_progress_drag { - width: 0 !important; - height: 0 !important; - background: none !important; - border-left: 6.5px solid transparent; - border-right: 6.5px solid transparent; - border-bottom-width: 10px; - border-bottom-style: solid; - margin-left: -6.5px !important; -} - -.gantt_task_drag { - background-size: 4px 4px; -} - -.gantt_link_control.task_left { - left: -6.5px; - width: 6.5px; - border-radius: 6.5px 0 0 6.5px; -} - -.gantt_link_control.task_right { - right: -6.5px; - width: 6.5px; - border-radius: 0 6.5px 6.5px 0; -} - -.gantt_link_control.task_left .gantt_link_point { - width: 6.5px; - border-radius: 6.5px 0 0 6.5px; -} - -.gantt_link_control.task_right .gantt_link_point { - width: 6.5px; - border-radius: 0 6.5px 6.5px 0; -} - -@media print { - body { - margin: 0; - } - - .gantt_sort { - display: none; - } -} - -.gantt-grid-header-collapse-buttons { - position: absolute; - left: 5px; - bottom: 2px; -} - -.gantt-grid-header-collapse-buttons a { - font-size: 18px; - color: #a6a6a6; - font-weight: bold; - font-family: monospace; - display: inline-block; -} - -.gantt-grid-header-collapse-buttons a.active { - font-size: 18px; - color: #d94838 !important; - background-color: transparent !important; - border: none !important; -} - -.gantt-grid-header-collapse-buttons a:hover { - font-size: 18px; - color: rgba(72, 72, 72, 1); - text-decoration: none; - background-color: #eeeeee !important; - box-shadow: 0 0 15px 5px #eeeeee; - border-radius: 11px; -} - -.gantt-grid-checkbox-cont br { - display: none; -} - -@media screen { - .gantt-icon-parent-issue:before { - content: '⥐' - } - - .gantt-icon-milestone:before { - content: '♦'; - } -} - -.gantt_task_line.gantt_parent_task-subtype .gantt_task_content { - height: 50%; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-bottomright: 0; -} - -.gantt_task_line.gantt_parent_task-subtype .gantt_task_progress { - height: 50%; -} - -.gantt_task_ticks { - height: 0; - margin-top: -1px; - border: 10px solid rgba(51, 141, 71, 1); - border-top-width: 0; - border-bottom-color: transparent !important; - background-color: transparent !important; -} - -.gantt-milestone-icon { - transform: scale(0.65) rotate(45deg); - width: 16px !important; - height: 16px !important; - background-color: rgba(62, 91, 118, 1); - border: 2px solid rgba(62, 91, 118, 1); -} - -.gantt_row:hover .gantt-bullet-hover-hide { - display: none; -} - -.gantt-sum-row-small { - font-size: 8px; -} - -.gantt-sum-row-negative { - color: red; -} - -#easy_gantt.easy #easy_gantt_menu { - z-index: 2; - overflow: visible; -} - -#easy_gantt .contextual.settings a { - z-index: 1; - border: none; - padding-right: 0; - opacity: 0.6; -} - -#easy_gantt.easy .contextual.settings a { - background: none; -} - -#easy_gantt .contextual.settings a:hover { - opacity: 1; -} - -#easy_gantt.easy .contextual.settings a:hover { - background: none; -} - -.gantt-grid-header-multi { - line-height: normal; - display: inline-block; - white-space: normal; -} - -.gantt_task_relation_stop { - position: absolute; - width: 8px; - top: 0; - height: 100%; - border: 2px solid rgba(255, 120, 0, 0.5); - box-sizing: border-box; -} - -.gantt_task_relation_stop_left { - border-right-color: transparent; -} - -.gantt_task_relation_stop_right { - border-left-color: transparent; - -webkit-transform: translate(-100%); - -moz-transform: translate(-100%); - -ms-transform: translate(-100%); - -o-transform: translate(-100%); - transform: translate(-100%); -} - -.gantt-menu-sub-panel { - margin-top: 3px; -} - -.gantt_task .gantt-sum-row .gantt_scale_cell { - font-weight: bold; - color: #260080; -} - -.gantt-menu-problems-count.gantt-with-problems { - background-color: red; - padding: 1px; - border: 1px solid #b0b0b0; - border-radius: 4px; -} - -.gantt-menu-problems-list { - overflow: auto; - position: absolute; - z-index: 2; - max-width: 600px; - margin-top: 5px; - border: 2px solid #cecece; - background-color: white; - right: 0; - text-align: left; -} - -.gantt-menu-problems-list ol { - margin: 5px 5px 5px -5px; -} - -.gantt-menu-problems-list li { - border-bottom: 1px solid #d9d9d9; - white-space: nowrap; - padding: 5px 25px 5px 5px; -} - -.gantt-menu-problems-list ol, -.gantt-menu-problems-list a { - color: #4b5561; -} - -.gantt-menu-problems-reason { - color: red; -} - -.gantt-task-bar-line { - position: absolute; - left: 0; - top: 0; - overflow: hidden -} -.jasmine_html-reporter .jasmine-summary ul{ - margin-top: 0; - margin-bottom: 0; -} - -@media print { - /* Because of gaps between cells in header */ - .gantt_scale_line.gantt-print__scale-line{ - font-size: 0; - } - .gantt_scale_line.gantt-print__scale-line .gantt_scale_cell{ - font-size: 12px; - } - - .gantt_task_line.milestone-type > gantt_task_content{ - background: black; - - } -} diff --git a/plugins/easy_gantt/assets/stylesheets/easy_gantt/generated/easy_gantt.css b/plugins/easy_gantt/assets/stylesheets/easy_gantt/generated/easy_gantt.css deleted file mode 100644 index 61852febf834393aa7f60bf348312030bfc18dd8..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/stylesheets/easy_gantt/generated/easy_gantt.css +++ /dev/null @@ -1,3365 +0,0 @@ -/* -@license - -dhtmlxGantt v.3.2.1 Stardard -This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. - -(c) Dinamenta, UAB. -*/ - -body { - -webkit-print-color-adjust: exact !important; -} -.gridHoverStyle, -.gridSelection, -.timelineSelection { - background-color: #fff3a1 -} -.gantt_grid_scale .gantt_grid_head_cell { - color: #a6a6a6; - border-top: none!important; - /*border-right: none!important*/ -} -/*.gantt_grid_data .gantt_cell { - border-right: none; - color: #454545 -}*/ -.gantt_task_link .gantt_link_arrow_right { - border-width: 6px; - margin-top: -3px -} -.gantt_task_link .gantt_link_arrow_left { - border-width: 6px; - margin-left: -6px; - margin-top: -3px -} -.gantt_task_link .gantt_link_arrow_down, -.gantt_task_link .gantt_link_arrow_top { - border-width: 6px -} -.gantt_task_line .gantt_task_progress_drag { - bottom: -4px; - height: 16px; - margin-left: -8px; - width: 16px -} -.chartHeaderBg { - background-color: #fff -} -.gantt_task .gantt_task_scale .gantt_scale_cell { - color: #a6a6a6; - border-right: 1px solid #ebebeb -} - -/*.gantt_row.gantt_project-type,*/ -/*.gantt_row.odd.gantt_project-type {*/ -/*background-color: #edffef*/ -/*}*/ -.gantt_task_row.gantt_project-type, -.gantt_task_row.odd.gantt_project-type { - background-color: #f5fff6 -} -.gantt_task_line.gantt_project-type { - background-color: #65c16f; - border: 1px solid #3c9445 -} -.gantt_task_line.gantt_project-type .gantt_task_progress { - background-color: #46ad51 -} -.buttonBg { - background: #fff -} -.gantt_cal_light .gantt_btn_set { - margin: 5px 10px -} -.gantt_btn_set.gantt_cancel_btn_set { - background: #fff; - color: #454545; - border: 1px solid #cecece -} -.gantt_btn_set.gantt_save_btn_set { - background: #3db9d3; - text-shadow: 0 -1px 0 #248a9f; - color: #fff -} -.gantt_btn_set.gantt_delete_btn_set { - background: #ec8e00; - text-shadow: 0 -1px 0 #a60; - color: #fff -} -.gantt_cal_light_wide { - padding-left: 0!important; - padding-right: 0!important -} -.gantt_cal_light_wide .gantt_cal_larea { - border-left: none!important; - border-right: none!important -} -.dhtmlx_popup_button.dhtmlx_ok_button { - background: #3db9d3; - text-shadow: 0 -1px 0 #248a9f; - color: #fff; - font-weight: 700; - border-width: 0 -} -.dhtmlx_popup_button.dhtmlx_cancel_button { - font-weight: 700; - color: #454544 -} -.gantt_qi_big_icon.icon_edit { - color: #454545; - background: #fff -} -.gantt_qi_big_icon.icon_delete { - text-shadow: 0 -1px 0 #a60; - background: #ec8e00; - color: #fff; - border-width: 0 -} -.gantt_container { - font-family: Arial; - font-size: 13px; - border: 1px solid #cecece; - position: relative; - white-space: nowrap -} -.gantt_grid { - border-right: 1px solid #cecece -} -.gantt_task_scroll { - overflow-x: scroll -} -.gantt_task { - position: relative -} -.gantt_grid, -.gantt_task { - overflow-x: hidden; - overflow-y: hidden; - display: inline-block; - vertical-align: top -} -.gantt_grid_scale, -.gantt_task_scale { - color: #6b6b6b; - font-size: 12px; - border-bottom: 1px solid #cecece; - background-color: #fff -} -.gantt_scale_line { - box-sizing: border-box; - -moz-box-sizing: border-box; - border-top: 1px solid #cecece -} -.gantt_scale_line:first-child { - border-top: none -} -.gantt_grid_head_cell { - display: inline-block; - vertical-align: top; - border-right: 1px solid #cecece; - text-align: center; - position: relative; - cursor: default; - height: 100%; - -moz-user-select: -moz-none; - -webkit-user-select: none; - -user-select: none; - -ms-user-select: none; - overflow: hidden -} -.gantt_scale_line { - clear: both -} -.gantt_grid_data { - width: 100%; - overflow: hidden -} -.gantt_row { - position: relative; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -moz-user-select: -moz-none -} -.gantt_add, -.gantt_grid_head_add { - width: 100%; - height: 100%; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTQ3MjMyMENDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTQ3MjMyMERDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1NDcyMzIwQUM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1NDcyMzIwQkM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PshZT8UAAABbSURBVHjaYrTdeZmBEsCER+4wEP+H4sPkGGCDg020ARR7gb4GIAcYDKMDdPnDyAbYkGG5DVW9cIQMvUdBBAuUY4vDz8iAcZinA2zgCHqAYQMseAywJcYFAAEGAM+UFGuohFczAAAAAElFTkSuQmCC); - background-position: center center; - background-repeat: no-repeat; - cursor: pointer; - position: relative; - -moz-opacity: .3; - opacity: .3 -} -.gantt_grid_head_cell.gantt_grid_head_add { - -moz-opacity: .6; - opacity: .6; - top: 0 -} -.gantt_grid_head_cell.gantt_grid_head_add:hover { - -moz-opacity: 1; - opacity: 1 -} -@media screen { - .gantt_grid_data .gantt_row.odd:hover, - .gantt_grid_data .gantt_row:hover { - background-color: #fff3a1 - } -} -.gantt_grid_data .gantt_row.odd:hover .gantt_add, -.gantt_grid_data .gantt_row:hover .gantt_add { - -moz-opacity: 1; - opacity: 1 -} -.gantt_row, -.gantt_task_row { - border-bottom: 1px solid #ebebeb; - /*background-color: #fff*/ -} -.gantt_row.odd, -.gantt_task_row.odd { - /*background-color: #fff*/ -} -.gantt_cell, -.gantt_grid_head_cell, -.gantt_row, -.gantt_scale_cell, -.gantt_task_cell, -.gantt_task_row { - box-sizing: border-box; - -moz-box-sizing: border-box -} -.gantt_grid_head_cell, -.gantt_scale_cell { - line-height: inherit -} -.gantt_grid .gantt_grid_resize_wrap { - cursor: col-resize; - position: absolute; - width: 13px; - z-index: 1 -} -.gantt_grid_resize_wrap .gantt_grid_resize { - background-color: #cecece; - width: 1px; - margin: 0 auto -} -.gantt_drag_marker.gantt_grid_resize_area { - background-color: rgba(231, 231, 231, .5); - border-left: 1px solid #cecece; - border-right: 1px solid #cecece; - height: 100%; - width: 100%; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box -} -.gantt_cell { - display: inline-block; - vertical-align: top; - border-right: 1px solid #ebebeb; - padding-left: 6px; - padding-right: 6px; - height: 100%; - overflow: hidden; - white-space: nowrap; - font-size: 13px -} -.gantt_grid_data .gantt_last_cell, -.gantt_grid_scale .gantt_last_cell, -.gantt_task_bg .gantt_last_cell, -.gantt_task_scale .gantt_last_cell { - border-right-width: 0 -} -.gantt_task_bg { - overflow: hidden -} -.gantt_scale_cell { - display: inline-block; - white-space: nowrap; - overflow: hidden; - border-right: 1px solid #cecece; - text-align: center; - height: 100% -} -.gantt_task_cell { - display: inline-block; - height: 100%; - border-right: 1px solid #ebebeb -} -.gantt_ver_scroll { - width: 0; - background-color: transparent; - height: 1px; - overflow-x: hidden; - overflow-y: scroll; - display: none; - position: absolute; - right: 0 -} -.gantt_ver_scroll>div { - width: 1px; - height: 1px -} -.gantt_hor_scroll { - height: 0; - background-color: transparent; - width: 100%; - clear: both; - overflow-x: scroll; - overflow-y: hidden; - display: none -} -.gantt_hor_scroll>div { - width: 5000px; - height: 1px -} -.gantt_tree_indent { - width: 15px; - /*height: 100%;*/ - display: inline-block -} -.gantt_tree_content, -.gantt_tree_icon { - vertical-align: top -} -.gantt_tree_icon { - width: 28px; - height: 100%; - display: inline-block; - background-repeat: no-repeat; - background-position: center center -} -.gantt_tree_content { - height: 100%; - display: inline-block -} -.gantt_tree_icon.gantt_open { - background-image: url(data:image/gif;base64,R0lGODlhEgASALMJAMrKyt3d3ejp6d7f3+/v75aWlvf39////wAAAP///wAAAAAAAAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6M0I5RTczQjVDMDdBMTFFMTgxRjc4Mzk4M0Q3MjVFQzAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6M0I5RTczQjZDMDdBMTFFMTgxRjc4Mzk4M0Q3MjVFQzAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozQjlFNzNCM0MwN0ExMUUxODFGNzgzOTgzRDcyNUVDMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozQjlFNzNCNEMwN0ExMUUxODFGNzgzOTgzRDcyNUVDMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAkALAAAAAASABIAAARJMMlJq704661B+SAIXAVhnKhBFKSZnmuLImhslXPN3ibi+6pdBXc4IIpB2YkGE1IKAoL0ICUInJNCYMDtDgJYiScUGnHO6LQkAgA7); - width: 18px; - cursor: pointer -} -.gantt_tree_icon.gantt_close { - background-image: url(data:image/gif;base64,R0lGODlhEgASALMJAMrKyt3d3ejp6d7f3+/v75aWlvf39wAAAP///////wAAAAAAAAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzY0QzNGM0VDMDdBMTFFMUE3MDlCNUM2QjU1NDA5RjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzY0QzNGM0ZDMDdBMTFFMUE3MDlCNUM2QjU1NDA5RjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozNjRDM0YzQ0MwN0ExMUUxQTcwOUI1QzZCNTU0MDlGOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozNjRDM0YzREMwN0ExMUUxQTcwOUI1QzZCNTU0MDlGOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAkALAAAAAASABIAAARDMMlJq704661B+SAIXAVhnKhBFKSZnmv7wqxVzmpd3Uff5zKEUAi0uV4xm4DAbBIEOkohMKhaB4HoxBMKjTjgsFgSAQA7); - width: 18px; - cursor: pointer -} -.gantt_tree_icon.gantt_blank { - width: 18px -} -.gantt_tree_icon.gantt_folder_open { - background-image: url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTdDRDM3QzVDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTdDRDM3QzZDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1N0NEMzdDM0MwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMzdDNEMwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIzlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCBlXd+2XjjLKg5GqoeZXqvsOQXK/ijUZTKVUFADs=) -} -.gantt_tree_icon.gantt_folder_closed { - background-image: url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTAyMTU1RTNDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTAyMTU1RTRDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MDIxNTVFMUMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MDIxNTVFMkMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIwlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCuYIY6TYs+6bmHDO4igfdD3GNhheV0VQAADs=) -} -.gantt_tree_icon.gantt_file { - background-image: url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzkxQzI4RjZDMDZEMTFFMTgwRjhBQURDQzI3NDU3QUEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzkxQzI4RjdDMDZEMTFFMTgwRjhBQURDQzI3NDU3QUEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3OTFDMjhGNEMwNkQxMUUxODBGOEFBRENDMjc0NTdBQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3OTFDMjhGNUMwNkQxMUUxODBGOEFBRENDMjc0NTdBQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIylI+pwN16QJiUQiFThRlJm3RRFYSlR5qXMKmXaMDuuMoyOi8n/e6xn8NMHETgh5RaKQsAOw==) -} -.gantt_grid_head_cell .gantt_sort { - position: absolute; - right: 5px; - top: 8px; - width: 7px; - height: 13px; - background-repeat: no-repeat; - background-position: center center -} -.gantt_grid_head_cell .gantt_sort.gantt_asc { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC) -} -.gantt_grid_head_cell .gantt_sort.gantt_desc { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC) -} -.gantt_inserted, -.gantt_updated { - font-weight: 700 -} -.gantt_deleted { - text-decoration: line-through -} -.gantt_invalid { - background-color: #FFE0E0 -} -.gantt_error { - color: red -} -.gantt_status { - right: 1px; - padding: 5px 10px; - background: rgba(155, 155, 155, .1); - position: absolute; - top: 1px; - -webkit-transition: opacity .2s; - transition: opacity .2s; - opacity: 0 -} -.gantt_status.gantt_status_visible { - opacity: 1 -} -#gantt_ajax_dots span { - -webkit-transition: opacity .2s; - transition: opacity .2s; - background-repeat: no-repeat; - opacity: 0 -} -#gantt_ajax_dots span.gantt_dot_visible { - opacity: 1 -} -.dhtmlx_message_area { - position: fixed; - right: 5px; - width: 250px; - z-index: 1000 -} -.dhtmlx-message { // HOSEK -min-width: 120px; - font-family: Arial; - z-index: 10000; - margin: 5px 5px 10px; - -webkit-transition: all .5s ease; - -moz-transition: all .5s ease; - -o-transition: all .5s ease; - transition: all .5s ease; - font-size: 14px; - color: #000; - box-shadow: 3px 3px 3px rgba(0, 0, 0, .07); - padding: 0; - background-color: #FFF; - border-radius: 3px; - border: 1px solid #fff -} -.dhtmlx-message.hidden { // HOSEK -height: 0; - padding: 0; - border-width: 0; - margin: 0; - overflow: hidden -} -.dhtmlx_modal_box { - overflow: hidden; - display: inline-block; - min-width: 250px; - width: 250px; - text-align: center; - position: fixed; - z-index: 20000; - box-shadow: 3px 3px 3px rgba(0, 0, 0, .07); - font-family: Arial; - border-radius: 6px; - border: 1px solid #cecece; - background: #fff -} -.dhtmlx_popup_title { - border-top-left-radius: 6px; - border-top-right-radius: 6px; - border-width: 0 -} -.dhtmlx_button, -.dhtmlx_popup_button { - border: 1px solid #cecece; - height: 30px; - line-height: 30px; - display: inline-block; - margin: 0 5px; - border-radius: 4px; - background: #fff -} -.dhtmlx-message, /* HOSEK*/ -.dhtmlx_button, -.dhtmlx_popup_button { - user-select: none; - -webkit-user-select: none; - -moz-user-select: -moz-none; - -ms-user-select: none; - cursor: pointer -} -.dhtmlx_popup_text { - overflow: hidden -} -.dhtmlx_popup_controls { - border-radius: 6px; - padding: 10px -} -.dhtmlx_popup_button { - min-width: 100px -} -div.dhx_modal_cover { - background-color: #000; - cursor: default; - filter: alpha(opacity=20); - opacity: .2; - position: fixed; - z-index: 19999; - left: 0; - top: 0; - width: 100%; - height: 100%; - border: none; - zoom: 1 -} -.dhtmlx-message img, /* HOSEK */ -.dhtmlx_modal_box img { - float: left; - margin-right: 20px -} -.dhtmlx-alert-error, -.dhtmlx-confirm-error { - border: 1px solid red -} -.dhtmlx_button input, -.dhtmlx_popup_button div { - border-radius: 4px; - font-size: 14px; - -moz-box-sizing: content-box; - box-sizing: content-box; - padding: 0; - margin: 0; - vertical-align: top -} -.dhtmlx_popup_title { - color: #fff; - text-shadow: 1px 1px #000; - height: 40px; - line-height: 40px; - font-size: 20px -} -.dhtmlx_popup_text { - margin: 15px 15px 5px; - font-size: 14px; - color: #000; - min-height: 30px; - border-radius: 6px -} - -/* HOSEK V */ -/*.dhtmlx-error, -.dhtmlx-info { - font-size: 14px; - color: #000; - box-shadow: 3px 3px 3px rgba(0, 0, 0, .07); - padding: 0; - background-color: #FFF; - border-radius: 3px; - border: 1px solid #fff -}*/ -.dhtmlx-message div { - padding: 5px 10px; - border-radius: 3px; -} -.dhtmlx-info div { - background-color: #fff; - border: 1px solid #cecece; -} -.dhtmlx-error { - background-color: #d81b1b; - border: 1px solid #ff3c3c; -} -.dhtmlx-error div { - background-color: #d81b1b; - border: 1px solid #940000; - color: #FFF; -} -.dhtmlx-success { - background-color: #2dff2d; - border: 1px solid #6CFF6C; -} -.dhtmlx-success div { - background-color: #2dff2d; - border: 1px solid #1B991B; - /*color: #FFF*/ -} -/* HOSEK A */ -.gantt_data_area div, -.gantt_grid div { - -ms-touch-action: none; - -webkit-tap-highlight-color: transparent -} -.gantt_data_area { - position: relative; - overflow-x: hidden; - overflow-y: hidden; - -moz-user-select: -moz-none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; -} -.gantt_links_area { - position: absolute; - left: 0; - top: 0 -} -.gantt_side_content, -.gantt_task_content, -.gantt_task_progress { - line-height: inherit; - overflow: hidden; - height: 100% -} -.gantt_task_content { - font-size: 12px; - /*color: #fff;*/ - width: 100%; - top: 0; - position: absolute; - white-space: nowrap; - text-align: center -} -.gantt_task_progress { - text-align: center; - z-index: 0; - background: #299cb4 -} -.gantt_task_line { - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - position: absolute; - -moz-box-sizing: border-box; - box-sizing: border-box; - background-color: #3db9d3; - border: 1px solid #2898b0; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -moz-user-select: -moz-none -} -.gantt_task_line.gantt_drag_move div { - cursor: move -} -.gantt_touch_move, -.gantt_touch_progress .gantt_touch_resize { - -moz-transform: scale(1.02, 1.1); - -o-transform: scale(1.02, 1.1); - -webkit-transform: scale(1.02, 1.1); - transform: scale(1.02, 1.1); - -moz-transform-origin: 50%; - -o-transform-origin: 50%; - -webkit-transform-origin: 50%; - transform-origin: 50% -} -.gantt_touch_progress .gantt_task_progress_drag, -.gantt_touch_resize .gantt_task_drag { - -moz-transform: scaleY(1.3); - -o-transform: scaleY(1.3); - -webkit-transform: scaleY(1.3); - transform: scaleY(1.3); - -moz-transform-origin: 50%; - -o-transform-origin: 50%; - -webkit-transform-origin: 50%; - transform-origin: 50% -} -.gantt_side_content { - position: absolute; - white-space: nowrap; - /*color: #6e6e6e;*/ - bottom: 1px; - /*font-size: 14px*/ -} -.gantt_side_content.gantt_left { - right: 100%; - padding-right: 15px -} -.gantt_side_content.gantt_right { - left: 100%; - padding-left: 15px -} -.gantt_side_content.gantt_link_crossing { - /*bottom: 8.75px*/ -} -.gantt_link_arrow, -.gantt_task_link .gantt_line_wrapper { - position: absolute; - cursor: pointer -} -.gantt_line_wrapper div { - /*background-color: #ffa011;*/ - border: 1px solid #ffa011; -} -.gantt_task_link:hover .gantt_line_wrapper div { - box-shadow: 0 0 5px 0 #ffa011 -} -.gantt_task_link div.gantt_link_arrow { - background-color: transparent; - border-style: solid; - width: 0; - height: 0 -} -.gantt_link_control { - position: absolute; - width: 13px; - top: 0 -} -.gantt_link_control div { - display: none; - cursor: pointer; - box-sizing: border-box; - position: relative; - top: 50%; - margin-top: -7.5px; - vertical-align: middle; - border: 1px solid #929292; - -webkit-border-radius: 6.5px; - -moz-border-radius: 6.5px; - border-radius: 6.5px; - height: 13px; - width: 13px; - background-color: #f0f0f0 -} -.gantt_link_control div:hover { - background-color: #fff -} -.gantt_link_control.task_left { - left: -13px -} -.gantt_link_control.task_right { - right: -13px -} -.gantt_link_target .gantt_link_control div, -.gantt_task_line.gantt_selected .gantt_link_control div, -.gantt_task_line:hover .gantt_link_control div { - display: block -} -.gantt_link_source, -.gantt_link_target { - box-shadow: 0 0 3px #3db9d3 -} -.gantt_link_target.link_finish_allow, -.gantt_link_target.link_start_allow { - box-shadow: 0 0 3px #ffbf5e -} -.gantt_link_target.link_finish_deny, -.gantt_link_target.link_start_deny { - box-shadow: 0 0 3px #e87e7b -} -.link_finish_allow .gantt_link_control.task_right div, -.link_start_allow .gantt_link_control.task_left div { - background-color: #ffbf5e; - border-color: #ffa011 -} -.link_finish_deny .gantt_link_control.task_right div, -.link_start_deny .gantt_link_control.task_left div { - background-color: #e87e7b; - border-color: #dd3e3a -} -.gantt_link_arrow_right { - border-width: 4px 0 4px 6px; - border-top-color: transparent!important; - border-right-color: transparent!important; - border-bottom-color: transparent!important; - border-color: #ffa011; - margin-top: -1px -} -.gantt_link_arrow_left { - border-width: 4px 6px 4px 0; - margin-top: -1px; - border-top-color: transparent!important; - border-color: #ffa011; - border-bottom-color: transparent!important; - border-left-color: transparent!important -} -.gantt_link_arrow_top { - border-width: 0 4px 6px; - border-color: #ffa011; - border-top-color: transparent!important; - border-right-color: transparent!important; - border-left-color: transparent!important -} -.gantt_link_arrow_down { - border-width: 4px 6px 0 4px; - border-color: #ffa011; - border-right-color: transparent!important; - border-bottom-color: transparent!important; - border-left-color: transparent!important -} -.gantt_task_drag, -.gantt_task_progress_drag { - cursor: w-resize; - height: 100%; - display: none; - position: absolute -} -.gantt_task_line.gantt_selected .gantt_task_drag, -.gantt_task_line.gantt_selected .gantt_task_progress_drag, -.gantt_task_line:hover .gantt_task_drag, -.gantt_task_line:hover .gantt_task_progress_drag { - display: block -} -.gantt_task_drag { - width: 6px; - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAACCAYAAAB7Xa1eAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYDDjkw3UJvAwAAABRJREFUCNdj/P//PwM2wASl/6PTAKrrBf4+lD8LAAAAAElFTkSuQmCC); - z-index: 1; - top: 0 -} -.gantt_task_drag.task_left { - left: 0 -} -.gantt_task_drag.task_right { - right: 0 -} -.gantt_task_progress_drag { - height: 8px; - width: 8px; - bottom: -4px; - margin-left: -4px; - background-position: bottom; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY3Rjk0RUVDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY3Rjk0RUZDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjdGOTRFQ0MyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjdGOTRFREMyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PobPBzIAAADkSURBVHjaYpk2bRoDDsAExL1QdjEQ/8OmiAWHZk4gXqymqhQM4ty6fU8OSMUA8XdiDBAB4k0a6iqWRga6EKcwMQXduHlnL5DpB8Rv0J2JDFSA+JiOtgZcMwiA2CAxkBxUDVYDLEAKgIpV9XQ0MZwFEgPJAZnHoWpRDAgC4n2W5saiQKfjClQGkBxQDciL+6B6wAbkA/EqJwdrTkUFOQZCAKQGpBbIXA3SCzJggo+XK7OEuBgDsQCkFqgHrBfsBT5eHgZSAUwP2IBfv36TbABMDygdtK1Zv6UESLORaAbIhG6AAAMAKN8wE24DXWcAAAAASUVORK5CYII=); - background-repeat: no-repeat; - z-index: 2 -} -.gantt_link_tooltip { - box-shadow: 3px 3px 3px #888; - background-color: #fff; - border-left: 1px dotted #cecece; - border-top: 1px dotted #cecece; - font-family: Tahoma; - font-size: 8pt; - color: #444; - padding: 6px; - line-height: 20px -} -.gantt_link_direction { - height: 0; - border: 0 #ffa011; - border-bottom-style: dashed; - border-bottom-width: 2px; - transform-origin: 0 0; - -ms-transform-origin: 0 0; - -webkit-transform-origin: 0 0; - z-index: 2; - margin-left: 1px; - position: absolute -} -.gantt_grid_data .gantt_row.gantt_selected, -.gantt_grid_data .gantt_row.odd.gantt_selected, -.gantt_task_row.gantt_selected { - background-color: #fff3a1 -} -.gantt_task_row.gantt_selected .gantt_task_cell { - border-right-color: #ffec6e -} -.gantt_task_line.gantt_selected { - box-shadow: 0 0 5px #299cb4 -} -.gantt_task_line.gantt_project-type.gantt_selected { - box-shadow: 0 0 5px #46ad51 -} -.gantt_task_line.gantt_milestone-type { - visibility: hidden; - background-color: #d33daf; - border: 0 solid #61164f; - box-sizing: content-box; - -moz-box-sizing: content-box -} -.gantt_task_line.gantt_milestone-type div { - visibility: visible -} -.gantt_task_line.gantt_milestone-type .gantt_task_content { - background: inherit; - border: inherit; - border-width: 1px; - border-radius: inherit; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg) -} -.gantt_task_line.gantt_task_inline_color { - border-color: #999 -} -.gantt_task_line.gantt_task_inline_color .gantt_task_progress { - background-color: #363636; - opacity: .2 -} -.gantt_task_line.gantt_task_inline_color.gantt_project-type.gantt_selected, -.gantt_task_line.gantt_task_inline_color.gantt_selected { - box-shadow: 0 0 5px #999 -} -.gantt_task_link.gantt_link_inline_color:hover .gantt_line_wrapper div { - box-shadow: 0 0 5px 0 #999 -} -.gantt_critical_task { - background-color: #e63030; - border-color: #9d3a3a -} -.gantt_critical_task .gantt_task_progress { - background-color: rgba(0, 0, 0, .4) -} -.gantt_critical_link .gantt_line_wrapper>div { - background-color: #e63030 -} -.gantt_critical_link .gantt_link_arrow { - border-color: #e63030 -} -.gantt_unselectable, -.gantt_unselectable div { - -webkit-user-select: none; - -moz-user-select: none; - -moz-user-select: -moz-none; - -ms-user-select: none; -} -.gantt_cal_light { - -webkit-tap-highlight-color: transparent; - background: #fff; - border-radius: 6px; - font-family: Arial; - border: 1px solid #cecece; - color: #6b6b6b; - font-size: 12px; - position: absolute; - z-index: 10001; - width: 550px; - height: 250px; - box-shadow: 3px 3px 3px rgba(0, 0, 0, .07) -} -.gantt_cal_light select { - font-family: Arial; - border: 1px solid #cecece; - font-size: 13px; - padding: 2px; - margin: 0 -} -.gantt_cal_ltitle { - padding: 7px 10px; - overflow: hidden; - white-space: nowrap; - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius-topleft: 6px; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 0; - border-radius: 6px 6px 0 0 -} -.gantt_cal_ltitle span { - white-space: nowrap -} -.gantt_cal_lsection { - color: #727272; - font-weight: 700; - padding: 12px 0 5px 10px -} -.gantt_cal_lsection .gantt_fullday { - float: right; - margin-right: 5px; - font-size: 12px; - font-weight: 400; - line-height: 20px; - vertical-align: top; - cursor: pointer -} -.gantt_cal_lsection { - font-size: 13px -} -.gantt_cal_ltext { - padding: 2px 10px; - overflow: hidden -} -.gantt_cal_ltext textarea { - overflow: auto; - font-family: Arial; - font-size: 13px; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - border: 1px solid #cecece; - height: 100%; - width: 100%; - outline: 0!important; - resize: none -} -.gantt_time { - font-weight: 700 -} -.gantt_cal_light .gantt_title { - padding-left: 10px -} -.gantt_cal_larea { - border: 1px solid #cecece; - border-left: none; - border-right: none; - background-color: #fff; - overflow: hidden; - height: 1px -} -.gantt_btn_set { - margin: 10px 7px 5px 10px; - padding: 5px 15px 5px 10px; - float: left; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - border-width: 0; - border-color: #cecece; - border-style: solid; - height: 32px; - font-weight: 700; - background: #fff; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - cursor: pointer -} -.gantt_btn_set div { - float: left; - font-size: 13px; - height: 22px; - line-height: 22px; - background-repeat: no-repeat; - vertical-align: middle -} -.gantt_save_btn { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTk1OUU5RDFDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTk1OUU5RDJDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxOTU5RTlDRkMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxOTU5RTlEMEMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjDroXYAAAEXSURBVHjaYvz//z8DJYCRUgPIAUxAbAnEHiAHMIBcQCwGaRYXF3e6evXqoffv39/dv38/CymaGSUkJBzv3LlzCsj///fv3wdAihkkIQnEvkAshU8zLy+v7a1bt06ANP/79+87kDIAy505cybq06dPr3p7ezuwGQLTfOPGjWP/ESAZLg8kPKBO+g01RBJNszWyZqC6uSgWgIg/f/4shxnS2dnZBjMEqNkSFGBImi8CKTYMA4BYCGjIczRDHC5dunQQSfN7IKWI4UUkjjdMMdCwnw8ePLjwHxV4Yw1gZA5Q47z/2EELzhhCE+ABGvIQWSeQvwcU38QaAML2wHj+C/X3MyAlijeB4ZBoBOIPQGxJKIVSnBsBAgwABddBclWfcZUAAAAASUVORK5CYII=); - margin-top: 2px; - width: 21px -} -.gantt_cancel_btn { - margin-top: 2px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDkzMDA3MzlDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDkzMDA3M0FDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowOTMwMDczN0MzMDQxMUUyODZBNUUzMURDODBGQkRENiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowOTMwMDczOEMzMDQxMUUyODZBNUUzMURDODBGQkRENiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmYuYOUAAAEdSURBVHjaYvz//z8DJYAFXWDlypU8QKoIiD2A2AwqfAqIdwBxX3h4+Bdk9YzILgBqtgdS84FYEYeF94E4EWjIQZgAE5LmQCB1AKoZZKMPEAtAMYh9GSp3AKjWD8UFQAEhIPshEIOc3wHENUBb/qJ57SyQMoJyPwKxElDNO1gYFEE17wMKVmIJlzNQzeegrjaA6qmBecEbSvfh0GwMxGeBhoPoemQ9MAO0kEIbl2YTqPAFKK2IbMB3AjabYIkRZmQD7kNpMyI0G0PpO8gGbIUFJj7NQDk2INWIrIcJKfBAKcwJqvkcDs0TgFgXGo19KCkRmpDWQdWDEk0NUoCBoq0FqhkE/IEWbKJKUmZEz43QzFSKIzN1481M5ACAAAMAlfl/lCwRpagAAAAASUVORK5CYII=); - width: 20px -} -.gantt_delete_btn { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=); - margin-top: 2px; - width: 20px -} -.gantt_cal_cover { - width: 100%; - height: 100%; - position: absolute; - z-index: 10000; - top: 0; - left: 0; - background-color: #000; - opacity: .1; - filter: alpha(opacity=10) -} -.gantt_custom_button { - padding: 0 3px; - font-family: Arial; - font-size: 13px; - font-weight: 400; - margin-right: 10px; - margin-top: -5px; - cursor: pointer; - float: right; - height: 21px; - width: 90px; - border: 1px solid #CECECE; - text-align: center; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - -ms-border-radius: 4px; - -o-border-radius: 4px; - border-radius: 4px -} -.gantt_custom_button div { - cursor: pointer; - float: none; - height: 21px; - line-height: 21px; - vertical-align: middle -} -.gantt_custom_button div:first-child { - display: none -} -.gantt_cal_light_wide { - width: 580px; - padding: 2px 4px -} -.gantt_cal_light_wide .gantt_cal_larea { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - border: 1px solid #cecece -} -.gantt_cal_light_wide .gantt_cal_lsection { - border: 0; - float: left; - text-align: right; - width: 80px; - height: 20px; - padding: 5px 10px 0 0 -} -.gantt_cal_light_wide .gantt_wrap_section { - position: relative; - padding: 10px 0; - overflow: hidden; - border-bottom: 1px solid #ebebeb -} -.gantt_cal_light_wide .gantt_section_time { - overflow: hidden; - padding-top: 2px!important; - padding-right: 0; - height: 20px!important -} -.gantt_cal_light_wide .gantt_cal_ltext { - padding-right: 0 -} -.gantt_cal_light_wide .gantt_cal_larea { - padding: 0 10px; - width: 100% -} -.gantt_cal_light_wide .gantt_section_time { - background: 0 0 -} -.gantt_cal_light_wide .gantt_cal_checkbox label { - padding-left: 0 -} -.gantt_cal_light_wide .gantt_cal_lsection .gantt_fullday { - float: none; - margin-right: 0; - font-weight: 700; - cursor: pointer -} -.gantt_cal_light_wide .gantt_custom_button { - position: absolute; - top: 0; - right: 0; - margin-top: 2px -} -.gantt_cal_light_wide .gantt_repeat_right { - margin-right: 55px -} -.gantt_cal_light_wide.gantt_cal_light_full { - width: 738px -} -.gantt_cal_wide_checkbox input { - margin-top: 8px; - margin-left: 14px -} -.gantt_cal_light input { - font-size: 13px -} -.gantt_section_time { - background-color: #fff; - white-space: nowrap; - padding: 5px 10px; - padding-top: 2px!important -} -.gantt_section_time .gantt_time_selects { - float: left; - height: 25px -} -.gantt_section_time .gantt_time_selects select { - height: 23px; - padding: 2px; - border: 1px solid #cecece -} -.gantt_duration { - width: 100px; - height: 23px; - float: left; - white-space: nowrap; - margin-left: 20px; - line-height: 23px -} -.gantt_duration .gantt_duration_dec, -.gantt_duration .gantt_duration_inc, -.gantt_duration .gantt_duration_value { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - text-align: center; - vertical-align: top; - height: 100%; - border: 1px solid #cecece -} -.gantt_duration .gantt_duration_value { - width: 40px; - padding: 3px 4px; - border-left-width: 0; - border-right-width: 0 -} -.gantt_duration .gantt_duration_dec, -.gantt_duration .gantt_duration_inc { - width: 20px; - padding: 1px 1px 3px; - background: #fff -} -.gantt_duration .gantt_duration_dec { - -moz-border-top-left-radius: 4px; - -moz-border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px -} -.gantt_duration .gantt_duration_inc { - margin-right: 4px; - -moz-border-top-right-radius: 4px; - -moz-border-bottom-right-radius: 4px; - -webkit-border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-top-right-radius: 4px; - border-bottom-right-radius: 4px -} -.gantt_cal_quick_info { - border: 1px solid #cecece; - border-radius: 6px; - position: absolute; - z-index: 300; - box-shadow: 3px 3px 3px rgba(0, 0, 0, .07); - background-color: #fff; - width: 300px; - transition: left .5s ease, right .5s; - -moz-transition: left .5s ease, right .5s; - -webkit-transition: left .5s ease, right .5s; - -o-transition: left .5s ease, right .5s -} -.gantt_no_animate { - transition: none; - -moz-transition: none; - -webkit-transition: none; - -o-transition: none -} -.gantt_cal_quick_info.gantt_qi_left .gantt_qi_big_icon { - float: right -} -.gantt_cal_qi_title { - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius-topleft: 6px; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 0; - border-radius: 6px 6px 0 0; - padding: 5px 0 8px 12px; - color: #454545; - background-color: #fff; - border-bottom: 1px solid #cecece -} -.gantt_cal_qi_tdate { - font-size: 14px; - font-weight: 700 -} -.gantt_cal_qi_tcontent { - font-size: 13px -} -.gantt_cal_qi_content { - padding: 16px 8px; - font-size: 13px; - color: #454545; - overflow: hidden -} -.gantt_cal_qi_controls { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius-topleft: 0; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topright: 0; - -moz-border-radius-bottomright: 6px; - border-radius: 0 0 6px 6px; - padding-left: 7px -} -.gantt_cal_qi_controls .gantt_menu_icon { - margin-top: 6px; - background-repeat: no-repeat -} -.gantt_cal_qi_controls .gantt_menu_icon.icon_edit { - width: 20px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC) -} -.gantt_cal_qi_controls .gantt_menu_icon.icon_delete { - width: 20px; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=) -} -.gantt_qi_big_icon { - font-size: 13px; - border-radius: 4px; - font-weight: 700; - background: #fff; - margin: 5px 9px 8px 0; - min-width: 60px; - line-height: 32px; - vertical-align: middle; - padding: 0 10px 0 5px; - cursor: pointer; - border: 1px solid #cecece -} -.gantt_cal_qi_controls div { - float: left; - height: 32px; - text-align: center; - line-height: 32px -} -.gantt_tooltip { - box-shadow: 3px 3px 3px rgba(0, 0, 0, .07); - background-color: #fff; - border-left: 1px solid rgba(0, 0, 0, .07); - border-top: 1px solid rgba(0, 0, 0, .07); - font-family: Arial; - font-size: 8pt; - color: #454545; - padding: 10px; - position: absolute; - z-index: 50 -} -.gantt_marker { - height: 100%; - width: 2px; - top: 0; - position: absolute; - text-align: center; - background-color: rgba(255, 0, 0, .4); - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box -} -.gantt_marker .gantt_marker_content { - padding: 5px; - background: inherit; - color: #fff; - position: absolute; - font-size: 12px; - line-height: 12px; - opacity: .8 -} -.gantt_marker_area { - position: absolute; - top: 0; - left: 0 -} -.gantt_noselect { - -moz-user-select: -moz-none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none -} -.gantt_drag_marker { - position: absolute; - font-family: Arial; - font-size: 13px -} -.gantt_drag_marker .gantt_tree_icon.gantt_blank, -.gantt_drag_marker .gantt_tree_icon.gantt_close, -.gantt_drag_marker .gantt_tree_icon.gantt_open, -.gantt_drag_marker .gantt_tree_indent { - display: none -} -.gantt_drag_marker, -.gantt_drag_marker .gantt_row.odd { - background-color: #fff -} -.gantt_drag_marker .gantt_row { - border-left: 1px solid #d2d2d2; - border-top: 1px solid #d2d2d2 -} -.gantt_drag_marker .gantt_cell { - border-color: #d2d2d2 -} -.gantt_row.gantt_over, -.gantt_task_row.gantt_over { - background-color: #0070fe -} -.gantt_row.gantt_transparent .gantt_cell { - opacity: .7 -} -.gantt_task_row.gantt_transparent { - background-color: #f8fdfd -} -.dhtmlx_popup_button.dhtmlx_delete_button { - background: #3db9d3; - text-shadow: 0 -1px 0 #248a9f; - color: #fff; - font-weight: 700; - border-width: 0 -} -/* - - - -*/ - -@media print { - .content-title { - display: none; - } - - @page { - size: landscape - } - - .gantt-grid-checkbox-cont { - display: none; - } -} - -.gantt_container { - display: inline-block; -} - -#gantt_cont { - position: relative; - z-index: 0; -} - -#easy_gantt .weekend { - background-color: #F7F7F7; -} - -#easy_gantt .first-date { - position: relative; -} - -#easy_gantt .first-date:after { - content: ""; - position: absolute; - display: block; - left: -1px; - top: 0; - bottom: 0; - border-left: 1px solid #628DB6; -} - -#easy_gantt { - position: relative; -} - -.gantt_task_content { - overflow: visible; - /*color:black;*/ -} - -.no_task_controls .gantt_link_control div { - display: none !important; -} - -.gantt-fresh .gantt_link_control div { - display: none !important; -} - -.no_task_controls .gantt_task_drag, .no_task_controls .gantt_task_progress_drag { - display: none !important; -} - -#gantt_link_dialog { - border: 1px #000 solid; - background-color: #fff; - width: 200px; - position: absolute; - padding: 10px; - z-index: 2; -} - -#gantt_link_dialog input[type="number"] { - width: 38px; -} - -.gantt-tooltip { - position: absolute; - display: none; - background-color: white; - -webkit-box-shadow: 0 0 4px 2px rgba(232, 232, 232, 1); - -moz-box-shadow: 0 0 4px 2px rgba(232, 232, 232, 1); - box-shadow: 0 0 4px 2px rgba(232, 232, 232, 1); - padding: 20px; - z-index: 10; -} - -.gantt-tooltip-header { - font-size: 1em; - padding-bottom: 10px; - border-bottom: 1px solid rgba(0, 0, 0, 0.2); - margin: 0 0 10px; -} - -.gantt-tooltip-label { - font-size: 0.89em; - color: #a0a0a0; -} - -.gantt-tooltip-problem { - color: #d94838; - font-size: smaller; -} - -#easy_gantt.gantt .gantt_task_line.overdue { - background-color: #d94838; -} - -#easy_gantt.easy .gantt_task_line, #easy_gantt.easy .gantt_row { - padding: 0; - border-width: 0 0 1px 0; -} - -.gantt_task_progress { - /*background-color: rgba(0, 0, 0, 0.3);*/ - margin-left: 1px; -} - -#link_popup_button_cont { - margin-top: 35px; -} - -#easy_gantt a.disabled:hover { - text-decoration: none; - cursor: not-allowed; -} - -.milestone-type .gantt_cell { - border-right: 0; -} - -.gantt-legend-color-square { - border: 1px solid transparent; - margin-left: 10px; -} - -.gantt-color-square, .gantt-legend-color-square { - width: 15px; - height: 15px; - display: inline-block; - vertical-align: middle; - border: 1px solid transparent; -} - -.easy-gantt-legend-symbol { - margin-left: 10px; -} - -.gantt_cell { - padding: 0; -} - -.gantt_grid { - border-right-width: 2px; -} - -.gantt_row .gantt_drag_handle:before { - width: 18px; - height: 100%; - font-size: 20px; - font-weight: bold; -} - -.gantt_row:hover .gantt_drag_handle:before { - content: '\21F5'; - opacity: 0.5; -} - -.gantt_row .gantt_drag_handle:hover:before { - opacity: 1; - content: '\21F5'; -} - -.gantt_row.gantt_drag_to_allowed { - background-color: #FFEB59; -} - -.gantt_row.gantt_drag_hover { - background-color: #eeeeee; -} - -.gantt_row.gantt_drag_to_allowed.gantt_drag_hover { - background-color: #FBCF00; -} - -/*#sample_cont.flash {*/ -/*background-image: none;*/ -/*}*/ -.gantt-supertop-panel { - position: relative; -} - -#easy_gantt .gantt-sample-flash { - font-size: 14px; -} - -.gantt-menu { - z-index: 1; - position: relative; - background-color: #ffffff; - padding: 5px 0; -} - -.gantt-footer-menu { - padding: 5px 0; -} - -/*.easy-gantt-menu .action-buttons-with-submenu {*/ -/*display: inline;*/ -/*}*/ -.gantt-modal-video { - margin-left: 10px; - margin-top: 5px; -} - -.gantt_drag_marker { - z-index: 1; - pointer-events: none; -} - -.gantt_grid_column_resize_wrap, .gantt_grid_columns_resize_wrap { - top: 0; - height: 100%; - cursor: col-resize; - position: absolute; - /*background-color: red;*/ - width: 12px -} - -/*.gantt_task_line.parent{*/ -/*background-color: yellow;*/ -/*}*/ -.gantt-sample-close-button { - background-color: #cd0a0a; - color: white; - width: auto; - height: auto; - float: none; - display: inline; - margin-left: 25px; - padding: 8px 10px 8px 25px; - background-position-x: 5px; -} - -/* Easy Redmine < 2016 */ -#easy_gantt.easy .push-left { - float: left; -} - -#easy_gantt.easy .push-right { - float: right; - text-align: right -} - -/*#easy_gantt.easy .gantt-menu p[id^="button_"], #easy_gantt.easy .gantt-menu div[id^="button_"] {*/ -/*display: inline-block;*/ -/*}*/ -.gantt_grid_data div.empty-type div { - display: none; -} - -.gantt_bars_area div.empty-type { - display: none; -} - -.gantt_task_line.planned { - z-index: 1; -} - -.gantt_link_tooltip.gantt_link_deny { - background-color: #ff6666; -} - -@media print { - #easy_servicebar { - display: none; - } - - #easy_gantt_menu { - display: none; - } - - #easy_gantt_footer { - display: none; - } - - .flash { - display: none; - } -} - -.gantt_grid_superitem { - font-weight: bold; - /*font-style: italic;*/ - height: 100%; - width: 100%; - vertical-align: top; -} - -.gantt_grid_scale, .gantt_task_scale { - background-color: #ffffff; - z-index: 1; - position: relative; - border-top: 1px solid #cecece; - transform: translate(0, -1px); -} - -.gantt_grid_scale .gantt_grid_head_cell, .gantt_task .gantt_task_scale .gantt_scale_cell { - color: rgba(72, 72, 72, 0.8); -} - -/*.gantt_scale_cell{*/ -/*overflow: visible;*/ -/*}*/ - -.gantt-footer-legend { - display: inline-block; - float: right; - margin-top: 20px; -} - -.gantt-legend-symbol { - font-size: 15px; -} - -#easy_gantt input.wrong { - background-color: #cd0a0a; -} - -.gantt-reload-model-error { - color: #cd0a0a; -} - -.gantt_task_line { - background-color: inherit !important; - border: none !important; - box-shadow: none !important; -} - -.gantt_task_line.gantt_selected .gantt_task_content { - box-shadow: none !important; -} - -.gantt_task_line.closed .gantt_task_ticks, -.gantt_task_line.closed .gantt_task_content { - background-color: rgba(200, 200, 200, 0.2); - border-color: rgba(200, 200, 200, 1); -} - -.gantt_link_point { - border-color: rgba(217, 72, 56, 1) !important; - background-color: rgba(217, 72, 56, 1) !important; -} - -.gantt_task_drag { - background: radial-gradient(rgba(217, 72, 56, 1) 25%, transparent 10%) 1px 1px; - background-size: 4px 4px; -} - -.gantt_task_progress_drag { - border-bottom: 10px solid rgba(217, 72, 56, 1); -} - -.gantt_line_wrapper div, .gantt_link_arrow { - border-color: rgba(255, 125, 30, 1); -} - -.gantt-relation-simple > .gantt_line_wrapper div, .gantt-relation-simple > .gantt_link_arrow { - border-color: rgba(30, 120, 255, 1); -} - -.gantt-relation-simple:hover > .gantt_line_wrapper div { - box-shadow: 0 0 5px 0 rgba(30, 120, 255, 1); -} -.gantt-relation-unlocked > .gantt_line_wrapper div, .gantt-relation-unlocked > .gantt_link_arrow { - border-color: rgba(51, 141, 71, 1); -} - -.gantt-relation-unlocked:hover > .gantt_line_wrapper div { - box-shadow: 0 0 5px 0 rgba(255, 125, 30, 1); -} - -#easy_gantt .wrong .gantt_line_wrapper div { - border-color: rgba(217, 72, 56, 1) !important; -} - -#easy_gantt .wrong .gantt_link_arrow { - border-color: rgba(217, 72, 56, 1) !important; - border-top-color: transparent !important; - border-right-color: transparent !important; - border-bottom-color: transparent !important; -} - -.gantt_task_progress_drag { - border-bottom: 10px solid rgba(217, 72, 56, 1); -} - -#easy_gantt .gantt_link_arrow_right { - border-top-color: transparent !important; - border-right-color: transparent !important; - border-bottom-color: transparent !important; -} - -.gantt_task_progress_drag { - width: 0 !important; - height: 0 !important; - background: none !important; - border-left: 6.5px solid transparent; - border-right: 6.5px solid transparent; - border-bottom-width: 10px; - border-bottom-style: solid; - margin-left: -6.5px !important; -} - -.gantt_task_drag { - background-size: 4px 4px; -} - -.gantt_link_control.task_left { - left: -6.5px; - width: 6.5px; - border-radius: 6.5px 0 0 6.5px; -} - -.gantt_link_control.task_right { - right: -6.5px; - width: 6.5px; - border-radius: 0 6.5px 6.5px 0; -} - -.gantt_link_control.task_left .gantt_link_point { - width: 6.5px; - border-radius: 6.5px 0 0 6.5px; -} - -.gantt_link_control.task_right .gantt_link_point { - width: 6.5px; - border-radius: 0 6.5px 6.5px 0; -} - -@media print { - body { - margin: 0; - } - - .gantt_sort { - display: none; - } -} - -.gantt-grid-header-collapse-buttons { - position: absolute; - left: 5px; - bottom: 2px; -} - -.gantt-grid-header-collapse-buttons a { - font-size: 18px; - color: #a6a6a6; - font-weight: bold; - font-family: monospace; - display: inline-block; -} - -.gantt-grid-header-collapse-buttons a.active { - font-size: 18px; - color: #d94838 !important; - background-color: transparent !important; - border: none !important; -} - -.gantt-grid-header-collapse-buttons a:hover { - font-size: 18px; - color: rgba(72, 72, 72, 1); - text-decoration: none; - background-color: #eeeeee !important; - box-shadow: 0 0 15px 5px #eeeeee; - border-radius: 11px; -} - -.gantt-grid-checkbox-cont br { - display: none; -} - -@media screen { - .gantt-icon-parent-issue:before { - content: '⥐' - } - - .gantt-icon-milestone:before { - content: '♦'; - } -} - -.gantt_task_line.gantt_parent_task-subtype .gantt_task_content { - height: 50%; - -moz-border-radius-bottomleft: 0; - -moz-border-radius-bottomright: 0; -} - -.gantt_task_line.gantt_parent_task-subtype .gantt_task_progress { - height: 50%; -} - -.gantt_task_ticks { - height: 0; - margin-top: -1px; - border: 10px solid rgba(51, 141, 71, 1); - border-top-width: 0; - border-bottom-color: transparent !important; - background-color: transparent !important; -} - -.gantt-milestone-icon { - transform: scale(0.65) rotate(45deg); - width: 16px !important; - height: 16px !important; - background-color: rgba(62, 91, 118, 1); - border: 2px solid rgba(62, 91, 118, 1); -} - -.gantt_row:hover .gantt-bullet-hover-hide { - display: none; -} - -.gantt-sum-row-small { - font-size: 8px; -} - -.gantt-sum-row-negative { - color: red; -} - -#easy_gantt.easy #easy_gantt_menu { - z-index: 2; - overflow: visible; -} - -#easy_gantt .contextual.settings a { - z-index: 1; - border: none; - padding-right: 0; - opacity: 0.6; -} - -#easy_gantt.easy .contextual.settings a { - background: none; -} - -#easy_gantt .contextual.settings a:hover { - opacity: 1; -} - -#easy_gantt.easy .contextual.settings a:hover { - background: none; -} - -.gantt-grid-header-multi { - line-height: normal; - display: inline-block; - white-space: normal; -} - -.gantt_task_relation_stop { - position: absolute; - width: 8px; - top: 0; - height: 100%; - border: 2px solid rgba(255, 120, 0, 0.5); - box-sizing: border-box; -} - -.gantt_task_relation_stop_left { - border-right-color: transparent; -} - -.gantt_task_relation_stop_right { - border-left-color: transparent; - -webkit-transform: translate(-100%); - -moz-transform: translate(-100%); - -ms-transform: translate(-100%); - -o-transform: translate(-100%); - transform: translate(-100%); -} - -.gantt-menu-sub-panel { - margin-top: 3px; -} - -.gantt_task .gantt-sum-row .gantt_scale_cell { - font-weight: bold; - color: #260080; -} - -.gantt-menu-problems-count.gantt-with-problems { - background-color: red; - padding: 1px; - border: 1px solid #b0b0b0; - border-radius: 4px; -} - -.gantt-menu-problems-list { - overflow: auto; - position: absolute; - z-index: 2; - max-width: 600px; - margin-top: 5px; - border: 2px solid #cecece; - background-color: white; - right: 0; - text-align: left; -} - -.gantt-menu-problems-list ol { - margin: 5px 5px 5px -5px; -} - -.gantt-menu-problems-list li { - border-bottom: 1px solid #d9d9d9; - white-space: nowrap; - padding: 5px 25px 5px 5px; -} - -.gantt-menu-problems-list ol, -.gantt-menu-problems-list a { - color: #4b5561; -} - -.gantt-menu-problems-reason { - color: red; -} - -.gantt-task-bar-line { - position: absolute; - left: 0; - top: 0; - overflow: hidden -} -.jasmine_html-reporter .jasmine-summary ul{ - margin-top: 0; - margin-bottom: 0; -} - -@media print { - /* Because of gaps between cells in header */ - .gantt_scale_line.gantt-print__scale-line{ - font-size: 0; - } - .gantt_scale_line.gantt-print__scale-line .gantt_scale_cell{ - font-size: 12px; - } -} -/*----------------------------------------*/ -/* Vendors */ -/*----------------------------------------*/ -/*----------------------------------------*/ -/* Mixins & Placeholders */ -/*----------------------------------------*/ -/* line 88, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/css3.scss */ -div#easy_gantt.easy .button.active, .easy .easy-gantt__menu-group--tooltiped ul li > .menu-children, .easy .easy-gantt__menu-group--tooltiped ul { - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; -} - -/* line 97, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/css3.scss */ -.easy-gantt__menu .gantt-menu-problems-count.gantt-with-problems { - -webkit-border-radius: 5000px; - -moz-border-radius: 5000px; - border-radius: 5000px; -} - -/* line 118, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/css3.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li > .menu-children, .easy .easy-gantt__menu-group--tooltiped ul { - -webkit-box-shadow: 0px 0px 5px 0 rgba(0, 0, 0, 0.125); - -moz-box-shadow: 0px 0px 5px 0 rgba(0, 0, 0, 0.125); - box-shadow: 0px 0px 5px 0 rgba(0, 0, 0, 0.125); -} - -/* line 130, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/css3.scss */ -div#easy_gantt.easy .active.button { - -webkit-box-shadow: inset 0px 1px 10px 0px rgba(0, 0, 0, 0.125); - -moz-box-shadow: inset 0px 1px 10px 0px rgba(0, 0, 0, 0.125); - box-shadow: inset 0px 1px 10px 0px rgba(0, 0, 0, 0.125); -} - -/* line 305, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/css3.scss */ -.easy-gantt__menu { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -/* line 502, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/css3.scss */ -.easy-gantt__menu { - display: -webkit-box; - display: -moz-box; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; -} - -/* line 524, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/css3.scss */ -.easy-gantt__menu { - -webkit-justify-content: space-between; - -ms-justify-content: space-between; - justify-content: space-between; -} - -/* line 551, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/css3.scss */ -.easy-gantt__menu { - -webkit-flex-wrap: wrap; - -ms-flex-wrap: wrap; - flex-wrap: wrap; -} - -/* line 15, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/typography.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li { - font-family: "Open Sans", sans-serif; - font-size: 13px; - line-height: 1.5; - font-weight: normal; - color: #42321a; -} - -@media only screen and (min-resolution: 100dpi) { - /* line 15, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/typography.scss */ - .easy .easy-gantt__menu-group--tooltiped ul li { - font-size: 14px; - } -} - -@media only screen and (max-width: 960px) { - /* line 15, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/typography.scss */ - .easy .easy-gantt__menu-group--tooltiped ul li { - font-size: 11px; - } -} - -@media only screen and (max-width: 960px) and (min-resolution: 100dpi) { - /* line 15, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/typography.scss */ - .easy .easy-gantt__menu-group--tooltiped ul li { - font-size: 13px; - } -} - -@media only screen and (min-width: 1401px) { - /* line 15, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/typography.scss */ - .easy .easy-gantt__menu-group--tooltiped ul li { - font-size: 14px; - } -} - -@media only screen and (min-width: 1401px) and (min-resolution: 100dpi) { - /* line 15, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/typography.scss */ - .easy .easy-gantt__menu-group--tooltiped ul li { - font-size: 16px; - } -} - -@media only screen and (min-width: 1901px) { - /* line 15, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/typography.scss */ - .easy .easy-gantt__menu-group--tooltiped ul li { - font-size: 15px; - } -} - -@media only screen and (min-width: 1901px) and (min-resolution: 100dpi) { - /* line 15, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/typography.scss */ - .easy .easy-gantt__menu-group--tooltiped ul li { - font-size: 17px; - } -} - -/* line 98, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/typography.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li a { - -ms-word-break: break-all; - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; -} - -/* line 1, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/icons.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li a.submenu:after, .easy-gantt__icon:before { - speak: none; - font-weight: normal; - font-style: normal; - text-decoration: none; - -webkit-font-smoothing: antialiased; - display: inline-block; - width: auto; - height: auto; - background-position: 0% 0%; - background-repeat: repeat; - background-image: none; - vertical-align: baseline; -} - -/* line 21, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/icons.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li a.submenu:after, .easy-gantt__icon:before { - font-family: "EasyIcons"; -} - -/* line 24, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/icons.scss */ -.easy-gantt__icon { - position: relative; - background-repeat: no-repeat; - background-image: none !important; -} - -/* line 2, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/pseudo.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li > .menu-children:after, .easy .easy-gantt__menu-group--tooltiped ul li > .menu-children:before { - content: ""; - display: block; - z-index: 1; -} - -/* line 7, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/pseudo.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li > .menu-children { - position: relative; -} - -/* line 12, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/pseudo.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li > .menu-children:after { - position: absolute; -} - -/* line 19, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/pseudo.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li > .menu-children:before { - position: absolute; -} - -/* line 16, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/buttons.scss */ -.splitcontent .contextual div#easy_gantt.easy .button.active, div#easy_gantt.easy .splitcontent .contextual .button.active { - padding: 2.5px 5px !important; - font-size: 0.89em; -} - -/* line 19, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/buttons.scss */ -.splitcontent .contextual div#easy_gantt.easy .icon.button.active, div#easy_gantt.easy .splitcontent .contextual .icon.button.active { - padding-left: 30px !important; -} - -/* line 21, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/buttons.scss */ -.splitcontent .contextual div#easy_gantt.easy .icon.button.active:before, div#easy_gantt.easy .splitcontent .contextual .icon.button.active:before { - width: 30px !important; - font-size: 1.1em; -} - -/* line 26, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/buttons.scss */ -#sidebar .splitcontent .contextual div#easy_gantt.easy .button.active, .splitcontent .contextual div#easy_gantt.easy #sidebar .button.active, #sidebar div#easy_gantt.easy .splitcontent .contextual .button.active, div#easy_gantt.easy .splitcontent .contextual #sidebar .button.active, #easy_grid_sidebar .splitcontent .contextual div#easy_gantt.easy .button.active, .splitcontent .contextual div#easy_gantt.easy #easy_grid_sidebar .button.active, #easy_grid_sidebar div#easy_gantt.easy .splitcontent .contextual .button.active, div#easy_gantt.easy .splitcontent .contextual #easy_grid_sidebar .button.active { - display: inline-block !important; -} - -/* line 46, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/buttons.scss */ -div#easy_gantt.easy .icon.button.active:before { - position: absolute; - left: 0; - width: 30px; - text-align: center; - font-size: 1.2em; - line-height: 1; - color: inherit; - top: 50%; - margin-top: -0.5em; -} - -/* line 58, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/buttons.scss */ -#sidebar div#easy_gantt.easy .icon.button.active, div#easy_gantt.easy #sidebar .icon.button.active, #easy_grid_sidebar div#easy_gantt.easy .icon.button.active, div#easy_gantt.easy #easy_grid_sidebar .icon.button.active { - padding-left: 40px !important; -} - -/* line 60, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/buttons.scss */ -#sidebar div#easy_gantt.easy .icon.button.active:before, div#easy_gantt.easy #sidebar .icon.button.active:before, #easy_grid_sidebar div#easy_gantt.easy .icon.button.active:before, div#easy_gantt.easy #easy_grid_sidebar .icon.button.active:before { - width: 40px !important; -} - -/* line 64, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/buttons.scss */ -div#easy_gantt.easy .button.active { - font-size: 0.89em; - font-weight: bold; - display: inline-block; - border: 1px solid transparent; - padding: 5px 10px; - text-align: left; - cursor: pointer; - position: relative; - vertical-align: middle; -} - -/* line 75, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/buttons.scss */ -div#easy_gantt.easy .icon.button.active { - padding-left: 30px; -} - -/* line 82, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/buttons.scss */ -#sidebar div#easy_gantt.easy .button.active, div#easy_gantt.easy #sidebar .button.active, #easy_grid_sidebar div#easy_gantt.easy .button.active, div#easy_gantt.easy #easy_grid_sidebar .button.active { - display: block; - position: relative !important; - z-index: 2; - padding-left: 20px; - margin-bottom: 3px; -} - -@media only screen and (min-width: 641px) { - /* line 93, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/buttons.scss */ - .nosidebar #sidebar div#easy_gantt.easy .button.active:hover, div#easy_gantt.easy .nosidebar #sidebar .button.active:hover, .nosidebar #easy_grid_sidebar div#easy_gantt.easy .button.active:hover, div#easy_gantt.easy .nosidebar #easy_grid_sidebar .button.active:hover { - -webkit-animation: sidebar-buttons-slide-left 0.25s forwards; - -moz-animation: sidebar-buttons-slide-left 0.25s forwards; - -ms-animation: sidebar-buttons-slide-left 0.25s forwards; - -o-animation: sidebar-buttons-slide-left 0.25s forwards; - animation: sidebar-buttons-slide-left 0.25s forwards; - } -} - -/* line 99, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/buttons.scss */ -.form-actions div#easy_gantt.easy .button.active, div#easy_gantt.easy .form-actions .button.active { - margin: 3px 0; -} - -@-webkit-keyframes sidebar-buttons-slide-left { - from { - -webkit-transform: translate(0, 0); - -moz-transform: translate(0, 0); - -ms-transform: translate(0, 0); - -o-transform: translate(0, 0); - transform: translate(0, 0); - } - to { - -webkit-transform: translate(-200px, 0); - -moz-transform: translate(-200px, 0); - -ms-transform: translate(-200px, 0); - -o-transform: translate(-200px, 0); - transform: translate(-200px, 0); - } -} - -@-moz-keyframes sidebar-buttons-slide-left { - from { - -webkit-transform: translate(0, 0); - -moz-transform: translate(0, 0); - -ms-transform: translate(0, 0); - -o-transform: translate(0, 0); - transform: translate(0, 0); - } - to { - -webkit-transform: translate(-200px, 0); - -moz-transform: translate(-200px, 0); - -ms-transform: translate(-200px, 0); - -o-transform: translate(-200px, 0); - transform: translate(-200px, 0); - } -} - -@-ms-keyframes sidebar-buttons-slide-left { - /* line 110, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/buttons.scss */ - from { - -webkit-transform: translate(0, 0); - -moz-transform: translate(0, 0); - -ms-transform: translate(0, 0); - -o-transform: translate(0, 0); - transform: translate(0, 0); - } - /* line 113, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/buttons.scss */ - to { - -webkit-transform: translate(-200px, 0); - -moz-transform: translate(-200px, 0); - -ms-transform: translate(-200px, 0); - -o-transform: translate(-200px, 0); - transform: translate(-200px, 0); - } -} - -@keyframes sidebar-buttons-slide-left { - from { - -webkit-transform: translate(0, 0); - -moz-transform: translate(0, 0); - -ms-transform: translate(0, 0); - -o-transform: translate(0, 0); - transform: translate(0, 0); - } - to { - -webkit-transform: translate(-200px, 0); - -moz-transform: translate(-200px, 0); - -ms-transform: translate(-200px, 0); - -o-transform: translate(-200px, 0); - transform: translate(-200px, 0); - } -} - -/* line 152, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/buttons.scss */ -div#easy_gantt.easy .button.active { - line-height: 18px; - min-height: 18px; - background: #007aad; - border-color: #004461; - color: #ffffff; -} - -/* line 126, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/buttons.scss */ -div#easy_gantt.easy .button.active:hover { - color: #ffffff; - text-decoration: none; - background: #006894; -} - -/* line 131, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/buttons.scss */ -div#easy_gantt.easy .selected.button.active { - background: #006894; - color: rgba(255, 255, 255, 0.75); -} - -/* line 135, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/buttons.scss */ -.ui-widget-content div#easy_gantt.easy .button.active, div#easy_gantt.easy .ui-widget-content .button.active { - color: #ffffff; -} - -/* line 183, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/forms.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li a.submenu:after { - position: absolute; - right: 1px; - top: 1px; - bottom: 1px; - font-size: 1em; - line-height: 2.25; - margin: 0; - padding: 0; - display: block; - background: none; - border: none; - min-width: 20px; - text-align: center; -} - -/* line 197, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/forms.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li a.submenu:after { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; -} - -/* line 204, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/forms.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li a.submenu:after span { - display: none; -} - -/* line 124, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/pseudo.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li > .menu-children:before { - left: -5px; - right: auto; - top: 6px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-right: 5px solid #dfccaf; - border-left: none; -} - -/* line 130, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/pseudo.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li > .menu-children:after { - left: -4px; - right: auto; - top: 6px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-right: 5px solid #ffffff; - border-left: none; -} - -/* line 32, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/tooltips.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li > .menu-children, .easy .easy-gantt__menu-group--tooltiped ul { - position: absolute; - background-color: #ffffff; - border: 1px solid #dfccaf; - color: #42321a; - padding: 0.5em; - font-size: 11.57px; - line-height: 1; - margin-top: -0.25em; - white-space: pre; -} - -/* line 42, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/tooltips.scss */ -.easy .easy-gantt__menu-group--tooltiped ul a { - color: #42321a; - text-decoration: underline; -} - -/* line 46, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/tooltips.scss */ -.input-append .easy .easy-gantt__menu-group--tooltiped ul li > .menu-children, .easy .easy-gantt__menu-group--tooltiped ul .input-append li > .menu-children, .input-append .easy .easy-gantt__menu-group--tooltiped ul, .easy .easy-gantt__menu-group--tooltiped .input-append ul { - font-weight: normal; - margin-top: 1px; -} - -/* line 1, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/menus.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li { - padding: 0; - padding-left: 30px; - border: 1px solid transparent; - border-left: none; - border-right: none; - position: relative; - line-height: 1.25; -} - -/* line 10, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/menus.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li:hover { - border-color: #fcf1f0 !important; - background: #fcf1f0 !important; - z-index: 1; -} - -/* line 15, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/menus.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li a { - padding: 5px 10px; - padding-left: 40px; - margin-left: -30px; - display: block; - text-decoration: none; -} - -/* line 22, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/menus.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li a.active { - color: #e50026; - background: none; - border: none; -} - -/* line 26, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/menus.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li a.active:before { - color: #e50026; -} - -/* line 30, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/menus.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li a:before { - position: absolute; - left: 0; - width: 30px; - text-align: center; - padding-top: 1px; - color: #42321a; -} - -/* line 38, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/menus.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li a.submenu { - padding-right: 0 !important; - background: none !important; - position: relative; -} - -/* line 42, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/menus.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li a.submenu:after { - content: "\005d" !important; - left: auto; - font-size: 10px; - text-align: left; - line-height: 1.9; -} - -/* line 51, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/menus.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li a ~ span { - font-size: 0.89em; -} - -/* line 56, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/menus.scss */ -.easy .easy-gantt__menu-group--tooltiped ul { - z-index: 1000; - margin: 0; - list-style: none; - font-size: 1.125em; - min-width: 200px; - padding: 5px 0; - white-space: normal !important; -} - -/* line 66, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/menus.scss */ -.easy .easy-gantt__menu-group--tooltiped ul:after { - content: ''; - position: absolute; - top: 0; - bottom: 0; - right: auto; - left: 30px; - border-left: 1px solid #eee3d4; - z-index: 0; -} - -/* line 78, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/menus.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li > .menu-children { - display: none; - white-space: normal; - top: 6px; - left: 99%; - width: 150px; -} - -/* line 86, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/menus.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li > .menu-children > li + li { - border-top: 1px dashed #eee3d4; -} - -/* line 89, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/menus.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li > .menu-children > li a { - text-decoration: none; - display: block; - padding: 0.5em; -} - -/* line 93, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/menus.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li > .menu-children > li a:hover { - text-decoration: underline; -} - -/* line 96, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/menus.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li > .menu-children > li a:before { - color: #4ebf67; - text-decoration: none; - margin-right: 5px; -} - -/* line 105, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/menus.scss */ -.easy .easy-gantt__menu-group--tooltiped ul li:hover > .menu-children { - display: inline-block; -} - -/* line 111, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/menus.scss */ -.easy .easy-gantt__menu-group--tooltiped { - position: relative; -} - -/* line 17, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/material/material__elevation.scss */ -.gantt_task_scale, .gantt_grid_scale { - -webkit-box-shadow: material__elevation--shadow_bottom(1), material__elevation--shadow_top(1); - -moz-box-shadow: material__elevation--shadow_bottom(1), material__elevation--shadow_top(1); - box-shadow: material__elevation--shadow_bottom(1), material__elevation--shadow_top(1); -} - -/* line 20, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/material/material__elevation.scss */ -.easy-gantt__menu .gantt-menu-problems-list { - -webkit-box-shadow: material__elevation--shadow_bottom(2), material__elevation--shadow_top(2); - -moz-box-shadow: material__elevation--shadow_bottom(2), material__elevation--shadow_top(2); - box-shadow: material__elevation--shadow_bottom(2), material__elevation--shadow_top(2); -} - -/* line 26, plugins/easyproject/easy_plugins/easy_extensions/assets/../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/mixins/material/material__elevation.scss */ -.easy .easy-gantt__menu-group--tooltiped ul { - -webkit-box-shadow: material__elevation--shadow_bottom(4), material__elevation--shadow_top(4); - -moz-box-shadow: material__elevation--shadow_bottom(4), material__elevation--shadow_top(4); - box-shadow: material__elevation--shadow_bottom(4), material__elevation--shadow_top(4); -} - -/* line 10, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_icons.scss */ -.easy-gantt__icon:before { - font-family: "Material Icons", sans-serif; -} - -/* line 14, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_icons.scss */ -.easy-gantt__icon--open:before { - content: "\e147"; -} - -/* line 14, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_icons.scss */ -.easy-gantt__icon--close:before { - content: "\e15c"; -} - -/* line 25, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_icons.scss */ -.gantt_tree_icon { - margin-right: 7px; -} - -/* line 29, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_icons.scss */ -.gantt_tree_icon.gantt_folder_open { - background-image: none; -} - -/* line 31, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_icons.scss */ -.gantt_tree_icon.gantt_folder_open:before { - content: url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTdDRDM3QzVDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTdDRDM3QzZDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1N0NEMzdDM0MwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMzdDNEMwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIzlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCBlXd+2XjjLKg5GqoeZXqvsOQXK/ijUZTKVUFADs=); -} - -/* line 29, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_icons.scss */ -.gantt_tree_icon.gantt_folder_close { - background-image: none; -} - -/* line 31, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_icons.scss */ -.gantt_tree_icon.gantt_folder_close:before { - content: url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTAyMTU1RTNDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTAyMTU1RTRDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MDIxNTVFMUMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MDIxNTVFMkMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIwlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCuYIY6TYs+6bmHDO4igfdD3GNhheV0VQAADs=); -} - -/* line 38, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_icons.scss */ -.gantt_tree_icon.gantt_folder_open:before, .gantt_tree_icon.gantt_folder_close:before { - vertical-align: sub; -} - -/* line 43, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_icons.scss */ -.gantt_tree_icon.gantt_open, .gantt_tree_icon.gantt_close { - margin-right: 0; - margin-left: 7px; -} - -/* line 16, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .button-important { - color: #fff; -} - -/* line 20, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .gantt-menu-button { - display: inline-block; - border-radius: 2px; - border: 1px solid #e4e4e4; - padding: 8px 16px; -} - -/* line 27, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .gantt-menu-button.button-positive { - background-color: #4ebf67; - border-color: #338d47; - color: #ffffff; -} - -/* line 33, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .gantt-menu-button.active, .redmine #easy_gantt.redmine .gantt_button.active { - background-color: #628DB6; - border-color: #3E5B76; -} - -/* line 37, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .problem-finder { - border: none; - padding-right: 0; -} - -/* line 42, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .gantt-menu-button.icon, .redmine .gantt_button.icon { - padding: 8px 10px 8px 25px; - background-position-x: 5px; -} - -/* line 47, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .icon-calendar-week { - background-image: url("../../../../../images/magnifier.png"); -} - -/* line 47, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .icon-calendar-day { - background-image: url("../../../../../images/zoom_in.png"); -} - -/* line 47, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .icon-calendar-month { - background-image: url("../../../../../images/zoom_out.png"); -} - -/* line 47, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .icon-calendar { - background-image: url("../../../../../images/calendar.png"); -} - -/* line 47, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .icon-print { - background-image: url("../../../../../images/document.png"); -} - -/* line 47, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .icon-plugin { - background-image: url("../../../../../images/plugin.png"); -} - -/* line 47, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .icon-back { - background-image: url("../../../../../images/cancel.png"); -} - -/* line 47, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .icon-unlink { - background-image: url("../../../../../images/link-break.png"); -} - -/* line 47, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .icon-link { - background-image: url("../../../../../images/link.png"); -} - -/* line 47, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .icon-youtube { - background-image: url("../../../../../images/yt.png"); -} - -/* line 47, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .icon-settings { - background-image: url("../../../../../images/changeset.png"); -} - -/* line 47, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .icon-filter { - background-image: url("../../../../../images/task_parent_end.png"); -} - -/* line 51, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .icon-youtube { - padding-left: 28px; -} - -/* line 54, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .icon.icon-filter { - background-position-x: 9px; - background-position-y: 7px; -} - -/* line 58, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .easy-gantt__menu { - margin: 0 0 1px; - padding: 5px 0 5px 0; - background-color: white; -} - -/* line 63, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine #gantt_cont { - /* width: auto !important; */ - margin: 0; -} - -/* line 67, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .gantt_tree_icon { - width: 20px; -} - -/* line 69, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .gantt_tree_icon:before { - vertical-align: sub; -} - -/* line 74, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine a.active { - color: #fff; -} - -/* line 77, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine a.disabled { - opacity: 0.25; - color: #484848; - font-weight: lighter; -} - -/* line 82, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine #link_delay_input { - width: auto; -} - -/* line 85, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .push-left { - float: left; -} - -/* line 89, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .push-right { - float: right; - text-align: right; -} - -/* line 94, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .gantt-footer p { - text-align: center; -} - -/* line 97, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine #button_close_all_projects { - width: 18px; - height: 25px; - padding: 0; - vertical-align: bottom; - background-position: 0 50%; - background-repeat: no-repeat; -} - -/* line 106, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .overdue { - color: #e50026; -} - -/* line 109, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .contextual { - text-align: right; -} - -/* line 112, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .easy-gantt__menu-group--tooltiped { - position: relative; -} - -/* line 114, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .easy-gantt__menu-group--tooltiped ul { - position: absolute; - right: 0; - background-color: white; - border: 1px solid #cccccc; - padding: 5px; - padding-left: 0; - min-width: 180px; - display: none; -} - -/* line 123, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .easy-gantt__menu-group--tooltiped ul:after { - content: ''; - position: absolute; - top: 0; - bottom: 0; - right: auto; - left: 25px; - border-left: 1px solid #eee3d4; -} - -/* line 132, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .easy-gantt__menu-group--tooltiped ul li { - display: block; -} - -/* line 135, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .easy-gantt__menu-group--tooltiped ul .gantt-menu-button { - border: none; - padding: 5px 5px 5px 30px; - background-color: transparent; -} - -/* line 141, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ -.redmine .easy-gantt__menu-group--tooltiped:hover ul { - display: block; -} - -@media print { - /* line 146, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ - .redmine .gantt_task_progress { - border-right: 1px solid #4ebf67; - box-sizing: border-box; - margin-top: 1px; - margin-bottom: 1px; - height: calc(100% - 2px); - } - /* line 153, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ - .redmine .wrong .gantt_task_progress { - border-color: #e50026; - } - /* line 156, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ - .redmine .gantt_project-type .gantt_task_progress { - border-color: #009ee0; - } - /* line 159, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss */ - .redmine .odd { - background: none; - } -} - -/* line 16, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_print.scss */ -.gantt-print__header-logo { - vertical-align: middle; - display: inline-block; -} - -/* line 20, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_print.scss */ -.gantt-print__header-header { - display: inline-block; - margin: 0; -} - -/* line 24, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_print.scss */ -.gantt-print__header-text { - display: inline-block; - vertical-align: bottom; - margin-left: 20px; -} - -/* line 31, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_print.scss */ -.gantt-print__area { - background-color: white; -} - -/* line 35, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_print.scss */ -.gantt-print__strip { - border: 1px solid #cecece; - overflow: hidden; - white-space: nowrap; - /*page-break-before:always;*/ - /*page-break-inside: avoid;*/ - break-inside: avoid; - margin: 10px 0; - margin-left: -1px; - display: inline-block; - background-color: #ffffff; - border-left: 0; -} - -/* line 40, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_print.scss */ -.gantt-print__bg-canvas { - display: block; - /*page-break-before:avoid;*/ -} - -/* line 45, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_print.scss */ -.gantt-print__bg { - position: absolute; - /*page-break-before:avoid;*/ -} - -/* line 50, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_print.scss */ -.gantt-print__data-area { - /*page-break-before:avoid;*/ -} - -/* line 54, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_print.scss */ -.gantt-print__bars-area { - position: relative; - top: 0; -} - -/* line 59, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_print.scss */ -.gantt-print__scale { - transform: none; - border-top: 0; -} - -/* line 64, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_print.scss */ -.gantt-print__grid { - border: 1px solid #cecece; - overflow: hidden; - white-space: nowrap; - /*page-break-before:always;*/ - /*page-break-inside: avoid;*/ - break-inside: avoid; - margin: 10px 0; - margin-left: -1px; - display: inline-block; - background-color: #ffffff; - border-right: 2px solid #cecece; - margin-right: 1px; -} - -/* line 68, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_print.scss */ -.gantt-print__grid .gantt_grid_scale { - margin-top: -2px; -} - -/* line 71, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_print.scss */ -.gantt-print__grid .gantt-grid-header-collapse-buttons, -.gantt-print__grid .gantt_sort { - display: none; -} - -/* line 77, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_print.scss */ -.gantt-print__template--nowrap { - white-space: nowrap; -} - -/* line 5, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div#easy_gantt.easy #easy_gantt_menu { - padding-bottom: 7px; -} - -/* line 8, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div#easy_gantt.easy #easy_gantt_menu p { - margin-bottom: 0; -} - -/* line 12, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div#easy_gantt.easy #gantt_footer_buttons { - float: left; - margin-top: 10px; -} - -/* line 15, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div#easy_gantt.easy #gantt_footer_buttons + p { - float: right; - margin-top: 10px; -} - -/* line 25, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -#button_jump_today { - padding-right: 0; -} - -/* line 30, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.easy-gantt__menu { - user-select: none; - position: relative; - z-index: 1; - background-color: #fdfbf9; - padding: 20px; - margin: 0 -20px; -} - -/* line 42, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.easy-gantt__menu:after { - display: none; -} - -/* line 45, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.easy-gantt__menu-item { - display: inline-block; - text-align: left; -} - -/* line 48, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.easy-gantt__menu-item .active { - color: #e50026 !important; -} - -/* line 50, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.easy-gantt__menu-item .active:before { - color: #e50026; -} - -/* line 55, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.easy-gantt__menu-group { - display: inline-block; -} - -/* line 57, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.easy-gantt__menu-group ul { - margin: 0; -} - -/* line 62, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.easy .easy-gantt__menu-group--tooltiped > ul { - display: none; - right: 0; -} - -/* line 67, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.easy .easy-gantt__menu-group--tooltiped:hover > ul { - display: block; -} - -/* line 73, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.easy .easy-gantt__menu .problem-finder { - font-size: 0.89em; - color: #42321a; -} - -/* line 76, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.easy .easy-gantt__menu .problem-finder.active { - background: none; - border: none; - color: #42321a; -} - -/* line 81, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.easy .easy-gantt__menu .problem-finder:hover { - text-decoration: none; -} - -/* line 85, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.easy-gantt__menu .gantt-menu-problems-list { - border-width: 1px !important; -} - -/* line 89, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.easy-gantt__menu .gantt-menu-problems-count.gantt-with-problems { - font-weight: bold; - background: #e50026; - border: 1px solid #cc0022; - text-align: center; - width: 15px; - line-height: 15px; - display: inline-block; - color: white; - padding: 2.5px; - margin-right: 10px; -} - -/* line 106, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.gantt-menu-sub-panel { - width: 100%; -} - -/* line 108, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.gantt-menu-sub-panel > span { - display: none !important; -} - -/* line 113, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -#button_problem_finder.active { - color: #e50026 !important; - background: none !important; - border: none !important; -} - -/* line 119, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.gantt-menu-problems-reason { - color: #e50026 !important; -} - -/* line 123, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.gantt-grid-milestone-bullet { - margin-top: 4px !important; - margin-left: 5px; - background: #42321a !important; - border: none !important; -} - -/* line 128, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.gantt-milestone-shared .gantt-grid-milestone-bullet { - background: #d94838 !important; -} - -/* line 133, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.gantt_subtask_arrow:before { - content: '\21B3'; - opacity: .75; -} - -/* line 138, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.gantt_cell + .gantt_cell, .gantt_side_content { - color: #42321a !important; -} - -/* line 142, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.gantt_grid .gantt_grid_head_cell, .gantt_grid_scale, #gantt_grid, .gantt_scale_cel, .gantt_task_scale { - border-color: #eee3d4 !important; -} - -/* line 146, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.gantt_grid { - border-right-width: 1px !important; -} - -/* line 154, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.gantt_grid_data .gantt_row:hover, .gantt_grid_data .gantt_row.odd:hover { - background: rgba(229, 0, 38, 0.25); -} - -/* line 158, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.gantt_grid_data .gantt_row.closed { - background-color: rgba(223, 204, 175, 0.5); - border-color: #dfccaf; -} - -/* line 161, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.gantt_grid_data .gantt_row.closed .gantt_tree_content { - text-decoration: line-through; -} - -/* line 168, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.gantt_task_scale, .gantt_grid_scale { - z-index: 2 !important; - margin-top: -1px; -} - -/* line 174, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -#gantt_cont { - width: auto !important; - margin: 0 -21px; - background: #ffffff; -} - -/* line 182, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.easy .gantt_tree_indent { - width: 20px; -} - -/* line 185, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.easy .gantt_tree_icon { - width: 20px; - text-align: center; -} - -/* line 192, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div.gantt_task_progress { - position: relative; - z-index: 1 !important; -} - -/* line 199, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div.gantt_task_line.gantt_parent_task-subtype .gantt_task_progress, div.gantt_task_line.gantt_parent_task-subtype .gantt_task_content { - height: 100%; -} - -/* line 203, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div.gantt_task_line .gantt_task_content { - border-radius: 2px; - border: 1px solid; - box-sizing: border-box; -} - -/* line 208, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div.gantt_task_line .gantt_task_content, -div.gantt_task_line .gantt_task_ticks { - background-color: rgba(78, 191, 103, 0.1); - border-color: #4ebf67; -} - -/* line 213, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div.gantt_task_line .gantt_task_progress { - background-color: rgba(78, 191, 103, 0.5); -} - -/* line 217, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div.gantt_task_line.wrong .gantt_task_ticks, -div.gantt_task_line.wrong .gantt_task_content { - background-color: rgba(229, 0, 38, 0.1); - border-color: #e50026; -} - -/* line 222, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div.gantt_task_line.wrong .gantt_task_progress { - background-color: rgba(229, 0, 38, 0.5); -} - -/* line 227, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div.gantt_task_line.closed .gantt_task_ticks, -div.gantt_task_line.closed .gantt_task_content { - background-color: rgba(223, 204, 175, 0.25); - border-color: #dfccaf; -} - -/* line 232, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div.gantt_task_line.closed .gantt_task_progress { - background-color: rgba(223, 204, 175, 0.5); -} - -/* line 237, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div.gantt_task_line.gantt_project-type .gantt_task_content { - background-color: rgba(0, 158, 224, 0.25); - border-color: #009ee0; -} - -/* line 241, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div.gantt_task_line.gantt_project-type div.gantt_task_progress { - background-color: rgba(0, 158, 224, 0.5); -} - -/* line 245, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div.gantt_task_line.gantt_project-type.wrong .gantt_task_content { - background-color: rgba(172, 40, 85, 0.25); -} - -/* line 248, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div.gantt_task_line.gantt_project-type.wrong div.gantt_task_progress { - background-color: rgba(172, 40, 85, 0.5); -} - -/* line 254, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div.gantt_task_line.gantt_milestone-type .gantt_task_content { - -webkit-transform: scale(0.65) rotate(45deg); - -moz-transform: scale(0.65) rotate(45deg); - -ms-transform: scale(0.65) rotate(45deg); - -o-transform: scale(0.65) rotate(45deg); - transform: scale(0.65) rotate(45deg); - background-color: #42321a; - border-color: #42321a; -} - -/* line 260, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div.gantt_task_line.gantt_milestone-type.gantt-milestone-shared .gantt_task_content { - -webkit-transform: scale(0.65) rotate(45deg); - -moz-transform: scale(0.65) rotate(45deg); - -ms-transform: scale(0.65) rotate(45deg); - -o-transform: scale(0.65) rotate(45deg); - transform: scale(0.65) rotate(45deg); - background-color: #d94838; - border-color: #d94838; -} - -/* line 268, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div.gantt_task_line.critical .gantt_task_ticks, -div.gantt_task_line.critical .gantt_task_content { - background-color: rgba(200, 0, 255, 0.5); - border-color: #c800ff; -} - -/* line 273, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -div.gantt_task_line.critical .gantt_task_progress { - background-color: #c800ff; -} - -/* line 279, plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss */ -.gantt_hor_scroll { - z-index: 1; -} - -@font-face { - font-family: "Material Icons"; - src: local("Material Icons"), local("MaterialIcons-Regular"), url(../../../fonts/EasyMaterialIcons-Regular.eot); - src: local("Material Icons"), local("MaterialIcons-Regular"), url(../../../fonts/EasyMaterialIcons-Regular.eot?#iefix) format("embedded-opentype"), url(../../../fonts/EasyMaterialIcons-Regular.woff) format("woff"), url(../../../fonts/EasyMaterialIcons-Regular.woff2) format("woff2"), url(../../../fonts/EasyMaterialIcons-Regular.ttf) format("truetype"), url(../../../fonts/EasyMaterialIcons-Regular.svg) format("svg"); - font-weight: normal; - font-style: normal; } diff --git a/plugins/easy_gantt/assets/stylesheets/easy_gantt/jasmine.css b/plugins/easy_gantt/assets/stylesheets/easy_gantt/jasmine.css deleted file mode 100644 index 631998275d5c93b1affab90180e2d2514896a33f..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/stylesheets/easy_gantt/jasmine.css +++ /dev/null @@ -1,58 +0,0 @@ -body { overflow-y: scroll; } - -.jasmine_html-reporter { background-color: #eee; padding: 5px; margin: -8px; font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333; } -.jasmine_html-reporter a { text-decoration: none; } -.jasmine_html-reporter a:hover { text-decoration: underline; } -.jasmine_html-reporter p, .jasmine_html-reporter h1, .jasmine_html-reporter h2, .jasmine_html-reporter h3, .jasmine_html-reporter h4, .jasmine_html-reporter h5, .jasmine_html-reporter h6 { margin: 0; line-height: 14px; } -.jasmine_html-reporter .jasmine-banner, .jasmine_html-reporter .jasmine-symbol-summary, .jasmine_html-reporter .jasmine-summary, .jasmine_html-reporter .jasmine-result-message, .jasmine_html-reporter .jasmine-spec .jasmine-description, .jasmine_html-reporter .jasmine-spec-detail .jasmine-description, .jasmine_html-reporter .jasmine-alert .jasmine-bar, .jasmine_html-reporter .jasmine-stack-trace { padding-left: 9px; padding-right: 9px; } -.jasmine_html-reporter .jasmine-banner { position: relative; } -.jasmine_html-reporter .jasmine-banner .jasmine-title { background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAZCAMAAACGusnyAAACdlBMVEX/////AP+AgICqVaqAQICZM5mAVYCSSZKAQICOOY6ATYCLRouAQICJO4mSSYCIRIiPQICHPIeOR4CGQ4aMQICGPYaLRoCFQ4WKQICPPYWJRYCOQoSJQICNPoSIRICMQoSHQICHRICKQoOHQICKPoOJO4OJQYOMQICMQ4CIQYKLQICIPoKLQ4CKQICNPoKJQISMQ4KJQoSLQYKJQISLQ4KIQoSKQYKIQICIQISMQoSKQYKLQIOLQoOJQYGLQIOKQIOMQoGKQYOLQYGKQIOLQoGJQYOJQIOKQYGJQIOKQoGKQIGLQIKLQ4KKQoGLQYKJQIGKQYKJQIGKQIKJQoGKQYKLQIGKQYKLQIOJQoKKQoOJQYKKQIOJQoKKQoOKQIOLQoKKQYOLQYKJQIOKQoKKQYKKQoKJQYOKQYKLQIOKQoKLQYOKQYKLQIOJQoGKQYKJQYGJQoGKQYKLQoGLQYGKQoGJQYKKQYGJQIKKQoGJQYKLQIKKQYGLQYKKQYGKQYGKQYKJQYOKQoKJQYOKQYKLQYOLQYOKQYKLQYOKQoKKQYKKQYOKQYOJQYKKQYKLQYKKQIKKQoKKQYKKQYKKQoKJQIKKQYKLQYKKQYKKQIKKQYKKQYKKQYKKQIKKQYKJQYGLQYGKQYKKQYKKQYGKQIKKQYGKQYOJQoKKQYOLQYKKQYOKQoKKQYKKQoKKQYKKQYKJQYKLQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKJQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKLQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKmIDpEAAAA0XRSTlMAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAiIyQlJycoKissLS4wMTQ1Njc4OTo7PDw+P0BCQ0RISUpLTE1OUFNUVVdYWFlaW15fYGFiY2ZnaGlqa2xtb3BxcnN0dnh5ent8fX5/gIGChIWIioyNjo+QkZOUlZaYmZqbnJ2eoKGio6WmqKmsra6vsLGztre4ubq7vL2+wMHDxMjJysvNzs/Q0dLU1tfY2dvc3t/g4eLj5ebn6Onq6+zt7u/w8vP09fb3+Pn6+/z9/vkVQXAAAAMaSURBVHhe5dXxV1N1GMfxz2ABbDgIAm5VDJOyVDIJLUMaVpBWUZUaGbmqoGpZRSiGiRWp6KoZ5AB0ZY50RImZQIlahKkMYXv/R90dBvET/rJfOr3Ouc8v99zPec59zvf56j+vYKlViSf7250X4Mr3O29Tgq08BdGB4DhcekEJ5YkQKFsgWZdtj9JpV+I8xPjLFqkrsEIqO8PHSpis36jWazcqjEsfJjkvRssVU37SdIOu4XCf5vEJPsnwJpnRNU9JmxhMk8l1gehIrq7hTFjzOD+Vf88629qKMJVNltInFeRexRQyJlNeqd1iGDlSzrIUIyXbyFfm3RYprcQRe7lqtWyGYbfc6dT0R2vmdOOkX3u55C1rP37ftiH+tDby4r/RBT0w8TyEkr+epB9XgPDmSYYWbrhCuFYaIyw3fDQAXTnSkh+ANofiHmWf9l+FY1I90FdQTetstO00o23novzVsJ7uB3/C5TkbjRwZ5JerwV4iRWq9HFbFMaK/d0TYqayRiQPuIxxS3Bu8JWU90/60tKi7vkhaznez0a/TbVOKj5CaOZh6fWG6/Lyv9B/ZLR1gw/S/fpbeVD3MCW1li6SvWDOn65tr99/uvWtBS0XDm4s1t+sOHpG0kpBKx/l77wOSnxLpcx6TXmXLTPQOKYOf9Q1dfr8/SJ2mFdCvl1Yl93DiHUZvXeLJbGSzYu5gVJ2slbSakOR8dxCq5adQ2oFLqsE9Ex3L4qQO0eOPeU5x56bypXp4onSEb5OkICX6lDat55TeoztNKQcJaakrz9KCb95oD69IKq+yKW4XPjknaS52V0TZqE2cTtXjcHSCRmUO88e+85hj3EP74i9p8pylw7lxgMDyyl6OV7ZejnjNMfatu87LxRbH0IS35gt2a4ZjmGpVBdKK3Wr6INk8jWWSGqbA55CKgjBRC6E9w78ydTg3ABS3AFV1QN0Y4Aa2pgEjWnQURj9L0ayK6R2ysEqxHUKzYnLvvyU+i9KM2JHJzE4vyZOyDcOwOsySajeLPc8sNvPJkFlyJd20wpqAzZeAfZ3oWybxd+P/3j+SG3uSBdf2VQAAAABJRU5ErkJggg==') no-repeat; background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iNjgxLjk2MjUyIgogICBoZWlnaHQ9IjE4Ny41IgogICBpZD0ic3ZnMiIKICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhOCI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczYiPjxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoMTgiPjxwYXRoCiAgICAgICAgIGQ9Ik0gMCwxNTAwIDAsMCBsIDU0NTUuNzQsMCAwLDE1MDAgTCAwLDE1MDAgeiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgaWQ9InBhdGgyMCIgLz48L2NsaXBQYXRoPjwvZGVmcz48ZwogICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMjUsMCwwLC0xLjI1LDAsMTg3LjUpIgogICAgIGlkPSJnMTAiPjxnCiAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuMSwwLjEpIgogICAgICAgaWQ9ImcxMiI+PGcKICAgICAgICAgaWQ9ImcxNCI+PGcKICAgICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxOCkiCiAgICAgICAgICAgaWQ9ImcxNiI+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTU0NCw1OTkuNDM0IGMgMC45MiwtNDAuMzUyIDI1LjY4LC04MS42MDIgNzEuNTMsLTgxLjYwMiAyNy41MSwwIDQ3LjY4LDEyLjgzMiA2MS40NCwzNS43NTQgMTIuODMsMjIuOTMgMTIuODMsNTYuODUyIDEyLjgzLDgyLjUyNyBsIDAsMzI5LjE4NCAtNzEuNTIsMCAwLDEwNC41NDMgMjY2LjgzLDAgMCwtMTA0LjU0MyAtNzAuNiwwIDAsLTM0NC43NyBjIDAsLTU4LjY5MSAtMy42OCwtMTA0LjUzMSAtNDQuOTMsLTE1Mi4yMTggLTM2LjY4LC00Mi4xOCAtOTYuMjgsLTY2LjAyIC0xNTMuMTQsLTY2LjAyIC0xMTcuMzcsMCAtMjA3LjI0LDc3Ljk0MSAtMjAyLjY0LDE5Ny4xNDUgbCAxMzAuMiwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMjIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDIzMDEuNCw2NjIuNjk1IGMgMCw4MC43MDMgLTY2Ljk0LDE0NS44MTMgLTE0Ny42MywxNDUuODEzIC04My40NCwwIC0xNDcuNjMsLTY4Ljc4MSAtMTQ3LjYzLC0xNTEuMzAxIDAsLTc5Ljc4NSA2Ni45NCwtMTQ1LjgwMSAxNDUuOCwtMTQ1LjgwMSA4NC4zNSwwIDE0OS40Niw2Ny44NTIgMTQ5LjQ2LDE1MS4yODkgeiBtIC0xLjgzLC0xODEuNTQ3IGMgLTM1Ljc3LC01NC4wOTcgLTkzLjUzLC03OC44NTkgLTE1Ny43MiwtNzguODU5IC0xNDAuMywwIC0yNTEuMjQsMTE2LjQ0OSAtMjUxLjI0LDI1NC45MTggMCwxNDIuMTI5IDExMy43LDI2MC40MSAyNTYuNzQsMjYwLjQxIDYzLjI3LDAgMTE4LjI5LC0yOS4zMzYgMTUyLjIyLC04Mi41MjMgbCAwLDY5LjY4NyAxNzUuMTQsMCAwLC0xMDQuNTI3IC02MS40NCwwIDAsLTI4MC41OTggNjEuNDQsMCAwLC0xMDQuNTI3IC0xNzUuMTQsMCAwLDY2LjAxOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAyNjIyLjMzLDU1Ny4yNTggYyAzLjY3LC00NC4wMTYgMzMuMDEsLTczLjM0OCA3OC44NiwtNzMuMzQ4IDMzLjkzLDAgNjYuOTMsMjMuODI0IDY2LjkzLDYwLjUwNCAwLDQ4LjYwNiAtNDUuODQsNTYuODU2IC04My40NCw2Ni45NDEgLTg1LjI4LDIyLjAwNCAtMTc4LjgxLDQ4LjYwNiAtMTc4LjgxLDE1NS44NzkgMCw5My41MzYgNzguODYsMTQ3LjYzMyAxNjUuOTgsMTQ3LjYzMyA0NCwwIDgzLjQzLC05LjE3NiAxMTAuOTQsLTQ0LjAwOCBsIDAsMzMuOTIyIDgyLjUzLDAgMCwtMTMyLjk2NSAtMTA4LjIxLDAgYyAtMS44MywzNC44NTYgLTI4LjQyLDU3Ljc3NCAtNjMuMjYsNTcuNzc0IC0zMC4yNiwwIC02Mi4zNSwtMTcuNDIyIC02Mi4zNSwtNTEuMzQ4IDAsLTQ1Ljg0NyA0NC45MywtNTUuOTMgODAuNjksLTY0LjE4IDg4LjAyLC0yMC4xNzUgMTgyLjQ3LC00Ny42OTUgMTgyLjQ3LC0xNTcuNzM0IDAsLTk5LjAyNyAtODMuNDQsLTE1NC4wMzkgLTE3NS4xMywtMTU0LjAzOSAtNDkuNTMsMCAtOTQuNDYsMTUuNTgyIC0xMjYuNTUsNTMuMTggbCAwLC00MC4zNCAtODUuMjcsMCAwLDE0Mi4xMjkgMTE0LjYyLDAiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGgyNiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjk4OC4xOCw4MDAuMjU0IC02My4yNiwwIDAsMTA0LjUyNyAxNjUuMDUsMCAwLC03My4zNTUgYyAzMS4xOCw1MS4zNDcgNzguODYsODUuMjc3IDE0MS4yMSw4NS4yNzcgNjcuODUsMCAxMjQuNzEsLTQxLjI1OCAxNTIuMjEsLTEwMi42OTkgMjYuNiw2Mi4zNTEgOTIuNjIsMTAyLjY5OSAxNjAuNDcsMTAyLjY5OSA1My4xOSwwIDEwNS40NiwtMjIgMTQxLjIxLC02Mi4zNTEgMzguNTIsLTQ0LjkzOCAzOC41MiwtOTMuNTMyIDM4LjUyLC0xNDkuNDU3IGwgMCwtMTg1LjIzOSA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40MiwwIDAsMTA0LjUyNyA2My4yOCwwIDAsMTU3LjcxNSBjIDAsMzIuMTAyIDAsNjAuNTI3IC0xNC42Nyw4OC45NTcgLTE4LjM0LDI2LjU4MiAtNDguNjEsNDAuMzQ0IC03OS43Nyw0MC4zNDQgLTMwLjI2LDAgLTYzLjI4LC0xMi44NDQgLTgyLjUzLC0zNi42NzIgLTIyLjkzLC0yOS4zNTUgLTIyLjkzLC01Ni44NjMgLTIyLjkzLC05Mi42MjkgbCAwLC0xNTcuNzE1IDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM4LjQxLDAgMCwxMDQuNTI3IDYzLjI4LDAgMCwxNTAuMzgzIGMgMCwyOS4zNDggMCw2Ni4wMjMgLTE0LjY3LDkxLjY5OSAtMTUuNTksMjkuMzM2IC00Ny42OSw0NC45MzQgLTgwLjcsNDQuOTM0IC0zMS4xOCwwIC01Ny43NywtMTEuMDA4IC03Ny45NCwtMzUuNzc0IC0yNC43NywtMzAuMjUzIC0yNi42LC02Mi4zNDMgLTI2LjYsLTk5Ljk0MSBsIDAsLTE1MS4zMDEgNjMuMjcsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNiwwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAzOTk4LjY2LDk1MS41NDcgLTExMS44NywwIDAsMTE4LjI5MyAxMTEuODcsMCAwLC0xMTguMjkzIHogbSAwLC00MzEuODkxIDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM5LjMzLDAgMCwxMDQuNTI3IDY0LjE5LDAgMCwyODAuNTk4IC02My4yNywwIDAsMTA0LjUyNyAxNzUuMTQsMCAwLC0zODUuMTI1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDQxNTkuMTIsODAwLjI1NCAtNjMuMjcsMCAwLDEwNC41MjcgMTc1LjE0LDAgMCwtNjkuNjg3IGMgMjkuMzUsNTQuMTAxIDg0LjM2LDgwLjY5OSAxNDQuODcsODAuNjk5IDUzLjE5LDAgMTA1LjQ1LC0yMi4wMTYgMTQxLjIyLC02MC41MjcgNDAuMzQsLTQ0LjkzNCA0MS4yNiwtODguMDMyIDQxLjI2LC0xNDMuOTU3IGwgMCwtMTkxLjY1MyA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40LDAgMCwxMDQuNTI3IDYzLjI2LDAgMCwxNTguNjM3IGMgMCwzMC4yNjIgMCw2MS40MzQgLTE5LjI2LDg4LjAzNSAtMjAuMTcsMjYuNTgyIC01My4xOCwzOS40MTQgLTg2LjE5LDM5LjQxNCAtMzMuOTMsMCAtNjguNzcsLTEzLjc1IC04OC45NCwtNDEuMjUgLTIxLjA5LC0yNy41IC0yMS4wOSwtNjkuNjg3IC0yMS4wOSwtMTAyLjcwNyBsIDAsLTE0Mi4xMjkgNjMuMjYsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNywwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDMyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA1MDgyLjQ4LDcwMy45NjUgYyAtMTkuMjQsNzAuNjA1IC04MS42LDExNS41NDcgLTE1NC4wNCwxMTUuNTQ3IC02Ni4wNCwwIC0xMjkuMywtNTEuMzQ4IC0xNDMuMDUsLTExNS41NDcgbCAyOTcuMDksMCB6IG0gODUuMjcsLTE0NC44ODMgYyAtMzguNTEsLTkzLjUyMyAtMTI5LjI3LC0xNTYuNzkzIC0yMzEuMDUsLTE1Ni43OTMgLTE0My4wNywwIC0yNTcuNjgsMTExLjg3MSAtMjU3LjY4LDI1NS44MzYgMCwxNDQuODgzIDEwOS4xMiwyNjEuMzI4IDI1NC45MSwyNjEuMzI4IDY3Ljg3LDAgMTM1LjcyLC0zMC4yNTggMTgzLjM5LC03OC44NjMgNDguNjIsLTUxLjM0NCA2OC43OSwtMTEzLjY5NSA2OC43OSwtMTgzLjM4MyBsIC0zLjY3LC0zOS40MzQgLTM5Ni4xMywwIGMgMTQuNjcsLTY3Ljg2MyA3Ny4wMywtMTE3LjM2MyAxNDYuNzIsLTExNy4zNjMgNDguNTksMCA5MC43NiwxOC4zMjggMTE4LjI4LDU4LjY3MiBsIDExNi40NCwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDY5MC44OTUsODUwLjcwMyA5MC43NSwwIDIyLjU0MywzMS4wMzUgMCwyNDMuMTIyIC0xMzUuODI5LDAgMCwtMjQzLjE0MSAyMi41MzYsLTMxLjAxNiIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDM2IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA2MzIuMzk1LDc0Mi4yNTggMjguMDM5LDg2LjMwNCAtMjIuNTUxLDMxLjA0IC0yMzEuMjIzLDc1LjEyOCAtNDEuOTc2LC0xMjkuMTgzIDIzMS4yNTcsLTc1LjEzNyAzNi40NTQsMTEuODQ4IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDcxNy40NDksNjUzLjEwNSAtNzMuNDEsNTMuMzYgLTM2LjQ4OCwtMTEuODc1IC0xNDIuOTAzLC0xOTYuNjkyIDEwOS44ODMsLTc5LjgyOCAxNDIuOTE4LDE5Ni43MDMgMCwzOC4zMzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0MCIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gODI4LjUyLDcwNi40NjUgLTczLjQyNiwtNTMuMzQgMC4wMTEsLTM4LjM1OSBMIDg5OC4wMDQsNDE4LjA3IDEwMDcuOSw0OTcuODk4IDg2NC45NzMsNjk0LjYwOSA4MjguNTIsNzA2LjQ2NSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA4MTIuMDg2LDgyOC41ODYgMjguMDU1LC04Ni4zMiAzNi40ODQsLTExLjgzNiAyMzEuMjI1LDc1LjExNyAtNDEuOTcsMTI5LjE4MyAtMjMxLjIzOSwtNzUuMTQgLTIyLjU1NSwtMzEuMDA0IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNDQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDczNi4zMDEsMTMzNS44OCBjIC0zMjMuMDQ3LDAgLTU4NS44NzUsLTI2Mi43OCAtNTg1Ljg3NSwtNTg1Ljc4MiAwLC0zMjMuMTE4IDI2Mi44MjgsLTU4NS45NzcgNTg1Ljg3NSwtNTg1Ljk3NyAzMjMuMDE5LDAgNTg1LjgwOSwyNjIuODU5IDU4NS44MDksNTg1Ljk3NyAwLDMyMy4wMDIgLTI2Mi43OSw1ODUuNzgyIC01ODUuODA5LDU4NS43ODIgbCAwLDAgeiBtIDAsLTExOC42MSBjIDI1Ny45NzIsMCA0NjcuMTg5LC0yMDkuMTMgNDY3LjE4OSwtNDY3LjE3MiAwLC0yNTguMTI5IC0yMDkuMjE3LC00NjcuMzQ4IC00NjcuMTg5LC00NjcuMzQ4IC0yNTguMDc0LDAgLTQ2Ny4yNTQsMjA5LjIxOSAtNDY3LjI1NCw0NjcuMzQ4IDAsMjU4LjA0MiAyMDkuMTgsNDY3LjE3MiA0NjcuMjU0LDQ2Ny4xNzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0NiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTA5MS4xMyw2MTkuODgzIC0xNzUuNzcxLDU3LjEyMSAxMS42MjksMzUuODA4IDE3NS43NjIsLTU3LjEyMSAtMTEuNjIsLTM1LjgwOCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQ4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA4NjYuOTU3LDkwMi4wNzQgODM2LjUsOTI0LjE5OSA5NDUuMTIxLDEwNzMuNzMgOTc1LjU4NiwxMDUxLjYxIDg2Ni45NTcsOTAyLjA3NCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDUwIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA2MDcuNDY1LDkwMy40NDUgNDk4Ljg1NSwxMDUyLjk3IDUyOS4zMiwxMDc1LjEgNjM3LjkzLDkyNS41NjYgNjA3LjQ2NSw5MDMuNDQ1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDM4MC42ODgsNjIyLjEyOSAtMTEuNjI2LDM1LjgwMSAxNzUuNzU4LDU3LjA5IDExLjYyMSwtMzUuODAxIC0xNzUuNzUzLC01Ny4wOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDU0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA3MTYuMjg5LDM3Ni41OSAzNy42NDA2LDAgMCwxODQuODE2IC0zNy42NDA2LDAgMCwtMTg0LjgxNiB6IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4=') no-repeat, none; -moz-background-size: 100%; -o-background-size: 100%; -webkit-background-size: 100%; background-size: 100%; display: block; float: left; width: 90px; height: 25px; } -.jasmine_html-reporter .jasmine-banner .jasmine-version { margin-left: 14px; position: relative; top: 6px; } -.jasmine_html-reporter #jasmine_content { position: fixed; right: 100%; } -.jasmine_html-reporter .jasmine-version { color: #aaa; } -.jasmine_html-reporter .jasmine-banner { margin-top: 14px; } -.jasmine_html-reporter .jasmine-duration { color: #fff; float: right; line-height: 28px; padding-right: 9px; } -.jasmine_html-reporter .jasmine-symbol-summary { overflow: hidden; *zoom: 1; margin: 14px 0; } -.jasmine_html-reporter .jasmine-symbol-summary li { display: inline-block; height: 10px; width: 14px; font-size: 16px; } -.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-passed { font-size: 14px; } -.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-passed:before { color: #007069; content: "\02022"; } -.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-failed { line-height: 9px; } -.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-failed:before { color: #ca3a11; content: "\d7"; font-weight: bold; margin-left: -1px; } -.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-disabled { font-size: 14px; } -.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-disabled:before { color: #bababa; content: "\02022"; } -.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-pending { line-height: 17px; } -.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-pending:before { color: #ba9d37; content: "*"; } -.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-empty { font-size: 14px; } -.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-empty:before { color: #ba9d37; content: "\02022"; } -.jasmine_html-reporter .jasmine-run-options { float: right; margin-right: 5px; border: 1px solid #8a4182; color: #8a4182; position: relative; line-height: 20px; } -.jasmine_html-reporter .jasmine-run-options .jasmine-trigger { cursor: pointer; padding: 8px 16px; } -.jasmine_html-reporter .jasmine-run-options .jasmine-payload { position: absolute; display: none; right: -1px; border: 1px solid #8a4182; background-color: #eee; white-space: nowrap; padding: 4px 8px; } -.jasmine_html-reporter .jasmine-run-options .jasmine-payload.jasmine-open { display: block; } -.jasmine_html-reporter .jasmine-bar { line-height: 28px; font-size: 14px; display: block; color: #eee; } -.jasmine_html-reporter .jasmine-bar.jasmine-failed { background-color: #ca3a11; } -.jasmine_html-reporter .jasmine-bar.jasmine-passed { background-color: #007069; } -.jasmine_html-reporter .jasmine-bar.jasmine-skipped { background-color: #bababa; } -.jasmine_html-reporter .jasmine-bar.jasmine-errored { background-color: #ca3a11; } -.jasmine_html-reporter .jasmine-bar.jasmine-menu { background-color: #fff; color: #aaa; } -.jasmine_html-reporter .jasmine-bar.jasmine-menu a { color: #333; } -.jasmine_html-reporter .jasmine-bar a { color: white; } -.jasmine_html-reporter.jasmine-spec-list .jasmine-bar.jasmine-menu.jasmine-failure-list, .jasmine_html-reporter.jasmine-spec-list .jasmine-results .jasmine-failures { display: none; } -.jasmine_html-reporter.jasmine-failure-list .jasmine-bar.jasmine-menu.jasmine-spec-list, .jasmine_html-reporter.jasmine-failure-list .jasmine-summary { display: none; } -.jasmine_html-reporter .jasmine-results { margin-top: 14px; } -.jasmine_html-reporter .jasmine-summary { margin-top: 14px; } -.jasmine_html-reporter .jasmine-summary ul { list-style-type: none; margin-left: 14px; padding-top: 0; padding-left: 0; } -.jasmine_html-reporter .jasmine-summary ul.jasmine-suite { margin-top: 7px; margin-bottom: 7px; } -.jasmine_html-reporter .jasmine-summary li.jasmine-passed a { color: #007069; } -.jasmine_html-reporter .jasmine-summary li.jasmine-failed a { color: #ca3a11; } -.jasmine_html-reporter .jasmine-summary li.jasmine-empty a { color: #ba9d37; } -.jasmine_html-reporter .jasmine-summary li.jasmine-pending a { color: #ba9d37; } -.jasmine_html-reporter .jasmine-summary li.jasmine-disabled a { color: #bababa; } -.jasmine_html-reporter .jasmine-description + .jasmine-suite { margin-top: 0; } -.jasmine_html-reporter .jasmine-suite { margin-top: 14px; } -.jasmine_html-reporter .jasmine-suite a { color: #333; } -.jasmine_html-reporter .jasmine-failures .jasmine-spec-detail { margin-bottom: 28px; } -.jasmine_html-reporter .jasmine-failures .jasmine-spec-detail .jasmine-description { background-color: #ca3a11; } -.jasmine_html-reporter .jasmine-failures .jasmine-spec-detail .jasmine-description a { color: white; } -.jasmine_html-reporter .jasmine-result-message { padding-top: 14px; color: #333; white-space: pre; } -.jasmine_html-reporter .jasmine-result-message span.jasmine-result { display: block; } -.jasmine_html-reporter .jasmine-stack-trace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666; border: 1px solid #ddd; background: white; white-space: pre; } diff --git a/plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_icons.scss b/plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_icons.scss deleted file mode 100644 index 79dc1511215b7ee8219e8dad10fa947ba4ca326a..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_icons.scss +++ /dev/null @@ -1,47 +0,0 @@ -//@include loadFontFace('EasyIcons','easy_icons-webfont','fontLocal','fontLocalAlt',normal,normal); -$gantt-icons: ( - open: \e147, - close: \e15c, -); - -.easy-gantt { - &__icon { - @include icon-parent; - &:before { - font-family: "Material Icons", sans-serif; - } - @each $icon, $sign in $gantt-icons { - &--#{$icon}:before { - content: unicode($sign); - } - } - } -} - -$tree_icons: ( - folder_open:url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTdDRDM3QzVDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTdDRDM3QzZDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1N0NEMzdDM0MwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMzdDNEMwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIzlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCBlXd+2XjjLKg5GqoeZXqvsOQXK/ijUZTKVUFADs=), - folder_close:url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTAyMTU1RTNDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTAyMTU1RTRDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MDIxNTVFMUMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MDIxNTVFMkMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIwlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCuYIY6TYs+6bmHDO4igfdD3GNhheV0VQAADs=) -); -.gantt_tree_icon{ - margin-right: 7px; - //margin-right: 10px; - @each $type, $url in $tree_icons{ - &.gantt_#{$type}{ - background-image: none; - &:before{ - content: $url; - } - } - } - &.gantt_folder{ - &_open,&_close{ - &:before{ - vertical-align: sub; - } - } - } - &.gantt_open,&.gantt_close{ - margin-right: 0; - margin-left: 7px; - } -} \ No newline at end of file diff --git a/plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss b/plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss deleted file mode 100644 index ec43632acd7b01385f2c6e194d2f44752f9807ba..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_main.scss +++ /dev/null @@ -1,281 +0,0 @@ -div#easy_gantt.easy{ - a{ - - } - #easy_gantt_menu{ - //overflow: hidden; - padding-bottom: $gap - 3; - p{ - margin-bottom: 0; - } - } - #gantt_footer_buttons{ - float: left; - margin-top: $gap; - & + p{ - float: right; - margin-top: $gap; - } - } - .button.active{ - @extend %button-main !optional; - } -} - -#button_jump_today{ - padding-right: 0; -} - -.easy-gantt{ - &__menu{ - @extend %box-sizing-border-box !optional; - //@extend %material__elevation--inline !optional; - @extend %flex !optional; - @extend %flex-wrap-wrap !optional; - @extend %justify-content-space-between !optional; - user-select: none; - position: relative; - z-index: 1; - background-color: $gantt-background-menu; - padding: $box-padding; - margin: 0 (-$box-padding); - &:after{ - display: none; - } - &-item{ - display: inline-block; - text-align: left; - .active{ - color: $color-negative !important; - &:before{ - color: $color-negative; - } - } - } - &-group{ - display: inline-block; - ul{ - margin: 0; - } - .easy &--tooltiped{ - @extend %menu-tooltip !optional; - & > ul{ - display: none; - right: 0; - } - &:hover{ - & > ul{ - display: block; - } - } - } - } - .easy & .problem-finder{ - @include small; - color: $color-text; - &.active{ - background: none; - border: none; - color: $color-text; - } - &:hover{ - text-decoration: none; - } - } - .gantt-menu-problems-list{ - @extend %material__elevation--depth_2 !optional; - border-width: 1px !important; - } - .gantt-menu-problems-count.gantt-with-problems{ - @extend %border-radius-infinite !optional; - font-weight: bold; - background: $color-negative; - border: 1px solid darken($color-negative, 5%); - text-align: center; - width: 1.5*$gap; - line-height: 1.5*$gap; - display: inline-block; - color: white; - padding: .25*$gap; - margin-right: $gap; - - } - } -} - -.gantt-menu-sub-panel{ - width: 100%; - & > span{ - display: none !important; - } -} - -#button_problem_finder.active{ - color: $color-negative !important; - background: none !important; - border: none !important; -} - -.gantt-menu-problems-reason{ - color: $color-negative !important; -} - -.gantt-grid-milestone-bullet{ - margin-top: 4px !important; - margin-left: 5px; - background: $color-text !important; - border: none !important; - .gantt-milestone-shared &{ - background: $color-important !important; - } -} - -.gantt_subtask_arrow:before{ - content: '\21B3'; - opacity: .75; -} - -.gantt_cell + .gantt_cell, .gantt_side_content{ - color: $color-text !important; -} - -.gantt_grid .gantt_grid_head_cell, .gantt_grid_scale, #gantt_grid, .gantt_scale_cel, .gantt_task_scale{ - border-color: $color-border-minor !important; -} - -.gantt_grid{ - //@extend %material__elevation--depth_2 !optional; - border-right-width: 1px !important; -} - -.gantt{ - &_grid_data &_row{ - &, &.odd{ - &:hover{ - background: rgba($color-negative, .25); - } - } - &.closed{ - background-color: rgba($color-service-text, .5); - border-color: rgba($color-service-text, 1); - .gantt_tree_content{ - text-decoration: line-through; - } - } - } -} - -.gantt_task_scale, .gantt_grid_scale{ - @extend %material__elevation--depth_1 !optional; - z-index: 2 !important; - margin-top: -1px; -} - -#gantt_cont{ - width: auto !important; - margin: 0 (-$box-padding - 1); - background: $color-foreground; -} - -.easy{ - & .gantt_tree{ - &_indent{ - width: $box-padding; - } - &_icon{ - width: $box-padding; - text-align: center; - } - } -} - -div.gantt_task_progress{ - position: relative; - z-index: 1 !important; -} - -div.gantt_task_line{ - &.gantt_parent_task-subtype{ - .gantt_task_progress, .gantt_task_content{ - height: 100%; - } - } - .gantt_task_content{ - border-radius: 2px; - border: 1px solid; - box-sizing: border-box; - } - .gantt_task_content, - .gantt_task_ticks{ - background-color: rgba($color-positive, .1); - border-color: rgba($color-positive, 1); - } - .gantt_task_progress{ - background-color: rgba($color-positive, .5); - } - &.wrong{ - .gantt_task_ticks, - .gantt_task_content{ - background-color: rgba($color-negative, .1); - border-color: rgba($color-negative, 1); - } - .gantt_task_progress{ - background-color: rgba($color-negative, .5); - } - } - &.closed{ - .gantt_task_ticks, - .gantt_task_content{ - background-color: rgba($color-service-text, .25); - border-color: rgba($color-service-text, 1); - } - .gantt_task_progress{ - background-color: rgba($color-service-text, .5); - } - } - &.gantt_project-type{ - .gantt_task_content{ - background-color: rgba($color-main, .25); - border-color: rgba($color-main, 1); - } - div.gantt_task_progress{ - background-color: rgba($color-main, .5); - } - &.wrong{ - .gantt_task_content{ - background-color: rgba(mix($color-negative, $color-main, 75%), .25); - } - div.gantt_task_progress{ - background-color: rgba(mix($color-negative, $color-main, 75%), .5); - } - } - } - &.gantt_milestone-type{ - .gantt_task_content{ - @include transform(#{scale(.65) rotate(45deg)}); - background-color: rgba($color-text, 1); - border-color: rgba($color-text, 1); - } - &.gantt-milestone-shared{ - .gantt_task_content{ - @include transform(#{scale(.65) rotate(45deg)}); - background-color: rgba($color-important, 1); - border-color: rgba($color-important, 1); - } - } - } - &.critical{ - .gantt_task_ticks, - .gantt_task_content{ - background-color: rgba($gantt-color-critical, .5); - border-color: rgba($gantt-color-critical, 1); - } - .gantt_task_progress{ - background-color: rgba($gantt-color-critical, 1); - } - } -} - -.gantt_hor_scroll{ - z-index: 1; -} diff --git a/plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_print.scss b/plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_print.scss deleted file mode 100644 index 04ce749f018b89bd39acdcb9e247d9a91d269d6a..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_print.scss +++ /dev/null @@ -1,81 +0,0 @@ -@mixin print-strip{ - border: 1px solid #cecece; - overflow: hidden; - white-space: nowrap; - /*page-break-before:always;*/ - /*page-break-inside: avoid;*/ - break-inside: avoid; - margin: 10px 0; - margin-left: -1px; - display: inline-block; - background-color: #ffffff; -} - -.gantt-print{ - &__header{ - &-logo{ - vertical-align: middle; - display: inline-block; - } - &-header{ - display: inline-block; - margin: 0; - } - &-text{ - display: inline-block; - vertical-align: bottom; - margin-left: 20px; - } - } - - &__area{ - background-color: white; - } - - &__strip{ - @include print-strip; - border-left: 0; - } - - &__bg-canvas{ - display: block; - /*page-break-before:avoid;*/ - } - - &__bg{ - position: absolute; - /*page-break-before:avoid;*/ - } - - &__data-area{ - /*page-break-before:avoid;*/ - } - - &__bars-area{ - position: relative; - top: 0; - } - - &__scale{ - transform: none; - border-top: 0; - } - - &__grid{ - @include print-strip; - border-right: 2px solid #cecece; - margin-right: 1px; - .gantt_grid_scale{ - margin-top: -2px; - } - .gantt-grid-header-collapse-buttons, - .gantt_sort{ - display: none; - } - } - - &__template--nowrap{ - white-space: nowrap; - } - -} \ No newline at end of file diff --git a/plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss b/plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss deleted file mode 100644 index c7209e062ca47cd53aa173ad4b6b524b0514730b..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_redmine.scss +++ /dev/null @@ -1,164 +0,0 @@ -$redmine_icons: ( - calendar-week:magnifier, - calendar-day:zoom_in, - calendar-month:zoom_out, - calendar:calendar, - print:document, - plugin:plugin, - back:cancel, - unlink:link-break, - link:link, - youtube:yt, - settings:changeset, - filter:task_parent_end -); -.redmine{ - .button-important{ - color: #fff; - } - - .gantt-menu-button{ - display: inline-block; - border-radius: 2px; - border: 1px solid #e4e4e4; - padding: 8px 16px; - } - - .gantt-menu-button.button-positive{ - background-color: #4ebf67; - border-color: rgb(51, 141, 71); - color: #ffffff; - } - - .gantt-menu-button.active, #easy_gantt.redmine .gantt_button.active{ - background-color: #628DB6; - border-color: #3E5B76; - } - .problem-finder{ - border: none; - padding-right: 0; - } - - .gantt-menu-button.icon, .gantt_button.icon{ - padding: 8px 10px 8px 25px; - background-position-x: 5px; - } - @each $icon, $image in $redmine_icons{ - .icon-#{$icon}{ - background-image: url('../../../../../images/#{$image}.png'); - } - } - .icon-youtube{ - padding-left: 28px; - } - .icon.icon-filter{ - background-position-x: 9px; - background-position-y: 7px; - } - .easy-gantt__menu{ - margin: 0 0 1px; - padding: 5px 0 5px 0; - background-color: white; - } - #gantt_cont{ - /* width: auto !important; */ - margin: 0; - } - .gantt_tree_icon{ - width: 20px; - &:before{ - vertical-align: sub; - } - } - - a.active{ - color: #fff; - } - a.disabled{ - opacity: 0.25; - color: #484848; - font-weight: lighter; - } - #link_delay_input{ - width: auto; - } - .push-left{ - float: left; - } - - .push-right{ - float: right; - text-align: right - } - - .gantt-footer p{ - text-align: center; - } - #button_close_all_projects{ - width: 18px; - height: 25px; - padding: 0; - vertical-align: bottom; - background-position: 0 50%; - background-repeat: no-repeat; - } - - .overdue{ - color: #e50026; - } - .contextual{ - text-align: right; - } - .easy-gantt__menu-group--tooltiped{ - position: relative; - ul{ - position: absolute; - right: 0; - background-color: white; - border: 1px solid #cccccc; - padding: 5px; - padding-left: 0; - min-width: 180px; - display: none; - &:after{ - content: ''; - position: absolute; - top: 0; - bottom: 0; - right: auto; - left: 25px; - border-left: 1px solid #eee3d4; - } - li{ - display: block; - } - .gantt-menu-button{ - border: none; - padding: 5px 5px 5px 30px; - background-color: transparent; - } - } - &:hover ul{ - display: block; - } - } - @media print { - .gantt_task_progress{ - border-right: 1px solid #4ebf67; - box-sizing: border-box; - margin-top: 1px; - margin-bottom: 1px; - height: calc(100% - 2px); - } - .wrong .gantt_task_progress{ - border-color: #e50026;; - } - .gantt_project-type .gantt_task_progress{ - border-color: #009ee0; - } - .odd{ - background: none; - } - } - -} \ No newline at end of file diff --git a/plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_variables.scss b/plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_variables.scss deleted file mode 100644 index 62c8ed25cea61c8d10b167f56fb609a57a0f941b..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/_gantt_variables.scss +++ /dev/null @@ -1,3 +0,0 @@ -$gantt-background-menu: white !default; -$gantt-color-critical: #c800ff !default; -$gap: 5px !default; \ No newline at end of file diff --git a/plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/easy_gantt_sass.scss.erb b/plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/easy_gantt_sass.scss.erb deleted file mode 100644 index fe22462239bf56014987ee8c91a07ce0151ac705..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/assets/stylesheets/easy_gantt/sass/easy_gantt_sass.scss.erb +++ /dev/null @@ -1,17 +0,0 @@ -<% if Redmine::Plugin.installed?(:easy_project_com) %> -@import "../../../../easyproject/easy_plugins/easy_project_com/assets/stylesheets/scss/common_assets"; -<% else %> -@import "../../../../easyproject/easy_plugins/easy_extensions/assets/stylesheets/scss/common_assets"; -<% end %> - -@import "gantt_variables"; -@import "gantt_icons"; -@import "gantt_redmine"; -@import "gantt_print"; -@import "gantt_main"; - -<% if Redmine::Plugin.installed?(:easy_project_com) %> -@include loadFontFace('Material Icons', '../../plugin_assets/easy_gantt/fonts/EasyMaterialIcons-Regular', 'Material Icons', 'MaterialIcons-Regular', normal, normal); -<% else %> -@include loadFontFace--non-rails('Material Icons', '../../plugin_assets/easy_gantt/fonts/EasyMaterialIcons-Regular', 'Material Icons', 'MaterialIcons-Regular', normal, normal); -<% end %> \ No newline at end of file diff --git a/plugins/easy_gantt/config/locales/ar.yml b/plugins/easy_gantt/config/locales/ar.yml deleted file mode 100644 index b93c21a986b87d70b2dfbb219cc684c7721d9891..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/ar.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -ar: diff --git a/plugins/easy_gantt/config/locales/cs.yml b/plugins/easy_gantt/config/locales/cs.yml deleted file mode 100644 index 6999323ef6b440fe4c4bf49b853f0052953b198e..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/cs.yml +++ /dev/null @@ -1,184 +0,0 @@ ---- -cs: - button_print: Tisk - button_project_menu_easy_gantt: Easy Gantt - button_top_menu_easy_gantt: Globální Gantt - button_use_actual_delay: Použít skutečné zpoždění - easy_gantt_toolbar: - day: Dny - month: Měsíce - week: Týdny - easy_gantt: - button: - close_all: Zavřít vše - close_all_parent_issues: Zavřít všechny rodičovské úkoly - create_baseline: Baseline - critical_path: Kritická cesta - day_zoom: Dny - delayed_project_filter: Filtrovat zpožděné projekty - jump_today: Přejít na dnešek - load_sample_data: Nahrát zkušební data - month_zoom: Měsíce - moth_zoom: Měsíce - print_fit: Přizpůsobit stránce - problem_finder: Problémy - reload: Znovu načíst (uložit) - remove_delay: Odstranit zpoždění - resource_management: Vytížení zdrojů - tool_panel: Nástroje - week_zoom: Týdny - critical_path: - disabled: Vypnuto - last: Poslední - last_text: Úkoly, které by se neměly odkládat - longest: Nejdelší - longest_text: Zobrazit nejdelší sled úkolů - errors: - duplicate_link: Není možné vytvořit zdvojenou vazbu - fresh_milestone: Není možné přidat úkol na neuložený milník. Nejprve uložte - mílník. - link_target_new: Nelze vytvořit vazbu na neuložený úkol. Nejprve uložte změny. - link_target_readonly: Cílový úkol pouze pro čtení - loop_link: Není možné vytvořit cyklickou vazbu - no_rest_api: Easy Gantt potřebuje mít zapnuté REST API. Zapněte ho v Administraci - -> Nastavení -> API -> Zapnout službu REST - overdue: má skončit v budoucnu, nebo být již uzavřen - progress_date_overdue: se opožduje za plánem o %{days} dní - overmile: musí končit %{effective_date}, aby dodržel milník - short_delay: mělo by být delší o %{diff} dnů - too_short: není dost dlouhý pro zbývajících %{rest} hodin odhadovaného času - unsaved_parent: Nelze přidat úkol k neuloženému rodiči. Nejprve uložte změny. - unsupported_link_type: Nepodporovaný typ vazby - gateway: - entity_save_failed: "%{entityType} %{entityName} se nepodařilo uložit kvůli - chybě" - send_failed: 'Následující požadavky se nepodařilo odeslat:' - label_pro_upgrade: Upgradovat na PRO verzi - link_dir: - link_end: jako předchůdce - link_start: jako následovník - popup: - add_task: - heading: Přidat úkol - text: "Tato funkce je dostupná pouze v Easy Gantt PRO \r\n<a href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Upgradovat - na PRO verzi</a>" - baseline: - heading: Baseline - text: "Tato funkce je dostupná pouze v Easy Gantt PRO \r\n<a href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Upgradovat - na PRO verzi</a>" - critical: - heading: Kritická cesta - text: "Tato funkce je dostupná pouze v Easy Gantt PRO \r\n<a href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Upgradovat - na PRO verzi</a>" - resource: - easy_text: Modul Vytížení zdrojů není nainstalován - získejte ho <a href="https://www.easyredmine.com/pricing-buy">zde!</a> - heading: Vytížení zdrojů - text: Vytížení zdrojů je dostupné v <a href="https://www.easyproject.cz/"> - Easy Project</a> - reload_modal: - label_errors: Chyby - text_reload_appeal: Chcete ignorovat neuložené položky a znovu načíst data ze - serveru? - title: Gantt se nepodařilo správně uložit - sample_global_free: - text: Zkušební data nelze uzavřít. Gantt nad všemi projekty je k dispozici pouze - ve verzi PRO. - video: - text: Zde si můžete prohlédnout většinu funkcí Ganttu nad všemi projekty - title: Ukázkové video Ganttu nad všemi projekty - video_id: EiiqBrrY4m4 - sample_video: - text: Zde můžete vidět většinu funkcí modulu Easy Gantt - title: Ukázkové video - sample: - active_label: Jsou načtena testovací data! - close_label: Zavřít toto okno a načíst skutečná data - header: Jsou načtena zkušební data! - text: Připravili jsme zkušební data, abyste <strong>vyzkoušeli všechny funkce - Easy Ganttu bez obav</strong>. Koukněte se také na video průvodce ukazujícího - užitečné triky. Zavřením tohoto okna načtete skutečná data. - video_id: UHgqfsrD59Q - video_label: Spustit video návod - video: - text: Zde můžete vidět většinu funkcí modulu Easy Gantt - title: Spustit video návod - video_id: UHgqfsrD59Q - text_blocker_milestone: Milník blokuje posunutí úkolu za toto datum - text_blocker_move_pre: Úkol obsahuje vazbu, která blokuje posunutí úkolu za toto - datum - title: - button_test: Testovací tlačítko (pouze pro testování) - day_zoom: Dny - jump_today: Přejít na dnešek - month_zoom: Měsíce - week_zoom: Týdny - easy_query: - name: - easy_gantt_easy_issue_query: Easy Gantt - easy_gantt_easy_project_query: Globální Easy Gantt - error_easy_gantt_view_permission: Nemáte právo vidět Easy Gantt - error_epm_easy_gantt_already_active: Easy gantt je na této stránce již aktivní - errors: - duplicate_link: Cannot create duplicate link - fresh_milestone: Cannot add task to non-saved milestone. Save the milestone first. - loop_link: Cannot create looped link - overmile: Task should end before its milestone - too_short: Task is too short for its estimated hours count - field_easy_gantt_default_zoom: Výchozí přiblížení - field_easy_gantt_show_holidays: Zobrazit svátky - field_easy_gantt_show_project_progress: Zobrazit pokrok na projektu - field_easy_gantt_show_task_soonest_start: Zobrazit nejdřívější začátek - field_keep_link_delay_in_drag: Zachovat zpoždění vazby během přesunu - field_relation: Vazba - gantt_grid_head_subject: Předmět - heading_delay_popup: Nastavte zpoždění úkolu ve dnech - heading_demo_feature_popup: Již brzy... - heading_easy_gantts_issues: Easy Gantt Free - label_easy_gantt: Easy Gantt - label_easy_gantt_critical_path: Kritická cesta - label_easy_gantt_settings: Nastavení Ganttu - label_filter_group_easy_gantt_easy_issue_query: Úkolová pole - label_finish_to_finish: Konec na konec - label_parent_issue_plural: Rodičovské úkoly - label_pro_upgrade: Upgrade to PRO version - label_start_to_finish: Začátek na konec - label_start_to_start: Začátek na začátek - link_easy_gantt_plugin: https://www.easyredmine.com/easy-gantt-upgrade-to-pro - permission_edit_easy_gantt: Upravit Easy Gantt & Vytížení zdrojů na projektu - permission_edit_global_easy_gantt: Upravit globální Easy Gantt & Vytížení zdrojů - permission_edit_personal_easy_gantt: Upravit osobní Easy Gantt & Vytížení zdrojů - permission_view_easy_gantt: Zobrazit Easy Gantt & Vytížení zdrojů na projektu - permission_view_global_easy_gantt: Zobrazit globální Easy Gantt & Vytížení zdrojů - permission_view_personal_easy_gantt: Zobrazit osobní Easy Gantt & Vytížení zdrojů - project_default_page: - easy_gantt: Easy Gantt - project_module_easy_gantt: Easy Gantt - sample_global_free: - text: Sample data cannot be closed. Gantt over all projects is available only - in PRO version - video: - text: Here you can see most of features of Gantt over all projects - title: Sample video of Gantt over all projects - video_id: UHgqfsrD59Q - sample: - close_label: Close this window and load real project data - header: Sample data are loaded! - text: We have prepared some sample data for you to <strong>try all Gantt features - with no stress</strong>. We also want to encourage you to watch a video guide - showing useful tweaks. Closing this window will load real project data. - video_label: Watch video tutorial - video: - text: Here you can see most of features of this Gantt module - title: Sample video - video_id: UHgqfsrD59Q - text_demo_feature_popup: Tato funkce bude brzy dostupná. - text_easy_gantt_footer: Redmine Gantt powered by Easy - text_easy_gantt_keep_link_delay_in_drag: Zachovat zpoždění vazby, když je úkol přetažen - zpět - text_easy_gantt_show_holidays: Zobrazit aktuální dovolenou uživatelů v Ganttu (funguje - pouze v Easy Redmine) - text_easy_gantt_show_project_progress: Zobrazit procentuální dokončení na liště - projektu (načítání může být pomalé) - text_easy_gantt_show_task_soonest_start: Ukázat nejnižší platná data pro úkoly definovaná - vazbami nebo rodičem - title_easy_gantt_settings: Easy Gantt diff --git a/plugins/easy_gantt/config/locales/da.yml b/plugins/easy_gantt/config/locales/da.yml deleted file mode 100644 index d3dcd59d03737250a404acbf3357fe8585ca3c19..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/da.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -da: diff --git a/plugins/easy_gantt/config/locales/de.yml b/plugins/easy_gantt/config/locales/de.yml deleted file mode 100644 index 5a1f854748771f975ada12a629d718a01537533a..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/de.yml +++ /dev/null @@ -1,196 +0,0 @@ ---- -de: - button_print: Drucken - button_project_menu_easy_gantt: Easy Gantt - button_top_menu_easy_gantt: Projekte Gantt - button_use_actual_delay: Aktuelle Verzögerung übernehmen - easy_gantt_toolbar: - day: Days - month: Months - week: Weeks - easy_gantt: - buton_create_baseline: Baselines - button_critical_path: Critical path - button_resource_management: Ressourcenmanagement - button: - close_all: Alle schließen - close_all_parent_issues: Alle übergeordneten Aufgaben schliessen - create_baseline: Basispläne - critical_path: Kritischer Weg - day_zoom: Tage - delayed_project_filter: Verspätete Projekte filtern - jump_today: Zum heutigen Tag überspringen - load_sample_data: Beispieldaten laden - month_zoom: Monate - print_fit: Der Seite anpassen - problem_finder: Probleme - reload: Neu laden (speichern) - remove_delay: Die Verzögerung entfernen - resource_management: Ressourcenmanagement - tool_panel: Werkzeuge - week_zoom: Wochen - critical_path: - disabled: Deaktiviert - last: Letzte - last_text: Die Aufgaben, die ohne Verspätung erfüllt werden sollen - longest: Längste - longest_text: Die längste Sequenz anzeigen - error_overmile: Task should end before its milestone - error_too_short: Task is too short for its estimated hours count - errors: - duplicate_link: Das Duplikat des Links kann nicht erstellt werden - fresh_milestone: "Die Aufgabe kann nicht zu dem nicht gespeicherten Meilenstein - hinzugefügt werden.\r\nBitte speichern Sie erst den Meilenstein." - link_target_new: Ein Link zur nicht abgespeicherte Aufgabe kann nicht erstellt - werden. Bitte die Veränderungen erst speichern. - link_target_readonly: Nur-lese-Modus die Zielaufgabe - loop_link: Der geloopter Link kann nicht erstellt werden. - no_rest_api: Easy Gantt braucht REST API aktiviert. Bitte aktivieren Sie es - in der Administration -> Einstellungen-> API -> Aktivieren REST Web Service - overdue: Soll in der Zukunft enden oder soll bereits geschlossen werden - overmile: Soll am %{effective_date} enden, um den Meilenstein einzuhalten - short_delay: Soll länger sein als %{diff} Tage - too_short: enthält nicht genug Tage für %{rest} Stunden der abgeschätzten Zeit. - unsaved_parent: "Die Aufgabe kann nicht zur nicht gespeicherten übergeordneten - Aufgabe hinzugefügt werden.\r\nBitte erst die Änderungen speichern." - unsupported_link_type: Der Link Typ wird nicht unterstützt - gateway: - entity_save_failed: "%{entityType} %{entityName} kann nicht gespeichert werden. - Ein Fehler ist aufgetreten." - send_failed: Die Anfrage ist fehlgeschlagen - label_pro_upgrade: Auf die Pro Version upgraden - link_dir: - link_end: wie vorangegangen - link_start: als nächstes - popup: - add_task: - heading: Eine Funktion der Aufgabe hinzufügen - text: "Neue Funktion für eine/einen Aufgabe/Meilenstein ist ausschließlich - verfügbar für Easy Gantt PRO Mitglieder\r\n<a href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Check - for update!</a>" - baseline: - heading: Funktion für Basispläne - text: "Funktionen für Basisplan ist ausschließlich verfügbar für Easy Gantt - PRO Mitglieder\r\n<a href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Check - for update!</a>" - critical: - heading: Funktion für den kritischen Weg - text: "Funktion für den kritischen Weg ist ausschließlich verfügbar für Easy - Gantt PRO Mitglieder\r\n<a href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Check - for update!</a>" - resource: - easy_text: Ressourcenmanagement Plug-in ist nicht installiert - hier herunterladen - <a href="https://www.easyredmine.com/pricing-buy">here!</a> - heading: Ressourcenmanager Funktion - text: Ressourcenmanagement Funktion steht Ihnen hier zur Verfügung <a href="https://www.easyredmine.com/"> - Easy Redmine</a> - reload_modal: - label_errors: Fehler - text_reload_appeal: Möchten Sie nicht gespeicherte Elemente ignorieren und die - Daten vom Server neuladen? - title: Gantt wurde nicht ordnungsgemäß gespeichert - sample_global_free: - text: Beispieldaten können nicht geschlossen werden. Gantt über alle Projekte - ist nur in der PRO Version verfügrbar - video: - text: Hier bekommen Sie ein Übersicht über die meisten Funktionen des Gantt - über alle Projekte - title: Beispielvideo für Gantt über alle Projekte - video_id: EiiqBrrY4m4 - sample: - close_label: Das Fenster schließen und die echten Projektdaten laden - header: Beispieldaten sind hochgeladen - text: "Wir haben einige Beispieldaten für Sie vorbereitet, um alle Easy Gantt - Funktionen ohne Stress testen zu können. Wir möchten Sie auch ermutigen, sich - die Video-Anleitung über Optimierungsmethoden anzuschauen.\r\nSchließen Sie - dieses Fenster, um das Laden der echten Projektdaten auszulösen." - video_label: Die Video-Anleitung anschauen - video: - text: Hier können Sie die meisten der Funktionen für dieses Gantt Modul sehen - title: Beispielvideo - video_id: UHgqfsrD59Q - soon: - add_task: - heading: Add Issue feature - text: This feature is comming soon. <a href="https://www.easyredmine.com/redmine-gantt-plugin">Check - the availability here!</a> - baseline: - heading: Baselines feature - text: Baselines feature is comming soon. <a href="https://www.easyredmine.com/redmine-gantt-plugin>Check - the availability here!</a> - critical: - heading: Critical path feature - text: "Critical Path feature is comming soon. \r\n<a href=\"https://www.easyredmine.com/redmine-gantt-plugin\">Check - the availability here!</a>" - resource: - heading: Resource manager feature - text: Resource Management feature is available just in <a href="https://www.easyredmine.com/"> - Easy Redmine</a> - text_blocker_milestone: Der Meilenstein blockiert das Verschieben der Aufgabe - außerhalb des Datums - text_blocker_move_pre: Die Aufgabe hat eine Beziehung, die das Verschieben der - Aufgabe außerhalb des Datums verhindert. - title: - button_test: Test Taste (nur zum Testen) - day_zoom: In den täglichen Zeitplan zoomen - jump_today: springe zum heutigen Tag - month_zoom: In den monatlichen Zeitplan zoomen - print_fit: Skalieren Sie das Gantt auf eine Seite - week_zoom: In den wöchentlichen Zeitplan zoomen - easy_printable_templates_categories: - easy_gantt: Easy Gantt - easy_query: - name: - easy_gantt_easy_issue_query: Easy Gantt - easy_gantt_easy_project_query: Globales Easy Gantt - error_easy_gantt_view_permission: Sie haben nicht die Berechtigung, Easy Gantt zu - sehen - error_epm_easy_gantt_already_active: Easy Gantt ist auf der Seite bereits aktiv - field_easy_gantt_default_zoom: Standard Zoom - field_easy_gantt_relation_delay_in_workdays: Relationsverzögerungen in Arbeitstagen - field_easy_gantt_show_holidays: Feiertage anzeigen - field_easy_gantt_show_project_progress: Den Projektfortschritt anzeigen - field_easy_gantt_show_task_soonest_start: Den frühestmöglichen Starttermin anzeigen - field_keep_link_delay_in_drag: Konstante Link-Verzögerung beim Ziehen (Drag) - field_relation: Beziehung - heading_delay_popup: Definition der Verzögerung in Tagen - heading_demo_feature_popup: Coming soon - heading_easy_gantts_issues: Aufgaben Gantt - label_easy_gantt: Easy Gantt - label_easy_gantt_critical_path: Kritischer Weg - label_easy_gantt_settings: Gantt Einstellungen - label_filter_group_easy_gantt_easy_issue_query: Aufgabenfelder - label_finish_to_finish: Ende zu Ende - label_parent_issue_plural: Probleme der übergeordneten Aufgaben - label_start_to_finish: Start zu Ende - label_start_to_start: Start zu Start - link_easy_gantt_footer: https://www.easyredmine.com/redmine-gantt-plugin - link_easy_gantt_plugin: https://www.easyredmine.com/easy-gantt-upgrade-to-pro - permission_edit_easy_gantt: Easy Gantt & Ressourcenmanagement in dem Projekt bearbeiten - permission_edit_global_easy_gantt: Easy Gantt & Ressourcenmanagement in dem Prokjekt - global bearbeiten - permission_edit_personal_easy_gantt: Persönliche Easy Gantt & Resource management - bearbeiten - permission_view_easy_gantt: Easy Gantt & Resourcenmanagement in dem Prokjekt sehen - permission_view_global_easy_gantt: Easy Gantt & Ressourcenmanagement in dem Prokjekt - global sehen - permission_view_personal_easy_gantt: Persönliche Easy Gantt & Ressourcenmanagement - sehen - project_default_page: - easy_gantt: Easy Gantt - project_module_easy_gantt: Easy Gantt - text_demo_feature_popup: This feature will be available soon. - text_easy_gantt_footer: Redmine Gantt powered by Easy - text_easy_gantt_keep_link_delay_in_drag: Die Verzögerung der Beziehung konstant - beibehalten während die Aufgabe nach hinten gezogen wird - text_easy_gantt_print_easy_gantt_current: Aktuelles Easy Gantt anzeigen (funktioniert - nur von einer Seite, wo Easy Gantt geladen wird) - text_easy_gantt_relation_delay_in_workdays: Rechnen Sie nicht Nichtarbeitstage in - der Relationsverzögerung mit. - text_easy_gantt_show_holidays: Die aktuellen Feiertage des Benutzers im Gantt- Diagram - anzeigen (Die Funktion ist nur in Easy Redmine verfügbar) - text_easy_gantt_show_project_progress: Den Fortschritt in Prozent auf dem Balken - des Projekts anzeigen (kann die Ladezeit beeinträchtigen) - text_easy_gantt_show_task_soonest_start: Die kleinsten zulässigen Daten, die durch - Beziehungen oder übergeordnete Aufgaben definiert sind, für die Aufgabe anzeigen - title_easy_gantt_settings: Easy Gantt diff --git a/plugins/easy_gantt/config/locales/en-AU.yml b/plugins/easy_gantt/config/locales/en-AU.yml deleted file mode 100644 index 56b80b3c42087a32c3da5d38ddf1bda60788f804..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/en-AU.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -en-AU: diff --git a/plugins/easy_gantt/config/locales/en-GB.yml b/plugins/easy_gantt/config/locales/en-GB.yml deleted file mode 100644 index a32c22849c6a55e573aaaa3a41b6c0aca41badc9..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/en-GB.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -en-GB: diff --git a/plugins/easy_gantt/config/locales/en-US.yml b/plugins/easy_gantt/config/locales/en-US.yml deleted file mode 100644 index 54b3be8e68c04f20ca86f9137ed2c6f00c987b74..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/en-US.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -en-US: diff --git a/plugins/easy_gantt/config/locales/en.yml b/plugins/easy_gantt/config/locales/en.yml deleted file mode 100644 index 5bc8ea67c47139fbe545dc20061f04405e8c6d90..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/en.yml +++ /dev/null @@ -1,158 +0,0 @@ ---- -en: - button_print: Print - button_project_menu_easy_gantt: Easy Gantt - button_top_menu_easy_gantt: Projects Gantt - button_use_actual_delay: Use actual delay - easy_gantt: - button: - close_all: Close all - close_all_parent_issues: Close all parent tasks - create_baseline: Baselines - critical_path: Critical path - day_zoom: Days - delayed_project_filter: Filter Delayed Projects - jump_today: Jump to today - load_sample_data: Load sample data - month_zoom: Months - print_fit: Fit to page - problem_finder: Problems - reload: Reload (save) - remove_delay: Remove delay - resource_management: Resource management - tool_panel: Tools - week_zoom: Weeks - critical_path: - disabled: Disabled - last: Last - last_text: Tasks which should not be delayed - longest: Longest - longest_text: Show longest sequence of tasks - errors: - duplicate_link: Cannot create duplicate link - fresh_milestone: Cannot add task to non-saved milestone. Save the milestone - first. - link_target_new: Cannot create link to unsaved task. Save the changes first. - link_target_readonly: Read-only target task - loop_link: Cannot create looped link - no_rest_api: Easy Gantt needs REST API enabled. Turn it on in Administration - -> Settings -> API -> Enable REST web service - overdue: should end in future or should be closed already - progress_date_overdue: is behind schedule by %{days} days - overmile: should end on %{effective_date} in order to keep milestone - short_delay: should be longer by %{diff} days - too_short: does not contain enough days for %{rest} hours of estimated time - unsaved_parent: Cannot add task to non-saved parent. Save the changes first. - unsupported_link_type: Unsupported link type - gateway: - entity_save_failed: "%{entityType} %{entityName} failed to save due to error" - send_failed: Request failed - label_pro_upgrade: Upgrade to PRO version - link_dir: - link_end: as preceding - link_start: as following - popup: - add_task: - heading: Add task feature - text: "New task/milestone feature is available only in Easy Gantt PRO \r\n<a - href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Check for - update!</a>" - baseline: - heading: Baselines feature - text: "Baselines feature is available only in Easy Gantt PRO \r\n<a href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Check - for update!</a>" - critical: - heading: Critical path feature - text: "Critical path feature is available only in Easy Gantt PRO \r\n<a href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Check - for update!</a>" - resource: - easy_text: Resource management plugin is not installed - get it <a href="https://www.easyredmine.com/pricing-buy">here!</a> - heading: Resource manager feature - text: Resource management feature is available only in <a href="https://www.easyredmine.com/"> - Easy Redmine</a> - reload_modal: - label_errors: Errors - text_reload_appeal: Do you want to ignore unsaved items and reload data from - server? - title: Gantt failed to save properly - sample_global_free: - text: Sample data cannot be closed. Gantt over all projects is available only - in PRO version - video: - text: Here you can see most of features of Gantt over all projects - title: Sample video of Gantt over all projects - video_id: EiiqBrrY4m4 - sample: - close_label: Close this window and load real project data - header: Sample data are loaded! - text: We have prepared some sample data for you to <strong>try all Easy Gantt - features with no stress</strong>. We also want to encourage you to watch a - video guide showing useful tweaks. Closing this window will load real project - data. - video_label: Watch video tutorial - video: - text: Here you can see most of features of this Gantt module - title: Sample video - video_id: UHgqfsrD59Q - text_blocker_milestone: Milestone is blocking task to be moved beyond this date - text_blocker_move_pre: Task has relation that blocks moving task beyond this date - text_blocker_move_end: At least one following task will be postponed if moved after this date - title: - button_test: Test button (only for testing) - day_zoom: Zoom to day scale - jump_today: Display timeline at today - month_zoom: Zoom to month scale - print_fit: Scale the gantt to one page - week_zoom: Zoom to week scale - easy_printable_templates_categories: - easy_gantt: Easy Gantt - easy_query: - name: - easy_gantt_easy_issue_query: Easy Gantt - easy_gantt_easy_project_query: Global Easy Gantt - error_easy_gantt_view_permission: You do not have permission to see Easy Gantt - error_epm_easy_gantt_already_active: Easy gantt on the page is already active - field_easy_gantt_default_zoom: Default zoom - field_easy_gantt_relation_delay_in_workdays: Relation delays in workdays - field_easy_gantt_show_holidays: Show holidays - field_easy_gantt_show_project_progress: Show project progress - field_easy_gantt_show_task_soonest_start: Show soonest start - field_relation: Relation - heading_delay_popup: Define delay in days - heading_demo_feature_popup: Coming soon - heading_easy_gantts_issues: Easy Gantt Free - label_easy_gantt: Easy Gantt - label_easy_gantt_critical_path: Critical path - label_easy_gantt_settings: Gantt settings - label_filter_group_easy_gantt_easy_issue_query: Task fields - label_finish_to_finish: Finish to finish - label_parent_issue_plural: Parent tasks - label_start_to_finish: Start to finish - label_start_to_start: Start to start - link_easy_gantt_plugin: https://www.easyredmine.com/easy-gantt-upgrade-to-pro - permission_edit_easy_gantt: Edit Easy Gantt & Resource management on a project - permission_edit_global_easy_gantt: Edit global Easy Gantt & Resource management - permission_edit_personal_easy_gantt: Edit personal Easy Gantt & Resource management - permission_view_easy_gantt: View Easy Gantt & Resource management on a project - permission_view_global_easy_gantt: View global Easy Gantt & Resource management - permission_view_personal_easy_gantt: View personal Easy Gantt & Resource management - project_default_page: - easy_gantt: Easy Gantt - project_module_easy_gantt: Easy Gantt - text_demo_feature_popup: This feature will be available soon. - text_easy_gantt_footer: Redmine Gantt powered by Easy - text_easy_gantt_print_easy_gantt_current: Show current Easy Gantt (works only from - page where is easy gantt loaded) - text_easy_gantt_relation_delay_in_workdays: Do not count non-working days in relation - delay - text_easy_gantt_show_holidays: Show current user holidays on gantt (works only in - Easy Redmine) - text_easy_gantt_show_project_progress: Show completed percent on project's bar (may - be slow to load) - text_easy_gantt_show_task_soonest_start: Show lowest valid dates for tasks defined - by relations or parent - title_easy_gantt_settings: Easy Gantt - field_easy_gantt_fixed_delay: Fixed delay - text_easy_gantt_fixed_delay: Keep relation delay fixed when task is dragging (works only on easy gantt) - label_easy_gantt_recalculate_fixed_delay: recalculate fixed delay - notice_easy_gantt_fixed_delay_recalculated: Fixed delay on all relations was recalculated diff --git a/plugins/easy_gantt/config/locales/es.yml b/plugins/easy_gantt/config/locales/es.yml deleted file mode 100644 index a2b33b9888befb5610ef03a44e8d73eded554529..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/es.yml +++ /dev/null @@ -1,165 +0,0 @@ ---- -es: - button_print: Imprimir - button_project_menu_easy_gantt: Easy Gantt - button_top_menu_easy_gantt: Proyectos Gantt - button_use_actual_delay: Emplear retraso exacto - easy_gantt: - button: - close_all: Cerrar todo - close_all_parent_issues: Cerrar todas las tareas matrices - create_baseline: Referencias - critical_path: Ruta crítica - day_zoom: Días - delayed_project_filter: Filtrar los proyectos atrasados - jump_today: Saltar a hoy - load_sample_data: Cargar datos de muestra - month_zoom: Meses - print_fit: Ajustar a la página - problem_finder: Problemas - reload: Recargar (guardar) - remove_delay: Eliminar retraso - resource_management: Gestión de los recursos - tool_panel: Herramientas - week_zoom: Semanas - critical_path: - disabled: Deshabilitada - last: Última - last_text: Tareas que no deberían retrasarse - longest: Más largas - longest_text: Mostrar la secuencia de tareas más larga - errors: - duplicate_link: No se puede crear enlace duplicado - fresh_milestone: No se puede añadir tarea a un objetivo no guardado. Primero, - guarda el objetivo. - link_target_new: No se puede crear enlace a la tarea sin guardar. Primero, guarda - los cambios. - link_target_readonly: Tarea objetivo solo de lectura - loop_link: No se puede crear enlace con vínculo - no_rest_api: Easy Gantt requiere que REST API esté habilitado. Actívalo en Administración - -> Ajustes -> API -> Activar servicio web REST - overdue: debería terminar en el futuro o debería haberse cerrado ya - overmile: debería terminar en %{effective_date} para poder mantener el objetivo - short_delay: debe ser más extenso en %{diff} días - too_short: no contiene días suficientes para %{rest} horas de tiempo estimado - unsaved_parent: No se puede añadir tarea a una matriz sin guardar. Primero, - guarda los cambios. - unsupported_link_type: Tipo de enlace no compatible - gateway: - entity_save_failed: "%{entityType} %{entityName} no se ha guardado debido a - un error" - send_failed: Solicitud fallida - label_pro_upgrade: Actualizar a la versión PRO - link_dir: - link_end: como el anterior - link_start: como el siguiente - popup: - add_task: - heading: Añadir característica de tarea - text: La nueva característica de tarea/objetivo está disponible únicamente - en Easy Gantt PRO <a href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro">¡Marcar - para actualizar!</a> - baseline: - heading: Característica de referencias - text: La característica de la referencia está disponible únicamente en Easy - Gantt PRO <a href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro">¡Marcar - para actualizar!</a> - critical: - heading: Característica de ruta crítica - text: La característica de la ruta crítica está disponible únicamente en Easy - Gantt PRO <a href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro">Marcar - para actualizar - resource: - easy_text: El plugin de gestor de recursos no está instalado - ¡Consíguelo - <a href="https://www.easyredmine.com/pricing-buy">aquí!</a> - heading: Característica de gestor de recursos - text: La característica de gestor de recursos está disponible únicamente en - <a href="https://www.easyredmine.com/"> Easy Redmine</a> - reload_modal: - label_errors: Errores - text_reload_appeal: "¿Quieres ignorar los objetos no guardados y cargar de nuevo - los datos del servidor?" - title: Gantt no ha podido guardar correctamente - sample_global_free: - text: No se pueden cerrar los datos de muestra. Gantt en todos los proyectos - está disponible únicamente en la versión PRO - video: - text: Aquí podrás ver la mayoría de las características de Gantt en todos - los proyectos - title: Vídeo de muestra de Gant en todos los proyectos - video_id: EiiqBrrY4m4 - sample: - close_label: Cerrar esta ventana y cargar los datos reales del proyecto - header: "¡Se han cargado los datos de muestra!" - text: Hemos preparado unos datos de muestra para que <strong>pruebes todas las - características de Easy Gantt sin estrés</strong>. También nos gustaría animarte - a que visualices un vídeo de guía que muestra ajustes útiles. Al cerrar esta - ventana se cargarán los datos reales del proyecto. - video_label: Ver el vídeo tutorial - video: - text: Aquí podrás ver la mayoría de las características de este módulo de - Gantt - title: Vídeo de muestra - video_id: UHgqfsrD59Q - text_blocker_milestone: El objetivo no permite que la tarea se desplace después - de esta fecha - text_blocker_move_pre: La tarea tiene una relación que bloquea su desplazamiento - a una fecha posterior - title: - button_test: Botón de prueba (sólo para pruebas) - day_zoom: Ampliar a escala de día - jump_today: Mostrar calendario en hoy - month_zoom: Ampliar a escala de mes - print_fit: Ajustar gantt a una página - week_zoom: Ampliar a escala de semana - easy_printable_templates_categories: - easy_gantt: Easy Gantt - easy_query: - name: - easy_gantt_easy_issue_query: Easy Gantt - easy_gantt_easy_project_query: Global Easy Gantt - error_easy_gantt_view_permission: No tienes permiso para ver Easy Gantt - error_epm_easy_gantt_already_active: Ya está activo Easy Gantt en la página - field_easy_gantt_default_zoom: Zoom por defecto - field_easy_gantt_relation_delay_in_workdays: Retrasos de relación en días hábiles - field_easy_gantt_show_holidays: Mostrar vacaciones - field_easy_gantt_show_project_progress: Mostrar el progreso del proyecto - field_easy_gantt_show_task_soonest_start: Mostrar el inicio más próximo - field_keep_link_delay_in_drag: Retraso constante del enlace durante el arrastre - field_relation: Relación - heading_delay_popup: Definir retraso en días - heading_demo_feature_popup: Muy pronto - heading_easy_gantts_issues: Easy Gantt gratis - label_easy_gantt: Easy Gantt - label_easy_gantt_critical_path: Senda crítica - label_easy_gantt_settings: Ajustes de Gantt - label_filter_group_easy_gantt_easy_issue_query: Campos de tarea - label_finish_to_finish: Fin a fin - label_parent_issue_plural: Problemas de matriz - label_start_to_finish: Inicio a fin - label_start_to_start: Inicio a inicio - link_easy_gantt_plugin: https://www.easyredmine.com/actualizar-easy-gantt-a-pro - permission_edit_easy_gantt: Editar Easy Gantt y gestión de recursos en un proyecto - permission_edit_global_easy_gantt: Editar Easy Gantt y gestión de recursos global - permission_edit_personal_easy_gantt: Editar Easy Gantt y gestión de recursos personal - permission_view_easy_gantt: Ver Easy Gantt y gestión de recursos en un proyecto - permission_view_global_easy_gantt: Ver Easy Gantt y gestión de recursos global - permission_view_personal_easy_gantt: Ver Easy Gantt y gestión de recursos personal - project_default_page: - easy_gantt: Easy Gantt - project_module_easy_gantt: Easy Gantt - text_demo_feature_popup: Esta característica está disponible pronto. - text_easy_gantt_footer: Redmine Gantt respaldado por Easy - text_easy_gantt_keep_link_delay_in_drag: Mantener constante la relación de retraso - mientras se arrastra la tarea - text_easy_gantt_print_easy_gantt_current: Mostrar Easy Gantt actual (funciona sola - desde la página en la que se carga easy gantt) - text_easy_gantt_relation_delay_in_workdays: No contar días no hábiles en el retraso - de relación - text_easy_gantt_show_holidays: Mostrar las vacaciones del usuario actual en gantt - (funciona sólo en Easy Redmine) - text_easy_gantt_show_project_progress: Mostrar porcentaje completado en la barra - del proyecto (podría tardar al cargar) - text_easy_gantt_show_task_soonest_start: Mostrar las fechas válidas más bajas para - tareas definidas por relaciones o matriz - title_easy_gantt_settings: Easy Gantt diff --git a/plugins/easy_gantt/config/locales/fi.yml b/plugins/easy_gantt/config/locales/fi.yml deleted file mode 100644 index e173d1858f52e3f1aa745d45fd68220187ea3c51..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/fi.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -fi: diff --git a/plugins/easy_gantt/config/locales/fr.yml b/plugins/easy_gantt/config/locales/fr.yml deleted file mode 100644 index 361727aecc01865619467b6e047efe65e42ab52f..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/fr.yml +++ /dev/null @@ -1,165 +0,0 @@ ---- -fr: - button_print: Imprimer - button_project_menu_easy_gantt: Easy Gantt - button_top_menu_easy_gantt: Easy Gantt - button_use_actual_delay: Utilisez le délai réel - easy_gantt_toolbar: - day: Jours - month: Mois - week: Semaines - easy_gantt: - button: - close_all: Fermer tout - close_all_parent_issues: Fermer toutes les tâches parents - create_baseline: Lignes de base - critical_path: Chemin critique - day_zoom: Jours - delayed_project_filter: Filtrer les projets retardés - jump_today: Aller à aujourd'hui - load_sample_data: Charger données d'échantillon - month_zoom: Mois - print_fit: Ajuster à la page - problem_finder: Problèmes - reload: Recharger (sauvegarder) - remove_delay: Éliminer délai - resource_management: Gestion des resources - tool_panel: Outils - week_zoom: Semaines - critical_path: - disabled: Désactivé - last: Dernier - last_text: Tâches qui ne doivent pas être retardées - longest: La plus longue - longest_text: Afficher la séquence de tâches la plus longue - errors: - duplicate_link: Cannot create duplicate link - fresh_milestone: Cannot add task to non-saved milestone. Save the milestone - first. - link_target_new: Vous ne pouvez pas créer un lien vers la tâche non-sauvegardée. - Commencez par enregistrer les modifications. - link_target_readonly: Tâche cible en lecture seule - loop_link: Cannot create looped link - no_rest_api: Easy Gantt doit activer REST API. Allumez-le dans Administration - - > Paramètres -> API - > Activer REST web service - overdue: devrait se terminer à l'avenir ou devrait être déjà fermé - overmile: La tâche doit être terminée avant la date d'échéance du jalon - short_delay: Devrait être plus long de %{diff} jours - too_short: Tâche est trop courte pour le nombre d'heures estimés - unsaved_parent: Impossible d'ajouter la tâche au parent non-enregistré. Commencez - par enregistrez les modifications. - unsupported_link_type: Type de lien non reconnu - gateway: - entity_save_failed: "%{entityType} %{entityName} n'a pas pu sauvegarder due - à une erreur" - send_failed: Request failed - label_pro_upgrade: Upgrade to PRO version - link_dir: - link_end: as preceding - link_start: as following - popup: - add_task: - heading: Ajouter la tâche fonctionnalité - text: Cette fonctionnalité est à venir bientôt. <a href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro">Check - the availability here!</a> - baseline: - heading: Lignes de base disposent - text: Baselines fonctionnalité bientôt disponible. <a href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro">Check - the availability here!</a> - critical: - heading: Fonctionnalité du chemin critique - text: "Fonctionnalité du chemin critique sera disponible bientôt.\r\n<a href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Check - the availability here!</a>" - resource: - easy_text: Le plugin de gestion des ressources n'est pas installé - faites-en - l'acquisition <a href="https://www.easyredmine.com/pricing-buy">here!</a> - heading: Fonctionnalité de gestion de ressources - text: Fonctionnalité de gestion de ressources est disponible <a href="https://www.easyredmine.com/"> - Easy Redmine</a> - reload_modal: - label_errors: Erreurs - text_reload_appeal: Voulez-vous ignorer des éléments non enregistrés et recharger - les données à partir du serveur ? - title: Gantt n'a pas réussi à enregistrer correctement - sample_global_free: - text: Sample data cannot be closed. Gantt over all projects is available only - in PRO version - video: - text: Here you can see most of features of Gantt over all projects - title: Sample video of Gantt over all projects - video_id: EiiqBrrY4m4 - sample: - close_label: Close this window and load real project data - header: Sample data are loaded! - text: We have prepared some sample data for you to <strong>try all Gantt features - with no stress</strong>. We also want to encourage you to watch a video guide - showing useful tweaks. Closing this window will load real project data. - video_label: Watch video tutorial - video: - text: Here you can see most of features of this Gantt module - title: Sample video - video_id: UHgqfsrD59Q - text_blocker_milestone: Un jalon empêche la tâche d'être déplacée au-delà de cette - date - text_blocker_move_pre: La tâche a une relation qui bloque le déplacement de la - tâche au-delà de cette date - title: - button_test: Test button (only for testing) - day_zoom: Zoom to day scale - jump_today: Display timeline at today - month_zoom: Zoom to month scale - print_fit: Réduire le diagramme de Gantt à une page - week_zoom: Zoom to week scale - easy_printable_templates_categories: - easy_gantt: Easy Gantt - easy_query: - name: - easy_gantt_easy_issue_query: Easy Gantt - easy_gantt_easy_project_query: Global Easy Gantt - error_easy_gantt_view_permission: Vous n'êtes pas autorisé à voir Easy Gantt - error_epm_easy_gantt_already_active: Easy gantt sur la page est déjà actif - field_easy_gantt_default_zoom: Zoom par défaut - field_easy_gantt_relation_delay_in_workdays: Délais des relations en journées de - travail - field_easy_gantt_show_holidays: Afficher les vacances - field_easy_gantt_show_project_progress: Afficher les progrès du projet - field_easy_gantt_show_task_soonest_start: Afficher le démarrage le plus tôt - field_keep_link_delay_in_drag: Délai de lien constant pendant glissement - field_relation: Relation - heading_delay_popup: Définir délai en jours - heading_demo_feature_popup: À venir - heading_easy_gantts_issues: Easy Gantt Free - label_easy_gantt: Easy Gantt - label_easy_gantt_critical_path: Chemin critique - label_easy_gantt_settings: Paramètres de Gantt - label_filter_group_easy_gantt_easy_issue_query: Champs de tâches - label_finish_to_finish: Terminer pour terminer - label_parent_issue_plural: Problèmes parents - label_start_to_finish: Début à la fin - label_start_to_start: Démarrer pour démarrer - link_easy_gantt_plugin: https://www.easyredmine.com/easy-gantt-upgrade-to-pro - permission_edit_easy_gantt: Éditer Easy Gantt et gestion des ressources sur un projet - permission_edit_global_easy_gantt: Éditer Easy Gantt & Resource management global - permission_edit_personal_easy_gantt: Éditer Easy Gantt & Gestion des ressources - personnel - permission_view_easy_gantt: Voir Easy Gantt et Gestion des ressources sur un projet - permission_view_global_easy_gantt: Voir Easy Gantt & Resource management global - permission_view_personal_easy_gantt: Voir Easy Gantt & Resource management personnel - project_default_page: - easy_gantt: Easy Gantt - project_module_easy_gantt: Easy Gantt - text_demo_feature_popup: Cette fonctionnalité sera disponible bientôt. - text_easy_gantt_footer: Redmine Gantt powered by Easy - text_easy_gantt_keep_link_delay_in_drag: Maintient le délai de relation constant - pendant que la tâche est déplacée en arrière - text_easy_gantt_print_easy_gantt_current: Afficher l'actuel Easy Gantt (fonctionne - uniquement à partir de la page sur laquelle easy gantt est chargé) - text_easy_gantt_relation_delay_in_workdays: Ne pas compter les journées non-ouvrables - en délai de relation - text_easy_gantt_show_holidays: Afficher les vacances de l'utilisateur actuel sur - Gantt ( fonctionne uniquement dans Easy Redmine) - text_easy_gantt_show_project_progress: Afficher le pourcentage terminé sur la barre - de projet (peut être lent à charger) - text_easy_gantt_show_task_soonest_start: Afficher les dates de validité les plus - basses pour les tâches définies par des relations ou parent - title_easy_gantt_settings: Easy Gantt diff --git a/plugins/easy_gantt/config/locales/he.yml b/plugins/easy_gantt/config/locales/he.yml deleted file mode 100644 index de35edf7f488f14ca884e77b8d36cf38a66d3e3d..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/he.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -he: diff --git a/plugins/easy_gantt/config/locales/hr.yml b/plugins/easy_gantt/config/locales/hr.yml deleted file mode 100644 index 8ecf54ab84a5c15b21c88af98908f1ed46e902f1..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/hr.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -hr: - button_print: Ispiši - button_use_actual_delay: Koristi stvarno kašnjeje - easy_gantt: - button: - close_all: Zatvori sve - tool_panel: Alati diff --git a/plugins/easy_gantt/config/locales/hu.yml b/plugins/easy_gantt/config/locales/hu.yml deleted file mode 100644 index b6730950ce0fb738dd1edddf225a9cd0f79b4d49..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/hu.yml +++ /dev/null @@ -1,161 +0,0 @@ ---- -hu: - button_print: Nyomtatás - button_project_menu_easy_gantt: Easy Gantt - button_top_menu_easy_gantt: Projekt Gantt - button_use_actual_delay: Használja a jelenlegi késést - easy_gantt: - button: - close_all: Mind bezárása - close_all_parent_issues: Minden feladat bezására - create_baseline: Baselines - critical_path: Kritikus végrehajtási útvonal - day_zoom: Napok - delayed_project_filter: Elhalasztott projektek szűrése - jump_today: Ugrás a mai napra - load_sample_data: Minta adat betöltése - month_zoom: Hónapok - print_fit: Oldalhoz igazítás - problem_finder: Problémák - reload: Újratöltés (mentés) - remove_delay: Késés megszüntetése - resource_management: Erőforrások kezelése - tool_panel: Eszközök - week_zoom: Hetek - critical_path: - disabled: Letiltva - last: Utolsó - last_text: Nem halasztható feladatok - longest: Leghosszabb - longest_text: Leghosszabb feladatsorozat megjelenítése - errors: - duplicate_link: Kettős kapcsolat létrehozása nem lehetséges - fresh_milestone: A nem mentett mérföldkövekhez nem adható feladat. Először mentse - el a mérföldkövet. - link_target_new: A nem mentett feladatokhoz nem hozható létre link. Először - mentse el a változásokat. - link_target_readonly: Csak olvasható célfeladat - loop_link: Visszahivatkozó kapcsolat létrehozása nem lehetséges - no_rest_api: Az Easy Gantt-nek szüksége van a REST API szolgáltatásra. Engedélyezze - az adminisztráció => Beállítások => REST webes szolgáltatás bekapcsolásával - overdue: Hamarosan be kell fejeződnie, vagy már be kellett volna fejezni. - overmile: "%{effective_date} dátummal kell befejeződnie hogy tartsa a mérföldkő - határidejét" - short_delay: "%{diff} nappal hosszabbnak kell lennie" - too_short: Nincs elegendő nap a hátralévő %{rest} becsült óra számára - unsaved_parent: Nem adhat feladatot nem mentett szülőfeladathoz. Először mentse - a változásokat. - unsupported_link_type: Nem támogatott linktípus - gateway: - entity_save_failed: "%{entityType} %{entityName} hiba miatt nem sikerült menteni" - send_failed: Kérés nem sikerült - label_pro_upgrade: Frissítsen PRO verzióra - link_dir: - link_end: megelőzőként - link_start: következőként - popup: - add_task: - heading: Feladat jellemző hozzáadása - text: Új feladat/ mérföldkő tulajdonság csak az Easy Gantt PRO csomagban érhető - el <a href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro">Frissítés - keresése!</a> - baseline: - heading: Baselines jellemzői - text: Alapbeállítás jellemzői csak az Easy Gantt PRO <a href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro"> - csomagban érhető el. </a> - critical: - heading: Kritikus végrehajtási út funkció - text: Kritikus végrehajtási út funkció csak az Easy Gantt PRO csomagban elérhető - el. <a href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro"> Kövesse - a frissítéseket! </a> - resource: - easy_text: Az Erőforrástervező funkció nincs telepítve. Itt megvásárolhatja - <a href="https://www.easyredmine.com/pricing-buy">here!</a> - heading: Erőforrástervező funkció - text: Az Erőforrástervező funkció csak az Easy Redmine csomagban érhető el. <a - href="https://www.easyredmine.com/"> Easy Redmine</a> - reload_modal: - label_errors: Hibák - text_reload_appeal: Szeretné figyelmen kívül hagyni a nem mentett elemeket és - újratölteni az adatokat egy másik szerverről? - title: Nem sikerült a Gannt megfelelő mentése - sample_global_free: - text: A minta adatokat nem lehet bezárni.A Gantt átfogó projektjei csak a PRO - verzióban érhetők el - video: - text: Itt látható Gantt átfogó projektjeinek tulajdonságai - title: Gantt átfogó projektjeinek minta videója - video_id: EiiqBrrY4m4 - sample: - close_label: Zárja be ezt az ablakot és töltsön fel valós projekt adatokat - header: Minta adat betöltődött - text: Előkészítettünk néhány mintaadatot Önnek, hogy minden Easy Gantt funkciót - kipróbálhasson probléma nélkül. Emellett javasoljuk, tekintse meg a videós - bemutatót is. Az ablak bezárása után betöltődnek a valós projektadatok. - video_label: Nézze meg az oktatóvideót - video: - text: Itt látható a Gantt modul legtöbb tulajdonsága - title: Bemutató videó - video_id: UHgqfsrD59Q - text_blocker_milestone: A mérföldkő megakadályozza, hogy a feladatot át lehessen - vinni az adott dátumon túl - text_blocker_move_pre: A feladatnak olyan kapcsolatai vannak amelyek nem engedik - meg hogy az adott dátumon túl átvihető legyen. - title: - button_test: Teszt gomb (csak teszteléskor) - day_zoom: Váltás napi nézetre - jump_today: Mai napi idővonal megjelenítése - month_zoom: Váltás havi nézetre - print_fit: Gantt egész oldalas nagyítása - week_zoom: Váltás heti nézetre - easy_printable_templates_categories: - easy_gantt: Easy Gantt - easy_query: - name: - easy_gantt_easy_issue_query: Easy Gantt - easy_gantt_easy_project_query: Global Easy Gantt - error_easy_gantt_view_permission: Nincs felhatalazma az Easy Gantt eléréséhez - error_epm_easy_gantt_already_active: Easy Gantt már aktív az oldalon - field_easy_gantt_default_zoom: Alapértelmezett nézet - field_easy_gantt_relation_delay_in_workdays: Kapcsolódó késések munkanapokban - field_easy_gantt_show_holidays: Szabadnapok megjelenítése - field_easy_gantt_show_project_progress: Projekt folyamatának mutatása - field_easy_gantt_show_task_soonest_start: Legkorábbi kezdés megjelenítése - field_keep_link_delay_in_drag: Átmozgatás során a késés és kapcsolat megőrzése - field_relation: Kapcsolat - heading_delay_popup: Adja meg a késést napokban - heading_demo_feature_popup: Hamarosan - heading_easy_gantts_issues: Ingyenes Easy Gantt - label_easy_gantt: Easy Gantt - label_easy_gantt_critical_path: Kritikus végrehajtási útvonal - label_easy_gantt_settings: Gantt beállítások - label_filter_group_easy_gantt_easy_issue_query: Feladat mezők - label_finish_to_finish: Befejezéstől a befejezésig - label_parent_issue_plural: Szülőfeladatok - label_start_to_finish: Kezdéstől a befejezésig - label_start_to_start: Kezdéstől kezdésig - link_easy_gantt_plugin: https://www.easyredmine.com/easy-gantt-upgrade-to-pro - permission_edit_easy_gantt: Easy Gantt & Erőforrástervezés szerkesztése a projekten - permission_edit_global_easy_gantt: Globális Easy Gantt és Erőforrástervezés szerkesztése - permission_edit_personal_easy_gantt: Személyes Easy Gantt és Erőforrástervező szerkesztése - permission_view_easy_gantt: Easy Gantt & Erőforrástervezés megtekintése a projekten - permission_view_global_easy_gantt: Globális Easy Gantt és Erőforrástervezés megtekintése - permission_view_personal_easy_gantt: Személyes Easy Gantt és Erőforrástervező megtekintése - project_default_page: - easy_gantt: Easy Gantt - project_module_easy_gantt: Easy Gantt - text_demo_feature_popup: Ez a tulajdonság hamarosan elérhető lesz - text_easy_gantt_footer: Az Easy működteti a Redmine Gantt - text_easy_gantt_keep_link_delay_in_drag: Tartsa meg a késés mértékét a feladat korábbra - helyezésekor - text_easy_gantt_print_easy_gantt_current: Mutasd az aktív Easy Gantt-et (csak arról - az oldalról működik, ahonnan az Easy Gantt-et betöltötték ) - text_easy_gantt_relation_delay_in_workdays: A kapcsolódó késésben a munkaszüneti - napokat ne számolja - text_easy_gantt_show_holidays: Mutassa a jelenlegi Gantt felhasználó szabadságát - (csak Easy Redmine-ban működik) - text_easy_gantt_show_project_progress: Jelenítse meg a százalékos készültségét a - projekt lapon (lassan töltődhet be) - text_easy_gantt_show_task_soonest_start: Jelenítse meg a legkorábbi érvényes dátumokat - a kapcsolatok vagy szülői függőség által meghatározott feladatoknál - title_easy_gantt_settings: Easy Gantt diff --git a/plugins/easy_gantt/config/locales/it.yml b/plugins/easy_gantt/config/locales/it.yml deleted file mode 100644 index 642c04db39a9e3cf496030d352dd21303b920b6d..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/it.yml +++ /dev/null @@ -1,166 +0,0 @@ ---- -it: - button_print: Stampa - button_project_menu_easy_gantt: Easy Gantt - button_top_menu_easy_gantt: Progetti Gantt - button_use_actual_delay: Utilizza il ritardo effettivo - easy_gantt: - button: - close_all: Chiudi tutto - close_all_parent_issues: Chiudi tutti i task padre - create_baseline: Baseline - critical_path: Percorso critico - day_zoom: Giorni - delayed_project_filter: Filtra Progetti Rinviati - jump_today: Passa a oggi - load_sample_data: Carica dati di prova - month_zoom: Mesi - print_fit: Adatta alla pagina - problem_finder: Problemi - reload: Ricarica (salva) - remove_delay: Rimuovi ritardo - resource_management: Gestione risorse - tool_panel: Strumenti - week_zoom: Settimane - critical_path: - disabled: Disabilitato - last: Finale - last_text: Task che non dovrebbero essere posticipati - longest: Più lungo - longest_text: Mostra la più lunga sequenza di task - errors: - duplicate_link: Creazione copia collegamento non riuscita - fresh_milestone: Impossibile aggiungere task a una milestone non salvata. Salvare - prima la milestone. - link_target_new: Impossibile creare collegamento a un'attività non salvata. - Salvare prima le modifiche. - link_target_readonly: Task obiettivo di sola lettura - loop_link: Creazione collegamento ciclico non riuscita - no_rest_api: Easy Gantt necessita che le REST API siano attive. Per farlo andare - in Amministrazione -> Impostazione -> API -> Attiva servizi web REST - overdue: dovrebbe terminare in futuro o dovrebbe essere già chiusa - overmile: Dovrebbe terminare il %{effective_date} per rispettare la milestone - short_delay: dovrebbe essere più lunga di %{diff} giorni - too_short: non include giorni a sufficienza per le %{rest} ore stimate - unsaved_parent: Impossibile aggiungere task a un padre non salvato. Salvare - prima le modifiche. - unsupported_link_type: Tipo di collegamento non supportato - gateway: - entity_save_failed: Salvataggio di %{entityType} %{entityName} non riuscito - a causa di un errore - send_failed: Richiesta non riuscita - label_pro_upgrade: Effettua l'upgrade alla versione PRO - link_dir: - link_end: come precedente - link_start: come seguente - popup: - add_task: - heading: Aggiungi funzionalità al task - text: La funzionalità nuova task/milestone è disponibile solo in Easy Gantt - PRO <a href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro">Controlla - aggiornamenti!</a> - baseline: - heading: Funzionalità delle baseline - text: La funzionalità Baseline è disponibile solo in Easy Gantt PRO <a href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro">Controlla - aggiornamenti!</a> - critical: - heading: Funzionalità Percorso critico - text: La funzionalità Percorso critico è disponibile solo in Easy Gantt PRO - <a href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro">Check for - update!</a> - resource: - easy_text: Il plugin Gestione risorse non risulta installato. Scaricalo da - <a href="https://www.easyredmine.com/pricing-buy">qui!</a> - heading: Funzionalità Gestione risorse - text: La funzionalità Gestione risorse è disponibile solo in <a href="https://www.easyredmine.com/"> - Easy Redmine</a> - reload_modal: - label_errors: Errori - text_reload_appeal: Desideri ignorare le voci non salvate e ricaricare i dati - dal server? - title: Gantt non salvato correttamente - sample_global_free: - text: I dati di prova non possono essere chiusi. Il Gantt per tutti i progetti - è disponile solo nella versione PRO - video: - text: Qui puoi vedere la maggior parte delle funzionalità del Gantt per tutti - i progetti - title: Video di esempio di Gantt su tutti i progetti - video_id: EiiqBrrY4m4 - sample: - close_label: Chiudi questa finestra e carica i dati del progetto reale - header: I dati di esempio sono stati caricati! - text: Abbiamo alcuni dati di esempio per farti <strong>provare tutte le funzionalità - di Easy Gantt senza problemi</strong>. Ti consigliamo anche di guardare la - videoguida che ti mostrerà degli utili accorgimenti. Chiudendo questa finestra - si caricheranno i dati reali del progetto. - video_label: Guarda il video tutorial - video: - text: Qui puoi vedere la maggior parte delle funzionalità di questo modulo - Gantt - title: Video di esempio - video_id: UHgqfsrD59Q - text_blocker_milestone: Una milestone impedisce lo spostamento del task oltre - questa data - text_blocker_move_pre: Il task ha una relazione che impedisce il suo spostamento - oltre questa data - title: - button_test: Pulsante Test (solo per testare) - day_zoom: Ingrandisci a mostrare la scaletta giornaliera - jump_today: Mostra la timeline aggiornata ad oggi - month_zoom: Ingrandisci a mostrare la scaletta mensile - print_fit: Ridimensiona Gantt a una singola pagina - week_zoom: Ingrandisci a mostrare la scaletta settimanale - easy_printable_templates_categories: - easy_gantt: Easy Gantt - easy_query: - name: - easy_gantt_easy_issue_query: Easy Gantt - easy_gantt_easy_project_query: Global Easy Gantt - error_easy_gantt_view_permission: Non sei autorizzato a vedere Easy Gantt - error_epm_easy_gantt_already_active: Easy Gantt risulta già attivo sulla pagina - field_easy_gantt_default_zoom: Ingrandimento predefinito - field_easy_gantt_relation_delay_in_workdays: Differimento di relazione nei giorni - lavorativi - field_easy_gantt_show_holidays: Mostra giorni festivi - field_easy_gantt_show_project_progress: Mostra l'avanzamento del progetto - field_easy_gantt_show_task_soonest_start: Mostra l'inizio più prossimo - field_keep_link_delay_in_drag: Ritardo di collegamento costante durante il trascinamento - field_relation: Relazione - heading_delay_popup: Definisci il ritardo in giorni - heading_demo_feature_popup: Disponibile a breve - heading_easy_gantts_issues: Easy Gantt Free - label_easy_gantt: Easy Gantt - label_easy_gantt_critical_path: Percorso critico - label_easy_gantt_settings: Impostazioni Gantt - label_filter_group_easy_gantt_easy_issue_query: Settori del task - label_finish_to_finish: Termina dalla fine - label_parent_issue_plural: Task padre - label_start_to_finish: Parti dalla fine - label_start_to_start: Parti dall'inizio - link_easy_gantt_plugin: https://www.easyredmine.com/easy-gantt-upgrade-to-pro - permission_edit_easy_gantt: Modifica Easy Gantt e Gestione risorse in un progetto - permission_edit_global_easy_gantt: Modifica Easy Gantt e Gestione risorse - permission_edit_personal_easy_gantt: Modifica Easy Gantt e Gestione risorse personali - permission_view_easy_gantt: Visualizza Easy Gantt e Gestione risorse applicati a - un progetto - permission_view_global_easy_gantt: Visualizza Easy Gantt e Gestione risorse - permission_view_personal_easy_gantt: Visualizza Easy Gantt e Gestione risorse personali - project_default_page: - easy_gantt: Easy Gantt - project_module_easy_gantt: Easy Gantt - text_demo_feature_popup: Questa funzionalità sarà presto disponibile. - text_easy_gantt_footer: Redmine Gantt è offerto da Easy - text_easy_gantt_keep_link_delay_in_drag: Mantieni costanti i rapporti di ritardo - mentre il task viene spostato indietro - text_easy_gantt_print_easy_gantt_current: Mostra Easy Gantt attuale (funziona solo - da pagine in cui è caricato Easy Gantt) - text_easy_gantt_relation_delay_in_workdays: Non tenere conto dei giorni non lavorativi - nel differimento di relazione - text_easy_gantt_show_holidays: Mostra sul Gantt i giorni di ferie dell'utente (funziona - solo in Easy Redmine) - text_easy_gantt_show_project_progress: Mostra la percentuale di completamento sulla - barra del progetto (potrebbe risultare lenta da caricare) - text_easy_gantt_show_task_soonest_start: Mostra le date disponibili più vicine per - i task definiti da relazioni o dipendenza - title_easy_gantt_settings: Easy Gantt diff --git a/plugins/easy_gantt/config/locales/ja.yml b/plugins/easy_gantt/config/locales/ja.yml deleted file mode 100644 index ee9e1410f1ab08bc14f6336bf49cba6d1abe5081..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/ja.yml +++ /dev/null @@ -1,147 +0,0 @@ ---- -ja: - button_print: 印刷 - button_project_menu_easy_gantt: Easy Gantt - button_top_menu_easy_gantt: Projects Gantt - button_use_actual_delay: 実際の遅延日数を使用 - easy_gantt: - button: - close_all: すべて閉じる - close_all_parent_issues: すべての親タスクを閉じる - create_baseline: ベースライン - critical_path: クリティカルパス - day_zoom: 日数 - delayed_project_filter: 遅延しているプロジェクトをフィルタする - jump_today: 今日に移動 - load_sample_data: サンプルデータを読み込む - month_zoom: 月数 - print_fit: ページに合わせる - problem_finder: 問題 - reload: 再読み込み(保存) - remove_delay: 遅延を削除 - resource_management: リソース・マネージメント - tool_panel: ツール - week_zoom: 週数 - critical_path: - disabled: 無効 - last: 最終 - last_text: 遅延できないタスク - longest: 最長 - longest_text: タスクの最長シーケンスを表示 - errors: - duplicate_link: リンクのコピーを作成できません - fresh_milestone: 保存されていないマイルストーンにはタスクを追加できません。まず、マイルストーンを保存してください。 - link_target_new: 保存されていないタスクにはリンクを作成できません。まず、変更を保存してください。 - link_target_readonly: ターゲット・タスクは読み取り専用です - loop_link: 無限ループを作ってはなりません。 - no_rest_api: このEasy Ganttを使うためには、REST APIを有効にする必要があります。管理⇒設定⇒APIと進み、REST Webサービスを有効にしてください。 - overdue: あとで完了するか、すでにタスクはクローズされています - overmile: マイルストーンを保つには、%{effective date}に完了する必要があります。 - short_delay: "%{diff} 日以上、必要です" - too_short: 予定作業時間%{rest}に対して、日数が不足しています - unsaved_parent: 保存されていない親タスクにタスクの追加はできません。まず、変更を保存してください - unsupported_link_type: サポートされていないリンクタイプです - gateway: - entity_save_failed: "%{entityType} %{entityName} はエラーのため、保存できませんでした" - send_failed: 要求は失敗しました - label_pro_upgrade: PROにアップグレード - link_dir: - link_end: 前の通り - link_start: 以下の通り - popup: - add_task: - heading: タスクの機能追加 - text: 今回新たに追加されたタスク/マイルストーン機能は、Easy Gantt PROでのみ使用できます。\r\n<a href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">PROのアップデートされた機能については、こちらからご確認ください!</a>" - baseline: - heading: ベースライン機能 - text: "ベースライン機能は、Easy Gantt PROでのみ使用できます。\r\n<a href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">PROのアップデートされた機能については、こちらからご確認ください!</a>" - critical: - heading: クリティカルパス機能 - text: "クリティカルパス機能は、Easy Gantt PROでのみ使用できます。\r\n<a href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">PROのアップデートされた機能については、こちらからご確認ください!</a>" - resource: - easy_text: Resource Management プラグインがインストールされていません。- <a href="https://www.easyredmine.com/pricing-buy">こちらから購入してください!</a> - heading: リソース・マネージャー機能 - text: リソースマネージメント機能は<a href="https://www.easyredmine.com/">Easy Redmine</a>でのみ使用できます。 - reload_modal: - label_errors: エラー - text_reload_appeal: 保存されていない変更を破棄して、サーバのデータを再読み込みしますか? - title: Ganttが正しく保存されませんでした。 - sample_global_free: - text: 全プロジェクト横断管理ガントチャートはPROバージョンのみで使用可能です。 - video: - text: 全プロジェクト横断管理ガントチャートの大半の機能はこちらから見ることができます。 - title: 全プロジェクト横断管理ガントチャートのデモビデオ - video_id: zd3M0KYxcXM - sample: - close_label: このウィンドウを閉じて、実際のプロジェクトデータを読み込む - header: サンプルデータが読み込まれました! - text: "<strong>Easy Ganttの機能をストレスなく試していただくため</strong>、サンプルデータを用意しました。また、便利な使い方を説明したビデオガイドもご用意しています。このウィンドウを閉じると、実際のプロジェクトデータが読み込まれます。" - video_label: ビデオチュートリアルを見る - video: - text: このGanttモジュールの機能はこちらから見ることができます - title: サンプルビデオ - video_id: UHgqfsrD59Q - text_blocker_milestone: マイルストーンによってタスクの延期がブロックされています。 - text_blocker_move_end: このタスクをこの日付以降に延期すると、以下のタスクのうち一つ以上のタスクが延期されます。 - text_blocker_move_pre: このタスクはリレーションにより拘束されているため、このタスクをこの日付以降にずらすことはできません。 - title: - button_test: テスト ボタン(テスト専用) - day_zoom: 日単位で表示 - jump_today: 今日のチャートを表示する - month_zoom: 月単位で表示 - print_fit: Ganttのチャートを1ページの大きさにする - week_zoom: 週単位で表示 - easy_printable_templates_categories: - easy_gantt: Easy Gantt - easy_query: - name: - easy_gantt_easy_issue_query: Easy Gantt - easy_gantt_easy_project_query: Global Easy Gantt - error_easy_gantt_view_permission: Easy Ganttを見る権限がありません。 - error_epm_easy_gantt_already_active: 既に有効になっています このページ上のEasy Ganttはすでに有効になっています。 - error_small_screen: ガントチャートを表示するには端末の画面が小さすぎます - field_easy_gantt_default_zoom: デフォルト・タイムライン - field_easy_gantt_fixed_delay: タスク間の固定ラグタイム - field_easy_gantt_relation_delay_in_workdays: 作業日数におけるリレーション全体のデレイ - field_easy_gantt_show_holidays: 休日の表示 - field_easy_gantt_show_project_progress: プロジェクト進捗の表示 - field_easy_gantt_show_task_soonest_start: 最も早い開始日を表示 - field_keep_link_delay_in_drag: ドラッグ作業中、タスク間ラグタイムは変わりません - field_relation: リレーション - heading_delay_popup: 遅延を日数で確認 - heading_demo_feature_popup: Coming soon - heading_easy_gantts_issues: Easy Gantt無料版 - label_easy_gantt: Easy Gantt - label_easy_gantt_critical_path: クリティカルパス - label_easy_gantt_critical_path: Critical path - label_easy_gantt_global: グローバル - label_easy_gantt_issue_loaded: 全タスク読み込み完了 - label_easy_gantt_load: 読み込む - label_easy_gantt_recalculate_fixed_delay: タスク間の固定ラグタイムの再計算 - label_easy_gantt_settings: Gantt設定 - label_filter_group_easy_gantt_easy_issue_query: タスクフィールド - label_finish_to_finish: 終了‐終了 - label_parent_issue_plural: 親タスク - label_start_to_finish: 開始‐終了 - label_start_to_start: 開始‐開始 - link_easy_gantt_plugin: https://www.easyredmine.com/easy-gantt-upgrade-to-pro - notice_easy_gantt_fixed_delay_recalculated: 関連付けられた全タスク間の固定ラグタイムが再計算完了 - permission_edit_easy_gantt: 任意のプロジェクト上でEasy Gantt とResource Managementを編集する - permission_edit_global_easy_gantt: Easy Gantt(全体)とリソース・マネージメントを編集 - permission_edit_personal_easy_gantt: Easy Gantt(個別)とリソース・マネージメントを編集 - permission_view_easy_gantt: プロジェクトのEasy Ganttとリソース・マネージメントを閲覧 - permission_view_global_easy_gantt: Easy Ganttチャート(全体)とリソース・マネージメントを閲覧 - permission_view_personal_easy_gantt: Easy Ganttチャート(個別)とリソース・マネージメントを閲覧 - project_default_page: - easy_gantt: Easy Gantt - project_module_easy_gantt: Easy Gantt - text_demo_feature_popup: 本機能はもうじき利用可能になります - text_easy_gantt_fixed_delay: ドラッグバック作業中、タスク間ラグタイムは変わりません - text_easy_gantt_footer: Easyにより運営されるRedmine Gantt - text_easy_gantt_keep_link_delay_in_drag: タスクがドラッグされてもタスク間の日程は維持 - text_easy_gantt_print_easy_gantt_current: 現在のEasy Gantt を表示する(Easy Gantt が読み込まれたページからのみ可能です) - text_easy_gantt_relation_delay_in_workdays: リレーション遅延による非稼働日をカウントしない - text_easy_gantt_show_holidays: ユーザーの休日をGanttに表示する(Easy Redmineでのみ有効) - text_easy_gantt_show_project_progress: プロジェクトバー上に進捗率を表示する(読み込み速度が遅い可能性があり) - text_easy_gantt_show_task_soonest_start: 親タスク、またはリレーションから規定されるもっとも妥当性の低い日程を表示 - title_easy_gantt_settings: Easy Gantt diff --git a/plugins/easy_gantt/config/locales/ko.yml b/plugins/easy_gantt/config/locales/ko.yml deleted file mode 100644 index a3e3aa0502ed5c9c9f79c01f4abb4090be204538..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/ko.yml +++ /dev/null @@ -1,145 +0,0 @@ ---- -ko: - button_print: 프린트 - button_project_menu_easy_gantt: 쉬운 간트 - button_top_menu_easy_gantt: 프로젝트 간트 - button_use_actual_delay: 실제 지연일 사용 - easy_gantt: - button: - close_all: 모두 닫기 - close_all_parent_issues: 모든 상위작업 닫기 - create_baseline: 베이스라인 - critical_path: 중요한 경로 - day_zoom: 일 - delayed_project_filter: 지연된 프로젝트 필터 - jump_today: 오늘로 이동하기 - load_sample_data: 샘플 데이터 로딩 - month_zoom: 월 - print_fit: 페이지에 맞추기 - problem_finder: 문제 - reload: 다시 불러오기 (저장) - remove_delay: 지연 삭제 - resource_management: 리소스 관리 - tool_panel: 도구 - week_zoom: 주 - critical_path: - disabled: 비활성화 - last: 지난 - last_text: 지연되서는 안되는 작업들 - longest: 가장 긴 - longest_text: 가장 긴 작업 보이기 - errors: - duplicate_link: 복제된 링크를 생성할 수 없습니다 - fresh_milestone: 저장되지 않은 마일스톤에 작업을 추가 할 수 없습니다. 먼저 마일스톤을 저장하십시오. - link_target_new: 저장되지 않은 작업에 대한 링크를 만들 수 없습니다. 변경 사항을 먼저 저장하십시오. - link_target_readonly: 읽기전용 타겟 작업 - loop_link: 루프된 링크를 생성할 수 없음 - no_rest_api: Easy Gantt는 REST API를 활성화해야합니다. 관리 -> 설정 -> API -> REST 웹 서비스 순서로 - 활성화 하세요. - overdue: 이후에 종료하고 이미 종료했어야 합니다 - overmile: 마일스톤을 유지하려면 %{effective_date}에 작업을 끝내야합니다. - short_delay: "%{diff}보다 길어야 합니다" - too_short: 예상 시간의 %{rest} 시간 동안 충분한 일 수가 없습니다. - unsaved_parent: 저장되지 ㅇ낳은 상위 작업을 작업에 추가할 수 없습니다. 변경사항을 먼저 저장하세요 - unsupported_link_type: 지원하지 않는 링크 종류 - gateway: - entity_save_failed: "%{entityType} %{entityName}는 에러로 인해 저장하지 못했습니다" - send_failed: 요청 반려됨 - label_pro_upgrade: PRO버전으로 업그레이드하기 - link_dir: - link_end: 진행하는 동안 - link_start: 다음과 같이 - popup: - add_task: - heading: 작업 특성 추가 - text: 새로운 작업 / 마일스톤 기능은 Easy Gantt PRO에서만 사용할 수 있습니다. <a href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro"> - 업데이트를 확인하세요! </a> - baseline: - heading: 베이스라인 특징 - text: 베이스 라인 기능은 Easy Gantt PRO에서만 사용할 수 있습니다. <a href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro"> - 업데이트를 확인하세요! </a> - critical: - heading: 중요한 경로 특징 - text: 중요 경로 기능은 Easy Gantt PRO에서만 사용할 수 있습니다. <a href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro"> - 업데이트를 확인하세요! </a> - resource: - easy_text: 리소스 관리 플러그인이 설치되지 않았습니다. <a href="https://www.easyredmine.com/pricing-buy"> - 이곳을 클릭하고 설치하세요 </a>! - heading: 리소스 관리 특징 - text: 리소스 관리 기능은 <a href="https://www.easyredmine.com/"> Easy Redmine </a>에서 - 사용하실 수 있습니다</a> - reload_modal: - label_errors: 에러 - text_reload_appeal: 저장하지 않은 항목을 무시하고 서버에서 데이터를 다시 불러올까요? - title: 간트는 올바르게 저장할 수 없습니다 - sample_global_free: - text: 샘플 데이터를 닫을 수 없습니다. 모든 프로젝트의 Gantt는 PRO 버전에서만 사용이 가능합니다. - video: - text: 여기서 모든 프로젝트에 대해 Gantt의 대부분 기능을 볼 수 있습니다. - title: 모든 프로젝트에 관한 간트 비디오 샘플 - video_id: EiiqBrrY4m4 - sample: - close_label: 이 창을 닫고 실제 프로젝트 데이터 불러오기 - header: 샘플데이터가 로딩되었습니다! - text: "<strong> 스트레스 받지 않고 모든 Easy Gantt 기능을 사용해보세요 </ strong>를 위한 샘플 데이터가 준비되어 - 있습니다. 또한 유용한 조정을 보여주는 비디오 가이드를 보는 것을 추천하여 드립니다. 이 창을 닫으면 실제 프로젝트 데이터가 로딩됩니다." - video_label: 비디오 튜토리얼 보기 - video: - text: 이 간트 모듈의 가장 최근 기능들을 확인하실 수 있습니다 - title: 샘플 비디오 - video_id: UHgqfsrD59Q - text_blocker_milestone: 마일스톤이 날짜 이후에 작업을 하지 못하도록 차단하게 되어 있습니다 - text_blocker_move_pre: 작업이날짜 이후에 작업을 이동하지 못하도록 차단하는 상태로 있습니다. - title: - button_test: 테스트 버튼 (테스트용) - day_zoom: 요일별 확대 - jump_today: 금일 타임라인 보기 - month_zoom: 월별로 확대 - print_fit: 간트 차트 한 페이지로 보이기 - week_zoom: 주별로 확대 - easy_printable_templates_categories: - easy_gantt: 쉬운 간트 - easy_query: - name: - easy_gantt_easy_issue_query: 쉬운 간트 - easy_gantt_easy_project_query: 글로벌 Easy Gantt - error_easy_gantt_view_permission: 이지간트 보기 권한을 가지고 있지 않습니다. - error_epm_easy_gantt_already_active: 페이지의 Easy Gantt는 이미 활성화 되어 있습니다 - field_easy_gantt_default_zoom: 영구설정 확대 - field_easy_gantt_relation_delay_in_workdays: 작업 날짜에서 관련 지연일 - field_easy_gantt_show_holidays: 휴일 보이기 - field_easy_gantt_show_project_progress: 프로젝트 과정 보이기 - field_easy_gantt_show_task_soonest_start: 가장 빨리 시작하는 것 보이기 - field_keep_link_delay_in_drag: 드래그 동안 지속적인 링크 지연 - field_relation: 관련 - heading_delay_popup: 지연 날짜 설정 - heading_demo_feature_popup: 곧 출시됩니다 - heading_easy_gantts_issues: 무료 쉬운 간트 - label_easy_gantt: 쉬운 간트 - label_easy_gantt_critical_path: 중요한 경로 - label_easy_gantt_settings: 간트 설정 - label_filter_group_easy_gantt_easy_issue_query: 작업 필드 - label_finish_to_finish: 종료하기 종료 - label_parent_issue_plural: 상위 작업 - label_start_to_finish: 종료하기 시작 - label_start_to_start: 시작하기 시작 - link_easy_gantt_plugin: https://www.easyredmine.com/easy-gantt-upgrade-to-pro - permission_edit_easy_gantt: 쉬운 간트 수정 & 프로젝트 리소스 관리 - permission_edit_global_easy_gantt: 글로벌 쉬운 간트 수정 & 리소스 관리 - permission_edit_personal_easy_gantt: 개별 쉬운 간트 수정 & 리소스 관리 - permission_view_easy_gantt: 쉬운 간트 확인 & 프로젝트 리소스 관리 - permission_view_global_easy_gantt: 글로벌 쉬운 간트 보기 & 리소스 관리 - permission_view_personal_easy_gantt: 개별 쉬운 간트 확인 & 리소스 관리 - project_default_page: - easy_gantt: 쉬운 간트 - project_module_easy_gantt: 쉬운 간트 - text_demo_feature_popup: 이 기능은 곧 사용가능합니다. - text_easy_gantt_footer: Easy가 지원하는 Redmine Gantt - text_easy_gantt_keep_link_delay_in_drag: 작업이 지연되는 동안 연장시간을 일관적으로 유지하십시오 - text_easy_gantt_print_easy_gantt_current: 현재 쉬운 간트 표 보기 (쉬운 간트가 표시된 페이지에만 작업하실 수 - 있습니다) - text_easy_gantt_relation_delay_in_workdays: 관련 지연에서 일하지 않은 날은 세지 않기 - text_easy_gantt_show_holidays: 간트에 있는 현재 사용자 휴일 보기 (Easy Redmine에서만 확인할 수 있습니다) - text_easy_gantt_show_project_progress: 프로젝트 바에서 완료율 보기 (로딩하는데 시간이 걸릴 수 있습니다) - text_easy_gantt_show_task_soonest_start: 관련 혹은 상위그룹으로 정렬된 작업의 가장 적은 유효날짜 표시 - title_easy_gantt_settings: 쉬운 간트 diff --git a/plugins/easy_gantt/config/locales/mk.yml b/plugins/easy_gantt/config/locales/mk.yml deleted file mode 100644 index 0ae10927d4e23c4b03326d1b5d63b519da6d0cae..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/mk.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -mk: diff --git a/plugins/easy_gantt/config/locales/nl.yml b/plugins/easy_gantt/config/locales/nl.yml deleted file mode 100644 index 14f7affba2b05e9f160152749e9e10bf354a1ed6..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/nl.yml +++ /dev/null @@ -1,161 +0,0 @@ ---- -nl: - button_print: Afdrukken - button_project_menu_easy_gantt: Easy Gantt - button_top_menu_easy_gantt: Projecten Gantt - button_use_actual_delay: Gebruik actuele vertraging - easy_gantt: - button: - close_all: Sluit alle - close_all_parent_issues: Sluit alle overkoepelende taken - create_baseline: Baselines - critical_path: Kritiek pad - day_zoom: Dagen - delayed_project_filter: Filter Vertraagde Projecten - jump_today: Ga naar vandaag - load_sample_data: Laad sample gegevens - month_zoom: Maanden - print_fit: Aangepast aan pagina - problem_finder: Problemen - reload: Herladen (opslaan) - remove_delay: Verwijder vertraging - resource_management: Resource management - tool_panel: Tools - week_zoom: Weken - critical_path: - disabled: Uitgeschakeld - last: Laatste - last_text: Taken die niet vertraagd mogen worden - longest: Langste - longest_text: Toon langste sequentie taken - errors: - duplicate_link: Kan link niet dupliceren - fresh_milestone: Kan geen taak toevoegen aan niet-opgeslagen mijlpaal. Sla eerst - de mijlpaal op. - link_target_new: Kan geen link maken naar niet-opgeslagen taak. Sla eerst de - wijzigingen op. - link_target_readonly: Alleen lezen doeltaak - loop_link: Kan geloopte link niet aanmaken - no_rest_api: Voor Easy Gantt moet REST API ingeschakeld zijn. Zet het aan bij Administratie - -> Instellingen -> API -> REST web service inschakelen - overdue: zou in de toekomst moeten eindigen of al gesloten moeten zijn - overmile: moet eindigen op %{effective_date} om mijlpaal te houden - short_delay: Moet %{diff} dagen langer zijn - too_short: bevat niet genoeg dagen voor %{rest} uren geschatte tijd - unsaved_parent: Kan geen taak toevoegen aan niet opgeslagen overkoepeling. Sla - de wijzigingen eerst op. - unsupported_link_type: Niet ondersteund type link - gateway: - entity_save_failed: "%{entityType} %{entityName} niet opgeslagen door fout" - send_failed: Verzoek mislukt - label_pro_upgrade: Upgraden naar PRO versie - link_dir: - link_end: als voorgaande - link_start: als volgt - popup: - add_task: - heading: Voeg eigenschap taak toe - text: "Nieuwe taak/mijlpaal eigenschap is alleen beschikbaar in Easy Gantt - PRO \r\n<a href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Controleer - voor een update!</a>" - baseline: - heading: Baselines functie - text: "De Baselines functie is alleen beschikbaar in Easy Gantt PRO \r\n<a - href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Controleer - voor een update!</a>" - critical: - heading: Kritiek pad functie - text: "Kritiek pad functie is alleen beschikbaar in Easy Gantt PRO \r\n<a - href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Kijk hier - voor een update!</a>" - resource: - easy_text: Resource management plugin is niet geïnstalleerd - krijg hem <a - href="https://www.easyredmine.com/pricing-buy">hier!</a> - heading: Resource manager functie - text: Resource management functie is alleen beschikbaar in <a href="https://www.easyredmine.com/"> - Easy Redmine</a> - reload_modal: - label_errors: Fouten - text_reload_appeal: Wilt u niet opgeslagen items negeren en data opnieuw laden - van de server? - title: Gantt niet juist opgeslagen - sample_global_free: - text: Sample data kunnen niet gesloten worden. Gantt over alle projecten is - alleen beschikbaar in de PRO versie - video: - text: Hier zie je de meeste functies van Gantt in alle projecten - title: Sample video van Gantt over alle projecten - video_id: EiiqBrrY4m4 - sample: - close_label: Sluit dit venster en laad echte projectgegevens - header: Sample data zijn geladen! - text: We hebben wat sample gegevens voorbereid om <strong>alle Easy Gantt functies - stress-vrij te proberen</strong>. We adviseren ook om een video met wat nuttige - tips te bekijken. Het sluiten van dit venster laadt echte project gegevens. - video_label: Bekijk video tutorial - video: - text: Hier ziet u de meeste functies van de Gantt module - title: Sample video - video_id: UHgqfsrD59Q - text_blocker_milestone: Mijlpaal blokkeert taak om verplaatst te worden na deze - datum - text_blocker_move_pre: Taak heeft een relatie die het verschuiven van deze taak - na deze datum blokkeert - title: - button_test: Test button (alleen voor testen) - day_zoom: Zoom naar dagweergave - jump_today: Geef tijdlijn voor vandaag weer - month_zoom: Zoom naar maandelijkse weergave - print_fit: Schaal gantt tot een pagina - week_zoom: Zoom naar wekelijkse weergave - easy_printable_templates_categories: - easy_gantt: Easy Gantt - easy_query: - name: - easy_gantt_easy_issue_query: Easy Gantt - easy_gantt_easy_project_query: Global Easy Gantt - error_easy_gantt_view_permission: U heeft geen toestemming om Easy Gantt te bekijken - error_epm_easy_gantt_already_active: Easy gantt is al actief op de pagina - field_easy_gantt_default_zoom: Standaard zoom - field_easy_gantt_relation_delay_in_workdays: Relatie vertragingen in werkdagen - field_easy_gantt_show_holidays: Toon vakanties - field_easy_gantt_show_project_progress: Toon projectvoortgang - field_easy_gantt_show_task_soonest_start: Toon eerste start - field_keep_link_delay_in_drag: Constante link vertraging tijdens slepen - field_relation: Relatie - heading_delay_popup: Definieer vertraging in dagen - heading_demo_feature_popup: Binnenkort - heading_easy_gantts_issues: Easy Gantt Gratis - label_easy_gantt: Easy Gantt - label_easy_gantt_critical_path: Kritiek pad - label_easy_gantt_settings: Gantt instellingen - label_filter_group_easy_gantt_easy_issue_query: Taken velden - label_finish_to_finish: Finish om af te ronden - label_parent_issue_plural: Ouder kwesties - label_start_to_finish: Start tot finish - label_start_to_start: Start om te beginnen - link_easy_gantt_plugin: https://www.easyredmine.com/easy-gantt-upgrade-naar-pro - permission_edit_easy_gantt: Bewerk Easy Gantt & Resource management op een project - permission_edit_global_easy_gantt: Bewerk globaal Easy Gantt & Resource management - permission_edit_personal_easy_gantt: Bewerk persoonlijk Easy Gantt & Resource management - permission_view_easy_gantt: Bekijk Easy Gantt & Resource management op een project - permission_view_global_easy_gantt: Bekijk globaal Easy Gantt & Resource management - permission_view_personal_easy_gantt: Bekijk persoonlijk Easy Gantt & Resource management - project_default_page: - easy_gantt: Easy Gantt - project_module_easy_gantt: Easy Gantt - text_demo_feature_popup: Deze functie is binnenkort beschikbaar - text_easy_gantt_footer: Redmine Gantt mogelijk gemaakt door Easy - text_easy_gantt_keep_link_delay_in_drag: Hou relatievertraging constant terwijl - taak teruggedraaid wordt - text_easy_gantt_print_easy_gantt_current: Toon huidige Easy Gantt (werkt alleen - op pagina's waar easy gantt is geladen) - text_easy_gantt_relation_delay_in_workdays: Tel niet-werkdagen niet mee in relatie - vertraging - text_easy_gantt_show_holidays: Toon vakantie van huidige gebruiker op gantt (werkt - alleen in Easy Redmine) - text_easy_gantt_show_project_progress: Bekijk voortgangspercentage op de balk van - het project (laadt wellicht langzaam) - text_easy_gantt_show_task_soonest_start: Toon laagst geldige data voor taken gedefinieerd - door relaties of ouder - title_easy_gantt_settings: Easy Gantt diff --git a/plugins/easy_gantt/config/locales/no.yml b/plugins/easy_gantt/config/locales/no.yml deleted file mode 100644 index 38901c6667cbd0aed63c1f7b5bcb733803675b36..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/no.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -'no': diff --git a/plugins/easy_gantt/config/locales/pl.yml b/plugins/easy_gantt/config/locales/pl.yml deleted file mode 100644 index 40003b02eb0034f913f6e4d5cc357590f4742c6d..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/pl.yml +++ /dev/null @@ -1,162 +0,0 @@ ---- -pl: - button_print: Drukuj - button_project_menu_easy_gantt: Easy Gantt - button_top_menu_easy_gantt: Projekty Gantt - button_use_actual_delay: Użyj aktualnego opóźnienia - easy_gantt: - button: - close_all: Zamknij wszystko - close_all_parent_issues: Zamknij wszystkie zadania nadrzędne - create_baseline: Bazy - critical_path: Ścieżka krytyczna - day_zoom: Dni - delayed_project_filter: Filtruj opóźnione projekty - jump_today: Skok do dzisiaj - load_sample_data: Załaduj proste dane - month_zoom: Miesiące - print_fit: Dopasuj do strony - problem_finder: Problemy - reload: Przeładuj (zapisz) - remove_delay: Usuń opóźnienie - resource_management: Zarządzanie zasobami - tool_panel: Narzędzia - week_zoom: Tygodnie - critical_path: - disabled: Wyłączony - last: Ostatni - last_text: Zadania, które nie powinny być opóźnione - longest: Najdłuższy - longest_text: Pokaż najdłuższą sekwencję zadań - errors: - duplicate_link: Nie można utworzyć zduplikowanego linku - fresh_milestone: Nie można dodać zadania do niezapisanych kroków milowych. Najpierw - zapisz krok milowy. - link_target_new: Nie można utworzyć linku do niezapisanego zadania. Najpierw - zapisz zmiany. - link_target_readonly: Docelowe zadanie jedynie do odczytu - loop_link: Nie można utworzyć zapętlonego linku - no_rest_api: Easy Gantt potrzebuje włączonego API REST. Włącz go w Administracja - -> Ustawienia -> API -> Włącz usługę sieciową REST - overdue: powinno się zakończyć w przyszłości lub być już zamknięte - overmile: powinno zakończyć się %{effective_date}, aby zachować krok milowy - short_delay: powinno być dłuższe niż %{diff} dni - too_short: nie zawiera wystarczającej liczby dni dla %{rest} godzin oszacowanego - czasu - unsaved_parent: Nie można dodać zadania do niezapisanego zadania nadrzędnego. - Najpierw zapisz zmiany - unsupported_link_type: Nieobsługiwany typ linku - gateway: - entity_save_failed: Nie powiodło się zapisanie %{entityType} %{entityName} z - powodu błędu - send_failed: Wymagane pole - label_pro_upgrade: Zaktualizuj do wersji PRO - link_dir: - link_end: jak poprzedni - link_start: jak następujący - popup: - add_task: - heading: Dodaj funkcję zadania - text: "Funkcja nowego zadania/kroku milowego jest dostępna jedynie w Easy - Gantt PRO \r\n<a href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Sprawdź - aktualizację!</a>" - baseline: - heading: Funkcja baz - text: "Funkcja baz jest dostępna jedynie w Easy Gantt PRO \r\n<a href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Sprawdź - aktualizację!</a>" - critical: - heading: Funkcja ścieżki krytycznej - text: "Funkcja ścieżki krytycznej jest dostępna jedynie w Easy Gantt PRO \r\n<a - href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Sprawdź aktualizację!</a>" - resource: - easy_text: Wtyczka zarządzania zasobami nie jest zainstalowana - pobierz ją - <a href="https://www.easyredmine.com/pricing-buy">tutaj!</a> - heading: Funkcja menedżera zasobów - text: Funkcja ścieżki krytycznej jest dostępna jedynie w <a href="https://www.easyredmine.com/"> - Easy Redmine</a> - reload_modal: - label_errors: Błędy - text_reload_appeal: Czy chcesz zignorować niezapisane pozycje i ponownie załadować - dane z serwera? - title: Poprawne zapisanie Gantta nie powiodło się - sample_global_free: - text: Przykładowe dane nie mogą zostać zamknięte. Gantt w stosunku do innych - projektów jest dostępny jedynie w wersji PRO - video: - text: Tutaj możesz zobaczyć większość funkcji Gantta w stosunku do wszystkich - projektów - title: Przykładowe wideo Gantta w stosunku do wszystkich projektów - video_id: EiiqBrrY4m4 - sample: - close_label: Zamknij to okno i załaduj prawdziwe dane projektowe - header: Przykładowe dane są załadowane! - text: Przygotowaliśmy dla ciebie pewne przykładowe dane w celu <strong>wypróbowania - wszystkich funkcji Easy Gantt bez stresu</strong>. - video_label: Zobacz samouczek filmowy - video: - text: Tutaj możesz zobaczyć większość funkcji tego modułu Gantta - title: Przykładowy film - video_id: UHgqfsrD59Q - text_blocker_milestone: Krok milowy blokuje przeniesienie zadania poza tę datę - text_blocker_move_pre: Zadanie posiada relację, która blokuje przesunięcie go - poza tę datę - title: - button_test: Przycisk testowy (tylko dla testowania) - day_zoom: Powiększ do skali dni - jump_today: Wyświetl linię czasu dla dzisiaj - month_zoom: Powiększ do skali miesiąca - print_fit: Skaluj Gantta na jedną stronę - week_zoom: Powiększ do skali tygodnia - easy_printable_templates_categories: - easy_gantt: Easy Gantt - easy_query: - name: - easy_gantt_easy_issue_query: Easy Gantt - easy_gantt_easy_project_query: Globalny Easy Gantt - error_easy_gantt_view_permission: Nie masz uprawnień do zobaczenia Easy Gantt - error_epm_easy_gantt_already_active: Easy Gantt jest już aktywny na stronie - field_easy_gantt_default_zoom: Domyślne powiększenie - field_easy_gantt_relation_delay_in_workdays: Opóźnienie relacji w dniach roboczych - field_easy_gantt_show_holidays: Pokaż urlopy - field_easy_gantt_show_project_progress: Pokaż postęp projektu - field_easy_gantt_show_task_soonest_start: Pokaż najwcześniejsze rozpoczęcie - field_keep_link_delay_in_drag: Stałe opóźnienie linku podczas przeciągania - field_relation: Relacja - heading_delay_popup: Określ opóźnienie w dniach - heading_demo_feature_popup: Wkrótce - heading_easy_gantts_issues: Bezpłatny Easy Gantt - label_easy_gantt: Easy Gantt - label_easy_gantt_critical_path: Ścieżka krytyczna - label_easy_gantt_settings: Ustawienia Gantta - label_filter_group_easy_gantt_easy_issue_query: Pole zadania - label_finish_to_finish: Zakończ aby zakończyć - label_parent_issue_plural: Zadania nadrzędne - label_start_to_finish: Rozpocznij aby zakończyć - label_start_to_start: Zacznij aby zacząć - link_easy_gantt_plugin: https://www.easyredmine.com/easy-gantt-upgrade-to-pro - permission_edit_easy_gantt: Edytuj Easy Gantt i Zarządzanie zasobami w projekcie - permission_edit_global_easy_gantt: Edytuj globalne Easy Gantt i Zarządzanie zasobami - permission_edit_personal_easy_gantt: Edytuj personalne Easy Gantt i Zarządzanie - zasobami - permission_view_easy_gantt: Zobacz Easy Gantt i Zarządzanie zasobami w projekcie - permission_view_global_easy_gantt: Zobacz globalne Easy Gantt i Zarządzanie zasobami - permission_view_personal_easy_gantt: Zobacz personalne Easy Gantt i Zarządzanie - zasobami - project_default_page: - easy_gantt: Easy Gantt - project_module_easy_gantt: Easy Gantt - text_demo_feature_popup: Ta funkcja będzie dostępna wkrótce. - text_easy_gantt_footer: Redmine Gantt powered by Easy - text_easy_gantt_keep_link_delay_in_drag: Utrzymaj stałe opóźnienie relacji gdy zadanie - jest przeciągane z powrotem - text_easy_gantt_print_easy_gantt_current: Pokaż obecny Easy Gantt (działa tylko - na stronie, na której jest załadowany Easy Gantt) - text_easy_gantt_relation_delay_in_workdays: Nie bierz pod uwagę nieroboczych dni - w opóźnieniu relacji - text_easy_gantt_show_holidays: Pokaż urlop obecnego użytkownika na Gantt (działa - jedynie w Easy Redmine) - text_easy_gantt_show_project_progress: Pokaż zakończony procent na pasku projektu - (pobranie może być wolne) - text_easy_gantt_show_task_soonest_start: Pokaż najbliższe ważne daty dla zadań określonych - przez relacje lub zadanie nadrzędne - title_easy_gantt_settings: Easy Gantt diff --git a/plugins/easy_gantt/config/locales/pt-BR.yml b/plugins/easy_gantt/config/locales/pt-BR.yml deleted file mode 100644 index 9c63a3d9b18e76464464f319a944f1fae450ae79..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/pt-BR.yml +++ /dev/null @@ -1,163 +0,0 @@ ---- -pt-BR: - button_print: Imprimir - button_project_menu_easy_gantt: Diagrama de Easy Gantt - button_top_menu_easy_gantt: Projetos diagrama de Gantt - button_use_actual_delay: Use atraso real - easy_gantt: - button: - close_all: Fechar todos - close_all_parent_issues: Fechar todas tarefas principais - create_baseline: Linhas de base - critical_path: Trajeto crítico - day_zoom: Dias - delayed_project_filter: Filtrar Projetos Adiados - jump_today: Saltar para hoje - load_sample_data: Carregar dados de amostra - month_zoom: Meses - print_fit: Ajustar à página - problem_finder: Problemas - reload: Recarregar (salvar) - remove_delay: Retirar atraso - resource_management: Gestão de recursos - tool_panel: Ferramentas - week_zoom: Semanas - critical_path: - disabled: Desativado - last: Último - last_text: Tarefas que não devem ser adiada - longest: Mais longo - longest_text: Mostrar sequência mais longa - errors: - duplicate_link: Não é possível duplicar link - fresh_milestone: Não é possível adicionar tarefa a marcos não-salvos. Primeiro - salve o marco. - link_target_new: Não é possível criar tarefas não salvas. Salve as mudanças - primeiro. - link_target_readonly: Tarefa alvo somente para leitura - loop_link: Não é possível criar link em repetição - no_rest_api: Diagrama de Easy Gantt precisa de REST API ativado. Ligar em Administração - ->Configurações -> API -> Habilitar serviço web REST - overdue: deve terminar no futuro ou já deve estar fechado - overmile: Deve terminar em %{effective_date} a fim de manter o marco - short_delay: deve ser mais longo que %{diff} dias - too_short: Não contém suficiente dias para %{rest} horas de tempo estimado - unsaved_parent: Não é possível adicionar tarefa ao principal não-salvos. Primeiro - salvar as alterações. - unsupported_link_type: Tipo de link não assistido - gateway: - entity_save_failed: "%{entityType} %{entityName} falha ao salvar devido a erro" - send_failed: Falha na solicitação - label_pro_upgrade: Atualizar para a versão PRO - link_dir: - link_end: como precedendo - link_start: como a seguir - popup: - add_task: - heading: Adicionar recurso tarefa - text: Novo recurso tarefa/marco está disponível apenas em Easy Gantt PRO <a - href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro">Check for update!</a> - baseline: - heading: Caracteristica de linhas de base - text: Caracteristica de linhas de base está disponível em Easy Gantt PRO <a - href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro">Verifique se - há atualização!</a> - critical: - heading: Caracteristica de trajeto crítico - text: Recurso de trajeto crítico somente está disponível em Easy Gantt PRO - <a href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro">Verificar - se há atualização!</a> - resource: - easy_text: Plugin gerente de recursos não está instalado - obter plugin <a - href="https://www.easyredmine.com/pricing-buy">aqui!</a> - heading: Recurso gerente de recursos - text: Recurso gerente de recursos só está disponível em <a href="https://www.easyredmine.com/"> - Easy Redmine</a> - reload_modal: - label_errors: Erros - text_reload_appeal: Você quer ignorar itens que não foram salvos e recarregar - os dados do servidor? - title: Gantt não salvou corretamente - sample_global_free: - text: Dados de amostra não podem ser fechados. Projetos gerais Gantt só estão - disponíveis na versão PRO - video: - text: Aqui você pode ver a maioria das características de projetos gerais - Gantt - title: Video de amostra de projetos gerais Gantt - video_id: EiiqBrrY4m4 - sample: - close_label: Fechar a janela e carregar os dados reais de projeto - header: Os dados da amostra estão carregados! - text: Nós preparamos alguns exemplos de dados para você <strong> experimentar - todos os recursos Easy Gantt sem estresse </strong>. Nós também queremos encorajá-lo - a assistir a um vídeo gia mostrando ajustes úteis. Ao fechar esta janela irá - carregar os dados de projeto real. - video_label: Assistir video tutorial - video: - text: Aqui você pode ver a maioria das funcionalidades deste módulo Gantt - title: Video exemplo - video_id: UHgqfsrD59Q - text_blocker_milestone: Marco está bloqueando tarefa a ser deslocado para além - desta data - text_blocker_move_pre: Tarefa tem relação que bloqueia mover tarefa para além - desta data - title: - button_test: Botão de teste (somente para teste) - day_zoom: Aumentar a escala de dia - jump_today: Exibir linha do tempo em hoje - month_zoom: Fazer zoom a escala mês - print_fit: Escale o Gantt para uma página - week_zoom: Fazer zoom a escala semana - easy_printable_templates_categories: - easy_gantt: Easy Gantt - easy_query: - name: - easy_gantt_easy_issue_query: Easy Gantt - easy_gantt_easy_project_query: Easy Gantt Global - error_easy_gantt_view_permission: Você não tem permissão para visualizar o Easy - Gantt - error_epm_easy_gantt_already_active: Easy Gantt na página já está ativado. - field_easy_gantt_default_zoom: Padrão de zoom - field_easy_gantt_relation_delay_in_workdays: Relação atrasos nos dias úteis - field_easy_gantt_show_holidays: Mostrar férias - field_easy_gantt_show_project_progress: Mostrar progresso do projeto - field_easy_gantt_show_task_soonest_start: Mostrar início mais breve - field_keep_link_delay_in_drag: Constante atraso de conexão durante o arrasto - field_relation: Relação - heading_delay_popup: Definir atraso em dias - heading_demo_feature_popup: Em breve - heading_easy_gantts_issues: Easy Gantt grátis - label_easy_gantt: Easy Gantt - label_easy_gantt_critical_path: Trajeto crítico - label_easy_gantt_settings: Configurações Gantt - label_filter_group_easy_gantt_easy_issue_query: Campos de tarefas - label_finish_to_finish: Final ao final - label_parent_issue_plural: Problemas principais - label_start_to_finish: Início ao final - label_start_to_start: Início ao início - link_easy_gantt_plugin: https://www.easyredmine.com/easy-gantt-upgrade-to-pro - permission_edit_easy_gantt: Editar Easy Gantt & Gestão de recursos em um projeto - permission_edit_global_easy_gantt: Editar Easy Gantt & Gestão de recursos - permission_edit_personal_easy_gantt: Editar Easy Gant pessoal & Gestão de recursos - permission_view_easy_gantt: Visualizar Easy Gantt & Gestão de recursos em um projeto - permission_view_global_easy_gantt: Visualizar Easy Gantt global & Gestão de recursos - permission_view_personal_easy_gantt: Visualizar Easy Gant geral & Gestão de recursos - project_default_page: - easy_gantt: Easy Gantt - project_module_easy_gantt: Easy Gantt - text_demo_feature_popup: Esta funcionalidade estará disponível em breve. - text_easy_gantt_footer: Redmine Gantt distribuído por Easy - text_easy_gantt_keep_link_delay_in_drag: Manter atraso de relação constante enquanto - a tarefa é arrastado de volta - text_easy_gantt_print_easy_gantt_current: Mostrar Easy Gantt atual (somente funciona - a partir da página onde o Easy Gantt for carregado) - text_easy_gantt_relation_delay_in_workdays: Não contar os dias não úteis em relação - ao atraso - text_easy_gantt_show_holidays: Mostrar férias atuais de usuário em Gantt (funciona - em Easy Redmine) - text_easy_gantt_show_project_progress: Mostrar porcentagem completa na barra do - projeto (pode ser lento para carregar) - text_easy_gantt_show_task_soonest_start: Mostrar datas válidas mais baixas para - as tarefas definidas por equações ou principal - title_easy_gantt_settings: Easy Gantt diff --git a/plugins/easy_gantt/config/locales/pt.yml b/plugins/easy_gantt/config/locales/pt.yml deleted file mode 100644 index e40c4851af3aac216594db949527057b830ec1cf..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/pt.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -pt: diff --git a/plugins/easy_gantt/config/locales/ro.yml b/plugins/easy_gantt/config/locales/ro.yml deleted file mode 100644 index 583d9e1cebe676ea3c2bc4686b372a9e27014081..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/ro.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -ro: - button_print: Imprimare - button_project_menu_easy_gantt: Gantt Simplu - button_top_menu_easy_gantt: Proiecte Gantt - easy_gantt: - button: - close_all_parent_issues: Închide toate sarcinile sursă - day_zoom: Zile - jump_today: Sari la azi - month_zoom: Luni - reload: Reincarca (salveaza) - tool_panel: Instrumente - week_zoom: Săptămani - field_easy_gantt_default_zoom: Zoom implicit - field_easy_gantt_show_holidays: Arată vacanţe - field_easy_gantt_show_project_progress: Arată progresul proiectului - field_relation: Relaţie - label_easy_gantt: Gantt Simplu diff --git a/plugins/easy_gantt/config/locales/ru.yml b/plugins/easy_gantt/config/locales/ru.yml deleted file mode 100644 index 894d4b7009aa7c41499bd158ca9ab534e1e63227..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/ru.yml +++ /dev/null @@ -1,186 +0,0 @@ ---- -ru: - button_print: Печать - button_project_menu_easy_gantt: Диаграмма Ганта Easy - button_top_menu_easy_gantt: Диаграмма Ганта - button_use_actual_delay: Использовать фактическую задержку - easy_gantt_toolbar: - day: Дни - month: Месяцы - week: Недели - easy_gantt: - buton_create_baseline: Базовый план - button_critical_path: Критический путь - button_resource_management: Управление персоналом - button: - close_all: Закрыть все - close_all_parent_issues: Закрыть все родительские задачи - create_baseline: Базовый план - critical_path: Критический путь - day_zoom: Дни - delayed_project_filter: Фильтр Просроченные Проекты - jump_today: Сегодня - load_sample_data: Загрузить демо-данные - month_zoom: Месяцы - print_fit: Подогнать - problem_finder: Ошибки - reload: Перезагрузить (сохранить) - remove_delay: Удалить задержку - resource_management: Управление персоналом - tool_panel: Инструменты - week_zoom: Недели - critical_path: - disabled: Отключен - last: Короткий - last_text: Первоочередные задачи - longest: Длинный - longest_text: Самая длинная последовательность задач - error_overmile: Дата выполнения задачи должна находиться до даты Вехи (Версии) - error_too_short: Залача слишком короткая для рассчета запланированного времени - errors: - duplicate_link: Нельзя создать двойную ссылку - fresh_milestone: Нельзя добавить задачу к несохраненной вехе. Сначала сохраните - веху. - link_target_new: Нельзя добавить связь к несохраненной задаче. Сохраните изменения. - link_target_readonly: Задача доступна только для чтения - loop_link: Невозможно создать цикличную связь - no_rest_api: Для работы Easy Gantt требуется REST API. Перейдите в Администрирование-> - Настройки -> API -> Включить веб-сервис REST - overdue: должна заканчиваться в будущем или должна быть уже закрыта - overmile: Дата выполнения задачи должна находиться до даты Вехи (Версии) - short_delay: должна быть длиннее на %{diff} дней - too_short: недостаточно дней для %{rest} часов запланированного времени - unsaved_parent: Невозможно добавить задачу к несохраненной родительской задаче. - Пожалуйста, сохраните сначала родительскую задачу. - unsupported_link_type: Данный тип связи не поддерживатеся - gateway: - entity_save_failed: "%{entityType} %{entityName} не удалось сохранить из-за - ошибки" - send_failed: Ошибка запроса - label_pro_upgrade: Обновление до PRO-версии - link_dir: - link_end: предшествует - link_start: следует за - popup: - add_task: - heading: Функция "Добавить задачу" - text: "Новая задача/веха доступна только в Easy Gantt PRO \r\n<a href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Check - for update!</a>" - baseline: - heading: Функция "Базовый план" - text: "Базовый план доступен только в Easy Gantt PRO \r\n<a href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Check - for update!</a>" - critical: - heading: Фунция - Критический путь - text: "Критический путь доступен только в Easy Гант PRO \r\n<a href=\"https://www.easyredmine.com/easy-gantt-upgrade-to-pro\">Проверьте - обновления!</a>" - resource: - easy_text: Плагин Resource management не установлен - <a href="https://www.easyredmine.com/pricing-buy">Перейдите!</a> - heading: Функция управления персоналом - text: Resource management доступен только в <a href="https://www.easyredmine.com/"> - Easy Redmine</a> - reload_modal: - label_errors: Ошибки - text_reload_appeal: Вы действительно хотите не сохранить элементы и перезагрузить - данные с сервера? - title: Не удалось правильно сохранить Гант - sample_global_free: - text: Демо-данные не могут быть удалены. Гант для всех проектов доступен только - в PRO версии. - video: - text: Здесть вы можете увидеть большинство возможностей Ганта для всех проектов - title: Видео-демонстрация возможностей Ганта для всех проектов. - video_id: EiiqBrrY4m4 - sample: - close_label: Закройте данное окно и загрузите реальные данные по проекту. - header: Демо-данные загружены! - text: Мы подготовили специально демо-данные - <strong>попробуйте все возможности - Easy Гант без ущерба для Вас!</strong>. Мы также предлагаем вам просмотреть - видео-инструкцию, показывающее особенности работы. При закрытии данного окна - будут загружены реальные данные по проекту. - video_label: Смотреть видео-инструкцию - video: - text: Здесь вы можете ознакомиться с большинством функций модуля Ганта. - title: Демо-видео - video_id: UHgqfsrD59Q - soon: - add_task: - heading: Функция Дабавить задачу - text: Эта функция скоро появится в продукции. <a href="https://www.easyredmine.com/redmine-gantt-plugin">Проверить - доступность!</a> - baseline: - heading: Функция Базовый План - text: Функция "Базовый План" скоро появится в продукции. <a href="https://www.easyredmine.com/redmine-gantt-plugin>Проверить - доступность!</a> - critical: - heading: Функция Критический Путь - text: "Функция Критический путь скоро появится в продукции.\r\n<a href=\"https://www.easyredmine.com/redmine-gantt-plugin\">Проверить - доступность!</a>" - resource: - heading: Функция Управление Персоналом - text: Функция Управление Персоналом доступна только в <a href="https://www.easyredmine.com/"> - Easy Redmine</a> - text_blocker_milestone: Веха блокирует перемещение задачи вне данной даты - text_blocker_move_pre: У данной задачи есть связь, которая не позволяет передвинуть - ее вне этой даты - title: - button_test: Тест (только для тестирования) - day_zoom: Отображение временной шкалы по дням - jump_today: Показать на графике сегодня - month_zoom: Отображение временной шкалы по месяцам - print_fit: Вписать диаграмму в страницу - week_zoom: Отображение временной шкалы по неделям - easy_printable_templates_categories: - easy_gantt: Диаграмма Ганта Easy - easy_query: - name: - easy_gantt_easy_issue_query: Easy Гант - easy_gantt_easy_project_query: Глобальный Easy Гант - error_easy_gantt_view_permission: У вас нет доступа для просмотра Easy Gantt - error_epm_easy_gantt_already_active: Easy Гант уже присутствует на этой странице - field_easy_gantt_default_zoom: Масштаб по умолчанию - field_easy_gantt_relation_delay_in_workdays: Задержка в рабочих днях - field_easy_gantt_show_holidays: Показать нерабочие дни - field_easy_gantt_show_project_progress: Показать прогресс проекта - field_easy_gantt_show_task_soonest_start: Показать скорейшее начало - field_keep_link_delay_in_drag: Сохранять задержку при перемещении - field_relation: Связь - heading_delay_popup: Задать задержку (в днях) - heading_demo_feature_popup: Скоро в продукции - heading_easy_gantts_issues: Гант по задачам - label_easy_gantt: Easy Гант - label_easy_gantt_critical_path: Критический путь - label_easy_gantt_settings: Настройки Ганта - label_filter_group_easy_gantt_easy_issue_query: Поля задачи - label_finish_to_finish: Финиш --> Финиш - label_parent_issue_plural: Родительские задачи - label_start_to_finish: Начало-Окончание - label_start_to_start: Старт --> Старт - link_easy_gantt_footer: https://www.easyredmine.com/redmine-gantt-plugin - link_easy_gantt_plugin: https://www.easyredmine.com/easy-gantt-upgrade-to-pro - permission_edit_easy_gantt: Редактировать Easy Гант & Resource management на проекте - permission_edit_global_easy_gantt: Редактировать глобальный Easy Гант & Resource - management - permission_edit_personal_easy_gantt: Реадактировать персональный Easy Gantt & Resource - management - permission_view_easy_gantt: Отображать Easy Гант & Resource management на проекте - permission_view_global_easy_gantt: Отображать глобальный Easy Гант & Resource management - permission_view_personal_easy_gantt: Отображать персональный Easy Гант & Resource - management - project_default_page: - easy_gantt: Easy Гант - project_module_easy_gantt: Easy Гант - text_demo_feature_popup: Эта функия будет скоро доступна - text_easy_gantt_footer: Redmine Гант от Easy - text_easy_gantt_keep_link_delay_in_drag: Сохранять постоянную задержку при перетаскивании - задачи назад - text_easy_gantt_print_easy_gantt_current: Показать текущую диаграмму (только для - страниц с модулем Easy Gantt) - text_easy_gantt_relation_delay_in_workdays: Не учитывать нерабочие дни при запаздывании - text_easy_gantt_show_holidays: Показать выходные на Ганте (работают только в Easy - Redmine) - text_easy_gantt_show_project_progress: Показать процент выполнения на диаграмме - (может потребовать дополнительного времени) - text_easy_gantt_show_task_soonest_start: Показать минимально допустимые даты для - связанных задач или подзадач - title_easy_gantt_settings: Easy Гант diff --git a/plugins/easy_gantt/config/locales/sk.yml b/plugins/easy_gantt/config/locales/sk.yml deleted file mode 100644 index 354e579f4c849b3d5e6f02dbb1142251de534b0f..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/sk.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -sk: diff --git a/plugins/easy_gantt/config/locales/sl.yml b/plugins/easy_gantt/config/locales/sl.yml deleted file mode 100644 index 31bb26cc3f5eecb9e78c89d8ee46f4f7c6d93bd3..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/sl.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -sl: diff --git a/plugins/easy_gantt/config/locales/sq.yml b/plugins/easy_gantt/config/locales/sq.yml deleted file mode 100644 index 9c092f0a65e3c87d0e93a80f699335ac29e94852..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/sq.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -sq: diff --git a/plugins/easy_gantt/config/locales/sr-YU.yml b/plugins/easy_gantt/config/locales/sr-YU.yml deleted file mode 100644 index 24e179627aca2606c215e215a21b980ce59dfb96..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/sr-YU.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -sr-YU: diff --git a/plugins/easy_gantt/config/locales/sr.yml b/plugins/easy_gantt/config/locales/sr.yml deleted file mode 100644 index 43a10141ba3e960e043e9dda2aa7785a8ef3da4b..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/sr.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -sr: diff --git a/plugins/easy_gantt/config/locales/sv.yml b/plugins/easy_gantt/config/locales/sv.yml deleted file mode 100644 index ed425eabde8cdb1194378aac15a95f05cb156df7..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/sv.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -sv: diff --git a/plugins/easy_gantt/config/locales/th.yml b/plugins/easy_gantt/config/locales/th.yml deleted file mode 100644 index 35969140c57bbc57ca621c97098aa6ba6fff96dc..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/th.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -th: diff --git a/plugins/easy_gantt/config/locales/tr.yml b/plugins/easy_gantt/config/locales/tr.yml deleted file mode 100644 index 3be79e79e8e62a69dcbe1e94764bb4f52a409ff4..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/tr.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -tr: diff --git a/plugins/easy_gantt/config/locales/zh-TW.yml b/plugins/easy_gantt/config/locales/zh-TW.yml deleted file mode 100644 index 44cf0f8d49e34cec16d3ed63ef44e1699d8b9b7f..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/zh-TW.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -zh-TW: diff --git a/plugins/easy_gantt/config/locales/zh.yml b/plugins/easy_gantt/config/locales/zh.yml deleted file mode 100644 index 80524439b6a0221bdb7fa42e858baa379b9b83cc..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/locales/zh.yml +++ /dev/null @@ -1,140 +0,0 @@ ---- -zh: - button_print: 打印 - button_project_menu_easy_gantt: Easy Gantt - button_top_menu_easy_gantt: 项目甘特图 - button_use_actual_delay: 采用实际延迟时间 - easy_gantt: - button: - close_all: 关闭全部 - close_all_parent_issues: 关闭所有上一级任务 - create_baseline: 原始时间线 - critical_path: 关键路径 - day_zoom: 天 - delayed_project_filter: 筛选延误的项目 - jump_today: 转到今天 - load_sample_data: 载入示例数据 - month_zoom: 月 - print_fit: 适应页面大小 - problem_finder: 问题 - reload: 保存 - remove_delay: 删除延误 - resource_management: 资源管理 - tool_panel: 工具栏 - week_zoom: 周 - critical_path: - disabled: 禁用 - last: 最近的 - last_text: 任务不能推迟 - longest: 最长 - longest_text: 显示最长的任务队列 - errors: - duplicate_link: 不能创建重复的连接 - fresh_milestone: 不能给未保存的里程碑添加任务, 请先保存里程碑 - link_target_new: 不能为未保存任务创建连接, 请先保存任务 - link_target_readonly: 只读的目标任务 - loop_link: 不能创建循环的连接 - no_rest_api: Easy Gantt需要将REST API开启. 请在管理(Administration)->设置 -> API-> 开启REST网络服务中进行设置. - overdue: 结束日该是将来的日期, 或者应该是已经完成了. - overmile: 必须在 %{effective_date}结束, 以达到里程碑进度要求 - short_delay: 应当增加 %{diff} 天 - too_short: 预计要%{rest} 小时, 所给天数不够. - unsaved_parent: 上一级任务未保存, 不能在其下添加任务. 请先保存 - unsupported_link_type: 不支持的连接类型 - gateway: - entity_save_failed: "%{entityType} %{entityName}保存失败" - send_failed: 请求失败 - label_pro_upgrade: 升级到专业版 - link_dir: - link_end: 同上一次 - link_start: 同下一个 - popup: - add_task: - heading: 添加任务属性 - text: 新任务/里程碑的特性只有有 Easy Gantt PRO(专业版)内可用. 访问 <a href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro">进行更新!</a> - baseline: - heading: Baseline的属性 - text: 原始时间线(Baseline)功能仅在Easy Gantt 专业版中可用 <a href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro">检查更新!</a> - critical: - heading: 关键路径(Path)的属性 - text: 关键路径的属性只有在Easy Gantt 专业版内可用. 访问<a href="https://www.easyredmine.com/easy-gantt-upgrade-to-pro">进行更新!</a> - - resource: - easy_text: 没有安装资源管理插件- 请从<a href="https://www.easyredmine.com/pricing-buy">这里!</a> - 下载 - heading: 资源管理器的属性 - text: 资源管理器的属性只在 <a href="https://www.easyredmine.com/"> Easy Redmine</a> - 中可用 - reload_modal: - label_errors: 错误 - text_reload_appeal: 忽略未保存数据, 重新从服务器下载数据? - title: Gantt图没有保存成功 - sample_global_free: - text: 不能关闭示例数据. 所有项目的Gantt只有在专业版中可用. - video: - text: 在这里可以查看所有项目的甘特图Gantt的属性 - title: 所有项目的Gantt示例视频 - video_id: EiiqBrrY4m4 - sample: - close_label: 关闭窗口, 并下载真正的项目数据 - header: 示例数据下载完成 - text: 查看一些示例数据来<strong>轻松了解Easy Gantt的特性</strong>. 也可以观看演示视频来进一步提高, 关闭窗口将下载真正的项目数据. - video_label: 观看视频教程 - video: - text: 在这里可以了解Gantt模块的大部份特性 - title: 示例视频 - video_id: UHgqfsrD59Q - text_blocker_milestone: 里程碑不允许该任务移到此日期之后 - text_blocker_move_pre: 由于一些关系的限制, 该任务不能移到此日期之后 - title: - button_test: 测试按钮(仅作测试用) - day_zoom: 放大到按天显示 - jump_today: 显示今天的时间安排 - month_zoom: 按月度显示 - print_fit: 缩放甘特图到一页大小 - week_zoom: 按周显示 - easy_printable_templates_categories: - easy_gantt: Easy 甘特图 - easy_query: - name: - easy_gantt_easy_issue_query: Easy Gantt - easy_gantt_easy_project_query: '' - error_easy_gantt_view_permission: 你没有查看Easy 甘特图的权限 - error_epm_easy_gantt_already_active: 本页内的Easy gantt 已经生效! - field_easy_gantt_default_zoom: 默认时间单位 - field_easy_gantt_relation_delay_in_workdays: 工作日内延期关系 - field_easy_gantt_show_holidays: 显示假日 - field_easy_gantt_show_project_progress: 显示项目进度 - field_easy_gantt_show_task_soonest_start: 显示最近的开始时间 - field_keep_link_delay_in_drag: 拖放时使用固定时间延迟 - field_relation: 关系 - heading_delay_popup: 设置延迟天数 - heading_demo_feature_popup: 马上就绪 - heading_easy_gantts_issues: Easy Gantt Free - label_easy_gantt: Easy Gantt - label_easy_gantt_critical_path: 关键路径 - label_easy_gantt_settings: Easy Gantt 设置 - label_filter_group_easy_gantt_easy_issue_query: 任务 - label_finish_to_finish: 以最后结束 - label_parent_issue_plural: 上一级的问题 - label_start_to_finish: 从结尾开始 - label_start_to_start: 从头开始 - link_easy_gantt_plugin: https://www.easyredmine.com/easy-gantt-upgrade-to-pro - permission_edit_easy_gantt: 编辑项目中的Easy Gantt和资源管理 - permission_edit_global_easy_gantt: 编辑通用Easy Gantt 和资源管理 - permission_edit_personal_easy_gantt: 编辑个人定制 Easy Gantt & Resource management - permission_view_easy_gantt: 查看项目中的Easy Gantt和资源管理 - permission_view_global_easy_gantt: 查看通用的 Easy Gantt 和资源管理 - permission_view_personal_easy_gantt: 查看个人定制Easy Gantt & Resource management - project_default_page: - easy_gantt: Easy Gantt - project_module_easy_gantt: Easy Gantt - text_demo_feature_popup: 该特性将很快生效 - text_easy_gantt_footer: 由Easy开发的 Redmine Gantt - text_easy_gantt_keep_link_delay_in_drag: 将任务拖放回来时, 保持原有的关系和延误情况 - text_easy_gantt_print_easy_gantt_current: 显示当前的Easy 甘特图(只有在已载入Easy 甘特图的页面有效) - text_easy_gantt_relation_delay_in_workdays: 在相关延误天数计算时, 不要计入非工作日 - text_easy_gantt_show_holidays: 在Gantt上显示当前用户的假日安排(仅在Easy Redmine上可用) - text_easy_gantt_show_project_progress: 在项目进度条上显示完成比例(可能导致加载较慢) - text_easy_gantt_show_task_soonest_start: 显示由关系或其前提决定的任务的最近有效日期 - title_easy_gantt_settings: Easy Gantt diff --git a/plugins/easy_gantt/config/routes.rb b/plugins/easy_gantt/config/routes.rb deleted file mode 100644 index 9f1d9f154b78a87633e5318f3995ee1cfa9fae2e..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/config/routes.rb +++ /dev/null @@ -1,13 +0,0 @@ -# Because of plugin deactivations -if Redmine::Plugin.installed?(:easy_gantt) - get '(projects/:project_id)/easy_gantt' => 'easy_gantt#index', as: 'easy_gantt' - - scope format: true, defaults: { format: 'json' }, constraints: { format: 'json' } do - scope 'projects/:project_id' do - get 'easy_gantt/issues' => 'easy_gantt#issues', as: 'issues_easy_gantt' - put 'easy_gantt/relation/:id' => 'easy_gantt#change_issue_relation_delay', as: 'relation_easy_gantt' - get 'easy_gantt/project_issues' => 'easy_gantt#project_issues', as: 'project_issues_easy_gantt' - end - get 'easy_gantt/projects' => 'easy_gantt#projects', as: 'projects_easy_gantt' - end -end diff --git a/plugins/easy_gantt/db/migrate/20170213152215_add_default_printable_template.rb b/plugins/easy_gantt/db/migrate/20170213152215_add_default_printable_template.rb deleted file mode 100644 index c4231c876dfbbbd46ade5b19b1e70f573b21d7c8..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/db/migrate/20170213152215_add_default_printable_template.rb +++ /dev/null @@ -1,27 +0,0 @@ -require 'easy_gantt/easy_gantt' - -class AddDefaultPrintableTemplate < RedmineExtensions::Migration - - def up - return unless EasyGantt.easy_printable_templates? - - plugin = Redmine::Plugin.find('easy_gantt') - path = File.join(plugin.directory, 'app', 'views', 'easy_gantt', 'printable_templates', 'default.html') - - EasyPrintableTemplate.create_from_view!( - { - 'name' => 'Easy Gantt (default)' , - 'pages_orientation' => 'landscape', - 'pages_size' => 'a4', - 'category' => 'easy_gantt', - }, - { template_path: path }) - end - - def down - return unless EasyGantt.easy_printable_templates? - - EasyPrintableTemplate.where(category: 'easy_gantt').destroy_all - end - -end diff --git a/plugins/easy_gantt/db/migrate/20170224134615_update_rest_api_settings.rb b/plugins/easy_gantt/db/migrate/20170224134615_update_rest_api_settings.rb deleted file mode 100644 index ef36a0d32da4b0364c77909cd7b71cdafe3b6131..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/db/migrate/20170224134615_update_rest_api_settings.rb +++ /dev/null @@ -1,10 +0,0 @@ -class UpdateRestApiSettings < RedmineExtensions::Migration - - def up - Setting.where(name: 'rest_api_enabled').update_all(value: '1') - end - - def down - end - -end diff --git a/plugins/easy_gantt/init.rb b/plugins/easy_gantt/init.rb deleted file mode 100644 index 4df379494920d7f5c759a02a0d18945a29ef3eb3..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/init.rb +++ /dev/null @@ -1,25 +0,0 @@ -Redmine::Plugin.register :easy_gantt do - name 'Easy Gantt plugin' - author 'Easy Software Ltd' - description 'Cool gantt for redmine' - version '1.13' - url 'www.easyredmine.com' - author_url 'www.easysoftware.cz' - - requires_redmine version_or_higher: '3.2' - - settings partial: 'easy_gantt_nil', only_easy: true, easy_settings: { - show_holidays: false, - show_project_progress: true, - critical_path: 'last', - default_zoom: 'day', - show_lowest_progress_tasks: false, - show_task_soonest_start: false, - relation_delay_in_workdays: false, - fixed_delay: false - } -end - -unless Redmine::Plugin.installed?(:easy_extensions) - require_relative 'after_init' -end diff --git a/plugins/easy_gantt/lib/easy_gantt/easy_gantt.rb b/plugins/easy_gantt/lib/easy_gantt/easy_gantt.rb deleted file mode 100644 index 478e99429fd5eb4c46b637fda453b52eec41eb15..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/lib/easy_gantt/easy_gantt.rb +++ /dev/null @@ -1,78 +0,0 @@ -module EasyGantt - - def self.non_working_week_days(user=nil) - if user.is_a?(Integer) - user = Principal.find_by(id: user) - elsif user.nil? - user = User.current - end - - working_days = user.try(:current_working_time_calendar).try(:working_week_days) - working_days = Array(working_days).map(&:to_i) - - if working_days.any? - (1..7).to_a - working_days - else - Array(Setting.non_working_week_days).map(&:to_i) - end - end - - # Experimental function - def self.load_fixed_delay? - false - end - - def self.easy_extensions? - Redmine::Plugin.installed?(:easy_extensions) - end - - def self.easy_project_com? - Redmine::Plugin.installed?(:easy_project_com) - end - - def self.easy_calendar? - Redmine::Plugin.installed?(:easy_calendar) - end - - def self.easy_attendances? - easy_extensions? && Redmine::Plugin.installed?(:easy_attendances) && EasyAttendance.enabled? - end - - def self.easy_money? - Redmine::Plugin.installed?(:easy_money) - end - - def self.easy_gantt_pro? - Redmine::Plugin.installed?(:easy_gantt_pro) - end - - def self.easy_gantt_resources? - Redmine::Plugin.installed?(:easy_gantt_resources) - end - - def self.easy_baseline? - Redmine::Plugin.installed?(:easy_baseline) - end - - def self.easy_printable_templates? - Redmine::Plugin.installed?(:easy_printable_templates) - end - - def self.combine_by_pipeline?(params) - return false unless easy_extensions? - return params[:combine_by_pipeline].to_s.to_boolean if params.key?(:combine_by_pipeline) - Rails.env.production? - end - - def self.platform - case - when easy_project_com? - 'easyproject' - when easy_extensions? - 'easyredmine' - else - 'redmine' - end - end - -end diff --git a/plugins/easy_gantt/lib/easy_gantt/hooks.rb b/plugins/easy_gantt/lib/easy_gantt/hooks.rb deleted file mode 100644 index 529daa970a3926b010250d64991a670ee9270c9a..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/lib/easy_gantt/hooks.rb +++ /dev/null @@ -1,15 +0,0 @@ -module EasyGantt - class Hooks < Redmine::Hook::ViewListener - - def helper_options_for_default_project_page(context={}) - context[:default_pages] << 'easy_gantt' if context[:enabled_modules].include?('easy_gantt') - end - - def view_easy_printable_templates_token_list_bottom(**context) - if context[:section] == :plugins - context[:hook_caller].render('easy_gantt/printable_templates/token_list', context) - end - end - - end -end diff --git a/plugins/easy_gantt/lib/easy_gantt/redmine_patch/controllers/queries_controller_patch.rb b/plugins/easy_gantt/lib/easy_gantt/redmine_patch/controllers/queries_controller_patch.rb deleted file mode 100644 index 9cb0cf98144e9d81f767ce3ed6e67ebf12ff8e78..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/lib/easy_gantt/redmine_patch/controllers/queries_controller_patch.rb +++ /dev/null @@ -1,26 +0,0 @@ -module EasyGantt - module QueriesControllerPatch - - def self.included(base) - base.prepend(InstanceMethods) - end - - module InstanceMethods - - # Redmine return only direct sublasses but - # Gantt query inherit from IssueQuery - def query_class - case params[:type] - when 'EasyGantt::EasyGanttIssueQuery' - EasyGantt::EasyGanttIssueQuery - else - super - end - end - - end - - end -end - -RedmineExtensions::PatchManager.register_controller_patch 'QueriesController', 'EasyGantt::QueriesControllerPatch' diff --git a/plugins/easy_gantt/lib/easy_gantt/redmine_patch/helpers/application_helper_patch.rb b/plugins/easy_gantt/lib/easy_gantt/redmine_patch/helpers/application_helper_patch.rb deleted file mode 100644 index 22e00b3d6bdfedc8815ca196419154a36c129025..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/lib/easy_gantt/redmine_patch/helpers/application_helper_patch.rb +++ /dev/null @@ -1,17 +0,0 @@ -module EasyGantt - module ApplicationHelperPatch - - def self.included(base) - base.class_eval do - - def link_to_project_with_easy_gantt(project, options = {}) - { controller: 'easy_gantt', action: 'index', project_id: project } - end - - end - end - - end -end - -RedmineExtensions::PatchManager.register_helper_patch 'ApplicationHelper', 'EasyGantt::ApplicationHelperPatch' diff --git a/plugins/easy_gantt/lib/easy_gantt/redmine_patch/models/issue_patch.rb b/plugins/easy_gantt/lib/easy_gantt/redmine_patch/models/issue_patch.rb deleted file mode 100644 index 283b0354ef668ca3ee7469acb7c607a38f3db8b7..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/lib/easy_gantt/redmine_patch/models/issue_patch.rb +++ /dev/null @@ -1,49 +0,0 @@ -module EasyGantt - module IssuePatch - - def self.included(base) - base.send(:include, InstanceMethods) - - base.class_eval do - - scope :gantt_opened, lambda { - joins(:status).where(IssueStatus.table_name => { is_closed: false }) - } - - end - end - - module InstanceMethods - - def gantt_editable?(user=nil) - user ||= User.current - - (user.allowed_to?(:edit_easy_gantt, project) || - user.allowed_to_globally?(:edit_global_easy_gantt) || - (assigned_to_id == user.id && - user.allowed_to_globally?(:edit_personal_easy_gantt))) && - user.allowed_to?(:manage_issue_relations, project) && - user.allowed_to?(:edit_issues, project) - end - - def gantt_latest_due - if @gantt_latest_due.nil? - dates = relations_from.map{|relation| relation.gantt_previous_latest_start } - - p = @parent_issue || parent - if p && Setting.parent_issue_dates == 'derived' - dates << p.gantt_latest_due - end - - @gantt_latest_due = dates.compact.max - end - - @gantt_latest_due - end - - end - - end -end - -RedmineExtensions::PatchManager.register_model_patch 'Issue', 'EasyGantt::IssuePatch' diff --git a/plugins/easy_gantt/lib/easy_gantt/redmine_patch/models/issue_relation_patch.rb b/plugins/easy_gantt/lib/easy_gantt/redmine_patch/models/issue_relation_patch.rb deleted file mode 100644 index 25d123b19e90298bed2dcaa80260c97b2cfb9a44..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/lib/easy_gantt/redmine_patch/models/issue_relation_patch.rb +++ /dev/null @@ -1,70 +0,0 @@ -# -# THIS FILE MUST BE LOADED BEFORE IssueQuery OR EasyIssueQuery !!! -# -module EasyGantt - module IssueRelationPatch - - def self.included(base) - base.send(:include, InstanceMethods) - - start_to_start = 'start_to_start' - finish_to_finish = 'finish_to_finish' - start_to_finish = 'start_to_finish' - - new_types = base::TYPES.merge( - - start_to_start => { - name: :label_start_to_start, - sym_name: :label_start_to_start, - order: 20, - sym: start_to_start - }, - - finish_to_finish => { - name: :label_finish_to_finish, - sym_name: :label_finish_to_finish, - order: 21, - sym: finish_to_finish - }, - - start_to_finish => { - name: :label_start_to_finish, - sym_name: :label_start_to_finish, - order: 22, - sym: start_to_finish - } - - ) - - base.class_eval do - const_set :TYPE_START_TO_START, start_to_start - const_set :TYPE_FINISH_TO_FINISH, finish_to_finish - const_set :TYPE_START_TO_FINISH, start_to_finish - - remove_const :TYPES - const_set :TYPES, new_types.freeze - - inclusion_validator = _validators[:relation_type].find{|v| v.kind == :inclusion} - inclusion_validator.instance_variable_set(:@delimiter, new_types.keys) - end - end - - module InstanceMethods - - # +---------+ (5) +---------+ - # | Issue 1 |--------->| Issue 2 | - # +---------+ +---------+ - # (issue_from) (issue_to) - # - def gantt_previous_latest_start - if (IssueRelation::TYPE_PRECEDES == relation_type) && delay && issue_to && (issue_to.start_date || issue_to.due_date) - (issue_to.start_date || issue_to.due_date) - 1 - delay - end - end - - end - - end -end - -IssueRelation.send(:include, EasyGantt::IssueRelationPatch) diff --git a/plugins/easy_gantt/lib/easy_gantt/redmine_patch/models/project_patch.rb b/plugins/easy_gantt/lib/easy_gantt/redmine_patch/models/project_patch.rb deleted file mode 100644 index 36aad1511f92c258f0c3633d80c6bdbea353b03e..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/lib/easy_gantt/redmine_patch/models/project_patch.rb +++ /dev/null @@ -1,189 +0,0 @@ -module EasyGantt - module ProjectPatch - - def self.included(base) - base.extend(ClassMethods) - base.send(:include, InstanceMethods) - - # Patch is also applied before db:migrate so you cannot call - # column_names on non-existed table - if Project.table_exists? && Project.column_names.include?('easy_start_date') && Project.column_names.include?('easy_due_date') - base.send(:include, DatesWithNativeColumns) - end - end - - module InstanceMethods - - def gantt_editable?(user=nil) - user ||= User.current - - (user.allowed_to?(:edit_easy_gantt, self) || - user.allowed_to_globally?(:edit_global_easy_gantt)) && - user.allowed_to?(:edit_project, self) - end - - def gantt_reschedule(days) - transaction do - all_issues = Issue.joins(:project).where(gantt_subprojects_conditions) - all_issues.update_all("start_date = start_date + INTERVAL '#{days}' DAY," + - "due_date = due_date + INTERVAL '#{days}' DAY") - - all_versions = Version.joins(:project).where(gantt_subprojects_conditions) - all_versions.update_all("effective_date = effective_date + INTERVAL '#{days}' DAY") - - Redmine::Hook.call_hook(:model_project_gantt_reschedule, project: project, days: days, all_issues: all_issues) - end - end - - # Weighted completed percent including subprojects - def gantt_completed_percent - return @gantt_completed_percent if @gantt_completed_percent || @gantt_completed_percent_added - - i_table = Issue.table_name - - scope = Issue.where("#{i_table}.estimated_hours IS NOT NULL"). - where("#{i_table}.estimated_hours > 0"). - joins(:project). - where(gantt_subprojects_conditions) - - if scope.exists? - sum = scope.select('(SUM(done_ratio / 100.0 * estimated_hours) / SUM(estimated_hours) * 100) AS sum_alias').reorder(nil).first - @gantt_completed_percent = sum ? sum.sum_alias.to_f : 0.0 - else - @gantt_completed_percent = 100.0 - end - - @gantt_completed_percent - end - - def gantt_start_date - return @gantt_start_date if @gantt_start_date || @gantt_start_date_added - - @gantt_start_date = [ - Issue.joins(:project).where(gantt_subprojects_conditions).minimum('start_date'), - Version.joins(:project).where(gantt_subprojects_conditions).minimum('effective_date') - ].compact.min - end - - def gantt_due_date - return @gantt_due_date if @gantt_due_date || @gantt_due_date_added - - @gantt_due_date = [ - Issue.joins(:project).where(gantt_subprojects_conditions).maximum('due_date'), - Version.joins(:project).where(gantt_subprojects_conditions).maximum('effective_date') - ].compact.max - end - - def gantt_subprojects_conditions - p_table = Project.table_name - "#{p_table}.status <> #{Project::STATUS_ARCHIVED} AND #{p_table}.lft >= #{lft} AND #{p_table}.rgt <= #{rgt}" - end - - end - - module DatesWithNativeColumns - - def gantt_reschedule(days) - all_projects = Project.where(gantt_subprojects_conditions) - all_projects.update_all("easy_start_date = easy_start_date + INTERVAL '#{days}' DAY," + - "easy_due_date = easy_due_date + INTERVAL '#{days}' DAY") - - super - end - - def gantt_start_date - if EasySetting.value(:project_calculate_start_date) || easy_start_date.nil? - super - else - easy_start_date - end - end - - def gantt_due_date - if EasySetting.value(:project_calculate_due_date) || easy_due_date.nil? - super - else - easy_due_date - end - end - - end - - module ClassMethods - - def load_gantt_dates(projects) - p_table = Project.table_name - i_table = Issue.table_name - v_table = Version.table_name - - project_ids = projects.map(&:id) - - data = [] - data.concat Project.where(id: project_ids). - joins("JOIN #{p_table} p2 ON p2.lft >= #{p_table}.lft AND p2.rgt <= #{p_table}.rgt"). - joins("JOIN #{i_table} i ON i.project_id = p2.id"). - group("#{p_table}.id"). - pluck("#{p_table}.id, MIN(i.start_date), MAX(i.due_date)") - - data.concat Project.where(id: project_ids). - joins("JOIN #{p_table} p2 ON p2.lft >= #{p_table}.lft AND p2.rgt <= #{p_table}.rgt"). - joins("JOIN #{v_table} v ON v.project_id = p2.id"). - group("#{p_table}.id"). - pluck("#{p_table}.id, MIN(v.effective_date), MAX(v.effective_date)") - - result = {} - data.each do |id, min, max| - if result.has_key?(id) - result[id][0] = [result[id][0], min].compact.min - result[id][1] = [result[id][1], max].compact.max - else - result[id] = [min, max] - end - end - - projects.each do |project| - project_data = result[project.id] - - if project_data - project.instance_variable_set :@gantt_start_date, project_data[0] - project.instance_variable_set :@gantt_due_date, project_data[1] - end - - project.instance_variable_set :@gantt_start_date_added, true - project.instance_variable_set :@gantt_due_date_added, true - end - end - - def load_gantt_completed_percent(projects) - p_table = Project.table_name - i_table = Issue.table_name - - project_ids = projects.map(&:id) - result = Project.where(id: project_ids). - joins("JOIN #{p_table} p2 ON p2.lft >= #{p_table}.lft AND p2.rgt <= #{p_table}.rgt"). - joins("JOIN #{i_table} i ON i.project_id = p2.id"). - where("i.estimated_hours IS NOT NULL AND i.estimated_hours > 0"). - where("p2.status <> ?", Project::STATUS_ARCHIVED). - group("#{p_table}.id"). - pluck("#{p_table}.id, (SUM(i.done_ratio / 100.0 * i.estimated_hours) / SUM(i.estimated_hours) * 100)"). - to_h - - projects.each do |project| - done_ratio = result[project.id] - - if done_ratio - project.instance_variable_set :@gantt_completed_percent, done_ratio - else - project.instance_variable_set :@gantt_completed_percent, 100.0 - end - - project.instance_variable_set :@gantt_completed_percent_added, true - end - end - - end - - end -end - -RedmineExtensions::PatchManager.register_model_patch 'Project', 'EasyGantt::ProjectPatch' diff --git a/plugins/easy_gantt/lib/easy_gantt/redmine_patch/models/version_patch.rb b/plugins/easy_gantt/lib/easy_gantt/redmine_patch/models/version_patch.rb deleted file mode 100644 index 2602ca52b83dca022d05c97d43b920a4d775ff53..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/lib/easy_gantt/redmine_patch/models/version_patch.rb +++ /dev/null @@ -1,23 +0,0 @@ -module EasyGantt - module VersionPatch - - def self.included(base) - base.include(InstanceMethods) - end - - module InstanceMethods - - def gantt_editable?(user=nil) - user ||= User.current - - (user.allowed_to?(:edit_easy_gantt, project) || - user.allowed_to_globally?(:edit_global_easy_gantt)) && - user.allowed_to?(:manage_versions, project) - end - - end - - end -end - -RedmineExtensions::PatchManager.register_model_patch 'Version', 'EasyGantt::VersionPatch' diff --git a/plugins/easy_gantt/spec/controllers/easy_gantt_controller_spec.rb b/plugins/easy_gantt/spec/controllers/easy_gantt_controller_spec.rb deleted file mode 100644 index 9e305916354e0a6eec7c10a9b6e801cda7d5574e..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/spec/controllers/easy_gantt_controller_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -require File.expand_path('../../../../easyproject/easy_plugins/easy_extensions/test/spec/spec_helper', __FILE__) - -RSpec.describe EasyGanttController, logged: :admin do - - around(:each) do |example| - with_settings(rest_api_enabled: 1) { example.run } - end - - context 'rest api' do - let(:project) { FactoryGirl.create(:project, add_modules: ['easy_gantt']) } - - it 'disabled' do - with_settings(rest_api_enabled: 0) do - get :index, project_id: project - expect(response).to be_error - - get :index - expect(response).to be_error - end - end - - it 'enabled' do - get :index - expect(response).to be_success - end - end - -end diff --git a/plugins/easy_gantt/spec/features/add_task_spec.rb b/plugins/easy_gantt/spec/features/add_task_spec.rb deleted file mode 100644 index a9d7afd238999dcde9e63275993b4eb01538d5cd..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/spec/features/add_task_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require File.expand_path('../../../../easyproject/easy_plugins/easy_extensions/test/spec/spec_helper', __FILE__) - -RSpec.feature 'Add task', logged: :admin, js: true do - let!(:project) { FactoryGirl.create(:project, add_modules: ['easy_gantt']) } - - around(:each) do |example| - with_settings(rest_api_enabled: 1) { example.run } - end - - describe 'toolbar' do - - unless Redmine::Plugin.installed?(:easy_gantt_pro) - scenario 'should open help' do - visit easy_gantt_path(project) - wait_for_ajax - page.find('.easy-gantt__menu-tools').hover - expect(page).to have_selector('#button_add_task_help', text: I18n.t(:label_new)) - page.find('#button_add_task_help').click - expect(page).to have_selector('#add_task_help_modal_popup') - end - end - - end -end diff --git a/plugins/easy_gantt/spec/features/correct_tree_spec.rb b/plugins/easy_gantt/spec/features/correct_tree_spec.rb deleted file mode 100644 index 9709303902a517d005dfefaa3e65fea64c0de016..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/spec/features/correct_tree_spec.rb +++ /dev/null @@ -1,73 +0,0 @@ -require File.expand_path('../../../../easyproject/easy_plugins/easy_extensions/test/spec/spec_helper', __FILE__) - -RSpec.feature 'Correct tree', logged: :admin, js: true do - let(:project) { - FactoryGirl.create(:project, add_modules: ['easy_gantt'], number_of_issues: 0) - } - let(:sub_project) { - FactoryGirl.create(:project, parent_id: project.id, number_of_issues: 1) - } - let(:project_issues) { - FactoryGirl.create_list(:issue, 3, :project_id => project.id) - } - let(:milestone) { - FactoryGirl.create(:version, project_id: project.id, due_date: Date.today + 7 ) - } - let(:milestone_issues) { - FactoryGirl.create_list(:issue, 3, :fixed_version_id => milestone.id, :project_id => project.id) - } - let(:sub_issues) { - FactoryGirl.create_list(:issue, 3, :parent_issue_id => milestone_issues[0].id, :project_id => project.id) - } - let(:sub_sub_issues) { - FactoryGirl.create_list(:issue, 3, :parent_issue_id => sub_issues[0].id, :project_id => project.id) - } - - around(:each) do |example| - with_settings(rest_api_enabled: 1) { example.run } - end - it 'should show project items in correct order' do - sub_sub_issues - project_issues - sub_project - visit easy_gantt_path(project) - wait_for_ajax - bars_area = page.find('.gantt_grid_data') - # bars_area = page.find('.gantt_bars_area') - order_list = [ - project, - project_issues[0], - project_issues[1], - project_issues[2], - milestone, - milestone_issues[0], - sub_issues[0], - sub_sub_issues[0], - sub_sub_issues[1], - sub_sub_issues[2], - sub_issues[1], - sub_issues[2], - milestone_issues[1], - milestone_issues[2], - sub_project - ] - prev_id = nil - order_list.each do |issue| - if issue.is_a? Project - id = 'p' + issue.id.to_s - name = issue.name - elsif issue.is_a? Version - id = 'm' + issue.id.to_s - name = issue.name - else - id = issue.id - name = issue.subject - end - expect(bars_area).to have_text(name) - unless prev_id.nil? - expect(bars_area.find("div[task_id='#{prev_id}']+div[task_id='#{id}']")).not_to be_nil - end - prev_id = id - end - end -end \ No newline at end of file diff --git a/plugins/easy_gantt/spec/features/easy_gantt_spec.rb b/plugins/easy_gantt/spec/features/easy_gantt_spec.rb deleted file mode 100644 index 1c4c4ec2c102ce0ea6d5e9a7315db8393fef7e4b..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/spec/features/easy_gantt_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require File.expand_path('../../../../easyproject/easy_plugins/easy_extensions/test/spec/spec_helper', __FILE__) - -RSpec.feature 'Easy gantt', js: true, logged: :admin do - let!(:project) { FactoryGirl.create(:project, add_modules: ['easy_gantt']) } - - around(:each) do |example| - with_settings(rest_api_enabled: 1) { example.run } - end - - describe 'show gantt' do - - scenario 'show easy gantt on project' do - visit easy_gantt_path(project) - wait_for_ajax - # unless Redmine::Plugin.installed?(:easy_gantt_pro) - # page.find('#sample_close_button').click - # wait_for_ajax - # end - expect(page).to have_css('#easy_gantt') - expect(page.find('.gantt_grid_data')).to have_content(project.name) - expect(page.find('#header')).to have_content(project.name) - end - - end -end diff --git a/plugins/easy_gantt/spec/features/gantt_save_spec.rb b/plugins/easy_gantt/spec/features/gantt_save_spec.rb deleted file mode 100644 index 8cfdca1afad7cdfea2f3cc7eae7987413a434df8..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/spec/features/gantt_save_spec.rb +++ /dev/null @@ -1,52 +0,0 @@ -require File.expand_path('../../../../easyproject/easy_plugins/easy_extensions/test/spec/spec_helper', __FILE__) - -RSpec.feature 'Gantt save', logged: :admin, js: true, slow: true do - let(:subproject) { - FactoryGirl.create(:project, :parent_id => superproject.id, add_modules: ['easy_gantt'], number_of_issues: 3) - } - let(:superproject) { - FactoryGirl.create(:project, add_modules: ['easy_gantt'], number_of_issues: 3) - } - let(:superproject_milestone_issues) { - FactoryGirl.create_list(:issue, 3, :fixed_version_id => superproject_milestone.id, :project_id => superproject.id) - } - let(:subproject_milestone_issues) { - FactoryGirl.create_list(:issue, 3, :fixed_version_id => subproject_milestone.id, :project_id => subproject.id) - } - let(:subproject_milestone) { - FactoryGirl.create(:version, project_id: subproject.id) - } - let(:superproject_milestone) { - FactoryGirl.create(:version, project_id: superproject.id) - } - let(:subissues) { - FactoryGirl.create_list(:issue, 3, :parent_issue_id => superproject.issues[0].id, :project_id => superproject.id) - } - - around(:each) do |example| - with_settings(rest_api_enabled: 1) { example.run } - end - - - it 'should save issue' do - issue = superproject.issues[0] - old_start_date = issue.start_date - visit easy_gantt_path(superproject) - wait_for_ajax - expect(page).to have_text(issue.subject) - move_script= <<-EOF - (function(){var issue = ysy.data.issues.getByID(#{issue.id}); - issue.set({start_date:moment('#{Date.today + 2.days}'),end_date:moment('#{Date.today + 4.days}')}); - return "success";})() - EOF - save_button = page.find('#button_save') - expect(page).to have_css('#button_save.disabled') - expect(page.evaluate_script(move_script)).to eq('success') - expect(page).not_to have_css('#button_save.disabled') - save_button.click - wait_for_ajax - expect(page).to have_css('#button_save.disabled') - issue.reload - expect(issue.start_date).to eq(old_start_date + 2.days) - end -end \ No newline at end of file diff --git a/plugins/easy_gantt/spec/features/global_gantt_spec.rb b/plugins/easy_gantt/spec/features/global_gantt_spec.rb deleted file mode 100644 index 63e9820be72925a15721c002cf4cb989c8d70736..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/spec/features/global_gantt_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -require File.expand_path('../../../../easyproject/easy_plugins/easy_extensions/test/spec/spec_helper', __FILE__) - -RSpec.feature 'Global gantt', logged: :admin, js: true do - let!(:superproject) { - FactoryGirl.create(:project, add_modules: ['easy_gantt'], number_of_issues: 3) - } - around(:each) do |example| - with_settings(rest_api_enabled: 1) { example.run } - end - unless Redmine::Plugin.installed?(:easy_gantt_pro) then - it 'should load sample Data' do - visit easy_gantt_path - wait_for_ajax - expect(page).to have_css('#sample_cont') - expect(page).to have_text('1. Administrative Projects') - expect(page).to have_text('2. HR Projects') - expect(page).to have_text('3. IT Projects') - expect(page).to have_text('4. Product Development') - end - it 'should open sample project' do - visit easy_gantt_path - wait_for_ajax - expect(page).to have_text('3. IT Projects') - page.find('[task_id="p3"] .gantt_open').click - expect(page).to have_text('Client Project') - expect(page).to have_text('Implementation of IS') - expect(page).to have_text('Managing projects') - end - end -end \ No newline at end of file diff --git a/plugins/easy_gantt/spec/features/jasmine_spec.rb b/plugins/easy_gantt/spec/features/jasmine_spec.rb deleted file mode 100644 index ac6132d199e28b6658823bb1082ecbef762384d8..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/spec/features/jasmine_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -require File.expand_path('../../../../easyproject/easy_plugins/easy_extensions/test/spec/spec_helper', __FILE__) - -RSpec.feature 'Jasmine', logged: :admin, js: true, js_wait: true do - - let(:subproject) { - FactoryGirl.create(:project, parent_id: superproject.id, add_modules: ['easy_gantt'], number_of_issues: 3) - } - let(:superproject) { - FactoryGirl.create(:project, add_modules: ['easy_gantt'], number_of_issues: 3) - } - let(:superproject_milestone_issues) { - FactoryGirl.create_list(:issue, 3, fixed_version_id: superproject_milestone.id, project_id: superproject.id) - } - let(:subproject_milestone_issues) { - FactoryGirl.create_list(:issue, 3, fixed_version_id: subproject_milestone.id, project_id: subproject.id) - } - let(:subproject_milestone) { - FactoryGirl.create(:version, project_id: subproject.id) - } - let(:superproject_milestone) { - FactoryGirl.create(:version, project_id: superproject.id) - } - let(:subissues) { - FactoryGirl.create_list(:issue, 3, parent_issue_id: superproject.issues[0].id, project_id: superproject.id) - } - - around(:each) do |example| - with_settings(rest_api_enabled: 1) { example.run } - end - - describe 'Project gantt' do - it 'should not fail' do - visit easy_gantt_path(superproject, run_jasmine_tests: true) - wait_for_ajax - expect(page).to have_css('.jasmine-bar') - result = page.evaluate_script('ysy.pro.test.parseResult();') - expect(result).to eq('success') - end - end - - describe 'Global gantt' do - it 'should not fail' do - visit easy_gantt_path(run_jasmine_tests: ['global_gantt']) - wait_for_ajax - expect(page).to have_css('.jasmine-bar') - result = page.evaluate_script('ysy.pro.test.parseResult();') - expect(result).to eq('success') - end - end - -end diff --git a/plugins/easy_gantt/spec/requests/permissions_spec.rb b/plugins/easy_gantt/spec/requests/permissions_spec.rb deleted file mode 100644 index a27b49ea96567c0e7192eacc9421c1915782cc59..0000000000000000000000000000000000000000 --- a/plugins/easy_gantt/spec/requests/permissions_spec.rb +++ /dev/null @@ -1,71 +0,0 @@ -require File.expand_path('../../../../easyproject/easy_plugins/easy_extensions/test/spec/spec_helper', __FILE__) - -RSpec.describe 'Permission', type: :request do - - let!(:user) { FactoryGirl.create(:user) } - - let!(:project1) { FactoryGirl.create(:project, number_of_issues: 3, add_modules: ['easy_gantt']) } - let!(:project2) { FactoryGirl.create(:project, number_of_issues: 3, add_modules: ['easy_gantt']) } - let!(:project3) { FactoryGirl.create(:project, number_of_issues: 3, add_modules: ['easy_gantt']) } - - let!(:role_nothing) { FactoryGirl.create(:role, permissions: []) } - let!(:role_project_view) { FactoryGirl.create(:role, permissions: [:view_issues, :view_easy_gantt]) } - let!(:role_project_edit) { FactoryGirl.create(:role, permissions: [:view_issues, :view_easy_gantt, :edit_easy_gantt, :manage_issue_relations, :edit_issues]) } - - let(:query) do - _query = EasyIssueGanttQuery.new(name: '_') - _query.filters = {} - _query.add_filter('status_id', 'o', nil) - _query - end - - around(:each) do |example| - with_settings(rest_api_enabled: 1) { example.run } - end - - before(:each) do - FactoryGirl.create(:member, project: project1, user: user, roles: [role_nothing]) - FactoryGirl.create(:member, project: project2, user: user, roles: [role_project_view]) - FactoryGirl.create(:member, project: project3, user: user, roles: [role_project_edit]) - - logged_user(user) - end - - # context 'Project level' do - # end - - context 'Global level' do - - def get_issues(project) - params = query.to_params.merge(opened_project_id: project.id, key: User.current.api_key, format: 'json') - get projects_easy_gantt_path, params - - expect(response).to be_ok - - json = JSON.parse(body) - json['easy_gantt_data']['issues'] - end - - # TODO: Global gantt now works with projects - - # it 'should see nothing' do - # binding.pry unless $__binding - # issues = get_issues(project1) - # expect(issues).to be_empty - # end - - # it 'only view' do - # issues = get_issues(project2) - # expect(issues).to be_any - # expect(issues.map{|i| i['permissions']['editable']}).to all(be_nil) - # end - - # it 'editable' do - # issues = get_issues(project3) - # expect(issues).to be_any - # expect(issues.map{|i| i['permissions']['editable']}).to all(be_truthy) - # end - - end - -end diff --git a/plugins/redmine_work_time/GPL.txt b/plugins/redmine_work_time/GPL.txt deleted file mode 100644 index d511905c1647a1e311e8b20d5930a37a9c2531cd..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/GPL.txt +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/plugins/redmine_work_time/README.md b/plugins/redmine_work_time/README.md deleted file mode 100644 index 00f6186518e20a3c70d9942979526ba34f522825..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/README.md +++ /dev/null @@ -1,18 +0,0 @@ -WorkTime is a Redmine plugin to edit spent time by each user. - -### Installation notes ### - -0. Setup Redmine -1. Download redmine_work_time-*.zip from https://github.com/tkusukawa/redmine_work_time/releases -2. Expand the plugin into the plugins directory -3. Migrate plugin: - $ RAILS_ENV=production bundle exec rake redmine:plugins:migrate -4. Restart Redmine -5. Enable the module on the project setting page. -6. Check the permissions on the Roles and permissions(Administration) - -### Links ### - -* http://www.redmine.org/plugins/redmine_work_time -* https://github.com/tkusukawa/redmine_work_time -* http://www.r-labs.org/projects/worktime/ diff --git a/plugins/redmine_work_time/README.rdoc b/plugins/redmine_work_time/README.rdoc deleted file mode 100644 index 91fe638b3d917f9d5d9395a4d9b6f978982100a3..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/README.rdoc +++ /dev/null @@ -1,3 +0,0 @@ -= work_time - -Description goes here diff --git a/plugins/redmine_work_time/app/controllers/work_time_controller.rb b/plugins/redmine_work_time/app/controllers/work_time_controller.rb deleted file mode 100644 index a706803410d42fd200533ccdd7a7bddc42be8b4b..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/controllers/work_time_controller.rb +++ /dev/null @@ -1,1463 +0,0 @@ -class WorkTimeController < ApplicationController - unloadable - # before_filter :find_project, :authorize - accept_api_auth :relay_total - - helper :custom_fields - include CustomFieldsHelper - - NO_ORDER = -1 - - def index - @message = "" - require_login || return - @project = nil - prepare_values - ticket_pos - prj_pos - ticket_del - hour_update - make_pack - update_daily_memo(params[:memo]) if params.key?(:memo) - set_holiday - @custom_fields = TimeEntryCustomField.all - @link_params.merge!(:action=>"index") - if !params.key?(:user) then - redirect_to @link_params - else - render "show" - end - end - - def show - @message = "" - require_login || return - find_project - authorize - prepare_values - if @this_user.nil? || !@this_user.allowed_to?(:view_work_time_tab, @project) - @link_params.merge!(:action=>"relay_total") - redirect_to @link_params - return - end - ticket_pos - prj_pos - ticket_del - hour_update - make_pack - member_add_del_check - update_daily_memo(params[:memo]) if params.key?(:memo) - set_holiday - @custom_fields = TimeEntryCustomField.all - @link_params.merge!(:action=>"show") - if !params.key?(:user) then - redirect_to @link_params - end - end - - def member_monthly_data - require_login || return - if params.key?(:id) then - find_project - end - prepare_values - make_pack - - csv_data = %Q|"user","date","project","ticket","spent time"\n| - - (@first_date..@last_date).each do |date| - @month_pack[:odr_prjs].each do |prj_pack| - next if prj_pack[:count_issues] == 0 - prj_pack[:odr_issues].each do |issue_pack| - next if issue_pack[:count_hours] == 0 - issue = issue_pack[:issue] - if issue_pack[:total_by_day][date] then - csv_data << %Q|"#{@this_user}","#{date}","#{issue.project}","##{issue.id} #{issue.subject}",#{issue_pack[:total_by_day][date]}\n| - end - end - end - if @month_pack[:other_by_day].has_key?(date) then - csv_data << %Q|"#{@this_user}","#{date}","PRIVATE","PRIVATE",#{@month_pack[:other_by_day][date]}\n| - end - end - send_data Redmine::CodesetUtil.from_utf8(csv_data, l(:general_csv_encoding)), :type=>"text/csv", :filename=>"member_monthly.csv" - end - - def member_monthly_data_table - require_login || return - if params.key?(:id) then - find_project - end - prepare_values - make_pack - - csv_data = %Q|""| - (@first_date..@last_date).each do |date| - csv_data << %Q|,"#{date}"| - end - csv_data << "\n" - - @month_pack[:odr_prjs].each do |prj_pack| - next if prj_pack[:count_issues] == 0 - prj_pack[:odr_issues].each do |issue_pack| - next if issue_pack[:count_hours] == 0 - issue = issue_pack[:issue] - - csv_data << %Q|"##{issue.id} #{issue.subject}"| - - (@first_date..@last_date).each do |date| - if issue_pack[:total_by_day].has_key?(date) then - csv_data << %Q|,"#{issue_pack[:total_by_day][date]}"| - else - csv_data << %Q|,""| - end - end - - csv_data << "\n" - end - end - - send_data Redmine::CodesetUtil.from_utf8(csv_data, l(:general_csv_encoding)), :type=>"text/csv", :filename=>"member_monthly_table.csv" - end - - def total - @message = "" - find_project - authorize - prepare_values - change_member_position - change_ticket_position - change_project_position - member_add_del_check - calc_total - @link_params.merge!(:action=>"total") - end - - def total_data - find_project - authorize - prepare_values - change_member_position - change_ticket_position - change_project_position - member_add_del_check - calc_total - - csv_data = %Q|"user","relayed project","relayed ticket","project","ticket","spent time"\n| - #-------------------------------------- メンバーのループ - @members.each do |mem_info| - user = mem_info[1] - - #-------------------------------------- プロジェクトのループ - prjs = WtProjectOrders.where("uid=-1"). - order("dsp_pos"). - all - prjs.each do |po| - dsp_prj = po.dsp_prj - dsp_pos = po.dsp_pos - next unless @prj_cost.key?(dsp_prj) # 値の無いプロジェクトはパス - next unless @prj_cost[dsp_prj].key?(-1) # 値の無いプロジェクトはパス - next if @prj_cost[dsp_prj][-1] == 0 # 値の無いプロジェクトはスパ - prj =Project.find_by_id(dsp_prj) - - #-------------------------------------- チケットのループ - tickets = WtTicketRelay.order("position").all - tickets.each do |tic| - issue_id = tic.issue_id - next unless @issue_cost.key?(issue_id) # 値の無いチケットはパス - next unless @issue_cost[issue_id].key?(-1) # 値の無いチケットはパス - next if @issue_cost[issue_id][-1] == 0 # 値の無いチケットはパス - next unless @issue_cost[issue_id].key?(user.id) # 値の無いチケットはパス - next if @issue_cost[issue_id][user.id] == 0 # 値の無いチケットはパス - - issue = Issue.find_by_id(issue_id) - next if issue.nil? # チケットが削除されていたらパス - next if issue.project_id != dsp_prj # このプロジェクトに表示するチケットでない場合はパス - - parent_issue = Issue.find_by_id(@issue_parent[issue_id]) - next if parent_issue.nil? # チケットが削除されていたらパス - - csv_data << %Q|"#{user}","#{parent_issue.project}","##{parent_issue.id} #{parent_issue.subject}",| - csv_data << %Q|"#{prj}","##{issue.id} #{issue.subject}",#{@issue_cost[issue_id][user.id]}\n| - end - end - if @issue_cost.has_key?(-1) && @issue_cost[-1].has_key?(user.id) then - csv_data << %Q|"#{user}","private","private","private","private",#{@issue_cost[-1][user.id]}\n| - end - end - send_data Redmine::CodesetUtil.from_utf8(csv_data, l(:general_csv_encoding)), :type=>"text/csv", :filename=>"monthly_report_raw.csv" - end - - def total_data_with_act - find_project - authorize - prepare_values - change_member_position - change_ticket_position - change_project_position - member_add_del_check - calc_total - - csv_data = %Q|"user","relayed project","relayed ticket","project","ticket","activity","spent time"\n| - @issue_act_cost.each do |issue_id, user_act_cost| - if issue_id >0 - issue = Issue.find_by_id(issue_id) - next if issue.nil? # チケットが削除されていたらパス - - parent_issue = Issue.find_by_id(@issue_parent[issue_id]) - next if parent_issue.nil? # チケットが削除されていたらパス - - prj = issue.project - - user_act_cost.each do |user_id, act_cost| - user = User.find_by_id(user_id) - act_cost.each do |act_id, cost| - act = TimeEntryActivity.find_by_id(act_id) - unless act.nil? - csv_data << %Q|"#{user}","#{parent_issue.project}","##{parent_issue.id} #{parent_issue.subject}",| - csv_data << %Q|"#{prj}","##{issue.id} #{issue.subject}","#{act.name}",| - csv_data << %Q|#{cost}\n| - else # can not find activity - csv_data << %Q|"#{user}","#{parent_issue.project}","##{parent_issue.id} #{parent_issue.subject}",| - csv_data << %Q|"#{prj}","##{issue.id} #{issue.subject}","nil",| - csv_data << %Q|#{cost}\n| - end - end - end - else # 表示権限の無い工数があった場合 - user_act_cost.each do |user_id, act_cost| - user = User.find_by_id(user_id) - act_cost.each do |act_id, cost| - csv_data << %Q|"#{user}","private","private","private","private","private",| - csv_data << %Q|#{cost}\n| - end - end - end - end - send_data Redmine::CodesetUtil.from_utf8(csv_data, l(:general_csv_encoding)), :type=>"text/csv", :filename=>"monthly_report_raw_with_act.csv" - end - - def edit_relay - @message = "" - find_project - authorize - prepare_values - change_member_position - change_ticket_position - change_project_position - member_add_del_check - calc_total - @link_params.merge!(:action=>"edit_relay") - end - - def relay_total - @message = "" - find_project || return - authorize - prepare_values - change_member_position - change_ticket_position - change_project_position - member_add_del_check - calc_total - respond_to do |format| - format.html { - @link_params.merge!(:action=>"relay_total") - } - format.api {} - end - end - - def relay_total_data - find_project - authorize - prepare_values - change_member_position - change_ticket_position - change_project_position - member_add_del_check - calc_total - - csv_data = %Q|"user","project","ticket","spent time"\n| - #-------------------------------------- メンバーのループ - @members.each do |mem_info| - user = mem_info[1] - - #-------------------------------------- プロジェクトのループ - prjs = WtProjectOrders.where("uid=-1"). - order("dsp_pos"). - all - prjs.each do |po| - dsp_prj = po.dsp_prj - dsp_pos = po.dsp_pos - next unless @r_prj_cost.key?(dsp_prj) # 値の無いプロジェクトはパス - next unless @r_prj_cost[dsp_prj].key?(-1) # 値の無いプロジェクトはパス - next if @r_prj_cost[dsp_prj][-1] == 0 # 値の無いプロジェクトはスパ - prj =Project.find_by_id(dsp_prj) - - #-------------------------------------- チケットのループ - tickets = WtTicketRelay.order("position").all - tickets.each do |tic| - issue_id = tic.issue_id - next unless @r_issue_cost.key?(issue_id) # 値の無いチケットはパス - next unless @r_issue_cost[issue_id].key?(-1) # 値の無いチケットはパス - next if @r_issue_cost[issue_id][-1] == 0 # 値の無いチケットはパス - next unless @r_issue_cost[issue_id].key?(user.id) # 値の無いチケットはパス - next if @r_issue_cost[issue_id][user.id] == 0 # 値の無いチケットはパス - - issue = Issue.find_by_id(issue_id) - next if issue.nil? # チケットが削除されていたらパス - next if issue.project_id != dsp_prj # このプロジェクトに表示するチケットでない場合はパス - - csv_data << %Q|"#{user}","#{prj}","##{issue.id} #{issue.subject}",#{@r_issue_cost[issue_id][user.id]}\n| - end - end - if @r_issue_cost.has_key?(-1) && @r_issue_cost[-1].has_key?(user.id) then - csv_data << %Q|"#{user}","private","private",#{@r_issue_cost[-1][user.id]}\n| - end - end - send_data Redmine::CodesetUtil.from_utf8(csv_data, l(:general_csv_encoding)), :type=>"text/csv", :filename=>"monthly_report.csv" - end - - def relay_total_data_with_act - find_project - authorize - prepare_values - change_member_position - change_ticket_position - change_project_position - member_add_del_check - calc_total - - csv_data = %Q|"user","project","ticket","activity","spent time"\n| - @r_issue_act_cost.each do |issue_id, user_act_cost| - if issue_id >0 - issue = Issue.find_by_id(issue_id) - next if issue.nil? - prj = issue.project - - user_act_cost.each do |user_id, act_cost| - user = User.find_by_id(user_id) - act_cost.each do |act_id, cost| - act = TimeEntryActivity.find_by_id(act_id) - unless act.nil? - csv_data << %Q|"#{user}","#{prj}","##{issue.id} #{issue.subject}",| - csv_data << %Q|"#{act.name}",#{cost}\n| - else # can not find activity - csv_data << %Q|"#{user}","#{prj}","##{issue.id} #{issue.subject}",| - csv_data << %Q|"nil",#{cost}\n| - end - end - end - else # 表示権限の無い工数があった場合 - user_act_cost.each do |user_id, act_cost| - user = User.find_by_id(user_id) - act_cost.each do |act_id, cost| - csv_data << %Q|"#{user}","private","private",| - csv_data << %Q|"private",#{cost}\n| - end - end - end - end - send_data Redmine::CodesetUtil.from_utf8(csv_data, l(:general_csv_encoding)), :type=>"text/csv", :filename=>"monthly_report_with_act.csv" - end - - def ajax_relay - if !params.key?(:issue_id) - render :layout=>false, :text=>'ERROR: no issue_id' - return - end - @issue_id = params[:issue_id].to_i - - find_project - @message = '' - @parent_disp = '' - @relay_modified = false - - if params.key?(:parent_id) - @parent_id = params[:parent_id].to_i - if @parent_id >= 0 - update_relay @issue_id, @parent_id - else - # parent_id == -1 by set_ticket_relay_by_issue_relation - redmine_parent_id = Issue.find_by_id(@issue_id).parent_id - if redmine_parent_id && redmine_parent_id >= 1 # has parent - update_relay @issue_id, redmine_parent_id - end - end - end - relay = WtTicketRelay.where(["issue_id=:i",{:i=>@issue_id}]).first - @parent_id = relay.parent - - if @parent_id != 0 && !((parent = Issue.find_by_id(@parent_id)).nil?) then - @parent_disp = parent.closed? ? '<del>'+parent.to_s+'</del>' : parent.to_s - end - render :layout=>false - end - - def update_relay(issue_id, parent_id) - if !User.current.allowed_to?(:edit_work_time_total, @project) - @message ||= '' - @message += l(:wt_no_permission) - return - end - - # loop relay check - route = '' - search_id = parent_id - while search_id != 0 do - route += "->#{search_id}" - if search_id == issue_id - @message ||= '' - @message += l(:wt_loop_relay)+route - return - end - relay = WtTicketRelay.where(["issue_id=:i",{:i=>search_id}]).first - break if !relay - search_id = relay.parent - end - - relay = WtTicketRelay.where(["issue_id=:i",{:i=>issue_id}]).first - if relay then - relay.parent = parent_id - relay.save - @relay_modified = true - else - @message ||= '' - @message += "Internal Error: no WtTicketRelay for ##{issue_id}" - end - end - - def ajax_relay_input # チケット選択の内容を返すアクション - @issue_id = params[:issue_id] - @projects = Project.joins("INNER JOIN wt_project_orders ON wt_project_orders.dsp_prj=projects.id AND wt_project_orders.uid=-1"). - select("projects.*, wt_project_orders.dsp_pos as pos"). - order("pos"). - all - render(:layout=>false) - end - - def ajax_relay_input_select # チケット選択ウィンドウにAjaxで挿入(Update)される内容を返すアクション - @issue_id = params[:issue_id] - @issues = Issue.includes(:assigned_to). - where(["project_id=:p",{:p=>params[:prj]}]). - order("id DESC"). - all - render(:layout=>false) - end - - def ajax_add_tickets_input - prepare_values - @select_projects = Project. - joins("LEFT JOIN wt_project_orders ON wt_project_orders.dsp_prj=projects.id AND wt_project_orders.uid=#{User.current.id}"). - select("projects.*, coalesce(wt_project_orders.dsp_pos,100000) as pos"). - order("pos,name"). - all - render(:layout=>false) - end - - def ajax_add_tickets_input_select # 複数チケット選択ウィンドウにAjaxで挿入(Update)される内容を返すアクション - prepare_values - @issues = Issue. - includes(:assigned_to). - where(["project_id=:p",{:p=>params[:prj]}]). - order("id DESC"). - all - - render(:layout=>false) - end - - def ajax_add_tickets_insert # 日毎工数に挿入するAjaxアクション - prepare_values - - uid = params[:user] - @add_issue_id = params[:add_issue] - @add_count = params[:count] - if @this_uid==@crnt_uid then - add_issue = Issue.find_by_id(@add_issue_id) - @add_issue_children_cnt = Issue.where(["parent_id = ?", add_issue.id.to_s]).count - if add_issue && add_issue.visible? then - prj = add_issue.project - if User.current.allowed_to?(:log_time, prj) then - if add_issue.closed? then - @issueHtml = "<del>"+add_issue.to_s+"</del>" - else - @issueHtml = add_issue.to_s - end - - @activities = [] - @activity_default = nil - prj.activities.each do |act| - @activities.push([act.name, act.id]) - @activity_default = act.id if act.is_default - end - - @custom_fields = TimeEntryCustomField.all - @custom_fields.each do |cf| - def cf.custom_field - return self - end - def cf.value - return self.default_value - end - def cf.true? - return self.default_value - end - end - - @add_issue = add_issue - - unless UserIssueMonth.exists?(["uid=:u and issue=:i",{:u=>uid, :i=>@add_issue_id}]) then - # 既存のレコードが存在していなければ追加 - UserIssueMonth.create(:uid=>uid, :issue=>@add_issue_id, - :odr => UserIssueMonth.where(["uid = ?", uid]).count + 1 - ) - end - end - end - end - - render(:layout=>false) - end - - def ajax_memo_edit # 日毎のメモ入力フォームを出力するAjaxアクション - render(:layout=>false) - end - - def ajax_done_ratio_input # 進捗%更新ポップアップ - prepare_values - issue_id = params[:issue_id] - @issue = Issue.find_by_id(issue_id) - if @issue.nil? || @issue.closed? || !@issue.visible? then - @issueHtml = "<del>"+@issue.to_s+"</del>" - else - @issueHtml = @issue.to_s - end - render(:layout=>false) - end - - def ajax_done_ratio_update - prepare_values - issue_id = params[:issue_id] - done_ratio = params[:done_ratio] - @issue = Issue.find_by_id(issue_id) - if User.current.allowed_to?(:edit_issues, @issue.project) then - @issue.init_journal(User.current) - @issue.done_ratio = done_ratio - @issue.save - end - render(:layout=>false) - end - - def register_project_settings - @message = "" - require_login || return - find_project - authorize - @settings = Setting.plugin_redmine_work_time - @settings = Hash.new unless @settings.is_a?(Hash) - @settings['account_start_days'] = Hash.new unless @settings['account_start_days'].is_a?(Hash) - @settings['account_start_days'][@project.id.to_s] = params['account_start_day'] - Setting.plugin_redmine_work_time = @settings - redirect_to :controller => 'projects', - :action => 'settings', :id => @project, :tab => 'work_time' - end - -private - def find_project - # Redmine Pluginとして必要らしいので@projectを設定 - @project = Project.find(params[:id]) - rescue ActiveRecord::RecordNotFound - render_404 - end - - def prepare_values - # ************************************* 値の準備 - @crnt_uid = User.current.id - @this_uid = (params.key?(:user) && User.current.allowed_to?(:view_work_time_other_member, @project)) ? params[:user].to_i : @crnt_uid - @this_user = User.find_by_id(@this_uid) - - if @project && - Setting.plugin_redmine_work_time.is_a?(Hash) && - Setting.plugin_redmine_work_time['account_start_days'].is_a?(Hash) && - Setting.plugin_redmine_work_time['account_start_days'].has_key?(@project.id.to_s) - @account_start_day = Setting.plugin_redmine_work_time['account_start_days'][@project.id.to_s].to_i - else - @account_start_day = 1 - end - - @today = Date.today - year = params.key?(:year) ? params[:year].to_i : @today.year - month = params.key?(:month) ? params[:month].to_i : @today.month - day = params.key?(:day) ? params[:day].to_i : @today.day - @this_date = Date.new(year, month, day) - display_date = @this_date - display_date <<= 1 if day < @account_start_day - @display_year = display_date.year - @display_month = display_date.month - - @last_month = @this_date << 1 - @next_month = @this_date >> 1 - - @restrict_project = (params.key?(:prj) && params[:prj].to_i > 0) ? params[:prj].to_i : false - - @first_date = Date.new(@display_year, @display_month, @account_start_day) - @last_date = (@first_date >> 1) - 1 - - @month_names = l(:wt_month_names).split(',') - @wday_name = l(:wt_week_day_names).split(',') - @wday_color = ["#faa", "#eee", "#eee", "#eee", "#eee", "#eee", "#aaf"] - - @link_params = {:controller=>"work_time", :id=>@project, - :year=>year, :month=>month, :day=>day, - :user=>@this_uid, :prj=>@restrict_project} - @is_registerd_backlog = false - begin - Redmine::Plugin.find :redmine_backlogs - @is_registerd_backlog = true - rescue Exception => exception - end - end - - def ticket_pos - return if @this_uid != @crnt_uid - - # 重複削除と順序の正規化 - if order_normalization(UserIssueMonth, :issue, :order=>"odr", :conditions=>["uid=:u",{:u=>@this_uid}]) then - @message ||= '' - #@message += '<div style="background:#faa;">Warning: normalize UserIssueMonth</div>' - return - end - - # 表示チケット順序変更求処理 - if params.key?("ticket_pos") && params[:ticket_pos] =~ /^(.*)_(.*)$/ then - tid = $1.to_i - dst = $2.to_i - src = UserIssueMonth.where(["uid=:u and issue=:i", {:u=>@this_uid,:i=>tid}]).first - if src then # ポジション変更の場合 - if src.odr > dst then # チケットを前にもっていく場合 - tgts = UserIssueMonth. - where(["uid=:u and odr>=:o1 and odr<:o2", {:u=>src.uid, :o1=>dst, :o2=>src.odr}]). - all - tgts.each do |tgt| - tgt.odr += 1; tgt.save# 順位をひとつずつ後へ - end - src.odr = dst; src.save - else # チケットを後に持っていく場合 - tgts = UserIssueMonth. - where(["uid=:u and odr<=:o1 and odr>:o2",{:u=>src.uid, :o1=>dst, :o2=>src.odr}]). - all - tgts.each do |tgt| - tgt.odr -= 1; tgt.save# 順位をひとつずつ後へ - end - src.odr = dst; src.save - end - else - # 新規のポジションの場合 - tgts = UserIssueMonth. - where(["uid=:u and odr>=:o1", {:u=>@this_uid, :o1=>dst}]). - all - tgts.each do |tgt| - tgt.odr += 1; tgt.save# 順位をひとつずつ後へ - end - UserIssueMonth.create(:uid=>@this_uid, :issue=>tid, :odr=>dst) # 追加 - end - end - end - - def prj_pos - return if @this_uid != @crnt_uid - - # 重複削除と順序の正規化 - if order_normalization(WtProjectOrders, :dsp_prj, :order=>"dsp_pos", :conditions=>["uid=:u",{:u=>@this_uid}]) then - @message ||= '' - #@message += '<div style="background:#faa;">Warning: normalize WtProjectOrders</div>' - return - end - - # 表示プロジェクト順序変更求処理 - if params.key?("prj_pos") && params[:prj_pos] =~ /^(.*)_(.*)$/ then - tid = $1.to_i - dst = $2.to_i - src = WtProjectOrders. - where(["uid=:u and dsp_prj=:d",{:u=>@this_uid, :d=>tid}]). - first - - if src then # ポジション変更の場合 - if src.dsp_pos > dst then # チケットを前にもっていく場合 - tgts = WtProjectOrders. - where(["uid=:u and dsp_pos>=:o1 and dsp_pos<:o2",{:u=>@this_uid, :o1=>dst, :o2=>src.dsp_pos}]). - all - tgts.each do |tgt| - tgt.dsp_pos += 1; tgt.save# 順位をひとつずつ後へ - end - src.dsp_pos = dst; src.save - else # チケットを後に持っていく場合 - tgts = WtProjectOrders. - where(["uid=:u and dsp_pos<=:o1 and dsp_pos>:o2",{:u=>@this_uid, :o1=>dst, :o2=>src.dsp_pos}]). - all - tgts.each do |tgt| - tgt.dsp_pos -= 1; tgt.save# 順位をひとつずつ後へ - end - src.dsp_pos = dst; src.save - end - else - # 新規のポジションの場合 - tgts = WtProjectOrders. - where(["uid=:u and dsp_pos>=:o1",{:u=>@this_uid, :o1=>dst}]). - all - tgts.each do |tgt| - tgt.dsp_pos += 1; tgt.save# 順位をひとつずつ後へ - end - WtProjectOrders.create(:uid=>@this_uid, :dsp_prj=>tid, :dsp_pos=>dst) - end - end - end - - def ticket_del # チケット削除処理 - if params.key?("ticket_del") then - if params["ticket_del"]=="closed" then # 終了チケット全削除の場合 - issues = Issue. - joins("INNER JOIN user_issue_months ON user_issue_months.issue=issues.id"). - where(["user_issue_months.uid=:u",{:u=>@this_uid}]). - all - issues.each do |issue| - if issue.closed? then - tgt = UserIssueMonth. - where(["uid=:u and issue=:i",{:u=>@this_uid,:i=>issue.id}]).first - tgt.destroy - end - end - return - end - - # チケット番号指定の削除の場合 - src = UserIssueMonth. - where(["uid=:u and issue=:i",{:u=>@this_uid,:i=>params["ticket_del"]}]). - first - if src && src.uid == @crnt_uid then - tgts = UserIssueMonth. - where(["uid=:u and odr>:o",{:u=>src.uid, :o=>src.odr}]). - all - tgts.each do |tgt| - tgt.odr -= 1; tgt.save# 当該チケット表示より後ろの全チケットの順位をアップ - end - src.destroy# 当該チケット表示を削除 - end - end - end - - def hour_update # *********************************** 工数更新要求の処理 - by_other = false - if @this_uid != @crnt_uid - if User.current.allowed_to?(:edit_work_time_other_member, @project) - by_other = true - else - return - end - end - - # 新規工数の登録 - if params["new_time_entry"] then - params["new_time_entry"].each do |issue_id, valss| - issue = Issue.find_by_id(issue_id) - next if issue.nil? || !issue.visible? - next if !User.current.allowed_to?(:log_time, issue.project) - valss.each do |count, vals| - tm_vals = vals.except "remaining_hours", "status_id" - if params.has_key?("new_time_entry_#{issue_id}_#{count}") - params["new_time_entry_#{issue_id}_#{count}"].each do |k, v| - tm_vals[k] = v - end - end - next if tm_vals["hours"].blank? && vals["remaining_hours"].blank? && vals["status_id"].blank? - if tm_vals["hours"].present? then - if !tm_vals[:activity_id] then - append_error_message_html(@message, 'Error: Issue'+issue_id+': No Activities!') - next - end - if by_other - append_text = "\n[#{Time.now.localtime.strftime("%Y-%m-%d %H:%M")}] #{User.current.to_s}" - append_text += " add time entry of ##{issue.id.to_s}: #{tm_vals[:hours].to_f}h" - update_daily_memo(append_text, true) - end - new_entry = TimeEntry.new(:project => issue.project, :issue => issue, :author => User.current, :user => @this_user, :spent_on => @this_date) - new_entry.safe_attributes = tm_vals - new_entry.save - append_error_message_html(@message, hour_update_check_error(new_entry, issue_id)) - end - if vals["remaining_hours"].present? || vals["status_id"].present? then - append_error_message_html(@message, issue_update_to_remain_and_more(issue_id, vals)) - end - end - end - end - - # 既存工数の更新 - if params["time_entry"] then - params["time_entry"].each do |id, vals| - tm = TimeEntry.find_by_id(id) - issue_id = tm.issue.id - tm_vals = vals.except "remaining_hours", "status_id" - if params.has_key?("time_entry_"+id.to_s) - params["time_entry_"+id.to_s].each do |k,v| - tm_vals[k] = v - end - end - if tm_vals["hours"].blank? then - # 工数指定が空文字の場合は工数項目を削除 - if by_other - append_text = "\n[#{Time.now.localtime.strftime("%Y-%m-%d %H:%M")}] #{User.current.to_s}" - append_text += " delete time entry of ##{issue_id.to_s}: -#{tm.hours.to_f}h-" - update_daily_memo(append_text, true) - end - tm.destroy - else - if by_other && tm_vals.key?(:hours) && tm.hours.to_f != tm_vals[:hours].to_f - append_text = "\n[#{Time.now.localtime.strftime("%Y-%m-%d %H:%M")}] #{User.current.to_s}" - append_text += " update time entry of ##{issue_id.to_s}: -#{tm.hours.to_f}h- #{tm_vals[:hours].to_f}h" - update_daily_memo(append_text, true) - end - tm.safe_attributes = tm_vals - tm.save - append_error_message_html(@message, hour_update_check_error(tm, issue_id)) - end - if vals["remaining_hours"].present? || vals["status_id"].present? then - append_error_message_html(@message, issue_update_to_remain_and_more(issue_id, vals)) - end - end - end - end - - def issue_update_to_remain_and_more(issue_id, vals) - issue = Issue.find_by_id(issue_id) - return 'Error: Issue'+issue_id+': Private!' if issue.nil? || !issue.visible? - return if vals["remaining_hours"].blank? && vals["status_id"].blank? - journal = issue.init_journal(User.current) - # update "0.0" is changed - vals["remaining_hours"] = 0 if vals["remaining_hours"] == "0.0" - if vals['status_id'] =~ /^M+(.*)$/ - vals['status_id'] = $1.to_i - else - vals.delete 'status_id' - end - issue.safe_attributes = vals - return if !issue.changed? - issue.save - hour_update_check_error(issue, issue_id) - end - - def append_error_message_html(html, msg) - @message ||= '' - @message += '<div style="background:#faa;">' + msg + '</div><br>' if !msg.blank? - end - - def hour_update_check_error(obj, issue_id) - return "" if obj.errors.empty? - str = l("field_issue")+"#"+issue_id.to_s+"<br>" - fm = obj.errors.full_messages - fm.each do |msg| - str += msg+"<br>" - end - str.html_safe - end - - def member_add_del_check - # プロジェクトのメンバーを取得 - mem = Member.where(["project_id=:prj", {:prj=>@project.id}]).all - mem_by_uid = {} - mem.each do |m| - next if m.nil? || m.user.nil? || ! m.user.allowed_to?(:view_work_time_tab, @project) - mem_by_uid[m.user_id] = m - end - - # メンバーの順序を取得 - odr = WtMemberOrder.where(["prj_id=:p", {:p=>@project.id}]).order("position").all - - # 当月のユーザ毎の工数入力数を取得 - entry_count = TimeEntry. - where(["spent_on>=:first_date and spent_on<=:last_date", - {:first_date=>@first_date, :last_date=>@last_date}]). - select("user_id, count(hours)as cnt"). - group("user_id"). - all - cnt_by_uid = {} - entry_count.each do |ec| - cnt_by_uid[ec.user_id] = ec.cnt - end - - @members = [] - pos = 1 - # 順序情報にあってメンバーに無いものをチェック - odr.each do |o| - if mem_by_uid.has_key?(o.user_id) then - user=mem_by_uid[o.user_id].user - if ! user.nil? then - # 順位の確認と修正 - if o.position != pos then - o.position=pos - o.save - end - # 表示メンバーに追加 - if user.active? || cnt_by_uid.has_key?(user.id) then - @members.push([pos, user]) - end - pos += 1 - # 順序情報に存在したメンバーを削っていく - mem_by_uid.delete(o.user_id) - next - end - end - # メンバーに無い順序情報は削除する - o.destroy - end - - # 残ったメンバーを順序情報に加える - mem_by_uid.each do |k,v| - user = v.user - next if user.nil? - n = WtMemberOrder.new(:user_id=>user.id, - :position=>pos, - :prj_id=>@project.id) - n.save - if user.active? || cnt_by_uid.has_key?(user.id) then - @members.push([pos, user]) - end - pos += 1 - end - - end - - def update_daily_memo(text, append = false) # 日ごとメモの更新 - year = params[:year] || return - month = params[:month] || return - day = params[:day] || return - user_id = params[:user] || return - - # ユーザと日付で既存のメモを検索 - date = Date.new(year.to_i,month.to_i,day.to_i) - memo = WtDailyMemo.where(["day=:d and user_id=:u",{:d=>date,:u=>user_id}]).first - - if memo then - # 既存のメモがあれば - text = memo.description + text if append - memo.description = text - memo.updated_on = Time.now - memo.save # 更新 - else - # 既存のメモがなければ新規作成 - now = Time.now - WtDailyMemo.create(:user_id=>user_id, - :day=>date, - :created_on=>now, - :updated_on=>now, - :description=>text) - end - end - - ################################ 休日設定 - def set_holiday - user_id = params["user"] || return - if set_date = params['set_holiday'] then - WtHolidays.create(:holiday=>set_date, :created_on=>Time.now, :created_by=>user_id) - end - if del_date = params['del_holiday'] then - holidays = WtHolidays.where(["holiday=:h and deleted_on is null",{:h=>del_date}]).all - holidays.each do |h| - h.deleted_on = Time.now - h.deleted_by = user_id - h.save - end - end - end - - def change_member_position - ################################### メンバー順序変更処理 - if params.key?("member_pos") && params[:member_pos]=~/^(.*)_(.*)$/ then - if User.current.allowed_to?(:edit_work_time_total, @project) then - uid = $1.to_i - dst = $2.to_i - mem = WtMemberOrder.where(["prj_id=:p and user_id=:u",{:p=>@project.id, :u=>uid}]).first - if mem then - if mem.position > dst then # メンバーを前に持っていく場合 - tgts = WtMemberOrder. - where(["prj_id=:p and position>=:p1 and position<:p2",{:p=>@project.id, :p1=>dst, :p2=>mem.position}]). - all - tgts.each do |mv| - mv.position+=1; mv.save # 順位を一つずつ後へ - end - mem.position=dst; mem.save - end - if mem.position < dst then # メンバーを後に持っていく場合 - tgts = WtMemberOrder. - where(["prj_id=:p and position<=:p1 and position>:p2",{:p=>@project.id, :p1=>dst, :p2=>mem.position}]). - all - tgts.each do |mv| - mv.position-=1; mv.save # 順位を一つずつ前へ - end - mem.position=dst; mem.save - end - end - else - @message ||= '' - @message += '<div style="background:#faa;">'+l(:wt_no_permission)+'</div>' - return - end - end - end - - def change_ticket_position - # 重複削除と順序の正規化 - if order_normalization(WtTicketRelay, :issue_id, :order=>"position") then - @message ||= '' - #@message += '<div style="background:#faa;">Warning: normalize WtTicketRelay</div>' - return - end - - ################################### チケット表示順序変更処理 - if params.key?("ticket_pos") && params[:ticket_pos]=~/^(.*)_(.*)$/ then - if User.current.allowed_to?(:edit_work_time_total, @project) then - issue_id = $1.to_i - dst = $2.to_i - relay = WtTicketRelay.where(["issue_id=:i",{:i=>issue_id}]).first - if relay then - if relay.position > dst then # 前に持っていく場合 - tgts = WtTicketRelay. - where(["position>=:p1 and position<:p2",{:p1=>dst, :p2=>relay.position}]). - all - tgts.each do |mv| - mv.position+=1; mv.save # 順位を一つずつ後へ - end - relay.position=dst; relay.save - end - if relay.position < dst then # 後に持っていく場合 - tgts = WtTicketRelay. - where(["position<=:p1 and position>:p2",{:p1=>dst, :p2=>relay.position}]). - all - tgts.each do |mv| - mv.position-=1; mv.save # 順位を一つずつ前へ - end - relay.position=dst; relay.save - end - end - else - @message ||= '' - @message += '<div style="background:#faa;">'+l(:wt_no_permission)+'</div>' - return - end - end - end - - - def change_project_position - # 重複削除と順序の正規化 - if order_normalization(WtProjectOrders, :dsp_prj, :order=>"dsp_pos", :conditions=>"uid=-1") then - @message ||= '' - #@message += '<div style="background:#faa;">Warning: normalize WtProjectOrders</div>' - return - end - - ################################### プロジェクト表示順序変更処理 - return if !params.key?("prj_pos") # 位置変更パラメータが無ければパス - return if !(params[:prj_pos]=~/^(.*)_(.*)$/) # パラメータの形式が正しくなければパス - dsp_prj = $1.to_i - dst = $2.to_i - - if !User.current.allowed_to?(:edit_work_time_total, @project) then - # 権限が無ければパス - @message ||= '' - @message += '<div style="background:#faa;">'+l(:wt_no_permission)+'</div>' - return - end - - po = WtProjectOrders.where(["uid=-1 and dsp_prj=:d",{:d=>dsp_prj}]).first - return if po == nil # 対象の表示プロジェクトが無ければパス - - if po.dsp_pos > dst then # 前に持っていく場合 - tgts = WtProjectOrders.where(["uid=-1 and dsp_pos>=:o1 and dsp_pos<:o2",{:o1=>dst, :o2=>po.dsp_pos}]).all - tgts.each do |mv| - mv.dsp_pos+=1; mv.save # 順位を一つずつ後へ - end - po.dsp_pos=dst; po.save - end - - if po.dsp_pos < dst then # 後に持っていく場合 - tgts = WtProjectOrders.where(["uid=-1 and dsp_pos<=:o1 and dsp_pos>:o2",{:o1=>dst, :o2=>po.dsp_pos}]).all - tgts.each do |mv| - mv.dsp_pos-=1; mv.save # 順位を一つずつ前へ - end - po.dsp_pos=dst; po.save - end - end - - def calc_total - ################################################ 合計集計計算ループ ######## - @total_cost = 0 - @member_cost = Hash.new - WtMemberOrder.where(["prj_id=:p",{:p=>@project.id}]).all.each do |i| - @member_cost[i.user_id] = 0 - end - @issue_parent = Hash.new # clear cash - - @issue_cost = Hash.new - @r_issue_cost = Hash.new - - @prj_cost = Hash.new - @r_prj_cost = Hash.new - - @issue_act_cost = Hash.new - @r_issue_act_cost = Hash.new - - relay = Hash.new - WtTicketRelay.all.each do |i| - relay[i.issue_id] = i.parent - end - - #当月の時間記録を抽出 - TimeEntry. - where(["spent_on>=:t1 and spent_on<=:t2 and hours>0",{:t1 => @first_date, :t2 => @last_date}]). - all. - each do |time_entry| - iid = time_entry.issue_id - uid = time_entry.user_id - cost = time_entry.hours - act = time_entry.activity_id - # 本プロジェクトのユーザの工数でなければパス - next unless @member_cost.key?(uid) - - issue = Issue.find_by_id(iid) - next if issue.nil? # チケットが削除されていたらパス - pid = issue.project_id - # プロジェクト限定の対象でなければパス - next if @restrict_project && pid != @restrict_project - - @total_cost += cost - @member_cost[uid] += cost - - parent_iid = get_parent_issue(relay, iid) - if !Issue.find_by_id(iid) || !Issue.find_by_id(iid).visible? - # 表示権限の無い工数があった場合 - iid = -1 # private - pid = -1 # private - act = -1 # private - end - @issue_cost[iid] ||= Hash.new - @issue_cost[iid][-1] ||= 0 - @issue_cost[iid][-1] += cost - @issue_cost[iid][uid] ||= 0 - @issue_cost[iid][uid] += cost - - @prj_cost[pid] ||= Hash.new - @prj_cost[pid][-1] ||= 0 - @prj_cost[pid][-1] += cost - @prj_cost[pid][uid] ||= 0 - @prj_cost[pid][uid] += cost - - @issue_act_cost[iid] ||= Hash.new - @issue_act_cost[iid][uid] ||= Hash.new - @issue_act_cost[iid][uid][act] ||= 0 - @issue_act_cost[iid][uid][act] += cost - - parent_issue = Issue.find_by_id(parent_iid) - if parent_issue && parent_issue.visible? - parent_pid = parent_issue.project_id - else - parent_iid = -1 - parent_pid = -1 - end - - @r_issue_cost[parent_iid] ||= Hash.new - @r_issue_cost[parent_iid][-1] ||= 0 - @r_issue_cost[parent_iid][-1] += cost - @r_issue_cost[parent_iid][uid] ||= 0 - @r_issue_cost[parent_iid][uid] += cost - - @r_prj_cost[parent_pid] ||= Hash.new - @r_prj_cost[parent_pid][-1] ||= 0 - @r_prj_cost[parent_pid][-1] += cost - @r_prj_cost[parent_pid][uid] ||= 0 - @r_prj_cost[parent_pid][uid] += cost - - @r_issue_act_cost[parent_iid] ||= Hash.new - @r_issue_act_cost[parent_iid][uid] ||= Hash.new - @r_issue_act_cost[parent_iid][uid][act] ||= 0 - @r_issue_act_cost[parent_iid][uid][act] += cost - end - end - - def get_parent_issue(relay, iid) - @issue_parent ||= Hash.new - return @issue_parent[iid] if @issue_parent.has_key?(iid) - issue = Issue.find_by_id(iid) - return 0 if issue.nil? # issueが削除されていたらそこまで - @issue_cost[iid] ||= Hash.new - - if relay.has_key?(iid) - parent_id = relay[iid] - if parent_id != 0 && parent_id != iid - parent_id = get_parent_issue(relay, parent_id) - end - parent_id = iid if parent_id == 0 - else - # 関連が登録されていない場合は登録する - WtTicketRelay.create(:issue_id=>iid, :position=>relay.size, :parent=>0) - parent_id = iid - end - - # iid に対する初めての処理 - pid = issue.project_id - unless @prj_cost.has_key?(pid) - check = WtProjectOrders.where(["uid=-1 and dsp_prj=:p",{:p=>pid}]).all - if check.size == 0 - WtProjectOrders.create(:uid=>-1, :dsp_prj=>pid, :dsp_pos=>@prj_cost.size) - end - end - - @issue_parent[iid] = parent_id # return - end - - def make_pack - # 月間工数表のデータを作成 - @month_pack = {:ref_prjs=>{}, :odr_prjs=>[], - :total=>0, :total_by_day=>{}, - :other=>0, :other_by_day=>{}, - :count_prjs=>0, :count_issues=>0} - @month_pack[:total_by_day].default = 0 - - # 日毎工数のデータを作成 - @day_pack = {:ref_prjs=>{}, :odr_prjs=>[], - :total=>0, :total_by_day=>{}, - :other=>0, :other_by_day=>{}, - :count_prjs=>0, :count_issues=>0} - @day_pack[:total_by_day].default = 0 - - # プロジェクト順の表示データを作成 - dsp_prjs = Project.joins("INNER JOIN wt_project_orders ON wt_project_orders.dsp_prj=projects.id"). - where(["wt_project_orders.uid=:u",{:u=>@this_uid}]). - select("projects.*, wt_project_orders.dsp_pos as dsp_pos"). - order("wt_project_orders.dsp_pos"). - all - dsp_prjs.each do |prj| - next if @restrict_project && @restrict_project!=prj.id - make_pack_prj(@month_pack, prj, prj.dsp_pos) - make_pack_prj(@day_pack, prj, prj.dsp_pos) - end - @prj_odr_max = dsp_prjs.length - - # チケット順の表示データを作成 - dsp_issues = Issue.joins("INNER JOIN user_issue_months ON user_issue_months.issue=issues.id"). - where(["user_issue_months.uid=:u",{:u=>@this_uid}]). - order("user_issue_months.odr"). - select("issues.*, user_issue_months.odr"). - all - dsp_issues.each do |issue| - next if @restrict_project && @restrict_project!=issue.project.id - month_prj_pack = make_pack_prj(@month_pack, issue.project) - make_pack_issue(month_prj_pack, issue, issue.odr) - day_prj_pack = make_pack_prj(@day_pack, issue.project) - make_pack_issue(day_prj_pack, issue, issue.odr) - end - @issue_odr_max = dsp_issues.length - - # 月内の工数を集計 - hours = TimeEntry. - includes(:issue). - where(["user_id=:uid and spent_on>=:day1 and spent_on<=:day2", - {:uid => @this_uid, :day1 => @first_date, :day2 => @last_date}]). - all - hours.each do |hour| - next if @restrict_project && @restrict_project!=hour.project.id - work_time = hour.hours - if hour.issue && hour.issue.visible? then - # 表示項目に工数のプロジェクトがあるかチェック→なければ項目追加 - prj_pack = make_pack_prj(@month_pack, hour.project) - - # 表示項目に工数のチケットがあるかチェック→なければ項目追加 - issue_pack = make_pack_issue(prj_pack, hour.issue) - - issue_pack[:count_hours] += 1 - - # 合計時間の計算 - @month_pack[:total] += work_time - prj_pack[:total] += work_time - issue_pack[:total] += work_time - - # 日毎の合計時間の計算 - date = hour.spent_on - @month_pack[:total_by_day][date] += work_time - prj_pack[:total_by_day][date] += work_time - issue_pack[:total_by_day][date] += work_time - - if date==@this_date then # 表示日の工数であれば項目追加 - # 表示項目に工数のプロジェクトがあるかチェック→なければ項目追加 - day_prj_pack = make_pack_prj(@day_pack, hour.project) - - # 表示項目に工数のチケットがあるかチェック→なければ項目追加 - day_issue_pack = make_pack_issue(day_prj_pack, hour.issue, NO_ORDER) - - day_issue_pack[:each_entries][hour.id] = hour # 工数エントリを追加 - day_issue_pack[:total] += work_time - day_prj_pack[:total] += work_time - @day_pack[:total] += work_time - end - else - # 合計時間の計算 - @month_pack[:total] += work_time - @month_pack[:other] += work_time - - # 日毎の合計時間の計算 - date = hour.spent_on - @month_pack[:total_by_day][date] ||= 0 - @month_pack[:total_by_day][date] += work_time - @month_pack[:other_by_day][date] ||= 0 - @month_pack[:other_by_day][date] += work_time - - if date==@this_date then # 表示日の工数であれば項目追加 - @day_pack[:total] += work_time - @day_pack[:other] += work_time - end - end - end - - # この日のチケット作成を洗い出す - next_date = @this_date+1 - t1 = Time.local(@this_date.year, @this_date.month, @this_date.day) - t2 = Time.local(next_date.year, next_date.month, next_date.day) - issues = Issue.where(["(author_id = :u and created_on >= :t1 and created_on < :t2) or "+ - "id in (select journalized_id from journals where journalized_type = 'Issue' and "+ - "user_id = :u and created_on >= :t1 and created_on < :t2 group by journalized_id)", - {:u => @this_user, :t1 => t1, :t2 => t2}]).all - - issues.each do |issue| - next if @restrict_project && @restrict_project!=issue.project.id - next if !@this_user.allowed_to?(:log_time, issue.project) - next if !issue.visible? - prj_pack = make_pack_prj(@day_pack, issue.project) - issue_pack = make_pack_issue(prj_pack, issue) - if issue_pack[:css_classes] == 'wt_iss_overdue' - issue_pack[:css_classes] = 'wt_iss_overdue_worked' - else - issue_pack[:css_classes] = 'wt_iss_worked' - end - end - issues = Issue. - joins("INNER JOIN issue_statuses ist on ist.id = issues.status_id "). - joins("LEFT JOIN groups_users on issues.assigned_to_id = group_id"). - where(["1 = 1 and - ( (issues.assigned_to_id = :u or groups_users.user_id = :u) and - issues.start_date < :t2 and - ist.is_closed = :closed - )", {:u => @this_uid, :t2 => t2, :closed => false}]). - all - issues.each do |issue| - next if @restrict_project && @restrict_project!=issue.project.id - next if !@this_user.allowed_to?(:log_time, issue.project) - next if !issue.visible? - prj_pack = make_pack_prj(@day_pack, issue.project) - issue_pack = make_pack_issue(prj_pack, issue) - if issue_pack[:css_classes] == 'wt_iss_default' - issue_pack[:css_classes] = 'wt_iss_assigned' - elsif issue_pack[:css_classes] == 'wt_iss_worked' - issue_pack[:css_classes] = 'wt_iss_assigned_worked' - elsif issue_pack[:css_classes] == 'wt_iss_overdue' - issue_pack[:css_classes] = 'wt_iss_assigned_overdue' - elsif issue_pack[:css_classes] == 'wt_iss_overdue_worked' - issue_pack[:css_classes] = 'wt_iss_assigned_overdue_worked' - end - end - - # 月間工数表から工数が無かった項目の削除と項目数のカウント - @month_pack[:count_issues] = 0 - @month_pack[:odr_prjs].each do |prj_pack| - prj_pack[:odr_issues].each do |issue_pack| - if issue_pack[:count_hours]==0 then - prj_pack[:count_issues] -= 1 - end - end - - if prj_pack[:count_issues]==0 then - @month_pack[:count_prjs] -= 1 - else - @month_pack[:count_issues] += prj_pack[:count_issues] - end - end - end - - def make_pack_prj(pack, new_prj, odr=NO_ORDER) - # 表示項目に当該プロジェクトがあるかチェック→なければ項目追加 - unless pack[:ref_prjs].has_key?(new_prj.id) then - prj_pack = {:odr=>odr, :prj=>new_prj, - :total=>0, :total_by_day=>{}, - :ref_issues=>{}, :odr_issues=>[], :count_issues=>0} - pack[:ref_prjs][new_prj.id] = prj_pack - pack[:odr_prjs].push prj_pack - pack[:count_prjs] += 1 - prj_pack[:total_by_day].default = 0 - end - pack[:ref_prjs][new_prj.id] - end - - def make_pack_issue(prj_pack, new_issue, odr=NO_ORDER) - id = new_issue.nil? ? -1 : new_issue.id - # 表示項目に当該チケットがあるかチェック→なければ項目追加 - unless prj_pack[:ref_issues].has_key?(id) then - issue_pack = {:odr=>odr, :issue=>new_issue, - :total=>0, :total_by_day=>{}, - :count_hours=>0, :each_entries=>{}, - :cnt_childrens=>0} - issue_pack[:total_by_day].default = 0 - if !new_issue.due_date.nil? && new_issue.due_date < @this_date.to_datetime - issue_pack[:css_classes] = 'wt_iss_overdue' - else - issue_pack[:css_classes] = 'wt_iss_default' - end - prj_pack[:ref_issues][id] = issue_pack - prj_pack[:odr_issues].push issue_pack - prj_pack[:count_issues] += 1 - cnt_childrens = Issue.where(["parent_id = ?", new_issue.id.to_s]).count - issue_pack[:cnt_childrens] = cnt_childrens - end - prj_pack[:ref_issues][id] - end - - def sum_or_nil(v1, v2) - if v2.blank? - v1 - else - if v1.blank? - v2 - else - v1 + v2 - end - end - end - - # 重複削除と順序の正規化 - def order_normalization(table, key_column, find_params) - raise "need table" unless table - order = find_params[:order] - raise "need :order" unless order - update = false - - tgts = table. - where(find_params[:conditions]). - order(order). - all - keys = [] - tgts.each do |tgt| - if keys.include?(tgt[key_column]) then - tgt.destroy - update = true - else - keys.push(tgt[key_column]) - if tgt[order] != keys.length then - tgt[order] = keys.length - tgt.save - update = true - end - end - end - update - end - -end diff --git a/plugins/redmine_work_time/app/helpers/work_time_helper.rb b/plugins/redmine_work_time/app/helpers/work_time_helper.rb deleted file mode 100644 index a2813e65a4d2ef24b21f4d08424b565a753c3c5e..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/helpers/work_time_helper.rb +++ /dev/null @@ -1,27 +0,0 @@ -module WorkTimeHelper - def print_issue_cost(issue) - return "" unless issue - issue_cost_est = issue.estimated_hours - return "" unless issue_cost_est - issue_cost = TimeEntry.where(:issue_id => issue.id).sum(:hours).to_f - return sprintf("(%1.1f/%1.1f)",issue_cost,issue_cost_est) - end - - def print_issue_cost_rate(issue) - return "" unless issue - issue_cost_est = issue.estimated_hours - return "" unless issue_cost_est - issue_cost = TimeEntry.where(:issue_id => issue.id).sum(:hours).to_f - return sprintf("%1.0f",issue_cost/issue_cost_est*100) - end - - def wk_pretty_issue_name(issue, issue_id = issue.id) - if issue.nil? || !issue.visible? - content_tag :del, issue_id - elsif issue.closed? - content_tag :del, issue.to_s - else - issue.to_s - end - end -end diff --git a/plugins/redmine_work_time/app/models/user_issue_month.rb b/plugins/redmine_work_time/app/models/user_issue_month.rb deleted file mode 100644 index 3543e374c3ebc6d8f58a48a7097b3c50537c375b..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/models/user_issue_month.rb +++ /dev/null @@ -1,8 +0,0 @@ -class UserIssueMonth < ActiveRecord::Base - #attr_accessible :uid, :issue, :odr - - #private - #def user_issue_month_params - # params.require(:user_issue_month).permit(:uid, :issue, :odr) - #end -end diff --git a/plugins/redmine_work_time/app/models/wt_daily_memo.rb b/plugins/redmine_work_time/app/models/wt_daily_memo.rb deleted file mode 100644 index a4213947a4f825153adff77837c51c3f5b94925f..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/models/wt_daily_memo.rb +++ /dev/null @@ -1,8 +0,0 @@ -class WtDailyMemo < ActiveRecord::Base - #attr_accessible :user_id, :day, :created_on, :updated_on, :description - - # private - # def wt_daily_memo_params - # params.require(:wt_daily_memo).permit(:user_id, :day, :created_on, :updated_on, :description) - # end -end diff --git a/plugins/redmine_work_time/app/models/wt_holidays.rb b/plugins/redmine_work_time/app/models/wt_holidays.rb deleted file mode 100644 index 0ea5d0ce314de4e455a4319d2501d4994ec92dfa..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/models/wt_holidays.rb +++ /dev/null @@ -1,8 +0,0 @@ -class WtHolidays < ActiveRecord::Base - #attr_accessible :holiday, :created_on, :created_by - - #private - # def wt_holidays_params - # params.require(:wt_holidays).permit(:holiday, :created_on, :created_by) - # end -end diff --git a/plugins/redmine_work_time/app/models/wt_member_order.rb b/plugins/redmine_work_time/app/models/wt_member_order.rb deleted file mode 100644 index 9804e6ff9ceb717275d46f72fc0ad135645515ae..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/models/wt_member_order.rb +++ /dev/null @@ -1,8 +0,0 @@ -class WtMemberOrder < ActiveRecord::Base - #attr_accessible :user_id, :position, :prj_id - - # private - # def wt_memver_order_params - # params.require(:wt_memver_order).permit(:user_id, :position, :prj_id) - # end -end diff --git a/plugins/redmine_work_time/app/models/wt_project_orders.rb b/plugins/redmine_work_time/app/models/wt_project_orders.rb deleted file mode 100644 index da7d2ed9df99fcb81ae808cb5de4356e1de89fff..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/models/wt_project_orders.rb +++ /dev/null @@ -1,8 +0,0 @@ -class WtProjectOrders < ActiveRecord::Base - #attr_accessible :uid, :dsp_prj, :dsp_pos - - # private - # def wt_project_orders_params - # params.require(:wt_project_orders).permit(:uid, :dsp_prj, :dsp_pos) - # end -end diff --git a/plugins/redmine_work_time/app/models/wt_ticket_relay.rb b/plugins/redmine_work_time/app/models/wt_ticket_relay.rb deleted file mode 100644 index f5782497f82665957a584b0d6b2c40c3a73c580a..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/models/wt_ticket_relay.rb +++ /dev/null @@ -1,8 +0,0 @@ -class WtTicketRelay < ActiveRecord::Base - #attr_accessible :issue_id, :position, :parent - - # private - # def wt_ticket_relay_params - # params.require(:wt_ticket_relay).permit(:issue_id, :position, :parent) - # end -end diff --git a/plugins/redmine_work_time/app/views/settings/_work_time_project_settings.html.erb b/plugins/redmine_work_time/app/views/settings/_work_time_project_settings.html.erb deleted file mode 100644 index 68abdec4cded94452bbee5efe6415b800c6f26af..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/settings/_work_time_project_settings.html.erb +++ /dev/null @@ -1,19 +0,0 @@ -<% - settings = Setting.plugin_redmine_work_time - if settings.is_a?(Hash) && - settings['account_start_days'].is_a?(Hash) && - settings['account_start_days'].has_key?(@project.id.to_s) - day = settings['account_start_days'][@project.id.to_s] - else - day = 1 - end -%> -<%= form_tag(:controller=>"work_time", :id=>@project, :action => "register_project_settings") do %> - <p> - <%=content_tag(:label, l(:wt_account_start_day))%> - <%=number_field_tag 'account_start_day', day , in: 1..31 %> - </p> - <%= submit_tag l(:wt_update) %> -<%end%> - - diff --git a/plugins/redmine_work_time/app/views/settings/_work_time_settings.html.erb b/plugins/redmine_work_time/app/views/settings/_work_time_settings.html.erb deleted file mode 100644 index e3b13477b641d7e441684bb95bc812d0cd0519ab..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/settings/_work_time_settings.html.erb +++ /dev/null @@ -1,11 +0,0 @@ -<% - @settings = Hash.new unless @settings.is_a?(Hash) -%> -<p> - <%= label_tag :settings_show_account_menu, 'show account menu' %> - <%= check_box_tag 'settings[show_account_menu]', true, @settings['show_account_menu'] %> -</p> - -<% (@settings['account_start_days'] || {}).each do |k,v| %> - <%= hidden_field_tag "settings[account_start_days][#{k}]", v %> -<% end %> diff --git a/plugins/redmine_work_time/app/views/work_time/_select_project.html.erb b/plugins/redmine_work_time/app/views/work_time/_select_project.html.erb deleted file mode 100644 index 16a749879ab16dee848659828642f56f3e153bcf..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/work_time/_select_project.html.erb +++ /dev/null @@ -1,21 +0,0 @@ -<%#*************************************************** プロジェクトセレクタ %> -<%= @restrict_project ? Project.find(@restrict_project).name : ""%> - -<select onchange="if (this.value != '') {window.location = this.value;}"> - <option selected="selectes"><%=l(:wt_select_project)%></option> - <option value="<%= url_for(@link_params.merge(:prj=>false));%>">---</option> -<% -prjs = Project. - joins("LEFT JOIN wt_project_orders ON wt_project_orders.dsp_prj=projects.id AND wt_project_orders.uid=#{User.current.id}"). - select("projects.*, coalesce(wt_project_orders.dsp_pos,100000) as pos"). - order("pos,name"). - all - -Project.project_tree(prjs) do |prj, level| - next unless prj.active? - next if !prj.visible? - name_prefix = (level > 0 ? ' ' * 2 * level + '» ': '').html_safe -%> - <option value="<%= url_for(@link_params.merge(:prj=>prj.id));%>"> <%=name_prefix + prj.name%> </option> -<%end%> -</select> diff --git a/plugins/redmine_work_time/app/views/work_time/_select_user.html.erb b/plugins/redmine_work_time/app/views/work_time/_select_user.html.erb deleted file mode 100644 index 5e72a9bbc95fb6b3eaf387e003bfbdbd0377742c..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/work_time/_select_user.html.erb +++ /dev/null @@ -1,20 +0,0 @@ -<%#**************************************************** ユーザセレクタ %> -<%if @project then%> -<%=l(:wt_select_user)%> -<select onchange="if (this.value != '') {window.location = this.value;}"> - <option value="">---</option> -<% -members_name_id = Array.new -@members.each {|mem| members_name_id << [mem[1].to_s, mem[1].id]} -members_name_id.sort! -members_name_id.each do |member_name_id| - sel = (member_name_id[1] == @this_uid) ? 'selected' : '' -%> - <option value="<%= url_for(link_params.merge(:user=>member_name_id[1]));%>" <%=sel%>> - <%=member_name_id[0]%> - </option> -<% -end -%> -</select> -<%end%> diff --git a/plugins/redmine_work_time/app/views/work_time/_user_day_table.html.erb b/plugins/redmine_work_time/app/views/work_time/_user_day_table.html.erb deleted file mode 100644 index b3b86c59e121a3033f3be48b2d4dd560933968c6..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/work_time/_user_day_table.html.erb +++ /dev/null @@ -1,282 +0,0 @@ -<table border="0" id="time_input_table"> - <tr style="background:#fff;font-size:14px"> - <td> </td> - <td><%=l(:work_time)%></td> - <% if @is_registerd_backlog then %> - <td><%=l(:field_remaining_hours)%></td> - <% end %> - <td><%=l(:field_activity)%></td> - <td><%=l(:field_status)%></td> - <td><%=l(:field_comments)%></td> - <% @custom_fields.each do |cf| %> - <td><%= cf.name %></td> - <% end %> - </tr> -<% -@day_pack[:odr_prjs].each do |prj_pack| - next if prj_pack[:ref_issues].length==0 - prj = prj_pack[:prj] - next if !prj.visible? - dsp_prj = prj.id - dsp_pos = prj_pack[:odr] - - activities = [] - activity_default = nil - prj.activities.each do |act| - activities.push([act.name, act.id]) - activity_default = act.id if act.is_default - end -%> -<tr style="background:#000;color:#fff;"> - <td> - <%if @this_uid==@crnt_uid then%> - - <a href="#" - style="color:#8ff;" - onclick="prj_pos('<%=url_for(@link_params) %>', - <%=dsp_prj%>, - <%=dsp_pos%>, - <%=@prj_odr_max+((dsp_pos.to_i<0)?1:0)%>); - return false;"> - <%= (dsp_pos.to_i<0) ? "*" : dsp_pos %>: - </a> - <%end%> - <%=prj.name%> - </td> - <td><%=sprintf("%1.2f", prj_pack[:total])%></td> - <% if @is_registerd_backlog then %> - <td> </td> - <% end %> - <td> </td> - <td> </td> - <td> </td> - <% @custom_fields.each do |cf| %> - <td> </td> - <% end %> -</tr> -<% -prj_pack[:odr_issues].each do |issue_pack| - issue = issue_pack[:issue] - issue_id = issue.nil? ? -1 : issue.id - issue_odr = issue_pack[:odr].to_i -# issue_class = issue_pack[:worked] ? "#cfc" : "#fff" - issue_css_classes = issue_pack[:css_classes] - issue = Issue.find_by_id(issue_id) - issue_html = wk_pretty_issue_name issue, issue_id - - if issue_pack[:each_entries].length==0 then -%> -<!-- 工数エントリなし --> -<tr id="time_entry_pos<%=issue_id%>_0"> - <td class="<%=issue_css_classes%>"> - <div style="position:relative;width:300px;"> - <%if @this_uid==@crnt_uid then%> - <a href="#" - onclick="ticket_pos('<%=url_for(@link_params) %>', - <%=issue_id%>, - <%=issue_odr%>, - <%=@issue_odr_max+((issue_odr.to_i<0)?1:0)%>); - return false;"> - <%= (issue_odr.to_i<0) ? "*" : issue_odr %> - </a> - <%end%> - - <%= link_to(issue_html, - {:controller=>"issues", :action=>"show", :id=>issue_id}, - :popup=>true, :class=>'wt_iss_link', :'data-issue'=>issue_id) %> - <%= print_issue_cost(issue) %> - <%if User.current.allowed_to?(:edit_issues, issue.project)%> - <a name="<%='done_ratio'+issue.id.to_s%>" - class="wt_done_ratio" - data-issue="<%= issue_id %>" - href="#" - onclick="input_done_ratio( - '<%=url_for(@link_params.merge(:action=>"ajax_done_ratio_input"))%>', - <%=issue_id%>); - return false;"> - [<%=issue.done_ratio%>%] - </a> - <%else%> - [<%=issue.done_ratio%>%] - <%end%> - <%if @this_uid==@crnt_uid then%> - - <a style="position:absolute;bottom:1px;right:10px;" - href="#" - onclick="dup_ticket( - '<%=url_for(@link_params.merge(:action=>"ajax_add_tickets_insert"))%>', - 'time_entry_pos<%=issue_id%>_0', - <%=issue_id%>); - return false;"> - + - </a> - <%if issue_odr>0 then%> - <a style="position:absolute;bottom:1px;right:3px;" href="<%=url_for(@link_params.merge(:ticket_del=>issue_id))%>">x</a> - <%end%> - <%end%> - </div> - </td> - <td> - <%= text_field_tag("new_time_entry["+issue_id.to_s+"][0][hours]", "", :size=>5, :oninput => "sumDayTimes()") %> - </td> - <% if @is_registerd_backlog then %> - <td> - <% if issue_pack[:cnt_childrens] != 0 || issue.closed? then %> - <%= issue[:remaining_hours] %> - <% else %> - <%= text_field_tag("new_time_entry["+issue_id.to_s+"][0][remaining_hours]", issue[:remaining_hours], :size=>5, :oninput => "sumDayTimes()") %> - <% end %> - </td> - <% end %> - <td> - <%= select_tag "new_time_entry["+issue_id.to_s+"][0][activity_id]", options_for_select(activities,activity_default) %> - </td> - <td> - <% if issue.new_statuses_allowed_to(User.current).length == 0 then %> - <%= issue.status %> - <% else %> - <% select_name="new_time_entry["+issue_id.to_s+"][0][status_id]" %> - <%= select_tag select_name, - options_for_select(issue.new_statuses_allowed_to(User.current).collect {|p| [p.name, p.id]}, - issue.status_id), - :onchange => "statusUpdateOnDailyTable('#{select_name}')", - :required => true %> - <% end %> - </td> - <td> - <%= text_field_tag("new_time_entry["+issue_id.to_s+"][0][comments]", "", :size=>80)%> - </td> - <%if @custom_fields.length != 0 - dummy_hour = TimeEntry.new(:project => issue.project, :issue => issue, :user => @this_user, :spent_on => @this_date) - dummy_hour.custom_field_values.each do |cfv| - %> - <td><%= custom_field_tag "new_time_entry_"+issue_id.to_s+"_0", cfv %></td> - <%end - end%> -</tr> -<% - else - issue_pack[:each_entries].each do |hour_id, hour| -%> -<!-- 工数エントリあり --> -<tr id="time_entry_pos<%=hour_id%>"> - <td class="<%=issue_css_classes%>"> - <div style="position:relative;width:300px;"> - <%if !issue.nil? then%> - <%if @this_uid==@crnt_uid then%> - <a href="#" - onclick="ticket_pos('<%=url_for(@link_params) %>', - <%=issue_id%>, - <%=issue_odr%>, - <%=@issue_odr_max+((issue_odr.to_i<0)?1:0)%>); - return false;"> - <%= (issue_odr.to_i<0) ? "*" : issue_odr %> - </a> - <%end%> - <%= link_to(issue_html, - {:controller=>"issues", :action=>"show", :id=>issue_id}, - :popup=>true, :class=>'wt_iss_link', :'data-issue'=>issue_id) %> - - <%= print_issue_cost(issue) %> - <%if User.current.allowed_to?(:edit_issues, issue.project)%> - <a name="<%='done_ratio'+issue_id.to_s%>" - class="wt_done_ratio" - data-issue="<%= issue_id %>" - href="#" - onclick="input_done_ratio( - '<%=url_for(@link_params.merge(:action=>"ajax_done_ratio_input"))%>', - <%=issue_id%>); - return false;"> - [<%=issue.done_ratio%>%] - </a> - <%else%> - [<%=issue.done_ratio%>%] - <%end%> - <%if @this_uid==@crnt_uid then%> - - - <a style="position:absolute;bottom:1px;right:10px;" - href="#" - onclick="dup_ticket( - '<%=url_for(@link_params.merge(:action=>"ajax_add_tickets_insert"))%>', - 'time_entry_pos<%=hour_id%>', - <%=issue_id%>); - return false;"> - + - </a> - <%if issue_odr>0 then%> - <a style="position:absolute;bottom:1px;right:3px;" href="<%=url_for(@link_params.merge(:ticket_del=>issue_id))%>">x</a> - <%end%> - <%end%> - <%end%> - </div> - </td> - <td> - <%= text_field_tag("time_entry["+hour_id.to_s+"][hours]", sprintf("%1.2f", hour.hours), :size=>5, :oninput => "sumDayTimes()") %> - </td> - <% if @is_registerd_backlog then %> - <td> - <% if issue_pack[:cnt_childrens] != 0 || hour.issue.closed? then %> - <%= hour.issue[:remaining_hours] %> - <% else %> - <%= text_field_tag("time_entry["+hour_id.to_s+"][remaining_hours]", hour.issue[:remaining_hours], :size=>5, :oninput => "sumDayTimes()") %> - <% end %> - </td> - <% end %> - <td> - <%= select_tag "time_entry["+hour_id.to_s+"][activity_id]", options_for_select(activities, hour.activity_id), :required => true %> - </td> - <td> - <% if issue.new_statuses_allowed_to(User.current).length == 0 then %> - <%= issue.status %> - <% else %> - <% select_name="time_entry["+hour_id.to_s+"][status_id]" %> - <%= select_tag select_name, - options_for_select(issue.new_statuses_allowed_to(User.current).collect {|p| [p.name, p.id]}, - issue.status_id), - :onchange => "statusUpdateOnDailyTable('#{select_name}')", - :required => true %> - <% end %> - </td> - <td> - <%= text_field_tag("time_entry["+hour_id.to_s+"][comments]", hour.comments, :size=>80)%> - </td> - <% hour.custom_field_values.each do |cfv| %> - <td><%= custom_field_tag "time_entry_"+hour_id.to_s, cfv %></td> - <% end %> -</tr> -<% - end - end - end -end -%> -<% if @day_pack[:other]!=0 then %> -<tr style="background:#000;color:#fff;"> - <td>private</td> - <td><%=sprintf("%1.2f", @day_pack[:other])%></td> - <% if @is_registerd_backlog then %> - <td><%=sprintf("%1.2f", @day_pack[:other_remain]) if @day_pack[:other_remain]%></td> - <% end %> - <td> </td> - <td> </td> - <td> </td> - <% @custom_fields.each do |cf| %> - <td> </td> - <% end %> -</tr> -<% end %> -<tr align="center" id="time_input_table_bottom" style="background:#ddd;"> - <td> </td> - <td><span id='currentTotal' title='<%=l(:wt_saved_value)%> <%=sprintf("%1.2f", @day_pack[:total])%>'><%=sprintf("%1.2f", @day_pack[:total])%></span></td> - <% if @is_registerd_backlog then %> - <td> </td> - <% end %> - <td> </td> - <td> </td> - <td> </td> - <% @custom_fields.each do |cf| %> - <td> </td> - <% end %> -</tr> -</table> diff --git a/plugins/redmine_work_time/app/views/work_time/_user_month_table.html.erb b/plugins/redmine_work_time/app/views/work_time/_user_month_table.html.erb deleted file mode 100644 index 0788a31b3c76111330630c417a99917e5b3220fa..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/work_time/_user_month_table.html.erb +++ /dev/null @@ -1,264 +0,0 @@ -<% -win_w = 35 # 小窓の幅 -win_h = 31 # 小窓の高さ -win_hs = 20 # 小さい小窓の高さ - -box_w = 300 -box_h = win_hs*3+win_h*@month_pack[:count_issues]+win_hs*@month_pack[:count_prjs]+20 -if @month_pack[:other]!=0 then - box_h += win_hs -end -%> - -<h2><%=l(:wt_monthly_report)%> (<%=@this_user%>)</h2> -<table width="100%" style="border:0;border-collapse:collapse;"> -<tr> - <!-- ************************************************ 左側を表示 --> - <td style="width:<%=box_w%>px;padding:0px;"> - <div style="background: #ccc;"> - <div style="position:relative;height:<%=box_h%>px;overflow:auto;"> - - <div style="position:absolute;top:1px;left:1px;"> - <div style="background: #fff;font-size:1.5em;"> - <div style="text-align:center;position:relative;top:1px;left:1px;width:<%=box_w-2%>px;height:<%=win_hs*2-1%>px;"> - <%= @first_date.strftime("%Y/%m/%d") %> - <%= @last_date.strftime("%Y/%m/%d") %> - </div> - </div> - <div style="text-align:right;position:absolute;top:1px;left:1px;width:<%=box_w-2%>px;height:<%=win_hs*2-1%>px;"> - <%= link_to(">>", @link_params.merge(:day=>@next_month.day, :month=>@next_month.month, :year=>@next_month.year))%> - </div> - <div style="text-align:left;position:absolute;top:1px;left:1px;"> - <%= link_to("<<", @link_params.merge(:day=>@last_month.day, :month=>@last_month.month, :year=>@last_month.year))%> - </div> - </div> -<% -ofst_t = win_hs*3-5 - -@month_pack[:odr_prjs].each do |prj_pack| - next if prj_pack[:count_issues] == 0 - prj = prj_pack[:prj] - dsp_pos = prj_pack[:odr] - prj_ofst_t = ofst_t - - ofst_t += win_hs - prj_pack[:odr_issues].each do |issue_pack| - next if issue_pack[:count_hours] == 0 - issue = issue_pack[:issue] - issue_id = issue.nil? ? -1 : issue.id - issue_odr = issue_pack[:odr] - -%> - <div style="position:absolute;top:<%=ofst_t%>px;left:1px;"> - <div style="background: #fff;font-size:0.8em;"> - <div style="position:relative;top:1px;left:1px;width:<%=box_w-2%>px;height:<%=win_h-1%>px;"> - <%if !issue.nil? then%> - <%if @this_uid==@crnt_uid then%> - <a href="#" - onclick="JavaScript: - ticket_pos( - '<%=url_for(@link_params) %>', - <%=issue_id%>, - <%=issue_odr%>, - <%=@issue_odr_max+((issue_odr.to_i<0)?1:0)%>); - return false;"> - <%= (issue_odr.to_i<0) ? "*" : issue_odr %> - </a> - <%end%> - <%= link_to(wk_pretty_issue_name(issue, issue_id), {:controller=>"issues", :action=>"show", :id=>issue_id}, :popup=>true, :class=>'wt_iss_link', :'data-issue'=>issue_id) %> - <%= print_issue_cost(issue) %> - <%end%> - <div style="position:absolute;top:15px;right:15px;"> - <%=sprintf("%1.2f", issue_pack[:total])%> - </div> - </div> - </div> - </div> -<% - ofst_t += win_h - end -%> - <div style="position:absolute;top:<%=prj_ofst_t%>px;left:2px;"> - <div style="background:#000;color:#fff;font-size:1.0em;"> - <div style="position:relative;top:1px;left:1px;width:<%=box_w-3%>px;height:<%=win_hs-1%>px;"> -<%if @this_uid==@crnt_uid then%> - <a href="#" - style="color:#8ff;" - onclick="JavaScript: - prj_pos( - '<%=url_for(@link_params) %>', - <%=prj.id%>, - <%=dsp_pos%>, - <%=@prj_odr_max+((dsp_pos.to_i<0)?1:0)%>); - return false;"> - <%= (dsp_pos.to_i<0) ? "*" : dsp_pos %>: - </a> -<%end%> - <%= prj.name%> - <div style="position:absolute;top:1px;right:10px;"> - <%=sprintf("%1.2f",prj_pack[:total])%> - </div> - </div> - </div> - </div> -<% -end -%> - <%if @month_pack[:other]!=0 then%> - <div style="position:absolute;top:<%=ofst_t%>px;left:2px;"> - <div style="background:#000;color:#fff;font-size:1.0em;"> - <div style="position:relative;top:1px;left:1px;width:<%=box_w-4%>px;height:<%=win_hs-2%>px;"> - private - <div style="position:absolute;top:1px;right:10px;"> - <%=sprintf("%1.2f", @month_pack[:other])%> - </div> - </div> - </div> - </div> - <%end%> - <div style="position:absolute;bottom:10px;right:10px;"> - <%=sprintf("%1.2f", @month_pack[:total])%> - </div> - <div style="position:absolute;top:<%=win_hs*2%>px;right:10px;"> - <%=sprintf("%1.2f", @month_pack[:total])%> - </div> - </div> - - </div> - </td> - - <!-- ************************************************ 右側を表示 --> - <td> - <div style="background: #ccc;"> - <div style="position:relative;height:<%=box_h%>px;overflow:auto;" id="day_scroll"> - -<% # チケット毎の合計時間を計算&表示 -day_pos = 0 -(@first_date..@last_date).each do |date| - day_pos += 1 - month = date.month - day = date.day - wday = date.wday - ofst_l = win_w*(day_pos-1) - holidayEntry = WtHolidays. - where(["holiday=:h and deleted_on is null",{:h=>date}]). - all - if holidayEntry.size == 0 then - bcolor = @wday_color[wday] - else - bcolor = "#fbc" - end - if day==@this_date.day then - bcolor_day = "#cfc" - today_id = 'id=day_scroll_today' - else - bcolor_day = bcolor - today_id = '' - end -%> - <div style="position:absolute;top:1px;left:<%=ofst_l%>px;" <%=today_id%> > - <div style="background:<%=bcolor_day%>;"> - <div style="text-align:center;position:relative;top:1px;left:1px;width:<%=win_w-1%>px;height:<%=win_hs-1%>px;"> - <%= link_to(day, @link_params.merge(:day=>day, :month=>month)) %> - </div> - </div> - </div> - <div style="position:absolute;top:<%=win_hs+1%>px;left:<%=ofst_l%>px;"> - <div style="background:<%=bcolor%>;"> - <div style="text-align:center;position:relative;top:1px;left:1px;width:<%=win_w-1%>px;height:<%=win_hs-1%>px;"> - <%= @wday_name[wday]%> - </div> - </div> - </div> -<% -ofst_t = win_hs*3-5 -day_cost = 0 - -@month_pack[:odr_prjs].each do |prj_pack| - next if prj_pack[:count_issues] == 0 - dsp_prj = prj_pack[:prj].id - dsp_pos = prj_pack[:odr] - prj_ofst_t = ofst_t - - ofst_t += win_hs - prj_pack[:odr_issues].each do |issue_pack| - next if issue_pack[:count_hours] == 0 - issue = issue_pack[:issue] - issue_id = issue.nil? ? -1 : issue.id - issue_odr = issue_pack[:odr] -%> - <div style="position:absolute;top:<%=ofst_t%>px;left:<%=ofst_l%>px;"> - <div style="background:<%=bcolor%>;font-size:0.8em;"> - <div style="text-align:center;position:relative;top:5px;left:1px;width:<%=win_w-1%>px;height:<%=win_h-1%>px;"> -<% - if issue_pack[:total_by_day].has_key?(date) then -%> - <%=sprintf("%1.2f", issue_pack[:total_by_day][date])%> -<% - end -%> - </div> - </div> - </div> -<% - ofst_t += win_h - end -%> - <div style="position:absolute;top:<%=prj_ofst_t%>px;left:<%=ofst_l%>px;"> - <div style="background:#000;color:#fff;font-size:0.8em;"> - <div style="text-align:center;position:relative;top:5px;left:1px;width:<%=win_w-1%>px;height:<%=win_hs-1%>px;"> -<%if prj_pack[:total_by_day].has_key?(date) then%> - <%=sprintf("%1.2f", prj_pack[:total_by_day][date])%> -<%end%> - </div> - </div> - </div> - -<% -end -%> -<!--日毎の合計時間表示--> - <div style="position:absolute;top:<%=win_hs*2%>px;left:<%=ofst_l%>px;"> - <div style="font-size:0.8em;"> - <div style="text-align:center;position:relative;top:1px;left:1px;width:<%=win_w-2%>px;height:<%=win_hs-2%>px;"> -<%if @month_pack[:total_by_day].has_key?(date) then%> - <%= sprintf("%1.2f", @month_pack[:total_by_day][date])%> -<%end%> - </div> - </div> - </div> -<!--otherの時間表示--> -<%if @month_pack[:other]!=0 then%> - <div style="position:absolute;top:<%=ofst_t%>px;left:<%=ofst_l%>px;"> - <div style="background:#000;color:#fff;font-size:0.8em;"> - <div style="text-align:center;position:relative;top:5px;left:1px;width:<%=win_w-2%>px;height:<%=win_hs-2%>px;"> -<%if @month_pack[:other_by_day].has_key?(date) then%> - <%= sprintf("%1.2f", @month_pack[:other_by_day][date])%> -<%end%> - </div> - </div> - </div> -<%end%> - -<%end%> - </div> - </div> - </td> -</tr> -</table> -<input type="button" - onclick="location.href='<%=url_for(@link_params.merge(:action=>"member_monthly_data"))%>'" - value="<%=l(:wt_data_download)%>" -/> -<input type="button" - onclick="location.href='<%=url_for(@link_params.merge(:action=>"member_monthly_data_table"))%>'" - value="<%=l(:wt_data_download_table)%>" -/> -<br/> - -<script type="text/javascript"> -<!-- - var scr = document.getElementById("day_scroll"); - var tgt = document.getElementById("day_scroll_today"); - scr.scrollLeft = tgt.offsetLeft - scr.offsetLeft; ---> -</script> diff --git a/plugins/redmine_work_time/app/views/work_time/ajax_add_tickets_input.html.erb b/plugins/redmine_work_time/app/views/work_time/ajax_add_tickets_input.html.erb deleted file mode 100644 index 5c19f89faf1a383a28153c4fc964115bab898765..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/work_time/ajax_add_tickets_input.html.erb +++ /dev/null @@ -1,51 +0,0 @@ -<div class="wt_add_ticket_block"> -<h2><%=l(:wt_add_ticket)%></h2> -<select onchange="if (this.value != '') { - jQuery.ajax({ - url: this.value, - data: {asynchronous: true, method: 'get'}, - success: function (response) { - jQuery('#input_tickets').replaceWith(response);} - }) - return false;}"> - <option value=''><%=l(:wt_select_project)%></option> - <option disabled="disabled">---</option> - <% - Project.project_tree(@select_projects) do |prj, level| - next unless prj.active? - next if !User.current.allowed_to?(:log_time, prj) - members = Member. - where(["user_id=:u and project_id=:p",{:u=>User.current.id, :p=>prj.id}]). - all - next if members.size==0 - name_prefix = (level > 0 ? ' ' * 2 * level + '» ': '').html_safe - %> - <option value="<%= url_for(:action=>"ajax_add_tickets_input_select", :prj=>prj.id) %>"> - <%= name_prefix + prj.name %> - </option> - <% - end - %> -</select> -<div id="input_tickets" style="display: inline-block;_display: inline;"> - <%=l(:wt_input_ticket_numbers)%> - <form action=""> - <input type="text" - id="input_ids" - size=32 - onKeyPress="if(checkEnter(event)) { - tickets_inputed('<%=url_for(@link_params.merge(:action=>"ajax_add_tickets_insert"))%>'); - return false; - } - return event;" - /> - <input type="button" - value="<%=l(:button_apply)%>" - onclick="tickets_inputed('<%=url_for(@link_params.merge(:action=>"ajax_add_tickets_insert"))%>');" - /> - </form> -</div> -</div> -<script> - $('#input_ids').focus(); -</script> \ No newline at end of file diff --git a/plugins/redmine_work_time/app/views/work_time/ajax_add_tickets_input_select.html.erb b/plugins/redmine_work_time/app/views/work_time/ajax_add_tickets_input_select.html.erb deleted file mode 100644 index 6891d1d92302ce71cd732386017f10994ad7ca20..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/work_time/ajax_add_tickets_input_select.html.erb +++ /dev/null @@ -1,71 +0,0 @@ -<div id="input_tickets"> -<form style="font-size:14px;" action=""> -<% - opt = { - :action => 'ajax_add_tickets_input_select', - :prj => params[:prj], - :all => params[:all] || '0', - :other => params[:other] || '0' - } - - opt[:all] = opt[:all] == '0' ? '1' : '0' if params.key?(:all_toggle) - opt[:other] = opt[:other] == '0' ? '1' : '0' if params.key?(:other_toggle) - - url1 = url_for(opt.merge({:all_toggle => ''})) - url2 = url_for(opt.merge({:other_toggle => ''}) ) - - link_label1 = opt[:all] == '0' ? l(:wt_opt_disp_ticket_with_closed) : l(:wt_opt_disp_ticket_opened_only) - link_label2 = opt[:other] == '0' ? l(:wt_opt_disp_ticket_with_other_member) : l(:wt_opt_disp_ticket_mine_only) -%> -<a href="#" - onclick="jQuery.ajax({ - url: '<%=url1%>', - data: {asynchronous: true, method: 'get'}, - success: function (response) { - jQuery('#input_tickets').replaceWith(response);} - }); - return false;"> - <%= link_label1 %> -</a> -<a href="#" - onclick="jQuery.ajax({ - url: '<%=url2%>', - data: {asynchronous: true, method: 'get'}, - success: function (response) { - jQuery('#input_tickets').replaceWith(response);} - });return false;"> - <%= link_label2 %> -</a> -<br/> - <input type="button" - onclick="tickets_checked('<%=url_for(@link_params.merge(:action=>"ajax_add_tickets_insert"))%>');" - value="<%=l(:wt_apply_checked)%>"/> -<br/> -<div id="tickets_check"> -<% -@issues.each do |issue| - next if issue.nil? || !issue.visible? || (opt[:other] == '0' && issue.assigned_to_id != User.current.id) || (issue.closed? && opt[:all] == '0') -%> - <input type="checkbox" - name="ticket_select_check" - value="<%=issue.id%>" - /> - <input type="button" - onclick="tickets_selected('<%=url_for(@link_params.merge(:action=>"ajax_add_tickets_insert"))%>', '<%=issue.id%>');" - value="<%=l(:button_apply)%>" - /> -(<%= link_to_user(issue.assigned_to || '-') %>): <%= wk_pretty_issue_name issue %> -<a href="#" - onclick="window.open('<%=url_for(:controller=>"issues", :action=>"show", :id=>issue.id)%>');"> - ? -</a> -<br/> -<%end%> -</div> -</form> - <input type="button" - onclick="tickets_checked('<%=url_for(@link_params.merge(:action=>"ajax_add_tickets_insert"))%>');" - value="<%=l(:wt_apply_checked)%>"/> -<br/> -<br/> -</div> diff --git a/plugins/redmine_work_time/app/views/work_time/ajax_add_tickets_insert.html.erb b/plugins/redmine_work_time/app/views/work_time/ajax_add_tickets_insert.html.erb deleted file mode 100644 index 6955beb768729037efa0ec735aff8e4a0485bed8..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/work_time/ajax_add_tickets_insert.html.erb +++ /dev/null @@ -1,72 +0,0 @@ -<%if @add_issue then%> -<tr style="background:#ddf;" id="time_entry_pos<%=@add_issue_id%>_<%=@add_count%>"> - <td> - <div style="position:relative;width:300px;"> - <%=@add_issue.project.name%> - <br/> - <%= link_to(@issueHtml.html_safe, {:controller=>"issues", :action=>"show", :id=>@add_issue.id}, - :popup=>true, :class=>'wt_iss_link', :'data-issue'=>@add_issue.id) %> - <%= print_issue_cost(@add_issue) %> - <%if User.current.allowed_to?(:edit_issues, @add_issue.project)%> - <a name="<%='done_ratio'+@add_issue.id.to_s%>" - class="wt_done_ratio" - data-issue="<%= @add_issue.id %>" - href="#" - onclick="JavaScript: - input_done_ratio( - '<%=url_for(@link_params.merge(:action=>"ajax_done_ratio_input"))%>', - <%=@add_issue.id%>); - return false;"> - [<%=@add_issue.done_ratio%>%] - </a> - <%else%> - [<%=@add_issue.done_ratio%>%] - <%end%> - - <a style="position:absolute;bottom:1px;right:10px;" - href="#" - onclick="JavaScript: - dup_ticket( - '<%=url_for(@link_params.merge(:action=>"ajax_add_tickets_insert"))%>', - 'time_entry_pos<%=@add_issue_id%>_<%=@add_count%>', - <%=@add_issue.id%>); - return false;"> - + - </a> - </div> - </td> - <td> - <%= text_field_tag("new_time_entry["+@add_issue_id+"]["+@add_count+"][hours]", "", :size=>5, :oninput => "sumDayTimes()") %> - </td> - <% if @is_registerd_backlog then %> - <td> - <% if @add_issue_children_cnt != 0 || @add_issue.closed? then %> - <%= @add_issue.remaining_hours %> - <% else %> - <%= text_field_tag("new_time_entry["+@add_issue_id+"]["+@add_count+"][remaining_hours]", @add_issue.remaining_hours, :size=>5, :oninput => "sumDayTimes()") %> - <% end %> - </td> - <% end %> - <td> - <%= select_tag "new_time_entry["+@add_issue_id+"]["+@add_count+"][activity_id]", options_for_select(@activities,@activity_default), :required => true %> - </td> - <td> - <% - if @add_issue.new_statuses_allowed_to(User.current).length == 0 - %> - <%= @add_issue.status %> - <% else %> - <%= select_tag "new_time_entry["+@add_issue_id.to_s+"][0][status_id]", options_for_select(@add_issue.new_statuses_allowed_to(User.current), @add_issue.status), :required => true %> - <% end %> - </td> - <td> - <%= text_field_tag("new_time_entry["+@add_issue_id+"]["+@add_count+"][comments]", "", :size=>80)%> - </td> - <%if @custom_fields.length != 0 - dummy_hour = TimeEntry.new(:project => @add_issue.project, :issue => @add_issue, :user => @this_user, :spent_on => @this_date) - dummy_hour.custom_field_values.each do |cfv| - %> - <td><%= custom_field_tag "new_time_entry_"+@add_issue_id+"_"+@add_count, cfv %></td> - <%end end%> -</tr> -<%end%> diff --git a/plugins/redmine_work_time/app/views/work_time/ajax_done_ratio_input.html.erb b/plugins/redmine_work_time/app/views/work_time/ajax_done_ratio_input.html.erb deleted file mode 100644 index 3b6741f5d57332417830f32313b899794c7f3c1e..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/work_time/ajax_done_ratio_input.html.erb +++ /dev/null @@ -1,31 +0,0 @@ -<div name="<%='done_ratio'+@issue.id.to_s%>"> -<% if @issue.estimated_hours then %> - <%= print_issue_cost(@issue) %> - = - <%= print_issue_cost_rate(@issue) %> - % - <br/> -<% end %> -<form action=""> - <%= @issue.done_ratio %> - % - → - <input type="text" - id="<%='input_ratio'+@issue.id.to_s%>" - size="4" - onKeyPress="if(checkEnter(event)) { - update_done_ratio('<%=url_for(@link_params.merge(:action=>"ajax_done_ratio_update"))%>', <%=@issue.id.to_s%>); - return false; - } - return event; " - value="<%= print_issue_cost_rate(@issue) %>"/> - % - <input type="button" - value="<%=l(:button_apply)%>" - onclick="update_done_ratio('<%=url_for(@link_params.merge(:action=>"ajax_done_ratio_update"))%>', - <%=@issue.id.to_s%>);" /> -</form> -</div> -<script> - $('#<%='input_ratio'+@issue.id.to_s%>').focus(); -</script> \ No newline at end of file diff --git a/plugins/redmine_work_time/app/views/work_time/ajax_done_ratio_update.html.erb b/plugins/redmine_work_time/app/views/work_time/ajax_done_ratio_update.html.erb deleted file mode 100644 index 830bdd7629201a62ce98251ba2a0b67e7febe15a..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/work_time/ajax_done_ratio_update.html.erb +++ /dev/null @@ -1,15 +0,0 @@ -<%# -# チケットの進捗%をAjaxUpdateする -%> -<%if User.current.allowed_to?(:edit_issues, @issue.project)%> - <a name="<%='done_ratio'+@issue.id.to_s%>" - href="#" - onclick="input_done_ratio( - '<%=url_for(@link_params.merge(:action=>"ajax_done_ratio_input"))%>', - <%=@issue.id.to_s%>); - return false;"> - [<%=@issue.done_ratio%>%] - </a> -<%else%> - [<%=@issue.done_ratio%>%] -<%end%> \ No newline at end of file diff --git a/plugins/redmine_work_time/app/views/work_time/ajax_memo_edit.html.erb b/plugins/redmine_work_time/app/views/work_time/ajax_memo_edit.html.erb deleted file mode 100644 index f4484b981e94cda67f7eec7b5b34453863b090e9..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/work_time/ajax_memo_edit.html.erb +++ /dev/null @@ -1,17 +0,0 @@ -<% -year = params["year"] -month = params["month"] -day = params["day"] -user_id = params["user"] -date = Date.new(year.to_i,month.to_i,day.to_i) -wday_name = l(:wt_week_day_names).split(',') -memo=WtDailyMemo.where(["day=:d and user_id=:u",{:d=>date,:u=>user_id}]).first -if memo then -%> -<textarea id="work_time_memo" name="memo" rows="15" cols="100"><%=memo.description -%></textarea> -<%else%> -<textarea id="work_time_memo" name="memo" rows="15" cols="100"></textarea> -<%end%> -<br/> -<%= submit_tag l(:wt_update) %> -<%= wikitoolbar_for 'work_time_memo' %> diff --git a/plugins/redmine_work_time/app/views/work_time/ajax_relay.html.erb b/plugins/redmine_work_time/app/views/work_time/ajax_relay.html.erb deleted file mode 100644 index e80f354733ff0d9463b0151740122de947958cff..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/work_time/ajax_relay.html.erb +++ /dev/null @@ -1,51 +0,0 @@ -<% if @message != '' %> - <div class="wt_error"> - <%=@message.html_safe%> - </div> -<% end %> - -<div class="<%=@relay_modified ? 'wt_modified' : ''%>"> - => - <%=@parent_disp.html_safe%> - <% - if User.current.allowed_to?(:edit_work_time_total, @project) - if @parent_disp != '' - %> - <a href="#" - onclick="jQuery.ajax({ - url: '<%=url_for(:action=>"ajax_relay_input", :issue_id=>@issue_id.to_s)%>', - data: {asynchronous: true, method: 'get'}, - success: function (response) { - jQuery('#ticket_relay_<%=@issue_id.to_s%>').html(response); - } - }); - return false;"> - [<%=l(:button_change)%>] - </a> - <a href="#" - onclick="jQuery.ajax({ - url:'<%=url_for(:action=>'ajax_relay',:issue_id=>@issue_id, :parent_id=>0)%>', - data:{asynchronous:true, method:'get'}, - success: function(response) { - jQuery('#ticket_relay_<%=@issue_id%>').html(response);} - }); - return false;"> - [<%=l(:button_delete)%>] - </a> - <%else%> - <a href="#" - onclick="jQuery.ajax({ - url: '<%=url_for(:action=>"ajax_relay_input", :issue_id=>@issue_id.to_s)%>', - data: {asynchronous: true, method: 'get'}, - success: function (response) { - jQuery('#ticket_relay_<%=@issue_id.to_s%>').html(response); - } - }); - return false;"> - [<%=l(:button_add)%>] - </a> - <% - end - end - %> -</div> diff --git a/plugins/redmine_work_time/app/views/work_time/ajax_relay_input.html.erb b/plugins/redmine_work_time/app/views/work_time/ajax_relay_input.html.erb deleted file mode 100644 index 036077bd1833d8d0e024c4d609484876196e962d..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/work_time/ajax_relay_input.html.erb +++ /dev/null @@ -1,70 +0,0 @@ -<select onchange="JavaScript:if (this.value != '') { - jQuery.ajax({ - url:this.value, - data:{asynchronous:true, method:'get'}, - success:function(response){ - jQuery('#input_area_<%=@issue_id%>').replaceWith(response); - } - }); - return false;}"> - <option value=''><%=l(:wt_select_project)%></option> - <option disabled="disabled">---</option> - <% - @projects.each do |prj| - next unless prj.active? - next if !prj.visible? - %> - <option value="<%= url_for(:action=>"ajax_relay_input_select", :prj=>prj.id, :issue_id=>@issue_id) %>"> - <%= (prj.pos.to_i < 100000) ? prj.pos : '*' %>: <%= prj.name %> - </option> - <% - end - %> -</select> -<div id="input_area_<%=@issue_id%>" style="display: inline-block;_display: inline;"> - <%=l(:wt_input_ticket_numbers)%> - <form action=""> - <input type="text" - id="input_id_<%=@issue_id%>" - size="8" - onKeyPress="if(checkEnter(event)) { - jQuery.ajax({ - url:'<%=url_for(:action=>'ajax_relay',:issue_id=>@issue_id)%>' + - '&parent_id=' + $('#input_id_<%=@issue_id%>').val(), - data:{asynchronous:true, method:'get'}, - success: function(response) { - jQuery('#ticket_relay_<%=@issue_id%>').html(response);} - }); - return false; - } - return event;" - /> - <input type="button" - value="<%=l(:button_apply)%>" - onclick="jQuery.ajax({ - url:'<%=url_for(:action=>'ajax_relay',:issue_id=>@issue_id)%>' + - '&parent_id=' + $('#input_id_<%=@issue_id%>').val(), - data:{asynchronous:true, method:'get'}, - success: function(response) { - jQuery('#ticket_relay_<%=@issue_id%>').html(response);} - }); - return false;" - /> - </form> -</div> - -<a href="#" - onclick="jQuery.ajax({ - url: '<%=url_for(:action=>"ajax_relay", :issue_id=>@issue_id.to_s)%>', - data: {asynchronous: true, method: 'get'}, - success: function (response) { - jQuery('#ticket_relay_<%=@issue_id.to_s%>').html(response); - } - }); - return false;"> - <%=l(:button_cancel)%> -</a> - -<script> - $('#input_id_<%=@issue_id%>').focus(); -</script> diff --git a/plugins/redmine_work_time/app/views/work_time/ajax_relay_input_select.html.erb b/plugins/redmine_work_time/app/views/work_time/ajax_relay_input_select.html.erb deleted file mode 100644 index 559b72a776ca84abc0f6103393eb612c63c6b403..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/work_time/ajax_relay_input_select.html.erb +++ /dev/null @@ -1,51 +0,0 @@ -<div id="input_area_<%=@issue_id%>"> - <% - opt = { - :action => 'ajax_relay_input_select', - :issue_id => @issue_id, - :prj => params[:prj], - :all => params[:all] || '0' - } - - opt[:all] = opt[:all] == '0' ? '1' : '0' if params.key?(:all_toggle) - - url1 = url_for(opt.merge({:all_toggle => ''})) - - link_label1 = opt[:all] == '0' ? l(:wt_opt_disp_ticket_with_closed) : l(:wt_opt_disp_ticket_opened_only) -%> -<a href="#" - onclick="jQuery.ajax({ - url: '<%=url1%>', - data: {asynchronous: true, method: 'get'}, - success: function (response) { - jQuery('#input_area_<%=@issue_id%>').html(response);} - });JavaScript: - return false;"> - <%= link_label1 %> -</a> -<br/> -<% -@issues.each do |issue| - next if issue.nil? || !issue.visible? || (issue.closed? && opt[:all] == '0') -%> -<div style="font-size:14px;"> -<input type="button" - onclick="jQuery.ajax({ - url:'<%=url_for(:action=>'ajax_relay', :issue_id=>@issue_id, :parent_id=>issue.id)%>', - data:{asynchronous:true, method:'get'}, - success: function(response) { - jQuery('#ticket_relay_<%=@issue_id%>').html(response);} - }); - " - value="<%=l(:button_apply)%>" -/> -(<%= link_to_user(issue.assigned_to || '-') %>): <%= wk_pretty_issue_name issue %> -<a href="#" - onclick="window.open('<%=url_for(:controller=>"issues", :action=>"show", :id=>issue.id)%>'); - return false;"> - ? -</a> -<br/> -</div> -<%end%> -</div> diff --git a/plugins/redmine_work_time/app/views/work_time/edit_relay.html.erb b/plugins/redmine_work_time/app/views/work_time/edit_relay.html.erb deleted file mode 100644 index aabf91fc14a4da17cb89068f634bd7f2a6674810..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/work_time/edit_relay.html.erb +++ /dev/null @@ -1,174 +0,0 @@ -<%=javascript_include_tag 'work_time', :plugin=>'redmine_work_time' %> -<%=stylesheet_link_tag 'work_time', :plugin => 'redmine_work_time' %> - -<%= @message.html_safe %> -<div style="text-align:right;"> -<%= render :partial=>'select_project' %> <br/> -[<%= link_to(l(:wt_each_member_report), @link_params.merge(:action=>"show")) %>] -[<%= link_to(l(:wt_raw_total), @link_params.merge(:action=>"total")) %>] -[<%= link_to(l(:wt_relay_total), @link_params.merge(:action=>"relay_total")) %>] -</div> -<% -###################################################### チケット関係テーブルの表示 -%> -<br/> -<h2> - <%=l(:wt_edit_relay)%> - <%= link_to("<<", @link_params.merge(:day=>@last_month.day, :month=>@last_month.month, :year=>@last_month.year))%> - <%= @first_date.strftime("%Y/%m/%d") %> - <%= @last_date.strftime("%Y/%m/%d") %> - <%= link_to(">>", @link_params.merge(:day=>@next_month.day, :month=>@next_month.month, :year=>@next_month.year))%> -</h2> - -<table border="1" id="relay_table"> - <% - prjs = WtProjectOrders.where("uid=-1").order("dsp_pos").all - tickets = WtTicketRelay.order("position").all - tic_max = tickets.size - - prjs.each do |po| - dsp_prj = po.dsp_prj - dsp_pos = po.dsp_pos - next if (!@prj_cost.has_key?(dsp_prj) || @prj_cost[dsp_prj][-1]==0.0) && (!@r_prj_cost.has_key?(dsp_prj) || @r_prj_cost[dsp_prj][-1]==0.0) - prj =Project.find_by_id(dsp_prj) - %> - <tr style="background:#000;color:#fff;"> - <td> - <%if User.current.allowed_to?(:edit_work_time_total, @project) then%> - <a href="#" - style="color:#8ff;" - onclick="JavaScript: - prj_pos( - '<%=url_for(@link_params)%>', - <%=dsp_prj%>, - <%=dsp_pos%>, - <%=prjs.size%>); - return false;"> - <%=dsp_pos%>: - </a> - <%end%> - <%=prj.name%> - </td> - <td style="text-align:right;"> - <%if @prj_cost.has_key?(dsp_prj) && @prj_cost[dsp_prj][-1]!=0%> - <%=sprintf('%1.2f', @prj_cost[dsp_prj][-1])%> - <%else%> - - <%end%> - </td> - <td style="text-align:right;"><b> - <%if @r_prj_cost.has_key?(dsp_prj) && @r_prj_cost[dsp_prj][-1]!=0%> - <%=sprintf('%1.2f', @r_prj_cost[dsp_prj][-1]) %> - <%else%> - - <%end%> - </b></td> - <td> </td> - </tr> - <% - tic_num = 0 - tickets.each do |tic| - issue_id = tic.issue_id - tic_num += 1 - if tic.position != tic_num then # 番号が間違っていたらつけなおし - tic.position = tic_num; tic.save - end - # 当該チケットに集計が無かったらスキップ - next unless @issue_cost.has_key?(issue_id) || @r_issue_cost.has_key?(issue_id) - issue = Issue.find_by_id(issue_id) - parent_id = "" - next if issue.nil? # チケットが削除されていたらパス - next if issue.project_id != dsp_prj - - if tic.parent && tic.parent != 0 then - parent = Issue.find_by_id(tic.parent) - if parent.nil? then - parentHtml = "<del>Issue:"+tic.parent.to_s+"</del>" - else - parent_id = parent.id - parentHtml = parent.closed? ? "<del>"+parent.to_s+"</del>" : parent.to_s - end - else - parentHtml = "" - end - - if @issue_cost.key?(issue_id) && - @issue_cost[issue_id].key?(-1) && - @issue_cost[issue_id][-1]!=0 then - cost=sprintf("%.2f",@issue_cost[issue_id][-1]) - else - cost=" " - end - - if @r_issue_cost.key?(issue_id) && - @r_issue_cost[issue_id].key?(-1) && - @r_issue_cost[issue_id][-1]!=0 then - r_cost=sprintf("%.2f",@r_issue_cost[issue_id][-1]) - else - r_cost=" " - end - - %> - <tr> - <td> - <%if User.current.allowed_to?(:edit_work_time_total, @project) then%> - <a href="#" - onclick="JavaScript: - ticket_pos('<%=url_for(@link_params)%>', - <%=issue_id%>, - <%=tic.position%>, - <%=tic_max%>); - return false;"> - <%=tic.position%> - </a> - <%end%> - <%= link_to(wk_pretty_issue_name(issue), {:controller=>"issues", :action=>"show", :id=>issue.id}, :popup=>true) %> - <%= print_issue_cost(issue) %> - </td> - <td style="text-align:right;"><%=cost.html_safe%></td> - <td style="text-align:right;"><%=r_cost.html_safe%></td> - <td id="ticket_relay_<%=issue_id%>"></td> - <script> - jQuery.ajax({ - url: '<%=url_for(:action=>"ajax_relay", :issue_id=>issue_id.to_s)%>', - data: {asynchronous: true, method: 'get'}, - success: function (response) { - jQuery('#ticket_relay_<%=issue_id.to_s%>').html(response); - } - }); - </script> - </tr> - <% - end - end - %> - <% if @prj_cost.has_key?(-1) || @r_prj_cost.has_key?(-1) then%> - <tr style="background:#000;color:#fff;"> - <td>private</td> - <td style="text-align:right;"> - <%if @prj_cost.has_key?(-1) then%> - <%=sprintf('%1.2f', @prj_cost[-1][-1])%> - <%else%> - - <%end%> - </td> - <td style="text-align:right;"> - <%if @r_prj_cost.has_key?(-1) then%> - <b><%=sprintf('%1.2f', @r_prj_cost[-1][-1]) if @r_prj_cost[-1][-1]%></b> - <%else%> - - <%end%> - </td> - <td> </td> - </tr> - <% end %> - -</table> -<%= submit_tag(l('wt_bulkupdate_relations'), - {:type => 'button', - :onclick => "set_ticket_relay_by_issue_relation('#{url_for(:action=>'ajax_relay', :parent_id=>-1)}')".html_safe}) %> -<div style="text-align:right;"> -<%= render :partial=>'select_project' %> <br/> -[<%= link_to(l(:wt_each_member_report), @link_params.merge(:action=>"show")) %>] -[<%= link_to(l(:wt_raw_total), @link_params.merge(:action=>"total")) %>] -[<%= link_to(l(:wt_relay_total), @link_params.merge(:action=>"relay_total")) %>] -</div> diff --git a/plugins/redmine_work_time/app/views/work_time/relay_total.api.rsb b/plugins/redmine_work_time/app/views/work_time/relay_total.api.rsb deleted file mode 100644 index 7636aa37e8474edb7e364752bea01dd0ef1b9f19..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/work_time/relay_total.api.rsb +++ /dev/null @@ -1,27 +0,0 @@ -api.total_relay do - api.total_cost @total_cost - api.array :member_cost do - @members.each do |mem_info| - if @member_cost.key?(mem_info[1].id) && @member_cost[mem_info[1].id] > 0 then - api.member_cost do - api.user(:id => mem_info[1].id, :firstname => mem_info[1].firstname, :lastname => mem_info[1].lastname) unless mem_info[1].nil? - api.cost @member_cost[mem_info[1].id] - end - end - end - end - api.array :issues_cost do - @r_issue_cost.each do |issue,cost| - iss = Issue.find_by_id(issue) - api.issue_cost do - api.issue do - api.id iss.id unless iss.nil? - api.tracker(:id => iss.tracker.id, :name => iss.tracker.name) unless iss.tracker.nil? - api.subject iss.subject - end - api.cost cost[-1] - end - end - end -end - diff --git a/plugins/redmine_work_time/app/views/work_time/relay_total.html.erb b/plugins/redmine_work_time/app/views/work_time/relay_total.html.erb deleted file mode 100644 index 8411776d61cc5f0265c2f6cc5063a91ba9b1fb84..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/work_time/relay_total.html.erb +++ /dev/null @@ -1,206 +0,0 @@ -<%=javascript_include_tag "work_time", :plugin=>'redmine_work_time' %> -<%=stylesheet_link_tag 'work_time', :plugin => 'redmine_work_time' %> - -<%= @message.html_safe %> -<div style="text-align:right;"> -<%= render :partial=>'select_project' %> <br/> -[<%= link_to(l(:wt_each_member_report), @link_params.merge(:action=>"show")) %>] -[<%= link_to(l(:wt_edit_relay), @link_params.merge(:action=>"edit_relay")) %>] -[<%= link_to(l(:wt_raw_total), @link_params.merge(:action=>"total")) %>] -</div> - -<h2> - <%=l(:wt_relay_total)%> - <%= link_to("<<", @link_params.merge(:day=>@last_month.day, :month=>@last_month.month, :year=>@last_month.year))%> - <%= @first_date.strftime("%Y/%m/%d") %> - <%= @last_date.strftime("%Y/%m/%d") %> - <%= link_to(">>", @link_params.merge(:day=>@next_month.day, :month=>@next_month.month, :year=>@next_month.year))%> -</h2> - -<% -if !User.current.allowed_to?(:view_work_time_other_member, @project) then - return -end -############################################## 集計表 ##################### -%> -<table border="1"> -<tr valign="top"> -<td> -</td> -<td style="background:#ddd;"></td> -<% -max = @members.size -@members.each do |mem_info| - pos = mem_info[0] - user = mem_info[1] -%> -<td align="center"> -<%if User.current.allowed_to?(:edit_work_time_total, @project) then%> -<a href="#" - onclick="JavaScript: - member_pos( - '<%=url_for(@link_params)%>', - <%=user.id%>, - <%=pos%>, - <%=max%>); - return false;"> - <%=pos%> -</a> -<%end%> -<div style="top:2px;width:56px;font-size:10px;"> -<%= link_to(user, @link_params.merge(:action=>"show", :user=>user.id))%> -</div> -</td> -<% -end -%> -</tr> - -<tr> -<td style="background:#ddd;"> -</td> -<td style="background:#ddd;text-align:right;"> -<%=sprintf('%1.2f', @total_cost)%> -</td> -<% -#---------------------------------------各人の合計を表示 -@members.each do |mem_info| - user=mem_info[1] -%> -<td style="background:#ddd;text-align:right;"> -<%= (@member_cost.key?(user.id) && @member_cost[user.id] !=0 ) ? sprintf('%1.2f', @member_cost[user.id]) : " "%> -</td> -<% -end -%> -</tr> - -<% -prjs = WtProjectOrders.where("uid=-1").order("dsp_pos").all - -tickets = WtTicketRelay.order("position").all -tic_max = tickets.size - -#-------------------------------------- チケット行のループ -prjs.each do |po| - dsp_prj = po.dsp_prj - dsp_pos = po.dsp_pos - next unless @r_prj_cost.key?(dsp_prj) # 値の無いプロジェクトはパス - next unless @r_prj_cost[dsp_prj].key?(-1) # 値の無いプロジェクトはパス - next if @r_prj_cost[dsp_prj][-1] == 0 # 値の無いプロジェクトはスパ - prj =Project.find(dsp_prj) -%> -<tr style="background:#000;color:#fff;"> - <td> -<%if User.current.allowed_to?(:edit_work_time_total, @project) then%> - <a href="#" - style="color:#8ff;" - onclick="JavaScript: - prj_pos( - '<%=url_for(@link_params)%>', - <%=dsp_prj%>, - <%=dsp_pos%>, - <%=prjs.size%>); - return false;"> - <%=dsp_pos%>: - </a> -<%end%> - <%=prj.name%> - </td> - <td style="text-align:right;"> <%=sprintf('%1.2f', (@r_prj_cost[dsp_prj])[-1])%> </td> -<% -@members.each do |mem_info| - user=mem_info[1] - uid=user.id -%> - <td style="text-align:right;"> - <%= @r_prj_cost[dsp_prj].key?(uid) ? sprintf('%1.2f', (@r_prj_cost[dsp_prj])[uid]) : " "%> - </td> -<% -end -%> -</tr> -<% -tickets.each do |tic| - issue_id = tic.issue_id - next unless @r_issue_cost.key?(issue_id) # 値の無いチケットはパス - next unless @r_issue_cost[issue_id].key?(-1) # 値の無いチケットはパス - next if @r_issue_cost[issue_id][-1] == 0 # 値の無いチケットはパス - - issue = Issue.find_by_id(issue_id) - next if issue.nil? # チケットが削除されていたらパス - next if issue.project_id != dsp_prj # このプロジェクトに表示するチケットでない場合はパス - -%> -<tr> -<td> -<%if User.current.allowed_to?(:edit_work_time_total, @project) then%> - <a href="#" - onclick="JavaScript: - ticket_pos( - '<%=url_for(@link_params)%>', - <%=issue_id%>, - <%=tic.position%>, - <%=tic_max%>); - return false;"> - <%=tic.position%> - </a> -<%end%> - <%= link_to( wk_pretty_issue_name(issue), {:controller=>"issues", :action=>"show", :id=>issue.id}, :popup=>true) %> - <%= print_issue_cost(issue) %> -</td> - -<td style="background:#ddd;text-align:right;"> -<%=sprintf('%1.2f', (@r_issue_cost[issue_id])[-1])%> -</td> - -<% -@members.each do |mem_info| - user=mem_info[1] -%> -<td style="text-align:right;"> -<% if @r_issue_cost.key?(issue_id) && @r_issue_cost[issue_id].key?(user.id) then %> -<%= sprintf('%1.2f', (@r_issue_cost[issue_id])[user.id]) %> -<%else%> - -<%end%> -</td> -<% -end -%> - -</tr> -<% - end -end -if @r_prj_cost.has_key?(-1) then -%> -<tr style="background:#000;color:#fff;"> - <td>private</td> - <td style="text-align:right;"> <%=sprintf('%1.2f', (@r_prj_cost[-1])[-1])%> </td> -<% -@members.each do |mem_info| - user=mem_info[1] - uid=user.id -%> - <td style="text-align:right;"> - <%= @r_prj_cost[-1].key?(uid) ? sprintf('%1.2f', (@r_prj_cost[-1])[uid]) : " "%> - </td> -<%end%> -</tr> -<%end%> -</table> -<input type="button" - onclick="location.href='<%=url_for(@link_params.merge(:action=>"relay_total_data"))%>'" - value="<%=l(:wt_data_download)%>" -/> -<input type="button" - onclick="location.href='<%=url_for(@link_params.merge(:action=>"relay_total_data_with_act"))%>'" - value="<%=l(:wt_data_download_with_act)%>" -/> - -<div style="text-align:right;"> -<%= render :partial=>'select_project' %> <br/> -[<%= link_to(l(:wt_each_member_report), @link_params.merge(:action=>"show")) %>] -[<%= link_to(l(:wt_edit_relay), @link_params.merge(:action=>"edit_relay")) %>] -[<%= link_to(l(:wt_raw_total), @link_params.merge(:action=>"total")) %>] -</div> diff --git a/plugins/redmine_work_time/app/views/work_time/show.html.erb b/plugins/redmine_work_time/app/views/work_time/show.html.erb deleted file mode 100644 index 145de77e7879a8c9f1a529d9df206271caa8888b..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/work_time/show.html.erb +++ /dev/null @@ -1,143 +0,0 @@ -<%=javascript_include_tag "work_time", :plugin=>'redmine_work_time' %> -<%=stylesheet_link_tag 'work_time', :plugin => 'redmine_work_time' %> - -<%= @message.html_safe %> -<div class="contextual"> -<%= render :partial=>'select_project' %> -<%if User.current.allowed_to?(:view_work_time_other_member, @project) then%> - <%= render :partial=>'select_user', :locals=>{:link_params=>@link_params} %> - <%= link_to(l(:wt_relay_total), @link_params.merge(:action=>"relay_total")) %> -<%end%> - <%if User.current.admin then%> - <%if WtHolidays.where(["holiday=:h and deleted_on is null",{:h=>@this_date}]).all.size == 0 then %> - <input type="button" - onclick="location.href='<%=url_for(@link_params.merge(:set_holiday=>@this_date))%>'" - value="<%=l(:wt_set_holiday)%>" - /> - <%else%> - <input type="button" - onclick="location.href='<%=url_for(@link_params.merge(:del_holiday=>@this_date))%>'" - value="<%=l(:wt_del_holiday)%>" - /> - <%end%> - <%end%> -</div> - -<%= render :partial=>'user_month_table' %> - -<br/> -<hr/> - -<%= form_tag @link_params do %> - <h2> - <%=l(:wt_daily_report)%> - <%=@this_date.strftime("%Y-%m-%d")%> - </h2> - - <%= hidden_field_tag('year', @this_date.year) %> - <%= hidden_field_tag('month', @this_date.month) %> - <%= hidden_field_tag('day', @this_date.day) %> - <%= hidden_field_tag('user', @this_uid) %> - <%= hidden_field_tag('prj', @restrict_project) %> - - <table style="background: #eeeeee;"><tr><td> - <table style="display:inline-block; border:0;"> - <tr> - <td><%=l(:wt_legend)%>:</td> - <td class='wt_iss_default' width='100px' align='center'><%=l(:wt_style_default)%></td> - <td class='wt_iss_assigned' width='100px' align='center'><%=l(:wt_style_assigned)%></td> - <td class='wt_iss_worked' width='100px' align='center'><%=l(:wt_style_worked)%></td> - <td class='wt_iss_assigned_worked' width='100px' align='center'><%=l(:wt_style__assigned_worked)%></td> - <td class='wt_iss_overdue' width='100px' align='center'><%=l(:wt_style_overdue)%> - <td class='wt_iss_assigned_overdue' width='100px' align='center'><%=l(:wt_style_assigned_overdue)%> - </td><td class='wt_iss_overdue_worked' width='100px' align='center'><%=l(:wt_style_overdue_worked)%></td> - <td class='wt_iss_assigned_overdue_worked' width='100px' align='center'><%=l(:wt_style_assigned_overdue_worked)%></td> - </tr> - </table> - </td></tr></table> - <%= render :partial=>'user_day_table' %> - -<%if @this_uid==@crnt_uid || User.current.allowed_to?(:edit_work_time_other_member, @project) %> - <%= submit_tag l(:wt_update) %> - : - <input type="button" - onclick="location.href='<%=url_for(@link_params.merge(:ticket_del=>"closed"))%>'" - value="<%=l(:wt_delete_closed_tickets)%>" - /> - <div id="add_ticket_area" style="display: inline-block;_display: inline;"> - <input type="button" - onclick="jQuery.ajax({ - url: '<%=url_for(:action=>"ajax_add_tickets_input")%>', - data:{asynchronous:true, method:'get'}, - success: function(response){ - jQuery('#add_ticket_area').replaceWith(response); - } - }); - return false;" - value="<%=l(:wt_add_ticket)%>" - /> - </div> -<%end%> - - <%#------------------------- Legend for the daily table%> - <br/> - <br/> - <hr/> - -<h2 id="memo"> - <%=link_to(@this_date.strftime("%Y-%m-%d")+'('+@wday_name[@this_date.wday]+') '+@this_user.to_s, - @link_params.merge(:anchor=>"memo")) - %> -</h2> - -<%#------------------------------------------- Wiki表示#%> -<div id="memo-wiki"> -<% -memo=WtDailyMemo.where(["day=:d and user_id=:u",{:d=>@this_date,:u=>@this_uid}]).first -if memo then # この日のメモがある場合 -%> -<div class="wiki wt_memo_wiki_block"> - <%=textilizable(memo.description) %> - <div style="text-align:right;"> - (update:<%=memo.updated_on.localtime.strftime("%Y-%m-%d %H:%M")%>) - </div> -</div> -<%end%> - -<% -memo=WtDailyMemo.where(["day<:d and user_id=:u",{:d=>@this_date,:u=>@this_uid}]).order("day DESC").first -if memo then -d = memo.day -%> -[<%=link_to(l(:wt_pre_memo), @link_params.merge(:anchor=>"memo", :day=>d.day, :month=>d.month, :year=>d.year))%>] -<%end%> - -<%if @this_uid==@crnt_uid then%> -[<a href="#" - onclick="jQuery.ajax({ - url: '<%=url_for(@link_params.merge(:action=>"ajax_memo_edit"))%>', - data:{asynchronous:true, method:'get'}, - success: function(response){ - jQuery('#memo-wiki').html(response); - } - }); - return false;"> - <%=l(:wt_edit_memo)%> -</a>] -<%end%> - -<% -memo=WtDailyMemo.where(["day>:d and user_id=:u",{:d=>@this_date,:u=>@this_uid}]).order("day").first -if memo then -d = memo.day -%> -[<%= link_to(l(:wt_next_memo), @link_params.merge(:anchor=>"memo", :day=>d.day, :month=>d.month, :year=>d.year))%>] -<%end%> -</div> -<br/> - -<%if User.current.allowed_to?(:view_work_time_other_member, @project) then%> - <%= render :partial=>'select_user', :locals=>{:link_params=>@link_params.merge(:anchor=>"memo")} %> -<%end%> - -<%end%> diff --git a/plugins/redmine_work_time/app/views/work_time/total.html.erb b/plugins/redmine_work_time/app/views/work_time/total.html.erb deleted file mode 100644 index c1378e0cb7678e63f365e48c69f42142acb7ff85..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/app/views/work_time/total.html.erb +++ /dev/null @@ -1,206 +0,0 @@ -<%=javascript_include_tag "work_time", :plugin=>'redmine_work_time' %> -<%=stylesheet_link_tag 'work_time', :plugin => 'redmine_work_time' %> - -<%= @message.html_safe %> -<div style="text-align:right;"> -<%= render :partial=>'select_project' %> <br/> -[<%= link_to(l(:wt_each_member_report), @link_params.merge(:action=>"show")) %>] -[<%= link_to(l(:wt_edit_relay), @link_params.merge(:action=>"edit_relay")) %>] -[<%= link_to(l(:wt_relay_total), @link_params.merge(:action=>"relay_total")) %>] -</div> - -<h2> - <%=l(:wt_raw_total)%> - <%=link_to("<<", @link_params.merge(:day=>@last_month.day, :month=>@last_month.month, :year=>@last_month.year))%> - <%= @first_date.strftime("%Y/%m/%d") %> - <%= @last_date.strftime("%Y/%m/%d") %> - <%=link_to(">>", @link_params.merge(:day=>@next_month.day, :month=>@next_month.month, :year=>@next_month.year))%> -</h2> - -<% -if !User.current.allowed_to?(:view_work_time_other_member, @project) then - return -end -############################################## 集計表 ##################### -%> -<table border="1"> -<tr valign="top"> -<td> -</td> -<td style="background:#ddd;"></td> -<% -max = @members.size -@members.each do |mem_info| - pos=mem_info[0] - user=mem_info[1] -%> -<td align="center"> -<%if User.current.allowed_to?(:edit_work_time_total, @project) then%> -<a href="#" - onclick="JavaScript: - member_pos( - '<%=url_for(@link_params)%>', - <%=user.id%>, - <%=pos%>, - <%=max%>); - return false;"> - <%=pos%> -</a> -<%end%> -<div style="top:2px;width:56px;font-size:10px;"> -<%= link_to(user, @link_params.merge(:action=>"show", :user=>user.id))%> -</div> -</td> -<% -end -%> -</tr> - -<tr> -<td style="background:#ddd;"> -</td> -<td style="background:#ddd;text-align:right;"> -<%=sprintf('%1.2f', @total_cost)%> -</td> -<% -#---------------------------------------各人の合計を表示 -@members.each do |mem_info| - user=mem_info[1] -%> -<td style="background:#ddd;text-align:right;"> -<%= (@member_cost.key?(user.id) && @member_cost[user.id] !=0 ) ? sprintf('%1.2f', @member_cost[user.id]) : " "%> -</td> -<% -end -%> -</tr> - -<% -prjs = WtProjectOrders.where("uid=-1").order("dsp_pos").all - -tickets = WtTicketRelay.order("position").all -tic_max = tickets.size - -#-------------------------------------- チケット行のループ -prjs.each do |po| - dsp_prj = po.dsp_prj - dsp_pos = po.dsp_pos - next unless @prj_cost.key?(dsp_prj) # 値の無いプロジェクトはパス - next unless @prj_cost[dsp_prj].key?(-1) # 値の無いプロジェクトはパス - next if @prj_cost[dsp_prj][-1] == 0 # 値の無いプロジェクトはスパ - prj =Project.find(dsp_prj) -%> -<tr style="background:#000;color:#fff;"> - <td> -<%if User.current.allowed_to?(:edit_work_time_total, @project) then%> - <a href="#" - style="color:#8ff;" - onclick="JavaScript: - prj_pos( - '<%=url_for(@link_params)%>', - <%=dsp_prj%>, - <%=dsp_pos%>, - <%=prjs.size%>); - return false;"> - <%=dsp_pos%>: - </a> -<%end%> - <%=prj.name%> - </td> - <td style="text-align:right;"> <%=sprintf('%1.2f', (@prj_cost[dsp_prj])[-1])%> </td> -<% -@members.each do |mem_info| - user=mem_info[1] - uid=user.id -%> - <td style="text-align:right;"> - <%= @prj_cost[dsp_prj].key?(uid) ? sprintf('%1.2f', (@prj_cost[dsp_prj])[uid]) : " "%> - </td> -<% -end -%> -</tr> -<% -tickets.each do |tic| - issue_id = tic.issue_id - next unless @issue_cost.key?(issue_id) # 値の無いチケットはパス - next unless @issue_cost[issue_id].key?(-1) # 値の無いチケットはパス - next if @issue_cost[issue_id][-1] == 0 # 値の無いチケットはパス - - issue = Issue.find_by_id(issue_id) - next if issue.nil? # チケットが削除されていたらパス - next if issue.project_id != dsp_prj # このプロジェクトに表示するチケットでない場合はパス - -%> -<tr> -<td> -<%if User.current.allowed_to?(:edit_work_time_total, @project) then%> - <a href="#" - onclick="JavaScript: - ticket_pos( - '<%=url_for(@link_params)%>', - <%=issue_id%>, - <%=tic.position%>, - <%=tic_max%>); - return false;"> - <%=tic.position%> - </a> -<%end%> - <%= link_to(wk_pretty_issue_name(issue), {:controller=>"issues", :action=>"show", :id=>issue.id}, :popup=>true) %> - <%= print_issue_cost(issue) %> -</td> - -<td style="background:#ddd;text-align:right;"> -<%=sprintf('%1.2f', (@issue_cost[issue_id])[-1])%> -</td> - -<% -@members.each do |mem_info| - user=mem_info[1] -%> -<td style="text-align:right;"> -<% if @issue_cost.key?(issue_id) && @issue_cost[issue_id].key?(user.id) then %> -<%= sprintf('%1.2f', (@issue_cost[issue_id])[user.id]) %> -<%else%> - -<%end%> -</td> -<% -end -%> - -</tr> -<% - end -end -if @prj_cost.has_key?(-1) then -%> -<tr style="background:#000;color:#fff;"> - <td>private</td> - <td style="text-align:right;"> <%=sprintf('%1.2f', (@prj_cost[-1])[-1])%> </td> -<% -@members.each do |mem_info| - user=mem_info[1] - uid=user.id -%> - <td style="text-align:right;"> - <%= @prj_cost[-1].key?(uid) ? sprintf('%1.2f', (@prj_cost[-1])[uid]) : " "%> - </td> -<%end%> -</tr> -<%end%> -</table> -<input type="button" - onclick="location.href='<%=url_for(@link_params.merge(:action=>"total_data"))%>'" - value="<%=l(:wt_data_download)%>" -/> -<input type="button" - onclick="location.href='<%=url_for(@link_params.merge(:action=>"total_data_with_act"))%>'" - value="<%=l(:wt_data_download_with_act)%>" -/> - -<div align="right"> -<%= render :partial=>'select_project' %> <br/> -[<%= link_to(l(:wt_each_member_report), @link_params.merge(:action=>"show")) %>] -[<%= link_to(l(:wt_edit_relay), @link_params.merge(:action=>"edit_relay")) %>] -[<%= link_to(l(:wt_relay_total), @link_params.merge(:action=>"relay_total")) %>] -</div> diff --git a/plugins/redmine_work_time/assets/javascripts/work_time.js b/plugins/redmine_work_time/assets/javascripts/work_time.js deleted file mode 100644 index 6f39ce160a4bfe174a7b663510baa7906c096714..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/assets/javascripts/work_time.js +++ /dev/null @@ -1,172 +0,0 @@ -function ticket_pos(url, issue, pos, max) -{ - var new_pos = prompt("Destination No.", pos); - if(new_pos != null) { - if((new_pos>=1) && (new_pos<=max)) - location.replace(url+"&ticket_pos="+issue+"_"+new_pos); - else - alert("Out of range!"); - } -} - -function prj_pos(url, prj, pos, max) -{ - var new_pos = prompt("Destination No.", pos); - if(new_pos != null) { - if((new_pos>=1) && (new_pos<=max)) - location.replace(url+"&prj_pos="+prj+"_"+new_pos); - else - alert("Out of range!"); - } -} - -function member_pos(url, user_id, pos, max) -{ - var new_pos = prompt("Distination No.", pos); - if(new_pos != null) { - if((new_pos>=1) && (new_pos<=max)) - location.replace(url+"&member_pos="+user_id+"_"+new_pos); - else - alert("Out of rnage!"); - } -} - -function set_ticket_relay_by_issue_relation(ajax_url) { - $('[id^=ticket_relay_]').each(function(){ - var issue_id = $(this).attr('id').replace(/.*([^_]+)$/, "$1"); - jQuery.ajax({ - url: ajax_url + '&issue_id=' + issue_id, - data:{asynchronous:true, method:'get'}, - success: function(response) { - jQuery('#ticket_relay_'+issue_id).html(response); - } - }); - }) -} - -function input_done_ratio(ajax_url, issue_id) { - jQuery.ajax({ - url: ajax_url + "&issue_id=" + issue_id, - data: {asynchronous: true, method: 'get'}, - success: function (response) { - jQuery('[name="done_ratio'+ issue_id+'"]:first').replaceWith(response); - } - }); -} - -function update_done_ratio(ajax_url, issue_id) { - var done_ratio = $('#input_ratio'+issue_id).val(); - jQuery.ajax({ - url:ajax_url+"&issue_id="+issue_id+"&done_ratio="+done_ratio, - data:{asynchronous:true, method:'get'}, - success:function(response){ - jQuery('[name="done_ratio'+ issue_id+'"]').replaceWith(response); - } - }); -} - -function checkEnter(e) -{ - if (!e) var e = window.event; - if(e.keyCode == 13) - return true; - else - return false; -} - -//------------------------------------------------- for show.html.erb -var add_ticket_count = 1; - -function dup_ticket(ajax_url, insert_pos, id) -{ - jQuery.ajax({ - url:ajax_url+"&add_issue="+id+"&count="+add_ticket_count, - data:{asynchronous:true, method:'get'}, - success:function(response){ - jQuery('#'+insert_pos).after(response); - } - }); - add_ticket_count ++; -} - -function tickets_insert(ajax_url, tickets) -{ - for(i=0; i<tickets.length;i++) { - jQuery.ajax({ - url:ajax_url+"&add_issue="+tickets[i]+"&count="+add_ticket_count, - data:{asynchronous:true, method:'get'}, - success:function(response){ - jQuery('#time_input_table_bottom').before(response); - } - }); - add_ticket_count ++; - } -} - -function tickets_inputed(ajax_url) -{ - var vals = document.getElementById("input_ids").value; - var tickets = vals.split(','); - tickets_insert(ajax_url, tickets); -} - -function tickets_selected(ajax_url, issue_id) -{ - var tickets = [issue_id]; - tickets_insert(ajax_url, tickets); -} - -function tickets_checked(ajax_url) -{ - var $checked = $('[name="ticket_select_check"]:checked'); - var tickets = $checked.map(function(i,e){return $(this).val()}); - tickets_insert(ajax_url, tickets); -} - -function statusUpdateOnDailyTable(name) { - obj = document.getElementsByName(name)[0]; - obj.style.backgroundColor = '#cfc'; - index = obj.selectedIndex; - v = obj.options[index].value; - obj.options[index].value = 'M'+v; -} - -//------------- for user_day_table.html.erb -function sumDayTimes() { - var total=0; - var dayInputs; - - // List all Input elemnets of the page - dayInputs = document.getElementsByTagName("input"); - for (var i=0; i<dayInputs.length; i++) { - // Consider only those with an id containing the strings 'time_entry' and 'hours' - if ((dayInputs[i].id.indexOf("time_entry") >= 0) && (dayInputs[i].id.indexOf("hours") >= 0)) { - var val = dayInputs[i].value; - if (val) { - var vals = val.match(/^([\d\.]+)$/); - if (vals) { - // add the number to the total if it is a valid number - total = total + parseFloat(vals[1]); - } - else { - vals = val.match(/^(\d+)m$/); - if(vals) { - total = total + parseFloat(vals[1])/60; - } - else { - vals = val.match(/^(\d+):(\d+)$/); - if(vals) { - total = total + parseFloat(vals[1]) + parseFloat(vals[2])/60; - } - } - } - } - } - } - // Set the total value to the new number, changing the style to indicate - // it is not saved, and adding the saved value as a flyover indication - var originalValue; - document.getElementById("currentTotal").innerHTML = total.toFixed(2); - document.getElementById("currentTotal").style = 'color:#FF0000;'; - return true; -} diff --git a/plugins/redmine_work_time/assets/stylesheets/work_time.css b/plugins/redmine_work_time/assets/stylesheets/work_time.css deleted file mode 100644 index 7e8599f550be811026c7ccc802718258e26a6f8f..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/assets/stylesheets/work_time.css +++ /dev/null @@ -1,51 +0,0 @@ -h1 { - margin-top: 0; - margin-bottom: 0 -} - -h2 { - margin-top: 0; - margin-bottom: 0 -} - -div.wt_modified { - background: #cfc; -} - -div.wt_error { - background: #faa; -} - -div.wt_memo_wiki_block { - background: #ffb; -} -div.wt_add_ticket_block { - background: #ddd; - border: 1px solid black; -} - -/* use day table */ -td.wt_iss_default { - background: #fff; -} -td.wt_iss_worked { - background: #cfc; -} -td.wt_iss_overdue { - background: #ffc; -} -td.wt_iss_overdue_worked { - background: #ccc; -} -td.wt_iss_assigned { - background: #cff; -} -td.wt_iss_assigned_worked { - background: #ccf; -} -td.wt_iss_assigned_overdue { - background: #fcc; -} -td.wt_iss_assigned_overdue_worked { - background: #fcf; -} diff --git a/plugins/redmine_work_time/config/locales/ca.yml b/plugins/redmine_work_time/config/locales/ca.yml deleted file mode 100644 index dee1fcd841de10b361bff063167e380757e43d89..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/config/locales/ca.yml +++ /dev/null @@ -1,49 +0,0 @@ -ca: - work_time: "Agenda" - wt_update: "Actualitzar" - wt_month_names: "Gen,Feb,Mar,Abr,Mai,Jun,Jul,Ago,Sep,Oct,Nov,Dic" - wt_week_day_names: "Diu,Dll,Dm,Dx,Di,Dv,Ds" - wt_monthly_report: "Informe mensual" - wt_daily_report: "Informe diari" - wt_each_member_report: "Informe de membre" - wt_raw_total: "Informe mensual(no se retransmet)" - wt_edit_relay: "Editor transmisió de peticions" - wt_relay_total: "Informe mensual de peticions" - wt_ticket: "Petició" - wt_add_ticket: "Afegir petició" - wt_no_permission: "Sense permís" - wt_loop_relay: "Transmisió de petició en bucle" - wt_set_holiday: "Estableix vacances en aquesta data" - wt_del_holiday: "Elimina vacances en aquesta data" - wt_apply_checked: "Aplica a tots els seleccionats" - wt_select_project: "Seleccione projecte..." - wt_select_user: "Selecciona usuari..." - wt_edit_memo: "Edita memorandum" - wt_pre_memo: "Anterior memorandum" - wt_next_memo: "Següent memorandum" - wt_data_list: "Llista de dades" - wt_input_ticket_numbers: "o introdueix número de petició" - wt_delete_closed_tickets: "borrar tiquests tancats" - wt_data_download: "descarregar dades" - wt_data_download_table: "descarregar dades taula" - wt_data_download_with_act: "descarregar dades(de cada activitat)" - wt_opt_disp_ticket_with_closed: "[mostrar tiquets tancants]" - wt_opt_disp_ticket_opened_only: "[mostrar només tiquets oberts]" - wt_opt_disp_ticket_with_other_member: "[mostrar tiquets d'altres membres]" - wt_opt_disp_ticket_mine_only: "[mostrar només els meus tiquets]" - wt_bulkupdate_relations: "actualizar al pare" - permission_view_work_time_tab: "Veure pestanya temps treballat" - permission_view_work_time_other_member: "Veure el temps treballat d'altres membres" - permission_edit_work_time_total: "Editar temps total treballat" - permission_edit_work_time_other_member: "Editar el tiemps treballat d'altres membres" - wt_saved_value: "Guardar cronometrat: " - wt_legend: "Llegenda" - wt_style_default: "Per defecte" - wt_style_assigned: "Assignat" - wt_style_worked: "Treballat per" - wt_style__assigned_worked: "Assignat i treballat per" - wt_style_overdue: "Atrassat" - wt_style_assigned_overdue: "Assignat i atrassat" - wt_style_overdue_worked: "Atrassat i treballat per" - wt_style_assigned_overdue_worked: "Assignat, atrassat i treballat per" - wt_account_start_day: "Data inici companyia" diff --git a/plugins/redmine_work_time/config/locales/de.yml b/plugins/redmine_work_time/config/locales/de.yml deleted file mode 100644 index 396e4af5b7783d9529eedee6d45b23e5764689a4..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/config/locales/de.yml +++ /dev/null @@ -1,49 +0,0 @@ -de: - work_time: "Zeiterfassung" - wt_update: "Aktualisieren" - wt_month_names: "Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez" - wt_week_day_names: "So,Mo,Di,Mi,Do,Fr,Sa" - wt_monthly_report: "Monatsbericht" - wt_daily_report: "Tagesbericht" - wt_each_member_report: "Bericht pro Benutzer" - wt_raw_total: "Monatsbericht (ohne Fortschreibung)" - wt_edit_relay: "Aufwände fortschreiben" - wt_relay_total: "Monatsbericht" - wt_ticket: "Ticket" - wt_add_ticket: "Ticket hinzufügen" - wt_no_permission: "Keine Berechtigung" - wt_loop_relay: "Zyklus bei der Aufwandsfortschreibung!" - wt_set_holiday: "Tag zum Urlaubs-/Feiertag machen" - wt_del_holiday: "Tag zum Arbeitstag machen" - wt_apply_checked: "Alle ausgewählten Einträge übernehmen" - wt_select_project: "Projektauswahl" - wt_select_user: "Benutzerauswahl" - wt_edit_memo: "Memo ändern" - wt_pre_memo: "Vorheriges Memo" - wt_next_memo: "Nächstes Memo" - wt_data_list: "Datenliste" - wt_input_ticket_numbers: "oder Ticket-Nr. direkt eingeben" - wt_delete_closed_tickets: "delete closed tickets" - wt_data_download: "Daten laden" - wt_data_download_table: "Tabelle Daten laden" - wt_data_download_with_act: "Daten laden(each activity)" - wt_opt_disp_ticket_with_closed: "[display closed ticket]" - wt_opt_disp_ticket_opened_only: "[display opened ticket only]" - wt_opt_disp_ticket_with_other_member: "[display other members ticket]" - wt_opt_disp_ticket_mine_only: "[display my ticket only]" - wt_bulkupdate_relations: "bulkupdate to parent" - permission_view_work_time_tab: "View Work time tab" - permission_view_work_time_other_member: "View other members' work time" - permission_edit_work_time_total: "Edit work time totals" - permission_edit_work_time_other_member: "Edit other members' work time" - wt_saved_value: "Saved timed: " - wt_legend: "Legend" - wt_style_default: "By default" - wt_style_assigned: "Assigned" - wt_style_worked: "Worked on" - wt_style__assigned_worked: "Assigned and worked on" - wt_style_overdue: "Overdue" - wt_style_assigned_overdue: "Assigned and overdue" - wt_style_overdue_worked: "Overdue and worked on" - wt_style_assigned_overdue_worked: "Assigned, overdue and worked on" - wt_account_start_day: "Company start day" diff --git a/plugins/redmine_work_time/config/locales/en.yml b/plugins/redmine_work_time/config/locales/en.yml deleted file mode 100644 index 4729cf2bd510f423c2a45d11761f3b1e5e56851c..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/config/locales/en.yml +++ /dev/null @@ -1,49 +0,0 @@ -en: - work_time: "WorkTime" - wt_update: "Update" - wt_month_names: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec" - wt_week_day_names: "Sun,Mon,Tue,Wed,Thu,Fri,Sat" - wt_monthly_report: "Monthly Report" - wt_daily_report: "Daily Report" - wt_each_member_report: "Member Report" - wt_raw_total: "Monthly Report(not relayed)" - wt_relay_total: "Monthly Report(relayed)" - wt_edit_relay: "Ticket Relay Editor" - wt_ticket: "Ticket" - wt_add_ticket: "Add ticket" - wt_no_permission: "No permission" - wt_loop_relay: "Ticket relation looped" - wt_set_holiday: "set holiday on this date" - wt_del_holiday: "del holiday on this date" - wt_apply_checked: "apply all checked" - wt_select_project: "Restrict project..." - wt_select_user: "Select user..." - wt_edit_memo: "Edit memo" - wt_pre_memo: "pre. memo" - wt_next_memo: "next memo" - wt_data_list: "Data list" - wt_input_ticket_numbers: "or input ticket numbers" - wt_delete_closed_tickets: "delete closed tickets" - wt_data_download: "data download" - wt_data_download_table: "table data download" - wt_data_download_with_act: "data download(each activity)" - wt_opt_disp_ticket_with_closed: "[display closed ticket]" - wt_opt_disp_ticket_opened_only: "[display opened ticket only]" - wt_opt_disp_ticket_with_other_member: "[display other members ticket]" - wt_opt_disp_ticket_mine_only: "[display my ticket only]" - wt_bulkupdate_relations: "bulkupdate to parent" - permission_view_work_time_tab: "View Work time tab" - permission_view_work_time_other_member: "View other members' work time" - permission_edit_work_time_total: "Edit work time totals" - permission_edit_work_time_other_member: "Edit other members' work time" - wt_saved_value: "Saved timed: " - wt_legend: "Legend" - wt_style_default: "By default" - wt_style_assigned: "Assigned" - wt_style_worked: "Worked on" - wt_style__assigned_worked: "Assigned and worked on" - wt_style_overdue: "Overdue" - wt_style_assigned_overdue: "Assigned and overdue" - wt_style_overdue_worked: "Overdue and worked on" - wt_style_assigned_overdue_worked: "Assigned, overdue and worked on" - wt_account_start_day: "Company start day" diff --git a/plugins/redmine_work_time/config/locales/es.yml b/plugins/redmine_work_time/config/locales/es.yml deleted file mode 100644 index 840ee72c189fb5752358531f20d9e3bbc1112b04..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/config/locales/es.yml +++ /dev/null @@ -1,49 +0,0 @@ -es: - work_time: "Agenda" - wt_update: "Actualizar" - wt_month_names: "Ene,Feb,Mar,Abr,May,Jun,Jul,Ago,Sep,Oct,Nov,Dic" - wt_week_day_names: "Dom,Lun,Mar,Mie,Jue,Vie,Sab" - wt_monthly_report: "Informe mensual" - wt_daily_report: "Informe diario" - wt_each_member_report: "Informe de miembro" - wt_raw_total: "Informe mensual(no se retransmite)" - wt_edit_relay: "Editor transmisión de peticiones" - wt_relay_total: "Informe mensual de peticiones" - wt_ticket: "Petición" - wt_add_ticket: "Añade petición" - wt_no_permission: "Sin permiso" - wt_loop_relay: "Transmisión de petición en bucle" - wt_set_holiday: "Establece vacaciones en esta fecha" - wt_del_holiday: "Elimina vacaciones en esta fecha" - wt_apply_checked: "Aplica a todos los seleccionados" - wt_select_project: "Seleccione proyecto..." - wt_select_user: "Seleccione usuario..." - wt_edit_memo: "Edita memorandum" - wt_pre_memo: "Anterior memorandum" - wt_next_memo: "Siguiente memorandum" - wt_data_list: "Lista de datos" - wt_input_ticket_numbers: "o introduzca numero de petición" - wt_delete_closed_tickets: "borrar tiquests cerrados" - wt_data_download: "descargar datos" - wt_data_download_table: "descargar datos tabla" - wt_data_download_with_act: "descargar datos(de cada actividad)" - wt_opt_disp_ticket_with_closed: "[mostrar tiquets cerrados]" - wt_opt_disp_ticket_opened_only: "[mostrar solo tiquets abiertos]" - wt_opt_disp_ticket_with_other_member: "[mostrar tiquets de otros miembros]" - wt_opt_disp_ticket_mine_only: "[mostrar solo mis tiquets]" - wt_bulkupdate_relations: "actualizar al padre" - permission_view_work_time_tab: "Ver pestaña tiempo trabajado" - permission_view_work_time_other_member: "Ver el tiempo trabajado de otros miembros" - permission_edit_work_time_total: "Editar tiempo total trabajado" - permission_edit_work_time_other_member: "Editar el tiempo trabajado de otros miembros" - wt_saved_value: "Guardar cronometrado: " - wt_legend: "Legenda" - wt_style_default: "Por defecto" - wt_style_assigned: "Asignado" - wt_style_worked: "Trabajado por" - wt_style__assigned_worked: "Asignado y trabajado por" - wt_style_overdue: "Atrasado" - wt_style_assigned_overdue: "Asignado y atrasado" - wt_style_overdue_worked: "Atrasado y trabajado por" - wt_style_assigned_overdue_worked: "Asignado, atrasado y trabajado por" - wt_account_start_day: "Fecha inicio compañia" diff --git a/plugins/redmine_work_time/config/locales/fr.yml b/plugins/redmine_work_time/config/locales/fr.yml deleted file mode 100644 index a7b5bccd543b0f183521685a9b72435729f298b1..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/config/locales/fr.yml +++ /dev/null @@ -1,49 +0,0 @@ -fr: - work_time: "Temps de travail" - wt_update: "Mettre à jour" - wt_month_names: "Jan,Fév,Mar,Avr,Mai,Juin,Juil,Août,Sep,Oct,Nov,Déc" - wt_week_day_names: "Dim,Lun,Mar,Mer,Jeu,Ven,Sam" - wt_monthly_report: "Rapport mensuel" - wt_daily_report: "Rapport journalier" - wt_each_member_report: "Rapport utilisateur" - wt_raw_total: "Rapport mensuel(non relayé)" - wt_relay_total: "Rapport mensuel (relayé)" - wt_edit_relay: "Ticket Relay Editor" - wt_ticket: "Demande" - wt_add_ticket: "Ajouter une demande" - wt_no_permission: "Vous n'avez pas les droits" - wt_loop_relay: "Boucle infinie sur une demande" - wt_set_holiday: "Placer cette date en jour férié" - wt_del_holiday: "Retirer cette date des jours fériés" - wt_apply_checked: "Appliquer pour toutes les cases cochées" - wt_select_project: "Restreindre à un projet" - wt_select_user: "Choisir un utilisateur" - wt_edit_memo: "Éditer la note" - wt_pre_memo: "Note précédente" - wt_next_memo: "Note suivante" - wt_data_list: "Liste brute" - wt_input_ticket_numbers: "ou entrez le numéro de la demande" - wt_delete_closed_tickets: "Supprimer les demandes fermées" - wt_data_download: "Téléchargement des données" - wt_data_download_table: "Tableau de données Téléchargement" - wt_data_download_with_act: "Téléchargement des données(each activity)" - wt_opt_disp_ticket_with_closed: "[afficher les demandes fermés]" - wt_opt_disp_ticket_opened_only: "[n'afficher que les demandes ouvertes]" - wt_opt_disp_ticket_with_other_member: "[afficher les demandes des autres membres]" - wt_opt_disp_ticket_mine_only: "[n'afficher que mes demandes]" - wt_bulkupdate_relations: "mise à jour en bloc du parent" - permission_view_work_time_tab: "Afficher l'onglet Temps de travail" - permission_view_work_time_other_member: "Afficher les temps des autres membres" - permission_edit_work_time_total: "Modifier les totaux de temps de travail" - permission_edit_work_time_other_member: "Modifier les temps des autres membres" - wt_saved_value: "Temps sauvegardé : " - wt_legend: "Légende" - wt_style_default: "Par défaut" - wt_style_assigned: "Affecté" - wt_style_worked: "Travail en cours" - wt_style__assigned_worked: "Affecté et travail en cours" - wt_style_overdue: "En retard" - wt_style_assigned_overdue: "Affecté et en retard" - wt_style_overdue_worked: "En retard et travail en cours" - wt_style_assigned_overdue_worked: "Affecté, en retard et travail en cours" - wt_account_start_day: "Company start day" diff --git a/plugins/redmine_work_time/config/locales/it.yml b/plugins/redmine_work_time/config/locales/it.yml deleted file mode 100644 index 2ad16234fbf39747e1ed50f727995b452a81e405..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/config/locales/it.yml +++ /dev/null @@ -1,49 +0,0 @@ -it: - work_time: "Tempo di lavoro" - wt_update: "Aggiorna" - wt_month_names: "Gen,Feb,Mar,Apr,Mag,Giu,Lug,Ago,Set,Ott,Nov,Dic" - wt_week_day_names: "Dom,Lun,Mar,Mer,Gio,Ven,Sab" - wt_monthly_report: "Report Mensile" - wt_daily_report: "Report Giornaliero" - wt_each_member_report: "Report Utente" - wt_raw_total: "Report Mensile (not relayed)" - wt_edit_relay: "Editor segnalazioni trasmesse" - wt_relay_total: "Report Mensile Segnalazioni Relayed" - wt_ticket: "Segnalazione" - wt_add_ticket: "Aggiungi segnalazione" - wt_no_permission: "Non autorizzato" - wt_loop_relay: "Ticket relation looped" - wt_set_holiday: "Imposta giorno come festivo" - wt_del_holiday: "Canc giorno come festivo" - wt_apply_checked: "Applica a selezionati" - wt_select_project: "Seleziona progetto..." - wt_select_user: "Seleziona utente..." - wt_edit_memo: "Modifica nota" - wt_pre_memo: "Nota precedente" - wt_next_memo: "Prossima nota" - wt_data_list: "Lista Dati" - wt_input_ticket_numbers: "o inserisci i numeri delle segnalazioni" - wt_delete_closed_tickets: "Elimina segnalazioni chiuse" - wt_data_download: "download di dati" - wt_data_download_table: "tavolo download di dati" - wt_data_download_with_act: "download di dati(each activity)" - wt_opt_disp_ticket_with_closed: "[mostra segnalazioni chiuse]" - wt_opt_disp_ticket_opened_only: "[mostra solo segnalazioni aperte]" - wt_opt_disp_ticket_with_other_member: "[mostra segnalazioni di altri membri]" - wt_opt_disp_ticket_mine_only: "[mostra solo le mie segnalazioni]" - wt_bulkupdate_relations: "bulkupdate to parent" - permission_view_work_time_tab: "View Work time tab" - permission_view_work_time_other_member: "View other members' work time" - permission_edit_work_time_total: "Edit work time totals" - permission_edit_work_time_other_member: "Edit other members' work time" - wt_saved_value: "Saved timed: " - wt_legend: "Legend" - wt_style_default: "By default" - wt_style_assigned: "Assigned" - wt_style_worked: "Worked on" - wt_style__assigned_worked: "Assigned and worked on" - wt_style_overdue: "Overdue" - wt_style_assigned_overdue: "Assigned and overdue" - wt_style_overdue_worked: "Overdue and worked on" - wt_style_assigned_overdue_worked: "Assigned, overdue and worked on" - wt_account_start_day: "Company start day" diff --git a/plugins/redmine_work_time/config/locales/ja.yml b/plugins/redmine_work_time/config/locales/ja.yml deleted file mode 100644 index 1837d0bb4926f9ff63307a08ff6278f5f36b57d3..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/config/locales/ja.yml +++ /dev/null @@ -1,49 +0,0 @@ -ja: - work_time: "工数" - wt_update: "更新" - wt_month_names: "1,2,3,4,5,6,7,8,9,10,11,12" - wt_week_day_names: "日,月,火,水,木,金,土" - wt_monthly_report: "月間工数表" - wt_daily_report: "日毎工数" - wt_each_member_report: "個人工数集計" - wt_raw_total: "月間集計(付替なし)" - wt_relay_total: "月間集計(付替あり)" - wt_edit_relay: "チケット付替設定" - wt_ticket: "チケット" - wt_add_ticket: "チケット追加" - wt_no_permission: "権限がありません" - wt_loop_relay: "チケット関係がループしています" - wt_set_holiday: "この日を休日に設定" - wt_del_holiday: "この日の休日を解除" - wt_apply_checked: "チェックを適用" - wt_select_project: "プロジェクト限定" - wt_select_user: "ユーザを選択" - wt_edit_memo: "メモを編集" - wt_pre_memo: "前のメモ" - wt_next_memo: "次のメモ" - wt_data_list: "データリスト" - wt_input_ticket_numbers: "またはチケット番号を入力" - wt_delete_closed_tickets: "終了チケット削除" - wt_data_download: "データダウンロード" - wt_data_download_table: "データダウンロード(月間工数表)" - wt_data_download_with_act: "活動別データダウンロード" - wt_opt_disp_ticket_with_closed: "[終了したチケットも表示]" - wt_opt_disp_ticket_opened_only: "[オープン中のチケットのみ表示]" - wt_opt_disp_ticket_with_other_member: "[他のメンバーのチケットも表示]" - wt_opt_disp_ticket_mine_only: "[自分のチケットのみ表示]" - wt_bulkupdate_relations: "親チケットへ一括更新" - permission_view_work_time_tab: "工数入力集計対象者" - permission_view_work_time_other_member: "他のメンバーの工数の表示" - permission_edit_work_time_total: "工数集計の設定" - permission_edit_work_time_other_member: "他のメンバーの工数の入力" - wt_saved_value: "保存時間: " - wt_legend: "チケット表示凡例" - wt_style_default: "通常表示" - wt_style_assigned: "担当期間" - wt_style_worked: "書込" - wt_style__assigned_worked: "担当期間,書込" - wt_style_overdue: "期限超過" - wt_style_assigned_overdue: "担当,期限超過" - wt_style_overdue_worked: "期限超過,書込" - wt_style_assigned_overdue_worked: "担当,超過,書込" - wt_account_start_day: "集計開始日" diff --git a/plugins/redmine_work_time/config/locales/ko.yml b/plugins/redmine_work_time/config/locales/ko.yml deleted file mode 100644 index 240f887b90a87d5991dbb659c7f8358c5a13aeae..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/config/locales/ko.yml +++ /dev/null @@ -1,50 +0,0 @@ -# Translation by Ki Won Kim (http://xyz37.blog.me, xyz37@naver.com) -ko: - work_time: "작업 시간" - wt_update: "수정" - wt_month_names: "1월,2월,3월,4월,5월,6월,7월,8월,9월,10월,11월,12월" - wt_week_day_names: "일,월,화,수,목,금,토" - wt_monthly_report: "월간 보고" - wt_daily_report: "일간 보고" - wt_each_member_report: "사용자 별 보고" - wt_raw_total: "월간 보고(연동 없음)" - wt_edit_relay: "티켓 연동 편집기" - wt_relay_total: "연동된 티켓 월간 보고" - wt_ticket: "티켓" - wt_add_ticket: "티켓 추가" - wt_no_permission: "권한 없음" - wt_loop_relay: "티켓 관계가 반복(Looping) 됩니다." - wt_set_holiday: "이 날짜를 휴일로 지정" - wt_del_holiday: "이 날짜를 휴일에서 제거" - wt_apply_checked: "선택 항목 적용" - wt_select_project: "프로젝트 선택..." - wt_select_user: "사용자 선택..." - wt_edit_memo: "메모 수정" - wt_pre_memo: "이전 메모" - wt_next_memo: "다음 메모" - wt_data_list: "데이터 목록" - wt_input_ticket_numbers: "또는 티켓 번호를 입력하세요." - wt_delete_closed_tickets: "완료된 티켓 삭제" - wt_data_download: "데이터 다운로드" - wt_data_download_table: "표 데이터 다운로드" - wt_data_download_with_act: "데이터 다운로드(each activity)" - wt_opt_disp_ticket_with_closed: "[display closed ticket]" - wt_opt_disp_ticket_opened_only: "[display opened ticket only]" - wt_opt_disp_ticket_with_other_member: "[display other members ticket]" - wt_opt_disp_ticket_mine_only: "[display my ticket only]" - wt_bulkupdate_relations: "bulkupdate to parent" - permission_view_work_time_tab: "View Work time tab" - permission_view_work_time_other_member: "View other members' work time" - permission_edit_work_time_total: "Edit work time totals" - permission_edit_work_time_other_member: "Edit other members' work time" - wt_saved_value: "Saved timed: " - wt_legend: "Legend" - wt_style_default: "By default" - wt_style_assigned: "Assigned" - wt_style_worked: "Worked on" - wt_style__assigned_worked: "Assigned and worked on" - wt_style_overdue: "Overdue" - wt_style_assigned_overdue: "Assigned and overdue" - wt_style_overdue_worked: "Overdue and worked on" - wt_style_assigned_overdue_worked: "Assigned, overdue and worked on" - wt_account_start_day: "Company start day" diff --git a/plugins/redmine_work_time/config/locales/no.yml b/plugins/redmine_work_time/config/locales/no.yml deleted file mode 100644 index 913806c70903d187b712334ff08d9e9cf125ebb3..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/config/locales/no.yml +++ /dev/null @@ -1,49 +0,0 @@ -"no": - work_time: "Arbeidstimer" - wt_update: "Oppdater" - wt_month_names: "Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Des" - wt_week_day_names: "Søn,Man,Tir,Ons,Tor,Fre,Lør" - wt_monthly_report: "Månedsrapport" - wt_daily_report: "Dagsrapport" - wt_each_member_report: "Medlemsrapport" - wt_raw_total: "Månedsrapport (ikke samlet)" - wt_relay_total: "Månedsrapport (samlet)" - wt_edit_relay: "Samle poster" - wt_ticket: "Poster" - wt_add_ticket: "Legg til post" - wt_no_permission: "Ikke tilgang" - wt_loop_relay: "Samlekobling i løkke" - wt_set_holiday: "merk dato som feriedag" - wt_del_holiday: "fjern feriedagmerking på dat" - wt_apply_checked: "Legg til valgte poster" - wt_select_project: "Begrens prosjekt..." - wt_select_user: "Velg bruker..." - wt_edit_memo: "Endre notat" - wt_pre_memo: "forr. notat" - wt_next_memo: "neste notat" - wt_data_list: "Data list" - wt_input_ticket_numbers: "eller legg inn saksnummer" - wt_delete_closed_tickets: "Slett lukkede poster" - wt_data_download: "Last ned data" - wt_data_download_table: "Tabell nedlasting av data" - wt_data_download_with_act: "Last ned data(each activity)" - wt_opt_disp_ticket_with_closed: "[vis lukkede saker]" - wt_opt_disp_ticket_opened_only: "[vis bare åpne saker]" - wt_opt_disp_ticket_with_other_member: "[vis andre brukeres saker]" - wt_opt_disp_ticket_mine_only: "[vis bare mine saker]" - wt_bulkupdate_relations: "Samle alle til sin forelder" - permission_view_work_time_tab: "Vise arbeidstime-fane" - permission_view_work_time_other_member: "Vise andres arbeidstimer" - permission_edit_work_time_total: "Endre oppsummerte arbeidstimer" - permission_edit_work_time_other_member: "Endre andres arbeidstimer" - wt_saved_value: "Lagret timer: " - wt_legend: "Nøkkel" - wt_style_default: "Forvalgt" - wt_style_assigned: "Tildelt" - wt_style_worked: "Jobbet med" - wt_style__assigned_worked: "Tildelt og jobbet med" - wt_style_overdue: "Over tidsfrist" - wt_style_assigned_overdue: "Tildelt og over tidsfrist" - wt_style_overdue_worked: "Over tidsfrist og jobbet med" - wt_style_assigned_overdue_worked: "Tildelt, over tidsfrist og jobbet med" - wt_account_start_day: "Company start day" diff --git a/plugins/redmine_work_time/config/locales/po.yml b/plugins/redmine_work_time/config/locales/po.yml deleted file mode 100644 index 8fdc5cb767413c8ff3d2aa325ed57efb47d5579e..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/config/locales/po.yml +++ /dev/null @@ -1,49 +0,0 @@ -po: - work_time: "WorkTime" - wt_update: "Update" - wt_month_names: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec" - wt_week_day_names: "Sun,Mon,Tue,Wed,Thu,Fri,Sat" - wt_monthly_report: "Monthly Report" - wt_daily_report: "Daily Report" - wt_each_member_report: "Member Report" - wt_raw_total: "Monthly Report(not relayed)" - wt_relay_total: "Rapport mensuel (relayed)" - wt_edit_relay: "Ticket Relay Editor" - wt_ticket: "Ticket" - wt_add_ticket: "Add ticket" - wt_no_permission: "No permission" - wt_loop_relay: "Ticket relation looped" - wt_set_holiday: "set holiday on this date" - wt_del_holiday: "del holiday on this date" - wt_apply_checked: "apply all checked" - wt_select_project: "Restrict project..." - wt_select_user: "Select user..." - wt_edit_memo: "Edit memo" - wt_pre_memo: "pre. memo" - wt_next_memo: "next memo" - wt_data_list: "Data list" - wt_input_ticket_numbers: "or input ticket numbers" - wt_delete_closed_tickets: "delete closed tickets" - wt_data_download: "data download" - wt_data_download_table: "Tabela data download" - wt_data_download_with_act: "data download(each activity)" - wt_opt_disp_ticket_with_closed: "[display closed ticket]" - wt_opt_disp_ticket_opened_only: "[display opened ticket only]" - wt_opt_disp_ticket_with_other_member: "[display other members ticket]" - wt_opt_disp_ticket_mine_only: "[display my ticket only]" - wt_bulkupdate_relations: "bulkupdate to parent" - permission_view_work_time_tab: "View Work time tab" - permission_view_work_time_other_member: "View other members' work time" - permission_edit_work_time_total: "Edit work time totals" - permission_edit_work_time_other_member: "Edit other members' work time" - wt_saved_value: "Saved timed: " - wt_legend: "Legend" - wt_style_default: "By default" - wt_style_assigned: "Assigned" - wt_style_worked: "Worked on" - wt_style__assigned_worked: "Assigned and worked on" - wt_style_overdue: "Overdue" - wt_style_assigned_overdue: "Assigned and overdue" - wt_style_overdue_worked: "Overdue and worked on" - wt_style_assigned_overdue_worked: "Assigned, overdue and worked on" - wt_account_start_day: "Company start day" diff --git a/plugins/redmine_work_time/config/locales/pt-BR.yml b/plugins/redmine_work_time/config/locales/pt-BR.yml deleted file mode 100644 index 15beeac5d71b907d13926733e8f921d5baef39bd..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/config/locales/pt-BR.yml +++ /dev/null @@ -1,50 +0,0 @@ -pt-BR: - work_time: "Agenda" - wt_update: "Atualização" - wt_month_names: "Jan,Fev,Mar,Abr,Mai,Jun,Jul,Ago,Set,Out,Nov,Dez" - wt_week_day_names: "Dom,Seg,Ter,Qua,Qui,Sex,Sab" - wt_monthly_report: "Relatório Mensal" - wt_daily_report: "Relatório Diário" - wt_each_member_report: "Relatório Membro" - wt_raw_total: "Relatório Mensal(não reenviado)" - wt_edit_relay: "Editor de etarefas enviada" - wt_relay_total: "Relatório mensal de tarefas reenviadas" - wt_ticket: "Tarefa" - wt_add_ticket: "Nova tarefa" - wt_no_permission: "Sem permissão" - wt_no_permission_del: "Não é possível excluir porque há pedidos de horas-homem" - wt_loop_relay: "Ticket relation looped" - wt_set_holiday: "define feriado nesta data" - wt_del_holiday: "define data normal" - wt_apply_checked: "Aplicar selecionados" - wt_select_project: "Selecione projeto..." - wt_select_user: "Selecione usuário..." - wt_edit_memo: "Edita anotação" - wt_pre_memo: "prev anotação" - wt_next_memo: "prox anotação" - wt_data_list: "Lista de data" - wt_input_ticket_numbers: "ou inclua o número da tarefa" - wt_delete_closed_tickets: "apagar tarefas fechadas" - wt_data_download: "download de dados" - wt_data_download_table: "Tabela download de dados" - wt_data_download_with_act: "download de dados(each activity)" - wt_opt_disp_ticket_with_closed: "[exibe tarefa fechada]" - wt_opt_disp_ticket_opened_only: "[exibe somente tafera aberta]" - wt_opt_disp_ticket_with_other_member: "[exibe tarefa de outros membros]" - wt_opt_disp_ticket_mine_only: "[existe somente minha tarefa]" - wt_bulkupdate_relations: "bulkupdate to parent" - permission_view_work_time_tab: "Ver a tab tempo de trabalho" - permission_view_work_time_other_member: "Ver o tempo de trabalho de outros membros" - permission_edit_work_time_total: "Edit work time totals" - permission_edit_work_time_other_member: "Editar o tempo de trabalho de outros membros" - wt_saved_value: "Tempo salvo: " - wt_legend: "Legenda" - wt_style_default: "Por padrão" - wt_style_assigned: "Atribuído" - wt_style_worked: "Trabalhando em" - wt_style__assigned_worked: "Atrasado e trabalhando em" - wt_style_overdue: "Atrasada" - wt_style_assigned_overdue: "Atribuído e em atraso" - wt_style_overdue_worked: "Atrasada e trabalhado" - wt_style_assigned_overdue_worked: "Atribuída, atrasada e trabalhando em" - wt_account_start_day: "Empresa começar dia" diff --git a/plugins/redmine_work_time/config/locales/ru.yml b/plugins/redmine_work_time/config/locales/ru.yml deleted file mode 100644 index 39dc9752ad8a282bfea4e988ec530f2dc49ab61e..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/config/locales/ru.yml +++ /dev/null @@ -1,49 +0,0 @@ -ru: - work_time: "Рабочий отчёт" - wt_update: "Обновить" - wt_month_names: "Янв,Фев,Мар,Апр,Май,Июн,Июл,Авг,Сен,Окт,Ноя,Дек" - wt_week_day_names: "Вск,Пон,Втр,Срд,Чет,Пят,Суб" - wt_monthly_report: "Ежемесячный отчёт" - wt_daily_report: "Ежедневный отчёт" - wt_each_member_report: "Отчёт по пользователям" - wt_raw_total: "Отчёт за месяц (не связанный)" - wt_relay_total: "Отчёт за месяц (связанный)" - wt_edit_relay: "Редактор связей задач" - wt_ticket: "Задача" - wt_add_ticket: "Добавить задачу" - wt_no_permission: "Ограничение прав" - wt_loop_relay: "Взаимосвязь задач" - wt_set_holiday: "установить выходной на дату" - wt_del_holiday: "удалить выходной на дату" - wt_apply_checked: "применить все отмеченные" - wt_select_project: "Отфильтровать по проектам..." - wt_select_user: "Выбор пользователя..." - wt_edit_memo: "Редактировать примечание" - wt_pre_memo: "предыдущее примечание" - wt_next_memo: "следующе примечание" - wt_data_list: "Список дат" - wt_input_ticket_numbers: "или введите номера задач (через запятую)" - wt_delete_closed_tickets: "удалить закрытые задачи" - wt_data_download: "экспорт данных" - wt_data_download_table: "Экспорт данных таблицы" - wt_data_download_with_act: "экспорт данных(each activity)" - wt_opt_disp_ticket_with_closed: "[отобразить закрытые задачи]" - wt_opt_disp_ticket_opened_only: "[отобразить только открытые задачи]" - wt_opt_disp_ticket_with_other_member: "[отобразить задачи других участников]" - wt_opt_disp_ticket_mine_only: "[отобразить только мои задачи]" - wt_bulkupdate_relations: "массовое обновление связанных" - permission_view_work_time_tab: "Просмотр закладки рабочего времени" - permission_view_work_time_other_member: "Просмотр рабочего времени других участников" - permission_edit_work_time_total: "Редактирование рабочего времени" - permission_edit_work_time_other_member: "Редактирование рабочего времени других участников" - wt_saved_value: "Сохранённое время: " - wt_legend: "Соответствие цветов" - wt_style_default: "По умолчанию" - wt_style_assigned: "Назначенные" - wt_style_worked: "В работе" - wt_style__assigned_worked: "Назначенные и в работе" - wt_style_overdue: "Просроченные" - wt_style_assigned_overdue: "Назначенные и просроченные" - wt_style_overdue_worked: "Просроченные и в работе" - wt_style_assigned_overdue_worked: "Назначенные, в работе и просроченные" - wt_account_start_day: "Company start day" diff --git a/plugins/redmine_work_time/config/locales/tr.yml b/plugins/redmine_work_time/config/locales/tr.yml deleted file mode 100644 index 28b7408c3865b051c197f83d9949edcad5e49eaa..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/config/locales/tr.yml +++ /dev/null @@ -1,49 +0,0 @@ -tr: - work_time: "ÇalışmaZamanı" - wt_update: "Güncelle" - wt_month_names: "Oca,Şub,Mar,Nis,May,Haz,Tem,Ağu,Eyl,Eki,Kas,Ara" - wt_week_day_names: "Paz,Pzt,Sal,Çar,Per,Cum,Cmt" - wt_monthly_report: "Aylık Rapor" - wt_daily_report: "Günlük Rapor" - wt_each_member_report: "Kullanıcı Raporu" - wt_raw_total: "Aylık Rapor(aktarımsız)" - wt_edit_relay: "İş Aktarım Düzenleyici" - wt_relay_total: "Aktarılmış İş Aylık Rapor" - wt_ticket: "İş" - wt_add_ticket: "İş ekle" - wt_no_permission: "Yetki yok" - wt_loop_relay: "İş ilişkileri dögülü" - wt_set_holiday: "bu tarihe tatil koy" - wt_del_holiday: "bu tarihteki tatili sil" - wt_apply_checked: "seçililere uygula" - wt_select_project: "Birim seç..." - wt_select_user: "Kullanıcı seç..." - wt_edit_memo: "Not düzenle" - wt_pre_memo: "önceki not" - wt_next_memo: "sonraki not" - wt_data_list: "Veri Liste" - wt_input_ticket_numbers: "veya iş numarası gir" - wt_delete_closed_tickets: "kapalı işleri sil" - wt_data_download: "veri indir" - wt_data_download_table: "Tablo veri İndir" - wt_data_download_with_act: "veri indir(each activity)" - wt_opt_disp_ticket_with_closed: "[kapalı işleri göster]" - wt_opt_disp_ticket_opened_only: "[sadece açık işleri göster]" - wt_opt_disp_ticket_with_other_member: "[başkalarının işlerini göster]" - wt_opt_disp_ticket_mine_only: "[sadece kendi işlerimi göster]" - wt_bulkupdate_relations: "üst işi toplu güncelle" - permission_view_work_time_tab: "ÇalışmaZamanı sekmesini gör" - permission_view_work_time_other_member: "Başka kişilerin çalışma zamanını gör" - permission_edit_work_time_total: "Çalışma zamanı toplamlarını düzenle" - permission_edit_work_time_other_member: "Başka kiçinin çalışma zamanını düzenle" - wt_saved_value: "Saklanmış değer: " - wt_legend: "İşaretler" - wt_style_default: "Öntanımlı" - wt_style_assigned: "Atanmış" - wt_style_worked: "Çalışılmış" - wt_style__assigned_worked: "Atanmış ve çalışılmış" - wt_style_overdue: "Zamanı geçmiş" - wt_style_assigned_overdue: "Atanmış ve zamanı geçmiş" - wt_style_overdue_worked: "Zamanı geçmiş ve çalışılmış" - wt_style_assigned_overdue_worked: "Atanmış, zamanı geçmiş, çalışılmış" - wt_account_start_day: "Company start day" diff --git a/plugins/redmine_work_time/config/locales/zh.yml b/plugins/redmine_work_time/config/locales/zh.yml deleted file mode 100644 index 7c01c583985a4ae4101afef35c4182277df4b2a5..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/config/locales/zh.yml +++ /dev/null @@ -1,49 +0,0 @@ -zh: - work_time: "工时日志" - wt_update: "更新" - wt_month_names: "一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月" - wt_week_day_names: "周日,周一,周二,周三,周四,周五,周六" - wt_monthly_report: "月度报告" - wt_daily_report: "日报告" - wt_each_member_report: "成员报告" - wt_raw_total: "月度报告(not relayed)" - wt_relay_total: "月度报告(relayed)" - wt_edit_relay: "工作 Relay 编辑器" - wt_ticket: "工作" - wt_add_ticket: "新增工作" - wt_no_permission: "无权限" - wt_loop_relay: "工作关系循环" - wt_set_holiday: "设置当前日期为假期" - wt_del_holiday: "设置当期日期为工作日" - wt_apply_checked: "应用所有已选项" - wt_select_project: "选择项目..." - wt_select_user: "选择用户..." - wt_edit_memo: "编辑备忘录" - wt_pre_memo: "前一备忘录" - wt_next_memo: "后一备忘录" - wt_data_list: "数据清单" - wt_input_ticket_numbers: "请输入编号" - wt_delete_closed_tickets: "删除已关闭的工作" - wt_data_download: "数据下载" - wt_data_download_table: "表数据下载" - wt_data_download_with_act: "数据下载(按活动)" - wt_opt_disp_ticket_with_closed: "[显示已关闭的工作]" - wt_opt_disp_ticket_opened_only: "[只显示打开的工作]" - wt_opt_disp_ticket_with_other_member: "[显示其他成员的工作]" - wt_opt_disp_ticket_mine_only: "[只显示我的工作]" - wt_bulkupdate_relations: "批量更新到上一级" - permission_view_work_time_tab: "查看工时日志" - permission_view_work_time_other_member: "查看其他成员的工时日志" - permission_edit_work_time_total: "编辑工时日志总计" - permission_edit_work_time_other_member: "编辑其他成员的工时日志" - wt_saved_value: "已节省: " - wt_legend: "图例" - wt_style_default: "按默认" - wt_style_assigned: "已分配" - wt_style_worked: "已处理" - wt_style__assigned_worked: "已分配并已耗费" - wt_style_overdue: "逾期" - wt_style_assigned_overdue: "已分配并已逾期" - wt_style_overdue_worked: "已逾期并已耗费" - wt_style_assigned_overdue_worked: "已分配、已逾期并已耗费" - wt_account_start_day: "统计开始日" diff --git a/plugins/redmine_work_time/config/routes.rb b/plugins/redmine_work_time/config/routes.rb deleted file mode 100644 index 1ba5af123dc3ca3a4207d8aebfcbfc3c279347b7..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/config/routes.rb +++ /dev/null @@ -1,4 +0,0 @@ -RedmineApp::Application.routes.draw do - match 'work_time/:action', :to => 'work_time#index', :via => [:get, :post] - match 'work_time/:action/:id', :to => 'work_time#show', :via => [:get, :post] -end diff --git a/plugins/redmine_work_time/db/migrate/001_create_user_issue_months.rb b/plugins/redmine_work_time/db/migrate/001_create_user_issue_months.rb deleted file mode 100644 index 4bc929cbecc5ceeba9b6e6d52e272006ba640d90..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/db/migrate/001_create_user_issue_months.rb +++ /dev/null @@ -1,14 +0,0 @@ -class CreateUserIssueMonths < ActiveRecord::Migration[4.2] - def self.up - create_table :user_issue_months do |t| - t.column :uid, :integer - t.column :issue, :integer - t.column :month, :string - t.column :odr, :integer - end - end - - def self.down - drop_table :user_issue_months - end -end diff --git a/plugins/redmine_work_time/db/migrate/002_create_wt_member_orders.rb b/plugins/redmine_work_time/db/migrate/002_create_wt_member_orders.rb deleted file mode 100644 index 4f458576b4d39d1f8d7c00ba12863ab200bfdeca..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/db/migrate/002_create_wt_member_orders.rb +++ /dev/null @@ -1,12 +0,0 @@ -class CreateWtMemberOrders < ActiveRecord::Migration[4.2] - def self.up - create_table :wt_member_orders do |t| - t.column :user_id, :integer - t.column :position, :integer - end - end - - def self.down - drop_table :wt_member_orders - end -end diff --git a/plugins/redmine_work_time/db/migrate/003_create_wt_ticket_relays.rb b/plugins/redmine_work_time/db/migrate/003_create_wt_ticket_relays.rb deleted file mode 100644 index b77ef11601c7306c87dc1ced811f1b34b894f203..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/db/migrate/003_create_wt_ticket_relays.rb +++ /dev/null @@ -1,13 +0,0 @@ -class CreateWtTicketRelays < ActiveRecord::Migration[4.2] - def self.up - create_table :wt_ticket_relays do |t| - t.column :issue_id, :integer - t.column :position, :integer - t.column :parent, :integer - end - end - - def self.down - drop_table :wt_ticket_relays - end -end diff --git a/plugins/redmine_work_time/db/migrate/004_add_prj_to_mem_odr.rb b/plugins/redmine_work_time/db/migrate/004_add_prj_to_mem_odr.rb deleted file mode 100644 index 431fe3145bf6093225b70a8f0b310066ccb7f510..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/db/migrate/004_add_prj_to_mem_odr.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddPrjToMemOdr < ActiveRecord::Migration[4.2] - def self.up - add_column :wt_member_orders, :prj_id, :integer, :default => nil - end - - def self.down - remove_column :wt_member_orders, :prj_id - end -end diff --git a/plugins/redmine_work_time/db/migrate/005_create_wt_daily_memos.rb b/plugins/redmine_work_time/db/migrate/005_create_wt_daily_memos.rb deleted file mode 100644 index e529289061f3ac1103c4d7d459f93c2ea0056252..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/db/migrate/005_create_wt_daily_memos.rb +++ /dev/null @@ -1,15 +0,0 @@ -class CreateWtDailyMemos < ActiveRecord::Migration[4.2] - def self.up - create_table :wt_daily_memos do |t| - t.column :day, :date - t.column :user_id, :integer - t.column :created_on, :timestamp - t.column :updated_on, :timestamp - t.column :description, :text - end - end - - def self.down - drop_table :wt_daily_memos - end -end diff --git a/plugins/redmine_work_time/db/migrate/006_create_wt_project_orders.rb b/plugins/redmine_work_time/db/migrate/006_create_wt_project_orders.rb deleted file mode 100644 index a78996d7977484fc457064dc3e50a51af6ceba33..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/db/migrate/006_create_wt_project_orders.rb +++ /dev/null @@ -1,14 +0,0 @@ -class CreateWtProjectOrders < ActiveRecord::Migration[4.2] - def self.up - create_table :wt_project_orders do |t| - t.column :prj, :integer - t.column :uid, :integer - t.column :dsp_prj, :integer - t.column :dsp_pos, :integer - end - end - - def self.down - drop_table :wt_project_orders - end -end diff --git a/plugins/redmine_work_time/db/migrate/007_create_wt_holidays.rb b/plugins/redmine_work_time/db/migrate/007_create_wt_holidays.rb deleted file mode 100644 index 0043f092f239f59b1fbee8153ef3359f9595af15..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/db/migrate/007_create_wt_holidays.rb +++ /dev/null @@ -1,15 +0,0 @@ -class CreateWtHolidays < ActiveRecord::Migration[4.2] - def self.up - create_table :wt_holidays do |t| - t.column :holiday, :date - t.column :created_on, :datetime - t.column :created_by, :integer - t.column :deleted_on, :datetime - t.column :deleted_by, :integer - end - end - - def self.down - drop_table :wt_holidays - end -end diff --git a/plugins/redmine_work_time/db/migrate/008_remove_month_from_user_issue_month.rb b/plugins/redmine_work_time/db/migrate/008_remove_month_from_user_issue_month.rb deleted file mode 100644 index 26e93f7d34d21974acf2ea4cab95c512021a7d03..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/db/migrate/008_remove_month_from_user_issue_month.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RemoveMonthFromUserIssueMonth < ActiveRecord::Migration[4.2] - def self.up - remove_column :user_issue_months, :month - end - - def self.down - add_column :user_issue_months, :month, :string, :default => nil - end -end diff --git a/plugins/redmine_work_time/db/migrate/009_remove_prj_from_wt_project_orders.rb b/plugins/redmine_work_time/db/migrate/009_remove_prj_from_wt_project_orders.rb deleted file mode 100644 index 74a1ec807fefa5240d9568bbb8807865f8699332..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/db/migrate/009_remove_prj_from_wt_project_orders.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RemovePrjFromWtProjectOrders < ActiveRecord::Migration[4.2] - def self.up - remove_column :wt_project_orders, :prj - end - - def self.down - add_column :wt_project_orders, :prj, :integer, :default => nil - end -end diff --git a/plugins/redmine_work_time/init.rb b/plugins/redmine_work_time/init.rb deleted file mode 100644 index ccb52719145959e2eb8cfb8a5c9070b9949d55f6..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/init.rb +++ /dev/null @@ -1,47 +0,0 @@ -require 'redmine' - -Redmine::Plugin.register :redmine_work_time do - name 'Redmine Work Time plugin' - author 'Tomohisa Kusukawa' - description 'A plugin to view and update TimeEntry by each user' - version '0.4.1' - url 'http://www.redmine.org/plugins/redmine_work_time' - author_url 'http://about.me/tkusukawa' - - project_module :work_time do - permission :view_work_time_tab, {:work_time => - [:show,:member_monthly_data, - :total,:total_data,:edit_relay,:relay_total,:relay_total_data, - :total_data_with_act, :relay_total_data_with_act, - :register_project_settings, - ]} - permission :view_work_time_other_member, {:work_time => - [:show,:member_monthly_data, - :total,:total_data,:edit_relay,:relay_total,:relay_total_data, - :total_data_with_act, :relay_total_data_with_act, - :register_project_settings, - ]} - permission :edit_work_time_total, {} - permission :edit_work_time_other_member, {} - end - - menu :account_menu, :work_time, - {:controller => 'work_time', :action => 'index'}, - :before => :my_account, - :caption => :work_time, - :if => Proc.new{User.current.logged? && Setting.plugin_redmine_work_time['show_account_menu']} - - menu :project_menu, :work_time, - {:controller => 'work_time', :action => 'show'}, :caption => :work_time, - :after => :gantt - - settings :default => {'account_start_days' => {}, 'show_account_menu' => 'true'}, - :partial => 'settings/work_time_settings' - - Rails.configuration.to_prepare do - require_dependency 'projects_helper' - unless ProjectsHelper.included_modules.include? WorkTimeProjectsHelperPatch - ProjectsHelper.send(:include, WorkTimeProjectsHelperPatch) - end - end -end diff --git a/plugins/redmine_work_time/lib/work_time_projects_helper_patch.rb b/plugins/redmine_work_time/lib/work_time_projects_helper_patch.rb deleted file mode 100644 index 5d2e14c80d9912b880e6689f7d7b9beb87cef53e..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/lib/work_time_projects_helper_patch.rb +++ /dev/null @@ -1,17 +0,0 @@ -require_dependency 'projects_helper' - -module WorkTimeProjectsHelperPatch - module ProjectsHelperPatch - def project_settings_tabs - tabs = super - action = {:name => 'work_time', - :controller => 'work_time', - :action => :show, - :partial => 'settings/work_time_project_settings', :label => :work_time} - tabs << action if User.current.allowed_to?(:edit_work_time_total, @project) - tabs - end - end -end - -ProjectsHelper.prepend WorkTimeProjectsHelperPatch::ProjectsHelperPatch diff --git a/plugins/redmine_work_time/memo.txt b/plugins/redmine_work_time/memo.txt deleted file mode 100644 index 86799ae050a67316592129d191464697c09ff16b..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/memo.txt +++ /dev/null @@ -1,121 +0,0 @@ -Redmineプラグイン(WorkTime) 作成覚書 - -cd $RAILS_ROOT - -***プラグインの雛形生成*** -# ruby script/generate redmine_plugin work_time - -***バージョン管理に登録*** -# cd vendor/plugins/redmine_work_time -# hg init -# hg commit -A - -***init.rbの編集*** -# vi init.rb - -# cat init.rb -require 'redmine' - -Redmine::Plugin.register :redmine_work_time do - name 'Redmine Work Time plugin' - author 'Tomohisa Kusukawa' - description 'A plugin to view and update TimeEntry by each user' - version '0.0.1' - - project_module :work_time do - permission :view_work_time_tab, {:work_time => [:show]}, :public => true - end - - menu :project_menu, :work_time, {:controller => 'work_time', :action => 'show'}, :caption => :work_time -end - -*** モデル(DBテーブル)の作成 *** - -# ruby script/generate redmine_plugin_model work_time user_issue_month uid:integer issue:integer month:string odr:integer - exists app/models/ - create test/unit/ - create test/fixtures/ - create app/models/user_issue_month.rb - create test/unit/user_issue_month_test.rb - create test/fixtures/user_issue_months.yml - exists db/migrate - create db/migrate/20090104004624_create_user_issue_months.rb -# mv db/migrate/20090104004624_create_user_issue_months.rb db/migrate/001_create_user_issue_months.rb - -# ruby script/generate redmine_plugin_model work_time wt_member_order user_id:integer position:integer - exists app/models/ - exists test/unit/ - exists test/fixtures/ - create app/models/wt_member_order.rb - create test/unit/wt_member_order_test.rb - create test/fixtures/wt_member_orders.yml - exists db/migrate - create db/migrate/20090131105945_create_wt_member_orders.rb -# mv db/migrate/20090131105945_create_wt_member_orders.rb db/migrate/002_create_wt_member_orders.rb - -# ruby script/generate redmine_plugin_model work_time wt_ticket_relay issue_id:integer position:integer parent:integer - exists app/models/ - exists test/unit/ - exists test/fixtures/ - create app/models/wt_ticket_relay.rb - create test/unit/wt_ticket_relay_test.rb - create test/fixtures/wt_ticket_relays.yml - exists db/migrate - create db/migrate/20090131110021_create_wt_ticket_relays.rb -# mv db/migrate/20090131110021_create_wt_ticket_relays.rb db/migrate/003_create_wt_ticket_relays.rb - -# vi db/migrate/004_add_prj_to_mem_odr.rb - -# ruby script/generate redmine_plugin_model work_time wt_daily_memo day:date user_id:integer created_on:timestamp updated_on:timestamp description:text - exists app/models/ - exists test/unit/ - exists test/fixtures/ - create app/models/wt_daily_memo.rb - create test/unit/wt_daily_memo_test.rb - create test/fixtures/wt_daily_memos.yml - exists db/migrate - create db/migrate/20090221151021_create_wt_daily_memos.rb -# mv db/migrate/20090221151021_create_wt_daily_memos.rb db/migrate/005_create_wt_daily_memos.rb - -# rake db:migrate_plugins RAILS_ENV=production - -*** コントローラの作成 *** - -# ruby script/generate redmine_plugin_controller work_time work_time show - exists app/controllers/ - exists app/helpers/ - create app/views/work_time - create test/functional/ - create app/controllers/work_time_controller.rb - create test/functional/work_time_controller_test.rb - create app/helpers/work_time_helper.rb - create app/views/work_time/show.html.erb - -# cd $RAILS_ROOT/vendor/plugins/redmine_work_time/app/controllers/ -# vi work_time_controller.rb - -*** ビューの編集 *** - -# cd $RAILS_ROOT/vendor/plugins/redmine_work_time/app/view/work_time/ -# vi show.html.erb - -######################################################################### version 0.0.33 -ユーザーの月毎表示におけるチケットトータル工数の表示を左側に変更 - -######################################################################### version 0.0.34 -ユーザ毎の工数表示をプロジェクト毎にまとめて表示するように変更 -# cd $RAILS_ROOT -# ruby script/generate redmine_plugin_model work_time wt_project_orders prj:integer uid:integer dsp_prj:integer dsp_pos:integer - exists app/models/ - exists test/unit/ - exists test/fixtures/ - create app/models/wt_project_orders.rb - create test/unit/wt_project_orders_test.rb - create test/fixtures/wt_project_orders.yml - exists db/migrate - create db/migrate/20090531095136_create_wt_project_orders.rb -# cd vendor/plugins/redmine_work_time/db/migrate/ -# mv 20090531095136_create_wt_project_orders.rb 006_create_wt_project_orders.rb -# cd $RAILS_ROOT -# rake db:migrate_plugins RAILS_ENV=production - diff --git a/plugins/redmine_work_time/test/fixtures/user_issue_months.yml b/plugins/redmine_work_time/test/fixtures/user_issue_months.yml deleted file mode 100644 index 1ce8467a098298f6b04a7ab1391b418ae4e659c1..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/test/fixtures/user_issue_months.yml +++ /dev/null @@ -1,13 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -one: - id: 1 - uid: 1 - issue: 1 - month: MyString - odr: 1 -two: - id: 2 - uid: 1 - issue: 1 - month: MyString - odr: 1 diff --git a/plugins/redmine_work_time/test/fixtures/wt_daily_memos.yml b/plugins/redmine_work_time/test/fixtures/wt_daily_memos.yml deleted file mode 100644 index f27ad512b70025fc08534f6f5c142e6baff94b11..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/test/fixtures/wt_daily_memos.yml +++ /dev/null @@ -1,15 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -one: - id: 1 - day: 2009-02-22 - user_id: 1 - created_on: 2009-02-22 00:10:21 - updated_on: 2009-02-22 00:10:21 - description: MyText -two: - id: 2 - day: 2009-02-22 - user_id: 1 - created_on: 2009-02-22 00:10:21 - updated_on: 2009-02-22 00:10:21 - description: MyText diff --git a/plugins/redmine_work_time/test/fixtures/wt_holidays.yml b/plugins/redmine_work_time/test/fixtures/wt_holidays.yml deleted file mode 100644 index c21da4de5e883dfa40dbbee6601f7eab497182e6..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/test/fixtures/wt_holidays.yml +++ /dev/null @@ -1,15 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -one: - id: 1 - holiday: 2009-09-12 - created_on: 2009-09-12 18:48:19 - created_by: 1 - deleted_on: 2009-09-12 18:48:19 - deleted_by: 1 -two: - id: 2 - holiday: 2009-09-12 - created_on: 2009-09-12 18:48:19 - created_by: 1 - deleted_on: 2009-09-12 18:48:19 - deleted_by: 1 diff --git a/plugins/redmine_work_time/test/fixtures/wt_member_orders.yml b/plugins/redmine_work_time/test/fixtures/wt_member_orders.yml deleted file mode 100644 index c3f6c51561b385f424767e9f30cf62cdbfb757a8..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/test/fixtures/wt_member_orders.yml +++ /dev/null @@ -1,11 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -one: - id: 1 - user_id: 1 - position: 1 - prj_id: 1 -two: - id: 2 - user_id: 1 - position: 1 - prj_id: 1 diff --git a/plugins/redmine_work_time/test/fixtures/wt_project_orders.yml b/plugins/redmine_work_time/test/fixtures/wt_project_orders.yml deleted file mode 100644 index 7c3a3c4615273b2c90f8e2d9bdee41bc6b9c444e..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/test/fixtures/wt_project_orders.yml +++ /dev/null @@ -1,13 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -one: - id: 1 - prj: 1 - uid: 1 - dsp_prj: 1 - dsp_pos: 1 -two: - id: 2 - prj: 1 - uid: 1 - dsp_prj: 1 - dsp_pos: 1 diff --git a/plugins/redmine_work_time/test/fixtures/wt_ticket_relays.yml b/plugins/redmine_work_time/test/fixtures/wt_ticket_relays.yml deleted file mode 100644 index d9a2cb5ea8c483f1a56d1c16df804c0e9a9d887b..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/test/fixtures/wt_ticket_relays.yml +++ /dev/null @@ -1,11 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -one: - id: 1 - issue_id: 1 - position: 1 - parent: 1 -two: - id: 2 - issue_id: 1 - position: 1 - parent: 1 diff --git a/plugins/redmine_work_time/test/functional/work_time_controller_test.rb b/plugins/redmine_work_time/test/functional/work_time_controller_test.rb deleted file mode 100644 index f773c200ba5cc1a25e3ab04db2d8a9deae9962a3..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/test/functional/work_time_controller_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class WorkTimeControllerTest < ActionController::TestCase - # Replace this with your real tests. - def test_truth - assert true - end -end diff --git a/plugins/redmine_work_time/test/test_helper.rb b/plugins/redmine_work_time/test/test_helper.rb deleted file mode 100644 index bd1ed0c5d90a72c90a28caf5d7aad1792a953356..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/test/test_helper.rb +++ /dev/null @@ -1,5 +0,0 @@ -# Load the normal Rails helper -require File.expand_path(File.dirname(__FILE__) + '/../../../../test/test_helper') - -# Ensure that we are using the temporary fixture path -Engines::Testing.set_fixture_path diff --git a/plugins/redmine_work_time/test/unit/user_issue_month_test.rb b/plugins/redmine_work_time/test/unit/user_issue_month_test.rb deleted file mode 100644 index 7bbd4b07e99b3d6e62537c467ebeff674b0b39c8..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/test/unit/user_issue_month_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class UserIssueMonthTest < Test::Unit::TestCase - fixtures :user_issue_months - - # Replace this with your real tests. - def test_truth - assert true - end -end diff --git a/plugins/redmine_work_time/test/unit/wt_daily_memo_test.rb b/plugins/redmine_work_time/test/unit/wt_daily_memo_test.rb deleted file mode 100644 index 18d0a21e053a71dd83da90043eb84935c0031404..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/test/unit/wt_daily_memo_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class WtDailyMemoTest < Test::Unit::TestCase - fixtures :wt_daily_memos - - # Replace this with your real tests. - def test_truth - assert true - end -end diff --git a/plugins/redmine_work_time/test/unit/wt_holidays_test.rb b/plugins/redmine_work_time/test/unit/wt_holidays_test.rb deleted file mode 100644 index 869ce810eed28f936516d7b9ff74d739865696d1..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/test/unit/wt_holidays_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class WtHolidaysTest < Test::Unit::TestCase - fixtures :wt_holidays - - # Replace this with your real tests. - def test_truth - assert true - end -end diff --git a/plugins/redmine_work_time/test/unit/wt_member_order_test.rb b/plugins/redmine_work_time/test/unit/wt_member_order_test.rb deleted file mode 100644 index 7487d8ed61c2f8daf976fc9279c2d9305d68b70e..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/test/unit/wt_member_order_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class WtMemberOrderTest < Test::Unit::TestCase - fixtures :wt_member_orders - - # Replace this with your real tests. - def test_truth - assert true - end -end diff --git a/plugins/redmine_work_time/test/unit/wt_project_orders_test.rb b/plugins/redmine_work_time/test/unit/wt_project_orders_test.rb deleted file mode 100644 index 660c622ce754a99b25d17132f204f3141fa4dff7..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/test/unit/wt_project_orders_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class WtProjectOrdersTest < Test::Unit::TestCase - fixtures :wt_project_orders - - # Replace this with your real tests. - def test_truth - assert true - end -end diff --git a/plugins/redmine_work_time/test/unit/wt_ticket_relay_test.rb b/plugins/redmine_work_time/test/unit/wt_ticket_relay_test.rb deleted file mode 100644 index ff70cc5059ada24c1c084863788f497d4c39a40f..0000000000000000000000000000000000000000 --- a/plugins/redmine_work_time/test/unit/wt_ticket_relay_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class WtTicketRelayTest < Test::Unit::TestCase - fixtures :wt_ticket_relays - - # Replace this with your real tests. - def test_truth - assert true - end -end