diff --git a/app/dashboard/src/assets/ReadAndFilter.png b/app/dashboard/src/assets/ReadAndFilter.png new file mode 100644 index 000000000000..b95966b171f1 Binary files /dev/null and b/app/dashboard/src/assets/ReadAndFilter.png differ diff --git a/app/dashboard/src/assets/aggregate.png b/app/dashboard/src/assets/aggregate.png new file mode 100644 index 000000000000..465918d20f80 Binary files /dev/null and b/app/dashboard/src/assets/aggregate.png differ diff --git a/app/dashboard/src/assets/blankProject.png b/app/dashboard/src/assets/blankProject.png new file mode 100644 index 000000000000..257b9c57619a Binary files /dev/null and b/app/dashboard/src/assets/blankProject.png differ diff --git a/app/dashboard/src/assets/book.png b/app/dashboard/src/assets/book.png new file mode 100644 index 000000000000..4635abd90051 Binary files /dev/null and b/app/dashboard/src/assets/book.png differ diff --git a/app/dashboard/src/assets/cleansing.png b/app/dashboard/src/assets/cleansing.png new file mode 100644 index 000000000000..63b1e5945d8c Binary files /dev/null and b/app/dashboard/src/assets/cleansing.png differ diff --git a/app/dashboard/src/assets/covid.png b/app/dashboard/src/assets/covid.png new file mode 100644 index 000000000000..eff3b1a73384 Binary files /dev/null and b/app/dashboard/src/assets/covid.png differ diff --git a/app/dashboard/src/assets/enso_logo_large.svg b/app/dashboard/src/assets/enso_logo_large.svg new file mode 100644 index 000000000000..3967417a715e --- /dev/null +++ b/app/dashboard/src/assets/enso_logo_large.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/dashboard/src/assets/joining.png b/app/dashboard/src/assets/joining.png new file mode 100644 index 000000000000..7b9cfad33bdc Binary files /dev/null and b/app/dashboard/src/assets/joining.png differ diff --git a/app/dashboard/src/assets/kmeans.png b/app/dashboard/src/assets/kmeans.png new file mode 100644 index 000000000000..aaef5a2cbdf5 Binary files /dev/null and b/app/dashboard/src/assets/kmeans.png differ diff --git a/app/dashboard/src/assets/monthSales.png b/app/dashboard/src/assets/monthSales.png new file mode 100644 index 000000000000..7c8f4d221979 Binary files /dev/null and b/app/dashboard/src/assets/monthSales.png differ diff --git a/app/dashboard/src/assets/nasdaq.png b/app/dashboard/src/assets/nasdaq.png new file mode 100644 index 000000000000..36cfaadf3ed4 Binary files /dev/null and b/app/dashboard/src/assets/nasdaq.png differ diff --git a/app/dashboard/src/assets/weather.png b/app/dashboard/src/assets/weather.png new file mode 100644 index 000000000000..9286d7183d5e Binary files /dev/null and b/app/dashboard/src/assets/weather.png differ diff --git a/app/dashboard/src/components/AriaComponents/Dialog/Dialog.tsx b/app/dashboard/src/components/AriaComponents/Dialog/Dialog.tsx index 434744036892..6b76a961adbf 100644 --- a/app/dashboard/src/components/AriaComponents/Dialog/Dialog.tsx +++ b/app/dashboard/src/components/AriaComponents/Dialog/Dialog.tsx @@ -100,10 +100,10 @@ const DIALOG_STYLES = twv.tv({ }, slots: { header: - 'sticky top-0 grid grid-cols-[1fr_auto_1fr] items-center border-b border-primary/10 transition-[border-color] duration-150', + 'sticky z-1 top-0 grid grid-cols-[1fr_auto_1fr] items-center border-b border-primary/10 transition-[border-color] duration-150', closeButton: 'col-start-1 col-end-1 mr-auto', heading: 'col-start-2 col-end-2 my-0 text-center', - content: 'relative flex-auto', + content: 'relative flex-auto overflow-y-auto max-h-[inherit]', }, compoundVariants: [ { type: 'modal', size: 'small', class: 'max-w-sm' }, @@ -144,7 +144,7 @@ export function Dialog(props: DialogProps) { testId = 'dialog', size, rounded, - padding, + padding = type === 'modal' ? 'medium' : 'xlarge', fitContent, ...ariaDialogProps } = props diff --git a/app/dashboard/src/components/AriaComponents/Text/Text.tsx b/app/dashboard/src/components/AriaComponents/Text/Text.tsx index 28bb614cb834..3af44bec3c61 100644 --- a/app/dashboard/src/components/AriaComponents/Text/Text.tsx +++ b/app/dashboard/src/components/AriaComponents/Text/Text.tsx @@ -34,7 +34,7 @@ export const TEXT_STYLE = twv.tv({ danger: 'text-danger', success: 'text-accent-dark', disabled: 'text-primary/30', - invert: 'text-white', + invert: 'text-invert', inherit: 'text-inherit', current: 'text-current', }, @@ -89,7 +89,7 @@ export const TEXT_STYLE = twv.tv({ }, monospace: { true: 'font-mono' }, italic: { true: 'italic' }, - nowrap: { true: 'whitespace-nowrap' }, + nowrap: { true: 'whitespace-nowrap', normal: 'whitespace-normal', false: '' }, textSelection: { auto: '', none: 'select-none', diff --git a/app/dashboard/src/layouts/Samples.tsx b/app/dashboard/src/layouts/Samples.tsx index 3d80df441e5c..b6262ba25d3e 100644 --- a/app/dashboard/src/layouts/Samples.tsx +++ b/app/dashboard/src/layouts/Samples.tsx @@ -1,33 +1,21 @@ /** @file Renders the list of templates from which a project can be created. */ import * as React from 'react' -import Logo from '#/assets/enso_logo.svg' +import ReadAndFilterImage from '#/assets/ReadAndFilter.png' +import AggregatingImage from '#/assets/aggregate.png' +import BlankImage from '#/assets/blankProject.png' +import CleansingImage from '#/assets/cleansing.png' +import CovidImage from '#/assets/covid.png' import GeoImage from '#/assets/geo.svg' -import HeartIcon from '#/assets/heart.svg' -import OpenCountIcon from '#/assets/open_count.svg' +import JoinImage from '#/assets/joining.png' +import KMeansImage from '#/assets/kmeans.png' +import MonthSalesImage from '#/assets/monthSales.png' +import NasdaqImage from '#/assets/nasdaq.png' import SpreadsheetsImage from '#/assets/spreadsheets.svg' import VisualizeImage from '#/assets/visualize.png' +import WeatherImage from '#/assets/weather.png' -import * as textProvider from '#/providers/TextProvider' - -import * as aria from '#/components/aria' -import FocusArea from '#/components/styled/FocusArea' -import FocusRing from '#/components/styled/FocusRing' -import SvgMask from '#/components/SvgMask' - -import * as tailwindMerge from '#/utilities/tailwindMerge' - -// ================= -// === Constants === -// ================= - -/** A placeholder author for a sample, for use until the backend implements an endpoint. */ -const DUMMY_AUTHOR = 'Enso Team' -/** A placeholder number of times a sample has been opened, for use until the backend implements - * an endpoint. */ -const DUMMY_OPEN_COUNT = 10 -/** A placeholder number of likes for a sample, for use until the backend implements an endpoint. */ -const DUMMY_LIKE_COUNT = 10 +import { Button, Text } from '#/components/AriaComponents' // ========================= // === List of templates === @@ -41,42 +29,101 @@ export interface Sample { readonly description: string readonly id: string readonly background?: string + readonly group?: string } /** The full list of templates. */ export const SAMPLES: Sample[] = [ { - title: 'Colorado COVID', - id: 'Colorado_COVID', - description: 'Learn to glue multiple spreadsheets to analyses all your data at once.', + title: 'Blank Project', + id: 'Default', + description: 'Start with a blank workflow.', + background: `url("${BlankImage}") center / cover`, + group: 'Getting Started', }, { - title: 'KMeans', - id: 'KMeans', - description: 'Learn where to open a coffee shop to maximize your income.', + title: 'Reading and Filterng Data', + id: 'Getting_Started_Reading', + description: 'Learn how to bring data into Enso.', + background: `url("${ReadAndFilterImage}") center / cover`, + group: 'Getting Started', + }, + { + title: 'Aggregating and Pivoting', + id: 'Getting_Started_Aggregating', + description: 'Learn how to group and aggregate data, and pivot.', + background: `url("${AggregatingImage}") center / cover`, + group: 'Getting Started', + }, + { + title: 'Cleaning and Parsing Data', + id: 'Getting_Started_Cleansing', + description: 'Learn how to cleanse and parse text values.', + background: `url("${CleansingImage}") center / cover`, + group: 'Getting Started', + }, + { + title: 'Selecting Columns and Joining Tables', + id: 'Getting_Started_Selecting', + description: 'Learn how to choose columns and join tables.', + background: `url("${JoinImage}") center / cover`, + group: 'Getting Started', + }, + { + title: 'Analyze GitHub stars', + id: 'Stargazers', + description: "Find out which of Enso's repositories are most popular over time.", + background: `url("${VisualizeImage}") center / cover`, + group: 'Advanced', }, { title: 'NASDAQ Returns', id: 'NASDAQReturns', description: 'Learn how to clean your data to prepare it for advanced analysis.', + background: `url("${NasdaqImage}") center / cover`, + group: 'Advanced', + }, + { + title: 'KMeans', + id: 'KMeans', + description: 'Learn where to open a coffee shop to maximize your income.', + background: `url("${KMeansImage}") center / cover`, + group: 'Advanced', }, { title: 'Combine spreadsheets', id: 'Orders', description: 'Glue multiple spreadsheets together to analyse all your data at once.', - background: `url('${SpreadsheetsImage}') center / 50% no-repeat, rgba(255, 255, 255, 0.30)`, + background: `url("${SpreadsheetsImage}") center / 50% no-repeat, rgba(255, 255, 255, 0.30)`, + group: 'Examples', + }, + { + title: 'Month on Month Sales', + id: 'Monthly_Sales', + description: 'Learn how to compare with previous month sales.', + background: `url("${MonthSalesImage}") center / cover`, + group: 'Examples', + }, + { + title: 'Colorado COVID', + id: 'Colorado_COVID', + description: 'Learn to glue multiple spreadsheets to analyses all your data at once.', + background: `url('${CovidImage}') center / 100% no-repeat, rgba(255, 255, 255, 0.30)`, + group: 'Examples', + }, + { + title: 'Web API analysis', + id: 'Bank_Holiday_Rain', + description: 'Learn whether it rains on UK Bank Holidays via REST APIs.', + background: `url('${WeatherImage}') center / 100% no-repeat, rgba(255, 255, 255, 0.30)`, + group: 'Examples', }, { title: 'Geospatial analysis', id: 'Restaurants', description: 'Learn where to open a coffee shop to maximize your income.', background: `url('${GeoImage}') 50% 20% / 100% no-repeat`, - }, - { - title: 'Analyze GitHub stars', - id: 'Stargazers', - description: "Find out which of Enso's repositories are most popular over time.", - background: `url("${VisualizeImage}") center / cover`, + group: 'Examples', }, ] @@ -93,61 +140,31 @@ interface InternalProjectTileProps { /** A button that, when clicked, creates and opens a new project based on a template. */ function ProjectTile(props: InternalProjectTileProps) { const { sample, createProject } = props - const { getText } = textProvider.useText() const { id, title, description, background } = sample - const author = DUMMY_AUTHOR - const opens = DUMMY_OPEN_COUNT - const likes = DUMMY_LIKE_COUNT return ( -
- - {(innerProps) => ( - - { - createProject(id, title) - }} - {...innerProps} - > -
-
- {title} -
{description}
-
- - - )} - - {/* Although this component is instantiated multiple times, it has a unique role and hence - * its own opacity. */} - {/* eslint-disable-next-line no-restricted-syntax */} -
-
- - {author} -
- {/* Normally `flex` */} -
-
- - {opens} -
-
- - {likes} -
+
+ ) } @@ -157,22 +174,20 @@ function ProjectTile(props: InternalProjectTileProps) { /** Props for a {@link Samples}. */ export interface SamplesProps { + readonly groupName: string readonly createProject: (templateId?: string | null, templateName?: string | null) => void } /** A list of sample projects. */ export default function Samples(props: SamplesProps) { - const { createProject } = props - const { getText } = textProvider.useText() + const { groupName, createProject } = props return ( -
- - {getText('sampleAndCommunityProjects')} - +
+ {groupName} -
- {SAMPLES.map((sample) => ( +
+ {SAMPLES.filter((s) => s.group === groupName).map((sample) => ( ))}
diff --git a/app/dashboard/src/layouts/StartModal.tsx b/app/dashboard/src/layouts/StartModal.tsx index b6ae5100bb7b..92ebacdb23fd 100644 --- a/app/dashboard/src/layouts/StartModal.tsx +++ b/app/dashboard/src/layouts/StartModal.tsx @@ -26,18 +26,26 @@ export default function StartModal(props: StartModalProps) { {(opts) => (
- - {getText('welcomeSubtitle')} - - { + createProject(templateId, templateName) + opts.close() + }} + /> + + { + createProject(templateId, templateName) + opts.close() + }} + /> + + { createProject(templateId, templateName) opts.close() diff --git a/app/dashboard/src/layouts/WhatsNew.tsx b/app/dashboard/src/layouts/WhatsNew.tsx index 17f66ecec720..6b608e1a4733 100644 --- a/app/dashboard/src/layouts/WhatsNew.tsx +++ b/app/dashboard/src/layouts/WhatsNew.tsx @@ -1,15 +1,15 @@ /** @file Community updates for the app. */ import * as React from 'react' -import DiscordIcon from '#/assets/discord.svg' +import BookImage from '#/assets/book.png' +import Logo from '#/assets/enso_logo_large.svg' import IntegrationsImage from '#/assets/integrations.png' import YoutubeIcon from '#/assets/youtube.svg' +import { Button, Text } from '#/components/AriaComponents' import * as textProvider from '#/providers/TextProvider' -import * as aria from '#/components/aria' -import FocusArea from '#/components/styled/FocusArea' -import FocusRing from '#/components/styled/FocusRing' +import SvgMask from '#/components/SvgMask' // ================ // === WhatsNew === @@ -20,86 +20,108 @@ export default function WhatsNew() { const { getText } = textProvider.useText() return ( -
- - {getText('discoverWhatsNew')} - -
- - {(innerProps) => ( - - -
- - {getText('newsItem3Beta')} - - - {getText('newsItem3BetaDescription')} - -
-
-
- )} -
- - {(innerProps) => ( - - - -
- - {getText('newsItemWeeklyTutorials')} - - - {getText('newsItemWeeklyTutorialsDescription')} - -
-
-
- )} -
- - {(innerProps) => ( - - - -
- - {getText('newsItemCommunityServer')} - - - {getText('newsItemCommunityServerDescription')} - -
-
-
- )} -
+
+ {getText('discoverWhatsNew')} + +
+ + + +
) diff --git a/app/dashboard/src/tailwind.css b/app/dashboard/src/tailwind.css index 59e2e98d942b..49aef979fa79 100644 --- a/app/dashboard/src/tailwind.css +++ b/app/dashboard/src/tailwind.css @@ -511,30 +511,26 @@ background-image: url('data:image/svg+xml;utf8,'), url('data:image/svg+xml;utf8,'), url('data:image/svg+xml;utf8,'); + border-top-width: var(--scrollbar-offset-edge, 0); + border-bottom-width: var(--scrollbar-offset-edge, 0); + border-right-width: 4px; + border-left-width: 0; /* Custom scrollbar for rounded corners */ :where(:is([class*='rounded-xl']))& { - border-width: 8px; - border-right-width: 4px; - border-left-width: 0; + --scrollbar-offset-edge: 8px; } :where(:is([class*='rounded-2xl']))& { - border-width: 16px; - border-right-width: 4px; - border-left-width: 0; + --scrollbar-offset-edge: 16px; } :where(:is([class*='rounded-3xl']))& { - border-width: 24px; - border-right-width: 4px; - border-left-width: 0; + --scrollbar-offset-edge: 24px; } :where(:is([class*='rounded-4xl']))& { - border-width: 28px; - border-right-width: 4px; - border-left-width: 0; + --scrollbar-offset-edge: 28px; } &:hover { @@ -558,30 +554,26 @@ background-image: url('data:image/svg+xml;utf8,'), url('data:image/svg+xml;utf8,'), url('data:image/svg+xml;utf8,'); + border-left-width: var(--scrollbar-offset-edge, 0); + border-right-width: var(--scrollbar-offset-edge, 0); + border-top-width: 0; + border-bottom-width: 4px; /* Custom scrollbar for rounded corners */ :where(:is([class*='rounded-xl']))& { - border-width: 8px; - border-bottom-width: 4px; - border-top-width: 0; + --scrollbar-offset-edge: 8px; } :where(:is([class*='rounded-2xl']))& { - border-width: 16px; - border-bottom-width: 4px; - border-top-width: 0; + --scrollbar-offset-edge: 16px; } :where(:is([class*='rounded-3xl']))& { - border-width: 24px; - border-bottom-width: 4px; - border-top-width: 0; + --scrollbar-offset-edge: 24px; } :where(:is([class*='rounded-4xl']))& { - border-width: 28px; - border-bottom-width: 4px; - border-top-width: 0; + --scrollbar-offset-edge: 28px; } &:hover { diff --git a/app/dashboard/tailwind.config.js b/app/dashboard/tailwind.config.js index ec079f31a249..0bbf3cf7d9cc 100644 --- a/app/dashboard/tailwind.config.js +++ b/app/dashboard/tailwind.config.js @@ -491,6 +491,46 @@ inset 0 -36px 51px -51px #00000014`, '@apply opacity-75 cursor-not-allowed': '', }, + '.scroll-offset-edge-s': { + '--scrollbar-offset-edge': '2px', + }, + '.scroll-offset-edge-m': { + '--scrollbar-offset-edge': '4px', + }, + '.scroll-offset-edge-l': { + '--scrollbar-offset-edge': '6px', + }, + '.scroll-offset-edge-xl': { + '--scrollbar-offset-edge': '8px', + }, + '.scroll-offset-edge-2xl': { + '--scrollbar-offset-edge': '16px', + }, + '.scroll-offset-edge-3xl': { + '--scrollbar-offset-edge': '24px', + }, + '.scroll-offset-edge-4xl': { + '--scrollbar-offset-edge': '28px', + }, + '.scroll-offset-edge-5xl': { + '--scrollbar-offset-edge': '32px', + }, + '.scroll-offset-edge-6xl': { + '--scrollbar-offset-edge': '36px', + }, + '.scroll-offset-edge-7xl': { + '--scrollbar-offset-edge': '40px', + }, + '.scroll-offset-edge-8xl': { + '--scrollbar-offset-edge': '44px', + }, + '.scroll-offset-edge-9xl': { + '--scrollbar-offset-edge': '48px', + }, + '.scroll-offset-edge-10xl': { + '--scrollbar-offset-edge': '52px', + }, + // === Visbility classes === '.visibility-visible': {}, diff --git a/app/ide-desktop/common/src/text/english.json b/app/ide-desktop/common/src/text/english.json index b01524dbc25e..c85abfc4a179 100644 --- a/app/ide-desktop/common/src/text/english.json +++ b/app/ide-desktop/common/src/text/english.json @@ -341,9 +341,9 @@ "loadingAppMessage": "Loading Enso...", "appErroredMessage": "Enso encountered an unrecoverable error.", "appErroredPrompt": "Please try refreshing or installing an updated version.", - "discoverWhatsNew": "Discover what’s new", + "discoverWhatsNew": "Learn about Enso Analytics", "sampleAndCommunityProjects": "Sample and community projects", - "startWithATemplate": "Start with a template", + "startWithATemplate": "Discover", "openInfoMenu": "Open info menu", "noProjectIsCurrentlyOpen": "No project is currently open.", "versionOutdatedTitle": "Upgrade Enso Now", @@ -536,14 +536,16 @@ "confirmNewPasswordLabel": "Confirm new password", "confirmNewPasswordPlaceholder": "Confirm your new password", - "selectTemplate": "Select a template", + "selectTemplate": "Welcome", "welcomeSubtitle": "Explore templates, plugins, and data sources to kickstart your next big idea.", - "newsItem3Beta": "Read what’s new in Enso 3.0 Beta", - "newsItem3BetaDescription": "Learn about Enso Cloud, new data libraries, and Enso AI.", - "newsItemWeeklyTutorials": "Watch weekly Enso tutorials", - "newsItemWeeklyTutorialsDescription": "Subscribe not to miss new weekly tutorials.", - "newsItemCommunityServer": "Join our community server", - "newsItemCommunityServerDescription": "Chat with our team and other Enso users.", + "newsItem3Beta": "Read what’s new in Enso", + "newsItem3BetaDescription": "Learn about new features and whats coming soon.", + "newsItemWeeklyTutorials": "Watch tutorials and webinars", + "newsItemWeeklyTutorialsDescription": "Subscribe not to miss new updates.", + "newsItemHelpServer": "Read the documentation", + "newsItemHelpServerDescription": "Learn how to use Enso.", + "newsItemCommunityServer": "Join the community", + "newsItemCommunityServerDescription": "Chat with Enso team and other users.", "drivePageName": "Data Catalog", "editorPageName": "Spatial Analysis", diff --git a/build/build/src/engine.rs b/build/build/src/engine.rs index 49088a7790b4..337c1bb537b0 100644 --- a/build/build/src/engine.rs +++ b/build/build/src/engine.rs @@ -42,16 +42,71 @@ pub async fn download_project_templates(client: reqwest::Client, enso_root: Path let output_base = enso_root.join("lib/scala/pkg/src/main/resources/"); let url_base = Url::parse("https://github.com/enso-org/project-templates/raw/main/")?; let to_handle = [ - ("Orders", vec!["data/store_data.xlsx", "src/Main.enso"]), - ("Restaurants", vec!["data/la_districts.csv", "data/restaurants.csv", "src/Main.enso"]), + ("Orders", vec![ + "data/store_data.xlsx", + "src/eaep.png", + "src/excel1.png", + "src/excel2.png", + "src/excel3.png", + "src/eyeball_viz.png", + "src/Main.enso", + ]), + ("Restaurants", vec![ + "data/la_districts.csv", + "data/mapcolors.json", + "data/restaurants.csv", + "src/eaep.png", + "src/Main.enso", + "src/map1.png", + "src/map2.png", + "src/table1.png", + ]), ("Stargazers", vec!["src/Main.enso"]), ("Colorado_COVID", vec![ "data/CDPHE_COVID19_County_Status_Metrics.csv", "data/ColoradoGeoData.db", + "src/eaep.png", + "src/Main.enso", + "src/map.png", + "src/table1.png", + "src/table2.png", + ]), + ("Monthly_Sales", vec![ + "data/Sales_Sample_Data.xlsx", + "src/eaep.png", + "src/excel1.png", "src/Main.enso", ]), + ("Bank_Holiday_Rain", vec!["src/bankholiday.png", "src/eaep.png", "src/Main.enso"]), ("KMeans", vec!["src/Main.enso"]), ("NASDAQReturns", vec!["src/Main.enso"]), + ("Getting_Started_Reading", vec![ + "src/eags.png", + "src/loadfile.gif", + "src/Main.enso", + "src/sheets.gif", + "src/showdata.gif", + "src/simpleexpression.gif", + "src/table_solution.png", + "src/table_viz.png", + ]), + ("Getting_Started_Aggregating", vec![ + "data/sample_bank_data.xlsx", + "src/answer_table.png", + "src/eags.png", + "src/Main.enso", + "src/set.gif", + "src/table1.png", + ]), + ("Getting_Started_Cleansing", vec!["data/crm_data.csv", "src/eags.png", "src/Main.enso"]), + ("Getting_Started_Selecting", vec![ + "data/crm_data.csv", + "data/Customer_Data.xlsx", + "src/eags.png", + "src/Main.enso", + "src/table1.png", + "src/table2.png", + ]), ]; let mut futures = Vec::>::new(); diff --git a/lib/scala/pkg/src/main/scala/org/enso/pkg/Package.scala b/lib/scala/pkg/src/main/scala/org/enso/pkg/Package.scala index 76b9418a6587..94bc9976e8c7 100644 --- a/lib/scala/pkg/src/main/scala/org/enso/pkg/Package.scala +++ b/lib/scala/pkg/src/main/scala/org/enso/pkg/Package.scala @@ -381,97 +381,164 @@ class PackageManager[F](implicit val fileSystem: FileSystem[F]) { private def copyResources(pkg: Package[F], template: Template): Unit = template match { case Template.Default => - val mainEnsoPath = new URI(s"/default/src/${Package.mainFileName}") - - copyResource( - mainEnsoPath, - pkg.sourceDir.getChild(Package.mainFileName) - ) + copyTemplateFiles(pkg, "default", List(Package.mainFileName), List()) case Template.ColoradoCovid => - val metricsDataPath = new URI( - "/colorado_covid/data/CDPHE_COVID19_County_Status_Metrics.csv" - ) - val geoDataPath = new URI("/colorado_covid/data/ColoradoGeoData.db") - val mainEnsoPath = new URI( - s"/colorado_covid/src/${Package.mainFileName}" - ) - - pkg.root.getChild("data").createDirectories() - copyResource( - metricsDataPath, - pkg.root - .getChild("data") - .getChild("CDPHE_COVID19_County_Status_Metrics.csv") + val srcFiles = List( + Package.mainFileName, + "eaep.png", + "map.png", + "table1.png", + "table2.png" ) - copyResource( - geoDataPath, - pkg.root.getChild("data").getChild("ColoradoGeoData.db") - ) - copyResource( - mainEnsoPath, - pkg.sourceDir.getChild(Package.mainFileName) + val dataFiles = List( + "CDPHE_COVID19_County_Status_Metrics.csv", + "ColoradoGeoData.db" ) + copyTemplateFiles(pkg, "colorado_covid", srcFiles, dataFiles) case Template.Kmeans => - val mainEnsoPath = new URI(s"/kmeans/src/${Package.mainFileName}") + copyTemplateFiles(pkg, "kmeans", List(Package.mainFileName), List()) - copyResource( - mainEnsoPath, - pkg.sourceDir.getChild(Package.mainFileName) + case Template.NasdaqReturns => + copyTemplateFiles( + pkg, + "nasdaqreturns", + List(Package.mainFileName), + List() ) - case Template.NasdaqReturns => - val mainEnsoPath = new URI( - s"/nasdaqreturns/src/${Package.mainFileName}" + case Template.Orders => + val srcFiles = List( + Package.mainFileName, + "eaep.png", + "excel1.png", + "excel2.png", + "excel3.png", + "eyeball_viz.png" + ) + val dataFiles = List( + "store_data.xlsx" ) + copyTemplateFiles(pkg, "orders", srcFiles, dataFiles) - copyResource( - mainEnsoPath, - pkg.sourceDir.getChild(Package.mainFileName) + case Template.Restaurants => + val srcFiles = List( + Package.mainFileName, + "eaep.png", + "map1.png", + "map2.png", + "table1.png" ) + val dataFiles = List( + "la_districts.csv", + "mapcolors.json", + "restaurants.csv" + ) + copyTemplateFiles(pkg, "restaurants", srcFiles, dataFiles) - case Template.Orders => - val storeDataPath = new URI("/orders/data/store_data.xlsx") - val mainEnsoPath = new URI(s"/orders/src/${Package.mainFileName}") + case Template.Stargazers => + copyTemplateFiles(pkg, "stargazers", List(Package.mainFileName), List()) - pkg.root.getChild("data").createDirectories() - copyResource( - storeDataPath, - pkg.root.getChild("data").getChild("store_data.xlsx") + case Template.MonthlySales => + val srcFiles = List( + Package.mainFileName, + "eaep.png", + "excel1.png" ) - copyResource( - mainEnsoPath, - pkg.sourceDir.getChild(Package.mainFileName) + val dataFiles = List( + "Sales_Sample_Data.xlsx" ) + copyTemplateFiles(pkg, "monthly_sales", srcFiles, dataFiles) - case Template.Restaurants => - val laDistrictsDataPath = new URI("/restaurants/data/la_districts.csv") - val restaurantsDataPath = new URI("/restaurants/data/restaurants.csv") - val mainEnsoPath = new URI(s"/restaurants/src/${Package.mainFileName}") + case Template.BankHolidayRain => + val srcFiles = List( + Package.mainFileName, + "eaep.png", + "bankholiday.png" + ) + copyTemplateFiles(pkg, "bank_holiday_rain", srcFiles, List()) + + case Template.GettingStartedReading => + val srcFiles = List( + Package.mainFileName, + "eags.png", + "loadfile.gif", + "sheets.gif", + "showdata.gif", + "simpleexpression.gif", + "table_solution.png", + "table_viz.png" + ) + copyTemplateFiles(pkg, "getting_started_reading", srcFiles, List()) + + case Template.GettingStartedAggregating => + val srcFiles = List( + Package.mainFileName, + "answer_table.png", + "eags.png", + "set.gif", + "table1.png" + ) + val dataFiles = List( + "sample_bank_data.xlsx" + ) + copyTemplateFiles( + pkg, + "getting_started_aggregating", + srcFiles, + dataFiles + ) - pkg.root.getChild("data").createDirectories() - copyResource( - laDistrictsDataPath, - pkg.root.getChild("data").getChild("la_districts.csv") + case Template.GettingStartedCleansing => + val srcFiles = List( + Package.mainFileName, + "eags.png" ) - copyResource( - restaurantsDataPath, - pkg.root.getChild("data").getChild("restaurants.csv") + val dataFiles = List( + "crm_data.csv" ) - copyResource( - mainEnsoPath, - pkg.sourceDir.getChild(Package.mainFileName) + copyTemplateFiles(pkg, "getting_started_cleansing", srcFiles, dataFiles) + + case Template.GettingStartedSelecting => + val srcFiles = List( + Package.mainFileName, + "eags.png", + "table1.png", + "table2.png" ) + val dataFiles = List( + "crm_data.csv", + "Customer_Data.xlsx" + ) + copyTemplateFiles(pkg, "getting_started_selecting", srcFiles, dataFiles) + } - case Template.Stargazers => - val mainEnsoPath = new URI(s"/stargazers/src/${Package.mainFileName}") + private def copyTemplateFiles( + pkg: Package[F], + project_name: String, + srcFiles: List[String], + dataFiles: List[String] + ): Unit = { + srcFiles.foreach { file => + val srcPath = new URI(s"/$project_name/src/$file") + copyResource( + srcPath, + pkg.sourceDir.getChild(file) + ) + } + if (dataFiles.nonEmpty) { + pkg.root.getChild("data").createDirectories() + dataFiles.foreach { file => + val dataPath = new URI(s"/$project_name/data/$file") copyResource( - mainEnsoPath, - pkg.sourceDir.getChild(Package.mainFileName) + dataPath, + pkg.root.getChild("data").getChild(file) ) + } } + } /** Copy the resource to provided resource. * diff --git a/lib/scala/pkg/src/main/scala/org/enso/pkg/Template.scala b/lib/scala/pkg/src/main/scala/org/enso/pkg/Template.scala index e063b093c243..87514323d767 100644 --- a/lib/scala/pkg/src/main/scala/org/enso/pkg/Template.scala +++ b/lib/scala/pkg/src/main/scala/org/enso/pkg/Template.scala @@ -45,6 +45,30 @@ object Template { override val name = "stargazers" } + case object MonthlySales extends Template { + override val name = "monthly_sales" + } + + case object BankHolidayRain extends Template { + override val name = "bank_holiday_rain" + } + + case object GettingStartedReading extends Template { + override val name = "getting_started_reading" + } + + case object GettingStartedAggregating extends Template { + override val name = "getting_started_aggregating" + } + + case object GettingStartedCleansing extends Template { + override val name = "getting_started_cleansing" + } + + case object GettingStartedSelecting extends Template { + override val name = "getting_started_selecting" + } + val allTemplates = Seq( Default, Orders, @@ -52,6 +76,12 @@ object Template { Stargazers, ColoradoCovid, Kmeans, - NasdaqReturns + NasdaqReturns, + MonthlySales, + BankHolidayRain, + GettingStartedReading, + GettingStartedAggregating, + GettingStartedCleansing, + GettingStartedSelecting ) }