Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: select project type #653

Draft
wants to merge 24 commits into
base: dev
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
6978dc1
wip
solvedDev Oct 15, 2022
9061a0f
Merge branch 'dev' into feat/select-project-type
solvedDev Oct 22, 2022
762af5a
feat(CreateProject): switch to tabbed window
solvedDev Oct 22, 2022
9dc6eeb
upd: add button to select next tab
solvedDev Oct 22, 2022
2ef869a
upd: progress indicator
solvedDev Oct 27, 2022
d4ac268
fix: error
solvedDev Oct 31, 2022
0df5957
upd: start setting up StepperWindow
solvedDev Oct 31, 2022
2220956
Merge branch 'dev' into feat/select-project-type
solvedDev Nov 5, 2022
cfbca68
Merge branch 'dev' into feat/select-project-type
solvedDev Nov 5, 2022
1700485
upd: progress on StepperWindow
solvedDev Nov 5, 2022
95e77c0
Merge branch 'dev' into feat/select-project-type
solvedDev Dec 3, 2022
a75cb0e
upd: minor changes
solvedDev Dec 3, 2022
02fa898
Merge branch 'dev' into feat/select-project-type
Joelant05 Dec 21, 2022
238f3df
upd: move pack type selection to seperate tab
Joelant05 Dec 21, 2022
bf9680c
upd: translate tab titles
Joelant05 Dec 21, 2022
fd951df
upd: move create project window to use stepper window API
Joelant05 Dec 26, 2022
be71239
upd(StepperWindow): API for confirm button
Joelant05 Dec 26, 2022
279a684
upd: loading icon when creating project
Joelant05 Dec 26, 2022
958285a
feat(SidebarWindow): status indicator API
Joelant05 Dec 27, 2022
d937536
fix: give tabs access to their own state
Joelant05 Dec 28, 2022
243ee35
upd: implement status indicator API into stepper window
Joelant05 Jan 21, 2023
56c1c1f
upd: remove console.log
Joelant05 Jan 22, 2023
02acd5d
fix: maintain reactivity of confirm button state
Joelant05 Jan 22, 2023
90c7bf6
upd: remove unnecessary early return
Joelant05 Feb 4, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions src/components/PackExplorer/HomeView/CreateProjectBtn.vue
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@
>
<v-icon class="mr-1">mdi-plus</v-icon>
<span v-if="availableWidth > 220">
{{ t('packExplorer.noProjectView.createLocalProject') }}
{{ t('windows.createProject.title') }}
</span>
</v-btn>
</template>

<span>
{{ t('packExplorer.noProjectView.createLocalProject') }}
{{ t('windows.createProject.title') }}
</span>
</v-tooltip>
</template>
Expand Down Expand Up @@ -71,7 +71,8 @@ export default {
},
calculateAvailableWidth() {
if (this.$refs.button)
this.availableWidth = this.$refs.button.$el.getBoundingClientRect().width
this.availableWidth =
this.$refs.button.$el.getBoundingClientRect().width
},
},
}
Expand Down
39 changes: 39 additions & 0 deletions src/components/Projects/CreateProject/CreateCategories.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import GeneralTab from './Tabs/GeneralTab.vue'
import FilesTab from './Tabs/CreateFile/Tab.vue'
import ExperimentalGameplayTab from './Tabs/ExperimentalGameplay/Tab.vue'
import ProjectTypeTab from './Tabs/ProjectType/Tab.vue'
import PackTypeTab from './Tabs/PackTypeTab.vue'

interface ICreateCategory {
icon: string
id: string
component: any
}

export const createCategories: ICreateCategory[] = [
{
icon: 'mdi-circle-outline',
id: 'general',
component: GeneralTab,
},
{
icon: 'mdi-package-variant-closed',
id: 'projectType',
component: ProjectTypeTab,
},
{
icon: 'mdi-wrench',
id: 'packType',
component: PackTypeTab,
},
{
icon: 'mdi-test-tube',
id: 'experimentalGameplay',
component: ExperimentalGameplayTab,
},
{
icon: 'mdi-file-outline',
id: 'files',
component: FilesTab,
},
]
111 changes: 83 additions & 28 deletions src/components/Projects/CreateProject/CreateProject.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { App } from '/@/App'
import { FileSystem } from '/@/components/FileSystem/FileSystem'
import CreateProjectComponent from './CreateProject.vue'
import { CreatePack } from './Packs/Pack'
import { CreateBP } from './Packs/BP'
import { CreateRP } from './Packs/RP'
Expand All @@ -19,12 +18,17 @@ import {
getFormatVersions,
getStableFormatVersion,
} from '/@/components/Data/FormatVersions'
import { Project } from '../Project/Project'
import { CreateDenoConfig } from './Files/DenoConfig'
import { IWindowState, NewBaseWindow } from '../../Windows/NewBaseWindow'
import { reactive } from 'vue'
import { reactive, watch } from 'vue'
import { translate } from '../../Locales/Manager'
import { createCategories } from './CreateCategories'
import {
IStepperWindowState,
StepperWindow,
} from '../../Windows/StepperWindow/StepperWindow'

export interface ICreateProjectOptions {
projectType: 'bridgeFolder' | 'local' | 'comMojang'
author: string | string[]
description: string
icon: File | null
Expand All @@ -50,13 +54,12 @@ export interface IExperimentalToggle {
description: string
}

export interface ICreateProjectState extends IWindowState {
isCreatingProject: boolean
export interface ICreateProjectState extends IStepperWindowState {
createOptions: ICreateProjectOptions
availableTargetVersionsLoading: boolean
}
export class CreateProjectWindow extends NewBaseWindow {
protected isFirstProject = false

export class CreateProjectWindow extends StepperWindow {
protected availableTargetVersions: string[] = []
protected stableVersion: string = ''
protected packs: Record<TPackTypeId | '.bridge' | 'worlds', CreatePack> = <
Expand Down Expand Up @@ -90,9 +93,9 @@ export class CreateProjectWindow extends NewBaseWindow {

protected state: ICreateProjectState = reactive<any>({
...super.getState(),
isCreatingProject: false,
createOptions: this.getDefaultOptions(),
availableTargetVersionsLoading: true,
windowTitle: 'windows.createProject.title',
})

get createOptions() {
Expand All @@ -117,7 +120,7 @@ export class CreateProjectWindow extends NewBaseWindow {
}

constructor() {
super(CreateProjectComponent, false)
super({ keepAlive: true })
this.defineWindow()

App.ready.once(async (app) => {
Expand All @@ -139,24 +142,78 @@ export class CreateProjectWindow extends NewBaseWindow {
App.packType.ready.once(() => {
this.availablePackTypes = App.packType.all
})

this.setupWindow()
}

get hasRequiredData() {
return (
this.createOptions.packs.length > 1 &&
this.projectNameRules.every(
(rule) => rule(this.createOptions.name) === true
) &&
this.createOptions.namespace.length > 0 &&
this.createOptions.author.length > 0 &&
this.createOptions.targetVersion.length > 0
return createCategories.every(({ id }) => this.tabHasRequiredData(id))
}

tabHasRequiredData(tabId: string) {
switch (tabId) {
case 'general':
return (
this.projectNameRules.every(
(rule) => rule(this.createOptions.name) === true
) &&
this.createOptions.namespace.length > 0 &&
this.createOptions.author.length > 0 &&
this.createOptions.targetVersion.length > 0
)
case 'packType':
return this.createOptions.packs.length > 1

default:
return true
}
}

/**
* Sets up the steps for the stepper window and the confirm button
*/
setupWindow() {
createCategories.forEach((category) => {
this.addStep({
icon: category.icon,
id: category.id,
color: 'accent',
name: translate(
'windows.createProject.categories.' + category.id
),
component: category.component,
})
})

this.updateConfirmState({
name: translate('windows.createProject.create'),
color: 'primary',
icon: 'mdi-plus',
isDisabled: true,
isLoading: false,
onConfirm: async () => {
this.state.confirm.isLoading = true
// TODO remove test code
// await this.createProject()
await new Promise<void>((resolve) => {
setTimeout(() => resolve(), 1000)
})
this.state.confirm.isLoading = false

this.close()
},
})

watch(
() => this.hasRequiredData,
() => (this.state.confirm.isDisabled = !this.hasRequiredData)
)
}

open(isFirstProject = false) {
open() {
this.state.createOptions = this.getDefaultOptions()
this.sidebar.setDefaultSelected()

this.isFirstProject = isFirstProject
this.packCreateFiles.forEach(
(createFile) => (createFile.isActive = true)
)
Expand All @@ -168,16 +225,12 @@ export class CreateProjectWindow extends NewBaseWindow {
const app = await App.getApp()

const removeOldProject =
isUsingFileSystemPolyfill.value &&
!app.hasNoProjects &&
!this.isFirstProject
isUsingFileSystemPolyfill.value && !app.hasNoProjects

// Save previous project name to delete it later
let previousProject: Project | undefined
if (!this.isFirstProject)
previousProject = app.isNoProjectSelected
? app.projects[0]
: app.project
let previousProject = app.isNoProjectSelected
? app.projects[0]
: app.project

// Ask user whether we should save the current project
if (removeOldProject) {
Expand Down Expand Up @@ -229,6 +282,7 @@ export class CreateProjectWindow extends NewBaseWindow {

static getDefaultOptions(): ICreateProjectOptions {
return {
projectType: 'local',
author:
<string | undefined>settingsState?.projects?.defaultAuthor ??
'',
Expand Down Expand Up @@ -271,6 +325,7 @@ export class CreateProjectWindow extends NewBaseWindow {
config = await app.project.fileSystem.readJSON('config.json')

return {
projectType: 'local',
author: config.author ?? '',
description: config.description ?? '',
icon: null,
Expand Down
Loading