diff --git a/ee/maintained-apps/inputs/homebrew/tableau.json b/ee/maintained-apps/inputs/homebrew/tableau.json new file mode 100644 index 0000000000..bfec249a03 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/tableau.json @@ -0,0 +1,8 @@ +{ + "name": "Tableau Desktop", + "unique_identifier": "com.tableausoftware.Desktop.app", + "token": "tableau", + "installer_format": "dmg", + "slug": "tableau/darwin", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index 70f363bd6d..a0f11fcb86 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -890,7 +890,7 @@ "unique_identifier": "com.sublimetext.4", "description": "Sublime Text is a text editor for code, markup, and prose." }, - { + { "name": "Sublime Text", "slug": "sublime-text/windows", "platform": "windows", @@ -904,6 +904,13 @@ "unique_identifier": "com.tinyapp.TablePlus", "description": "TablePlus is a native GUI tool for relational databases." }, + { + "name": "Tableau Desktop", + "slug": "tableau/darwin", + "platform": "darwin", + "unique_identifier": "com.tableausoftware.Desktop.app", + "description": "Tableau Desktop is a powerful data visualization and business intelligence platform for analyzing and presenting data insights." + }, { "name": "Tailscale", "slug": "tailscale-app/darwin", diff --git a/ee/maintained-apps/outputs/tableau/darwin.json b/ee/maintained-apps/outputs/tableau/darwin.json new file mode 100644 index 0000000000..1a9cdf30ca --- /dev/null +++ b/ee/maintained-apps/outputs/tableau/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "2025.3.0", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.tableausoftware.Desktop.app';" + }, + "installer_url": "https://downloads.tableau.com/esdalt/2025.3.0/TableauDesktop-2025-3-0-arm64.dmg", + "install_script_ref": "2920fd1c", + "uninstall_script_ref": "ff6f427b", + "sha256": "954f538f3a2e1faf9bc082b3cb19382f93653fe0c3e4441149cb7476bc892f8a", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "2920fd1c": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# install pkg files\nsudo installer -pkg \"$TMPDIR/Tableau Desktop.pkg\" -target /\n", + "ff6f427b": "#!/bin/sh\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\n}\n\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/volume<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/install-location<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_pkg_files 'com.amazon.redshiftodbc'\nforget_pkg 'com.amazon.redshiftodbc'\nremove_pkg_files 'com.simba.sparkodbc'\nforget_pkg 'com.simba.sparkodbc'\nremove_pkg_files 'com.simba.sqlserverodbc'\nforget_pkg 'com.simba.sqlserverodbc'\nremove_pkg_files 'com.tableausoftware.Desktop.app'\nforget_pkg 'com.tableausoftware.Desktop.app'\nremove_pkg_files 'com.tableausoftware.DesktopShortcut'\nforget_pkg 'com.tableausoftware.DesktopShortcut'\nremove_pkg_files 'com.tableausoftware.extensions'\nforget_pkg 'com.tableausoftware.extensions'\nremove_pkg_files 'com.tableausoftware.FLEXNet.*'\nforget_pkg 'com.tableausoftware.FLEXNet.*'\nremove_pkg_files 'com.tableausoftware.mysql'\nforget_pkg 'com.tableausoftware.mysql'\nremove_pkg_files 'com.tableausoftware.networkExtensions'\nforget_pkg 'com.tableausoftware.networkExtensions'\nremove_pkg_files 'com.tableausoftware.oracle'\nforget_pkg 'com.tableausoftware.oracle'\nremove_pkg_files 'com.tableausoftware.postgresql'\nforget_pkg 'com.tableausoftware.postgresql'\nremove_pkg_files 'com.tableausoftware.telemetry'\nforget_pkg 'com.tableausoftware.telemetry'\nremove_pkg_files 'simba.sparkodbc'\nforget_pkg 'simba.sparkodbc'\nsudo rm -rf '/Library/Preferences/com.tableau.Tableau-2025.3.plist'\ntrash $LOGGED_IN_USER '/Library/Preferences/com.tableau.Tableau-2025.3.plist'\ntrash $LOGGED_IN_USER '~/Documents/My Tableau Repository'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.tableau.caching'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.tableausoftware.MapTiles'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.tableau.Registration.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.tableau.Tableau-2025.3.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.tableausoftware.tableaudesktop.savedState'\ntrash $LOGGED_IN_USER '~/Library/Tableau'\n" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/TableauDesktop.tsx b/frontend/pages/SoftwarePage/components/icons/TableauDesktop.tsx new file mode 100644 index 0000000000..986d962cb2 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/TableauDesktop.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const TableauDesktop = (props: SVGProps) => ( + + + +); +export default TableauDesktop; diff --git a/frontend/pages/SoftwarePage/components/icons/index.ts b/frontend/pages/SoftwarePage/components/icons/index.ts index 91e0bc7ba3..bc8fede4e0 100644 --- a/frontend/pages/SoftwarePage/components/icons/index.ts +++ b/frontend/pages/SoftwarePage/components/icons/index.ts @@ -121,6 +121,7 @@ import Snagit from "./Snagit"; import Sourcetree from "./Sourcetree"; import Spotify from "./Spotify"; import SublimeText from "./SublimeText"; +import TableauDesktop from "./TableauDesktop"; import TablePlus from "./TablePlus"; import Tailscale from "./Tailscale"; import TeamViewer from "./TeamViewer"; @@ -273,6 +274,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { sourcetree: Sourcetree, spotify: Spotify, "sublime text": SublimeText, + tableau: TableauDesktop, tableplus: TablePlus, tailscale: Tailscale, telegram: Telegram, @@ -381,8 +383,6 @@ const matchStrictNameSourceToIcon = ({ return Zoom; case name === "zoom": return Zoom; - case name === "zoom.us": - return Zoom; case name.startsWith("zoom workplace"): return Zoom; default: diff --git a/website/assets/images/app-icon-tableau-60x60@2x.png b/website/assets/images/app-icon-tableau-60x60@2x.png new file mode 100644 index 0000000000..2ebd6a8c49 Binary files /dev/null and b/website/assets/images/app-icon-tableau-60x60@2x.png differ