diff --git a/angular.json b/angular.json
index 0fcc3b76..9b71a64a 100644
--- a/angular.json
+++ b/angular.json
@@ -63,23 +63,23 @@
}
]
},
- "web": {
- "optimization": false,
- "outputHashing": "none",
- "sourceMap": true,
+ "capacitor": {
+ "optimization": true,
+ "outputHashing": "all",
+ "sourceMap": false,
"namedChunks": false,
- "aot": false,
+ "aot": true,
"extractLicenses": true,
"vendorChunk": false,
- "buildOptimizer": false,
+ "buildOptimizer": true,
"fileReplacements": [
{
"replace": "apps/web/environments/environment.ts",
- "with": "apps/web/environments/environment.web.ts"
+ "with": "apps/web/environments/environment.capacitor.ts"
}
]
},
- "production": {
+ "electron": {
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
@@ -91,7 +91,7 @@
"fileReplacements": [
{
"replace": "apps/web/environments/environment.ts",
- "with": "apps/web/environments/environment.prod.ts"
+ "with": "apps/web/environments/environment.electron.ts"
}
]
}
diff --git a/angular.webpack.js b/angular.webpack.js
index 5aeff7ac..3bccf4c1 100644
--- a/angular.webpack.js
+++ b/angular.webpack.js
@@ -7,17 +7,11 @@ const env = require('./env')
* Custom angular webpack configuration
*/
module.exports = (config, options) => {
- config.target = 'electron-renderer'
-
if (options.fileReplacements) {
- for (let fileReplacement of options.fileReplacements) {
- if (fileReplacement.replace !== 'apps/web/environments/environment.ts') {
- continue
- }
-
- let fileReplacementParts = fileReplacement['with'].split('.')
- if (fileReplacementParts.length > 1 && ['web'].indexOf(fileReplacementParts[1]) >= 0) {
- config.target = 'web'
+ for (let replacement of options.fileReplacements) {
+ let parts = replacement.with.split('.')
+ if (parts.includes('electron')) {
+ config.target = 'electron-renderer'
}
break
}
@@ -34,5 +28,6 @@ module.exports = (config, options) => {
})
]
+ console.log('[WEBPACK] using target', config.target)
return config
}
diff --git a/apps/.gitignore b/apps/.gitignore
new file mode 100644
index 00000000..9cd1f97b
--- /dev/null
+++ b/apps/.gitignore
@@ -0,0 +1,2 @@
+android
+ios
diff --git a/apps/web/app/app-routing.module.ts b/apps/web/app/app-routing.module.ts
deleted file mode 100644
index 1ccbfd65..00000000
--- a/apps/web/app/app-routing.module.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { NgModule } from '@angular/core'
-import { Routes, RouterModule } from '@angular/router'
-
-const routes: Routes = [
- {
- path: '',
- pathMatch: 'full',
- redirectTo: 'items'
- },
- { path: 'items', loadChildren: () => import('./pages/items').then(m => m.ItemsModule) },
- { path: 'perks', loadChildren: () => import('./pages/perks').then(m => m.PerksModule) },
- { path: 'armorsets', loadChildren: () => import('./pages/armorsets').then(m => m.ArmorsetsModule) },
- { path: 'status-effects', loadChildren: () => import('./pages/status-effects').then(m => m.StatusEffectsModule) },
- { path: 'abilities', loadChildren: () => import('./pages/abilities').then(m => m.AbilitiesModule) },
- { path: 'housing', loadChildren: () => import('./pages/housing').then(m => m.HousingModule) },
- { path: 'crafting', loadChildren: () => import('./pages/crafting').then(m => m.CraftingModule) },
- { path: 'preferences', loadChildren: () => import('./pages/preferences').then(m => m.PreferencesModule) },
- { path: 'dungeons', loadChildren: () => import('./pages/dungeons').then(m => m.DungeonsModule) },
- { path: 'territories', loadChildren: () => import('./pages/territories').then(m => m.TerritoriesModule) },
- { path: 'progression', loadChildren: () => import('./pages/progression').then(m => m.ProgressionModule) },
- { path: 'vitals', loadChildren: () => import('./pages/vitals/vitals.module').then(m => m.VitalsModule) },
- { path: 'about', loadChildren: () => import('./pages/about/about.module').then(m => m.AboutModule) },
- { path: 'dev', loadChildren: () => import('./pages/dev/dev.module').then(m => m.DevModule) },
- { path: '**', loadChildren: () => import('./pages/not-found').then((m) => m.NotFoundModule) },
-]
-
-@NgModule({
- imports: [RouterModule.forRoot(routes, {
-
- })],
- exports: [RouterModule],
-})
-export class AppRoutingModule {}
diff --git a/apps/web/app/app.component.html b/apps/web/app/app.component.html
index 46a17889..d7cae69b 100644
--- a/apps/web/app/app.component.html
+++ b/apps/web/app/app.component.html
@@ -1,75 +1,50 @@
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
-
-
+
+
-
-
-
-
+
+
+
+
+
diff --git a/apps/web/app/app.component.scss b/apps/web/app/app.component.scss
index 86d1b45e..fb417be7 100644
--- a/apps/web/app/app.component.scss
+++ b/apps/web/app/app.component.scss
@@ -1,6 +1,4 @@
:host {
- gap: 1rem;
- padding: 1rem;
.navbar {
-webkit-app-region: drag;
diff --git a/apps/web/app/app.component.ts b/apps/web/app/app.component.ts
index 0706c492..68f99439 100644
--- a/apps/web/app/app.component.ts
+++ b/apps/web/app/app.component.ts
@@ -1,25 +1,32 @@
-import { Component, ElementRef, QueryList, ViewChildren } from '@angular/core'
+import { Component, HostBinding } from '@angular/core'
import { sortBy } from 'lodash'
+import { APP_CONFIG } from '../environments/environment'
import { ElectronService } from './electron'
import { TranslateService } from './i18n'
+import { LANG_OPTIONS, MAIN_MENU } from './menu'
import { AppPreferencesService } from './preferences'
-import { Hotkeys } from './utils'
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
host: {
- class: 'layout-frame layout-column',
+ class: 'layout-frame layout-col layout-gap',
},
})
export class AppComponent {
+ @HostBinding('class.is-electron')
public get isElectron() {
return this.electron.isElectron
}
+ @HostBinding('class.is-web')
+ public get isWeb() {
+ return APP_CONFIG.environment === 'WEB' || APP_CONFIG.environment === 'DEV'
+ }
+
public get language() {
return this.preferences.language.get()
}
@@ -27,67 +34,14 @@ export class AppComponent {
this.preferences.language.set(value)
}
- protected links = sortBy(
- [
- {
- url: 'https://nwdb.info/',
- label: 'nwdb.info',
- },
- {
- url: 'https://www.nw-tools.info/',
- label: 'www.nw-tools.info',
- },
- {
- url: 'https://gaming.tools/newworld/',
- label: 'gaming.tools',
- },
- {
- url: 'https://new-world.exchange/',
- label: 'new-world.exchange',
- },
- {
- url: 'https://nwmarketprices.com/',
- label: 'nwmarketprices.com',
- },
- {
- url: 'https://newworldfans.com/',
- label: 'newworldfans.com',
- },
- {
- url: 'https://www.newworld-map.com/',
- label: 'newworld-map.com',
- },
- {
- url: 'https://mapgenie.io/new-world',
- label: 'mapgenie.io',
- },
- {
- url: 'https://raidplan.io/newworld',
- label: 'raidplan.io'
- }
- ],
- (it) => it.label
- )
-
- @ViewChildren('link')
- public tabs: QueryList
>
+ protected mainMenu = MAIN_MENU
+ protected langOptions = LANG_OPTIONS
constructor(
private preferences: AppPreferencesService,
private electron: ElectronService,
- private hotkeys: Hotkeys,
translate: TranslateService
) {
preferences.language.observe().subscribe((locale) => translate.use(locale))
-
- ;[1, 2, 3, 4, 5, 6, 7, 8, 9, 0].forEach((i) => {
- this.hotkeys
- .addShortcut({
- keys: `control.${i}`,
- })
- .subscribe(() => {
- this.tabs.get((i || 10) - 1)?.nativeElement?.click()
- })
- })
}
}
diff --git a/apps/web/app/app.module.ts b/apps/web/app/app.module.ts
index 559db112..57b81e33 100644
--- a/apps/web/app/app.module.ts
+++ b/apps/web/app/app.module.ts
@@ -2,21 +2,24 @@ import { HttpClientModule } from '@angular/common/http'
import { NgModule } from '@angular/core'
import { FormsModule } from '@angular/forms'
import { BrowserModule } from '@angular/platform-browser'
+import { RouterModule } from '@angular/router'
-import { AppRoutingModule } from './app-routing.module'
+import { ROUTES } from './app.routes'
import { AppComponent } from './app.component'
import { TranslateModule } from './i18n'
import { NwDataService } from './nw'
import { TitleBarComponent } from './title-bar.component'
+import { ScreenModule } from './ui/screen'
@NgModule({
declarations: [AppComponent, TitleBarComponent],
imports: [
+ RouterModule.forRoot(ROUTES),
BrowserModule,
FormsModule,
HttpClientModule,
- AppRoutingModule,
+ ScreenModule,
TranslateModule.forRoot({
loader: NwDataService,
}),
diff --git a/apps/web/app/app.routes.ts b/apps/web/app/app.routes.ts
new file mode 100644
index 00000000..dceea42b
--- /dev/null
+++ b/apps/web/app/app.routes.ts
@@ -0,0 +1,37 @@
+import { NgModule } from '@angular/core'
+import { Routes, RouterModule } from '@angular/router'
+
+export const ROUTES: Routes = [
+ {
+ path: '',
+ pathMatch: 'full',
+ redirectTo: 'items',
+ },
+ { path: 'abilities', loadChildren: () => import('./pages/database/abilities').then((m) => m.AbilitiesModule) },
+ { path: 'crafting', loadChildren: () => import('./pages/database/crafting').then((m) => m.CraftingModule) },
+ { path: 'housing', loadChildren: () => import('./pages/database/housing').then((m) => m.HousingModule) },
+ { path: 'items', loadChildren: () => import('./pages/database/items').then((m) => m.ItemsModule) },
+ { path: 'perks', loadChildren: () => import('./pages/database/perks').then((m) => m.PerksModule) },
+ { path: 'poi', loadChildren: () => import('./pages/database/poi').then((m) => m.PoiModule) },
+ {
+ path: 'status-effects',
+ loadChildren: () => import('./pages/database/status-effects').then((m) => m.StatusEffectsModule),
+ },
+ { path: 'vitals', loadChildren: () => import('./pages/database/vitals').then((m) => m.VitalsModule) },
+
+ { path: 'armorsets', loadChildren: () => import('./pages/tools/armorsets').then((m) => m.ArmorsetsModule) },
+ { path: 'dungeons', loadChildren: () => import('./pages/tools/dungeons').then((m) => m.DungeonsModule) },
+ { path: 'gearbuilder', loadChildren: () => import('./pages/tools/gearbuilder').then((m) => m.GearbuilderModule) },
+ { path: 'info-cards', loadChildren: () => import('./pages/tools/info-cards').then((m) => m.InfoCardsModule) },
+ { path: 'level-xp', loadChildren: () => import('./pages/tools/level-xp').then((m) => m.LevelXpModule) },
+ { path: 'territories', loadChildren: () => import('./pages/tools/territories').then((m) => m.TerritoriesModule) },
+ { path: 'leveling', loadChildren: () => import('./pages/tools/leveling').then((m) => m.LevelingModule) },
+ { path: 'umbral-shards', loadChildren: () => import('./pages/tools/umbral-shards').then((m) => m.UmbralShardsModule) },
+
+ { path: 'dev', loadChildren: () => import('./pages/dev/dev.module').then((m) => m.DevModule) },
+ { path: 'links', loadChildren: () => import('./pages/misc/links').then((m) => m.LinksModule) },
+ { path: 'about', loadChildren: () => import('./pages/misc/about').then((m) => m.AboutModule) },
+ { path: 'preferences', loadChildren: () => import('./pages/misc/preferences').then((m) => m.PreferencesModule) },
+
+ { path: '**', loadChildren: () => import('./pages/misc/not-found').then((m) => m.NotFoundModule) },
+]
diff --git a/apps/web/app/i18n/translate.module.ts b/apps/web/app/i18n/translate.module.ts
index 8aba94c5..545168c5 100644
--- a/apps/web/app/i18n/translate.module.ts
+++ b/apps/web/app/i18n/translate.module.ts
@@ -1,4 +1,4 @@
-import { NgModule, ModuleWithProviders, Type } from '@angular/core'
+import { NgModule, ModuleWithProviders, Type, LOCALE_ID } from '@angular/core'
import { TranslateLoader } from './translate-loader'
@NgModule({})
@@ -6,12 +6,14 @@ export class TranslateModule {
public static forRoot(options?: {
loader?: Type
+ locale?: string
}): ModuleWithProviders {
return {
ngModule: TranslateModule,
providers: [
+ options?.locale ? { provide: LOCALE_ID, useValue: options.locale } : null,
options?.loader ? TranslateLoader.provideClass(options.loader) : TranslateLoader,
- ]
+ ].filter((it) => !!it)
}
}
}
diff --git a/apps/web/app/i18n/translate.service.ts b/apps/web/app/i18n/translate.service.ts
index 7e1318b1..b9ae8cb1 100644
--- a/apps/web/app/i18n/translate.service.ts
+++ b/apps/web/app/i18n/translate.service.ts
@@ -25,7 +25,7 @@ export class TranslateService implements OnDestroy {
//
}
- public observe(key: string | Observable, locale?: string | Observable) {
+ public observe(key: string | string[] | Observable, locale?: string | Observable) {
if (!locale) {
locale = this.locale.value$
}
@@ -38,7 +38,14 @@ export class TranslateService implements OnDestroy {
.pipe(distinctUntilChanged())
}
- public get(key: string, locale: string = this.locale.value) {
+ public get(key: string | string[], locale: string = this.locale.value) {
+ if (Array.isArray(key)) {
+ return key.map((it) => this.lookup(it)).join(' ')
+ }
+ return this.lookup(key)
+ }
+
+ public lookup(key: string, locale: string = this.locale.value) {
if (!key) {
return ''
}
diff --git a/apps/web/app/menu.ts b/apps/web/app/menu.ts
new file mode 100644
index 00000000..43b94c59
--- /dev/null
+++ b/apps/web/app/menu.ts
@@ -0,0 +1,52 @@
+export const MAIN_MENU = [
+ {
+ category: 'Database',
+ items: [
+ { label: 'Items', path: '/items' },
+ { label: 'Housing', path: '/housing' },
+ { label: 'Crafting', path: '/crafting' },
+
+ { label: 'Perks', path: '/perks', divider: true },
+ { label: 'Abilities', path: '/abilities' },
+ { label: 'Statuseffects', path: '/status-effects' },
+
+ { label: 'Points Of Interest', path: '/poi', divider: true },
+ { label: 'Vitals', path: '/vitals' },
+ ]
+ },
+ {
+ category: 'Tools & Infos',
+ items: [
+ { label: 'Territories', path: '/territories' },
+ { label: 'Expeditions', path: '/dungeons' },
+ { label: 'Armorsets', path: '/armorsets' },
+ { label: 'Gear builder', path: '/gearbuilder' },
+ { label: 'Umbral Shards', path: '/umbral-shards' },
+
+ { label: 'Leveling and Skills', path: '/leveling' },
+
+ { label: 'Trophies', path: '/info-cards/trophies', divider: true },
+ { label: 'Runes', path: '/info-cards/runes' },
+ { label: 'Vitals', path: '/info-cards/vitals' },
+ { label: 'Gems', path: '/info-cards/gems' },
+ ]
+ },
+ {
+ category: null,
+ items: [
+ { label: 'Links', path: '/links' },
+ { label: 'Preferences', path: '/preferences' },
+ { label: 'About', path: '/about' },
+ ]
+ }
+]
+
+export const LANG_OPTIONS = [
+ { value: 'de-de', label: 'DE' },
+ { value: 'en-us', label: 'EN' },
+ { value: 'es-es', label: 'ES' },
+ { value: 'fr-fr', label: 'FR' },
+ { value: 'it-it', label: 'IT' },
+ { value: 'pl-pl', label: 'PL' },
+ { value: 'pt-br', label: 'BR' },
+]
diff --git a/apps/web/app/nw/nw-db.service.ts b/apps/web/app/nw/nw-db.service.ts
index a076b6cc..df5cd427 100644
--- a/apps/web/app/nw/nw-db.service.ts
+++ b/apps/web/app/nw/nw-db.service.ts
@@ -92,6 +92,10 @@ export class NwDbService {
public damageTableMap = index(() => this.damageTables, 'DamageID')
public damageTable = lookup(() => this.damageTableMap)
+ public armors = list(() => [this.data.itemdefinitionsArmor()])
+ public armorsMap = index(() => this.armors, 'WeaponID')
+ public armor = lookup(() => this.armorsMap)
+
public weapons = list(() => [this.data.itemdefinitionsWeapons()])
public weaponsMap = index(() => this.weapons, 'WeaponID')
public weapon = lookup(() => this.weaponsMap)
@@ -229,6 +233,8 @@ export class NwDbService {
public lootLimits = list(() => [this.data.lootlimits()])
public lootLimitsMap = index(() => this.lootLimits, 'LootLimitID')
+ public xpAmounts = this.data.xpamountsbylevel().pipe(shareReplay(1))
+
public constructor(public readonly data: NwDataService) {
//
}
diff --git a/apps/web/app/nw/nw-expression.service.ts b/apps/web/app/nw/nw-expression.service.ts
index 68f86b8a..2cad754e 100644
--- a/apps/web/app/nw/nw-expression.service.ts
+++ b/apps/web/app/nw/nw-expression.service.ts
@@ -1,11 +1,11 @@
import { Injectable } from '@angular/core'
-import { catchError, combineLatest, map, Observable, of, startWith, throwError } from 'rxjs'
+import { catchError, combineLatest, map, Observable, of, startWith, tap, throwError } from 'rxjs'
import { NwDbService } from './nw-db.service'
-import { parseNwExpression } from './utils'
+import { getPerkMultiplier, parseNwExpression } from './utils'
export interface NwExpressionContext {
text: string
- itemId: string
+ itemId?: string
charLevel: number
gearScore: number
ConsumablePotency?: number
@@ -139,7 +139,7 @@ export class NwExpressionService {
return this.db.perksMap.pipe(
map((it) => {
if (it.has(context.itemId)) {
- return it.get(context.itemId).ScalingPerGearScore * Math.max(0, context.gearScore - 100) + 1
+ return getPerkMultiplier(it.get(context.itemId), context.gearScore)
}
throw new Error(`perkMultiplier not resolved (for token "${token}" and id "${context.itemId}" in text "${context.text}")`)
})
diff --git a/apps/web/app/nw/nw-icon.component.ts b/apps/web/app/nw/nw-icon.component.ts
index 8dc538de..b062ec26 100644
--- a/apps/web/app/nw/nw-icon.component.ts
+++ b/apps/web/app/nw/nw-icon.component.ts
@@ -32,13 +32,20 @@ export class NwIconComponent {
this.cdRef.markForCheck()
}
+ @Input()
+ public set nwRarity(value: number) {
+ this.rarityOverride = value
+ }
+
protected src: string
protected isLoaded = false
private rarity: number
+ private rarityOverride: number
@HostBinding('class')
protected get bgRarity() {
- return this.rarity ? `bg-rarity-${this.rarity}` : null
+ const rarity = this.rarityOverride || this.rarity
+ return rarity ? `bg-rarity-${rarity}` : null
}
public constructor(private cdRef: ChangeDetectorRef, private elRef: ElementRef) {
diff --git a/apps/web/app/nw/nw-text.pipe.ts b/apps/web/app/nw/nw-text.pipe.ts
new file mode 100644
index 00000000..d503b3c4
--- /dev/null
+++ b/apps/web/app/nw/nw-text.pipe.ts
@@ -0,0 +1,55 @@
+import { ChangeDetectorRef, OnDestroy, Pipe, PipeTransform } from '@angular/core'
+import { isEqual } from 'lodash'
+import { Subject, switchMap, takeUntil } from 'rxjs'
+import { TranslateService } from '~/i18n'
+import { NwExpressionContext, NwExpressionService } from './nw-expression.service'
+
+export type NwTextPipeOptions = Partial
+
+@Pipe({
+ name: 'nwText',
+ pure: false,
+})
+export class NwTextPipe implements PipeTransform, OnDestroy {
+ private dispose$ = new Subject()
+ private key: string | string[]
+ private options: NwTextPipeOptions = null
+ private value: string
+
+ public constructor(
+ private i18n: TranslateService,
+ private expr: NwExpressionService,
+ private cdRef: ChangeDetectorRef
+ ) {}
+
+ public transform(key: string | string[], options: NwTextPipeOptions = null) {
+ if (isEqual(this.key, key) && isEqual(this.options, options)) {
+ return this.value
+ }
+ this.dispose$.next()
+ this.key = key
+ this.options = options
+ this.i18n
+ .observe(key)
+ .pipe(
+ switchMap((value) =>
+ this.expr.solve({
+ charLevel: 60,
+ gearScore: 600,
+ ...(options || {}),
+ text: value,
+ })
+ )
+ )
+ .pipe(takeUntil(this.dispose$))
+ .subscribe((value) => {
+ this.value = value
+ this.cdRef.markForCheck()
+ })
+ return this.value
+ }
+
+ public ngOnDestroy(): void {
+ this.dispose$.next()
+ }
+}
diff --git a/apps/web/app/nw/nw.module.ts b/apps/web/app/nw/nw.module.ts
index 26a1d1db..ae63f6e7 100644
--- a/apps/web/app/nw/nw.module.ts
+++ b/apps/web/app/nw/nw.module.ts
@@ -4,6 +4,7 @@ import { FormsModule } from '@angular/forms'
import { NwIconComponent, NwImageComponent } from './nw-icon.component'
import { NwInfoLinkDirective } from './nw-info-link.directive'
import { NwTextDirective } from './nw-text.directive'
+import { NwTextPipe } from './nw-text.pipe'
@NgModule({
imports: [
@@ -15,12 +16,14 @@ import { NwTextDirective } from './nw-text.directive'
NwIconComponent,
NwImageComponent,
NwInfoLinkDirective,
+ NwTextPipe
],
exports: [
NwTextDirective,
NwIconComponent,
NwImageComponent,
NwInfoLinkDirective,
+ NwTextPipe,
],
})
export class NwModule {
diff --git a/apps/web/app/nw/utils/constants.ts b/apps/web/app/nw/utils/constants.ts
new file mode 100644
index 00000000..344625c0
--- /dev/null
+++ b/apps/web/app/nw/utils/constants.ts
@@ -0,0 +1,6 @@
+export const NW_MIN_GEAR_SCORE = 100
+export const NW_MAX_GEAR_SCORE = 625
+export const NW_MAX_CHARACTER_LEVEL = 60
+export const NW_MAX_TRADESKILL_LEVEL = 200
+export const NW_MAX_WEAPON_LEVEL = 20
+export const NW_MIN_ATTRIBUTES = 5
diff --git a/apps/web/app/nw/utils/crafting.ts b/apps/web/app/nw/utils/crafting.ts
index 5eed4c7d..969144e2 100644
--- a/apps/web/app/nw/utils/crafting.ts
+++ b/apps/web/app/nw/utils/crafting.ts
@@ -1,4 +1,5 @@
import { Crafting, GameEvent, Housingitems, ItemDefinitionMaster } from '@nw-data/types'
+import { NW_MAX_TRADESKILL_LEVEL } from './constants'
export type CraftingIngredients = Pick<
Crafting,
@@ -107,7 +108,7 @@ export function calculateBonusItemChance({
return (diff < 0 ? decrements : increments)[Math.abs(diff) - 1] ?? 0
})
const baseChance = recipe.BonusItemChance
- const skillChance = (skill ?? 200) / 1000
+ const skillChance = (skill ?? NW_MAX_TRADESKILL_LEVEL) / 1000
const ingrChance = ingrChances.reduce((a, b) => a + b, 0)
let result = baseChance + skillChance + ingrChance
diff --git a/apps/web/app/nw/utils/equip-slot.ts b/apps/web/app/nw/utils/equip-slot.ts
new file mode 100644
index 00000000..2ec8d8ad
--- /dev/null
+++ b/apps/web/app/nw/utils/equip-slot.ts
@@ -0,0 +1,99 @@
+export type EquipSlotId = 'head' | 'chest' | 'hands' | 'legs' | 'feet' | 'weapon1' | 'weapon2' | 'weapon3' | 'amulet' | 'ring' | 'earring'
+export interface EquipSlot {
+ id: EquipSlotId
+ icon: string
+ name: string
+ itemType: string
+}
+
+export const EQUIP_SLOTS: Array = [
+ {
+ id: 'head',
+ icon: 'assets/icons/slots/lightheada.png',
+ name: 'ui_itemtypedescription_head_slot',
+ itemType: 'EquippableHead',
+ },
+ {
+ id: 'chest',
+ icon: 'assets/icons/slots/lightchesta.png',
+ name: 'ui_itemtypedescription_chest_slot',
+ itemType: 'EquippableChest',
+ },
+ {
+ id: 'hands',
+ icon: 'assets/icons/slots/lighthandsa.png',
+ name: 'ui_itemtypedescription_hands_slot',
+ itemType: 'EquippableHands',
+ },
+ {
+ id: 'legs',
+ icon: 'assets/icons/slots/lightlegsa.png',
+ name: 'ui_itemtypedescription_legs_slot',
+ itemType: 'EquippableLegs',
+ },
+ {
+ id: 'feet',
+ icon: 'assets/icons/slots/lightfeeta.png',
+ name: 'ui_itemtypedescription_feet_slot',
+ itemType: 'EquippableFeet',
+ },
+ {
+ id: 'weapon1',
+ icon: 'assets/icons/slots/weapon.png',
+ name: 'ui_weapon1',
+ itemType: 'Weapon',
+ },
+ {
+ id: 'weapon2',
+ icon: 'assets/icons/slots/weapon.png',
+ name: 'ui_weapon2',
+ itemType: 'Weapon',
+ },
+ {
+ id: 'weapon3',
+ icon: 'assets/icons/slots/weapon.png',
+ name: 'ui_weapon3',
+ itemType: 'Shield',
+ },
+ {
+ id: 'amulet',
+ icon: 'assets/icons/slots/trinketp.png',
+ name: 'ui_amulet_slot_tooltip',
+ itemType: 'EquippableAmulet',
+ },
+ {
+ id: 'ring',
+ icon: 'assets/icons/slots/trinketa.png',
+ name: 'ui_ring_slot_tooltip',
+ itemType: 'EquippableRing',
+ },
+ {
+ id: 'earring',
+ icon: 'assets/icons/slots/trinkete.png',
+ name: 'ui_unlock_token_slot',
+ itemType: 'EquippableToken',
+ },
+]
+
+const GS_WEIGHTS: Record = {
+ head: 42,
+ chest: 73,
+ hands: 31,
+ legs: 42,
+ feet: 21,
+ weapon1: 135,
+ weapon2: 135,
+ weapon3: 0,
+ amulet: 40,
+ ring: 40,
+ earring: 40,
+}
+
+export function totalGearScore(equip: Array<{ id: EquipSlotId, gearScore: number }>) {
+ const total = Object.values(GS_WEIGHTS).reduce((a, b) => a + b, 0)
+ let result = 0
+ for (const slot of equip) {
+ result += slot.gearScore * (GS_WEIGHTS[slot.id] || 0) / total
+ }
+ return result
+}
diff --git a/apps/web/app/nw/utils/index.ts b/apps/web/app/nw/utils/index.ts
index 2c6f04ac..dafe490d 100644
--- a/apps/web/app/nw/utils/index.ts
+++ b/apps/web/app/nw/utils/index.ts
@@ -9,3 +9,4 @@ export * from './loottables'
export * from './expressions'
export * from './lootgraph'
export * from './territories'
+export * from './equip-slot'
diff --git a/apps/web/app/nw/utils/item.ts b/apps/web/app/nw/utils/item.ts
index 3a2145b4..e374a02f 100644
--- a/apps/web/app/nw/utils/item.ts
+++ b/apps/web/app/nw/utils/item.ts
@@ -1,4 +1,5 @@
-import { Crafting, Housingitems, ItemDefinitionMaster, Perkbuckets, Perks } from '@nw-data/types'
+import { Crafting, Housingitems, ItemDefinitionMaster, ItemdefinitionsArmor, ItemdefinitionsWeapons, Perkbuckets, Perks } from '@nw-data/types'
+import { NW_MAX_GEAR_SCORE, NW_MIN_GEAR_SCORE } from './constants'
export function isMasterItem(item: ItemDefinitionMaster | Housingitems): item is ItemDefinitionMaster {
return item && 'ItemID' in item
@@ -16,27 +17,24 @@ export function isItemWeapon(item: ItemDefinitionMaster) {
return item?.ItemType === 'Weapon'
}
-export function getItemRarity(item: ItemDefinitionMaster | Housingitems) {
+export function hasItemIngredientCategory(item: ItemDefinitionMaster, categoryId: string) {
+ return item.IngredientCategories?.some((it) => it.toLocaleLowerCase() === String(categoryId).toLocaleLowerCase())
+}
+
+export function getItemRarity(item: ItemDefinitionMaster | Housingitems, itemPerkIds?: string[]) {
+ if (!item) {
+ return 0
+ }
if (item.ForceRarity) {
return item.ForceRarity
}
+
let rarity = 0
if (isMasterItem(item)) {
- if (item.Perk1 && !item.Perk1?.startsWith('PerkID_Stat_')) {
- rarity += 1
- }
- if (item.Perk2 && !item.Perk2?.startsWith('PerkID_Stat_')) {
- rarity += 1
- }
- if (item.Perk3 && !item.Perk3?.startsWith('PerkID_Stat_')) {
- rarity += 1
- }
- if (item.Perk4 && !item.Perk4?.startsWith('PerkID_Stat_')) {
- rarity += 1
- }
- if (item.Perk5 && !item.Perk5?.startsWith('PerkID_Stat_')) {
- rarity += 1
+ if (!itemPerkIds) {
+ itemPerkIds = [item.Perk1, item.Perk2, item.Perk3, item.Perk4, item.Perk5]
}
+ rarity += itemPerkIds.filter((it) => it && !it?.startsWith('PerkID_Stat_')).length
}
return Math.min(rarity, 4)
}
@@ -46,6 +44,10 @@ export function getItemRarityName(item: ItemDefinitionMaster | Housingitems | nu
return `RarityLevel${item}_DisplayName`
}
+export function getItemPerkKeys(item: ItemDefinitionMaster) {
+ return ['Perk1', 'Perk2', 'Perk3', 'Perk4', 'Perk5'].filter((it) => item && it in item)
+}
+
export function getItemPerkIds(item: ItemDefinitionMaster) {
return item && [item.Perk1, item.Perk2, item.Perk3, item.Perk4, item.Perk5].filter((it) => !!it)
}
@@ -54,6 +56,10 @@ export function getItemPerks(item: ItemDefinitionMaster, perks: Map perks.get(it))
}
+export function getItemPerkBucketKeys(item: ItemDefinitionMaster) {
+ return ['PerkBucket1', 'PerkBucket2', 'PerkBucket3', 'PerkBucket4', 'PerkBucket5'].filter((it) => item && it in item)
+}
+
export function getItemPerkBucketIds(item: ItemDefinitionMaster) {
return [item.PerkBucket1, item.PerkBucket2, item.PerkBucket3, item.PerkBucket4, item.PerkBucket5].filter((it) => !!it)
}
@@ -62,6 +68,38 @@ export function getItemPerkBucket(item: ItemDefinitionMaster, buckets: Map buckets.get(it))
}
+export function getItemMaxGearScore(item: ItemDefinitionMaster) {
+ return item?.GearScoreOverride || item?.MaxGearScore || NW_MAX_GEAR_SCORE
+}
+export function getItemMinGearScore(item: ItemDefinitionMaster) {
+ return item?.GearScoreOverride || item?.MinGearScore || NW_MIN_GEAR_SCORE
+}
+export function getItemGearScoreLabel(item: ItemDefinitionMaster) {
+ if (!item) {
+ return ''
+ }
+ if (item.GearScoreOverride) {
+ return String(item.GearScoreOverride)
+ }
+ if (item.MinGearScore && item.MaxGearScore) {
+ return `${item.MinGearScore}-${item.MaxGearScore}`
+ }
+ return String(item.MaxGearScore || item.MinGearScore || '')
+}
+export function getItemType(item: ItemDefinitionMaster | Housingitems) {
+ return item?.ItemType
+}
+
+export function getItemTypeName(item: ItemDefinitionMaster | Housingitems) {
+ if (isMasterItem(item)) {
+ return item.ItemTypeDisplayName
+ }
+ if (isHousingItem(item)) {
+ return item.ItemType
+ }
+ return null
+}
+
export function getItemId(item: ItemDefinitionMaster | Housingitems) {
if (isMasterItem(item)) {
return item.ItemID
@@ -126,3 +164,28 @@ export function getItemIconPath(item: ItemDefinitionMaster | Housingitems, femal
}
return item.IconPath
}
+
+export function getArmorRatingElemental(item: ItemdefinitionsArmor | ItemdefinitionsWeapons, gearScore: number) {
+ if (!item?.ElementalArmorSetScaleFactor) {
+ return 0
+ }
+ return Math.pow(gearScore, 1.2) * item.ElementalArmorSetScaleFactor * item.ArmorRatingScaleFactor
+}
+
+export function getArmorRatingPhysical(item: ItemdefinitionsArmor | ItemdefinitionsWeapons, gearScore: number) {
+ if (!item?.PhysicalArmorSetScaleFactor) {
+ return 0
+ }
+ return Math.pow(gearScore, 1.2) * item.PhysicalArmorSetScaleFactor * item.ArmorRatingScaleFactor
+}
+
+export function getWeightLabel(weight: number) {
+ let label = 'light'
+ if (weight >= 13) {
+ label = 'medium'
+ }
+ if (weight >= 23) {
+ label = 'heavy'
+ }
+ return label
+}
diff --git a/apps/web/app/nw/utils/perks.ts b/apps/web/app/nw/utils/perks.ts
index ed62fdb6..9d2d9683 100644
--- a/apps/web/app/nw/utils/perks.ts
+++ b/apps/web/app/nw/utils/perks.ts
@@ -1,24 +1,102 @@
-import { Affixstats, Perks } from "@nw-data/types"
+import { Ability, Affixstats, Perks } from '@nw-data/types'
-export function hasPerkAffixStats(perk: Perks): boolean {
- return !!perk && !!perk.Affix && perk.PerkType === 'Inherent'
+export function isPerkInherent(perk: Perks) {
+ return perk?.PerkType === 'Inherent'
}
-export function getPerkAffixStat(perk: Perks, affix: Affixstats, gearScore: number) {
- return getAffixStats(affix, perk.ScalingPerGearScore * gearScore)
+export function isPerkGem(perk: Perks) {
+ return perk?.PerkType === 'Gem'
}
-export function getAffixStats(affix: Affixstats, scale: number) {
- return Object.keys(affix)
- .filter((it) => it.startsWith('MOD'))
- .map((key) => {
+export function isPerkGenerated(perk: Perks) {
+ return perk?.PerkType === 'Generated'
+}
+
+export function hasPerkInherentAffix(perk: Perks): boolean {
+ return isPerkInherent(perk) && !!perk?.Affix
+}
+
+export function getPerksInherentMODs(perk: Pick, affix: Affixstats, gearScore: number) {
+ return getAffixMODs(affix, getPerkMultiplier(perk, gearScore))
+}
+
+export function getPerksGemABSs(perk: Pick, affix: Affixstats, gearScore: number) {
+ return getAffixMODs(affix, getPerkMultiplier(perk, gearScore))
+}
+
+export function getPerkMultiplier(perk: Pick , gearScore: number) {
+ // TODO: solve precision
+ const scale = Number(perk.ScalingPerGearScore.toFixed(8))
+ return Math.max(0, gearScore - 100) * scale + 1
+}
+
+export function getAffixMODs(affix: Partial, scale: number) {
+ return getAffixProperties(affix)
+ .filter((it) => it.key.startsWith('MOD'))
+ .map(({ key, value }) => {
const label = key.replace('MOD', '').toLowerCase()
- const value = String(affix[key])
+ const valNum = Number(value)
return {
key: key,
label: `ui_${label}`,
- value: value.includes('-') ? value : Math.round(Number(value) * Math.floor(scale))
+ value: Number.isFinite(valNum) ? Math.floor(valNum * scale) : value,
}
})
- .filter((it) => it.value)
+}
+
+export function getAffixABSs(affix: Partial, scale: number) {
+ return getAffixProperties(affix)
+ .filter((it) => it.key.startsWith('ABS'))
+ .map(({ key, value }) => {
+ const name = key.replace('ABS', '').toLowerCase()
+ let label: string
+ if (name.startsWith('vitalscategory ')) {
+ label = `VC_${name.replace('vitalscategory ', '')}`
+ } else {
+ label = `${name}_DamageName`
+ }
+ const valNum = Number(value)
+ return {
+ key: key,
+ label: [label, 'ui_resistance'],
+ value: Number.isFinite(valNum) ? valNum * scale : value,
+ }
+ })
+}
+
+export function getAffixProperties(affix: Partial): Array<{ key: string; value: number | string }> {
+ return Object.entries((affix || {}) as Affixstats)
+ .filter(([key]) => key !== 'StatusID')
+ .map(([key, value]) => {
+ if (typeof value === 'string') {
+ if (value.includes('=')) {
+ const [a, b] = value.split('=')
+ key = `${key} ${a}`
+ value = Number(b)
+ }
+ }
+ return {
+ key,
+ value,
+ }
+ })
+ .filter((it) => !!it.value)
+}
+
+export function stripAffixProperties(item: Affixstats): Partial {
+ return Object.entries(item || {})
+ .filter(([key, value]) => key !== 'StatusID' && key !== '$source' && !!value)
+ .reduce((it, [key, value]) => {
+ it[key] = value
+ return it
+ }, {})
+}
+
+export function stripAbilityProperties(item: Ability): Partial {
+ return Object.entries(item || {})
+ .filter(([key, value]) => key !== 'AbilityID' && key !== '$source' && !!value)
+ .reduce((it, [key, value]) => {
+ it[key] = value
+ return it
+ }, {})
}
diff --git a/apps/web/app/nw/utils/tier-to-roman.ts b/apps/web/app/nw/utils/tier-to-roman.ts
index 046804bb..66a209d9 100644
--- a/apps/web/app/nw/utils/tier-to-roman.ts
+++ b/apps/web/app/nw/utils/tier-to-roman.ts
@@ -1,11 +1,17 @@
-const ROMAN = {
+const ROMAN_UNICODE = {
1: 'Ⅰ',
2: 'Ⅱ',
3: 'Ⅲ',
4: 'Ⅳ',
5: 'Ⅴ',
}
-
-export function getItemTierAsRoman(tier: number) {
- return ROMAN[tier] || ''
+const ROMAN = {
+ 1: 'I',
+ 2: 'II',
+ 3: 'III',
+ 4: 'IV',
+ 5: 'V',
+}
+export function getItemTierAsRoman(tier: number, unicode = false) {
+ return (unicode ? ROMAN_UNICODE : ROMAN)[tier] || ''
}
diff --git a/apps/web/app/pages/abilities/abilities-table.component.ts b/apps/web/app/pages/abilities/abilities-table.component.ts
deleted file mode 100644
index 81c3f129..00000000
--- a/apps/web/app/pages/abilities/abilities-table.component.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core';
-import { QuicksearchService } from '~/ui/quicksearch';
-
-@Component({
- selector: 'nwb-abilities-table',
- templateUrl: './abilities-table.component.html',
- changeDetection: ChangeDetectionStrategy.OnPush,
- host: {
- class: 'layout-row gap-4',
- },
-})
-export class AbilitiesTableComponent implements OnInit {
-
- constructor(public search: QuicksearchService) { }
-
- ngOnInit(): void {
- }
-
-}
diff --git a/apps/web/app/pages/abilities/abilities.component.html b/apps/web/app/pages/abilities/abilities.component.html
deleted file mode 100644
index a590b8e1..00000000
--- a/apps/web/app/pages/abilities/abilities.component.html
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
diff --git a/apps/web/app/pages/abilities/abilities.component.ts b/apps/web/app/pages/abilities/abilities.component.ts
deleted file mode 100644
index b674cb70..00000000
--- a/apps/web/app/pages/abilities/abilities.component.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import {
- ChangeDetectionStrategy,
- Component,
-} from '@angular/core'
-import { DataTableAdapter } from '~/ui/data-table'
-import { QuicksearchService } from '~/ui/quicksearch'
-import { AbilitiesAdapterService } from './abilities-table-adapter'
-
-@Component({
- selector: 'nwb-abilities',
- templateUrl: './abilities.component.html',
- changeDetection: ChangeDetectionStrategy.OnPush,
- host: {
- class: 'layout-row gap-4',
- },
- providers: [
- DataTableAdapter.provideClass(AbilitiesAdapterService),
- QuicksearchService
- ]
-})
-export class AbilitiesComponent {
- //
-}
diff --git a/apps/web/app/pages/abilities/abilities.module.ts b/apps/web/app/pages/abilities/abilities.module.ts
deleted file mode 100644
index 2dfe5341..00000000
--- a/apps/web/app/pages/abilities/abilities.module.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { NgModule } from '@angular/core'
-import { CommonModule } from '@angular/common'
-
-import { AbilitiesRoutingModule } from './abilities-routing.module'
-import { AbilitiesComponent } from './abilities.component'
-import { DataTableModule } from '~/ui/data-table'
-import { QuicksearchModule } from '~/ui/quicksearch';
-import { AbilitiesTableComponent } from './abilities-table.component'
-
-@NgModule({
- declarations: [AbilitiesComponent, AbilitiesTableComponent],
- imports: [CommonModule, AbilitiesRoutingModule, DataTableModule, QuicksearchModule],
-})
-export class AbilitiesModule {}
diff --git a/apps/web/app/pages/abilities/index.ts b/apps/web/app/pages/abilities/index.ts
deleted file mode 100644
index f72280cc..00000000
--- a/apps/web/app/pages/abilities/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './abilities-routing.module'
-export * from './abilities.module'
diff --git a/apps/web/app/pages/about/about-routing.module.ts b/apps/web/app/pages/about/about-routing.module.ts
deleted file mode 100644
index 4a61313d..00000000
--- a/apps/web/app/pages/about/about-routing.module.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
-import { AboutComponent } from './about.component';
-
-const routes: Routes = [{ path: '', component: AboutComponent }];
-
-@NgModule({
- imports: [RouterModule.forChild(routes)],
- exports: [RouterModule]
-})
-export class AboutRoutingModule { }
diff --git a/apps/web/app/pages/about/about.component.html b/apps/web/app/pages/about/about.component.html
deleted file mode 100644
index 9b1d668a..00000000
--- a/apps/web/app/pages/about/about.component.html
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
diff --git a/apps/web/app/pages/about/about.component.scss b/apps/web/app/pages/about/about.component.scss
deleted file mode 100644
index e69de29b..00000000
diff --git a/apps/web/app/pages/about/about.component.spec.ts b/apps/web/app/pages/about/about.component.spec.ts
deleted file mode 100644
index 0e0d812f..00000000
--- a/apps/web/app/pages/about/about.component.spec.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { AboutComponent } from './about.component';
-
-describe('AboutComponent', () => {
- let component: AboutComponent;
- let fixture: ComponentFixture;
-
- beforeEach(async () => {
- await TestBed.configureTestingModule({
- declarations: [ AboutComponent ]
- })
- .compileComponents();
- });
-
- beforeEach(() => {
- fixture = TestBed.createComponent(AboutComponent);
- component = fixture.componentInstance;
- fixture.detectChanges();
- });
-
- it('should create', () => {
- expect(component).toBeTruthy();
- });
-});
diff --git a/apps/web/app/pages/about/about.module.ts b/apps/web/app/pages/about/about.module.ts
deleted file mode 100644
index baea2edb..00000000
--- a/apps/web/app/pages/about/about.module.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-
-import { AboutRoutingModule } from './about-routing.module';
-import { AboutComponent } from './about.component';
-
-
-@NgModule({
- declarations: [
- AboutComponent
- ],
- imports: [
- CommonModule,
- AboutRoutingModule
- ]
-})
-export class AboutModule { }
diff --git a/apps/web/app/pages/armorsets/armorsets-table.component.html b/apps/web/app/pages/armorsets/armorsets-table.component.html
deleted file mode 100644
index 3774dad2..00000000
--- a/apps/web/app/pages/armorsets/armorsets-table.component.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
diff --git a/apps/web/app/pages/armorsets/armorsets-table.component.scss b/apps/web/app/pages/armorsets/armorsets-table.component.scss
deleted file mode 100644
index e69de29b..00000000
diff --git a/apps/web/app/pages/armorsets/armorsets.component.html b/apps/web/app/pages/armorsets/armorsets.component.html
deleted file mode 100644
index a590b8e1..00000000
--- a/apps/web/app/pages/armorsets/armorsets.component.html
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
diff --git a/apps/web/app/pages/armorsets/armorsets.component.scss b/apps/web/app/pages/armorsets/armorsets.component.scss
deleted file mode 100644
index e69de29b..00000000
diff --git a/apps/web/app/pages/armorsets/armorsets.module.ts b/apps/web/app/pages/armorsets/armorsets.module.ts
deleted file mode 100644
index 59c87f5d..00000000
--- a/apps/web/app/pages/armorsets/armorsets.module.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { NgModule } from '@angular/core'
-import { CommonModule } from '@angular/common'
-
-import { SetsRoutingModule } from './armorsets-routing.module'
-
-import { NwModule } from '~/nw'
-import { FormsModule } from '@angular/forms'
-import { ArmorsetsComponent } from './armorsets.component'
-import { DataTableModule } from '~/ui/data-table'
-import { ItemDetailModule } from '~/widgets/item-detail'
-import { QuicksearchModule } from '~/ui/quicksearch';
-import { ArmorsetsTableComponent } from './armorsets-table.component';
-
-@NgModule({
- imports: [CommonModule, NwModule, SetsRoutingModule, FormsModule, DataTableModule, ItemDetailModule, QuicksearchModule],
- declarations: [ArmorsetsComponent, ArmorsetsTableComponent],
- exports: [ArmorsetsComponent],
-})
-export class ArmorsetsModule {}
diff --git a/apps/web/app/pages/armorsets/index.ts b/apps/web/app/pages/armorsets/index.ts
deleted file mode 100644
index 1e958bf9..00000000
--- a/apps/web/app/pages/armorsets/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './armorsets-routing.module'
-export * from './armorsets.module'
diff --git a/apps/web/app/pages/crafting/crafting-detail.component.html b/apps/web/app/pages/crafting/crafting-detail.component.html
deleted file mode 100644
index c37342dd..00000000
--- a/apps/web/app/pages/crafting/crafting-detail.component.html
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/apps/web/app/pages/crafting/crafting-detail.component.ts b/apps/web/app/pages/crafting/crafting-detail.component.ts
deleted file mode 100644
index eb2a467b..00000000
--- a/apps/web/app/pages/crafting/crafting-detail.component.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { Component, ChangeDetectionStrategy } from '@angular/core'
-import { ActivatedRoute } from '@angular/router'
-import { observeRouteParam } from '~/utils'
-
-@Component({
- selector: 'nwb-crafting-detail',
- templateUrl: './crafting-detail.component.html',
- changeDetection: ChangeDetectionStrategy.OnPush,
- host: {
- class: 'layout-content flex-none max-w-lg'
- }
-})
-export class CraftingDetailComponent {
- public itemId = observeRouteParam(this.route, 'id')
- public constructor(private route: ActivatedRoute) {
- //
- }
-}
diff --git a/apps/web/app/pages/crafting/crafting-runes.component.html b/apps/web/app/pages/crafting/crafting-runes.component.html
deleted file mode 100644
index 5e271f46..00000000
--- a/apps/web/app/pages/crafting/crafting-runes.component.html
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
{{ ingr.quantity }}
-
×
-
-
-
-
-
-
diff --git a/apps/web/app/pages/crafting/crafting-table.component.ts b/apps/web/app/pages/crafting/crafting-table.component.ts
deleted file mode 100644
index 863094b5..00000000
--- a/apps/web/app/pages/crafting/crafting-table.component.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core';
-import { QuicksearchService } from '~/ui/quicksearch';
-
-@Component({
- selector: 'nwb-crafting-table',
- templateUrl: './crafting-table.component.html',
- changeDetection: ChangeDetectionStrategy.OnPush,
- host: {
- class: 'layout-row gap-4',
- },
-})
-export class CraftingTableComponent {
- public constructor(public search: QuicksearchService) {
- //
- }
-}
diff --git a/apps/web/app/pages/crafting/crafting-trophies.component.html b/apps/web/app/pages/crafting/crafting-trophies.component.html
deleted file mode 100644
index bbb6646c..00000000
--- a/apps/web/app/pages/crafting/crafting-trophies.component.html
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
{{ ingr.quantity }}
-
×
-
-
-
-
-
-
diff --git a/apps/web/app/pages/crafting/crafting.component.html b/apps/web/app/pages/crafting/crafting.component.html
deleted file mode 100644
index d66f6819..00000000
--- a/apps/web/app/pages/crafting/crafting.component.html
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
diff --git a/apps/web/app/pages/crafting/crafting.component.ts b/apps/web/app/pages/crafting/crafting.component.ts
deleted file mode 100644
index 45c75bea..00000000
--- a/apps/web/app/pages/crafting/crafting.component.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { Component } from '@angular/core'
-import { DataTableAdapter } from '~/ui/data-table'
-import { QuicksearchService } from '~/ui/quicksearch'
-import { CraftingAdapterService } from './crafting-table-adapter'
-
-@Component({
- selector: 'nwb-crafting',
- templateUrl: './crafting.component.html',
- host: {
- class: 'layout-row gap-4',
- },
- providers: [DataTableAdapter.provideClass(CraftingAdapterService), QuicksearchService],
-})
-export class CraftingComponent {
- //
-}
diff --git a/apps/web/app/pages/crafting/crafting.module.ts b/apps/web/app/pages/crafting/crafting.module.ts
deleted file mode 100644
index 97e639df..00000000
--- a/apps/web/app/pages/crafting/crafting.module.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { CommonModule } from '@angular/common'
-import { NgModule } from '@angular/core'
-
-import { FormsModule } from '@angular/forms'
-import { NwModule } from '~/nw'
-import { DataTableModule } from '~/ui/data-table'
-import { PropertyGridModule } from '~/ui/property-grid'
-import { QuicksearchModule } from '~/ui/quicksearch'
-import { CraftingCalculatorModule } from '~/widgets/crafting-calculator'
-import { ItemDetailModule } from '~/widgets/item-detail'
-import { CraftingDetailComponent } from './crafting-detail.component'
-import { CraftingRoutingModule } from './crafting-routing.module'
-import { CraftingRunesComponent } from './crafting-runes.component'
-import { CraftingTableComponent } from './crafting-table.component'
-import { CraftingTrophiesComponent } from './crafting-trophies.component'
-import { CraftingComponent } from './crafting.component'
-
-@NgModule({
- imports: [
- CommonModule,
- CraftingRoutingModule,
- PropertyGridModule,
- FormsModule,
- ItemDetailModule,
- DataTableModule,
- QuicksearchModule,
- CraftingCalculatorModule,
- NwModule
- ],
- declarations: [CraftingComponent, CraftingDetailComponent, CraftingTableComponent, CraftingRunesComponent, CraftingTrophiesComponent],
-})
-export class CraftingModule {}
diff --git a/apps/web/app/pages/database/abilities/abilities-detail.component.html b/apps/web/app/pages/database/abilities/abilities-detail.component.html
new file mode 100644
index 00000000..00726b4d
--- /dev/null
+++ b/apps/web/app/pages/database/abilities/abilities-detail.component.html
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/apps/web/app/pages/database/abilities/abilities-detail.component.ts b/apps/web/app/pages/database/abilities/abilities-detail.component.ts
new file mode 100644
index 00000000..059352ad
--- /dev/null
+++ b/apps/web/app/pages/database/abilities/abilities-detail.component.ts
@@ -0,0 +1,25 @@
+import { CommonModule } from '@angular/common'
+import { Component, ChangeDetectionStrategy } from '@angular/core'
+import { ActivatedRoute, RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
+import { PropertyGridModule } from '~/ui/property-grid'
+import { observeRouteParam } from '~/utils'
+import { AbilityDetailModule } from '~/widgets/ability-detail'
+
+@Component({
+ standalone: true,
+ selector: 'nwb-abilities-detail',
+ templateUrl: './abilities-detail.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, NwModule, RouterModule, AbilityDetailModule, PropertyGridModule],
+ host: {
+ class: 'layout-content xl:max-w-md p-3',
+ },
+})
+export class AbilitiesDetailComponent {
+ public itemId = observeRouteParam(this.route, 'id')
+
+ public constructor(private route: ActivatedRoute) {
+ //
+ }
+}
diff --git a/apps/web/app/pages/abilities/abilities-table.component.html b/apps/web/app/pages/database/abilities/abilities-table.component.html
similarity index 82%
rename from apps/web/app/pages/abilities/abilities-table.component.html
rename to apps/web/app/pages/database/abilities/abilities-table.component.html
index d7b12415..390f37c9 100644
--- a/apps/web/app/pages/abilities/abilities-table.component.html
+++ b/apps/web/app/pages/database/abilities/abilities-table.component.html
@@ -4,7 +4,7 @@
[categoryRouteParam]
[detailRoutParam]="'id'"
[quickFilter]="search.query | async"
- class="flex-1 rounded-md overflow-clip"
+ class="flex-1"
>
diff --git a/apps/web/app/pages/database/abilities/abilities-table.component.ts b/apps/web/app/pages/database/abilities/abilities-table.component.ts
new file mode 100644
index 00000000..1eb03e73
--- /dev/null
+++ b/apps/web/app/pages/database/abilities/abilities-table.component.ts
@@ -0,0 +1,26 @@
+import { CommonModule } from '@angular/common'
+import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'
+import { RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
+import { DataTableModule } from '~/ui/data-table'
+import { QuicksearchService } from '~/ui/quicksearch'
+
+@Component({
+ standalone: true,
+ selector: 'nwb-abilities-table',
+ templateUrl: './abilities-table.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, RouterModule, NwModule, DataTableModule],
+ host: {
+ class: 'layout-col xl:flex-row',
+ },
+})
+export class AbilitiesTableComponent implements OnInit {
+ public constructor(public search: QuicksearchService) {
+ //
+ }
+
+ public ngOnInit(): void {
+ //
+ }
+}
diff --git a/apps/web/app/pages/database/abilities/abilities.component.html b/apps/web/app/pages/database/abilities/abilities.component.html
new file mode 100644
index 00000000..062f6a80
--- /dev/null
+++ b/apps/web/app/pages/database/abilities/abilities.component.html
@@ -0,0 +1,11 @@
+
+
diff --git a/apps/web/app/pages/database/abilities/abilities.component.ts b/apps/web/app/pages/database/abilities/abilities.component.ts
new file mode 100644
index 00000000..e8ceb064
--- /dev/null
+++ b/apps/web/app/pages/database/abilities/abilities.component.ts
@@ -0,0 +1,22 @@
+import { CommonModule } from '@angular/common'
+import { ChangeDetectionStrategy, Component } from '@angular/core'
+import { RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
+import { DataTableAdapter, DataTableModule } from '~/ui/data-table'
+import { QuicksearchModule, QuicksearchService } from '~/ui/quicksearch'
+import { AbilitiesTableAdapter } from '~/widgets/adapter'
+
+@Component({
+ standalone: true,
+ selector: 'nwb-abilities-page',
+ templateUrl: './abilities.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, RouterModule, NwModule, DataTableModule, QuicksearchModule],
+ host: {
+ class: 'layout-col bg-base-300 rounded-md overflow-clip',
+ },
+ providers: [DataTableAdapter.provideClass(AbilitiesTableAdapter), QuicksearchService],
+})
+export class AbilitiesComponent {
+ //
+}
diff --git a/apps/web/app/pages/abilities/abilities-routing.module.ts b/apps/web/app/pages/database/abilities/abilities.module.ts
similarity index 64%
rename from apps/web/app/pages/abilities/abilities-routing.module.ts
rename to apps/web/app/pages/database/abilities/abilities.module.ts
index abdaa9d4..04daac5f 100644
--- a/apps/web/app/pages/abilities/abilities-routing.module.ts
+++ b/apps/web/app/pages/database/abilities/abilities.module.ts
@@ -1,6 +1,7 @@
import { NgModule } from '@angular/core'
import { RouterModule, Routes } from '@angular/router'
-import { EmptyComponent } from '~/widgets/empty'
+
+import { AbilitiesDetailComponent } from './abilities-detail.component'
import { AbilitiesTableComponent } from './abilities-table.component'
import { AbilitiesComponent } from './abilities.component'
@@ -17,18 +18,22 @@ const routes: Routes = [
{
path: 'table',
component: AbilitiesTableComponent,
- children: [{
- path: ':id',
- component: EmptyComponent
- }]
+ children: [
+ {
+ path: ':id',
+ component: AbilitiesDetailComponent,
+ },
+ ],
},
{
path: ':category',
component: AbilitiesTableComponent,
- children: [{
- path: ':id',
- component: EmptyComponent
- }]
+ children: [
+ {
+ path: ':id',
+ component: AbilitiesDetailComponent,
+ },
+ ],
},
],
},
@@ -36,6 +41,5 @@ const routes: Routes = [
@NgModule({
imports: [RouterModule.forChild(routes)],
- exports: [RouterModule],
})
-export class AbilitiesRoutingModule {}
+export class AbilitiesModule {}
diff --git a/apps/web/app/pages/database/abilities/index.ts b/apps/web/app/pages/database/abilities/index.ts
new file mode 100644
index 00000000..ae5c57b8
--- /dev/null
+++ b/apps/web/app/pages/database/abilities/index.ts
@@ -0,0 +1 @@
+export * from './abilities.module'
diff --git a/apps/web/app/pages/database/crafting/crafting-detail.component.html b/apps/web/app/pages/database/crafting/crafting-detail.component.html
new file mode 100644
index 00000000..e9b44166
--- /dev/null
+++ b/apps/web/app/pages/database/crafting/crafting-detail.component.html
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/apps/web/app/pages/database/crafting/crafting-detail.component.ts b/apps/web/app/pages/database/crafting/crafting-detail.component.ts
new file mode 100644
index 00000000..8d5a5690
--- /dev/null
+++ b/apps/web/app/pages/database/crafting/crafting-detail.component.ts
@@ -0,0 +1,29 @@
+import { CommonModule } from '@angular/common'
+import { ChangeDetectionStrategy, Component } from '@angular/core'
+import { ActivatedRoute, RouterModule } from '@angular/router'
+import { map } from 'rxjs'
+import { NwDbService, NwModule } from '~/nw'
+import { getItemIdFromRecipe } from '~/nw/utils'
+import { observeRouteParam } from '~/utils'
+import { CraftingCalculatorModule } from '~/widgets/crafting-calculator'
+import { ItemDetailModule } from '~/widgets/item-detail'
+
+@Component({
+ standalone: true,
+ selector: 'nwb-crafting-detail',
+ templateUrl: './crafting-detail.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, RouterModule, NwModule, ItemDetailModule, CraftingCalculatorModule],
+ host: {
+ class: 'layout-content xl:max-w-md',
+ },
+})
+export class CraftingDetailComponent {
+ protected id$ = observeRouteParam(this.route, 'id')
+ protected recipe$ = this.db.recipe(this.id$)
+ protected itemId$ = this.recipe$.pipe(map((it) => getItemIdFromRecipe(it)))
+
+ public constructor(private route: ActivatedRoute, private db: NwDbService) {
+ //
+ }
+}
diff --git a/apps/web/app/pages/crafting/crafting-table.component.html b/apps/web/app/pages/database/crafting/crafting-table.component.html
similarity index 82%
rename from apps/web/app/pages/crafting/crafting-table.component.html
rename to apps/web/app/pages/database/crafting/crafting-table.component.html
index 5d3d9dd7..50aa4f8f 100644
--- a/apps/web/app/pages/crafting/crafting-table.component.html
+++ b/apps/web/app/pages/database/crafting/crafting-table.component.html
@@ -4,7 +4,7 @@
[categoryRouteParam]
[detailRoutParam]="'id'"
[quickFilter]="search.query | async"
- class="flex-1 rounded-md overflow-clip"
+ class="flex-1"
>
diff --git a/apps/web/app/pages/database/crafting/crafting-table.component.ts b/apps/web/app/pages/database/crafting/crafting-table.component.ts
new file mode 100644
index 00000000..4e84393c
--- /dev/null
+++ b/apps/web/app/pages/database/crafting/crafting-table.component.ts
@@ -0,0 +1,22 @@
+import { CommonModule } from '@angular/common'
+import { ChangeDetectionStrategy, Component } from '@angular/core'
+import { RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
+import { DataTableModule } from '~/ui/data-table'
+import { QuicksearchService } from '~/ui/quicksearch'
+
+@Component({
+ standalone: true,
+ selector: 'nwb-crafting-table',
+ templateUrl: './crafting-table.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, RouterModule, NwModule, DataTableModule],
+ host: {
+ class: 'layout-col xl:flex-row',
+ },
+})
+export class CraftingTableComponent {
+ public constructor(public search: QuicksearchService) {
+ //
+ }
+}
diff --git a/apps/web/app/pages/database/crafting/crafting.component.html b/apps/web/app/pages/database/crafting/crafting.component.html
new file mode 100644
index 00000000..062f6a80
--- /dev/null
+++ b/apps/web/app/pages/database/crafting/crafting.component.html
@@ -0,0 +1,11 @@
+
+
diff --git a/apps/web/app/pages/database/crafting/crafting.component.ts b/apps/web/app/pages/database/crafting/crafting.component.ts
new file mode 100644
index 00000000..e615fb5a
--- /dev/null
+++ b/apps/web/app/pages/database/crafting/crafting.component.ts
@@ -0,0 +1,21 @@
+import { CommonModule } from '@angular/common'
+import { Component } from '@angular/core'
+import { RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
+import { DataTableAdapter, DataTableModule } from '~/ui/data-table'
+import { QuicksearchModule, QuicksearchService } from '~/ui/quicksearch'
+import { CraftingTableAdapter } from '~/widgets/adapter'
+
+@Component({
+ standalone: true,
+ selector: 'nwb-crafting',
+ templateUrl: './crafting.component.html',
+ imports: [CommonModule, RouterModule, NwModule, QuicksearchModule, DataTableModule],
+ host: {
+ class: 'layout-col bg-base-300 rounded-md overflow-clip',
+ },
+ providers: [DataTableAdapter.provideClass(CraftingTableAdapter), QuicksearchService],
+})
+export class CraftingComponent {
+ //
+}
diff --git a/apps/web/app/pages/crafting/crafting-routing.module.ts b/apps/web/app/pages/database/crafting/crafting.module.ts
similarity index 72%
rename from apps/web/app/pages/crafting/crafting-routing.module.ts
rename to apps/web/app/pages/database/crafting/crafting.module.ts
index 5bf4fc59..9643f4a8 100644
--- a/apps/web/app/pages/crafting/crafting-routing.module.ts
+++ b/apps/web/app/pages/database/crafting/crafting.module.ts
@@ -1,9 +1,8 @@
import { NgModule } from '@angular/core'
import { RouterModule, Routes } from '@angular/router'
+
import { CraftingDetailComponent } from './crafting-detail.component'
-import { CraftingRunesComponent } from './crafting-runes.component'
import { CraftingTableComponent } from './crafting-table.component'
-import { CraftingTrophiesComponent } from './crafting-trophies.component'
import { CraftingComponent } from './crafting.component'
const routes: Routes = [
@@ -16,14 +15,6 @@ const routes: Routes = [
pathMatch: 'full',
redirectTo: 'table',
},
- {
- path: 'runes',
- component: CraftingRunesComponent
- },
- {
- path: 'trophies',
- component: CraftingTrophiesComponent
- },
{
path: 'table',
component: CraftingTableComponent,
@@ -50,6 +41,5 @@ const routes: Routes = [
@NgModule({
imports: [RouterModule.forChild(routes)],
- exports: [RouterModule],
})
-export class CraftingRoutingModule {}
+export class CraftingModule {}
diff --git a/apps/web/app/pages/crafting/index.ts b/apps/web/app/pages/database/crafting/index.ts
similarity index 100%
rename from apps/web/app/pages/crafting/index.ts
rename to apps/web/app/pages/database/crafting/index.ts
diff --git a/apps/web/app/pages/database/housing/housing-detail.component.html b/apps/web/app/pages/database/housing/housing-detail.component.html
new file mode 100644
index 00000000..f7b1ff62
--- /dev/null
+++ b/apps/web/app/pages/database/housing/housing-detail.component.html
@@ -0,0 +1 @@
+
diff --git a/apps/web/app/pages/housing/housing-detail.component.ts b/apps/web/app/pages/database/housing/housing-detail.component.ts
similarity index 56%
rename from apps/web/app/pages/housing/housing-detail.component.ts
rename to apps/web/app/pages/database/housing/housing-detail.component.ts
index 31118bec..87fa282f 100644
--- a/apps/web/app/pages/housing/housing-detail.component.ts
+++ b/apps/web/app/pages/database/housing/housing-detail.component.ts
@@ -1,13 +1,18 @@
+import { CommonModule } from '@angular/common'
import { Component, ChangeDetectionStrategy } from '@angular/core'
-import { ActivatedRoute } from '@angular/router'
+import { ActivatedRoute, RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
import { observeRouteParam } from '~/utils'
+import { ItemDetailModule } from '~/widgets/item-detail'
@Component({
+ standalone: true,
selector: 'nwb-housing-detail',
templateUrl: './housing-detail.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, RouterModule, NwModule, ItemDetailModule],
host: {
- class: 'layout-content flex-none max-w-lg'
+ class: 'layout-content xl:max-w-md',
}
})
export class HousingDetailComponent {
diff --git a/apps/web/app/pages/housing/housing-table-adapter.ts b/apps/web/app/pages/database/housing/housing-table-adapter.ts
similarity index 100%
rename from apps/web/app/pages/housing/housing-table-adapter.ts
rename to apps/web/app/pages/database/housing/housing-table-adapter.ts
diff --git a/apps/web/app/pages/housing/housing-table.component.html b/apps/web/app/pages/database/housing/housing-table.component.html
similarity index 82%
rename from apps/web/app/pages/housing/housing-table.component.html
rename to apps/web/app/pages/database/housing/housing-table.component.html
index f3921122..d6a7e7e5 100644
--- a/apps/web/app/pages/housing/housing-table.component.html
+++ b/apps/web/app/pages/database/housing/housing-table.component.html
@@ -4,7 +4,7 @@
[categoryRouteParam]
[detailRoutParam]="'id'"
[quickFilter]="search.query | async"
- class="rounded-md overflow-clip flex-1"
+ class="flex-1"
>
diff --git a/apps/web/app/pages/housing/housing-table.component.ts b/apps/web/app/pages/database/housing/housing-table.component.ts
similarity index 58%
rename from apps/web/app/pages/housing/housing-table.component.ts
rename to apps/web/app/pages/database/housing/housing-table.component.ts
index a650afc8..6f24c8d1 100644
--- a/apps/web/app/pages/housing/housing-table.component.ts
+++ b/apps/web/app/pages/database/housing/housing-table.component.ts
@@ -1,12 +1,18 @@
+import { CommonModule } from '@angular/common'
import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'
+import { RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
+import { DataTableModule } from '~/ui/data-table'
import { QuicksearchService } from '~/ui/quicksearch'
@Component({
+ standalone: true,
selector: 'nwb-housing-table',
templateUrl: './housing-table.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, RouterModule, NwModule, DataTableModule],
host: {
- class: 'layout-row gap-4',
+ class: 'layout-col xl:flex-row',
},
})
export class HousingTableComponent implements OnInit {
diff --git a/apps/web/app/pages/database/housing/housing.component.html b/apps/web/app/pages/database/housing/housing.component.html
new file mode 100644
index 00000000..062f6a80
--- /dev/null
+++ b/apps/web/app/pages/database/housing/housing.component.html
@@ -0,0 +1,11 @@
+
+
diff --git a/apps/web/app/pages/database/housing/housing.component.ts b/apps/web/app/pages/database/housing/housing.component.ts
new file mode 100644
index 00000000..d651b3bd
--- /dev/null
+++ b/apps/web/app/pages/database/housing/housing.component.ts
@@ -0,0 +1,22 @@
+import { CommonModule } from '@angular/common'
+import { ChangeDetectionStrategy, Component } from '@angular/core'
+import { RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
+import { DataTableAdapter, DataTableModule } from '~/ui/data-table'
+import { QuicksearchModule, QuicksearchService } from '~/ui/quicksearch'
+import { HousingAdapterService } from './housing-table-adapter'
+
+@Component({
+ standalone: true,
+ selector: 'nwb-housing-page',
+ templateUrl: './housing.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, RouterModule, NwModule, QuicksearchModule, DataTableModule],
+ host: {
+ class: 'layout-col bg-base-300 rounded-md overflow-clip',
+ },
+ providers: [DataTableAdapter.provideClass(HousingAdapterService), QuicksearchService],
+})
+export class HousingComponent {
+ //
+}
diff --git a/apps/web/app/pages/housing/housing-routing.module.ts b/apps/web/app/pages/database/housing/housing.module.ts
similarity index 93%
rename from apps/web/app/pages/housing/housing-routing.module.ts
rename to apps/web/app/pages/database/housing/housing.module.ts
index 8d2bd621..80077f07 100644
--- a/apps/web/app/pages/housing/housing-routing.module.ts
+++ b/apps/web/app/pages/database/housing/housing.module.ts
@@ -1,5 +1,6 @@
import { NgModule } from '@angular/core'
import { RouterModule, Routes } from '@angular/router'
+
import { HousingDetailComponent } from './housing-detail.component'
import { HousingTableComponent } from './housing-table.component'
import { HousingComponent } from './housing.component'
@@ -40,6 +41,5 @@ const routes: Routes = [
@NgModule({
imports: [RouterModule.forChild(routes)],
- exports: [RouterModule],
})
-export class HousingRoutingModule {}
+export class HousingModule {}
diff --git a/apps/web/app/pages/housing/index.ts b/apps/web/app/pages/database/housing/index.ts
similarity index 100%
rename from apps/web/app/pages/housing/index.ts
rename to apps/web/app/pages/database/housing/index.ts
diff --git a/apps/web/app/pages/database/items/index.ts b/apps/web/app/pages/database/items/index.ts
new file mode 100644
index 00000000..c3eef00e
--- /dev/null
+++ b/apps/web/app/pages/database/items/index.ts
@@ -0,0 +1 @@
+export * from './items.module'
diff --git a/apps/web/app/pages/database/items/item.component.html b/apps/web/app/pages/database/items/item.component.html
new file mode 100644
index 00000000..f7b1ff62
--- /dev/null
+++ b/apps/web/app/pages/database/items/item.component.html
@@ -0,0 +1 @@
+
diff --git a/apps/web/app/pages/items/item.component.ts b/apps/web/app/pages/database/items/item.component.ts
similarity index 53%
rename from apps/web/app/pages/items/item.component.ts
rename to apps/web/app/pages/database/items/item.component.ts
index 8d1ff074..6d814f5a 100644
--- a/apps/web/app/pages/items/item.component.ts
+++ b/apps/web/app/pages/database/items/item.component.ts
@@ -1,13 +1,18 @@
+import { CommonModule } from '@angular/common'
import { Component, ChangeDetectionStrategy } from '@angular/core'
-import { ActivatedRoute } from '@angular/router'
+import { ActivatedRoute, RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
import { observeRouteParam } from '~/utils'
+import { ItemDetailModule } from '~/widgets/item-detail'
@Component({
+ standalone: true,
templateUrl: './item.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, RouterModule, NwModule, ItemDetailModule],
host: {
- class: 'layout-content flex-none max-w-lg'
- }
+ class: 'layout-content xl:max-w-md',
+ },
})
export class ItemComponent {
public itemId = observeRouteParam(this.route, 'id')
diff --git a/apps/web/app/pages/items/items-table.component.html b/apps/web/app/pages/database/items/items-table.component.html
similarity index 82%
rename from apps/web/app/pages/items/items-table.component.html
rename to apps/web/app/pages/database/items/items-table.component.html
index 052a653f..9cd8056a 100644
--- a/apps/web/app/pages/items/items-table.component.html
+++ b/apps/web/app/pages/database/items/items-table.component.html
@@ -4,7 +4,7 @@
[categoryRouteParam]
[detailRoutParam]="'id'"
[quickFilter]="search.query | async"
- class="flex-1 rounded-md overflow-clip"
+ class="flex-1"
>
diff --git a/apps/web/app/pages/database/items/items-table.component.ts b/apps/web/app/pages/database/items/items-table.component.ts
new file mode 100644
index 00000000..19be604d
--- /dev/null
+++ b/apps/web/app/pages/database/items/items-table.component.ts
@@ -0,0 +1,22 @@
+import { CommonModule } from '@angular/common'
+import { Component, ChangeDetectionStrategy } from '@angular/core'
+import { RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
+import { DataTableModule } from '~/ui/data-table'
+import { QuicksearchModule, QuicksearchService } from '~/ui/quicksearch'
+
+@Component({
+ standalone: true,
+ selector: 'nwb-items-table',
+ templateUrl: './items-table.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, RouterModule, NwModule, QuicksearchModule, DataTableModule],
+ host: {
+ class: 'layout-col xl:flex-row',
+ },
+})
+export class ItemsTableComponent {
+ public constructor(public search: QuicksearchService) {
+ //
+ }
+}
diff --git a/apps/web/app/pages/database/items/items.component.html b/apps/web/app/pages/database/items/items.component.html
new file mode 100644
index 00000000..f8290890
--- /dev/null
+++ b/apps/web/app/pages/database/items/items.component.html
@@ -0,0 +1,11 @@
+
+
diff --git a/apps/web/app/pages/database/items/items.component.ts b/apps/web/app/pages/database/items/items.component.ts
new file mode 100644
index 00000000..39b612c2
--- /dev/null
+++ b/apps/web/app/pages/database/items/items.component.ts
@@ -0,0 +1,22 @@
+import { CommonModule } from '@angular/common'
+import { ChangeDetectionStrategy, Component } from '@angular/core'
+import { RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
+import { DataTableAdapter, DataTableModule } from '~/ui/data-table'
+import { QuicksearchModule, QuicksearchService } from '~/ui/quicksearch'
+import { ItemsTableAdapter } from '~/widgets/adapter'
+
+@Component({
+ standalone: true,
+ selector: 'nwb-items-page',
+ templateUrl: './items.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, RouterModule, NwModule, QuicksearchModule, DataTableModule],
+ host: {
+ class: 'layout-col bg-base-300 rounded-md overflow-clip',
+ },
+ providers: [DataTableAdapter.provideClass(ItemsTableAdapter), QuicksearchService],
+})
+export class ItemsComponent {
+
+}
diff --git a/apps/web/app/pages/items/items-routing.module.ts b/apps/web/app/pages/database/items/items.module.ts
similarity index 93%
rename from apps/web/app/pages/items/items-routing.module.ts
rename to apps/web/app/pages/database/items/items.module.ts
index 457cb0a3..c47162f0 100644
--- a/apps/web/app/pages/items/items-routing.module.ts
+++ b/apps/web/app/pages/database/items/items.module.ts
@@ -1,5 +1,6 @@
import { NgModule } from '@angular/core'
import { RouterModule, Routes } from '@angular/router'
+
import { ItemComponent } from './item.component'
import { ItemsTableComponent } from './items-table.component'
import { ItemsComponent } from './items.component'
@@ -36,6 +37,6 @@ const routes: Routes = [
@NgModule({
imports: [RouterModule.forChild(routes)],
- exports: [RouterModule],
+ declarations: [],
})
-export class ItemsRoutingModule {}
+export class ItemsModule {}
diff --git a/apps/web/app/pages/database/perks/index.ts b/apps/web/app/pages/database/perks/index.ts
new file mode 100644
index 00000000..35390768
--- /dev/null
+++ b/apps/web/app/pages/database/perks/index.ts
@@ -0,0 +1 @@
+export * from './perks.module'
diff --git a/apps/web/app/pages/database/perks/perks-detail.component.html b/apps/web/app/pages/database/perks/perks-detail.component.html
new file mode 100644
index 00000000..a8ca1f8d
--- /dev/null
+++ b/apps/web/app/pages/database/perks/perks-detail.component.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/app/pages/database/perks/perks-detail.component.ts b/apps/web/app/pages/database/perks/perks-detail.component.ts
new file mode 100644
index 00000000..3eccb56b
--- /dev/null
+++ b/apps/web/app/pages/database/perks/perks-detail.component.ts
@@ -0,0 +1,26 @@
+import { CommonModule } from '@angular/common'
+import { Component, ChangeDetectionStrategy } from '@angular/core'
+import { ActivatedRoute, RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
+import { PropertyGridModule } from '~/ui/property-grid'
+import { observeRouteParam } from '~/utils'
+import { AbilityDetailModule } from '~/widgets/ability-detail'
+import { PerkDetailModule } from '~/widgets/perk-detail'
+
+@Component({
+ standalone: true,
+ selector: 'nwb-perks-detail',
+ templateUrl: './perks-detail.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, NwModule, RouterModule, PerkDetailModule, PropertyGridModule],
+ host: {
+ class: 'layout-content xl:max-w-md p-3',
+ },
+})
+export class PerksDetailComponent {
+ public itemId = observeRouteParam(this.route, 'id')
+
+ public constructor(private route: ActivatedRoute) {
+ //
+ }
+}
diff --git a/apps/web/app/pages/perks/perks-table.component.html b/apps/web/app/pages/database/perks/perks-table.component.html
similarity index 82%
rename from apps/web/app/pages/perks/perks-table.component.html
rename to apps/web/app/pages/database/perks/perks-table.component.html
index 30f4902a..5662e8f4 100644
--- a/apps/web/app/pages/perks/perks-table.component.html
+++ b/apps/web/app/pages/database/perks/perks-table.component.html
@@ -4,7 +4,7 @@
[categoryRouteParam]
[detailRoutParam]="'id'"
[quickFilter]="search.query | async"
- class="flex-1 rounded-md overflow-clip"
+ class="flex-1"
>
diff --git a/apps/web/app/pages/database/perks/perks-table.component.ts b/apps/web/app/pages/database/perks/perks-table.component.ts
new file mode 100644
index 00000000..6fee17e5
--- /dev/null
+++ b/apps/web/app/pages/database/perks/perks-table.component.ts
@@ -0,0 +1,21 @@
+import { CommonModule } from '@angular/common'
+import { Component, ChangeDetectionStrategy } from '@angular/core'
+import { RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
+import { DataTableModule } from '~/ui/data-table'
+import { QuicksearchModule, QuicksearchService } from '~/ui/quicksearch'
+
+@Component({
+ standalone: true,
+ templateUrl: './perks-table.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, RouterModule, NwModule, QuicksearchModule, DataTableModule],
+ host: {
+ class: 'layout-col xl:flex-row',
+ },
+})
+export class PerksTableComponent {
+ public constructor(public search: QuicksearchService) {
+ //
+ }
+}
diff --git a/apps/web/app/pages/database/perks/perks.component.html b/apps/web/app/pages/database/perks/perks.component.html
new file mode 100644
index 00000000..89a5385d
--- /dev/null
+++ b/apps/web/app/pages/database/perks/perks.component.html
@@ -0,0 +1,49 @@
+
+
+
+
+
+
diff --git a/apps/web/app/pages/database/perks/perks.component.ts b/apps/web/app/pages/database/perks/perks.component.ts
new file mode 100644
index 00000000..efe010f3
--- /dev/null
+++ b/apps/web/app/pages/database/perks/perks.component.ts
@@ -0,0 +1,36 @@
+import { OverlayModule } from '@angular/cdk/overlay'
+import { CommonModule } from '@angular/common'
+import { ChangeDetectionStrategy, Component } from '@angular/core'
+import { FormsModule } from '@angular/forms'
+import { RouterModule } from '@angular/router'
+import { firstValueFrom } from 'rxjs'
+import { NwModule } from '~/nw'
+import { CharacterPreferencesService } from '~/preferences'
+import { DataTableAdapter, DataTableModule } from '~/ui/data-table'
+import { QuicksearchModule } from '~/ui/quicksearch'
+import { PerksTableAdapter } from '~/widgets/adapter'
+import { ExprContextService } from '~/widgets/adapter/exp-context.service'
+
+@Component({
+ standalone: true,
+ selector: 'nwb-perks-page',
+ templateUrl: './perks.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, RouterModule, FormsModule, OverlayModule, NwModule, QuicksearchModule, DataTableModule],
+ host: {
+ class: 'layout-col bg-base-300 rounded-md overflow-clip',
+ },
+ providers: [
+ DataTableAdapter.provideClass(PerksTableAdapter),
+ ExprContextService
+ ]
+})
+export class PerksComponent {
+
+ protected isToolOpen = false
+ public constructor(public ctx: ExprContextService, char: CharacterPreferencesService) {
+ firstValueFrom(char.level$).then((value) => {
+ ctx.level = value
+ })
+ }
+}
diff --git a/apps/web/app/pages/perks/perks-routing.module.ts b/apps/web/app/pages/database/perks/perks.module.ts
similarity index 56%
rename from apps/web/app/pages/perks/perks-routing.module.ts
rename to apps/web/app/pages/database/perks/perks.module.ts
index 7c90ff2b..e855a45d 100644
--- a/apps/web/app/pages/perks/perks-routing.module.ts
+++ b/apps/web/app/pages/database/perks/perks.module.ts
@@ -1,9 +1,8 @@
import { NgModule } from '@angular/core'
import { RouterModule, Routes } from '@angular/router'
-import { AttributesTableComponent } from '~/widgets/attributes-table/attributes-table.component'
-import { EmptyComponent } from '~/widgets/empty'
-import { PerksTableComponent } from './perks-table.component'
+import { PerksDetailComponent } from './perks-detail.component'
+import { PerksTableComponent } from './perks-table.component'
import { PerksComponent } from './perks.component'
const routes: Routes = [
@@ -16,25 +15,25 @@ const routes: Routes = [
pathMatch: 'full',
redirectTo: 'table',
},
- {
- path: 'attributes',
- component: AttributesTableComponent,
- },
{
path: 'table',
component: PerksTableComponent,
- children: [{
- path: ':id',
- component: EmptyComponent
- }]
+ children: [
+ {
+ path: ':id',
+ component: PerksDetailComponent,
+ },
+ ],
},
{
path: ':category',
component: PerksTableComponent,
- children: [{
- path: ':id',
- component: EmptyComponent
- }]
+ children: [
+ {
+ path: ':id',
+ component: PerksDetailComponent,
+ },
+ ],
},
],
},
@@ -42,6 +41,5 @@ const routes: Routes = [
@NgModule({
imports: [RouterModule.forChild(routes)],
- exports: [RouterModule],
})
-export class PerksRoutingModule {}
+export class PerksModule {}
diff --git a/apps/web/app/pages/database/poi/index.ts b/apps/web/app/pages/database/poi/index.ts
new file mode 100644
index 00000000..bea6ce2c
--- /dev/null
+++ b/apps/web/app/pages/database/poi/index.ts
@@ -0,0 +1 @@
+export * from './poi.module'
diff --git a/apps/web/app/pages/territories/poi-table-adapter.ts b/apps/web/app/pages/database/poi/poi-table-adapter.ts
similarity index 94%
rename from apps/web/app/pages/territories/poi-table-adapter.ts
rename to apps/web/app/pages/database/poi/poi-table-adapter.ts
index a373ac8a..885ccad3 100644
--- a/apps/web/app/pages/territories/poi-table-adapter.ts
+++ b/apps/web/app/pages/database/poi/poi-table-adapter.ts
@@ -75,6 +75,14 @@ export class PoiTableAdapter extends DataTableAdapter {
showCondition: true,
})
},
+ {
+ field: this.fieldName('LevelRange'),
+ hide: false,
+ },
+ {
+ field: this.fieldName('VitalsCategory'),
+ hide: false,
+ },
],
}
}
diff --git a/apps/web/app/pages/territories/poi-table.component.html b/apps/web/app/pages/database/poi/poi-table.component.html
similarity index 100%
rename from apps/web/app/pages/territories/poi-table.component.html
rename to apps/web/app/pages/database/poi/poi-table.component.html
diff --git a/apps/web/app/pages/territories/poi-table.component.ts b/apps/web/app/pages/database/poi/poi-table.component.ts
similarity index 87%
rename from apps/web/app/pages/territories/poi-table.component.ts
rename to apps/web/app/pages/database/poi/poi-table.component.ts
index 83c6838f..1d534f8a 100644
--- a/apps/web/app/pages/territories/poi-table.component.ts
+++ b/apps/web/app/pages/database/poi/poi-table.component.ts
@@ -12,9 +12,9 @@ import { PoiTableAdapter } from './poi-table-adapter'
templateUrl: './poi-table.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [CommonModule, NwModule, DataTableModule, RouterModule],
- providers: [DataTableAdapter.provideClass(PoiTableAdapter)],
+ //providers: [DataTableAdapter.provideClass(PoiTableAdapter)],
host: {
- class: 'layout-row gap-4',
+ class: 'layout-row layout-gap',
},
})
export class PoiTableComponent {
diff --git a/apps/web/app/pages/database/poi/poi.component.html b/apps/web/app/pages/database/poi/poi.component.html
new file mode 100644
index 00000000..062f6a80
--- /dev/null
+++ b/apps/web/app/pages/database/poi/poi.component.html
@@ -0,0 +1,11 @@
+
+
diff --git a/apps/web/app/pages/database/poi/poi.component.ts b/apps/web/app/pages/database/poi/poi.component.ts
new file mode 100644
index 00000000..a9a61ce0
--- /dev/null
+++ b/apps/web/app/pages/database/poi/poi.component.ts
@@ -0,0 +1,30 @@
+import { CommonModule } from '@angular/common'
+import { ChangeDetectionStrategy, Component } from '@angular/core'
+import { RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
+import { DataTableAdapter, DataTableModule } from '~/ui/data-table'
+import { QuicksearchModule } from '~/ui/quicksearch'
+import { PerksTableAdapter } from '~/widgets/adapter'
+import { ExprContextService } from '~/widgets/adapter/exp-context.service'
+import { PoiTableAdapter } from './poi-table-adapter'
+
+@Component({
+ standalone: true,
+ selector: 'nwb-poi-page',
+ templateUrl: './poi.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, RouterModule, NwModule, QuicksearchModule, DataTableModule],
+ host: {
+ class: 'layout-col bg-base-300 rounded-md overflow-clip',
+ },
+ providers: [
+ DataTableAdapter.provideClass(PoiTableAdapter),
+ ExprContextService
+ ]
+})
+export class PoiComponent {
+
+ public constructor(public ctx: ExprContextService) {
+
+ }
+}
diff --git a/apps/web/app/pages/database/poi/poi.module.ts b/apps/web/app/pages/database/poi/poi.module.ts
new file mode 100644
index 00000000..96dfe34d
--- /dev/null
+++ b/apps/web/app/pages/database/poi/poi.module.ts
@@ -0,0 +1,45 @@
+import { NgModule } from '@angular/core'
+import { RouterModule, Routes } from '@angular/router'
+import { EmptyComponent } from '~/widgets/empty'
+
+import { PoiTableComponent } from './poi-table.component'
+import { PoiComponent } from './poi.component'
+
+const routes: Routes = [
+ {
+ path: '',
+ component: PoiComponent,
+ children: [
+ {
+ path: '',
+ pathMatch: 'full',
+ redirectTo: 'table',
+ },
+ {
+ path: 'table',
+ component: PoiTableComponent,
+ children: [
+ {
+ path: ':id',
+ component: EmptyComponent,
+ },
+ ],
+ },
+ {
+ path: ':category',
+ component: PoiTableComponent,
+ children: [
+ {
+ path: ':id',
+ component: EmptyComponent,
+ },
+ ],
+ },
+ ],
+ },
+]
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+})
+export class PoiModule {}
diff --git a/apps/web/app/pages/status-effects/index.ts b/apps/web/app/pages/database/status-effects/index.ts
similarity index 100%
rename from apps/web/app/pages/status-effects/index.ts
rename to apps/web/app/pages/database/status-effects/index.ts
diff --git a/apps/web/app/pages/database/status-effects/status-effects-detail.component.html b/apps/web/app/pages/database/status-effects/status-effects-detail.component.html
new file mode 100644
index 00000000..65be3ef1
--- /dev/null
+++ b/apps/web/app/pages/database/status-effects/status-effects-detail.component.html
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/apps/web/app/pages/database/status-effects/status-effects-detail.component.ts b/apps/web/app/pages/database/status-effects/status-effects-detail.component.ts
new file mode 100644
index 00000000..ab928fd7
--- /dev/null
+++ b/apps/web/app/pages/database/status-effects/status-effects-detail.component.ts
@@ -0,0 +1,25 @@
+import { CommonModule } from '@angular/common'
+import { Component, ChangeDetectionStrategy } from '@angular/core'
+import { ActivatedRoute, RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
+import { PropertyGridModule } from '~/ui/property-grid'
+import { observeRouteParam } from '~/utils'
+import { StatusEffectDetailModule } from '~/widgets/status-effect-detail'
+
+@Component({
+ standalone: true,
+ selector: 'nwb-status-effects-detail',
+ templateUrl: './status-effects-detail.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, NwModule, RouterModule, StatusEffectDetailModule, PropertyGridModule],
+ host: {
+ class: 'layout-content xl:max-w-md p-3',
+ },
+})
+export class AbilitiesDetailComponent {
+ public itemId = observeRouteParam(this.route, 'id')
+
+ public constructor(private route: ActivatedRoute) {
+ //
+ }
+}
diff --git a/apps/web/app/pages/status-effects/status-effects-table.component.html b/apps/web/app/pages/database/status-effects/status-effects-table.component.html
similarity index 82%
rename from apps/web/app/pages/status-effects/status-effects-table.component.html
rename to apps/web/app/pages/database/status-effects/status-effects-table.component.html
index fc74abc8..60788617 100644
--- a/apps/web/app/pages/status-effects/status-effects-table.component.html
+++ b/apps/web/app/pages/database/status-effects/status-effects-table.component.html
@@ -4,7 +4,7 @@
[categoryRouteParam]
[detailRoutParam]="'id'"
[quickFilter]="search.query | async"
- class="flex-1 rounded-md overflow-clip"
+ class="flex-1"
>
diff --git a/apps/web/app/pages/status-effects/status-effects-table.component.ts b/apps/web/app/pages/database/status-effects/status-effects-table.component.ts
similarity index 52%
rename from apps/web/app/pages/status-effects/status-effects-table.component.ts
rename to apps/web/app/pages/database/status-effects/status-effects-table.component.ts
index a14828c9..55edb325 100644
--- a/apps/web/app/pages/status-effects/status-effects-table.component.ts
+++ b/apps/web/app/pages/database/status-effects/status-effects-table.component.ts
@@ -1,12 +1,18 @@
+import { CommonModule } from '@angular/common'
import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'
-import { QuicksearchService } from '~/ui/quicksearch'
+import { RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
+import { DataTableModule } from '~/ui/data-table'
+import { QuicksearchModule, QuicksearchService } from '~/ui/quicksearch'
@Component({
+ standalone: true,
selector: 'nwb-status-effects-table',
templateUrl: './status-effects-table.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, RouterModule, NwModule, QuicksearchModule, DataTableModule],
host: {
- class: 'layout-row gap-4',
+ class: 'layout-col xl:flex-row',
},
})
export class StatusEffectsTableComponent implements OnInit {
diff --git a/apps/web/app/pages/database/status-effects/status-effects.component.html b/apps/web/app/pages/database/status-effects/status-effects.component.html
new file mode 100644
index 00000000..062f6a80
--- /dev/null
+++ b/apps/web/app/pages/database/status-effects/status-effects.component.html
@@ -0,0 +1,11 @@
+
+
diff --git a/apps/web/app/pages/database/status-effects/status-effects.component.ts b/apps/web/app/pages/database/status-effects/status-effects.component.ts
new file mode 100644
index 00000000..b9e4d148
--- /dev/null
+++ b/apps/web/app/pages/database/status-effects/status-effects.component.ts
@@ -0,0 +1,22 @@
+import { CommonModule } from '@angular/common'
+import { ChangeDetectionStrategy, Component } from '@angular/core'
+import { RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
+import { DataTableAdapter, DataTableModule } from '~/ui/data-table'
+import { QuicksearchModule, QuicksearchService } from '~/ui/quicksearch'
+import { StatusEffectsTableAdapter } from '~/widgets/adapter'
+
+@Component({
+ standalone: true,
+ selector: 'nwb-status-effects',
+ templateUrl: './status-effects.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, RouterModule, NwModule, QuicksearchModule, DataTableModule],
+ host: {
+ class: 'layout-col bg-base-300 rounded-md overflow-clip',
+ },
+ providers: [DataTableAdapter.provideClass(StatusEffectsTableAdapter), QuicksearchService],
+})
+export class StatusEffectsComponent {
+ //
+}
diff --git a/apps/web/app/pages/status-effects/status-effects-routing.module.ts b/apps/web/app/pages/database/status-effects/status-effects.module.ts
similarity index 66%
rename from apps/web/app/pages/status-effects/status-effects-routing.module.ts
rename to apps/web/app/pages/database/status-effects/status-effects.module.ts
index ab928109..f79e7f28 100644
--- a/apps/web/app/pages/status-effects/status-effects-routing.module.ts
+++ b/apps/web/app/pages/database/status-effects/status-effects.module.ts
@@ -1,6 +1,8 @@
import { NgModule } from '@angular/core'
import { RouterModule, Routes } from '@angular/router'
+
import { EmptyComponent } from '~/widgets/empty'
+import { AbilitiesDetailComponent } from './status-effects-detail.component'
import { StatusEffectsTableComponent } from './status-effects-table.component'
import { StatusEffectsComponent } from './status-effects.component'
@@ -17,18 +19,22 @@ const routes: Routes = [
{
path: 'table',
component: StatusEffectsTableComponent,
- children: [{
- path: ':id',
- component: EmptyComponent
- }]
+ children: [
+ {
+ path: ':id',
+ component: AbilitiesDetailComponent,
+ },
+ ],
},
{
path: ':category',
component: StatusEffectsTableComponent,
- children: [{
- path: ':id',
- component: EmptyComponent
- }]
+ children: [
+ {
+ path: ':id',
+ component: AbilitiesDetailComponent,
+ },
+ ],
},
],
},
@@ -36,6 +42,5 @@ const routes: Routes = [
@NgModule({
imports: [RouterModule.forChild(routes)],
- exports: [RouterModule],
})
-export class StatusEffectsRoutingModule {}
+export class StatusEffectsModule {}
diff --git a/apps/web/app/pages/database/vitals/index.ts b/apps/web/app/pages/database/vitals/index.ts
new file mode 100644
index 00000000..98f18116
--- /dev/null
+++ b/apps/web/app/pages/database/vitals/index.ts
@@ -0,0 +1 @@
+export * from './vitals.module'
diff --git a/apps/web/app/pages/vitals/vital.component.html b/apps/web/app/pages/database/vitals/vital.component.html
similarity index 99%
rename from apps/web/app/pages/vitals/vital.component.html
rename to apps/web/app/pages/database/vitals/vital.component.html
index 8357a8d0..618e2961 100644
--- a/apps/web/app/pages/vitals/vital.component.html
+++ b/apps/web/app/pages/database/vitals/vital.component.html
@@ -1,3 +1,4 @@
+
diff --git a/apps/web/app/pages/vitals/vital.component.scss b/apps/web/app/pages/database/vitals/vital.component.scss
similarity index 100%
rename from apps/web/app/pages/vitals/vital.component.scss
rename to apps/web/app/pages/database/vitals/vital.component.scss
diff --git a/apps/web/app/pages/vitals/vital.component.ts b/apps/web/app/pages/database/vitals/vital.component.ts
similarity index 78%
rename from apps/web/app/pages/vitals/vital.component.ts
rename to apps/web/app/pages/database/vitals/vital.component.ts
index 756bab1d..bf60b4f2 100644
--- a/apps/web/app/pages/vitals/vital.component.ts
+++ b/apps/web/app/pages/database/vitals/vital.component.ts
@@ -1,17 +1,22 @@
+import { CommonModule } from '@angular/common'
import { ChangeDetectionStrategy, Component } from '@angular/core'
-import { ActivatedRoute } from '@angular/router'
+import { ActivatedRoute, RouterModule } from '@angular/router'
import { uniq } from 'lodash'
import { combineLatest, defer, map } from 'rxjs'
-import { NwDbService } from '~/nw'
+import { NwDbService, NwModule } from '~/nw'
import { getVitalDungeon } from '~/nw/utils'
import { observeRouteParam } from '~/utils'
+import { LootModule } from '~/widgets/loot'
+import { VitalsFamiliesModule } from '~/widgets/vitals-families'
@Component({
+ standalone: true,
templateUrl: './vital.component.html',
styleUrls: ['./vital.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, RouterModule, NwModule, VitalsFamiliesModule, LootModule],
host: {
- class: 'layout-column flex-none max-w-lg gap-4'
+ class: 'layout-col xl:max-w-md layout-pad',
}
})
export class VitalComponent {
diff --git a/apps/web/app/pages/vitals/vitals-table.component.html b/apps/web/app/pages/database/vitals/vitals-table.component.html
similarity index 77%
rename from apps/web/app/pages/vitals/vitals-table.component.html
rename to apps/web/app/pages/database/vitals/vitals-table.component.html
index 93713be0..5418e0b4 100644
--- a/apps/web/app/pages/vitals/vitals-table.component.html
+++ b/apps/web/app/pages/database/vitals/vitals-table.component.html
@@ -1,9 +1,10 @@
diff --git a/apps/web/app/pages/vitals/vitals-table.component.ts b/apps/web/app/pages/database/vitals/vitals-table.component.ts
similarity index 52%
rename from apps/web/app/pages/vitals/vitals-table.component.ts
rename to apps/web/app/pages/database/vitals/vitals-table.component.ts
index 8ecef1b6..cbb9b730 100644
--- a/apps/web/app/pages/vitals/vitals-table.component.ts
+++ b/apps/web/app/pages/database/vitals/vitals-table.component.ts
@@ -1,16 +1,21 @@
-import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core';
-import { QuicksearchService } from '~/ui/quicksearch';
+import { CommonModule } from '@angular/common'
+import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'
+import { RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
+import { DataTableModule } from '~/ui/data-table'
+import { QuicksearchService } from '~/ui/quicksearch'
@Component({
+ standalone: true,
selector: 'nwb-vitals-table',
templateUrl: './vitals-table.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, RouterModule, NwModule, DataTableModule],
host: {
- class: 'layout-row gap-4',
+ class: 'layout-col xl:flex-row',
},
})
export class VitalsTableComponent implements OnInit {
-
public constructor(public readonly search: QuicksearchService) {
//
}
@@ -18,5 +23,4 @@ export class VitalsTableComponent implements OnInit {
public ngOnInit(): void {
//
}
-
}
diff --git a/apps/web/app/pages/database/vitals/vitals.component.html b/apps/web/app/pages/database/vitals/vitals.component.html
new file mode 100644
index 00000000..062f6a80
--- /dev/null
+++ b/apps/web/app/pages/database/vitals/vitals.component.html
@@ -0,0 +1,11 @@
+
+
diff --git a/apps/web/app/pages/database/vitals/vitals.component.ts b/apps/web/app/pages/database/vitals/vitals.component.ts
new file mode 100644
index 00000000..d34f5fa1
--- /dev/null
+++ b/apps/web/app/pages/database/vitals/vitals.component.ts
@@ -0,0 +1,20 @@
+import { CommonModule } from '@angular/common'
+import { ChangeDetectionStrategy, Component } from '@angular/core'
+import { RouterModule } from '@angular/router'
+import { NwModule } from '~/nw'
+import { DataTableAdapter, DataTableModule } from '~/ui/data-table'
+import { QuicksearchModule, QuicksearchService } from '~/ui/quicksearch'
+import { VitalsTableAdapter } from '~/widgets/adapter'
+
+@Component({
+ standalone: true,
+ selector: 'nwb-vitals-page',
+ templateUrl: './vitals.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [CommonModule, RouterModule, NwModule, DataTableModule, QuicksearchModule],
+ host: {
+ class: 'layout-col bg-base-300 rounded-md overflow-clip',
+ },
+ providers: [DataTableAdapter.provideClass(VitalsTableAdapter), QuicksearchService],
+})
+export class VitalsComponent {}
diff --git a/apps/web/app/pages/vitals/vitals-routing.module.ts b/apps/web/app/pages/database/vitals/vitals.module.ts
similarity index 63%
rename from apps/web/app/pages/vitals/vitals-routing.module.ts
rename to apps/web/app/pages/database/vitals/vitals.module.ts
index cf32003e..49e2a0b8 100644
--- a/apps/web/app/pages/vitals/vitals-routing.module.ts
+++ b/apps/web/app/pages/database/vitals/vitals.module.ts
@@ -1,7 +1,7 @@
import { NgModule } from '@angular/core'
import { RouterModule, Routes } from '@angular/router'
import { VitalComponent } from './vital.component'
-import { VitalsFamiliesComponent } from './vitals-families.component'
+
import { VitalsTableComponent } from './vitals-table.component'
import { VitalsComponent } from './vitals.component'
@@ -15,33 +15,31 @@ const routes: Routes = [
pathMatch: 'full',
redirectTo: 'table',
},
- {
- path: 'families',
- component: VitalsFamiliesComponent,
- },
{
path: 'table',
component: VitalsTableComponent,
- children: [{
- path: ':id',
- component: VitalComponent
- }]
+ children: [
+ {
+ path: ':id',
+ component: VitalComponent,
+ },
+ ],
},
{
path: ':category',
component: VitalsTableComponent,
- children: [{
- path: ':id',
- component: VitalComponent
- }]
+ children: [
+ {
+ path: ':id',
+ component: VitalComponent,
+ },
+ ],
},
],
},
-
]
@NgModule({
imports: [RouterModule.forChild(routes)],
- exports: [RouterModule],
})
-export class VitalsRoutingModule {}
+export class VitalsModule {}
diff --git a/apps/web/app/pages/dev/dev.component.html b/apps/web/app/pages/dev/dev.component.html
index bf688d48..3868ca8e 100644
--- a/apps/web/app/pages/dev/dev.component.html
+++ b/apps/web/app/pages/dev/dev.component.html
@@ -1,4 +1,4 @@
-