'required|integer', 'data_source_id' => 'required|integer', 'name' => 'required|min_length[2]|max_length[200]', 'chart_type' => 'required|in_list[bar,line,area,pie,donut,scatter,table,kpi_card,funnel,gauge,heatmap,combo,spline,stepline,radar,bubble,polar_area,ranked_progress]', 'query_type' => 'permit_empty|in_list[visual,raw_sql,api]', ]; public function forWorkspace(int $workspaceId): array { return $this->select('charts.*, data_sources.name as data_source_name, saved_queries.name as saved_query_name') ->join('data_sources', 'data_sources.id = charts.data_source_id', 'left') ->join('saved_queries', 'saved_queries.id = charts.saved_query_id', 'left') ->where('charts.workspace_id', $workspaceId) ->orderBy('charts.id', 'DESC') ->findAll(); } /** * @param array $data */ public function duplicateRow(array $source, int $userId): int|false { $copy = $source; unset($copy['id'], $copy['created_at'], $copy['updated_at'], $copy['deleted_at']); $copy['name'] = (string) $copy['name'] . ' (copy)'; $copy['public_token'] = null; $copy['is_public'] = 0; $copy['created_by'] = $userId; return $this->insert($copy, true); } }