module Projects class TableCell < ::TableCell include ProjectsHelper options :params # We read collapsed state from params options :current_user # adds this option to those of the base class def initial_sort [:lft, :asc] end def table_id 'project-table' end ## # The project sort by is handled differently def build_sort_header(column, options) projects_sort_header_tag(column, options.merge(param: :json)) end # We don't return the project row # but the [project, level] array from the helper def rows @rows ||= to_enum(:projects_with_levels_order_sensitive, model).to_a end def initialize_sorted_model sort_clear orders = options[:orders] sort_init orders sort_update orders.map(&:first) end def paginated? true end def deactivate_class_on_lft_sort if sorted_by_lft? '-inactive' end end def href_only_when_not_sort_lft unless sorted_by_lft? projects_path(sortBy: JSON::dump([['lft', 'asc']])) end end def all_columns @all_columns ||= begin [ [:hierarchy, builtin: true], [:name, builtin: true, caption: Project.human_attribute_name(:name)], [:project_status, caption: Project.human_attribute_name(:status)], [:public, caption: Project.human_attribute_name(:public)], *custom_field_columns, *admin_columns ] end end def headers all_columns .select do |name, options| options[:builtin] || Setting.enabled_projects_columns.include?(name.to_s) end end def sortable_column?(_column) true end def columns @columns ||= headers.map(&:first) end def admin_columns return [] unless current_user.admin? [ [:created_at, caption: Project.human_attribute_name(:created_at)], [:latest_activity_at, caption: Project.human_attribute_name(:latest_activity_at)], [:required_disk_space, caption: I18n.t(:label_required_disk_storage)] ] end def custom_field_columns project_custom_fields.values.map do |custom_field| [:"cf_#{custom_field.id}", caption: custom_field.name, custom_field: true] end end def project_custom_fields @project_custom_fields ||= begin fields = if EnterpriseToken.allows_to?(:custom_fields_in_projects_list) ProjectCustomField.visible(current_user).order(:position) else ProjectCustomField.none end fields .map { |cf| [:"cf_#{cf.id}", cf] } .to_h end end end end